mirror of
https://github.com/pret/pmd-red.git
synced 2026-08-24 01:35:07 -05:00
split dungeon map file
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
77
src/code_8040094_1.c
Normal 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
552
src/dungeon_map.c
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user