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