+++ /dev/null
-/*\r
-Copyright (C) 1998 BJ Eirich (aka vecna)\r
-This program is free software; you can redistribute it and/or\r
-modify it under the terms of the GNU General Public License\r
-as published by the Free Software Foundation; either version 2\r
-of the License, or (at your option) any later version.\r
-This program is distributed in the hope that it will be useful,\r
-but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
-See the GNU General Public Lic\r
-See the GNU General Public License for more details.\r
-You should have received a copy of the GNU General Public License\r
-along with this program; if not, write to the Free Software\r
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
-*/\r
-\r
-#include <stdio.h>\r
-#include <string.h>\r
-#include <malloc.h>\r
-\r
-#include "config.h"\r
-#include "maped.h"\r
-#include "vdriver.h"\r
-\r
-#include "render.h" // MAXTILES\r
-\r
-// ================================= Data ====================================\r
-\r
-extern char stipple[256];\r
-\r
-int oxw=0, oyw=0;\r
-int xofs=0, yofs=0;\r
-int xtc=0, ytc=0;\r
-\r
-char curlayer=0;\r
-short tileidx[MAXTILES];\r
-char flipped[MAXTILES];\r
-\r
-// ------\r
-\r
-chri chrs[100];\r
-\r
-// ================================= Code ====================================\r
-\r
-void DoCHR(int i) // hee hee!\r
-{\r
- FILE *f;\r
- char b;\r
- int q;\r
- short numframes;\r
-\r
-// free(chrs[i].frame);\r
-// chrs[i].frame=0;\r
-// return;\r
-\r
- if (!strlen(chrlist[i].t))\r
- {\r
- if (chrs[i].frame) vfree(chrs[i].frame);\r
- chrs[i].frame=0;\r
- chrs[i].fx=chrs[i].fy=0;\r
- chrs[i].hx=chrs[i].hy=0;\r
- return;\r
- }\r
- if (!(f=fopen(chrlist[i].t,"rb")))\r
- {\r
- if (chrs[i].frame) vfree(chrs[i].frame);\r
- chrs[i].frame=0;\r
- chrs[i].fx=chrs[i].fy=0;\r
- chrs[i].hx=chrs[i].hy=0;\r
- return;\r
- }\r
- if (chrs[i].frame) vfree(chrs[i].frame);\r
- fread(&b, 1, 1, f);\r
- if (b!=2)\r
- {\r
- // This should really not work with V1 CHRs, but..\r
- chrs[i].frame=(char *) malloc(512);\r
- fseek(f, 0, 0);\r
- fread(chrs[i].frame, 1, 512, f);\r
- fclose(f);\r
- chrs[i].fx=16; chrs[i].fy=32;\r
- chrs[i].hx=0; chrs[i].hy=16;\r
- return;\r
- }\r
- chrs[i].fx=0; fread(&chrs[i].fx, 1, 2, f);\r
- chrs[i].fy=0; fread(&chrs[i].fy, 1, 2, f);\r
- chrs[i].hx=0; fread(&chrs[i].hx, 1, 2, f);\r
- chrs[i].hy=0; fread(&chrs[i].hy, 1, 2, f);\r
- fread(strbuf, 2, 2, f);\r
- fread(&numframes, 1, 2, f);\r
- chrs[i].frame=(char *) valloc(chrs[i].fx*chrs[i].fy*numframes,"chr preview",i);\r
- fread(&q, 1, 4, f);\r
-\r
- ReadCompressedLayer1(chrs[i].frame, chrs[i].fx*chrs[i].fy*numframes,f);\r
-\r
- fclose(f);\r
-}\r
-\r
-void DoCHRdealy()\r
-{\r
- int i;\r
-\r
- for (i=0; i<100; i++)\r
- DoCHR(i);\r
-}\r
-\r
-void BlitBackLayer(char l)\r
-{\r
- int i,j;\r
- //int a;\r
- char *img;\r
- //char *d;\r
- unsigned short *lay;\r
- //int v;\r
- int mapx,mapy;\r
- int x,y;\r
- unsigned int tile;\r
-\r
- if (!layertoggle[l]) return;\r
-\r
- mapx = layer[l].sizex;\r
- mapy = layer[l].sizey;\r
- lay = layers[l];\r
-\r
- // Adjust view\r
- oxw = xwin * layer[l].pmultx / layer[l].pdivx;\r
- oyw = ywin * layer[l].pmulty / layer[l].pdivy;\r
- xofs = 16 - (oxw & 15);\r
- yofs = 16 - (oyw & 15);\r
- xtc = oxw / 16;\r
- ytc = oyw / 16;\r
-\r
- // Draw it, bitch!\r
- for (i=0; i <= ty; i++)\r
- {\r
- for (j=0; j <= tx; j++)\r
- {\r
- x = xtc+j;\r
- y = ytc+i;\r
-\r
- // write better clipping sometime\r
- if (y >= 0 || y < mapy || x >=0 || x < mapx)\r
- {\r
- // what the HELL @_@\r
- tile = lay[(y * mapx) + x];\r
- if (tile >= numtiles) tile = numtiles-1;\r
- tile = tileidx[tile];\r
- if (tile >= numtiles) tile = numtiles-1;\r
-\r
- img = &vsp[tile * 256];\r
-\r
- x = (j * 16) + xofs;\r
- y = (i * 16) + yofs;\r
-\r
- //CopyTile(x, y, img);\r
- CCopySprite(x, y, 16, 16, img);\r
- }\r
- }\r
- }\r
-\r
- curlayer++;\r
-}\r
-\r
-//zero\r
-extern char* translucency_table;\r
-void LucentBlitLayer(char l)\r
-{\r
- int i,j;\r
- //int a,b;\r
- char *img;\r
- //char *d;\r
- unsigned short *lay;\r
- //int v;\r
- int mapx,mapy;\r
- int x,y;\r
- unsigned int tile;\r
-\r
- if (!layertoggle[l]) return;\r
- if(!translucency_table)\r
- {\r
- TransBlitlayer(l);\r
- return;\r
- }\r
-\r
- mapx = layer[l].sizex;\r
- mapy = layer[l].sizey;\r
- lay = layers[l];\r
-\r
- // Adjust view\r
- oxw = xwin * layer[l].pmultx / layer[l].pdivx;\r
- oyw = ywin * layer[l].pmulty / layer[l].pdivy;\r
- xofs = 16 - (oxw & 15);\r
- yofs = 16 - (oyw & 15);\r
- xtc = oxw / 16;\r
- ytc = oyw / 16;\r
-\r
- // Draw it, bitch!\r
- for (i=0; i <= ty; i++)\r
- {\r
- for (j=0; j <= tx; j++)\r
- {\r
- x = xtc+j;\r
- y = ytc+i;\r
-\r
- // write better clipping sometime\r
- if (y >= 0 || y < mapy || x >=0 || x < mapx)\r
- {\r
- // what the HELL @_@\r
- tile = lay[(y * mapx) + x];\r
- if (tile >= numtiles) tile = numtiles-1;\r
- tile = tileidx[tile];\r
- if (tile >= numtiles) tile = numtiles-1;\r
-\r
- img = &vsp[tile * 256];\r
- if (img != vsp)\r
- {\r
- x = (j * 16) + xofs;\r
- y = (i * 16) + yofs;\r
- CopySpriteLucentClip(x, y, 16, 16, img);\r
- }\r
- }\r
- }\r
- }\r
- curlayer++;\r
-}\r
-\r
-\r
-void TransBlitlayer(char l)\r
-{\r
- int i,j;\r
- //int a,b;\r
- char *img;\r
- //char *d;\r
- unsigned short *lay;\r
- //int v;\r
- int mapx,mapy;\r
- int x,y;\r
- unsigned int tile;\r
-\r
- if (!layertoggle[l]) return;\r
-\r
- lay = layers[l];\r
-\r
- mapx = layer[l].sizex;\r
- mapy = layer[l].sizey;\r
-\r
- // Adjust view\r
- oxw = xwin * layer[l].pmultx / layer[l].pdivx;\r
- oyw = ywin * layer[l].pmulty / layer[l].pdivy;\r
- xofs = 16 - (oxw & 15);\r
- yofs = 16 - (oyw & 15);\r
- xtc = oxw / 16;\r
- ytc = oyw / 16;\r
-\r
- // Draw it, bitch!\r
- for (i=0; i <= ty; i++)\r
- {\r
- for (j=0; j <= tx; j++)\r
- {\r
- x = xtc+j;\r
- y = ytc+i;\r
-\r
- // write better clipping sometime\r
- if (y >= 0 || y < mapy || x >=0 || x < mapx)\r
- {\r
- // what the HELL @_@\r
- tile = lay[(y * mapx) + x];\r
- if (tile >= numtiles) tile = numtiles-1;\r
- tile = tileidx[tile];\r
- if (tile >= numtiles) tile = numtiles-1;\r
-\r
- img = &vsp[tile * 256];\r
- if (img != vsp)\r
- {\r
- x = (j * 16) + xofs;\r
- y = (i * 16) + yofs;\r
- //TCopySprite(x, y, 16, 16, img);\r
- TCCopySprite(x, y, 16, 16, img);\r
- }\r
- }\r
- }\r
- }\r
-\r
- curlayer++;\r
-}\r
-\r
-void BlitLayer(char c)\r
-{\r
- if(layer[c].trans) { LucentBlitLayer(c); return; } //zero\r
- if (curlayer) TransBlitLayer(c);\r
- else BlitBackLayer(c);\r
-}\r
-\r
-void DrawObstructions()\r
-{ int i,j;\r
- int mapx;\r
-\r
- mapx = layer[0].sizex;\r
-\r
- oxw=xwin*layer[0].pmultx/layer[0].pdivx;\r
- oyw=ywin*layer[0].pmulty/layer[0].pdivy;\r
- xofs=16-(oxw&15);\r
- yofs=16-(oyw&15);\r
- xtc=oxw>>4;\r
- ytc=oyw>>4;\r
-\r
- for (i=0; i<ty+1; i++)\r
- for (j=0; j<tx+1; j++)\r
- {\r
- if (obstruct[((ytc+i)*mapx)+(xtc+j)])\r
- {\r
- TCCopySprite((j*16)+xofs,(i*16)+yofs,16,16,stipple);\r
- //ColorGrid((j*16)+xofs,(i*16)+yofs,7);\r
- }\r
- }\r
-}\r
-\r
-void DrawZones()\r
-{ int i,j;\r
- char z;\r
- int mapx;\r
-\r
- mapx = layer[0].sizex;\r
- oxw=xwin*layer[0].pmultx/layer[0].pdivx;\r
- oyw=ywin*layer[0].pmulty/layer[0].pdivy;\r
- xofs=16-(oxw&15);\r
- yofs=16-(oyw&15);\r
- xtc=oxw>>4;\r
- ytc=oyw>>4;\r
-\r
- for (i=0; i<ty+1; i++)\r
- for (j=0; j<tx+1; j++)\r
- {\r
- z=zone[((ytc+i)*mapx)+(xtc+j)];\r
- if (z)\r
- {\r
- TCCopySprite((j*16)+xofs,(i*16)+yofs,16,16,stipple);\r
- //ColorGrid((j*16)+xofs,(i*16)+yofs,z);\r
- }\r
- }\r
-}\r
-\r
-void DrawEntities()\r
-{ int m;\r
-\r
- for (m=0; m<entities; m++)\r
- if ((entity[m].x>=(xwin/16)) && (entity[m].x<(xwin/16)+22) &&\r
- (entity[m].y>=(ywin/16)) && (entity[m].y<(ywin/16)+ty+2))\r
- {\r
- if (chrs[entity[m].chrindex].frame)\r
- TCCopySprite((entity[m].x*16)-xwin+16-chrs[entity[m].chrindex].hx,\r
- (entity[m].y*16)-ywin+16-chrs[entity[m].chrindex].hy,\r
- chrs[entity[m].chrindex].fx,\r
- chrs[entity[m].chrindex].fy,\r
- chrs[entity[m].chrindex].frame);\r
- else\r
- {\r
- TCCopySprite(\r
- (entity[m].x*16)-xwin+16,(entity[m].y*16)-ywin+16,16,16,stipple);\r
- //ColorGrid((entity[m].x*16)-xwin+16,\r
- // (entity[m].y*16)-ywin+16, 0);\r
- }\r
- }\r
-}\r
-\r
-// aen\r
-void DrawSelection()\r
-{ int i,j;\r
- int x1,y1,x2,y2;\r
-\r
- oxw=xwin*layer[el].pmultx/layer[el].pdivx;\r
- oyw=ywin*layer[el].pmulty/layer[el].pdivy;\r
- xofs=16-(oxw&15);\r
- yofs=16-(oyw&15);\r
- xtc=oxw>>4;\r
- ytc=oyw>>4;\r
-\r
- x1=selx1;\r
- y1=sely1;\r
- x2=selx2;\r
- y2=sely2;\r
-\r
- if (x2<x1) x2^=x1,x1^=x2,x2^=x1;\r
- if (y2<y1) y2^=y1,y1^=y2,y2^=y1;\r
-\r
- for (i=0; i<ty+1; i++)\r
- for (j=0; j<tx+1; j++)\r
- {\r
- if (xtc+j >= x1 && xtc+j <= x2\r
- && ytc+i >= y1 && ytc+i <= y2)\r
- {\r
- TCCopySprite((j*16)+xofs, (i*16)+yofs, 16,16, stipple);\r
- //ColorGrid((j*16)+xofs,(i*16)+yofs,7);\r
- }\r
- }\r
-}\r
-\r
-void RenderMap()\r
-{ char *src;\r
- //char rs[2];\r
-\r
- curlayer=0;\r
- src=rstring;\r
-\r
- /*\r
- rs[1]=0; // aen\r
- for (; *src; ++src)\r
- {\r
- rs[0]=*src;\r
- BlitLayer(atoi(rs) -1);\r
- }\r
- */\r
- while (*src)\r
- {\r
- switch (*src)\r
- {\r
- case '1': BlitLayer(0); break;\r
- case '2': BlitLayer(1); break;\r
- case '3': BlitLayer(2); break;\r
- case '4': BlitLayer(3); break;\r
- case '5': BlitLayer(4); break;\r
- case '6': BlitLayer(5); break;\r
- }\r
- src++;\r
- }\r
-\r
- if (!curlayer) memset(screen+5648,0,84480);\r
- if (layertoggle[6]) DrawObstructions();\r
- if (layertoggle[7]) DrawZones();\r
- if (layertoggle[8]) DrawEntities();\r
- if (shifted) DrawSelection();\r
-}\r
-\r
-void AnimateTile(char i, int l)\r
-{\r
- switch (vspanim[i].mode)\r
- {\r
- case 0: if (tileidx[l]<vspanim[i].finish) tileidx[l]++;\r
- else tileidx[l]=vspanim[i].start;\r
- break;\r
- case 1: if (tileidx[l]>vspanim[i].start) tileidx[l]--;\r
- else tileidx[l]=vspanim[i].finish;\r
- break;\r
- case 2: tileidx[l]=random(vspanim[i].start,vspanim[i].finish);\r
- break;\r
- case 3: if (flipped[l])\r
- {\r
- if (tileidx[l]!=vspanim[i].start) tileidx[l]--;\r
- else { tileidx[l]++; flipped[l]=0; }\r
- }\r
- else\r
- {\r
- if (tileidx[l]!=vspanim[i].finish) tileidx[l]++;\r
- else { tileidx[l]--; flipped[l]=1; }\r
- }\r
- }\r
-}\r
-\r
-void Animate(char i)\r
-{ static int l;\r
-\r
- vadelay[i]=0;\r
- for (l=vspanim[i].start; l<=vspanim[i].finish; l++)\r
- AnimateTile(i,l);\r
-}\r
-\r
-void CheckTileAnimation()\r
-{ static char i;\r
-\r
- for (i=0; i<100; i++)\r
- { if ((vspanim[i].delay) && (vspanim[i].delay<vadelay[i]))\r
- Animate(i);\r
- vadelay[i]++; }\r
-}\r
-\r