OSDN Git Service

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