From 68b8d3853c0ba92ef39ba6988e429f581e8dbdb7 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 4 Jun 2022 08:36:08 -0700 Subject: [PATCH] finish out all jirachi funcs.. thx jiang for JirachiWish match --- asm/jirachi_wish.s | 660 ---------------------------------- include/code_80A26CC.h | 17 + include/dungeon_global_data.h | 3 +- ld_script.txt | 1 - src/code_80521D0_1.c | 4 +- src/code_8057824_1.c | 320 ++++++++++++++++- 6 files changed, 338 insertions(+), 667 deletions(-) delete mode 100644 asm/jirachi_wish.s create mode 100644 include/code_80A26CC.h diff --git a/asm/jirachi_wish.s b/asm/jirachi_wish.s deleted file mode 100644 index 053642398..000000000 --- a/asm/jirachi_wish.s +++ /dev/null @@ -1,660 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start JirachiWish -JirachiWish: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x78 - movs r0, 0x1A - bl GetEntityFromClientType - adds r6, r0, 0 - ldr r0, _0808B82C - ldr r1, _0808B830 - bl CopySpeciesNametoBuffer - ldr r4, _0808B834 - adds r0, r4, 0 - bl sub_80855E4 - adds r0, r6, 0 - bl _call_via_r4 - movs r0, 0 - bl sub_8041888 - ldr r0, [r6, 0x70] - movs r1, 0xAE - lsls r1, 1 - adds r0, r1 - movs r1, 0 - movs r4, 0x1 - strb r4, [r0] - ldr r0, [r6, 0x70] - movs r2, 0xAF - lsls r2, 1 - adds r0, r2 - strb r1, [r0] - adds r0, r6, 0 - movs r1, 0xE - movs r2, 0 - bl sub_80861B8 - ldr r0, _0808B838 - bl sub_80855E4 - ldr r0, _0808B83C - ldr r0, [r0] - ldr r1, _0808B840 - adds r0, r1 - strb r4, [r0] - movs r0, 0x1E - bl sub_8083ED8 - movs r0, 0x1E - movs r1, 0x46 - bl sub_803E708 - ldr r0, _0808B844 - bl DisplayDungeonDialogue - movs r0, 0xA - movs r1, 0x46 - bl sub_803E708 - ldr r0, _0808B848 - bl PlaySoundEffect - movs r0, 0x96 - movs r1, 0x46 - bl sub_803E708 - adds r0, r6, 0 - bl sub_80862BC - ldr r0, _0808B84C - bl DisplayDungeonDialogue - movs r0, 0x79 - bl sub_8083E88 - movs r0, 0xA - movs r1, 0x46 - bl sub_803E708 - adds r0, r6, 0 - movs r1, 0 - bl sub_80856E0 - movs r0, 0xB5 - lsls r0, 1 - bl PlaySoundEffect - ldr r0, _0808B850 - bl DisplayDungeonDialogue - movs r0, 0xA - movs r1, 0x46 - bl sub_803E708 - adds r0, r6, 0 - bl SpriteLookAroundEffect - ldr r0, _0808B854 - bl DisplayDungeonDialogue - movs r0, 0xA - movs r1, 0x46 - bl sub_803E708 -_0808B690: - ldr r4, _0808B858 -_0808B692: - movs r0, 0 - ldr r1, [r4] - ldr r2, _0808B85C - ldr r3, _0808B860 - bl sub_8052C68 - mov r9, r0 - cmp r0, 0 - ble _0808B692 - movs r0, 0xA - movs r1, 0x46 - bl sub_803E708 - mov r2, r9 - cmp r2, 0x1 - bne _0808B754 - ldr r0, _0808B864 - bl DisplayDungeonDialogue - movs r0, 0xA - movs r1, 0x46 - bl sub_803E708 - adds r0, r6, 0 - bl JirachiWishGrantDialogue - movs r0, 0 - add r7, sp, 0x6C -_0808B6CA: - adds r0, 0x1 - mov r8, r0 - mov r4, sp - movs r5, 0x8 -_0808B6D2: - adds r0, r4, 0 - movs r1, 0x69 - movs r2, 0 - bl sub_8045C28 - adds r4, 0x4 - subs r5, 0x1 - cmp r5, 0 - bge _0808B6D2 - movs r0, 0x3 - bl DungeonRandomCapped - ldrh r1, [r6, 0x4] - adds r1, r0 - subs r1, 0x1 - lsls r1, 16 - lsrs r1, 16 - ldr r2, _0808B868 - ldr r0, [sp, 0x6C] - ands r0, r2 - orrs r0, r1 - str r0, [sp, 0x6C] - movs r0, 0x3 - bl DungeonRandomCapped - ldrh r2, [r6, 0x6] - adds r2, r0 - subs r2, 0x1 - lsls r2, 16 - ldr r0, _0808B86C - ldr r1, [sp, 0x6C] - ands r1, r0 - orrs r1, r2 - str r1, [sp, 0x6C] - movs r2, 0 - ldrsh r0, [r7, r2] - asrs r1, 16 - bl GetMapTile_2 - ldrh r1, [r0] - movs r0, 0x3 - ands r0, r1 - cmp r0, 0 - beq _0808B744 - movs r0, 0xA6 - lsls r0, 1 - bl PlaySoundEffect - adds r0, r7, 0 - bl sub_808BB3C - adds r0, r6, 0 - adds r1, r7, 0 - mov r2, sp - movs r3, 0x9 - bl sub_8046860 -_0808B744: - mov r0, r8 - cmp r0, 0x5 - ble _0808B6CA - ldr r0, [r6, 0x70] - ldr r2, _0808B870 - adds r1, r0, r2 - movs r0, 0 - strb r0, [r1] -_0808B754: - mov r0, r9 - cmp r0, 0x2 - bne _0808B80A - ldr r0, _0808B874 - bl DisplayDungeonDialogue - movs r0, 0xA - movs r1, 0x46 - bl sub_803E708 - adds r0, r6, 0 - bl JirachiWishGrantDialogue - movs r0, 0 - add r1, sp, 0x24 - mov r8, r1 - add r7, sp, 0x70 -_0808B776: - adds r0, 0x1 - mov r10, r0 - mov r4, r8 - movs r5, 0x8 -_0808B77E: - movs r0, 0 - bl sub_803D73C - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - movs r2, 0 - bl sub_8045C28 - adds r4, 0x4 - subs r5, 0x1 - cmp r5, 0 - bge _0808B77E - movs r0, 0x3 - bl DungeonRandomCapped - ldrh r1, [r6, 0x4] - adds r1, r0 - subs r1, 0x1 - lsls r1, 16 - lsrs r1, 16 - ldr r2, _0808B868 - ldr r0, [sp, 0x70] - ands r0, r2 - orrs r0, r1 - str r0, [sp, 0x70] - movs r0, 0x3 - bl DungeonRandomCapped - ldrh r2, [r6, 0x6] - adds r2, r0 - subs r2, 0x1 - lsls r2, 16 - ldr r0, _0808B86C - ldr r1, [sp, 0x70] - ands r1, r0 - orrs r1, r2 - str r1, [sp, 0x70] - movs r2, 0 - ldrsh r0, [r7, r2] - asrs r1, 16 - bl GetMapTile_2 - ldrh r1, [r0] - movs r0, 0x3 - ands r0, r1 - cmp r0, 0 - beq _0808B7FA - movs r0, 0xC8 - lsls r0, 1 - bl PlaySoundEffect - adds r0, r7, 0 - bl sub_808BB3C - adds r0, r6, 0 - adds r1, r7, 0 - mov r2, r8 - movs r3, 0x9 - bl sub_8046860 -_0808B7FA: - mov r0, r10 - cmp r0, 0x5 - ble _0808B776 - ldr r0, [r6, 0x70] - ldr r2, _0808B870 - adds r1, r0, r2 - movs r0, 0 - strb r0, [r1] -_0808B80A: - mov r0, r9 - cmp r0, 0x3 - bne _0808B8CA - bl JirachiFriendAreaSearch - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x3A - bne _0808B87C - ldr r0, _0808B878 - bl DisplayDungeonDialogue - movs r0, 0xA - movs r1, 0x46 - bl sub_803E708 - b _0808B690 - .align 2, 0 -_0808B82C: .4byte gUnknown_202E038 -_0808B830: .4byte 0x0000019d -_0808B834: .4byte sub_808BBA8 -_0808B838: .4byte sub_80861A8 -_0808B83C: .4byte gDungeonGlobalData -_0808B840: .4byte 0x0001356c -_0808B844: .4byte gUnknown_8105668 -_0808B848: .4byte 0x000001a7 -_0808B84C: .4byte gUnknown_8105674 -_0808B850: .4byte gUnknown_81056B8 -_0808B854: .4byte gUnknown_81056DC -_0808B858: .4byte gUnknown_8105798 -_0808B85C: .4byte gUnknown_810579C -_0808B860: .4byte 0x00000705 -_0808B864: .4byte gUnknown_810581C -_0808B868: .4byte 0xffff0000 -_0808B86C: .4byte 0x0000ffff -_0808B870: .4byte 0x0000015d -_0808B874: .4byte gUnknown_8105974 -_0808B878: .4byte gUnknown_8105A08 -_0808B87C: - ldr r0, _0808BA30 - bl DisplayDungeonDialogue - movs r0, 0xA - movs r1, 0x46 - bl sub_803E708 - adds r0, r6, 0 - bl JirachiWishGrantDialogue - ldr r0, [r6, 0x70] - ldr r2, _0808BA34 - adds r1, r0, r2 - movs r0, 0 - strb r0, [r1] - ldr r0, _0808BA38 - bl DisplayDungeonDialogue - adds r0, r4, 0 - bl UnlockFriendArea - movs r0, 0xD4 - bl PlaySoundEffect - bl GetLeaderEntity - adds r1, r0, 0 - ldr r0, _0808BA3C - movs r2, 0 - bl SetMessageArgument - ldr r0, _0808BA40 - adds r1, r4, 0 - movs r2, 0 - bl sub_8092578 - ldr r0, _0808BA44 - bl DisplayDungeonDialogue -_0808B8CA: - mov r0, r9 - cmp r0, 0x4 - bne _0808B98E - ldr r0, _0808BA48 - bl DisplayDungeonDialogue - movs r0, 0xA - movs r1, 0x46 - bl sub_803E708 - adds r0, r6, 0 - bl JirachiWishGrantDialogue - movs r0, 0 - add r1, sp, 0x48 - mov r8, r1 - add r7, sp, 0x74 -_0808B8EC: - adds r0, 0x1 - mov r10, r0 - mov r4, r8 - movs r5, 0x3 -_0808B8F4: - movs r0, 0x8 - bl DungeonRandomCapped - ldr r2, _0808BA4C - adds r0, r2 - ldrb r1, [r0] - adds r0, r4, 0 - movs r2, 0 - bl sub_8045C28 - adds r4, 0x4 - subs r5, 0x1 - cmp r5, 0 - bge _0808B8F4 - movs r0, 0x3 - bl DungeonRandomCapped - ldrh r1, [r6, 0x4] - adds r1, r0 - subs r1, 0x1 - lsls r1, 16 - lsrs r1, 16 - ldr r2, _0808BA50 - ldr r0, [sp, 0x74] - ands r0, r2 - orrs r0, r1 - str r0, [sp, 0x74] - movs r0, 0x3 - bl DungeonRandomCapped - ldrh r2, [r6, 0x6] - adds r2, r0 - subs r2, 0x1 - lsls r2, 16 - ldr r0, _0808BA54 - ldr r1, [sp, 0x74] - ands r1, r0 - orrs r1, r2 - str r1, [sp, 0x74] - movs r2, 0 - ldrsh r0, [r7, r2] - asrs r1, 16 - bl GetMapTile_2 - ldrh r1, [r0] - movs r0, 0x3 - ands r0, r1 - cmp r0, 0 - beq _0808B970 - movs r0, 0xC8 - lsls r0, 1 - bl PlaySoundEffect - adds r0, r7, 0 - bl sub_808BB3C - adds r0, r6, 0 - adds r1, r7, 0 - mov r2, r8 - movs r3, 0x4 - bl sub_8046860 -_0808B970: - mov r0, r10 - cmp r0, 0x4 - ble _0808B8EC - ldr r0, [r6, 0x70] - ldr r2, _0808BA34 - adds r1, r0, r2 - movs r0, 0 - strb r0, [r1] - ldr r0, _0808BA58 - bl DisplayDungeonDialogue - movs r0, 0xA - movs r1, 0x46 - bl sub_803E708 -_0808B98E: - mov r0, r9 - cmp r0, 0x5 - bne _0808B9F8 - ldr r0, _0808BA5C - bl DisplayDungeonDialogue - movs r0, 0xA - movs r1, 0x46 - bl sub_803E708 - adds r0, r6, 0 - bl JirachiWishGrantDialogue - ldr r0, [r6, 0x70] - ldr r2, _0808BA34 - adds r1, r0, r2 - movs r0, 0 - strb r0, [r1] - ldr r0, _0808BA60 - bl DisplayDungeonDialogue - movs r0, 0xA - movs r1, 0x46 - bl sub_803E708 - bl GetLeaderEntity - adds r1, r0, 0 - adds r1, 0x4 - adds r0, r6, 0x4 - bl CalculateFacingDir - adds r1, r0, 0 - adds r0, r6, 0 - bl SetFacingDirection - movs r0, 0xA - movs r1, 0x46 - bl sub_803E708 - ldr r0, _0808BA64 - bl DisplayDungeonDialogue - movs r0, 0xA - movs r1, 0x46 - bl sub_803E708 - ldr r0, _0808BA68 - ldr r0, [r0] - ldr r1, _0808BA6C - adds r0, r1 - movs r1, 0x1 - strb r1, [r0] -_0808B9F8: - ldr r0, _0808BA70 - bl DisplayDungeonDialogue - adds r0, r6, 0 - bl JirachiSpinEffect - movs r0, 0xA - movs r1, 0x46 - bl sub_803E708 - ldr r0, _0808BA74 - bl DisplayDungeonDialogue - movs r0, 0xA - movs r1, 0x46 - bl sub_803E708 - bl sub_808BD38 - add sp, 0x78 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0808BA30: .4byte gUnknown_8105AD4 -_0808BA34: .4byte 0x0000015d -_0808BA38: .4byte gUnknown_8105B20 -_0808BA3C: .4byte gAvailablePokemonNames -_0808BA40: .4byte gUnknown_202DE58 -_0808BA44: .4byte gUnknown_8105B68 -_0808BA48: .4byte gUnknown_8105BA8 -_0808BA4C: .4byte gUnknown_81074FC -_0808BA50: .4byte 0xffff0000 -_0808BA54: .4byte 0x0000ffff -_0808BA58: .4byte gUnknown_8105BF4 -_0808BA5C: .4byte gUnknown_8105D2C -_0808BA60: .4byte gUnknown_8105D80 -_0808BA64: .4byte gUnknown_8105D9C -_0808BA68: .4byte gDungeonGlobalData -_0808BA6C: .4byte 0x00000674 -_0808BA70: .4byte gUnknown_81058E0 -_0808BA74: .4byte gUnknown_810593C - thumb_func_end JirachiWish - - thumb_func_start JirachiReFightDialogue -JirachiReFightDialogue: - push {lr} - ldr r0, _0808BA94 - bl HasRecruitedMon - lsls r0, 24 - cmp r0, 0 - beq _0808BA9C - bl sub_8086448 - ldr r0, _0808BA98 - bl sub_80866C4 - b _0808BAA0 - .align 2, 0 -_0808BA94: .4byte 0x0000019d -_0808BA98: .4byte gJirachiReFightDialogue_1 -_0808BA9C: - bl JirachiPreFightDialogue -_0808BAA0: - pop {r0} - bx r0 - thumb_func_end JirachiReFightDialogue - - thumb_func_start JirachiWishGrantFlash -JirachiWishGrantFlash: - push {r4,r5,lr} - sub sp, 0x4 - ldr r0, _0808BB34 - bl PlaySoundEffect - ldr r1, _0808BB38 - movs r0, 0x1F - str r0, [r1] - movs r4, 0xFA - movs r5, 0x1 -_0808BAB8: - str r5, [sp] - adds r0, r4, 0 - adds r1, r4, 0 - adds r2, r4, 0 - movs r3, 0x1 - bl SetDungeonBGColorRGB - movs r0, 0x46 - bl sub_803E46C - subs r4, 0xA - cmp r4, 0x95 - bgt _0808BAB8 - movs r0, 0xA - movs r1, 0x46 - bl sub_803E708 - movs r4, 0xFA - movs r5, 0x1 -_0808BADE: - str r5, [sp] - adds r0, r4, 0 - adds r1, r4, 0 - adds r2, r4, 0 - movs r3, 0x1 - bl SetDungeonBGColorRGB - movs r0, 0x46 - bl sub_803E46C - subs r4, 0xA - cmp r4, 0xC7 - bgt _0808BADE - movs r0, 0xA - movs r1, 0x46 - bl sub_803E708 - movs r4, 0xFA - movs r5, 0x1 -_0808BB04: - str r5, [sp] - adds r0, r4, 0 - adds r1, r4, 0 - adds r2, r4, 0 - movs r3, 0x1 - bl SetDungeonBGColorRGB - movs r0, 0x46 - bl sub_803E46C - subs r4, 0xA - cmp r4, 0 - bge _0808BB04 - movs r0, 0xA - movs r1, 0x46 - bl sub_803E708 - bl sub_8085EB0 - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0808BB34: .4byte 0x000002c1 -_0808BB38: .4byte gUnknown_202EDC8 - thumb_func_end JirachiWishGrantFlash - - thumb_func_start sub_808BB3C -sub_808BB3C: - push {lr} - sub sp, 0x8 - adds r3, r0, 0 - movs r0, 0 - ldrsh r1, [r3, r0] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 11 - movs r1, 0xC0 - lsls r1, 4 - adds r0, r1 - cmp r0, 0 - bge _0808BB58 - adds r0, 0xFF -_0808BB58: - lsls r0, 8 - lsrs r0, 16 - ldr r1, _0808BBA0 - ldr r2, [sp, 0x4] - ands r2, r1 - orrs r2, r0 - str r2, [sp, 0x4] - movs r0, 0x2 - ldrsh r1, [r3, r0] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 11 - movs r1, 0x80 - lsls r1, 5 - adds r0, r1 - cmp r0, 0 - bge _0808BB7C - adds r0, 0xFF -_0808BB7C: - lsls r0, 8 - lsrs r0, 16 - lsls r0, 16 - ldr r1, _0808BBA4 - ands r2, r1 - orrs r2, r0 - str r2, [sp, 0x4] - movs r0, 0 - str r0, [sp] - movs r0, 0x64 - movs r1, 0 - movs r2, 0 - add r3, sp, 0x4 - bl sub_8085EC8 - add sp, 0x8 - pop {r0} - bx r0 - .align 2, 0 -_0808BBA0: .4byte 0xffff0000 -_0808BBA4: .4byte 0x0000ffff - thumb_func_end sub_808BB3C - - .align 2,0 diff --git a/include/code_80A26CC.h b/include/code_80A26CC.h new file mode 100644 index 000000000..2838f15a7 --- /dev/null +++ b/include/code_80A26CC.h @@ -0,0 +1,17 @@ +struct unkStruct_80A2608 +{ + /* 0x0 */ s16 unk0; + /* 0x2 */ s16 unk2; + /* 0x4 */ s16 unk4; + /* 0x6 */ u16 unk6; + /* 0x8 */ u16 unk8; + /* 0xA */ u16 unkA; + /* 0xC */ u8 unkC; + /* 0xD */ u8 unkD; + /* 0xE */ s16 unkE; + /* 0x10 */ u8 unk10; + /* 0x11 */ u8 unk11; +}; + +struct unkStruct_80A2608 *sub_80A2608(s16 r0); +struct unkStruct_80A2608 *sub_80A2620(s16 r0); diff --git a/include/dungeon_global_data.h b/include/dungeon_global_data.h index 75b5d0143..bc40855d6 100644 --- a/include/dungeon_global_data.h +++ b/include/dungeon_global_data.h @@ -58,7 +58,8 @@ struct DungeonGlobalData u8 fill66C[0x671 - 0x66C]; /* 0x671 */ bool8 monsterHouseActive; /* 0x672 */ u8 unk672; - u8 fill673[0x675 - 0x673]; + u8 fill673[0x674 - 0x673]; + u8 unk674; u8 unk675; u8 unk676[0x68A - 0x676]; /* 0x68A */ u8 unk68A; diff --git a/ld_script.txt b/ld_script.txt index b046898f9..583d61191 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -274,7 +274,6 @@ SECTIONS { src/code_8086A3C.o(.text); asm/code_8086A3C.o(.text); src/code_8057824_1.o(.text); - asm/jirachi_wish.o(.text); src/code_80521D0_1.o(.text); src/pokemon.o(.text); asm/pokemon.o(.text); diff --git a/src/code_80521D0_1.c b/src/code_80521D0_1.c index f4257ad7b..3386db7c5 100644 --- a/src/code_80521D0_1.c +++ b/src/code_80521D0_1.c @@ -141,9 +141,9 @@ extern void sub_8086A54(struct DungeonEntity *); extern void sub_806BFC0(struct DungeonEntityData *, u32); -void sub_808BBA8(struct DungeonEntity *param_1) +void sub_808BBA8(struct DungeonEntity *jirachiEntity) { - sub_806BFC0(param_1->entityData,0); + sub_806BFC0(jirachiEntity->entityData,0); } void JirachiDropInEffect(struct DungeonEntity *jirachiEntity) diff --git a/src/code_8057824_1.c b/src/code_8057824_1.c index ccaab4b05..933c0015b 100644 --- a/src/code_8057824_1.c +++ b/src/code_8057824_1.c @@ -1,16 +1,22 @@ #include "global.h" #include "constants/direction.h" +#include "constants/friend_area.h" #include "constants/weather.h" #include "dungeon_global_data.h" #include "dungeon_entity.h" +#include "dungeon_map_access.h" +#include "dungeon_random.h" #include "dungeon_util.h" #include "dungeon_util_1.h" +#include "friend_area.h" #include "item.h" #include "pokemon.h" +#include "position_util.h" extern u32 gUnknown_202EDC8; extern u8 gUnknown_202E038[0x50]; extern u8 gAvailablePokemonNames[0x58]; +extern u8 gUnknown_202DE58[]; extern s16 gUnknown_80F57CA; extern s16 gUnknown_80F57D2; @@ -219,6 +225,29 @@ extern u32 gZapdosPostStoryPreFightDialogue_3; extern u32 gZapdosPostStoryPreFightDialogue_4; extern u32 gZapdosPostStoryPreFightDialogue_5; extern u32 gZapdosPostStoryPreFightDialogue_6; +extern u32 gUnknown_8105668; +extern u32 gUnknown_8105674; +extern u32 gUnknown_81056B8; +extern u32 gUnknown_81056DC; +extern u32 gUnknown_810579C; +extern u32 gUnknown_8105974; +extern u32 gUnknown_810581C; + +extern u32 gUnknown_8105BF4; +extern u32 gUnknown_8105D2C; +extern u32 gUnknown_8105D80; +extern u32 gUnknown_8105D9C; +extern u32 gUnknown_81058E0; +extern u32 gUnknown_810593C; +extern u32 gUnknown_8105A08; +extern u32 gUnknown_8105AD4; +extern u32 gUnknown_8105B20; +extern u32 gUnknown_8105B68; +extern u32 gUnknown_8105BA8; +extern u8 *gUnknown_8105798[]; +extern u32 gJirachiReFightDialogue_1; + +extern u8 gUnknown_81074FC[]; extern struct DungeonEntity *xxx_call_GetLeaderEntity(void); extern struct DungeonEntity *GetEntityFromClientType(u32); @@ -231,6 +260,7 @@ extern void sub_803E708(u32, u32); extern void DisplayDungeonDialogue(u32 *r0); extern void sub_8083E88(u32); extern void JirachiSpinEffect(struct DungeonEntity *); +extern void JirachiWishGrantDialogue(struct DungeonEntity *jirachiEntity); extern void sub_80862BC(struct DungeonEntity *); extern void sub_8086448(); @@ -251,7 +281,7 @@ extern void SetFacingDirection(struct DungeonEntity *, u32); extern void sub_8049ED4(); extern void sub_8085860(s32 r0, u32 r1); extern void sub_806CE68(struct DungeonEntity *, u32); - +extern void sub_8092578(u8 *buffer, u8 index, u8 r2); extern void sub_8052D44(u8 *, struct DungeonEntity *, struct DungeonEntity *); extern void sub_8097FD0(u32); extern void SetMessageArgument(u8 *, struct DungeonEntity *, u32); @@ -363,7 +393,14 @@ extern u32 gUnknown_81015A0; extern u32 gZapdosReFightDialogue_2; extern u32 gZapdosReFightDialogue_3; extern u32 gZapdosReFightDialogue_4; - +extern s32 sub_8052C68(u32, u8 *, u32 *, u32); +extern void sub_80861A8(void); +extern void sub_8045C28(struct ItemSlot *, u8 , u8 *); +extern void sub_808BD38(void); +extern u8 JirachiFriendAreaSearch(void); +extern void sub_808BB3C(s16 *); +extern void sub_8046860(struct DungeonEntity *, s32 *, struct ItemSlot *, u32); +extern u32 sub_803D73C(u32); void ZapdosReFightDialogue(void) { @@ -1909,7 +1946,7 @@ void sub_8089620(struct DungeonEntity *param_1) PlaySoundEffect(0x1f8); while( 1 ) { iVar2 = iVar2 - iVar1; - iVar1 = iVar1 -= 0x18; + iVar1 -= 0x18; if (iVar1 < 0x14) { iVar1 = 0x14; } @@ -3557,3 +3594,280 @@ void sub_808B50C(void) sub_803E708(10,70); gDungeonGlobalData->unk2 = 1; } + +void JirachiWish(void) +{ + u8 friendArea; + struct DungeonEntity *JirachiEntity; + struct Position *LeaderPos; + struct DungeonEntity *LeaderEntity; + s32 wishChoice; + s32 iVar4; + u32 uVar6; + s32 iVar9; + struct ItemSlot auStack152 [9]; + struct ItemSlot auStack116 [9]; + struct ItemSlot auStack80 [9]; + s32 local_2c; + s32 local_28; + s32 local_24; + s32 temp; + s32 temp2; + s32 temp3; + + JirachiEntity = GetEntityFromClientType(0x1a); + CopySpeciesNametoBuffer(gUnknown_202E038,0x19d); // SPECIES_JIRACHI + sub_80855E4(sub_808BBA8); + sub_808BBA8(JirachiEntity); + sub_8041888(0); + JirachiEntity->entityData->unk15C = 1; + JirachiEntity->entityData->unk15E = 0; + sub_80861B8(JirachiEntity,0xe,0); + sub_80855E4(sub_80861A8); + gDungeonGlobalData->unk1356C = 1; + sub_8083ED8(0x1e); + sub_803E708(0x1e,0x46); + DisplayDungeonDialogue(&gUnknown_8105668); + sub_803E708(10,0x46); + PlaySoundEffect(0x1a7); + sub_803E708(0x96,0x46); + sub_80862BC(JirachiEntity); + DisplayDungeonDialogue(&gUnknown_8105674); + sub_8083E88(0x79); + sub_803E708(10,0x46); + sub_80856E0(JirachiEntity,0); + PlaySoundEffect(0x16a); + DisplayDungeonDialogue(&gUnknown_81056B8); + sub_803E708(10,0x46); + SpriteLookAroundEffect(JirachiEntity); + DisplayDungeonDialogue(&gUnknown_81056DC); + sub_803E708(10,0x46); + while( 1 ) { + while (1) { +#ifndef NONMATCHING + register s32 r0 asm("r0"); + asm("mov\t%0, #0":"=r"(r0)); +#else + s32 r0 = 0; +#endif + wishChoice = sub_8052C68(r0,*gUnknown_8105798,&gUnknown_810579C,0x705); + if (wishChoice >= 1) break; + } + sub_803E708(10,0x46); + if (wishChoice == 1) { + s32 r8; + // Lots of Money + DisplayDungeonDialogue(&gUnknown_810581C); + sub_803E708(10,0x46); + JirachiWishGrantDialogue(JirachiEntity); + + for(iVar4 = 0; iVar4 < 6; iVar4 = r8) + { + r8 = iVar4 + 1; + for(iVar9 = 0; iVar9 < 9; iVar9++) + { + sub_8045C28(&auStack152[iVar9], 0x69, 0); + } + temp = (u16)(((((u16)JirachiEntity->posWorld.x + DungeonRandomCapped(3)) - 1) << 16) >> 16); + local_2c &= 0xffff0000; + local_2c |= temp; + + temp = ((u16)JirachiEntity->posWorld.y + DungeonRandomCapped(3) + -1) * 0x10000; + local_2c &= 0xffff; + local_2c |= temp; + if ((GetMapTile_2((s16)local_2c, local_2c >> 16)->tileType & 3) != 0) { + PlaySoundEffect(0x14c); + sub_808BB3C((s16 *)&local_2c); + sub_8046860(JirachiEntity,&local_2c,auStack152,9); + } + } + JirachiEntity->entityData->unk15D = 0; + } + if (wishChoice == 2) { + // Lots of Items + DisplayDungeonDialogue(&gUnknown_8105974); + sub_803E708(10,0x46); + JirachiWishGrantDialogue(JirachiEntity); + + for(iVar4 = 0; iVar4 < 6; iVar4++) + { +#ifndef NONMATCHING + asm("":::"sl"); +#endif + for(iVar9 = 0; iVar9 < 9; iVar9++) + { + sub_8045C28(&auStack116[iVar9], sub_803D73C(0),0); + } + temp2 = (u16)(((((u16)JirachiEntity->posWorld.x + DungeonRandomCapped(3)) - 1) << 16) >> 16); + local_28 &= 0xffff0000; + local_28 |= temp2; + + temp2 = ((u16)JirachiEntity->posWorld.y + DungeonRandomCapped(3) + -1) * 0x10000; + local_28 &= 0xffff; + local_28 |= temp2; + if ((GetMapTile_2((s16)local_28, local_28 >> 16)->tileType & 3) != 0) { + PlaySoundEffect(400); + sub_808BB3C((s16 *)&local_28); + sub_8046860(JirachiEntity,&local_28,auStack116,9); + } + } + JirachiEntity->entityData->unk15D = 0; + } + + if (wishChoice == 3) + { + // A Friend Area + friendArea = JirachiFriendAreaSearch(); + if (friendArea == NUM_FRIEND_AREAS) + { + // You want a friend area? But you already have many friend areas... + DisplayDungeonDialogue(&gUnknown_8105A08); + sub_803E708(10,0x46); + continue; + } + else + { + // You want a friend area? As you wish.. + DisplayDungeonDialogue(&gUnknown_8105AD4); + sub_803E708(10,0x46); + JirachiWishGrantDialogue(JirachiEntity); + JirachiEntity->entityData->unk15D = 0; + DisplayDungeonDialogue(&gUnknown_8105B20); + UnlockFriendArea(friendArea); + PlaySoundEffect(0xd4); + LeaderEntity = GetLeaderEntity(); + SetMessageArgument(gAvailablePokemonNames,LeaderEntity,0); + sub_8092578(gUnknown_202DE58,friendArea,0); + // Obtained the friend area! + DisplayDungeonDialogue(&gUnknown_8105B68); + } + } + if (wishChoice == 4) { + // More Strength.. + DisplayDungeonDialogue(&gUnknown_8105BA8); + sub_803E708(10,0x46); + JirachiWishGrantDialogue(JirachiEntity); + + for(iVar4 = 0; iVar4 < 5; iVar4++) + { + + for(iVar9 = 0; iVar9 < 4; iVar9++) + { + sub_8045C28(&auStack80[iVar9],gUnknown_81074FC[DungeonRandomCapped(8)],0); + } + temp3 = (u16)(((((u16)JirachiEntity->posWorld.x + DungeonRandomCapped(3)) - 1) << 16) >> 16); + local_24 &= 0xffff0000; + local_24 |= temp3; + + temp3 = ((u16)JirachiEntity->posWorld.y + DungeonRandomCapped(3) + -1) * 0x10000; + local_24 &= 0xffff; + local_24 |= temp3; + if ((GetMapTile_2((s16)local_24, local_24 >> 16)->tileType & 3) != 0) { + PlaySoundEffect(400); + sub_808BB3C((s16 *)&local_24); + sub_8046860(JirachiEntity,&local_24,auStack80,4); + } + } + JirachiEntity->entityData->unk15D = 0; + DisplayDungeonDialogue(&gUnknown_8105BF4); + sub_803E708(10,0x46); + } + if (wishChoice == 5) { + // Something Good... + DisplayDungeonDialogue(&gUnknown_8105D2C); + sub_803E708(10,0x46); + JirachiWishGrantDialogue(JirachiEntity); + JirachiEntity->entityData->unk15D = 0; + DisplayDungeonDialogue(&gUnknown_8105D80); + sub_803E708(10,0x46); + LeaderPos = &GetLeaderEntity()->posWorld; + uVar6 = CalculateFacingDir(&JirachiEntity->posWorld,LeaderPos); + SetFacingDirection(JirachiEntity,uVar6); + sub_803E708(10,0x46); + DisplayDungeonDialogue(&gUnknown_8105D9C); + sub_803E708(10,0x46); + gDungeonGlobalData->unk674 = 1; + } + break; + } + + DisplayDungeonDialogue(&gUnknown_81058E0); + JirachiSpinEffect(JirachiEntity); + sub_803E708(10,0x46); + DisplayDungeonDialogue(&gUnknown_810593C); + sub_803E708(10,0x46); + sub_808BD38(); +} + +void JirachiReFightDialogue(void) +{ + if(HasRecruitedMon(SPECIES_JIRACHI)) + { + sub_8086448(); + sub_80866C4(&gJirachiReFightDialogue_1); + } + else + { + JirachiPreFightDialogue(); + } +} + +void JirachiWishGrantFlash(void) +{ + s32 iVar1; + + PlaySoundEffect(0x2c1); + gUnknown_202EDC8 = 0x1f; + + for(iVar1 = 0xFA; iVar1 > 0x95; iVar1 -= 10) + { + SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,1); + sub_803E46C(0x46); + } + sub_803E708(10,0x46); + + for(iVar1 = 0xFA; iVar1 > 0xC7; iVar1 -= 10) + { + SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,1); + sub_803E46C(0x46); + } + sub_803E708(10,0x46); + + for(iVar1 = 0xFA; iVar1 >= 0; iVar1 -= 10) + { + SetDungeonBGColorRGB(iVar1,iVar1,iVar1,1,1); + sub_803E46C(0x46); + } + sub_803E708(10,0x46); + sub_8085EB0(); +} + +void sub_808BB3C(s16 *param_1) +{ + register s32 iVar1 asm("r0"); + s32 uVar2; + u32 local_8; + + iVar1 = param_1[0] * 0x1800 + 0xc00; + if (iVar1 < 0) { + iVar1 += 0xff; + } + + iVar1 <<= 8; + iVar1 = (u16)(iVar1 >> 16); + + uVar2 = (local_8 & 0xffff0000) | iVar1; + local_8 = uVar2; + + iVar1 = param_1[1] * 0x1800 + 0x1000; + if (iVar1 < 0) { + iVar1 += 0xff; + } + + iVar1 <<= 8; + iVar1 = (u16)(iVar1 >> 0x10); + iVar1 <<= 0x10; + + local_8 = (iVar1) | (uVar2 & 0x0000ffff); + sub_8085EC8(100,0,0,&local_8,0); +}