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