From 6f3ad6941c15e2bdfaf535885a3787f38d6db226 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Mon, 14 Sep 2026 03:48:53 -0700 Subject: [PATCH] Decompile 48 more callees; clear four asm files entirely Every function of four whole asm files now matches, so all four objects leave main.lsf and the .s/.inc files go: asm/overlay_29_023055B0.s 4 functions asm/overlay_29_02314810.s 9 functions asm/overlay_29_022E7EC4.s 25 functions asm/main_0202AB94.s 10 functions struct unk_0202AAA8 gains four members carved out of existing byte padding: a u32 at 0x0, the third menu kind's flag word plus its initial selected index at 0xFC/0x100, a u8 * at 0x160, and a signed s32 at 0x1A8. Offsets and sizeof are unchanged (0x1C8), proven by compiling one offsetof assertion per member with mwccarm and reading the folded constant back; the check carries a negative control that correctly fails, so "all as expected" is an outcome it could have missed. Nothing in the tree read any of the four offsets. struct struct_2 moves from include/overlay_31_02382820.h to include/window.h so a src/main_* file can reach it. CreateSimpleMenuInternal copies it whole (0x98 bytes), so its size is load-bearing. It is a pure move; the name is pre-existing and unchanged. window.h rather than main_0202AAA8.h because the latter drags main_0202AB40.h's prototypes into overlay_31_02382820.c, where they collide with that file's own declarations. Four data symbols declared `extern s32` from a call site whose parameter was void * are given their real types: _0209C85C and ov11_02322CC8 are WindowTemplate (each measures exactly 0x10 to the next symbol, and WindowTemplate is 16 bytes), _0209C86C and ov11_02322CF0 are struct unk_0202A5CC[] (8-byte records, matching the element counts the call sites pass). Each had exactly one user. The (s32) cast at overlay_11_02307334.c's call site goes with them -- field_0x1c is already a struct struct_2. Region arms, all message ids: overlay_29_0230558C.c gains a JPN_MSG_OFFSET block for five ids; move_orb_effects.c reuses its existing one and adds MESSAGE_ED0 / MESSAGE_ED1 for the two that shift by -0x2BE rather than the file's flat -0x2C0; overlay_29_02315118.c gains five named defines because it has no offset constant of its own. Every other region delta in these four files is a header-driven field displacement and needs nothing. Nine call-site-derived declarations across six files are replaced by an include of the owning header. Four declared void where the function returns bool8; two declared an s8 return where it is s32; three took an s8 parameter where it is s32. One was the fifth extern on a single physical line, which a line-oriented grep does not see. Authored by Claude (Opus 5) under human direction. Confirmed by matching builds in all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/main_0202AB94.inc | 36 -- asm/include/overlay_29_022E7EC4.inc | 49 -- asm/include/overlay_29_023055B0.inc | 52 --- asm/include/overlay_29_02314810.inc | 31 -- asm/main_0202AB94.s | 687 ---------------------------- asm/overlay_29_022E7EC4.s | 657 -------------------------- asm/overlay_29_023055B0.s | 491 -------------------- asm/overlay_29_02314810.s | 524 --------------------- include/main_0202AAA8.h | 12 +- include/main_0202AB40.h | 6 + include/main_0202B4C4.h | 7 + include/move_orb_effects.h | 8 + include/overlay_29_022E869C.h | 50 ++ include/overlay_29_0230558C.h | 4 + include/overlay_29_02315118.h | 1 + include/overlay_31_02382820.h | 7 - include/spawn_2.h | 1 + include/window.h | 7 + main.lsf | 4 - src/main_0202AB40.c | 234 ++++++++++ src/main_0202B4C4.c | 198 +++++++- src/main_0203D538.c | 8 +- src/move_orb_effects.c | 175 ++++++- src/overlay_11_02307334.c | 11 +- src/overlay_29_022E869C.c | 324 +++++++++++++ src/overlay_29_0230558C.c | 268 +++++++++++ src/overlay_29_02315118.c | 80 ++++ src/overlay_29_0231CBC8.c | 2 +- src/overlay_29_023293E4.c | 2 +- src/overlay_29_0232DD78.c | 2 +- src/spawn_2.c | 21 + 31 files changed, 1395 insertions(+), 2564 deletions(-) delete mode 100644 asm/include/main_0202AB94.inc delete mode 100644 asm/include/overlay_29_022E7EC4.inc delete mode 100644 asm/include/overlay_29_023055B0.inc delete mode 100644 asm/include/overlay_29_02314810.inc delete mode 100644 asm/main_0202AB94.s delete mode 100644 asm/overlay_29_022E7EC4.s delete mode 100644 asm/overlay_29_023055B0.s delete mode 100644 asm/overlay_29_02314810.s diff --git a/asm/include/main_0202AB94.inc b/asm/include/main_0202AB94.inc deleted file mode 100644 index 8847c387..00000000 --- a/asm/include/main_0202AB94.inc +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once -.public CalcMenuHeightDiv8__02031AA4 -.public GetPageItemYOffset -.public GetSelectedMenuItemIdx -.public GetTotalNumMenuItems -.public GetWindowContents -.public GetWindowRectangle -.public InitWindowInput -.public IsEmptyString -.public IsMenuOptionActive -.public MemAlloc -.public NewWindowScreenCheck -.public PlayWindowInputSound -.public PreprocessStringFromId -.public SIMPLE_MENU_DEFAULT_WINDOW_PARAMS -.public sub_020263C8 -.public sub_020265A8 -.public sub_02027B1C -.public sub_0202810C -.public sub_0202812C -.public sub_0202830C -.public sub_02028948 -.public sub_0202A03C -.public sub_02031A5C -.public sub_02031C74 -.public sub_02031C84 -.public sub_02031C98 -.public sub_02032070 -.public sub_02032160 -.public sub_020323F8 -.public sub_0203250C -.public sub_02032684 -.public sub_02032984 -.public sub_02033758 -.public UpdateSimpleMenu -.public UpdateWindow diff --git a/asm/include/overlay_29_022E7EC4.inc b/asm/include/overlay_29_022E7EC4.inc deleted file mode 100644 index d3ca2476..00000000 --- a/asm/include/overlay_29_022E7EC4.inc +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once -.public DUNGEON_FRAMES_PASSED -.public DUNGEON_PTR -.public DungeonChangeTopScreenType -.public DungeonGetSpriteIndex -.public FreeDungeonControlsMenu -.public FreeTopScreen -.public GetIdleAnimationId -.public GetPlayerGender -.public GetTopScreenOption -.public InitDungeonControlsMenu -.public IsTeamStatsOnTopScreen -.public MemAlloc -.public MemFree -.public MemZero -.public ov10_022C1E50 -.public ov10_022C1E80 -.public ov10_022C21D8 -.public ov10_022C2278 -.public ov10_022C22A0 -.public ov29_022DC694 -.public ov29_022DC6D0 -.public ov29_022DC6DC -.public ov29_022DC6E8 -.public ov29_022DC728 -.public ov29_022DC738 -.public ov29_022DC76C -.public ov29_022DC778 -.public ov29_022DC77C -.public ov29_022E8708 -.public ov29_022E8CE8 -.public ov29_022E8F78 -.public ov29_022E8FCC -.public ov29_022E8FF8 -.public ov29_022E9008 -.public ov29_022E9014 -.public ov29_02339138 -.public ov29_02339D7C -.public ov29_0233A0E8 -.public ov29_0233A1BC -.public ov29_0234B4E0 -.public SetMinimapDataE447 -.public SetMinimapDataE448 -.public sub_02048384 -.public sub_020483B8 -.public sub_020483D8 -.public sub_02048400 -.public TOP_SCREEN_STATUS_PTR -.public UpdateMinimap diff --git a/asm/include/overlay_29_023055B0.inc b/asm/include/overlay_29_023055B0.inc deleted file mode 100644 index 634a9e3a..00000000 --- a/asm/include/overlay_29_023055B0.inc +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once -.public AbilityIsActiveVeneer -.public CalcSpeedStageWrapper -.public ChangeMonsterAnimation -.public CheckVariousStatuses2__02301244 -.public DUNGEON_PTR -.public EndBlinkerClassStatus -.public EndBurnClassStatus -.public EndCringeClassStatus -.public EndCurseClassStatus -.public EndFrozenClassStatus -.public EndLeechSeedClassStatus -.public EndMiracleEyeStatus -.public EndMuzzledStatus -.public EndSleepClassStatus -.public EndSureShotClassStatus -.public EntityIsValid__0230558C -.public EntityIsValid__02305C04 -.public GetDirectionTowardsPosition -.public GetIdleAnimationId -.public GetLeader -.public GetTileAtEntity -.public GetTrapInfo -.public HasHeldItem -.public IqSkillIsEnabled -.public IsFloorOver -.public IsMonsterDrowsy -.public IsMonsterMuzzled -.public IsMonsterVisuallyImpaired -.public IsTeamMemberOnFirstTurnInFixedRoom -.public LogMessageByIdWithPopupCheckUser -.public LogMessageByIdWithPopupCheckUserTarget -.public MonsterHasAttackInterferingStatus -.public MonsterHasImmobilizingStatus -.public MonsterHasLeechSeedStatus -.public MonsterHasMiracleEyeStatus -.public MonsterHasNegativeStatus -.public MonsterHasNonvolatileNonsleepStatus -.public MonsterHasSkillInterferingStatus -.public MonsterHasWhifferStatus -.public ov29_022E2CA0 -.public ov29_022E3A58 -.public ov29_022E543C -.public ov29_022EA370 -.public ov29_02337D68 -.public ov29_02353318 -.public SubstitutePlaceholderStringTags -.public TryNonLeaderItemPickUp -.public TryTriggerMonsterHouse -.public TryTriggerTrap -.public UpdateStatusIconFlags -.public UpdateTrapsVisibility diff --git a/asm/include/overlay_29_02314810.inc b/asm/include/overlay_29_02314810.inc deleted file mode 100644 index 1048d25b..00000000 --- a/asm/include/overlay_29_02314810.inc +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once -.public AbilityIsActiveVeneer -.public BoostSpeed -.public CalcSpeedStage -.public CalcSpeedStageWrapper -.public CalcStatusDuration -.public CONFUSED_TURN_RANGE -.public DungeonRandInt -.public DungeonRandOutcome__022EAB20 -.public EntityIsValid__023118B4 -.public EntityIsValid__02315118 -.public ExclusiveItemEffectIsActive__023147EC -.public GetExclusiveItemWithEffectFromBag -.public IsProtectedFromNegativeStatus -.public ItemIsActive__0231513C -.public LogMessageByIdWithPopupCheckUserTarget -.public LowerSpeed -.public ov10_022C4618 -.public ov29_022E41CC -.public ov29_022E543C -.public ov29_022E60E4 -.public ov29_02353318 -.public PlaySpeedDownEffect -.public PlaySpeedUpEffect -.public PrepareItemForPrinting__02345728 -.public SafeguardIsActive -.public SetPreprocessorArgsIdVal -.public SPEED_BOOST_TURN_RANGE -.public SPEED_LOWER_TURN_RANGE -.public SubstitutePlaceholderStringTags -.public UpdateStatusIconFlags diff --git a/asm/main_0202AB94.s b/asm/main_0202AB94.s deleted file mode 100644 index 9d1c2a5d..00000000 --- a/asm/main_0202AB94.s +++ /dev/null @@ -1,687 +0,0 @@ - .include "asm/macros.inc" - .include "main_0202AB94.inc" - - .text - - arm_func_start sub_0202AB94 -sub_0202AB94: ; 0x0202AB94 - stmdb sp!, {r4, lr} - mov r4, r1 - bl GetWindowContents - mov r1, r4 - add r0, r0, #4 - bl sub_02032684 - ldmia sp!, {r4, pc} - arm_func_end sub_0202AB94 - - arm_func_start GetSimpleMenuResult__0202AEA4 -GetSimpleMenuResult__0202AEA4: ; 0x0202ABB0 - stmdb sp!, {r4, lr} - bl GetWindowContents - ldrb r1, [r0, #0x1a0] - ldr r4, [r0, #0x198] - cmp r1, #0 - beq _0202ABF4 - ldrb r1, [r0, #0x1a1] - add r0, r0, #4 - cmp r1, #0 - beq _0202ABE0 - bl GetTotalNumMenuItems - b _0202ABE4 -_0202ABE0: - bl GetSelectedMenuItemIdx -_0202ABE4: - add r0, r0, r0, lsl #6 - add r0, r4, r0, lsl #2 - ldr r0, [r0, #0x100] - ldmia sp!, {r4, pc} -_0202ABF4: - mov r0, #0 - ldmia sp!, {r4, pc} - arm_func_end GetSimpleMenuResult__0202AEA4 - - arm_func_start UpdateParentMenu -UpdateParentMenu: ; 0x0202ABFC - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #0x30 - mov r6, r0 - ldr r4, [r6, #0xc] - ldr r0, [r4, #0x19c] - cmp r0, #7 - addls pc, pc, r0, lsl #2 - b _0202AF6C -_0202AC1C: ; jump table - b _0202AC3C ; case 0 - b _0202AC5C ; case 1 - b _0202AC78 ; case 2 - b _0202ACDC ; case 3 - b _0202AD3C ; case 4 - b _0202AEE8 ; case 5 - b _0202AEF8 ; case 6 - b _0202AF40 ; case 7 -_0202AC3C: - ldrsb r0, [r6, #0x10] - bl sub_0202810C - cmp r0, #0 - beq _0202AF6C - ldr r1, [r4, #0x1a8] - mov r0, #2 - str r1, [r4, #0x1ac] - str r0, [r4, #0x19c] -_0202AC5C: - ldr r0, [r4, #0x19c] - cmp r0, #1 - ldreq r1, [r4, #0x1a8] - moveq r0, #2 - streq r1, [r4, #0x1ac] - streq r0, [r4, #0x19c] - beq _0202AF6C -_0202AC78: - ldr r0, [r4, #0x1a8] - cmp r0, #0 - ble _0202ACD4 - ldr r0, [r4, #0x1ac] - mov r1, #0x4000000 - cmp r0, #0 - subgt r0, r0, #1 - strgt r0, [r4, #0x1ac] - ldr r0, [r4, #0x1ac] - cmp r0, #0 - add r0, r4, #4 - ble _0202ACD0 - bl sub_02031C74 - mov r1, #0 - strb r1, [r4, #0x1a0] - strb r1, [r4, #0x1a1] - str r1, [r4, #0x1a4] - sub r1, r1, #1 - mov r0, r6 - str r1, [r6, #0xb8] - bl sub_0202AF78 - b _0202AF6C -_0202ACD0: - bl sub_02031C84 -_0202ACD4: - mov r0, #3 - str r0, [r4, #0x19c] -_0202ACDC: - mov r0, r6 - bl sub_0202AF78 - ldr r0, [r4, #0xfc] - tst r0, #0x800000 - beq _0202AD18 - mov r0, #9 - str r0, [r4, #0x19c] - mov r1, #1 - mov r0, #0 - strb r1, [r4, #0x1a0] - strb r0, [r4, #0x1a1] - str r0, [r4, #0x1a4] - sub r0, r0, #4 - str r0, [r6, #0xb8] - b _0202AF6C -_0202AD18: - mov r1, #4 - mov r0, #0 - str r1, [r4, #0x19c] - strb r0, [r4, #0x1a0] - strb r0, [r4, #0x1a1] - str r0, [r4, #0x1a4] - sub r0, r0, #1 - str r0, [r6, #0xb8] - b _0202AF6C -_0202AD3C: - add r1, sp, #8 - add r2, sp, #0xc - add r0, r4, #4 - mov r3, #1 - bl sub_02031C98 - ldr r1, [sp, #8] - mov r5, r0 - cmp r1, #0 - bne _0202ADAC - ldr r0, [r4, #0xfc] - tst r0, #1 - beq _0202ADAC - mov r3, #0 - ldr r2, _0202AF74 ; =0x00000408 - add r1, sp, #0xc - str r3, [sp] - mov ip, #1 - add r0, r4, #4 - str ip, [sp, #4] - bl sub_02032160 - movs r1, r0 - bmi _0202ADAC - add r0, r4, #4 - bl sub_02032684 - ldr r0, [sp, #8] - mov r5, #1 - orr r0, r0, #1 - str r0, [sp, #8] -_0202ADAC: - ldr r0, [sp, #8] - cmp r0, #0 - bne _0202ADCC - add r1, sp, #8 - add r2, sp, #0xc - add r0, r4, #4 - bl sub_02033758 - orr r5, r5, r0 -_0202ADCC: - add r0, r4, #4 - bl GetSelectedMenuItemIdx - mov r2, r0 - ldr r1, [sp, #8] - add r0, r4, #4 - mov r3, #0 - bl sub_020323F8 - orrs r0, r5, r0 - beq _0202ADF8 - mov r0, r6 - bl sub_0202AF78 -_0202ADF8: - ldr r1, [sp, #8] - tst r1, #1 - beq _0202AE68 - add r0, r4, #4 - bl IsMenuOptionActive - cmp r0, #0 - beq _0202AE58 - ldr r0, [r4, #0xfc] - tst r0, #0x80000000 - bne _0202AE2C - add r0, r4, #4 - mov r1, #0 - bl PlayWindowInputSound -_0202AE2C: - mov r1, #1 - mov r0, #0 - strb r1, [r4, #0x1a0] - strb r0, [r4, #0x1a1] - ldr r1, [sp, #8] - sub r0, r0, #4 - str r1, [r4, #0x1a4] - str r0, [r6, #0xb8] - mov r0, #5 - str r0, [r4, #0x19c] - b _0202AED8 -_0202AE58: - add r0, r4, #4 - mov r1, #2 - bl PlayWindowInputSound - b _0202AED8 -_0202AE68: - tst r1, #2 - add r0, r4, #4 - beq _0202AEA4 - mov r1, #1 - bl PlayWindowInputSound - mov r0, #1 - strb r0, [r4, #0x1a0] - strb r0, [r4, #0x1a1] - ldr r1, [sp, #8] - sub r0, r0, #6 - str r1, [r4, #0x1a4] - str r0, [r6, #0xb8] - mov r0, #5 - str r0, [r4, #0x19c] - b _0202AED8 -_0202AEA4: - bl sub_0203250C - cmp r0, #0 - beq _0202AED8 - mov r1, #1 - mov r0, #0 - strb r1, [r4, #0x1a0] - strb r0, [r4, #0x1a1] - ldr r1, [sp, #8] - sub r0, r0, #4 - str r1, [r4, #0x1a4] - str r0, [r6, #0xb8] - mov r0, #5 - str r0, [r4, #0x19c] -_0202AED8: - ldrsb r0, [r6, #0x10] - add r1, r4, #4 - bl sub_02028948 - b _0202AF6C -_0202AEE8: - add r0, r4, #4 - bl sub_02032070 - cmp r0, #0 - bne _0202AF6C -_0202AEF8: - ldrb r0, [r4, #0x1a1] - cmp r0, #0 - bne _0202AF24 - ldr r0, [r4, #0xfc] - tst r0, #0x400000 - beq _0202AF38 - mov r0, r6 - bl sub_0202AF78 - mov r0, #9 - str r0, [r4, #0x19c] - b _0202AF6C -_0202AF24: - ldrb r0, [r4, #0x1b0] - cmp r0, #0 - movne r0, #9 - strne r0, [r4, #0x19c] - bne _0202AF6C -_0202AF38: - mov r0, #7 - str r0, [r4, #0x19c] -_0202AF40: - ldrsb r0, [r6, #0x10] - bl sub_0202812C - cmp r0, #0 - beq _0202AF6C - ldrb r0, [r4, #0x1a1] - cmp r0, #0 - mvnne r0, #4 - mvneq r0, #3 - str r0, [r6, #0xb8] - mov r0, #8 - str r0, [r4, #0x19c] -_0202AF6C: - add sp, sp, #0x30 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_0202AF74: .word 0x00000408 - arm_func_end UpdateParentMenu - - arm_func_start sub_0202AF78 -sub_0202AF78: ; 0x0202AF78 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov sl, r0 - ldr r5, [sl, #0xc] - mov r7, #0 - ldr r0, [r5, #0xfc] - ldr r6, [r5, #0x198] - tst r0, #0x200 - ldrne r8, [r5, #0x160] - ldrsb r0, [sl, #0x10] - moveq r8, #0 - bl sub_02027B1C - mov fp, #1 - mov r4, r7 - b _0202B008 -_0202AFB0: - mov r1, r4 - cmp r8, #0 - beq _0202AFCC - ldrb r0, [r8] - add r8, r8, #1 - tst r0, #2 - movne r1, fp -_0202AFCC: - cmp r1, #0 - movne sb, #0x42 - moveq sb, #0x44 - mov r1, r7 - add r0, r5, #4 - bl GetPageItemYOffset - and r1, sb, #0xff - str r1, [sp] - mov r2, r0 - ldrsb r0, [sl, #0x10] - mov r1, #0xd - mov r3, r6 - bl sub_020263C8 - add r7, r7, #1 - add r6, r6, #0x104 -_0202B008: - mov r0, r6 - bl IsEmptyString - cmp r0, #0 - beq _0202AFB0 - ldrsb r1, [sl, #0x10] - add r0, r5, #4 - bl sub_0202A03C - ldrsb r0, [sl, #0x10] - bl UpdateWindow - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - arm_func_end sub_0202AF78 - - arm_func_start sub_0202B030 -sub_0202B030: ; 0x0202B030 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - bl GetWindowContents - mov r4, r0 - add r0, r4, #4 - bl IsMenuOptionActive - cmp r0, #0 - beq _0202B094 - ldr r0, [r4, #0xfc] - tst r0, #0x80000000 - bne _0202B068 - add r0, r4, #4 - mov r1, #0 - bl PlayWindowInputSound -_0202B068: - mov r2, #1 - mov r1, #0 - strb r2, [r4, #0x1a0] - strb r1, [r4, #0x1a1] - mov r0, r5 - sub r1, r1, #4 - str r2, [r4, #0x1a4] - bl sub_0202830C - mov r0, #6 - str r0, [r4, #0x19c] - ldmia sp!, {r3, r4, r5, pc} -_0202B094: - add r0, r4, #4 - mov r1, #2 - bl PlayWindowInputSound - ldmia sp!, {r3, r4, r5, pc} - arm_func_end sub_0202B030 - - arm_func_start sub_0202B0A4 -sub_0202B0A4: ; 0x0202B0A4 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r1 - bl GetWindowContents - mov r4, r0 - cmp r5, #0 - add r0, r4, #4 - mov r1, #0xb000000 - beq _0202B0D8 - bl sub_02031C74 - add r0, r4, #4 - mov r1, #0x10 - bl sub_02031C84 - ldmia sp!, {r3, r4, r5, pc} -_0202B0D8: - bl sub_02031C84 - add r0, r4, #4 - mov r1, #0x10 - bl sub_02031C74 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end sub_0202B0A4 - - arm_func_start CreateSimpleMenuFromStringIds -CreateSimpleMenuFromStringIds: ; 0x0202B0EC - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov r7, r3 - mov sb, r1 - mov r8, r2 - mov sl, r0 - mov r1, r7 - mov r2, #0 - b _0202B114 -_0202B10C: - add r1, r1, #8 - add r2, r2, #1 -_0202B114: - ldrh r0, [r1] - cmp r0, #0 - bne _0202B10C - add r0, r2, #1 - add r0, r0, r0, lsl #6 - mov r0, r0, lsl #2 - mov r1, #8 - bl MemAlloc - mov r5, r0 - mov r6, r5 - mov r4, #0 - mov fp, #0x100 - b _0202B16C -_0202B148: - ldr r3, _0202B1A8 ; =0x0000C402 - mov r0, r6 - mov r1, fp - str r4, [sp] - bl PreprocessStringFromId - ldr r0, [r7, #4] - add r7, r7, #8 - str r0, [r6, #0x100] - add r6, r6, #0x104 -_0202B16C: - ldrh r2, [r7] - cmp r2, #0 - bne _0202B148 - mov r0, #0 - strb r0, [r6] - ldr r0, [r7, #4] - ldr r4, [sp, #0x28] - str r0, [r6, #0x100] - mov r0, sl - mov r1, sb - mov r2, r8 - mov r3, r5 - str r4, [sp] - bl CreateSimpleMenuInternal - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0202B1A8: .word 0x0000C402 - arm_func_end CreateSimpleMenuFromStringIds - - arm_func_start CreateSimpleMenu -CreateSimpleMenu: ; 0x0202B1AC - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} - sub sp, sp, #4 - mov r6, r3 - mov sb, r0 - mov r8, r1 - mov r7, r2 - mov r4, r6 - mov r5, #0 - b _0202B1D8 -_0202B1D0: - add r4, r4, #0x104 - add r5, r5, #1 -_0202B1D8: - mov r0, r4 - bl IsEmptyString - cmp r0, #0 - beq _0202B1D0 - add r0, r5, #1 - add r0, r0, r0, lsl #6 - mov r0, r0, lsl #2 - mov r1, #8 - bl MemAlloc - mov r4, r0 - mov r5, r4 - b _0202B234 -_0202B208: - mov sl, r6 - mov ip, r5 - add r6, r6, #0x104 - add r5, r5, #0x104 - mov lr, #0x10 -_0202B21C: - ldmia sl!, {r0, r1, r2, r3} - stmia ip!, {r0, r1, r2, r3} - subs lr, lr, #1 - bne _0202B21C - ldr r0, [sl] - str r0, [ip] -_0202B234: - mov r0, r6 - bl IsEmptyString - cmp r0, #0 - beq _0202B208 - mov ip, #0x10 -_0202B248: - ldmia r6!, {r0, r1, r2, r3} - stmia r5!, {r0, r1, r2, r3} - subs ip, ip, #1 - bne _0202B248 - ldr r0, [r6] - ldr r6, [sp, #0x28] - str r0, [r5] - mov r0, sb - mov r1, r8 - mov r2, r7 - mov r3, r4 - str r6, [sp] - bl CreateSimpleMenuInternal - add sp, sp, #4 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} - arm_func_end CreateSimpleMenu - - arm_func_start CreateSimpleMenuInternal -CreateSimpleMenuInternal: ; 0x0202B284 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x2c - mov r6, r0 - mov sl, r1 - mov r0, #0x1b4 - mov r1, #8 - mov sb, r2 - mov r8, r3 - bl MemAlloc - tst sl, #0x20 - ldrne r7, [sb] - mov fp, #0 - moveq r7, #0 - cmp r6, #0 - str fp, [sp, #8] - mov r4, r0 - addne ip, sp, #0x1c - ldmneia r6, {r0, r1, r2, r3} - stmneia ip, {r0, r1, r2, r3} - ldrne r0, _0202B488 ; =UpdateSimpleMenu - mov r5, r8 - orr sl, sl, #0x8000 - strne r0, [sp, #0x1c] - bne _0202B2F8 - ldr r0, _0202B48C ; =SIMPLE_MENU_DEFAULT_WINDOW_PARAMS - add r6, sp, #0x1c - ldmia r0, {r0, r1, r2, r3} - stmia r6, {r0, r1, r2, r3} - orr sl, sl, #0x300000 -_0202B2F8: - ldrb r0, [sp, #0x22] - str r4, [sp, #0x28] - cmp r0, #0 - bne _0202B348 - mov r6, #0 - b _0202B324 -_0202B310: - mov r0, r5 - bl sub_020265A8 - cmp r0, r6 - movgt r6, r0 - add r5, r5, #0x104 -_0202B324: - mov r0, r5 - bl IsEmptyString - cmp r0, #0 - beq _0202B310 - mov r0, sl - mov r1, sb - add r2, r6, #0x10 - bl sub_02031A5C - strb r0, [sp, #0x22] -_0202B348: - mov r5, r8 - b _0202B36C -_0202B350: - ldr r0, [r5, #0x100] - add r5, r5, #0x104 - cmp r0, r7 - ldr r0, [sp, #8] - ldreq fp, [sp, #8] - add r0, r0, #1 - str r0, [sp, #8] -_0202B36C: - mov r0, r5 - bl IsEmptyString - cmp r0, #0 - beq _0202B350 - ldr r0, [sp, #0x50] - add r2, sp, #8 - cmp r0, #0 - ldrle r0, [sp, #8] - add r3, sp, #0x50 - strle r0, [sp, #0x50] - ldrb r0, [sp, #0x23] - cmp r0, #0 - mov r0, sl - bne _0202B3B4 - mov r1, sb - bl CalcMenuHeightDiv8__02031AA4 - strb r0, [sp, #0x23] - b _0202B3BC -_0202B3B4: - mov r1, sb - bl CalcMenuHeightDiv8__02031AA4 -_0202B3BC: - tst sl, #0x200000 - ldrneb r1, [sp, #0x20] - ldrneb r0, [sp, #0x22] - subne r0, r1, r0 - strneb r0, [sp, #0x20] - tst sl, #0x100000 - ldrneb r1, [sp, #0x21] - ldrneb r0, [sp, #0x23] - subne r0, r1, r0 - strneb r0, [sp, #0x21] - ldr r0, _0202B488 ; =UpdateSimpleMenu - cmp sb, #0 - str r0, [r4] - str sl, [r4, #0xfc] - beq _0202B418 - add r6, r4, #0x100 - mov r5, #9 -_0202B400: - ldmia sb!, {r0, r1, r2, r3} - stmia r6!, {r0, r1, r2, r3} - subs r5, r5, #1 - bne _0202B400 - ldmia sb, {r0, r1} - stmia r6, {r0, r1} -_0202B418: - str fp, [r4, #0x100] - str r8, [r4, #0x198] - mov r2, #0 - str r2, [r4, #0x19c] - strb r2, [r4, #0x1a0] - strb r2, [r4, #0x1a1] - str r2, [r4, #0x1a4] - str r2, [r4, #0x1ac] - str r2, [r4, #0x1b0] - add r0, sp, #0x1c - mov r1, #3 - strb r2, [sp, #0x24] - bl NewWindowScreenCheck - add r1, sp, #0xc - mov r6, r0 - bl GetWindowRectangle - ldr r0, [sp, #8] - add r3, sp, #0xc - str r0, [sp] - ldr r5, [sp, #0x50] - mov r1, sl - add r0, r4, #4 - add r2, r4, #0x100 - str r5, [sp, #4] - bl InitWindowInput - mov r0, r6 - add sp, sp, #0x2c - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0202B488: .word UpdateSimpleMenu -_0202B48C: .word SIMPLE_MENU_DEFAULT_WINDOW_PARAMS - arm_func_end CreateSimpleMenuInternal - - arm_func_start ResumeSimpleMenu -ResumeSimpleMenu: ; 0x0202B490 - stmdb sp!, {r3, lr} - bl GetWindowContents - mov r1, #1 - str r1, [r0, #0x19c] - mov r1, #0 - strb r1, [r0, #0x1a0] - strb r1, [r0, #0x1a1] - ldr r1, [r0, #0xfc] - bic r1, r1, #0x800000 - str r1, [r0, #0xfc] - add r0, r0, #4 - bl sub_02032984 - ldmia sp!, {r3, pc} - arm_func_end ResumeSimpleMenu diff --git a/asm/overlay_29_022E7EC4.s b/asm/overlay_29_022E7EC4.s deleted file mode 100644 index 0d24373a..00000000 --- a/asm/overlay_29_022E7EC4.s +++ /dev/null @@ -1,657 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_022E7EC4.inc" - - .text - - arm_func_start AllocTopScreenStatus -AllocTopScreenStatus: ; 0x022E7EC4 - stmdb sp!, {r3, lr} - mov r0, #0x230 - mov r1, #0 - bl MemAlloc - ldr r2, _022E7F40 ; =TOP_SCREEN_STATUS_PTR - mov r1, #0x230 - str r0, [r2] - bl MemZero - ldr r0, _022E7F40 ; =TOP_SCREEN_STATUS_PTR - mov r2, #0 - ldr r1, [r0] - strb r2, [r1] - ldr r1, [r0] - strb r2, [r1, #0x29] - ldr r1, [r0] - strb r2, [r1, #0x2c] - ldr r1, [r0] - strb r2, [r1, #0x2b] - ldr r1, [r0] - str r2, [r1, #4] - ldr r0, [r0] - strb r2, [r0, #0x228] - bl ov29_022E8708 - ldr r0, _022E7F40 ; =TOP_SCREEN_STATUS_PTR - mov r3, #2 - ldr r2, [r0] - mov r1, #0 - str r3, [r2, #4] - ldr r0, [r0] - strb r1, [r0, #0x229] - ldmia sp!, {r3, pc} - .align 2, 0 -_022E7F40: .word TOP_SCREEN_STATUS_PTR - arm_func_end AllocTopScreenStatus - - arm_func_start FreeTopScreenStatus -FreeTopScreenStatus: ; 0x022E7F44 - stmdb sp!, {r3, lr} - ldr r0, _022E7F78 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - cmp r0, #0 - ldmeqia sp!, {r3, pc} - bl FreeTopScreen - ldr r0, _022E7F78 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - bl MemFree - ldr r0, _022E7F78 ; =TOP_SCREEN_STATUS_PTR - mov r1, #0 - str r1, [r0] - ldmia sp!, {r3, pc} - .align 2, 0 -_022E7F78: .word TOP_SCREEN_STATUS_PTR - arm_func_end FreeTopScreenStatus - - arm_func_start ov29_022E7F7C -ov29_022E7F7C: ; 0x022E7F7C - ldr r0, _022E7F90 ; =TOP_SCREEN_STATUS_PTR - mov r1, #0 - ldr r0, [r0] - strb r1, [r0] - bx lr - .align 2, 0 -_022E7F90: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E7F7C - - arm_func_start ov29_022E7F94 -ov29_022E7F94: ; 0x022E7F94 - stmdb sp!, {r3, lr} - ldr r0, _022E8014 ; =TOP_SCREEN_STATUS_PTR - mov r3, #0 - ldr r2, [r0] - mov r1, #1 - strb r3, [r2, #0x228] - ldr r0, [r0] - strb r1, [r0] - bl ov29_02339138 - mov r0, #1 - mov r1, r0 - bl ov29_02339D7C - bl UpdateMinimap - mov r0, #0 - bl SetMinimapDataE447 - ldr r1, _022E8014 ; =TOP_SCREEN_STATUS_PTR - mov r0, #1 - ldr r1, [r1] - strb r0, [r1] - bl SetMinimapDataE448 - bl ov29_022E8104 - bl GetPlayerGender - cmp r0, #2 - ldr r0, _022E8014 ; =TOP_SCREEN_STATUS_PTR - moveq r1, #1 - ldr r0, [r0] - movne r1, #0 - and r1, r1, #0xff - add r0, r0, #0xb8 - bl ov29_022DC738 - mov r0, #1 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E8014: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E7F94 - - arm_func_start ov29_022E8018 -ov29_022E8018: ; 0x022E8018 - stmdb sp!, {r3, lr} - ldr r0, _022E8050 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - ldrb r0, [r0, #0x228] - cmp r0, #0 - beq _022E8048 - bl ov29_022DC76C - bl ov29_022DC778 - ldr r0, _022E8050 ; =TOP_SCREEN_STATUS_PTR - mov r1, #0 - ldr r0, [r0] - strb r1, [r0, #0x228] -_022E8048: - mov r0, #1 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E8050: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8018 - - arm_func_start ov29_022E8054 -ov29_022E8054: ; 0x022E8054 - stmdb sp!, {r3, lr} - ldrb r1, [r0, #0x10] - cmp r1, #0 - ldmeqia sp!, {r3, pc} - mov r1, #0 - strb r1, [r0, #0x10] - bl GetTopScreenOption - cmp r0, #3 - ldrne r0, _022E80CC ; =TOP_SCREEN_STATUS_PTR - movne r1, #0 - ldrne r0, [r0] - strneb r1, [r0] - ldmneia sp!, {r3, pc} - ldr r0, _022E80CC ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - ldrb r0, [r0] - cmp r0, #0 - ldmneia sp!, {r3, pc} - bl ov29_02339138 - mov r0, #0 - mov r1, #1 - bl ov29_0233A0E8 - mov r0, #1 - mov r1, #0 - bl ov29_02339D7C - ldr r0, _022E80CC ; =TOP_SCREEN_STATUS_PTR - mov r1, #1 - ldr r0, [r0] - strb r1, [r0] - ldmia sp!, {r3, pc} - .align 2, 0 -_022E80CC: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8054 - - arm_func_start ov29_022E80D0 -ov29_022E80D0: ; 0x022E80D0 - stmdb sp!, {r3, lr} - bl ov29_022DC77C - ldr r1, _022E8100 ; =TOP_SCREEN_STATUS_PTR - mov r0, #0 - ldr r1, [r1] - strb r0, [r1] - bl SetMinimapDataE448 - mov r0, #1 - bl ov29_0233A1BC - bl ov29_02339138 - mov r0, #1 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E8100: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E80D0 - - arm_func_start ov29_022E8104 -ov29_022E8104: ; 0x022E8104 - stmdb sp!, {r3, lr} - ldr r0, _022E812C ; =TOP_SCREEN_STATUS_PTR - mov r2, #0 - ldr r1, [r0] - strb r2, [r1, #0x228] - ldr r0, [r0] - add r0, r0, #0xb8 - bl ov10_022C1E50 - bl ov29_022E8CE8 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E812C: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8104 - - arm_func_start InitializeTeamStats -InitializeTeamStats: ; 0x022E8130 - stmdb sp!, {r3, lr} - ldr r0, _022E818C ; =TOP_SCREEN_STATUS_PTR - mov r2, #0 - ldr r1, [r0] - strb r2, [r1, #0x228] - ldr r0, [r0] - strb r2, [r0, #0x229] - bl ov29_022E8104 - ldr r0, _022E818C ; =TOP_SCREEN_STATUS_PTR - mov r1, #1 - ldr r0, [r0] - strb r1, [r0, #0x24] - bl GetPlayerGender - cmp r0, #2 - ldr r0, _022E818C ; =TOP_SCREEN_STATUS_PTR - moveq r1, #1 - ldr r0, [r0] - movne r1, #0 - and r1, r1, #0xff - add r0, r0, #0xb8 - bl ov29_022DC694 - mov r0, #1 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E818C: .word TOP_SCREEN_STATUS_PTR - arm_func_end InitializeTeamStats - - arm_func_start UpdateTeamStatsWrapper -UpdateTeamStatsWrapper: ; 0x022E8190 - stmdb sp!, {r3, lr} - ldr r0, _022E81C4 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - ldrb r0, [r0, #0x228] - cmp r0, #0 - beq _022E81BC - bl ov29_022DC6D0 - ldr r0, _022E81C4 ; =TOP_SCREEN_STATUS_PTR - mov r1, #0 - ldr r0, [r0] - strb r1, [r0, #0x228] -_022E81BC: - mov r0, #1 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E81C4: .word TOP_SCREEN_STATUS_PTR - arm_func_end UpdateTeamStatsWrapper - - arm_func_start ov29_022E81C8 -ov29_022E81C8: ; 0x022E81C8 - stmdb sp!, {r4, lr} - mov r4, r0 - bl ov29_022DC6DC - ldrb r0, [r4, #0x10] - cmp r0, #0 - movne r0, #0 - strneb r0, [r4, #0x10] - ldmia sp!, {r4, pc} - arm_func_end ov29_022E81C8 - - arm_func_start FreeTeamStatsWrapper -FreeTeamStatsWrapper: ; 0x022E81E8 - stmdb sp!, {r3, lr} - bl ov29_022DC728 - mov r0, #1 - ldmia sp!, {r3, pc} - arm_func_end FreeTeamStatsWrapper - - arm_func_start ov29_022E81F8 -ov29_022E81F8: ; 0x022E81F8 - stmdb sp!, {r3, lr} - bl IsTeamStatsOnTopScreen - cmp r0, #0 - bne _022E8210 - bl ov29_022E8104 - ldmia sp!, {r3, pc} -_022E8210: - bl GetTopScreenOption - cmp r0, #1 - bne _022E8238 - ldr r0, _022E8240 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - ldrsh r0, [r0, #8] - cmp r0, #1 - beq _022E8238 - mov r0, #1 - bl DungeonChangeTopScreenType -_022E8238: - bl ov29_022E8CE8 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E8240: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E81F8 - - arm_func_start ov29_022E8244 -ov29_022E8244: ; 0x022E8244 - stmdb sp!, {r3, lr} - bl GetTopScreenOption - cmp r0, #4 - ldreq r0, _022E826C ; =TOP_SCREEN_STATUS_PTR - ldreq r0, [r0] - ldreqsh r0, [r0, #8] - cmpeq r0, #4 - ldmneia sp!, {r3, pc} - bl ov29_022E9008 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E826C: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8244 - - arm_func_start DisplayTeamStatsSprite -DisplayTeamStatsSprite: ; 0x022E8270 -#ifdef JAPAN -#define OV29_022E8270_OFFSET -0xA4 -#else -#define OV29_022E8270_OFFSET 0 -#endif - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x1c - ldr r3, _022E83FC ; =TOP_SCREEN_STATUS_PTR - mov sl, r0 - ldr r3, [r3] - mov sb, r1 - mov fp, r2 - cmp r3, #0 - beq _022E83F4 - ldr r8, [sl, #0xb4] - bl GetIdleAnimationId - ldr r1, _022E8400 ; =DUNGEON_PTR - mov r4, r0 - ldr r1, [r1] - mov r5, #0 - add r1, r1, #0x1a000 - ldr r0, [r1, #0x22c + OV29_022E8270_OFFSET] - mov r6, r5 - cmp r0, sl - ldrsh r0, [sl, #0xa8] - mov r7, r5 - str r0, [sp, #0x18] - moveq r0, r5 - ldrneb r0, [r1, #0x245 + OV29_022E8270_OFFSET] - cmp r0, #0 - bne _022E82E4 - ldrb r0, [r8, #0xd8] - cmp r0, #2 - bne _022E82F0 -_022E82E4: - ldr r0, _022E8404 ; =0x00000229 - bl DungeonGetSpriteIndex - str r0, [sp, #0x18] -_022E82F0: - ldrb r0, [r8, #0xc4] - cmp r0, #1 - cmpne r0, #6 - beq _022E8364 - ldr r0, _022E8400 ; =DUNGEON_PTR - ldr r0, [r0] - ldrb r0, [r0, #0x78b] - cmp r0, #0 - beq _022E832C - bl ov29_0234B4E0 - cmp r0, #0 - addeq r0, r5, #2 - moveq r0, r0, lsl #0x10 - moveq r5, r0, asr #0x10 - beq _022E8354 -_022E832C: - ldrb r0, [sl, #0xaf] - cmp r0, #0 - cmpne r0, #7 - bne _022E8354 - ldr r0, [sl, #0xb4] -#ifdef JAPAN - ldr r0, [r0, #0x10c] -#else - ldr r0, [r0, #0x110] -#endif - cmp r0, #1 - addgt r0, r5, #1 - movgt r0, r0, lsl #0x10 - movgt r5, r0, asr #0x10 -_022E8354: - add r0, r5, #1 - mov r0, r0, lsl #0x10 - mov r5, r0, asr #0x10 - b _022E8368 -_022E8364: - mov r5, #0 -_022E8368: -#ifdef JAPAN - ldrb r0, [r8, #0x10a] -#else - ldrb r0, [r8, #0x10b] -#endif - cmp r0, #2 - beq _022E83A4 - ldrb r1, [r8, #0xc4] - cmp r1, #6 - ldrneb r0, [r8, #0xbf] - cmpne r0, #4 - cmpne r1, #2 - bne _022E83A4 - ldr r0, _022E8408 ; =DUNGEON_FRAMES_PASSED - ldr r0, [r0] - and r0, r0, #2 - add r0, r6, r0 - mov r0, r0, lsl #0x10 - mov r6, r0, asr #0x10 -_022E83A4: - ldrb r0, [r8, #0xef] - cmp r0, #1 - ldreq r0, _022E8400 ; =DUNGEON_PTR - ldreq r0, [r0] - addeq r0, r0, #0x1a000 - ldreqb r0, [r0, #0x244 + OV29_022E8270_OFFSET] - cmpeq r0, #0 - moveq r7, #1 - cmp r4, #0xff - beq _022E83F4 - mov r0, #1 - stmia sp, {r0, sb, fp} - str r5, [sp, #0xc] - str r6, [sp, #0x10] - str r7, [sp, #0x14] - ldrsh r1, [r8, #4] - ldr r3, [r8, #0xb0] - ldr r0, [sp, #0x18] - mov r2, r4 - bl ov29_022DC6E8 -_022E83F4: - add sp, sp, #0x1c - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_022E83FC: .word TOP_SCREEN_STATUS_PTR -_022E8400: .word DUNGEON_PTR -_022E8404: .word 0x00000229 -_022E8408: .word DUNGEON_FRAMES_PASSED - arm_func_end DisplayTeamStatsSprite - - arm_func_start ov29_022E840C -ov29_022E840C: ; 0x022E840C - stmdb sp!, {lr} - sub sp, sp, #0x14 - ldr r0, _022E8478 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - ldrb r0, [r0, #0x29] - cmp r0, #0 - movne r0, #0 - bne _022E8470 - add r0, sp, #0 - bl ov10_022C22A0 - ldr r0, _022E8478 ; =TOP_SCREEN_STATUS_PTR - add r1, sp, #0 - ldr r0, [r0] - mov r2, #0 - add r0, r0, #0x80 - mov r3, #1 - bl ov10_022C1E80 - bl sub_02048400 - cmp r0, #0 - beq _022E8460 - bl sub_02048384 -_022E8460: - ldr r1, _022E8478 ; =TOP_SCREEN_STATUS_PTR - mov r0, #1 - ldr r1, [r1] - strb r0, [r1, #0x29] -_022E8470: - add sp, sp, #0x14 - ldmia sp!, {pc} - .align 2, 0 -_022E8478: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E840C - - arm_func_start ov29_022E847C -ov29_022E847C: ; 0x022E847C - stmdb sp!, {r3, lr} - ldrb r1, [r0, #0x10] - cmp r1, #0 - ldmeqia sp!, {r3, pc} - mov r1, #0 - strb r1, [r0, #0x10] - bl sub_020483B8 - ldr r0, _022E84AC ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - add r0, r0, #0x80 - bl ov10_022C21D8 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E84AC: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E847C - - arm_func_start ov29_022E84B0 -ov29_022E84B0: ; 0x022E84B0 - stmdb sp!, {r3, lr} - ldr r0, _022E84FC ; =TOP_SCREEN_STATUS_PTR - ldr r1, [r0] - ldrb r0, [r1, #0x29] - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, pc} - add r0, r1, #0x80 - bl ov10_022C2278 - bl sub_02048400 - cmp r0, #0 - beq _022E84E4 - bl sub_020483D8 -_022E84E4: - ldr r0, _022E84FC ; =TOP_SCREEN_STATUS_PTR - mov r2, #0 - ldr r1, [r0] - mov r0, #1 - strb r2, [r1, #0x29] - ldmia sp!, {r3, pc} - .align 2, 0 -_022E84FC: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E84B0 - - arm_func_start InitDungeonControlsMenuWithBg -InitDungeonControlsMenuWithBg: ; 0x022E8500 - stmdb sp!, {lr} - sub sp, sp, #0x14 - add r0, sp, #0 - bl ov10_022C22A0 - ldr r0, _022E8548 ; =TOP_SCREEN_STATUS_PTR - add r1, sp, #0 - ldr r0, [r0] - mov r2, #0 - add r0, r0, #0x80 - mov r3, #1 - bl ov10_022C1E80 - ldr r0, _022E8548 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - add r0, r0, #0x80 - bl ov10_022C21D8 - bl InitDungeonControlsMenu - add sp, sp, #0x14 - ldmia sp!, {pc} - .align 2, 0 -_022E8548: .word TOP_SCREEN_STATUS_PTR - arm_func_end InitDungeonControlsMenuWithBg - - arm_func_start ov29_022E854C -ov29_022E854C: ; 0x022E854C - stmdb sp!, {r4, lr} - mov r4, r0 - ldrb r0, [r4, #0x10] - cmp r0, #0 - ldmeqia sp!, {r4, pc} - add r0, r4, #0x10 - bl ov29_022E8F78 - ldr r0, _022E8584 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - add r0, r0, #0x80 - bl ov10_022C21D8 - mov r0, #0 - strb r0, [r4, #0x10] - ldmia sp!, {r4, pc} - .align 2, 0 -_022E8584: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E854C - - arm_func_start FreeDungeonControlsMenuWithBg -FreeDungeonControlsMenuWithBg: ; 0x022E8588 - stmdb sp!, {r3, lr} - ldr r0, _022E85A4 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - add r0, r0, #0x80 - bl ov10_022C2278 - bl FreeDungeonControlsMenu - ldmia sp!, {r3, pc} - .align 2, 0 -_022E85A4: .word TOP_SCREEN_STATUS_PTR - arm_func_end FreeDungeonControlsMenuWithBg - - arm_func_start ov29_022E85A8 -ov29_022E85A8: ; 0x022E85A8 - stmdb sp!, {lr} - sub sp, sp, #0x14 - add r0, sp, #0 - bl ov10_022C22A0 - ldr r0, _022E85F0 ; =TOP_SCREEN_STATUS_PTR - add r1, sp, #0 - ldr r0, [r0] - mov r2, #0 - add r0, r0, #0x80 - mov r3, #1 - bl ov10_022C1E80 - ldr r0, _022E85F0 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - add r0, r0, #0x80 - bl ov10_022C21D8 - bl ov29_022E8FCC - add sp, sp, #0x14 - ldmia sp!, {pc} - .align 2, 0 -_022E85F0: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E85A8 - - arm_func_start ov29_022E85F4 -ov29_022E85F4: ; 0x022E85F4 - stmdb sp!, {r4, lr} - mov r4, r0 - ldrb r0, [r4, #0x10] - cmp r0, #0 - ldmeqia sp!, {r4, pc} - add r0, r4, #0x10 - bl ov29_022E9014 - ldr r0, _022E862C ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - add r0, r0, #0x80 - bl ov10_022C21D8 - mov r0, #0 - strb r0, [r4, #0x10] - ldmia sp!, {r4, pc} - .align 2, 0 -_022E862C: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E85F4 - - arm_func_start ov29_022E8630 -ov29_022E8630: ; 0x022E8630 - stmdb sp!, {r3, lr} - ldr r0, _022E864C ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - add r0, r0, #0x80 - bl ov10_022C2278 - bl ov29_022E8FF8 - ldmia sp!, {r3, pc} - .align 2, 0 -_022E864C: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8630 - - arm_func_start ov29_022E8650 -ov29_022E8650: ; 0x022E8650 - stmdb sp!, {lr} - sub sp, sp, #0x14 - add r0, sp, #0 - bl ov10_022C22A0 - ldr r0, _022E8698 ; =TOP_SCREEN_STATUS_PTR - add r1, sp, #0 - ldr r0, [r0] - mov r2, #0 - add r0, r0, #0x80 - mov r3, #1 - bl ov10_022C1E80 - ldr r0, _022E8698 ; =TOP_SCREEN_STATUS_PTR - ldr r0, [r0] - add r0, r0, #0x80 - bl ov10_022C21D8 - mov r0, #1 - add sp, sp, #0x14 - ldmia sp!, {pc} - .align 2, 0 -_022E8698: .word TOP_SCREEN_STATUS_PTR - arm_func_end ov29_022E8650 diff --git a/asm/overlay_29_023055B0.s b/asm/overlay_29_023055B0.s deleted file mode 100644 index 8750c7a6..00000000 --- a/asm/overlay_29_023055B0.s +++ /dev/null @@ -1,491 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_023055B0.inc" - - .text - - arm_func_start ov29_023055B0 -ov29_023055B0: ; 0x023055B0 -#ifdef JAPAN -#define OV29_023055B0_OFFSET -4 -#else -#define OV29_023055B0_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - mov r6, #0 - mov r5, #1 - ldr r4, _02305690 ; =DUNGEON_PTR - b _02305684 -_023055C4: - ldr r0, [r4] - add r0, r0, r6, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r7, [r0, #0xad4] -#else - ldr r7, [r0, #0xb78] -#endif - mov r0, r7 - bl EntityIsValid__0230558C - cmp r0, #0 - beq _02305680 - ldr r8, [r7, #0xb4] - ldrb r0, [r8, #7] - cmp r0, #0 - bne _02305680 - mov r0, r8 - bl IsTeamMemberOnFirstTurnInFixedRoom - cmp r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - add r0, r8, #0x100 - ldrsh r1, [r0, #0x7e + OV29_023055B0_OFFSET] - cmp r1, #0 - ldreqsh r0, [r0, #0x80 + OV29_023055B0_OFFSET] - cmpeq r0, #0 - beq _02305680 - ldrsh r0, [r7, #4] - cmp r1, r0 - addeq r0, r8, #0x100 - ldreqsh r1, [r0, #0x80 + OV29_023055B0_OFFSET] - ldreqsh r0, [r7, #6] - cmpeq r1, r0 - beq _02305680 - mov r0, r7 - mov r1, r5 - bl CheckVariousStatuses2__02301244 - cmp r0, #0 - bne _02305680 - add r1, r8, #0x7e + OV29_023055B0_OFFSET - add r0, r7, #4 - add r1, r1, #0x100 - bl GetDirectionTowardsPosition - mov sb, r0 - and r1, sb, #7 - mov r0, r7 - strb r1, [r8, #0x4c] - bl GetIdleAnimationId - mov r1, r0 - mov r0, r7 - mov r2, sb - bl ChangeMonsterAnimation -_02305680: - add r6, r6, #1 -_02305684: - cmp r6, #0x14 - blt _023055C4 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_02305690: .word DUNGEON_PTR - arm_func_end ov29_023055B0 - - arm_func_start CheckNonLeaderTile -CheckNonLeaderTile: ; 0x02305694 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - mov sb, r0 - ldr r8, [sb, #0xb4] - bl EntityIsValid__0230558C - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - mov r0, sb - bl GetTileAtEntity - mov r4, r0 - mov r0, sb - mov r1, #0xd - bl IqSkillIsEnabled - cmp r0, #0 - ldrneb r0, [r8, #0xef] - cmpne r0, #3 - beq _02305708 - mov r0, sb - mov r1, #0x6f - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r0, #0 - bne _023056F8 - mov r0, sb - mov r1, #0x10 - bl HasHeldItem -_023056F8: - cmp r0, #0 - bne _02305708 - add r0, sb, #4 - bl ov29_02337D68 -_02305708: - ldr r4, [r4, #0x10] - cmp r4, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - ldr r0, [r4] - cmp r0, #6 - addls pc, pc, r0, lsl #2 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_02305724: ; jump table - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} ; case 0 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} ; case 1 - b _02305740 ; case 2 - b _02305808 ; case 3 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} ; case 4 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} ; case 5 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} ; case 6 -_02305740: - mov r0, r4 - bl GetTrapInfo - ldrb r1, [r8, #6] - mov r6, #0 - mov r5, r0 - mov r7, r6 - cmp r1, #0 - bne _02305790 - mov r0, sb - mov r1, #0x13 - bl IqSkillIsEnabled - cmp r0, #0 - beq _02305790 - ldrb r0, [r4, #0x20] - cmp r0, #0 - bne _02305790 - mov r0, #1 - strb r0, [r4, #0x20] - bl UpdateTrapsVisibility - mov r7, #1 -_02305790: - ldrb r0, [r5, #1] - cmp r0, #0 - bne _023057B8 - ldrb r0, [r4, #0x20] - cmp r0, #0 - beq _023057E0 - ldrb r0, [r8, #6] - cmp r0, #0 - moveq r6, #1 - b _023057E0 -_023057B8: - cmp r0, #1 - bne _023057D0 - ldrb r0, [r8, #6] - cmp r0, #0 - movne r6, #1 - b _023057E0 -_023057D0: - cmp r0, #2 - ldreqb r0, [r8, #6] - cmpeq r0, #0 - moveq r6, #1 -_023057E0: - cmp r6, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - cmp r7, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - mov r0, sb - add r1, sb, #4 - mov r2, #0 - mov r3, #1 - bl TryTriggerTrap - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_02305808: - mov r0, sb - bl TryNonLeaderItemPickUp - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - arm_func_end CheckNonLeaderTile - - arm_func_start ov29_02305814 -ov29_02305814: ; 0x02305814 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - bl EntityIsValid__0230558C - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - ldr r0, [r5, #0xb4] - ldrb r0, [r0, #6] - cmp r0, #0 - ldmneia sp!, {r3, r4, r5, pc} - bl IsFloorOver - cmp r0, #0 - ldreq r0, _023058BC ; =DUNGEON_PTR - ldreq r0, [r0] - ldreqb r0, [r0, #0x793] - cmpeq r0, #0 - ldmneia sp!, {r3, r4, r5, pc} - mov r0, r5 - bl GetTileAtEntity - ldrh r0, [r0] - tst r0, #0x40 - ldmeqia sp!, {r3, r4, r5, pc} - bl GetLeader - ldr r1, _023058C0 ; =0x00000C82 - bl LogMessageByIdWithPopupCheckUser - ldr r1, _023058BC ; =DUNGEON_PTR - mov r0, r5 - ldr r2, [r1] - mov r3, #1 - mov r1, r4 - strb r3, [r2, #0x794] - bl TryTriggerMonsterHouse - mov r0, #0 - bl ov29_022E3A58 - add r0, r5, #4 - bl ov29_022E2CA0 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0x78 - mov r1, #0x39 - bl ov29_022EA370 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_023058BC: .word DUNGEON_PTR -#ifdef JAPAN -_023058C0: .word 0x000009C2 -#else -_023058C0: .word 0x00000C82 -#endif - arm_func_end ov29_02305814 - - arm_func_start EndNegativeStatusCondition -EndNegativeStatusCondition: ; 0x023058C4 -#ifdef JAPAN -#define END_NEGATIVE_STATUS_CONDITION_OFFSET -4 -#else -#define END_NEGATIVE_STATUS_CONDITION_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov r4, #0 - mov sb, r1 - mov sl, r0 - mov r0, sb - mov r8, r2 - mov r7, r3 - mov r5, r4 - bl EntityIsValid__02305C04 - cmp r0, #0 - moveq r0, r4 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sb - mov r1, r4 - ldr r6, [sb, #0xb4] - bl MonsterHasNegativeStatus - cmp r0, #0 - beq _02305AD8 - mov r0, sb - mov r4, #1 - bl IsMonsterDrowsy - cmp r0, #0 - beq _0230593C - mov r2, r5 - mov fp, r4 - mov r0, sl - mov r1, sb - mov r3, r2 - str fp, [sp] - bl EndSleepClassStatus -_0230593C: - mov r0, sb - bl EntityIsValid__02305C04 - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sb - bl MonsterHasNonvolatileNonsleepStatus - cmp r0, #0 - beq _0230596C - mov r0, sl - mov r1, sb - bl EndBurnClassStatus -_0230596C: - ldrb r0, [sp, #0x28] - cmp r0, #0 - mov r0, sb - beq _0230599C - bl MonsterHasImmobilizingStatus - cmp r0, #0 - beq _023059C0 - mov r0, sl - mov r1, sb - mov r2, #1 - bl EndFrozenClassStatus - b _023059C0 -_0230599C: - bl MonsterHasImmobilizingStatus - cmp r0, #0 - ldrneb r0, [r6, #0xc4] - cmpne r0, #3 - beq _023059C0 - mov r0, sl - mov r1, sb - mov r2, #1 - bl EndFrozenClassStatus -_023059C0: - mov r0, sb - bl MonsterHasAttackInterferingStatus - cmp r0, #0 - beq _023059DC - mov r0, sl - mov r1, sb - bl EndCringeClassStatus -_023059DC: - mov r0, sb - bl MonsterHasSkillInterferingStatus - cmp r0, #0 - beq _02305A00 - mov r0, sl - mov r1, sb - mov r2, #0 - mov r3, #1 - bl EndCurseClassStatus -_02305A00: - mov r0, sb - bl MonsterHasLeechSeedStatus - cmp r0, #0 - beq _02305A1C - mov r0, sl - mov r1, sb - bl EndLeechSeedClassStatus -_02305A1C: - mov r0, sb - bl MonsterHasWhifferStatus - cmp r0, #0 - beq _02305A38 - mov r0, sl - mov r1, sb - bl EndSureShotClassStatus -_02305A38: - mov r0, sb - mov r1, #0 - bl IsMonsterVisuallyImpaired - cmp r0, #0 - beq _02305A58 - mov r0, sl - mov r1, sb - bl EndBlinkerClassStatus -_02305A58: - mov r0, sb - bl IsMonsterMuzzled - cmp r0, #0 - beq _02305A74 - mov r0, sl - mov r1, sb - bl EndMuzzledStatus -_02305A74: - mov r0, sb - bl MonsterHasMiracleEyeStatus - cmp r0, #0 - beq _02305A90 - mov r0, sl - mov r1, sb - bl EndMiracleEyeStatus -_02305A90: -#ifdef JAPAN - ldrb r0, [r6, #0x105] -#else - ldrb r0, [r6, #0x106] -#endif - cmp r0, #0 - beq _02305AB4 - ldr r2, _02305BF0 ; =0x00000C83 - mov r3, #0 - mov r0, sl - mov r1, sb -#ifdef JAPAN - strb r3, [r6, #0x105] -#else - strb r3, [r6, #0x106] -#endif - bl LogMessageByIdWithPopupCheckUserTarget -_02305AB4: - ldrb r0, [r6, #0xfe] - cmp r0, #0 - beq _02305AD8 - ldr r2, _02305BF4 ; =0x00000C84 - mov r3, #0 - mov r0, sl - mov r1, sb - strb r3, [r6, #0xfe] - bl LogMessageByIdWithPopupCheckUserTarget -_02305AD8: - mov r0, sb - bl CalcSpeedStageWrapper - mov r2, #0 - mov fp, r0 - mov r1, r2 -_02305AEC: - add r0, r6, r2 - add r2, r2, #1 - strb r1, [r0, #0x119 + END_NEGATIVE_STATUS_CONDITION_OFFSET] - cmp r2, #5 - blt _02305AEC - mov r0, sb - bl CalcSpeedStageWrapper - cmp fp, r0 - beq _02305B40 - mov r0, #0 - mov r1, sb - mov r2, r0 - mov r4, #1 - bl SubstitutePlaceholderStringTags - ldr r1, [r6, #0x110 + END_NEGATIVE_STATUS_CONDITION_OFFSET] - ldr r0, _02305BF8 ; =ov29_02353318 - mov r1, r1, lsl #1 - ldrh r2, [r0, r1] - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget -_02305B40: - mov fp, #0 - mov r1, #1 - add r2, r6, #0x124 + END_NEGATIVE_STATUS_CONDITION_OFFSET - mov r0, fp - mov ip, r1 -_02305B54: - ldrb r6, [r2, fp, lsl #3] - add r3, r2, fp, lsl #3 - tst r6, #1 - movne r6, r1 - moveq r6, r0 - tst r6, #0xff - beq _02305B88 - ldrh r6, [r3, #2] - tst r6, #1 - bicne r6, r6, #1 - movne r4, ip - movne r5, ip - strneh r6, [r3, #2] -_02305B88: - add fp, fp, #1 - cmp fp, #4 - blt _02305B54 - cmp r4, #0 - beq _02305BC8 - cmp r8, #0 - beq _02305BAC - mov r0, sb - bl ov29_022E543C -_02305BAC: - cmp r5, #0 - beq _02305BE0 - ldr r2, _02305BFC ; =0x00000C85 - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget - b _02305BE0 -_02305BC8: - cmp r7, #0 - bne _02305BE0 - ldr r2, _02305C00 ; =0x00000C86 - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget -_02305BE0: - mov r0, sb - bl UpdateStatusIconFlags - mov r0, r4 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -#ifdef JAPAN -#define END_NEGATIVE_STATUS_CONDITION_DATA_OFFSET -0x2C0 -#else -#define END_NEGATIVE_STATUS_CONDITION_DATA_OFFSET 0 -#endif -_02305BF0: .word 0x00000C83 + END_NEGATIVE_STATUS_CONDITION_DATA_OFFSET -_02305BF4: .word 0x00000C84 + END_NEGATIVE_STATUS_CONDITION_DATA_OFFSET -_02305BF8: .word ov29_02353318 -_02305BFC: .word 0x00000C85 + END_NEGATIVE_STATUS_CONDITION_DATA_OFFSET -_02305C00: .word 0x00000C86 + END_NEGATIVE_STATUS_CONDITION_DATA_OFFSET - arm_func_end EndNegativeStatusCondition diff --git a/asm/overlay_29_02314810.s b/asm/overlay_29_02314810.s deleted file mode 100644 index 4f48dd33..00000000 --- a/asm/overlay_29_02314810.s +++ /dev/null @@ -1,524 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_02314810.inc" - - .text - - - arm_func_start TrySealMove -TrySealMove: ; 0x02314ABC - stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} - sub sp, sp, #0x14 - mov r5, #0 - movs r7, r1 - mov r8, r0 - mov r6, r2 - moveq r0, r5 - beq _02314C18 - mov r2, #1 - bl SafeguardIsActive - cmp r0, #0 - movne r0, r5 - bne _02314C18 - mov r0, r8 - mov r1, r7 - mov r2, #1 - bl IsProtectedFromNegativeStatus - cmp r0, #0 - movne r0, r5 - bne _02314C18 - ldr r0, [r7, #0xb4] - mov r4, r5 -#ifdef JAPAN - add ip, r0, #0x120 -#else - add ip, r0, #0x124 -#endif - mov lr, r4 - mov r2, r5 - mov r3, #1 - add r0, sp, #4 -_02314B28: - ldrb r1, [ip, lr, lsl #3] - add sb, ip, lr, lsl #3 - tst r1, #1 - movne r1, r3 - moveq r1, r2 - tst r1, #0xff - beq _02314B54 - ldrh r1, [sb, #2] - tst r1, #1 - streq sb, [r0, r4, lsl #2] - addeq r4, r4, #1 -_02314B54: - add lr, lr, #1 - cmp lr, #4 - blt _02314B28 - cmp r6, #0 - beq _02314B74 - cmp r4, #0 - moveq r0, #0 - beq _02314C18 -_02314B74: - cmp r4, #0 - beq _02314BE8 - ldr r3, _02314C20 ; =0x00000DBE - mov r5, #8 - mov r0, r8 - mov r1, r7 - mov r2, #1 - str r5, [sp] - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - movne r0, #0 - bne _02314C18 - cmp r6, #0 - movne r0, #1 - bne _02314C18 - mov r0, r4 - bl DungeonRandInt - add r1, sp, #4 - ldr r2, [r1, r0, lsl #2] - mov r0, #0 - ldrh r1, [r2, #2] - orr r1, r1, #1 - strh r1, [r2, #2] - ldrh r1, [r2, #4] - bl SetPreprocessorArgsIdVal - mov r0, r8 - mov r1, r7 - mov r5, #1 - bl TryActivateQuickFeet -_02314BE8: - cmp r5, #0 - beq _02314C04 - ldr r2, _02314C24 ; =0x00000DE3 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _02314C14 -_02314C04: - ldr r2, _02314C28 ; =0x00000DE4 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget -_02314C14: - mov r0, #1 -_02314C18: - add sp, sp, #0x14 - ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -#ifdef JAPAN -_02314C20: .word 0x00000AFE -_02314C24: .word 0x00000B23 -_02314C28: .word 0x00000B24 -#else -_02314C20: .word 0x00000DBE -_02314C24: .word 0x00000DE3 -_02314C28: .word 0x00000DE4 -#endif - arm_func_end TrySealMove - - arm_func_start BoostOrLowerSpeed -BoostOrLowerSpeed: ; 0x02314C2C - stmdb sp!, {r3, r4, r5, lr} - mov r4, r1 - mov r5, r0 - mov r0, r4 - bl EntityIsValid__023118B4 - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0x32 - bl DungeonRandOutcome__022EAB20 - cmp r0, #0 - mov r2, #1 - mov r0, r5 - beq _02314C74 - mov r1, r4 - mov r3, r2 - bl LowerSpeed - b _02314C84 -_02314C74: - mov r1, r4 - mov r3, #0 - str r2, [sp] - bl BoostSpeed -_02314C84: - mov r0, #1 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end BoostOrLowerSpeed - - arm_func_start ResetHitChanceStat -ResetHitChanceStat: ; 0x02314C8C - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r5, r1 - mov r6, r0 - mov r0, r5 - mov r8, r2 - mov r4, r3 - mov r7, #0 - bl EntityIsValid__023118B4 - cmp r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - ldr r0, [r5, #0xb4] - add r1, r0, r8, lsl #1 - ldrsh r0, [r1, #0x2c] - cmp r0, #0xa - movne r0, #0xa - movne r7, #1 - strneh r0, [r1, #0x2c] - cmp r7, #0 - beq _02314CE4 - mov r0, r5 - bl ov29_022E543C - b _02314CF4 -_02314CE4: - cmp r4, #0 - beq _02314CF4 - mov r0, r5 - bl ov29_022E543C -_02314CF4: - mov r0, #0 - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - cmp r7, #0 - beq _02314D20 - mov r0, r6 - mov r1, r5 -#ifdef JAPAN - mov r2, #0xaa0 -#else - mov r2, #0xd60 -#endif - bl LogMessageByIdWithPopupCheckUserTarget - b _02314D30 -_02314D20: - ldr r2, _02314D3C ; =0x00000D61 - mov r0, r6 - mov r1, r5 - bl LogMessageByIdWithPopupCheckUserTarget -_02314D30: - mov r0, r5 - bl UpdateStatusIconFlags - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -#ifdef JAPAN -_02314D3C: .word 0x00000AA1 -#else -_02314D3C: .word 0x00000D61 -#endif - arm_func_end ResetHitChanceStat - - arm_func_start ExclusiveItemEffectIsActiveWithLogging -ExclusiveItemEffectIsActiveWithLogging: ; 0x02314D40 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - sub sp, sp, #8 - mov r6, r1 - ldrb r1, [sp, #0x20] - mov r7, r0 - mov r0, r6 - mov r5, r2 - mov r4, r3 - bl ExclusiveItemEffectIsActive__023147EC - cmp r0, #0 - beq _02314DB8 - cmp r5, #0 - beq _02314DB0 - mov r0, #0 - mov r1, r6 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldrb r1, [sp, #0x20] - add r2, sp, #0 - mov r0, r6 - bl GetExclusiveItemWithEffectFromBag - add r1, sp, #0 - mov r0, #1 - bl PrepareItemForPrinting__02345728 - mov r0, r7 - mov r1, r6 - mov r2, r4 - bl LogMessageByIdWithPopupCheckUserTarget -_02314DB0: - mov r0, #1 - b _02314DBC -_02314DB8: - mov r0, #0 -_02314DBC: - add sp, sp, #8 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end ExclusiveItemEffectIsActiveWithLogging - - arm_func_start LogMessageWithTargetAndExclusiveItemName -LogMessageWithTargetAndExclusiveItemName: ; 0x02314DC4 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - sub sp, sp, #8 - mov r7, r0 - mov r0, #0 - mov r5, r2 - mov r2, r0 - mov r6, r1 - mov r4, r3 - bl SubstitutePlaceholderStringTags - add r2, sp, #0 - mov r0, r6 - mov r1, r4 - bl GetExclusiveItemWithEffectFromBag - add r1, sp, #0 - mov r0, #1 - bl PrepareItemForPrinting__02345728 - mov r0, r7 - mov r1, r6 - mov r2, r5 - bl LogMessageByIdWithPopupCheckUserTarget - add sp, sp, #8 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end LogMessageWithTargetAndExclusiveItemName - - arm_func_start TryActivateQuickFeet -TryActivateQuickFeet: ; 0x02314E1C - stmdb sp!, {r3, r4, r5, lr} - mov r4, r1 - mov r5, r0 - mov r0, r4 - mov r1, #0x6d - bl AbilityIsActiveVeneer - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r3, #0 - mov r0, r5 - mov r1, r4 - mov r2, #1 - str r3, [sp] - bl BoostSpeed - mov r0, #1 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end TryActivateQuickFeet - - arm_func_start TryInflictTerrifiedStatus -TryInflictTerrifiedStatus: ; 0x02314E60 - stmdb sp!, {r3, r4, r5, lr} - ldr r2, _02314EB0 ; =ov10_022C4618 - mov r4, r1 - ldr ip, [r4, #0xb4] - mov r3, #1 - mov r5, r0 - ldrsh r1, [r2] -#ifdef JAPAN - strb r3, [ip, #0x103] - mov r0, r4 - strb r1, [ip, #0x104] -#else - strb r3, [ip, #0x104] - mov r0, r4 - strb r1, [ip, #0x105] -#endif - bl ov29_022E60E4 - mov r0, #0 - mov r1, r4 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _02314EB4 ; =0x00000DE5 - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_02314EB0: .word ov10_022C4618 -#ifdef JAPAN -_02314EB4: .word 0x00000B25 -#else -_02314EB4: .word 0x00000DE5 -#endif - arm_func_end TryInflictTerrifiedStatus - - arm_func_start TryInflictGrudgeStatus -TryInflictGrudgeStatus: ; 0x02314EB8 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r7, r1 - ldr r5, [r7, #0xb4] - mov r8, r0 - mov r4, #0 - mov r6, r2 - mov r2, r4 - mov r0, #1 - bl SubstitutePlaceholderStringTags - ldrb r0, [r5, #0xfd] - cmp r0, #0 - beq _02314F04 - cmp r6, #0 - beq _02314F2C - ldr r2, _02314F34 ; =0x00000ED1 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _02314F2C -_02314F04: - mov r4, #1 - mov r0, r7 - strb r4, [r5, #0xfd] - bl UpdateStatusIconFlags - cmp r6, #0 - beq _02314F2C -#ifdef JAPAN - ldr r2, _0231640C ; =0x00000C12 - mov r0, r8 - mov r1, r7 -#else - mov r0, r8 - mov r1, r7 - mov r2, #0xed0 -#endif - bl LogMessageByIdWithPopupCheckUserTarget -_02314F2C: - mov r0, r4 - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -#ifdef JAPAN -_02314F34: .word 0x00000C13 -_0231640C: .word 0x00000C12 -#else -_02314F34: .word 0x00000ED1 -#endif - arm_func_end TryInflictGrudgeStatus - - arm_func_start TryInflictConfusedStatus -TryInflictConfusedStatus: ; 0x02314F38 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r6, r1 - mov r7, r0 - mov r0, r6 - mov r5, r2 - mov r4, r3 - bl EntityIsValid__02315118 - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - mov r0, r7 - mov r1, r6 - mov r2, r5 - bl SafeguardIsActive - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - mov r0, r7 - mov r1, r6 - mov r2, r5 - bl IsProtectedFromNegativeStatus - cmp r0, #0 - mov r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - mov r1, r6 - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r0, r6 - mov r1, #0x19 - bl ItemIsActive__0231513C - cmp r0, #0 - beq _02314FD8 - cmp r5, #0 - beq _02314FD0 - ldr r2, _02315100 ; =0x00000DAF - mov r0, r7 - mov r1, r6 - bl LogMessageByIdWithPopupCheckUserTarget -_02314FD0: - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_02314FD8: - mov ip, #2 - ldr r3, _02315104 ; =0x00000DBA - mov r0, r7 - mov r1, r6 - mov r2, r5 - str ip, [sp] - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - cmp r7, r6 - beq _02315048 - cmp r7, #0 - moveq r0, #0 - beq _02315028 - ldr r0, [r7] - cmp r0, #1 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff -_02315028: - cmp r0, #0 - beq _02315048 - mov r0, r7 - mov r1, #0x53 - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r0, #0 - bne _02315054 -_02315048: - mov r0, r6 - mov r1, #0x40 - bl AbilityIsActiveVeneer -_02315054: - cmp r0, #0 - beq _0231507C - cmp r5, #0 - beq _02315074 - ldr r2, _02315108 ; =0x00000DA7 - mov r0, r7 - mov r1, r6 - bl LogMessageByIdWithPopupCheckUserTarget -_02315074: - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_0231507C: - cmp r4, #0 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - mov r0, r6 - bl ov29_022E41CC - ldr r4, [r6, #0xb4] - ldrb r0, [r4, #0xd0] - cmp r0, #2 - beq _023150E0 - ldr r1, _0231510C ; =CONFUSED_TURN_RANGE - mov r3, #2 - mov r0, r6 - mov r2, #1 - strb r3, [r4, #0xd0] - bl CalcStatusDuration - add r3, r0, #1 - ldr r2, _02315110 ; =0x00000CFE - mov r0, r7 - mov r1, r6 - strb r3, [r4, #0xd1] - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, r7 - mov r1, r6 - bl TryActivateQuickFeet - b _023150F0 -_023150E0: - ldr r2, _02315114 ; =0x00000CFF - mov r0, r7 - mov r1, r6 - bl LogMessageByIdWithPopupCheckUserTarget -_023150F0: - mov r0, r6 - bl UpdateStatusIconFlags - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -#ifdef JAPAN -#define TRY_INFLICT_CONFUSED_STATUS_OFFSET -0x2C0 -#else -#define TRY_INFLICT_CONFUSED_STATUS_OFFSET 0 -#endif -_02315100: .word 0x00000DAF + TRY_INFLICT_CONFUSED_STATUS_OFFSET -_02315104: .word 0x00000DBA + TRY_INFLICT_CONFUSED_STATUS_OFFSET -_02315108: .word 0x00000DA7 + TRY_INFLICT_CONFUSED_STATUS_OFFSET -_0231510C: .word CONFUSED_TURN_RANGE -_02315110: .word 0x00000CFE + TRY_INFLICT_CONFUSED_STATUS_OFFSET -_02315114: .word 0x00000CFF + TRY_INFLICT_CONFUSED_STATUS_OFFSET - arm_func_end TryInflictConfusedStatus diff --git a/include/main_0202AAA8.h b/include/main_0202AAA8.h index 32805a1e..4494ae45 100644 --- a/include/main_0202AAA8.h +++ b/include/main_0202AAA8.h @@ -5,7 +5,8 @@ #include "main_02028080.h" struct unk_0202AAA8 { - u8 field_0x0[8]; + u32 field_0x0; + u8 field_0x4[4]; u8 field_0x8; u8 field_0x9[0x17]; u16 field_0x20; @@ -13,16 +14,19 @@ struct unk_0202AAA8 { s32 field_0xA0; u8 field_0xA4[0x54]; u32 field_0xF8; - u8 field_0xFC[8]; + u32 field_0xFC; + s32 field_0x100; u32 field_0x104; - u8 field_0x108[0x90]; + u8 field_0x108[0x58]; + u8 *field_0x160; + u8 field_0x164[0x34]; void *field_0x198; s32 field_0x19C; u8 field_0x1A0; u8 field_0x1A1; u8 field_0x1A2[2]; s32 field_0x1A4; - u8 field_0x1A8[4]; + s32 field_0x1A8; s32 field_0x1AC; s32 field_0x1B0; u8 field_0x1B4[8]; diff --git a/include/main_0202AB40.h b/include/main_0202AB40.h index 2e56864c..b7eed59c 100644 --- a/include/main_0202AB40.h +++ b/include/main_0202AB40.h @@ -2,9 +2,15 @@ #define PMDSKY_MAIN_0202AB40_H #include "util.h" +#include "window.h" u32 IsParentMenuActive(s32 window_id); bool8 CheckParentMenuField0x1A0(s32 window_id); s32 GetWindowIdSelectedItemOnPage(s32 window_id); +void sub_0202AB94(s32 window_id, s32 a); +s32 GetSimpleMenuResult__0202AEA4(s32 window_id); +void UpdateParentMenu(struct Window *w); +void sub_0202AF78(struct Window *w); +void sub_0202B030(s32 window_id); #endif diff --git a/include/main_0202B4C4.h b/include/main_0202B4C4.h index 52894a38..43a2135b 100644 --- a/include/main_0202B4C4.h +++ b/include/main_0202B4C4.h @@ -2,7 +2,14 @@ #define PMDSKY_MAIN_0202B4C4_H #include "util.h" +#include "window.h" +#include "main_0202A66C.h" +void sub_0202B0A4(s32 window_id, s32 a); +s32 CreateSimpleMenuFromStringIds(WindowTemplate *params, u32 flags, struct struct_2 *cfg, struct unk_0202A5CC *items, s32 n); +s32 CreateSimpleMenu(WindowTemplate *params, u32 flags, struct struct_2 *cfg, struct unk_0202A75C *items, s32 n); +s32 CreateSimpleMenuInternal(WindowTemplate *params, u32 flags, struct struct_2 *cfg, struct unk_0202A75C *items, s32 n); +void ResumeSimpleMenu(s32 window_id); void CloseSimpleMenu(s32 window_id); u32 IsSimpleMenuActive(s32 window_id); bool8 CheckSimpleMenuField0x1A0(s32 window_id); diff --git a/include/move_orb_effects.h b/include/move_orb_effects.h index bddfa993..b99fcde1 100644 --- a/include/move_orb_effects.h +++ b/include/move_orb_effects.h @@ -39,5 +39,13 @@ bool8 ExclusiveItemEffectIsActive__023147EC(struct entity *entity, enum exclusiv void BoostSpeed(struct entity *user, struct entity *target, s32 n_stages, s32 turns, bool8 log_failure); void BoostSpeedOneStage(struct entity *user, struct entity *target, s32 turns, bool8 log_failure); void LowerSpeed(struct entity *user, struct entity *target, s32 n_stages, bool8 log_failure); +bool8 TrySealMove(struct entity *user, struct entity *target, bool8 check_only); +bool8 BoostOrLowerSpeed(struct entity *user, struct entity *target); +void ResetHitChanceStat(struct entity *user, struct entity *target, s32 stat_idx, s32 play_effect_anyway); +bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity *user, struct entity *target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id); +void LogMessageWithTargetAndExclusiveItemName(struct entity *user, struct entity *target, s32 message_id, enum exclusive_item_effect_id effect_id); +bool8 TryActivateQuickFeet(struct entity *user, struct entity *target); +void TryInflictTerrifiedStatus(struct entity *user, struct entity *target); +bool8 TryInflictGrudgeStatus(struct entity *user, struct entity *target, bool8 log_message); #endif //PMDSKY_MOVE_ORB_EFFECTS_H diff --git a/include/overlay_29_022E869C.h b/include/overlay_29_022E869C.h index 412b49dc..1746c28b 100644 --- a/include/overlay_29_022E869C.h +++ b/include/overlay_29_022E869C.h @@ -1,10 +1,60 @@ #ifndef PMDSKY_OVERLAY_29_022E869C_H #define PMDSKY_OVERLAY_29_022E869C_H +#include "dungeon.h" #include "dungeon_mode.h" #include "item.h" #include "move.h" +struct unk_02353554 { + u8 field_0x0; + u8 field_0x1[3]; + s32 field_0x4; + s16 field_0x8; + u8 field_0xa[0x1a]; + u8 field_0x24; + u8 field_0x25[4]; + u8 field_0x29; + u8 field_0x2a; + u8 field_0x2b; + u8 field_0x2c; + u8 field_0x2d[0x53]; + u8 field_0x80[0x38]; + u8 field_0xb8[0x170]; + u8 field_0x228; + u8 field_0x229; + u8 field_0x22a[6]; +}; + +struct unk_022E8054 { + u8 field_0x0[0x10]; + u8 field_0x10; +}; + +void FreeTopScreenStatus(void); +void ov29_022E7F7C(void); +bool8 ov29_022E7F94(void); +bool8 ov29_022E8018(void); +void ov29_022E8054(struct unk_022E8054 *a); +bool8 ov29_022E80D0(void); +void ov29_022E8104(void); +bool8 InitializeTeamStats(void); +bool8 UpdateTeamStatsWrapper(void); +void ov29_022E81C8(struct unk_022E8054 *a); +bool8 FreeTeamStatsWrapper(void); +void ov29_022E81F8(void); +void ov29_022E8244(void); +void DisplayTeamStatsSprite(struct entity *entity, s16 a, s16 b); +bool8 ov29_022E840C(void); +void ov29_022E847C(struct unk_022E8054 *a); +bool8 ov29_022E84B0(void); +bool8 InitDungeonControlsMenuWithBg(void); +void ov29_022E854C(struct unk_022E8054 *a); +bool8 FreeDungeonControlsMenuWithBg(void); +bool8 ov29_022E85A8(void); +void ov29_022E85F4(struct unk_022E8054 *a); +bool8 ov29_022E8630(void); +bool8 ov29_022E8650(void); bool8 ov29_022E869C(void); #endif diff --git a/include/overlay_29_0230558C.h b/include/overlay_29_0230558C.h index ded7f1c6..db548c7c 100644 --- a/include/overlay_29_0230558C.h +++ b/include/overlay_29_0230558C.h @@ -5,5 +5,9 @@ // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__0230558C(struct entity *entity); +void ov29_023055B0(s32 a); +void CheckNonLeaderTile(struct entity *entity); +void ov29_02305814(struct entity *entity, bool8 a); +s32 EndNegativeStatusCondition(struct entity *user, struct entity *target, bool8 a, bool8 b, bool8 c); #endif //PMDSKY_OVERLAY_29_0230558C_H diff --git a/include/overlay_29_02315118.h b/include/overlay_29_02315118.h index 76ae5c43..1e482190 100644 --- a/include/overlay_29_02315118.h +++ b/include/overlay_29_02315118.h @@ -3,6 +3,7 @@ #include "dungeon_mode.h" +bool8 TryInflictConfusedStatus(struct entity *user, struct entity *target, bool8 log_failure, bool8 check_only); // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__02315118(struct entity *entity); // Checks if a monster is holding a certain item that isn't disabled by Klutz. diff --git a/include/overlay_31_02382820.h b/include/overlay_31_02382820.h index 1f66a7c3..f403cf85 100644 --- a/include/overlay_31_02382820.h +++ b/include/overlay_31_02382820.h @@ -34,13 +34,6 @@ void EntryOverlay31(void); void DrawDungeonMenuStatusWindow(s32 window_id); void DungeonMenuSwitch(s32 window_id); -struct struct_2 { - u32 b; // 0x0 - u8 PAD1[92]; - u8* c; // 0x60 - u8 PAD2[50]; -}; - struct struct_3 { s8 e[4]; // 0x0 u32 f; // 0x4 diff --git a/include/spawn_2.h b/include/spawn_2.h index 8868b47e..0f45a0c8 100644 --- a/include/spawn_2.h +++ b/include/spawn_2.h @@ -6,5 +6,6 @@ s32 GetMonsterIdToSpawn(s32 weight_type_idx); s32 GetMonsterLevelToSpawn(s32 monster_id); s32 IsOnMonsterSpawnList(s32 monster_id); +void AllocTopScreenStatus(void); #endif //PMDSKY_SPAWN_2_H diff --git a/include/window.h b/include/window.h index 61d470b5..b395a788 100644 --- a/include/window.h +++ b/include/window.h @@ -4,6 +4,13 @@ #include "enums.h" #include "util.h" +struct struct_2 { + u32 b; // 0x0 + u8 PAD1[92]; + u8* c; // 0x60 + u8 PAD2[50]; +}; + // Represents the state of a portrait to be displayed inside a window typedef struct { enum monster_id monster_id; // 0x0: The species id, or the set index inside kaomado.kao diff --git a/main.lsf b/main.lsf index 09aad59a..b80dfe2c 100644 --- a/main.lsf +++ b/main.lsf @@ -164,7 +164,6 @@ Static main Object asm/main_0202A690.o Object src/main_0202AAA8.o Object src/main_0202AB40.o - Object asm/main_0202AB94.o Object src/main_0202B4C4.o Object src/main_0202B558.o Object asm/main_0202B5C8.o @@ -824,7 +823,6 @@ Overlay OVY_29 Object src/random_trap.o Object src/spawn_1.o Object src/spawn_2.o - Object asm/overlay_29_022E7EC4.o Object src/overlay_29_022E869C.o Object asm/overlay_29_022E86A4.o Object src/position_util.o @@ -957,7 +955,6 @@ Overlay OVY_29 Object src/overlay_29_023047B8.o Object asm/overlay_29_023047DC.o Object src/overlay_29_0230558C.o - Object asm/overlay_29_023055B0.o Object src/overlay_29_02305C04.o Object asm/overlay_29_02305C3C.o Object src/overlay_29_023061A8.o @@ -996,7 +993,6 @@ Overlay OVY_29 Object src/overlay_29_02311BF8.o Object asm/overlay_29_02311C28.o Object src/move_orb_effects.o - Object asm/overlay_29_02314810.o Object src/overlay_29_02315118.o Object asm/overlay_29_0231516C.o Object src/dungeon_statuses.o diff --git a/src/main_0202AB40.c b/src/main_0202AB40.c index 68d766fa..e60ae2e6 100644 --- a/src/main_0202AB40.c +++ b/src/main_0202AB40.c @@ -1,6 +1,28 @@ #include "main_0202AB40.h" +#include "main_0202A66C.h" #include "main_0202AAA8.h" +#include "main_02027AF0.h" +#include "main_020282F4.h" +#include "main_0203258C.h" +#include "main_020327CC.h" #include "main_02032558.h" +#include "window.h" + +extern void sub_02032684(struct unk_02032558 *p, s32 a); +extern void sub_02031C74(struct unk_02032558 *p, u32 mask); +extern void sub_02031C84(struct unk_02032558 *p, u32 mask); +extern s32 sub_02031C98(struct unk_02032558 *p, u32 *buttons, s32 *state, s32 a); +extern s32 sub_02032160(struct unk_02032558 *p, s32 *state, s32 a, s32 b, s32 c, s32 d); +extern s32 sub_02033758(struct unk_02032558 *p, u32 *buttons, s32 *state); +extern s32 sub_020323F8(struct unk_02032558 *p, u32 buttons, s32 idx, s32 a); +extern bool8 IsMenuOptionActive(struct unk_02032558 *p); +extern s32 sub_02032070(struct unk_02032558 *p); +extern s32 sub_0203250C(struct unk_02032558 *p, u32 buttons); +extern void PlayWindowInputSound(struct unk_02032558 *p, s32 sound); +extern void sub_02028948(s32 window_id, struct unk_02032558 *p); +extern void sub_020263C8(s32 window_id, s32 a, s32 y, u8 *str, u8 colour); +extern s32 sub_020265A8(u8 *str); +extern void sub_0202A03C(struct unk_02032558 *p, s32 window_id); u32 IsParentMenuActive(s32 window_id) { @@ -21,3 +43,215 @@ s32 GetWindowIdSelectedItemOnPage(s32 window_id) { return GetSelectedItemOnPage(GetWindowContents(window_id) + 4); } + +void sub_0202AB94(s32 window_id, s32 a) +{ + sub_02032684(GetWindowContents(window_id) + 4, a); +} + +s32 GetSimpleMenuResult__0202AEA4(s32 window_id) +{ + struct unk_0202AAA8 *menu = GetWindowContents(window_id); + struct unk_0202A75C *items = menu->field_0x198; + s32 idx; + + if (menu->field_0x1A0 != 0) { + if (menu->field_0x1A1 != 0) { + idx = GetTotalNumMenuItems((void *)menu + 4); + } else { + idx = GetSelectedMenuItemIdx((void *)menu + 4); + } + return items[idx].field_0x100; + } + return 0; +} + +void UpdateParentMenu(struct Window *w) +{ + struct unk_0202AAA8 *menu; + u32 buttons; + s32 state[9]; + s32 changed; + s32 r; + + menu = (struct unk_0202AAA8 *)w->template.unk0C; + switch (menu->field_0x19C) { + case 0: + if (!sub_0202810C(w->id)) { + break; + } + menu->field_0x1AC = menu->field_0x1A8; + menu->field_0x19C = 2; + case 1: + if (menu->field_0x19C == 1) { + menu->field_0x1AC = menu->field_0x1A8; + menu->field_0x19C = 2; + break; + } + case 2: + if (menu->field_0x1A8 > 0) { + if (menu->field_0x1AC > 0) { + menu->field_0x1AC--; + } + if (menu->field_0x1AC > 0) { + sub_02031C74((void *)menu + 4, 0x4000000); + menu->field_0x1A0 = 0; + menu->field_0x1A1 = 0; + menu->field_0x1A4 = 0; + w->unkB8 = -1; + sub_0202AF78(w); + break; + } + sub_02031C84((void *)menu + 4, 0x4000000); + } + menu->field_0x19C = 3; + case 3: + sub_0202AF78(w); + if (menu->field_0xFC & 0x800000) { + menu->field_0x19C = 9; + menu->field_0x1A0 = 1; + menu->field_0x1A1 = 0; + menu->field_0x1A4 = 0; + w->unkB8 = -4; + break; + } + menu->field_0x19C = 4; + menu->field_0x1A0 = 0; + menu->field_0x1A1 = 0; + menu->field_0x1A4 = 0; + w->unkB8 = -1; + break; + case 4: + changed = sub_02031C98((void *)menu + 4, &buttons, state, 1); + if (buttons == 0 && (menu->field_0xFC & 1)) { + r = sub_02032160((void *)menu + 4, state, 0x408, 0, 0, 1); + if (r >= 0) { + sub_02032684((void *)menu + 4, r); + changed = 1; + buttons |= 1; + } + } + if (buttons == 0) { + changed |= sub_02033758((void *)menu + 4, &buttons, state); + } + if ((changed | sub_020323F8((void *)menu + 4, buttons, + GetSelectedMenuItemIdx((void *)menu + 4), + 0)) != 0) { + sub_0202AF78(w); + } + if (buttons & 1) { + if (IsMenuOptionActive((void *)menu + 4)) { + if (!(menu->field_0xFC & 0x80000000)) { + PlayWindowInputSound((void *)menu + 4, 0); + } + menu->field_0x1A0 = 1; + menu->field_0x1A1 = 0; + menu->field_0x1A4 = buttons; + w->unkB8 = -4; + menu->field_0x19C = 5; + } else { + PlayWindowInputSound((void *)menu + 4, 2); + } + } else if (buttons & 2) { + PlayWindowInputSound((void *)menu + 4, 1); + menu->field_0x1A0 = 1; + menu->field_0x1A1 = 1; + menu->field_0x1A4 = buttons; + w->unkB8 = -5; + menu->field_0x19C = 5; + } else if (sub_0203250C((void *)menu + 4, buttons)) { + menu->field_0x1A0 = 1; + menu->field_0x1A1 = 0; + menu->field_0x1A4 = buttons; + w->unkB8 = -4; + menu->field_0x19C = 5; + } + sub_02028948(w->id, (void *)menu + 4); + break; + case 5: + if (sub_02032070((void *)menu + 4)) { + break; + } + case 6: + if (menu->field_0x1A1 == 0) { + if (menu->field_0xFC & 0x400000) { + sub_0202AF78(w); + menu->field_0x19C = 9; + break; + } + } else if (*(u8 *)&menu->field_0x1B0 != 0) { + menu->field_0x19C = 9; + break; + } + menu->field_0x19C = 7; + case 7: + if (!sub_0202812C(w->id)) { + break; + } + if (menu->field_0x1A1 != 0) { + w->unkB8 = -5; + } else { + w->unkB8 = -4; + } + menu->field_0x19C = 8; + break; + } +} + +void sub_0202AF78(struct Window *w) +{ + struct unk_0202AAA8 *menu; + struct unk_0202A75C *item; + s32 i; + u8 *p; + s32 highlight; + s32 colour; + + menu = (struct unk_0202AAA8 *)w->template.unk0C; + item = menu->field_0x198; + if (menu->field_0xFC & 0x200) { + p = menu->field_0x160; + } else { + p = NULL; + } + i = 0; + sub_02027B1C(w->id); + while (!IsEmptyString(item->field_0x0)) { + highlight = 0; + if (p != NULL) { + if (*p & 2) { + highlight = 1; + } + p++; + } + if (highlight) { + colour = 0x42; + } else { + colour = 0x44; + } + sub_020263C8(w->id, 13, GetPageItemYOffset((void *)menu + 4, i), + item->field_0x0, colour); + i++; + item++; + } + sub_0202A03C((void *)menu + 4, w->id); + UpdateWindow(w->id); +} + +void sub_0202B030(s32 window_id) +{ + struct unk_0202AAA8 *menu = GetWindowContents(window_id); + + if (IsMenuOptionActive((void *)menu + 4)) { + if (!(menu->field_0xFC & 0x80000000)) { + PlayWindowInputSound((void *)menu + 4, 0); + } + menu->field_0x1A0 = 1; + menu->field_0x1A1 = 0; + menu->field_0x1A4 = 1; + sub_0202830C(window_id, -4); + menu->field_0x19C = 6; + } else { + PlayWindowInputSound((void *)menu + 4, 2); + } +} diff --git a/src/main_0202B4C4.c b/src/main_0202B4C4.c index dd953713..c872fe56 100644 --- a/src/main_0202B4C4.c +++ b/src/main_0202B4C4.c @@ -1,13 +1,197 @@ #include "main_0202B4C4.h" -#include "main_02032558.h" - -extern s32 GetCurrentPage(struct unk_02032558 *p); - -extern void *GetWindowContents(s32 window_id); - -extern s32 GetSelectedItemOnPage(struct unk_02032558 *p); +#include "main_0202A66C.h" #include "main_0202AAA8.h" #include "main_02001188.h" +#include "main_02027648.h" +#include "main_02028284.h" +#include "main_020282F4.h" +#include "main_02032558.h" +#include "window.h" + +extern s32 GetCurrentPage(struct unk_02032558 *p); +extern void *GetWindowContents(s32 window_id); +extern s32 GetSelectedItemOnPage(struct unk_02032558 *p); + +extern WindowTemplate SIMPLE_MENU_DEFAULT_WINDOW_PARAMS; + +extern void UpdateSimpleMenu(struct Window *w); +extern void sub_02031C74(struct unk_02032558 *p, u32 mask); +extern void sub_02031C84(struct unk_02032558 *p, u32 mask); +extern bool8 IsMenuOptionActive(struct unk_02032558 *p); +extern void PlayWindowInputSound(struct unk_02032558 *p, s32 sound); +extern void sub_02032984(struct unk_02032558 *p); +extern s32 sub_020265A8(u8 *str); +extern u8 sub_02031A5C(u32 flags, struct struct_2 *cfg, s32 width); +extern u8 CalcMenuHeightDiv8__02031AA4(u32 flags, struct struct_2 *cfg, s32 *count, s32 *n); +extern void InitWindowInput(struct unk_02032558 *p, u32 flags, struct struct_2 *cfg, + struct unk_02028284 *rect, s32 count, s32 n); +extern s32 PreprocessStringFromId(u8 *output, s32 output_size, s32 string_id, + s32 flags, void *args); + +void sub_0202B0A4(s32 window_id, s32 a) +{ + struct unk_0202AAA8 *menu = GetWindowContents(window_id); + + if (a != 0) { + sub_02031C74((void *)menu + 4, 0xB000000); + sub_02031C84((void *)menu + 4, 0x10); + } else { + sub_02031C84((void *)menu + 4, 0xB000000); + sub_02031C74((void *)menu + 4, 0x10); + } +} + +s32 CreateSimpleMenuFromStringIds(WindowTemplate *params, u32 flags, + struct struct_2 *cfg, + struct unk_0202A5CC *items, s32 n) +{ + struct unk_0202A5CC *p; + struct unk_0202A75C *buf; + struct unk_0202A75C *q; + s32 count; + + p = items; + count = 0; + while (p->field_0x0 != 0) { + p++; + count++; + } + + buf = MemAlloc((count + 1) * sizeof(struct unk_0202A75C), 8); + q = buf; + while (items->field_0x0 != 0) { + PreprocessStringFromId(q->field_0x0, 0x100, items->field_0x0, 0xC402, + NULL); + q->field_0x100 = items->field_0x4; + items++; + q++; + } + q->field_0x0[0] = 0; + q->field_0x100 = items->field_0x4; + return CreateSimpleMenuInternal(params, flags, cfg, buf, n); +} + +s32 CreateSimpleMenu(WindowTemplate *params, u32 flags, struct struct_2 *cfg, + struct unk_0202A75C *items, s32 n) +{ + struct unk_0202A75C *p; + struct unk_0202A75C *buf; + struct unk_0202A75C *q; + s32 count; + + p = items; + count = 0; + while (!IsEmptyString(p->field_0x0)) { + p++; + count++; + } + + buf = MemAlloc((count + 1) * sizeof(struct unk_0202A75C), 8); + q = buf; + while (!IsEmptyString(items->field_0x0)) { + *q++ = *items++; + } + *q = *items; + return CreateSimpleMenuInternal(params, flags, cfg, buf, n); +} + +s32 CreateSimpleMenuInternal(WindowTemplate *params, u32 flags, + struct struct_2 *cfg, struct unk_0202A75C *items, + s32 n) +{ + WindowTemplate tmpl; + struct unk_02028284 rect; + s32 count; + struct unk_0202AAA8 *menu; + struct unk_0202A75C *p; + s32 target; + s32 sel; + s32 width; + s32 item_width; + s32 window_id; + + menu = MemAlloc(0x1B4, 8); + if (flags & 0x20) { + target = cfg->b; + } else { + target = 0; + } + sel = 0; + count = 0; + p = items; + flags |= 0x8000; + if (params == NULL) { + tmpl = SIMPLE_MENU_DEFAULT_WINDOW_PARAMS; + flags |= 0x300000; + } else { + tmpl = *params; + tmpl.unk00 = (u32)UpdateSimpleMenu; + } + tmpl.unk0C = (u32)menu; + if (tmpl.width == 0) { + width = 0; + while (!IsEmptyString(p->field_0x0)) { + item_width = sub_020265A8(p->field_0x0); + if (item_width > width) { + width = item_width; + } + p++; + } + tmpl.width = sub_02031A5C(flags, cfg, width + 0x10); + } + p = items; + while (!IsEmptyString(p->field_0x0)) { + if (p->field_0x100 == target) { + sel = count; + } + p++; + count++; + } + if (n <= 0) { + n = count; + } + if (tmpl.height == 0) { + tmpl.height = CalcMenuHeightDiv8__02031AA4(flags, cfg, &count, &n); + } else { + CalcMenuHeightDiv8__02031AA4(flags, cfg, &count, &n); + } + if (flags & 0x200000) { + tmpl.x -= tmpl.width; + } + if (flags & 0x100000) { + tmpl.y -= tmpl.height; + } + menu->field_0x0 = (u32)UpdateSimpleMenu; + menu->field_0xFC = flags; + if (cfg != NULL) { + *(struct struct_2 *)&menu->field_0x100 = *cfg; + } + menu->field_0x100 = sel; + menu->field_0x198 = items; + menu->field_0x19C = 0; + menu->field_0x1A0 = 0; + menu->field_0x1A1 = 0; + menu->field_0x1A4 = 0; + menu->field_0x1AC = 0; + menu->field_0x1B0 = 0; + tmpl.bg_id = 0; + window_id = NewWindowScreenCheck((s32)&tmpl, 3); + GetWindowRectangle(window_id, &rect); + InitWindowInput((void *)menu + 4, flags, + (struct struct_2 *)&menu->field_0x100, &rect, count, n); + return window_id; +} + +void ResumeSimpleMenu(s32 window_id) +{ + struct unk_0202AAA8 *menu = GetWindowContents(window_id); + + menu->field_0x19C = 1; + menu->field_0x1A0 = 0; + menu->field_0x1A1 = 0; + menu->field_0xFC &= ~0x800000; + sub_02032984((void *)menu + 4); +} void CloseSimpleMenu(s32 window_id) { diff --git a/src/main_0203D538.c b/src/main_0203D538.c index be3608eb..c54c75d9 100644 --- a/src/main_0203D538.c +++ b/src/main_0203D538.c @@ -69,10 +69,8 @@ struct unk_020AFE74 { extern struct unk_020AFE74 *MISSION_REWARD_STRUCT_MAIN_PTR; extern void MaybeGetColoredFormattedItemName(void*, struct item*, void*); -extern s8 CreateSimpleMenuFromStringIds(void*, s32, s32, void*, s32); extern void GetNameWithGender(char *dst, s16 monster_id, char color_id); extern void GetNameRaw(unsigned char *, s32); -extern s32 GetSimpleMenuResult__0202AEA4(s8); extern void InitPreprocessorArgs(struct preprocessor_args* args); extern bool8 IsMonsterIllegalForMissions(enum monster_id); extern void sub_02046BE8(s32 a, s32 b, struct preprocessor_args *c); @@ -108,8 +106,8 @@ extern void ov11_02310BDC(void); extern const u8 _0209C844[2]; extern const u16 _0209C846[4]; extern s32 _0209C850; -extern s32 _0209C85C; -extern s32 _0209C86C; +extern WindowTemplate _0209C85C; +extern struct unk_0202A5CC _0209C86C[]; extern s32 _0209C884; #ifdef JAPAN @@ -336,7 +334,7 @@ s32 sub_0203D538(void) break; case 16: if (sub_02046C78() != 0) { - MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a0 = CreateSimpleMenuFromStringIds(&_0209C85C, 0x300011, 0, &_0209C86C, 2); + MISSION_REWARD_STRUCT_MAIN_PTR->field_0x1a0 = CreateSimpleMenuFromStringIds(&_0209C85C, 0x300011, 0, _0209C86C, 2); MISSION_REWARD_STRUCT_MAIN_PTR->field_0x0 = 0x11; } break; diff --git a/src/move_orb_effects.c b/src/move_orb_effects.c index 13c5ff4c..310ed1ab 100644 --- a/src/move_orb_effects.c +++ b/src/move_orb_effects.c @@ -14,6 +14,7 @@ #include "overlay_29_022E3F20.h" #include "overlay_29_0234B340.h" #include "dungeon_logic_2.h" +#include "dg_random.h" extern u8* AllocateTemp1024ByteBufferFromPool(void); extern void CopyStringFromId(u8* buf, u32 string_id); @@ -37,23 +38,30 @@ extern void PlaySpeedDownEffect(struct entity *entity); extern fx32_8 MultiplyByFixedPoint(fx32_8 x, fx32_8 mult_fp); extern bool8 SafeguardIsActive(struct entity *user ,struct entity *target, bool8 log_message); extern void TryActivateSteadfast(struct entity *attacker, struct entity *defender); -extern void TryActivateQuickFeet(struct entity *attacker ,struct entity *defender); extern s32 CalcStatusDuration(struct entity *entity, const s16 *turn_range, bool8 iq_skill_effects); extern struct preprocessor_args* GetMessageLogPreprocessorArgs(void); extern void SetPreprocessorArgsStringToName(struct preprocessor_args* preprocessor_args, s32 pos, struct monster* monster, u32 param_4, u8 name_type); extern int CalcSpeedStageWrapper(struct entity* entity); extern int CalcSpeedStage(struct entity *entity, s32 counter_weight); +extern void SetPreprocessorArgsIdVal(s32 pos, u32 val); +extern void ov29_022E543C(struct entity *entity); +extern void ov29_022E60E4(struct entity *entity); extern const s16 CRINGE_TURN_RANGE[]; extern const s16 PARALYSIS_TURN_RANGE[]; extern const s16 SPEED_LOWER_TURN_RANGE[]; extern const s16 SPEED_BOOST_TURN_RANGE[]; extern const u16 ov29_02353318[]; +extern const s16 ov10_022C4618; #ifdef JAPAN #define JPN_MSG_OFFSET -0x2C0 +#define MESSAGE_ED0 0xC12 +#define MESSAGE_ED1 0xC13 #else #define JPN_MSG_OFFSET 0 +#define MESSAGE_ED0 0xED0 +#define MESSAGE_ED1 0xED1 #endif // JAPAN void LowerOffensiveStat(struct entity *user, struct entity *target, struct StatIndex stat, s32 n_stages, bool8 check_is_protected_from_stat_drops, bool8 log_message_if_protected_from_stat_drops) @@ -793,4 +801,169 @@ void LowerSpeed(struct entity *user, struct entity *target, s32 n_stages, bool8 UpdateStatusIconFlags(target); } +bool8 TrySealMove(struct entity *user, struct entity *target, bool8 check_only) +{ + struct monster *entityInfo; + struct move *sealableMoves[MAX_MON_MOVES]; + s32 nSealable; + s32 i; + bool8 sealed = FALSE; + + if (target == NULL) + return FALSE; + + if (SafeguardIsActive(user, target, TRUE)) + return FALSE; + + if (IsProtectedFromNegativeStatus(user, target, TRUE)) + return FALSE; + + entityInfo = GetEntInfo(target); + nSealable = 0; + for (i = 0; i < MAX_MON_MOVES; i++) { + struct move *move = &entityInfo->moves.moves[i]; + if (MoveExists(move)) { + if (!(move->flags2 & MOVE_FLAG_SEALED)) { + sealableMoves[nSealable] = move; + nSealable++; + } + } + } + + if (check_only && nSealable == 0) + return FALSE; + + if (nSealable != 0) { + struct move *move; + + if (ExclusiveItemEffectIsActiveWithLogging(user, target, TRUE, 0xdbe + JPN_MSG_OFFSET, EXCLUSIVE_EFF_NO_MOVE_DISABLING)) + return FALSE; + + if (check_only) + return TRUE; + + move = sealableMoves[DungeonRandInt(nSealable)]; + move->flags2 |= MOVE_FLAG_SEALED; + SetPreprocessorArgsIdVal(0, move->id); + sealed = TRUE; + TryActivateQuickFeet(user, target); + } + + if (sealed) + LogMessageByIdWithPopupCheckUserTarget(user, target, 0xde3 + JPN_MSG_OFFSET); + else + LogMessageByIdWithPopupCheckUserTarget(user, target, 0xde4 + JPN_MSG_OFFSET); + + return TRUE; +} + +bool8 BoostOrLowerSpeed(struct entity *user, struct entity *target) +{ + if (!EntityIsValid__023118B4(target)) + return FALSE; + + if (DungeonRandOutcome__022EAB20(50)) + LowerSpeed(user, target, 1, TRUE); + else + BoostSpeed(user, target, 1, 0, TRUE); + + return TRUE; +} + +void ResetHitChanceStat(struct entity *user, struct entity *target, s32 stat_idx, s32 play_effect_anyway) +{ + struct monster *entityInfo; + bool8 changed = FALSE; + + if (!EntityIsValid__023118B4(target)) + return; + + entityInfo = GetEntInfo(target); + if (entityInfo->stat_modifiers.hit_chance_stages[stat_idx] != 10) { + entityInfo->stat_modifiers.hit_chance_stages[stat_idx] = 10; + changed = TRUE; + } + + if (changed) + ov29_022E543C(target); + else if (play_effect_anyway) + ov29_022E543C(target); + + SubstitutePlaceholderStringTags(0, target, 0); + if (changed) + LogMessageByIdWithPopupCheckUserTarget(user, target, 0xd60 + JPN_MSG_OFFSET); + else + LogMessageByIdWithPopupCheckUserTarget(user, target, 0xd61 + JPN_MSG_OFFSET); + + UpdateStatusIconFlags(target); +} + +bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity *user, struct entity *target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id) +{ + struct item item; + + if (ExclusiveItemEffectIsActive__023147EC(target, effect_id)) { + if (should_log) { + SubstitutePlaceholderStringTags(0, target, 0); + GetExclusiveItemWithEffectFromBag(target, effect_id, &item); + PrepareItemForPrinting__02345728(1, &item); + LogMessageByIdWithPopupCheckUserTarget(user, target, message_id); + } + return TRUE; + } + + return FALSE; +} + +void LogMessageWithTargetAndExclusiveItemName(struct entity *user, struct entity *target, s32 message_id, enum exclusive_item_effect_id effect_id) +{ + struct item item; + + SubstitutePlaceholderStringTags(0, target, 0); + GetExclusiveItemWithEffectFromBag(target, effect_id, &item); + PrepareItemForPrinting__02345728(1, &item); + LogMessageByIdWithPopupCheckUserTarget(user, target, message_id); +} + +bool8 TryActivateQuickFeet(struct entity *user, struct entity *target) +{ + if (!AbilityIsActiveVeneer(target, ABILITY_QUICK_FEET)) + return FALSE; + + BoostSpeed(user, target, 1, 0, FALSE); + return TRUE; +} + +void TryInflictTerrifiedStatus(struct entity *user, struct entity *target) +{ + struct monster *entityInfo = GetEntInfo(target); + + entityInfo->terrified = 1; + entityInfo->terrified_turns = ov10_022C4618; + ov29_022E60E4(target); + SubstitutePlaceholderStringTags(0, target, 0); + LogMessageByIdWithPopupCheckUserTarget(user, target, 0xde5 + JPN_MSG_OFFSET); +} + +bool8 TryInflictGrudgeStatus(struct entity *user, struct entity *target, bool8 log_message) +{ + bool8 inflicted = FALSE; + struct monster *entityInfo = GetEntInfo(target); + + SubstitutePlaceholderStringTags(1, target, 0); + if (entityInfo->grudge) { + if (log_message) + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_ED1); + } + else { + entityInfo->grudge = TRUE; + inflicted = TRUE; + UpdateStatusIconFlags(target); + if (log_message) + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_ED0); + } + + return inflicted; +} + // If Red's file boundaries are anything to go by, this file should end just before TryInflictConfusedStatus. diff --git a/src/overlay_11_02307334.c b/src/overlay_11_02307334.c index 7d42a34e..07214f94 100644 --- a/src/overlay_11_02307334.c +++ b/src/overlay_11_02307334.c @@ -100,7 +100,6 @@ extern void CreateMonsterSummaryFromTeamMember(struct monster_summary *monster_s extern s32 GetKeyboardStatus(); extern int PreprocessString(char* output, int output_size, const char* format, u16 flags, struct preprocessor_args* args); extern void ShowKeyboard(s32 mode, u8 *, s32, u8 *); -extern void sub_0202B030(s8); extern s32 sub_02037468(); extern void sub_0203909C(u8 *name); extern s32 sub_02039218(); @@ -190,17 +189,16 @@ extern s32 ov11_02322C88; extern s32 ov11_02322C98; extern s32 ov11_02322CA8; extern s32 ov11_02322CB8; -extern s32 ov11_02322CC8; +extern WindowTemplate ov11_02322CC8; extern struct unk_0202A5CC ov11_02322CD8[]; -extern s32 ov11_02322CF0; +extern struct unk_0202A5CC ov11_02322CF0[]; extern struct unk_0202A5CC ov11_02322D10[]; extern struct unk_0202A5CC ov11_02322D60[]; extern struct unk_0202A5CC ov11_02322D88[]; extern u8 ov11_02322DB0[]; -extern void CloseScrollBox(s8); extern void CloseTextBox2(s8);extern s8 CreateScrollBoxSingle(void *, s32, s32, s32, void *, s32, void *); extern s8 CreateSimpleMenuFromStringIds(void *, s32, s32, void *, s32); extern s8 CreateTextBox(void *, void *); +extern void CloseScrollBox(s8); extern void CloseTextBox2(s8);extern s8 CreateScrollBoxSingle(void *, s32, s32, s32, void *, s32, void *); extern s8 CreateTextBox(void *, void *); extern void GetPressedButtons(u32, u16 *); -extern s32 GetSimpleMenuResult__0202AEA4(s8); extern void InitPreprocessorArgs(struct preprocessor_args *); extern s32 IsScrollBoxActive(s8); extern void ShowDialogueBox(s8); extern void ShowStringIdInDialogueBox(s8, s32, s32, void *); extern void ov11_022DC504(void); extern u8 *strcpy(u8 *dest, const u8 *src); @@ -659,7 +657,8 @@ s32 ov11_02307334(void) } case 31: { ov11_02324D8C->field_0x1c.b = 1; - ov11_02324D8C->field_0xc = CreateSimpleMenuFromStringIds(&ov11_02322CC8, 0x33, (s32)&ov11_02324D8C->field_0x1c, &ov11_02322CF0, 3); + ov11_02324D8C->field_0xc = CreateSimpleMenuFromStringIds(&ov11_02322CC8, 0x33, &ov11_02324D8C->field_0x1c, + ov11_02322CF0, 3); ov11_02324D8C->field_0x0 = 0x20; break; } diff --git a/src/overlay_29_022E869C.c b/src/overlay_29_022E869C.c index 0bda856c..8ad87f88 100644 --- a/src/overlay_29_022E869C.c +++ b/src/overlay_29_022E869C.c @@ -1,4 +1,328 @@ #include "overlay_29_022E869C.h" +#include "main_02001188.h" +#include "main_020483B8.h" +#include "options.h" +#include "overlay_29_022DC684.h" +#include "overlay_29_022F7364.h" +#include "overlay_29_0233A218.h" + +extern struct unk_02353554 *TOP_SCREEN_STATUS_PTR; +extern struct dungeon *DUNGEON_PTR[]; +extern u32 DUNGEON_FRAMES_PASSED; + +extern void ov10_022C1E50(void *a); +extern void ov10_022C1E80(void *a, struct unk_022DC694 *b, s32 c, s32 d); +extern void ov10_022C21D8(void *a); +extern void ov10_022C2278(void *a); +extern void ov10_022C22A0(struct unk_022DC694 *p); + +extern void ov29_022E8CE8(void); +extern void ov29_022E8F78(u8 *a); +extern bool8 ov29_022E8FCC(void); +extern bool8 ov29_022E8FF8(void); +extern void ov29_022E9008(void); +extern void ov29_022E9014(u8 *a); +extern void ov29_02339138(void); +extern void ov29_02339D7C(s32 a, s32 b); +extern void ov29_0233A0E8(s32 a, s32 b); +extern void ov29_0233A1BC(s32 a); +extern u8 ov29_0234B4E0(void); + +extern s32 GetIdleAnimationId(struct entity *entity); +extern int GetPlayerGender(void); +extern void FreeTopScreen(void); +extern void DungeonChangeTopScreenType(s16 type); +extern bool8 InitDungeonControlsMenu(void); +extern bool8 FreeDungeonControlsMenu(void); +extern void sub_02048384(void); +extern void UpdateMinimap(void); + +void FreeTopScreenStatus(void) +{ + if (TOP_SCREEN_STATUS_PTR == NULL) { + return; + } + FreeTopScreen(); + MemFree(TOP_SCREEN_STATUS_PTR); + TOP_SCREEN_STATUS_PTR = NULL; +} + +void ov29_022E7F7C(void) +{ + TOP_SCREEN_STATUS_PTR->field_0x0 = 0; +} + +bool8 ov29_022E7F94(void) +{ + bool8 female; + + TOP_SCREEN_STATUS_PTR->field_0x228 = 0; + TOP_SCREEN_STATUS_PTR->field_0x0 = 1; + ov29_02339138(); + ov29_02339D7C(1, 1); + UpdateMinimap(); + SetMinimapDataE447(0); + TOP_SCREEN_STATUS_PTR->field_0x0 = 1; + SetMinimapDataE448(1); + ov29_022E8104(); + female = GetPlayerGender() == 2; + ov29_022DC738((s32) TOP_SCREEN_STATUS_PTR->field_0xb8, female); + return TRUE; +} + +bool8 ov29_022E8018(void) +{ + if (TOP_SCREEN_STATUS_PTR->field_0x228 != 0) { + ov29_022DC76C(); + ov29_022DC778(); + TOP_SCREEN_STATUS_PTR->field_0x228 = 0; + } + return TRUE; +} + +void ov29_022E8054(struct unk_022E8054 *a) +{ + if (a->field_0x10 == 0) { + return; + } + a->field_0x10 = 0; + if (GetTopScreenOption() != 3) { + TOP_SCREEN_STATUS_PTR->field_0x0 = 0; + return; + } + if (TOP_SCREEN_STATUS_PTR->field_0x0 != 0) { + return; + } + ov29_02339138(); + ov29_0233A0E8(0, 1); + ov29_02339D7C(1, 0); + TOP_SCREEN_STATUS_PTR->field_0x0 = 1; +} + +bool8 ov29_022E80D0(void) +{ + ov29_022DC77C(); + TOP_SCREEN_STATUS_PTR->field_0x0 = 0; + SetMinimapDataE448(0); + ov29_0233A1BC(1); + ov29_02339138(); + return TRUE; +} + +void ov29_022E8104(void) +{ + TOP_SCREEN_STATUS_PTR->field_0x228 = 0; + ov10_022C1E50(TOP_SCREEN_STATUS_PTR->field_0xb8); + ov29_022E8CE8(); +} + +bool8 InitializeTeamStats(void) +{ + bool8 female; + + TOP_SCREEN_STATUS_PTR->field_0x228 = 0; + TOP_SCREEN_STATUS_PTR->field_0x229 = 0; + ov29_022E8104(); + TOP_SCREEN_STATUS_PTR->field_0x24 = 1; + female = GetPlayerGender() == 2; + ov29_022DC694((s32) TOP_SCREEN_STATUS_PTR->field_0xb8, female); + return TRUE; +} + +bool8 UpdateTeamStatsWrapper(void) +{ + if (TOP_SCREEN_STATUS_PTR->field_0x228 != 0) { + ov29_022DC6D0(); + TOP_SCREEN_STATUS_PTR->field_0x228 = 0; + } + return TRUE; +} + +void ov29_022E81C8(struct unk_022E8054 *a) +{ + ov29_022DC6DC(); + if (a->field_0x10 != 0) { + a->field_0x10 = 0; + } +} + +bool8 FreeTeamStatsWrapper(void) +{ + ov29_022DC728(); + return TRUE; +} + +void ov29_022E81F8(void) +{ + if (!IsTeamStatsOnTopScreen()) { + ov29_022E8104(); + return; + } + if (GetTopScreenOption() == 1 && TOP_SCREEN_STATUS_PTR->field_0x8 != 1) { + DungeonChangeTopScreenType(1); + } + ov29_022E8CE8(); +} + +void ov29_022E8244(void) +{ + if (GetTopScreenOption() == 4 && TOP_SCREEN_STATUS_PTR->field_0x8 == 4) { + ov29_022E9008(); + } +} + +void DisplayTeamStatsSprite(struct entity *entity, s16 a, s16 b) +{ + s32 sprite; + s32 anim; + s16 c; + s16 d; + u8 e; + struct monster *monster; + + if (TOP_SCREEN_STATUS_PTR == NULL) { + return; + } + monster = entity->info; + anim = GetIdleAnimationId(entity); + c = 0; + d = 0; + e = 0; + sprite = (s16) entity->sprite_index; + if ((DUNGEON_PTR[0]->display_data.camera_target == entity + ? 0 : DUNGEON_PTR[0]->display_data.hallucinating) + || monster->curse_class_status.curse == 2) { + sprite = DungeonGetSpriteIndex(0x229); + } + if (monster->frozen_class_status.freeze != 1 && monster->frozen_class_status.freeze != 6) { + if (DUNGEON_PTR[0]->leader_running && ov29_0234B4E0() == 0) { + c += 2; + } + else if (entity->animation_group_id_mirror == 0 || entity->animation_group_id_mirror == 7) { + if (((struct monster *) entity->info)->speed_stage > 1) { + c += 1; + } + } + c += 1; + } + else { + c = 0; + } + if (monster->two_turn_move_invincible != 2 + && (monster->frozen_class_status.freeze == 6 || monster->burn_class_status.burn == 4 + || monster->frozen_class_status.freeze == 2)) { + d += DUNGEON_FRAMES_PASSED & 2; + } + if (monster->invisible_class_status.status == 1 + && DUNGEON_PTR[0]->display_data.can_see_traps == 0) { + e = 1; + } + if (anim == 0xff) { + return; + } + ov29_022DC6E8(sprite, monster->apparent_id, anim, monster->unique_id, 1, a, b, c, d, e); +} + +bool8 ov29_022E840C(void) +{ + struct unk_022DC694 s; + + if (TOP_SCREEN_STATUS_PTR->field_0x29 != 0) { + return FALSE; + } + ov10_022C22A0(&s); + ov10_022C1E80(TOP_SCREEN_STATUS_PTR->field_0x80, &s, 0, 1); + if (sub_02048400()) { + sub_02048384(); + } + TOP_SCREEN_STATUS_PTR->field_0x29 = 1; + return TRUE; +} + +void ov29_022E847C(struct unk_022E8054 *a) +{ + if (a->field_0x10 == 0) { + return; + } + a->field_0x10 = 0; + sub_020483B8(); + ov10_022C21D8(TOP_SCREEN_STATUS_PTR->field_0x80); +} + +bool8 ov29_022E84B0(void) +{ + if (TOP_SCREEN_STATUS_PTR->field_0x29 == 0) { + return FALSE; + } + ov10_022C2278(TOP_SCREEN_STATUS_PTR->field_0x80); + if (sub_02048400()) { + sub_020483D8(); + } + TOP_SCREEN_STATUS_PTR->field_0x29 = 0; + return TRUE; +} + +bool8 InitDungeonControlsMenuWithBg(void) +{ + struct unk_022DC694 s; + + ov10_022C22A0(&s); + ov10_022C1E80(TOP_SCREEN_STATUS_PTR->field_0x80, &s, 0, 1); + ov10_022C21D8(TOP_SCREEN_STATUS_PTR->field_0x80); + return InitDungeonControlsMenu(); +} + +void ov29_022E854C(struct unk_022E8054 *a) +{ + if (a->field_0x10 == 0) { + return; + } + ov29_022E8F78(&a->field_0x10); + ov10_022C21D8(TOP_SCREEN_STATUS_PTR->field_0x80); + a->field_0x10 = 0; +} + +bool8 FreeDungeonControlsMenuWithBg(void) +{ + ov10_022C2278(TOP_SCREEN_STATUS_PTR->field_0x80); + return FreeDungeonControlsMenu(); +} + +bool8 ov29_022E85A8(void) +{ + struct unk_022DC694 s; + + ov10_022C22A0(&s); + ov10_022C1E80(TOP_SCREEN_STATUS_PTR->field_0x80, &s, 0, 1); + ov10_022C21D8(TOP_SCREEN_STATUS_PTR->field_0x80); + return ov29_022E8FCC(); +} + +void ov29_022E85F4(struct unk_022E8054 *a) +{ + if (a->field_0x10 == 0) { + return; + } + ov29_022E9014(&a->field_0x10); + ov10_022C21D8(TOP_SCREEN_STATUS_PTR->field_0x80); + a->field_0x10 = 0; +} + +bool8 ov29_022E8630(void) +{ + ov10_022C2278(TOP_SCREEN_STATUS_PTR->field_0x80); + return ov29_022E8FF8(); +} + +bool8 ov29_022E8650(void) +{ + struct unk_022DC694 s; + + ov10_022C22A0(&s); + ov10_022C1E80(TOP_SCREEN_STATUS_PTR->field_0x80, &s, 0, 1); + ov10_022C21D8(TOP_SCREEN_STATUS_PTR->field_0x80); + return TRUE; +} bool8 ov29_022E869C(void) { diff --git a/src/overlay_29_0230558C.c b/src/overlay_29_0230558C.c index b7e8d553..f3b638e3 100644 --- a/src/overlay_29_0230558C.c +++ b/src/overlay_29_0230558C.c @@ -1,5 +1,53 @@ #include "overlay_29_0230558C.h" +#include "dg_uty.h" +#include "dungeon_capabilities.h" +#include "dungeon_items.h" +#include "dungeon_logic.h" +#include "dungeon_logic_7.h" +#include "dungeon_pokemon_attributes.h" +#include "dungeon_pokemon_attributes_1.h" +#include "dungeon_util_1.h" +#include "dungeon_util_2.h" #include "dungeon_util_static.h" +#include "overlay_29_022E3F20.h" +#include "overlay_29_022EC7E8.h" +#include "overlay_29_022FFF28.h" +#include "overlay_29_02305C04.h" +#include "overlay_29_023061A8.h" +#include "overlay_29_02306728.h" +#include "overlay_29_0230F810.h" +#include "overlay_29_02336F4C.h" +#include "overlay_29_0234B104.h" +#include "overlay_29_0234B340.h" +#include "position_util.h" + +#ifdef JAPAN +#define JPN_MSG_OFFSET -0x2C0 +#else +#define JPN_MSG_OFFSET 0 +#endif + +extern struct dungeon *DUNGEON_PTR[]; +extern const u16 ov29_02353318[]; + +extern s32 GetIdleAnimationId(struct entity *entity); +extern void ChangeMonsterAnimation(struct entity *entity, s32 animation_id, s32 direction); +extern void ov29_02337D68(struct position *pos); +extern struct trap *GetTrapInfo(struct entity *entity); +extern void TryTriggerTrap(struct entity *entity, struct position *pos, s32 a, s32 b); +extern void TryTriggerMonsterHouse(struct entity *entity, bool8 a); +extern void ov29_022E3A58(bool8 a); +extern bool8 ov29_022E2CA0(struct position *pos); +extern void ov29_022EA370(s32 a, s32 b); +extern void EndSleepClassStatus(struct entity *user, struct entity *target, bool8 a, bool8 b, bool8 c); +extern void EndFrozenClassStatus(struct entity *user, struct entity *target, bool8 log); +extern void EndCringeClassStatus(struct entity *user, struct entity *target); +extern void EndLeechSeedClassStatus(struct entity *user, struct entity *target); +extern void EndSureShotClassStatus(struct entity *user, struct entity *target); +extern void EndBlinkerClassStatus(struct entity *user, struct entity *target); +extern void EndMuzzledStatus(struct entity *user, struct entity *target); +extern void EndMiracleEyeStatus(struct entity *user, struct entity *target); +extern void ov29_022E543C(struct entity *entity); bool8 EntityIsValid__0230558C(struct entity *entity) { @@ -8,3 +56,223 @@ bool8 EntityIsValid__0230558C(struct entity *entity) return GetEntityType(entity) != ENTITY_NOTHING; } + +void ov29_023055B0(s32 a) +{ + s32 i; + + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { + struct entity *entity = DUNGEON_PTR[0]->active_monster_ptrs[i]; + if (EntityIsValid__0230558C(entity)) { + struct monster *monster = GetEntInfo(entity); + if (!monster->is_team_leader) { + if (IsTeamMemberOnFirstTurnInFixedRoom(monster)) + return; + + if (monster->target_pos.x != 0 || monster->target_pos.y != 0) { + if (monster->target_pos.x != entity->pos.x || + monster->target_pos.y != entity->pos.y) { + if (!CheckVariousStatuses2__02301244(entity, TRUE)) { + s32 direction = + GetDirectionTowardsPosition(&entity->pos, &monster->target_pos); + monster->action.direction = direction & DIRECTION_MASK; + ChangeMonsterAnimation(entity, GetIdleAnimationId(entity), direction); + } + } + } + } + } + } +} + +void CheckNonLeaderTile(struct entity *entity) +{ + struct monster *monster = GetEntInfo(entity); + struct tile *tile; + struct entity *object; + + if (!EntityIsValid__0230558C(entity)) + return; + + tile = GetTileAtEntity(entity); + if (IqSkillIsEnabled(entity, IQ_ABSOLUTE_MOVER) && + monster->invisible_class_status.status != STATUS_INVISIBLE_MOBILE) { + bool8 item_active; + if (AbilityIsActiveVeneer(entity, ABILITY_KLUTZ)) + item_active = FALSE; + else + item_active = HasHeldItem(entity, ITEM_MOBILE_SCARF); + + if (!item_active) + ov29_02337D68(&entity->pos); + } + + object = tile->object; + if (object == NULL) + return; + + switch (object->type) { + case ENTITY_NOTHING: + case ENTITY_MONSTER: + break; + case ENTITY_TRAP: { + struct trap *trap = GetTrapInfo(object); + bool8 trigger = FALSE; + bool8 revealed = FALSE; + + if (!monster->is_not_team_member && IqSkillIsEnabled(entity, IQ_TRAP_SEER) && + !object->is_visible) { + object->is_visible = TRUE; + UpdateTrapsVisibility(); + revealed = TRUE; + } + + if (trap->team == 0) { + if (object->is_visible && !monster->is_not_team_member) + trigger = TRUE; + } + else if (trap->team == 1) { + if (monster->is_not_team_member) + trigger = TRUE; + } + else if (trap->team == 2) { + if (!monster->is_not_team_member) + trigger = TRUE; + } + + if (trigger && !revealed) + TryTriggerTrap(entity, &entity->pos, FALSE, TRUE); + break; + } + case ENTITY_ITEM: + TryNonLeaderItemPickUp(entity); + break; + case ENTITY_HIDDEN_STAIRS: + case ENTITY_TEMPORARY: + break; + } +} + +void ov29_02305814(struct entity *entity, bool8 a) +{ + if (!EntityIsValid__0230558C(entity)) + return; + + if (GetEntInfo(entity)->is_not_team_member) + return; + + if (IsFloorOver() || DUNGEON_PTR[0]->monster_house_triggered) + return; + + if (!(GetTileAtEntity(entity)->terrain_flags & TERRAIN_TYPE_IN_MONSTER_HOUSE)) + return; + + LogMessageByIdWithPopupCheckUser(GetLeader(), 0xC82 + JPN_MSG_OFFSET); + DUNGEON_PTR[0]->monster_house_triggered_event = TRUE; + TryTriggerMonsterHouse(entity, a); + ov29_022E3A58(FALSE); + if (ov29_022E2CA0(&entity->pos)) + ov29_022EA370(0x78, 0x39); +} + +s32 EndNegativeStatusCondition(struct entity *user, struct entity *target, bool8 a, bool8 b, + bool8 c) +{ + struct monster *monster; + s32 result = FALSE; + s32 speed_stage; + s32 log_sealed = FALSE; + s32 i; + + if (!EntityIsValid__02305C04(target)) + return result; + + monster = GetEntInfo(target); + if (MonsterHasNegativeStatus(target, FALSE)) { + result = TRUE; + if (IsMonsterDrowsy(target)) + EndSleepClassStatus(user, target, FALSE, FALSE, TRUE); + + if (!EntityIsValid__02305C04(target)) + return FALSE; + + if (MonsterHasNonvolatileNonsleepStatus(target)) + EndBurnClassStatus(user, target); + + if (c) { + if (MonsterHasImmobilizingStatus(target)) + EndFrozenClassStatus(user, target, TRUE); + } + else if (MonsterHasImmobilizingStatus(target) && + monster->frozen_class_status.freeze != STATUS_FROZEN_WRAP) { + EndFrozenClassStatus(user, target, TRUE); + } + + if (MonsterHasAttackInterferingStatus(target)) + EndCringeClassStatus(user, target); + + if (MonsterHasSkillInterferingStatus(target)) + EndCurseClassStatus(user, target, 0, TRUE); + + if (MonsterHasLeechSeedStatus(target)) + EndLeechSeedClassStatus(user, target); + + if (MonsterHasWhifferStatus(target)) + EndSureShotClassStatus(user, target); + + if (IsMonsterVisuallyImpaired(target, FALSE)) + EndBlinkerClassStatus(user, target); + + if (IsMonsterMuzzled(target)) + EndMuzzledStatus(user, target); + + if (MonsterHasMiracleEyeStatus(target)) + EndMiracleEyeStatus(user, target); + + if (monster->perish_song_turns != 0) { + monster->perish_song_turns = 0; + LogMessageByIdWithPopupCheckUserTarget(user, target, 0xC83 + JPN_MSG_OFFSET); + } + + if (monster->exposed) { + monster->exposed = FALSE; + LogMessageByIdWithPopupCheckUserTarget(user, target, 0xC84 + JPN_MSG_OFFSET); + } + } + + speed_stage = CalcSpeedStageWrapper(target); + for (i = 0; i < NUM_SPEED_COUNTERS; i++) + monster->speed_down_counters[i] = 0; + + if (speed_stage != CalcSpeedStageWrapper(target)) { + result = TRUE; + SubstitutePlaceholderStringTags(0, target, 0); + LogMessageByIdWithPopupCheckUserTarget(user, target, + ov29_02353318[monster->speed_stage]); + } + + for (i = 0; i < MAX_MON_MOVES; i++) { + struct move *move = &monster->moves.moves[i]; + if (MoveExists(move)) { + if (move->flags2 & MOVE_FLAG_SEALED) { + result = TRUE; + log_sealed = TRUE; + move->flags2 &= ~MOVE_FLAG_SEALED; + } + } + } + + if (result) { + if (a) + ov29_022E543C(target); + + if (log_sealed) + LogMessageByIdWithPopupCheckUserTarget(user, target, 0xC85 + JPN_MSG_OFFSET); + } + else if (!b) { + LogMessageByIdWithPopupCheckUserTarget(user, target, 0xC86 + JPN_MSG_OFFSET); + } + + UpdateStatusIconFlags(target); + return result; +} diff --git a/src/overlay_29_02315118.c b/src/overlay_29_02315118.c index fb64ac0b..295acd91 100644 --- a/src/overlay_29_02315118.c +++ b/src/overlay_29_02315118.c @@ -2,6 +2,86 @@ #include "dungeon_items.h" #include "dungeon_pokemon_attributes.h" #include "dungeon_util_static.h" +#include "dungeon_logic_2.h" +#include "dungeon_util_2.h" +#include "move_orb_effects.h" +#include "overlay_29_022E3F20.h" +#include "overlay_29_022E41CC.h" +#include "overlay_29_0234B340.h" + +extern bool8 SafeguardIsActive(struct entity *user ,struct entity *target, bool8 log_message); +extern s32 CalcStatusDuration(struct entity *entity, const s16 *turn_range, bool8 iq_skill_effects); + +extern const s16 CONFUSED_TURN_RANGE[]; + +#ifdef JAPAN +#define MESSAGE_CFE 0xA3E +#define MESSAGE_CFF 0xA3F +#define MESSAGE_DA7 0xAE7 +#define MESSAGE_DAF 0xAEF +#define MESSAGE_DBA 0xAFA +#else +#define MESSAGE_CFE 0xCFE +#define MESSAGE_CFF 0xCFF +#define MESSAGE_DA7 0xDA7 +#define MESSAGE_DAF 0xDAF +#define MESSAGE_DBA 0xDBA +#endif + +bool8 TryInflictConfusedStatus(struct entity *user, struct entity *target, bool8 log_failure, bool8 check_only) +{ + struct monster *entityInfo; + bool8 ownTempo; + + if (!EntityIsValid__02315118(target)) + return FALSE; + + if (SafeguardIsActive(user, target, log_failure)) + return FALSE; + + if (IsProtectedFromNegativeStatus(user, target, log_failure)) + return FALSE; + + SubstitutePlaceholderStringTags(0, target, 0); + + if (ItemIsActive__0231513C(target, ITEM_PERSIM_BAND)) { + if (log_failure) + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_DAF); + return FALSE; + } + + if (ExclusiveItemEffectIsActiveWithLogging(user, target, log_failure, MESSAGE_DBA, EXCLUSIVE_EFF_NO_CONFUSION)) + return FALSE; + + if (user != target && (user == NULL ? FALSE : (bool8)(GetEntityType(user) == ENTITY_MONSTER)) && AbilityIsActiveVeneer(user, ABILITY_MOLD_BREAKER)) + ownTempo = FALSE; + else + ownTempo = AbilityIsActiveVeneer(target, ABILITY_OWN_TEMPO); + + if (ownTempo) { + if (log_failure) + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_DA7); + return FALSE; + } + + if (check_only) + return TRUE; + + ov29_022E41CC(target); + entityInfo = GetEntInfo(target); + if (entityInfo->cringe_class_status.cringe != STATUS_CRINGE_CONFUSED) { + entityInfo->cringe_class_status.cringe = STATUS_CRINGE_CONFUSED; + entityInfo->cringe_class_status.cringe_turns = CalcStatusDuration(target, CONFUSED_TURN_RANGE, TRUE) + 1; + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_CFE); + TryActivateQuickFeet(user, target); + } + else { + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_CFF); + } + + UpdateStatusIconFlags(target); + return TRUE; +} bool8 EntityIsValid__02315118(struct entity *entity) { diff --git a/src/overlay_29_0231CBC8.c b/src/overlay_29_0231CBC8.c index 282d1693..e3ad1ebd 100644 --- a/src/overlay_29_0231CBC8.c +++ b/src/overlay_29_0231CBC8.c @@ -1,4 +1,5 @@ #include "overlay_29_0231CBC8.h" +#include "overlay_29_02315118.h" #include "dungeon_util_static.h" #include "dungeon_capabilities_1.h" #include "dungeon_pokemon_attributes_1.h" @@ -43,7 +44,6 @@ extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s3 extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); extern void BoostIQ(struct entity *entity, s16 iq, bool8 a); extern void UpdateShopkeeperModeAfterAttack(struct entity *attacker, struct entity *defender); -extern void TryInflictConfusedStatus(struct entity *user, struct entity *target, bool8 a, bool8 b); extern void TryInflictInvisibleStatus(struct entity *user, struct entity *target); extern void TryInflictPetrifiedStatus(struct entity *user, struct entity *target); extern void TryInflictSleeplessStatus(struct entity *user, struct entity *target); diff --git a/src/overlay_29_023293E4.c b/src/overlay_29_023293E4.c index 396a1ed1..9ae9ae61 100644 --- a/src/overlay_29_023293E4.c +++ b/src/overlay_29_023293E4.c @@ -1,6 +1,6 @@ #include "overlay_29_023293E4.h" +#include "overlay_29_02315118.h" -extern void TryInflictConfusedStatus(struct entity *user, struct entity *target, bool8 displayMessage, bool8 onlyCheck); bool8 DoMoveConfuse(struct entity* attacker, struct entity* defender, struct move* move, enum item_id item_id) { diff --git a/src/overlay_29_0232DD78.c b/src/overlay_29_0232DD78.c index df59eb83..f542bc34 100644 --- a/src/overlay_29_0232DD78.c +++ b/src/overlay_29_0232DD78.c @@ -1,8 +1,8 @@ #include "overlay_29_0232DD78.h" +#include "move_orb_effects.h" extern s32 DealDamage(struct entity *attacker, struct entity *defender, struct move *move, s32 damageMultiplier, enum item_id item_id); -extern void BoostOrLowerSpeed(struct entity *user, struct entity *target); bool8 DoMoveTrickRoom(struct entity* attacker, struct entity* defender, struct move* move, enum item_id item_id) { diff --git a/src/spawn_2.c b/src/spawn_2.c index 25c3ab6c..8f9e970b 100644 --- a/src/spawn_2.c +++ b/src/spawn_2.c @@ -1,9 +1,15 @@ #include "dg_random.h" #include "dungeon.h" +#include "main_02001188.h" +#include "main_0200330C.h" +#include "overlay_29_022E869C.h" #include "overlay_29_022F73B4.h" #include "spawn_2.h" extern struct dungeon *DUNGEON_PTR[]; +extern struct unk_02353554 *TOP_SCREEN_STATUS_PTR; + +extern void ov29_022E8708(void); extern s32 GetMonsterIdFromSpawnEntry(struct monster_spawn_entry *); extern s32 GetMonsterLevelFromSpawnEntry(struct monster_spawn_entry *); @@ -58,3 +64,18 @@ s32 GetMonsterLevelToSpawn(s32 monster_id) { return 1; } + +void AllocTopScreenStatus(void) +{ + TOP_SCREEN_STATUS_PTR = MemAlloc(0x230, 0); + MemZero((u8 *) TOP_SCREEN_STATUS_PTR, 0x230); + TOP_SCREEN_STATUS_PTR->field_0x0 = 0; + TOP_SCREEN_STATUS_PTR->field_0x29 = 0; + TOP_SCREEN_STATUS_PTR->field_0x2c = 0; + TOP_SCREEN_STATUS_PTR->field_0x2b = 0; + TOP_SCREEN_STATUS_PTR->field_0x4 = 0; + TOP_SCREEN_STATUS_PTR->field_0x228 = 0; + ov29_022E8708(); + TOP_SCREEN_STATUS_PTR->field_0x4 = 2; + TOP_SCREEN_STATUS_PTR->field_0x229 = 0; +}