sub_80453AC and sub_804550C

This commit is contained in:
DizzyEggg 2024-11-28 14:04:20 +01:00
parent 33a7303313
commit b9cd0dddc3
4 changed files with 76 additions and 460 deletions

View File

@ -7,7 +7,7 @@ void CloseAllSpriteFiles(void);
void sub_8068768(void);
void sub_80687AC(void);
OpenedFile *GetSpriteData(s16 species);
OpenedFile *GetSpriteData(s32 _species);
void LoadPokemonSprite(s16 id, bool32);
#endif // GUARD_CODE_805D8C8_H
#endif // GUARD_CODE_805D8C8_H

View File

@ -6,49 +6,51 @@
#include "dungeon_range.h"
#include "dungeon_util.h"
#include "tile_types.h"
#include "pokemon.h"
#include "code_805D8C8.h"
// Related to sub_80828E0
// 93.08% https://decomp.me/scratch/AYGBN
/*Entity *sub_80453AC(s16 id)
extern u8 gUnknown_202EE70[MAX_TEAM_BODY_SIZE];
extern u8 gUnknown_202EE76[DUNGEON_MAX_WILD_POKEMON_BODY_SIZE];
extern void sub_8045ACC(void);
extern s32 GetMonsterApparentID(Entity *pokemon, s32 id);
Entity *sub_80453AC(s32 _species)
{
s32 something; // r1
s32 uVar8; // r2
Entity *entity; // r4
s32 r5;
u8 bodySize; // r6
s32 id_; // r8
//register s32 id_ asm("r8"); // r8
s32 r9;
s32 i;
s32 species = (s16) _species;
s32 validId = -1;
s32 bodySize = GetBodySize(species);
id_ = id; // SpeciesId() ?
r9 = -1;
bodySize = GetBodySize(id_);
for (r5 = 0; r5 <= MAX_TEAM_BODY_SIZE - bodySize; r5++) {
for (uVar8 = 0; uVar8 < bodySize; uVar8++) {
if (gUnknown_202EE70[r5 + uVar8] != 0)
for (i = 0; i <= MAX_TEAM_BODY_SIZE - bodySize; i++) {
s32 j;
for (j = 0; j < bodySize; j++) {
if (gUnknown_202EE70[i + j] != 0)
break;
}
if (uVar8 == bodySize) {
r9 = r5;
if (j == bodySize) {
validId = i;
break;
}
}
if (r9 != -1) {
for (r5 = 0; r5 < MAX_TEAM_MEMBERS; r5++) {
entity = gDungeon->teamPokemon[r5];
if (validId != -1) {
for (i = 0; i < MAX_TEAM_MEMBERS; i++) {
s32 apparentId;
s32 j;
Entity *entity = gDungeon->teamPokemon[i];
if (!EntityExists(entity)) {
entity->type = ENTITY_MONSTER;
entity->unk24 = r5;
entity->axObj.info = &gDungeon->unk69C[r5];
entity->axObj.info->id = id_;
entity->axObj.info->apparentID = sub_8069F54(NULL, id_);
entity->axObj.info->isNotTeamMember = FALSE;
entity->unk24 = i;
entity->axObj.info.monster = &gDungeon->unk69C[i];
entity->axObj.info.monster->id = species;
apparentId = (s16) GetMonsterApparentID(NULL, species);
entity->axObj.info.monster->apparentID = apparentId;
entity->axObj.info.monster->isNotTeamMember = FALSE;
entity->axObj.spriteFile = GetSpriteData(sub_8069F54(NULL, id_));
entity->axObj.unk40_maybeAnimTimer = (r9 * 0x10) + 0x40;
entity->axObj.spriteFile = GetSpriteData((s16)GetMonsterApparentID(NULL, species));
entity->axObj.unk40_maybeAnimTimer = (validId * 16) + 0x40;
entity->axObj.unk42_animId1 = 7;
entity->axObj.unk44_direction1 = 0;
entity->axObj.unk43_animId2 = 0xFF;
@ -57,250 +59,59 @@
entity->unk1C = 0;
sub_8045ACC();
entity->axObj.info->unk167 = r9;
entity->axObj.info->unk168 = bodySize;
entity->axObj.info.monster->unk167 = validId;
entity->axObj.info.monster->unk168 = bodySize;
for (something = 0; something < bodySize; something++) {
gUnknown_202EE70[r9] = 1;
r9++;
for (j = 0; j < bodySize; j++) {
gUnknown_202EE70[validId] = 1;
validId++;
}
entity->spawnGenID = gDungeon->unk668++;
entity->spawnGenID = gDungeon->unk644.unk24++;
return entity;
}
}
}
return NULL;
}*/
NAKED
Entity *sub_80453AC(s16 id)
{
asm_unified(
" push {r4-r7,lr}\n"
" mov r7, r10\n"
" mov r6, r9\n"
" mov r5, r8\n"
" push {r5-r7}\n"
" lsls r0, 16\n"
" asrs r0, 16\n"
" mov r8, r0\n"
" movs r0, 0x1\n"
" negs r0, r0\n"
" mov r9, r0\n"
" mov r0, r8\n"
" bl GetBodySize\n"
" lsls r0, 24\n"
" lsrs r6, r0, 24\n"
" movs r5, 0\n"
" movs r0, 0x6\n"
" subs r3, r0, r6\n"
" ldr r4, _080453D8\n"
" b _080453DE\n"
" .align 2, 0\n"
"_080453D8: .4byte gUnknown_202EE70\n"
"_080453DC:\n"
" adds r5, 0x1\n"
"_080453DE:\n"
" cmp r5, r3\n"
" bgt _08045400\n"
" movs r2, 0\n"
" cmp r2, r6\n"
" bge _080453FA\n"
" adds r1, r5, r4\n"
" b _080453F4\n"
"_080453EC:\n"
" adds r1, 0x1\n"
" adds r2, 0x1\n"
" cmp r2, r6\n"
" bge _080453FA\n"
"_080453F4:\n"
" ldrb r0, [r1]\n"
" cmp r0, 0\n"
" beq _080453EC\n"
"_080453FA:\n"
" cmp r2, r6\n"
" bne _080453DC\n"
" mov r9, r5\n"
"_08045400:\n"
" movs r0, 0x1\n"
" negs r0, r0\n"
" cmp r9, r0\n"
" beq _080454FC\n"
" movs r5, 0\n"
" ldr r7, _080454DC\n"
"_0804540C:\n"
" ldr r1, _080454E0\n"
" ldr r0, [r1]\n"
" lsls r1, r5, 2\n"
" ldr r2, _080454E4\n"
" adds r0, r2\n"
" adds r0, r1\n"
" ldr r4, [r0]\n"
" adds r0, r4, 0\n"
" bl EntityExists\n"
" lsls r0, 24\n"
" lsrs r0, 24\n"
" mov r10, r0\n"
" cmp r0, 0\n"
" bne _080454F0\n"
" movs r0, 0x1\n"
" str r0, [r4]\n"
" adds r0, r4, 0\n"
" adds r0, 0x24\n"
" strb r5, [r0]\n"
" ldr r1, _080454E0\n"
" ldr r0, [r1]\n"
" adds r0, r7\n"
" str r0, [r4, 0x70]\n"
" mov r2, r8\n"
" strh r2, [r0, 0x2]\n"
" movs r0, 0\n"
" mov r1, r8\n"
" bl GetMonsterApparentID\n"
" ldr r1, [r4, 0x70]\n"
" strh r0, [r1, 0x4]\n"
" ldr r0, [r4, 0x70]\n"
" movs r5, 0\n"
" strb r5, [r0, 0x6]\n"
" movs r0, 0\n"
" mov r1, r8\n"
" bl GetMonsterApparentID\n"
" lsls r0, 16\n"
" asrs r0, 16\n"
" bl GetSpriteData\n"
" str r0, [r4, 0x64]\n"
" mov r1, r9\n"
" lsls r0, r1, 4\n"
" adds r0, 0x40\n"
" adds r1, r4, 0\n"
" adds r1, 0x68\n"
" strh r0, [r1]\n"
" adds r1, 0x2\n"
" movs r0, 0x7\n"
" strb r0, [r1]\n"
" adds r0, r4, 0\n"
" adds r0, 0x6C\n"
" movs r2, 0\n"
" strb r2, [r0]\n"
" adds r1, 0x1\n"
" movs r0, 0xFF\n"
" strb r0, [r1]\n"
" adds r0, r4, 0\n"
" adds r0, 0x6D\n"
" movs r5, 0x1\n"
" strb r5, [r0]\n"
" adds r0, 0x2\n"
" strb r5, [r0]\n"
" mov r0, r10\n"
" str r0, [r4, 0x1C]\n"
" bl sub_8045ACC\n"
" ldr r0, [r4, 0x70]\n"
" ldr r1, _080454E8\n"
" adds r0, r1\n"
" mov r2, r9\n"
" strb r2, [r0]\n"
" ldr r0, [r4, 0x70]\n"
" movs r5, 0xB4\n"
" lsls r5, 1\n"
" adds r0, r5\n"
" strb r6, [r0]\n"
" cmp r6, 0\n"
" beq _080454C6\n"
" ldr r3, _080454EC\n"
" movs r2, 0x1\n"
" adds r1, r6, 0\n"
"_080454B6:\n"
" mov r5, r9\n"
" adds r0, r5, r3\n"
" strb r2, [r0]\n"
" movs r0, 0x1\n"
" add r9, r0\n"
" subs r1, 0x1\n"
" cmp r1, 0\n"
" bne _080454B6\n"
"_080454C6:\n"
" ldr r1, _080454E0\n"
" ldr r0, [r1]\n"
" movs r2, 0xCD\n"
" lsls r2, 3\n"
" adds r0, r2\n"
" ldrh r2, [r0]\n"
" adds r1, r2, 0x1\n"
" strh r1, [r0]\n"
" strh r2, [r4, 0x26]\n"
" adds r0, r4, 0\n"
" b _080454FE\n"
" .align 2, 0\n"
"_080454DC: .4byte 0x0000069c\n"
"_080454E0: .4byte gDungeon\n"
"_080454E4: .4byte 0x0001357c\n"
"_080454E8: .4byte 0x00000167\n"
"_080454EC: .4byte gUnknown_202EE70\n"
"_080454F0:\n"
" movs r0, 0x82\n"
" lsls r0, 2\n"
" adds r7, r0\n"
" adds r5, 0x1\n"
" cmp r5, 0x3\n"
" ble _0804540C\n"
"_080454FC:\n"
" movs r0, 0\n"
"_080454FE:\n"
" pop {r3-r5}\n"
" mov r8, r3\n"
" mov r9, r4\n"
" mov r10, r5\n"
" pop {r4-r7}\n"
" pop {r1}\n"
" bx r1"
);
}
// Related to sub_8082A08
// 91.51% https://decomp.me/scratch/Fp0Kw
/*Entity *sub_804550C(s16 a)
Entity *sub_804550C(s32 _species)
{
s32 something; // r1
s32 uVar8; // r2
Entity *entity; // r4
s32 r5;
u8 r6;
s32 id; // r8
s32 r9;
s32 timer; // sp0
s32 i;
s32 species = (s16) _species;
s32 validId = -1;
s32 bodySize = GetBodySize(species);
id = a; // SpeciesId() ?
r9 = -1;
r6 = GetBodySize(id);
for (r5 = 0; r5 <= DUNGEON_MAX_WILD_POKEMON_BODY_SIZE - r6; r5++) {
for (uVar8 = 0; uVar8 < r6; uVar8++) {
if (gUnknown_202EE76[r5 + uVar8] != 0)
for (i = 0; i <= DUNGEON_MAX_WILD_POKEMON_BODY_SIZE - bodySize; i++) {
s32 j;
for (j = 0; j < bodySize; j++) {
if (gUnknown_202EE76[i + j] != 0)
break;
}
if (uVar8 == r6) {
r9 = r5;
if (j == bodySize) {
validId = i;
break;
}
}
if (r9 != -1) {
for (r5 = 0; r5 < DUNGEON_MAX_WILD_POKEMON_BODY_SIZE; r5++) {
timer = (r9 * 0x10) + 0xA0;
entity = gDungeon->wildPokemon[r5];
if (validId != -1) {
for (i = 0; i < DUNGEON_MAX_WILD_POKEMON_BODY_SIZE; i++) {
s32 j;
Entity *entity = gDungeon->wildPokemon[i];
if (!EntityExists(entity)) {
entity->type = ENTITY_MONSTER;
entity->unk24 = r5;
entity->unk24 = i;
entity->unk22 = 0;
entity->axObj.info = &gDungeon->unkEBC[r5];
entity->axObj.info->id = id;
entity->axObj.info->apparentID = sub_8069F54(NULL, id);
entity->axObj.info->isNotTeamMember = TRUE;
entity->axObj.info.monster = &gDungeon->unkEBC[i];
entity->axObj.info.monster->id = species;
entity->axObj.info.monster->apparentID = GetMonsterApparentID(NULL, species);
entity->axObj.info.monster->isNotTeamMember = TRUE;
entity->axObj.spriteFile = GetSpriteData(sub_8069F54(NULL, id));
entity->axObj.unk40_maybeAnimTimer = timer;
entity->axObj.spriteFile = GetSpriteData((s16)GetMonsterApparentID(NULL, species));
entity->axObj.unk40_maybeAnimTimer = ((validId + 6) * 16) + 0x40;
entity->axObj.unk42_animId1 = 7;
entity->axObj.unk44_direction1 = 0;
entity->axObj.unk43_animId2 = 0xFF;
@ -309,219 +120,23 @@ Entity *sub_80453AC(s16 id)
entity->unk1C = 0;
entity->axObj.info->unk167 = r9;
entity->axObj.info->unk168 = r6;
entity->axObj.info.monster->unk167 = validId;
entity->axObj.info.monster->unk168 = bodySize;
for (something = 0; something < r6; something++) {
gUnknown_202EE76[r9] = 1;
r9++;
for (j = 0; j < bodySize; j++) {
gUnknown_202EE76[validId] = 1;
validId++;
}
sub_8045ACC();
entity->spawnGenID = gDungeon->unk668++;
entity->spawnGenID = gDungeon->unk644.unk24++;
return entity;
}
}
}
return NULL;
}*/
NAKED
Entity *sub_804550C(s16 a)
{
asm_unified(
" push {r4-r7,lr}\n"
" mov r7, r10\n"
" mov r6, r9\n"
" mov r5, r8\n"
" push {r5-r7}\n"
" sub sp, 0x8\n"
" lsls r0, 16\n"
" asrs r0, 16\n"
" mov r8, r0\n"
" movs r0, 0x1\n"
" negs r0, r0\n"
" mov r9, r0\n"
" mov r0, r8\n"
" bl GetBodySize\n"
" lsls r0, 24\n"
" lsrs r7, r0, 24\n"
" movs r5, 0\n"
" movs r0, 0x10\n"
" subs r3, r0, r7\n"
" ldr r4, _08045538\n"
" b _0804553E\n"
" .align 2, 0\n"
"_08045538: .4byte gUnknown_202EE76\n"
"_0804553C:\n"
" adds r5, 0x1\n"
"_0804553E:\n"
" cmp r5, r3\n"
" bgt _08045560\n"
" movs r2, 0\n"
" cmp r2, r7\n"
" bge _0804555A\n"
" adds r1, r5, r4\n"
" b _08045554\n"
"_0804554C:\n"
" adds r1, 0x1\n"
" adds r2, 0x1\n"
" cmp r2, r7\n"
" bge _0804555A\n"
"_08045554:\n"
" ldrb r0, [r1]\n"
" cmp r0, 0\n"
" beq _0804554C\n"
"_0804555A:\n"
" cmp r2, r7\n"
" bne _0804553C\n"
" mov r9, r5\n"
"_08045560:\n"
" movs r0, 0x1\n"
" negs r0, r0\n"
" cmp r9, r0\n"
" bne _0804556A\n"
" b _08045670\n"
"_0804556A:\n"
" movs r5, 0\n"
" movs r1, 0x1\n"
" mov r10, r1\n"
" ldr r2, _08045650\n"
" mov r3, r9\n"
" lsls r0, r3, 4\n"
" adds r0, 0xA0\n"
" str r0, [sp]\n"
"_0804557A:\n"
" ldr r1, _08045654\n"
" ldr r0, [r1]\n"
" lsls r1, r5, 2\n"
" ldr r3, _08045658\n"
" adds r0, r3\n"
" adds r0, r1\n"
" ldr r4, [r0]\n"
" adds r0, r4, 0\n"
" str r2, [sp, 0x4]\n"
" bl EntityExists\n"
" lsls r0, 24\n"
" lsrs r6, r0, 24\n"
" ldr r2, [sp, 0x4]\n"
" cmp r6, 0\n"
" bne _08045664\n"
" mov r0, r10\n"
" str r0, [r4]\n"
" adds r0, r4, 0\n"
" adds r0, 0x24\n"
" strb r5, [r0]\n"
" subs r0, 0x2\n"
" strb r6, [r0]\n"
" ldr r1, _08045654\n"
" ldr r0, [r1]\n"
" adds r0, r2\n"
" str r0, [r4, 0x70]\n"
" mov r2, r8\n"
" strh r2, [r0, 0x2]\n"
" movs r0, 0\n"
" mov r1, r8\n"
" bl GetMonsterApparentID\n"
" ldr r1, [r4, 0x70]\n"
" strh r0, [r1, 0x4]\n"
" ldr r0, [r4, 0x70]\n"
" mov r3, r10\n"
" strb r3, [r0, 0x6]\n"
" movs r0, 0\n"
" mov r1, r8\n"
" bl GetMonsterApparentID\n"
" lsls r0, 16\n"
" asrs r0, 16\n"
" bl GetSpriteData\n"
" str r0, [r4, 0x64]\n"
" adds r0, r4, 0\n"
" adds r0, 0x68\n"
" mov r5, sp\n"
" ldrh r5, [r5]\n"
" strh r5, [r0]\n"
" adds r1, r4, 0\n"
" adds r1, 0x6A\n"
" movs r0, 0x7\n"
" strb r0, [r1]\n"
" adds r0, r4, 0\n"
" adds r0, 0x6C\n"
" movs r1, 0\n"
" strb r1, [r0]\n"
" adds r1, r4, 0\n"
" adds r1, 0x6B\n"
" movs r0, 0xFF\n"
" strb r0, [r1]\n"
" adds r0, r4, 0\n"
" adds r0, 0x6D\n"
" mov r2, r10\n"
" strb r2, [r0]\n"
" adds r0, 0x2\n"
" strb r2, [r0]\n"
" str r6, [r4, 0x1C]\n"
" ldr r0, [r4, 0x70]\n"
" ldr r3, _0804565C\n"
" adds r0, r3\n"
" mov r5, r9\n"
" strb r5, [r0]\n"
" ldr r0, [r4, 0x70]\n"
" movs r1, 0xB4\n"
" lsls r1, 1\n"
" adds r0, r1\n"
" strb r7, [r0]\n"
" cmp r7, 0\n"
" beq _08045636\n"
" ldr r3, _08045660\n"
" movs r2, 0x1\n"
" adds r1, r7, 0\n"
"_08045626:\n"
" mov r5, r9\n"
" adds r0, r5, r3\n"
" strb r2, [r0]\n"
" movs r0, 0x1\n"
" add r9, r0\n"
" subs r1, 0x1\n"
" cmp r1, 0\n"
" bne _08045626\n"
"_08045636:\n"
" bl sub_8045ACC\n"
" ldr r1, _08045654\n"
" ldr r0, [r1]\n"
" movs r2, 0xCD\n"
" lsls r2, 3\n"
" adds r0, r2\n"
" ldrh r2, [r0]\n"
" adds r1, r2, 0x1\n"
" strh r1, [r0]\n"
" strh r2, [r4, 0x26]\n"
" adds r0, r4, 0\n"
" b _08045672\n"
" .align 2, 0\n"
"_08045650: .4byte 0x00000ebc\n"
"_08045654: .4byte gDungeon\n"
"_08045658: .4byte 0x0001358c\n"
"_0804565C: .4byte 0x00000167\n"
"_08045660: .4byte gUnknown_202EE76\n"
"_08045664:\n"
" movs r3, 0x82\n"
" lsls r3, 2\n"
" adds r2, r3\n"
" adds r5, 0x1\n"
" cmp r5, 0xF\n"
" ble _0804557A\n"
"_08045670:\n"
" movs r0, 0\n"
"_08045672:\n"
" add sp, 0x8\n"
" pop {r3-r5}\n"
" mov r8, r3\n"
" mov r9, r4\n"
" mov r10, r5\n"
" pop {r4-r7}\n"
" pop {r1}\n"
" bx r1"
);
}
Entity *SpawnTrap(u8 trapID, DungeonPos *pos, u8 c)
@ -673,4 +288,4 @@ bool8 sub_8045888(Entity *ent)
}
return FALSE;
}
}

View File

@ -34,10 +34,10 @@ void sub_80687AC(void)
gDungeon->unk37F4 = 10;
}
OpenedFile *GetSpriteData(s16 species)
OpenedFile *GetSpriteData(s32 _species)
{
s32 species32 = SpeciesId(species);
return gDungeon->sprites[species32];
s32 species = (s16)(_species);
return gDungeon->sprites[species];
}
static void EnsureSpriteLoaded(s32 _id) // TODO: Should this param be s16? If so, the castform part of LoadPokemonSprite is preventing us
@ -106,4 +106,4 @@ void CloseAllSpriteFiles(void)
gDungeon->sprites[i] = NULL;
}
}
}
}

View File

@ -151,8 +151,9 @@ void TriggerWeatherAbilities(void)
}
}
s32 GetMonsterApparentID(Entity *pokemon, s16 id)
s32 GetMonsterApparentID(Entity *pokemon, s32 _id)
{
s16 id = (s16)(_id);
if (id == MONSTER_CASTFORM || IS_CASTFORM_FORM_MONSTER(id)) {
if (HasAbility(pokemon, ABILITY_FORECAST))
return gUnknown_80F520C[GetApparentWeather(pokemon)].unk2;