OSDN Git Service

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