]> 4ch.mooo.com Git - 16.git/blob - src/lib/scroll16.c
p16 is being worked on a bunch by me wwww [16_ca needs huge amounts of work and I...
[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 #if 0\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 #endif\r
330 void\r
331 initMap(map_t *map) {\r
332         /* just a place holder to fill out an alternating pattern */\r
333         int x, y;\r
334         int i;\r
335         int tile = 1;\r
336         dbg_maptext=1;\r
337         map->tiles = malloc(sizeof(tiles_t));\r
338 \r
339         /* create the tile set */\r
340         map->tiles->spri = malloc(sizeof(sprite_t));\r
341         map->tiles->spri->sprite_vrl_cont.vrl_header->width = (TILEWH*2);\r
342         map->tiles->spri->sprite_vrl_cont.vrl_header->height= TILEWH;\r
343         map->tiles->spri->sprite_vrl_cont.buffer = malloc((TILEWH*2)*TILEWH);\r
344         map->tiles->tileHeight = TILEWH;\r
345         map->tiles->tileWidth =TILEWH;\r
346         map->tiles->rows = 1;\r
347         map->tiles->cols = 2;\r
348 \r
349         i=0;\r
350         for(y=0; y<TILEWH; y++) {\r
351         for(x=0; x<(TILEWH*2); x++) {\r
352                 if(x<TILEWH)\r
353                         map->tiles->spri->sprite_vrl_cont.buffer[i] = 2;//0x24;\r
354                 else\r
355                         map->tiles->spri->sprite_vrl_cont.buffer[i] = 1;//0x34;\r
356                 i++;\r
357         }\r
358         }\r
359 \r
360         i=0;\r
361         for(y=0; y<map->height; y++) {\r
362                 for(x=0; x<map->width; x++) {\r
363                         map->layerdata[0].data[i] = tile;\r
364                         tile = tile ? 1 : 2;\r
365                         i++;\r
366                 }\r
367                 tile = tile ? 1 : 2;\r
368         }\r
369 }\r
370 \r
371 //===========================================================================//\r
372 \r
373 \r
374 void near mapScrollRight(map_view_t *mv, player_t *player, word id, word plid)\r
375 {\r
376         word x;//, y;  /* coordinate for drawing */\r
377 \r
378         ScrollRight(mv, player, id, plid);\r
379 \r
380         /* draw the next column */\r
381         x= mv[0].page->sw + mv[0].map->tiles->tileWidth;\r
382         if(ZC_mapEdgeChk(mv, player[plid].enti.d, 0))\r
383 #ifndef FULLRCREND\r
384         if(player[plid].enti.q%4)\r
385 #else\r
386         if(player[plid].enti.q==4)\r
387 #endif\r
388 //              if(id==0)\r
389                         mapDrawCol(&mv[id], mv[0].tx + mv[0].page->ti.tw, mv[0].ty-1, x, player, DRAWCOLNUM);\r
390 //              else\r
391 //                      if(mv[0].video->vga_state.bgps)\r
392 //                              modexCopyPageRegion(mv->page, mv[0].page, x, 0, x, 0, mv[0].map->tiles->tileWidth, mv[0].page->height);\r
393         //mv[0].video->dorender=1;//ScrollRight\r
394 }\r
395 \r
396 \r
397 void near mapScrollLeft(map_view_t *mv, player_t *player, word id, word plid)\r
398 {\r
399         word x;//,y;  /* coordinate for drawing */\r
400 \r
401         ScrollLeft(mv, player, id, plid);\r
402 \r
403         /* draw the next column */\r
404         x= 0;\r
405         if(ZC_mapEdgeChk(mv, player[plid].enti.d, 0))\r
406 #ifndef FULLRCREND\r
407         if(player[plid].enti.q%4)\r
408 #else\r
409         if(player[plid].enti.q==4)\r
410 #endif\r
411 //              if(id==0)\r
412                         mapDrawCol(&mv[id], mv[0].tx - 1, mv[0].ty-1, x, player, DRAWCOLNUM);\r
413 //              else\r
414 //                      if(mv[0].video->vga_state.bgps)\r
415 //                              modexCopyPageRegion(mv->page, mv[0].page, x, 0, x, 0, mv[0].map->tiles->tileWidth, mv[0].page->height);\r
416         //mv[0].video->dorender=1;//ScrollLeft\r
417 }\r
418 \r
419 \r
420 void near mapScrollUp(map_view_t *mv, player_t *player, word id, word plid)\r
421 {\r
422         word y;//x,  /* coordinate for drawing */\r
423 \r
424         ScrollUp(mv, player, id, plid);\r
425 \r
426         /* draw the next row */\r
427         y= 0;\r
428         if(ZC_mapEdgeChk(mv, player[plid].enti.d, 0))\r
429 #ifndef FULLRCREND\r
430         if(player[plid].enti.q%3)\r
431 #else\r
432         if(player[plid].enti.q==4)\r
433 #endif\r
434 //              if(id==0)\r
435                         mapDrawRow(&mv[id], mv[0].tx - 1, mv[0].ty-1, y, player, DRAWROWNUM);\r
436 //              else\r
437 //                      if(mv[0].video->vga_state.bgps)\r
438 //                              modexCopyPageRegion(mv->page, mv[0].page, 0, y, 0, y, mv[0].page->width, mv[0].map->tiles->tileHeight);\r
439         //mv[0].video->dorender=1;//ScrollUp\r
440 }\r
441 \r
442 \r
443 void near mapScrollDown(map_view_t *mv, player_t *player, word id, word plid)\r
444 {\r
445         word y;//x,  /* coordinate for drawing */\r
446 \r
447         ScrollDown(mv, player, id, plid);\r
448 \r
449         /* draw the next row */\r
450         y= mv[0].page->sh + mv[0].map->tiles->tileHeight;\r
451         if(ZC_mapEdgeChk(mv, player[plid].enti.d, 0))\r
452 #ifndef FULLRCREND\r
453         if(player[plid].enti.q%3)\r
454 #else\r
455         if(player[plid].enti.q==4)\r
456 #endif\r
457 //              if(id==0)\r
458                         mapDrawRow(&mv[id], mv[0].tx - 1, mv[0].ty+mv[0].page->ti.th, y, player, DRAWROWNUM);\r
459 //              else\r
460 //                      if(mv[0].video->vga_state.bgps)\r
461 //                              modexCopyPageRegion(mv->page, mv[0].page, 0, y, 0, y, mv[0].page->width, mv[0].map->tiles->tileHeight);\r
462         //mv[0].video->dorender=1;//ScrollDown\r
463 }\r
464 \r
465 void ZC_mapScroll(map_view_t *mv, player_t *player, word pn)\r
466 {\r
467         word b = mv[0].video->vga_state.bgps;\r
468         switch(player[pn].enti.d)\r
469         {\r
470                 case 2://none\r
471                 break;\r
472                 case 3://right\r
473                                 ScrollRight(mv, player, 3, pn);\r
474                                 ScrollRight(mv, player, 2, pn);\r
475                                 mapScrollRight(mv, player, (0), pn);\r
476                         if(b)   mapScrollRight(mv, player, (1), pn);\r
477                 break;\r
478                 case 1://left\r
479                                 ScrollLeft(mv, player, 3, pn);\r
480                                 ScrollLeft(mv, player, 2, pn);\r
481                                 mapScrollLeft(mv, player, (0), pn);\r
482                         if(b)   mapScrollLeft(mv, player, (1), pn);\r
483                 break;\r
484                 case 4://down\r
485                                 ScrollDown(mv, player, 3, pn);\r
486                                 ScrollDown(mv, player, 2, pn);\r
487                                 mapScrollDown(mv, player, (0), pn);\r
488                         if(b)   mapScrollDown(mv, player, (1), pn);\r
489                 break;\r
490                 case 0://up\r
491                                 ScrollUp(mv, player, 3, pn);\r
492                                 ScrollUp(mv, player, 2, pn);\r
493                                 mapScrollUp(mv, player, (0), pn);\r
494                         if(b)   mapScrollUp(mv, player, (1), pn);\r
495                 break;\r
496         }\r
497         //mv[0].video->dorender=1;//ZC_mapScroll\r
498 }\r
499 \r
500 //===========================================================================\r
501 //TODO: put player in starting position of assigned spot on map\r
502 //default player position on the viewable map\r
503 void ZC_PlayerXYpos(int x, int y, player_t *player, map_view_t *pip, nibble pn, boolean defaultsw)\r
504 {\r
505         player[pn].enti.tx = x + pip[0].tx;\r
506         player[pn].enti.ty = y + pip[0].ty;\r
507 \r
508         switch(defaultsw)\r
509         {\r
510                 case 1:\r
511                         player[pn].enti.tx += pip[0].page->ti.tilemidposscreenx;\r
512                         player[pn].enti.ty += pip[0].page->ti.tilemidposscreeny;\r
513                 break;\r
514                 case 0:\r
515                 break;\r
516         }\r
517 }\r
518 //===========================================================================\r
519 \r
520 sword chkmap(map_t *map, word q)\r
521 {\r
522 //      bitmap_t bp;\r
523         static byte x[(MAPW*MAPH)+1] =\r
524 { 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
525 /*1,    2,      3,      4,      0,      3,      3,      3,      3,      3,      3,      3,      3,      4,      1,      1,      1,      1,      1,      1,      \\r
526 5,      6,      7,      8,      0,      1,      0,      1,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
527 9,      10,     11,     12,     4,      1,      0,      1,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
528 13,     14,     15,     16,     0,      1,      1,      1,      5,      8,      1,      11,     11,     1,      1,      1,      1,      1,      1,      1,      \\r
529 0,      0,      4,      0,      0,      0,      0,      0,      8,      8,      1,      11,     11,     3,      1,      1,      1,      1,      1,      1,      \\r
530 1,      1,      1,      1,      0,      0,      0,      0,      8,      8,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
531 1,      1,      1,      1,      0,      0,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
532 1,      1,      1,      1,      0,      0,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
533 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
534 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
535 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
536 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
537 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
538 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
539 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      3,      3,      3,      1,      2,      3,      4 };*/\r
540         //check for failed to load map\r
541         if((map->width == map->height == 0) && (q>0))\r
542         {\r
543                 //initiate a null map!\r
544                 map->width=MAPW;///2;\r
545                 map->height=MAPH;///2;\r
546 //              map->layerdata[0].data = fmfaflflfofcf(((map->width*map->height)+1)*sizeof(byte));\r
547                 map->layerdata[0].data = &x;\r
548                 //map->tiles = fmfafflflfofc(sizeof(tiles_t));\r
549                 //fix this to be far~\r
550 //              bp = bitmapLoadPcx("data/ed.pcx");\r
551 //              map->tiles->data = &bp;\r
552                 map->tiles->tileHeight = 16;\r
553                 map->tiles->tileWidth = 16;\r
554                 map->tiles->rows = 1;\r
555                 map->tiles->cols = 1;\r
556 #ifdef __DEBUG_MAP__\r
557                 dbg_maptext = true;\r
558 #endif\r
559         }\r
560 #ifdef __DEBUG_MAP__\r
561         else\r
562         {\r
563                 dbg_maptext = false;\r
564         }\r
565 #endif\r
566         return 0;\r
567 }\r
568 \r
569 //TODO: player position here\r
570 void mapGoTo(map_view_t *mv, int tx, int ty)\r
571 {\r
572         ZC_mapinitMV(mv, tx, ty);\r
573 \r
574         /* draw the tiles */\r
575         modexClearRegion(mv[0].page, 0, 0, mv[0].page->width, mv[0].page->height, 0);\r
576         ZC_mapredraw(mv, tx, ty);\r
577 \r
578         //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
579 }\r
580 \r
581 void ZC_mapinitMV(map_view_t *mv, int tx, int ty)\r
582 {\r
583         /* set up the coordinates */\r
584         mv[0].tx = mv[1].tx = tx;\r
585         mv[0].ty = mv[1].ty = ty;\r
586         mv[0].page->dx = mv[1].page->dx = mv[2].page->dx = mv[3].page->dx = mv->map->tiles->tileWidth;\r
587         mv[0].page->dy = mv[1].page->dy = mv[2].page->dy = mv[3].page->dy = mv->map->tiles->tileHeight;\r
588 \r
589         /* set up the thresholds */\r
590         mv[0].dxThresh = mv[1].dxThresh = mv[2].dxThresh = mv[3].dxThresh = mv->map->tiles->tileWidth * 2;\r
591         mv[0].dyThresh = mv[1].dyThresh = mv[2].dyThresh = mv[3].dyThresh = mv->map->tiles->tileHeight * 2;\r
592 }\r
593 \r
594 void ZC_mapredraw(map_view_t *mv, int tx, int ty)\r
595 {\r
596         int py;//px,\r
597         unsigned int i;\r
598 \r
599         py=0;\r
600         i=mv[0].ty * mv[0].map->width + mv[0].tx;\r
601         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
602                 mapDrawWRow(&mv[0], tx-1, ty, py);\r
603                 mapDrawWRow(&mv[1], tx-1, ty, py);\r
604                 i+=mv->map->width - tx;\r
605         }\r
606 }\r
607 \r
608 void near\r
609 mapDrawTile(tiles_t *t, word i, page_t *page, word x, word y)\r
610 {\r
611         word rx, ry;\r
612 //      printf("%02d ", i); if(x >= page->width - t->tileWidth) printf("\n");\r
613         switch(i)\r
614         {\r
615                 case 0:\r
616                         //wwww\r
617                         modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, 1); //currently the over scan color!\r
618                 break;\r
619                 default:\r
620                         rx = (((i-1) % ((t->spri->sprite_vrl_cont.vrl_header->width)/t->tileWidth)) * t->tileWidth);\r
621                         ry = (((i-1) / ((t->spri->sprite_vrl_cont.vrl_header->height)/t->tileHeight)) * t->tileHeight);\r
622 #ifndef TILERENDER\r
623 #ifdef __DEBUG_RF__\r
624                         if(!dbg_pagenorendermap)\r
625 #endif\r
626                                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, i+1);\r
627 #else\r
628                         modexDrawBmpRegion              (page, x, y, rx, ry, t->tileWidth, t->tileHeight, i);\r
629                         //draw_vrl1_vgax_modex(x-rx,y-ry,vrl_header,vrl_lineoffs,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));\r
630                         //modexDrawBmpRegion    (page, x, y, rx, ry, t->tileWidth, t->tileHeight, (t->data));\r
631 #endif\r
632 #ifdef __DEBUG_MAP__\r
633                         if(dbg_maptext){ sprintf(global_temp_status_text2, "%u", i); modexprint(page, x, y, 1, 0, 1, 2, 1, global_temp_status_text2); }\r
634 #endif\r
635                 break;\r
636         }\r
637 }\r
638 #define PALMAPDRAWW 13\r
639 void near mapDrawRow(map_view_t *mv, int tx, int ty, word y, player_t *player, word poopoffset)\r
640 {\r
641         int i; nibble z;\r
642 #ifdef __DEBUG_RF__\r
643 if(dbg_pagedelayrendermap)              if(!y)  y+=TILEWH;      else    y-=TILEWH;\r
644 #endif\r
645         poopoffset%=player[0].enti.speed;\r
646 //printf("y: %d\n", poopoffset);\r
647 #ifdef __DEBUG_RF__\r
648 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, 1, global_temp_status_text); }\r
649 #endif\r
650         /* the position within the map array */\r
651         i=ty * mv->map->width + tx;\r
652         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
653                 if(i>=0){\r
654                         mapDrawTile(mv->map->tiles, mv->map->layerdata[0].data[i], mv->page, mv->dx, y);\r
655                         for(z=1;z<=2;z++)\r
656                                 if(mv->map->layerdata[z].data[i]){\r
657                                         sprintf(global_temp_status_text2, "%u", mv->map->layerdata[z].data[i]); modexprint(mv->page, mv->dx, y, 1, 0, PALMAPDRAWW, z+2, 1, global_temp_status_text2);\r
658                                         //mapDrawTile(mv->map->tiles, mv->map->layerdata[z].data[i], mv->page, mv->dx, y);\r
659                                 }\r
660                 }\r
661                 i++; /* next! */\r
662         }\r
663 #ifdef __DEBUG_RF__\r
664 if(dbg_pagedelayrendermap) delay(200);\r
665 #endif\r
666 }\r
667 \r
668 void near mapDrawCol(map_view_t *mv, int tx, int ty, word x, player_t *player, word poopoffset)\r
669 {\r
670         int i; nibble z;\r
671 #ifdef __DEBUG_RF__\r
672 if(dbg_pagedelayrendermap)              if(!x)  x+=TILEWH;              else    x-=TILEWH;\r
673 #endif\r
674         poopoffset%=player[0].enti.speed;\r
675 //printf("x: %d\n", poopoffset);\r
676 #ifdef __DEBUG_RF__\r
677 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
678 #endif\r
679         /* location in the map array */\r
680         i=ty * mv->map->width + tx;\r
681         /* We'll copy all of the columns in the screen,\r
682            i + 1 row above and one below */\r
683         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
684                 if(i>=0){\r
685                         mapDrawTile(mv->map->tiles, mv->map->layerdata[0].data[i], mv->page, x, mv->dy);\r
686                         for(z=1;z<=2;z++)\r
687                                 if(mv->map->layerdata[z].data[i]){\r
688                                         sprintf(global_temp_status_text2, "%u", mv->map->layerdata[z].data[i]); modexprint(mv->page, x, mv->dy, 1, 0, PALMAPDRAWW, z+2, 1, global_temp_status_text2);\r
689                                         //mapDrawTile(mv->map->tiles, mv->map->layerdata[z].data[i], mv->page, x, mv->dy);\r
690                                 }\r
691                 }\r
692                 i += mv->map->width;\r
693         }\r
694 #ifdef __DEBUG_RF__\r
695 if(dbg_pagedelayrendermap) delay(200);\r
696 #endif\r
697 }\r
698 \r
699 void mapDrawWRow(map_view_t *mv, int tx, int ty, word y)\r
700 {\r
701         int i; nibble z;\r
702 \r
703         /* the position within the map array */\r
704         i=ty * mv->map->width + tx;\r
705         for(mv->dx=0; mv->dx<mv->page->sw+mv->dxThresh && tx < mv->map->width; mv->dx+=mv->map->tiles->tileWidth, tx++) {\r
706                 if(i>=0){       /* we are in the map, so copy! */\r
707                         mapDrawTile(mv->map->tiles, mv->map->layerdata[0].data[i], mv->page, mv->dx, y);\r
708                         for(z=1;z<=2;z++)\r
709                                 if(mv->map->layerdata[z].data[i]){\r
710                                         sprintf(global_temp_status_text2, "%u", mv->map->layerdata[z].data[i]); modexprint(mv->page, mv->dx, y, 1, 0, PALMAPDRAWW, z+2, 1, global_temp_status_text2);\r
711                                         //mapDrawTile(mv->map->tiles, mv->map->layerdata[z].data[i], mv->page, mv->dx, y);\r
712                                 }\r
713                 }\r
714                 i++; /* next! */\r
715         }\r
716 }\r
717 \r
718 void mapDrawWCol(map_view_t *mv, int tx, int ty, word x)\r
719 {\r
720         int i; nibble z;\r
721 \r
722         /* location in the map array */\r
723         i=ty * mv->map->width + tx;\r
724 \r
725         /* We'll copy all of the columns in the screen,\r
726            i + 1 row above and one below */\r
727         for(mv->dy=0; mv->dy<mv->page->sh+mv->dyThresh && ty < mv->map->height; mv->dy+=mv->map->tiles->tileHeight, ty++) {\r
728                 if(i>=0){       /* we are in the map, so copy away! */\r
729                         mapDrawTile(mv->map->tiles, mv->map->layerdata[0].data[i], mv->page, x, mv->dy);\r
730                         for(z=1;z<=2;z++)\r
731                                 if(mv->map->layerdata[z].data[i]){\r
732                                         sprintf(global_temp_status_text2, "%u", mv->map->layerdata[z].data[i]); modexprint(mv->page, x, mv->dy, 1, 0, PALMAPDRAWW, z+2, 1, global_temp_status_text2);\r
733                                         //mapDrawTile(mv->map->tiles, mv->map->layerdata[z].data[i], mv->page, x, mv->dy);\r
734                                 }\r
735                 }\r
736                 i += mv->map->width;\r
737         }\r
738 }\r
739 \r
740 \r
741 /*      sync    */\r
742 void shinku(global_game_variables_t *gv)\r
743 {\r
744         word x = gv->video.page[/*!*/(gv->video.p)].dx; //(gv->video.page[(gv->video.p)].tlx) - // follow the screen\r
745         word y = gv->video.page[/*!*/(gv->video.p)].dy; //(gv->video.page[(gv->video.p)].tly) - // follow the screen\r
746         word col = 2, bgcol = 1, type = 1;//w = 64, h = 8,\r
747         if(elapsed_timer(gv) >= (1.0 / gv->kurokku.frames_per_second))\r
748         {\r
749         // NTS: For some bizarre reason, gv->pee is not initialized, but the pointer is not NULL even\r
750         //      though it should be. Instead it's NULL as a neAr pointer but contains a non-null\r
751         //      segment value, so testing against NULL doesn't work. It is initialized properly if\r
752         //      you call start_timer() though which uses neAr mAlloc. Rather than fight with that,\r
753         //      I decided it would be better to declare a temp buffer statically and sprintf to that.\r
754         //\r
755         //      This fixes *** Null pointer assignment detected error message in ZCROLL.EXE on exit.\r
756                 sprintf(global_temp_status_text, "%.0f fps", (double)gv->kurokku.tiku/ticktock(gv));\r
757                 //modexprint(&(gv->video.page[/*!*/(gv->video.p)]), x, y, type, 1, col, bgcol, global_temp_status_text);\r
758                 if(gv->kurokku.wcpu)\r
759                 {\r
760                         modexCopyPageRegion(&gv->video.page[0], &gv->video.page[1],\r
761                                 gv->video.page[/*!*/(gv->video.p)].dx,\r
762                                 gv->video.page[/*!*/(gv->video.p)].dy,\r
763                                 gv->video.page[/*!*/(gv->video.p)].dx,\r
764                                 gv->video.page[/*!*/(gv->video.p)].dy,\r
765                                 96, 16);\r
766                         modexprint(&(gv->video.page[/*!*/(gv->video.p)]), x, y, type, 1, col, 1, bgcol, global_temp_status_text);\r
767 //0000printf("dx=%u     dy=%u\n", gv->video.page[/*!*/(gv->video.p)].dx, gv->video.page[/*!*/(gv->video.p)].dy);\r
768                 }\r
769                 gv->kurokku.tiku=0;\r
770         }else //copy dat sheet\r
771         gv->kurokku.tiku++;\r
772 \r
773         switch(gv->kurokku.fpscap)\r
774         {\r
775                 case 0: //turn this off if XT\r
776                         //modexprint(&(gv->video.page[0]), x, y+8, type, 1, col, bgcol, "sanic!");\r
777                         gv->kurokku.frames_per_second=1;\r
778                 break;\r
779                 case 1:\r
780                         //modexWaitBorder();\r
781                         //modexWaitBorder_start();\r
782                         //vga_wait_for_vsync();\r
783                         vga_wait_for_vsync_end();\r
784                         gv->kurokku.frames_per_second=60;\r
785                 break;\r
786         }\r
787         //render!!\r
788         if(gv->video.dorender )\r
789         {//r=1\r
790                 /*if(video->bgp s)\r
791                 {\r
792                         modexCopyPageRegion(&(gv->video.page[ ]), &(gv->video.page[ ]), 0, 0, 0, 0, gv->video.page[ ].width, gv->video.page[ ].height);\r
793                 }else{\r
794                         //modexCopyPageRegion(&video->page[0], &video->page[1], enti->x, enti->y, 0, 0, 24, 32);\r
795                 }*/\r
796                 VL_ShowPage(&(gv->video.page[gv->video.sp]), gv->kurokku.fpscap, 0);\r
797                 gv->video.dorender =!gv->video.dorender;\r
798                 //0000gv->video.tickclk = ((*clockw)-gv->video.startclk)/18.2;\r
799         }\r
800         PM_NextFrame(gv);\r
801 }\r
802 \r
803 void near ZC_animatePlayer(map_view_t *pip, player_t *player, word pn)\r
804 {\r
805         sword x = player[pn].enti.x;\r
806         sword y = player[pn].enti.y;\r
807         sword qq,dd; //scroll offset\r
808         player[pn].enti.dire=10; //direction\r
809 \r
810         switch(player[pn].walktype)\r
811         {\r
812                 case 0:\r
813                         dd = 0;\r
814                         qq = 0;\r
815                 break;\r
816                 case 1:\r
817                         dd = 1;\r
818                         qq = 0;\r
819                 break;\r
820                 case 2:\r
821                         dd = 1;\r
822                         qq = player[pn].enti.q*player[pn].enti.speed;\r
823                 break;\r
824         }\r
825         x-=4;\r
826         y-=pip[0].map->tiles->tileHeight;\r
827         switch (player[pn].enti.d)\r
828         {\r
829                 case 0:\r
830                         //up\r
831                         player[pn].enti.dire*=player[pn].enti.d+1;\r
832                         y-=qq;\r
833                 break;\r
834                 case 3:\r
835                         // right\r
836                         player[pn].enti.dire*=(player[pn].enti.d-1);\r
837                         x+=qq;\r
838                 break;\r
839                 case 2:\r
840                 break;\r
841                 case 4:\r
842                         //down\r
843                         player[pn].enti.dire*=(player[pn].enti.d-1);\r
844                         y+=qq;\r
845                 break;\r
846                 case 1:\r
847                         //left\r
848                         player[pn].enti.dire*=(player[pn].enti.d+3);\r
849                         x-=qq;\r
850                 break;\r
851         }\r
852         player[pn].enti.dire+=dd;\r
853         //setting xy position\r
854         player[pn].enti.spri.x = x;\r
855         player[pn].enti.spri.y = y;\r
856 \r
857         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
858         {\r
859                 //0000printf("  q=%u    pred=%u d=%u    dd=%u\n", player[pn].enti.q, player[pn].enti.pred, player[pn].enti.d, dd);\r
860                 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
861                 player[pn].enti.pred = player[pn].enti.d;\r
862                 if(!dd)//changed direction while NOT moving!\r
863                 {\r
864                         modexCopyPageRegion(pip[0].page, pip[1].page, x-4, y-4, x-4, y-4, 28, 40);\r
865                         animate_spri(&player[pn].enti, pip[0].video);\r
866                 }\r
867         }\r
868 \r
869         if(pip[0].video->vga_state.bgps && dd)//if moving wwww\r
870         {\r
871                 modexCopyPageRegion(pip[0].page, pip[1].page, x-4, y-4, x-4, y-4, 28, 40);\r
872 \r
873                 //draw sprite\r
874                 animate_spri(&player[pn].enti, pip[0].video);\r
875         }\r
876 //0000if(player[pn].enti.q<4) delay(200);\r
877 }\r
878 \r
879 /*\r
880  * from zcroll16.c\r
881 */\r
882 \r
883 boolean boundary_check(int x, int y, int dx, int dy, int h, int w)\r
884 {\r
885         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
886 }\r
887 \r
888 boolean coll_check(int x, int y, int dx, int dy, map_view_t *map_v)\r
889 {\r
890         // Assume everything crosses at most 1 tile at once\r
891         return dx && 1;//crossable_tile(x + dx, map_v) || dy && crossable_tile(y + dy, map_v);\r
892 }\r
893 \r
894 boolean ZC_walk2(entity_t *enti, map_view_t *map_v)\r
895 {\r
896         //return 1;\r
897         int dx = 1;\r
898         int dy = 1;\r
899         switch(enti->d)\r
900         {\r
901                 case 2:\r
902                         return 0;\r
903                 case 1:\r
904                         dx = -dx;\r
905                 case 3:\r
906                         dy = 0;\r
907                         break;\r
908                 case 0:\r
909                         dy = -dy;\r
910                 case 4:\r
911                         dx = 0;\r
912                         break;\r
913         }\r
914         if(coll_check(enti->x, enti->y, dx, dy,  map_v))\r
915         {\r
916                 // Allow movement\r
917                 // Set speed\r
918                 // Start animation\r
919                 // Mark next tile as occupied\r
920                 // Mark this tile as vacant\r
921                 return 1;\r
922         }\r
923         return 0;\r
924 }\r
925 \r
926 void player_walk(player_t *player, map_view_t *map_v){\r
927         int dx=16, dy=16;\r
928         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
929         {\r
930                 mapScroll(map_v, player);\r
931                 // (Un)load stuff?\r
932         }\r
933 }\r
934 \r
935 /*\r
936  *      end\r
937  */\r
938 \r
939 void mapScroll(map_view_t *mv, player_t *player)\r
940 {\r
941         //word x, y;  /* coordinate for drawing */\r
942         int c = 1;\r
943         int delta;\r
944         mv->delta += player->dx | player->dy;\r
945         delta = mv->delta;\r
946         mv->d = (player->dx) ? (player->dx > 0) ? 3 : 1 : (player->dy) ? (player->dy > 0) ? 4 : 0 : 2;\r
947         switch(mv->d){\r
948                 case 4:\r
949                         c = -1;\r
950                         delta = -delta;\r
951                 case 0:\r
952                         if(!(delta + mv->dxThresh))\r
953                         {\r
954                                 mv->delta = 0;\r
955                                 mv->ty += c;\r
956                         }\r
957                         break;\r
958                 case 3:\r
959                         c = -1;\r
960                         delta = -delta;\r
961                 case 1:\r
962                         if(!(delta + mv->dyThresh))\r
963                         {\r
964                                 mv->delta = 0;\r
965                                 mv->tx += c;\r
966                         }\r
967                         break;\r
968                 default:\r
969                         break;\r
970         }\r
971 }\r