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