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