]> 4ch.mooo.com Git - 16.git/blob - src/lib/scroll16.c
bg preservation still in works
[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(mv[0].video->bgps)\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(mv[0].video->bgps)\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(mv[0].video->bgps)\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(mv[0].video->bgps)\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         ZC_mapinitMV(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(mv[0].video->bgps) 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 ZC_mapinitMV(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 pagenorendermap = 0;\r
648 boolean pagedelayrendermap = 0;\r
649 \r
650 /*      sync    */\r
651 void shinku(global_game_variables_t *gv)\r
652 {\r
653         word x = (0) + gv->video.page[/*!*/(gv->video.p)].dx; // follow the screen\r
654         word y = (0) + gv->video.page[/*!*/(gv->video.p)].dy; // follow the screen\r
655         word col = 2, bgcol = 1, type = 1;//w = 64, h = 8, //col7bgcol0\r
656         //byte o,o2,i;\r
657         //modexCopyPageRegion(pip[1].page, pip[2].page, 16, 16, 16, 16, (14*8)+4, 8+4);\r
658         /* block copy to visible RAM from offscreen */\r
659 //      vga_setup_wm1_block_copy();\r
660 //      modexCopyPageRegion(&(gv->video.page[gv->video->sfip]), &(gv->video.page[!gv->video->sfip]), x, y, x+w, 0, w, h);\r
661 //      o =     *(gv->video.page[2].data); // source offscreen\r
662 //      o2 =    *(gv->video.page[gv->video->sfip].data)+(y * vga_state.vga_stride) + (x >> 2); // dest visible (original stride)\r
663 //      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
664         /* must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally */\r
665 //      vga_restore_rm0wm0();\r
666         if(elapsed_timer(gv) >= (1.0 / gv->kurokku.frames_per_second))\r
667         {\r
668         // NTS: For some bizarre reason, gv->pee is not initialized, but the pointer is not NULL even\r
669         //      though it should be. Instead it's NULL as a neAr pointer but contains a non-null\r
670         //      segment value, so testing against NULL doesn't work. It is initialized properly if\r
671         //      you call start_timer() though which uses neAr malloc. Rather than fight with that,\r
672         //      I decided it would be better to declare a temp buffer statically and sprintf to that.\r
673         //\r
674         //      This fixes *** Null pointer assignment detected error message in ZCROLL.EXE on exit.\r
675                 sprintf(global_temp_status_text, "%.0f fps", (double)gv->kurokku.tiku/ticktock(gv));\r
676                 //modexClearRegion(&(gv->video.page[gv->video->sfip]), x, y, w, h, 45);\r
677                 modexprint(&(gv->video.page[/*!*/(gv->video.p)]), x, y, type, col, bgcol, global_temp_status_text);\r
678                 gv->kurokku.tiku=0;\r
679                 /* block copy to visible RAM from offscreen */\r
680 //              vga_setup_wm1_block_copy();\r
681 //              o =     *(gv->video.page[gv->video->sfip].data); // source offscreen\r
682 //              o2 =    *(gv->video.page[2].data)+(y * vga_state.vga_stride) + (x >> 2); // dest visible (original stride)\r
683 //              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
684 //              modexCopyPageRegion(&(gv->video.page[gv->video->sfip]), &(gv->video.page[!gv->video->sfip]), x, y, x, 0, w, h);\r
685                 /* must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally */\r
686 //              vga_restore_rm0wm0();\r
687         }else //copy dat sheet\r
688         gv->kurokku.tiku++;\r
689 \r
690         switch(gv->kurokku.fpscap)\r
691         {\r
692                 case 0:\r
693                         //modexprint(&(gv->video.page[gv->video->sfip]), x, y+8, type, col, bgcol, "sanic!");\r
694                         gv->kurokku.frames_per_second=1;\r
695                 break;\r
696                 case 1:\r
697                         //turn this off if XT\r
698                         //modexWaitBorder();\r
699                         //vga_wait_for_vsync();\r
700                         gv->kurokku.frames_per_second=60;\r
701                 break;\r
702         }\r
703         //render!!\r
704         if(gv->video.r )\r
705         {//r=1\r
706                 if(gv->video.bgps )\r
707                 {//bgps=1\r
708                         /*modexCopyPageRegion(&(gv->video.page[\r
709                         ]), &(gv->video.page[(\r
710                         ]), 0, 0, 0, 0, gv->video.page[\r
711                         ].width, gv->video.page[\r
712                         ].height);*/\r
713                 }else{\r
714                         //modexCopyPageRegion(&video->page[0], &video->page[1], enti->x, enti->y, 0, 0, 24, 32);\r
715                 }\r
716                 VL_ShowPage(&(gv->video.page[gv->video.sp]), gv->kurokku.fpscap, 0);\r
717                 gv->video.r =!gv->video.r ;\r
718                 //0000gv->video.tickclk = ((*clockw)-gv->video.startclk)/18.2;\r
719 //      }\r
720         }\r
721 }\r
722 \r
723 void near ZC_drawframe(map_view_t *pip, entity_t *enti, sword x, sword y)\r
724 {\r
725         switch(pip[0].video->rss)\r
726         {\r
727                 case 0:\r
728                         animate_spri(enti, pip->video);\r
729                 break;\r
730                 case 1:\r
731                         animate_spri(enti, pip->video);\r
732                 break;\r
733 //              case 2:\r
734 //                      modexClearRegion(&(pip[0].page[0]), x, y, 16, 32, player[pn].enti.dire);\r
735 //              break;\r
736         }\r
737 }\r
738 \r
739 #ifdef SPRITE\r
740 #define FRAME1 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 48, player[pn].enti.dire, 24, 32,    PLAYERBMPDATAPTR);\r
741 #define FRAME2 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, player[pn].enti.dire, 24, 32,    PLAYERBMPDATAPTR);\r
742 #define FRAME3 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 0, player[pn].enti.dire, 24, 32,     PLAYERBMPDATAPTR);\r
743 #define FRAME4 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, player[pn].enti.dire, 24, 32,    PLAYERBMPDATAPTR);\r
744 #else\r
745 #define FRAME1 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, 2+player[pn].enti.dire);\r
746 #define FRAME2 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, 1+player[pn].enti.dire);\r
747 #define FRAME3 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, player[pn].enti.dire);\r
748 #define FRAME4 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, 1+player[pn].enti.dire);\r
749 #endif\r
750 \r
751 void animatePlayer(map_view_t *pip, player_t *player, word pn, sword scrollswitch)\r
752 {\r
753         sword x = player[pn].enti.x;\r
754         sword y = player[pn].enti.y;\r
755         sword bx = x+16;        //buffer's x\r
756         sword by = y+16;        //buffer's y\r
757         sword qq; //scroll offset\r
758         word ls = 0;//player[pn].enti.persist_aniframe;\r
759         player[pn].enti.dire=32; //direction\r
760 \r
761         switch(scrollswitch)\r
762         {\r
763                 case 0:\r
764                         qq = 0;\r
765                 break;\r
766                 default:\r
767                         qq = ((player[pn].enti.q)*(player[pn].enti.speed));\r
768                 break;\r
769         }\r
770         //x-=4;\r
771         y-=pip[0].map->tiles->tileHeight;\r
772         switch (player[pn].enti.d)\r
773         {\r
774                 case 0:\r
775                         //up\r
776                         player[pn].enti.dire*=player[pn].enti.d;\r
777                         y-=qq;\r
778                         by-=4;\r
779                 break;\r
780                 case 3:\r
781                         // right\r
782                         player[pn].enti.dire*=(player[pn].enti.d-2);\r
783                         x+=qq;\r
784                         bx+=4;\r
785                 break;\r
786                 case 2:\r
787                 break;\r
788                 case 4:\r
789                         //down\r
790                         player[pn].enti.dire*=(player[pn].enti.d-2);\r
791                         y+=qq;\r
792                         by+=4;\r
793                 break;\r
794                 case 1:\r
795                         //left\r
796                         player[pn].enti.dire*=(player[pn].enti.d+2);\r
797                         x-=qq;\r
798                         bx-=4;\r
799                 break;\r
800         }\r
801 \r
802         if(pip[0].video->bgps) modexCopyPageRegion(pip[0].page, pip[1].page, x-4, y-4, x-4, y-4, 28, 36);\r
803 //      else{\r
804 //              //copy old bg to page0\r
805 //              //modexCopyPageRegion(pip[3].page, pip[0].page, bx, by, 0, 0,   20, 36);\r
806 //              //update buffer\r
807 //              //modexCopyPageRegion(pip[0].page, pip[3].page, 0, 0,   x, y,   20, 36);\r
808 //      }\r
809 //modexCopyPageRegion(page_t *dest, page_t *src, word sx, word sy, word dx, word dy, word width, word height);\r
810         //modexCopyPageRegion(pip[3].page, pip[!(pip->video->p)].page, x-4, y-4, 0, 128, 28, 36);\r
811         /*modexCopyPageRegion(pip[pip->video->p].page,\r
812  pip[!(pip->video->p)].page, x-4, y-4, x-4, y-4, 28, 36);*/\r
813 //      else modexCopyPageRegion(pip[1].page, pip[0].page, x-4, y-4, x-4, y-4, 28, 40);\r
814         switch(ls)\r
815         {\r
816                 case 1:\r
817                         FRAME1\r
818                 break;\r
819                 case 2:\r
820                         FRAME2\r
821                 break;\r
822                 case 3:\r
823                         FRAME3\r
824                 break;\r
825                 case 4:\r
826                         FRAME4\r
827                 break;\r
828         }\r
829 //      if(2>ls && ls>=1) { FRAME1 }else\r
830 //      if(3>ls && ls>=2) { FRAME2 }else\r
831 //      if(4>ls && ls>=3) { FRAME3 }else\r
832 //      if(5>ls && ls>=4) { FRAME4 }\r
833         //modexCopyPageRegion(pip[0].page, pip[3].page, 0, 0, x, y, 24, 32);\r
834         //printf("x=%d  y=%d    bx=%d           by=%d\n", x, y, bx, by);\r
835         pip->video->r=1;\r
836 }\r
837 \r
838 void near ZC_animatePlayer(map_view_t *pip, player_t *player, word pn, sword scrollswitch)\r
839 {\r
840         sword x = player[pn].enti.x;\r
841         sword y = player[pn].enti.y;\r
842         sword qq,dd; //scroll offset\r
843         player[pn].enti.dire=10; //direction\r
844 \r
845         switch(scrollswitch)\r
846         {\r
847                 case 0:\r
848                         dd = 0;\r
849                         qq = 0;\r
850                 break;\r
851                 case 1:\r
852                         dd = 1;\r
853                         qq = 0;\r
854                 break;\r
855                 case 2:\r
856                         dd = 1;\r
857                         qq = ((player[pn].enti.q)*(player[pn].enti.speed));\r
858                 break;\r
859         }\r
860         x-=4;\r
861         y-=pip[0].map->tiles->tileHeight;\r
862         switch (player[pn].enti.d)\r
863         {\r
864                 case 0:\r
865                         //up\r
866                         player[pn].enti.dire*=player[pn].enti.d+1;\r
867                         y-=qq;\r
868                 break;\r
869                 case 3:\r
870                         // right\r
871                         player[pn].enti.dire*=(player[pn].enti.d-1);\r
872                         x+=qq;\r
873                 break;\r
874                 case 2:\r
875                 break;\r
876                 case 4:\r
877                         //down\r
878                         player[pn].enti.dire*=(player[pn].enti.d-1);\r
879                         y+=qq;\r
880                 break;\r
881                 case 1:\r
882                         //left\r
883                         player[pn].enti.dire*=(player[pn].enti.d+3);\r
884                         x-=qq;\r
885                 break;\r
886         }\r
887         player[pn].enti.dire+=dd;\r
888         if((player[pn].enti.q==1 && player[pn].enti.pred != player[pn].enti.d) || !dd)\r
889         {\r
890                 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
891                 player[pn].enti.pred = player[pn].enti.d;\r
892         }\r
893 \r
894         //setting xy position\r
895         player[pn].enti.spri->x = x;\r
896         player[pn].enti.spri->y = y;\r
897 \r
898         //draw sprite\r
899         ZC_drawframe(pip, &player[pn].enti, x, y);\r
900 //0000if(player[pn].enti.q<2) delay(200);\r
901         pip->video->r=1;\r
902 }\r
903 \r
904 /*\r
905  * from zcroll16.c\r
906 */\r
907 \r
908 boolean boundary_check(int x, int y, int dx, int dy, int h, int w)\r
909 {\r
910         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
911 }\r
912 \r
913 boolean coll_check(int x, int y, int dx, int dy, map_view_t *map_v)\r
914 {\r
915         // Assume everything crosses at most 1 tile at once\r
916         return dx && 1;//crossable_tile(x + dx, map_v) || dy && crossable_tile(y + dy, map_v);\r
917 }\r
918 \r
919 boolean ZC_walk2(entity_t *enti, map_view_t *map_v)\r
920 {\r
921         //return 1;\r
922         int dx = 1;\r
923         int dy = 1;\r
924         switch(enti->d)\r
925         {\r
926                 case 2:\r
927                         return 0;\r
928                 case 1:\r
929                         dx = -dx;\r
930                 case 3:\r
931                         dy = 0;\r
932                         break;\r
933                 case 0:\r
934                         dy = -dy;\r
935                 case 4:\r
936                         dx = 0;\r
937                         break;\r
938         }\r
939         if(coll_check(enti->x, enti->y, dx, dy,  map_v))\r
940         {\r
941                 // Allow movement\r
942                 // Set speed\r
943                 // Start animation\r
944                 // Mark next tile as occupied\r
945                 // Mark this tile as vacant\r
946                 return 1;\r
947         }\r
948         return 0;\r
949 }\r
950 \r
951 void player_walk(player_t *player, map_view_t *map_v){\r
952         int dx=16, dy=16;\r
953         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
954         {\r
955                 mapScroll(map_v, player);\r
956                 // (Un)load stuff?\r
957         }\r
958 }\r
959 \r
960 void mapScroll(map_view_t *mv, player_t *player)\r
961 {\r
962         //word x, y;  /* coordinate for drawing */\r
963         int c = 1;\r
964         int delta;\r
965         mv->delta += player->dx | player->dy;\r
966         delta = mv->delta;\r
967         mv->d = (player->dx) ? (player->dx > 0) ? 3 : 1 : (player->dy) ? (player->dy > 0) ? 4 : 0 : 2;\r
968         switch(mv->d){\r
969                 case 4:\r
970                         c = -1;\r
971                         delta = -delta;\r
972                 case 0:\r
973                         if(!(delta + mv->dxThresh))\r
974                         {\r
975                                 mv->delta = 0;\r
976                                 mv->ty += c;\r
977                         }\r
978                         break;\r
979                 case 3:\r
980                         c = -1;\r
981                         delta = -delta;\r
982                 case 1:\r
983                         if(!(delta + mv->dyThresh))\r
984                         {\r
985                                 mv->delta = 0;\r
986                                 mv->tx += c;\r
987                         }\r
988                         break;\r
989                 default:\r
990                         break;\r
991         }\r
992 \r
993         mv->video->r=1;\r
994 }\r