]> 4ch.mooo.com Git - 16.git/blob - src/lib/scroll16.c
showing row and colum drawing the fore loop in draw row is causing it to be slow...
[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 #ifdef FULLRCREND\r
432         if(player[plid].enti.q%4)\r
433 #endif\r
434                 if(id==0)\r
435                         mapDrawCol(&mv[0], mv[0].tx + mv[0].page->tw, mv[0].ty-1, x, player, DRAWCOLNUM);\r
436                 else\r
437                         if(!pageflipflop && !pageploop)\r
438                                 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
439         mv[0].video->r=1;\r
440 }\r
441 \r
442 \r
443 void near mapScrollLeft(map_view_t *mv, player_t *player, word id, word plid)\r
444 {\r
445         word x;//,y;  /* coordinate for drawing */\r
446 \r
447         /* decrement the pixel position and update the page */\r
448         mv[id].page[0].dx -= player[plid].enti.speed;\r
449 \r
450         /* check to see if this changes the tile */\r
451         if(mv[id].page[0].dx == 0)\r
452         {\r
453         /* go backward one tile */\r
454         mv[id].tx--;\r
455         /* Snap the origin backward */\r
456         mv[id].page->data -= 4;\r
457 \r
458         mv[id].page[0].dx = mv[id].map->tiles->tileWidth;\r
459         }\r
460 \r
461         /* draw the next column */\r
462         x= 0;\r
463 #ifdef FULLRCREND\r
464         if(player[plid].enti.q%4)\r
465 #endif\r
466                 if(id==0)\r
467                         mapDrawCol(&mv[0], mv[0].tx - 1, mv[0].ty-1, x, player, DRAWCOLNUM);\r
468                 else\r
469                         if(!pageflipflop && !pageploop)\r
470                                 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
471         mv[0].video->r=1;\r
472 }\r
473 \r
474 \r
475 void near mapScrollUp(map_view_t *mv, player_t *player, word id, word plid)\r
476 {\r
477         word y;//x,  /* coordinate for drawing */\r
478 \r
479         /* decrement the pixel position and update the page */\r
480         mv[id].page[0].dy -= player[plid].enti.speed;\r
481 \r
482         /* check to see if this changes the tile */\r
483         if(mv[id].page[0].dy == 0 )\r
484         {\r
485         /* go down one tile */\r
486         mv[id].ty--;\r
487         /* Snap the origin downward */\r
488         mv[id].page->data -= mv[id].page->pi;\r
489 \r
490         mv[id].page[0].dy = mv[id].map->tiles->tileHeight;\r
491         }\r
492 \r
493         /* draw the next row */\r
494         y= 0;\r
495 #ifdef FULLRCREND\r
496         if(player[plid].enti.q%3)\r
497 #endif\r
498                 if(id==0)\r
499                         mapDrawRow(&mv[0], mv[0].tx - 1, mv[0].ty-1, y, player, DRAWCOLNUM);\r
500                 else\r
501                         if(!pageflipflop && !pageploop)\r
502                                 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
503         mv[0].video->r=1;\r
504 }\r
505 \r
506 void near mapScrollDown(map_view_t *mv, player_t *player, word id, word plid)\r
507 {\r
508         word y;//x,  /* coordinate for drawing */\r
509 \r
510         /* increment the pixel position and update the page */\r
511         mv[id].page[0].dy += player[plid].enti.speed;\r
512 \r
513         /* check to see if this changes the tile */\r
514         if(mv[id].page[0].dy >= mv[id].dyThresh )\r
515         {\r
516         /* go down one tile */\r
517         mv[id].ty++;\r
518         /* Snap the origin downward */\r
519         mv[id].page->data += mv[id].page->pi;\r
520 \r
521         mv[id].page[0].dy = mv[id].map->tiles->tileHeight;\r
522         }\r
523 \r
524         /* draw the next row */\r
525         y= mv[0].page->sh + mv[id].map->tiles->tileHeight;\r
526 #ifdef FULLRCREND\r
527         if(player[plid].enti.q%3)\r
528 #endif\r
529                 if(id==0)\r
530                         mapDrawRow(&mv[0], mv[0].tx - 1, mv[0].ty+mv[0].page->th, y, player, DRAWCOLNUM);\r
531                 else\r
532                         if(!pageflipflop && !pageploop)\r
533                                 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
534         mv[0].video->r=1;\r
535 }\r
536 \r
537 \r
538 //TODO finish this wwww\r
539 void near ScrollRight(map_view_t *mv, player_t *player, word id, word plid)\r
540 {\r
541         /* increment the pixel position and update the page */\r
542         mv[id].page->dx += player[plid].enti.speed;\r
543 \r
544         /* check to see if this changes the tile */\r
545         if(mv[id].page->dx >= mv[0].dxThresh )\r
546         {\r
547 //              vga_setup_wm1_block_copy();\r
548 //              _fmemmove(mv[id].page->data+4, mv[id].page->data, mv[id].page->pagesize);\r
549 //              vga_restore_rm0wm0();\r
550                 /* Snap the origin forward */\r
551                 mv[id].page->data += 4;\r
552                 mv[id].page->dx = mv[0].map->tiles->tileWidth;\r
553         }\r
554 }\r
555 \r
556 void near ScrollLeft(map_view_t *mv, player_t *player, word id, word plid)\r
557 {\r
558         /* decrement the pixel position and update the page */\r
559         mv[id].page->dx -= player[plid].enti.speed;\r
560 \r
561         /* check to see if this changes the tile */\r
562         if(mv[id].page->dx == 0)\r
563         {\r
564 //              vga_setup_wm1_block_copy();\r
565 //              _fmemmove(mv[id].page->data-4, mv[id].page->data, mv[id].page->pagesize);\r
566 //              vga_restore_rm0wm0();\r
567                 /* Snap the origin backward */\r
568                 mv[id].page->data -= 4;\r
569                 mv[id].page->dx = mv[0].map->tiles->tileWidth;\r
570         }\r
571 }\r
572 \r
573 void near ScrollUp(map_view_t *mv, player_t *player, word id, word plid)\r
574 {\r
575         /* decrement the pixel position and update the page */\r
576         mv[id].page->dy -= player[plid].enti.speed;\r
577 \r
578         /* check to see if this changes the tile */\r
579         if(mv[id].page->dy == 0)\r
580         {\r
581 //              vga_setup_wm1_block_copy();\r
582 //              _fmemmove(mv[id].page->data-mv[id].page->pi, mv[id].page->data, mv[id].page->pagesize);\r
583 //              vga_restore_rm0wm0();\r
584                 /* Snap the origin backward */\r
585                 mv[id].page->data -= mv[id].page->pi;\r
586                 mv[id].page->dy = mv[0].map->tiles->tileWidth;\r
587         }\r
588 }\r
589 \r
590 void near ScrollDown(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->dy += player[plid].enti.speed;\r
594 \r
595         /* check to see if this changes the tile */\r
596         if(mv[id].page->dy >= mv[0].dxThresh )\r
597         {\r
598 //              vga_setup_wm1_block_copy();\r
599 //              _fmemmove(mv[id].page->data+mv[id].page->pi, 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 += mv[id].page->pi;\r
603                 mv[id].page->dy = mv[0].map->tiles->tileWidth;\r
604         }\r
605 }\r
606 \r
607 //===========================================================================\r
608 //TODO: put player in starting position of assigned spot on map\r
609 //default player position on the viewable map\r
610 void playerXYpos(int x, int y, player_t *player, map_view_t *pip, nibble pn)\r
611 {\r
612         player[pn].enti.tx = x + pip[0].tx + pip[0].page->tilemidposscreenx;\r
613         player[pn].enti.ty = y + pip[0].ty + pip[0].page->tilemidposscreeny;\r
614 }\r
615 //===========================================================================\r
616 \r
617 sword chkmap(map_t *map, word q)\r
618 {\r
619 //      bitmap_t bp;\r
620         static byte x[(MAPW*MAPH)+1] =\r
621 { 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
622 /*1,    2,      3,      4,      0,      3,      3,      3,      3,      3,      3,      3,      3,      4,      1,      1,      1,      1,      1,      1,      \\r
623 5,      6,      7,      8,      0,      1,      0,      1,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
624 9,      10,     11,     12,     4,      1,      0,      1,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
625 13,     14,     15,     16,     0,      1,      1,      1,      5,      8,      1,      11,     11,     1,      1,      1,      1,      1,      1,      1,      \\r
626 0,      0,      4,      0,      0,      0,      0,      0,      8,      8,      1,      11,     11,     3,      1,      1,      1,      1,      1,      1,      \\r
627 1,      1,      1,      1,      0,      0,      0,      0,      8,      8,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
628 1,      1,      1,      1,      0,      0,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
629 1,      1,      1,      1,      0,      0,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
630 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
631 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
632 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
633 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
634 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
635 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
636 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      3,      3,      3,      1,      2,      3,      4 };*/\r
637         //check for failed to load map\r
638         if((map->width == map->height == 0) && (q>0))\r
639         {\r
640                 //initiate a null map!\r
641                 map->width=MAPW;///2;\r
642                 map->height=MAPH;///2;\r
643 //              map->data = malloc(((map->width*map->height)+1)*sizeof(byte));\r
644                 map->data = &x;\r
645                 map->tiles = malloc(sizeof(tiles_t));\r
646                 //fix this to be far~\r
647 //              bp = bitmapLoadPcx("data/ed.pcx");\r
648 //              map->tiles->data = &bp;\r
649 #ifdef __DEBUG_MAP__\r
650                 dbg_mapdata = map->data;\r
651 #endif\r
652                 map->tiles->tileHeight = 16;\r
653                 map->tiles->tileWidth = 16;\r
654                 map->tiles->rows = 1;\r
655                 map->tiles->cols = 1;\r
656 #ifdef __DEBUG_MAP__\r
657                 dbg_maptext = true;\r
658 #endif\r
659         }\r
660 #ifdef __DEBUG_MAP__\r
661         else dbg_maptext = false;\r
662 #endif\r
663         return 0;\r
664 }\r
665 \r
666 //TODO: player position here\r
667 void mapGoTo(map_view_t *mv, int tx, int ty)\r
668 {\r
669         int py;//px,\r
670         unsigned int i;\r
671 \r
672         mapinitmapview(mv, tx, ty);\r
673 \r
674         /* draw the tiles */\r
675         modexClearRegion(mv[0].page, 0, 0, mv[0].page->width, mv[0].page->height, 0);\r
676         py=0;\r
677         i=mv[0].ty * mv[0].map->width + mv[0].tx;\r
678         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
679                 mapDrawWRow(&mv[0], tx-1, ty, py);\r
680         i+=mv->map->width - tx;\r
681         }\r
682         if(!pageploop)\r
683                 modexCopyPageRegion(mv[1].page, mv[0].page, 0, 0, 0, 0, mv[0].page->width, mv[0].page->height);\r
684 //      {\r
685 //              unsigned int k,j,o;\r
686 //              /* fill screen with a distinctive pattern */\r
687 //              for (k=0;k < vga_state.vga_width;k++) {\r
688 //                      o = k >> 2;\r
689 //                      vga_write_sequencer(0x02/*map mask*/,1 << (k&3));\r
690 //                              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
691 //                                      vga_state.vga_graphics_ram[o] = (k^j)&15; // VRL samples put all colors in first 15!\r
692 //              }\r
693 //      }\r
694         modexCopyPageRegion(mv[3].page, mv[0].page, 0/**/, 0/**/, 0, 0, 24, 32);\r
695 }\r
696 \r
697 void mapinitmapview(map_view_t *mv, int tx, int ty)\r
698 {\r
699         /* set up the coordinates */\r
700         mv[0].tx = mv[1].tx = tx;\r
701         mv[0].ty = mv[1].ty = ty;\r
702         mv[0].page->dx = mv[1].page->dx = mv[2].page->dx = mv[3].page->dx = mv->map->tiles->tileWidth;\r
703         mv[0].page->dy = mv[1].page->dy = mv[2].page->dy = mv[3].page->dy = mv->map->tiles->tileHeight;\r
704 \r
705         /* set up the thresholds */\r
706         mv[0].dxThresh = mv[1].dxThresh = mv[2].dxThresh = mv[3].dxThresh = mv->map->tiles->tileWidth * 2;\r
707         mv[0].dyThresh = mv[1].dyThresh = mv[2].dxThresh = mv[3].dxThresh = mv->map->tiles->tileHeight * 2;\r
708 }\r
709 \r
710 void near\r
711 mapDrawTile(tiles_t *t, word i, page_t *page, word x, word y)\r
712 {\r
713         word rx;\r
714         word ry;\r
715         //word textx=0, texty=0;\r
716         //if(i==0) i=2;\r
717         if(i==0)\r
718         {\r
719                 //wwww\r
720                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, 1); //currently the over scan color!\r
721         }\r
722         else\r
723         {\r
724                 rx = (((i-1) % ((t->data->width)/t->tileWidth)) * t->tileWidth);\r
725                 ry = (((i-1) / ((t->data->height)/t->tileHeight)) * t->tileHeight);\r
726 ////0000printf("i=%d\n", i);\r
727 #ifdef __DEBUG_MAP__\r
728                 switch(dbg_maptext)\r
729                 {\r
730                         case 0:\r
731 #endif\r
732 #ifndef TILERENDER\r
733                                 if(!pagenorendermap) modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, ((dbg_mapdata[i])+1));\r
734                                 //modexprint(page, x, y, 1, 15, 0, (char const *)(t->debug_data[i]));\r
735 #else\r
736                                 modexDrawBmpRegion              (page, x, y, rx, ry, t->tileWidth, t->tileHeight, (t->data));\r
737                                 /* then the sprite. note modding ram ptr means we just draw to (x&3,0) */\r
738                                 //draw_vrl1_vgax_modex(x-rx,y-ry,vrl_header,vrl_lineoffs,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));\r
739                                 //modexDrawBmpRegion    (page, x, y, rx, ry, t->tileWidth, t->tileHeight, (t->data));\r
740 #endif\r
741 #ifdef __DEBUG_MAP__\r
742                         break;\r
743                         case 1:\r
744                                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, (dbg_mapdata[i])+1);\r
745                                 //modexprintbig(page, x, y, 1, 15, 0, (t->debug_data));\r
746                                 /*for(texty=0; texty<2; texty++)\r
747                                 {\r
748                                         for(textx=0; textx<2; textx++)\r
749                                         {*/\r
750 //                                              modexprint(page, x+(textx*8), y+(texty*8), 1, (word)(t->debug_data), 0, (t->debug_data));\r
751 /*                                      }\r
752                                 }*/\r
753                         break;\r
754                 }\r
755 #endif\r
756         }\r
757 }\r
758 \r
759 char global_temp_status_textR[512];\r
760 char global_temp_status_textC[512];\r
761 \r
762 void near mapDrawRow(map_view_t *mv, int tx, int ty, word y, player_t *player, word poopoffset)\r
763 {\r
764         int x, i;\r
765 if(pagedelayrendermap)\r
766         if(!y)  y+=TILEWH;\r
767         else    y-=TILEWH;\r
768 \r
769         poopoffset%=player[0].enti.speed; poopoffset++;\r
770 //printf("y: %d\n", poopoffset);\r
771         sprintf(global_temp_status_textR, "y:%u", poopoffset); modexprint(mv[0].page, player[0].enti.x, player[0].enti.y-28-(poopoffset*8), 1, 2, 1, global_temp_status_textR);\r
772         /* the position within the map array */\r
773         i=ty * mv->map->width + tx;\r
774 \r
775 \r
776 \r
777         for(    x=poopoffset*mv->map->tiles->tileWidth;\r
778                 x<(mv->page->sw+mv->dxThresh)/(poopoffset+1) && tx < mv->map->width;\r
779                 x+=mv->map->tiles->tileWidth, tx++) {\r
780                 if(i>=0) {\r
781                         if(pagedelayrendermap) delay(20);\r
782                         /* we are in the map, so copy! */\r
783                         mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y);\r
784                 }\r
785                 i++; /* next! */\r
786         }\r
787 }\r
788 \r
789 void near mapDrawCol(map_view_t *mv, int tx, int ty, word x, player_t *player, word poopoffset)\r
790 {\r
791         int y, i;\r
792 if(pagedelayrendermap)\r
793         if(!x)  x+=TILEWH;\r
794         else    x-=TILEWH;\r
795 \r
796         poopoffset%=player[0].enti.speed; poopoffset++;\r
797 //printf("x: %d\n", poopoffset);\r
798         sprintf(global_temp_status_textR, "x:%u", poopoffset); modexprint(mv[0].page, player[0].enti.x, player[0].enti.y-28-(poopoffset*8), 1, 2, 1, global_temp_status_textR);\r
799         /* location in the map array */\r
800         i=ty * mv->map->width + tx;\r
801 \r
802         /* We'll copy all of the columns in the screen,\r
803            i + 1 row above and one below */\r
804         for(    y=poopoffset*mv->map->tiles->tileHeight;\r
805                 y<(mv->page->sh+mv->dyThresh)/(poopoffset+1) && ty < mv->map->height;\r
806                 y+=mv->map->tiles->tileHeight, ty++) {\r
807                 if(i>=0) {\r
808                         if(pagedelayrendermap) delay(20);\r
809                         /* we are in the map, so copy away! */\r
810                         mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y);\r
811                 }\r
812                 i += mv->map->width;\r
813         }\r
814 }\r
815 \r
816 void mapDrawWRow(map_view_t *mv, int tx, int ty, word y)\r
817 {\r
818         word x;\r
819         int i;\r
820 \r
821         /* the position within the map array */\r
822         i=ty * mv->map->width + tx;\r
823         for(x=0; x<mv->page->sw+mv->dxThresh && tx < mv->map->width; x+=mv->map->tiles->tileWidth, tx++) {\r
824         if(i>=0) {\r
825                 /* we are in the map, so copy! */\r
826                 mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y);\r
827         }\r
828         i++; /* next! */\r
829         }\r
830 }\r
831 \r
832 void mapDrawWCol(map_view_t *mv, int tx, int ty, word x)\r
833 {\r
834         int y;\r
835         int i;\r
836 \r
837         /* location in the map array */\r
838         i=ty * mv->map->width + tx;\r
839 \r
840         /* We'll copy all of the columns in the screen,\r
841            i + 1 row above and one below */\r
842         for(y=0; y<mv->page->sh+mv->dyThresh && ty < mv->map->height; y+=mv->map->tiles->tileHeight, ty++) {\r
843         if(i>=0) {\r
844                 /* we are in the map, so copy away! */\r
845                 mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y);\r
846         }\r
847         i += mv->map->width;\r
848         }\r
849 }\r
850 \r
851 /*void qclean()\r
852 {\r
853         //setkb(0);\r
854 }*/\r
855 \r
856 boolean pageflipflop = 1;\r
857 boolean pageploop = 1;\r
858 boolean pagenorendermap = 0;\r
859 boolean pagedelayrendermap = 0;\r
860 \r
861 /*      sync    */\r
862 void shinku(global_game_variables_t *gv)\r
863 {\r
864         word x = (0) + gv->video.page[/*!*/(gv->video.p)].dx; // follow the screen\r
865         word y = (0) + gv->video.page[/*!*/(gv->video.p)].dy; // follow the screen\r
866         word col = 2, bgcol = 1, type = 1;//w = 64, h = 8, //col7bgcol0\r
867         //byte o,o2,i;\r
868         //modexCopyPageRegion(pip[1].page, pip[2].page, 16, 16, 16, 16, (14*8)+4, 8+4);\r
869         /* block copy to visible RAM from offscreen */\r
870 //      vga_setup_wm1_block_copy();\r
871 //      modexCopyPageRegion(&(gv->video.page[gv->video->sfip]), &(gv->video.page[!gv->video->sfip]), x, y, x+w, 0, w, h);\r
872 //      o =     *(gv->video.page[2].data); // source offscreen\r
873 //      o2 =    *(gv->video.page[gv->video->sfip].data)+(y * vga_state.vga_stride) + (x >> 2); // dest visible (original stride)\r
874 //      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
875         /* must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally */\r
876 //      vga_restore_rm0wm0();\r
877         if(elapsed_timer(gv) >= (1.0 / gv->kurokku.frames_per_second))\r
878         {\r
879         // NTS: For some bizarre reason, gv->pee is not initialized, but the pointer is not NULL even\r
880         //      though it should be. Instead it's NULL as a neAr pointer but contains a non-null\r
881         //      segment value, so testing against NULL doesn't work. It is initialized properly if\r
882         //      you call start_timer() though which uses neAr malloc. Rather than fight with that,\r
883         //      I decided it would be better to declare a temp buffer statically and sprintf to that.\r
884         //\r
885         //      This fixes *** Null pointer assignment detected error message in ZCROLL.EXE on exit.\r
886                 sprintf(global_temp_status_text, "%.0f fps", (double)gv->kurokku.tiku/ticktock(gv));\r
887                 //modexClearRegion(&(gv->video.page[gv->video->sfip]), x, y, w, h, 45);\r
888                 modexprint(&(gv->video.page[/*!*/(gv->video.p)]), x, y, type, col, bgcol, global_temp_status_text);\r
889                 gv->kurokku.tiku=0;\r
890                 /* block copy to visible RAM from offscreen */\r
891 //              vga_setup_wm1_block_copy();\r
892 //              o =     *(gv->video.page[gv->video->sfip].data); // source offscreen\r
893 //              o2 =    *(gv->video.page[2].data)+(y * vga_state.vga_stride) + (x >> 2); // dest visible (original stride)\r
894 //              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
895 //              modexCopyPageRegion(&(gv->video.page[gv->video->sfip]), &(gv->video.page[!gv->video->sfip]), x, y, x, 0, w, h);\r
896                 /* must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally */\r
897 //              vga_restore_rm0wm0();\r
898         }else //copy dat sheet\r
899         gv->kurokku.tiku++;\r
900 \r
901         switch(gv->kurokku.fpscap)\r
902         {\r
903                 case 0:\r
904                         //modexprint(&(gv->video.page[gv->video->sfip]), x, y+8, type, col, bgcol, "sanic!");\r
905                         gv->kurokku.frames_per_second=1;\r
906                 break;\r
907                 case 1:\r
908                         //turn this off if XT\r
909                         //modexWaitBorder();\r
910                         //vga_wait_for_vsync();\r
911                         gv->kurokku.frames_per_second=60;\r
912                 break;\r
913         }\r
914         //render!!\r
915         if(pageflipflop){\r
916         if(gv->video.r ){//r=1\r
917                 //vga_setup_wm1_block_copy();\r
918                 //_fmemcpy((gv->video.page[(gv->video.p)]).data, (gv->video.page[(!gv->video.p)]).data, gv->video.page[(!gv->video.p)].pagesize);\r
919                 //vga_restore_rm0wm0();\r
920                 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
921                 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
922                 if(!pageploop) gv->video.p=!gv->video.p;\r
923                 gv->video.r =!gv->video.r ;\r
924                 //0000gv->video.tickclk = ((*clockw)-gv->video.startclk)/18.2;\r
925         }\r
926         }\r
927 }\r
928 \r
929 void near ZC_drawframe(map_view_t *pip, entity_t *enti, sword x, sword y)\r
930 {\r
931         switch(pip[0].video->rss)\r
932         {\r
933                 case 0:\r
934                         animate_spri(enti, pip->video);\r
935                 break;\r
936                 case 1:\r
937                         animate_spri(enti, pip->video);\r
938                 break;\r
939 //              case 2:\r
940 //                      modexClearRegion(&(pip[0].page[0]), x, y, 16, 32, player[pn].enti.dire);\r
941 //              break;\r
942         }\r
943 }\r
944 \r
945 #ifdef SPRITE\r
946 #define FRAME1 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 48, player[pn].enti.dire, 24, 32,    PLAYERBMPDATAPTR);\r
947 #define FRAME2 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, player[pn].enti.dire, 24, 32,    PLAYERBMPDATAPTR);\r
948 #define FRAME3 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 0, player[pn].enti.dire, 24, 32,     PLAYERBMPDATAPTR);\r
949 #define FRAME4 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, player[pn].enti.dire, 24, 32,    PLAYERBMPDATAPTR);\r
950 #else\r
951 #define FRAME1 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, 2+player[pn].enti.dire);\r
952 #define FRAME2 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, 1+player[pn].enti.dire);\r
953 #define FRAME3 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, player[pn].enti.dire);\r
954 #define FRAME4 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, 1+player[pn].enti.dire);\r
955 #endif\r
956 \r
957 void animatePlayer(map_view_t *pip, player_t *player, word pn, sword scrollswitch)\r
958 {\r
959         sword x = player[pn].enti.x;\r
960         sword y = player[pn].enti.y;\r
961         sword bx = x+16;        //buffer's x\r
962         sword by = y+16;        //buffer's y\r
963         sword qq; //scroll offset\r
964         word ls = 0;//player[pn].enti.persist_aniframe;\r
965         player[pn].enti.dire=32; //direction\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].enti.q)*(player[pn].enti.speed));\r
974                 break;\r
975         }\r
976         //x-=4;\r
977         y-=pip[0].map->tiles->tileHeight;\r
978         switch (player[pn].enti.d)\r
979         {\r
980                 case 0:\r
981                         //up\r
982                         player[pn].enti.dire*=player[pn].enti.d;\r
983                         y-=qq;\r
984                         by-=4;\r
985                 break;\r
986                 case 3:\r
987                         // right\r
988                         player[pn].enti.dire*=(player[pn].enti.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                         player[pn].enti.dire*=(player[pn].enti.d-2);\r
997                         y+=qq;\r
998                         by+=4;\r
999                 break;\r
1000                 case 1:\r
1001                         //left\r
1002                         player[pn].enti.dire*=(player[pn].enti.d+2);\r
1003                         x-=qq;\r
1004                         bx-=4;\r
1005                 break;\r
1006         }\r
1007 \r
1008         if(!pageflipflop)\r
1009                 modexCopyPageRegion(pip[1].page, pip[0].page, x-4, y-4, x-4, y-4, 28, 36);\r
1010         else{\r
1011                 //copy old bg to page0\r
1012                 //modexCopyPageRegion(pip[3].page, pip[0].page, bx, by, 0, 0,   20, 36);\r
1013                 //update buffer\r
1014                 //modexCopyPageRegion(pip[0].page, pip[3].page, 0, 0,   x, y,   20, 36);\r
1015         }\r
1016 //modexCopyPageRegion(page_t *dest, page_t *src, word sx, word sy, word dx, word dy, word width, word height);\r
1017         //modexCopyPageRegion(pip[3].page, pip[!(pip->video->p)].page, x-4, y-4, 0, 128, 28, 36);\r
1018         /*modexCopyPageRegion(pip[pip->video->p].page,\r
1019  pip[!(pip->video->p)].page, x-4, y-4, x-4, y-4, 28, 36);*/\r
1020 //      else modexCopyPageRegion(pip[1].page, pip[0].page, x-4, y-4, x-4, y-4, 28, 40);\r
1021         switch(ls)\r
1022         {\r
1023                 case 1:\r
1024                         FRAME1\r
1025                 break;\r
1026                 case 2:\r
1027                         FRAME2\r
1028                 break;\r
1029                 case 3:\r
1030                         FRAME3\r
1031                 break;\r
1032                 case 4:\r
1033                         FRAME4\r
1034                 break;\r
1035         }\r
1036 //      if(2>ls && ls>=1) { FRAME1 }else\r
1037 //      if(3>ls && ls>=2) { FRAME2 }else\r
1038 //      if(4>ls && ls>=3) { FRAME3 }else\r
1039 //      if(5>ls && ls>=4) { FRAME4 }\r
1040         //modexCopyPageRegion(pip[0].page, pip[3].page, 0, 0, x, y, 24, 32);\r
1041         //printf("x=%d  y=%d    bx=%d           by=%d\n", x, y, bx, by);\r
1042         pip->video->r=1;\r
1043 }\r
1044 \r
1045 void near ZC_animatePlayer(map_view_t *pip, player_t *player, word pn, sword scrollswitch)\r
1046 {\r
1047         sword x = player[pn].enti.x;\r
1048         sword y = player[pn].enti.y;\r
1049         sword qq,dd; //scroll offset\r
1050         player[pn].enti.dire=10; //direction\r
1051 \r
1052         switch(scrollswitch)\r
1053         {\r
1054                 case 0:\r
1055                         dd = 0;\r
1056                         qq = 0;\r
1057                 break;\r
1058                 case 1:\r
1059                         dd = 1;\r
1060                         qq = 0;\r
1061                 break;\r
1062                 case 2:\r
1063                         dd = 1;\r
1064                         qq = ((player[pn].enti.q)*(player[pn].enti.speed));\r
1065                 break;\r
1066         }\r
1067         x-=4;\r
1068         y-=pip[0].map->tiles->tileHeight;\r
1069         switch (player[pn].enti.d)\r
1070         {\r
1071                 case 0:\r
1072                         //up\r
1073                         player[pn].enti.dire*=player[pn].enti.d+1;\r
1074                         y-=qq;\r
1075                 break;\r
1076                 case 3:\r
1077                         // right\r
1078                         player[pn].enti.dire*=(player[pn].enti.d-1);\r
1079                         x+=qq;\r
1080                 break;\r
1081                 case 2:\r
1082                 break;\r
1083                 case 4:\r
1084                         //down\r
1085                         player[pn].enti.dire*=(player[pn].enti.d-1);\r
1086                         y+=qq;\r
1087                 break;\r
1088                 case 1:\r
1089                         //left\r
1090                         player[pn].enti.dire*=(player[pn].enti.d+3);\r
1091                         x-=qq;\r
1092                 break;\r
1093         }\r
1094         player[pn].enti.dire+=dd;\r
1095         if((player[pn].enti.q==1 && player[pn].enti.pred != player[pn].enti.d) || !dd)\r
1096         {\r
1097                 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
1098                 player[pn].enti.pred = player[pn].enti.d;\r
1099         }\r
1100 \r
1101         //setting xy position\r
1102         player[pn].enti.spri->x = x;\r
1103         player[pn].enti.spri->y = y;\r
1104 \r
1105         //draw sprite\r
1106         ZC_drawframe(pip, &player[pn].enti, x, y);\r
1107 //0000if(player[pn].enti.q<2) delay(200);\r
1108         pip->video->r=1;\r
1109 }\r
1110 \r
1111 /*\r
1112  * from zcroll16.c\r
1113 */\r
1114 \r
1115 boolean boundary_check(int x, int y, int dx, int dy, int h, int w)\r
1116 {\r
1117         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
1118 }\r
1119 \r
1120 boolean coll_check(int x, int y, int dx, int dy, map_view_t *map_v)\r
1121 {\r
1122         // Assume everything crosses at most 1 tile at once\r
1123         return dx && 1;//crossable_tile(x + dx, map_v) || dy && crossable_tile(y + dy, map_v);\r
1124 }\r
1125 \r
1126 boolean ZC_walk2(entity_t *enti, map_view_t *map_v)\r
1127 {\r
1128         //return 1;\r
1129         int dx = 1;\r
1130         int dy = 1;\r
1131         switch(enti->d)\r
1132         {\r
1133                 case 2:\r
1134                         return 0;\r
1135                 case 1:\r
1136                         dx = -dx;\r
1137                 case 3:\r
1138                         dy = 0;\r
1139                         break;\r
1140                 case 0:\r
1141                         dy = -dy;\r
1142                 case 4:\r
1143                         dx = 0;\r
1144                         break;\r
1145         }\r
1146         if(coll_check(enti->x, enti->y, dx, dy,  map_v))\r
1147         {\r
1148                 // Allow movement\r
1149                 // Set speed\r
1150                 // Start animation\r
1151                 // Mark next tile as occupied\r
1152                 // Mark this tile as vacant\r
1153                 return 1;\r
1154         }\r
1155         return 0;\r
1156 }\r
1157 \r
1158 void player_walk(player_t *player, map_view_t *map_v){\r
1159         int dx=16, dy=16;\r
1160         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
1161         {\r
1162                 mapScroll(map_v, player);\r
1163                 // (Un)load stuff?\r
1164         }\r
1165 }\r
1166 \r
1167 void mapScroll(map_view_t *mv, player_t *player)\r
1168 {\r
1169         //word x, y;  /* coordinate for drawing */\r
1170         int c = 1;\r
1171         int delta;\r
1172         mv->delta += player->dx | player->dy;\r
1173         delta = mv->delta;\r
1174         mv->d = (player->dx) ? (player->dx > 0) ? 3 : 1 : (player->dy) ? (player->dy > 0) ? 4 : 0 : 2;\r
1175         switch(mv->d){\r
1176                 case 4:\r
1177                         c = -1;\r
1178                         delta = -delta;\r
1179                 case 0:\r
1180                         if(!(delta + mv->dxThresh))\r
1181                         {\r
1182                                 mv->delta = 0;\r
1183                                 mv->ty += c;\r
1184                         }\r
1185                         break;\r
1186                 case 3:\r
1187                         c = -1;\r
1188                         delta = -delta;\r
1189                 case 1:\r
1190                         if(!(delta + mv->dyThresh))\r
1191                         {\r
1192                                 mv->delta = 0;\r
1193                                 mv->tx += c;\r
1194                         }\r
1195                         break;\r
1196                 default:\r
1197                         break;\r
1198         }\r
1199 \r
1200         mv->video->r=1;\r
1201 }\r