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