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
23 #include "vdriver.h"
\r
25 #include "render.h" // MAXTILES
\r
27 // ================================= Data ====================================
\r
29 extern char stipple[256];
\r
36 short tileidx[MAXTILES];
\r
37 char flipped[MAXTILES];
\r
43 // ================================= Code ====================================
\r
45 void DoCHR(int i) // hee hee!
\r
52 // free(chrs[i].frame);
\r
56 if (!strlen(chrlist[i].t))
\r
58 if (chrs[i].frame) vfree(chrs[i].frame);
\r
60 chrs[i].fx=chrs[i].fy=0;
\r
61 chrs[i].hx=chrs[i].hy=0;
\r
64 if (!(f=fopen(chrlist[i].t,"rb")))
\r
66 if (chrs[i].frame) vfree(chrs[i].frame);
\r
68 chrs[i].fx=chrs[i].fy=0;
\r
69 chrs[i].hx=chrs[i].hy=0;
\r
72 if (chrs[i].frame) vfree(chrs[i].frame);
\r
76 // This should really not work with V1 CHRs, but..
\r
77 chrs[i].frame=(char *) malloc(512);
\r
79 fread(chrs[i].frame, 1, 512, f);
\r
81 chrs[i].fx=16; chrs[i].fy=32;
\r
82 chrs[i].hx=0; chrs[i].hy=16;
\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
94 ReadCompressedLayer1(chrs[i].frame, chrs[i].fx*chrs[i].fy*numframes,f);
\r
103 for (i=0; i<100; i++)
\r
107 void BlitBackLayer(char l)
\r
113 unsigned short *lay;
\r
119 if (!layertoggle[l]) return;
\r
121 mapx = layer[l].sizex;
\r
122 mapy = layer[l].sizey;
\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
134 for (i=0; i <= ty; i++)
\r
136 for (j=0; j <= tx; j++)
\r
141 // write better clipping sometime
\r
142 if (y >= 0 || y < mapy || x >=0 || x < mapx)
\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
150 img = &vsp[tile * 256];
\r
152 x = (j * 16) + xofs;
\r
153 y = (i * 16) + yofs;
\r
155 //CopyTile(x, y, img);
\r
156 CCopySprite(x, y, 16, 16, img);
\r
165 extern char* translucency_table;
\r
166 void LucentBlitLayer(char l)
\r
172 unsigned short *lay;
\r
178 if (!layertoggle[l]) return;
\r
179 if(!translucency_table)
\r
185 mapx = layer[l].sizex;
\r
186 mapy = layer[l].sizey;
\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
198 for (i=0; i <= ty; i++)
\r
200 for (j=0; j <= tx; j++)
\r
205 // write better clipping sometime
\r
206 if (y >= 0 || y < mapy || x >=0 || x < mapx)
\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
214 img = &vsp[tile * 256];
\r
217 x = (j * 16) + xofs;
\r
218 y = (i * 16) + yofs;
\r
219 CopySpriteLucentClip(x, y, 16, 16, img);
\r
228 void TransBlitlayer(char l)
\r
234 unsigned short *lay;
\r
240 if (!layertoggle[l]) return;
\r
244 mapx = layer[l].sizex;
\r
245 mapy = layer[l].sizey;
\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
256 for (i=0; i <= ty; i++)
\r
258 for (j=0; j <= tx; j++)
\r
263 // write better clipping sometime
\r
264 if (y >= 0 || y < mapy || x >=0 || x < mapx)
\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
272 img = &vsp[tile * 256];
\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
287 void BlitLayer(char c)
\r
289 if(layer[c].trans) { LucentBlitLayer(c); return; } //zero
\r
290 if (curlayer) TransBlitLayer(c);
\r
291 else BlitBackLayer(c);
\r
294 void DrawObstructions()
\r
298 mapx = layer[0].sizex;
\r
300 oxw=xwin*layer[0].pmultx/layer[0].pdivx;
\r
301 oyw=ywin*layer[0].pmulty/layer[0].pdivy;
\r
307 for (i=0; i<ty+1; i++)
\r
308 for (j=0; j<tx+1; j++)
\r
310 if (obstruct[((ytc+i)*mapx)+(xtc+j)])
\r
312 TCCopySprite((j*16)+xofs,(i*16)+yofs,16,16,stipple);
\r
313 //ColorGrid((j*16)+xofs,(i*16)+yofs,7);
\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
331 for (i=0; i<ty+1; i++)
\r
332 for (j=0; j<tx+1; j++)
\r
334 z=zone[((ytc+i)*mapx)+(xtc+j)];
\r
337 TCCopySprite((j*16)+xofs,(i*16)+yofs,16,16,stipple);
\r
338 //ColorGrid((j*16)+xofs,(i*16)+yofs,z);
\r
343 void DrawEntities()
\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
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
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
367 void DrawSelection()
\r
371 oxw=xwin*layer[el].pmultx/layer[el].pdivx;
\r
372 oyw=ywin*layer[el].pmulty/layer[el].pdivy;
\r
383 if (x2<x1) x2^=x1,x1^=x2,x2^=x1;
\r
384 if (y2<y1) y2^=y1,y1^=y2,y2^=y1;
\r
386 for (i=0; i<ty+1; i++)
\r
387 for (j=0; j<tx+1; j++)
\r
389 if (xtc+j >= x1 && xtc+j <= x2
\r
390 && ytc+i >= y1 && ytc+i <= y2)
\r
392 TCCopySprite((j*16)+xofs, (i*16)+yofs, 16,16, stipple);
\r
393 //ColorGrid((j*16)+xofs,(i*16)+yofs,7);
\r
407 for (; *src; ++src)
\r
410 BlitLayer(atoi(rs) -1);
\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
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
434 void AnimateTile(char i, int l)
\r
436 switch (vspanim[i].mode)
\r
438 case 0: if (tileidx[l]<vspanim[i].finish) tileidx[l]++;
\r
439 else tileidx[l]=vspanim[i].start;
\r
441 case 1: if (tileidx[l]>vspanim[i].start) tileidx[l]--;
\r
442 else tileidx[l]=vspanim[i].finish;
\r
444 case 2: tileidx[l]=random(vspanim[i].start,vspanim[i].finish);
\r
446 case 3: if (flipped[l])
\r
448 if (tileidx[l]!=vspanim[i].start) tileidx[l]--;
\r
449 else { tileidx[l]++; flipped[l]=0; }
\r
453 if (tileidx[l]!=vspanim[i].finish) tileidx[l]++;
\r
454 else { tileidx[l]--; flipped[l]=1; }
\r
459 void Animate(char i)
\r
463 for (l=vspanim[i].start; l<=vspanim[i].finish; l++)
\r
467 void CheckTileAnimation()
\r
470 for (i=0; i<100; i++)
\r
471 { if ((vspanim[i].delay) && (vspanim[i].delay<vadelay[i]))
\r