/*
* src/maps.c
*
* Copyright (C) 1998-2002 BigOrno (bigorno@bigorno.net). All rights reserved.
*
* The use and distribution terms for this software are contained in the file
* named README, which can be found in the root of this distribution. By
* using this software in any fashion, you are agreeing to be bound by the
* terms of this license.
*
* You must not remove this notice, or any other, from this software.
*/
/*
* NOTES
*
* A map is composed of submaps, which in turn are composed of rows of
* 0x20 tiles. map_map contains the tiles for the current portion of the
* current submap, i.e. a little bit more than what appear on the screen,
* but not the whole submap.
*
* map_frow is map_map top row within the submap.
*
* Submaps are stored as arrays of blocks, each block being a 4x4 tile
* array. map_submaps[].bnum points to the first block of the array.
*
* Before a submap can be played, it needs to be expanded from blocks
* to map_map.
*/
#include "system.h"
#include "game.h"
#include "maps.h"
#include "ents.h"
#include "draw.h"
#include "screens.h"
#include "e_sbonus.h"
/*
* global vars
*/
U8 map_map[0x2C][0x20];
U8 map_eflg[0x100];
U8 map_frow;
U8 map_tilesBank;
/*
* prototypes
*/
static void map_eflg_expand (U8);
/*
* Fill in map_map with tile numbers by expanding blocks.
*
* add map_submaps[].bnum to map_frow to find out where to start from.
* We need to /4 map_frow to convert from tile rows to block rows, then
* we need to *8 to convert from block rows to block numbers (there
* are 8 blocks per block row). This is achieved by *2 then &0xfff8.
*/
void map_expand (void)
{
U8 i, j, k, l;
U8 row, col;
U16 pbnum;
pbnum = map_submaps[game_submap].bnum + ((2 * map_frow) & 0xfff8);
row = col = 0;
for (i = 0; i < 0x0b; i++)
{
/* 0x0b rows of blocks */
for (j = 0; j < 0x08; j++)
{
/* 0x08 blocks per row */
for (k = 0, l = 0; k < 0x04; k++)
{
/* expand one block */
map_map[row][col++] = map_blocks[map_bnums[pbnum]][l++];
map_map[row][col++] = map_blocks[map_bnums[pbnum]][l++];
map_map[row][col++] = map_blocks[map_bnums[pbnum]][l++];
map_map[row][col] = map_blocks[map_bnums[pbnum]][l++];
row += 1;
col -= 3;
}
row -= 4;
col += 4;
pbnum++;
}
row += 4;
col = 0;
}
}
/*
* Initialize a new submap
*
* ASM 0cc3
*/
void map_init (void)
{
map_tilesBank = (map_submaps[game_submap].page == 1) ? 2 : 1;
map_eflg_expand ((U8) ((map_submaps[game_submap].page == 1) ? 0x10 : 0x00));
map_expand ();
ent_reset ();
ent_actvis ((U8) (map_frow + MAP_ROW_SCRTOP), (U8) (map_frow + MAP_ROW_SCRBOT));
ent_actvis ((U8) (map_frow + MAP_ROW_HTTOP), (U8) (map_frow + MAP_ROW_HTBOT));
ent_actvis ((U8) (map_frow + MAP_ROW_HBTOP), (U8) (map_frow + MAP_ROW_HBBOT));
}
/*
* Expand entity flags for this map
*
* ASM 1117
*/
void map_eflg_expand (U8 offs)
{
U8 i, j, k;
for (i = 0, k = 0; i < 0x10; i++)
{
j = map_eflg_c[offs + i++];
while (j--)
map_eflg[k++] = map_eflg_c[offs + i];
}
}
/*
* Chain (sub)maps
*
* ASM 0c08
* return: TRUE/next submap OK, FALSE/map finished
*/
U8 map_chain (void)
{
U16 c, t;
game_chsm = 0;
e_sbonus_counting = FALSE;
/* find connection */
c = map_submaps[game_submap].connect;
t = 3;
/*
* look for the first connector with compatible row number. if none
* found, then panic
*/
for (c = map_submaps[game_submap].connect; ; c++)
{
if (map_connect[c].dir == 0xff)
sys_panic ("(map_chain) can not find connector\n");
if (map_connect[c].dir != game_dir)
continue;
t = (ent_ents[1].y >> 3) + map_frow - map_connect[c].rowout;
if (t < 3)
break;
}
/* got it */
if (map_connect[c].submap == 0xff)
return FALSE; // no next submap - request next map
else
{
/* next submap */
map_frow = map_frow - map_connect[c].rowout + map_connect[c].rowin;
game_submap = map_connect[c].submap;
return TRUE;
}
}
/*
* Reset all marks, i.e. make them all active again.
*
* ASM 0025
*
*/
void map_resetMarks (void)
{
U16 i;
for (i = 0; i < MAP_NBR_MARKS; i++)
map_marks[i].ent &= ~MAP_MARK_NACT;
}