]> 4ch.mooo.com Git - 16.git/blob - 16/v2/source/MAPED/RENDER.C
e1067755239358c1633d4f5ba3a4a1b2bb25cf06
[16.git] / 16 / v2 / source / MAPED / RENDER.C
1 /*\r
2 Copyright (C) 1998 BJ Eirich (aka vecna)\r
3 This program is free software; you can redistribute it and/or\r
4 modify it under the terms of the GNU General Public License\r
5 as published by the Free Software Foundation; either version 2\r
6 of the License, or (at your option) any later version.\r
7 This program is distributed in the hope that it will be useful,\r
8 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
10 See the GNU General Public Lic\r
11 See the GNU General Public License for more details.\r
12 You should have received a copy of the GNU General Public License\r
13 along with this program; if not, write to the Free Software\r
14 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
15 */\r
16 \r
17 #include <stdio.h>\r
18 #include <string.h>\r
19 #include <malloc.h>\r
20 \r
21 #include "config.h"\r
22 #include "maped.h"\r
23 #include "vdriver.h"\r
24 \r
25 #include "render.h" // MAXTILES\r
26 \r
27 // ================================= Data ====================================\r
28 \r
29 extern char stipple[256];\r
30 \r
31 int oxw=0, oyw=0;\r
32 int xofs=0, yofs=0;\r
33 int xtc=0, ytc=0;\r
34 \r
35 char curlayer=0;\r
36 short tileidx[MAXTILES];\r
37 char flipped[MAXTILES];\r
38 \r
39 // ------\r
40 \r
41 chri chrs[100];\r
42 \r
43 // ================================= Code ====================================\r
44 \r
45 void DoCHR(int i) // hee hee!\r
46 {\r
47   FILE *f;\r
48   char b;\r
49   int q;\r
50   short numframes;\r
51 \r
52 //  free(chrs[i].frame);\r
53 //  chrs[i].frame=0;\r
54 //  return;\r
55 \r
56   if (!strlen(chrlist[i].t))\r
57   {\r
58     if (chrs[i].frame) vfree(chrs[i].frame);\r
59     chrs[i].frame=0;\r
60     chrs[i].fx=chrs[i].fy=0;\r
61     chrs[i].hx=chrs[i].hy=0;\r
62     return;\r
63   }\r
64   if (!(f=fopen(chrlist[i].t,"rb")))\r
65   {\r
66     if (chrs[i].frame) vfree(chrs[i].frame);\r
67     chrs[i].frame=0;\r
68     chrs[i].fx=chrs[i].fy=0;\r
69     chrs[i].hx=chrs[i].hy=0;\r
70     return;\r
71   }\r
72   if (chrs[i].frame) vfree(chrs[i].frame);\r
73   fread(&b, 1, 1, f);\r
74   if (b!=2)\r
75   {\r
76     // This should really not work with V1 CHRs, but..\r
77     chrs[i].frame=(char *) malloc(512);\r
78     fseek(f, 0, 0);\r
79     fread(chrs[i].frame, 1, 512, f);\r
80     fclose(f);\r
81     chrs[i].fx=16; chrs[i].fy=32;\r
82     chrs[i].hx=0;  chrs[i].hy=16;\r
83     return;\r
84   }\r
85   chrs[i].fx=0; fread(&chrs[i].fx, 1, 2, f);\r
86   chrs[i].fy=0; fread(&chrs[i].fy, 1, 2, f);\r
87   chrs[i].hx=0; fread(&chrs[i].hx, 1, 2, f);\r
88   chrs[i].hy=0; fread(&chrs[i].hy, 1, 2, f);\r
89   fread(strbuf, 2, 2, f);\r
90   fread(&numframes, 1, 2, f);\r
91   chrs[i].frame=(char *) valloc(chrs[i].fx*chrs[i].fy*numframes,"chr preview",i);\r
92   fread(&q, 1, 4, f);\r
93 \r
94   ReadCompressedLayer1(chrs[i].frame, chrs[i].fx*chrs[i].fy*numframes,f);\r
95 \r
96   fclose(f);\r
97 }\r
98 \r
99 void DoCHRdealy()\r
100 {\r
101   int i;\r
102 \r
103   for (i=0; i<100; i++)\r
104     DoCHR(i);\r
105 }\r
106 \r
107 void BlitBackLayer(char l)\r
108 {\r
109   int i,j;\r
110   //int a;\r
111   char *img;\r
112   //char *d;\r
113   unsigned short *lay;\r
114   //int v;\r
115   int mapx,mapy;\r
116   int x,y;\r
117   unsigned int tile;\r
118 \r
119   if (!layertoggle[l]) return;\r
120 \r
121   mapx = layer[l].sizex;\r
122   mapy = layer[l].sizey;\r
123   lay = layers[l];\r
124 \r
125   // Adjust view\r
126   oxw  = xwin * layer[l].pmultx / layer[l].pdivx;\r
127   oyw  = ywin * layer[l].pmulty / layer[l].pdivy;\r
128   xofs = 16 - (oxw & 15);\r
129   yofs = 16 - (oyw & 15);\r
130   xtc  = oxw / 16;\r
131   ytc  = oyw / 16;\r
132 \r
133   // Draw it, bitch!\r
134   for (i=0; i <= ty; i++)\r
135   {\r
136     for (j=0; j <= tx; j++)\r
137     {\r
138       x = xtc+j;\r
139       y = ytc+i;\r
140 \r
141       // write better clipping sometime\r
142       if (y >= 0 || y < mapy || x >=0 || x < mapx)\r
143       {\r
144         // what the HELL @_@\r
145         tile = lay[(y * mapx) + x];\r
146         if (tile >= numtiles) tile = numtiles-1;\r
147         tile = tileidx[tile];\r
148         if (tile >= numtiles) tile = numtiles-1;\r
149 \r
150         img = &vsp[tile * 256];\r
151 \r
152         x = (j * 16) + xofs;\r
153         y = (i * 16) + yofs;\r
154 \r
155         //CopyTile(x, y, img);\r
156         CCopySprite(x, y, 16, 16, img);\r
157       }\r
158     }\r
159   }\r
160 \r
161   curlayer++;\r
162 }\r
163 \r
164 //zero\r
165 extern char* translucency_table;\r
166 void LucentBlitLayer(char l)\r
167 {\r
168   int i,j;\r
169   //int a,b;\r
170   char *img;\r
171   //char *d;\r
172   unsigned short *lay;\r
173   //int v;\r
174   int mapx,mapy;\r
175   int x,y;\r
176   unsigned int tile;\r
177 \r
178   if (!layertoggle[l]) return;\r
179   if(!translucency_table)\r
180   {\r
181     TransBlitlayer(l);\r
182     return;\r
183   }\r
184 \r
185   mapx = layer[l].sizex;\r
186   mapy = layer[l].sizey;\r
187   lay = layers[l];\r
188 \r
189   // Adjust view\r
190   oxw  = xwin * layer[l].pmultx / layer[l].pdivx;\r
191   oyw  = ywin * layer[l].pmulty / layer[l].pdivy;\r
192   xofs = 16 - (oxw & 15);\r
193   yofs = 16 - (oyw & 15);\r
194   xtc  = oxw / 16;\r
195   ytc  = oyw / 16;\r
196 \r
197   // Draw it, bitch!\r
198   for (i=0; i <= ty; i++)\r
199   {\r
200     for (j=0; j <= tx; j++)\r
201     {\r
202       x = xtc+j;\r
203       y = ytc+i;\r
204 \r
205       // write better clipping sometime\r
206       if (y >= 0 || y < mapy || x >=0 || x < mapx)\r
207       {\r
208         // what the HELL @_@\r
209         tile = lay[(y * mapx) + x];\r
210         if (tile >= numtiles) tile = numtiles-1;\r
211         tile = tileidx[tile];\r
212         if (tile >= numtiles) tile = numtiles-1;\r
213 \r
214         img = &vsp[tile * 256];\r
215         if (img != vsp)\r
216         {\r
217           x = (j * 16) + xofs;\r
218           y = (i * 16) + yofs;\r
219           CopySpriteLucentClip(x, y, 16, 16, img);\r
220         }\r
221       }\r
222     }\r
223   }\r
224   curlayer++;\r
225 }\r
226 \r
227 \r
228 void TransBlitlayer(char l)\r
229 {\r
230   int i,j;\r
231   //int a,b;\r
232   char *img;\r
233   //char *d;\r
234   unsigned short *lay;\r
235   //int v;\r
236   int mapx,mapy;\r
237   int x,y;\r
238   unsigned int tile;\r
239 \r
240   if (!layertoggle[l]) return;\r
241 \r
242   lay = layers[l];\r
243 \r
244   mapx = layer[l].sizex;\r
245   mapy = layer[l].sizey;\r
246 \r
247   // Adjust view\r
248   oxw  = xwin * layer[l].pmultx / layer[l].pdivx;\r
249   oyw  = ywin * layer[l].pmulty / layer[l].pdivy;\r
250   xofs = 16 - (oxw & 15);\r
251   yofs = 16 - (oyw & 15);\r
252   xtc  = oxw / 16;\r
253   ytc  = oyw / 16;\r
254 \r
255   // Draw it, bitch!\r
256   for (i=0; i <= ty; i++)\r
257   {\r
258     for (j=0; j <= tx; j++)\r
259     {\r
260       x = xtc+j;\r
261       y = ytc+i;\r
262 \r
263       // write better clipping sometime\r
264       if (y >= 0 || y < mapy || x >=0 || x < mapx)\r
265       {\r
266         // what the HELL @_@\r
267         tile = lay[(y * mapx) + x];\r
268         if (tile >= numtiles) tile = numtiles-1;\r
269         tile = tileidx[tile];\r
270         if (tile >= numtiles) tile = numtiles-1;\r
271 \r
272         img = &vsp[tile * 256];\r
273         if (img != vsp)\r
274         {\r
275           x = (j * 16) + xofs;\r
276           y = (i * 16) + yofs;\r
277           //TCopySprite(x, y, 16, 16, img);\r
278           TCCopySprite(x, y, 16, 16, img);\r
279         }\r
280       }\r
281     }\r
282   }\r
283 \r
284   curlayer++;\r
285 }\r
286 \r
287 void BlitLayer(char c)\r
288 {\r
289   if(layer[c].trans) { LucentBlitLayer(c); return; } //zero\r
290   if (curlayer) TransBlitLayer(c);\r
291   else BlitBackLayer(c);\r
292 }\r
293 \r
294 void DrawObstructions()\r
295 { int i,j;\r
296   int mapx;\r
297 \r
298   mapx = layer[0].sizex;\r
299 \r
300   oxw=xwin*layer[0].pmultx/layer[0].pdivx;\r
301   oyw=ywin*layer[0].pmulty/layer[0].pdivy;\r
302   xofs=16-(oxw&15);\r
303   yofs=16-(oyw&15);\r
304   xtc=oxw>>4;\r
305   ytc=oyw>>4;\r
306 \r
307   for (i=0; i<ty+1; i++)\r
308     for (j=0; j<tx+1; j++)\r
309     {\r
310       if (obstruct[((ytc+i)*mapx)+(xtc+j)])\r
311       {\r
312          TCCopySprite((j*16)+xofs,(i*16)+yofs,16,16,stipple);\r
313          //ColorGrid((j*16)+xofs,(i*16)+yofs,7);\r
314       }\r
315     }\r
316 }\r
317 \r
318 void DrawZones()\r
319 { int i,j;\r
320   char z;\r
321   int mapx;\r
322 \r
323   mapx = layer[0].sizex;\r
324   oxw=xwin*layer[0].pmultx/layer[0].pdivx;\r
325   oyw=ywin*layer[0].pmulty/layer[0].pdivy;\r
326   xofs=16-(oxw&15);\r
327   yofs=16-(oyw&15);\r
328   xtc=oxw>>4;\r
329   ytc=oyw>>4;\r
330 \r
331   for (i=0; i<ty+1; i++)\r
332     for (j=0; j<tx+1; j++)\r
333     {\r
334       z=zone[((ytc+i)*mapx)+(xtc+j)];\r
335       if (z)\r
336       {\r
337         TCCopySprite((j*16)+xofs,(i*16)+yofs,16,16,stipple);\r
338         //ColorGrid((j*16)+xofs,(i*16)+yofs,z);\r
339       }\r
340     }\r
341 }\r
342 \r
343 void DrawEntities()\r
344 { int m;\r
345 \r
346   for (m=0; m<entities; m++)\r
347     if ((entity[m].x>=(xwin/16)) && (entity[m].x<(xwin/16)+22) &&\r
348         (entity[m].y>=(ywin/16)) && (entity[m].y<(ywin/16)+ty+2))\r
349     {\r
350       if (chrs[entity[m].chrindex].frame)\r
351          TCCopySprite((entity[m].x*16)-xwin+16-chrs[entity[m].chrindex].hx,\r
352                       (entity[m].y*16)-ywin+16-chrs[entity[m].chrindex].hy,\r
353                        chrs[entity[m].chrindex].fx,\r
354                        chrs[entity[m].chrindex].fy,\r
355                        chrs[entity[m].chrindex].frame);\r
356       else\r
357       {\r
358          TCCopySprite(\r
359            (entity[m].x*16)-xwin+16,(entity[m].y*16)-ywin+16,16,16,stipple);\r
360         //ColorGrid((entity[m].x*16)-xwin+16,\r
361         //  (entity[m].y*16)-ywin+16, 0);\r
362       }\r
363     }\r
364 }\r
365 \r
366 // aen\r
367 void DrawSelection()\r
368 { int i,j;\r
369   int x1,y1,x2,y2;\r
370 \r
371   oxw=xwin*layer[el].pmultx/layer[el].pdivx;\r
372   oyw=ywin*layer[el].pmulty/layer[el].pdivy;\r
373   xofs=16-(oxw&15);\r
374   yofs=16-(oyw&15);\r
375   xtc=oxw>>4;\r
376   ytc=oyw>>4;\r
377 \r
378   x1=selx1;\r
379   y1=sely1;\r
380   x2=selx2;\r
381   y2=sely2;\r
382 \r
383   if (x2<x1) x2^=x1,x1^=x2,x2^=x1;\r
384   if (y2<y1) y2^=y1,y1^=y2,y2^=y1;\r
385 \r
386   for (i=0; i<ty+1; i++)\r
387     for (j=0; j<tx+1; j++)\r
388     {\r
389       if (xtc+j >= x1 && xtc+j <= x2\r
390       && ytc+i >= y1 && ytc+i <= y2)\r
391       {\r
392         TCCopySprite((j*16)+xofs, (i*16)+yofs, 16,16, stipple);\r
393         //ColorGrid((j*16)+xofs,(i*16)+yofs,7);\r
394       }\r
395     }\r
396 }\r
397 \r
398 void RenderMap()\r
399 { char *src;\r
400   //char rs[2];\r
401 \r
402   curlayer=0;\r
403   src=rstring;\r
404 \r
405   /*\r
406   rs[1]=0; // aen\r
407   for (; *src; ++src)\r
408   {\r
409     rs[0]=*src;\r
410     BlitLayer(atoi(rs) -1);\r
411   }\r
412   */\r
413   while (*src)\r
414   {\r
415     switch (*src)\r
416     {\r
417       case '1': BlitLayer(0); break;\r
418       case '2': BlitLayer(1); break;\r
419       case '3': BlitLayer(2); break;\r
420       case '4': BlitLayer(3); break;\r
421       case '5': BlitLayer(4); break;\r
422       case '6': BlitLayer(5); break;\r
423     }\r
424     src++;\r
425   }\r
426 \r
427   if (!curlayer) memset(screen+5648,0,84480);\r
428   if (layertoggle[6]) DrawObstructions();\r
429   if (layertoggle[7]) DrawZones();\r
430   if (layertoggle[8]) DrawEntities();\r
431   if (shifted) DrawSelection();\r
432 }\r
433 \r
434 void AnimateTile(char i, int l)\r
435 {\r
436   switch (vspanim[i].mode)\r
437   {\r
438     case 0: if (tileidx[l]<vspanim[i].finish) tileidx[l]++;\r
439             else tileidx[l]=vspanim[i].start;\r
440             break;\r
441     case 1: if (tileidx[l]>vspanim[i].start) tileidx[l]--;\r
442             else tileidx[l]=vspanim[i].finish;\r
443             break;\r
444     case 2: tileidx[l]=random(vspanim[i].start,vspanim[i].finish);\r
445             break;\r
446     case 3: if (flipped[l])\r
447             {\r
448               if (tileidx[l]!=vspanim[i].start) tileidx[l]--;\r
449               else { tileidx[l]++; flipped[l]=0; }\r
450             }\r
451             else\r
452             {\r
453               if (tileidx[l]!=vspanim[i].finish) tileidx[l]++;\r
454               else { tileidx[l]--; flipped[l]=1; }\r
455             }\r
456   }\r
457 }\r
458 \r
459 void Animate(char i)\r
460 { static int l;\r
461 \r
462   vadelay[i]=0;\r
463   for (l=vspanim[i].start; l<=vspanim[i].finish; l++)\r
464     AnimateTile(i,l);\r
465 }\r
466 \r
467 void CheckTileAnimation()\r
468 { static char i;\r
469 \r
470   for (i=0; i<100; i++)\r
471       { if ((vspanim[i].delay) && (vspanim[i].delay<vadelay[i]))\r
472            Animate(i);\r
473         vadelay[i]++; }\r
474 }\r
475 \r