pmd-red/src/code_804AFAC.c
2024-11-16 19:43:16 +01:00

153 lines
3.7 KiB
C

#include "global.h"
#include "dungeon_map_access.h"
#include "dungeon_random.h"
#include "structs/str_dungeon.h"
void sub_804FBE8(void)
{
Tile *tile;
int y;
int x;
for(x = 0; x < DUNGEON_MAX_SIZE_X; x++)
{
for(y = 0; y < DUNGEON_MAX_SIZE_Y; y++)
{
tile = GetTileMut(x,y);
if ((tile->terrainType & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY)) != TERRAIN_TYPE_NORMAL) {
if ((tile->terrainType & (TERRAIN_TYPE_UNK_8 | TERRAIN_TYPE_IMPASSABLE_WALL)) != 0) {
tile->unk4 &= 0xfffd;
}
tile->unk4 &= 0xfffb;
}
if ((tile->unk4 & 1) != 0) {
tile->terrainType |= TERRAIN_TYPE_STAIRS;
tile->unk4 &= 0xfffb;
}
if ((tile->unk4 & 2) != 0) {
tile->unk4 &= 0xfffb;
}
}
}
}
void sub_804FC74(void)
{
Tile *tile;
int y;
int x;
for(x = 0; x < DUNGEON_MAX_SIZE_X; x++)
{
for(y = 0; y < DUNGEON_MAX_SIZE_Y; y++)
{
if ((GetTile(x, y)->terrainType & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY)) == TERRAIN_TYPE_SECONDARY) {
tile = GetTileMut(x,y);
tile->terrainType &= ~(TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY);
tile->terrainType |= (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY);
}
}
}
}
void sub_804FCCC(void)
{
Tile *tile;
int y;
int x;
for(x = 0; x < DUNGEON_MAX_SIZE_X; x++)
{
for(y = 0; y < DUNGEON_MAX_SIZE_Y; y++)
{
if ((GetTile(x, y)->terrainType & TERRAIN_TYPE_IMPASSABLE_WALL) != 0) {
tile = GetTileMut(x,y);
tile->terrainType &= ~(TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY);
}
}
}
}
void sub_804FD10(Tile *tile)
{
tile->terrainType = 0;
tile->unk4 = 0;
tile->room = -1;
tile->unk8 = 0;
tile->walkableNeighborFlags[CROSSABLE_TERRAIN_REGULAR] = 0;
tile->walkableNeighborFlags[CROSSABLE_TERRAIN_LIQUID] = 0;
tile->walkableNeighborFlags[CROSSABLE_TERRAIN_CREVICE] = 0;
tile->walkableNeighborFlags[CROSSABLE_TERRAIN_WALL] = 0;
tile->unkE = 0;
tile->monster = NULL;
tile->object = NULL;
}
bool8 static inline boundsCheck(int x, int y)
{
if (x < 0 || (y < 0)) return TRUE;
if (DUNGEON_MAX_SIZE_X <= x) return TRUE;
if (DUNGEON_MAX_SIZE_Y <= y) return TRUE;
return FALSE;
}
void sub_804FD30(void)
{
int x;
int y;
for(x = 0; x < DUNGEON_MAX_SIZE_X; x++)
{
for(y = 0; y < DUNGEON_MAX_SIZE_Y; y++)
{
sub_804FD10(GetTileMut(x,y));
if ((boundsCheck(x, y - 1)) ||
(boundsCheck(x + 1, y - 1)) ||
(boundsCheck(x + 1, y - 1)) ||
(boundsCheck(x + 1, y + 1)) ||
(boundsCheck(x, y + 1)) ||
(boundsCheck(x - 1, y + 1)) ||
(boundsCheck(x - 1, y)) ||
(boundsCheck(x - 1, y - 1)))
{
GetTileMut(x,y)->terrainType |= TERRAIN_TYPE_IMPASSABLE_WALL;
}
}
}
gDungeon->unkE21C.x = -1;
gDungeon->unkE21C.y = -1;
for(x = 0; x < 8; x++)
{
for(y = 0; y < 8; y++)
{
sub_804FD10(&gDungeon->unkE27C[x][y]);
}
}
gDungeon->unk3904 = 0;
for(x = 0; x < 0x40; x++)
{
gDungeon->traps[x]->type = 0;
}
}
void sub_804FED0(s32 *param_1, s32 param_2)
{
int idx1;
int idx2;
s32 temp;
int counter;
for (counter = 0; counter < param_2 << 1; counter++) {
idx1 = DungeonRandInt(param_2);
idx2 = DungeonRandInt(param_2);
temp = param_1[idx1];
param_1[idx1] = param_1[idx2];
param_1[idx2] = temp;
}
}