]> 4ch.mooo.com Git - 16.git/blob - 16/src/lib/_croll16.c
i do not know if zcroll16.c or scroll16.c will be used yakui-lover wwwww for zcroll...
[16.git] / 16 / src / lib / _croll16.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 #include "src/lib/16_sprite.h"\r
27 \r
28 void walk(map_view_t *pip, player_t *player, word pn)\r
29 {\r
30         #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
31         //printf("player[%d].d=%d\n", pn, player[pn].d);\r
32         switch(player[pn].d)\r
33         {\r
34                 //no direction\r
35                 case 2:\r
36                         //0000pip[0].video->startclk = (*clockw);\r
37                 break;\r
38                 //right movement\r
39                 case 3:\r
40                         //printf("pip[0].page->tilesw=%d        ", pip[0].page->tilesw); printf("pip[0].page->tw=%d\n", pip[0].page->tw);\r
41                         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
42                         !(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
43                         {\r
44                                 if(player[pn].q<=player[pn].spt)\r
45                                 {\r
46                                         INC_PER_FRAME;\r
47                                         animatePlayer(pip, player, pn, 1);\r
48                                         ScrollRight(pip, player, 3, pn);\r
49                                         ScrollRight(pip, player, 2, pn);\r
50                                         mapScrollRight(pip, player, !(pip[0].video->p), pn);\r
51                                         mapScrollRight(pip, player, (pip[0].video->p), pn);\r
52                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
53                                         player[pn].q++;\r
54                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
55                                 } else { player[pn].q = 1; player[pn].d = 2; player[pn].tx++; }\r
56                         }\r
57                         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
58                         {\r
59                                 if(player[pn].q<=player[pn].spt)\r
60                                 {\r
61                                         INC_PER_FRAME;\r
62                                         player[pn].x+=(player[pn].speed);\r
63                                         animatePlayer(pip, player, pn, 0);\r
64                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
65                                         player[pn].q++;\r
66                                 } else { player[pn].q = 1; player[pn].d = 2; player[pn].tx++; }\r
67                         }\r
68                         else\r
69                         {\r
70                                 if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].x, player[pn].y-TILEWH, player[pn].x, player[pn].y-TILEWH, 16, 32);\r
71 #ifdef SPRITE\r
72                                 //PBUFSFUN(pip[0].page, player[pn].x, player[pn].y-TILEWH, 16, 32, 16, 32, PLAYERBMPDATA);\r
73                                 animate_spri(player[pn].spri);\r
74 #else\r
75                                 modexClearRegion(pip[1].page, player[pn].x, player[pn].y-TILEWH, 16, 32, 14);\r
76 #endif\r
77                                 if(!pageflipflop) modexShowPage(pip[1].page);\r
78                                 player[pn].d = 2;\r
79                         }\r
80                         player[pn].triggerx = player[pn].tx+1;\r
81                         player[pn].triggery = player[pn].ty;\r
82                 break;\r
83 \r
84                 //left movement\r
85                 case 1:\r
86                         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
87                         !(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
88                         {\r
89                                 if(player[pn].q<=player[pn].spt)\r
90                                 {\r
91                                         INC_PER_FRAME;\r
92                                         animatePlayer(pip, player, pn, 1);\r
93                                         ScrollLeft(pip, player, 3, pn);\r
94                                         ScrollLeft(pip, player, 2, pn);\r
95                                         mapScrollLeft(pip, player, !(pip[0].video->p), pn);\r
96                                         mapScrollLeft(pip, player, (pip[0].video->p), pn);\r
97                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
98                                         player[pn].q++;\r
99                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
100                                 } else { player[pn].q = 1; player[pn].d = 2; player[pn].tx--; }\r
101                         }\r
102                         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
103                         {\r
104                                 if(player[pn].q<=player[pn].spt)\r
105                                 {\r
106                                         INC_PER_FRAME;\r
107                                         player[pn].x-=(player[pn].speed);\r
108                                         animatePlayer(pip, player, pn, 0);\r
109                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
110                                         player[pn].q++;\r
111                                 } else { player[pn].q = 1; player[pn].d = 2; player[pn].tx--; }\r
112                         }\r
113                         else\r
114                         {\r
115                                 if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].x, player[pn].y-TILEWH, player[pn].x, player[pn].y-TILEWH, 16, 32);\r
116 #ifdef SPRITE\r
117                                 //PBUFSFUN(pip[0].page, player[pn].x, player[pn].y-TILEWH, 16, 96, 16, 32, PLAYERBMPDATA);\r
118                                 animate_spri(player[pn].spri);\r
119 #else\r
120                                 modexClearRegion(pip[1].page, player[pn].x, player[pn].y-TILEWH, 16, 32, 10);\r
121 #endif\r
122                                 if(!pageflipflop) modexShowPage(pip[1].page);\r
123                                 player[pn].d = 2;\r
124                         }\r
125                         player[pn].triggerx = player[pn].tx-1;\r
126                         player[pn].triggery = player[pn].ty;\r
127                 break;\r
128 \r
129                 //down movement\r
130                 case 4:\r
131                         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
132                         !(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
133                         {\r
134                                 if(player[pn].q<=player[pn].spt)\r
135                                 {\r
136                                         INC_PER_FRAME;\r
137                                         animatePlayer(pip, player, pn, 1);\r
138                                         ScrollDown(pip, player, 3, pn);\r
139                                         ScrollDown(pip, player, 2, pn);\r
140                                         mapScrollDown(pip, player, !(pip[0].video->p), pn);\r
141                                         mapScrollDown(pip, player, (pip[0].video->p), pn);\r
142                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
143                                         player[pn].q++;\r
144                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
145                                 } else { player[pn].q = 1; player[pn].d = 2; player[pn].ty++; }\r
146                         }\r
147                         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
148                         {\r
149                                 if(player[pn].q<=player[pn].spt)\r
150                                 {\r
151                                         INC_PER_FRAME;\r
152                                         player[pn].y+=(player[pn].speed);\r
153                                         animatePlayer(pip, player, pn, 0);\r
154                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
155                                         player[pn].q++;\r
156                                 } else { player[pn].q = 1; player[pn].d = 2; player[pn].ty++; }\r
157                         }\r
158                         else\r
159                         {\r
160                                 if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].x, player[pn].y-TILEWH, player[pn].x, player[pn].y-TILEWH, 16, 32);\r
161 #ifdef SPRITE\r
162                                 //PBUFSFUN(pip[0].page, player[pn].x, player[pn].y-TILEWH, 16, 64, 16, 32, PLAYERBMPDATA);\r
163                                 animate_spri(player[pn].spri);\r
164 #else\r
165                                 modexClearRegion(pip[1].page, player[pn].x, player[pn].y-TILEWH, 16, 32, 9);\r
166 #endif\r
167                                 if(!pageflipflop) modexShowPage(pip[1].page);\r
168                                 player[pn].d = 2;\r
169                         }\r
170                         player[pn].triggerx = player[pn].tx;\r
171                         player[pn].triggery = player[pn].ty+1;\r
172                 break;\r
173 \r
174                 //up movement\r
175                 case 0:\r
176                         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
177                         !(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
178                         {\r
179                                 if(player[pn].q<=player[pn].spt)\r
180                                 {\r
181                                         INC_PER_FRAME;\r
182                                         animatePlayer(pip, player, pn, 1);\r
183                                         ScrollUp(pip, player, 3, pn);\r
184                                         ScrollUp(pip, player, 2, pn);\r
185                                         mapScrollUp(pip, player, !(pip[0].video->p), pn);\r
186                                         mapScrollUp(pip, player, (pip[0].video->p), pn);\r
187                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
188                                         player[pn].q++;\r
189                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
190                                 } else { player[pn].q = 1; player[pn].d = 2; player[pn].ty--; }\r
191                         }\r
192                         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
193                         {\r
194                                 if(player[pn].q<=player[pn].spt)\r
195                                 {\r
196                                         INC_PER_FRAME;\r
197                                         player[pn].y-=(player[pn].speed);\r
198                                         animatePlayer(pip, player, 0, pn);\r
199                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
200                                         player[pn].q++;\r
201                                 } else { player[pn].q = 1; player[pn].d = 2; player[pn].ty--; }\r
202                         }\r
203                         else\r
204                         {\r
205                                 if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].x, player[pn].y-TILEWH, player[pn].x, player[pn].y-TILEWH, 16, 32);\r
206 #ifdef SPRITE\r
207                                 //PBUFSFUN(pip[0].page, player[pn].x, player[pn].y-TILEWH, 16, 0, 16, 32, PLAYERBMPDATA);\r
208                                 animate_spri(player[pn].spri);\r
209 #else\r
210                                 modexClearRegion(pip[1].page, player[pn].x, player[pn].y-TILEWH, 16, 32, 12);\r
211 #endif\r
212                                 if(!pageflipflop) modexShowPage(pip[1].page);\r
213                                 player[pn].d = 2;\r
214                         }\r
215                         player[pn].triggerx = player[pn].tx;\r
216                         player[pn].triggery = player[pn].ty-1;\r
217                 break;\r
218         }\r
219 }\r
220 \r
221 //panning page\r
222 void panpagemanual(map_view_t *pip, player_t *player, word pn)\r
223 {\r
224         switch(player[pn].d)\r
225         {\r
226                 //right movement\r
227                 case 3:\r
228                         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
229                         {\r
230                                 if(player[pn].q<=player[pn].spt)\r
231                                 {\r
232                                         pip[pip[0].pan->pn].page->dx+=4;\r
233                                         modexShowPage(pip[pip[0].pan->pn].page);\r
234                                         player[pn].q++;\r
235                                 } else { player[pn].q = 1; player[pn].d = 2; pip[pip[0].pan->pn].tx++; }\r
236                         }\r
237                 break;\r
238 \r
239                 //left movement\r
240                 case 1:\r
241                         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
242                         {\r
243                                 if(player[pn].q<=player[pn].spt)\r
244                                 {\r
245                                         pip[pip[0].pan->pn].page->dx-=4;\r
246                                         modexShowPage(pip[pip[0].pan->pn].page);\r
247                                         player[pn].q++;\r
248                                 } else { player[pn].q = 1; player[pn].d = 2; pip[pip[0].pan->pn].tx--; }\r
249                         }\r
250                 break;\r
251 \r
252                 //down movement\r
253                 case 4:\r
254                         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
255                         {\r
256                                 if(player[pn].q<=player[pn].spt)\r
257                                 {\r
258                                         pip[pip[0].pan->pn].page->dy+=4;\r
259                                         modexShowPage(pip[pip[0].pan->pn].page);\r
260                                         player[pn].q++;\r
261                                 } else { player[pn].q = 1; player[pn].d = 2; pip[pip[0].pan->pn].ty++; }\r
262                         }\r
263                 break;\r
264 \r
265                 //up movement\r
266                 case 0:\r
267                         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
268                         {\r
269                                 if(player[pn].q<=player[pn].spt)\r
270                                 {\r
271                                         pip[pip[0].pan->pn].page->dy-=4;\r
272                                         modexShowPage(pip[pip[0].pan->pn].page);\r
273                                         player[pn].q++;\r
274                                 } else { player[pn].q = 1; player[pn].d = 2; pip[pip[0].pan->pn].ty--; }\r
275                         }\r
276                         break;\r
277         }\r
278         //if (player[pn].d!=2) printf("player[%u].d=%u player[%u].q=%u\n", pn, player[pn].d, pn, player[pn].q);\r
279 }\r
280 \r
281 /*map_t\r
282 allocMap(int w, int h) {\r
283         map_t result;\r
284 \r
285         result.width =w;\r
286         result.height=h;\r
287         result.data = malloc(sizeof(byte) * w * h);\r
288         //result.data = (byte *)alloc_emem(((int)sizeof(byte) * w * h)/1024);\r
289         if(isEMS() || checkEMS())\r
290         {\r
291                 XMOVE mm;\r
292                 //emmhandle = mallocEMS(coretotalEMS());//alloc_emem((int)sizeof(map))\r
293                 mm.length=sizeof(result);\r
294                 mm.sourceH=0;\r
295                 mm.sourceOff=ptr2long(&result);\r
296                 mm.destH=emmhandle;\r
297                 mm.destOff=0;\r
298                 ist = move_emem(&mm);\r
299                 if(!ist){ dealloc_emem(emmhandle); exit(5); }\r
300                 printf("%d\n", coretotalEMS());\r
301         }\r
302 \r
303         return result;\r
304 }*/\r
305 \r
306 /*void\r
307 initMap(map_t *map) {\r
308         // just a place holder to fill out an alternating pattern\r
309         int x, y, xx, yy;\r
310         int i, q;\r
311 //      int tile = 1;\r
312         //if(!isEMS() || !checkEMS())\r
313 //              map->tiles = malloc(sizeof(tiles_t));\r
314         //else\r
315         //      map->tiles = (tiles_t *)alloc_emem(sizeof(tiles_t));\r
316 \r
317          //create the tile set\r
318         //if(!isEMS() || !checkEMS())\r
319 //              map->tiles->data = malloc(sizeof(bitmap_t));\r
320         //else\r
321         //      map->tiles->data = (bitmap_t *)alloc_emem(sizeof(bitmap_t));\r
322 //      map->tiles->data->width = (TILEWH);\r
323 //      map->tiles->data->height= TILEWH;\r
324         //if(!isEMS() || !checkEMS())\r
325 //              map->tiles->data->data = malloc((TILEWH*2)*TILEWH);\r
326         //else\r
327         //      map->tiles->data->data = (byte *)alloc_emem((TILEWH*2)*TILEWH);\r
328 //      map->tiles->tileHeight = TILEWH;\r
329 //      map->tiles->tileWidth =TILEWH;\r
330 //      map->tiles->rows = 1;\r
331 //      map->tiles->cols = 1;//2;\r
332 \r
333         q=0;\r
334         //for(y=0; y<map->height; y++) {\r
335         //for(x=0; x<map->width; x++) {\r
336         i=0;\r
337         for(yy=0; yy<TILEWH; yy++) {\r
338         for(xx=0; xx<(TILEWH); xx++) {\r
339                 //if(x<TILEWH){\r
340                   map->tiles->data->data[i+1] = map->data[q];//28;//0x24;\r
341 //                printf("[%d]", map->tiles->data->data[i]);\r
342                 //}else{\r
343                   //map->tiles->data->data[i] = map->data[q];//0;//0x34;\r
344                   //printf("]%d[==[%d]", i, map->tiles->data->data[i]);\r
345                 //}\r
346                 i++;\r
347         }\r
348 //      printf("\n");\r
349         }\r
350 //      printf("[%d]", map->data[q]);\r
351         q++;\r
352 //      }\r
353         //printf("\n\n");\r
354 //      }\r
355 \r
356         i=0;\r
357         for(y=0; y<map->height; y++) {\r
358                 for(x=0; x<map->width; x++) {\r
359 //                      map->data[i]=255;\r
360                         printf("[%d]", map->data[i]);\r
361                         //tile = tile ? 0 : 1;\r
362                         i++;\r
363                 }\r
364                 //tile = tile ? 0 : 1;\r
365         }\r
366 }*/\r
367 \r
368 void near mapScrollRight(map_view_t *mv, player_t *player, word id, word plid)\r
369 {\r
370         word x, y;  /* coordinate for drawing */\r
371 \r
372         /* increment the pixel position and update the page */\r
373         mv[id].page->dx += player[plid].speed;\r
374 \r
375         /* check to see if this changes the tile */\r
376         if(mv[id].page->dx >= mv[id].dxThresh )\r
377         {\r
378         /* go forward one tile */\r
379         mv[id].tx++;\r
380         /* Snap the origin forward */\r
381         mv[id].page->data += 4;\r
382 \r
383         mv[id].page->dx = mv[id].map->tiles->tileWidth;\r
384         }\r
385 \r
386         /* draw the next column */\r
387         x= mv[0].page->sw + mv[id].map->tiles->tileWidth;\r
388         if(player[plid].q%4)\r
389                 if(id==0)\r
390                         mapDrawCol(&mv[0], mv[0].tx + mv[0].page->tw, mv[0].ty-1, x, player, mv->page->dx);\r
391                 else\r
392                         if(!pageflipflop && !pageploop)\r
393                                 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
394         mv[0].video->r=1;\r
395 }\r
396 \r
397 \r
398 void near mapScrollLeft(map_view_t *mv, player_t *player, word id, word plid)\r
399 {\r
400         word x, y;  /* coordinate for drawing */\r
401 \r
402         /* decrement the pixel position and update the page */\r
403         mv[id].page->dx -= player[plid].speed;\r
404 \r
405         /* check to see if this changes the tile */\r
406         if(mv[id].page->dx == 0)\r
407         {\r
408         /* go backward one tile */\r
409         mv[id].tx--;\r
410         /* Snap the origin backward */\r
411         mv[id].page->data -= 4;\r
412 \r
413         mv[id].page->dx = mv[id].map->tiles->tileWidth;\r
414         }\r
415 \r
416         /* draw the next column */\r
417         x= 0;\r
418         if(player[plid].q%4)\r
419                 if(id==0)\r
420                         mapDrawCol(&mv[0], mv[0].tx - 1, mv[0].ty-1, x, player, mv->page->dx);\r
421                 else\r
422                         if(!pageflipflop && !pageploop)\r
423                                 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
424         mv[0].video->r=1;\r
425 }\r
426 \r
427 \r
428 void near mapScrollUp(map_view_t *mv, player_t *player, word id, word plid)\r
429 {\r
430         word x, y;  /* coordinate for drawing */\r
431 \r
432         /* decrement the pixel position and update the page */\r
433         mv[id].page->dy -= player[plid].speed;\r
434 \r
435         /* check to see if this changes the tile */\r
436         if(mv[id].page->dy == 0 )\r
437         {\r
438         /* go down one tile */\r
439         mv[id].ty--;\r
440         /* Snap the origin downward */\r
441         mv[id].page->data -= mv[id].page->pi;\r
442 \r
443         mv[id].page->dy = mv[id].map->tiles->tileHeight;\r
444         }\r
445 \r
446         /* draw the next row */\r
447         y= 0;\r
448         if(player[plid].q%3)\r
449                 if(id==0)\r
450                         mapDrawRow(&mv[0], mv[0].tx - 1, mv[0].ty-1, y, player, mv->page->dy);\r
451                 else\r
452                         if(!pageflipflop && !pageploop)\r
453                                 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
454         mv[0].video->r=1;\r
455 }\r
456 \r
457 void near mapScrollDown(map_view_t *mv, player_t *player, word id, word plid)\r
458 {\r
459         word x, y;  /* coordinate for drawing */\r
460 \r
461         /* increment the pixel position and update the page */\r
462         mv[id].page->dy += player[plid].speed;\r
463 \r
464         /* check to see if this changes the tile */\r
465         if(mv[id].page->dy >= mv[id].dyThresh )\r
466         {\r
467         /* go down one tile */\r
468         mv[id].ty++;\r
469         /* Snap the origin downward */\r
470         mv[id].page->data += mv[id].page->pi;\r
471 \r
472         mv[id].page->dy = mv[id].map->tiles->tileHeight;\r
473         }\r
474 \r
475         /* draw the next row */\r
476         y= mv[0].page->sh + mv[id].map->tiles->tileHeight;\r
477         if(player[plid].q%3)\r
478                 if(id==0)\r
479                         mapDrawRow(&mv[0], mv[0].tx - 1, mv[0].ty+mv[0].page->th, y, player, mv->page->dy);\r
480                 else\r
481                         if(!pageflipflop && !pageploop)\r
482                                 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
483         mv[0].video->r=1;\r
484 }\r
485 \r
486 \r
487 //TODO finish this wwww\r
488 void near ScrollRight(map_view_t *mv, player_t *player, word id, word plid)\r
489 {\r
490         /* increment the pixel position and update the page */\r
491         mv[id].page->dx += player[plid].speed;\r
492 \r
493         /* check to see if this changes the tile */\r
494         if(mv[id].page->dx >= mv[0].dxThresh )\r
495         {\r
496 //              vga_setup_wm1_block_copy();\r
497 //              _fmemmove(mv[id].page->data+4, mv[id].page->data, mv[id].page->pagesize);\r
498 //              vga_restore_rm0wm0();\r
499                 /* Snap the origin forward */\r
500                 mv[id].page->data += 4;\r
501                 mv[id].page->dx = mv[0].map->tiles->tileWidth;\r
502         }\r
503 }\r
504 \r
505 void near ScrollLeft(map_view_t *mv, player_t *player, word id, word plid)\r
506 {\r
507         /* decrement the pixel position and update the page */\r
508         mv[id].page->dx -= player[plid].speed;\r
509 \r
510         /* check to see if this changes the tile */\r
511         if(mv[id].page->dx == 0)\r
512         {\r
513 //              vga_setup_wm1_block_copy();\r
514 //              _fmemmove(mv[id].page->data-4, mv[id].page->data, mv[id].page->pagesize);\r
515 //              vga_restore_rm0wm0();\r
516                 /* Snap the origin backward */\r
517                 mv[id].page->data -= 4;\r
518                 mv[id].page->dx = mv[0].map->tiles->tileWidth;\r
519         }\r
520 }\r
521 \r
522 void near ScrollUp(map_view_t *mv, player_t *player, word id, word plid)\r
523 {\r
524         /* decrement the pixel position and update the page */\r
525         mv[id].page->dy -= player[plid].speed;\r
526 \r
527         /* check to see if this changes the tile */\r
528         if(mv[id].page->dy == 0)\r
529         {\r
530 //              vga_setup_wm1_block_copy();\r
531 //              _fmemmove(mv[id].page->data-mv[id].page->pi, mv[id].page->data, mv[id].page->pagesize);\r
532 //              vga_restore_rm0wm0();\r
533                 /* Snap the origin backward */\r
534                 mv[id].page->data -= mv[id].page->pi;\r
535                 mv[id].page->dy = mv[0].map->tiles->tileWidth;\r
536         }\r
537 }\r
538 \r
539 void near ScrollDown(map_view_t *mv, player_t *player, word id, word plid)\r
540 {\r
541         /* increment the pixel position and update the page */\r
542         mv[id].page->dy += player[plid].speed;\r
543 \r
544         /* check to see if this changes the tile */\r
545         if(mv[id].page->dy >= mv[0].dxThresh )\r
546         {\r
547 //              vga_setup_wm1_block_copy();\r
548 //              _fmemmove(mv[id].page->data+mv[id].page->pi, mv[id].page->data, mv[id].page->pagesize);\r
549 //              vga_restore_rm0wm0();\r
550                 /* Snap the origin forward */\r
551                 mv[id].page->data += mv[id].page->pi;\r
552                 mv[id].page->dy = mv[0].map->tiles->tileWidth;\r
553         }\r
554 }\r
555 \r
556 sword chkmap(map_t *map, word q)\r
557 {\r
558 //      bitmap_t bp;\r
559         static byte x[(MAPW*MAPH)+1] =\r
560 { 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
561 /*1,    2,      3,      4,      0,      3,      3,      3,      3,      3,      3,      3,      3,      4,      1,      1,      1,      1,      1,      1,      \\r
562 5,      6,      7,      8,      0,      1,      0,      1,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
563 9,      10,     11,     12,     4,      1,      0,      1,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
564 13,     14,     15,     16,     0,      1,      1,      1,      5,      8,      1,      11,     11,     1,      1,      1,      1,      1,      1,      1,      \\r
565 0,      0,      4,      0,      0,      0,      0,      0,      8,      8,      1,      11,     11,     3,      1,      1,      1,      1,      1,      1,      \\r
566 1,      1,      1,      1,      0,      0,      0,      0,      8,      8,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
567 1,      1,      1,      1,      0,      0,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
568 1,      1,      1,      1,      0,      0,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
569 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
570 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
571 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
572 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
573 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
574 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
575 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      3,      3,      3,      1,      2,      3,      4 };*/\r
576         //check for failed to load map\r
577         if((map->width == map->height == 0) && (q>0))\r
578         {\r
579                 //initiate a null map!\r
580                 map->width=MAPW;///2;\r
581                 map->height=MAPH;///2;\r
582 //              map->data = malloc(((map->width*map->height)+1)*sizeof(byte));\r
583                 map->data = &x;\r
584                 map->tiles = malloc(sizeof(tiles_t));\r
585                 //fix this to be far~\r
586 //              bp = bitmapLoadPcx("data/ed.pcx");\r
587 //              map->tiles->data = &bp;\r
588                 map->tiles->debug_data = map->data;\r
589                 map->tiles->tileHeight = 16;\r
590                 map->tiles->tileWidth = 16;\r
591                 map->tiles->rows = 1;\r
592                 map->tiles->cols = 1;\r
593                 map->tiles->debug_text = true;\r
594         }\r
595         else map->tiles->debug_text = false;\r
596         return 0;\r
597 }\r
598 \r
599 //TODO: player position here\r
600 void mapGoTo(map_view_t *mv, int tx, int ty)\r
601 {\r
602         int px, py;\r
603         unsigned int i;\r
604 \r
605         /* set up the coordinates */\r
606         mv[0].tx = mv[1].tx = tx;\r
607         mv[0].ty = mv[1].ty = ty;\r
608         mv[0].page->dx = mv[1].page->dx = mv[2].page->dx = mv[3].page->dx = mv->map->tiles->tileWidth;\r
609         mv[0].page->dy = mv[1].page->dy = mv[2].page->dy = mv[3].page->dy = mv->map->tiles->tileHeight;\r
610 \r
611         /* set up the thresholds */\r
612         mv[0].dxThresh = mv[1].dxThresh = mv[2].dxThresh = mv[3].dxThresh = mv->map->tiles->tileWidth * 2;\r
613         mv[0].dyThresh = mv[1].dyThresh = mv[2].dxThresh = mv[3].dxThresh = mv->map->tiles->tileHeight * 2;\r
614 \r
615         /* draw the tiles */\r
616         modexClearRegion(mv[0].page, 0, 0, mv[0].page->width, mv[0].page->height, 0);\r
617         py=0;\r
618         i=mv[0].ty * mv[0].map->width + mv[0].tx;\r
619         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
620                 mapDrawWRow(&mv[0], tx-1, ty, py);\r
621         i+=mv->map->width - tx;\r
622         }\r
623         if(!pageploop) modexCopyPageRegion(mv[1].page, mv[0].page, 0, 0, 0, 0, mv[0].page->width, mv[0].page->height);\r
624 //      {\r
625 //              unsigned int k,j,o;\r
626 //              /* fill screen with a distinctive pattern */\r
627 //              for (k=0;k < vga_state.vga_width;k++) {\r
628 //                      o = k >> 2;\r
629 //                      vga_write_sequencer(0x02/*map mask*/,1 << (k&3));\r
630 //                              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
631 //                                      vga_state.vga_graphics_ram[o] = (k^j)&15; // VRL samples put all colors in first 15!\r
632 //              }\r
633 //      }\r
634         modexCopyPageRegion(mv[3].page, mv[0].page, 0/**/, 0/**/, 0, 0, 16, 32);\r
635 }\r
636 \r
637 void near\r
638 mapDrawTile(tiles_t *t, word i, page_t *page, word x, word y)\r
639 {\r
640         word rx;\r
641         word ry;\r
642         word textx=0;\r
643         word texty=0;\r
644         //if(i==0) i=2;\r
645         if(i==0)\r
646         {\r
647                 //wwww\r
648                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, 0); //currently the over scan color!\r
649         }\r
650         else\r
651         {\r
652                 rx = (((i-1) % ((t->data->width)/t->tileWidth)) * t->tileWidth);\r
653                 ry = (((i-1) / ((t->data->height)/t->tileHeight)) * t->tileHeight);\r
654 ////0000printf("i=%d\n", i);\r
655                 switch(t->debug_text)\r
656                 {\r
657                         case 0:\r
658 #ifndef TILERENDER\r
659                                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, ((t->debug_data[i])+1));\r
660                                 //modexprint(page, x, y, 1, 15, 0, (char const *)(t->debug_data[i]));\r
661 #else\r
662                                 PBUFBFUN                (page, x, y, rx, ry, t->tileWidth, t->tileHeight, (t->data));\r
663                                 /* then the sprite. note modding ram ptr means we just draw to (x&3,0) */\r
664                                 //draw_vrl1_vgax_modex(x-rx,y-ry,vrl_header,vrl_lineoffs,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));\r
665                                 //modexDrawBmpRegion    (page, x, y, rx, ry, t->tileWidth, t->tileHeight, (t->data));\r
666 #endif\r
667                         break;\r
668                         case 1:\r
669                                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, (t->debug_data[i])+1);\r
670                                 //modexprintbig(page, x, y, 1, 15, 0, (t->debug_data));\r
671                                 /*for(texty=0; texty<2; texty++)\r
672                                 {\r
673                                         for(textx=0; textx<2; textx++)\r
674                                         {*/\r
675 //                                              modexprint(page, x+(textx*8), y+(texty*8), 1, (word)(t->debug_data), 0, (t->debug_data));\r
676 /*                                      }\r
677                                 }*/\r
678                         break;\r
679                 }\r
680         }\r
681 }\r
682 \r
683 void near mapDrawRow(map_view_t *mv, int tx, int ty, word y, player_t *p, word poopoffset)\r
684 {\r
685         word x;\r
686         int i;\r
687         poopoffset%=p[0].speed;\r
688 //printf("y: %d\n", poopoffset);\r
689         /* the position within the map array */\r
690         i=ty * mv->map->width + tx;\r
691         for(x=poopoffset; x<(mv->page->sw+mv->dxThresh)/(poopoffset+1) && tx < mv->map->width; x+=mv->map->tiles->tileWidth, tx++) {\r
692         if(i>=0) {\r
693                 /* we are in the map, so copy! */\r
694                 mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y);\r
695         }\r
696         i++; /* next! */\r
697         }\r
698 }\r
699 \r
700 void near mapDrawCol(map_view_t *mv, int tx, int ty, word x, player_t *p, word poopoffset)\r
701 {\r
702         int y;\r
703         int i;\r
704         poopoffset%=p[0].speed;\r
705 //printf("x: %d\n", poopoffset);\r
706         /* location in the map array */\r
707         i=ty * mv->map->width + tx;\r
708 \r
709         /* We'll copy all of the columns in the screen,\r
710            i + 1 row above and one below */\r
711         for(y=poopoffset; y<(mv->page->sh+mv->dyThresh)/(poopoffset+1) && ty < mv->map->height; y+=mv->map->tiles->tileHeight, ty++) {\r
712         if(i>=0) {\r
713                 /* we are in the map, so copy away! */\r
714                 mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y);\r
715         }\r
716         i += mv->map->width;\r
717         }\r
718 }\r
719 \r
720 void mapDrawWRow(map_view_t *mv, int tx, int ty, word y)\r
721 {\r
722         word x;\r
723         int i;\r
724 \r
725         /* the position within the map array */\r
726         i=ty * mv->map->width + tx;\r
727         for(x=0; x<mv->page->sw+mv->dxThresh && tx < mv->map->width; x+=mv->map->tiles->tileWidth, tx++) {\r
728         if(i>=0) {\r
729                 /* we are in the map, so copy! */\r
730                 mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y);\r
731         }\r
732         i++; /* next! */\r
733         }\r
734 }\r
735 \r
736 void mapDrawWCol(map_view_t *mv, int tx, int ty, word x)\r
737 {\r
738         int y;\r
739         int i;\r
740 \r
741         /* location in the map array */\r
742         i=ty * mv->map->width + tx;\r
743 \r
744         /* We'll copy all of the columns in the screen,\r
745            i + 1 row above and one below */\r
746         for(y=0; y<mv->page->sh+mv->dyThresh && ty < mv->map->height; y+=mv->map->tiles->tileHeight, ty++) {\r
747         if(i>=0) {\r
748                 /* we are in the map, so copy away! */\r
749                 mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y);\r
750         }\r
751         i += mv->map->width;\r
752         }\r
753 }\r
754 \r
755 /*void qclean()\r
756 {\r
757         //setkb(0);\r
758 }*/\r
759 \r
760 unsigned char shinku_fps_indicator_page = 2;\r
761 boolean pageflipflop = 1;\r
762 boolean pageploop = 1;\r
763 \r
764 /*      sync    */\r
765 void shinku(global_game_variables_t *gv)\r
766 {\r
767         word x = (0) + gv->video.page[/*!*/(gv->video.p)].dx; // follow the screen\r
768         word y = (0) + gv->video.page[/*!*/(gv->video.p)].dy; // follow the screen\r
769         word w = 64, h = 8, col = 7, bgcol = 0, type = 1;\r
770         byte o,o2,i;\r
771         //modexCopyPageRegion(pip[1].page, pip[2].page, 16, 16, 16, 16, (14*8)+4, 8+4);\r
772         /* block copy to visible RAM from offscreen */\r
773 //      vga_setup_wm1_block_copy();\r
774 //      modexCopyPageRegion(&(gv->video.page[shinku_fps_indicator_page]), &(gv->video.page[!shinku_fps_indicator_page]), x, y, x+w, 0, w, h);\r
775 //      o =     *(gv->video.page[2].data); // source offscreen\r
776 //      o2 =    *(gv->video.page[shinku_fps_indicator_page].data)+(y * vga_state.vga_stride) + (x >> 2); // dest visible (original stride)\r
777 //      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
778         /* must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally */\r
779 //      vga_restore_rm0wm0();\r
780         if(elapsed_timer(gv) >= (1.0 / gv->kurokku.frames_per_second))\r
781         {\r
782                 sprintf(gv->pee, "%.0f fps", (double)gv->kurokku.tiku/ticktock(gv));\r
783                 //modexClearRegion(&(gv->video.page[shinku_fps_indicator_page]), x, y, w, h, 45);\r
784                 modexprint(&(gv->video.page[/*!*/(gv->video.p)]), x, y, type, col, bgcol, gv->pee);\r
785                 gv->kurokku.tiku=0;\r
786                 /* block copy to visible RAM from offscreen */\r
787 //              vga_setup_wm1_block_copy();\r
788 //              o =     *(gv->video.page[shinku_fps_indicator_page].data); // source offscreen\r
789 //              o2 =    *(gv->video.page[2].data)+(y * vga_state.vga_stride) + (x >> 2); // dest visible (original stride)\r
790 //              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
791 //              modexCopyPageRegion(&(gv->video.page[shinku_fps_indicator_page]), &(gv->video.page[!shinku_fps_indicator_page]), x, y, x, 0, w, h);\r
792                 /* must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally */\r
793 //              vga_restore_rm0wm0();\r
794         }else //copy dat sheet\r
795         gv->kurokku.tiku++;\r
796 \r
797         switch(gv->kurokku.fpscap)\r
798         {\r
799                 case 0:\r
800                         //modexprint(&(gv->video.page[shinku_fps_indicator_page]), x, y+8, type, col, bgcol, "sanic!");\r
801                         gv->kurokku.frames_per_second=1;\r
802                 break;\r
803                 case 1:\r
804                         //turn this off if XT\r
805                         //modexWaitBorder();\r
806                         vga_wait_for_vsync();\r
807                         gv->kurokku.frames_per_second=60;\r
808                 break;\r
809         }\r
810         if(pageflipflop){\r
811         if(gv->video.r){\r
812                 //vga_setup_wm1_block_copy();\r
813                 //_fmemcpy((gv->video.page[(gv->video.p)]).data, (gv->video.page[(!gv->video.p)]).data, gv->video.page[(!gv->video.p)].pagesize);\r
814                 //vga_restore_rm0wm0();\r
815                 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
816                 modexShowPage(&(gv->video.page[gv->video.p]));\r
817                 if(!pageploop) gv->video.p=!gv->video.p;\r
818                 gv->video.r=!gv->video.r;\r
819                 //0000gv->video.tickclk = ((*clockw)-gv->video.startclk)/18.2;\r
820         }\r
821         }\r
822 }\r
823 \r
824 void near animatePlayer(map_view_t *pip, player_t *player, word pn, sword scrollswitch)\r
825 {\r
826         sword x = player[pn].x;\r
827         sword y = player[pn].y;\r
828         sword bx = x+16;        //buffer's x\r
829         sword by = y+16;        //buffer's y\r
830         word dire=32; //direction\r
831         sword qq; //scroll offset\r
832         word ls = player[pn].persist_aniframe;\r
833 \r
834         switch(scrollswitch)\r
835         {\r
836                 case 0:\r
837                         qq = 0;\r
838                 break;\r
839                 default:\r
840                         qq = ((player[pn].q)*(player[pn].speed));\r
841                 break;\r
842         }\r
843         //x-=4;\r
844         y-=pip[0].map->tiles->tileHeight;\r
845         switch (player[pn].d)\r
846         {\r
847                 case 0:\r
848                         //up\r
849                         dire*=player[pn].d;\r
850                         y-=qq;\r
851                         by-=4;\r
852                 break;\r
853                 case 3:\r
854                         // right\r
855                         dire*=(player[pn].d-2);\r
856                         x+=qq;\r
857                         bx+=4;\r
858                 break;\r
859                 case 2:\r
860                 break;\r
861                 case 4:\r
862                         //down\r
863                         dire*=(player[pn].d-2);\r
864                         y+=qq;\r
865                         by+=4;\r
866                 break;\r
867                 case 1:\r
868                         //left\r
869                         dire*=(player[pn].d+2);\r
870                         x-=qq;\r
871                         bx-=4;\r
872                 break;\r
873         }\r
874 \r
875 #ifdef SPRITE\r
876 //#define FRAME1 PBUFSFUN(pip[/*!*/(pip->video->p)].page, x, y, 32, dire, 16, 32,       PLAYERBMPDATA);\r
877 //#define FRAME2 PBUFSFUN(pip[/*!*/(pip->video->p)].page, x, y, 16, dire, 16, 32,       PLAYERBMPDATA);\r
878 //#define FRAME3 PBUFSFUN(pip[/*!*/(pip->video->p)].page, x, y, 0, dire, 16, 32,        PLAYERBMPDATA);\r
879 //#define FRAME4 PBUFSFUN(pip[/*!*/(pip->video->p)].page, x, y, 16, dire, 16, 32,       PLAYERBMPDATA);\r
880 #define FRAME1 animate_spri(player[pn].spri);\r
881 #define FRAME2 animate_spri(player[pn].spri);\r
882 #define FRAME3 animate_spri(player[pn].spri);\r
883 #define FRAME4 animate_spri(player[pn].spri);\r
884 #else\r
885 #define FRAME1 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, 2+dire);\r
886 #define FRAME2 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, 1+dire);\r
887 #define FRAME3 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, dire);\r
888 #define FRAME4 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, 1+dire);\r
889 #endif\r
890         if(!pageflipflop)\r
891                 modexCopyPageRegion(pip[1].page, pip[0].page, x-4, y-4, x-4, y-4, 28, 36);\r
892         else{\r
893                 //copy old bg to page0\r
894                 //modexCopyPageRegion(pip[3].page, pip[0].page, bx, by, 0, 0,   20, 36);\r
895                 //update buffer\r
896                 //modexCopyPageRegion(pip[0].page, pip[3].page, 0, 0,   x, y,   20, 36);\r
897         }\r
898 //modexCopyPageRegion(page_t *dest, page_t *src, word sx, word sy, word dx, word dy, word width, word height);\r
899         //modexCopyPageRegion(pip[3].page, pip[!(pip->video->p)].page, x-4, y-4, 0, 128, 28, 36);\r
900         /*modexCopyPageRegion(pip[pip->video->p].page,\r
901  pip[!(pip->video->p)].page, x-4, y-4, x-4, y-4, 28, 36);*/\r
902 //      else modexCopyPageRegion(pip[1].page, pip[0].page, x-4, y-4, x-4, y-4, 28, 40);\r
903         switch(ls)\r
904         {\r
905                 case 1:\r
906                         FRAME1\r
907                 break;\r
908                 case 2:\r
909                         FRAME2\r
910                 break;\r
911                 case 3:\r
912                         FRAME3\r
913                 break;\r
914                 case 4:\r
915                         FRAME4\r
916                 break;\r
917         }\r
918 //      if(2>ls && ls>=1) { FRAME1 }else\r
919 //      if(3>ls && ls>=2) { FRAME2 }else\r
920 //      if(4>ls && ls>=3) { FRAME3 }else\r
921 //      if(5>ls && ls>=4) { FRAME4 }\r
922         //modexCopyPageRegion(pip[0].page, pip[3].page, 0, 0, x, y, 16, 32);\r
923         //printf("x=%d  y=%d    bx=%d           by=%d\n", x, y, bx, by);\r
924         pip->video->r=1;\r
925 }\r