OSDN Git Service

made a new function modexMVSetup() and made scroller use dx and dy on page[0].dx...
[proj16/16.git] / src / lib / scroll16.c
1 /* Project 16 Source Code~\r
2  * Copyright (C) 2012-2016 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
3  *\r
4  * This file is part of Project 16.\r
5  *\r
6  * Project 16 is free software; you can redistribute it and/or modify\r
7  * it under the terms of the GNU General Public License as published by\r
8  * the Free Software Foundation; either version 3 of the License, or\r
9  * (at your option) any later version.\r
10  *\r
11  * Project 16 is distributed in the hope that it will be useful,\r
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14  * GNU General Public License for more details.\r
15  *\r
16  * You should have received a copy of the GNU General Public License\r
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>, or\r
18  * write to the Free Software Foundation, Inc., 51 Franklin Street,\r
19  * Fifth Floor, Boston, MA 02110-1301 USA.\r
20  *\r
21  */\r
22 /*\r
23         scroll16 library~\r
24 */\r
25 #include "src/lib/scroll16.h"\r
26 \r
27 void walk(map_view_t *pip, player_t *player, word pn)\r
28 {\r
29         #define INC_PER_FRAME if(player[pn].q&1) player[pn].persist_aniframe++; if(player[pn].persist_aniframe>4) player[pn].persist_aniframe = 1;\r
30         //printf("player[%d].d=%d\n", pn, player[pn].d);\r
31         switch(player[pn].d)\r
32         {\r
33                 //no direction\r
34                 case 2:\r
35                         //0000pip[0].video->startclk = (*clockw);\r
36                 break;\r
37                 //right movement\r
38                 case 3:\r
39                         //printf("pip[0].page->tilesw=%d        ", pip[0].page->tilesw); printf("pip[0].page->tw=%d\n", pip[0].page->tw);\r
40                         if(pip[0].tx >= 0 && pip[0].tx+pip[0].page->tw < pip[0].map->width && player[pn].tx == pip[0].tx+pip[0].page->tilemidposscreenx &&\r
41                         !(pip[0].map->data[(player[pn].tx)+(pip[0].map->width*(player[pn].ty-1))] == 0))//!(player[pn].tx+1 == TRIGGX && player[pn].ty == TRIGGY))      //collision detection!\r
42                         {\r
43                                 if(player[pn].q<=player[pn].spt)\r
44                                 {\r
45                                         INC_PER_FRAME;\r
46                                         animatePlayer(pip, player, pn, 1);\r
47                                         ScrollRight(pip, player, 3, pn);\r
48                                         ScrollRight(pip, player, 2, pn);\r
49                                         mapScrollRight(pip, player, !(pip[0].video->p), pn);\r
50                                         mapScrollRight(pip, player, (pip[0].video->p), pn);\r
51                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
52                                         player[pn].q++;\r
53                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
54                                 } else { player[pn].q = 1; player[pn].d = 2; player[pn].tx++; }\r
55                         }\r
56                         else if(player[pn].tx < pip[0].map->width && !(pip[0].map->data[(player[pn].tx)+(pip[0].map->width*(player[pn].ty-1))] == 0))//!(player[pn].tx+1 == TRIGGX && player[pn].ty == TRIGGY))\r
57                         {\r
58                                 if(player[pn].q<=player[pn].spt)\r
59                                 {\r
60                                         INC_PER_FRAME;\r
61                                         player[pn].x+=(player[pn].speed);\r
62                                         animatePlayer(pip, player, pn, 0);\r
63                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
64                                         player[pn].q++;\r
65                                 } else { player[pn].q = 1; player[pn].d = 2; player[pn].tx++; }\r
66                         }\r
67                         else\r
68                         {\r
69                                 if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].x, player[pn].y-TILEWH, player[pn].x, player[pn].y-TILEWH, 24, 32);\r
70 #ifdef SPRITE\r
71                                 PBUFSFUN(pip[0].page, player[pn].x, player[pn].y-TILEWH, 24, 32, 24, 32, PLAYERBMPDATA);\r
72 #else\r
73                                 modexClearRegion(pip[1].page, player[pn].x, player[pn].y-TILEWH, 24, 32, 14);\r
74 #endif\r
75                                 if(!pageflipflop) modexShowPage(pip[1].page);\r
76                                 player[pn].d = 2;\r
77                         }\r
78                         player[pn].triggerx = player[pn].tx+1;\r
79                         player[pn].triggery = player[pn].ty;\r
80                 break;\r
81 \r
82                 //left movement\r
83                 case 1:\r
84                         if(pip[0].tx > 0 && pip[0].tx+pip[0].page->tw <= pip[0].map->width && player[pn].tx == pip[0].tx+pip[0].page->tilemidposscreenx &&\r
85                         !(pip[0].map->data[(player[pn].tx-2)+(pip[0].map->width*(player[pn].ty-1))] == 0))//!(player[pn].tx-1 == TRIGGX && player[pn].ty == TRIGGY))    //collision detection!\r
86                         {\r
87                                 if(player[pn].q<=player[pn].spt)\r
88                                 {\r
89                                         INC_PER_FRAME;\r
90                                         animatePlayer(pip, player, pn, 1);\r
91                                         ScrollLeft(pip, player, 3, pn);\r
92                                         ScrollLeft(pip, player, 2, pn);\r
93                                         mapScrollLeft(pip, player, !(pip[0].video->p), pn);\r
94                                         mapScrollLeft(pip, player, (pip[0].video->p), pn);\r
95                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
96                                         player[pn].q++;\r
97                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
98                                 } else { player[pn].q = 1; player[pn].d = 2; player[pn].tx--; }\r
99                         }\r
100                         else if(player[pn].tx > 1 && !(pip[0].map->data[(player[pn].tx-2)+(pip[0].map->width*(player[pn].ty-1))] == 0))//!(player[pn].tx-1 == TRIGGX && player[pn].ty == TRIGGY))\r
101                         {\r
102                                 if(player[pn].q<=player[pn].spt)\r
103                                 {\r
104                                         INC_PER_FRAME;\r
105                                         player[pn].x-=(player[pn].speed);\r
106                                         animatePlayer(pip, player, pn, 0);\r
107                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
108                                         player[pn].q++;\r
109                                 } else { player[pn].q = 1; player[pn].d = 2; player[pn].tx--; }\r
110                         }\r
111                         else\r
112                         {\r
113                                 if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].x, player[pn].y-TILEWH, player[pn].x, player[pn].y-TILEWH, 24, 32);\r
114 #ifdef SPRITE\r
115                                 PBUFSFUN(pip[0].page, player[pn].x, player[pn].y-TILEWH, 24, 96, 24, 32, PLAYERBMPDATA);\r
116 #else\r
117                                 modexClearRegion(pip[1].page, player[pn].x, player[pn].y-TILEWH, 24, 32, 10);\r
118 #endif\r
119                                 if(!pageflipflop) modexShowPage(pip[1].page);\r
120                                 player[pn].d = 2;\r
121                         }\r
122                         player[pn].triggerx = player[pn].tx-1;\r
123                         player[pn].triggery = player[pn].ty;\r
124                 break;\r
125 \r
126                 //down movement\r
127                 case 4:\r
128                         if(pip[0].ty >= 0 && pip[0].ty+pip[0].page->th < pip[0].map->height && player[pn].ty == pip[0].ty+pip[0].page->tilemidposscreeny &&\r
129                         !(pip[0].map->data[(player[pn].tx-1)+(pip[0].map->width*(player[pn].ty))] == 0))//!(player[pn].tx == TRIGGX && player[pn].ty+1 == TRIGGY))      //collision detection!\r
130                         {\r
131                                 if(player[pn].q<=player[pn].spt)\r
132                                 {\r
133                                         INC_PER_FRAME;\r
134                                         animatePlayer(pip, player, pn, 1);\r
135                                         ScrollDown(pip, player, 3, pn);\r
136                                         ScrollDown(pip, player, 2, pn);\r
137                                         mapScrollDown(pip, player, !(pip[0].video->p), pn);\r
138                                         mapScrollDown(pip, player, (pip[0].video->p), pn);\r
139                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
140                                         player[pn].q++;\r
141                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
142                                 } else { player[pn].q = 1; player[pn].d = 2; player[pn].ty++; }\r
143                         }\r
144                         else if(player[pn].ty < pip[0].map->height && !(pip[0].map->data[(player[pn].tx-1)+(pip[0].map->width*(player[pn].ty))] == 0))//!(player[pn].tx == TRIGGX && player[pn].ty+1 == TRIGGY))\r
145                         {\r
146                                 if(player[pn].q<=player[pn].spt)\r
147                                 {\r
148                                         INC_PER_FRAME;\r
149                                         player[pn].y+=(player[pn].speed);\r
150                                         animatePlayer(pip, player, pn, 0);\r
151                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
152                                         player[pn].q++;\r
153                                 } else { player[pn].q = 1; player[pn].d = 2; player[pn].ty++; }\r
154                         }\r
155                         else\r
156                         {\r
157                                 if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].x, player[pn].y-TILEWH, player[pn].x, player[pn].y-TILEWH, 24, 32);\r
158 #ifdef SPRITE\r
159                                 PBUFSFUN(pip[0].page, player[pn].x, player[pn].y-TILEWH, 24, 64, 24, 32, PLAYERBMPDATA);\r
160 #else\r
161                                 modexClearRegion(pip[1].page, player[pn].x, player[pn].y-TILEWH, 24, 32, 9);\r
162 #endif\r
163                                 if(!pageflipflop) modexShowPage(pip[1].page);\r
164                                 player[pn].d = 2;\r
165                         }\r
166                         player[pn].triggerx = player[pn].tx;\r
167                         player[pn].triggery = player[pn].ty+1;\r
168                 break;\r
169 \r
170                 //up movement\r
171                 case 0:\r
172                         if(pip[0].ty > 0 && pip[0].ty+pip[0].page->th <= pip[0].map->height && player[pn].ty == pip[0].ty+pip[0].page->tilemidposscreeny &&\r
173                         !(pip[0].map->data[(player[pn].tx-1)+(pip[0].map->width*(player[pn].ty-2))] == 0))//!(player[pn].tx == TRIGGX && player[pn].ty-1 == TRIGGY))    //collision detection!\r
174                         {\r
175                                 if(player[pn].q<=player[pn].spt)\r
176                                 {\r
177                                         INC_PER_FRAME;\r
178                                         animatePlayer(pip, player, pn, 1);\r
179                                         ScrollUp(pip, player, 3, pn);\r
180                                         ScrollUp(pip, player, 2, pn);\r
181                                         mapScrollUp(pip, player, !(pip[0].video->p), pn);\r
182                                         mapScrollUp(pip, player, (pip[0].video->p), pn);\r
183                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
184                                         player[pn].q++;\r
185                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
186                                 } else { player[pn].q = 1; player[pn].d = 2; player[pn].ty--; }\r
187                         }\r
188                         else if(player[pn].ty > 1 && !(pip[0].map->data[(player[pn].tx-1)+(pip[0].map->width*(player[pn].ty-2))] == 0))//!(player[pn].tx == TRIGGX &&  player[pn].ty-1 == TRIGGY))\r
189                         {\r
190                                 if(player[pn].q<=player[pn].spt)\r
191                                 {\r
192                                         INC_PER_FRAME;\r
193                                         player[pn].y-=(player[pn].speed);\r
194                                         animatePlayer(pip, player, 0, pn);\r
195                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
196                                         player[pn].q++;\r
197                                 } else { player[pn].q = 1; player[pn].d = 2; player[pn].ty--; }\r
198                         }\r
199                         else\r
200                         {\r
201                                 if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].x, player[pn].y-TILEWH, player[pn].x, player[pn].y-TILEWH, 24, 32);\r
202 #ifdef SPRITE\r
203                                 PBUFSFUN(pip[0].page, player[pn].x, player[pn].y-TILEWH, 24, 0, 24, 32, PLAYERBMPDATA);\r
204 #else\r
205                                 modexClearRegion(pip[1].page, player[pn].x, player[pn].y-TILEWH, 24, 32, 12);\r
206 #endif\r
207                                 if(!pageflipflop) modexShowPage(pip[1].page);\r
208                                 player[pn].d = 2;\r
209                         }\r
210                         player[pn].triggerx = player[pn].tx;\r
211                         player[pn].triggery = player[pn].ty-1;\r
212                 break;\r
213         }\r
214 }\r
215 \r
216 //panning page\r
217 void panPageManual(map_view_t *pip, player_t *player, word pn)\r
218 {\r
219         switch(player[pn].d)\r
220         {\r
221                 //right movement\r
222                 case 3:\r
223                         if(pip[pip[0].pan->pn].tx >= 0 && pip[pip[0].pan->pn].tx+pip[pip[0].pan->pn].page->tw < pip[pip[0].pan->pn].page->tilesw)\r
224                         {\r
225                                 if(player[pn].q<=player[pn].spt)\r
226                                 {\r
227                                         pip[pip[0].pan->pn].page->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                                         modexShowPage(pip[pip[0].pan->pn].page);\r
290                                         player[pn].q++;\r
291                                 } else { player[pn].q = 1; player[pn].d = 2; pip[pip[0].pan->pn].tx++; }\r
292                         }\r
293                 break;\r
294 \r
295                 //left movement\r
296                 case 1:\r
297                         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
298                         {\r
299                                 if(player[pn].q<=player[pn].spt)\r
300                                 {\r
301                                         pip[pip[0].pan->pn].page->dx-=4;\r
302                                         //modexShowPageVsync(pip[pip[0].pan->pn].page);\r
303                                         modexShowPage(pip[pip[0].pan->pn].page);\r
304                                         player[pn].q++;\r
305                                 } else { player[pn].q = 1; player[pn].d = 2; pip[pip[0].pan->pn].tx--; }\r
306                         }\r
307                 break;\r
308 \r
309                 //down movement\r
310                 case 4:\r
311                         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
312                         {\r
313                                 if(player[pn].q<=player[pn].spt)\r
314                                 {\r
315                                         pip[pip[0].pan->pn].page->dy+=4;\r
316                                         //modexShowPageVsync(pip[pip[0].pan->pn].page);\r
317                                         modexShowPage(pip[pip[0].pan->pn].page);\r
318                                         player[pn].q++;\r
319                                 } else { player[pn].q = 1; player[pn].d = 2; pip[pip[0].pan->pn].ty++; }\r
320                         }\r
321                 break;\r
322 \r
323                 //up movement\r
324                 case 0:\r
325                         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
326                         {\r
327                                 if(player[pn].q<=player[pn].spt)\r
328                                 {\r
329                                         pip[pip[0].pan->pn].page->dy-=4;\r
330                                         //modexShowPageVsync(pip[pip[0].pan->pn].page);\r
331                                         modexShowPage(pip[pip[0].pan->pn].page);\r
332                                         player[pn].q++;\r
333                                 } else { player[pn].q = 1; player[pn].d = 2; pip[pip[0].pan->pn].ty--; }\r
334                         }\r
335                         break;\r
336         }\r
337         //if (player[pn].d!=2) printf("player[%u].d=%u player[%u].q=%u\n", pn, player[pn].d, pn, player[pn].q);\r
338 }\r
339 \r
340 /*\r
341  * modex mv setup\r
342 */\r
343 void modexMVSetup(map_view_t *pip, map_t *map, pan_t *pan, global_game_variables_t *gv)\r
344 {\r
345         nibble i;\r
346         // 1st page\r
347         pip[0].page = &gv->video.page[0];\r
348         pip[0].map = map;\r
349         pip[0].video = &gv->video;\r
350         pip[0].pan      = pan;\r
351         modexMVInit(pip, 1, 1);\r
352 \r
353         for(i=1;i<gv->video.num_of_pages;i++)\r
354         {\r
355                 pip[i].page     =       &gv->video.page[i];\r
356                 pip[i].map      =       pip[0].map;\r
357                 pip[i].video    =       pip[0].video;\r
358                 pip[i].pan      =       pip[0].pan;\r
359                 pip[i].tx       =       1;\r
360                 pip[i].ty       =       1;\r
361         }\r
362 }\r
363 \r
364 void modexMVInit(map_view_t *pip, int tx, int ty)\r
365 {\r
366         pip[0].tx = tx;\r
367         pip[0].ty = ty;\r
368 }\r
369 \r
370 /*map_t\r
371 allocMap(int w, int h) {\r
372         map_t result;\r
373 \r
374         result.width =w;\r
375         result.height=h;\r
376         result.data = malloc(sizeof(byte) * w * h);\r
377         //result.data = (byte *)alloc_emem(((int)sizeof(byte) * w * h)/1024);\r
378         if(isEMS() || checkEMS())\r
379         {\r
380                 XMOVE mm;\r
381                 //emmhandle = mallocEMS(coretotalEMS());//alloc_emem((int)sizeof(map))\r
382                 mm.length=sizeof(result);\r
383                 mm.sourceH=0;\r
384                 mm.sourceOff=ptr2long(&result);\r
385                 mm.destH=emmhandle;\r
386                 mm.destOff=0;\r
387                 ist = move_emem(&mm);\r
388                 if(!ist){ dealloc_emem(emmhandle); exit(5); }\r
389                 printf("%d\n", coretotalEMS());\r
390         }\r
391 \r
392         return result;\r
393 }*/\r
394 \r
395 /*void\r
396 initMap(map_t *map) {\r
397         // just a place holder to fill out an alternating pattern\r
398         int x, y, xx, yy;\r
399         int i, q;\r
400 //      int tile = 1;\r
401         //if(!isEMS() || !checkEMS())\r
402 //              map->tiles = malloc(sizeof(tiles_t));\r
403         //else\r
404         //      map->tiles = (tiles_t *)alloc_emem(sizeof(tiles_t));\r
405 \r
406          //create the tile set\r
407         //if(!isEMS() || !checkEMS())\r
408 //              map->tiles->data = malloc(sizeof(bitmap_t));\r
409         //else\r
410         //      map->tiles->data = (bitmap_t *)alloc_emem(sizeof(bitmap_t));\r
411 //      map->tiles->data->width = (TILEWH);\r
412 //      map->tiles->data->height= TILEWH;\r
413         //if(!isEMS() || !checkEMS())\r
414 //              map->tiles->data->data = malloc((TILEWH*2)*TILEWH);\r
415         //else\r
416         //      map->tiles->data->data = (byte *)alloc_emem((TILEWH*2)*TILEWH);\r
417 //      map->tiles->tileHeight = TILEWH;\r
418 //      map->tiles->tileWidth =TILEWH;\r
419 //      map->tiles->rows = 1;\r
420 //      map->tiles->cols = 1;//2;\r
421 \r
422         q=0;\r
423         //for(y=0; y<map->height; y++) {\r
424         //for(x=0; x<map->width; x++) {\r
425         i=0;\r
426         for(yy=0; yy<TILEWH; yy++) {\r
427         for(xx=0; xx<(TILEWH); xx++) {\r
428                 //if(x<TILEWH){\r
429                   map->tiles->data->data[i+1] = map->data[q];//28;//0x24;\r
430 //                printf("[%d]", map->tiles->data->data[i]);\r
431                 //}else{\r
432                   //map->tiles->data->data[i] = map->data[q];//0;//0x34;\r
433                   //printf("]%d[==[%d]", i, map->tiles->data->data[i]);\r
434                 //}\r
435                 i++;\r
436         }\r
437 //      printf("\n");\r
438         }\r
439 //      printf("[%d]", map->data[q]);\r
440         q++;\r
441 //      }\r
442         //printf("\n\n");\r
443 //      }\r
444 \r
445         i=0;\r
446         for(y=0; y<map->height; y++) {\r
447                 for(x=0; x<map->width; x++) {\r
448 //                      map->data[i]=255;\r
449                         printf("[%d]", map->data[i]);\r
450                         //tile = tile ? 0 : 1;\r
451                         i++;\r
452                 }\r
453                 //tile = tile ? 0 : 1;\r
454         }\r
455 }*/\r
456 \r
457 void near mapScrollRight(map_view_t *mv, player_t *player, word id, word plid)\r
458 {\r
459         word x;//, y;  /* coordinate for drawing */\r
460 \r
461         /* increment the pixel position and update the page */\r
462         mv[id].page->dx += player[plid].speed;\r
463 \r
464         /* check to see if this changes the tile */\r
465         if(mv[id].page->dx >= mv[id].dxThresh )\r
466         {\r
467         /* go forward one tile */\r
468         mv[id].tx++;\r
469         /* Snap the origin forward */\r
470         mv[id].page->data += 4;\r
471 \r
472         mv[id].page->dx = mv[id].map->tiles->tileWidth;\r
473         }\r
474 \r
475         /* draw the next column */\r
476         x= mv[0].page->sw + mv[id].map->tiles->tileWidth;\r
477         if(player[plid].q%4)\r
478                 if(id==0)\r
479                         mapDrawCol(&mv[0], mv[0].tx + mv[0].page->tw, mv[0].ty-1, x, player, mv->page->dx);\r
480                 else\r
481                         if(!pageflipflop && !pageploop)\r
482                                 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
483         mv[0].video->r=1;\r
484 }\r
485 \r
486 \r
487 void near mapScrollLeft(map_view_t *mv, player_t *player, word id, word plid)\r
488 {\r
489         word x;//,y;  /* coordinate for drawing */\r
490 \r
491         /* decrement the pixel position and update the page */\r
492         mv[id].page->dx -= player[plid].speed;\r
493 \r
494         /* check to see if this changes the tile */\r
495         if(mv[id].page->dx == 0)\r
496         {\r
497         /* go backward one tile */\r
498         mv[id].tx--;\r
499         /* Snap the origin backward */\r
500         mv[id].page->data -= 4;\r
501 \r
502         mv[id].page->dx = mv[id].map->tiles->tileWidth;\r
503         }\r
504 \r
505         /* draw the next column */\r
506         x= 0;\r
507         if(player[plid].q%4)\r
508                 if(id==0)\r
509                         mapDrawCol(&mv[0], mv[0].tx - 1, mv[0].ty-1, x, player, mv->page->dx);\r
510                 else\r
511                         if(!pageflipflop && !pageploop)\r
512                                 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
513         mv[0].video->r=1;\r
514 }\r
515 \r
516 \r
517 void near mapScrollUp(map_view_t *mv, player_t *player, word id, word plid)\r
518 {\r
519         word y;//x,  /* coordinate for drawing */\r
520 \r
521         /* decrement the pixel position and update the page */\r
522         mv[id].page->dy -= player[plid].speed;\r
523 \r
524         /* check to see if this changes the tile */\r
525         if(mv[id].page->dy == 0 )\r
526         {\r
527         /* go down one tile */\r
528         mv[id].ty--;\r
529         /* Snap the origin downward */\r
530         mv[id].page->data -= mv[id].page->pi;\r
531 \r
532         mv[id].page->dy = mv[id].map->tiles->tileHeight;\r
533         }\r
534 \r
535         /* draw the next row */\r
536         y= 0;\r
537         if(player[plid].q%3)\r
538                 if(id==0)\r
539                         mapDrawRow(&mv[0], mv[0].tx - 1, mv[0].ty-1, y, player, mv->page->dy);\r
540                 else\r
541                         if(!pageflipflop && !pageploop)\r
542                                 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
543         mv[0].video->r=1;\r
544 }\r
545 \r
546 void near mapScrollDown(map_view_t *mv, player_t *player, word id, word plid)\r
547 {\r
548         word y;//x,  /* coordinate for drawing */\r
549 \r
550         /* increment the pixel position and update the page */\r
551         mv[id].page->dy += player[plid].speed;\r
552 \r
553         /* check to see if this changes the tile */\r
554         if(mv[id].page->dy >= mv[id].dyThresh )\r
555         {\r
556         /* go down one tile */\r
557         mv[id].ty++;\r
558         /* Snap the origin downward */\r
559         mv[id].page->data += mv[id].page->pi;\r
560 \r
561         mv[id].page->dy = mv[id].map->tiles->tileHeight;\r
562         }\r
563 \r
564         /* draw the next row */\r
565         y= mv[0].page->sh + mv[id].map->tiles->tileHeight;\r
566         if(player[plid].q%3)\r
567                 if(id==0)\r
568                         mapDrawRow(&mv[0], mv[0].tx - 1, mv[0].ty+mv[0].page->th, y, player, mv->page->dy);\r
569                 else\r
570                         if(!pageflipflop && !pageploop)\r
571                                 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
572         mv[0].video->r=1;\r
573 }\r
574 \r
575 \r
576 //TODO finish this wwww\r
577 void near ScrollRight(map_view_t *mv, player_t *player, word id, word plid)\r
578 {\r
579         /* increment the pixel position and update the page */\r
580         mv[id].page->dx += player[plid].speed;\r
581 \r
582         /* check to see if this changes the tile */\r
583         if(mv[id].page->dx >= mv[0].dxThresh )\r
584         {\r
585 //              vga_setup_wm1_block_copy();\r
586 //              _fmemmove(mv[id].page->data+4, mv[id].page->data, mv[id].page->pagesize);\r
587 //              vga_restore_rm0wm0();\r
588                 /* Snap the origin forward */\r
589                 mv[id].page->data += 4;\r
590                 mv[id].page->dx = mv[0].map->tiles->tileWidth;\r
591         }\r
592 }\r
593 \r
594 void near ScrollLeft(map_view_t *mv, player_t *player, word id, word plid)\r
595 {\r
596         /* decrement the pixel position and update the page */\r
597         mv[id].page->dx -= player[plid].speed;\r
598 \r
599         /* check to see if this changes the tile */\r
600         if(mv[id].page->dx == 0)\r
601         {\r
602 //              vga_setup_wm1_block_copy();\r
603 //              _fmemmove(mv[id].page->data-4, mv[id].page->data, mv[id].page->pagesize);\r
604 //              vga_restore_rm0wm0();\r
605                 /* Snap the origin backward */\r
606                 mv[id].page->data -= 4;\r
607                 mv[id].page->dx = mv[0].map->tiles->tileWidth;\r
608         }\r
609 }\r
610 \r
611 void near ScrollUp(map_view_t *mv, player_t *player, word id, word plid)\r
612 {\r
613         /* decrement the pixel position and update the page */\r
614         mv[id].page->dy -= player[plid].speed;\r
615 \r
616         /* check to see if this changes the tile */\r
617         if(mv[id].page->dy == 0)\r
618         {\r
619 //              vga_setup_wm1_block_copy();\r
620 //              _fmemmove(mv[id].page->data-mv[id].page->pi, mv[id].page->data, mv[id].page->pagesize);\r
621 //              vga_restore_rm0wm0();\r
622                 /* Snap the origin backward */\r
623                 mv[id].page->data -= mv[id].page->pi;\r
624                 mv[id].page->dy = mv[0].map->tiles->tileWidth;\r
625         }\r
626 }\r
627 \r
628 void near ScrollDown(map_view_t *mv, player_t *player, word id, word plid)\r
629 {\r
630         /* increment the pixel position and update the page */\r
631         mv[id].page->dy += player[plid].speed;\r
632 \r
633         /* check to see if this changes the tile */\r
634         if(mv[id].page->dy >= mv[0].dxThresh )\r
635         {\r
636 //              vga_setup_wm1_block_copy();\r
637 //              _fmemmove(mv[id].page->data+mv[id].page->pi, mv[id].page->data, mv[id].page->pagesize);\r
638 //              vga_restore_rm0wm0();\r
639                 /* Snap the origin forward */\r
640                 mv[id].page->data += mv[id].page->pi;\r
641                 mv[id].page->dy = mv[0].map->tiles->tileWidth;\r
642         }\r
643 }\r
644 \r
645 sword chkmap(map_t *map, word q)\r
646 {\r
647 //      bitmap_t bp;\r
648         static byte x[(MAPW*MAPH)+1] =\r
649 { 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
650 /*1,    2,      3,      4,      0,      3,      3,      3,      3,      3,      3,      3,      3,      4,      1,      1,      1,      1,      1,      1,      \\r
651 5,      6,      7,      8,      0,      1,      0,      1,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
652 9,      10,     11,     12,     4,      1,      0,      1,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
653 13,     14,     15,     16,     0,      1,      1,      1,      5,      8,      1,      11,     11,     1,      1,      1,      1,      1,      1,      1,      \\r
654 0,      0,      4,      0,      0,      0,      0,      0,      8,      8,      1,      11,     11,     3,      1,      1,      1,      1,      1,      1,      \\r
655 1,      1,      1,      1,      0,      0,      0,      0,      8,      8,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
656 1,      1,      1,      1,      0,      0,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
657 1,      1,      1,      1,      0,      0,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
658 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      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,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
661 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
662 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
663 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
664 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      3,      3,      3,      1,      2,      3,      4 };*/\r
665         //check for failed to load map\r
666         if((map->width == map->height == 0) && (q>0))\r
667         {\r
668                 //initiate a null map!\r
669                 map->width=MAPW;///2;\r
670                 map->height=MAPH;///2;\r
671 //              map->data = malloc(((map->width*map->height)+1)*sizeof(byte));\r
672                 map->data = &x;\r
673                 map->tiles = malloc(sizeof(tiles_t));\r
674                 //fix this to be far~\r
675 //              bp = bitmapLoadPcx("data/ed.pcx");\r
676 //              map->tiles->data = &bp;\r
677 #ifdef __DEBUG_MAP__\r
678                 dbg_mapdata = map->data;\r
679 #endif\r
680                 map->tiles->tileHeight = 16;\r
681                 map->tiles->tileWidth = 16;\r
682                 map->tiles->rows = 1;\r
683                 map->tiles->cols = 1;\r
684 #ifdef __DEBUG_MAP__\r
685                 dbg_maptext = true;\r
686 #endif\r
687         }\r
688 #ifdef __DEBUG_MAP__\r
689         else dbg_maptext = false;\r
690 #endif\r
691         return 0;\r
692 }\r
693 \r
694 //TODO: player position here\r
695 void mapGoTo(map_view_t *mv, int tx, int ty)\r
696 {\r
697         int py;//px,\r
698         unsigned int i;\r
699 \r
700         mapinitmapview(mv, tx, ty);\r
701 \r
702         /* draw the tiles */\r
703         modexClearRegion(mv[0].page, 0, 0, mv[0].page->width, mv[0].page->height, 0);\r
704         py=0;\r
705         i=mv[0].ty * mv[0].map->width + mv[0].tx;\r
706         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
707                 mapDrawWRow(&mv[0], tx-1, ty, py);\r
708         i+=mv->map->width - tx;\r
709         }\r
710         if(!pageploop) modexCopyPageRegion(mv[1].page, mv[0].page, 0, 0, 0, 0, mv[0].page->width, mv[0].page->height);\r
711 //      {\r
712 //              unsigned int k,j,o;\r
713 //              /* fill screen with a distinctive pattern */\r
714 //              for (k=0;k < vga_state.vga_width;k++) {\r
715 //                      o = k >> 2;\r
716 //                      vga_write_sequencer(0x02/*map mask*/,1 << (k&3));\r
717 //                              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
718 //                                      vga_state.vga_graphics_ram[o] = (k^j)&15; // VRL samples put all colors in first 15!\r
719 //              }\r
720 //      }\r
721         modexCopyPageRegion(mv[3].page, mv[0].page, 0/**/, 0/**/, 0, 0, 24, 32);\r
722 }\r
723 \r
724 void mapinitmapview(map_view_t *mv, int tx, int ty)\r
725 {\r
726         /* set up the coordinates */\r
727         mv[0].tx = mv[1].tx = tx;\r
728         mv[0].ty = mv[1].ty = ty;\r
729         mv[0].page->dx = mv[1].page->dx = mv[2].page->dx = mv[3].page->dx = mv->map->tiles->tileWidth;\r
730         mv[0].page->dy = mv[1].page->dy = mv[2].page->dy = mv[3].page->dy = mv->map->tiles->tileHeight;\r
731 \r
732         /* set up the thresholds */\r
733         mv[0].dxThresh = mv[1].dxThresh = mv[2].dxThresh = mv[3].dxThresh = mv->map->tiles->tileWidth * 2;\r
734         mv[0].dyThresh = mv[1].dyThresh = mv[2].dxThresh = mv[3].dxThresh = mv->map->tiles->tileHeight * 2;\r
735 }\r
736 \r
737 void near\r
738 mapDrawTile(tiles_t *t, word i, page_t *page, word x, word y)\r
739 {\r
740         word rx;\r
741         word ry;\r
742         //word textx=0, texty=0;\r
743         //if(i==0) i=2;\r
744         if(i==0)\r
745         {\r
746                 //wwww\r
747                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, 0); //currently the over scan color!\r
748         }\r
749         else\r
750         {\r
751                 rx = (((i-1) % ((t->data->width)/t->tileWidth)) * t->tileWidth);\r
752                 ry = (((i-1) / ((t->data->height)/t->tileHeight)) * t->tileHeight);\r
753 ////0000printf("i=%d\n", i);\r
754 #ifdef __DEBUG_MAP__\r
755                 switch(dbg_maptext)\r
756                 {\r
757                         case 0:\r
758 #endif\r
759 #ifndef TILERENDER\r
760                                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, ((dbg_mapdata[i])+1));\r
761                                 //modexprint(page, x, y, 1, 15, 0, (char const *)(t->debug_data[i]));\r
762 #else\r
763                                 PBUFBFUN                (page, x, y, rx, ry, t->tileWidth, t->tileHeight, (t->data));\r
764                                 /* then the sprite. note modding ram ptr means we just draw to (x&3,0) */\r
765                                 //draw_vrl1_vgax_modex(x-rx,y-ry,vrl_header,vrl_lineoffs,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));\r
766                                 //modexDrawBmpRegion    (page, x, y, rx, ry, t->tileWidth, t->tileHeight, (t->data));\r
767 #endif\r
768 #ifdef __DEBUG_MAP__\r
769                         break;\r
770                         case 1:\r
771                                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, (dbg_mapdata[i])+1);\r
772                                 //modexprintbig(page, x, y, 1, 15, 0, (t->debug_data));\r
773                                 /*for(texty=0; texty<2; texty++)\r
774                                 {\r
775                                         for(textx=0; textx<2; textx++)\r
776                                         {*/\r
777 //                                              modexprint(page, x+(textx*8), y+(texty*8), 1, (word)(t->debug_data), 0, (t->debug_data));\r
778 /*                                      }\r
779                                 }*/\r
780                         break;\r
781                 }\r
782 #endif\r
783         }\r
784 }\r
785 \r
786 void near mapDrawRow(map_view_t *mv, int tx, int ty, word y, player_t *p, word poopoffset)\r
787 {\r
788         word x;\r
789         int i;\r
790         poopoffset%=p[0].speed;\r
791 //printf("y: %d\n", poopoffset);\r
792         /* the position within the map array */\r
793         i=ty * mv->map->width + tx;\r
794         for(x=poopoffset; x<(mv->page->sw+mv->dxThresh)/(poopoffset+1) && tx < mv->map->width; x+=mv->map->tiles->tileWidth, tx++) {\r
795         if(i>=0) {\r
796                 /* we are in the map, so copy! */\r
797                 mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y);\r
798         }\r
799         i++; /* next! */\r
800         }\r
801 }\r
802 \r
803 void near mapDrawCol(map_view_t *mv, int tx, int ty, word x, player_t *p, word poopoffset)\r
804 {\r
805         int y;\r
806         int i;\r
807         poopoffset%=p[0].speed;\r
808 //printf("x: %d\n", poopoffset);\r
809         /* location in the map array */\r
810         i=ty * mv->map->width + tx;\r
811 \r
812         /* We'll copy all of the columns in the screen,\r
813            i + 1 row above and one below */\r
814         for(y=poopoffset; y<(mv->page->sh+mv->dyThresh)/(poopoffset+1) && ty < mv->map->height; y+=mv->map->tiles->tileHeight, ty++) {\r
815         if(i>=0) {\r
816                 /* we are in the map, so copy away! */\r
817                 mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y);\r
818         }\r
819         i += mv->map->width;\r
820         }\r
821 }\r
822 \r
823 void mapDrawWRow(map_view_t *mv, int tx, int ty, word y)\r
824 {\r
825         word x;\r
826         int i;\r
827 \r
828         /* the position within the map array */\r
829         i=ty * mv->map->width + tx;\r
830         for(x=0; x<mv->page->sw+mv->dxThresh && tx < mv->map->width; x+=mv->map->tiles->tileWidth, tx++) {\r
831         if(i>=0) {\r
832                 /* we are in the map, so copy! */\r
833                 mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y);\r
834         }\r
835         i++; /* next! */\r
836         }\r
837 }\r
838 \r
839 void mapDrawWCol(map_view_t *mv, int tx, int ty, word x)\r
840 {\r
841         int y;\r
842         int i;\r
843 \r
844         /* location in the map array */\r
845         i=ty * mv->map->width + tx;\r
846 \r
847         /* We'll copy all of the columns in the screen,\r
848            i + 1 row above and one below */\r
849         for(y=0; y<mv->page->sh+mv->dyThresh && ty < mv->map->height; y+=mv->map->tiles->tileHeight, ty++) {\r
850         if(i>=0) {\r
851                 /* we are in the map, so copy away! */\r
852                 mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y);\r
853         }\r
854         i += mv->map->width;\r
855         }\r
856 }\r
857 \r
858 /*void qclean()\r
859 {\r
860         //setkb(0);\r
861 }*/\r
862 \r
863 unsigned char shinku_fps_indicator_page = 2;\r
864 boolean pageflipflop = 1;\r
865 boolean pageploop = 1;\r
866 \r
867 /*      sync    */\r
868 void shinku(global_game_variables_t *gv)\r
869 {\r
870         word x = (0) + gv->video.page[/*!*/(gv->video.p)].dx; // follow the screen\r
871         word y = (0) + gv->video.page[/*!*/(gv->video.p)].dy; // follow the screen\r
872         word col = 7, bgcol = 0, type = 1;//w = 64, h = 8,\r
873         //byte o,o2,i;\r
874         //modexCopyPageRegion(pip[1].page, pip[2].page, 16, 16, 16, 16, (14*8)+4, 8+4);\r
875         /* block copy to visible RAM from offscreen */\r
876 //      vga_setup_wm1_block_copy();\r
877 //      modexCopyPageRegion(&(gv->video.page[shinku_fps_indicator_page]), &(gv->video.page[!shinku_fps_indicator_page]), x, y, x+w, 0, w, h);\r
878 //      o =     *(gv->video.page[2].data); // source offscreen\r
879 //      o2 =    *(gv->video.page[shinku_fps_indicator_page].data)+(y * vga_state.vga_stride) + (x >> 2); // dest visible (original stride)\r
880 //      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
881         /* must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally */\r
882 //      vga_restore_rm0wm0();\r
883         if(elapsed_timer(gv) >= (1.0 / gv->kurokku.frames_per_second))\r
884         {\r
885         // NTS: For some bizarre reason, gv->pee is not initialized, but the pointer is not NULL even\r
886         //      though it should be. Instead it's NULL as a near pointer but contains a non-null\r
887         //      segment value, so testing against NULL doesn't work. It is initialized properly if\r
888         //      you call start_timer() though which uses near malloc. Rather than fight with that,\r
889         //      I decided it would be better to declare a temp buffer statically and sprintf to that.\r
890         //\r
891         //      This fixes *** Null pointer assignment detected error message in ZCROLL.EXE on exit.\r
892                 sprintf(global_temp_status_text, "%.0f fps", (double)gv->kurokku.tiku/ticktock(gv));\r
893                 //modexClearRegion(&(gv->video.page[shinku_fps_indicator_page]), x, y, w, h, 45);\r
894                 modexprint(&(gv->video.page[/*!*/(gv->video.p)]), x, y, type, col, bgcol, global_temp_status_text);\r
895                 gv->kurokku.tiku=0;\r
896                 /* block copy to visible RAM from offscreen */\r
897 //              vga_setup_wm1_block_copy();\r
898 //              o =     *(gv->video.page[shinku_fps_indicator_page].data); // source offscreen\r
899 //              o2 =    *(gv->video.page[2].data)+(y * vga_state.vga_stride) + (x >> 2); // dest visible (original stride)\r
900 //              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
901 //              modexCopyPageRegion(&(gv->video.page[shinku_fps_indicator_page]), &(gv->video.page[!shinku_fps_indicator_page]), x, y, x, 0, w, h);\r
902                 /* must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally */\r
903 //              vga_restore_rm0wm0();\r
904         }else //copy dat sheet\r
905         gv->kurokku.tiku++;\r
906 \r
907         switch(gv->kurokku.fpscap)\r
908         {\r
909                 case 0:\r
910                         //modexprint(&(gv->video.page[shinku_fps_indicator_page]), x, y+8, type, col, bgcol, "sanic!");\r
911                         gv->kurokku.frames_per_second=1;\r
912                 break;\r
913                 case 1:\r
914                         //turn this off if XT\r
915                         //modexWaitBorder();\r
916                         vga_wait_for_vsync();\r
917                         gv->kurokku.frames_per_second=60;\r
918                 break;\r
919         }\r
920         if(pageflipflop){\r
921         if(gv->video.r){\r
922                 //vga_setup_wm1_block_copy();\r
923                 //_fmemcpy((gv->video.page[(gv->video.p)]).data, (gv->video.page[(!gv->video.p)]).data, gv->video.page[(!gv->video.p)].pagesize);\r
924                 //vga_restore_rm0wm0();\r
925                 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
926                 modexShowPage(&(gv->video.page[gv->video.p]));\r
927                 if(!pageploop) gv->video.p=!gv->video.p;\r
928                 gv->video.r=!gv->video.r;\r
929                 //0000gv->video.tickclk = ((*clockw)-gv->video.startclk)/18.2;\r
930         }\r
931         }\r
932 }\r
933 \r
934 void near animatePlayer(map_view_t *pip, player_t *player, word pn, sword scrollswitch)\r
935 {\r
936         sword x = player[pn].x;\r
937         sword y = player[pn].y;\r
938         sword bx = x+16;        //buffer's x\r
939         sword by = y+16;        //buffer's y\r
940         word dire=32; //direction\r
941         sword qq; //scroll offset\r
942         word ls = player[pn].persist_aniframe;\r
943 \r
944         switch(scrollswitch)\r
945         {\r
946                 case 0:\r
947                         qq = 0;\r
948                 break;\r
949                 default:\r
950                         qq = ((player[pn].q)*(player[pn].speed));\r
951                 break;\r
952         }\r
953         //x-=4;\r
954         y-=pip[0].map->tiles->tileHeight;\r
955         switch (player[pn].d)\r
956         {\r
957                 case 0:\r
958                         //up\r
959                         dire*=player[pn].d;\r
960                         y-=qq;\r
961                         by-=4;\r
962                 break;\r
963                 case 3:\r
964                         // right\r
965                         dire*=(player[pn].d-2);\r
966                         x+=qq;\r
967                         bx+=4;\r
968                 break;\r
969                 case 2:\r
970                 break;\r
971                 case 4:\r
972                         //down\r
973                         dire*=(player[pn].d-2);\r
974                         y+=qq;\r
975                         by+=4;\r
976                 break;\r
977                 case 1:\r
978                         //left\r
979                         dire*=(player[pn].d+2);\r
980                         x-=qq;\r
981                         bx-=4;\r
982                 break;\r
983         }\r
984 \r
985 #ifdef SPRITE\r
986 #define FRAME1 PBUFSFUN(pip[/*!*/(pip->video->p)].page, x, y, 48, dire, 24, 32, PLAYERBMPDATA);\r
987 #define FRAME2 PBUFSFUN(pip[/*!*/(pip->video->p)].page, x, y, 24, dire, 24, 32, PLAYERBMPDATA);\r
988 #define FRAME3 PBUFSFUN(pip[/*!*/(pip->video->p)].page, x, y, 0, dire, 24, 32,  PLAYERBMPDATA);\r
989 #define FRAME4 PBUFSFUN(pip[/*!*/(pip->video->p)].page, x, y, 24, dire, 24, 32, PLAYERBMPDATA);\r
990 #else\r
991 #define FRAME1 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, 2+dire);\r
992 #define FRAME2 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, 1+dire);\r
993 #define FRAME3 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, dire);\r
994 #define FRAME4 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, 1+dire);\r
995 #endif\r
996         if(!pageflipflop)\r
997                 modexCopyPageRegion(pip[1].page, pip[0].page, x-4, y-4, x-4, y-4, 28, 36);\r
998         else{\r
999                 //copy old bg to page0\r
1000                 //modexCopyPageRegion(pip[3].page, pip[0].page, bx, by, 0, 0,   20, 36);\r
1001                 //update buffer\r
1002                 //modexCopyPageRegion(pip[0].page, pip[3].page, 0, 0,   x, y,   20, 36);\r
1003         }\r
1004 //modexCopyPageRegion(page_t *dest, page_t *src, word sx, word sy, word dx, word dy, word width, word height);\r
1005         //modexCopyPageRegion(pip[3].page, pip[!(pip->video->p)].page, x-4, y-4, 0, 128, 28, 36);\r
1006         /*modexCopyPageRegion(pip[pip->video->p].page,\r
1007  pip[!(pip->video->p)].page, x-4, y-4, x-4, y-4, 28, 36);*/\r
1008 //      else modexCopyPageRegion(pip[1].page, pip[0].page, x-4, y-4, x-4, y-4, 28, 40);\r
1009         switch(ls)\r
1010         {\r
1011                 case 1:\r
1012                         FRAME1\r
1013                 break;\r
1014                 case 2:\r
1015                         FRAME2\r
1016                 break;\r
1017                 case 3:\r
1018                         FRAME3\r
1019                 break;\r
1020                 case 4:\r
1021                         FRAME4\r
1022                 break;\r
1023         }\r
1024 //      if(2>ls && ls>=1) { FRAME1 }else\r
1025 //      if(3>ls && ls>=2) { FRAME2 }else\r
1026 //      if(4>ls && ls>=3) { FRAME3 }else\r
1027 //      if(5>ls && ls>=4) { FRAME4 }\r
1028         //modexCopyPageRegion(pip[0].page, pip[3].page, 0, 0, x, y, 24, 32);\r
1029         //printf("x=%d  y=%d    bx=%d           by=%d\n", x, y, bx, by);\r
1030         pip->video->r=1;\r
1031 }\r
1032 \r
1033 /*\r
1034  * from zcroll16.c\r
1035 */\r
1036 \r
1037 boolean boundary_check(int x, int y, int dx, int dy, int h, int w)\r
1038 {\r
1039         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
1040 }\r
1041 \r
1042 boolean coll_check(int x, int y, int dx, int dy, map_view_t *map_v)\r
1043 {\r
1044         // Assume everything crosses at most 1 tile at once\r
1045         return dx && 1;//crossable_tile(x + dx, map_v) || dy && crossable_tile(y + dy, map_v);\r
1046 }\r
1047 \r
1048 boolean ZC_walk(entity_t *ent, map_view_t *map_v)\r
1049 {\r
1050         //return 1;\r
1051         int dx = 1;\r
1052         int dy = 1;\r
1053         switch(ent->d)\r
1054         {\r
1055                 case 2:\r
1056                         return 0;\r
1057                 case 1:\r
1058                         dx = -dx;\r
1059                 case 3:\r
1060                         dy = 0;\r
1061                         break;\r
1062                 case 0:\r
1063                         dy = -dy;\r
1064                 case 4:\r
1065                         dx = 0;\r
1066                         break;\r
1067         }\r
1068         if(coll_check(ent->x, ent->y, dx, dy,  map_v))\r
1069         {\r
1070                 // Allow movement\r
1071                 // Set speed\r
1072                 // Start animation\r
1073                 // Mark next tile as occupied\r
1074                 // Mark this tile as vacant\r
1075                 return 1;\r
1076         }\r
1077         return 0;\r
1078 }\r
1079 \r
1080 void player_walk(player_t *player, map_view_t *map_v){\r
1081         int dx=16, dy=16;\r
1082         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
1083         {\r
1084                 mapScroll(map_v, player);\r
1085                 // (Un)load stuff?\r
1086         }\r
1087 }\r
1088 \r
1089 void near mapScroll(map_view_t *mv, player_t *player)\r
1090 {\r
1091         //word x, y;  /* coordinate for drawing */\r
1092         int c = 1;\r
1093         int delta;\r
1094         mv->delta += player->dx | player->dy;\r
1095         delta = mv->delta;\r
1096         mv->d = (player->dx) ? (player->dx > 0) ? 3 : 1 : (player->dy) ? (player->dy > 0) ? 4 : 0 : 2;\r
1097         switch(mv->d){\r
1098                 case 4:\r
1099                         c = -1;\r
1100                         delta = -delta;\r
1101                 case 0:\r
1102                         if(!(delta + mv->dxThresh))\r
1103                         {\r
1104                                 mv->delta = 0;\r
1105                                 mv->ty += c;\r
1106                         }\r
1107                         break;\r
1108                 case 3:\r
1109                         c = -1;\r
1110                         delta = -delta;\r
1111                 case 1:\r
1112                         if(!(delta + mv->dyThresh))\r
1113                         {\r
1114                                 mv->delta = 0;\r
1115                                 mv->tx += c;\r
1116                         }\r
1117                         break;\r
1118                 default:\r
1119                         break;\r
1120         }\r
1121 \r
1122         mv->video->r=1;\r
1123 }\r