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