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