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