OSDN Git Service

wwww
[proj16/16.git] / 16 / v2 / source / verge / ENGINE / 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 "verge.h"\r
18 #include <math.h>\r
19 \r
20 // ================================= Data ====================================\r
21 \r
22 int oxw, oyw;\r
23 int xofs, yofs;\r
24 int xtc, ytc;\r
25 \r
26 byte curlayer, animate=0;\r
27 byte cameratracking=1, tracker=0;\r
28 byte showobs=0, showzone=0;\r
29 \r
30 // ================================= Code ====================================\r
31 \r
32 void BlitBackLayer(byte l)\r
33 {\r
34   int i,j,c;\r
35   byte *img;\r
36 \r
37   if (!layertoggle[l]) return;\r
38 \r
39   // Adjust view\r
40 \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
45   xtc=oxw>>4;\r
46   ytc=oyw>>4;\r
47 \r
48   // Draw it, bitch!\r
49 \r
50   for (i=0; i<ty+1; i++)\r
51     for (j=0; j<tx+1; j++)\r
52     {\r
53       c=layers[l][(((ytc+i)*layer[l].sizex)+xtc+j)];\r
54       c=tileidx[c];\r
55       c=c<numtiles?c:0;\r
56       img=vsp+(256*c);\r
57       CopyTileClip((j*16)+xofs,(i*16)+yofs,img);\r
58     }\r
59   curlayer++;\r
60 }\r
61 \r
62 void TransBlitLayer(byte l)\r
63 {\r
64   int i,j,offset,c;\r
65   byte *img,*mask;\r
66 \r
67   if (!layertoggle[l]) return;\r
68 \r
69   // Adjust view\r
70 \r
71   oxw=xwin*layer[l].pmultx/layer[l].pdivx;\r
72   oyw=ywin*layer[l].pmulty/layer[l].pdivy;\r
73   xofs=-(oxw&15);\r
74   yofs=-(oyw&15);\r
75   xtc=oxw>>4;\r
76   ytc=oyw>>4;\r
77 \r
78   // Draw it, bitch!\r
79 \r
80   for (i=0; i<ty+1; i++)\r
81     for (j=0; j<tx+1; j++)\r
82     {\r
83       c=tileidx[layers[l][(((ytc+i)*layer[l].sizex)+xtc+j)]];\r
84       c=c<numtiles?c:0;\r
85       offset=c*256;\r
86       img=vsp+offset; mask=vspmask+offset;\r
87       if (img!=vsp)\r
88         TCopyTileClip((j*16)+xofs,(i*16)+yofs,img,mask);\r
89     }\r
90   curlayer++;\r
91 }\r
92 \r
93 void BlitLayerLucent(byte l)\r
94 {\r
95   int i,j,offset,c;\r
96   byte *img,*mask;\r
97 \r
98   if (!layertoggle[l]) return;\r
99 \r
100   // Adjust view\r
101 \r
102   oxw=xwin*layer[l].pmultx/layer[l].pdivx;\r
103   oyw=ywin*layer[l].pmulty/layer[l].pdivy;\r
104   xofs=-(oxw&15);\r
105   yofs=-(oyw&15);\r
106   xtc=oxw>>4;\r
107   ytc=oyw>>4;\r
108 \r
109   // Draw it, bitch!\r
110 \r
111   for (i=0; i<ty+1; i++)\r
112     for (j=0; j<tx+1; j++)\r
113     {\r
114       c=tileidx[layers[l][(((ytc+i)*layer[l].sizex)+xtc+j)]];\r
115       c=c<numtiles?c:0;\r
116       offset=c*256;\r
117       img=vsp+offset; mask=vspmask+offset;\r
118       if (img!=vsp)\r
119         TCopyTileLucentClip((j*16)+xofs,(i*16)+yofs,img);\r
120     }\r
121   curlayer++;\r
122 }\r
123 \r
124 void BlitLayer(byte c)\r
125 {\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
130 }\r
131 \r
132 void DrawObstructions()\r
133 {\r
134   int i,j;\r
135 \r
136   oxw=xwin*layer[0].pmultx/layer[0].pdivx;\r
137   oyw=ywin*layer[0].pmulty/layer[0].pdivy;\r
138   xofs=-(oxw&15);\r
139   yofs=-(oyw&15);\r
140   xtc=oxw/16;\r
141   ytc=oyw/16;\r
142 \r
143   for (i=0; i<ty+1; i++)\r
144     for (j=0; j<tx+1; j++)\r
145     {\r
146       if (obstruct[((ytc+i)*layer[0].sizex)+(xtc+j)])\r
147         ColorField((j*16)+xofs,(i*16)+yofs,7);\r
148     }\r
149 }\r
150 \r
151 void DrawZones()\r
152 {\r
153   int i,j;\r
154   char z;\r
155 \r
156   oxw=xwin*layer[0].pmultx/layer[0].pdivx;\r
157   oyw=ywin*layer[0].pmulty/layer[0].pdivy;\r
158   xofs=-(oxw&15);\r
159   yofs=-(oyw&15);\r
160   xtc=oxw>>4;\r
161   ytc=oyw>>4;\r
162 \r
163   for (i=0; i<ty+1; i++)\r
164     for (j=0; j<tx+1; j++)\r
165     {\r
166       z=zone[((ytc+i)*layer[0].sizex)+(xtc+j)];\r
167       if (z)\r
168       {\r
169         ColorField((j*16)+xofs,(i*16)+yofs,z);\r
170       }\r
171       if (player)\r
172          {\r
173            if ( ((player->x+7)/16)==(xtc+j) && ((player->y+7)/16)==(ytc+i))\r
174            {\r
175               ColorField((j*16)+xofs,(i*16)+yofs,31);\r
176            }\r
177          }\r
178     }\r
179 }\r
180 \r
181 void HookScriptThing(char *src)\r
182 {\r
183   char mystr[10];\r
184 \r
185   src++;\r
186   strcpy(mystr, src);\r
187   src=mystr;\r
188   while (*src != 'X') src++;\r
189   *src=0;\r
190   ExecuteEvent(atoi(mystr));\r
191 }\r
192 \r
193 void RenderMAP()\r
194 { char *src;\r
195 \r
196   curlayer=0;\r
197   src=rstring;\r
198   while (*src)\r
199   {\r
200     switch (*src)\r
201     {\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
211                 curlayer++; break;\r
212     }\r
213     src++;\r
214   }\r
215    if (!curlayer) ClearScreen();\r
216    if (showobs) DrawObstructions();\r
217    if (showzone) DrawZones();\r
218 }\r
219 \r
220 void Render()\r
221 {\r
222   if (cameratracking==1 && player)\r
223   {\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
228   }\r
229   if (cameratracking==2)\r
230   {\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
235   }\r
236   SiftEntities();\r
237   RenderMAP();\r
238 }\r
239 \r
240 int rnd(int lo, int hi)\r
241 {\r
242   int range=hi-lo+1;\r
243   int i=rand() % range;\r
244   return i+lo;\r
245 }\r
246 \r
247 void AnimateTile(byte i, int l)\r
248 {\r
249   switch (vspanim[i].mode)\r
250   {\r
251     case 0: if (tileidx[l]<vspanim[i].finish) tileidx[l]++;\r
252             else tileidx[l]=vspanim[i].start;\r
253             break;\r
254     case 1: if (tileidx[l]>vspanim[i].start) tileidx[l]--;\r
255             else tileidx[l]=vspanim[i].finish;\r
256             break;\r
257     case 2: tileidx[l]=rnd(vspanim[i].start,vspanim[i].finish);\r
258             break;\r
259     case 3: if (flipped[l])\r
260             {\r
261               if (tileidx[l]!=vspanim[i].start) tileidx[l]--;\r
262               else { tileidx[l]++; flipped[l]=0; }\r
263             }\r
264             else\r
265             {\r
266               if (tileidx[l]!=vspanim[i].finish) tileidx[l]++;\r
267               else { tileidx[l]--; flipped[l]=1; }\r
268             }\r
269   }\r
270 }\r
271 \r
272 void Animate(byte i)\r
273 { static int l;\r
274 \r
275   vadelay[i]=0;\r
276   for (l=vspanim[i].start; l<=vspanim[i].finish; l++)\r
277     AnimateTile(i,l);\r
278 }\r
279 \r
280 void CheckTileAnimation()\r
281 { static byte i;\r
282 \r
283   if (!animate) return;\r
284   if (!vsp) return;\r
285   for (i=0; i<100; i++)\r
286   {\r
287     if ((vspanim[i].delay) && (vspanim[i].delay<vadelay[i]))\r
288        Animate(i);\r
289     vadelay[i]++;\r
290   }\r
291 }\r