OSDN Git Service

going to work on bg draw today!
[proj16/16.git] / src / lib / scroll16.c
1 /* Project 16 Source Code~\r
2  * Copyright (C) 2012-2016 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
3  *\r
4  * This file is part of Project 16.\r
5  *\r
6  * Project 16 is free software; you can redistribute it and/or modify\r
7  * it under the terms of the GNU General Public License as published by\r
8  * the Free Software Foundation; either version 3 of the License, or\r
9  * (at your option) any later version.\r
10  *\r
11  * Project 16 is distributed in the hope that it will be useful,\r
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14  * GNU General Public License for more details.\r
15  *\r
16  * You should have received a copy of the GNU General Public License\r
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>, or\r
18  * write to the Free Software Foundation, Inc., 51 Franklin Street,\r
19  * Fifth Floor, Boston, MA 02110-1301 USA.\r
20  *\r
21  */\r
22 /*\r
23         scroll16 library~\r
24 */\r
25 #include "src/lib/scroll16.h"\r
26 \r
27 //#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->ti.tw < pip[0].map->width && player[pn].enti.tx == pip[0].tx+pip[0].page->ti.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->ti.tw <= pip[0].map->width && player[pn].enti.tx == pip[0].tx+pip[0].page->ti.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->ti.th < pip[0].map->height && player[pn].enti.ty == pip[0].ty+pip[0].page->ti.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->ti.th <= pip[0].map->height && player[pn].enti.ty == pip[0].ty+pip[0].page->ti.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->ti.tw < pip[0].page->ti.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->ti.tw <= pip[0].page->ti.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->ti.th < pip[0].page->ti.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->ti.th <= pip[0].page->ti.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].p        = &gv->video.p;\r
261         pip[0].sp       = &gv->video.sp;\r
262         ZC_MVInit(pip, 1, 1);\r
263 \r
264         for(i=ZC_MVI;i<gv->video.num_of_pages;i++)\r
265         {\r
266                 pip[i].page     =       &gv->video.page[i];\r
267                 pip[i].map      =       pip[0].map;\r
268                 pip[i].video    =       pip[0].video;\r
269                 pip[i].p        =       pip[0].p;\r
270                 pip[i].sp       =       pip[0].sp;\r
271 //              if(i>ZC_MVI) {\r
272                 pip[i].tx =     1;\r
273                 pip[i].ty =     1;\r
274 //              }\r
275         }\r
276 }\r
277 \r
278 void ZC_MVInit(map_view_t *pip, int tx, int ty)\r
279 {\r
280         pip[0].tx = tx;\r
281         pip[0].ty = ty;\r
282         //pip[0].tx = pip[1].tx = tx;\r
283         //pip[0].ty = pip[1].ty = ty;\r
284 }\r
285 \r
286 void ZC_ShowMV(map_view_t *moo, boolean vsync, boolean sr)\r
287 {\r
288         word high_address, low_address, offset;\r
289         byte crtcOffset;\r
290 \r
291         /* calculate offset */\r
292         offset = (word) moo[moo[0].video->sp].page->data;\r
293         offset += moo[0].page->dy * (moo[0].page->width >> 2 );\r
294         offset += moo[0].page->dx >> 2;\r
295 \r
296         /* calculate crtcOffset according to virtual width */\r
297         switch(sr)\r
298         {\r
299                 case 1:\r
300                         crtcOffset = moo[moo[0].video->sp].page->sw >> 3;\r
301                 break;\r
302                 default:\r
303                 case 0:\r
304                         crtcOffset = moo[0].page->width >> 3;\r
305                 break;\r
306         }\r
307 \r
308         high_address = HIGH_ADDRESS | (offset & 0xff00);\r
309         low_address  = LOW_ADDRESS  | (offset << 8);\r
310 \r
311         /* wait for appropriate timing and then program CRTC */\r
312         if(vsync) while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE));\r
313         outpw(CRTC_INDEX, high_address);\r
314         outpw(CRTC_INDEX, low_address);\r
315         outp(CRTC_INDEX, 0x13);\r
316         outp(CRTC_DATA, crtcOffset);\r
317 \r
318         /* wait for one retrace */\r
319         if(vsync) while (!(inp(INPUT_STATUS_1) & VRETRACE));\r
320 \r
321         /* do PEL panning here */\r
322         outp(AC_INDEX, 0x33);\r
323         outp(AC_INDEX, (moo[0].page->dx & 0x03) << 1);\r
324 }\r
325 \r
326 /*map_t\r
327 allocMap(int w, int h) {\r
328         map_t result;\r
329 \r
330         result.width =w;\r
331         result.height=h;\r
332         result.data = malloc(sizeof(byte) * w * h);\r
333         //result.data = (byte *)alloc_emem(((int)sizeof(byte) * w * h)/1024);\r
334         if(isEMS() || checkEMS())\r
335         {\r
336                 XMOVE mm;\r
337                 //emmhandle = mallocEMS(coretotalEMS());//alloc_emem((int)sizeof(map))\r
338                 mm.length=sizeof(result);\r
339                 mm.sourceH=0;\r
340                 mm.sourceOff=ptr2long(&result);\r
341                 mm.destH=emmhandle;\r
342                 mm.destOff=0;\r
343                 ist = move_emem(&mm);\r
344                 if(!ist){ dealloc_emem(emmhandle); exit(5); }\r
345                 printf("%d\n", coretotalEMS());\r
346         }\r
347 \r
348         return result;\r
349 }*/\r
350 \r
351 /*void\r
352 initMap(map_t *map) {\r
353         // just a place holder to fill out an alternating pattern\r
354         int x, y, xx, yy;\r
355         int i, q;\r
356 //      int tile = 1;\r
357         //if(!isEMS() || !checkEMS())\r
358 //              map->tiles = malloc(sizeof(tiles_t));\r
359         //else\r
360         //      map->tiles = (tiles_t *)alloc_emem(sizeof(tiles_t));\r
361 \r
362          //create the tile set\r
363         //if(!isEMS() || !checkEMS())\r
364 //              map->tiles->data = malloc(sizeof(bitmap_t));\r
365         //else\r
366         //      map->tiles->data = (bitmap_t *)alloc_emem(sizeof(bitmap_t));\r
367 //      map->tiles->data->width = (TILEWH);\r
368 //      map->tiles->data->height= TILEWH;\r
369         //if(!isEMS() || !checkEMS())\r
370 //              map->tiles->data->data = malloc((TILEWH*2)*TILEWH);\r
371         //else\r
372         //      map->tiles->data->data = (byte *)alloc_emem((TILEWH*2)*TILEWH);\r
373 //      map->tiles->tileHeight = TILEWH;\r
374 //      map->tiles->tileWidth =TILEWH;\r
375 //      map->tiles->rows = 1;\r
376 //      map->tiles->cols = 1;//2;\r
377 \r
378         q=0;\r
379         //for(y=0; y<map->height; y++) {\r
380         //for(x=0; x<map->width; x++) {\r
381         i=0;\r
382         for(yy=0; yy<TILEWH; yy++) {\r
383         for(xx=0; xx<(TILEWH); xx++) {\r
384                 //if(x<TILEWH){\r
385                   map->tiles->data->data[i+1] = map->data[q];//28;//0x24;\r
386 //                printf("[%d]", map->tiles->data->data[i]);\r
387                 //}else{\r
388                   //map->tiles->data->data[i] = map->data[q];//0;//0x34;\r
389                   //printf("]%d[==[%d]", i, map->tiles->data->data[i]);\r
390                 //}\r
391                 i++;\r
392         }\r
393 //      printf("\n");\r
394         }\r
395 //      printf("[%d]", map->data[q]);\r
396         q++;\r
397 //      }\r
398         //printf("\n\n");\r
399 //      }\r
400 \r
401         i=0;\r
402         for(y=0; y<map->height; y++) {\r
403                 for(x=0; x<map->width; x++) {\r
404 //                      map->data[i]=255;\r
405                         printf("[%d]", map->data[i]);\r
406                         //tile = tile ? 0 : 1;\r
407                         i++;\r
408                 }\r
409                 //tile = tile ? 0 : 1;\r
410         }\r
411 }*/\r
412 \r
413 void near mapScrollRight(map_view_t *mv, player_t *player, word id, word plid)\r
414 {\r
415         word x;//, y;  /* coordinate for drawing */\r
416 \r
417         /* increment the pixel position and update the page */\r
418         mv[id].page[0].dx += player[plid].enti.speed;\r
419 \r
420         /* check to see if this changes the tile */\r
421         if(mv[id].page[0].dx >= mv[id].dxThresh )\r
422         {\r
423         /* go forward one tile */\r
424         mv[id].tx++;\r
425         /* Snap the origin forward */\r
426         mv[id].page->data += 4;\r
427 \r
428         mv[id].page[0].dx = mv[id].map->tiles->tileWidth;\r
429         }\r
430 \r
431         /* draw the next column */\r
432         x= mv[0].page->sw + mv[id].map->tiles->tileWidth;\r
433 #ifndef FULLRCREND\r
434         if(player[plid].enti.q%4)\r
435 #else\r
436         if(player[plid].enti.q==4)\r
437 #endif\r
438                 if(id==0)\r
439                         mapDrawCol(&mv[0], mv[0].tx + mv[0].page->ti.tw, mv[0].ty-1, x, player, DRAWCOLNUM);\r
440 //              else\r
441 //                      if(!pageflipflop && !pageploop)\r
442 //                              modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[id].map->tiles->tileWidth, mv[id].map->tiles->tileHeight*(mv[0].page->ti.th+2));\r
443         mv[0].video->r=1;\r
444 }\r
445 \r
446 \r
447 void near mapScrollLeft(map_view_t *mv, player_t *player, word id, word plid)\r
448 {\r
449         word x;//,y;  /* coordinate for drawing */\r
450 \r
451         /* decrement the pixel position and update the page */\r
452         mv[id].page[0].dx -= player[plid].enti.speed;\r
453 \r
454         /* check to see if this changes the tile */\r
455         if(mv[id].page[0].dx == 0)\r
456         {\r
457         /* go backward one tile */\r
458         mv[id].tx--;\r
459         /* Snap the origin backward */\r
460         mv[id].page->data -= 4;\r
461 \r
462         mv[id].page[0].dx = mv[id].map->tiles->tileWidth;\r
463         }\r
464 \r
465         /* draw the next column */\r
466         x= 0;\r
467 #ifndef FULLRCREND\r
468         if(player[plid].enti.q%4)\r
469 #else\r
470         if(player[plid].enti.q==4)\r
471 #endif\r
472                 if(id==0)\r
473                         mapDrawCol(&mv[0], mv[0].tx - 1, mv[0].ty-1, x, player, DRAWCOLNUM);\r
474 //              else\r
475 //                      if(!pageflipflop && !pageploop)\r
476 //                              modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[id].map->tiles->tileWidth, mv[id].map->tiles->tileHeight*(mv[0].page->ti.th+2));\r
477         mv[0].video->r=1;\r
478 }\r
479 \r
480 \r
481 void near mapScrollUp(map_view_t *mv, player_t *player, word id, word plid)\r
482 {\r
483         word y;//x,  /* coordinate for drawing */\r
484 \r
485         /* decrement the pixel position and update the page */\r
486         mv[id].page[0].dy -= player[plid].enti.speed;\r
487 \r
488         /* check to see if this changes the tile */\r
489         if(mv[id].page[0].dy == 0 )\r
490         {\r
491         /* go up one tile */\r
492         mv[id].ty--;\r
493         /* Snap the origin upward */\r
494         mv[id].page->data -= mv[id].page->pi;\r
495 \r
496         mv[id].page[0].dy = mv[id].map->tiles->tileHeight;\r
497         }\r
498 \r
499         /* draw the next row */\r
500         y= 0;\r
501 #ifndef FULLRCREND\r
502         if(player[plid].enti.q%3)\r
503 #else\r
504         if(player[plid].enti.q==4)\r
505 #endif\r
506                 if(id==0)\r
507                         mapDrawRow(&mv[0], mv[0].tx - 1, mv[0].ty-1, y, player, DRAWCOLNUM);\r
508 //              else\r
509 //                      if(!pageflipflop && !pageploop)\r
510 //                              modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[id].map->tiles->tileWidth*(mv[0].page->ti.tw+2), mv[id].map->tiles->tileHeight);\r
511         mv[0].video->r=1;\r
512 }\r
513 \r
514 \r
515 void near mapScrollDown(map_view_t *mv, player_t *player, word id, word plid)\r
516 {\r
517         word y;//x,  /* coordinate for drawing */\r
518 \r
519         /* increment the pixel position and update the page */\r
520         mv[id].page[0].dy += player[plid].enti.speed;\r
521 \r
522         /* check to see if this changes the tile */\r
523         if(mv[id].page[0].dy >= mv[id].dyThresh )\r
524         {\r
525         /* go down one tile */\r
526         mv[id].ty++;\r
527         /* Snap the origin downward */\r
528         mv[id].page->data += mv[id].page->pi;\r
529 \r
530         mv[id].page[0].dy = mv[id].map->tiles->tileHeight;\r
531         }\r
532 \r
533         /* draw the next row */\r
534         y= mv[0].page->sh + mv[id].map->tiles->tileHeight;\r
535 #ifndef FULLRCREND\r
536         if(player[plid].enti.q%3)\r
537 #else\r
538         if(player[plid].enti.q==4)\r
539 #endif\r
540                 if(id==0)\r
541                         mapDrawRow(&mv[0], mv[0].tx - 1, mv[0].ty+mv[0].page->ti.th, y, player, DRAWCOLNUM);\r
542 //              else\r
543 //                      if(!pageflipflop && !pageploop)\r
544 //                              modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[id].map->tiles->tileWidth*(mv[0].page->ti.tw+2), mv[id].map->tiles->tileHeight);\r
545         mv[0].video->r=1;\r
546 }\r
547 \r
548 \r
549 //TODO finish this wwww\r
550 void near ScrollRight(map_view_t *mv, player_t *player, word id, word plid)\r
551 {\r
552         /* increment the pixel position and update the page */\r
553         mv[id].page->dx += player[plid].enti.speed;\r
554 \r
555         /* check to see if this changes the tile */\r
556         if(mv[id].page->dx >= mv[0].dxThresh )\r
557         {\r
558 //              vga_setup_wm1_block_copy();\r
559 //              _fmemmove(mv[id].page->data+4, mv[id].page->data, mv[id].page->pagesize);\r
560 //              vga_restore_rm0wm0();\r
561                 /* Snap the origin forward */\r
562                 mv[id].page->data += 4;\r
563                 mv[id].page->dx = mv[0].map->tiles->tileWidth;\r
564         }\r
565 }\r
566 \r
567 void near ScrollLeft(map_view_t *mv, player_t *player, word id, word plid)\r
568 {\r
569         /* decrement the pixel position and update the page */\r
570         mv[id].page->dx -= player[plid].enti.speed;\r
571 \r
572         /* check to see if this changes the tile */\r
573         if(mv[id].page->dx == 0)\r
574         {\r
575 //              vga_setup_wm1_block_copy();\r
576 //              _fmemmove(mv[id].page->data-4, mv[id].page->data, mv[id].page->pagesize);\r
577 //              vga_restore_rm0wm0();\r
578                 /* Snap the origin backward */\r
579                 mv[id].page->data -= 4;\r
580                 mv[id].page->dx = mv[0].map->tiles->tileWidth;\r
581         }\r
582 }\r
583 \r
584 void near ScrollUp(map_view_t *mv, player_t *player, word id, word plid)\r
585 {\r
586         /* decrement the pixel position and update the page */\r
587         mv[id].page->dy -= player[plid].enti.speed;\r
588 \r
589         /* check to see if this changes the tile */\r
590         if(mv[id].page->dy == 0)\r
591         {\r
592 //              vga_setup_wm1_block_copy();\r
593 //              _fmemmove(mv[id].page->data-mv[id].page->pi, mv[id].page->data, mv[id].page->pagesize);\r
594 //              vga_restore_rm0wm0();\r
595                 /* Snap the origin backward */\r
596                 mv[id].page->data -= mv[id].page->pi;\r
597                 mv[id].page->dy = mv[0].map->tiles->tileWidth;\r
598         }\r
599 }\r
600 \r
601 void near ScrollDown(map_view_t *mv, player_t *player, word id, word plid)\r
602 {\r
603         /* increment the pixel position and update the page */\r
604         mv[id].page->dy += player[plid].enti.speed;\r
605 \r
606         /* check to see if this changes the tile */\r
607         if(mv[id].page->dy >= mv[0].dxThresh )\r
608         {\r
609 //              vga_setup_wm1_block_copy();\r
610 //              _fmemmove(mv[id].page->data+mv[id].page->pi, mv[id].page->data, mv[id].page->pagesize);\r
611 //              vga_restore_rm0wm0();\r
612                 /* Snap the origin forward */\r
613                 mv[id].page->data += mv[id].page->pi;\r
614                 mv[id].page->dy = mv[0].map->tiles->tileWidth;\r
615         }\r
616 }\r
617 \r
618 //===========================================================================\r
619 //TODO: put player in starting position of assigned spot on map\r
620 //default player position on the viewable map\r
621 void playerXYpos(int x, int y, player_t *player, map_view_t *pip, nibble pn)\r
622 {\r
623         player[pn].enti.tx = x + pip[0].tx + pip[0].page->ti.tilemidposscreenx;\r
624         player[pn].enti.ty = y + pip[0].ty + pip[0].page->ti.tilemidposscreeny;\r
625 }\r
626 //===========================================================================\r
627 \r
628 sword chkmap(map_t *map, word q)\r
629 {\r
630 //      bitmap_t bp;\r
631         static byte x[(MAPW*MAPH)+1] =\r
632 { 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
633 /*1,    2,      3,      4,      0,      3,      3,      3,      3,      3,      3,      3,      3,      4,      1,      1,      1,      1,      1,      1,      \\r
634 5,      6,      7,      8,      0,      1,      0,      1,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
635 9,      10,     11,     12,     4,      1,      0,      1,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
636 13,     14,     15,     16,     0,      1,      1,      1,      5,      8,      1,      11,     11,     1,      1,      1,      1,      1,      1,      1,      \\r
637 0,      0,      4,      0,      0,      0,      0,      0,      8,      8,      1,      11,     11,     3,      1,      1,      1,      1,      1,      1,      \\r
638 1,      1,      1,      1,      0,      0,      0,      0,      8,      8,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
639 1,      1,      1,      1,      0,      0,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
640 1,      1,      1,      1,      0,      0,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
641 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      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,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
646 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
647 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      3,      3,      3,      1,      2,      3,      4 };*/\r
648         //check for failed to load map\r
649         if((map->width == map->height == 0) && (q>0))\r
650         {\r
651                 //initiate a null map!\r
652                 map->width=MAPW;///2;\r
653                 map->height=MAPH;///2;\r
654 //              map->data = malloc(((map->width*map->height)+1)*sizeof(byte));\r
655                 map->data = &x;\r
656                 map->tiles = malloc(sizeof(tiles_t));\r
657                 //fix this to be far~\r
658 //              bp = bitmapLoadPcx("data/ed.pcx");\r
659 //              map->tiles->data = &bp;\r
660 #ifdef __DEBUG_MAP__\r
661                 dbg_mapdata = map->data;\r
662 #endif\r
663                 map->tiles->tileHeight = 16;\r
664                 map->tiles->tileWidth = 16;\r
665                 map->tiles->rows = 1;\r
666                 map->tiles->cols = 1;\r
667 #ifdef __DEBUG_MAP__\r
668                 dbg_maptext = true;\r
669 #endif\r
670         }\r
671 #ifdef __DEBUG_MAP__\r
672         else dbg_maptext = false;\r
673 #endif\r
674         return 0;\r
675 }\r
676 \r
677 //TODO: player position here\r
678 void mapGoTo(map_view_t *mv, int tx, int ty)\r
679 {\r
680         int py;//px,\r
681         unsigned int i;\r
682 \r
683         mapinitmapview(mv, tx, ty);\r
684 \r
685         /* draw the tiles */\r
686         modexClearRegion(mv[0].page, 0, 0, mv[0].page->width, mv[0].page->height, 0);\r
687         py=0;\r
688         i=mv[0].ty * mv[0].map->width + mv[0].tx;\r
689         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
690                 mapDrawWRow(&mv[0], tx-1, ty, py);\r
691         i+=mv->map->width - tx;\r
692         }\r
693 //      if(!pageploop) modexCopyPageRegion(mv[1].page, mv[0].page, 0, 0, 0, 0, mv[0].page->width, mv[0].page->height);\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 void near mapDrawRow(map_view_t *mv, int tx, int ty, word y, player_t *player, word poopoffset)\r
760 {\r
761         int i;\r
762 if(pagedelayrendermap)          if(!y)  y+=TILEWH;      else    y-=TILEWH;\r
763         poopoffset%=player[0].enti.speed;\r
764 //printf("y: %d\n", poopoffset);\r
765 if(pagedelayrendermap){ sprintf(global_temp_status_text, "%-3u", mv->dx); modexprint(mv[0].page, player[0].enti.x, player[0].enti.y-28-(poopoffset*8) , 1, 2, 1, global_temp_status_text); }\r
766         /* the position within the map array */\r
767         i=ty * mv->map->width + tx;\r
768         for(    mv->dx=poopoffset;      mv->dx<(mv->page->sw+mv->dxThresh)/(poopoffset+1) && tx < mv->map->width;       mv->dx+=mv->map->tiles->tileWidth, tx++) {\r
769                 if(i>=0)        /* we are in the map, so copy away! */\r
770                         mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, mv->dx, y);\r
771                 i++; /* next! */\r
772         }\r
773 //if(pagedelayrendermap) delay(200);\r
774 }\r
775 \r
776 void near mapDrawCol(map_view_t *mv, int tx, int ty, word x, player_t *player, word poopoffset)\r
777 {\r
778         int i;\r
779 if(pagedelayrendermap)          if(!x)  x+=TILEWH;              else    x-=TILEWH;\r
780         poopoffset%=player[0].enti.speed;\r
781 //printf("x: %d\n", poopoffset);\r
782 if(pagedelayrendermap){ sprintf(global_temp_status_text, "%-3u", mv->dy); modexprint(mv[0].page, player[0].enti.x, player[0].enti.y-28-(poopoffset*8) , 1, 2, 1, global_temp_status_text); }\r
783         /* location in the map array */\r
784         i=ty * mv->map->width + tx;\r
785         /* We'll copy all of the columns in the screen,\r
786            i + 1 row above and one below */\r
787         for(    mv->dy=poopoffset;      mv->dy<(mv->page->sh+mv->dyThresh)/(poopoffset+1) && ty < mv->map->height;      mv->dy+=mv->map->tiles->tileHeight, ty++) {\r
788                 if(i>=0)        /* we are in the map, so copy away! */\r
789                         mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, mv->dy);\r
790                 i += mv->map->width;\r
791         }\r
792 //if(pagedelayrendermap) delay(200);\r
793 }\r
794 \r
795 void mapDrawWRow(map_view_t *mv, int tx, int ty, word y)\r
796 {\r
797         int i;\r
798 \r
799         /* the position within the map array */\r
800         i=ty * mv->map->width + tx;\r
801         for(mv->dx=0; mv->dx<mv->page->sw+mv->dxThresh && tx < mv->map->width; mv->dx+=mv->map->tiles->tileWidth, tx++) {\r
802                 if(i>=0)        /* we are in the map, so copy! */\r
803                         mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, mv->dx, y);\r
804                 i++; /* next! */\r
805         }\r
806 }\r
807 \r
808 void mapDrawWCol(map_view_t *mv, int tx, int ty, word x)\r
809 {\r
810         int i;\r
811 \r
812         /* location in the map array */\r
813         i=ty * mv->map->width + tx;\r
814 \r
815         /* We'll copy all of the columns in the screen,\r
816            i + 1 row above and one below */\r
817         for(mv->dy=0; mv->dy<mv->page->sh+mv->dyThresh && ty < mv->map->height; mv->dy+=mv->map->tiles->tileHeight, ty++) {\r
818                 if(i>=0)        /* we are in the map, so copy away! */\r
819                         mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, mv->dy);\r
820                 i += mv->map->width;\r
821         }\r
822 }\r
823 \r
824 /*void qclean()\r
825 {\r
826         //setkb(0);\r
827 }*/\r
828 \r
829 //boolean pageflipflop = 1;\r
830 //boolean pageploop = 1;\r
831 boolean pagenorendermap = 0;\r
832 boolean pagedelayrendermap = 0;\r
833 \r
834 /*      sync    */\r
835 void shinku(global_game_variables_t *gv)\r
836 {\r
837         word x = (0) + gv->video.page[/*!*/(gv->video.p)].dx; // follow the screen\r
838         word y = (0) + gv->video.page[/*!*/(gv->video.p)].dy; // follow the screen\r
839         word col = 2, bgcol = 1, type = 1;//w = 64, h = 8, //col7bgcol0\r
840         //byte o,o2,i;\r
841         //modexCopyPageRegion(pip[1].page, pip[2].page, 16, 16, 16, 16, (14*8)+4, 8+4);\r
842         /* block copy to visible RAM from offscreen */\r
843 //      vga_setup_wm1_block_copy();\r
844 //      modexCopyPageRegion(&(gv->video.page[gv->video->sfip]), &(gv->video.page[!gv->video->sfip]), x, y, x+w, 0, w, h);\r
845 //      o =     *(gv->video.page[2].data); // source offscreen\r
846 //      o2 =    *(gv->video.page[gv->video->sfip].data)+(y * vga_state.vga_stride) + (x >> 2); // dest visible (original stride)\r
847 //      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
848         /* must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally */\r
849 //      vga_restore_rm0wm0();\r
850         if(elapsed_timer(gv) >= (1.0 / gv->kurokku.frames_per_second))\r
851         {\r
852         // NTS: For some bizarre reason, gv->pee is not initialized, but the pointer is not NULL even\r
853         //      though it should be. Instead it's NULL as a neAr pointer but contains a non-null\r
854         //      segment value, so testing against NULL doesn't work. It is initialized properly if\r
855         //      you call start_timer() though which uses neAr malloc. Rather than fight with that,\r
856         //      I decided it would be better to declare a temp buffer statically and sprintf to that.\r
857         //\r
858         //      This fixes *** Null pointer assignment detected error message in ZCROLL.EXE on exit.\r
859                 sprintf(global_temp_status_text, "%.0f fps", (double)gv->kurokku.tiku/ticktock(gv));\r
860                 //modexClearRegion(&(gv->video.page[gv->video->sfip]), x, y, w, h, 45);\r
861                 modexprint(&(gv->video.page[/*!*/(gv->video.p)]), x, y, type, col, bgcol, global_temp_status_text);\r
862                 gv->kurokku.tiku=0;\r
863                 /* block copy to visible RAM from offscreen */\r
864 //              vga_setup_wm1_block_copy();\r
865 //              o =     *(gv->video.page[gv->video->sfip].data); // source offscreen\r
866 //              o2 =    *(gv->video.page[2].data)+(y * vga_state.vga_stride) + (x >> 2); // dest visible (original stride)\r
867 //              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
868 //              modexCopyPageRegion(&(gv->video.page[gv->video->sfip]), &(gv->video.page[!gv->video->sfip]), x, y, x, 0, w, h);\r
869                 /* must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally */\r
870 //              vga_restore_rm0wm0();\r
871         }else //copy dat sheet\r
872         gv->kurokku.tiku++;\r
873 \r
874         switch(gv->kurokku.fpscap)\r
875         {\r
876                 case 0:\r
877                         //modexprint(&(gv->video.page[gv->video->sfip]), x, y+8, type, col, bgcol, "sanic!");\r
878                         gv->kurokku.frames_per_second=1;\r
879                 break;\r
880                 case 1:\r
881                         //turn this off if XT\r
882                         //modexWaitBorder();\r
883                         //vga_wait_for_vsync();\r
884                         gv->kurokku.frames_per_second=60;\r
885                 break;\r
886         }\r
887         //render!!\r
888 //      if(pageflipflop){\r
889         if(gv->video.r ){//r=1\r
890                 //vga_setup_wm1_block_copy();\r
891                 //_fmemcpy((gv->video.page[(gv->video.p)]).data, (gv->video.page[(!gv->video.p)]).data, gv->video.page[(!gv->video.p)].pagesize);\r
892                 //vga_restore_rm0wm0();\r
893 //              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
894                 VL_ShowPage(&(gv->video.page[gv->video.sp]), gv->kurokku.fpscap, 0);\r
895 //              if(!pageploop) gv->video.p=!gv->video.p;\r
896                 gv->video.r =!gv->video.r ;\r
897                 //0000gv->video.tickclk = ((*clockw)-gv->video.startclk)/18.2;\r
898 //      }\r
899         }\r
900 }\r
901 \r
902 void near ZC_drawframe(map_view_t *pip, entity_t *enti, sword x, sword y)\r
903 {\r
904         switch(pip[0].video->rss)\r
905         {\r
906                 case 0:\r
907                         animate_spri(enti, pip->video);\r
908                 break;\r
909                 case 1:\r
910                         animate_spri(enti, pip->video);\r
911                 break;\r
912 //              case 2:\r
913 //                      modexClearRegion(&(pip[0].page[0]), x, y, 16, 32, player[pn].enti.dire);\r
914 //              break;\r
915         }\r
916 }\r
917 \r
918 #ifdef SPRITE\r
919 #define FRAME1 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 48, player[pn].enti.dire, 24, 32,    PLAYERBMPDATAPTR);\r
920 #define FRAME2 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, player[pn].enti.dire, 24, 32,    PLAYERBMPDATAPTR);\r
921 #define FRAME3 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 0, player[pn].enti.dire, 24, 32,     PLAYERBMPDATAPTR);\r
922 #define FRAME4 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, player[pn].enti.dire, 24, 32,    PLAYERBMPDATAPTR);\r
923 #else\r
924 #define FRAME1 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, 2+player[pn].enti.dire);\r
925 #define FRAME2 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, 1+player[pn].enti.dire);\r
926 #define FRAME3 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, player[pn].enti.dire);\r
927 #define FRAME4 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, 1+player[pn].enti.dire);\r
928 #endif\r
929 \r
930 void animatePlayer(map_view_t *pip, player_t *player, word pn, sword scrollswitch)\r
931 {\r
932         sword x = player[pn].enti.x;\r
933         sword y = player[pn].enti.y;\r
934         sword bx = x+16;        //buffer's x\r
935         sword by = y+16;        //buffer's y\r
936         sword qq; //scroll offset\r
937         word ls = 0;//player[pn].enti.persist_aniframe;\r
938         player[pn].enti.dire=32; //direction\r
939 \r
940         switch(scrollswitch)\r
941         {\r
942                 case 0:\r
943                         qq = 0;\r
944                 break;\r
945                 default:\r
946                         qq = ((player[pn].enti.q)*(player[pn].enti.speed));\r
947                 break;\r
948         }\r
949         //x-=4;\r
950         y-=pip[0].map->tiles->tileHeight;\r
951         switch (player[pn].enti.d)\r
952         {\r
953                 case 0:\r
954                         //up\r
955                         player[pn].enti.dire*=player[pn].enti.d;\r
956                         y-=qq;\r
957                         by-=4;\r
958                 break;\r
959                 case 3:\r
960                         // right\r
961                         player[pn].enti.dire*=(player[pn].enti.d-2);\r
962                         x+=qq;\r
963                         bx+=4;\r
964                 break;\r
965                 case 2:\r
966                 break;\r
967                 case 4:\r
968                         //down\r
969                         player[pn].enti.dire*=(player[pn].enti.d-2);\r
970                         y+=qq;\r
971                         by+=4;\r
972                 break;\r
973                 case 1:\r
974                         //left\r
975                         player[pn].enti.dire*=(player[pn].enti.d+2);\r
976                         x-=qq;\r
977                         bx-=4;\r
978                 break;\r
979         }\r
980 \r
981 //      if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, x-4, y-4, x-4, y-4, 28, 36);\r
982 //      else{\r
983 //              //copy old bg to page0\r
984 //              //modexCopyPageRegion(pip[3].page, pip[0].page, bx, by, 0, 0,   20, 36);\r
985 //              //update buffer\r
986 //              //modexCopyPageRegion(pip[0].page, pip[3].page, 0, 0,   x, y,   20, 36);\r
987 //      }\r
988 //modexCopyPageRegion(page_t *dest, page_t *src, word sx, word sy, word dx, word dy, word width, word height);\r
989         //modexCopyPageRegion(pip[3].page, pip[!(pip->video->p)].page, x-4, y-4, 0, 128, 28, 36);\r
990         /*modexCopyPageRegion(pip[pip->video->p].page,\r
991  pip[!(pip->video->p)].page, x-4, y-4, x-4, y-4, 28, 36);*/\r
992 //      else modexCopyPageRegion(pip[1].page, pip[0].page, x-4, y-4, x-4, y-4, 28, 40);\r
993         switch(ls)\r
994         {\r
995                 case 1:\r
996                         FRAME1\r
997                 break;\r
998                 case 2:\r
999                         FRAME2\r
1000                 break;\r
1001                 case 3:\r
1002                         FRAME3\r
1003                 break;\r
1004                 case 4:\r
1005                         FRAME4\r
1006                 break;\r
1007         }\r
1008 //      if(2>ls && ls>=1) { FRAME1 }else\r
1009 //      if(3>ls && ls>=2) { FRAME2 }else\r
1010 //      if(4>ls && ls>=3) { FRAME3 }else\r
1011 //      if(5>ls && ls>=4) { FRAME4 }\r
1012         //modexCopyPageRegion(pip[0].page, pip[3].page, 0, 0, x, y, 24, 32);\r
1013         //printf("x=%d  y=%d    bx=%d           by=%d\n", x, y, bx, by);\r
1014         pip->video->r=1;\r
1015 }\r
1016 \r
1017 void near ZC_animatePlayer(map_view_t *pip, player_t *player, word pn, sword scrollswitch)\r
1018 {\r
1019         sword x = player[pn].enti.x;\r
1020         sword y = player[pn].enti.y;\r
1021         sword qq,dd; //scroll offset\r
1022         player[pn].enti.dire=10; //direction\r
1023 \r
1024         switch(scrollswitch)\r
1025         {\r
1026                 case 0:\r
1027                         dd = 0;\r
1028                         qq = 0;\r
1029                 break;\r
1030                 case 1:\r
1031                         dd = 1;\r
1032                         qq = 0;\r
1033                 break;\r
1034                 case 2:\r
1035                         dd = 1;\r
1036                         qq = ((player[pn].enti.q)*(player[pn].enti.speed));\r
1037                 break;\r
1038         }\r
1039         x-=4;\r
1040         y-=pip[0].map->tiles->tileHeight;\r
1041         switch (player[pn].enti.d)\r
1042         {\r
1043                 case 0:\r
1044                         //up\r
1045                         player[pn].enti.dire*=player[pn].enti.d+1;\r
1046                         y-=qq;\r
1047                 break;\r
1048                 case 3:\r
1049                         // right\r
1050                         player[pn].enti.dire*=(player[pn].enti.d-1);\r
1051                         x+=qq;\r
1052                 break;\r
1053                 case 2:\r
1054                 break;\r
1055                 case 4:\r
1056                         //down\r
1057                         player[pn].enti.dire*=(player[pn].enti.d-1);\r
1058                         y+=qq;\r
1059                 break;\r
1060                 case 1:\r
1061                         //left\r
1062                         player[pn].enti.dire*=(player[pn].enti.d+3);\r
1063                         x-=qq;\r
1064                 break;\r
1065         }\r
1066         player[pn].enti.dire+=dd;\r
1067         if((player[pn].enti.q==1 && player[pn].enti.pred != player[pn].enti.d) || !dd)\r
1068         {\r
1069                 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
1070                 player[pn].enti.pred = player[pn].enti.d;\r
1071         }\r
1072 \r
1073         //setting xy position\r
1074         player[pn].enti.spri->x = x;\r
1075         player[pn].enti.spri->y = y;\r
1076 \r
1077         //draw sprite\r
1078         ZC_drawframe(pip, &player[pn].enti, x, y);\r
1079 //0000if(player[pn].enti.q<2) delay(200);\r
1080         pip->video->r=1;\r
1081 }\r
1082 \r
1083 /*\r
1084  * from zcroll16.c\r
1085 */\r
1086 \r
1087 boolean boundary_check(int x, int y, int dx, int dy, int h, int w)\r
1088 {\r
1089         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
1090 }\r
1091 \r
1092 boolean coll_check(int x, int y, int dx, int dy, map_view_t *map_v)\r
1093 {\r
1094         // Assume everything crosses at most 1 tile at once\r
1095         return dx && 1;//crossable_tile(x + dx, map_v) || dy && crossable_tile(y + dy, map_v);\r
1096 }\r
1097 \r
1098 boolean ZC_walk2(entity_t *enti, map_view_t *map_v)\r
1099 {\r
1100         //return 1;\r
1101         int dx = 1;\r
1102         int dy = 1;\r
1103         switch(enti->d)\r
1104         {\r
1105                 case 2:\r
1106                         return 0;\r
1107                 case 1:\r
1108                         dx = -dx;\r
1109                 case 3:\r
1110                         dy = 0;\r
1111                         break;\r
1112                 case 0:\r
1113                         dy = -dy;\r
1114                 case 4:\r
1115                         dx = 0;\r
1116                         break;\r
1117         }\r
1118         if(coll_check(enti->x, enti->y, dx, dy,  map_v))\r
1119         {\r
1120                 // Allow movement\r
1121                 // Set speed\r
1122                 // Start animation\r
1123                 // Mark next tile as occupied\r
1124                 // Mark this tile as vacant\r
1125                 return 1;\r
1126         }\r
1127         return 0;\r
1128 }\r
1129 \r
1130 void player_walk(player_t *player, map_view_t *map_v){\r
1131         int dx=16, dy=16;\r
1132         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->ti.tilesw, map_v->map->height - 2*map_v->page->ti.tilesh))\r
1133         {\r
1134                 mapScroll(map_v, player);\r
1135                 // (Un)load stuff?\r
1136         }\r
1137 }\r
1138 \r
1139 void mapScroll(map_view_t *mv, player_t *player)\r
1140 {\r
1141         //word x, y;  /* coordinate for drawing */\r
1142         int c = 1;\r
1143         int delta;\r
1144         mv->delta += player->dx | player->dy;\r
1145         delta = mv->delta;\r
1146         mv->d = (player->dx) ? (player->dx > 0) ? 3 : 1 : (player->dy) ? (player->dy > 0) ? 4 : 0 : 2;\r
1147         switch(mv->d){\r
1148                 case 4:\r
1149                         c = -1;\r
1150                         delta = -delta;\r
1151                 case 0:\r
1152                         if(!(delta + mv->dxThresh))\r
1153                         {\r
1154                                 mv->delta = 0;\r
1155                                 mv->ty += c;\r
1156                         }\r
1157                         break;\r
1158                 case 3:\r
1159                         c = -1;\r
1160                         delta = -delta;\r
1161                 case 1:\r
1162                         if(!(delta + mv->dyThresh))\r
1163                         {\r
1164                                 mv->delta = 0;\r
1165                                 mv->tx += c;\r
1166                         }\r
1167                         break;\r
1168                 default:\r
1169                         break;\r
1170         }\r
1171 \r
1172         mv->video->r=1;\r
1173 }\r