Match sub_8071B48 thanks to @Eebit

This commit is contained in:
Seth Barberee 2023-11-17 15:48:21 -08:00
parent 3b8bc8f67b
commit c0cd5d0048
5 changed files with 142 additions and 255 deletions

View File

@ -5,254 +5,6 @@
.text
thumb_func_start sub_8071B48
sub_8071B48:
push {r4-r7,lr}
mov r7, r8
push {r7}
sub sp, 0x14
movs r0, 0
mov r8, r0
ldr r0, _08071B94
ldr r6, [r0]
ldr r1, _08071B98
adds r0, r6, r1
movs r2, 0
ldrsh r0, [r0, r2]
cmp r0, 0
bne _08071B66
b _08071D3E
_08071B66:
subs r1, 0x20
adds r0, r6, r1
ldrb r0, [r0]
cmp r0, 0x15
bne _08071B7C
ldr r2, _08071B9C
adds r0, r6, r2
ldrb r0, [r0]
cmp r0, 0
beq _08071B7C
b _08071D3E
_08071B7C:
ldr r0, _08071BA0
adds r1, r6, r0
ldrh r0, [r1]
adds r2, r0, 0x1
strh r2, [r1]
ldr r1, _08071BA4
adds r0, r6, r1
ldrb r0, [r0]
cmp r0, 0
bne _08071BAC
ldr r0, _08071BA8
b _08071BAE
.align 2, 0
_08071B94: .4byte gDungeon
_08071B98: .4byte 0x00000664
_08071B9C: .4byte 0x000037fd
_08071BA0: .4byte 0x00000662
_08071BA4: .4byte 0x0000066e
_08071BA8: .4byte gUnknown_80F4DAA
_08071BAC:
ldr r0, _08071C60
_08071BAE:
lsls r1, r2, 16
asrs r1, 16
movs r2, 0
ldrsh r0, [r0, r2]
cmp r1, r0
bge _08071BBC
b _08071D3E
_08071BBC:
ldr r1, _08071C64
adds r0, r6, r1
movs r2, 0
ldrsh r1, [r0, r2]
movs r0, 0xE1
lsls r0, 2
cmp r1, r0
ble _08071BF6
ldr r1, _08071C68
adds r0, r6, r1
ldr r4, [r0]
adds r0, r4, 0
bl EntityExists
lsls r0, 24
cmp r0, 0
beq _08071BF6
ldrh r0, [r4, 0x26]
ldr r2, _08071C6C
adds r1, r6, r2
ldr r1, [r1]
cmp r0, r1
bne _08071BF6
ldr r0, _08071C70
adds r1, r4, 0
movs r2, 0
bl SetMessageArgument
mov r8, r4
_08071BF6:
ldr r1, _08071C64
adds r0, r6, r1
movs r1, 0
strh r1, [r0]
ldr r2, _08071C68
adds r0, r6, r2
str r1, [r0]
movs r7, 0
movs r5, 0
_08071C08:
lsls r0, r5, 2
ldr r2, _08071C74
adds r1, r6, r2
adds r1, r0
ldr r4, [r1]
adds r0, r4, 0
bl EntityExists
lsls r0, 24
cmp r0, 0
beq _08071C3A
movs r1, 0x4
ldrsh r0, [r4, r1]
movs r2, 0x6
ldrsh r1, [r4, r2]
bl GetTile
ldrh r0, [r0]
movs r2, 0x80
lsls r2, 1
adds r1, r2, 0
ands r0, r1
cmp r0, 0
bne _08071C3A
adds r7, 0x1
_08071C3A:
adds r5, 0x1
cmp r5, 0xF
ble _08071C08
ldr r1, _08071C78
adds r0, r6, r1
ldrb r0, [r0]
cmp r0, 0
bne _08071C92
ldr r0, _08071C7C
ldr r0, [r0]
ldr r2, _08071C80
adds r0, r2
ldrb r0, [r0]
cmp r0, 0xFF
bne _08071C88
ldr r0, _08071C84
movs r1, 0
ldrsh r0, [r0, r1]
b _08071C8E
.align 2, 0
_08071C60: .4byte gUnknown_80F4DAC
_08071C64: .4byte 0x00000662
_08071C68: .4byte 0x00017b34
_08071C6C: .4byte 0x00017b40
_08071C70: .4byte gAvailablePokemonNames
_08071C74: .4byte 0x0001358c
_08071C78: .4byte 0x0000066e
_08071C7C: .4byte gDungeon
_08071C80: .4byte 0x00003a0c
_08071C84: .4byte gUnknown_80F4DA6
_08071C88:
ldr r0, _08071CB8
movs r2, 0
ldrsh r0, [r0, r2]
_08071C8E:
cmp r7, r0
bge _08071D3E
_08071C92:
mov r0, r8
cmp r0, 0
beq _08071CA8
ldr r0, _08071CBC
ldr r1, [r0]
movs r0, 0
bl sub_805239C
mov r0, r8
bl sub_8042920
_08071CA8:
ldr r1, _08071CC0
adds r0, r6, r1
ldrb r0, [r0]
cmp r0, 0
beq _08071CC4
movs r5, 0xBE
lsls r5, 1
b _08071CCE
.align 2, 0
_08071CB8: .4byte gUnknown_80F4DA8
_08071CBC: .4byte gUnknown_80FED68
_08071CC0: .4byte 0x0000066e
_08071CC4:
movs r0, 0
bl sub_803D970
lsls r0, 16
asrs r5, r0, 16
_08071CCE:
adds r0, r5, 0
bl sub_803DA20
adds r4, r0, 0
cmp r4, 0
bne _08071CDC
movs r4, 0x1
_08071CDC:
adds r0, r5, 0
movs r1, 0
bl sub_806AA0C
lsls r0, 24
cmp r0, 0
beq _08071D3E
add r0, sp, 0xC
bl sub_8083660
lsls r0, 24
cmp r0, 0
beq _08071D3E
mov r0, sp
movs r1, 0
strh r5, [r0]
strh r4, [r0, 0x8]
strb r1, [r0, 0x2]
movs r0, 0x64
bl DungeonRandInt
adds r4, r0, 0
ldr r0, _08071D24
ldr r0, [r0]
ldr r2, _08071D28
adds r0, r2
ldrb r0, [r0]
bl GetRandomMovementChance
lsls r0, 16
asrs r0, 16
cmp r4, r0
bge _08071D2C
movs r0, 0x1
b _08071D2E
.align 2, 0
_08071D24: .4byte gDungeon
_08071D28: .4byte 0x00000644
_08071D2C:
movs r0, 0
_08071D2E:
str r0, [sp, 0x4]
mov r1, sp
movs r0, 0
strb r0, [r1, 0x10]
mov r0, sp
movs r1, 0
bl sub_806B7F8
_08071D3E:
add sp, 0x14
pop {r3}
mov r8, r3
pop {r4-r7}
pop {r0}
bx r0
thumb_func_end sub_8071B48
thumb_func_start sub_8071D4C
sub_8071D4C:
push {lr}
@ -2224,4 +1976,4 @@ _08072C80: .4byte 0x0000013d
_08072C84: .4byte gAdjacentTileOffsets
thumb_func_end sub_8072B78
.align 2, 0
.align 2, 0

View File

@ -41,6 +41,7 @@ const u8 *GetDungeonName1(u8 dungeon);
u32 GetMaxItemsAllowed(u8 dungeon);
s8 GetRescuesAllowed(u8 dungeon);
bool8 HasCheckpoint(u8 dungeon);
s16 GetRandomMovementChance(u8 dungeon);
void PrintYellowDungeonNametoBuffer(u8 *buffer, DungeonLocation *dungeonLocation);
void PrintDungeonLocationtoBuffer(u8 *buffer, DungeonLocation *dungeonLocation);
@ -48,4 +49,4 @@ u32 sub_80908D8(DungeonLocation *dungeon);
u8 sub_8090910(DungeonLocation *dungeon, u32 param_2);
bool8 sub_809095C(u8 dungeon);
#endif // GUARD_DUNGEON_H
#endif // GUARD_DUNGEON_H

View File

@ -99,7 +99,8 @@ typedef struct Dungeon
u8 unk65C;
u8 fill65D[0x660 - 0x65D];
/* 0x660 */ s16 fractionalTurn; // Handles turn order when Pokémon have different movement speeds.
u8 fill662[0x666 - 0x662];
s16 unk662;
s16 unk664;
/* 0x666 */ s16 windTurns; // Turns remaining before getting swept out of the dungeon.
/* 0x668 */ u16 unk668;
u16 bossSongIndex;
@ -139,7 +140,8 @@ typedef struct Dungeon
/* 0x3904 */ s16 unk3904;
u8 fill3906[0x3A08 - 0x3906];
/* 0x3A08 */ u8 unk3A08;
u8 fill3A09[0x3A0D - 0x3A09];
u8 fill3A09[0x3A0C - 0x3A09];
u8 unk3A0C;
/* 0x3A0D */ u8 unk3A0D;
/* 0x3A0E */ s16 tileset;
/* 0x3A10 */ u16 unk3A10;
@ -198,10 +200,10 @@ typedef struct Dungeon
/* 0x15E2C */ Entity unk15E2C[0x40];
/* 0x17B2C */ Entity *lightningRodPokemon;
/* 0x17B30 */ Entity *snatchPokemon;
/* 0x17B34 */ u8 fillunk1734[0x17B38 - 0x17B34];
/* 0x17B34 */ Entity *unk17B34;
/* 0x17B38 */ u32 unk17B38;
/* 0x17B3C */ u32 unk17B3C;
u8 fill17B40[0x17B44 - 0x17B40];
/* 0x17B3C */ u32 unk17B40;
/* 0x17B44 */ OpenedFile *sprites[MONSTER_MAX];
/* 0x181E4 */ OpenedFile *paletFile;
/* 0x181E8 */ Position cameraPos;
@ -236,4 +238,4 @@ typedef struct Dungeon
extern Dungeon *gDungeon;
#endif // GUARD_STR_DUNGEON_H
#endif // GUARD_STR_DUNGEON_H

View File

@ -242,6 +242,7 @@ SECTIONS {
src/dungeon_capabilities.o(.text);
src/dungeon_ai_targeting.o(.text);
src/dungeon_pokemon_attributes.o(.text);
src/code_80718D8.o(.text);
asm/code_80718D8.o(.text);
src/dungeon_ai_leader.o(.text);
asm/code_8072CF4.o(.text);

131
src/code_80718D8.c Normal file
View File

@ -0,0 +1,131 @@
#include "global.h"
#include "constants/dungeon.h"
#include "structs/str_dungeon.h"
#include "dungeon_map_access.h"
#include "dungeon_util.h"
#include "dungeon_random.h"
#include "dungeon.h"
struct unkStruct_806B7F8
{
s16 species;
u8 unk2;
u32 unk4;
u16 level;
u8 fillA[2];
struct Position pos;
u8 unk10;
};
extern u8 gAvailablePokemonNames[];
extern s16 gUnknown_80F4DA6;
extern s16 gUnknown_80F4DA8;
extern s16 gUnknown_80F4DAA;
extern s16 gUnknown_80F4DAC;
extern u8 *gUnknown_80FED68[];
extern void SetMessageArgument(char[], struct Entity*, u32);
extern void sub_806B7F8(struct unkStruct_806B7F8 *, u32);
extern void sub_805239C(struct Entity *r0, const char r1[]);
extern void sub_8042920(struct Entity *r0);
extern s16 sub_803D970(u32);
extern s32 sub_803DA20(s32 param_1);
extern bool8 sub_806AA0C(s32, u32);
extern bool8 sub_8083660(struct Position *param_1);
void sub_8071B48(void)
{
struct Tile *tile;
struct Entity *entity2;
struct Entity *entity;
int index;
int index1;
int counter;
struct Entity *entityPtr;
s32 level;
struct Dungeon *dungeon; // feels like a hack
struct unkStruct_806B7F8 local_2c;
entityPtr = NULL;
dungeon = gDungeon;
if ((dungeon->unk664 != 0) &&
((dungeon->dungeonLocation.id != DUNGEON_METEOR_CAVE || (dungeon->fill37FD[0] == 0)))) {
dungeon->unk662++;
if (dungeon->unk66E == 0) {
if ( dungeon->unk662 < gUnknown_80F4DAA) {
return;
}
}
else {
if ( dungeon->unk662 < gUnknown_80F4DAC) {
return;
}
}
if (dungeon->unk662 > 900) {
entity2 = dungeon->unk17B34;
if ((EntityExists(entity2)) && (entity2->spawnGenID == dungeon->unk17B40)) {
SetMessageArgument(gAvailablePokemonNames,entity2,0);
entityPtr = entity2;
}
}
dungeon->unk662 = 0;
dungeon->unk17B34 = NULL;
counter = 0;
for(index = 0; index < DUNGEON_MAX_WILD_POKEMON; index++)
{
entity = dungeon->wildPokemon[index];
if ((EntityExists(entity)) &&
(tile = GetTile((entity->pos).x, (entity->pos).y),
(tile->terrainType & 0x100) == 0)) {
counter++;
}
}
if (dungeon->unk66E == 0) {
if (gDungeon->unk3A0C == 0xff) {
if (counter >= gUnknown_80F4DA6) {
return;
}
}
else
{
if (counter >= gUnknown_80F4DA8) {
return;
}
}
}
if (entityPtr != NULL) {
sub_805239C(0,*gUnknown_80FED68);
sub_8042920(entityPtr);
}
if (dungeon->unk66E != 0) {
index1 = 0x17c;
}
else {
index1 = sub_803D970(0);
}
level = sub_803DA20(index1);
if (level == 0) {
level = 1;
}
if ((sub_806AA0C(index1, 0)) && (sub_8083660(&local_2c.pos))) {
local_2c.species = index1;
local_2c.level = level;
local_2c.unk2 = 0;
if(DungeonRandInt(100) < GetRandomMovementChance(gDungeon->dungeonLocation.id))
{
local_2c.unk4 = 1;
}
else
{
local_2c.unk4 = 0;
}
local_2c.unk10 = 0;
sub_806B7F8(&local_2c, 0);
}
}
}