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
20 // ================================= Data ====================================
\r
26 byte curlayer, animate=0;
\r
27 byte cameratracking=1, tracker=0;
\r
28 byte showobs=0, showzone=0;
\r
30 // ================================= Code ====================================
\r
32 void BlitBackLayer(byte l)
\r
37 if (!layertoggle[l]) return;
\r
41 oxw=xwin*layer[l].pmultx/layer[l].pdivx;
\r
42 oyw=ywin*layer[l].pmulty/layer[l].pdivy;
\r
43 xofs=-(oxw&15); //(16-(oxw&15));
\r
44 yofs=-(oyw&15); //(16-(oyw&15));
\r
50 for (i=0; i<ty+1; i++)
\r
51 for (j=0; j<tx+1; j++)
\r
53 c=layers[l][(((ytc+i)*layer[l].sizex)+xtc+j)];
\r
57 CopyTileClip((j*16)+xofs,(i*16)+yofs,img);
\r
62 void TransBlitLayer(byte l)
\r
67 if (!layertoggle[l]) return;
\r
71 oxw=xwin*layer[l].pmultx/layer[l].pdivx;
\r
72 oyw=ywin*layer[l].pmulty/layer[l].pdivy;
\r
80 for (i=0; i<ty+1; i++)
\r
81 for (j=0; j<tx+1; j++)
\r
83 c=tileidx[layers[l][(((ytc+i)*layer[l].sizex)+xtc+j)]];
\r
86 img=vsp+offset; mask=vspmask+offset;
\r
88 TCopyTileClip((j*16)+xofs,(i*16)+yofs,img,mask);
\r
93 void BlitLayerLucent(byte l)
\r
98 if (!layertoggle[l]) return;
\r
102 oxw=xwin*layer[l].pmultx/layer[l].pdivx;
\r
103 oyw=ywin*layer[l].pmulty/layer[l].pdivy;
\r
111 for (i=0; i<ty+1; i++)
\r
112 for (j=0; j<tx+1; j++)
\r
114 c=tileidx[layers[l][(((ytc+i)*layer[l].sizex)+xtc+j)]];
\r
117 img=vsp+offset; mask=vspmask+offset;
\r
119 TCopyTileLucentClip((j*16)+xofs,(i*16)+yofs,img);
\r
124 void BlitLayer(byte c)
\r
126 if ( curlayer && !layer[c].hline && !layer[c].trans) { TransBlitLayer(c); return; }
\r
127 if (!curlayer && !layer[c].hline && !layer[c].trans) { BlitBackLayer(c); return; }
\r
128 if (layer[c].trans) { BlitLayerLucent(c); return; }
\r
129 if (layer[c].hline) { ExecuteEvent(layer[c].hline); return; }
\r
132 void DrawObstructions()
\r
136 oxw=xwin*layer[0].pmultx/layer[0].pdivx;
\r
137 oyw=ywin*layer[0].pmulty/layer[0].pdivy;
\r
143 for (i=0; i<ty+1; i++)
\r
144 for (j=0; j<tx+1; j++)
\r
146 if (obstruct[((ytc+i)*layer[0].sizex)+(xtc+j)])
\r
147 ColorField((j*16)+xofs,(i*16)+yofs,7);
\r
156 oxw=xwin*layer[0].pmultx/layer[0].pdivx;
\r
157 oyw=ywin*layer[0].pmulty/layer[0].pdivy;
\r
163 for (i=0; i<ty+1; i++)
\r
164 for (j=0; j<tx+1; j++)
\r
166 z=zone[((ytc+i)*layer[0].sizex)+(xtc+j)];
\r
169 ColorField((j*16)+xofs,(i*16)+yofs,z);
\r
173 if ( ((player->x+7)/16)==(xtc+j) && ((player->y+7)/16)==(ytc+i))
\r
175 ColorField((j*16)+xofs,(i*16)+yofs,31);
\r
181 void HookScriptThing(char *src)
\r
186 strcpy(mystr, src);
\r
188 while (*src != 'X') src++;
\r
190 ExecuteEvent(atoi(mystr));
\r
202 case '1': BlitLayer(0); break;
\r
203 case '2': BlitLayer(1); break;
\r
204 case '3': BlitLayer(2); break;
\r
205 case '4': BlitLayer(3); break;
\r
206 case '5': BlitLayer(4); break;
\r
207 case '6': BlitLayer(5); break;
\r
208 case 'E': RenderEntities(); break;
\r
209 case 'S': HookScriptThing(src); break;
\r
210 case 'R': HookRetrace();
\r
215 if (!curlayer) ClearScreen();
\r
216 if (showobs) DrawObstructions();
\r
217 if (showzone) DrawZones();
\r
222 if (cameratracking==1 && player)
\r
224 if (player->x+8>(sx/2)) xwin=(player->x+8-(sx/2)); else xwin=0;
\r
225 if (player->y+8>(sy/2)) ywin=(player->y+8-(sy/2)); else ywin=0;
\r
226 if (xwin>((layer[0].sizex*16)-sx)) xwin=((layer[0].sizex*16)-sx);
\r
227 if (ywin>((layer[0].sizey*16)-sy)) ywin=((layer[0].sizey*16)-sy);
\r
229 if (cameratracking==2)
\r
231 if (entity[tracker].x+8>(sx/2)) xwin=(entity[tracker].x+8-(sx/2)); else xwin=0;
\r
232 if (entity[tracker].y+8>(sy/2)) ywin=(entity[tracker].y+8-(sy/2)); else ywin=0;
\r
233 if (xwin>((layer[0].sizex*16)-sx)) xwin=((layer[0].sizex*16)-sx);
\r
234 if (ywin>((layer[0].sizey*16)-sy)) ywin=((layer[0].sizey*16)-sy);
\r
240 int rnd(int lo, int hi)
\r
243 int i=rand() % range;
\r
247 void AnimateTile(byte i, int l)
\r
249 switch (vspanim[i].mode)
\r
251 case 0: if (tileidx[l]<vspanim[i].finish) tileidx[l]++;
\r
252 else tileidx[l]=vspanim[i].start;
\r
254 case 1: if (tileidx[l]>vspanim[i].start) tileidx[l]--;
\r
255 else tileidx[l]=vspanim[i].finish;
\r
257 case 2: tileidx[l]=rnd(vspanim[i].start,vspanim[i].finish);
\r
259 case 3: if (flipped[l])
\r
261 if (tileidx[l]!=vspanim[i].start) tileidx[l]--;
\r
262 else { tileidx[l]++; flipped[l]=0; }
\r
266 if (tileidx[l]!=vspanim[i].finish) tileidx[l]++;
\r
267 else { tileidx[l]--; flipped[l]=1; }
\r
272 void Animate(byte i)
\r
276 for (l=vspanim[i].start; l<=vspanim[i].finish; l++)
\r
280 void CheckTileAnimation()
\r
283 if (!animate) return;
\r
285 for (i=0; i<100; i++)
\r
287 if ((vspanim[i].delay) && (vspanim[i].delay<vadelay[i]))
\r