diff --git a/asm/scrcmd_pokemon_misc_s.s b/asm/scrcmd_pokemon_misc_s.s index f7305dc81..6dda8df8b 100644 --- a/asm/scrcmd_pokemon_misc_s.s +++ b/asm/scrcmd_pokemon_misc_s.s @@ -2541,228 +2541,11 @@ _02201F08: .word gGameVersion _02201F0C: .word 0x00001388 thumb_func_end ScrCmd_741 - thumb_func_start ScrCmd_743 -ScrCmd_743: ; 0x02201F10 - push {r4, lr} - add r4, r0, #0 - bl ScriptReadHalfword - add r1, r0, #0 - add r0, r4, #0 - add r0, #0x80 - ldr r0, [r0] - bl VarGet - add r1, r0, #0 - ldr r0, [r4, #0x74] - bl ov03_02258CFC - mov r0, #1 - pop {r4, pc} - thumb_func_end ScrCmd_743 - - thumb_func_start ScrCmd_744 -ScrCmd_744: ; 0x02201F30 - push {r3, r4, r5, r6, r7, lr} - sub sp, #0x10 - add r0, #0x80 - ldr r7, [r0] - ldr r0, [r7, #0xc] - bl sub_02031B00 - ldr r5, _02201F90 ; =ov01_022093B4 - add r4, r0, #0 - mov r6, #0 -_02201F44: - add r1, r6, #0 - ldr r0, [r7, #0x3c] - add r1, #0xf6 - bl GetMapObjectByID - cmp r0, #0 - beq _02201F56 - bl DeleteMapObject -_02201F56: - ldrh r2, [r4] - cmp r2, #0 - beq _02201F80 - ldr r0, _02201F94 ; =0x000001ED - cmp r2, r0 - bhi _02201F80 - ldrb r0, [r4, #2] - lsl r1, r6, #0x18 - lsr r1, r1, #0x18 - str r0, [sp] - ldrb r0, [r5] - str r0, [sp, #4] - ldrb r0, [r5, #1] - str r0, [sp, #8] - ldr r0, [r7, #0x20] - ldr r0, [r0] - str r0, [sp, #0xc] - ldrb r3, [r4, #3] - ldr r0, [r7, #0x3c] - bl ov01_02201F98 -_02201F80: - add r6, r6, #1 - add r4, r4, #4 - add r5, r5, #2 - cmp r6, #3 - blt _02201F44 - mov r0, #1 - add sp, #0x10 - pop {r3, r4, r5, r6, r7, pc} - .balign 4, 0 -_02201F90: .word ov01_022093B4 -_02201F94: .word 0x000001ED - thumb_func_end ScrCmd_744 - - thumb_func_start ov01_02201F98 -ov01_02201F98: ; 0x02201F98 - push {r4, r5, r6, r7, lr} - sub sp, #0x1c - str r3, [sp, #0x18] - add r6, r1, #0 - add r7, r2, #0 - add r4, r0, #0 - ldr r1, [sp, #0x18] - ldr r2, [sp, #0x30] - add r0, r7, #0 - bl FollowingPokemon_GetSpriteID - lsl r5, r0, #1 - add r0, r7, #0 - bl GetFollowPokeSizeParamBySpecies - lsl r1, r0, #1 - add r0, r0, r1 - add r1, r6, r0 - ldr r0, _02202058 ; =0x0000019F - ldr r2, [sp, #0x38] - add r0, r1, r0 - str r0, [sp] - mov r1, #0 - ldr r0, [sp, #0x3c] - str r1, [sp, #4] - str r0, [sp, #8] - str r1, [sp, #0xc] - str r1, [sp, #0x10] - ldr r1, [sp, #0x34] - add r0, r4, #0 - mov r3, #1 - str r5, [sp, #0x14] - bl CreateSpecialFieldObjectEx - add r4, r0, #0 - bne _02201FE4 - bl GF_AssertFail -_02201FE4: - add r6, #0xf6 - add r0, r4, #0 - add r1, r6, #0 - bl MapObject_SetID - add r0, r4, #0 - mov r1, #0 - bl MapObject_SetType - add r0, r4, #0 - mov r1, #0 - bl MapObject_SetFlagID - add r0, r4, #0 - mov r1, #0 - bl MapObject_SetScript - add r0, r4, #0 - mov r1, #0 - mov r2, #2 - bl MapObject_SetParam - str r5, [sp] - ldr r2, [sp, #0x18] - add r0, r4, #0 - lsl r2, r2, #0x18 - add r1, r7, #0 - lsr r2, r2, #0x18 - mov r3, #0 - bl sub_02069F0C - mov r1, #0 - add r0, r4, #0 - mvn r1, r1 - bl MapObject_SetXRange - mov r1, #0 - add r0, r4, #0 - mvn r1, r1 - bl MapObject_SetYRange - mov r1, #1 - add r0, r4, #0 - lsl r1, r1, #0x1e - bl MapObject_SetBits - add r0, r4, #0 - mov r1, #0 - bl MapObject_ClearBits - add r0, r4, #0 - mov r1, #0 - bl sub_0205F89C - add r0, r4, #0 - add sp, #0x1c - pop {r4, r5, r6, r7, pc} - nop -_02202058: .word 0x0000019F - thumb_func_end ov01_02201F98 - - thumb_func_start ScrCmd_770 -ScrCmd_770: ; 0x0220205C - push {r3, r4, r5, r6, r7, lr} - add r4, r0, #0 - bl ScriptReadHalfword - add r1, r0, #0 - add r0, r4, #0 - add r0, #0x80 - ldr r0, [r0] - bl GetVarPointer - add r4, #0x80 - str r0, [sp] - ldr r0, [r4] - ldr r0, [r0, #0xc] - bl Sav2_Pokedex_get - mov r1, #1 - add r7, r0, #0 - bl Pokedex_GetSeenFormeNum_Unown - add r6, r0, #0 - cmp r6, #0x1a - bge _02202094 - ldr r0, [sp] - mov r1, #0 - strh r1, [r0] - mov r0, #1 - pop {r3, r4, r5, r6, r7, pc} -_02202094: - mov r5, #0 - add r4, r5, #0 - cmp r6, #0 - ble _022020B6 -_0220209C: - add r0, r7, #0 - add r1, r4, #0 - mov r2, #1 - bl Pokedex_GetSeenFormeByIdx_Unown - cmp r0, #0x1a - beq _022020B0 - cmp r0, #0x1b - beq _022020B0 - add r5, r5, #1 -_022020B0: - add r4, r4, #1 - cmp r4, r6 - blt _0220209C -_022020B6: - cmp r5, #0x1a - bne _022020C0 - mov r1, #1 - ldr r0, [sp] - b _022020C4 -_022020C0: - ldr r0, [sp] - mov r1, #0 -_022020C4: - strh r1, [r0] - mov r0, #1 - pop {r3, r4, r5, r6, r7, pc} - .balign 4, 0 - thumb_func_end ScrCmd_770 - .rodata -ov01_022093B4: ; 0x022093B4 +.public sFriendshipRoomStatuesPositions + +sFriendshipRoomStatuesPositions: ; 0x022093B4 .byte 0x04, 0x0A, 0x07, 0x05, 0x0A, 0x0A .public sSpikyEarPichuMoveset diff --git a/include/unk_02031AF0.h b/include/unk_02031AF0.h index af1c99a5f..fd4e82cec 100644 --- a/include/unk_02031AF0.h +++ b/include/unk_02031AF0.h @@ -4,7 +4,15 @@ #include "save.h" typedef struct { - u8 unk[0x28]; + u16 species; + u8 gender; + u8 forme; +} PokeathlonFriendshipRoomStatueData; + +//TODO: Rename to PokeathlonSaveData or PokeathlonRecords smth like that +typedef struct { + PokeathlonFriendshipRoomStatueData friendshipRoomStatues[3]; + u8 unk[0x1C]; } UnkSaveStruct29; u32 sub_02031AF0(void); diff --git a/src/scrcmd_pokemon_misc.c b/src/scrcmd_pokemon_misc.c index 9d51a9a3e..b50cddc90 100644 --- a/src/scrcmd_pokemon_misc.c +++ b/src/scrcmd_pokemon_misc.c @@ -2,11 +2,114 @@ #include "fieldmap.h" #include "friend_group.h" #include "photo_album.h" +#include "pokedex.h" #include "scrcmd.h" #include "unk_0206D494.h" +#include "unk_02031AF0.h" #include "msgdata/msg/msg_0096_D31R0201.h" #include "msgdata/msg/msg_0066_D23R0102.h" +static LocalMapObject *ov01_02201F98(MapObjectMan *mapObjectMan, u8 unkA, u16 species, u16 forme, u32 gender, u32 x, u32 y, u32 mapId); + +//TODO: define ov03_02258CFC in a header +BOOL ScrCmd_743(SCRIPTCONTEXT *ctx) { + ov03_02258CFC(ctx->taskman, VarGet(ctx->fsys, ScriptReadHalfword(ctx))); + return TRUE; +} + +extern u8 sFriendshipRoomStatuesPositions[3][2]; + +//TODO: rename to ScrCmd_CreatePokeathlonFriendshipRoomSprites +BOOL ScrCmd_744(SCRIPTCONTEXT *ctx) { + s32 i; + u16 species; + FieldSystem *fsys = ctx->fsys; + + UnkSaveStruct29 *unkPtr = sub_02031B00(fsys->savedata); + + for (i = 0; i < 3; i++) { + //TODO: Replace 0xf6 with whatever the const is + LocalMapObject *mapObj = GetMapObjectByID(fsys->mapObjectMan, 0xf6 + i); + + if (mapObj) { + DeleteMapObject(mapObj); + } + + species = unkPtr->friendshipRoomStatues[i].species; + + if (species != 0 && species <= SPECIES_ARCEUS) { + ov01_02201F98(fsys->mapObjectMan, (u8) i, species, unkPtr->friendshipRoomStatues[i].forme, unkPtr->friendshipRoomStatues[i].gender, sFriendshipRoomStatuesPositions[i][0], sFriendshipRoomStatuesPositions[i][1], fsys->location->mapId); + } + } + return TRUE; +} + +static LocalMapObject *ov01_02201F98(MapObjectMan *mapObjectMan, u8 unkA, u16 species, u16 forme, u32 gender, u32 x, u32 y, u32 mapId) { + LocalMapObject *mapObj; + u32 spriteId; + u32 size; + + + spriteId = FollowingPokemon_GetSpriteID(species, forme, gender) << 1; + size = GetFollowPokeSizeParamBySpecies(species)*3 + unkA; + + //TODO: Define CreateSpecialFieldObjectEx in a header + mapObj = CreateSpecialFieldObjectEx(mapObjectMan, x, y, DIR_SOUTH, size + 0x19f, 0, mapId, 0, 0, spriteId); + + if (!mapObj) { + GF_AssertFail(); + } + + MapObject_SetID(mapObj, unkA + 0xf6); + MapObject_SetType(mapObj, 0); + MapObject_SetFlagID(mapObj, 0); + MapObject_SetScript(mapObj, 0); + MapObject_SetParam(mapObj, 0, 2); + sub_02069F0C(mapObj, species, (u8) forme, FALSE, spriteId); + MapObject_SetXRange(mapObj, -1); + MapObject_SetYRange(mapObj, -1); + MapObject_SetBits(mapObj, 1 << 0x1e); + MapObject_ClearBits(mapObj, FALSE); + sub_0205F89C(mapObj, FALSE); + + return mapObj; +} + +//TODO: Rename to ScrCmd_CheckAllLetterUnownSeen +BOOL ScrCmd_770(SCRIPTCONTEXT *ctx) { + u32 forme; + s32 i; + u32 counter; + s32 unownFormes; + POKEDEX *pokedex; + u16 *allUnownSeen; + + allUnownSeen = GetVarPointer(ctx->fsys, ScriptReadHalfword(ctx)); + pokedex = Sav2_Pokedex_get(ctx->fsys->savedata); + + unownFormes = Pokedex_GetSeenFormeNum_Unown(pokedex, 1); + if (unownFormes < 26) { + *allUnownSeen = FALSE; + return TRUE; + } + + counter = 0; + for (i = 0; i < unownFormes; i++) { + forme = Pokedex_GetSeenFormeByIdx_Unown(pokedex, i, TRUE); + if (forme != 26 && forme != 27) { + counter++; + } + } + + if (counter == 26) { + *allUnownSeen = TRUE; + } else { + *allUnownSeen = FALSE; + } + + return TRUE; +} + BOOL ScrCmd_GiveTogepiEgg(SCRIPTCONTEXT *ctx) { s32 i; u8 pp; @@ -231,8 +334,6 @@ BOOL ScrCmd_GetBuenasPassword(SCRIPTCONTEXT *ctx) { return FALSE; } - -//TODO: Rename to MonGetShinyLeafCount static u32 MonGetShinyLeafCount(POKEMON *mon) { int c; u32 shinyLeafCount = 0; @@ -247,7 +348,6 @@ static u32 MonGetShinyLeafCount(POKEMON *mon) { return shinyLeafCount; } -//TODO: Rename to ScrCmd_GetShinyLeafCount BOOL ScrCmd_GetShinyLeafCount(SCRIPTCONTEXT *ctx) { u32 monIndex = VarGet(ctx->fsys, ScriptReadHalfword(ctx)); u16 *shinyLeafCount = GetVarPointer(ctx->fsys, ScriptReadHalfword(ctx)); @@ -255,7 +355,6 @@ BOOL ScrCmd_GetShinyLeafCount(SCRIPTCONTEXT *ctx) { return FALSE; } -//TODO: Rename to ScrCmd_TryGiveShinyLeafCrown BOOL ScrCmd_TryGiveShinyLeafCrown(SCRIPTCONTEXT *ctx) { u32 monIndex = VarGet(ctx->fsys, ScriptReadHalfword(ctx)); @@ -268,7 +367,6 @@ BOOL ScrCmd_TryGiveShinyLeafCrown(SCRIPTCONTEXT *ctx) { return FALSE; } -//TODO: Rename to ScrCmd_GetUniqueSealsCount BOOL ScrCmd_GetUniqueSealsQuantity(SCRIPTCONTEXT *ctx) { u16 *uniqueSeals = GetVarPointer(ctx->fsys, ScriptReadHalfword(ctx)); @@ -295,7 +393,6 @@ BOOL ScrCmd_GiveOrTakeSeal(SCRIPTCONTEXT *ctx) { return FALSE; } -//TODO: rename to IsSealNonUnique static BOOL IsSealNonUnique(u16 sealId, u16 *uniqueSealIds, s32 size) { s32 c;