]> 4ch.mooo.com Git - 16.git/blob - src/lib/scroll16.c
==== old BG rendering is back ====
[16.git] / src / lib / scroll16.c
1 /* Project 16 Source Code~\r
2  * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
3  *\r
4  * This file is part of Project 16.\r
5  *\r
6  * Project 16 is free software; you can redistribute it and/or modify\r
7  * it under the terms of the GNU General Public License as published by\r
8  * the Free Software Foundation; either version 3 of the License, or\r
9  * (at your option) any later version.\r
10  *\r
11  * Project 16 is distributed in the hope that it will be useful,\r
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14  * GNU General Public License for more details.\r
15  *\r
16  * You should have received a copy of the GNU General Public License\r
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>, or\r
18  * write to the Free Software Foundation, Inc., 51 Franklin Street,\r
19  * Fifth Floor, Boston, MA 02110-1301 USA.\r
20  *\r
21  */\r
22 /*\r
23         scroll16 library~\r
24 */\r
25 #include "src/lib/scroll16.h"\r
26 \r
27 //#define INC_PER_FRAME if(player[pn].enti.q&1) player[pn].enti.persist_aniframe++; if(player[pn].enti.persist_aniframe>4) player[pn].enti.persist_aniframe = 1;\r
28 \r
29 void ZC_walk(map_view_t *pip, player_t *player, word pn)\r
30 {\r
31         switch(player[pn].enti.d)\r
32         {\r
33                 //no direction\r
34                 case 2:\r
35                         //0000pip[0].video->startclk = (*clockw);\r
36                 break;\r
37                 //right movement\r
38                 case 3:\r
39                         if(pip[0].tx >= 0 && pip[0].tx+pip[0].page->ti.tw < pip[0].map->width && player[pn].enti.tx == pip[0].tx+pip[0].page->ti.tilemidposscreenx &&\r
40                         !(pip[0].map->data[(player[pn].enti.tx)+(pip[0].map->width*(player[pn].enti.ty-1))] == 0))//!(player[pn].enti.tx+1 == TRIGGX && player[pn].enti.ty == TRIGGY))  //collision detection!\r
41                         {\r
42                                 player[pn].walktype=2;\r
43                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
44                                 {\r
45                                         //INC_PER_FRAME;\r
46                                         ANIMATESPRIFUN(pip, player, pn, 2);\r
47                                         ScrollRight(pip, player, 3, pn);\r
48                                         ScrollRight(pip, player, 2, pn);\r
49                                                                         mapScrollRight(pip, player, (0), pn);\r
50                                         if(pip[0].video->bgps)  mapScrollRight(pip, player, (1), pn);\r
51                                         player[pn].enti.q++;\r
52                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
53                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx++; }\r
54                         }\r
55                         else if(player[pn].enti.tx < pip[0].map->width && !(pip[0].map->data[(player[pn].enti.tx)+(pip[0].map->width*(player[pn].enti.ty-1))] == 0))//!(player[pn].enti.tx+1 == TRIGGX && player[pn].enti.ty == TRIGGY))\r
56                         {\r
57                                 player[pn].walktype=1;\r
58                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
59                                 {\r
60                                         //INC_PER_FRAME;\r
61                                         player[pn].enti.x+=(player[pn].enti.speed);\r
62                                         ANIMATESPRIFUN(pip, player, pn, 1);\r
63                                         player[pn].enti.q++;\r
64                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx++; }\r
65                         }\r
66                         else\r
67                         {\r
68                                 player[pn].walktype=0;\r
69                                 ANIMATESPRIFUN(pip, player, pn, 0);\r
70                                 player[pn].enti.d = 2;\r
71                         }\r
72                         player[pn].enti.triggerx = player[pn].enti.tx+1;\r
73                         player[pn].enti.triggery = player[pn].enti.ty;\r
74                 break;\r
75                 //left movement\r
76                 case 1:\r
77                         if(pip[0].tx > 0 && pip[0].tx+pip[0].page->ti.tw <= pip[0].map->width && player[pn].enti.tx == pip[0].tx+pip[0].page->ti.tilemidposscreenx &&\r
78                         !(pip[0].map->data[(player[pn].enti.tx-2)+(pip[0].map->width*(player[pn].enti.ty-1))] == 0))//!(player[pn].enti.tx-1 == TRIGGX && player[pn].enti.ty == TRIGGY))        //collision detection!\r
79                         {\r
80                                 player[pn].walktype=2;\r
81                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
82                                 {\r
83                                         //INC_PER_FRAME;\r
84                                         ANIMATESPRIFUN(pip, player, pn, 2);\r
85                                         ScrollLeft(pip, player, 3, pn);\r
86                                         ScrollLeft(pip, player, 2, pn);\r
87                                                                         mapScrollLeft(pip, player, (0), pn);\r
88                                         if(pip[0].video->bgps)  mapScrollLeft(pip, player, (1), pn);\r
89                                         player[pn].enti.q++;\r
90                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
91                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx--; }\r
92                         }\r
93                         else if(player[pn].enti.tx > 1 && !(pip[0].map->data[(player[pn].enti.tx-2)+(pip[0].map->width*(player[pn].enti.ty-1))] == 0))//!(player[pn].enti.tx-1 == TRIGGX && player[pn].enti.ty == TRIGGY))\r
94                         {\r
95                                 player[pn].walktype=1;\r
96                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
97                                 {\r
98                                         //INC_PER_FRAME;\r
99                                         player[pn].enti.x-=(player[pn].enti.speed);\r
100                                         ANIMATESPRIFUN(pip, player, pn, 1);\r
101                                         player[pn].enti.q++;\r
102                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx--; }\r
103                         }\r
104                         else\r
105                         {\r
106                                 player[pn].walktype=0;\r
107                                 ANIMATESPRIFUN(pip, player, pn, 0);\r
108                                 player[pn].enti.d = 2;\r
109                         }\r
110                         player[pn].enti.triggerx = player[pn].enti.tx-1;\r
111                         player[pn].enti.triggery = player[pn].enti.ty;\r
112                 break;\r
113                 //down movement\r
114                 case 4:\r
115                         if(pip[0].ty >= 0 && pip[0].ty+pip[0].page->ti.th < pip[0].map->height && player[pn].enti.ty == pip[0].ty+pip[0].page->ti.tilemidposscreeny &&\r
116                         !(pip[0].map->data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty))] == 0))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty+1 == TRIGGY))  //collision detection!\r
117                         {\r
118                                 player[pn].walktype=2;\r
119                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
120                                 {\r
121                                         //INC_PER_FRAME;\r
122                                         ANIMATESPRIFUN(pip, player, pn, 2);\r
123                                         ScrollDown(pip, player, 3, pn);\r
124                                         ScrollDown(pip, player, 2, pn);\r
125                                                                         mapScrollDown(pip, player, (0), pn);\r
126                                         if(pip[0].video->bgps)  mapScrollDown(pip, player, (1), pn);\r
127                                         player[pn].enti.q++;\r
128                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
129                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty++; }\r
130                         }\r
131                         else if(player[pn].enti.ty < pip[0].map->height && !(pip[0].map->data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty))] == 0))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty+1 == TRIGGY))\r
132                         {\r
133                                 player[pn].walktype=1;\r
134                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
135                                 {\r
136                                         //INC_PER_FRAME;\r
137                                         player[pn].enti.y+=(player[pn].enti.speed);\r
138                                         ANIMATESPRIFUN(pip, player, pn, 1);\r
139                                         player[pn].enti.q++;\r
140                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty++; }\r
141                         }\r
142                         else\r
143                         {\r
144                                 player[pn].walktype=0;\r
145                                 ANIMATESPRIFUN(pip, player, pn, 0);\r
146                                 player[pn].enti.d = 2;\r
147                         }\r
148                         player[pn].enti.triggerx = player[pn].enti.tx;\r
149                         player[pn].enti.triggery = player[pn].enti.ty+1;\r
150                 break;\r
151                 //up movement\r
152                 case 0:\r
153                         if(pip[0].ty > 0 && pip[0].ty+pip[0].page->ti.th <= pip[0].map->height && player[pn].enti.ty == pip[0].ty+pip[0].page->ti.tilemidposscreeny &&\r
154                         !(pip[0].map->data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty-2))] == 0))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty-1 == TRIGGY))        //collision detection!\r
155                         {\r
156                                 player[pn].walktype=2;\r
157                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
158                                 {\r
159                                         //INC_PER_FRAME;\r
160                                         ANIMATESPRIFUN(pip, player, pn, 2);\r
161                                         ScrollUp(pip, player, 3, pn);\r
162                                         ScrollUp(pip, player, 2, pn);\r
163                                                                         mapScrollUp(pip, player, (0), pn);\r
164                                         if(pip[0].video->bgps)  mapScrollUp(pip, player, (1), pn);\r
165                                         player[pn].enti.q++;\r
166                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
167                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty--; }\r
168                         }\r
169                         else if(player[pn].enti.ty > 1 && !(pip[0].map->data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty-2))] == 0))//!(player[pn].enti.tx == TRIGGX &&  player[pn].enti.ty-1 == TRIGGY))\r
170                         {\r
171                                 player[pn].walktype=1;\r
172                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
173                                 {\r
174                                         //INC_PER_FRAME;\r
175                                         player[pn].enti.y-=(player[pn].enti.speed);\r
176                                         ANIMATESPRIFUN(pip, player, pn, 1);\r
177                                         player[pn].enti.q++;\r
178                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty--; }\r
179                         }\r
180                         else\r
181                         {\r
182                                 player[pn].walktype=0;\r
183                                 ANIMATESPRIFUN(pip, player, pn, 0);\r
184                                 player[pn].enti.d = 2;\r
185                         }\r
186                         player[pn].enti.triggerx = player[pn].enti.tx;\r
187                         player[pn].enti.triggery = player[pn].enti.ty-1;\r
188                 break;\r
189         }\r
190 }\r
191 \r
192 \r
193 //panning page\r
194 void ZC_panPageManual(map_view_t *pip, player_t *player, word pn)\r
195 {\r
196 #define SHOWMVFUN_ ZC_ShowMV(pip, 0, 0);\r
197         switch(player[pn].enti.d)\r
198         {\r
199                 //right movement\r
200                 case 3:\r
201                         if(pip[0].tx >= 0 && pip[0].tx+pip[0].page->ti.tw < pip[0].page->ti.tilesw)\r
202                         {\r
203                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
204                                 {\r
205                                         pip[0].page->dx+=4;\r
206                                         SHOWMVFUN_;\r
207                                         player[pn].enti.q++;\r
208                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; pip[0].tx++; }\r
209                         }\r
210                 break;\r
211 \r
212                 //left movement\r
213                 case 1:\r
214                         if(pip[0].tx > 0 && pip[0].tx+pip[0].page->ti.tw <= pip[0].page->ti.tilesw)\r
215                         {\r
216                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
217                                 {\r
218                                         pip[0].page->dx-=4;\r
219                                         SHOWMVFUN_;\r
220                                         player[pn].enti.q++;\r
221                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; pip[0].tx--; }\r
222                         }\r
223                 break;\r
224 \r
225                 //down movement\r
226                 case 4:\r
227                         if(pip[0].ty >= 0 && pip[0].ty+pip[0].page->ti.th < pip[0].page->ti.tilesh)\r
228                         {\r
229                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
230                                 {\r
231                                         pip[0].page->dy+=4;\r
232                                         SHOWMVFUN_;\r
233                                         player[pn].enti.q++;\r
234                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; pip[0].ty++; }\r
235                         }\r
236                 break;\r
237 \r
238                 //up movement\r
239                 case 0:\r
240                         if(pip[0].ty > 0 && pip[0].ty+pip[0].page->ti.th <= pip[0].page->ti.tilesh)\r
241                         {\r
242                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
243                                 {\r
244                                         pip[0].page->dy-=4;\r
245                                         SHOWMVFUN_;\r
246                                         player[pn].enti.q++;\r
247                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; pip[0].ty--; }\r
248                         }\r
249                 break;\r
250         }\r
251 }\r
252 \r
253 /*\r
254  * modex mv setup\r
255 */\r
256 void ZC_MVSetup(map_view_t *pip, map_t *map, global_game_variables_t *gv)\r
257 {\r
258 #define ZC_MVI 1\r
259         nibble i;\r
260         // 1st page\r
261         pip[0].page = &gv->video.page[0];\r
262         pip[0].map = map;\r
263         pip[0].video = &gv->video;\r
264         pip[0].p        = &gv->video.p;\r
265         pip[0].sp       = &gv->video.sp;\r
266         ZC_MVInit(pip, 1, 1);\r
267 \r
268         for(i=ZC_MVI;i<gv->video.num_of_pages;i++)\r
269         {\r
270                 pip[i].page     =       &gv->video.page[i];\r
271                 pip[i].map      =       pip[0].map;\r
272                 pip[i].video    =       pip[0].video;\r
273                 pip[i].p        =       pip[0].p;\r
274                 pip[i].sp       =       pip[0].sp;\r
275 //              if(i>ZC_MVI) {\r
276                 pip[i].tx =     1;\r
277                 pip[i].ty =     1;\r
278 //              }\r
279         }\r
280 }\r
281 \r
282 void ZC_MVInit(map_view_t *pip, int tx, int ty)\r
283 {\r
284         pip[0].tx = tx;\r
285         pip[0].ty = ty;\r
286         //pip[0].tx = pip[1].tx = tx;\r
287         //pip[0].ty = pip[1].ty = ty;\r
288 }\r
289 \r
290 void ZC_ShowMV(map_view_t *moo, boolean vsync, boolean sr)\r
291 {\r
292         //VL_ShowPage(moo[moo[0].video->sp].page, vsync, sr);\r
293         word high_address, low_address, offset;\r
294         byte crtcOffset;\r
295 \r
296         // calculate offset\r
297         offset = (word) moo[moo[0].video->sp].page->data;\r
298         offset += moo[0].page->dy * (moo[0].page->width >> 2 );\r
299         offset += moo[0].page->dx >> 2;\r
300 \r
301         // calculate crtcOffset according to virtual width\r
302         switch(sr)\r
303         {\r
304                 case 1:\r
305                         crtcOffset = moo[moo[0].video->sp].page->sw >> 3;\r
306                 break;\r
307                 default:\r
308                 case 0:\r
309                         crtcOffset = moo[0].page->width >> 3;\r
310                 break;\r
311         }\r
312 \r
313         high_address = HIGH_ADDRESS | (offset & 0xff00);\r
314         low_address  = LOW_ADDRESS  | (offset << 8);\r
315 \r
316         // wait for appropriate timing and then program CRTC\r
317         if(vsync) while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE));\r
318         outpw(CRTC_INDEX, high_address);\r
319         outpw(CRTC_INDEX, low_address);\r
320         outp(CRTC_INDEX, 0x13);\r
321         outp(CRTC_DATA, crtcOffset);\r
322 \r
323         // wait for one retrace\r
324         if(vsync) while (!(inp(INPUT_STATUS_1) & VRETRACE));\r
325 \r
326         // do PEL panning here\r
327         outp(AC_INDEX, 0x33);\r
328         outp(AC_INDEX, (moo[0].page->dx & 0x03) << 1);\r
329 }\r
330 \r
331 void\r
332 initMap(map_t *map) {\r
333         // just a place holder to fill out an alternating pattern\r
334         int x, y;\r
335         int i;\r
336         int tile = 1;\r
337 \r
338         i=0;\r
339         for(y=0; y<map->height; y++) {\r
340                 for(x=0; x<map->width; x++) {\r
341                         map->data[i]=255;\r
342 //                      printf("[%d]", map->data[i]);\r
343                         tile = tile ? 0 : 1;\r
344                         i++;\r
345                 }\r
346                 tile = tile ? 0 : 1;\r
347         }\r
348 }\r
349 \r
350 \r
351 void near mapScrollRight(map_view_t *mv, player_t *player, word id, word plid)\r
352 {\r
353         word x;//, y;  /* coordinate for drawing */\r
354 \r
355         ScrollRight(mv, player, id, plid);\r
356 \r
357         /* draw the next column */\r
358         x= mv[0].page->sw + mv[0].map->tiles->tileWidth;\r
359 #ifndef FULLRCREND\r
360         if(player[plid].enti.q%4)\r
361 #else\r
362         if(player[plid].enti.q==4)\r
363 #endif\r
364 //              if(id==0)\r
365                         mapDrawCol(&mv[id], mv[0].tx + mv[0].page->ti.tw, mv[0].ty-1, x, player, DRAWCOLNUM);\r
366 //              else\r
367 //                      if(mv[0].video->bgps)\r
368 //                              modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[0].map->tiles->tileWidth, mv[0].page->height);\r
369         mv[0].video->r=1;\r
370 }\r
371 \r
372 \r
373 void near mapScrollLeft(map_view_t *mv, player_t *player, word id, word plid)\r
374 {\r
375         word x;//,y;  /* coordinate for drawing */\r
376 \r
377         ScrollLeft(mv, player, id, plid);\r
378 \r
379         /* draw the next column */\r
380         x= 0;\r
381 #ifndef FULLRCREND\r
382         if(player[plid].enti.q%4)\r
383 #else\r
384         if(player[plid].enti.q==4)\r
385 #endif\r
386 //              if(id==0)\r
387                         mapDrawCol(&mv[id], mv[0].tx - 1, mv[0].ty-1, x, player, DRAWCOLNUM);\r
388 //              else\r
389 //                      if(mv[0].video->bgps)\r
390 //                              modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[0].map->tiles->tileWidth, mv[0].page->height);\r
391         mv[0].video->r=1;\r
392 }\r
393 \r
394 \r
395 void near mapScrollUp(map_view_t *mv, player_t *player, word id, word plid)\r
396 {\r
397         word y;//x,  /* coordinate for drawing */\r
398 \r
399         ScrollUp(mv, player, id, plid);\r
400 \r
401         /* draw the next row */\r
402         y= 0;\r
403 #ifndef FULLRCREND\r
404         if(player[plid].enti.q%3)\r
405 #else\r
406         if(player[plid].enti.q==4)\r
407 #endif\r
408 //              if(id==0)\r
409                         mapDrawRow(&mv[id], mv[0].tx - 1, mv[0].ty-1, y, player, DRAWCOLNUM);\r
410 //              else\r
411 //                      if(mv[0].video->bgps)\r
412 //                              modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[0].page->width, mv[0].map->tiles->tileHeight);\r
413         mv[0].video->r=1;\r
414 }\r
415 \r
416 \r
417 void near mapScrollDown(map_view_t *mv, player_t *player, word id, word plid)\r
418 {\r
419         word y;//x,  /* coordinate for drawing */\r
420 \r
421         ScrollDown(mv, player, id, plid);\r
422 \r
423         /* draw the next row */\r
424         y= mv[0].page->sh + mv[0].map->tiles->tileHeight;\r
425 #ifndef FULLRCREND\r
426         if(player[plid].enti.q%3)\r
427 #else\r
428         if(player[plid].enti.q==4)\r
429 #endif\r
430 //              if(id==0)\r
431                         mapDrawRow(&mv[id], mv[0].tx - 1, mv[0].ty+mv[0].page->ti.th, y, player, DRAWCOLNUM);\r
432 //              else\r
433 //                      if(mv[0].video->bgps)\r
434 //                              modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[0].page->width, mv[0].map->tiles->tileHeight);\r
435         mv[0].video->r=1;\r
436 }\r
437 \r
438 \r
439 \r
440 //===========================================================================\r
441 //TODO: put player in starting position of assigned spot on map\r
442 //default player position on the viewable map\r
443 void ZC_playerXYpos(int x, int y, player_t *player, map_view_t *pip, nibble pn)\r
444 {\r
445         player[pn].enti.tx = x + pip[0].tx + pip[0].page->ti.tilemidposscreenx;\r
446         player[pn].enti.ty = y + pip[0].ty + pip[0].page->ti.tilemidposscreeny;\r
447 }\r
448 //===========================================================================\r
449 \r
450 sword chkmap(map_t *map, word q)\r
451 {\r
452 //      bitmap_t bp;\r
453         static byte x[(MAPW*MAPH)+1] =\r
454 { 1, 2, 3, 4, 0, 3, 3, 3, 3, 3, 3, 3, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 6, 7, 8, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 10, 11, 12, 4, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 14, 15, 16, 0, 1, 1, 1, 5, 8, 1, 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 4, 0, 0, 0, 0, 0, 8, 8, 1, 11, 11, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 2, 3, 4, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 5, 6, 7, 8, 6, 6, 6, 6, 6, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 9, 10, 11, 12, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 13, 14, 15, 16, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10 };\r
455 /*1,    2,      3,      4,      0,      3,      3,      3,      3,      3,      3,      3,      3,      4,      1,      1,      1,      1,      1,      1,      \\r
456 5,      6,      7,      8,      0,      1,      0,      1,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
457 9,      10,     11,     12,     4,      1,      0,      1,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
458 13,     14,     15,     16,     0,      1,      1,      1,      5,      8,      1,      11,     11,     1,      1,      1,      1,      1,      1,      1,      \\r
459 0,      0,      4,      0,      0,      0,      0,      0,      8,      8,      1,      11,     11,     3,      1,      1,      1,      1,      1,      1,      \\r
460 1,      1,      1,      1,      0,      0,      0,      0,      8,      8,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
461 1,      1,      1,      1,      0,      0,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
462 1,      1,      1,      1,      0,      0,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
463 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
464 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
465 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
466 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
467 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
468 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
469 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      3,      3,      3,      1,      2,      3,      4 };*/\r
470         //check for failed to load map\r
471         if((map->width == map->height == 0) && (q>0))\r
472         {\r
473                 //initiate a null map!\r
474                 map->width=MAPW;///2;\r
475                 map->height=MAPH;///2;\r
476 //              map->data = malloc(((map->width*map->height)+1)*sizeof(byte));\r
477                 map->data = &x;\r
478                 map->tiles = malloc(sizeof(tiles_t));\r
479                 //fix this to be far~\r
480 //              bp = bitmapLoadPcx("data/ed.pcx");\r
481 //              map->tiles->data = &bp;\r
482 #ifdef __DEBUG_MAP__\r
483                 dbg_mapdata = map->data;\r
484 #endif\r
485                 map->tiles->tileHeight = 16;\r
486                 map->tiles->tileWidth = 16;\r
487                 map->tiles->rows = 1;\r
488                 map->tiles->cols = 1;\r
489 #ifdef __DEBUG_MAP__\r
490                 dbg_maptext = true;\r
491 #endif\r
492         }\r
493 #ifdef __DEBUG_MAP__\r
494         else dbg_maptext = false;\r
495 #endif\r
496         return 0;\r
497 }\r
498 \r
499 //TODO: player position here\r
500 void mapGoTo(map_view_t *mv, int tx, int ty)\r
501 {\r
502         int py;//px,\r
503         unsigned int i;\r
504 \r
505         ZC_mapinitMV(mv, tx, ty);\r
506 \r
507         /* draw the tiles */\r
508         modexClearRegion(mv[0].page, 0, 0, mv[0].page->width, mv[0].page->height, 0);\r
509         py=0;\r
510         i=mv[0].ty * mv[0].map->width + mv[0].tx;\r
511         for(ty=mv[0].ty-1; py < mv[0].page->sh+mv->dyThresh && ty < mv[0].map->height; ty++, py+=mv[0].map->tiles->tileHeight) {\r
512                 mapDrawWRow(&mv[0], tx-1, ty, py);\r
513                 i+=mv->map->width - tx;\r
514         }\r
515         py=0;\r
516         i=mv[1].ty * mv[1].map->width + mv[1].tx;\r
517         for(ty=mv[1].ty-1; py < mv[1].page->sh+mv->dyThresh && ty < mv[1].map->height; ty++, py+=mv[1].map->tiles->tileHeight) {\r
518                 mapDrawWRow(&mv[1], tx-1, ty, py);\r
519                 i+=mv->map->width - tx;\r
520         }\r
521         //if(mv[0].video->bgps) modexCopyPageRegion(mv[1].page, mv[0].page, 0, 0, 0, 0, mv[0].page->width, mv[0].page->height);\r
522 }\r
523 \r
524 void ZC_mapinitMV(map_view_t *mv, int tx, int ty)\r
525 {\r
526         /* set up the coordinates */\r
527         mv[0].tx = mv[1].tx = tx;\r
528         mv[0].ty = mv[1].ty = ty;\r
529         mv[0].page->dx = mv[1].page->dx = mv[2].page->dx = mv[3].page->dx = mv->map->tiles->tileWidth;\r
530         mv[0].page->dy = mv[1].page->dy = mv[2].page->dy = mv[3].page->dy = mv->map->tiles->tileHeight;\r
531 \r
532         /* set up the thresholds */\r
533         mv[0].dxThresh = mv[1].dxThresh = mv[2].dxThresh = mv[3].dxThresh = mv->map->tiles->tileWidth * 2;\r
534         mv[0].dyThresh = mv[1].dyThresh = mv[2].dyThresh = mv[3].dyThresh = mv->map->tiles->tileHeight * 2;\r
535 }\r
536 \r
537 void near\r
538 mapDrawTile(tiles_t *t, word i, page_t *page, word x, word y)\r
539 {\r
540         word rx;\r
541         word ry;\r
542         //word textx=0, texty=0;\r
543         //if(i==0) i=2;\r
544         if(i==0)\r
545         {\r
546                 //wwww\r
547                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, 1); //currently the over scan color!\r
548         }\r
549         else\r
550         {\r
551                 rx = (((i-1) % ((t->data->width)/t->tileWidth)) * t->tileWidth);\r
552                 ry = (((i-1) / ((t->data->height)/t->tileHeight)) * t->tileHeight);\r
553 ////0000printf("i=%d\n", i);\r
554 #ifdef __DEBUG_MAP__\r
555                 switch(dbg_maptext)\r
556                 {\r
557                         case 0:\r
558 #endif\r
559 #ifndef TILERENDER\r
560                                 if(!pagenorendermap) modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, ((dbg_mapdata[i])+1));\r
561                                 //modexprint(page, x, y, 1, 15, 0, (char const *)(t->debug_data[i]));\r
562 #else\r
563                                 modexDrawBmpRegion              (page, x, y, rx, ry, t->tileWidth, t->tileHeight, (t->data));\r
564                                 /* then the sprite. note modding ram ptr means we just draw to (x&3,0) */\r
565                                 //draw_vrl1_vgax_modex(x-rx,y-ry,vrl_header,vrl_lineoffs,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));\r
566                                 //modexDrawBmpRegion    (page, x, y, rx, ry, t->tileWidth, t->tileHeight, (t->data));\r
567 #endif\r
568 #ifdef __DEBUG_MAP__\r
569                         break;\r
570                         case 1:\r
571                                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, (dbg_mapdata[i])+1);\r
572                                 //modexprintbig(page, x, y, 1, 15, 0, (t->debug_data));\r
573                                 /*for(texty=0; texty<2; texty++)\r
574                                 {\r
575                                         for(textx=0; textx<2; textx++)\r
576                                         {*/\r
577 //                                              modexprint(page, x+(textx*8), y+(texty*8), 1, (word)(t->debug_data), 0, (t->debug_data));\r
578 /*                                      }\r
579                                 }*/\r
580                         break;\r
581                 }\r
582 #endif\r
583         }\r
584 }\r
585 \r
586 void near mapDrawRow(map_view_t *mv, int tx, int ty, word y, player_t *player, word poopoffset)\r
587 {\r
588         int i;\r
589 if(pagedelayrendermap)          if(!y)  y+=TILEWH;      else    y-=TILEWH;\r
590         poopoffset%=player[0].enti.speed;\r
591 //printf("y: %d\n", poopoffset);\r
592 if(pagedelayrendermap){ sprintf(global_temp_status_text, "%-3u", mv->dx); modexprint(mv[0].page, player[0].enti.x, player[0].enti.y-28-(poopoffset*8) , 1, 2, 1, global_temp_status_text); }\r
593         /* the position within the map array */\r
594         i=ty * mv->map->width + tx;\r
595         for(    mv->dx=poopoffset;      mv->dx<(mv->page->sw+mv->dxThresh)/(poopoffset+1) && tx < mv->map->width;       mv->dx+=mv->map->tiles->tileWidth, tx++) {\r
596                 if(i>=0)        /* we are in the map, so copy away! */\r
597                         mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, mv->dx, y);\r
598                 i++; /* next! */\r
599         }\r
600 //if(pagedelayrendermap) delay(200);\r
601 }\r
602 \r
603 void near mapDrawCol(map_view_t *mv, int tx, int ty, word x, player_t *player, word poopoffset)\r
604 {\r
605         int i;\r
606 if(pagedelayrendermap)          if(!x)  x+=TILEWH;              else    x-=TILEWH;\r
607         poopoffset%=player[0].enti.speed;\r
608 //printf("x: %d\n", poopoffset);\r
609 if(pagedelayrendermap){ sprintf(global_temp_status_text, "%-3u", mv->dy); modexprint(mv[0].page, player[0].enti.x, player[0].enti.y-28-(poopoffset*8) , 1, 2, 1, global_temp_status_text); }\r
610         /* location in the map array */\r
611         i=ty * mv->map->width + tx;\r
612         /* We'll copy all of the columns in the screen,\r
613            i + 1 row above and one below */\r
614         for(    mv->dy=poopoffset;      mv->dy<(mv->page->sh+mv->dyThresh)/(poopoffset+1) && ty < mv->map->height;      mv->dy+=mv->map->tiles->tileHeight, ty++) {\r
615                 if(i>=0)        /* we are in the map, so copy away! */\r
616                         mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, mv->dy);\r
617                 i += mv->map->width;\r
618         }\r
619 //if(pagedelayrendermap) delay(200);\r
620 }\r
621 \r
622 void mapDrawWRow(map_view_t *mv, int tx, int ty, word y)\r
623 {\r
624         int i;\r
625 \r
626         /* the position within the map array */\r
627         i=ty * mv->map->width + tx;\r
628         for(mv->dx=0; mv->dx<mv->page->sw+mv->dxThresh && tx < mv->map->width; mv->dx+=mv->map->tiles->tileWidth, tx++) {\r
629                 if(i>=0)        /* we are in the map, so copy! */\r
630                         mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, mv->dx, y);\r
631                 i++; /* next! */\r
632         }\r
633 }\r
634 \r
635 void mapDrawWCol(map_view_t *mv, int tx, int ty, word x)\r
636 {\r
637         int i;\r
638 \r
639         /* location in the map array */\r
640         i=ty * mv->map->width + tx;\r
641 \r
642         /* We'll copy all of the columns in the screen,\r
643            i + 1 row above and one below */\r
644         for(mv->dy=0; mv->dy<mv->page->sh+mv->dyThresh && ty < mv->map->height; mv->dy+=mv->map->tiles->tileHeight, ty++) {\r
645                 if(i>=0)        /* we are in the map, so copy away! */\r
646                         mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, mv->dy);\r
647                 i += mv->map->width;\r
648         }\r
649 }\r
650 \r
651 /*void qclean()\r
652 {\r
653         //setkb(0);\r
654 }*/\r
655 \r
656 boolean pagenorendermap = 0;\r
657 boolean pagedelayrendermap = 0;\r
658 \r
659 /*      sync    */\r
660 void shinku(global_game_variables_t *gv)\r
661 {\r
662         word x = (0) + gv->video.page[/*!*/(gv->video.p)].dx; // follow the screen\r
663         word y = (0) + gv->video.page[/*!*/(gv->video.p)].dy; // follow the screen\r
664         word col = 2, bgcol = 1, type = 1;//w = 64, h = 8, //col7bgcol0\r
665         //byte o,o2,i;\r
666         //modexCopyPageRegion(pip[1].page, pip[2].page, 16, 16, 16, 16, (14*8)+4, 8+4);\r
667         /* block copy to visible RAM from offscreen */\r
668 //      vga_setup_wm1_block_copy();\r
669 //      modexCopyPageRegion(&(gv->video.page[gv->video->sfip]), &(gv->video.page[!gv->video->sfip]), x, y, x+w, 0, w, h);\r
670 //      o =     *(gv->video.page[2].data); // source offscreen\r
671 //      o2 =    *(gv->video.page[gv->video->sfip].data)+(y * vga_state.vga_stride) + (x >> 2); // dest visible (original stride)\r
672 //      for (i=0;i < h;i++,o += vga_state.vga_draw_stride,o2 += vga_state.vga_stride) vga_wm1_mem_block_copy(o2,o,w >> 2);\r
673         /* must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally */\r
674 //      vga_restore_rm0wm0();\r
675         if(elapsed_timer(gv) >= (1.0 / gv->kurokku.frames_per_second))\r
676         {\r
677         // NTS: For some bizarre reason, gv->pee is not initialized, but the pointer is not NULL even\r
678         //      though it should be. Instead it's NULL as a neAr pointer but contains a non-null\r
679         //      segment value, so testing against NULL doesn't work. It is initialized properly if\r
680         //      you call start_timer() though which uses neAr malloc. Rather than fight with that,\r
681         //      I decided it would be better to declare a temp buffer statically and sprintf to that.\r
682         //\r
683         //      This fixes *** Null pointer assignment detected error message in ZCROLL.EXE on exit.\r
684                 sprintf(global_temp_status_text, "%.0f fps", (double)gv->kurokku.tiku/ticktock(gv));\r
685                 //modexClearRegion(&(gv->video.page[gv->video->sfip]), x, y, w, h, 45);\r
686                 modexprint(&(gv->video.page[/*!*/(gv->video.p)]), x, y, type, col, bgcol, global_temp_status_text);\r
687                 gv->kurokku.tiku=0;\r
688                 /* block copy to visible RAM from offscreen */\r
689 //              vga_setup_wm1_block_copy();\r
690 //              o =     *(gv->video.page[gv->video->sfip].data); // source offscreen\r
691 //              o2 =    *(gv->video.page[2].data)+(y * vga_state.vga_stride) + (x >> 2); // dest visible (original stride)\r
692 //              for (i=0;i < h;i++,o += vga_state.vga_draw_stride,o2 += vga_state.vga_stride) vga_wm1_mem_block_copy(o2,o,w >> 2);\r
693 //              modexCopyPageRegion(&(gv->video.page[gv->video->sfip]), &(gv->video.page[!gv->video->sfip]), x, y, x, 0, w, h);\r
694                 /* must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally */\r
695 //              vga_restore_rm0wm0();\r
696         }else //copy dat sheet\r
697         gv->kurokku.tiku++;\r
698 \r
699         switch(gv->kurokku.fpscap)\r
700         {\r
701                 case 0:\r
702                         //modexprint(&(gv->video.page[gv->video->sfip]), x, y+8, type, col, bgcol, "sanic!");\r
703                         gv->kurokku.frames_per_second=1;\r
704                 break;\r
705                 case 1:\r
706                         //turn this off if XT\r
707                         //modexWaitBorder();\r
708                         //vga_wait_for_vsync();\r
709                         gv->kurokku.frames_per_second=60;\r
710                 break;\r
711         }\r
712         //render!!\r
713         if(gv->video.r )\r
714         {//r=1\r
715                 /*if(video->bgp s)\r
716                 {\r
717                         modexCopyPageRegion(&(gv->video.page[ ]), &(gv->video.page[ ]), 0, 0, 0, 0, gv->video.page[ ].width, gv->video.page[ ].height);\r
718                 }else{\r
719                         //modexCopyPageRegion(&video->page[0], &video->page[1], enti->x, enti->y, 0, 0, 24, 32);\r
720                 }*/\r
721                 VL_ShowPage(&(gv->video.page[gv->video.sp]), gv->kurokku.fpscap, 0);\r
722                 gv->video.r =!gv->video.r ;\r
723                 //0000gv->video.tickclk = ((*clockw)-gv->video.startclk)/18.2;\r
724 //      }\r
725         }\r
726 }\r
727 \r
728 void near ZC_drawframe(map_view_t *pip, entity_t *enti, sword x, sword y)\r
729 {\r
730         switch(pip[0].video->rss)\r
731         {\r
732                 case 0:\r
733                         animate_spri(enti, pip->video);\r
734                 break;\r
735                 case 1:\r
736                         animate_spri(enti, pip->video);\r
737                 break;\r
738 //              case 2:\r
739 //                      modexClearRegion(&(pip[0].page[0]), x, y, 16, 32, player[pn].enti.dire);\r
740 //              break;\r
741         }\r
742 }\r
743 \r
744 #ifdef SPRITE\r
745 #define FRAME1 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 48, player[pn].enti.dire, 24, 32,    PLAYERBMPDATAPTR);\r
746 #define FRAME2 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, player[pn].enti.dire, 24, 32,    PLAYERBMPDATAPTR);\r
747 #define FRAME3 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 0, player[pn].enti.dire, 24, 32,     PLAYERBMPDATAPTR);\r
748 #define FRAME4 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, player[pn].enti.dire, 24, 32,    PLAYERBMPDATAPTR);\r
749 #else\r
750 #define FRAME1 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, 2+player[pn].enti.dire);\r
751 #define FRAME2 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, 1+player[pn].enti.dire);\r
752 #define FRAME3 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, player[pn].enti.dire);\r
753 #define FRAME4 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, 1+player[pn].enti.dire);\r
754 #endif\r
755 \r
756 void animatePlayer(map_view_t *pip, player_t *player, word pn, sword scrollswitch)\r
757 {\r
758         sword x = player[pn].enti.x;\r
759         sword y = player[pn].enti.y;\r
760         sword bx = x+16;        //buffer's x\r
761         sword by = y+16;        //buffer's y\r
762         sword qq; //scroll offset\r
763         word ls = 0;//player[pn].enti.persist_aniframe;\r
764         player[pn].enti.dire=32; //direction\r
765 \r
766         switch(scrollswitch)\r
767         {\r
768                 case 0:\r
769                         qq = 0;\r
770                 break;\r
771                 default:\r
772                         qq = ((player[pn].enti.q)*(player[pn].enti.speed));\r
773                 break;\r
774         }\r
775         //x-=4;\r
776         y-=pip[0].map->tiles->tileHeight;\r
777         switch (player[pn].enti.d)\r
778         {\r
779                 case 0:\r
780                         //up\r
781                         player[pn].enti.dire*=player[pn].enti.d;\r
782                         y-=qq;\r
783                         by-=4;\r
784                 break;\r
785                 case 3:\r
786                         // right\r
787                         player[pn].enti.dire*=(player[pn].enti.d-2);\r
788                         x+=qq;\r
789                         bx+=4;\r
790                 break;\r
791                 case 2:\r
792                 break;\r
793                 case 4:\r
794                         //down\r
795                         player[pn].enti.dire*=(player[pn].enti.d-2);\r
796                         y+=qq;\r
797                         by+=4;\r
798                 break;\r
799                 case 1:\r
800                         //left\r
801                         player[pn].enti.dire*=(player[pn].enti.d+2);\r
802                         x-=qq;\r
803                         bx-=4;\r
804                 break;\r
805         }\r
806 \r
807 //      if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, x-4, y-4, x-4, y-4, 28, 36);\r
808 //      else{\r
809 //              //copy old bg to page0\r
810 //              //modexCopyPageRegion(pip[3].page, pip[0].page, bx, by, 0, 0,   20, 36);\r
811 //              //update buffer\r
812 //              //modexCopyPageRegion(pip[0].page, pip[3].page, 0, 0,   x, y,   20, 36);\r
813 //      }\r
814 //modexCopyPageRegion(page_t *dest, page_t *src, word sx, word sy, word dx, word dy, word width, word height);\r
815         //modexCopyPageRegion(pip[3].page, pip[!(pip->video->p)].page, x-4, y-4, 0, 128, 28, 36);\r
816         /*modexCopyPageRegion(pip[pip->video->p].page,\r
817  pip[!(pip->video->p)].page, x-4, y-4, x-4, y-4, 28, 36);*/\r
818 //      else modexCopyPageRegion(pip[1].page, pip[0].page, x-4, y-4, x-4, y-4, 28, 40);\r
819         switch(ls)\r
820         {\r
821                 case 1:\r
822                         FRAME1\r
823                 break;\r
824                 case 2:\r
825                         FRAME2\r
826                 break;\r
827                 case 3:\r
828                         FRAME3\r
829                 break;\r
830                 case 4:\r
831                         FRAME4\r
832                 break;\r
833         }\r
834 //      if(2>ls && ls>=1) { FRAME1 }else\r
835 //      if(3>ls && ls>=2) { FRAME2 }else\r
836 //      if(4>ls && ls>=3) { FRAME3 }else\r
837 //      if(5>ls && ls>=4) { FRAME4 }\r
838         //modexCopyPageRegion(pip[0].page, pip[3].page, 0, 0, x, y, 24, 32);\r
839         //printf("x=%d  y=%d    bx=%d           by=%d\n", x, y, bx, by);\r
840         pip->video->r=1;\r
841 }\r
842 \r
843 void near ZC_animatePlayer(map_view_t *pip, player_t *player, word pn, sword scrollswitch)\r
844 {\r
845         sword x = player[pn].enti.x;\r
846         sword y = player[pn].enti.y;\r
847         sword qq,dd; //scroll offset\r
848         player[pn].enti.dire=10; //direction\r
849 \r
850         switch(scrollswitch)\r
851         {\r
852                 case 0:\r
853                         dd = 0;\r
854                         qq = 0;\r
855                 break;\r
856                 case 1:\r
857                         dd = 1;\r
858                         qq = 0;\r
859                 break;\r
860                 case 2:\r
861                         dd = 1;\r
862                         qq = ((player[pn].enti.q)*(player[pn].enti.speed));\r
863                 break;\r
864         }\r
865         x-=4;\r
866         y-=pip[0].map->tiles->tileHeight;\r
867         switch (player[pn].enti.d)\r
868         {\r
869                 case 0:\r
870                         //up\r
871                         player[pn].enti.dire*=player[pn].enti.d+1;\r
872                         y-=qq;\r
873                 break;\r
874                 case 3:\r
875                         // right\r
876                         player[pn].enti.dire*=(player[pn].enti.d-1);\r
877                         x+=qq;\r
878                 break;\r
879                 case 2:\r
880                 break;\r
881                 case 4:\r
882                         //down\r
883                         player[pn].enti.dire*=(player[pn].enti.d-1);\r
884                         y+=qq;\r
885                 break;\r
886                 case 1:\r
887                         //left\r
888                         player[pn].enti.dire*=(player[pn].enti.d+3);\r
889                         x-=qq;\r
890                 break;\r
891         }\r
892         player[pn].enti.dire+=dd;\r
893         if((player[pn].enti.q==1 && player[pn].enti.pred != player[pn].enti.d) || !dd)\r
894         {\r
895                 set_anim_by_id(player[pn].enti.spri, player[pn].enti.dire); //pip->video->sprifilei = set_anim_by_id(player[pn].enti.spri, player[pn].enti.dire);       if(pip->video->sprifilei == -1){ printf("ERROR! %u\n", player[pn].enti.dire); return; }\r
896                 player[pn].enti.pred = player[pn].enti.d;\r
897         }\r
898 \r
899         //setting xy position\r
900         player[pn].enti.spri->x = x;\r
901         player[pn].enti.spri->y = y;\r
902 \r
903         if(pip[0].video->bgps)\r
904                 modexCopyPageRegion(pip[0].page, pip[1].page, x-4, y-4, x-4, y-4, 28, 40);\r
905         //draw sprite\r
906         ZC_drawframe(pip, &player[pn].enti, x, y);\r
907 //0000if(player[pn].enti.q<2) delay(200);\r
908         pip->video->r=1;\r
909 }\r
910 \r
911 /*\r
912  * from zcroll16.c\r
913 */\r
914 \r
915 boolean boundary_check(int x, int y, int dx, int dy, int h, int w)\r
916 {\r
917         return (dx > 0 && (x + dx) < w) || (dx < 0 && (x + dx) >= 0) || (dy > 0 && (y + dy) < h) || (dy < 0 && (y + dy) >= 0) || (dx == dy && dx == 0);\r
918 }\r
919 \r
920 boolean coll_check(int x, int y, int dx, int dy, map_view_t *map_v)\r
921 {\r
922         // Assume everything crosses at most 1 tile at once\r
923         return dx && 1;//crossable_tile(x + dx, map_v) || dy && crossable_tile(y + dy, map_v);\r
924 }\r
925 \r
926 boolean ZC_walk2(entity_t *enti, map_view_t *map_v)\r
927 {\r
928         //return 1;\r
929         int dx = 1;\r
930         int dy = 1;\r
931         switch(enti->d)\r
932         {\r
933                 case 2:\r
934                         return 0;\r
935                 case 1:\r
936                         dx = -dx;\r
937                 case 3:\r
938                         dy = 0;\r
939                         break;\r
940                 case 0:\r
941                         dy = -dy;\r
942                 case 4:\r
943                         dx = 0;\r
944                         break;\r
945         }\r
946         if(coll_check(enti->x, enti->y, dx, dy,  map_v))\r
947         {\r
948                 // Allow movement\r
949                 // Set speed\r
950                 // Start animation\r
951                 // Mark next tile as occupied\r
952                 // Mark this tile as vacant\r
953                 return 1;\r
954         }\r
955         return 0;\r
956 }\r
957 \r
958 void player_walk(player_t *player, map_view_t *map_v){\r
959         int dx=16, dy=16;\r
960         if(ZC_walk2(&(player->enti), map_v) && boundary_check(map_v->tx, map_v->ty, dx, dy, map_v->map->width - 2*map_v->page->ti.tilesw, map_v->map->height - 2*map_v->page->ti.tilesh))\r
961         {\r
962                 mapScroll(map_v, player);\r
963                 // (Un)load stuff?\r
964         }\r
965 }\r
966 \r
967 void mapScroll(map_view_t *mv, player_t *player)\r
968 {\r
969         //word x, y;  /* coordinate for drawing */\r
970         int c = 1;\r
971         int delta;\r
972         mv->delta += player->dx | player->dy;\r
973         delta = mv->delta;\r
974         mv->d = (player->dx) ? (player->dx > 0) ? 3 : 1 : (player->dy) ? (player->dy > 0) ? 4 : 0 : 2;\r
975         switch(mv->d){\r
976                 case 4:\r
977                         c = -1;\r
978                         delta = -delta;\r
979                 case 0:\r
980                         if(!(delta + mv->dxThresh))\r
981                         {\r
982                                 mv->delta = 0;\r
983                                 mv->ty += c;\r
984                         }\r
985                         break;\r
986                 case 3:\r
987                         c = -1;\r
988                         delta = -delta;\r
989                 case 1:\r
990                         if(!(delta + mv->dyThresh))\r
991                         {\r
992                                 mv->delta = 0;\r
993                                 mv->tx += c;\r
994                         }\r
995                         break;\r
996                 default:\r
997                         break;\r
998         }\r
999 \r
1000         mv->video->r=1;\r
1001 }\r