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