sub_80ADF8C

This commit is contained in:
DizzyEggg
2025-05-13 13:42:17 +02:00
parent 2fd84a6e50
commit ccaf1e46a7
2 changed files with 188 additions and 447 deletions

View File

@@ -5,451 +5,7 @@
.text
thumb_func_start GroundEvent_Delete
GroundEvent_Delete:
push {r4,lr}
adds r2, r0, 0
lsls r2, 16
asrs r2, 16
ldr r0, _080ADC58
lsls r1, r2, 5
ldr r4, [r0]
adds r4, r1
ldr r1, _080ADC5C
movs r0, 0
bl Log
ldr r0, _080ADC60
strh r0, [r4, 0x2]
pop {r4}
pop {r0}
bx r0
.align 2, 0
_080ADC58: .4byte gGroundEvents
_080ADC5C: .4byte gGroundEventDeleteText
_080ADC60: .4byte 0x0000ffff
thumb_func_end GroundEvent_Delete
thumb_func_start sub_80ADC64
sub_80ADC64:
push {lr}
adds r3, r1, 0
lsls r0, 16
ldr r1, _080ADC84
asrs r0, 11
ldr r1, [r1]
adds r2, r1, r0
movs r0, 0x2
ldrsh r1, [r2, r0]
movs r0, 0x1
negs r0, r0
cmp r1, r0
bne _080ADC88
movs r0, 0
b _080ADC9A
.align 2, 0
_080ADC84: .4byte gGroundEvents
_080ADC88:
ldr r0, [r2, 0x1C]
str r0, [r3]
movs r0, 0x2
strh r0, [r3, 0x4]
ldrh r0, [r2, 0x4]
strh r0, [r3, 0x6]
ldrb r0, [r2, 0x6]
strb r0, [r3, 0x8]
movs r0, 0x1
_080ADC9A:
pop {r1}
bx r1
thumb_func_end sub_80ADC64
thumb_func_start FindGroundEvent
FindGroundEvent:
push {r4-r7,lr}
adds r7, r0, 0
adds r4, r1, 0
ldr r0, _080ADCEC
ldr r3, [r0]
movs r5, 0
movs r0, 0x1
negs r0, r0
mov r12, r0
movs r6, 0x80
lsls r6, 9
_080ADCB6:
movs r1, 0x2
ldrsh r0, [r3, r1]
cmp r0, r12
beq _080ADCF0
ldr r0, [r3, 0x8]
ands r0, r7
cmp r0, 0
beq _080ADCF0
ldr r1, [r3, 0xC]
ldr r0, [r2]
cmp r1, r0
bge _080ADCF0
ldr r1, [r3, 0x14]
ldr r0, [r4]
cmp r1, r0
ble _080ADCF0
ldr r1, [r3, 0x10]
ldr r0, [r2, 0x4]
cmp r1, r0
bge _080ADCF0
ldr r1, [r3, 0x18]
ldr r0, [r4, 0x4]
cmp r1, r0
ble _080ADCF0
adds r0, r5, 0
b _080ADD04
.align 2, 0
_080ADCEC: .4byte gGroundEvents
_080ADCF0:
adds r0, r6, 0
movs r1, 0x80
lsls r1, 9
adds r6, r1
asrs r5, r0, 16
adds r3, 0x20
cmp r5, 0x1F
ble _080ADCB6
movs r0, 0x1
negs r0, r0
_080ADD04:
pop {r4-r7}
pop {r1}
bx r1
thumb_func_end FindGroundEvent
thumb_func_start sub_80ADD0C
sub_80ADD0C:
push {r4-r7,lr}
mov r7, r9
mov r6, r8
push {r6,r7}
mov r8, r0
adds r6, r1, 0
adds r5, r2, 0
ldr r0, _080ADD74
ldr r4, [r0]
movs r7, 0
movs r0, 0x1
negs r0, r0
mov r9, r0
movs r1, 0x80
lsls r1, 9
mov r12, r1
_080ADD2C:
movs r1, 0x2
ldrsh r0, [r4, r1]
cmp r0, r9
beq _080ADD78
ldr r0, [r4, 0x8]
mov r1, r8
ands r0, r1
cmp r0, 0
beq _080ADD78
ldr r0, [r4, 0xC]
ldr r1, [r4, 0x14]
adds r0, r1
lsrs r1, r0, 31
adds r0, r1
asrs r2, r0, 1
ldr r0, [r4, 0x10]
ldr r1, [r4, 0x18]
adds r0, r1
lsrs r1, r0, 31
adds r0, r1
asrs r3, r0, 1
ldr r0, [r5]
cmp r2, r0
bge _080ADD78
ldr r0, [r6]
cmp r2, r0
ble _080ADD78
ldr r0, [r5, 0x4]
cmp r3, r0
bge _080ADD78
ldr r0, [r6, 0x4]
cmp r3, r0
ble _080ADD78
adds r0, r7, 0
b _080ADD8C
.align 2, 0
_080ADD74: .4byte gGroundEvents
_080ADD78:
mov r0, r12
movs r1, 0x80
lsls r1, 9
add r12, r1
asrs r7, r0, 16
adds r4, 0x20
cmp r7, 0x1F
ble _080ADD2C
movs r0, 0x1
negs r0, r0
_080ADD8C:
pop {r3,r4}
mov r8, r3
mov r9, r4
pop {r4-r7}
pop {r1}
bx r1
thumb_func_end sub_80ADD0C
thumb_func_start nullsub_124
nullsub_124:
bx lr
thumb_func_end nullsub_124
thumb_func_start sub_80ADD9C
sub_80ADD9C:
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
sub sp, 0x30
str r0, [sp, 0x20]
str r1, [sp, 0x24]
str r2, [sp, 0x28]
str r3, [sp, 0x2C]
ldr r5, [sp, 0x54]
ldr r0, [sp, 0x5C]
mov r9, r0
movs r0, 0x93
lsls r0, 4
movs r1, 0x7
bl MemoryAlloc
mov r10, r0
ldr r0, _080ADEB4
ldr r7, _080ADEB8
adds r1, r7, 0
bl OpenFileAndGetFileDataPtr
adds r6, r0, 0
add r4, sp, 0x1C
adds r0, r4, 0
adds r1, r5, 0
bl sub_80901D8
ldrb r5, [r4]
ldrb r4, [r4, 0x1]
cmp r5, 0x3E
bls _080ADDE2
movs r5, 0x3E
_080ADDE2:
cmp r4, 0
bgt _080ADDE8
movs r4, 0x1
_080ADDE8:
adds r0, r5, 0
bl GetDungeonFloorCount
cmp r4, r0
blt _080ADDFA
adds r0, r5, 0
bl GetDungeonFloorCount
subs r4, r0, 0x1
_080ADDFA:
ldr r2, [r6, 0x4]
ldr r1, [r2]
lsls r0, r5, 2
adds r0, r1
lsls r1, r4, 4
ldr r0, [r0]
adds r0, r1
movs r3, 0
ldrsh r1, [r0, r3]
ldr r2, [r2, 0x4]
lsls r0, r1, 3
subs r0, r1
lsls r0, 2
adds r0, r2
ldrb r0, [r0, 0x2]
mov r8, r0
adds r0, r6, 0
bl CloseFile
ldr r1, _080ADEBC
ldr r0, _080ADEC0
add r0, r8
ldrb r5, [r0]
add r0, sp, 0x10
adds r2, r5, 0
bl sprintf
add r0, sp, 0x10
adds r1, r7, 0
bl OpenFileAndGetFileDataPtr
adds r4, r0, 0
ldr r0, [sp, 0x28]
movs r1, 0
adds r2, r4, 0
bl DecompressATGlobalFile
adds r0, r4, 0
bl CloseFile
ldr r1, _080ADEC4
add r0, sp, 0x10
mov r2, r8
bl sprintf
add r0, sp, 0x10
adds r1, r7, 0
bl OpenFile
ldr r1, [sp, 0x20]
str r0, [r1]
ldr r1, _080ADEC8
add r0, sp, 0x10
adds r2, r5, 0
bl sprintf
add r0, sp, 0x10
adds r1, r7, 0
bl OpenFileAndGetFileDataPtr
adds r4, r0, 0
ldr r1, _080ADECC
ldr r0, [sp, 0x2C]
adds r2, r4, 0
bl DecompressATFile
adds r0, r4, 0
bl CloseFile
mov r2, r8
cmp r2, 0x3F
bgt _080ADED4
ldr r1, _080ADED0
add r0, sp, 0x10
adds r2, r5, 0
bl sprintf
add r0, sp, 0x10
adds r1, r7, 0
bl OpenFileAndGetFileDataPtr
adds r4, r0, 0
mov r0, r10
movs r1, 0x93
lsls r1, 4
adds r2, r4, 0
bl DecompressATFile
adds r0, r4, 0
bl CloseFile
b _080ADEFC
.align 2, 0
_080ADEB4: .4byte gMapparamText
_080ADEB8: .4byte gDungeonFileArchive
_080ADEBC: .4byte gUnknown_811889C
_080ADEC0: .4byte gUnknown_8108EC0
_080ADEC4: .4byte gUnknown_81188A8
_080ADEC8: .4byte gUnknown_81188B4
_080ADECC: .4byte 0x00001194
_080ADED0: .4byte gUnknown_81188C0
_080ADED4:
ldr r1, _080ADF80
add r0, sp, 0x10
mov r2, r8
ldr r3, [sp, 0x58]
bl sprintf
add r0, sp, 0x10
adds r1, r7, 0
bl OpenFileAndGetFileDataPtr
adds r4, r0, 0
movs r1, 0x90
lsls r1, 2
mov r0, r10
adds r2, r4, 0
bl DecompressATFile
adds r0, r4, 0
bl CloseFile
_080ADEFC:
movs r5, 0
ldr r3, [sp, 0x60]
cmp r5, r3
bge _080ADF52
_080ADF04:
mov r0, r8
bl IsWaterDungeon
lsls r0, 24
movs r7, 0
cmp r0, 0
beq _080ADF14
movs r7, 0x3
_080ADF14:
movs r4, 0
adds r6, r5, 0x1
cmp r4, r9
bge _080ADF4A
_080ADF1C:
ldr r0, [sp, 0x64]
str r0, [sp]
str r7, [sp, 0x4]
mov r1, r10
str r1, [sp, 0x8]
mov r2, r8
str r2, [sp, 0xC]
adds r0, r4, 0
adds r1, r5, 0
mov r2, r9
ldr r3, [sp, 0x60]
bl sub_80ADFB8
mov r1, r9
muls r1, r5
adds r1, r4
lsls r1, 1
ldr r3, [sp, 0x50]
adds r1, r3
strh r0, [r1]
adds r4, 0x1
cmp r4, r9
blt _080ADF1C
_080ADF4A:
adds r5, r6, 0
ldr r0, [sp, 0x60]
cmp r5, r0
blt _080ADF04
_080ADF52:
ldr r1, _080ADF84
add r0, sp, 0x10
mov r2, r8
bl sprintf
ldr r1, _080ADF88
add r0, sp, 0x10
bl OpenFile
ldr r1, [sp, 0x24]
str r0, [r1]
mov r0, r10
bl MemoryFree
add sp, 0x30
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_080ADF80: .4byte gUnknown_81188CC
_080ADF84: .4byte gUnknown_81188DC
_080ADF88: .4byte gDungeonFileArchive
thumb_func_end sub_80ADD9C
thumb_func_start sub_80ADF8C
sub_80ADF8C:
push {r4,lr}
adds r4, r0, 0
ldr r0, [sp, 0xC]
cmp r4, 0
blt _080ADFB0
cmp r1, 0
blt _080ADFB0
cmp r4, r2
bge _080ADFB0
cmp r1, r3
bge _080ADFB0
adds r0, r1, 0
muls r0, r2
adds r0, r4, r0
lsls r0, 1
ldr r1, [sp, 0x8]
adds r0, r1
ldrh r0, [r0]
_080ADFB0:
pop {r4}
pop {r1}
bx r1
thumb_func_end sub_80ADF8C
thumb_func_start sub_80ADFB8
sub_80ADFB8:

View File

@@ -7,7 +7,7 @@ typedef struct GroundEvent
{
s16 unk0;
s16 unk2;
s16 unk4; // scriptID
s16 unk4; // scriptID or group?
s8 unk6; // sector
s32 unk8;
s32 unkC;
@@ -29,6 +29,7 @@ extern DebugLocation gUnknown_81187DC;
extern u8 gGroundEventSelectText[];
extern u8 gGroundEventCancelText[];
extern u8 gGroundEventAddText[];
extern u8 gGroundEventDeleteText[];
void AllocGroundEvents(void) {
s32 ind;
@@ -133,8 +134,8 @@ static inline void SetUnkInGroundEvent(const CompactPos *posPtr, s32 *dst)
struct TestStruct
{
u32 unk0;
u32 unk4;
s32 unk0;
s32 unk4;
};
extern struct TestStruct sUnknown; // Todo: figure out or guess what this variable could be.
@@ -204,3 +205,187 @@ s32 GroundEvent_Add(s32 id, const GroundEventData *eventData, s32 group, s32 sec
return scriptID_s32;
}
void GroundEvent_Delete(s32 id)
{
s32 scriptID_s32 = (s16) id;
GroundEvent *ptr = &gGroundEvents[scriptID_s32];
Log(0, gGroundEventDeleteText, scriptID_s32);
ptr->unk2 = -1;
}
bool8 sub_80ADC64(s32 id, ScriptInfoSmall *dst)
{
s32 scriptID_s32 = (s16) id;
GroundEvent *ptr = &gGroundEvents[scriptID_s32];
if (ptr->unk2 != -1) {
dst->ptr = ptr->unk1C;
dst->state = 2;
dst->group = ptr->unk4;
dst->sector = ptr->unk6;
return TRUE;
}
else {
return FALSE;
}
}
s16 FindGroundEvent(u32 flags, s32 *arg1, s32 *arg2)
{
s32 i;
GroundEvent *ptr = &gGroundEvents[0];
for (i = 0; i < 0x20; i = (s16)(i + 1), ptr++) {
if (ptr->unk2 != -1
&& (ptr->unk8 & flags)
&& ptr->unkC < arg2[0]
&& ptr->unk14 > arg1[0]
&& ptr->unk10 < arg2[1]
&& ptr->unk18 > arg1[1])
{
return i;
}
}
return -1;
}
UNUSED static s16 UnusedFindGroundEvent(u32 flags, s32 *arg1, s32 *arg2)
{
s32 i;
GroundEvent *ptr = &gGroundEvents[0];
for (i = 0; i < 0x20; i = (s16)(i + 1), ptr++) {
if (ptr->unk2 != -1 && (ptr->unk8 & flags)) {
struct TestStruct r = {0};
r.unk0 = (ptr->unkC + ptr->unk14) / 2;
r.unk4 = (ptr->unk10 + ptr->unk18) / 2;
if (r.unk0 < arg2[0]
&& r.unk0 > arg1[0]
&& r.unk4 < arg2[1]
&& r.unk4 > arg1[1])
{
return i;
}
}
}
return -1;
}
void nullsub_124(void) {}
// TODO: Check if file split here
#include "dungeon.h"
#include "decompress_at.h"
#include "def_filearchives.h"
#include "file_system.h"
#include "constants/dungeon.h"
extern bool8 IsWaterDungeon(u32 r0);
struct UnkDungeonFileData
{
s16 unk0;
s16 unk2;
s16 unk4;
s16 unk6[5];
};
struct UnkDataFileStruct
{
struct UnkDungeonFileData **unk0;
FloorProperties *unk4;
u16 **unk8;
UnkDungeonGlobal_unk1CD98 **unkC;
u16 **unk10;
};
s32 sub_80ADFB8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5, void *a6, s32 a7);
extern const u8 gUnknown_8108EC0[];
extern const u8 gMapparamText[];
extern const u8 gUnknown_811889C[];
extern const u8 gUnknown_81188B4[];
extern const u8 gUnknown_81188A8[];
extern const u8 gUnknown_81188C0[];
extern const u8 gUnknown_81188CC[];
extern const u8 gUnknown_81188DC[];
void sub_80ADD9C(OpenedFile **a0, OpenedFile **a1, u32 *a2, u32 *a3, u16 *a4, DungeonLocation *a5, s32 a6, s32 a7, s32 a8, s32 a9)
{
OpenedFile *file;
s32 r8;
s32 i, j;
u8 name[12];
DungeonLocation dungLoc;
u8 dungId;
s32 dungFloor;
struct UnkDungeonFileData *strPtr;
void *r10 = MemoryAlloc(0x930, 7);
OpenedFile *mapParamFile = OpenFileAndGetFileDataPtr(gMapparamText, &gDungeonFileArchive);
sub_80901D8(&dungLoc, a5);
dungId = dungLoc.id;
dungFloor = dungLoc.floor;
if (dungId > 62) {
dungId = 62;
}
if (dungFloor <= 0) {
dungFloor = 1;
}
if (dungFloor >= GetDungeonFloorCount(dungId)) {
dungFloor = GetDungeonFloorCount(dungId) - 1;
}
strPtr = &((struct UnkDataFileStruct *)(mapParamFile->data))->unk0[dungId][dungFloor];
r8 = ((struct UnkDataFileStruct *)(mapParamFile->data))->unk4[strPtr->unk0].unk2;
CloseFile(mapParamFile);
sprintf(name, gUnknown_811889C, gUnknown_8108EC0[r8]);
file = OpenFileAndGetFileDataPtr(name, &gDungeonFileArchive);
DecompressATGlobalFile(a2, 0, file);
CloseFile(file);
sprintf(name, gUnknown_81188A8, r8);
*a0 = OpenFile(name, &gDungeonFileArchive);
sprintf(name, gUnknown_81188B4, gUnknown_8108EC0[r8]);
file = OpenFileAndGetFileDataPtr(name, &gDungeonFileArchive);
DecompressATFile(a3, 0x1194, file);
CloseFile(file);
if (r8 < 64) {
sprintf(name, gUnknown_81188C0, gUnknown_8108EC0[r8]);
file = OpenFileAndGetFileDataPtr(name, &gDungeonFileArchive);
DecompressATFile(r10, 0x930, file);
CloseFile(file);
}
else {
sprintf(name, gUnknown_81188CC, r8, a6);
file = OpenFileAndGetFileDataPtr(name, &gDungeonFileArchive);
DecompressATFile(r10, 0x240, file);
CloseFile(file);
}
for (i = 0; i < a8; i++) {
s32 r7 = !IsWaterDungeon(r8) ? 0 : 3;
for (j = 0; j < a7; j++) {
a4[(i * a7) + j] = sub_80ADFB8(j, i, a7, a8, a9, r7, r10, r8);
}
}
sprintf(name, gUnknown_81188DC, r8);
*a1 = OpenFile(name, &gDungeonFileArchive);
MemoryFree(r10);
}
s32 sub_80ADF8C(s32 a0, s32 a1, s32 a2, s32 a3, u16 *a4, s32 a5)
{
s32 ret = a5;
if (a0 >= 0 && a1 >= 0 && a0 < a2 && a1 < a3) {
ret = a4[a0 + (a1 * a2)];
}
return ret;
}