split dungeon map file

This commit is contained in:
DizzyEggg
2025-03-06 23:33:39 +01:00
parent 59ac6518b6
commit bfbcea5f9f
7 changed files with 635 additions and 726 deletions

View File

@@ -5,260 +5,7 @@
.text
thumb_func_start sub_8040A78
sub_8040A78:
ldr r1, _08040A80
movs r0, 0
strb r0, [r1]
bx lr
.align 2, 0
_08040A80: .4byte gUnknown_202EE02
thumb_func_end sub_8040A78
thumb_func_start sub_8040A84
sub_8040A84:
push {r4-r6,lr}
ldr r0, _08040AB4
ldr r0, [r0]
ldr r1, _08040AB8
adds r0, r1
movs r1, 0x1
strb r1, [r0]
movs r5, 0
_08040A94:
movs r4, 0
adds r6, r5, 0x1
_08040A98:
adds r0, r4, 0
adds r1, r5, 0
bl sub_80402AC
adds r4, 0x1
cmp r4, 0x37
ble _08040A98
adds r5, r6, 0
cmp r5, 0x1F
ble _08040A94
pop {r4-r6}
pop {r0}
bx r0
.align 2, 0
_08040AB4: .4byte gDungeon
_08040AB8: .4byte 0x0001bdd1
thumb_func_end sub_8040A84
thumb_func_start sub_8040ABC
sub_8040ABC:
push {r4-r7,lr}
mov r7, r8
push {r7}
lsls r0, 24
lsrs r1, r0, 24
ldr r0, _08040AD8
ldr r0, [r0]
ldrb r0, [r0, 0x4]
cmp r0, 0x6
bne _08040ADC
movs r7, 0xF
movs r0, 0
b _08040AEC
.align 2, 0
_08040AD8: .4byte gGameOptionsRef
_08040ADC:
cmp r1, 0
beq _08040AE8
movs r7, 0xE
movs r4, 0
mov r8, r4
b _08040AEE
_08040AE8:
movs r7, 0x10
movs r0, 0x3
_08040AEC:
mov r8, r0
_08040AEE:
ldr r6, _08040B58
movs r2, 0x1
movs r1, 0
cmp r1, r7
bge _08040B22
ldr r4, _08040B5C
mov r12, r4
_08040AFC:
lsls r0, r2, 6
mov r4, r12
adds r3, r0, r4
adds r4, r2, 0x1
adds r5, r1, 0x1
movs r2, 0x1B
_08040B08:
adds r1, r6, 0
adds r0, r1, 0x1
lsls r0, 16
lsrs r6, r0, 16
strh r1, [r3]
adds r3, 0x2
subs r2, 0x1
cmp r2, 0
bge _08040B08
adds r2, r4, 0
adds r1, r5, 0
cmp r1, r7
blt _08040AFC
_08040B22:
movs r1, 0
cmp r1, r8
bge _08040B4C
ldr r6, _08040B5C
movs r0, 0xE0
lsls r0, 8
adds r3, r0, 0
_08040B30:
lsls r0, r2, 6
adds r0, r6
adds r4, r2, 0x1
adds r5, r1, 0x1
movs r2, 0x1B
_08040B3A:
strh r3, [r0]
adds r0, 0x2
subs r2, 0x1
cmp r2, 0
bge _08040B3A
adds r2, r4, 0
adds r1, r5, 0
cmp r1, r8
blt _08040B30
_08040B4C:
pop {r3}
mov r8, r3
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_08040B58: .4byte 0x0000e0b8
_08040B5C: .4byte gUnknown_202B038 + 2
thumb_func_end sub_8040ABC
thumb_func_start sub_8040B60
sub_8040B60:
push {r4,r5,lr}
ldr r0, _08040BA4
ldr r3, [r0]
ldr r1, _08040BA8
adds r0, r3, r1
ldrb r0, [r0]
cmp r0, 0
beq _08040B9E
movs r1, 0
ldr r2, _08040BAC
adds r5, r3, r2
movs r4, 0
_08040B78:
lsls r0, r1, 3
adds r2, r1, 0x1
subs r0, r1
movs r1, 0x37
lsls r0, 2
adds r0, r5
adds r0, 0x37
_08040B86:
strb r4, [r0]
subs r0, 0x1
subs r1, 0x1
cmp r1, 0
bge _08040B86
adds r1, r2, 0
cmp r1, 0x1F
ble _08040B78
movs r1, 0
ldr r2, _08040BA8
adds r0, r3, r2
strb r1, [r0]
_08040B9E:
pop {r4,r5}
pop {r0}
bx r0
.align 2, 0
_08040BA4: .4byte gDungeon
_08040BA8: .4byte 0x0001bdd2
_08040BAC: .4byte 0x0001ba2c
thumb_func_end sub_8040B60
thumb_func_start sub_8040BB0
sub_8040BB0:
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
adds r6, r0, 0
adds r7, r1, 0
lsls r2, 24
lsrs r2, 24
mov r10, r2
bl sub_804143C
mov r8, r0
ldrh r4, [r7, 0x2]
adds r0, r6, 0
bl GetApparentWeather
adds r1, r0, 0
lsls r1, 24
lsrs r1, 24
adds r0, r4, 0
mov r2, r8
bl sub_804141C
lsls r0, 24
lsrs r5, r0, 24
mov r9, r5
ldrh r4, [r7, 0x2]
adds r0, r6, 0
bl GetApparentWeather
adds r1, r0, 0
lsls r1, 24
lsrs r1, 24
adds r0, r4, 0
mov r2, r8
bl sub_80412E0
lsls r0, 16
lsrs r0, 16
bl sub_800ECB8
movs r1, 0
ldrsh r4, [r0, r1]
adds r0, r6, 0
bl sub_8042768
lsls r0, 24
cmp r0, 0
beq _08040C28
adds r0, r6, 0
adds r1, r7, 0
bl sub_80414C0
lsls r0, 24
cmp r0, 0
bne _08040C28
mov r0, r10
cmp r0, 0
bne _08040C2C
_08040C28:
adds r0, r5, 0
b _08040C3C
_08040C2C:
cmp r4, 0
beq _08040C3A
adds r0, r6, 0
adds r1, r7, 0
mov r2, r8
bl sub_8040C4C
_08040C3A:
mov r0, r9
_08040C3C:
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r1}
bx r1
thumb_func_end sub_8040BB0
thumb_func_start sub_8040C4C
sub_8040C4C:

View File

@@ -338,8 +338,8 @@ struct UnkDungeonGlobal_1822C_Sub
u32 arr[8];
};
#define UNK1822C_ARR_COUNT 16
#define UNK1822C_ARR_COUNT_2 28
#define UNK1822C_ARR_COUNT (DUNGEON_MAX_SIZE_Y / 2)
#define UNK1822C_ARR_COUNT_2 (DUNGEON_MAX_SIZE_X / 2)
struct UnkDungeonGlobal_unk1BBEC
{

View File

@@ -200,6 +200,8 @@ SECTIONS {
src/code_803E46C.o(.text);
src/code_803E724.o(.text);
src/code_8040094.o(.text);
src/dungeon_map.o(.text);
src/code_8040094_1.o(.text);
asm/code_8040094.o(.text);
src/code_8041AD0.o(.text);
asm/code_8041AD0.o(.text);

View File

@@ -11,20 +11,14 @@
#include "play_time.h"
#include "cpu.h"
#include "dungeon.h"
#include "game_options.h"
#include "bg_palette_buffer.h"
#include "code_8009804.h"
#include "code_800E9E4.h"
#include "dungeon_generation.h"
#include "dungeon_util.h"
#include "trap.h"
#include "constants/dungeon.h"
#include "code_804267C.h"
extern s32 gUnknown_80F6568[];
extern u8 gUnknown_202EE01;
extern const char gUnknown_80F6604; // "zmappat"
extern struct FileArchive gDungeonFileArchive;
extern OpenedFile *gUnknown_202EE04;
extern void sub_803F7BC(void);
@@ -81,457 +75,3 @@ void sub_80400D4(void)
if(gDungeon->unk181e8.unk18200 == 0)
gDungeon->unk181e8.unk18200 = gDungeon->unk181e8.unk18204;
}
void sub_8040124(void)
{
gUnknown_202EE01 = 0;
}
void sub_8040130(void)
{
gUnknown_202EE04 = OpenFileAndGetFileDataPtr(&gUnknown_80F6604, &gDungeonFileArchive);
}
extern DungeonPos gUnknown_203B410;
extern u8 gUnknown_202EE00;
extern void *gUnknown_202EE08;
void sub_8040238(void);
void sub_8040150(bool8 a0)
{
s32 i, j;
for (i = 0; i < UNK1822C_ARR_COUNT; i++) {
for (j = 0; j < UNK1822C_ARR_COUNT_2; j++) {
CpuClear(&gDungeon->unk1822C.unk1822C[i][j], sizeof(struct UnkDungeonGlobal_1822C_Sub));
gDungeon->unk1822C.unk1BA2C[i][j] = FALSE;
}
}
if (!a0) {
gUnknown_203B410.x = 100;
gUnknown_203B410.y = 100;
}
gDungeon->unk1822C.unk1BDCC = 0;
gDungeon->unk1822C.unk1BDD0 = 1;
gDungeon->unk1822C.unk1BDD2 = 0;
gUnknown_202EE00 = 1;
gUnknown_202EE08 = (void *) VRAM + 0x1700;
gUnknown_202EE01 = 1;
sub_8040238();
}
void sub_8040218(void)
{
if (gUnknown_202EE04 != NULL) {
CloseFile(gUnknown_202EE04);
}
sub_8040124();
}
UNUSED static void nullsub_203(void)
{
}
struct UnkStruct1
{
u32 **unk0;
};
struct UnkPaletteFileData
{
struct UnkStruct1 *unk0;
RGB *pal;
};
void sub_8040238(void)
{
s32 i;
if (gUnknown_202EE04 == NULL)
return;
if (!gUnknown_202EE01)
return;
for (i = 0; i < 16; i++) {
if (i == 14) {
SetBGPaletteBufferColorArray(238, &gFontPalette[1]);
nullsub_5(238, &gFontPalette[1]);
}
else {
SetBGPaletteBufferColorArray(i + 224, &((struct UnkPaletteFileData *)(gUnknown_202EE04->data))->pal[i]);
nullsub_5(i + 224, &((struct UnkPaletteFileData *)(gUnknown_202EE04->data))->pal[i]);
}
}
}
extern u8 GetFloorType(void);
extern bool8 sub_8094C48(void);
extern bool8 sub_8045804(Entity *ent);
extern const u8 gUnknown_80F65F0[];
extern bool8 DoesNotHaveShadedMap(void);
void sub_80402AC(s32 x, s32 y)
{
s32 yAdd = 0;
const Tile *tile;
Dungeon *dungeon;
bool8 blinded;
u32 terrainType;
bool8 hallucinating;
bool8 var_2C;
bool8 var_28;
bool8 r0;
bool8 var_24;
bool8 r7;
s32 r6;
s32 xDiv2, yDiv2;
u32 *src, *dst;
bool8 r10;
s32 r3, yMinus;
dungeon = gDungeon;
r10 = TRUE;
if (gUnknown_202EE04 == NULL)
return;
if (!gUnknown_202EE01)
return;
if (sub_800EC74())
return;
if (GAME_VERSION == VERSION_BLUE) {
if (gGameOptionsRef->mapOption == TOP_MAP_AND_TEAM_NO_BOTTOM) {
if (x < 0 || y < 1 || x >= DUNGEON_MAX_SIZE_X || y >= DUNGEON_MAX_SIZE_Y)
return;
yAdd = 1;
}
else {
if (x < 0 || y < 2 || x >= DUNGEON_MAX_SIZE_X || y >= DUNGEON_MAX_SIZE_Y)
return;
yAdd = 0;
}
// FUN_0001d198(); Unknown function call which doesn't exist in red
}
else if (GAME_VERSION == VERSION_RED) {
if (x < 0 || y < 2 || x >= DUNGEON_MAX_SIZE_X || y >= DUNGEON_MAX_SIZE_Y - 1)
return;
}
tile = GetTile(x, y);
terrainType = GetTerrainType(tile);
hallucinating = gDungeon->unk181e8.hallucinating;
blinded = gDungeon->unk181e8.blinded;
var_28 = gDungeon->unk181e8.unk1820F;
var_2C = gDungeon->unk181e8.unk1820E;
r0 = gDungeon->unk181e8.unk1820B;
if (blinded) {
r7 = tile->spawnOrVisibilityFlags & 1;
var_24 = FALSE;
}
else {
if (r0) {
r7 = TRUE;
}
else {
r7 = tile->spawnOrVisibilityFlags & 1;
}
if (GetFloorType() == FLOOR_TYPE_NORMAL) {
var_24 = gDungeon->unk181e8.unk18211;
}
else {
var_24 = FALSE;
}
}
if (sub_8094C48() && !gDungeon->unk1356C) {
r6 = 0;
if (!blinded) {
Entity *entity = tile->monster;
if (entity != NULL) {
s32 entType = GetEntityType(entity);
if (gUnknown_202EE00 && entType == ENTITY_MONSTER && sub_8045804(entity)) {
EntityInfo *entInfo = GetEntInfo(entity);
if (IsExperienceLocked(entInfo->joinedAt.id) || entInfo->monsterBehavior == 1 || entInfo->monsterBehavior == 4) {
r6 = 10;
}
else {
if (entInfo->isNotTeamMember) {
r6 = 2;
}
else if (entInfo->isTeamLeader) {
gUnknown_203B410.x = x;
gUnknown_203B410.y = y;
if (gDungeon->unk181e8.unk18214) {
r6 = 8;
}
}
else {
r6 = 10;
}
}
r10 = FALSE;
}
}
}
if (r10 && !blinded) {
Entity *entity = tile->object;
if (entity != NULL) {
s32 entType = GetEntityType(entity);
if (!r7) {
r6 = 0;
if (entType == ENTITY_ITEM) {
if ((var_2C || (tile->spawnOrVisibilityFlags & 2)) && terrainType != TERRAIN_TYPE_WALL) {
r6 = 3;
}
}
r10 = FALSE;
}
else {
if (entType == ENTITY_TRAP) {
if (entity->isVisible || var_28) {
Trap *trap = GetTrapData(entity);
r6 = gUnknown_80F65F0[trap->id];
r10 = FALSE;
}
}
}
if (r10) {
if (entType == ENTITY_ITEM) {
if ((var_2C || (tile->spawnOrVisibilityFlags & 2)) && terrainType != TERRAIN_TYPE_WALL) {
r6 = 3;
r10 = FALSE;
}
}
}
if (r10) {
if (terrainType != TERRAIN_TYPE_NORMAL) {
r6 = 0;
r10 = FALSE;
}
}
}
else {
if (!r7) {
if (var_24 && (tile->terrainType & TERRAIN_TYPE_STAIRS)) {
if (GetFloorType() == FLOOR_TYPE_NORMAL) {
r6 = 6;
}
else {
r6 = 5;
}
r10 = FALSE;
}
}
else {
if ((tile->terrainType & TERRAIN_TYPE_STAIRS)) {
if (GetFloorType() == FLOOR_TYPE_NORMAL) {
r6 = 6;
}
else {
r6 = 5;
}
r10 = FALSE;
}
}
}
}
if (!r10) {
if (hallucinating) {
if (r6 != 0) {
r6 = 11;
}
}
}
if (r6 == 0) {
if (!r7) {
r6 = 1;
}
else if (terrainType != TERRAIN_TYPE_NORMAL) {
r6 = 1;
}
else {
s32 r4 = 1 | 2 | 4 | 8;
if (y < DUNGEON_MAX_SIZE_Y - 1) {
const Tile *adjacentTile = GetTile(x, y + 1);
if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) {
r4 &= ~(1);
}
}
if (y >= 1) {
const Tile *adjacentTile = GetTile(x, y - 1);
if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) {
r4 &= ~(4);
}
}
if (x < DUNGEON_MAX_SIZE_X - 1) {
const Tile *adjacentTile = GetTile(x + 1, y);
if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) {
r4 &= ~(2);
}
}
if (x >= 1) {
const Tile *adjacentTile = GetTile(x - 1, y);
if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) {
r4 &= ~(8);
}
}
r6 = (s16) r4;
if (tile->spawnOrVisibilityFlags & 2) {
r6 = (s16) (r6 + 16);
}
else {
r6 = (s16) (r6 + 32);
}
}
}
// Not possible on GBA.
if (gGameOptionsRef->mapOption == TOP_MAP_AND_TEAM_NO_BOTTOM) {
r6 = (s16) (r6 + 128);
}
else if (DoesNotHaveShadedMap() == TRUE) {
r6 = (s16) (r6 + 64);
}
}
else {
r6 = 1;
gUnknown_203B410.x = 100;
}
xDiv2 = x / 2;
yMinus = (y - 2) + yAdd;
yDiv2 = (yMinus / 2);
r3 = x - (xDiv2 * 2);
r3 += (yMinus - (yDiv2 * 2)) * 2;
dst = dungeon->unk1822C.unk1822C[yDiv2][xDiv2].arr;
{
struct UnkPaletteFileData *ptr = ((struct UnkPaletteFileData *)(&gUnknown_202EE04->data));
src = ptr->unk0->unk0[r6 * 4 + r3];
}
dst[0] = (dst[0] & src[0]) | src[1];
dst[1] = (dst[1] & src[2]) | src[3];
dst[2] = (dst[2] & src[4]) | src[5];
dst[3] = (dst[3] & src[6]) | src[7];
dst[4] = (dst[4] & src[8]) | src[9];
dst[5] = (dst[5] & src[10]) | src[11];
dst[6] = (dst[6] & src[12]) | src[13];
dst[7] = (dst[7] & src[14]) | src[15];
if (!dungeon->unk1822C.unk1BDD1 && !dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2]) {
s32 id;
dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2] = TRUE;
id = dungeon->unk1822C.unk1BDCC;
if (id < 40) {
dungeon->unk1822C.unk1BBEC[id].ptr1 = gUnknown_202EE08 + ((xDiv2 + yDiv2 * 28) * 32);
dungeon->unk1822C.unk1BBEC[id].ptr2 = dst;
dungeon->unk1822C.unk1BBEC[id].boolPtr = &dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2];
dungeon->unk1822C.unk1BDCC++;
}
else {
dungeon->unk1822C.unk1BDD1 = 1;
}
}
}
extern s32 gUnknown_202EDD0;
void sub_8040788(void)
{
s32 i;
Dungeon *dungeon = gDungeon;
if (dungeon == NULL)
return;
if (!dungeon->unk1822C.unk1BDD0)
return;
if (sub_800EC74())
return;
if (!dungeon->unk1822C.unk1BDD1) {
for (i = 0; i < dungeon->unk1822C.unk1BDCC; i++) {
struct UnkDungeonGlobal_unk1BBEC *ptr = &dungeon->unk1822C.unk1BBEC[i];
u32 *src = ptr->ptr2;
u32 *dst = ptr->ptr1;
if (gUnknown_202EDD0 == 0 || gUnknown_202EDD0 == 3) {
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
}
*ptr->boolPtr = FALSE;
}
}
else {
void *dst, *src;
dungeon->unk1822C.unk1BDD1 = FALSE;
dst = gUnknown_202EE08;
src = dungeon->unk1822C.unk1822C[0][0].arr;
for (i = 0; i < DUNGEON_MAX_SIZE_X * 8; i += 8) {
if (gUnknown_202EDD0 == 0 || gUnknown_202EDD0 == 3) {
CpuCopy(dst, src, 0x100);
}
dst += 0x100;
src += 0x100;
}
dungeon->unk1822C.unk1BDD2 = 1;
}
dungeon->unk1822C.unk1BDCC = 0;
}
extern u8 gUnknown_202EE02;
extern void nullsub_11(SpriteOAM *, s32, UnkSpriteMem *, unkStruct_2039DB0 *);
void sub_8040894(void)
{
if (gDungeon->unk181e8.unk18214)
return;
if (!gDungeon->unk181e8.unk18219)
return;
if (gUnknown_203B410.x >= 100)
return;
if ((++gUnknown_202EE02 & 8) == 0) {
SpriteOAM sprite = {0};
SpriteSetAffine1(&sprite, 0);
SpriteSetAffine2(&sprite, 0);
SpriteSetObjMode(&sprite, 0);
SpriteSetMosaic(&sprite, 0);
SpriteSetBpp(&sprite, 0);
SpriteSetShape(&sprite, 0);
SpriteSetMatrixNum(&sprite, 0);
SpriteSetSize(&sprite, 0);
SpriteSetTileNum(&sprite, 0x215);
SpriteSetPriority(&sprite, 0);
SpriteSetPalNum(&sprite, 15);
SpriteSetUnk6_0(&sprite, 0);
SpriteSetUnk6_1(&sprite, 0);
// Nulled on GBA
if (gGameOptionsRef->mapOption == TOP_MAP_AND_TEAM_NO_BOTTOM) {
SpriteSetX(&sprite, (gUnknown_203B410.x * 4) + 16);
SpriteSetY(&sprite, (gUnknown_203B410.y + 1) * 4);
nullsub_11(&sprite,0x100,NULL,NULL);
}
else {
SpriteSetX(&sprite, (gUnknown_203B410.x * 4) + 8);
SpriteSetY(&sprite, (gUnknown_203B410.y) * 4);
AddSprite(&sprite,0x100,NULL,NULL);
}
}
}
//

77
src/code_8040094_1.c Normal file
View File

@@ -0,0 +1,77 @@
#include "global.h"
#include "code_800558C.h"
#include "code_800C9CC.h"
#include "code_80118A4.h"
#include "dungeon_message.h"
#include "structs/dungeon_entity.h"
#include "structs/str_dungeon.h"
#include "dungeon_map_access.h"
#include "dungeon_music.h"
#include "file_system.h"
#include "play_time.h"
#include "cpu.h"
#include "dungeon.h"
#include "game_options.h"
#include "bg_palette_buffer.h"
#include "code_8009804.h"
#include "code_800E9E4.h"
#include "dungeon_generation.h"
#include "dungeon_util.h"
#include "trap.h"
#include "text.h"
#include "code_804267C.h"
#include "weather.h"
#include "constants/dungeon.h"
extern u8 sub_800EC94(s32 param_1);
extern s32 sub_800E710(s32 a0, u16 a1);
extern void sub_800569C(DungeonPos *, axdata *, u8);
extern void sub_800EEC8(u16 r0);
extern void sub_800EF64(void);
extern s32 sub_800EA84(s32 *param_1);
extern void sub_8042DD4(s32 a0, Entity *a1, s32 a2);
u16 sub_80412E0(u16 moveId, u8 weather, bool32 a2);
bool32 sub_804143C(Entity *entity, Move *move);
bool8 sub_80414C0(Entity *entity, Move *move);
bool8 sub_804141C(u16 moveIdy, u8 weather, bool32 a2);
void sub_8040C4C(Entity *entity, Move *move, bool32 a2);
bool8 sub_8040BB0(Entity *entity, Move *move, bool8 a2)
{
bool32 r8 = sub_804143C(entity, move);
bool8 r9 = sub_804141C(move->id, GetApparentWeather(entity), r8);
s32 r4 = sub_800ECB8(sub_80412E0(move->id, GetApparentWeather(entity), r8))->unk0;
if (!sub_8042768(entity))
return r9;
if (sub_80414C0(entity, move))
return r9;
if (!a2)
return r9;
if (r4 != 0) {
sub_8040C4C(entity, move, r8);
}
return r9;
}
/*
void sub_8040C4C(Entity *entity, Move *move, bool32 a2)
{
DungeonPos pos;
s32 r9 = sub_80412E0(move->id, GetApparentWeather(entity), a2);
EntityInfo *entInfo = GetEntInfo(entity);
bool8 r8 = sub_800EC94(move->id);
s32 apparentId = entInfo->apparentID;
s32 r2 = sub_800E710(apparentId, sub_80412E0(move->id, GetApparentWeather(entity), TRUE));
if (r2 != -1) {
sub_800569C(&pos, &entity->axObj.axdata, r2);
}
else {
pos = (DungeonPos) {0};
}
}
*/
//

552
src/dungeon_map.c Normal file
View File

@@ -0,0 +1,552 @@
#include "global.h"
#include "structs/dungeon_entity.h"
#include "structs/str_dungeon.h"
#include "dungeon_map_access.h"
#include "dungeon_music.h"
#include "file_system.h"
#include "cpu.h"
#include "dungeon.h"
#include "game_options.h"
#include "bg_palette_buffer.h"
#include "code_8009804.h"
#include "code_800E9E4.h"
#include "dungeon_generation.h"
#include "dungeon_util.h"
#include "trap.h"
#include "text.h"
#include "constants/dungeon.h"
extern const char gUnknown_80F6604; // "zmappat"
extern struct FileArchive gDungeonFileArchive;
extern DungeonPos gUnknown_203B410;
extern s32 gUnknown_202EDD0;
extern void nullsub_11(SpriteOAM *, s32, UnkSpriteMem *, unkStruct_2039DB0 *);
extern u8 GetFloorType(void);
extern bool8 sub_8094C48(void);
extern bool8 sub_8045804(Entity *ent);
extern bool8 DoesNotHaveShadedMap(void);
extern const u8 gUnknown_80F65F0[];
EWRAM_DATA u8 gUnknown_202EE00 = 0;
EWRAM_DATA u8 gUnknown_202EE01 = 0;
EWRAM_DATA static u8 gUnknown_202EE02 = 0;
EWRAM_DATA static OpenedFile *gUnknown_202EE04 = NULL;
EWRAM_DATA static void *gUnknown_202EE08 = NULL;
void sub_8040238(void);
void sub_8040124(void)
{
gUnknown_202EE01 = 0;
}
void sub_8040130(void)
{
gUnknown_202EE04 = OpenFileAndGetFileDataPtr(&gUnknown_80F6604, &gDungeonFileArchive);
}
void sub_8040150(bool8 a0)
{
s32 i, j;
for (i = 0; i < UNK1822C_ARR_COUNT; i++) {
for (j = 0; j < UNK1822C_ARR_COUNT_2; j++) {
CpuClear(&gDungeon->unk1822C.unk1822C[i][j], sizeof(struct UnkDungeonGlobal_1822C_Sub));
gDungeon->unk1822C.unk1BA2C[i][j] = FALSE;
}
}
if (!a0) {
gUnknown_203B410.x = 100;
gUnknown_203B410.y = 100;
}
gDungeon->unk1822C.unk1BDCC = 0;
gDungeon->unk1822C.unk1BDD0 = 1;
gDungeon->unk1822C.unk1BDD2 = 0;
gUnknown_202EE00 = 1;
gUnknown_202EE08 = (void *) VRAM + 0x1700;
gUnknown_202EE01 = 1;
sub_8040238();
}
void sub_8040218(void)
{
if (gUnknown_202EE04 != NULL) {
CloseFile(gUnknown_202EE04);
}
sub_8040124();
}
// Used in Pmd's Blue version. Stores different Vram address in gUnknown_202EE08(maybe?), depending on TOP_MAP_AND_TEAM_NO_BOTTOM map option.
UNUSED static void nullsub_203(void)
{
}
struct UnkStruct1
{
u32 **unk0;
};
struct UnkPaletteFileData
{
struct UnkStruct1 *unk0;
RGB *pal;
};
void sub_8040238(void)
{
s32 i;
if (gUnknown_202EE04 == NULL)
return;
if (!gUnknown_202EE01)
return;
for (i = 0; i < 16; i++) {
if (i == 14) {
SetBGPaletteBufferColorArray(238, &gFontPalette[1]);
nullsub_5(238, &gFontPalette[1]);
}
else {
SetBGPaletteBufferColorArray(i + 224, &((struct UnkPaletteFileData *)(gUnknown_202EE04->data))->pal[i]);
nullsub_5(i + 224, &((struct UnkPaletteFileData *)(gUnknown_202EE04->data))->pal[i]);
}
}
}
void sub_80402AC(s32 x, s32 y)
{
s32 yAdd = 0;
const Tile *tile;
Dungeon *dungeon;
bool8 blinded;
u32 terrainType;
bool8 hallucinating;
bool8 var_2C;
bool8 var_28;
bool8 r0;
bool8 var_24;
bool8 r7;
s32 r6;
s32 xDiv2, yDiv2;
u32 *src, *dst;
bool8 r10;
s32 r3, yMinus;
dungeon = gDungeon;
r10 = TRUE;
if (gUnknown_202EE04 == NULL)
return;
if (!gUnknown_202EE01)
return;
if (sub_800EC74())
return;
if (GAME_VERSION == VERSION_BLUE) {
if (gGameOptionsRef->mapOption == TOP_MAP_AND_TEAM_NO_BOTTOM) {
if (x < 0 || y < 1 || x >= DUNGEON_MAX_SIZE_X || y >= DUNGEON_MAX_SIZE_Y)
return;
yAdd = 1;
}
else {
if (x < 0 || y < 2 || x >= DUNGEON_MAX_SIZE_X || y >= DUNGEON_MAX_SIZE_Y)
return;
yAdd = 0;
}
// FUN_0001d198(); Unknown function call which doesn't exist in red
}
else if (GAME_VERSION == VERSION_RED) {
if (x < 0 || y < 2 || x >= DUNGEON_MAX_SIZE_X || y >= DUNGEON_MAX_SIZE_Y - 1)
return;
}
tile = GetTile(x, y);
terrainType = GetTerrainType(tile);
hallucinating = gDungeon->unk181e8.hallucinating;
blinded = gDungeon->unk181e8.blinded;
var_28 = gDungeon->unk181e8.unk1820F;
var_2C = gDungeon->unk181e8.unk1820E;
r0 = gDungeon->unk181e8.unk1820B;
if (blinded) {
r7 = tile->spawnOrVisibilityFlags & 1;
var_24 = FALSE;
}
else {
if (r0) {
r7 = TRUE;
}
else {
r7 = tile->spawnOrVisibilityFlags & 1;
}
if (GetFloorType() == FLOOR_TYPE_NORMAL) {
var_24 = gDungeon->unk181e8.unk18211;
}
else {
var_24 = FALSE;
}
}
if (sub_8094C48() && !gDungeon->unk1356C) {
r6 = 0;
if (!blinded) {
Entity *entity = tile->monster;
if (entity != NULL) {
s32 entType = GetEntityType(entity);
if (gUnknown_202EE00 && entType == ENTITY_MONSTER && sub_8045804(entity)) {
EntityInfo *entInfo = GetEntInfo(entity);
if (IsExperienceLocked(entInfo->joinedAt.id) || entInfo->monsterBehavior == 1 || entInfo->monsterBehavior == 4) {
r6 = 10;
}
else {
if (entInfo->isNotTeamMember) {
r6 = 2;
}
else if (entInfo->isTeamLeader) {
gUnknown_203B410.x = x;
gUnknown_203B410.y = y;
if (gDungeon->unk181e8.unk18214) {
r6 = 8;
}
}
else {
r6 = 10;
}
}
r10 = FALSE;
}
}
}
if (r10 && !blinded) {
Entity *entity = tile->object;
if (entity != NULL) {
s32 entType = GetEntityType(entity);
if (!r7) {
r6 = 0;
if (entType == ENTITY_ITEM) {
if ((var_2C || (tile->spawnOrVisibilityFlags & 2)) && terrainType != TERRAIN_TYPE_WALL) {
r6 = 3;
}
}
r10 = FALSE;
}
else {
if (entType == ENTITY_TRAP) {
if (entity->isVisible || var_28) {
Trap *trap = GetTrapData(entity);
r6 = gUnknown_80F65F0[trap->id];
r10 = FALSE;
}
}
}
if (r10) {
if (entType == ENTITY_ITEM) {
if ((var_2C || (tile->spawnOrVisibilityFlags & 2)) && terrainType != TERRAIN_TYPE_WALL) {
r6 = 3;
r10 = FALSE;
}
}
}
if (r10) {
if (terrainType != TERRAIN_TYPE_NORMAL) {
r6 = 0;
r10 = FALSE;
}
}
}
else {
if (!r7) {
if (var_24 && (tile->terrainType & TERRAIN_TYPE_STAIRS)) {
if (GetFloorType() == FLOOR_TYPE_NORMAL) {
r6 = 6;
}
else {
r6 = 5;
}
r10 = FALSE;
}
}
else {
if ((tile->terrainType & TERRAIN_TYPE_STAIRS)) {
if (GetFloorType() == FLOOR_TYPE_NORMAL) {
r6 = 6;
}
else {
r6 = 5;
}
r10 = FALSE;
}
}
}
}
if (!r10) {
if (hallucinating) {
if (r6 != 0) {
r6 = 11;
}
}
}
if (r6 == 0) {
if (!r7) {
r6 = 1;
}
else if (terrainType != TERRAIN_TYPE_NORMAL) {
r6 = 1;
}
else {
s32 r4 = 1 | 2 | 4 | 8;
if (y < DUNGEON_MAX_SIZE_Y - 1) {
const Tile *adjacentTile = GetTile(x, y + 1);
if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) {
r4 &= ~(1);
}
}
if (y >= 1) {
const Tile *adjacentTile = GetTile(x, y - 1);
if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) {
r4 &= ~(4);
}
}
if (x < DUNGEON_MAX_SIZE_X - 1) {
const Tile *adjacentTile = GetTile(x + 1, y);
if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) {
r4 &= ~(2);
}
}
if (x >= 1) {
const Tile *adjacentTile = GetTile(x - 1, y);
if (GetTerrainType(adjacentTile) == TERRAIN_TYPE_NORMAL) {
r4 &= ~(8);
}
}
r6 = (s16) r4;
if (tile->spawnOrVisibilityFlags & 2) {
r6 = (s16) (r6 + 16);
}
else {
r6 = (s16) (r6 + 32);
}
}
}
// Not possible on GBA.
if (gGameOptionsRef->mapOption == TOP_MAP_AND_TEAM_NO_BOTTOM) {
r6 = (s16) (r6 + 128);
}
else if (DoesNotHaveShadedMap() == TRUE) {
r6 = (s16) (r6 + 64);
}
}
else {
r6 = 1;
gUnknown_203B410.x = 100;
}
xDiv2 = x / 2;
yMinus = (y - 2) + yAdd;
yDiv2 = (yMinus / 2);
r3 = x - (xDiv2 * 2);
r3 += (yMinus - (yDiv2 * 2)) * 2;
dst = dungeon->unk1822C.unk1822C[yDiv2][xDiv2].arr;
{
struct UnkPaletteFileData *ptr = ((struct UnkPaletteFileData *)(&gUnknown_202EE04->data));
src = ptr->unk0->unk0[r6 * 4 + r3];
}
dst[0] = (dst[0] & src[0]) | src[1];
dst[1] = (dst[1] & src[2]) | src[3];
dst[2] = (dst[2] & src[4]) | src[5];
dst[3] = (dst[3] & src[6]) | src[7];
dst[4] = (dst[4] & src[8]) | src[9];
dst[5] = (dst[5] & src[10]) | src[11];
dst[6] = (dst[6] & src[12]) | src[13];
dst[7] = (dst[7] & src[14]) | src[15];
if (!dungeon->unk1822C.unk1BDD1 && !dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2]) {
s32 id;
dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2] = TRUE;
id = dungeon->unk1822C.unk1BDCC;
if (id < 40) {
dungeon->unk1822C.unk1BBEC[id].ptr1 = gUnknown_202EE08 + ((xDiv2 + yDiv2 * 28) * 32);
dungeon->unk1822C.unk1BBEC[id].ptr2 = dst;
dungeon->unk1822C.unk1BBEC[id].boolPtr = &dungeon->unk1822C.unk1BA2C[yDiv2][xDiv2];
dungeon->unk1822C.unk1BDCC++;
}
else {
dungeon->unk1822C.unk1BDD1 = 1;
}
}
}
void sub_8040788(void)
{
s32 i;
Dungeon *dungeon = gDungeon;
if (dungeon == NULL)
return;
if (!dungeon->unk1822C.unk1BDD0)
return;
if (sub_800EC74())
return;
if (!dungeon->unk1822C.unk1BDD1) {
for (i = 0; i < dungeon->unk1822C.unk1BDCC; i++) {
struct UnkDungeonGlobal_unk1BBEC *ptr = &dungeon->unk1822C.unk1BBEC[i];
u32 *src = ptr->ptr2;
u32 *dst = ptr->ptr1;
if (gUnknown_202EDD0 == 0 || gUnknown_202EDD0 == 3) {
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
}
*ptr->boolPtr = FALSE;
}
}
else {
void *dst, *src;
dungeon->unk1822C.unk1BDD1 = FALSE;
dst = gUnknown_202EE08;
src = dungeon->unk1822C.unk1822C[0][0].arr;
for (i = 0; i < DUNGEON_MAX_SIZE_X * 8; i += 8) {
if (gUnknown_202EDD0 == 0 || gUnknown_202EDD0 == 3) {
CpuCopy(dst, src, 0x100);
}
dst += 0x100;
src += 0x100;
}
dungeon->unk1822C.unk1BDD2 = 1;
}
dungeon->unk1822C.unk1BDCC = 0;
}
void sub_8040894(void)
{
if (gDungeon->unk181e8.unk18214)
return;
if (!gDungeon->unk181e8.unk18219)
return;
if (gUnknown_203B410.x >= 100)
return;
if ((++gUnknown_202EE02 & 8) == 0) {
SpriteOAM sprite = {0};
SpriteSetAffine1(&sprite, 0);
SpriteSetAffine2(&sprite, 0);
SpriteSetObjMode(&sprite, 0);
SpriteSetMosaic(&sprite, 0);
SpriteSetBpp(&sprite, 0);
SpriteSetShape(&sprite, 0);
SpriteSetMatrixNum(&sprite, 0);
SpriteSetSize(&sprite, 0);
SpriteSetTileNum(&sprite, 0x215);
SpriteSetPriority(&sprite, 0);
SpriteSetPalNum(&sprite, 15);
SpriteSetUnk6_0(&sprite, 0);
SpriteSetUnk6_1(&sprite, 0);
// Nulled on GBA
if (gGameOptionsRef->mapOption == TOP_MAP_AND_TEAM_NO_BOTTOM) {
SpriteSetX(&sprite, (gUnknown_203B410.x * 4) + 16);
SpriteSetY(&sprite, (gUnknown_203B410.y + 1) * 4);
nullsub_11(&sprite,0x100,NULL,NULL);
}
else {
SpriteSetX(&sprite, (gUnknown_203B410.x * 4) + 8);
SpriteSetY(&sprite, (gUnknown_203B410.y) * 4);
AddSprite(&sprite,0x100,NULL,NULL);
}
}
}
void sub_8040A78(void)
{
gUnknown_202EE02 = 0;
}
void sub_8040A84(void)
{
s32 x, y;
gDungeon->unk1822C.unk1BDD1 = TRUE;
for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) {
for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) {
sub_80402AC(x, y);
}
}
}
void sub_8040ABC(bool8 a0)
{
s32 id, count1, count2;
s32 i, j;
u16 val;
if (gGameOptionsRef->mapOption == TOP_MAP_AND_TEAM_NO_BOTTOM) {
count1 = 15;
count2 = 0;
}
else if (a0) {
count1 = 14;
count2 = 0;
}
else {
count1 = 16;
count2 = 3;
}
val = 0xE0B8;
id = 1;
for (i = 0; i < count1; i++) {
u16 *ptr = &gUnknown_202B038[0][id][1];
for (j = 0; j < 28; j++) {
*ptr++ = val++;
}
id++;
}
for (i = 0; i < count2; i++) {
u16 *ptr = &gUnknown_202B038[0][id][1];
for (j = 0; j < 28; j++) {
*ptr++ = 0xE000;
}
id++;
}
}
// BUG: Overflowing into unk1BBEC. They forgot that the array size is max X/Y divided by two...
void sub_8040B60(void)
{
s32 x, y;
Dungeon *dungeon = gDungeon;
if (dungeon->unk1822C.unk1BDD2) {
#ifdef BUGFIX
for (y = 0; y < UNK1822C_ARR_COUNT; y++) {
for (x = 0; x < UNK1822C_ARR_COUNT_2; x++) {
dungeon->unk1822C.unk1BA2C[y][x] = FALSE;
}
}
#else
for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) {
for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) {
dungeon->unk1822C.unk1BA2C[y][x] = FALSE;
}
}
#endif // BUGFIX
dungeon->unk1822C.unk1BDD2 = FALSE;
}
}

View File

@@ -109,16 +109,7 @@ gUnknown_202EDE8: /* 202EDE8 (sub_803E250 - sub_803EDF0) */
gUnknown_202EDFC: /* 202EDFC (sub_803F27C - sub_803F878) */
.space 0x4
gUnknown_202EE00: /* 202EE00 (sub_8040150 - sub_805D8C8) */
.space 0x1
gUnknown_202EE01: /* 202EE01 (sub_8040124 - PrintFieldMessage) */
.space 0x1
gUnknown_202EE02: /* 202EE02 (sub_8040894 - sub_8040A78) */
.space 0x2
gUnknown_202EE04: /* 202EE04 (sub_8040130 - sub_80402AC) */
.space 0x4
gUnknown_202EE08: /* 202EE08 (sub_8040150 - sub_8040788) */
.space 0x4
.include "src/dungeon_map.o"
gUnknown_202EE0C: /* 202EE0C (sub_80694C0 - sub_806B8CC) */
.space 0x4