Files
pmd-red/src/tile_types.c
T
2025-03-18 00:32:36 -04:00

247 lines
5.9 KiB
C

#include "global.h"
#include "tile_types.h"
#include "code_806CD90.h"
#include "structs/str_dungeon.h"
#include "dungeon_map.h"
#include "dungeon_map_access.h"
#include "dungeon_util.h"
const u8 gDungeonWaterType[76] = {
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_WATER,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_WATER,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_LAVA,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_LAVA,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_LAVA,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_LAVA,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
DUNGEON_WATER_TYPE_NONE,
};
extern void sub_8049BB0(s32, s32);
void sub_8042A14(DungeonPos *);
bool8 PosHasItem(DungeonPos *pos)
{
const Tile *tile;
Entity *entity;
tile = GetTile(pos->x,pos->y);
entity = tile->object;
if ((entity != NULL) && (GetEntityType(entity) == ENTITY_ITEM)) {
return TRUE;
}
return FALSE;
}
Entity *GetMonsterAtPos(DungeonPos *pos)
{
const Tile *tile;
Entity *entity;
tile = GetTile(pos->x,pos->y);
entity = tile->monster;
if ((entity != NULL) && (entity->type == ENTITY_MONSTER)) {
return entity;
}
return NULL;
}
bool8 sub_804AD34(DungeonPos *pos)
{
Tile *tile;
s32 x;
Entity * entity;
s32 y;
bool8 iVar8;
s32 index;
iVar8 = 0;
tile = GetTileMut(pos->x,pos->y);
if (!(tile->terrainType & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY)))
if(!(tile->terrainType & (TERRAIN_TYPE_UNBREAKABLE | TERRAIN_TYPE_IMPASSABLE_WALL))){
iVar8 = 1;
tile->terrainType = (tile->terrainType & ~(TERRAIN_TYPE_SECONDARY | TERRAIN_TYPE_NORMAL)) | TERRAIN_TYPE_NORMAL;
for(y = -1; y < 2; y++)
{
for(x = -1; x < 2; x++)
{
sub_80498A8(x + pos->x, y + pos->y);
sub_8049BB0(x + pos->x, y + pos->y);
ShowDungeonMapAtPos(x + pos->x, y + pos->y);
}
}
}
if (iVar8 != 0) {
for(index = 0; index < DUNGEON_MAX_POKEMON; index++)
{
entity = gDungeon->activePokemon[index];
if (EntityIsValid(entity)) {
sub_806CF98(entity);
}
}
sub_8049ED4();
sub_8042A14(pos);
}
return iVar8;
}
bool8 sub_804AE08(DungeonPos *pos)
{
Tile *tile;
s32 x;
s32 y;
bool8 uVar6;
uVar6 = FALSE;
tile = GetTileMut(pos->x,pos->y);
if (!(tile->terrainType & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY)))
if(!(tile->terrainType & (TERRAIN_TYPE_UNBREAKABLE | TERRAIN_TYPE_IMPASSABLE_WALL))) {
uVar6 = TRUE;
tile->terrainType = (tile->terrainType & ~(TERRAIN_TYPE_SECONDARY | TERRAIN_TYPE_NORMAL)) | TERRAIN_TYPE_NORMAL;
tile->spawnOrVisibilityFlags = tile->spawnOrVisibilityFlags | 0x10;
for(y = -1; y < 2; y++)
{
for(x = -1; x < 2; x++)
{
sub_8049BB0(x + pos->x, y + pos->y);
}
}
}
return uVar6;
}
void sub_804AE84(DungeonPos *pos)
{
Tile *tile;
s32 x;
Entity * entity;
s32 index;
s32 y;
tile = GetTileMut(pos->x,pos->y);
if ((tile->spawnOrVisibilityFlags & 0x10) != 0) {
tile->spawnOrVisibilityFlags &= 0xffef;
for(y = -1; y < 2; y++)
{
for(x = -1; x < 2; x++)
{
sub_80498A8(x + pos->x, y + pos->y);
ShowDungeonMapAtPos(x + pos->x, y + pos->y);
}
}
for(index = 0; index < DUNGEON_MAX_POKEMON; index++)
{
entity = gDungeon->activePokemon[index];
if (EntityIsValid(entity)) {
sub_806CF98(entity);
}
}
sub_8049ED4();
sub_8042A14(pos);
}
}
bool8 IsTileGround(Tile *tile)
{
bool8 isGround = FALSE;
if (IsWaterTileset())
{
if (!(tile->terrainType & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY)))
{
isGround = TRUE;
}
}
else if ((tile->terrainType & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY)) != TERRAIN_TYPE_SECONDARY ||
gDungeonWaterType[gDungeon->tileset] == DUNGEON_WATER_TYPE_LAVA)
{
isGround = TRUE;
}
return isGround;
}
bool8 IsWaterTileset()
{
if (gDungeon->tileset == 0 ||
gDungeon->tileset == 0x31 ||
gDungeon->tileset == 0x20 ||
gDungeon->tileset == 0x21 ||
gDungeon->tileset == 0x36)
{
return TRUE;
}
return FALSE;
}