1 /* Project 16 Source Code~
\r
2 * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover
\r
4 * This file is part of Project 16.
\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
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
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
25 #include "src/lib/scroll16.h"
\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
29 void ZC_walk(map_view_t *pip, player_t *player, word pn)
\r
31 switch(player[pn].enti.d)
\r
35 //0000pip[0].video->startclk = (*clockw);
\r
39 if(ZC_mapEdgeChk(pip, player[pn].enti.d, 0) && player[pn].enti.tx == pip[0].tx+pip[0].page->ti.tilemidposscreenx &&
\r
40 !(pip[0].map->layerdata[0].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
42 player[pn].walktype=2;
\r
43 if(player[pn].enti.q<=player[pn].enti.spt)
\r
45 ZC_animatePlayer(pip, player, pn);
\r
46 ZC_mapScroll(pip, player, pn);
\r
47 player[pn].enti.q++;
\r
48 //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;
\r
49 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx++; }
\r
51 else if(player[pn].enti.tx < pip[0].map->width && !(pip[0].map->layerdata[0].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
53 player[pn].walktype=1;
\r
54 if(player[pn].enti.q<=player[pn].enti.spt)
\r
56 player[pn].enti.x+=(player[pn].enti.speed);
\r
57 ZC_animatePlayer(pip, player, pn);
\r
58 player[pn].enti.q++;
\r
59 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx++; }
\r
63 player[pn].walktype=0;
\r
64 ZC_animatePlayer(pip, player, pn);
\r
65 player[pn].enti.d = 2;
\r
67 player[pn].enti.triggerx = player[pn].enti.tx+1;
\r
68 player[pn].enti.triggery = player[pn].enti.ty;
\r
72 if(ZC_mapEdgeChk(pip, player[pn].enti.d, 0) && player[pn].enti.tx == pip[0].tx+pip[0].page->ti.tilemidposscreenx &&
\r
73 !(pip[0].map->layerdata[0].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
75 player[pn].walktype=2;
\r
76 if(player[pn].enti.q<=player[pn].enti.spt)
\r
78 ZC_animatePlayer(pip, player, pn);
\r
79 ZC_mapScroll(pip, player, pn);
\r
80 player[pn].enti.q++;
\r
81 //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;
\r
82 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx--; }
\r
84 else if(player[pn].enti.tx > 1 && !(pip[0].map->layerdata[0].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
86 player[pn].walktype=1;
\r
87 if(player[pn].enti.q<=player[pn].enti.spt)
\r
89 player[pn].enti.x-=(player[pn].enti.speed);
\r
90 ZC_animatePlayer(pip, player, pn);
\r
91 player[pn].enti.q++;
\r
92 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx--; }
\r
96 player[pn].walktype=0;
\r
97 ZC_animatePlayer(pip, player, pn);
\r
98 player[pn].enti.d = 2;
\r
100 player[pn].enti.triggerx = player[pn].enti.tx-1;
\r
101 player[pn].enti.triggery = player[pn].enti.ty;
\r
105 if(ZC_mapEdgeChk(pip, player[pn].enti.d, 0) && player[pn].enti.ty == pip[0].ty+pip[0].page->ti.tilemidposscreeny &&
\r
106 !(pip[0].map->layerdata[0].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
108 player[pn].walktype=2;
\r
109 if(player[pn].enti.q<=player[pn].enti.spt)
\r
111 ZC_animatePlayer(pip, player, pn);
\r
112 ZC_mapScroll(pip, player, pn);
\r
113 player[pn].enti.q++;
\r
114 //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;
\r
115 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty++; }
\r
117 else if(player[pn].enti.ty < pip[0].map->height && !(pip[0].map->layerdata[0].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
119 player[pn].walktype=1;
\r
120 if(player[pn].enti.q<=player[pn].enti.spt)
\r
122 player[pn].enti.y+=(player[pn].enti.speed);
\r
123 ZC_animatePlayer(pip, player, pn);
\r
124 player[pn].enti.q++;
\r
125 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty++; }
\r
129 player[pn].walktype=0;
\r
130 ZC_animatePlayer(pip, player, pn);
\r
131 player[pn].enti.d = 2;
\r
133 player[pn].enti.triggerx = player[pn].enti.tx;
\r
134 player[pn].enti.triggery = player[pn].enti.ty+1;
\r
138 if(ZC_mapEdgeChk(pip, player[pn].enti.d, 0) && player[pn].enti.ty == pip[0].ty+pip[0].page->ti.tilemidposscreeny &&
\r
139 !(pip[0].map->layerdata[0].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
141 player[pn].walktype=2;
\r
142 if(player[pn].enti.q<=player[pn].enti.spt)
\r
144 ZC_animatePlayer(pip, player, pn);
\r
145 ZC_mapScroll(pip, player, pn);
\r
146 player[pn].enti.q++;
\r
147 //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;
\r
148 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty--; }
\r
150 else if(player[pn].enti.ty > 1 && !(pip[0].map->layerdata[0].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
152 player[pn].walktype=1;
\r
153 if(player[pn].enti.q<=player[pn].enti.spt)
\r
155 player[pn].enti.y-=(player[pn].enti.speed);
\r
156 ZC_animatePlayer(pip, player, pn);
\r
157 player[pn].enti.q++;
\r
158 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty--; }
\r
162 player[pn].walktype=0;
\r
163 ZC_animatePlayer(pip, player, pn);
\r
164 player[pn].enti.d = 2;
\r
166 player[pn].enti.triggerx = player[pn].enti.tx;
\r
167 player[pn].enti.triggery = player[pn].enti.ty-1;
\r
174 void ZC_panPageManual(map_view_t *pip, player_t *player, word pn)
\r
176 #define SHOWMVFUN_ ZC_ShowMV(pip, 0, 0);
\r
177 switch(player[pn].enti.d)
\r
181 if(ZC_mapEdgeChk(pip, player[pn].enti.d, 1))
\r
183 if(player[pn].enti.q<=player[pn].enti.spt)
\r
185 pip[0].page->dx+=4;
\r
187 player[pn].enti.q++;
\r
188 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; pip[0].tx++; }
\r
194 if(ZC_mapEdgeChk(pip, player[pn].enti.d, 1))
\r
196 if(player[pn].enti.q<=player[pn].enti.spt)
\r
198 pip[0].page->dx-=4;
\r
200 player[pn].enti.q++;
\r
201 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; pip[0].tx--; }
\r
207 if(ZC_mapEdgeChk(pip, player[pn].enti.d, 1))
\r
209 if(player[pn].enti.q<=player[pn].enti.spt)
\r
211 pip[0].page->dy+=4;
\r
213 player[pn].enti.q++;
\r
214 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; pip[0].ty++; }
\r
220 if(ZC_mapEdgeChk(pip, player[pn].enti.d, 1))
\r
222 if(player[pn].enti.q<=player[pn].enti.spt)
\r
224 pip[0].page->dy-=4;
\r
226 player[pn].enti.q++;
\r
227 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; pip[0].ty--; }
\r
236 void ZC_MVSetup(map_view_t *pip, map_t *map, global_game_variables_t *gv)
\r
241 pip[0].page = &gv->video.page[0];
\r
243 pip[0].video = &gv->video;
\r
244 pip[0].p = &gv->video.p;
\r
245 pip[0].sp = &gv->video.sp;
\r
246 ZC_MVInit(pip, 1, 1);
\r
248 for(i=ZC_MVI;i<gv->video.num_of_pages;i++)
\r
250 pip[i].page = &gv->video.page[i];
\r
251 pip[i].map = pip[0].map;
\r
252 pip[i].video = pip[0].video;
\r
253 pip[i].p = pip[0].p;
\r
254 pip[i].sp = pip[0].sp;
\r
262 void ZC_MVInit(map_view_t *pip, int tx, int ty)
\r
266 //pip[0].tx = pip[1].tx = tx;
\r
267 //pip[0].ty = pip[1].ty = ty;
\r
270 void ZC_ShowMV(map_view_t *moo, boolean vsync, boolean sr)
\r
272 word high_address, low_address, offset;
\r
275 // calculate offset
\r
276 offset = (word) moo[moo[0].video->sp].page->data;
\r
277 offset += moo[0].page->dy * (moo[0].page->width >> 2 );
\r
278 offset += moo[0].page->dx >> 2;
\r
280 // calculate crtcOffset according to virtual width
\r
284 crtcOffset = moo[moo[0].video->sp].page->sw >> 3;
\r
288 crtcOffset = moo[0].page->width >> 3;
\r
292 high_address = HIGH_ADDRESS | (offset & 0xff00);
\r
293 low_address = LOW_ADDRESS | (offset << 8);
\r
295 // wait for appropriate timing and then program CRTC
\r
296 if(vsync) while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE));
\r
297 outpw(CRTC_INDEX, high_address);
\r
298 outpw(CRTC_INDEX, low_address);
\r
299 outp(CRTC_INDEX, 0x13);
\r
300 outp(CRTC_DATA, crtcOffset);
\r
302 // wait for one retrace
\r
303 if(vsync) while (!(inp(INPUT_STATUS_1) & VRETRACE));
\r
305 // do PEL panning here
\r
306 outp(AC_INDEX, 0x33);
\r
307 outp(AC_INDEX, (moo[0].page->dx & 0x03) << 1);
\r
308 vga_state.vga_draw_stride_limit = vga_state.vga_draw_stride = moo[0].page->stridew;
\r
312 initMap(map_t *map) {
\r
313 // just a place holder to fill out an alternating pattern
\r
319 for(y=0; y<map->height; y++) {
\r
320 for(x=0; x<map->width; x++) {
\r
321 map->layerdata[0].data[i]=255;
\r
322 // printf("[%d]", map->layerdata[0].data[i]);
\r
323 tile = tile ? 0 : 1;
\r
326 tile = tile ? 0 : 1;
\r
331 initMap(map_t *map) {
\r
332 /* just a place holder to fill out an alternating pattern */
\r
336 map->tiles = malloc(sizeof(tiles_t));
\r
340 /* create the tile set */
\r
341 map->tiles->spri = malloc(sizeof(sprite_t));
\r
342 map->tiles->spri->sprite_vrl_cont.vrl_header->width = (TILEWH*2);
\r
343 map->tiles->spri->sprite_vrl_cont.vrl_header->height= TILEWH;
\r
344 map->tiles->spri->sprite_vrl_cont.buffer = malloc((TILEWH*2)*TILEWH);
\r
345 map->tiles->tileHeight = TILEWH;
\r
346 map->tiles->tileWidth =TILEWH*2;
\r
347 map->tiles->rows = 1;
\r
348 map->tiles->cols = 2;
\r
351 for(y=0; y<TILEWH; y++) {
\r
352 for(x=0; x<(TILEWH*2); x++) {
\r
354 map->tiles->spri->sprite_vrl_cont.buffer[i] = 28;//0x24;
\r
356 map->tiles->spri->sprite_vrl_cont.buffer[i] = 0;//0x34;
\r
363 for(y=0; y<map->height; y++) {
\r
364 for(x=0; x<map->width; x++) {
\r
365 map->layerdata[0].data[i] = tile;
\r
366 // printf("%u ", map->layerdata[0].data[i]);
\r
367 tile = tile ? 0 : 1;
\r
371 tile = tile ? 0 : 1;
\r
375 //===========================================================================//
\r
378 void near mapScrollRight(map_view_t *mv, player_t *player, word id, word plid)
\r
380 word x;//, y; /* coordinate for drawing */
\r
382 ScrollRight(mv, player, id, plid);
\r
384 /* draw the next column */
\r
385 x= mv[0].page->sw + mv[0].map->tiles->tileWidth;
\r
386 if(ZC_mapEdgeChk(mv, player[plid].enti.d, 0))
\r
388 if(player[plid].enti.q%4)
\r
390 if(player[plid].enti.q==4)
\r
393 mapDrawCol(&mv[id], mv[0].tx + mv[0].page->ti.tw, mv[0].ty-1, x, player, DRAWCOLNUM);
\r
395 // if(mv[0].video->vga_state.bgps)
\r
396 // modexCopyPageRegion(mv->page, mv[0].page, x, 0, x, 0, mv[0].map->tiles->tileWidth, mv[0].page->height);
\r
397 //mv[0].video->dorender=1;//ScrollRight
\r
401 void near mapScrollLeft(map_view_t *mv, player_t *player, word id, word plid)
\r
403 word x;//,y; /* coordinate for drawing */
\r
405 ScrollLeft(mv, player, id, plid);
\r
407 /* draw the next column */
\r
409 if(ZC_mapEdgeChk(mv, player[plid].enti.d, 0))
\r
411 if(player[plid].enti.q%4)
\r
413 if(player[plid].enti.q==4)
\r
416 mapDrawCol(&mv[id], mv[0].tx - 1, mv[0].ty-1, x, player, DRAWCOLNUM);
\r
418 // if(mv[0].video->vga_state.bgps)
\r
419 // modexCopyPageRegion(mv->page, mv[0].page, x, 0, x, 0, mv[0].map->tiles->tileWidth, mv[0].page->height);
\r
420 //mv[0].video->dorender=1;//ScrollLeft
\r
424 void near mapScrollUp(map_view_t *mv, player_t *player, word id, word plid)
\r
426 word y;//x, /* coordinate for drawing */
\r
428 ScrollUp(mv, player, id, plid);
\r
430 /* draw the next row */
\r
432 if(ZC_mapEdgeChk(mv, player[plid].enti.d, 0))
\r
434 if(player[plid].enti.q%3)
\r
436 if(player[plid].enti.q==4)
\r
439 mapDrawRow(&mv[id], mv[0].tx - 1, mv[0].ty-1, y, player, DRAWROWNUM);
\r
441 // if(mv[0].video->vga_state.bgps)
\r
442 // modexCopyPageRegion(mv->page, mv[0].page, 0, y, 0, y, mv[0].page->width, mv[0].map->tiles->tileHeight);
\r
443 //mv[0].video->dorender=1;//ScrollUp
\r
447 void near mapScrollDown(map_view_t *mv, player_t *player, word id, word plid)
\r
449 word y;//x, /* coordinate for drawing */
\r
451 ScrollDown(mv, player, id, plid);
\r
453 /* draw the next row */
\r
454 y= mv[0].page->sh + mv[0].map->tiles->tileHeight;
\r
455 if(ZC_mapEdgeChk(mv, player[plid].enti.d, 0))
\r
457 if(player[plid].enti.q%3)
\r
459 if(player[plid].enti.q==4)
\r
462 mapDrawRow(&mv[id], mv[0].tx - 1, mv[0].ty+mv[0].page->ti.th, y, player, DRAWROWNUM);
\r
464 // if(mv[0].video->vga_state.bgps)
\r
465 // modexCopyPageRegion(mv->page, mv[0].page, 0, y, 0, y, mv[0].page->width, mv[0].map->tiles->tileHeight);
\r
466 //mv[0].video->dorender=1;//ScrollDown
\r
469 void ZC_mapScroll(map_view_t *mv, player_t *player, word pn)
\r
471 word b = mv[0].video->vga_state.bgps;
\r
472 switch(player[pn].enti.d)
\r
477 ScrollRight(mv, player, 3, pn);
\r
478 ScrollRight(mv, player, 2, pn);
\r
479 mapScrollRight(mv, player, (0), pn);
\r
480 if(b) mapScrollRight(mv, player, (1), pn);
\r
483 ScrollLeft(mv, player, 3, pn);
\r
484 ScrollLeft(mv, player, 2, pn);
\r
485 mapScrollLeft(mv, player, (0), pn);
\r
486 if(b) mapScrollLeft(mv, player, (1), pn);
\r
489 ScrollDown(mv, player, 3, pn);
\r
490 ScrollDown(mv, player, 2, pn);
\r
491 mapScrollDown(mv, player, (0), pn);
\r
492 if(b) mapScrollDown(mv, player, (1), pn);
\r
495 ScrollUp(mv, player, 3, pn);
\r
496 ScrollUp(mv, player, 2, pn);
\r
497 mapScrollUp(mv, player, (0), pn);
\r
498 if(b) mapScrollUp(mv, player, (1), pn);
\r
501 //mv[0].video->dorender=1;//ZC_mapScroll
\r
504 //===========================================================================
\r
505 //TODO: put player in starting position of assigned spot on map
\r
506 //default player position on the viewable map
\r
507 void ZC_PlayerXYpos(int x, int y, player_t *player, map_view_t *pip, nibble pn, boolean defaultsw)
\r
509 player[pn].enti.tx = x + pip[0].tx;
\r
510 player[pn].enti.ty = y + pip[0].ty;
\r
515 player[pn].enti.tx += pip[0].page->ti.tilemidposscreenx;
\r
516 player[pn].enti.ty += pip[0].page->ti.tilemidposscreeny;
\r
522 //===========================================================================
\r
524 void ZC_checkardmap(map_t *map)
\r
526 // just a place holder to fill out an alternating pattern
\r
529 static byte z[(MAPW*MAPH)];//map->width*map->height];
\r
533 for(y=0; y<map->height; y++) {
\r
534 for(x=0; x<map->width; x++) {
\r
536 tile = tile ? 0 : 1;
\r
539 tile = tile ? 0 : 1;
\r
541 map->layerdata[0].data = &z;
\r
544 sword chkmap(map_t *map, word q)
\r
547 /* static byte x[(MAPW*MAPH)+1] =
\r
548 //{ 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
550 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
\r
551 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1,
\r
552 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
\r
553 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1,
\r
554 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
\r
555 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1,
\r
556 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
\r
557 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1,
\r
558 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
\r
559 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1,
\r
560 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
\r
561 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1,
\r
562 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
\r
563 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1,
\r
564 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
\r
565 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1,
\r
566 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
\r
567 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1,
\r
568 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
\r
569 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1,
\r
570 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
\r
571 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1,
\r
572 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
\r
573 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1,
\r
574 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
\r
575 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1,
\r
576 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
\r
577 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1,
\r
578 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
\r
579 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1
\r
581 /*1, 2, 3, 4, 0, 3, 3, 3, 3, 3, 3, 3, 3, 4, 1, 1, 1, 1, 1, 1, \
\r
582 5, 6, 7, 8, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
\r
583 9, 10, 11, 12, 4, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
\r
584 13, 14, 15, 16, 0, 1, 1, 1, 5, 8, 1, 11, 11, 1, 1, 1, 1, 1, 1, 1, \
\r
585 0, 0, 4, 0, 0, 0, 0, 0, 8, 8, 1, 11, 11, 3, 1, 1, 1, 1, 1, 1, \
\r
586 1, 1, 1, 1, 0, 0, 0, 0, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
\r
587 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
\r
588 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, \
\r
589 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
\r
590 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
\r
591 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, \
\r
592 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
\r
593 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, \
\r
594 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
\r
595 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 2, 3, 4 };*/
\r
596 //check for failed to load map
\r
597 if((map->width == map->height == 0) && (q>0))
\r
599 //initiate a null map!
\r
602 // map->layerdata[0].data = fmfaflflfofcf(((map->width*map->height)+1)*sizeof(byte));
\r
603 ZC_checkardmap(map);//map->layerdata[0].data = &x;
\r
604 //map->tiles = fmfafflflfofc(sizeof(tiles_t));
\r
605 //fix this to be far~
\r
606 // bp = bitmapLoadPcx("data/ed.pcx");
\r
607 // map->tiles->data = &bp;
\r
608 map->tiles->tileHeight = 16;
\r
609 map->tiles->tileWidth = 16;
\r
610 map->tiles->rows = 1;
\r
611 map->tiles->cols = 1;
\r
612 #ifdef __DEBUG_MAP__
\r
613 // dbg_maptext = true;
\r
616 #ifdef __DEBUG_MAP__
\r
619 dbg_maptext = false;
\r
625 //TODO: player position here
\r
626 void mapGoTo(map_view_t *mv, int tx, int ty)
\r
628 ZC_mapinitMV(mv, tx, ty);
\r
630 /* draw the tiles */
\r
631 modexClearRegion(mv[0].page, 0, 0, mv[0].page->width, mv[0].page->height, 0);
\r
632 ZC_mapredraw(mv, tx, ty);
\r
634 //if(mv[0].video->vga_state.bgps) modexCopyPageRegion(mv[1].page, mv[0].page, 0, 0, 0, 0, mv[0].page->width, mv[0].page->height);
\r
637 void ZC_mapinitMV(map_view_t *mv, int tx, int ty)
\r
639 /* set up the coordinates */
\r
640 mv[0].tx = mv[1].tx = tx;
\r
641 mv[0].ty = mv[1].ty = ty;
\r
642 mv[0].page->dx = mv[1].page->dx = mv[2].page->dx = mv[3].page->dx = mv->map->tiles->tileWidth;
\r
643 mv[0].page->dy = mv[1].page->dy = mv[2].page->dy = mv[3].page->dy = mv->map->tiles->tileHeight;
\r
645 /* set up the thresholds */
\r
646 mv[0].dxThresh = mv[1].dxThresh = mv[2].dxThresh = mv[3].dxThresh = mv->map->tiles->tileWidth * 2;
\r
647 mv[0].dyThresh = mv[1].dyThresh = mv[2].dyThresh = mv[3].dyThresh = mv->map->tiles->tileHeight * 2;
\r
650 void ZC_mapredraw(map_view_t *mv, int tx, int ty)
\r
656 i=mv[0].ty * mv[0].map->width + mv[0].tx;
\r
657 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
658 mapDrawWRow(&mv[0], tx-1, ty, py);
\r
659 mapDrawWRow(&mv[1], tx-1, ty, py);
\r
660 i+=mv->map->width - tx;
\r
665 mapDrawTile(tiles_t *t, word i, page_t *page, word x, word y)
\r
668 // printf("%02d ", i); if(x >= page->width - t->tileWidth) printf("\n");
\r
673 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, 1); //currently the over scan color!
\r
676 rx = (((i-1) % ((t->spri->sprite_vrl_cont.vrl_header->width)/t->tileWidth)) * t->tileWidth);
\r
677 ry = (((i-1) / ((t->spri->sprite_vrl_cont.vrl_header->height)/t->tileHeight)) * t->tileHeight);
\r
679 #ifdef __DEBUG_RF__
\r
680 if(!dbg_pagenorendermap)
\r
682 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, i+1);
\r
684 modexDrawBmpRegion (page, x, y, rx, ry, t->tileWidth, t->tileHeight, i);
\r
685 //draw_vrl1_vgax_modex(x-rx,y-ry,vrl_header,vrl_lineoffs,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));
\r
686 //modexDrawBmpRegion (page, x, y, rx, ry, t->tileWidth, t->tileHeight, (t->data));
\r
688 #ifdef __DEBUG_MAP__
\r
689 if(dbg_maptext){ sprintf(global_temp_status_text2, "%u", i); modexprint(page, x, y, 1, 0, 1, 2, 1, global_temp_status_text2); }
\r
694 #define PALMAPDRAWW 13
\r
695 void near mapDrawRow(map_view_t *mv, int tx, int ty, word y, player_t *player, word poopoffset)
\r
698 #ifdef __DEBUG_RF__
\r
699 if(dbg_pagedelayrendermap) if(!y) y+=TILEWH; else y-=TILEWH;
\r
701 poopoffset%=player[0].enti.speed;
\r
702 //printf("y: %d\n", poopoffset);
\r
703 #ifdef __DEBUG_RF__
\r
704 if(dbg_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, 0, PALMAPDRAWW, 1, 1, global_temp_status_text); }
\r
706 /* the position within the map array */
\r
707 i=ty * mv->map->width + tx;
\r
708 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
710 mapDrawTile(mv->map->tiles, mv->map->layerdata[0].data[i], mv->page, mv->dx, y);
\r
712 if(mv->map->layerdata[z].data[i]){
\r
713 sprintf(global_temp_status_text2, "%u", mv->map->layerdata[z].data[i]); modexprint(mv->page, mv->dx, y, 1, 0, PALMAPDRAWW, z+2, 1, global_temp_status_text2);
\r
714 //mapDrawTile(mv->map->tiles, mv->map->layerdata[z].data[i], mv->page, mv->dx, y);
\r
719 #ifdef __DEBUG_RF__
\r
720 if(dbg_pagedelayrendermap) delay(200);
\r
724 void near mapDrawCol(map_view_t *mv, int tx, int ty, word x, player_t *player, word poopoffset)
\r
727 #ifdef __DEBUG_RF__
\r
728 if(dbg_pagedelayrendermap) if(!x) x+=TILEWH; else x-=TILEWH;
\r
730 poopoffset%=player[0].enti.speed;
\r
731 //printf("x: %d\n", poopoffset);
\r
732 #ifdef __DEBUG_RF__
\r
733 if(dbg_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, 0, PALMAPDRAWW, 1, global_temp_status_text); }
\r
735 /* location in the map array */
\r
736 i=ty * mv->map->width + tx;
\r
737 /* We'll copy all of the columns in the screen,
\r
738 i + 1 row above and one below */
\r
739 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
741 mapDrawTile(mv->map->tiles, mv->map->layerdata[0].data[i], mv->page, x, mv->dy);
\r
743 if(mv->map->layerdata[z].data[i]){
\r
744 sprintf(global_temp_status_text2, "%u", mv->map->layerdata[z].data[i]); modexprint(mv->page, x, mv->dy, 1, 0, PALMAPDRAWW, z+2, 1, global_temp_status_text2);
\r
745 //mapDrawTile(mv->map->tiles, mv->map->layerdata[z].data[i], mv->page, x, mv->dy);
\r
748 i += mv->map->width;
\r
750 #ifdef __DEBUG_RF__
\r
751 if(dbg_pagedelayrendermap) delay(200);
\r
755 void mapDrawWRow(map_view_t *mv, int tx, int ty, word y)
\r
759 /* the position within the map array */
\r
760 i=ty * mv->map->width + tx;
\r
761 for(mv->dx=0; mv->dx<mv->page->sw+mv->dxThresh && tx < mv->map->width; mv->dx+=mv->map->tiles->tileWidth, tx++) {
\r
762 if(i>=0){ /* we are in the map, so copy! */
\r
763 mapDrawTile(mv->map->tiles, mv->map->layerdata[0].data[i], mv->page, mv->dx, y);
\r
765 if(mv->map->layerdata[z].data[i]){
\r
766 sprintf(global_temp_status_text2, "%u", mv->map->layerdata[z].data[i]); modexprint(mv->page, mv->dx, y, 1, 0, PALMAPDRAWW, z+2, 1, global_temp_status_text2);
\r
767 //mapDrawTile(mv->map->tiles, mv->map->layerdata[z].data[i], mv->page, mv->dx, y);
\r
774 void mapDrawWCol(map_view_t *mv, int tx, int ty, word x)
\r
778 /* location in the map array */
\r
779 i=ty * mv->map->width + tx;
\r
781 /* We'll copy all of the columns in the screen,
\r
782 i + 1 row above and one below */
\r
783 for(mv->dy=0; mv->dy<mv->page->sh+mv->dyThresh && ty < mv->map->height; mv->dy+=mv->map->tiles->tileHeight, ty++) {
\r
784 if(i>=0){ /* we are in the map, so copy away! */
\r
785 mapDrawTile(mv->map->tiles, mv->map->layerdata[0].data[i], mv->page, x, mv->dy);
\r
787 if(mv->map->layerdata[z].data[i]){
\r
788 sprintf(global_temp_status_text2, "%u", mv->map->layerdata[z].data[i]); modexprint(mv->page, x, mv->dy, 1, 0, PALMAPDRAWW, z+2, 1, global_temp_status_text2);
\r
789 //mapDrawTile(mv->map->tiles, mv->map->layerdata[z].data[i], mv->page, x, mv->dy);
\r
792 i += mv->map->width;
\r
798 void shinku(global_game_variables_t *gv)
\r
801 word x = gv->video.page[/*!*/(gv->video.p)].dx; //(gv->video.page[(gv->video.p)].tlx) - // follow the screen
\r
802 word y = gv->video.page[/*!*/(gv->video.p)].dy; //(gv->video.page[(gv->video.p)].tly) - // follow the screen
\r
803 word col = 2, bgcol = 1, type = 1;//w = 64, h = 8,
\r
805 if(elapsed_timer(gv) >= (1.0 / gv->kurokku.frames_per_second))
\r
808 // NTS: For some bizarre reason, gv->pee is not initialized, but the pointer is not NULL even
\r
809 // though it should be. Instead it's NULL as a neAr pointer but contains a non-null
\r
810 // segment value, so testing against NULL doesn't work. It is initialized properly if
\r
811 // you call start_timer() though which uses neAr mAlloc. Rather than fight with that,
\r
812 // I decided it would be better to declare a temp buffer statically and sprintf to that.
\r
814 // This fixes *** Null pointer assignment detected error message in ZCROLL.EXE on exit.
\r
815 sprintf(global_temp_status_text, "%.0f fps", (double)gv->kurokku.tiku/ticktock(gv));
\r
816 //modexprint(&(gv->video.page[/*!*/(gv->video.p)]), x, y, type, 1, col, bgcol, global_temp_status_text);
\r
817 if(gv->kurokku.wcpu)
\r
819 modexCopyPageRegion(&gv->video.page[0], &gv->video.page[1],
\r
820 gv->video.page[/*!*/(gv->video.p)].dx,
\r
821 gv->video.page[/*!*/(gv->video.p)].dy,
\r
822 gv->video.page[/*!*/(gv->video.p)].dx,
\r
823 gv->video.page[/*!*/(gv->video.p)].dy,
\r
825 modexprint(&(gv->video.page[/*!*/(gv->video.p)]), x, y, type, 1, col, 1, bgcol, global_temp_status_text);
\r
826 //0000printf("dx=%u dy=%u\n", gv->video.page[/*!*/(gv->video.p)].dx, gv->video.page[/*!*/(gv->video.p)].dy);
\r
829 gv->kurokku.tiku=0;
\r
830 }else //copy dat sheet
\r
831 gv->kurokku.tiku++;
\r
833 switch(gv->kurokku.fpscap)
\r
835 case 0: //turn this off if XT
\r
836 //modexprint(&(gv->video.page[0]), x, y+8, type, 1, col, bgcol, "sanic!");
\r
837 gv->kurokku.frames_per_second=1;
\r
840 //modexWaitBorder();
\r
841 //modexWaitBorder_start();
\r
842 //vga_wait_for_vsync();
\r
843 vga_wait_for_vsync_end();
\r
844 gv->kurokku.frames_per_second=60;
\r
848 if(gv->video.dorender )
\r
852 modexCopyPageRegion(&(gv->video.page[ ]), &(gv->video.page[ ]), 0, 0, 0, 0, gv->video.page[ ].width, gv->video.page[ ].height);
\r
854 //modexCopyPageRegion(&video->page[0], &video->page[1], enti->x, enti->y, 0, 0, 24, 32);
\r
856 VL_ShowPage(&(gv->video.page[gv->video.sp]), gv->kurokku.fpscap, 0);
\r
857 gv->video.dorender =!gv->video.dorender;
\r
858 //0000gv->video.tickclk = ((*clockw)-gv->video.startclk)/18.2;
\r
863 void near ZC_animatePlayer(map_view_t *pip, player_t *player, word pn)
\r
865 sword x = player[pn].enti.x;
\r
866 sword y = player[pn].enti.y;
\r
867 sword qq,dd; //scroll offset
\r
868 player[pn].enti.dire=10; //direction
\r
870 switch(player[pn].walktype)
\r
882 qq = player[pn].enti.q*player[pn].enti.speed;
\r
886 y-=pip[0].map->tiles->tileHeight;
\r
887 switch (player[pn].enti.d)
\r
891 player[pn].enti.dire*=player[pn].enti.d+1;
\r
896 player[pn].enti.dire*=(player[pn].enti.d-1);
\r
903 player[pn].enti.dire*=(player[pn].enti.d-1);
\r
908 player[pn].enti.dire*=(player[pn].enti.d+3);
\r
912 player[pn].enti.dire+=dd;
\r
913 //setting xy position
\r
914 player[pn].enti.spri.x = x;
\r
915 player[pn].enti.spri.y = y;
\r
917 if((player[pn].enti.q==1 && player[pn].enti.pred != player[pn].enti.d) || !dd)//when dir changed OR when player change face direction
\r
919 //0000printf(" q=%u pred=%u d=%u dd=%u\n", player[pn].enti.q, player[pn].enti.pred, player[pn].enti.d, dd);
\r
920 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
921 player[pn].enti.pred = player[pn].enti.d;
\r
922 if(!dd)//changed direction while NOT moving!
\r
924 modexCopyPageRegion(pip[0].page, pip[1].page, x-4, y-4, x-4, y-4, 28, 40);
\r
925 animate_spri(&player[pn].enti, pip[0].video);
\r
929 if(pip[0].video->vga_state.bgps && dd)//if moving wwww
\r
931 modexCopyPageRegion(pip[0].page, pip[1].page, x-4, y-4, x-4, y-4, 28, 40);
\r
934 animate_spri(&player[pn].enti, pip[0].video);
\r
936 //0000if(player[pn].enti.q<4) delay(200);
\r
943 boolean boundary_check(int x, int y, int dx, int dy, int h, int w)
\r
945 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
948 boolean coll_check(int x, int y, int dx, int dy, map_view_t *map_v)
\r
950 // Assume everything crosses at most 1 tile at once
\r
951 return dx && 1;//crossable_tile(x + dx, map_v) || dy && crossable_tile(y + dy, map_v);
\r
954 boolean ZC_walk2(entity_t *enti, map_view_t *map_v)
\r
974 if(coll_check(enti->x, enti->y, dx, dy, map_v))
\r
979 // Mark next tile as occupied
\r
980 // Mark this tile as vacant
\r
986 void player_walk(player_t *player, map_view_t *map_v){
\r
988 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
990 mapScroll(map_v, player);
\r
999 void mapScroll(map_view_t *mv, player_t *player)
\r
1001 //word x, y; /* coordinate for drawing */
\r
1004 mv->delta += player->dx | player->dy;
\r
1005 delta = mv->delta;
\r
1006 mv->d = (player->dx) ? (player->dx > 0) ? 3 : 1 : (player->dy) ? (player->dy > 0) ? 4 : 0 : 2;
\r
1012 if(!(delta + mv->dxThresh))
\r
1022 if(!(delta + mv->dyThresh))
\r