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