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