From 9b3650fe33bc77142837c2e4046f10bb5006a5bc Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sun, 13 Sep 2026 13:54:12 -0700 Subject: [PATCH] Decompile 26 more callees; clear six asm files entirely Twenty-six functions across twelve groups, each group chosen so it clears a .s file's head or the whole file, never splitting one: asm/overlay_29_0231EDFC.s TryHurl asm/overlay_29_0230E064.s TryRecruit asm/overlay_29_0234B130.s ov29_0234B130, ov29_0234B1A4, LogMessageByIdWithPopupCheckParticipants, WaitUntilAlertBoxTextIsLoadedWrapper, LogMessageByIdWithPopupCheckUser, LogMessageWithPopupCheckUser, LogMessageByIdQuiet asm/overlay_29_0231B1B8.s TryActivateBadDreams asm/overlay_29_02301D84.s OtherMonsterAbilityIsActive asm/main_02050300.s SetItemAcquired asm/overlay_29_0230F9A4.s ov29_0230F9A4, TrySpawnEnemyItemDrop asm/main_02051504.s RetrieveFromItemList1, IsForbiddenFloor asm/main_020251F0.s sub_020251F0, StrncpySimpleNoPadSafe asm/main_020261F4.s sub_020261F4, sub_02026204, DrawTextInWindow asm/main_0202B568.s sub_0202B568, GetSimpleMenuResult__0202B870 asm/main_020022C4.s sub_020022C4, sub_020022D0, RandIntSafe Fourteen are callees of the ten previously landed functions; the rest are the neighbours that had to clear first to reach a file boundary. Six .s files are consumed entirely, so main.lsf loses six asm objects and gains six tails. Thirty-five call-site declarations are replaced by an include of the owning header, across twenty-one files. Several were not duplicates but genuine disagreements: GetSimpleMenuResult__0202B870 had five declarations, all giving the window id as s8 against the definition's s32; two were K&R `extern int ov29_0234B1A4();`. None of these can surface in a build, since two declarations in two translation units never meet. A declaration that disagrees is NOT automatically stale. src/overlay_13_0238BDA8.c keeps its own `extern void DrawTextInWindow(s8 window_id, ...)`: that file's DrawPersonalityTestDebug carries the window id in an s8 local, and against the header's s32 the call needs a sign extension retail does not emit. Replacing it broke OVY_13.sbin. Retail's translation units genuinely disagreed about this prototype, so the per-TU declaration is evidence, not a defect to tidy away. Three shared types change, all layout-preserving: * struct team_member's first byte, a 1+7 bitfield pair, becomes u8 flags. TryRecruit writes the whole byte in one strb and reads bit 0 through GetFlag(u8, u8), which takes a value a bitfield member cannot supply. * struct unk_02026130's field_0x4 grows from [4] to [0x118] (total 0x11C). DrawTextInWindow declares one as a local, so its size sets the frame. * alert_box_info::alert_box_window_id becomes s8; it holds -2, and seven ldrsb reads of offset 0xCEC corroborate the signedness. sub_02026194 is corrected from one argument to three: sub_02020BC4 reads r1 and r2 (tst r1, #0x400; strh r1, [r4, #0x60]; str r2, [r4, #0x88]) and every asm caller passes all three, so the wrapper was forwarding registers it never named. Its pre-landing asm was recovered from git and both forms measured. Authored by Claude (Opus 5) under human direction. Each function was measured at decomp.me score 0 in all three regions and re-measured by an independent verifier. Confirmed by matching builds of 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 --- .../{main_020022C4.inc => main_02002318.inc} | 0 .../{main_020251F0.inc => main_02025230.inc} | 0 .../{main_020261F4.inc => main_02026268.inc} | 3 +- .../{main_0202B568.inc => main_0202B5C8.inc} | 5 +- asm/include/main_02050300.inc | 7 - .../{main_02051504.inc => main_020515C4.inc} | 4 +- asm/include/overlay_29_02301D84.inc | 5 - asm/include/overlay_29_0230E064.inc | 57 -- asm/include/overlay_29_0230F9A4.inc | 19 - asm/include/overlay_29_0230FB30.inc | 6 + asm/include/overlay_29_0231B1B8.inc | 10 - asm/include/overlay_29_0231EDFC.inc | 33 -- asm/include/overlay_29_0234B130.inc | 12 - asm/{main_020022C4.s => main_02002318.s} | 36 +- asm/{main_020251F0.s => main_02025230.s} | 69 +-- asm/{main_020261F4.s => main_02026268.s} | 46 +- asm/{main_0202B568.s => main_0202B5C8.s} | 37 +- asm/main_02050300.s | 64 --- asm/{main_02051504.s => main_020515C4.s} | 62 +- asm/overlay_29_02301D84.s | 89 --- asm/overlay_29_0230E064.s | 374 ------------ asm/overlay_29_0230F9A4.s | 149 ----- asm/overlay_29_0230FB30.s | 37 ++ asm/overlay_29_0231B1B8.s | 108 ---- asm/overlay_29_0231EDFC.s | 534 ------------------ asm/overlay_29_0234B130.s | 171 ------ include/common.h | 4 +- include/dungeon_pokemon_attributes.h | 1 + include/dungeon_recruitment.h | 1 + include/main_0200224C.h | 3 + include/main_020251AC.h | 2 + include/main_0202613C.h | 2 +- include/main_02026174.h | 5 +- include/main_0202B558.h | 2 + include/main_020502B0.h | 1 + include/main_020514CC.h | 3 + include/overlay_29_0230F8AC.h | 2 + include/overlay_29_0231B194.h | 1 + include/overlay_29_0231EDD8.h | 1 + include/overlay_29_0234B024.h | 4 +- include/overlay_29_0234B104.h | 8 + main.lsf | 18 +- src/dungeon_ai.c | 2 +- src/dungeon_logic_6.c | 2 +- src/dungeon_pokemon_attributes.c | 22 + src/dungeon_recruitment.c | 220 ++++++++ src/main_0200224C.c | 20 + src/main_020251AC.c | 39 ++ src/main_02026174.c | 39 +- src/main_0202B558.c | 24 + src/main_0203D538.c | 5 +- src/main_020502B0.c | 29 + src/main_020514CC.c | 41 ++ src/main_02059060.c | 2 +- src/main_0205D11C.c | 3 +- src/main_02065B3C.c | 2 +- src/overlay_11_02307334.c | 10 +- src/overlay_17_0238B10C.c | 2 +- src/overlay_18_0238BF60.c | 2 +- src/overlay_24_init.c | 4 +- src/overlay_25_init.c | 6 +- src/overlay_29_022F0EDC.c | 2 +- src/overlay_29_02306728.c | 2 +- src/overlay_29_02308FBC.c | 8 +- src/overlay_29_0230BBAC.c | 1 - src/overlay_29_0230F8AC.c | 61 ++ src/overlay_29_02311010.c | 5 +- src/overlay_29_0231B194.c | 49 ++ src/overlay_29_0231CBC8.c | 2 +- src/overlay_29_0231EDD8.c | 256 +++++++++ src/overlay_29_0232D1DC.c | 2 +- src/overlay_29_0233836C.c | 2 +- src/overlay_29_0234B104.c | 96 ++++ src/overlay_31_02382820.c | 2 +- src/overlay_31_02383880.c | 6 +- src/status_checks.c | 2 +- src/type_effectiveness.c | 2 +- 77 files changed, 1019 insertions(+), 1948 deletions(-) rename asm/include/{main_020022C4.inc => main_02002318.inc} (100%) rename asm/include/{main_020251F0.inc => main_02025230.inc} (100%) rename asm/include/{main_020261F4.inc => main_02026268.inc} (93%) rename asm/include/{main_0202B568.inc => main_0202B5C8.inc} (86%) delete mode 100644 asm/include/main_02050300.inc rename asm/include/{main_02051504.inc => main_020515C4.inc} (72%) delete mode 100644 asm/include/overlay_29_02301D84.inc delete mode 100644 asm/include/overlay_29_0230E064.inc delete mode 100644 asm/include/overlay_29_0230F9A4.inc create mode 100644 asm/include/overlay_29_0230FB30.inc delete mode 100644 asm/include/overlay_29_0231B1B8.inc delete mode 100644 asm/include/overlay_29_0231EDFC.inc delete mode 100644 asm/include/overlay_29_0234B130.inc rename asm/{main_020022C4.s => main_02002318.s} (53%) rename asm/{main_020251F0.s => main_02025230.s} (90%) rename asm/{main_020261F4.s => main_02026268.s} (86%) rename asm/{main_0202B568.s => main_0202B5C8.s} (87%) delete mode 100644 asm/main_02050300.s rename asm/{main_02051504.s => main_020515C4.s} (66%) delete mode 100644 asm/overlay_29_02301D84.s delete mode 100644 asm/overlay_29_0230E064.s delete mode 100644 asm/overlay_29_0230F9A4.s create mode 100644 asm/overlay_29_0230FB30.s delete mode 100644 asm/overlay_29_0231B1B8.s delete mode 100644 asm/overlay_29_0231EDFC.s delete mode 100644 asm/overlay_29_0234B130.s diff --git a/asm/include/main_020022C4.inc b/asm/include/main_02002318.inc similarity index 100% rename from asm/include/main_020022C4.inc rename to asm/include/main_02002318.inc diff --git a/asm/include/main_020251F0.inc b/asm/include/main_02025230.inc similarity index 100% rename from asm/include/main_020251F0.inc rename to asm/include/main_02025230.inc diff --git a/asm/include/main_020261F4.inc b/asm/include/main_02026268.inc similarity index 93% rename from asm/include/main_020261F4.inc rename to asm/include/main_02026268.inc index fd58f093..8cb78456 100644 --- a/asm/include/main_020261F4.inc +++ b/asm/include/main_02026268.inc @@ -1,15 +1,14 @@ #pragma once -.public _020AFD04 .public AnalyzeText .public DrawChar .public GetColorCodePaletteOffset .public PreprocessStringFromId +.public _020AFD04 .public sub_02020B4C .public sub_02020B60 .public sub_02020B74 .public sub_02020B94 .public sub_02020BC4 -.public sub_02020D7C .public sub_02022118 .public sub_02025C7C .public sub_02025E84 diff --git a/asm/include/main_0202B568.inc b/asm/include/main_0202B5C8.inc similarity index 86% rename from asm/include/main_0202B568.inc rename to asm/include/main_0202B5C8.inc index 2abef97c..212fee34 100644 --- a/asm/include/main_0202B568.inc +++ b/asm/include/main_0202B5C8.inc @@ -1,13 +1,11 @@ #pragma once -.public GetMaxItemsOnPage .public GetNumItemsOnPage .public GetPageItemYOffset .public GetPageStart .public GetSelectedMenuItemIdx -.public GetTotalNumMenuItems -.public GetWindowContents .public IsMenuOptionActive .public PlayWindowInputSound +.public UpdateWindow .public sub_020263C8 .public sub_02027B1C .public sub_0202810C @@ -23,4 +21,3 @@ .public sub_0203250C .public sub_02032684 .public sub_02033758 -.public UpdateWindow diff --git a/asm/include/main_02050300.inc b/asm/include/main_02050300.inc deleted file mode 100644 index 19875dc0..00000000 --- a/asm/include/main_02050300.inc +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once -.public ADVENTURE_LOG_PTR -.public GetAdventureLogCompleted -.public IsItemValidVeneer -.public NormalizeTreasureBox -.public SetAdventureLogCompleted -.public SetResolvedPerformanceProgressFlag diff --git a/asm/include/main_02051504.inc b/asm/include/main_020515C4.inc similarity index 72% rename from asm/include/main_02051504.inc rename to asm/include/main_020515C4.inc index ee539950..7566f88f 100644 --- a/asm/include/main_02051504.inc +++ b/asm/include/main_020515C4.inc @@ -1,10 +1,8 @@ #pragma once -.public _020A1864 .public CopyBitsFrom .public CopyBitsTo .public DUNGEON_RESTRICTIONS -.public DungeonFloorToGroupFloor .public GetItemIdFromList .public GetNbFloorsPlusOne -.public MISSION_FLOORS_FORBIDDEN .public RandIntSafe +.public _020A1864 diff --git a/asm/include/overlay_29_02301D84.inc b/asm/include/overlay_29_02301D84.inc deleted file mode 100644 index 3db6528d..00000000 --- a/asm/include/overlay_29_02301D84.inc +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once -.public DefenderAbilityIsActive__02301A0C -.public DUNGEON_PTR -.public EntityIsValid__023000E4 -.public ShouldTreatMonsterAsAlly diff --git a/asm/include/overlay_29_0230E064.inc b/asm/include/overlay_29_0230E064.inc deleted file mode 100644 index d1cc8531..00000000 --- a/asm/include/overlay_29_0230E064.inc +++ /dev/null @@ -1,57 +0,0 @@ -#pragma once -.public abs -.public CanSeeTarget -.public ChangeMonsterAnimationToIdle -.public DUNGEON_PTR -.public DungeonModeSetupAndShowNameKeyboard -.public EnableAllLearnableIqSkills -.public EnsureCanStandCurrentTile -.public GetActiveTeamMember -.public GetDirectionTowardsPosition -.public GetMessageLogPreprocessorArgs -.public GetNameString -.public GetRecoloredNameOfTeamMemberAtIdx -.public GetRecoloredTeamMemberName -.public HandleFaint -.public InitTeamMember -.public IsMonsterOnTeam -.public LogMessageByIdWithPopupCheckUser -.public MonsterIsType -.public ov10_022C4410 -.public ov10_022C441C -.public ov10_022C443C -.public ov10_022C447C -.public ov10_022C44FC -.public ov10_022C46FC -.public ov10_022C4700 -.public ov10_022C4704 -.public ov10_022C4708 -.public ov10_022C470C -.public ov29_022E1B28 -.public ov29_022E68BC -.public ov29_022E8104 -.public ov29_022E81F8 -.public ov29_022EACAC -.public ov29_02305F60 -.public ov29_0230E5A8 -.public ov29_0230E5FC -.public ov29_0230E658 -.public ov29_0234B1A4 -.public ov29_0234D630 -.public ov29_0234D7C0 -.public ov29_0234D838 -.public ov29_0234D8A0 -.public ov29_0234EE10 -.public RECRUITMENT_LEVEL_BOOST_TABLE -.public RemoveMonsterFromTile -.public SetMessageLogPreprocessorArgsString -.public SetPokemonJoined -.public SetPreprocessorArgsIdVal -.public SetPreprocessorArgsStringToName -.public SpecificRecruitCheck -.public StrcpySimple -.public StrncpyName -.public StrncpySimpleNoPad -.public sub_02056698 -.public SubstitutePlaceholderStringTags -.public WaitUntilAlertBoxPauseIsOver diff --git a/asm/include/overlay_29_0230F9A4.inc b/asm/include/overlay_29_0230F9A4.inc deleted file mode 100644 index ace32b8c..00000000 --- a/asm/include/overlay_29_0230F9A4.inc +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once -.public AbilityIsActiveVeneer -.public DUNGEON_PTR -.public DungeonRandOutcome__022EAB20 -.public ExclusiveItemEffectIsActive__0230F8AC -.public GenerateStandardItem -.public IqSkillIsEnabled -.public IsMonster__0230F980 -.public LogMessageByIdWithPopupCheckUser -.public SpawnDroppedItemWrapper -.public SubstitutePlaceholderStringTags -.public TreasureBoxDropsEnabled -.public TryGenerateUnownStoneDrop -.public ov10_022C4650 -.public ov29_02344B9C -.public ov29_023460DC -.public ov29_02347184 -.public ov29_0234908C -.public ov29_023529A8 diff --git a/asm/include/overlay_29_0230FB30.inc b/asm/include/overlay_29_0230FB30.inc new file mode 100644 index 00000000..196190d1 --- /dev/null +++ b/asm/include/overlay_29_0230FB30.inc @@ -0,0 +1,6 @@ +#pragma once +.public LogMessageByIdWithPopupCheckUser +.public SubstitutePlaceholderStringTags +.public ov29_02344B9C +.public ov29_02347184 +.public ov29_023529A8 diff --git a/asm/include/overlay_29_0231B1B8.inc b/asm/include/overlay_29_0231B1B8.inc deleted file mode 100644 index 6bf67c84..00000000 --- a/asm/include/overlay_29_0231B1B8.inc +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once -.public ApplyDamageAndEffectsWrapper -.public DUNGEON_PTR -.public EntityIsValid__0231B194 -.public IsMonster__0231B318 -.public IsMonsterSleeping -.public IsValidTargetEntity -.public ov10_022C4530 -.public SetPreprocessorArgsIdVal -.public TryEndPetrifiedOrSleepStatus diff --git a/asm/include/overlay_29_0231EDFC.inc b/asm/include/overlay_29_0231EDFC.inc deleted file mode 100644 index 5fc909c3..00000000 --- a/asm/include/overlay_29_0231EDFC.inc +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once -.public _s32_div_f -.public AbilityIsActiveVeneer -.public AdvanceFrame -.public CalcDamageFixedNoCategory -.public CannotMoveToTile -.public CanSeeTarget -.public ChangeMonsterAnimation -.public ChangeMonsterAnimationToIdle -.public DIRECTIONS_XY -.public DUNGEON_PTR -.public DungeonRandInt -.public DungeonRandRange -.public EntityIsValid__0231F570 -.public GetDirectionTowardsPosition -.public GetTile -.public GetTreatmentBetweenMonsters -.public HasDropeyeStatus -.public HURL_DAMAGE -.public InitMove -.public LogMessageByIdWithPopupCheckUserTarget -.public MoveMonsterToPos -.public ov29_022E9298 -.public ov29_022EA370 -.public ov29_0232033C -.public ov29_02321238 -.public PlaySeByIdIfNotSilence -.public ShouldDisplayEntityWrapper -.public SinAbs4096 -.public SubstitutePlaceholderStringTags -.public TryWarp -.public TwoTurnMoveForcedMiss -.public UpdateEntityPixelPos diff --git a/asm/include/overlay_29_0234B130.inc b/asm/include/overlay_29_0234B130.inc deleted file mode 100644 index 94e40567..00000000 --- a/asm/include/overlay_29_0234B130.inc +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -.public AdvanceFrame -.public FullyCloseAlertBox -.public InitPreprocessorArgs -.public LogMessage -.public LogMessageByIdWithPopupCheckUserTarget -.public MESSAGE_LOG_INFO -.public ov29_022E9FC0 -.public ShouldDisplayEntityWrapper -.public StringFromId -.public UnkMapRelatedFunc -.public WaitUntilAlertBoxTextIsLoaded diff --git a/asm/main_020022C4.s b/asm/main_02002318.s similarity index 53% rename from asm/main_020022C4.s rename to asm/main_02002318.s index da40ad4f..e0d9367a 100644 --- a/asm/main_020022C4.s +++ b/asm/main_02002318.s @@ -1,42 +1,8 @@ .include "asm/macros.inc" - .include "main_020022C4.inc" + .include "main_02002318.inc" .text - arm_func_start sub_020022C4 -sub_020022C4: ; 0x020022C4 - mov r1, #1 - str r1, [r0] - bx lr - arm_func_end sub_020022C4 - - arm_func_start sub_020022D0 -sub_020022D0: ; 0x020022D0 - ldr r3, [r0] - ldr r2, _020022F4 ; =0x5D588B65 - mul r2, r3, r2 - add r3, r2, #1 - mov r2, r3, lsr #0x10 - mul r1, r2, r1 - str r3, [r0] - mov r0, r1, lsr #0x10 - bx lr - .align 2, 0 -_020022F4: .word 0x5D588B65 - arm_func_end sub_020022D0 - - arm_func_start RandIntSafe -RandIntSafe: ; 0x020022F8 - stmdb sp!, {r4, lr} - mov r4, r0 - bl Rand16Bit - mov r0, r0, lsl #0x10 - mov r1, r0, lsr #0x10 - mul r0, r1, r4 - mov r0, r0, asr #0x10 - ldmia sp!, {r4, pc} - arm_func_end RandIntSafe - arm_func_start RandRangeSafe RandRangeSafe: ; 0x02002318 stmdb sp!, {r3, r4, r5, lr} diff --git a/asm/main_020251F0.s b/asm/main_02025230.s similarity index 90% rename from asm/main_020251F0.s rename to asm/main_02025230.s index 0f61c6c9..8fed9a76 100644 --- a/asm/main_020251F0.s +++ b/asm/main_02025230.s @@ -1,75 +1,8 @@ .include "asm/macros.inc" - .include "main_020251F0.inc" + .include "main_02025230.inc" .text - arm_func_start sub_020251F0 -sub_020251F0: ; 0x020251F0 -#ifdef JAPAN - ldr r1, _02025264 ; =_020B112C_JP - ldr r1, [r1, #4] - add r2, r1, r0, lsl #1 - ldrb r1, [r1, r0, lsl #1] - ldrb r0, [r2, #1] - add r0, r0, r1, lsl #8 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - bx lr - .align 2, 0 -_02025264: .word _020B112C_JP -#else - bx lr -#endif - arm_func_end sub_020251F0 - - arm_func_start StrncpySimpleNoPadSafe -StrncpySimpleNoPadSafe: ; 0x020251F4 -#ifdef JAPAN - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - mov r5, r1 - mov r4, r2 - b _02025294 -_0202527C: - ldrb r0, [r5], #1 - bl sub_020251F0 - mov r1, r0, asr #8 - strb r1, [r6] - strb r0, [r6, #1] - add r6, r6, #2 -_02025294: - cmp r4, #0 - sub r4, r4, #1 - ble _020252AC - ldrb r0, [r5] - cmp r0, #0 - bne _0202527C -_020252AC: - mov r0, #0 - strb r0, [r6] - ldmia sp!, {r4, r5, r6, pc} -#else - mov ip, #0x20 - b _0202520C -_020251FC: - ldrb r3, [r1], #1 - cmp r3, #0x100 - strlob r3, [r0], #1 - strhsb ip, [r0], #1 -_0202520C: - cmp r2, #0 - sub r2, r2, #1 - ble _02025224 - ldrb r3, [r1] - cmp r3, #0 - bne _020251FC -_02025224: - mov r1, #0 - strb r1, [r0] - bx lr -#endif - arm_func_end StrncpySimpleNoPadSafe - arm_func_start StrcpyName StrcpyName: ; 0x02025230 #ifdef JAPAN diff --git a/asm/main_020261F4.s b/asm/main_02026268.s similarity index 86% rename from asm/main_020261F4.s rename to asm/main_02026268.s index 8b7f0812..7b37b257 100644 --- a/asm/main_020261F4.s +++ b/asm/main_02026268.s @@ -1,52 +1,8 @@ .include "asm/macros.inc" - .include "main_020261F4.inc" + .include "main_02026268.inc" .text - arm_func_start sub_020261F4 -sub_020261F4: ; 0x020261F4 - ldr ip, _02026200 ; =sub_02020D7C - add r0, r0, #4 - bx ip - .align 2, 0 -_02026200: .word sub_02020D7C - arm_func_end sub_020261F4 - - arm_func_start sub_02026204 -sub_02026204: ; 0x02026204 - ldr ip, _02026210 ; =AnalyzeText - add r0, r0, #4 - bx ip - .align 2, 0 -_02026210: .word AnalyzeText - arm_func_end sub_02026204 - - arm_func_start DrawTextInWindow -DrawTextInWindow: ; 0x02026214 - stmdb sp!, {r3, r4, lr} - sub sp, sp, #0x124 - mov r4, r0 - str r1, [sp] - mov r1, r4 - add r0, sp, #8 - mov r4, r3 - str r2, [sp, #4] - bl sub_02025E84 - add r0, sp, #0xc - add r1, sp, #0 - bl sub_02020B60 - ldr r1, _02026264 ; =0x0000C402 - add r0, sp, #0xc - mov r2, r4 - bl sub_02020BC4 - add r0, sp, #0xc - bl AnalyzeText - add sp, sp, #0x124 - ldmia sp!, {r3, r4, pc} - .align 2, 0 -_02026264: .word 0x0000C402 - arm_func_end DrawTextInWindow - arm_func_start AppendStandardStringToMission AppendStandardStringToMission: ; 0x02026268 stmdb sp!, {r4, lr} diff --git a/asm/main_0202B568.s b/asm/main_0202B5C8.s similarity index 87% rename from asm/main_0202B568.s rename to asm/main_0202B5C8.s index 9f929512..6ab0dc85 100644 --- a/asm/main_0202B568.s +++ b/asm/main_0202B5C8.s @@ -1,43 +1,8 @@ .include "asm/macros.inc" - .include "main_0202B568.inc" + .include "main_0202B5C8.inc" .text - arm_func_start sub_0202B568 -sub_0202B568: ; 0x0202B568 - stmdb sp!, {r3, lr} - bl GetWindowContents - add r0, r0, #4 - bl GetMaxItemsOnPage - ldmia sp!, {r3, pc} - arm_func_end sub_0202B568 - - arm_func_start GetSimpleMenuResult__0202B870 -GetSimpleMenuResult__0202B870: ; 0x0202B57C - stmdb sp!, {r4, lr} - bl GetWindowContents - ldrb r1, [r0, #0x1a0] - ldr r4, [r0, #0x198] - cmp r1, #0 - beq _0202B5C0 - ldrb r1, [r0, #0x1a1] - add r0, r0, #4 - cmp r1, #0 - beq _0202B5AC - bl GetTotalNumMenuItems - b _0202B5B0 -_0202B5AC: - bl GetSelectedMenuItemIdx -_0202B5B0: - add r0, r0, r0, lsl #6 - add r0, r4, r0, lsl #2 - ldr r0, [r0, #0x100] - ldmia sp!, {r4, pc} -_0202B5C0: - mov r0, #0 - ldmia sp!, {r4, pc} - arm_func_end GetSimpleMenuResult__0202B870 - arm_func_start UpdateSimpleMenu UpdateSimpleMenu: ; 0x0202B5C8 stmdb sp!, {r4, r5, r6, lr} diff --git a/asm/main_02050300.s b/asm/main_02050300.s deleted file mode 100644 index 5e9aa045..00000000 --- a/asm/main_02050300.s +++ /dev/null @@ -1,64 +0,0 @@ - .include "asm/macros.inc" - .include "main_02050300.inc" - - .text - - arm_func_start SetItemAcquired -SetItemAcquired: ; 0x02050300 - stmdb sp!, {r4, r5, r6, lr} - ldrsh r0, [r0, #4] - bl NormalizeTreasureBox - mov r4, r0 - mov r0, r4, lsl #0x10 - mov r0, r0, asr #0x10 - bl IsItemValidVeneer - cmp r0, #0 - ldmeqia sp!, {r4, r5, r6, pc} - cmp r4, #0x3b - blt _02050380 - cmp r4, #0x41 - bgt _02050380 - sub r0, r4, #0x21 - and r0, r0, #0xff - mov r5, #1 - bl SetAdventureLogCompleted - mov r6, #0x1a - b _02050364 -_0205034C: - and r0, r6, #0xff - bl GetAdventureLogCompleted - cmp r0, #0 - moveq r5, #0 - beq _0205036C - add r6, r6, #1 -_02050364: - cmp r6, #0x20 - ble _0205034C -_0205036C: - cmp r5, #0 - beq _02050380 - mov r0, #0x15 - mov r1, #1 - bl SetResolvedPerformanceProgressFlag -_02050380: - ldr r3, _020503C8 ; =ADVENTURE_LOG_PTR - mov r0, r4, asr #4 - ldr ip, [r3] - add r0, r4, r0, lsr #27 - mov r2, r4, lsr #0x1f - rsb r1, r2, r4, lsl #27 - add lr, ip, #0x1b0 - mov ip, r0, asr #5 - ldr r4, [lr, ip, lsl #2] - add r0, r2, r1, ror #27 - mov r1, #1 - orr r0, r4, r1, lsl r0 - str r0, [lr, ip, lsl #2] - ldr r1, [r3] - ldr r0, [r1] - orr r0, r0, #8 - str r0, [r1] - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_020503C8: .word ADVENTURE_LOG_PTR - arm_func_end SetItemAcquired diff --git a/asm/main_02051504.s b/asm/main_020515C4.s similarity index 66% rename from asm/main_02051504.s rename to asm/main_020515C4.s index fd88c3ab..bb64bfa4 100644 --- a/asm/main_02051504.s +++ b/asm/main_020515C4.s @@ -1,68 +1,8 @@ .include "asm/macros.inc" - .include "main_02051504.inc" + .include "main_020515C4.inc" .text - arm_func_start RetrieveFromItemList1 -RetrieveFromItemList1: ; 0x02051504 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r0 - ldr r0, _02051564 ; =0x0000270F - mov r6, r1 - bl RandIntSafe - mov r4, r0 - ldr r0, _02051564 ; =0x0000270F - bl RandIntSafe - mov r5, r0 - ldrb r0, [r7] - cmp r0, #0xb4 - cmphs r0, #0xd3 - movhs r0, #0x55 - ldmhsia sp!, {r3, r4, r5, r6, r7, pc} - bl GetNbFloorsPlusOne - ldrb r1, [r7, #1] - cmp r1, r0 - movhs r0, #0x55 - ldmhsia sp!, {r3, r4, r5, r6, r7, pc} - mov r0, r6 - mov r1, r4 - mov r2, r5 - bl GetItemIdFromList - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_02051564: .word 0x0000270F - arm_func_end RetrieveFromItemList1 - - arm_func_start IsForbiddenFloor -IsForbiddenFloor: ; 0x02051568 - stmdb sp!, {r3, lr} - mov r1, r0 - add r0, sp, #0 - bl DungeonFloorToGroupFloor - ldrb ip, [sp] - ldrb lr, [sp, #1] - ldr r1, _020515C0 ; =MISSION_FLOORS_FORBIDDEN - mov r3, #0 -_02051588: - ldrb r0, [r1, r3, lsl #1] - mov r2, r3, lsl #1 - cmp r0, #0x64 - beq _020515B8 - cmp ip, r0 - addeq r0, r1, r2 - ldreqb r0, [r0, #1] - cmpeq lr, r0 - moveq r0, #1 - ldmeqia sp!, {r3, pc} - add r3, r3, #1 - b _02051588 -_020515B8: - mov r0, #0 - ldmia sp!, {r3, pc} - .align 2, 0 -_020515C0: .word MISSION_FLOORS_FORBIDDEN - arm_func_end IsForbiddenFloor - arm_func_start Copy16BitsTo Copy16BitsTo: ; 0x020515C4 stmdb sp!, {r3, r4, r5, lr} diff --git a/asm/overlay_29_02301D84.s b/asm/overlay_29_02301D84.s deleted file mode 100644 index 76575589..00000000 --- a/asm/overlay_29_02301D84.s +++ /dev/null @@ -1,89 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_02301D84.inc" - - .text - - arm_func_start OtherMonsterAbilityIsActive -OtherMonsterAbilityIsActive: ; 0x02301D84 -#ifdef JAPAN - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r5, r0 - mov r4, r1 - mov r7, #0 - ldr r6, _02301E14 ; =DUNGEON_PTR - b _02303354 -_023032F4: - ldr r0, [r6] - add r0, r0, r7, lsl #2 - add r0, r0, #0x12000 - ldr r8, [r0, #0xad4] - mov r0, r8 - bl EntityIsValid__023000E4 - cmp r0, #0 - cmpne r5, r8 - beq _02303348 - mov r0, r5 - mov r1, r8 - bl ShouldTreatMonsterAsAlly - cmp r0, #0 - beq _02303348 - mov r0, r5 - mov r1, r8 - mov r2, r4 - bl DefenderAbilityIsActive__02301A0C - cmp r0, #0 - movne r0, #1 - ldmneia sp!, {r4, r5, r6, r7, r8, pc} -_02303348: - add r0, r7, #1 - mov r0, r0, lsl #0x10 - mov r7, r0, asr #0x10 -_02303354: - cmp r7, #0x14 - blt _023032F4 - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -#else - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - mov r7, r0 - mov r6, r1 - mov r5, #0 - mov r4, #1 - ldr r8, _02301E14 ; =DUNGEON_PTR - b _02301E04 -_02301DA0: - ldr r0, [r8] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 - ldr sb, [r0, #0xb78] - mov r0, sb - bl EntityIsValid__023000E4 - cmp r0, #0 - cmpne r7, sb - beq _02301DF8 - mov r0, r7 - mov r1, sb - bl ShouldTreatMonsterAsAlly - cmp r0, #0 - beq _02301DF8 - mov r0, r7 - mov r1, sb - mov r2, r6 - mov r3, r4 - bl DefenderAbilityIsActive__02301A0C - cmp r0, #0 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_02301DF8: - add r0, r5, #1 - mov r0, r0, lsl #0x10 - mov r5, r0, asr #0x10 -_02301E04: - cmp r5, #0x14 - blt _02301DA0 - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -#endif - .align 2, 0 -_02301E14: .word DUNGEON_PTR - arm_func_end OtherMonsterAbilityIsActive diff --git a/asm/overlay_29_0230E064.s b/asm/overlay_29_0230E064.s deleted file mode 100644 index d569cf76..00000000 --- a/asm/overlay_29_0230E064.s +++ /dev/null @@ -1,374 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_0230E064.inc" - - .text - - arm_func_start TryRecruit -TryRecruit: ; 0x0230E064 -#ifdef JAPAN -#define TRY_RECRUIT_OFFSET -4 -#define TRY_RECRUIT_OFFSET_2 -0x2C0 -#else -#define TRY_RECRUIT_OFFSET 0 -#define TRY_RECRUIT_OFFSET_2 0 -#endif -#ifdef JAPAN - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} -#else - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} -#endif - sub sp, sp, #0x114 + TRY_RECRUIT_OFFSET - mov sl, r0 - mov r0, #0xa - mov r5, #0 - mov sb, r1 - mov r8, r2 - bl WaitUntilAlertBoxPauseIsOver - mov r0, r5 - bl ov29_0234B1A4 - bl ov29_0234D630 - add r0, sb, #4 - add r1, sl, #4 - mvn r7, #0 - bl GetDirectionTowardsPosition - mov r6, r0 - ldr r4, [sb, #0xb4] - mov r0, r5 - strb r0, [sb, #0x22] - mov r0, sl - mov r1, sb - bl ov29_02305F60 - mov r1, r6 - mov r0, sb - bl ChangeMonsterAnimationToIdle - ldrsh r0, [r4, #2] - mov r1, #1 - bl IsMonsterOnTeam - cmp r0, #0 - beq _0230E0FC - bl GetMessageLogPreprocessorArgs - mov r1, #1 - str r1, [sp] - mov r1, r5 - ldr r2, [sb, #0xb4] - mov r3, r1 - bl SetPreprocessorArgsStringToName - b _0230E114 -_0230E0FC: - bl GetMessageLogPreprocessorArgs - mov r1, r5 - str r1, [sp] - ldr r2, [sb, #0xb4] - mov r3, r1 - bl SetPreprocessorArgsStringToName -_0230E114: - bl GetMessageLogPreprocessorArgs - mov r1, r0 - mov r3, #1 - mov r2, #0 - str r3, [sp] - ldr r0, _0230E55C ; =0x00000C77 - mov r3, r2 - bl ov29_0234D7C0 - cmp r0, #2 - moveq r4, #0 - beq _0230E524 - mov r4, #1 - mov r0, #0 - orr r1, r4, #2 - strb r1, [sp, #0xac + TRY_RECRUIT_OFFSET] - strb r0, [sp, #0xad + TRY_RECRUIT_OFFSET] - ldrsh r2, [r8, #0xc] - ldr r1, _0230E560 ; =DUNGEON_PTR - sub r3, r0, #1 - strb r2, [sp, #0xae + TRY_RECRUIT_OFFSET] - strh r4, [sp, #0xb2 + TRY_RECRUIT_OFFSET] - ldr r2, [r1] - ldrh r4, [r8, #0x44] - add r1, sp, #0x14 - strh r4, [r1, #0xf2 + TRY_RECRUIT_OFFSET] - ldrh r4, [r8, #0x46] - strh r4, [r1, #0xf4 + TRY_RECRUIT_OFFSET] - strb r0, [sp, #0x104 + TRY_RECRUIT_OFFSET] - strh r3, [sp, #0xb4 + TRY_RECRUIT_OFFSET] - strh r3, [sp, #0xb6 + TRY_RECRUIT_OFFSET] - ldrsh r1, [r8] - strh r1, [sp, #0xb8 + TRY_RECRUIT_OFFSET] - ldrb r1, [r2, #0x748] - strb r1, [sp, #0xaf + TRY_RECRUIT_OFFSET] - ldrb r1, [r2, #0x749] - add r2, sp, #0xac + TRY_RECRUIT_OFFSET - strb r1, [sp, #0xb0 + TRY_RECRUIT_OFFSET] - ldrsh r1, [r8, #6] - strh r1, [sp, #0xba + TRY_RECRUIT_OFFSET] - ldrsh r1, [r8, #6] - strh r1, [sp, #0xbc + TRY_RECRUIT_OFFSET] - ldrh r1, [r8, #0x14] - strh r1, [sp, #0xf0 + TRY_RECRUIT_OFFSET] - ldrh r1, [r8, #0x16] - strh r1, [sp, #0xf2 + TRY_RECRUIT_OFFSET] - ldrh r1, [r8, #0x18] - strh r1, [sp, #0xf4 + TRY_RECRUIT_OFFSET] - ldrh r1, [r8, #0x1a] - strh r1, [sp, #0xf6 + TRY_RECRUIT_OFFSET] -_0230E1D8: - add r4, r8, r0 - ldrb r1, [r4, #8] - add r3, r2, r0 - add r0, r0, #1 - strb r1, [r3, #0x12] - ldrb r1, [r4, #0xa] - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - strb r1, [r3, #0x14] - cmp r0, #2 - blt _0230E1D8 - ldr r0, [r8, #0x10] - add r2, sp, #0xc8 + TRY_RECRUIT_OFFSET - str r0, [sp, #0xc4 + TRY_RECRUIT_OFFSET] - add r3, r8, #0x22 - mov r1, #0x11 -_0230E218: - ldrh r0, [r3], #2 - subs r1, r1, #1 - strh r0, [r2], #2 - bne _0230E218 - ldrh r0, [r8, #0x1c] - strh r0, [sp, #0xea + TRY_RECRUIT_OFFSET] - ldrh r0, [r8, #0x1e] - strh r0, [sp, #0xec + TRY_RECRUIT_OFFSET] - ldrh r0, [r8, #0x20] - strh r0, [sp, #0xee + TRY_RECRUIT_OFFSET] - ldrsh r0, [r8] - bl GetNameString - mov r1, r0 - add r0, sp, #0x100 - add r0, r0, #0xa + TRY_RECRUIT_OFFSET - mov r2, #0xa - bl StrncpyName - ldrsh r1, [sp, #0xb8 + TRY_RECRUIT_OFFSET] - ldrsh r2, [sp, #0xb2 + TRY_RECRUIT_OFFSET] - add r0, sp, #0xf8 + TRY_RECRUIT_OFFSET - bl EnableAllLearnableIqSkills - add r1, sp, #0x100 - add r0, sp, #0x98 - add r1, r1, #0xa + TRY_RECRUIT_OFFSET -#ifdef JAPAN - add r4, sp, #0x18 - bl StrcpySimple -#else - mov r2, #0xa - add r4, sp, #0x18 - bl StrncpySimpleNoPad -#endif - bl ov29_022EACAC - bl GetMessageLogPreprocessorArgs - mov r1, r0 - mov r0, #1 - str r0, [sp] - mov r2, #0 - ldr r0, _0230E564 ; =0x00000C7B - mov r3, r2 - bl ov29_0234D7C0 - cmp r0, #1 - bne _0230E2D4 - bl ov29_0234D838 - add r6, sp, #0x100 - add r6, r6, #0xa + TRY_RECRUIT_OFFSET -_0230E2BC: - mov r0, r6 - add r1, sp, #0x98 - mov r2, #0 - bl DungeonModeSetupAndShowNameKeyboard - cmp r0, #0 - beq _0230E2BC -_0230E2D4: - add r1, sp, #0xac + TRY_RECRUIT_OFFSET - mov r0, r4 - bl GetRecoloredTeamMemberName - mov r1, r4 - mov r0, #0 - bl SetMessageLogPreprocessorArgsString - mov r0, #1 - mov r1, #0 - bl SetPreprocessorArgsIdVal - ldr r0, _0230E568 ; =0x00000C7E - bl ov29_0230E658 - ldrsh r1, [r8, #2] - ldrsh r2, [r8, #4] - mov r0, sb - bl RemoveMonsterFromTile - ldrsh r2, [r8, #2] - ldrsh r3, [r8, #4] - mov r0, sl - mov r1, sb - bl ov29_0230E5A8 - cmp r0, #0 - bne _0230E42C - add r0, sp, #0xac + TRY_RECRUIT_OFFSET - mvn r1, #0 - bl ov29_0230E5FC - mov r7, r0 - b _0230E410 -_0230E340: - ldr r0, _0230E56C ; =0x00000C7F - bl ov29_0230E658 - mvn r4, #0 -_0230E34C: - bl ov29_0234D838 - add r1, sp, #0x100 - mov r0, sb - add r1, r1, #0xa + TRY_RECRUIT_OFFSET - bl ov29_0234EE10 - movs r6, r0 - beq _0230E3D4 - cmp r6, sb - add r0, sp, #0x58 - bne _0230E380 - add r1, sp, #0xac + TRY_RECRUIT_OFFSET - bl GetRecoloredTeamMemberName - b _0230E38C -_0230E380: - ldr r1, [r6, #0xb4] - ldrsh r1, [r1, #0xc] - bl GetRecoloredNameOfTeamMemberAtIdx -_0230E38C: - mov r0, #0 - add r1, sp, #0x58 - bl SetMessageLogPreprocessorArgsString - mov r0, #1 - mov r1, sl - mov r2, #0 - bl SubstitutePlaceholderStringTags - bl GetMessageLogPreprocessorArgs - mov r1, #1 - mov r2, #0 - str r1, [sp] - mov r1, r0 - mov r0, #0xc80 + TRY_RECRUIT_OFFSET_2 - mov r3, r2 - bl ov29_0234D7C0 - mov fp, r0 - cmp fp, r4 - beq _0230E34C -_0230E3D4: - cmp fp, #2 - cmpne r6, #0 - beq _0230E410 - ldr r0, _0230E56C ; =0x00000C7F - add r0, r0, #2 - bl ov29_0230E658 - mov r0, r6 - bl ov29_022E68BC - ldr r1, _0230E570 ; =0x00000233 - mov r0, r6 - mov r2, sl - bl HandleFaint - cmp r6, sb - moveq r4, #1 - beq _0230E524 -_0230E410: - mov r0, sl - mov r1, sb - ldrsh r2, [r8, #2] - ldrsh r3, [r8, #4] - bl ov29_0230E5A8 - cmp r0, #0 - beq _0230E340 -_0230E42C: - mov r6, #0 - mov r4, r6 - mov r5, #1 - b _0230E468 -_0230E43C: - mov r0, r6 - bl GetActiveTeamMember - ldrb r0, [r0] - tst r0, #1 - movne r0, r5 - moveq r0, r4 - tst r0, #0xff - beq _0230E470 - add r0, r6, #1 - mov r0, r0, lsl #0x10 - mov r6, r0, asr #0x10 -_0230E468: - cmp r6, #4 - blt _0230E43C -_0230E470: - add r0, sp, #0xac + TRY_RECRUIT_OFFSET - mov r1, r7 - strh r6, [sp, #0xb6 + TRY_RECRUIT_OFFSET] - bl ov29_0230E5FC - strh r0, [sp, #0xb4 + TRY_RECRUIT_OFFSET] - ldrsh r1, [sp, #0xb4 + TRY_RECRUIT_OFFSET] - mov r0, r6 - bl sub_02056698 - ldr r1, _0230E570 ; =0x00000233 - mov r0, sb - mov r2, sl - bl HandleFaint - mov r0, r6 - bl GetActiveTeamMember - mov r4, r0 - add r7, sp, #0xac + TRY_RECRUIT_OFFSET - mov r6, r4 - mov r5, #6 -_0230E4B8: - ldmia r7!, {r0, r1, r2, r3} - stmia r6!, {r0, r1, r2, r3} - subs r5, r5, #1 - bne _0230E4B8 - ldmia r7, {r0, r1} - stmia r6, {r0, r1} - bl ov29_022E8104 - bl ov29_022E81F8 - add r1, sp, #0x14 - mov r0, #0 - str r1, [sp] - str r0, [sp, #4] - mov r0, #1 - str r0, [sp, #8] - str r0, [sp, #0xc] - str r0, [sp, #0x10] - ldrsh r0, [r8] - ldrsh r1, [r8, #2] - ldrsh r2, [r8, #4] - mov r3, r4 - bl InitTeamMember - ldrsh r0, [r4, #0xc] - bl SetPokemonJoined - bl ov29_022E8104 - bl ov29_022E81F8 - ldr r5, [sp, #0x14] - mov r4, #1 -_0230E524: - mov r0, #1 - bl ov29_0234D8A0 - cmp r4, #0 - bne _0230E540 - ldr r1, _0230E574 ; =0x00000C78 - mov r0, sl - bl LogMessageByIdWithPopupCheckUser -_0230E540: - cmp r5, #0 - beq _0230E550 - mov r0, r5 - bl EnsureCanStandCurrentTile -_0230E550: - mov r0, r4 - add sp, sp, #0x114 + TRY_RECRUIT_OFFSET -#ifdef JAPAN - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -#else - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} -#endif - .align 2, 0 -_0230E55C: .word 0x00000C77 + TRY_RECRUIT_OFFSET_2 -_0230E560: .word DUNGEON_PTR -_0230E564: .word 0x00000C7B + TRY_RECRUIT_OFFSET_2 -_0230E568: .word 0x00000C7E + TRY_RECRUIT_OFFSET_2 -_0230E56C: .word 0x00000C7F + TRY_RECRUIT_OFFSET_2 -_0230E570: .word 0x00000233 -_0230E574: .word 0x00000C78 + TRY_RECRUIT_OFFSET_2 - arm_func_end TryRecruit diff --git a/asm/overlay_29_0230F9A4.s b/asm/overlay_29_0230F9A4.s deleted file mode 100644 index b84e6d22..00000000 --- a/asm/overlay_29_0230F9A4.s +++ /dev/null @@ -1,149 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_0230F9A4.inc" - - .text - - arm_func_start ov29_0230F9A4 -ov29_0230F9A4: ; 0x0230F9A4 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - bl IsMonster__0230F980 - 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} - mov r0, r4 - bl ov29_0234908C - ldmia sp!, {r3, r4, r5, pc} - arm_func_end ov29_0230F9A4 - - arm_func_start TrySpawnEnemyItemDrop -TrySpawnEnemyItemDrop: ; 0x0230F9D8 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - sub sp, sp, #8 - ldr r2, _0230FB28 ; =DUNGEON_PTR - mov r6, r0 - ldr r0, [r2] - mov r5, r1 - ldrb r0, [r0, #0x748] - bl TreasureBoxDropsEnabled - cmp r0, #0 - ldrne r4, [r5, #0xb4] - ldrneb r0, [r4, #6] - cmpne r0, #0 - beq _0230FB20 - ldr r0, [r6] - mov r7, #0 - cmp r0, #1 - bne _0230FA54 - mov r0, r6 - mov r1, #0x43 - bl IqSkillIsEnabled - cmp r0, #0 - addne r0, r7, #1 - movne r0, r0, lsl #0x10 - movne r7, r0, asr #0x10 - mov r0, r6 - mov r1, #0x56 - bl ExclusiveItemEffectIsActive__0230F8AC - cmp r0, #0 - addne r0, r7, #1 - movne r0, r0, lsl #0x10 - movne r7, r0, asr #0x10 -_0230FA54: - ldrsh r1, [r4, #2] - add r0, sp, #0 - mov r2, r7 - bl TryGenerateUnownStoneDrop - cmp r0, #0 - beq _0230FA84 - add r2, sp, #0 - mov r0, r5 - add r1, r5, #4 - mov r3, #1 - bl SpawnDroppedItemWrapper - b _0230FB20 -_0230FA84: - mov r0, r6 - mov r1, #0x75 - bl AbilityIsActiveVeneer - mov r2, r0 - add r0, sp, #0 - mov r1, r5 - mov r3, r7 - bl ov29_023460DC - cmp r0, #0 - beq _0230FAC4 - add r2, sp, #0 - mov r0, r5 - add r1, r5, #4 - mov r3, #1 - bl SpawnDroppedItemWrapper - b _0230FB20 -_0230FAC4: - mov r0, r6 - bl IsMonster__0230F980 - cmp r0, #0 - beq _0230FB20 - mov r0, r6 - mov r1, #0x62 - bl ExclusiveItemEffectIsActive__0230F8AC - cmp r0, #0 - beq _0230FB20 - ldr r0, _0230FB2C ; =ov10_022C4650 - ldrsh r0, [r0] - bl DungeonRandOutcome__022EAB20 - cmp r0, #0 - beq _0230FB20 - add r0, sp, #0 - mov r1, #0xb7 - mov r2, #2 - bl GenerateStandardItem - add r2, sp, #0 - mov r0, r5 - add r1, r5, #4 - mov r3, #1 - bl SpawnDroppedItemWrapper -_0230FB20: - add sp, sp, #8 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_0230FB28: .word DUNGEON_PTR -_0230FB2C: .word ov10_022C4650 - arm_func_end TrySpawnEnemyItemDrop - - arm_func_start ov29_0230FB30 -ov29_0230FB30: ; 0x0230FB30 - stmdb sp!, {r3, r4, r5, lr} - ldr r1, _0230FB88 ; =ov29_023529A8 - mov r5, r0 - ldrh r2, [r1] - add r0, sp, #0 - strh r2, [sp] - ldrh r1, [r1, #2] - strh r1, [sp, #2] - bl ov29_02347184 - movs r4, r0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - mov r1, r4 - mov r0, #0 - bl ov29_02344B9C - ldr r1, _0230FB8C ; =0x00000F62 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0230FB88: .word ov29_023529A8 -#ifdef JAPAN -_0230FB8C: .word 0x000009B6 -#else -_0230FB8C: .word 0x00000F62 -#endif - arm_func_end ov29_0230FB30 diff --git a/asm/overlay_29_0230FB30.s b/asm/overlay_29_0230FB30.s new file mode 100644 index 00000000..81fcd045 --- /dev/null +++ b/asm/overlay_29_0230FB30.s @@ -0,0 +1,37 @@ + .include "asm/macros.inc" + .include "overlay_29_0230FB30.inc" + + .text + + arm_func_start ov29_0230FB30 +ov29_0230FB30: ; 0x0230FB30 + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _0230FB88 ; =ov29_023529A8 + mov r5, r0 + ldrh r2, [r1] + add r0, sp, #0 + strh r2, [sp] + ldrh r1, [r1, #2] + strh r1, [sp, #2] + bl ov29_02347184 + movs r4, r0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, #0 + mov r1, r5 + mov r2, r0 + bl SubstitutePlaceholderStringTags + mov r1, r4 + mov r0, #0 + bl ov29_02344B9C + ldr r1, _0230FB8C ; =0x00000F62 + mov r0, r5 + bl LogMessageByIdWithPopupCheckUser + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_0230FB88: .word ov29_023529A8 +#ifdef JAPAN +_0230FB8C: .word 0x000009B6 +#else +_0230FB8C: .word 0x00000F62 +#endif + arm_func_end ov29_0230FB30 diff --git a/asm/overlay_29_0231B1B8.s b/asm/overlay_29_0231B1B8.s deleted file mode 100644 index 3138c917..00000000 --- a/asm/overlay_29_0231B1B8.s +++ /dev/null @@ -1,108 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_0231B1B8.inc" - - .text - - arm_func_start TryActivateBadDreams -TryActivateBadDreams: ; 0x0231B1B8 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x50 - mov sl, r0 - ldr r0, [sl, #0xb4] - mov r6, #0 - ldrb r0, [r0, #6] - ldr r4, _0231B30C ; =DUNGEON_PTR - mov r7, #0 - cmp r0, #0 - moveq r0, #1 - movne r0, r6 - and sb, r0, #0xff - add r5, sp, #0 -_0231B1EC: - ldr r0, [r4] - add r0, r0, r7, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r8, [r0, #0xad4] -#else - ldr r8, [r0, #0xb78] -#endif - mov r0, r8 - bl IsMonster__0231B318 - cmp r0, #0 - beq _0231B240 - ldr r0, [r8, #0xb4] - cmp sb, #0 - ldrb r0, [r0, #6] - beq _0231B228 - cmp r0, #0 - beq _0231B240 - b _0231B230 -_0231B228: - cmp r0, #0 - bne _0231B240 -_0231B230: - add r0, r6, #1 - mov r0, r0, lsl #0x10 - str r8, [r5, r6, lsl #2] - mov r6, r0, asr #0x10 -_0231B240: - add r0, r7, #1 - mov r0, r0, lsl #0x10 - mov r7, r0, asr #0x10 - cmp r7, #0x14 - blt _0231B1EC - mov r0, #2 - mov r1, #0x69 - bl SetPreprocessorArgsIdVal - ldr r0, _0231B310 ; =ov10_022C4530 - mov r8, #0 - ldrsh r7, [r0] - mov r4, #0x18 - ldr fp, _0231B314 ; =0x0000026E - add r5, sp, #0 - b _0231B2FC -_0231B27C: - ldr sb, [r5, r8, lsl #2] - cmp sb, #0 - beq _0231B2F0 - mov r0, sb - bl IsMonster__0231B318 - cmp r0, #0 - beq _0231B2F0 - mov r0, sl - mov r1, sb - bl IsValidTargetEntity - cmp r0, #0 - cmpne sl, sb - beq _0231B2F0 - mov r0, sb - bl IsMonsterSleeping - cmp r0, #0 - beq _0231B2F0 - mov r0, sb - mov r1, r7 - mov r2, r4 - mov r3, fp - bl ApplyDamageAndEffectsWrapper - mov r0, sb - bl EntityIsValid__0231B194 - cmp r0, #0 - beq _0231B2F0 - mov r0, sl - mov r1, sb - bl TryEndPetrifiedOrSleepStatus -_0231B2F0: - add r0, r8, #1 - mov r0, r0, lsl #0x10 - mov r8, r0, asr #0x10 -_0231B2FC: - cmp r8, r6 - blt _0231B27C - add sp, sp, #0x50 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0231B30C: .word DUNGEON_PTR -_0231B310: .word ov10_022C4530 -_0231B314: .word 0x0000026E - arm_func_end TryActivateBadDreams diff --git a/asm/overlay_29_0231EDFC.s b/asm/overlay_29_0231EDFC.s deleted file mode 100644 index e03673be..00000000 --- a/asm/overlay_29_0231EDFC.s +++ /dev/null @@ -1,534 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_0231EDFC.inc" - - .text - - arm_func_start TryHurl -TryHurl: ; 0x0231EDFC - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0xf4 - mov r5, r0 - mov r4, r1 - cmp r5, r4 - beq _0231EE54 - cmp r5, #0 - moveq r0, #0 - beq _0231EE34 - ldr r0, [r5] - cmp r0, #1 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff -_0231EE34: - cmp r0, #0 - beq _0231EE54 - mov r0, r5 - mov r1, #0x53 - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r0, #0 - bne _0231EE60 -_0231EE54: - mov r0, r4 - mov r1, #0xe - bl AbilityIsActiveVeneer -_0231EE60: - cmp r0, #0 - beq _0231EE8C - mov r0, #0 - mov r1, r4 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _0231F544 ; =0x00000E45 - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231F53C -_0231EE8C: - cmp r5, r4 - bne _0231EEB8 - mov r0, #0 - mov r1, r4 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _0231F548 ; =0x00000E46 - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231F53C -_0231EEB8: - ldrh r0, [r4, #4] - mov sl, #0 - mov r8, sl - strh r0, [sp, #0x40] - ldrh r0, [r4, #6] - strh r0, [sp, #0x42] - b _0231F098 -_0231EED4: - mov sl, #0 - ldr fp, _0231F54C ; =DIRECTIONS_XY - mov r6, sl -_0231EEE0: - ldr r0, _0231F550 ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, r6, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr sb, [r0, #0xad4] -#else - ldr sb, [r0, #0xb78] -#endif - mov r0, sb - bl EntityIsValid__0231F570 - cmp r0, #0 - cmpne r5, sb - cmpne r4, sb - beq _0231F080 - mov r0, r5 - mov r1, sb - bl CanSeeTarget - cmp r0, #0 - beq _0231F080 - cmp r8, #0 - mov r0, r5 - mov r2, #0 - mov r1, sb - mov r3, #1 - bne _0231EF48 - bl GetTreatmentBetweenMonsters - cmp r0, #1 - bne _0231F080 - b _0231EF54 -_0231EF48: - bl GetTreatmentBetweenMonsters - cmp r0, #0 - bne _0231F080 -_0231EF54: - cmp r8, #0 - mov r7, #0 - bne _0231EFF8 - b _0231EFBC -_0231EF64: - mov r0, r7, lsl #2 - ldrsh r1, [fp, r0] - ldrsh r3, [sb, #4] - add r0, fp, r7, lsl #2 - ldrsh r2, [r0, #2] - add r0, r3, r1 - strh r0, [sp, #0x34] - ldrsh r3, [sb, #6] - mov r0, r4 - add r1, sp, #0x34 - add r2, r3, r2 - strh r2, [sp, #0x36] - bl CannotMoveToTile - cmp r0, #0 - bne _0231EFB8 - ldrsh r0, [sp, #0x34] - ldrsh r1, [sp, #0x36] - bl GetTile - ldrh r0, [r0] - tst r0, #0x800 - beq _0231EFC4 -_0231EFB8: - add r7, r7, #1 -_0231EFBC: - cmp r7, #8 - blt _0231EF64 -_0231EFC4: - cmp r7, #8 - beq _0231F080 - cmp sl, #0x28 - bge _0231F080 - ldrh r1, [sb, #4] - mov r3, sl, lsl #2 - add r0, sp, #0x54 - add r2, r0, r3 - strh r1, [r0, r3] - ldrh r0, [sb, #6] - add sl, sl, #1 - strh r0, [r2, #2] - b _0231F080 -_0231EFF8: - mov r0, r7, lsl #2 - ldrsh r1, [fp, r0] - ldrsh r3, [sb, #4] - add r0, fp, r7, lsl #2 - ldrsh r2, [r0, #2] - add r0, r3, r1 - strh r0, [sp, #0x30] - ldrsh r3, [sb, #6] - mov r0, r4 - add r1, sp, #0x30 - add r2, r3, r2 - strh r2, [sp, #0x32] - bl CannotMoveToTile - cmp r0, #0 - bne _0231F074 - ldrsh r0, [sp, #0x30] - ldrsh r1, [sp, #0x32] - bl GetTile - ldrh r0, [r0] - tst r0, #0x800 - bne _0231F074 - cmp sl, #0x28 - bge _0231F074 - ldrh r3, [sp, #0x30] - ldrh r2, [sp, #0x32] - mov r0, sl, lsl #2 - add r1, sp, #0x54 - add ip, r1, r0 - strh r3, [r1, r0] - add sl, sl, #1 - strh r2, [ip, #2] -_0231F074: - add r7, r7, #1 - cmp r7, #8 - blt _0231EFF8 -_0231F080: - add r6, r6, #1 - cmp r6, #0x14 - blt _0231EEE0 - cmp sl, #0 - bne _0231F0A0 - add r8, r8, #1 -_0231F098: - cmp r8, #2 - blt _0231EED4 -_0231F0A0: - cmp sl, #0 - beq _0231F0D0 - mov r0, sl - bl DungeonRandInt - add r1, sp, #0x54 - mov r2, r0, lsl #2 - add r0, r1, r0, lsl #2 - ldrh r1, [r1, r2] - ldrh r0, [r0, #2] - strh r1, [sp, #0x40] - strh r0, [sp, #0x42] - b _0231F178 -_0231F0D0: - mov r0, r5 - bl HasDropeyeStatus - mov r2, r0 - add r1, sp, #0x44 - add r0, r5, #4 - bl ov29_022E9298 - mov r7, #0 - add r6, sp, #0x2c - b _0231F154 -_0231F0F4: - ldr r0, [sp, #0x44] - ldr r1, [sp, #0x4c] - bl DungeonRandRange - strh r0, [sp, #0x2c] - ldr r0, [sp, #0x48] - ldr r1, [sp, #0x50] - bl DungeonRandRange - strh r0, [sp, #0x2e] - mov r0, r4 - mov r1, r6 - bl CannotMoveToTile - cmp r0, #0 - bne _0231F150 - ldrsh r0, [sp, #0x2c] - ldrsh r1, [sp, #0x2e] - bl GetTile - ldrh r0, [r0] - tst r0, #0x800 - ldreqh r1, [sp, #0x2c] - ldreqh r0, [sp, #0x2e] - streqh r1, [sp, #0x40] - streqh r0, [sp, #0x42] - beq _0231F15C -_0231F150: - add r7, r7, #1 -_0231F154: - cmp r7, #0x64 - blt _0231F0F4 -_0231F15C: - cmp r7, #0x64 - bne _0231F178 - ldr r2, _0231F554 ; =0x00000E48 - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231F53C -_0231F178: - mov r0, #0 - mov r1, r4 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _0231F558 ; =0x00000E47 - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, r4 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _0231F1B0 - ldr r0, _0231F55C ; =0x00000212 - bl PlaySeByIdIfNotSilence -_0231F1B0: - ldrsh r3, [sp, #0x42] - ldrsh r2, [r4, #6] - ldrsh r1, [sp, #0x40] - ldrsh r0, [r4, #4] - sub r2, r3, r2 - ldr r6, [r4, #0xb4] - sub r0, r1, r0 - cmp r0, r2 - movle r0, r2 - mov sb, r0, lsl #4 - cmp sb, #0x50 - movgt sb, #0x50 - cmp sb, #0xa - add r0, sp, #0x40 - add r1, r4, #4 - ldrb r8, [r6, #0x4c] - mov r7, #0 - movlt sb, #0xa - bl GetDirectionTowardsPosition - mov r6, r0 - ldr r0, _0231F54C ; =DIRECTIONS_XY - mov r1, r6, lsl #2 - ldrsh r0, [r0, r1] - mov r1, #3 - mov r0, r0, lsl #8 - bl _s32_div_f - ldrsh sl, [sp, #0x40] - mov r1, #0x18 - ldr r2, _0231F560 ; =DIRECTIONS_XY + 2 - mov r3, r6, lsl #2 - smulbb r1, sl, r1 - add r1, r1, #0xc - add r6, r0, r1, lsl #8 - ldrsh r2, [r2, r3] - mov r1, #3 - mov r0, r2, lsl #8 - bl _s32_div_f - ldrsh r2, [sp, #0x42] - mov r1, #0x18 - ldr sl, [r4, #0xc] - smulbb r1, r2, r1 - add r1, r1, #0x10 - add fp, r0, r1, lsl #8 - ldr r0, [r4, #0x10] - mov r1, sb - sub r0, fp, r0 - bl _s32_div_f - str sl, [sp, #0x38] - ldr r1, [r4, #0x10] - str r0, [sp, #0x18] - sub r0, r6, sl - str r1, [sp, #0x3c] - mov r1, sb - mov sl, #0 - bl _s32_div_f - str r0, [sp, #0x1c] - b _0231F31C -_0231F294: - ldr r2, [sp, #0x38] - ldr r0, [sp, #0x1c] - ldr r1, [sp, #0x3c] - add r0, r2, r0 - str r0, [sp, #0x38] - ldr r0, [sp, #0x18] - add r0, r1, r0 - str r0, [sp, #0x3c] - mov r0, r4 - add r1, sp, #0x38 - bl UpdateEntityPixelPos - mov r0, r4 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _0231F308 - mov r0, r7 - bl SinAbs4096 - mov r0, r0, lsl #5 - str r0, [r4, #0x1c] - mov r0, #0x3b - bl AdvanceFrame - tst sl, #3 - bne _0231F308 - and r8, r8, #7 - mov r0, r4 - mov r1, #6 - mov r2, r8 - bl ChangeMonsterAnimation - add r8, r8, #1 -_0231F308: - mov r0, #0x800 - mov r1, sb - bl _s32_div_f - add r7, r7, r0 - add sl, sl, #1 -_0231F31C: - cmp sl, sb - blt _0231F294 - add r1, sp, #0x38 - mov r0, r4 - str r6, [sp, #0x38] - str fp, [sp, #0x3c] - mov r2, #0 - str r2, [r4, #0x1c] - bl UpdateEntityPixelPos - mov r0, #0x3b - bl AdvanceFrame - ldr r0, [r4, #0xb4] - and r1, r8, #7 - strb r1, [r0, #0x4c] - ldrsh r0, [sp, #0x40] - ldrsh r1, [sp, #0x42] - bl GetTile - ldr r7, [r0, #0xc] - mov r0, r7 - bl EntityIsValid__0231F570 - cmp r0, #0 - bne _0231F394 - ldrsh r1, [sp, #0x40] - ldrsh r2, [sp, #0x42] - mov r0, r4 - mov r3, #1 - bl MoveMonsterToPos - mov r0, r4 - bl ov29_02321238 - b _0231F53C -_0231F394: - mov r8, #0 - ldr r6, _0231F54C ; =DIRECTIONS_XY - add sb, sp, #0x28 - b _0231F40C -_0231F3A4: - mov r1, r8, lsl #2 - add r0, r6, r8, lsl #2 - ldrsh sl, [sp, #0x40] - ldrsh r3, [r6, r1] - ldrsh r2, [sp, #0x42] - ldrsh r1, [r0, #2] - add r3, sl, r3 - mov r0, r4 - add r2, r2, r1 - mov r1, sb - strh r3, [sp, #0x28] - strh r2, [sp, #0x2a] - bl CannotMoveToTile - cmp r0, #0 - bne _0231F408 - ldrsh r0, [sp, #0x28] - ldrsh r1, [sp, #0x2a] - bl GetTile - ldrh r0, [r0] - tst r0, #0x800 - ldreqh r1, [sp, #0x28] - ldreqh r0, [sp, #0x2a] - streqh r1, [sp, #0x40] - streqh r0, [sp, #0x42] - beq _0231F414 -_0231F408: - add r8, r8, #1 -_0231F40C: - cmp r8, #8 - blt _0231F3A4 -_0231F414: - cmp r8, #8 - bne _0231F434 - mov r2, #0 - mov r0, r5 - mov r1, r4 - mov r3, r2 - bl TryWarp - b _0231F454 -_0231F434: - add r1, sp, #0x40 - mov r0, r4 - bl ov29_0232033C - ldrsh r1, [sp, #0x40] - ldrsh r2, [sp, #0x42] - mov r0, r4 - mov r3, #1 - bl MoveMonsterToPos -_0231F454: - ldr r0, [r7] - cmp r0, #1 - bne _0231F4D4 - ldr r1, _0231F564 ; =0x00000163 - add r0, sp, #0x20 - bl InitMove - add r1, sp, #0x20 - mov r0, r7 - bl TwoTurnMoveForcedMiss - cmp r0, #0 - bne _0231F4B4 - mov r3, #0 - str r3, [sp] - ldr r0, _0231F568 ; =HURL_DAMAGE - ldr r1, _0231F56C ; =0x00000259 - str r3, [sp, #4] - str r1, [sp, #8] - str r3, [sp, #0xc] - str r3, [sp, #0x10] - ldrsh r2, [r0] - mov r0, r5 - mov r1, r7 - str r3, [sp, #0x14] - bl CalcDamageFixedNoCategory -_0231F4B4: - mov r0, r7 - bl EntityIsValid__0231F570 - cmp r0, #0 - beq _0231F4D4 - ldr r1, [r7, #0xb4] - mov r0, r7 - ldrb r1, [r1, #0x4c] - bl ChangeMonsterAnimationToIdle -_0231F4D4: - mov r3, #0 - str r3, [sp] - ldr r0, _0231F568 ; =HURL_DAMAGE - str r3, [sp, #4] - mov r1, #0x258 - str r1, [sp, #8] - str r3, [sp, #0xc] - str r3, [sp, #0x10] - ldrsh r2, [r0] - mov r0, r5 - mov r1, r4 - str r3, [sp, #0x14] - bl CalcDamageFixedNoCategory - mov r0, r4 - bl EntityIsValid__0231F570 - cmp r0, #0 - beq _0231F528 - ldr r1, [r4, #0xb4] - mov r0, r4 - ldrb r1, [r1, #0x4c] - bl ChangeMonsterAnimationToIdle -_0231F528: - mov r0, #0x1e - mov r1, #0x3b - bl ov29_022EA370 - mov r0, r4 - bl ov29_02321238 -_0231F53C: - add sp, sp, #0xf4 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -#ifdef JAPAN -#define OV29_0231EDFC_OFFSET -0x2BF -#else -#define OV29_0231EDFC_OFFSET 0 -#endif -_0231F544: .word 0x00000E45 + OV29_0231EDFC_OFFSET -_0231F548: .word 0x00000E46 + OV29_0231EDFC_OFFSET -_0231F54C: .word DIRECTIONS_XY -_0231F550: .word DUNGEON_PTR -_0231F554: .word 0x00000E48 + OV29_0231EDFC_OFFSET -_0231F558: .word 0x00000E47 + OV29_0231EDFC_OFFSET -_0231F55C: .word 0x00000212 -_0231F560: .word DIRECTIONS_XY + 2 -_0231F564: .word 0x00000163 -_0231F568: .word HURL_DAMAGE -_0231F56C: .word 0x00000259 - arm_func_end TryHurl diff --git a/asm/overlay_29_0234B130.s b/asm/overlay_29_0234B130.s deleted file mode 100644 index 587f4e7d..00000000 --- a/asm/overlay_29_0234B130.s +++ /dev/null @@ -1,171 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_0234B130.inc" - - .text - - arm_func_start ov29_0234B130 -ov29_0234B130: ; 0x0234B130 - stmdb sp!, {r3, lr} - mov r3, #0 - ldr r1, _0234B1A0 ; =MESSAGE_LOG_INFO - mov r0, r3 -_0234B140: - ldr r2, [r1, #4] - add r2, r2, r3 - add r3, r3, #1 - strb r0, [r2, #0xc80] - cmp r3, #0xa - blt _0234B140 - ldr r1, _0234B1A0 ; =MESSAGE_LOG_INFO - mvn ip, #1 - ldr r3, [r1, #4] - mov r2, #1 - strb ip, [r3, #0xcec] - ldr r3, [r1, #4] - strb r0, [r3, #0xcee] - ldr r3, [r1, #4] - strb r0, [r3, #0xced] - str r0, [r1, #8] - strb r2, [r1] - bl ov29_0234B1A4 - ldr r0, _0234B1A0 ; =MESSAGE_LOG_INFO - ldr r0, [r0, #4] - add r0, r0, #0x9c - add r0, r0, #0xc00 - bl InitPreprocessorArgs - ldmia sp!, {r3, pc} - .align 2, 0 -_0234B1A0: .word MESSAGE_LOG_INFO - arm_func_end ov29_0234B130 - - arm_func_start ov29_0234B1A4 -ov29_0234B1A4: ; 0x0234B1A4 - stmdb sp!, {r4, lr} - mov r4, r0 - bl ov29_022E9FC0 - cmp r0, #0 - ldmeqia sp!, {r4, pc} - mov ip, #0 - ldr r2, _0234B24C ; =MESSAGE_LOG_INFO - mov r0, ip -_0234B1C4: - ldr r3, [r2, #4] - add r1, ip, ip, lsl #2 - add ip, ip, #1 - strb r0, [r3, r1, lsl #6] - cmp ip, #0xa - blt _0234B1C4 - ldr r2, _0234B24C ; =MESSAGE_LOG_INFO - mov r3, #4 - ldr r1, [r2, #4] - strb r0, [r1, #0xc8b] - ldr r1, [r2, #4] - add r1, r1, #0xc00 - strh r0, [r1, #0x8c] - ldr r1, [r2, #4] - add r1, r1, #0xc00 - strh r0, [r1, #0x8e] - ldr r1, [r2, #4] - add r1, r1, #0xc00 - strh r0, [r1, #0x90] - ldr r1, [r2, #4] - add r1, r1, #0xc00 - strh r3, [r1, #0x92] - ldr r1, [r2, #4] - str r0, [r1, #0xc98] - bl FullyCloseAlertBox - cmp r0, #0 - cmpne r4, #0 - ldmeqia sp!, {r4, pc} - mov r0, #0 - mov r1, r0 - bl UnkMapRelatedFunc - mov r0, #0xb - bl AdvanceFrame - ldmia sp!, {r4, pc} - .align 2, 0 -_0234B24C: .word MESSAGE_LOG_INFO - arm_func_end ov29_0234B1A4 - - arm_func_start LogMessageByIdWithPopupCheckParticipants -LogMessageByIdWithPopupCheckParticipants: ; 0x0234B250 - stmdb sp!, {r3, lr} - ldr ip, _0234B290 ; =MESSAGE_LOG_INFO - cmp r1, #0 - ldr ip, [ip, #4] - ldrsh lr, [sp, #8] - add r3, ip, r3, lsl #2 - cmpne r0, #0 - str lr, [r3, #0xcac] - beq _0234B27C - bl LogMessageByIdWithPopupCheckUserTarget - ldmia sp!, {r3, pc} -_0234B27C: - cmp r0, #0 - ldmeqia sp!, {r3, pc} - mov r1, r2 - bl LogMessageByIdWithPopupCheckUser - ldmia sp!, {r3, pc} - .align 2, 0 -_0234B290: .word MESSAGE_LOG_INFO - arm_func_end LogMessageByIdWithPopupCheckParticipants - - arm_func_start WaitUntilAlertBoxTextIsLoadedWrapper -WaitUntilAlertBoxTextIsLoadedWrapper: ; 0x0234B294 - ldr ip, _0234B2A0 ; =WaitUntilAlertBoxTextIsLoaded - mov r0, #0x50 - bx ip - .align 2, 0 -_0234B2A0: .word WaitUntilAlertBoxTextIsLoaded - arm_func_end WaitUntilAlertBoxTextIsLoadedWrapper - - arm_func_start LogMessageByIdWithPopupCheckUser -LogMessageByIdWithPopupCheckUser: ; 0x0234B2A4 - stmdb sp!, {r4, r5, r6, lr} - mov r4, #0 - mov r6, r0 - mov r5, r1 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - movne r4, #1 - cmp r4, #0 - ldmeqia sp!, {r4, r5, r6, pc} - mov r0, r5 - bl StringFromId - mov r1, r0 - mov r0, r6 - mov r2, #1 - bl LogMessage - ldmia sp!, {r4, r5, r6, pc} - arm_func_end LogMessageByIdWithPopupCheckUser - - arm_func_start LogMessageWithPopupCheckUser -LogMessageWithPopupCheckUser: ; 0x0234B2E4 - stmdb sp!, {r4, r5, r6, lr} - mov r4, #0 - mov r6, r0 - mov r5, r1 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - movne r4, #1 - cmp r4, #0 - ldmeqia sp!, {r4, r5, r6, pc} - mov r0, r6 - mov r1, r5 - mov r2, #1 - bl LogMessage - ldmia sp!, {r4, r5, r6, pc} - arm_func_end LogMessageWithPopupCheckUser - - arm_func_start LogMessageByIdQuiet -LogMessageByIdQuiet: ; 0x0234B31C - stmdb sp!, {r4, lr} - mov r4, r0 - mov r0, r1 - bl StringFromId - mov r1, r0 - mov r0, r4 - mov r2, #0 - bl LogMessage - ldmia sp!, {r4, pc} - arm_func_end LogMessageByIdQuiet diff --git a/include/common.h b/include/common.h index 85c094f2..ad45953a 100644 --- a/include/common.h +++ b/include/common.h @@ -54,9 +54,7 @@ struct ground_monster { // Stores information about active team members, including those from special episodes. // A lot of the fields seem to be analogous to fields on struct monster. struct team_member { - // 0x0: flags: 1-byte bitfield - u8 f_is_valid : 1; - u8 flags_unk1 : 7; + u8 flags; u8 is_leader; // 0x1 u8 level; // 0x2 diff --git a/include/dungeon_pokemon_attributes.h b/include/dungeon_pokemon_attributes.h index e6d1d6c3..e90ebfeb 100644 --- a/include/dungeon_pokemon_attributes.h +++ b/include/dungeon_pokemon_attributes.h @@ -10,5 +10,6 @@ bool8 AbilityIsActive(struct entity *entity, enum ability_id ability_id); // Likely a linker-generated veneer for AbilityIsActive. // See https://developer.arm.com/documentation/dui0474/k/image-structure-and-generation/linker-generated-veneers/what-is-a-veneer- bool8 AbilityIsActiveVeneer(struct entity *entity, enum ability_id ability_id); +bool8 OtherMonsterAbilityIsActive(struct entity *entity, enum ability_id ability_id); #endif //PMDSKY_DUNGEON_POKEMON_ATTRIBUTES_H diff --git a/include/dungeon_recruitment.h b/include/dungeon_recruitment.h index c53a0103..3477ed88 100644 --- a/include/dungeon_recruitment.h +++ b/include/dungeon_recruitment.h @@ -7,5 +7,6 @@ bool8 RecruitCheck(struct entity* leader, struct entity* target); bool8 SpecificRecruitCheck(u32 monster_id); extern bool8 DebugRecruitingEnabled(u32 monster_id); +bool8 TryRecruit(struct entity *user, struct entity *recruit, void *recruit_info); #endif //PMDSKY_DUNGEON_RECRUITMENT_H diff --git a/include/main_0200224C.h b/include/main_0200224C.h index bd26b356..09835f7b 100644 --- a/include/main_0200224C.h +++ b/include/main_0200224C.h @@ -12,5 +12,8 @@ u16 Rand16Bit(); u32 RandInt(u32 n); s32 RandRange(s32 x, s32 y); u32 Rand32Bit(); +void sub_020022C4(u32 *param_1); +u32 sub_020022D0(u32 *param_1, u32 param_2); +s32 RandIntSafe(s32 n); #endif //PMDSKY_MAIN_0200224C_H diff --git a/include/main_020251AC.h b/include/main_020251AC.h index c9f03389..b7e7ac8e 100644 --- a/include/main_020251AC.h +++ b/include/main_020251AC.h @@ -6,5 +6,7 @@ void StrcpySimple(unsigned char* dest, const unsigned char* src); void StrncpySimple(unsigned char* dest, const unsigned char* src, s32 n); void StrncpySimpleNoPad(unsigned char* dest, const unsigned char* src, s32 n); int StrncmpSimple(const unsigned char* c1, const unsigned char* c2, s32 n); +u16 sub_020251F0(u8 c); +void StrncpySimpleNoPadSafe(unsigned char* dest, const unsigned char* src, s32 n); #endif //PMDSKY_MAIN_020251AC_H diff --git a/include/main_0202613C.h b/include/main_0202613C.h index 14f453d8..00b547c4 100644 --- a/include/main_0202613C.h +++ b/include/main_0202613C.h @@ -3,7 +3,7 @@ struct unk_02026130 { u8 field_0x0[4]; - u8 field_0x4[4]; + u8 field_0x4[0x118]; }; void sub_0202613C(struct unk_02026130* p); diff --git a/include/main_02026174.h b/include/main_02026174.h index 328e5607..015fdbbf 100644 --- a/include/main_02026174.h +++ b/include/main_02026174.h @@ -5,11 +5,14 @@ void sub_02026174(struct unk_02026130* p); void sub_02026184(struct unk_02026130* p); -void sub_02026194(struct unk_02026130* p); +void sub_02026194(struct unk_02026130* p, u32 flags, char* string); void sub_020261A4(struct unk_02026130* p); void sub_020261B4(struct unk_02026130* p); void sub_020261C4(struct unk_02026130* p); void sub_020261D4(struct unk_02026130* p); void sub_020261E4(struct unk_02026130* p); +void sub_020261F4(struct unk_02026130* p, void* dst); +void sub_02026204(struct unk_02026130* p); +void DrawTextInWindow(s32 window_id, s32 x, s32 y, char* string); #endif diff --git a/include/main_0202B558.h b/include/main_0202B558.h index db8642e0..a54d0141 100644 --- a/include/main_0202B558.h +++ b/include/main_0202B558.h @@ -2,5 +2,7 @@ #define PMDSKY_MAIN_0202B558_H s32 GetSimpleMenuField0x1A4(s32 window_id); +s32 sub_0202B568(s32 window_id); +s32 GetSimpleMenuResult__0202B870(s32 window_id); #endif diff --git a/include/main_020502B0.h b/include/main_020502B0.h index 2295575f..1f9328e3 100644 --- a/include/main_020502B0.h +++ b/include/main_020502B0.h @@ -4,5 +4,6 @@ #include "adventure_log.h" void IncrementNbFainted(void); u32 GetNbFainted(void); +void SetItemAcquired(struct item *item); #endif diff --git a/include/main_020514CC.h b/include/main_020514CC.h index 06651df7..a45dccff 100644 --- a/include/main_020514CC.h +++ b/include/main_020514CC.h @@ -1,9 +1,12 @@ #ifndef PMDSKY_MAIN_020514CC_H #define PMDSKY_MAIN_020514CC_H #include "util.h" +#include "dungeon.h" bool32 IsDojoDungeon(u8 dungeon_id); bool32 IsFutureDungeon(u8 dungeon_id); bool32 IsSpecialEpisodeDungeon(u8 dungeon_id); +s32 RetrieveFromItemList1(struct dungeon_floor_pair *pair, s32 list_idx); +bool8 IsForbiddenFloor(struct dungeon_floor_pair *pair); #endif //PMDSKY_MAIN_020514CC_H diff --git a/include/overlay_29_0230F8AC.h b/include/overlay_29_0230F8AC.h index c8129573..6a56c3dc 100644 --- a/include/overlay_29_0230F8AC.h +++ b/include/overlay_29_0230F8AC.h @@ -8,5 +8,7 @@ bool8 ExclusiveItemEffectIsActive__0230F8AC(struct entity *entity, enum exclusiv u8 FindDirectionOfAdjacentMonsterWithItem(struct entity *entity, enum item_id item_id); // Checks if an entity is a monster (entity type 1). bool8 IsMonster__0230F980(struct entity *entity); +void ov29_0230F9A4(struct entity *entity, struct item *item); +void TrySpawnEnemyItemDrop(struct entity *attacker, struct entity *defender); #endif //PMDSKY_OVERLAY_29_0230F8AC_H diff --git a/include/overlay_29_0231B194.h b/include/overlay_29_0231B194.h index d9a4b8bd..b1f82236 100644 --- a/include/overlay_29_0231B194.h +++ b/include/overlay_29_0231B194.h @@ -5,5 +5,6 @@ // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__0231B194(struct entity *entity); +void TryActivateBadDreams(struct entity *attacker); #endif //PMDSKY_OVERLAY_29_0231B194_H diff --git a/include/overlay_29_0231EDD8.h b/include/overlay_29_0231EDD8.h index 99c8ddf8..0e46d0ef 100644 --- a/include/overlay_29_0231EDD8.h +++ b/include/overlay_29_0231EDD8.h @@ -5,5 +5,6 @@ // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__0231EDD8(struct entity *entity); +void TryHurl(struct entity *user, struct entity *target); #endif //PMDSKY_OVERLAY_29_0231EDD8_H diff --git a/include/overlay_29_0234B024.h b/include/overlay_29_0234B024.h index 2602363d..3e1b0ef4 100644 --- a/include/overlay_29_0234B024.h +++ b/include/overlay_29_0234B024.h @@ -18,7 +18,7 @@ struct alert_box_info { // (i.e. for which the scrolling is finished) u16 alert_box_current_loaded_idx; s16 frames_until_close; // 0xC90 - u8 field_0xc92; + u16 field_0xc92; u8 field_0xc94; u8 field_0xc95; u8 field_0xc96; @@ -27,7 +27,7 @@ struct alert_box_info { // 2 means a message is currently loading/scrolling. u32 loading_status; struct preprocessor_args preprocessor_args; - u8 alert_box_window_id; // 0xCEC + s8 alert_box_window_id; u8 field_0xced; u8 field_0xcee; u8 field_0xcef; diff --git a/include/overlay_29_0234B104.h b/include/overlay_29_0234B104.h index 16167cf0..1c5e3493 100644 --- a/include/overlay_29_0234B104.h +++ b/include/overlay_29_0234B104.h @@ -3,8 +3,16 @@ #include "util.h" #include "main_0200C4FC.h" +#include "dungeon_mode.h" void SetMessageLogPreprocessorArgsSpeakerId(u32 monster_id); void SetMessageLogPreprocessorArgsSpeakerId0x30000(u32 team_index); +void ov29_0234B130(void); +void ov29_0234B1A4(bool8 param_1); +void LogMessageByIdWithPopupCheckParticipants(struct entity *user, struct entity *target, u32 message_id, s32 pos, s16 val); +void WaitUntilAlertBoxTextIsLoadedWrapper(void); +void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); +void LogMessageWithPopupCheckUser(struct entity *user, const char *message); +void LogMessageByIdQuiet(struct entity *user, u32 message_id); #endif diff --git a/main.lsf b/main.lsf index 0106c954..f6f6c098 100644 --- a/main.lsf +++ b/main.lsf @@ -22,7 +22,7 @@ Static main Object src/main_02001CD4.o Object asm/main_02001D68.o Object src/main_0200224C.o - Object asm/main_020022C4.o + Object asm/main_02002318.o Object src/main_0200238C.o Object asm/main_020024E4.o Object src/main_020027E8.o @@ -132,13 +132,13 @@ Static main Object src/main_0201E380.o Object asm/main_0201E3AC.o Object src/main_020251AC.o - Object asm/main_020251F0.o + Object asm/main_02025230.o Object src/main_02025788.o Object src/main_0202593C.o Object asm/main_0202598C.o Object src/main_0202613C.o Object src/main_02026174.o - Object asm/main_020261F4.o + Object asm/main_02026268.o Object src/main_020265C4.o Object asm/main_0202676C.o Object src/main_020275F8.o @@ -167,7 +167,7 @@ Static main Object asm/main_0202AB94.o Object src/main_0202B4C4.o Object src/main_0202B558.o - Object asm/main_0202B568.o + Object asm/main_0202B5C8.o Object src/main_0202BA0C.o Object asm/main_0202BA20.o Object src/main_0202BC44.o @@ -263,7 +263,6 @@ Static main Object src/main_0204FEB4.o Object asm/main_0204FFEC.o Object src/main_020502B0.o - Object asm/main_02050300.o Object src/main_020503CC.o Object asm/main_02050420.o Object src/main_020504A4.o @@ -272,7 +271,7 @@ Static main Object asm/main_02051098.o Object src/dungeon_recruitment_2.o Object src/main_020514CC.o - Object asm/main_02051504.o + Object asm/main_020515C4.o Object src/main_02051760.o Object src/tactics_data.o Object asm/main_rodata_020A190C.o @@ -952,7 +951,6 @@ Overlay OVY_29 Object src/overlay_29_02301A60.o Object asm/overlay_29_02301A84.o Object src/dungeon_pokemon_attributes.o - Object asm/overlay_29_02301D84.o Object src/dungeon_logic_3.o Object src/dungeon_pokemon_attributes_1.o Object src/dungeon_logic_5.o @@ -989,7 +987,6 @@ Overlay OVY_29 Object src/overlay_29_0230BBAC.o Object asm/overlay_29_0230D088.o Object src/dungeon_recruitment.o - Object asm/overlay_29_0230E064.o Object src/overlay_29_0230E578.o Object asm/overlay_29_0230E5A8.o Object src/dungeon_ai_items.o @@ -998,7 +995,7 @@ Overlay OVY_29 Object asm/overlay_29_0230F02C.o Object src/overlay_29_0230F810.o Object src/overlay_29_0230F8AC.o - Object asm/overlay_29_0230F9A4.o + Object asm/overlay_29_0230FB30.o Object src/overlay_29_02311010.o Object asm/overlay_29_02311088.o Object src/overlay_29_023118B4.o @@ -1031,7 +1028,6 @@ Overlay OVY_29 Object src/special_move_types.o Object asm/overlay_29_0231AFB4.o Object src/overlay_29_0231B194.o - Object asm/overlay_29_0231B1B8.o Object src/overlay_29_0231B318.o Object asm/overlay_29_0231B33C.o Object src/overlay_29_0231CBC8.o @@ -1040,7 +1036,6 @@ Overlay OVY_29 Object src/overlay_29_0231E9F0.o Object asm/overlay_29_0231EA40.o Object src/overlay_29_0231EDD8.o - Object asm/overlay_29_0231EDFC.o Object src/overlay_29_0231F570.o Object asm/overlay_29_0231F594.o Object src/overlay_29_0231FBFC.o @@ -1279,7 +1274,6 @@ Overlay OVY_29 Object src/overlay_29_0234AFFC.o Object src/overlay_29_0234B024.o Object src/overlay_29_0234B104.o - Object asm/overlay_29_0234B130.o Object src/overlay_29_0234B340.o Object asm/overlay_29_0234B3A4.o Object src/overlay_29_0234B4BC.o diff --git a/src/dungeon_ai.c b/src/dungeon_ai.c index 05abac36..f8ae49e7 100644 --- a/src/dungeon_ai.c +++ b/src/dungeon_ai.c @@ -16,6 +16,7 @@ #include "status_checks.h" #include "targeting.h" #include "dungeon_util_2.h" +#include "overlay_29_0234B104.h" #ifdef JAPAN #define CANNOT_USE_ITEM_MESSAGE 0xB2D @@ -28,7 +29,6 @@ extern struct dungeon *DUNGEON_PTR[]; extern void EndFrozenClassStatus(struct entity *user, struct entity *target, bool8 log); -extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); void RunMonsterAi(struct entity *monster, u32 unused) { diff --git a/src/dungeon_logic_6.c b/src/dungeon_logic_6.c index ed5ced86..43bb39e2 100644 --- a/src/dungeon_logic_6.c +++ b/src/dungeon_logic_6.c @@ -5,11 +5,11 @@ #include "overlay_29_0234BA54.h" +#include "overlay_29_0234B104.h" extern void ov29_0234D8A0(s32 a); extern s16 ov29_022DE5F0(s32 index); extern void ov29_022EA370(s32 a, s32 b); -extern int ov29_0234B1A4(); extern void ov29_0234D630(void); extern s8 ov29_023535A4; extern s16 ov29_0237C9A0[2]; diff --git a/src/dungeon_pokemon_attributes.c b/src/dungeon_pokemon_attributes.c index 77d9f3c3..268d5ae6 100644 --- a/src/dungeon_pokemon_attributes.c +++ b/src/dungeon_pokemon_attributes.c @@ -1,6 +1,10 @@ #include "dungeon_pokemon_attributes.h" #include "dungeon_util_static.h" #include "overlay_29_02301A60.h" +#include "overlay_29_023000E4.h" + +extern struct dungeon *DUNGEON_PTR[]; +extern bool8 ShouldTreatMonsterAsAlly(struct entity *monster, struct entity *other); bool8 NoGastroAcidStatus(struct entity *entity, enum ability_id ability_id) { @@ -35,3 +39,21 @@ bool8 AbilityIsActiveVeneer(struct entity *entity, enum ability_id ability_id) { return AbilityIsActive(entity, ability_id); } + +bool8 OtherMonsterAbilityIsActive(struct entity *entity, enum ability_id ability_id) +{ + for (s16 i = 0; i < DUNGEON_MAX_POKEMON; i++) + { + struct entity *target = DUNGEON_PTR[0]->active_monster_ptrs[i]; + if (EntityIsValid__023000E4(target) && entity != target && + ShouldTreatMonsterAsAlly(entity, target) && +#ifdef JAPAN + DefenderAbilityIsActive__02301A0C(entity, target, ability_id)) +#else + DefenderAbilityIsActive__02301A0C(entity, target, ability_id, TRUE)) +#endif + return TRUE; + } + + return FALSE; +} diff --git a/src/dungeon_recruitment.c b/src/dungeon_recruitment.c index 8b98eb3d..95d846a3 100644 --- a/src/dungeon_recruitment.c +++ b/src/dungeon_recruitment.c @@ -15,6 +15,67 @@ #include "overlay_29_0230E578.h" // ItemIsActive__0230E578 #include "progression.h" #include "overlay_29_02349208.h" +#include "common.h" +#include "dungeon_util_2.h" +#include "main_020251AC.h" +#include "main_0204FDFC.h" +#include "main_02058E68.h" +#include "overlay_29_022E68BC.h" +#include "overlay_29_022EAC7C.h" +#include "overlay_29_0234B024.h" +#include "overlay_29_0234BA54.h" +#include "position_util.h" +#include "overlay_29_0234B104.h" + +struct unk_0230E064 { + s16 field_0x0; + s16 field_0x2; + s16 field_0x4; + s16 field_0x6; + u8 field_0x8[2]; + u8 field_0xa[2]; + s16 field_0xc; + s16 field_0xe; + s32 field_0x10; + u16 field_0x14; + u16 field_0x16; + u16 field_0x18; + u16 field_0x1a; + struct item field_0x1c; + struct moves field_0x22; + u16 field_0x44; + u16 field_0x46; +}; + +void SetPreprocessorArgsStringToName(struct preprocessor_args *preprocessor_args, + s32 pos, struct monster *monster, + u32 param_4, u8 name_type); +void HandleFaint(struct entity *fainted_entity, s32 damage_source, + struct entity *killer); +struct team_member *GetActiveTeamMember(s32 roster_idx); +void GetRecoloredTeamMemberName(char *dst, struct team_member *team_member); +void ov29_0234D630(void); +void ov29_0234D838(void); +const u8 *GetNameString(enum monster_id monster_id); +void StrncpyName(char *dest, const char *src, u32 n); +void EnsureCanStandCurrentTile(struct entity *entity); +void ov29_02305F60(struct entity *user, struct entity *target); +void ChangeMonsterAnimationToIdle(struct entity *monster, s32 direction); +s32 ov29_0234D7C0(s32 message_id, struct preprocessor_args *args, s32 param_3, + s32 param_4, u8 param_5); +void ov29_0234D8A0(s32 param_1); +struct entity *ov29_0234EE10(struct entity *entity, char *name); +bool8 DungeonModeSetupAndShowNameKeyboard(char *name, char *param_2, s32 param_3); +void RemoveMonsterFromTile(struct entity *entity, s32 x, s32 y); +bool8 ov29_0230E5A8(struct entity *user, struct entity *target, s32 x, s32 y); +s32 ov29_0230E5FC(struct team_member *member, s32 param_2); +void ov29_0230E658(s32 message_id); +void GetRecoloredNameOfTeamMemberAtIdx(char *dst, s32 roster_idx); +void sub_02056698(s32 roster_idx, s16 member_idx); +void ov29_022E8104(void); +bool8 InitTeamMember(s16 monster_id, s32 x, s32 y, struct team_member *member, + struct entity **out, bool8 param_6, bool8 param_7, + bool8 param_8, bool8 param_9); extern bool8 IsLegendaryChallengeFloor(void); extern bool8 IsMonsterOnTeam(s16 monsterId, s32 checkType); @@ -202,3 +263,162 @@ bool8 RecruitCheck(struct entity* leader, struct entity* target) return TRUE; } + +#ifdef JAPAN +#define TRY_RECRUIT_MESSAGE_OFFSET -0x2C0 +#else +#define TRY_RECRUIT_MESSAGE_OFFSET 0 +#endif + +bool8 TryRecruit(struct entity *user, struct entity *recruit, void *recruit_info) +{ + struct unk_0230E064 *info = recruit_info; + struct entity *spawned; + struct entity *out; +#ifdef JAPAN + char keyboard_buf[16]; +#else + char keyboard_buf[20]; +#endif + char name_buf2[64]; + char name_buf1[64]; + struct team_member member; + struct monster *mon; + struct entity *ent; + char *recolored; + struct team_member *slot; + s32 dir; + s32 response; + s32 idx; + bool8 ret; + s16 i; + + spawned = NULL; + WaitUntilAlertBoxPauseIsOver(10); + ov29_0234B1A4(0); + ov29_0234D630(); + idx = -1; + dir = GetDirectionTowardsPosition(&recruit->pos, &user->pos); + mon = recruit->info; + recruit->transparent = 0; + ov29_02305F60(user, recruit); + ChangeMonsterAnimationToIdle(recruit, dir); + if (IsMonsterOnTeam(mon->id, 1)) { + SetPreprocessorArgsStringToName(GetMessageLogPreprocessorArgs(), 0, + recruit->info, 0, 1); + } else { + SetPreprocessorArgsStringToName(GetMessageLogPreprocessorArgs(), 0, + recruit->info, 0, 0); + } + + if (ov29_0234D7C0(0xC77 + TRY_RECRUIT_MESSAGE_OFFSET, + GetMessageLogPreprocessorArgs(), 0, 0, 1) == 2) { + ret = FALSE; + } else { + member.flags = TRUE; + member.flags |= 2; + member.is_leader = 0; + member.level = info->field_0xc; + member.iq = 1; + member.hidden_power_base_power = info->field_0x44; + *(u16 *)&member.hidden_power_type = info->field_0x46; + member.tactic = 0; + member.member_index = -1; + member.team_index = -1; + member.id = info->field_0x0; + member.joined_at = DUNGEON_PTR[0]->id; + member.joined_at_floor = DUNGEON_PTR[0]->floor; + member.current_hp = info->field_0x6; + member.max_hp = info->field_0x6; + member.belly = info->field_0x14; + member.belly_thousandths = info->field_0x16; + member.max_belly = info->field_0x18; + member.max_belly_thousandths = info->field_0x1a; + for (i = 0; i < 2; i++) { + member.offensive_stats[i] = info->field_0x8[i]; + member.defensive_stats[i] = info->field_0xa[i]; + } + member.exp = info->field_0x10; + *(struct moves *)member.moves = info->field_0x22; + member.held_item = info->field_0x1c; + StrncpyName(member.name, (const char *)GetNameString((enum monster_id)info->field_0x0), 10); + EnableAllLearnableIqSkills(member.iq_skill_flags, (s16)member.id, + (s16)member.iq); + recolored = name_buf1; +#ifdef JAPAN + StrcpySimple((unsigned char *)keyboard_buf, (const unsigned char *)member.name); +#else + StrncpySimpleNoPad((unsigned char *)keyboard_buf, + (const unsigned char *)member.name, 10); +#endif + ov29_022EACAC(); + if (ov29_0234D7C0(0xC7B + TRY_RECRUIT_MESSAGE_OFFSET, + GetMessageLogPreprocessorArgs(), 0, 0, 1) == 1) { + ov29_0234D838(); + while (!DungeonModeSetupAndShowNameKeyboard(member.name, keyboard_buf, 0)) + ; + } + GetRecoloredTeamMemberName(recolored, &member); + SetMessageLogPreprocessorArgsString(0, recolored); + SetPreprocessorArgsIdVal(1, 0); + ov29_0230E658(0xC7E + TRY_RECRUIT_MESSAGE_OFFSET); + RemoveMonsterFromTile(recruit, info->field_0x2, info->field_0x4); + if (!ov29_0230E5A8(user, recruit, info->field_0x2, info->field_0x4)) { + idx = ov29_0230E5FC(&member, -1); + while (!ov29_0230E5A8(user, recruit, info->field_0x2, info->field_0x4)) { + ov29_0230E658(0xC7F + TRY_RECRUIT_MESSAGE_OFFSET); + do { + ov29_0234D838(); + ent = ov29_0234EE10(recruit, member.name); + if (ent == NULL) + break; + if (ent == recruit) { + GetRecoloredTeamMemberName(name_buf2, &member); + } else { + GetRecoloredNameOfTeamMemberAtIdx( + name_buf2, ((struct monster *)ent->info)->team_index); + } + SetMessageLogPreprocessorArgsString(0, name_buf2); + SubstitutePlaceholderStringTags(1, user, 0); + response = ov29_0234D7C0(0xC80 + TRY_RECRUIT_MESSAGE_OFFSET, + GetMessageLogPreprocessorArgs(), 0, 0, 1); + } while (response == -1); + if (response != 2 && ent != NULL) { + ov29_0230E658(0xC81 + TRY_RECRUIT_MESSAGE_OFFSET); + ov29_022E68BC(ent); + HandleFaint(ent, DAMAGE_SOURCE_TRANSFORM_FRIEND, user); + if (ent == recruit) { + ret = TRUE; + goto done; + } + } + } + } + for (i = 0; i < 4; i++) { + if (!GetFlag(GetActiveTeamMember(i)->flags, 1)) + break; + } + member.team_index = i; + member.member_index = ov29_0230E5FC(&member, idx); + sub_02056698(i, member.member_index); + HandleFaint(recruit, DAMAGE_SOURCE_TRANSFORM_FRIEND, user); + slot = GetActiveTeamMember(i); + *slot = member; + ov29_022E8104(); + ov29_022E81F8(); + InitTeamMember(info->field_0x0, info->field_0x2, info->field_0x4, slot, + &out, FALSE, TRUE, TRUE, TRUE); + SetPokemonJoined((s16)slot->id); + ov29_022E8104(); + ov29_022E81F8(); + spawned = out; + ret = TRUE; + } +done: + ov29_0234D8A0(1); + if (!ret) + LogMessageByIdWithPopupCheckUser(user, 0xC78 + TRY_RECRUIT_MESSAGE_OFFSET); + if (spawned != NULL) + EnsureCanStandCurrentTile(spawned); + return ret; +} diff --git a/src/main_0200224C.c b/src/main_0200224C.c index f3f207f2..89a66aea 100644 --- a/src/main_0200224C.c +++ b/src/main_0200224C.c @@ -59,3 +59,23 @@ s32 RandRange(s32 x, s32 y) { u32 Rand32Bit() { return (Rand16Bit() << 0x10) | Rand16Bit(); } + +void sub_020022C4(u32 *param_1) +{ + *param_1 = 1; +} + +u32 sub_020022D0(u32 *param_1, u32 param_2) +{ + u32 value = *param_1 * 0x5D588B65 + 1; + *param_1 = value; + return ((value >> 0x10) * param_2) >> 0x10; +} + +s32 RandIntSafe(s32 n) +{ + s32 entropy = Rand16Bit(); + entropy &= 0xFFFF; + entropy *= n; + return entropy >> 0x10; +} diff --git a/src/main_020251AC.c b/src/main_020251AC.c index e7c40879..b6c272f1 100644 --- a/src/main_020251AC.c +++ b/src/main_020251AC.c @@ -78,3 +78,42 @@ int StrncmpSimple(const unsigned char* s1, const unsigned char* s2, s32 n) } while (bytes_compared < n); return 0; } + +#ifdef JAPAN +struct unk_020B112C { + const u16 *field_0x0; + const u8 (*field_0x4)[2]; +}; +extern const struct unk_020B112C _020B112C_JP; +#endif + +u16 sub_020251F0(u8 c) +{ +#ifdef JAPAN + const u8 *row = _020B112C_JP.field_0x4[c]; + return (row[0] << 8) + row[1]; +#else + return c; +#endif +} + +void StrncpySimpleNoPadSafe(unsigned char* dest, const unsigned char* src, s32 n) +{ + while (n-- > 0 && *src != 0) { +#ifdef JAPAN + u16 c = sub_020251F0(*src++); + dest[0] = c >> 8; + dest[1] = c; + dest += 2; +#else + u32 c = *src++; + if (c < 0x100) { + *dest++ = c; + } + else { + *dest++ = ' '; + } +#endif + } + *dest = 0; +} diff --git a/src/main_02026174.c b/src/main_02026174.c index 956b12e1..6693fd81 100644 --- a/src/main_02026174.c +++ b/src/main_02026174.c @@ -1,11 +1,21 @@ #include "main_02026174.h" +struct unk_02020B60 { + s32 field_0x0; + s32 field_0x4; +}; + +extern void sub_02020B60(void *p, struct unk_02020B60 *pos); +extern void AnalyzeText(void *p); +extern void sub_02020D7C(void *p, void *dst); +extern void sub_02025E84(struct unk_02026130 *p, s32 window_id); + extern void sub_02020B74(void *p); extern void sub_02020BB8(void *p); -extern void sub_02020BC4(void *p); +extern void sub_02020BC4(void *p, u32 flags, char *string); extern void sub_02020CCC(void *p); @@ -27,9 +37,9 @@ void sub_02026184(struct unk_02026130* p) sub_02020BB8((void *) p + 4); } -void sub_02026194(struct unk_02026130* p) +void sub_02026194(struct unk_02026130* p, u32 flags, char* string) { - sub_02020BC4((void *) p + 4); + sub_02020BC4((void *) p + 4, flags, string); } void sub_020261A4(struct unk_02026130* p) @@ -56,3 +66,26 @@ void sub_020261E4(struct unk_02026130* p) { sub_02020D5C((void *) p + 4); } + +void sub_020261F4(struct unk_02026130* p, void* dst) +{ + sub_02020D7C((void *) p + 4, dst); +} + +void sub_02026204(struct unk_02026130* p) +{ + AnalyzeText((void *) p + 4); +} + +void DrawTextInWindow(s32 window_id, s32 x, s32 y, char* string) +{ + struct unk_02020B60 pos; + struct unk_02026130 state; + + pos.field_0x0 = x; + pos.field_0x4 = y; + sub_02025E84(&state, window_id); + sub_02020B60(state.field_0x4, &pos); + sub_02020BC4(state.field_0x4, 0xC402, string); + AnalyzeText(state.field_0x4); +} diff --git a/src/main_0202B558.c b/src/main_0202B558.c index f5336145..430abd6f 100644 --- a/src/main_0202B558.c +++ b/src/main_0202B558.c @@ -1,5 +1,7 @@ #include "main_0202B558.h" #include "main_0202AAA8.h" +#include "main_0202A66C.h" +#include "main_0203258C.h" s32 GetSimpleMenuField0x1A4(s32 window_id) { @@ -7,3 +9,25 @@ s32 GetSimpleMenuField0x1A4(s32 window_id) return menu->field_0x1A4; } + +s32 sub_0202B568(s32 window_id) +{ + return GetMaxItemsOnPage(GetWindowContents(window_id) + 4); +} + +s32 GetSimpleMenuResult__0202B870(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; +} diff --git a/src/main_0203D538.c b/src/main_0203D538.c index a15c16aa..be3608eb 100644 --- a/src/main_0203D538.c +++ b/src/main_0203D538.c @@ -19,6 +19,8 @@ #include "script_variable.h" #include "main_020517D4.h" #include "main_0202A66C.h" +#include "main_0200224C.h" +#include "main_0202B558.h" struct unk_020AFE74 { s32 field_0x0; @@ -70,8 +72,6 @@ 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 void StrncpySimpleNoPadSafe(u8* dest, const u8* src, u32 n); -extern s32 GetSimpleMenuResult__0202B870(s8); extern s32 GetSimpleMenuResult__0202AEA4(s8); extern void InitPreprocessorArgs(struct preprocessor_args* args); extern bool8 IsMonsterIllegalForMissions(enum monster_id); @@ -101,7 +101,6 @@ extern void ApplyLevelUpBoostsToGroundMonster(void *mon, s16 levels, s32 flag); extern void sub_02050C10(s32 delta); extern void sub_0203909C(u8 *name); extern void ShowKeyboard(s32 mode, u8 *, s32, u8 *); -extern s32 RandIntSafe(s32 n); extern void ov11_023061CC(void *); extern void ov11_023061E4(void *, s32); extern void ov11_02310BDC(void); diff --git a/src/main_020502B0.c b/src/main_020502B0.c index a86ad84f..7337b7c5 100644 --- a/src/main_020502B0.c +++ b/src/main_020502B0.c @@ -1,5 +1,10 @@ #include "main_020502B0.h" #include "adventure_log.h" +#include "item_util_1.h" +#include "main_0204FB9C.h" +#include "progression.h" + +extern s32 NormalizeTreasureBox(s32 item_id); void IncrementNbFainted(void) { @@ -13,3 +18,27 @@ u32 GetNbFainted(void) { return ADVENTURE_LOG_PTR->nb_faints; } + +void SetItemAcquired(struct item *item) +{ + s32 id = NormalizeTreasureBox(item->id); + if (!IsItemValidVeneer(id)) { + return; + } + if (id >= 0x3B && id <= 0x41) { + s32 all = 1; + s32 i; + SetAdventureLogCompleted((u8) (id - 0x21)); + for (i = 0x1A; i <= 0x20; i++) { + if (!GetAdventureLogCompleted((u8) i)) { + all = 0; + break; + } + } + if (all) { + SetResolvedPerformanceProgressFlag(0x15, 1); + } + } + ADVENTURE_LOG_PTR->items_acquired_flags[id / 32] |= 1 << (id % 32); + ADVENTURE_LOG_PTR->completion_flags[0] |= 8; +} diff --git a/src/main_020514CC.c b/src/main_020514CC.c index 7d891132..14aa68c8 100644 --- a/src/main_020514CC.c +++ b/src/main_020514CC.c @@ -1,6 +1,13 @@ #include "main_020514CC.h" #include "util.h" #include "enums.h" +#include "dungeon.h" +#include "main_0200224C.h" + +extern u8 GetNbFloorsPlusOne(enum dungeon_id dungeon_id); +extern s32 GetItemIdFromList(s32 list_idx, s32 a, s32 b); +extern void DungeonFloorToGroupFloor(struct dungeon_floor_pair *out, struct dungeon_floor_pair *pair); +extern const struct dungeon_floor_pair MISSION_FLOORS_FORBIDDEN[]; bool32 IsDojoDungeon(u8 dungeon_id) { @@ -15,3 +22,37 @@ bool32 IsFutureDungeon(u8 dungeon_id) { bool32 IsSpecialEpisodeDungeon(u8 dungeon_id) { return dungeon_id >= DUNGEON_STAR_CAVE_SE1 && dungeon_id <= DUNGEON_SPRING_CAVE_PIT; } + +s32 RetrieveFromItemList1(struct dungeon_floor_pair *pair, s32 list_idx) +{ + s32 rnd1 = RandIntSafe(9999); + s32 rnd2 = RandIntSafe(9999); + enum dungeon_id dungeon_id = pair->dungeon_id; + + if (dungeon_id >= DUNGEON_NORMAL_FLY_MAZE && + dungeon_id >= DUNGEON_DOJO_0xD3) { + return ITEM_PLAIN_SEED; + } + if (pair->floor_id >= GetNbFloorsPlusOne(dungeon_id)) { + return ITEM_PLAIN_SEED; + } + return GetItemIdFromList(list_idx, rnd1, rnd2); +} + +bool8 IsForbiddenFloor(struct dungeon_floor_pair *pair) +{ + struct dungeon_floor_pair group; + s32 i; + + DungeonFloorToGroupFloor(&group, pair); + for (i = 0; ; i++) { + if (MISSION_FLOORS_FORBIDDEN[i].dungeon_id == 100) { + break; + } + if (group.dungeon_id == MISSION_FLOORS_FORBIDDEN[i].dungeon_id && + group.floor_id == MISSION_FLOORS_FORBIDDEN[i].floor_id) { + return TRUE; + } + } + return FALSE; +} diff --git a/src/main_02059060.c b/src/main_02059060.c index 213b8166..462316a3 100644 --- a/src/main_02059060.c +++ b/src/main_02059060.c @@ -3,11 +3,11 @@ #include "save.h" #include "main_0202593C.h" #include "main_02058FA4.h" +#include "main_020251AC.h" extern struct team_member_table *TEAM_MEMBER_TABLE_PTR; extern s32 GetLanguageType(void); -extern void StrncpySimpleNoPadSafe(u8* dest, const u8* src, u32 n); extern void InitBitstreamForRead(struct bitstream *ptr, void *start_addr, u32 total_len); extern void WriteMonsterToSave(struct bitstream *stream, struct ground_monster *monster); extern void CopyBitsTo(void *ctx, void *src, s32 nbits); diff --git a/src/main_0205D11C.c b/src/main_0205D11C.c index c6b20133..caa1b942 100644 --- a/src/main_0205D11C.c +++ b/src/main_0205D11C.c @@ -13,6 +13,7 @@ #include "main_0205E01C.h" #include "main_0205E288.h" #include "dungeon_recruitment_2.h" +#include "main_020514CC.h" extern u8 _020A39C0; extern u8 _020A39D4; @@ -26,7 +27,6 @@ extern const char _020A3AD4[]; extern const char _020A3AF4[]; extern const char _020A3B18[]; -extern s32 RandIntSafe(s32 n); extern void ClearMissionData(struct mission *mission); extern struct mission_deliver_list MISSION_DELIVER_LIST_PTR; extern s32 CanDungeonBeUsedForMission(enum dungeon_id); @@ -45,7 +45,6 @@ extern s16 *sub_020627F4(void); extern enum monster_id GetBaseForm(enum monster_id); extern s32 GetBodySize(enum monster_id); -extern bool8 IsForbiddenFloor(struct dungeon_floor_pair*); extern bool8 IsInvalidForMission(enum dungeon_id); extern bool8 IsItemValidVeneer(s16 item_id); extern bool8 IsMissionValid(struct mission *mission); diff --git a/src/main_02065B3C.c b/src/main_02065B3C.c index 402714ba..426d0e4a 100644 --- a/src/main_02065B3C.c +++ b/src/main_02065B3C.c @@ -1,6 +1,6 @@ #include "enums.h" +#include "main_020251AC.h" -extern void StrncpySimpleNoPadSafe(u8 *dest, const u8 *src, u32 n); extern u8 _022B7310[]; diff --git a/src/overlay_11_02307334.c b/src/overlay_11_02307334.c index 2e9a1b4d..1c892152 100644 --- a/src/overlay_11_02307334.c +++ b/src/overlay_11_02307334.c @@ -23,6 +23,10 @@ #include "main_02001188.h" #include "common.h" #include +#include "main_020251AC.h" +#include "main_020502B0.h" +#include "main_02026174.h" +#include "main_0202B558.h" extern void sub_02056094(char *dst, struct ground_monster *ground_monster, bool8 is_leader); @@ -40,7 +44,6 @@ struct unk_02324D90 { extern struct unk_02324D90 *ov11_02324D90; extern char ov11_02322DB8[]; -extern void StrncpySimpleNoPadSafe(u8 *dest, const u8 *src, u32 n); extern s32 sub_02055894(struct ground_monster *member); extern bool8 sub_020564B0(int idx); extern s32 vsprintf(u8 *str, const u8 *format, va_list ap); @@ -107,10 +110,10 @@ extern s32 ov11_02322D60; extern s32 ov11_02322D88; extern u8 ov11_02322DB0[]; -extern void CloseScrollBox(s8); extern void CloseTextBox2(s8); extern u8 CreateParentMenuFromStringIds(void *, u32, void *, void *); 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 DrawTextInWindow(s32 window_id, s32 x, s32 y, char *string); +extern void CloseScrollBox(s8); extern void CloseTextBox2(s8); extern u8 CreateParentMenuFromStringIds(void *, u32, void *, void *); extern s8 CreateScrollBoxSingle(void *, s32, s32, s32, void *, s32, void *); extern s8 CreateSimpleMenuFromStringIds(void *, s32, s32, void *, s32); extern s8 CreateTextBox(void *, void *); extern struct team_member *GetActiveTeamMember(s32 roster_idx); extern void GetPressedButtons(u32, u16 *); -extern s32 GetSimpleMenuResult__0202AEA4(s8); extern s32 GetSimpleMenuResult__0202B870(s8); extern struct ground_monster *GetTeamMember(s32 member_idx); +extern s32 GetSimpleMenuResult__0202AEA4(s8);extern struct ground_monster *GetTeamMember(s32 member_idx); 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); @@ -118,7 +121,6 @@ extern u8 *strcpy(u8 *dest, const u8 *src); extern s8 CreateInventoryMenuOuter(s32, s32, s32, void *, void *, void *, u8); extern bool8 IsBagNotEmpty(void); extern u8 PopInventoryMenuField0x1A3(s32 window_id); -extern void SetItemAcquired(struct item *); extern void SortItemsInBag(void); extern void *memcpy(void *, const void *, u32); extern int ov11_023090DC(void); diff --git a/src/overlay_17_0238B10C.c b/src/overlay_17_0238B10C.c index 60d0f902..bb27f2d5 100644 --- a/src/overlay_17_0238B10C.c +++ b/src/overlay_17_0238B10C.c @@ -1,5 +1,6 @@ #include "overlay_17_0238B10C.h" #include "enums.h" +#include "main_0202B558.h" extern void ov17_0238A278(void); @@ -7,7 +8,6 @@ extern struct unk_0238BE00 *OVERLAY17_UNKNOWN_POINTER__NA_238BE00; extern u32 IsSimpleMenuActive(s32 window_id); -extern s32 GetSimpleMenuResult__0202B870(s8 window_id); extern void ov17_0238B028(s32 a); diff --git a/src/overlay_18_0238BF60.c b/src/overlay_18_0238BF60.c index 9e55c31f..6e9f72e3 100644 --- a/src/overlay_18_0238BF60.c +++ b/src/overlay_18_0238BF60.c @@ -1,11 +1,11 @@ #include "overlay_18_0238BF60.h" #include "overlay_18_0238C950.h" +#include "main_0202B558.h" extern void ov18_0238BE28(s32 a); extern u32 IsSimpleMenuActive(s32 window_id); -extern s32 GetSimpleMenuResult__0202B870(s8 window_id); extern struct unk_0238C950 *LINK_SHOP_PTR; diff --git a/src/overlay_24_init.c b/src/overlay_24_init.c index 05d3c728..3d11f42c 100644 --- a/src/overlay_24_init.c +++ b/src/overlay_24_init.c @@ -1,5 +1,7 @@ #include "overlay_24.h" #include "main_0203D538.h" +#include "main_020251AC.h" +#include "main_0202B558.h" extern void CloseCollectionMenu(s8); extern void CloseDialogueBox(s8); @@ -7,12 +9,10 @@ extern void FreeMissionRewardStructMain(); extern s32 GetEggHatchTimer(); extern s32 GetKeyboardStatus(); extern const u8 *GetKeyboardStringResult(); -extern s32 GetSimpleMenuResult__0202B870(s8); extern void HidePortraitBox(s8); extern s32 IsDialogueBoxActive(s8); extern void ShowDialogueBox(s8); extern void StrcpySimple(unsigned char* dest, const unsigned char* src); -extern void StrncpySimpleNoPadSafe(u8* dest, const u8* src, u32 n); extern void ov11_022DC504(); extern struct overlay_24_unk1E8_sub *ov11_02306C64(); extern s32 ov11_02306C9C(); diff --git a/src/overlay_25_init.c b/src/overlay_25_init.c index 8538eec2..02f9f781 100644 --- a/src/overlay_25_init.c +++ b/src/overlay_25_init.c @@ -2,6 +2,8 @@ #include "main_0200C4FC.h" #include "item.h" #include "main_02001188.h" +#include "main_02026174.h" +#include "main_0202B558.h" extern void CloseDialogueBox(s8); @@ -13,7 +15,6 @@ extern void CloseTextBox(s8); extern s32 GetMoneyCarried(); extern s32 GetNbItemsInBag(); extern void GetPressedButtons(void *, u16*); -extern s32 GetSimpleMenuResult__0202B870(s8); extern void HidePortraitBox(s8); extern s32 IsDialogueBoxActive(s8); extern s32 IsScrollBoxActive(s8); @@ -58,7 +59,6 @@ extern void ReturnScriptMenuResultZero(void); extern void UpdateWindow(char *); extern void sub_02027B1C(char *); extern void AppendStandardStringToMission(char *, s32, s32, s32); -extern void DrawTextInWindow(char *, s32, s32, void*); extern s32 APPRAISAL_MAIN_MENU_ITEMS; extern s32 APPRAISAL_MENU_ITEMS_CONFIRM; @@ -617,6 +617,6 @@ void ov25_0238B414(char *output) #else AppendStandardStringToMission(output, 4, 2, 0x225); #endif - DrawTextInWindow(output, 0x10, 0x10, buffer); + DrawTextInWindow((s32)output, 0x10, 0x10, buffer); UpdateWindow(output); } diff --git a/src/overlay_29_022F0EDC.c b/src/overlay_29_022F0EDC.c index f896345b..a260dc11 100644 --- a/src/overlay_29_022F0EDC.c +++ b/src/overlay_29_022F0EDC.c @@ -20,6 +20,7 @@ #include "dungeon_util_2.h" #include "overlay_29_022EC7E8.h" #include "overlay_29_022E9FC0.h" +#include "overlay_29_0234B104.h" #ifdef JAPAN #define SET_LEADER_ACTION_DATA_OFFSET -0x2C1 @@ -62,7 +63,6 @@ extern void GetPressedButtons(u32 param_1, u16 *pressed); extern s32 HasStatusThatPreventsLeaderActing(); extern s32 HideTileGrid(); extern s32 LogItemBlockedByEmbargo(); -extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); extern s32 MonsterHasEmbargoStatus(); extern s32 OpenMenu(bool8 a, u8 b, s32 c); extern s32 OpenMessageLog(); diff --git a/src/overlay_29_02306728.c b/src/overlay_29_02306728.c index 931980a0..35ddb696 100644 --- a/src/overlay_29_02306728.c +++ b/src/overlay_29_02306728.c @@ -4,10 +4,10 @@ #include "overlay_29_022E3F20.h" #include "dungeon.h" #include "dungeon_util_static.h" +#include "overlay_29_0234B104.h" extern struct dungeon *DUNGEON_PTR[]; -extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); extern s32 GetIdleAnimationId(struct entity *entity); extern int ov29_02304830(); extern void TryRemoveSnatchedMonsterFromDungeonStruct(struct entity *user, struct entity *target); diff --git a/src/overlay_29_02308FBC.c b/src/overlay_29_02308FBC.c index e3639e57..0da3c560 100644 --- a/src/overlay_29_02308FBC.c +++ b/src/overlay_29_02308FBC.c @@ -55,6 +55,9 @@ #include "overlay_29_022ECDC0.h" #include "overlay_29_022E45B8.h" #include "overlay_29_0231E9F0.h" +#include "overlay_29_0230F8AC.h" +#include "overlay_29_0231EDD8.h" +#include "overlay_29_0234B104.h" struct unk_023535DC { u8 field_0x0; @@ -79,7 +82,6 @@ extern void ActivateMotorDrive(struct entity* entity); extern void ApplyDamageAndEffectsWrapper(struct entity *entity, s32 damage, s32 a, s32 b); extern bool8 IsEitherMonsterInvalid(struct entity *a, struct entity *b); extern void ResetDamageData(struct unk_02308FE0 *damage_data); -extern void TryHurl(struct entity *user, struct entity *target); extern void ov29_022E57D4(struct entity *entity); extern void ov29_022E5E84(struct entity *a, struct entity *b); extern void ov29_0230F728(struct entity *attacker, struct entity *defender, enum exclusive_item_effect_id effect_id, s32 a); @@ -113,7 +115,6 @@ extern struct team_member* GetActiveTeamMember(s32 roster_idx); extern s32 GetIdleAnimationId(struct entity *entity); extern void HandleFaint(struct entity *fainted_entity, s32 damage_source, struct entity *killer); extern bool8 IsMonsterIdInNormalRangeVeneer(enum monster_id monster_id); -extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); extern void MoveMonsterToPos(struct entity* entity, s32 x_pos, s32 y_pos, bool8 reset_prev_pos_fields); extern s32 PlayEffectAnimationEntity(struct entity *entity, s32 id, s32 a, u8 b, s32 c, s32 d, s32 e, s32 f); extern int PlayMissSfx__022E611C(); @@ -124,8 +125,6 @@ extern void RestoreRandomMovePP(struct entity* user, struct entity* target, s32 extern void SubInitMonster(struct monster* monster, bool8 flag); extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); -extern bool8 TryRecruit(struct entity *user, struct entity *recruit, void *recruit_info); -extern void TrySpawnEnemyItemDrop(struct entity* attacker, struct entity* defender); extern void UpdateShopkeeperModeAfterAttack(struct entity* attacker, struct entity* defender); extern s32 abs(s32 n); extern int ov10_022BDC68(); @@ -145,7 +144,6 @@ extern int ov29_02307C48(); extern int ov29_0230D628(); extern int ov29_0230D688(); extern int ov29_0230D7D4(); -extern int ov29_0234B1A4(); extern struct unk_023528A4 TYPE_DAMAGE_NEGATING_EXCLUSIVE_ITEM_EFFECTS[]; extern s16 SET_DAMAGE_STATUS_DAMAGE; diff --git a/src/overlay_29_0230BBAC.c b/src/overlay_29_0230BBAC.c index a7c401f9..ff0fafd6 100644 --- a/src/overlay_29_0230BBAC.c +++ b/src/overlay_29_0230BBAC.c @@ -43,7 +43,6 @@ extern bool8 AuraBowIsActive(struct entity *entity); extern bool8 FixedPoint64CmpLt(const struct fixed_point_64 *a, const struct fixed_point_64 *b); extern void DivideFixedPoint64(struct fixed_point_64 *out, struct fixed_point_64 *a, struct fixed_point_64 *b); extern void ResetDamageCalcDiagnostics(void); -extern bool8 OtherMonsterAbilityIsActive(struct entity *entity, enum ability_id ability_id); extern void MultiplyFixedPoint64(struct fixed_point_64 *out, const struct fixed_point_64 *a, const struct fixed_point_64 *b); extern bool8 UpdateStateFlags(struct monster *info, s32 flag, bool8 value); extern void ResetDamageData(struct unk_02308FE0 *damage_data); diff --git a/src/overlay_29_0230F8AC.c b/src/overlay_29_0230F8AC.c index 1e93f793..2cc6dcae 100644 --- a/src/overlay_29_0230F8AC.c +++ b/src/overlay_29_0230F8AC.c @@ -5,6 +5,19 @@ #include "dungeon_util_static.h" #include "exclusive_item.h" #include "overlay_29_0230F810.h" +#include "dg_random.h" +#include "dungeon_pokemon_attributes.h" +#include "dungeon_pokemon_attributes_1.h" +#include "dungeon_recruitment_2.h" +#include "overlay_29_02344BE4.h" +#include "overlay_29_02345A3C.h" + +extern struct dungeon *DUNGEON_PTR; +extern const s16 ov10_022C4650; + +extern bool8 TryGenerateUnownStoneDrop(struct item *item, s16 monster_id, s32 param_3); +extern bool8 ov29_023460DC(struct item *item, struct entity *entity, bool8 param_3, s32 param_4); +extern bool8 ov29_0234908C(struct item *item); bool8 ExclusiveItemEffectIsActive__0230F8AC(struct entity *entity, enum exclusive_item_effect_id effect_id) { @@ -39,3 +52,51 @@ bool8 IsMonster__0230F980(struct entity *entity) return GetEntityType(entity) == ENTITY_MONSTER; } + +void ov29_0230F9A4(struct entity *entity, struct item *item) +{ + if (!IsMonster__0230F980(entity)) + return; + + if (GetEntInfo(entity)->is_not_team_member) + return; + + ov29_0234908C(item); +} + +void TrySpawnEnemyItemDrop(struct entity *attacker, struct entity *defender) +{ + struct item item; + struct monster *monster; + s16 n; + + if (TreasureBoxDropsEnabled(DUNGEON_PTR->id) && + (monster = GetEntInfo(defender))->is_not_team_member) + { + n = 0; + if (GetEntityType(attacker) == ENTITY_MONSTER) + { + if (IqSkillIsEnabled(attacker, IQ_COLLECTOR)) + n++; + if (ExclusiveItemEffectIsActive__0230F8AC(attacker, EXCLUSIVE_EFF_MORE_TREASURE_DROPS)) + n++; + } + + if (TryGenerateUnownStoneDrop(&item, monster->id, n)) + { + SpawnDroppedItemWrapper(defender, &defender->pos, &item, 1); + } + else if (ov29_023460DC(&item, defender, + AbilityIsActiveVeneer(attacker, ABILITY_HONEY_GATHER), n)) + { + SpawnDroppedItemWrapper(defender, &defender->pos, &item, 1); + } + else if (IsMonster__0230F980(attacker) && + ExclusiveItemEffectIsActive__0230F8AC(attacker, EXCLUSIVE_EFF_MORE_MONEY_DROPS) && + DungeonRandOutcome__022EAB20(ov10_022C4650)) + { + GenerateStandardItem(&item, ITEM_POKE, 2); + SpawnDroppedItemWrapper(defender, &defender->pos, &item, 1); + } + } +} diff --git a/src/overlay_29_02311010.c b/src/overlay_29_02311010.c index 426cd964..a15cdca9 100644 --- a/src/overlay_29_02311010.c +++ b/src/overlay_29_02311010.c @@ -26,6 +26,8 @@ #include "overlay_29_022E99F0.h" #include "overlay_29_02305C04.h" #include "overlay_29_022E4338.h" +#include "overlay_29_0231B194.h" +#include "overlay_29_0234B104.h" extern s16 ov10_022C4BE4[20]; extern void ov29_0230FB30(struct entity *entity); @@ -61,14 +63,12 @@ extern bool8 ov29_022E34A8_EU(struct entity *entity); extern void ApplyDamageAndEffectsWrapper(struct entity *entity, s32 damage, s32 a, s32 b); extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); extern bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity *user, struct entity *target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id); -extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); extern void MultiplyFixedPoint64(struct fixed_point_64 *out, const struct fixed_point_64 *a, const struct fixed_point_64 *b); extern void ov29_022EA370(s32 a, s32 b); extern s32 ov29_022F2FE4(); -extern void WaitUntilAlertBoxTextIsLoadedWrapper(void); extern void EnsureCanStandCurrentTile(struct entity *entity); extern void ov29_022E543C(struct entity *entity); extern void ov29_022E53F0(struct entity *entity); @@ -76,7 +76,6 @@ extern void ov29_022F42F8(struct entity *entity); extern void EndMagnetRiseStatus(struct entity *user, struct entity *target); extern void ov29_022EC62C(struct entity *entity); extern void ov29_022FB718(struct entity *entity); -extern void TryActivateBadDreams(struct entity *entity); extern void TryWeatherFormChange(struct entity *entity); extern s32 EndNegativeStatusCondition(struct entity *user, struct entity *target, bool8 a, bool8 b, bool8 c); extern s32 DisplayActions(s32 a); diff --git a/src/overlay_29_0231B194.c b/src/overlay_29_0231B194.c index c190b0bf..ea02ac4b 100644 --- a/src/overlay_29_0231B194.c +++ b/src/overlay_29_0231B194.c @@ -1,5 +1,14 @@ #include "overlay_29_0231B194.h" #include "dungeon_util_static.h" +#include "dungeon_capabilities.h" +#include "dungeon_visibility.h" +#include "overlay_29_0231B318.h" +#include "overlay_29_0234B024.h" + +extern struct dungeon *DUNGEON_PTR; +extern const s16 ov10_022C4530; +extern void ApplyDamageAndEffectsWrapper(struct entity *entity, s32 damage, s32 a, s32 b); +extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); bool8 EntityIsValid__0231B194(struct entity *entity) { @@ -8,3 +17,43 @@ bool8 EntityIsValid__0231B194(struct entity *entity) return GetEntityType(entity) != ENTITY_NOTHING; } + +void TryActivateBadDreams(struct entity *attacker) +{ + struct entity *targets[DUNGEON_MAX_POKEMON]; + s16 num_targets; + s16 i; + struct entity *target; + bool8 attacker_is_team_member; + + num_targets = 0; + attacker_is_team_member = GetEntInfo(attacker)->is_not_team_member == 0; + + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { + target = DUNGEON_PTR->active_monster_ptrs[i]; + if (!IsMonster__0231B318(target)) + continue; + if (attacker_is_team_member) { + if (!GetEntInfo(target)->is_not_team_member) + continue; + } else { + if (GetEntInfo(target)->is_not_team_member) + continue; + } + targets[num_targets++] = target; + } + + SetPreprocessorArgsIdVal(2, ABILITY_BAD_DREAMS); + + for (i = 0; i < num_targets; i++) { + target = targets[i]; + if (target != NULL && IsMonster__0231B318(target) && + IsValidTargetEntity(attacker, target) && attacker != target && + IsMonsterSleeping(target)) { + ApplyDamageAndEffectsWrapper(target, ov10_022C4530, 0x18, + DAMAGE_SOURCE_BAD_DREAMS); + if (EntityIsValid__0231B194(target)) + TryEndPetrifiedOrSleepStatus(attacker, target); + } + } +} diff --git a/src/overlay_29_0231CBC8.c b/src/overlay_29_0231CBC8.c index bf627602..eff1ddf3 100644 --- a/src/overlay_29_0231CBC8.c +++ b/src/overlay_29_0231CBC8.c @@ -14,6 +14,7 @@ #include "overlay_29_02345A3C.h" #include "overlay_29_02305C04.h" #include "overlay_29_0234B340.h" +#include "overlay_29_0230F8AC.h" #ifdef JAPAN #define MESSAGE_BE6 0x925 @@ -82,7 +83,6 @@ extern void TryInflictEyedropStatus(struct entity *user, struct entity *target); extern bool8 TryInflictSlipStatus(struct entity *user, struct entity *target); extern void ov29_022E5A00(struct entity *entity, struct item *item); extern void ov29_022E5AE4(struct entity *entity, struct item *item); -extern void ov29_0230F9A4(struct entity *entity, struct item *item); extern bool8 ov29_022FB9BC(struct entity *entity); extern void ov29_022F9EA0(struct entity *entity); extern void EnemyEvolution(struct entity *entity); diff --git a/src/overlay_29_0231EDD8.c b/src/overlay_29_0231EDD8.c index a73ed0b8..a5c229d8 100644 --- a/src/overlay_29_0231EDD8.c +++ b/src/overlay_29_0231EDD8.c @@ -1,5 +1,56 @@ #include "overlay_29_0231EDD8.h" #include "dungeon_util_static.h" +#include "dg_object.h" +#include "dg_random.h" +#include "dungeon_ai_targeting_1.h" +#include "dungeon_map_access.h" +#include "dungeon_pokemon_attributes.h" +#include "dungeon_pokemon_attributes_1.h" +#include "dungeon_util.h" +#include "dungeon_util_2.h" +#include "dungeon_visibility.h" +#include "main_020018D0.h" +#include "moves_1.h" +#include "overlay_29_022E272C.h" +#include "overlay_29_022E9FC0.h" +#include "overlay_29_022EAC7C.h" +#include "overlay_29_0231F570.h" +#include "overlay_29_02321238.h" +#include "overlay_29_0234B340.h" +#include "position_util.h" +#include "util.h" + +#ifdef JAPAN +#define MESSAGE_E45 0xB86 +#define MESSAGE_E46 0xB87 +#define MESSAGE_E47 0xB88 +#define MESSAGE_E48 0xB89 +#else +#define MESSAGE_E45 0xE45 +#define MESSAGE_E46 0xE46 +#define MESSAGE_E47 0xE47 +#define MESSAGE_E48 0xE48 +#endif + +struct unk_022E9298 { + s32 field_0x0; + s32 field_0x4; + s32 field_0x8; + s32 field_0xc; +}; + +extern struct dungeon *DUNGEON_PTR[]; +extern const s16 HURL_DAMAGE; +extern void CalcDamageFixedNoCategory(struct entity *attacker, struct entity *defender, s16 fixed_damage, s32 a, bool8 *flag, s32 b, s32 damage_source, s32 c, s32 d, s32 e); +extern void ChangeMonsterAnimation(struct entity *entity, s32 animation_id, s32 direction); +extern void ChangeMonsterAnimationToIdle(struct entity *monster, s32 direction); +extern void MoveMonsterToPos(struct entity *entity, s32 x_pos, s32 y_pos, bool8 reset_prev_pos_fields); +extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); +extern bool8 TwoTurnMoveForcedMiss(struct entity *target, struct move *move); +extern void ov29_022E9298(struct position *pos, struct unk_022E9298 *bounds, bool8 a); +extern void ov29_022EA370(s32 a, s32 b); +extern bool8 CannotMoveToTile(struct entity *entity, struct position *pos); +extern void ov29_0232033C(struct entity *entity, struct position *pos); bool8 EntityIsValid__0231EDD8(struct entity *entity) { @@ -8,3 +59,208 @@ bool8 EntityIsValid__0231EDD8(struct entity *entity) return GetEntityType(entity) != ENTITY_NOTHING; } + +void TryHurl(struct entity *user, struct entity *target) +{ + struct position list[40]; + struct unk_022E9298 bounds; + struct position dest; + struct pixel_position pixel_pos; + s32 i; + s32 j; + s32 pass; + struct entity *monster; + s32 count; + s32 dir; + s32 end_x; + s32 angle; + s32 anim_dir; + s32 num_frames; + s32 px; + s32 step_x; + s32 step_y; + bool8 suction_cups; + s32 idx; + s32 end_y; + struct entity *occupant; + + if (user != target && (user == NULL ? FALSE : (bool8)(GetEntityType(user) == ENTITY_MONSTER)) && AbilityIsActiveVeneer(user, ABILITY_MOLD_BREAKER)) + suction_cups = FALSE; + else + suction_cups = AbilityIsActiveVeneer(target, ABILITY_SUCTION_CUPS); + + if (suction_cups) { + SubstitutePlaceholderStringTags(0, target, 0); + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_E45); + return; + } + + if (user == target) { + SubstitutePlaceholderStringTags(0, target, 0); + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_E46); + return; + } + + dest = target->pos; + count = 0; + + for (pass = 0; pass < 2; pass++) { + count = 0; + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { + monster = DUNGEON_PTR[0]->active_monster_ptrs[i]; + if (!EntityIsValid__0231F570(monster) || user == monster || target == monster) + continue; + if (!CanSeeTarget(user, monster)) + continue; + if (pass == 0) { + if (GetTreatmentBetweenMonsters(user, monster, FALSE, TRUE) != + TREATMENT_TREAT_AS_ENEMY) + continue; + } else { + if (GetTreatmentBetweenMonsters(user, monster, FALSE, TRUE) != + TREATMENT_TREAT_AS_ALLY) + continue; + } + + if (pass == 0) { + struct position pos; + + for (j = 0; j < NUM_DIRECTIONS; j++) { + pos.x = monster->pos.x + DIRECTIONS_XY[j].x; + pos.y = monster->pos.y + DIRECTIONS_XY[j].y; + if (!CannotMoveToTile(target, &pos) && + !(GetTile(pos.x, pos.y)->terrain_flags & 0x800)) + break; + } + if (j != NUM_DIRECTIONS && count < 40) { + list[count++] = monster->pos; + } + } else { + struct position pos; + + for (j = 0; j < NUM_DIRECTIONS; j++) { + pos.x = monster->pos.x + DIRECTIONS_XY[j].x; + pos.y = monster->pos.y + DIRECTIONS_XY[j].y; + if (!CannotMoveToTile(target, &pos) && + !(GetTile(pos.x, pos.y)->terrain_flags & 0x800) && count < 40) { + list[count++] = pos; + } + } + } + } + if (count != 0) + break; + } + + if (count != 0) { + idx = DungeonRandInt(count); + dest = list[idx]; + } else { + struct position pos; + + ov29_022E9298(&user->pos, &bounds, HasDropeyeStatus(user)); + for (j = 0; j < 100; j++) { + pos.x = DungeonRandRange(bounds.field_0x0, bounds.field_0x8); + pos.y = DungeonRandRange(bounds.field_0x4, bounds.field_0xc); + if (!CannotMoveToTile(target, &pos) && + !(GetTile(pos.x, pos.y)->terrain_flags & 0x800)) { + dest = pos; + break; + } + } + if (j == 100) { + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_E48); + return; + } + } + + SubstitutePlaceholderStringTags(0, target, 0); + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_E47); + if (ShouldDisplayEntityWrapper(target)) + PlaySeByIdIfNotSilence(0x212); + + anim_dir = GetEntInfo(target)->action.direction; + angle = 0; + num_frames = Max(dest.x - target->pos.x, dest.y - target->pos.y) * 16; + if (num_frames > 80) + num_frames = 80; + if (num_frames < 10) + num_frames = 10; + dir = GetDirectionTowardsPosition(&dest, &target->pos); + end_x = ((dest.x * 24 + 12) << 8) + (DIRECTIONS_XY[dir].x << 8) / 3; + end_y = ((dest.y * 24 + 16) << 8) + (DIRECTIONS_XY[dir].y << 8) / 3; + px = target->pixel_pos.x; + step_y = (end_y - (s32)target->pixel_pos.y) / num_frames; + pixel_pos.x = px; + pixel_pos.y = target->pixel_pos.y; + i = 0; + step_x = (end_x - px) / num_frames; + + while (i < num_frames) { + pixel_pos.x += step_x; + pixel_pos.y += step_y; + UpdateEntityPixelPos(target, &pixel_pos); + if (ShouldDisplayEntityWrapper(target)) { + target->elevation = SinAbs4096(angle) << 5; + AdvanceFrame(0x3B); + if (!(i & 3)) { + anim_dir &= 7; + ChangeMonsterAnimation(target, 6, anim_dir); + anim_dir++; + } + } + angle += 0x800 / num_frames; + i++; + } + + pixel_pos.x = end_x; + pixel_pos.y = end_y; + target->elevation = 0; + UpdateEntityPixelPos(target, &pixel_pos); + AdvanceFrame(0x3B); + GetEntInfo(target)->action.direction = anim_dir & 7; + + occupant = GetTile(dest.x, dest.y)->monster; + if (!EntityIsValid__0231F570(occupant)) { + MoveMonsterToPos(target, dest.x, dest.y, TRUE); + ov29_02321238(target); + return; + } + + for (j = 0; j < NUM_DIRECTIONS; j++) { + struct position pos; + + pos.x = dest.x + DIRECTIONS_XY[j].x; + pos.y = dest.y + DIRECTIONS_XY[j].y; + if (!CannotMoveToTile(target, &pos) && + !(GetTile(pos.x, pos.y)->terrain_flags & 0x800)) { + dest = pos; + break; + } + } + + if (j == NUM_DIRECTIONS) { + TryWarp(user, target, 0, 0); + } else { + ov29_0232033C(target, &dest); + MoveMonsterToPos(target, dest.x, dest.y, TRUE); + } + + if (GetEntityType(occupant) == ENTITY_MONSTER) { + struct move move; + + InitMove(&move, MOVE_REGULAR_ATTACK); + if (!TwoTurnMoveForcedMiss(occupant, &move)) + CalcDamageFixedNoCategory(user, occupant, HURL_DAMAGE, 0, NULL, 0, + DAMAGE_SOURCE_FLYING_MONSTER, 0, 0, 0); + if (EntityIsValid__0231F570(occupant)) + ChangeMonsterAnimationToIdle(occupant, GetEntInfo(occupant)->action.direction); + } + + CalcDamageFixedNoCategory(user, target, HURL_DAMAGE, 0, NULL, 0, + DAMAGE_SOURCE_KNOCKED_FLYING, 0, 0, 0); + if (EntityIsValid__0231F570(target)) + ChangeMonsterAnimationToIdle(target, GetEntInfo(target)->action.direction); + ov29_022EA370(0x1E, 0x3B); + ov29_02321238(target); +} diff --git a/src/overlay_29_0232D1DC.c b/src/overlay_29_0232D1DC.c index 8b485c38..c056caf8 100644 --- a/src/overlay_29_0232D1DC.c +++ b/src/overlay_29_0232D1DC.c @@ -1,5 +1,6 @@ #include "overlay_29_0232D1DC.h" #include "move_orb_effects.h" +#include "overlay_29_0231EDD8.h" extern s32 DealDamage(struct entity *attacker, struct entity *defender, struct move *move, s32 damageMultiplier, enum item_id item_id); @@ -11,7 +12,6 @@ extern void RevealStairs(struct entity *user, struct entity *target); extern void TryInflictMobileStatus(struct entity *user, struct entity *target); -extern void TryHurl(struct entity *user, struct entity *target); bool8 DoMoveHurl(struct entity* attacker, struct entity* defender, struct move* move, enum item_id item_id) { diff --git a/src/overlay_29_0233836C.c b/src/overlay_29_0233836C.c index ace89675..05055593 100644 --- a/src/overlay_29_0233836C.c +++ b/src/overlay_29_0233836C.c @@ -2,10 +2,10 @@ #include "dungeon.h" #include "main_0200330C.h" #include "overlay_29_02337CA8.h" +#include "overlay_29_0234B104.h" extern struct dungeon *DUNGEON_PTR[]; -extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); extern void ov29_02306D54(struct entity *); void ResetGravity(void) diff --git a/src/overlay_29_0234B104.c b/src/overlay_29_0234B104.c index 3ce15f79..b005b311 100644 --- a/src/overlay_29_0234B104.c +++ b/src/overlay_29_0234B104.c @@ -1,6 +1,16 @@ #include "overlay_29_0234B104.h" #include "main_0200C4FC.h" #include "overlay_29_0234B024.h" +#include "main_0202593C.h" +#include "overlay_29_022E272C.h" +#include "overlay_29_022E9FC0.h" +#include "overlay_29_0234B340.h" + +extern void InitPreprocessorArgs(struct preprocessor_args *args); +extern void LogMessage(struct entity *user, const char *message, bool8 show_popup); +extern void UnkMapRelatedFunc(u32 switch_case, u32 param_2); +extern void WaitUntilAlertBoxTextIsLoaded(u32 param_1); +extern int FullyCloseAlertBox(void); extern struct message_log_info MESSAGE_LOG_INFO; @@ -13,3 +23,89 @@ void SetMessageLogPreprocessorArgsSpeakerId0x30000(u32 team_index) { MESSAGE_LOG_INFO.alert_box_info->preprocessor_args.speaker_id = team_index | 0x30000; } + +void ov29_0234B130(void) +{ + s32 i; + + for (i = 0; i < 10; i++) { + MESSAGE_LOG_INFO.alert_box_info->message_starts_group[i] = FALSE; + } + + MESSAGE_LOG_INFO.alert_box_info->alert_box_window_id = -2; + MESSAGE_LOG_INFO.alert_box_info->field_0xcee = 0; + MESSAGE_LOG_INFO.alert_box_info->field_0xced = 0; + MESSAGE_LOG_INFO.last_user = NULL; + MESSAGE_LOG_INFO.should_start_group = TRUE; + ov29_0234B1A4(FALSE); + InitPreprocessorArgs(&MESSAGE_LOG_INFO.alert_box_info->preprocessor_args); +} + +void ov29_0234B1A4(bool8 param_1) +{ + s32 i; + + if (!ov29_022E9FC0()) + return; + + for (i = 0; i < 10; i++) { + MESSAGE_LOG_INFO.alert_box_info->alert_box_messages[i][0] = 0; + } + + MESSAGE_LOG_INFO.alert_box_info->field_0xc8b = 0; + MESSAGE_LOG_INFO.alert_box_info->alert_box_current_idx = 0; + MESSAGE_LOG_INFO.alert_box_info->alert_box_current_loaded_idx = 0; + MESSAGE_LOG_INFO.alert_box_info->frames_until_close = 0; + MESSAGE_LOG_INFO.alert_box_info->field_0xc92 = 4; + MESSAGE_LOG_INFO.alert_box_info->loading_status = 0; + + if (FullyCloseAlertBox() && param_1) { + UnkMapRelatedFunc(0, 0); + AdvanceFrame(11); + } +} + +void LogMessageByIdWithPopupCheckParticipants(struct entity *user, struct entity *target, + u32 message_id, s32 pos, s16 val) +{ + MESSAGE_LOG_INFO.alert_box_info->preprocessor_args.id_vals[pos] = val; + + if (target != NULL && user != NULL) { + LogMessageByIdWithPopupCheckUserTarget(user, target, message_id); + } + else if (user != NULL) { + LogMessageByIdWithPopupCheckUser(user, message_id); + } +} + +void WaitUntilAlertBoxTextIsLoadedWrapper(void) +{ + WaitUntilAlertBoxTextIsLoaded(0x50); +} + +void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id) +{ + bool8 display = FALSE; + + if (ShouldDisplayEntityWrapper(user)) + display = TRUE; + + if (display) + LogMessage(user, (char *)StringFromId(message_id), TRUE); +} + +void LogMessageWithPopupCheckUser(struct entity *user, const char *message) +{ + bool8 display = FALSE; + + if (ShouldDisplayEntityWrapper(user)) + display = TRUE; + + if (display) + LogMessage(user, message, TRUE); +} + +void LogMessageByIdQuiet(struct entity *user, u32 message_id) +{ + LogMessage(user, (char *)StringFromId(message_id), FALSE); +} diff --git a/src/overlay_31_02382820.c b/src/overlay_31_02382820.c index a577683d..7ba84da0 100644 --- a/src/overlay_31_02382820.c +++ b/src/overlay_31_02382820.c @@ -11,6 +11,7 @@ #include "dungeon_util_2.h" #include "overlay_29_022E9FC0.h" #include "main_0202A66C.h" +#include "main_02026174.h" extern struct dungeon *DUNGEON_PTR[]; @@ -35,7 +36,6 @@ extern u32 GetMoneyCarried(void); extern u32 sub_0204F9E0(void); extern u8* StringFromId(u32); extern void PreprocessString(u8* dst, u32 dsize, const u8* src, u32 flags, struct PPStrValues* ptr); -extern void DrawTextInWindow(s32, u32, u32, u8*); extern u8* AllocateTemp1024ByteBufferFromPool(void); extern s32 sub_020265A8(u8*); // Measures the text's width in pixels diff --git a/src/overlay_31_02383880.c b/src/overlay_31_02383880.c index 0452a00c..411b45b5 100644 --- a/src/overlay_31_02383880.c +++ b/src/overlay_31_02383880.c @@ -5,6 +5,7 @@ #include "main_02001188.h" #include "main_020282F4.h" #include "overlay_29_022E9FC0.h" +#include "main_02026174.h" extern struct dungeon *DUNGEON_PTR[]; extern struct loc_struct* OVERLAY31_UNKNOWN_POINTER__NA_238A26C; @@ -14,7 +15,6 @@ extern bool8 ov10_022BCD10(s8); extern void CloseInventoryMenu(s8); extern void ov29_0234E988(u8*); extern void CloseTextBox2(); -extern void DrawTextInWindow(struct window*, u32, u32, u8*); u8 ov31_0238372C(struct position* x) { @@ -58,9 +58,9 @@ void ov31_023837C8(void) void ov31_02383854(struct window* w) { #ifdef JAPAN - DrawTextInWindow(w, 2, 2, StringFromId(0x1d3e)); + DrawTextInWindow((s32)w, 2, 2, StringFromId(0x1d3e)); #else - DrawTextInWindow(w, 2, 2, StringFromId(0x08e6)); + DrawTextInWindow((s32)w, 2, 2, StringFromId(0x08e6)); #endif } diff --git a/src/status_checks.c b/src/status_checks.c index 5fb496e2..24fa22ea 100644 --- a/src/status_checks.c +++ b/src/status_checks.c @@ -6,6 +6,7 @@ #include "dungeon_statuses.h" #include "dungeon_util_static.h" #include "dungeon_util_2.h" +#include "overlay_29_0234B104.h" #ifdef JAPAN #define HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET -0x2C1 @@ -20,7 +21,6 @@ #define INFATUATED_MESSAGE (0xC2C + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET) #define BIDE_MESSAGE (0xC2D + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET) -extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); bool8 HasStatusThatPreventsActing(struct entity *monster) { diff --git a/src/type_effectiveness.c b/src/type_effectiveness.c index 4ddc0d23..61852906 100644 --- a/src/type_effectiveness.c +++ b/src/type_effectiveness.c @@ -13,11 +13,11 @@ #include "type_matchup_table.h" #include "weather.h" #include "overlay_29_0234B340.h" +#include "overlay_29_0234B104.h" extern struct dungeon *DUNGEON_PTR; extern bool8 UpdateStateFlags(struct monster *info, s32 flag, bool8 value); -extern void LogMessageByIdWithPopupCheckParticipants(struct entity *user, struct entity *target, u32 message_id, s32 a4, s32 a5); extern void MultiplyFixedPoint64(struct fixed_point_64 *out, const struct fixed_point_64 *a, const struct fixed_point_64 *b); extern bool8 GhostImmunityIsActive(struct entity *attacker, struct entity *defender, s16 target_type_idx); extern bool8 IsTypeIneffectiveAgainstGhost(enum type_id type);