OSDN Git Service

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