]> 4ch.mooo.com Git - 16.git/blob - src/lib/scroll16.c
did a bunch of work on map stuff going to add fg layer sometime woon
[16.git] / src / lib / scroll16.c
1 /* Project 16 Source Code~\r
2  * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
3  *\r
4  * This file is part of Project 16.\r
5  *\r
6  * Project 16 is free software; you can redistribute it and/or modify\r
7  * it under the terms of the GNU General Public License as published by\r
8  * the Free Software Foundation; either version 3 of the License, or\r
9  * (at your option) any later version.\r
10  *\r
11  * Project 16 is distributed in the hope that it will be useful,\r
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14  * GNU General Public License for more details.\r
15  *\r
16  * You should have received a copy of the GNU General Public License\r
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>, or\r
18  * write to the Free Software Foundation, Inc., 51 Franklin Street,\r
19  * Fifth Floor, Boston, MA 02110-1301 USA.\r
20  *\r
21  */\r
22 /*\r
23         scroll16 library~\r
24 */\r
25 #include "src/lib/scroll16.h"\r
26 \r
27 //#define INC_PER_FRAME if(player[pn].enti.q&1) player[pn].enti.persist_aniframe++; if(player[pn].enti.persist_aniframe>4) player[pn].enti.persist_aniframe = 1;\r
28 \r
29 void ZC_walk(map_view_t *pip, player_t *player, word pn)\r
30 {\r
31         switch(player[pn].enti.d)\r
32         {\r
33                 //no direction\r
34                 case 2:\r
35                         //0000pip[0].video->startclk = (*clockw);\r
36                 break;\r
37                 //right movement\r
38                 case 3:\r
39                         if(pip[0].tx >= 0 && pip[0].tx+pip[0].page->ti.tw < pip[0].map->width && player[pn].enti.tx == pip[0].tx+pip[0].page->ti.tilemidposscreenx &&\r
40                         !(pip[0].map->data[(player[pn].enti.tx)+(pip[0].map->width*(player[pn].enti.ty-1))] == 0))//!(player[pn].enti.tx+1 == TRIGGX && player[pn].enti.ty == TRIGGY))  //collision detection!\r
41                         {\r
42                                 player[pn].walktype=2;\r
43                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
44                                 {\r
45                                         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->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(pip[0].tx > 0 && pip[0].tx+pip[0].page->ti.tw <= pip[0].map->width && player[pn].enti.tx == pip[0].tx+pip[0].page->ti.tilemidposscreenx &&\r
73                         !(pip[0].map->data[(player[pn].enti.tx-2)+(pip[0].map->width*(player[pn].enti.ty-1))] == 0))//!(player[pn].enti.tx-1 == TRIGGX && player[pn].enti.ty == TRIGGY))        //collision detection!\r
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->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(pip[0].ty >= 0 && pip[0].ty+pip[0].page->ti.th < pip[0].map->height && player[pn].enti.ty == pip[0].ty+pip[0].page->ti.tilemidposscreeny &&\r
106                         !(pip[0].map->data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty))] == 0))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty+1 == TRIGGY))  //collision detection!\r
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->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(pip[0].ty > 0 && pip[0].ty+pip[0].page->ti.th <= pip[0].map->height && player[pn].enti.ty == pip[0].ty+pip[0].page->ti.tilemidposscreeny &&\r
139                         !(pip[0].map->data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty-2))] == 0))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty-1 == TRIGGY))        //collision detection!\r
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->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(pip[0].tx >= 0 && pip[0].tx+pip[0].page->ti.tw < pip[0].page->ti.tilesw)\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(pip[0].tx > 0 && pip[0].tx+pip[0].page->ti.tw <= pip[0].page->ti.tilesw)\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(pip[0].ty >= 0 && pip[0].ty+pip[0].page->ti.th < pip[0].page->ti.tilesh)\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(pip[0].ty > 0 && pip[0].ty+pip[0].page->ti.th <= pip[0].page->ti.tilesh)\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->data[i]=255;\r
322 //                      printf("[%d]", map->data[i]);\r
323                         tile = tile ? 0 : 1;\r
324                         i++;\r
325                 }\r
326                 tile = tile ? 0 : 1;\r
327         }\r
328 }\r
329 \r
330 //===========================================================================//\r
331 \r
332 \r
333 void near mapScrollRight(map_view_t *mv, player_t *player, word id, word plid)\r
334 {\r
335         word x;//, y;  /* coordinate for drawing */\r
336 \r
337         ScrollRight(mv, player, id, plid);\r
338 \r
339         /* draw the next column */\r
340         x= mv[0].page->sw + mv[0].map->layertile[0]->tileWidth;\r
341 #ifndef FULLRCREND\r
342         if(player[plid].enti.q%4)\r
343 #else\r
344         if(player[plid].enti.q==4)\r
345 #endif\r
346 //              if(id==0)\r
347                         mapDrawCol(&mv[id], mv[0].tx + mv[0].page->ti.tw, mv[0].ty-1, x, player, DRAWCOLNUM);\r
348 //              else\r
349 //                      if(mv[0].video->bgps)\r
350 //                              modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[0].map->layertile[0]->tileWidth, mv[0].page->height);\r
351         //mv[0].video->dorender=1;//ScrollRight\r
352 }\r
353 \r
354 \r
355 void near mapScrollLeft(map_view_t *mv, player_t *player, word id, word plid)\r
356 {\r
357         word x;//,y;  /* coordinate for drawing */\r
358 \r
359         ScrollLeft(mv, player, id, plid);\r
360 \r
361         /* draw the next column */\r
362         x= 0;\r
363 #ifndef FULLRCREND\r
364         if(player[plid].enti.q%4)\r
365 #else\r
366         if(player[plid].enti.q==4)\r
367 #endif\r
368 //              if(id==0)\r
369                         mapDrawCol(&mv[id], mv[0].tx - 1, mv[0].ty-1, x, player, DRAWCOLNUM);\r
370 //              else\r
371 //                      if(mv[0].video->bgps)\r
372 //                              modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[0].map->layertile[0]->tileWidth, mv[0].page->height);\r
373         //mv[0].video->dorender=1;//ScrollLeft\r
374 }\r
375 \r
376 \r
377 void near mapScrollUp(map_view_t *mv, player_t *player, word id, word plid)\r
378 {\r
379         word y;//x,  /* coordinate for drawing */\r
380 \r
381         ScrollUp(mv, player, id, plid);\r
382 \r
383         /* draw the next row */\r
384         y= 0;\r
385 #ifndef FULLRCREND\r
386         if(player[plid].enti.q%3)\r
387 #else\r
388         if(player[plid].enti.q==4)\r
389 #endif\r
390 //              if(id==0)\r
391                         mapDrawRow(&mv[id], mv[0].tx - 1, mv[0].ty-1, y, player, DRAWROWNUM);\r
392 //              else\r
393 //                      if(mv[0].video->bgps)\r
394 //                              modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[0].page->width, mv[0].map->layertile[0]->tileHeight);\r
395         //mv[0].video->dorender=1;//ScrollUp\r
396 }\r
397 \r
398 \r
399 void near mapScrollDown(map_view_t *mv, player_t *player, word id, word plid)\r
400 {\r
401         word y;//x,  /* coordinate for drawing */\r
402 \r
403         ScrollDown(mv, player, id, plid);\r
404 \r
405         /* draw the next row */\r
406         y= mv[0].page->sh + mv[0].map->layertile[0]->tileHeight;\r
407 #ifndef FULLRCREND\r
408         if(player[plid].enti.q%3)\r
409 #else\r
410         if(player[plid].enti.q==4)\r
411 #endif\r
412 //              if(id==0)\r
413                         mapDrawRow(&mv[id], mv[0].tx - 1, mv[0].ty+mv[0].page->ti.th, y, player, DRAWROWNUM);\r
414 //              else\r
415 //                      if(mv[0].video->bgps)\r
416 //                              modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[0].page->width, mv[0].map->layertile[0]->tileHeight);\r
417         //mv[0].video->dorender=1;//ScrollDown\r
418 }\r
419 \r
420 void ZC_mapScroll(map_view_t *mv, player_t *player, word pn)\r
421 {\r
422         word b = mv[0].video->bgps;\r
423         switch(player[pn].enti.d)\r
424         {\r
425                 case 2://none\r
426                 break;\r
427                 case 3://right\r
428                                 ScrollRight(mv, player, 3, pn);\r
429                                 ScrollRight(mv, player, 2, pn);\r
430                                 mapScrollRight(mv, player, (0), pn);\r
431                         if(b)   mapScrollRight(mv, player, (1), pn);\r
432                 break;\r
433                 case 1://left\r
434                                 ScrollLeft(mv, player, 3, pn);\r
435                                 ScrollLeft(mv, player, 2, pn);\r
436                                 mapScrollLeft(mv, player, (0), pn);\r
437                         if(b)   mapScrollLeft(mv, player, (1), pn);\r
438                 break;\r
439                 case 4://down\r
440                                 ScrollDown(mv, player, 3, pn);\r
441                                 ScrollDown(mv, player, 2, pn);\r
442                                 mapScrollDown(mv, player, (0), pn);\r
443                         if(b)   mapScrollDown(mv, player, (1), pn);\r
444                 break;\r
445                 case 0://up\r
446                                 ScrollUp(mv, player, 3, pn);\r
447                                 ScrollUp(mv, player, 2, pn);\r
448                                 mapScrollUp(mv, player, (0), pn);\r
449                         if(b)   mapScrollUp(mv, player, (1), pn);\r
450                 break;\r
451         }\r
452         //mv[0].video->dorender=1;//ZC_mapScroll\r
453 }\r
454 \r
455 //===========================================================================\r
456 //TODO: put player in starting position of assigned spot on map\r
457 //default player position on the viewable map\r
458 void ZC_playerXYpos(int x, int y, player_t *player, map_view_t *pip, nibble pn, boolean defaultsw)\r
459 {\r
460         player[pn].enti.tx = x + pip[0].tx;\r
461         player[pn].enti.ty = y + pip[0].ty;\r
462 \r
463         switch(defaultsw)\r
464         {\r
465                 case 1:\r
466                         player[pn].enti.tx += pip[0].page->ti.tilemidposscreenx;\r
467                         player[pn].enti.ty += pip[0].page->ti.tilemidposscreeny;\r
468                 break;\r
469                 case 0:\r
470                 break;\r
471         }\r
472 }\r
473 //===========================================================================\r
474 \r
475 sword chkmap(map_t *map, word q)\r
476 {\r
477 //      bitmap_t bp;\r
478         static byte x[(MAPW*MAPH)+1] =\r
479 { 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
480 /*1,    2,      3,      4,      0,      3,      3,      3,      3,      3,      3,      3,      3,      4,      1,      1,      1,      1,      1,      1,      \\r
481 5,      6,      7,      8,      0,      1,      0,      1,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
482 9,      10,     11,     12,     4,      1,      0,      1,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
483 13,     14,     15,     16,     0,      1,      1,      1,      5,      8,      1,      11,     11,     1,      1,      1,      1,      1,      1,      1,      \\r
484 0,      0,      4,      0,      0,      0,      0,      0,      8,      8,      1,      11,     11,     3,      1,      1,      1,      1,      1,      1,      \\r
485 1,      1,      1,      1,      0,      0,      0,      0,      8,      8,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
486 1,      1,      1,      1,      0,      0,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
487 1,      1,      1,      1,      0,      0,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
488 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
489 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
490 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
491 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
492 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
493 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
494 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      3,      3,      3,      1,      2,      3,      4 };*/\r
495         //check for failed to load map\r
496         if((map->width == map->height == 0) && (q>0))\r
497         {\r
498                 //initiate a null map!\r
499                 map->width=MAPW;///2;\r
500                 map->height=MAPH;///2;\r
501 //              map->data = malloc(((map->width*map->height)+1)*sizeof(byte));\r
502                 map->data = &x;\r
503                 map->layertile[0] = malloc(sizeof(tiles_t));\r
504                 //fix this to be far~\r
505 //              bp = bitmapLoadPcx("data/ed.pcx");\r
506 //              map->layertile[0]->data = &bp;\r
507                 map->layertile[0]->tileHeight = 16;\r
508                 map->layertile[0]->tileWidth = 16;\r
509                 map->layertile[0]->rows = 1;\r
510                 map->layertile[0]->cols = 1;\r
511 #ifdef __DEBUG_MAP__\r
512                 dbg_maptext = true;\r
513 #endif\r
514         }\r
515 #ifdef __DEBUG_MAP__\r
516         else\r
517         {\r
518                 dbg_maptext = false;\r
519         }\r
520 #endif\r
521         return 0;\r
522 }\r
523 \r
524 //TODO: player position here\r
525 void mapGoTo(map_view_t *mv, int tx, int ty)\r
526 {\r
527         ZC_mapinitMV(mv, tx, ty);\r
528 \r
529         /* draw the tiles */\r
530         modexClearRegion(mv[0].page, 0, 0, mv[0].page->width, mv[0].page->height, 0);\r
531         ZC_mapredraw(mv, tx, ty);\r
532 \r
533         //if(mv[0].video->bgps) modexCopyPageRegion(mv[1].page, mv[0].page, 0, 0, 0, 0, mv[0].page->width, mv[0].page->height);\r
534 }\r
535 \r
536 void ZC_mapinitMV(map_view_t *mv, int tx, int ty)\r
537 {\r
538         /* set up the coordinates */\r
539         mv[0].tx = mv[1].tx = tx;\r
540         mv[0].ty = mv[1].ty = ty;\r
541         mv[0].page->dx = mv[1].page->dx = mv[2].page->dx = mv[3].page->dx = mv->map->layertile[0]->tileWidth;\r
542         mv[0].page->dy = mv[1].page->dy = mv[2].page->dy = mv[3].page->dy = mv->map->layertile[0]->tileHeight;\r
543 \r
544         /* set up the thresholds */\r
545         mv[0].dxThresh = mv[1].dxThresh = mv[2].dxThresh = mv[3].dxThresh = mv->map->layertile[0]->tileWidth * 2;\r
546         mv[0].dyThresh = mv[1].dyThresh = mv[2].dyThresh = mv[3].dyThresh = mv->map->layertile[0]->tileHeight * 2;\r
547 }\r
548 \r
549 void ZC_mapredraw(map_view_t *mv, int tx, int ty)\r
550 {\r
551         int py;//px,\r
552         unsigned int i;\r
553 \r
554         py=0;\r
555         i=mv[0].ty * mv[0].map->width + mv[0].tx;\r
556         for(ty=mv[0].ty-1; py < mv[0].page->sh+mv->dyThresh && ty < mv[0].map->height; ty++, py+=mv[0].map->layertile[0]->tileHeight) {\r
557                 mapDrawWRow(&mv[0], tx-1, ty, py);\r
558                 mapDrawWRow(&mv[1], tx-1, ty, py);\r
559                 i+=mv->map->width - tx;\r
560         }\r
561 }\r
562 \r
563 void near\r
564 mapDrawTile(tiles_t *t, word i, page_t *page, word x, word y)\r
565 {\r
566         word rx;\r
567         word ry;\r
568         //word textx=0, texty=0;\r
569         //if(i==0) i=2;\r
570         if(i==0)\r
571         {\r
572                 //wwww\r
573                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, 1); //currently the over scan color!\r
574         }\r
575         else\r
576         {\r
577                 rx = (((i-1) % ((t->data->width)/t->tileWidth)) * t->tileWidth);\r
578                 ry = (((i-1) / ((t->data->height)/t->tileHeight)) * t->tileHeight);\r
579 ////0000printf("i=%d\n", i);\r
580 #ifdef __DEBUG_MAP__\r
581                 switch(dbg_maptext)\r
582                 {\r
583                         case 0:\r
584 #endif\r
585 #ifndef TILERENDER\r
586                                 if(!pagenorendermap) modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, i+1);\r
587 #else\r
588                                 modexDrawBmpRegion              (page, x, y, rx, ry, t->tileWidth, t->tileHeight, i);\r
589                                 /* then the sprite. note modding ram ptr means we just draw to (x&3,0) */\r
590                                 //draw_vrl1_vgax_modex(x-rx,y-ry,vrl_header,vrl_lineoffs,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));\r
591                                 //modexDrawBmpRegion    (page, x, y, rx, ry, t->tileWidth, t->tileHeight, (t->data));\r
592 #endif\r
593 #ifdef __DEBUG_MAP__\r
594                         break;\r
595                         case 1:\r
596                                 if(!pagenorendermap) modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, i);\r
597                                 sprintf(global_temp_status_text2, "%d", i);\r
598                                 modexprint(page, x, y, 1, 1, 2, global_temp_status_text2);\r
599                         break;\r
600                 }\r
601 #endif\r
602         }\r
603 }\r
604 \r
605 void near mapDrawRow(map_view_t *mv, int tx, int ty, word y, player_t *player, word poopoffset)\r
606 {\r
607         int i;\r
608 if(pagedelayrendermap)          if(!y)  y+=TILEWH;      else    y-=TILEWH;\r
609         poopoffset%=player[0].enti.speed;\r
610 //printf("y: %d\n", poopoffset);\r
611 if(pagedelayrendermap){ sprintf(global_temp_status_text, "%-3u", mv->dx); modexprint(mv[0].page, player[0].enti.x, player[0].enti.y-28-(poopoffset*8) , 1, 2, 1, global_temp_status_text); }\r
612         /* the position within the map array */\r
613         i=ty * mv->map->width + tx;\r
614         for(    mv->dx=poopoffset;      mv->dx<(mv->page->sw+mv->dxThresh)/(poopoffset+1) && tx < mv->map->width;       mv->dx+=mv->map->layertile[0]->tileWidth, tx++) {\r
615                 if(i>=0)\r
616                         mapDrawTile(mv->map->layertile[0], mv->map->data[i], mv->page, mv->dx, y);\r
617                 i++; /* next! */\r
618         }\r
619 if(pagedelayrendermap) delay(200);\r
620 }\r
621 \r
622 void near mapDrawCol(map_view_t *mv, int tx, int ty, word x, player_t *player, word poopoffset)\r
623 {\r
624         int i;\r
625 if(pagedelayrendermap)          if(!x)  x+=TILEWH;              else    x-=TILEWH;\r
626         poopoffset%=player[0].enti.speed;\r
627 //printf("x: %d\n", poopoffset);\r
628 if(pagedelayrendermap){ sprintf(global_temp_status_text, "%-3u", mv->dy); modexprint(mv[0].page, player[0].enti.x, player[0].enti.y-28-(poopoffset*8) , 1, 2, 1, global_temp_status_text); }\r
629         /* location in the map array */\r
630         i=ty * mv->map->width + tx;\r
631         /* We'll copy all of the columns in the screen,\r
632            i + 1 row above and one below */\r
633         for(    mv->dy=poopoffset;      mv->dy<(mv->page->sh+mv->dyThresh)/(poopoffset+1) && ty < mv->map->height;      mv->dy+=mv->map->layertile[0]->tileHeight, ty++) {\r
634                 if(i>=0)\r
635                         mapDrawTile(mv->map->layertile[0], mv->map->data[i], mv->page, x, mv->dy);\r
636                 i += mv->map->width;\r
637         }\r
638 if(pagedelayrendermap) delay(200);\r
639 }\r
640 \r
641 void mapDrawWRow(map_view_t *mv, int tx, int ty, word y)\r
642 {\r
643         int i;\r
644 \r
645         /* the position within the map array */\r
646         i=ty * mv->map->width + tx;\r
647         for(mv->dx=0; mv->dx<mv->page->sw+mv->dxThresh && tx < mv->map->width; mv->dx+=mv->map->layertile[0]->tileWidth, tx++) {\r
648                 if(i>=0)        /* we are in the map, so copy! */\r
649                         mapDrawTile(mv->map->layertile[0], mv->map->data[i], mv->page, mv->dx, y);\r
650                 i++; /* next! */\r
651         }\r
652 }\r
653 \r
654 void mapDrawWCol(map_view_t *mv, int tx, int ty, word x)\r
655 {\r
656         int i;\r
657 \r
658         /* location in the map array */\r
659         i=ty * mv->map->width + tx;\r
660 \r
661         /* We'll copy all of the columns in the screen,\r
662            i + 1 row above and one below */\r
663         for(mv->dy=0; mv->dy<mv->page->sh+mv->dyThresh && ty < mv->map->height; mv->dy+=mv->map->layertile[0]->tileHeight, ty++) {\r
664                 if(i>=0)        /* we are in the map, so copy away! */\r
665                         mapDrawTile(mv->map->layertile[0], mv->map->data[i], mv->page, x, mv->dy);\r
666                 i += mv->map->width;\r
667         }\r
668 }\r
669 \r
670 boolean pagenorendermap = 0;\r
671 boolean pagedelayrendermap = 0;\r
672 \r
673 /*      sync    */\r
674 void shinku(global_game_variables_t *gv)\r
675 {\r
676         word x = gv->video.page[/*!*/(gv->video.p)].dx; //(gv->video.page[(gv->video.p)].tlx) - // follow the screen\r
677         word y = gv->video.page[/*!*/(gv->video.p)].dy; //(gv->video.page[(gv->video.p)].tly) - // follow the screen\r
678         word col = 2, bgcol = 1, type = 1;//w = 64, h = 8,\r
679         if(elapsed_timer(gv) >= (1.0 / gv->kurokku.frames_per_second))\r
680         {\r
681         // NTS: For some bizarre reason, gv->pee is not initialized, but the pointer is not NULL even\r
682         //      though it should be. Instead it's NULL as a neAr pointer but contains a non-null\r
683         //      segment value, so testing against NULL doesn't work. It is initialized properly if\r
684         //      you call start_timer() though which uses neAr malloc. Rather than fight with that,\r
685         //      I decided it would be better to declare a temp buffer statically and sprintf to that.\r
686         //\r
687         //      This fixes *** Null pointer assignment detected error message in ZCROLL.EXE on exit.\r
688                 sprintf(global_temp_status_text, "%.0f fps", (double)gv->kurokku.tiku/ticktock(gv));\r
689                 //modexprint(&(gv->video.page[/*!*/(gv->video.p)]), x, y, type, col, bgcol, global_temp_status_text);\r
690 //0000printf("dx=%u     dy=%u\n", gv->video.page[/*!*/(gv->video.p)].dx, gv->video.page[/*!*/(gv->video.p)].dy);\r
691                 gv->kurokku.tiku=0;\r
692         }else //copy dat sheet\r
693         gv->kurokku.tiku++;\r
694 \r
695         modexCopyPageRegion(&gv->video.page[0], &gv->video.page[1],\r
696                 gv->video.page[/*!*/(gv->video.p)].dx,\r
697                 gv->video.page[/*!*/(gv->video.p)].dy,\r
698                 gv->video.page[/*!*/(gv->video.p)].dx,\r
699                 gv->video.page[/*!*/(gv->video.p)].dy,\r
700                 96, 16);\r
701         modexprint(&(gv->video.page[/*!*/(gv->video.p)]), x, y, type, col, bgcol, global_temp_status_text);\r
702 \r
703         switch(gv->kurokku.fpscap)\r
704         {\r
705                 case 0: //turn this off if XT\r
706                         //modexprint(&(gv->video.page[0]), x, y+8, type, col, bgcol, "sanic!");\r
707                         gv->kurokku.frames_per_second=1;\r
708                 break;\r
709                 case 1:\r
710                         //modexWaitBorder();\r
711                         //modexWaitBorder_start();\r
712                         //vga_wait_for_vsync();\r
713                         vga_wait_for_vsync_end();\r
714                         gv->kurokku.frames_per_second=60;\r
715                 break;\r
716         }\r
717         //render!!\r
718         if(gv->video.dorender )\r
719         {//r=1\r
720                 /*if(video->bgp s)\r
721                 {\r
722                         modexCopyPageRegion(&(gv->video.page[ ]), &(gv->video.page[ ]), 0, 0, 0, 0, gv->video.page[ ].width, gv->video.page[ ].height);\r
723                 }else{\r
724                         //modexCopyPageRegion(&video->page[0], &video->page[1], enti->x, enti->y, 0, 0, 24, 32);\r
725                 }*/\r
726                 VL_ShowPage(&(gv->video.page[gv->video.sp]), gv->kurokku.fpscap, 0);\r
727                 gv->video.dorender =!gv->video.dorender ;\r
728                 //0000gv->video.tickclk = ((*clockw)-gv->video.startclk)/18.2;\r
729         }\r
730 }\r
731 \r
732 void near ZC_animatePlayer(map_view_t *pip, player_t *player, word pn)\r
733 {\r
734         sword x = player[pn].enti.x;\r
735         sword y = player[pn].enti.y;\r
736         sword qq,dd; //scroll offset\r
737         player[pn].enti.dire=10; //direction\r
738 \r
739         switch(player[pn].walktype)\r
740         {\r
741                 case 0:\r
742                         dd = 0;\r
743                         qq = 0;\r
744                 break;\r
745                 case 1:\r
746                         dd = 1;\r
747                         qq = 0;\r
748                 break;\r
749                 case 2:\r
750                         dd = 1;\r
751                         qq = player[pn].enti.q*player[pn].enti.speed;\r
752                 break;\r
753         }\r
754         x-=4;\r
755         y-=pip[0].map->layertile[0]->tileHeight;\r
756         switch (player[pn].enti.d)\r
757         {\r
758                 case 0:\r
759                         //up\r
760                         player[pn].enti.dire*=player[pn].enti.d+1;\r
761                         y-=qq;\r
762                 break;\r
763                 case 3:\r
764                         // right\r
765                         player[pn].enti.dire*=(player[pn].enti.d-1);\r
766                         x+=qq;\r
767                 break;\r
768                 case 2:\r
769                 break;\r
770                 case 4:\r
771                         //down\r
772                         player[pn].enti.dire*=(player[pn].enti.d-1);\r
773                         y+=qq;\r
774                 break;\r
775                 case 1:\r
776                         //left\r
777                         player[pn].enti.dire*=(player[pn].enti.d+3);\r
778                         x-=qq;\r
779                 break;\r
780         }\r
781         player[pn].enti.dire+=dd;\r
782         //setting xy position\r
783         player[pn].enti.spri->x = x;\r
784         player[pn].enti.spri->y = y;\r
785 \r
786         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
787         {\r
788                 //0000printf("  q=%u    pred=%u d=%u    dd=%u\n", player[pn].enti.q, player[pn].enti.pred, player[pn].enti.d, dd);\r
789                 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
790                 player[pn].enti.pred = player[pn].enti.d;\r
791                 if(!dd)//changed direction while NOT moving!\r
792                 {\r
793                         modexCopyPageRegion(pip[0].page, pip[1].page, x-4, y-4, x-4, y-4, 28, 40);\r
794                         animate_spri(&player[pn].enti, pip[0].video);\r
795                 }\r
796         }\r
797 \r
798         if(pip[0].video->bgps && dd)//if moving wwww\r
799         {\r
800                 modexCopyPageRegion(pip[0].page, pip[1].page, x-4, y-4, x-4, y-4, 28, 40);\r
801 \r
802                 //draw sprite\r
803                 animate_spri(&player[pn].enti, pip[0].video);\r
804         }\r
805 //0000if(player[pn].enti.q<4) delay(200);\r
806 }\r
807 \r
808 /*\r
809  * from zcroll16.c\r
810 */\r
811 \r
812 boolean boundary_check(int x, int y, int dx, int dy, int h, int w)\r
813 {\r
814         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
815 }\r
816 \r
817 boolean coll_check(int x, int y, int dx, int dy, map_view_t *map_v)\r
818 {\r
819         // Assume everything crosses at most 1 tile at once\r
820         return dx && 1;//crossable_tile(x + dx, map_v) || dy && crossable_tile(y + dy, map_v);\r
821 }\r
822 \r
823 boolean ZC_walk2(entity_t *enti, map_view_t *map_v)\r
824 {\r
825         //return 1;\r
826         int dx = 1;\r
827         int dy = 1;\r
828         switch(enti->d)\r
829         {\r
830                 case 2:\r
831                         return 0;\r
832                 case 1:\r
833                         dx = -dx;\r
834                 case 3:\r
835                         dy = 0;\r
836                         break;\r
837                 case 0:\r
838                         dy = -dy;\r
839                 case 4:\r
840                         dx = 0;\r
841                         break;\r
842         }\r
843         if(coll_check(enti->x, enti->y, dx, dy,  map_v))\r
844         {\r
845                 // Allow movement\r
846                 // Set speed\r
847                 // Start animation\r
848                 // Mark next tile as occupied\r
849                 // Mark this tile as vacant\r
850                 return 1;\r
851         }\r
852         return 0;\r
853 }\r
854 \r
855 void player_walk(player_t *player, map_view_t *map_v){\r
856         int dx=16, dy=16;\r
857         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
858         {\r
859                 mapScroll(map_v, player);\r
860                 // (Un)load stuff?\r
861         }\r
862 }\r
863 \r
864 void mapScroll(map_view_t *mv, player_t *player)\r
865 {\r
866         //word x, y;  /* coordinate for drawing */\r
867         int c = 1;\r
868         int delta;\r
869         mv->delta += player->dx | player->dy;\r
870         delta = mv->delta;\r
871         mv->d = (player->dx) ? (player->dx > 0) ? 3 : 1 : (player->dy) ? (player->dy > 0) ? 4 : 0 : 2;\r
872         switch(mv->d){\r
873                 case 4:\r
874                         c = -1;\r
875                         delta = -delta;\r
876                 case 0:\r
877                         if(!(delta + mv->dxThresh))\r
878                         {\r
879                                 mv->delta = 0;\r
880                                 mv->ty += c;\r
881                         }\r
882                         break;\r
883                 case 3:\r
884                         c = -1;\r
885                         delta = -delta;\r
886                 case 1:\r
887                         if(!(delta + mv->dyThresh))\r
888                         {\r
889                                 mv->delta = 0;\r
890                                 mv->tx += c;\r
891                         }\r
892                         break;\r
893                 default:\r
894                         break;\r
895         }\r
896 }\r