From a541558add6b59ee86ad4cacc189144e48dd9f5a Mon Sep 17 00:00:00 2001 From: AnonymousRandomPerson Date: Wed, 18 Jun 2025 18:45:03 -0500 Subject: [PATCH 1/2] Decomped UpdateAiTargetPos --- asm/include/overlay_29_022F7388.inc | 51 +-- asm/include/overlay_29_022F9194.inc | 25 ++ asm/overlay_29_022F7388.s | 507 ---------------------------- asm/overlay_29_022F9194.s | 478 ++++++++++++++++++++++++++ include/dungeon_misc.h | 9 + main.lsf | 2 + src/dungeon_ai_itcm.c | 2 +- src/dungeon_misc.c | 10 + 8 files changed, 540 insertions(+), 544 deletions(-) create mode 100644 asm/include/overlay_29_022F9194.inc create mode 100644 asm/overlay_29_022F9194.s create mode 100644 include/dungeon_misc.h create mode 100644 src/dungeon_misc.c diff --git a/asm/include/overlay_29_022F7388.inc b/asm/include/overlay_29_022F7388.inc index 71a9164d..b5a96378 100644 --- a/asm/include/overlay_29_022F7388.inc +++ b/asm/include/overlay_29_022F7388.inc @@ -1,27 +1,23 @@ #pragma once .public AbilityIsActiveVeneer .public CanAttackInDirection -.public CASTFORM_WEATHER_ATTRIBUTE_TABLE .public CeilFixedPoint .public CheckTeamMemberIdx +.public DIRECTIONS_XY +.public DUNGEON_PTR .public DeleteWanTableEntryVeneer .public DetermineMonsterShadow -.public DIRECTIONS_XY .public DirectoryFileMngr_GetDirectoryFileSize .public DiscoverMinimap .public DisplayMessage .public DisplayMessage2 .public DrawMinimapTile -.public DUNGEON_PTR -.public DungeonRandInt .public EnableAllLearnableIqSkills .public EndFrozenClassStatus .public EntityIsValid__022F7364 .public FreeOtherWrappedMonsters .public GendersEqualNotGenderless -.public GetAbility .public GetActiveTeamMember -.public GetApparentWeather .public GetBodySize .public GetForcedLossReason .public GetLeader @@ -29,7 +25,6 @@ .public GetMinimapDataE447 .public GetMonsterGender .public GetMonsterName -.public GetMoveTypeForMonster .public GetNumberOfAttacks .public GetSpriteFileSize .public GetSpriteIndex__020526EC @@ -37,15 +32,11 @@ .public GetTile .public GetTileAtEntity .public GetTileSafe -.public GetType .public IQ_SKILLS .public IsLevelResetDungeon -.public IsMonster__022F9720 .public IsMonsterIdInNormalRange .public IsOutlawOrChallengeRequestFloor .public IsRecruitingAllowed -.public IsSecretBazaarNpcBehavior -.public IsSecretFloor .public IsShaymin .public ItemZInit .public JoinedAtRangeCheck @@ -53,21 +44,26 @@ .public LEADER_PTR .public LoadWanTableEntryFromPack .public LoadWanTableEntryFromPackUseProvidedMemory -.public LogMessageByIdWithPopupCheckUser -.public LogMessageByIdWithPopupCheckUserTarget -.public LowerSpeed .public MemAlloc .public MemFree -.public MonsterIsType .public OpenMessageLog -.public ov10_022C4C6E -.public ov10_022C4C70 +.public PopulateActiveMonsterPtrs +.public RemoveHolderForItemInBag +.public ReplaceWanFromBinFile +.public RevertGiratinaAndShaymin +.public SetForcedLossReason +.public SetMissionTargetEnemyDefeated +.public ShouldMonsterRunAway +.public StoryRestrictionsEnabled +.public TEAM_MEMBER_TABLE_PTR +.public UpdateMapSurveyorFlag +.public UpdateMinimap +.public WAN_TABLE +.public YesNoMenu .public ov29_022DDB68 .public ov29_022E1C0C .public ov29_022E2470 .public ov29_022E2A78 -.public ov29_022E6260 -.public ov29_022E647C .public ov29_022E68BC .public ov29_022E8104 .public ov29_022E81F8 @@ -85,29 +81,12 @@ .public ov29_02349688 .public ov29_0234B010 .public ov29_0234B06C -.public ov29_0234B084 .public ov29_0234B0B4 .public ov29_0234B1A4 .public ov29_0234EF24 .public ov29_0237C9B0 -.public PopulateActiveMonsterPtrs -.public RemoveHolderForItemInBag -.public ReplaceWanFromBinFile -.public RevertGiratinaAndShaymin -.public SetForcedLossReason -.public SetMissionTargetEnemyDefeated -.public ShouldMonsterRunAway -.public StoryRestrictionsEnabled .public sub_02053250 .public sub_0205349C .public sub_02056228 .public sub_020566C4 .public sub_020585B4 -.public SubstitutePlaceholderStringTags -.public TEAM_MEMBER_TABLE_PTR -.public TryEndStatusWithAbility -.public UpdateMapSurveyorFlag -.public UpdateMinimap -.public WAN_TABLE -.public WEATHER_BALL_TYPE_TABLE -.public YesNoMenu diff --git a/asm/include/overlay_29_022F9194.inc b/asm/include/overlay_29_022F9194.inc new file mode 100644 index 00000000..e62589ba --- /dev/null +++ b/asm/include/overlay_29_022F9194.inc @@ -0,0 +1,25 @@ +#pragma once +.public AbilityIsActiveVeneer +.public CASTFORM_WEATHER_ATTRIBUTE_TABLE +.public DUNGEON_PTR +.public DungeonRandInt +.public EntityIsValid__022F7364 +.public GetAbility +.public GetApparentWeather +.public GetMoveTypeForMonster +.public GetType +.public IsMonster__022F9720 +.public IsSecretBazaarNpcBehavior +.public IsSecretFloor +.public LogMessageByIdWithPopupCheckUser +.public LogMessageByIdWithPopupCheckUserTarget +.public LowerSpeed +.public MonsterIsType +.public SubstitutePlaceholderStringTags +.public TryEndStatusWithAbility +.public WEATHER_BALL_TYPE_TABLE +.public ov10_022C4C6E +.public ov10_022C4C70 +.public ov29_022E6260 +.public ov29_022E647C +.public ov29_0234B084 diff --git a/asm/overlay_29_022F7388.s b/asm/overlay_29_022F7388.s index e9953daf..6e519eca 100644 --- a/asm/overlay_29_022F7388.s +++ b/asm/overlay_29_022F7388.s @@ -2440,510 +2440,3 @@ _022F90F8: add sp, sp, #0xc ldmia sp!, {r4, r5, pc} arm_func_end ov29_022F9058 - - arm_func_start UpdateAiTargetPos -UpdateAiTargetPos: ; 0x022F9144 - stmdb sp!, {r3, lr} - ldr lr, [r0, #0xb4] - ldr r2, _022F918C ; =DIRECTIONS_XY - ldrb r3, [lr, #0x4c] - ldrsh ip, [r0, #4] - add r1, lr, #0x100 - mov r3, r3, lsl #2 - ldrsh r3, [r2, r3] - ldr r2, _022F9190 ; =DIRECTIONS_XY + 2 - add r3, ip, r3 -#ifdef JAPAN - strh r3, [r1, #0x7a] -#else - strh r3, [r1, #0x7e] -#endif - ldrb r3, [lr, #0x4c] - ldrsh ip, [r0, #6] - mov r0, r3, lsl #2 - ldrsh r0, [r2, r0] - add r0, ip, r0 -#ifdef JAPAN - strh r0, [r1, #0x7c] -#else - strh r0, [r1, #0x80] -#endif - ldmia sp!, {r3, pc} - .align 2, 0 -_022F918C: .word DIRECTIONS_XY -_022F9190: .word DIRECTIONS_XY + 2 - arm_func_end UpdateAiTargetPos - - arm_func_start SetMonsterTypeAndAbility -SetMonsterTypeAndAbility: ; 0x022F9194 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r1, #0x25 - ldr r4, [r5, #0xb4] - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _022F91D8 - mov r0, r5 - bl GetApparentWeather - mov r1, #6 - mul r2, r0, r1 - ldr r1, _022F9234 ; =CASTFORM_WEATHER_ATTRIBUTE_TABLE - mov r0, #0 - ldrb r1, [r1, r2] - strb r1, [r4, #0x5e] - strb r0, [r4, #0x5f] - b _022F91FC -_022F91D8: - mov r5, #0 -_022F91DC: - ldrsh r0, [r4, #2] - mov r1, r5 - bl GetType - add r1, r4, r5 - add r5, r5, #1 - strb r0, [r1, #0x5e] - cmp r5, #2 - blt _022F91DC -_022F91FC: - mov r5, #0 -_022F9200: - ldrsh r0, [r4, #2] - mov r1, r5 - bl GetAbility - add r1, r4, r5 - add r5, r5, #1 - strb r0, [r1, #0x60] - cmp r5, #2 - blt _022F9200 - ldr r0, _022F9238 ; =DUNGEON_PTR - mov r1, #1 - ldr r0, [r0] - strb r1, [r0, #0xe] - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_022F9234: .word CASTFORM_WEATHER_ATTRIBUTE_TABLE -_022F9238: .word DUNGEON_PTR - arm_func_end SetMonsterTypeAndAbility - - arm_func_start TryActivateSlowStart -TryActivateSlowStart: ; 0x022F923C - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov sb, #0 - mov r7, #1 - ldr r5, _022F92D0 ; =0x00000C17 - ldr r4, _022F92D4 ; =DUNGEON_PTR - mov r6, sb - mov fp, r7 - mov r8, #0x5e -_022F925C: - ldr r0, [r4] - add r0, r0, sb, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr sl, [r0, #0xad4] -#else - ldr sl, [r0, #0xb78] -#endif - mov r0, sl - bl EntityIsValid__022F7364 - cmp r0, #0 - beq _022F92C0 - mov r0, sl - mov r1, r8 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _022F92C0 - mov r0, r7 - mov r1, sl - mov r2, r6 - bl SubstitutePlaceholderStringTags - mov r0, sl - mov r1, r5 - bl LogMessageByIdWithPopupCheckUser - mov r0, sl - mov r1, sl - mov r2, fp - mov r3, #0 - bl LowerSpeed -_022F92C0: - add sb, sb, #1 - cmp sb, #0x14 - blt _022F925C - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -#ifdef JAPAN -_022F92D0: .word 0x00000956 -#else -_022F92D0: .word 0x00000C17 -#endif -_022F92D4: .word DUNGEON_PTR - arm_func_end TryActivateSlowStart - - arm_func_start TryActivateArtificialWeatherAbilities -TryActivateArtificialWeatherAbilities: ; 0x022F92D8 -#ifdef JAPAN -#define TRY_ACTIVATE_ARTIFICIAL_WEATHER_ABILITIES_OFFSET -0xA4 -#else -#define TRY_ACTIVATE_ARTIFICIAL_WEATHER_ABILITIES_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - bl IsSecretFloor - cmp r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - ldr r4, _022F9404 ; =DUNGEON_PTR - ldr r1, [r4] - ldrb r0, [r1, #0xe] - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov sb, #0 - strb sb, [r1, #0xe] - ldr r0, [r4] - mov r5, #1 - add r0, r0, #0xc000 - strb sb, [r0, #0xd5d + TRY_ACTIVATE_ARTIFICIAL_WEATHER_ABILITIES_OFFSET] - mov r6, r5 - mov r7, r5 - mov r8, r5 - mov fp, r5 -_022F9324: - ldr r0, [r4] - add r0, r0, sb, lsl #2 - add r0, r0, #0x12000 - ldr sl, [r0, #0xb78 + TRY_ACTIVATE_ARTIFICIAL_WEATHER_ABILITIES_OFFSET] - mov r0, sl - bl EntityIsValid__022F7364 - cmp r0, #0 - beq _022F93F4 - mov r0, sl - mov r1, #4 - bl AbilityIsActiveVeneer - cmp r0, #0 - ldrne r0, [r4] -#ifdef JAPAN - addne r0, r0, #0xcc00 - strneh r8, [r0, #0xae] -#else - addne r0, r0, #0xcd00 - strneh r8, [r0, #0x52] -#endif - bne _022F93C0 - mov r0, sl - mov r1, #0x1c - bl AbilityIsActiveVeneer - cmp r0, #0 - ldrne r0, [r4] -#ifdef JAPAN - addne r0, r0, #0xcc00 - strneh r7, [r0, #0xaa] -#else - addne r0, r0, #0xcd00 - strneh r7, [r0, #0x4e] -#endif - bne _022F93C0 - mov r0, sl - mov r1, #0x31 - bl AbilityIsActiveVeneer - cmp r0, #0 - ldrne r0, [r4] -#ifdef JAPAN - addne r0, r0, #0xcc00 - strneh r6, [r0, #0xa8] -#else - addne r0, r0, #0xcd00 - strneh r6, [r0, #0x4c] -#endif - bne _022F93C0 - mov r0, sl - mov r1, #0x78 - bl AbilityIsActiveVeneer - cmp r0, #0 - ldrne r0, [r4] -#ifdef JAPAN - addne r0, r0, #0xcc00 - strneh r5, [r0, #0xb0] -#else - addne r0, r0, #0xcd00 - strneh r5, [r0, #0x54] -#endif -_022F93C0: - mov r0, sl - mov r1, #8 - bl AbilityIsActiveVeneer - cmp r0, #0 - bne _022F93E8 - mov r0, sl - mov r1, #0x2d - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _022F93F4 -_022F93E8: - ldr r0, [r4] - add r0, r0, #0xc000 - strb fp, [r0, #0xd5d + TRY_ACTIVATE_ARTIFICIAL_WEATHER_ABILITIES_OFFSET] -_022F93F4: - add sb, sb, #1 - cmp sb, #0x14 - blt _022F9324 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_022F9404: .word DUNGEON_PTR - arm_func_end TryActivateArtificialWeatherAbilities - - arm_func_start GetMonsterApparentId -GetMonsterApparentId: ; 0x022F9408 - stmdb sp!, {r4, lr} - movs r4, r0 - beq _022F94A8 - ldr r2, _022F94E0 ; =0x0000017B - cmp r1, r2 - blt _022F945C - add r2, r2, #3 - cmp r1, r2 - bgt _022F945C - mov r1, #0x25 - bl AbilityIsActiveVeneer - cmp r0, #0 - ldreq r0, _022F94E0 ; =0x0000017B - ldmeqia sp!, {r4, pc} - mov r0, r4 - bl GetApparentWeather - mov r1, #6 - mul r1, r0, r1 - ldr r0, _022F94E4 ; =ov10_022C4C6E - ldrsh r0, [r0, r1] - ldmia sp!, {r4, pc} -_022F945C: - ldr r0, _022F94E8 ; =0x000003D3 - cmp r1, r0 - blt _022F94D8 - add r0, r0, #3 - cmp r1, r0 - bgt _022F94D8 - mov r0, r4 - mov r1, #0x25 - bl AbilityIsActiveVeneer - cmp r0, #0 - ldreq r0, _022F94E8 ; =0x000003D3 - ldmeqia sp!, {r4, pc} - mov r0, r4 - bl GetApparentWeather - mov r1, #6 - mul r1, r0, r1 - ldr r0, _022F94EC ; =ov10_022C4C70 - ldrsh r0, [r0, r1] - ldmia sp!, {r4, pc} -_022F94A8: - ldr r0, _022F94E0 ; =0x0000017B - cmp r1, r0 - blt _022F94C0 - add r2, r0, #3 - cmp r1, r2 - ldmleia sp!, {r4, pc} -_022F94C0: - ldr r0, _022F94E8 ; =0x000003D3 - cmp r1, r0 - blt _022F94D8 - add r2, r0, #3 - cmp r1, r2 - ldmleia sp!, {r4, pc} -_022F94D8: - mov r0, r1 - ldmia sp!, {r4, pc} - .align 2, 0 -_022F94E0: .word 0x0000017B -_022F94E4: .word ov10_022C4C6E -_022F94E8: .word 0x000003D3 -_022F94EC: .word ov10_022C4C70 - arm_func_end GetMonsterApparentId - - arm_func_start TryActivateTraceAndColorChange -TryActivateTraceAndColorChange: ; 0x022F94F0 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - mov sb, r0 - mov r8, r1 - mov r7, r2 - bl EntityIsValid__022F7364 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - mov r0, r8 - bl EntityIsValid__022F7364 - cmp r0, #0 - cmpne sb, r8 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - ldr r5, [sb, #0xb4] - ldr r6, [r8, #0xb4] - ldrb r0, [r5, #0xbc] - bl IsSecretBazaarNpcBehavior - cmp r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - ldrb r0, [r6, #0x60] - mvn r4, #0 - cmp r0, #0x28 - ldrb r0, [r6, #0x61] - moveq r4, #0 - cmp r0, #0x28 - moveq r4, #1 - cmp r4, #0 - blt _022F95FC - ldrb r1, [r5, #0x60] - ldrb r2, [r5, #0x61] - mov r0, #0 - cmp r1, #0 - strneb r1, [sp] - addne r0, r0, #1 - cmp r2, #0 - addne r1, sp, #0 - strneb r2, [r1, r0] - addne r0, r0, #1 - cmp r0, #0 - mvneq r0, #0 - beq _022F95A0 - cmp r0, #1 - moveq r0, #0 - beq _022F95A0 - bl DungeonRandInt -_022F95A0: - cmp r0, #0 - blt _022F95FC - add r1, sp, #0 - ldrb r3, [r1, r0] - ldr r1, _022F96BC ; =DUNGEON_PTR - add r2, r6, r4 - strb r3, [r2, #0x60] - mov r0, #0 - ldr r3, [r1] - mov r4, #1 - mov r1, r8 - mov r2, r0 - strb r4, [r3, #0xe] - bl SubstitutePlaceholderStringTags - ldr r2, _022F96C0 ; =0x00000C18 - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, r8 - bl ov29_022E6260 - mov r0, sb - mov r1, r8 - bl TryEndStatusWithAbility -_022F95FC: -#ifdef JAPAN - ldrb r0, [r6, #0x160] - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - mov r3, #0 -#else - ldrb r0, [r6, #0x164] - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - mov r4, #0 -#endif - mov r0, sb - mov r1, r8 - mov r2, #0x3b -#ifdef JAPAN - strb r3, [r6, #0x160] -#else - mov r3, #1 - strb r4, [r6, #0x164] -#endif - bl DefenderAbilityIsActive__022F96CC - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - mov r0, sb - mov r1, r7 - bl GetMoveTypeForMonster - ldrh r1, [r7, #4] - mov r4, r0 - cmp r1, #0x1f - bne _022F9658 - mov r0, sb - bl GetApparentWeather - ldr r1, _022F96C4 ; =WEATHER_BALL_TYPE_TABLE - ldrb r4, [r1, r0] -_022F9658: - cmp r4, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - mov r0, r8 - mov r1, r4 - bl MonsterIsType - cmp r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - mov r0, #0 - strb r4, [r6, #0x5e] - strb r0, [r6, #0x5f] - mov r3, #1 - mov r1, r8 - mov r2, r0 - strb r3, [r6, #0xff] - bl SubstitutePlaceholderStringTags - ldrb r1, [r6, #0x5e] - mov r0, #0 - bl ov29_0234B084 - ldr r2, _022F96C8 ; =0x00000C19 - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, r8 - bl ov29_022E647C - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_022F96BC: .word DUNGEON_PTR -#ifdef JAPAN -_022F96C0: .word 0x00000957 -_022F96C4: .word WEATHER_BALL_TYPE_TABLE -_022F96C8: .word 0x00000958 -#else -_022F96C0: .word 0x00000C18 -_022F96C4: .word WEATHER_BALL_TYPE_TABLE -_022F96C8: .word 0x00000C19 -#endif - arm_func_end TryActivateTraceAndColorChange - - arm_func_start DefenderAbilityIsActive__022F96CC -DefenderAbilityIsActive__022F96CC: ; 0x022F96CC -#ifdef JAPAN - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - mov r5, r1 - mov r4, r2 - cmp r6, r5 -#else - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r0 - mov r6, r1 - mov r5, r2 - mov r4, r3 - cmp r7, r6 -#endif - beq _022F9710 - bl IsMonster__022F9720 - cmp r0, #0 -#ifdef JAPAN - beq _022F9710 - mov r0, r6 -#else - cmpne r4, #0 - beq _022F9710 - mov r0, r7 -#endif - mov r1, #0x53 - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r0, #0 -#ifdef JAPAN - ldmneia sp!, {r4, r5, r6, pc} -_022F9710: - mov r0, r5 - mov r1, r4 - bl AbilityIsActiveVeneer - ldmia sp!, {r4, r5, r6, pc} -#else - ldmneia sp!, {r3, r4, r5, r6, r7, pc} -_022F9710: - mov r0, r6 - mov r1, r5 - bl AbilityIsActiveVeneer - ldmia sp!, {r3, r4, r5, r6, r7, pc} -#endif - arm_func_end DefenderAbilityIsActive__022F96CC diff --git a/asm/overlay_29_022F9194.s b/asm/overlay_29_022F9194.s new file mode 100644 index 00000000..c8281569 --- /dev/null +++ b/asm/overlay_29_022F9194.s @@ -0,0 +1,478 @@ + .include "asm/macros.inc" + .include "overlay_29_022F9194.inc" + + .text + + arm_func_start SetMonsterTypeAndAbility +SetMonsterTypeAndAbility: ; 0x022F9194 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r1, #0x25 + ldr r4, [r5, #0xb4] + bl AbilityIsActiveVeneer + cmp r0, #0 + beq _022F91D8 + mov r0, r5 + bl GetApparentWeather + mov r1, #6 + mul r2, r0, r1 + ldr r1, _022F9234 ; =CASTFORM_WEATHER_ATTRIBUTE_TABLE + mov r0, #0 + ldrb r1, [r1, r2] + strb r1, [r4, #0x5e] + strb r0, [r4, #0x5f] + b _022F91FC +_022F91D8: + mov r5, #0 +_022F91DC: + ldrsh r0, [r4, #2] + mov r1, r5 + bl GetType + add r1, r4, r5 + add r5, r5, #1 + strb r0, [r1, #0x5e] + cmp r5, #2 + blt _022F91DC +_022F91FC: + mov r5, #0 +_022F9200: + ldrsh r0, [r4, #2] + mov r1, r5 + bl GetAbility + add r1, r4, r5 + add r5, r5, #1 + strb r0, [r1, #0x60] + cmp r5, #2 + blt _022F9200 + ldr r0, _022F9238 ; =DUNGEON_PTR + mov r1, #1 + ldr r0, [r0] + strb r1, [r0, #0xe] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_022F9234: .word CASTFORM_WEATHER_ATTRIBUTE_TABLE +_022F9238: .word DUNGEON_PTR + arm_func_end SetMonsterTypeAndAbility + + arm_func_start TryActivateSlowStart +TryActivateSlowStart: ; 0x022F923C + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sb, #0 + mov r7, #1 + ldr r5, _022F92D0 ; =0x00000C17 + ldr r4, _022F92D4 ; =DUNGEON_PTR + mov r6, sb + mov fp, r7 + mov r8, #0x5e +_022F925C: + ldr r0, [r4] + add r0, r0, sb, lsl #2 + add r0, r0, #0x12000 +#ifdef JAPAN + ldr sl, [r0, #0xad4] +#else + ldr sl, [r0, #0xb78] +#endif + mov r0, sl + bl EntityIsValid__022F7364 + cmp r0, #0 + beq _022F92C0 + mov r0, sl + mov r1, r8 + bl AbilityIsActiveVeneer + cmp r0, #0 + beq _022F92C0 + mov r0, r7 + mov r1, sl + mov r2, r6 + bl SubstitutePlaceholderStringTags + mov r0, sl + mov r1, r5 + bl LogMessageByIdWithPopupCheckUser + mov r0, sl + mov r1, sl + mov r2, fp + mov r3, #0 + bl LowerSpeed +_022F92C0: + add sb, sb, #1 + cmp sb, #0x14 + blt _022F925C + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +#ifdef JAPAN +_022F92D0: .word 0x00000956 +#else +_022F92D0: .word 0x00000C17 +#endif +_022F92D4: .word DUNGEON_PTR + arm_func_end TryActivateSlowStart + + arm_func_start TryActivateArtificialWeatherAbilities +TryActivateArtificialWeatherAbilities: ; 0x022F92D8 +#ifdef JAPAN +#define TRY_ACTIVATE_ARTIFICIAL_WEATHER_ABILITIES_OFFSET -0xA4 +#else +#define TRY_ACTIVATE_ARTIFICIAL_WEATHER_ABILITIES_OFFSET 0 +#endif + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + bl IsSecretFloor + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r4, _022F9404 ; =DUNGEON_PTR + ldr r1, [r4] + ldrb r0, [r1, #0xe] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov sb, #0 + strb sb, [r1, #0xe] + ldr r0, [r4] + mov r5, #1 + add r0, r0, #0xc000 + strb sb, [r0, #0xd5d + TRY_ACTIVATE_ARTIFICIAL_WEATHER_ABILITIES_OFFSET] + mov r6, r5 + mov r7, r5 + mov r8, r5 + mov fp, r5 +_022F9324: + ldr r0, [r4] + add r0, r0, sb, lsl #2 + add r0, r0, #0x12000 + ldr sl, [r0, #0xb78 + TRY_ACTIVATE_ARTIFICIAL_WEATHER_ABILITIES_OFFSET] + mov r0, sl + bl EntityIsValid__022F7364 + cmp r0, #0 + beq _022F93F4 + mov r0, sl + mov r1, #4 + bl AbilityIsActiveVeneer + cmp r0, #0 + ldrne r0, [r4] +#ifdef JAPAN + addne r0, r0, #0xcc00 + strneh r8, [r0, #0xae] +#else + addne r0, r0, #0xcd00 + strneh r8, [r0, #0x52] +#endif + bne _022F93C0 + mov r0, sl + mov r1, #0x1c + bl AbilityIsActiveVeneer + cmp r0, #0 + ldrne r0, [r4] +#ifdef JAPAN + addne r0, r0, #0xcc00 + strneh r7, [r0, #0xaa] +#else + addne r0, r0, #0xcd00 + strneh r7, [r0, #0x4e] +#endif + bne _022F93C0 + mov r0, sl + mov r1, #0x31 + bl AbilityIsActiveVeneer + cmp r0, #0 + ldrne r0, [r4] +#ifdef JAPAN + addne r0, r0, #0xcc00 + strneh r6, [r0, #0xa8] +#else + addne r0, r0, #0xcd00 + strneh r6, [r0, #0x4c] +#endif + bne _022F93C0 + mov r0, sl + mov r1, #0x78 + bl AbilityIsActiveVeneer + cmp r0, #0 + ldrne r0, [r4] +#ifdef JAPAN + addne r0, r0, #0xcc00 + strneh r5, [r0, #0xb0] +#else + addne r0, r0, #0xcd00 + strneh r5, [r0, #0x54] +#endif +_022F93C0: + mov r0, sl + mov r1, #8 + bl AbilityIsActiveVeneer + cmp r0, #0 + bne _022F93E8 + mov r0, sl + mov r1, #0x2d + bl AbilityIsActiveVeneer + cmp r0, #0 + beq _022F93F4 +_022F93E8: + ldr r0, [r4] + add r0, r0, #0xc000 + strb fp, [r0, #0xd5d + TRY_ACTIVATE_ARTIFICIAL_WEATHER_ABILITIES_OFFSET] +_022F93F4: + add sb, sb, #1 + cmp sb, #0x14 + blt _022F9324 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_022F9404: .word DUNGEON_PTR + arm_func_end TryActivateArtificialWeatherAbilities + + arm_func_start GetMonsterApparentId +GetMonsterApparentId: ; 0x022F9408 + stmdb sp!, {r4, lr} + movs r4, r0 + beq _022F94A8 + ldr r2, _022F94E0 ; =0x0000017B + cmp r1, r2 + blt _022F945C + add r2, r2, #3 + cmp r1, r2 + bgt _022F945C + mov r1, #0x25 + bl AbilityIsActiveVeneer + cmp r0, #0 + ldreq r0, _022F94E0 ; =0x0000017B + ldmeqia sp!, {r4, pc} + mov r0, r4 + bl GetApparentWeather + mov r1, #6 + mul r1, r0, r1 + ldr r0, _022F94E4 ; =ov10_022C4C6E + ldrsh r0, [r0, r1] + ldmia sp!, {r4, pc} +_022F945C: + ldr r0, _022F94E8 ; =0x000003D3 + cmp r1, r0 + blt _022F94D8 + add r0, r0, #3 + cmp r1, r0 + bgt _022F94D8 + mov r0, r4 + mov r1, #0x25 + bl AbilityIsActiveVeneer + cmp r0, #0 + ldreq r0, _022F94E8 ; =0x000003D3 + ldmeqia sp!, {r4, pc} + mov r0, r4 + bl GetApparentWeather + mov r1, #6 + mul r1, r0, r1 + ldr r0, _022F94EC ; =ov10_022C4C70 + ldrsh r0, [r0, r1] + ldmia sp!, {r4, pc} +_022F94A8: + ldr r0, _022F94E0 ; =0x0000017B + cmp r1, r0 + blt _022F94C0 + add r2, r0, #3 + cmp r1, r2 + ldmleia sp!, {r4, pc} +_022F94C0: + ldr r0, _022F94E8 ; =0x000003D3 + cmp r1, r0 + blt _022F94D8 + add r2, r0, #3 + cmp r1, r2 + ldmleia sp!, {r4, pc} +_022F94D8: + mov r0, r1 + ldmia sp!, {r4, pc} + .align 2, 0 +_022F94E0: .word 0x0000017B +_022F94E4: .word ov10_022C4C6E +_022F94E8: .word 0x000003D3 +_022F94EC: .word ov10_022C4C70 + arm_func_end GetMonsterApparentId + + arm_func_start TryActivateTraceAndColorChange +TryActivateTraceAndColorChange: ; 0x022F94F0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov sb, r0 + mov r8, r1 + mov r7, r2 + bl EntityIsValid__022F7364 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r0, r8 + bl EntityIsValid__022F7364 + cmp r0, #0 + cmpne sb, r8 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldr r5, [sb, #0xb4] + ldr r6, [r8, #0xb4] + ldrb r0, [r5, #0xbc] + bl IsSecretBazaarNpcBehavior + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldrb r0, [r6, #0x60] + mvn r4, #0 + cmp r0, #0x28 + ldrb r0, [r6, #0x61] + moveq r4, #0 + cmp r0, #0x28 + moveq r4, #1 + cmp r4, #0 + blt _022F95FC + ldrb r1, [r5, #0x60] + ldrb r2, [r5, #0x61] + mov r0, #0 + cmp r1, #0 + strneb r1, [sp] + addne r0, r0, #1 + cmp r2, #0 + addne r1, sp, #0 + strneb r2, [r1, r0] + addne r0, r0, #1 + cmp r0, #0 + mvneq r0, #0 + beq _022F95A0 + cmp r0, #1 + moveq r0, #0 + beq _022F95A0 + bl DungeonRandInt +_022F95A0: + cmp r0, #0 + blt _022F95FC + add r1, sp, #0 + ldrb r3, [r1, r0] + ldr r1, _022F96BC ; =DUNGEON_PTR + add r2, r6, r4 + strb r3, [r2, #0x60] + mov r0, #0 + ldr r3, [r1] + mov r4, #1 + mov r1, r8 + mov r2, r0 + strb r4, [r3, #0xe] + bl SubstitutePlaceholderStringTags + ldr r2, _022F96C0 ; =0x00000C18 + mov r0, sb + mov r1, r8 + bl LogMessageByIdWithPopupCheckUserTarget + mov r0, r8 + bl ov29_022E6260 + mov r0, sb + mov r1, r8 + bl TryEndStatusWithAbility +_022F95FC: +#ifdef JAPAN + ldrb r0, [r6, #0x160] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r3, #0 +#else + ldrb r0, [r6, #0x164] + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r4, #0 +#endif + mov r0, sb + mov r1, r8 + mov r2, #0x3b +#ifdef JAPAN + strb r3, [r6, #0x160] +#else + mov r3, #1 + strb r4, [r6, #0x164] +#endif + bl DefenderAbilityIsActive__022F96CC + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r0, sb + mov r1, r7 + bl GetMoveTypeForMonster + ldrh r1, [r7, #4] + mov r4, r0 + cmp r1, #0x1f + bne _022F9658 + mov r0, sb + bl GetApparentWeather + ldr r1, _022F96C4 ; =WEATHER_BALL_TYPE_TABLE + ldrb r4, [r1, r0] +_022F9658: + cmp r4, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r0, r8 + mov r1, r4 + bl MonsterIsType + cmp r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r0, #0 + strb r4, [r6, #0x5e] + strb r0, [r6, #0x5f] + mov r3, #1 + mov r1, r8 + mov r2, r0 + strb r3, [r6, #0xff] + bl SubstitutePlaceholderStringTags + ldrb r1, [r6, #0x5e] + mov r0, #0 + bl ov29_0234B084 + ldr r2, _022F96C8 ; =0x00000C19 + mov r0, sb + mov r1, r8 + bl LogMessageByIdWithPopupCheckUserTarget + mov r0, r8 + bl ov29_022E647C + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_022F96BC: .word DUNGEON_PTR +#ifdef JAPAN +_022F96C0: .word 0x00000957 +_022F96C4: .word WEATHER_BALL_TYPE_TABLE +_022F96C8: .word 0x00000958 +#else +_022F96C0: .word 0x00000C18 +_022F96C4: .word WEATHER_BALL_TYPE_TABLE +_022F96C8: .word 0x00000C19 +#endif + arm_func_end TryActivateTraceAndColorChange + + arm_func_start DefenderAbilityIsActive__022F96CC +DefenderAbilityIsActive__022F96CC: ; 0x022F96CC +#ifdef JAPAN + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r4, r2 + cmp r6, r5 +#else + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, r2 + mov r4, r3 + cmp r7, r6 +#endif + beq _022F9710 + bl IsMonster__022F9720 + cmp r0, #0 +#ifdef JAPAN + beq _022F9710 + mov r0, r6 +#else + cmpne r4, #0 + beq _022F9710 + mov r0, r7 +#endif + mov r1, #0x53 + bl AbilityIsActiveVeneer + cmp r0, #0 + movne r0, #0 +#ifdef JAPAN + ldmneia sp!, {r4, r5, r6, pc} +_022F9710: + mov r0, r5 + mov r1, r4 + bl AbilityIsActiveVeneer + ldmia sp!, {r4, r5, r6, pc} +#else + ldmneia sp!, {r3, r4, r5, r6, r7, pc} +_022F9710: + mov r0, r6 + mov r1, r5 + bl AbilityIsActiveVeneer + ldmia sp!, {r3, r4, r5, r6, r7, pc} +#endif + arm_func_end DefenderAbilityIsActive__022F96CC diff --git a/include/dungeon_misc.h b/include/dungeon_misc.h new file mode 100644 index 00000000..976666e0 --- /dev/null +++ b/include/dungeon_misc.h @@ -0,0 +1,9 @@ +#ifndef PMDSKY_DUNGEON_MISC_H +#define PMDSKY_DUNGEON_MISC_H + +#include "dungeon_mode.h" + +// Given a monster, updates its target_pos field based on its current position and the direction in which it plans to attack. +void UpdateAiTargetPos(struct entity *monster); + +#endif //PMDSKY_DUNGEON_MISC_H diff --git a/main.lsf b/main.lsf index 76fd9f31..3192e6ca 100644 --- a/main.lsf +++ b/main.lsf @@ -317,6 +317,8 @@ Overlay OVY_29 Object asm/overlay_29_022F62CC.o Object src/overlay_29_022F7364.o Object asm/overlay_29_022F7388.o + Object src/dungeon_misc.o + Object asm/overlay_29_022F9194.o Object src/overlay_29_022F9720.o Object asm/overlay_29_022F9744.o Object src/overlay_29_022FB538.o diff --git a/src/dungeon_ai_itcm.c b/src/dungeon_ai_itcm.c index 8a80382b..1e336d6d 100644 --- a/src/dungeon_ai_itcm.c +++ b/src/dungeon_ai_itcm.c @@ -6,6 +6,7 @@ #include "dungeon_ai_targeting.h" #include "dungeon_capabilities_3.h" #include "dungeon_capabilities_4.h" +#include "dungeon_misc.h" #include "dungeon_mode.h" #include "dungeon_parameters.h" #include "dungeon_pokemon_attributes.h" @@ -21,7 +22,6 @@ const s16 AI_REGULAR_ATTACK_WEIGHTS[5] = { 100, 20, 30, 40, 50 }; extern struct dungeon *DUNGEON_PTR[]; -extern void UpdateAiTargetPos(struct entity *monster); extern void InitMove(struct move *move, enum move_id move_id); extern u32 AiConsiderMove(struct ai_possible_move *ai_possible_move, struct entity *monster, struct move *move); extern bool8 ov29_02338350(struct entity *monster); diff --git a/src/dungeon_misc.c b/src/dungeon_misc.c new file mode 100644 index 00000000..307b6055 --- /dev/null +++ b/src/dungeon_misc.c @@ -0,0 +1,10 @@ +#include "dungeon_misc.h" +#include "dungeon_util.h" +#include "dungeon_util_static.h" + +void UpdateAiTargetPos(struct entity *monster) +{ + struct monster *pokemon_info = GetEntInfo(monster); + pokemon_info->target_pos.x = monster->pos.x + DIRECTIONS_XY[pokemon_info->action.direction].x; + pokemon_info->target_pos.y = monster->pos.y + DIRECTIONS_XY[pokemon_info->action.direction].y; +} From c0c6961c6e952b80169e16363f771a4f5acb3a9c Mon Sep 17 00:00:00 2001 From: AnonymousRandomPerson Date: Wed, 18 Jun 2025 23:29:50 -0500 Subject: [PATCH 2/2] Decomped InitMove --- asm/include/main_0200ED1C.inc | 74 +++++------ asm/include/main_020137E8.inc | 4 + asm/main_0200ED1C.s | 240 ---------------------------------- asm/main_020137E8.s | 228 ++++++++++++++++++++++++++++++++ include/move.h | 2 - include/moves_1.h | 12 ++ main.lsf | 2 + src/dungeon_ai_itcm.c | 2 +- src/moves_1.c | 12 ++ 9 files changed, 296 insertions(+), 280 deletions(-) create mode 100644 asm/include/main_020137E8.inc create mode 100644 asm/main_020137E8.s create mode 100644 include/moves_1.h create mode 100644 src/moves_1.c diff --git a/asm/include/main_0200ED1C.inc b/asm/include/main_0200ED1C.inc index 6b70190d..d87ced9e 100644 --- a/asm/include/main_0200ED1C.inc +++ b/asm/include/main_0200ED1C.inc @@ -1,37 +1,12 @@ #pragma once -.public _0209889C -.public _020988A4 -.public _020988A8 -.public _020988D0 -.public _020988D4 -.public _020988D8 -.public _02098CB4 -.public _02098CCC -.public _02098D24 -.public _02098D48 -.public _02098D64 -.public _02098D68 -.public _02098DE4 -.public _02098DF4 -.public _02098E04 -.public _02098E0C -.public _02098E14 -.public _02098E58 -.public _02098E9C -.public _020A1878 -.public _020AF6D0 -.public _020AF6D4 -.public _020AF700 -.public _022A4BD8 -.public _s32_div_f .public AreItemsEquivalent .public BAG_ITEMS_PTR_MIRROR .public BulkItemToItem .public CALCIUM_STAT_BOOST .public CopyBitsFrom .public CopyBitsTo -.public Debug_Print0 .public DUNGEON_MOVE_TABLES +.public Debug_Print0 .public EXCLUSIVE_ITEM_ATTACK_BOOSTS .public EXCLUSIVE_ITEM_DEFENSE_BOOSTS .public EXCLUSIVE_ITEM_EFFECT_DATA @@ -39,6 +14,8 @@ .public EXCLUSIVE_ITEM_SPECIAL_DEFENSE_BOOSTS .public EXCLUSIVE_ITEM_STAT_BOOST_DATA_INDEXES .public FemaleToMaleForm +.public GINSENG_CHANCE_3 +.public GUMMI_STAT_BOOST .public GetBagCapacity .public GetBagCapacitySpecialEpisode .public GetBaseFormCastformDeoxysCherrim @@ -52,6 +29,7 @@ .public GetItemCategoryVeneer .public GetItemIdFromList .public GetMaxPp +.public GetMoveBasePowerGround .public GetMoveMaxGinsengBoostGround .public GetPartyMembers .public GetPerformanceFlagWithChecks @@ -60,12 +38,10 @@ .public GetScenarioBalance .public GetTeamMember .public GetType -.public GINSENG_CHANCE_3 -.public GUMMI_STAT_BOOST .public HasMonsterBeenAttackedInDungeons -.public InitBulkItem .public IQ_GUMMI_GAIN_TABLE .public IRON_STAT_BOOST +.public InitBulkItem .public Is2TurnsMove .public IsGummi .public IsItemInTimeDarkness @@ -86,19 +62,49 @@ .public MemZero .public OpenWaza .public PROTEIN_STAT_BOOST +.public RECYCLE_SHOP_ITEM_LIST .public Rand16Bit .public RandInt .public RandIntSafe .public RandRange -.public RECYCLE_SHOP_ITEM_LIST .public RemoveEmptyItems +.public SITRUS_BERRY_FULL_HP_BOOST .public SaveScriptVariableValue .public SelectWaza .public SetItemAcquired .public SetNbRecycled -.public SITRUS_BERRY_FULL_HP_BOOST .public SortItemList .public StringFromId +.public TYPE_SPECIFIC_EXCLUSIVE_ITEMS +.public UnloadFile +.public WONDER_GUMMI_IQ_GAIN +.public WONDER_GUMMI_STAT_BOOST +.public ZINC_STAT_BOOST +.public ZInit8 +.public _0209889C +.public _020988A4 +.public _020988A8 +.public _020988D0 +.public _020988D4 +.public _020988D8 +.public _02098CB4 +.public _02098CCC +.public _02098D24 +.public _02098D48 +.public _02098D68 +.public _02098DE4 +.public _02098DF4 +.public _02098E04 +.public _02098E0C +.public _02098E14 +.public _02098E58 +.public _02098E9C +.public _020A1878 +.public _020AF6D0 +.public _020AF6D4 +.public _020AF700 +.public _022A4BD8 +.public _s32_div_f .public sub_0200D1F0 .public sub_0200D8AC .public sub_0200EB90 @@ -110,10 +116,4 @@ .public sub_02055020 .public sub_02055054 .public sub_020582E0 -.public TYPE_SPECIFIC_EXCLUSIVE_ITEMS -.public UnloadFile .public vsprintf -.public WONDER_GUMMI_IQ_GAIN -.public WONDER_GUMMI_STAT_BOOST -.public ZINC_STAT_BOOST -.public ZInit8 diff --git a/asm/include/main_020137E8.inc b/asm/include/main_020137E8.inc new file mode 100644 index 00000000..83e06af5 --- /dev/null +++ b/asm/include/main_020137E8.inc @@ -0,0 +1,4 @@ +#pragma once +.public DUNGEON_MOVE_TABLES +.public GetMaxPp +.public _02098D64 diff --git a/asm/main_0200ED1C.s b/asm/main_0200ED1C.s index 9575671d..c7731187 100644 --- a/asm/main_0200ED1C.s +++ b/asm/main_0200ED1C.s @@ -6017,243 +6017,3 @@ FormatMoveStringMore: ; 0x02013780 bl FormatMoveString ldmia sp!, {r3, r4, r5, r6, r7, pc} arm_func_end FormatMoveStringMore - - arm_func_start InitMove -InitMove: ; 0x020137B8 - stmdb sp!, {r4, lr} - mov r4, r0 - mov r2, #5 - strb r2, [r4] - mov r2, #0 - strh r2, [r4, #2] - strh r1, [r4, #4] - bl GetMaxPp - strb r0, [r4, #6] - mov r0, #0 - strb r0, [r4, #7] - ldmia sp!, {r4, pc} - arm_func_end InitMove - - arm_func_start InitMoveCheckId -InitMoveCheckId: ; 0x020137E8 - stmdb sp!, {r4, lr} - mov r4, r0 - cmp r1, #0 - moveq r0, #0 - streqb r0, [r4] - ldmeqia sp!, {r4, pc} - mov r2, #5 - strb r2, [r4] - mov r2, #0 - strh r2, [r4, #2] - strh r1, [r4, #4] - bl GetMaxPp - strb r0, [r4, #6] - mov r0, #0 - strb r0, [r4, #7] - ldmia sp!, {r4, pc} - arm_func_end InitMoveCheckId - - arm_func_start GetInfoMoveGround -GetInfoMoveGround: ; 0x02013828 - mov r2, #5 - strb r2, [r0] - strh r1, [r0, #2] - mov r1, #0 - strb r1, [r0, #4] - bx lr - arm_func_end GetInfoMoveGround - - arm_func_start GetMoveTargetAndRange -GetMoveTargetAndRange: ; 0x02013840 - ldr r2, _02013860 ; =DUNGEON_MOVE_TABLES - ldrh r3, [r0, #4] - ldr r2, [r2, #8] - mov r0, #0x1a - mla r0, r3, r0, r2 - add r0, r0, r1, lsl #1 - ldrsh r0, [r0, #4] - bx lr - .align 2, 0 -_02013860: .word DUNGEON_MOVE_TABLES - arm_func_end GetMoveTargetAndRange - - arm_func_start GetMoveType -GetMoveType: ; 0x02013864 - ldr r1, _02013880 ; =DUNGEON_MOVE_TABLES - ldrh r2, [r0, #4] - ldr r1, [r1, #8] - mov r0, #0x1a - mla r0, r2, r0, r1 - ldrb r0, [r0, #2] - bx lr - .align 2, 0 -_02013880: .word DUNGEON_MOVE_TABLES - arm_func_end GetMoveType - - arm_func_start GetMovesetLevelUpPtr -GetMovesetLevelUpPtr: ; 0x02013884 - stmdb sp!, {r4, lr} - mov r4, r0 - cmp r4, #0x258 - subge r0, r4, #0x258 - movge r0, r0, lsl #0x10 - movge r4, r0, asr #0x10 - mov r0, r4 - bl IsInvalidMoveset - cmp r0, #0 - ldrne r0, _020138C4 ; =_02098D64 - ldreq r1, _020138C8 ; =DUNGEON_MOVE_TABLES - moveq r0, #0xc - smulbbeq r0, r4, r0 - ldreq r1, [r1] - ldreq r0, [r1, r0] - ldmia sp!, {r4, pc} - .align 2, 0 -_020138C4: .word _02098D64 -_020138C8: .word DUNGEON_MOVE_TABLES - arm_func_end GetMovesetLevelUpPtr - - arm_func_start IsInvalidMoveset -IsInvalidMoveset: ; 0x020138CC - cmp r0, #0 - ble _020138E0 - ldr r1, _020138F0 ; =0x00000229 - cmp r0, r1 - blt _020138E8 -_020138E0: - mov r0, #1 - bx lr -_020138E8: - mov r0, #0 - bx lr - .align 2, 0 -_020138F0: .word 0x00000229 - arm_func_end IsInvalidMoveset - - arm_func_start GetMovesetHmTmPtr -GetMovesetHmTmPtr: ; 0x020138F4 - stmdb sp!, {r4, lr} - mov r4, r0 - cmp r4, #0x258 - subge r0, r4, #0x258 - movge r0, r0, lsl #0x10 - movge r4, r0, asr #0x10 - mov r0, r4 - bl IsInvalidMoveset - cmp r0, #0 - ldrne r0, _02013938 ; =_02098D64 - ldmneia sp!, {r4, pc} - ldr r1, _0201393C ; =DUNGEON_MOVE_TABLES - mov r0, #0xc - ldr r1, [r1] - smlabb r0, r4, r0, r1 - ldr r0, [r0, #4] - ldmia sp!, {r4, pc} - .align 2, 0 -_02013938: .word _02098D64 -_0201393C: .word DUNGEON_MOVE_TABLES - arm_func_end GetMovesetHmTmPtr - - arm_func_start GetMovesetEggPtr -GetMovesetEggPtr: ; 0x02013940 - stmdb sp!, {r4, lr} - mov r4, r0 - cmp r4, #0x258 - subge r0, r4, #0x258 - movge r0, r0, lsl #0x10 - movge r4, r0, asr #0x10 - mov r0, r4 - bl IsInvalidMoveset - cmp r0, #0 - ldrne r0, _02013984 ; =_02098D64 - ldmneia sp!, {r4, pc} - ldr r1, _02013988 ; =DUNGEON_MOVE_TABLES - mov r0, #0xc - ldr r1, [r1] - smlabb r0, r4, r0, r1 - ldr r0, [r0, #8] - ldmia sp!, {r4, pc} - .align 2, 0 -_02013984: .word _02098D64 -_02013988: .word DUNGEON_MOVE_TABLES - arm_func_end GetMovesetEggPtr - - arm_func_start GetMoveAiWeight -GetMoveAiWeight: ; 0x0201398C - ldr r1, _020139A8 ; =DUNGEON_MOVE_TABLES - ldrh r2, [r0, #4] - ldr r1, [r1, #8] - mov r0, #0x1a - mla r0, r2, r0, r1 - ldrb r0, [r0, #9] - bx lr - .align 2, 0 -_020139A8: .word DUNGEON_MOVE_TABLES - arm_func_end GetMoveAiWeight - - arm_func_start GetMoveNbStrikes -GetMoveNbStrikes: ; 0x020139AC - ldr r1, _020139C8 ; =DUNGEON_MOVE_TABLES - ldrh r2, [r0, #4] - ldr r1, [r1, #8] - mov r0, #0x1a - mla r0, r2, r0, r1 - ldrb r0, [r0, #0xd] - bx lr - .align 2, 0 -_020139C8: .word DUNGEON_MOVE_TABLES - arm_func_end GetMoveNbStrikes - - arm_func_start GetMoveBasePower -GetMoveBasePower: ; 0x020139CC - ldrh r2, [r0, #4] - mov r0, #0x1a - ldr r1, _020139E8 ; =DUNGEON_MOVE_TABLES - mul r0, r2, r0 - ldr r1, [r1, #8] - ldrsh r0, [r1, r0] - bx lr - .align 2, 0 -_020139E8: .word DUNGEON_MOVE_TABLES - arm_func_end GetMoveBasePower - - arm_func_start GetMoveBasePowerGround -GetMoveBasePowerGround: ; 0x020139EC - ldrh r2, [r0, #2] - mov r0, #0x1a - ldr r1, _02013A08 ; =DUNGEON_MOVE_TABLES - mul r0, r2, r0 - ldr r1, [r1, #8] - ldrsh r0, [r1, r0] - bx lr - .align 2, 0 -_02013A08: .word DUNGEON_MOVE_TABLES - arm_func_end GetMoveBasePowerGround - - arm_func_start GetMoveAccuracyOrAiChance -GetMoveAccuracyOrAiChance: ; 0x02013A0C - ldr r2, _02013A2C ; =DUNGEON_MOVE_TABLES - ldrh r3, [r0, #4] - ldr r2, [r2, #8] - mov r0, #0x1a - mla r0, r3, r0, r2 - add r0, r0, r1 - ldrb r0, [r0, #0xa] - bx lr - .align 2, 0 -_02013A2C: .word DUNGEON_MOVE_TABLES - arm_func_end GetMoveAccuracyOrAiChance - - arm_func_start GetMoveBasePp -GetMoveBasePp: ; 0x02013A30 - ldr r1, _02013A4C ; =DUNGEON_MOVE_TABLES - ldrh r2, [r0, #4] - ldr r1, [r1, #8] - mov r0, #0x1a - mla r0, r2, r0, r1 - ldrb r0, [r0, #8] - bx lr - .align 2, 0 -_02013A4C: .word DUNGEON_MOVE_TABLES - arm_func_end GetMoveBasePp diff --git a/asm/main_020137E8.s b/asm/main_020137E8.s new file mode 100644 index 00000000..3013a70f --- /dev/null +++ b/asm/main_020137E8.s @@ -0,0 +1,228 @@ + .include "asm/macros.inc" + .include "main_020137E8.inc" + + .text + + arm_func_start InitMoveCheckId +InitMoveCheckId: ; 0x020137E8 + stmdb sp!, {r4, lr} + mov r4, r0 + cmp r1, #0 + moveq r0, #0 + streqb r0, [r4] + ldmeqia sp!, {r4, pc} + mov r2, #5 + strb r2, [r4] + mov r2, #0 + strh r2, [r4, #2] + strh r1, [r4, #4] + bl GetMaxPp + strb r0, [r4, #6] + mov r0, #0 + strb r0, [r4, #7] + ldmia sp!, {r4, pc} + arm_func_end InitMoveCheckId + + arm_func_start GetInfoMoveGround +GetInfoMoveGround: ; 0x02013828 + mov r2, #5 + strb r2, [r0] + strh r1, [r0, #2] + mov r1, #0 + strb r1, [r0, #4] + bx lr + arm_func_end GetInfoMoveGround + + arm_func_start GetMoveTargetAndRange +GetMoveTargetAndRange: ; 0x02013840 + ldr r2, _02013860 ; =DUNGEON_MOVE_TABLES + ldrh r3, [r0, #4] + ldr r2, [r2, #8] + mov r0, #0x1a + mla r0, r3, r0, r2 + add r0, r0, r1, lsl #1 + ldrsh r0, [r0, #4] + bx lr + .align 2, 0 +_02013860: .word DUNGEON_MOVE_TABLES + arm_func_end GetMoveTargetAndRange + + arm_func_start GetMoveType +GetMoveType: ; 0x02013864 + ldr r1, _02013880 ; =DUNGEON_MOVE_TABLES + ldrh r2, [r0, #4] + ldr r1, [r1, #8] + mov r0, #0x1a + mla r0, r2, r0, r1 + ldrb r0, [r0, #2] + bx lr + .align 2, 0 +_02013880: .word DUNGEON_MOVE_TABLES + arm_func_end GetMoveType + + arm_func_start GetMovesetLevelUpPtr +GetMovesetLevelUpPtr: ; 0x02013884 + stmdb sp!, {r4, lr} + mov r4, r0 + cmp r4, #0x258 + subge r0, r4, #0x258 + movge r0, r0, lsl #0x10 + movge r4, r0, asr #0x10 + mov r0, r4 + bl IsInvalidMoveset + cmp r0, #0 + ldrne r0, _020138C4 ; =_02098D64 + ldreq r1, _020138C8 ; =DUNGEON_MOVE_TABLES + moveq r0, #0xc + smulbbeq r0, r4, r0 + ldreq r1, [r1] + ldreq r0, [r1, r0] + ldmia sp!, {r4, pc} + .align 2, 0 +_020138C4: .word _02098D64 +_020138C8: .word DUNGEON_MOVE_TABLES + arm_func_end GetMovesetLevelUpPtr + + arm_func_start IsInvalidMoveset +IsInvalidMoveset: ; 0x020138CC + cmp r0, #0 + ble _020138E0 + ldr r1, _020138F0 ; =0x00000229 + cmp r0, r1 + blt _020138E8 +_020138E0: + mov r0, #1 + bx lr +_020138E8: + mov r0, #0 + bx lr + .align 2, 0 +_020138F0: .word 0x00000229 + arm_func_end IsInvalidMoveset + + arm_func_start GetMovesetHmTmPtr +GetMovesetHmTmPtr: ; 0x020138F4 + stmdb sp!, {r4, lr} + mov r4, r0 + cmp r4, #0x258 + subge r0, r4, #0x258 + movge r0, r0, lsl #0x10 + movge r4, r0, asr #0x10 + mov r0, r4 + bl IsInvalidMoveset + cmp r0, #0 + ldrne r0, _02013938 ; =_02098D64 + ldmneia sp!, {r4, pc} + ldr r1, _0201393C ; =DUNGEON_MOVE_TABLES + mov r0, #0xc + ldr r1, [r1] + smlabb r0, r4, r0, r1 + ldr r0, [r0, #4] + ldmia sp!, {r4, pc} + .align 2, 0 +_02013938: .word _02098D64 +_0201393C: .word DUNGEON_MOVE_TABLES + arm_func_end GetMovesetHmTmPtr + + arm_func_start GetMovesetEggPtr +GetMovesetEggPtr: ; 0x02013940 + stmdb sp!, {r4, lr} + mov r4, r0 + cmp r4, #0x258 + subge r0, r4, #0x258 + movge r0, r0, lsl #0x10 + movge r4, r0, asr #0x10 + mov r0, r4 + bl IsInvalidMoveset + cmp r0, #0 + ldrne r0, _02013984 ; =_02098D64 + ldmneia sp!, {r4, pc} + ldr r1, _02013988 ; =DUNGEON_MOVE_TABLES + mov r0, #0xc + ldr r1, [r1] + smlabb r0, r4, r0, r1 + ldr r0, [r0, #8] + ldmia sp!, {r4, pc} + .align 2, 0 +_02013984: .word _02098D64 +_02013988: .word DUNGEON_MOVE_TABLES + arm_func_end GetMovesetEggPtr + + arm_func_start GetMoveAiWeight +GetMoveAiWeight: ; 0x0201398C + ldr r1, _020139A8 ; =DUNGEON_MOVE_TABLES + ldrh r2, [r0, #4] + ldr r1, [r1, #8] + mov r0, #0x1a + mla r0, r2, r0, r1 + ldrb r0, [r0, #9] + bx lr + .align 2, 0 +_020139A8: .word DUNGEON_MOVE_TABLES + arm_func_end GetMoveAiWeight + + arm_func_start GetMoveNbStrikes +GetMoveNbStrikes: ; 0x020139AC + ldr r1, _020139C8 ; =DUNGEON_MOVE_TABLES + ldrh r2, [r0, #4] + ldr r1, [r1, #8] + mov r0, #0x1a + mla r0, r2, r0, r1 + ldrb r0, [r0, #0xd] + bx lr + .align 2, 0 +_020139C8: .word DUNGEON_MOVE_TABLES + arm_func_end GetMoveNbStrikes + + arm_func_start GetMoveBasePower +GetMoveBasePower: ; 0x020139CC + ldrh r2, [r0, #4] + mov r0, #0x1a + ldr r1, _020139E8 ; =DUNGEON_MOVE_TABLES + mul r0, r2, r0 + ldr r1, [r1, #8] + ldrsh r0, [r1, r0] + bx lr + .align 2, 0 +_020139E8: .word DUNGEON_MOVE_TABLES + arm_func_end GetMoveBasePower + + arm_func_start GetMoveBasePowerGround +GetMoveBasePowerGround: ; 0x020139EC + ldrh r2, [r0, #2] + mov r0, #0x1a + ldr r1, _02013A08 ; =DUNGEON_MOVE_TABLES + mul r0, r2, r0 + ldr r1, [r1, #8] + ldrsh r0, [r1, r0] + bx lr + .align 2, 0 +_02013A08: .word DUNGEON_MOVE_TABLES + arm_func_end GetMoveBasePowerGround + + arm_func_start GetMoveAccuracyOrAiChance +GetMoveAccuracyOrAiChance: ; 0x02013A0C + ldr r2, _02013A2C ; =DUNGEON_MOVE_TABLES + ldrh r3, [r0, #4] + ldr r2, [r2, #8] + mov r0, #0x1a + mla r0, r3, r0, r2 + add r0, r0, r1 + ldrb r0, [r0, #0xa] + bx lr + .align 2, 0 +_02013A2C: .word DUNGEON_MOVE_TABLES + arm_func_end GetMoveAccuracyOrAiChance + + arm_func_start GetMoveBasePp +GetMoveBasePp: ; 0x02013A30 + ldr r1, _02013A4C ; =DUNGEON_MOVE_TABLES + ldrh r2, [r0, #4] + ldr r1, [r1, #8] + mov r0, #0x1a + mla r0, r2, r0, r1 + ldrb r0, [r0, #8] + bx lr + .align 2, 0 +_02013A4C: .word DUNGEON_MOVE_TABLES + arm_func_end GetMoveBasePp diff --git a/include/move.h b/include/move.h index 9c9cc830..bb0c5a2e 100644 --- a/include/move.h +++ b/include/move.h @@ -37,8 +37,6 @@ struct move { // bool8 f_disabled : 1; // For Torment (and maybe others) // u8 flags_unk6 : 2; - u8 field_0x1; - // 0x2: flags2: 2-byte bitfield u16 flags2; // bool8 f_sealed : 1; // Sealed by a Seal Trap. Also prevents AI from using this move diff --git a/include/moves_1.h b/include/moves_1.h new file mode 100644 index 00000000..a5b4b952 --- /dev/null +++ b/include/moves_1.h @@ -0,0 +1,12 @@ +#ifndef PMDSKY_MOVES_1_H +#define PMDSKY_MOVES_1_H + +#include "move.h" + +// Initializes a move info struct. +// This sets f_exists and f_enabled_for_ai on the flags, the ID to the given ID, the PP to the max PP for the move ID, and the ginseng boost to 0. +// move: pointer to move to initialize +// move_id: move ID +void InitMove(struct move *move, enum move_id move_id); + +#endif //PMDSKY_MOVES_1_H diff --git a/main.lsf b/main.lsf index 3192e6ca..5dcf5be8 100644 --- a/main.lsf +++ b/main.lsf @@ -33,6 +33,8 @@ Static main Object asm/main_0200EB30.o Object src/main_0200ECFC.o Object asm/main_0200ED1C.o + Object src/moves_1.o + Object asm/main_020137E8.o Object src/moves.o Object asm/main_02013AD0.o Object src/main_020251AC.o diff --git a/src/dungeon_ai_itcm.c b/src/dungeon_ai_itcm.c index 1e336d6d..622f1cf1 100644 --- a/src/dungeon_ai_itcm.c +++ b/src/dungeon_ai_itcm.c @@ -13,6 +13,7 @@ #include "dungeon_pokemon_attributes_1.h" #include "dungeon_util_static.h" #include "fixed_room_data.h" +#include "moves_1.h" #define REGULAR_ATTACK_INDEX 4 @@ -22,7 +23,6 @@ const s16 AI_REGULAR_ATTACK_WEIGHTS[5] = { 100, 20, 30, 40, 50 }; extern struct dungeon *DUNGEON_PTR[]; -extern void InitMove(struct move *move, enum move_id move_id); extern u32 AiConsiderMove(struct ai_possible_move *ai_possible_move, struct entity *monster, struct move *move); extern bool8 ov29_02338350(struct entity *monster); extern bool8 TargetRegularAttack(struct entity *pokemon, u32 *target_dir, bool8 skip_petrified); diff --git a/src/moves_1.c b/src/moves_1.c new file mode 100644 index 00000000..74257173 --- /dev/null +++ b/src/moves_1.c @@ -0,0 +1,12 @@ +#include "moves_1.h" + +#include "moves.h" + +void InitMove(struct move *move, enum move_id move_id) +{ + move->flags0 = MOVE_FLAG_ENABLED_FOR_AI | MOVE_FLAG_EXISTS; + move->flags2 = 0; + move->id = move_id; + move->pp = GetMaxPp(move); + move->ginseng = 0; +}