diff --git a/asm/include/overlay_29_0230BBAC.inc b/asm/include/overlay_29_0230BBAC.inc index 37ba4418..3a6fc1df 100644 --- a/asm/include/overlay_29_0230BBAC.inc +++ b/asm/include/overlay_29_0230BBAC.inc @@ -7,7 +7,6 @@ .public ApplyDamageAndEffects .public AuraBowIsActive .public CalcTypeBasedDamageEffects -.public CanSeeTarget .public CeilFixedPoint .public ClampedLn .public DAMAGE_FORMULA_AT_PREFACTOR @@ -26,14 +25,10 @@ .public DEFENSIVE_STAT_STAGE_MULTIPLIERS .public DEF_SCARF_STAT_BOOST .public DUNGEON_PTR -.public DebugRecruitingEnabled .public Debug_Print0 .public DefenderAbilityIsActive__0230A940 .public DivideFixedPoint64 -.public DungeonModeSetupAndShowNameKeyboard .public DungeonRandInt -.public EnableAllLearnableIqSkills -.public EnsureCanStandCurrentTile .public EntityIsValid__02308FBC .public ExclusiveItemDefenseBoost .public ExclusiveItemEffectIsActiveWithLogging @@ -47,36 +42,19 @@ .public GendersEqualNotGenderless .public GendersNotEqualNotGenderless .public GenerateStandardItem -.public GetActiveTeamMember .public GetApparentWeather -.public GetDirectionTowardsPosition .public GetEquivItemIndex -.public GetFirstEmptyMemberIdx .public GetItemAtIdx -.public GetMessageLogPreprocessorArgs .public GetMonsterGenderVeneer .public GetMoveCategory -.public GetNameString -.public GetRecruitRate1 -.public GetRecruitRate2 .public GetTypeMatchup -.public HandleFaint -.public HasPlayedOldGame -.public InitTeamMember .public IntToFixedPoint64 .public IqSkillIsEnabled -.public IsCurrentMissionTypeExact -.public IsFullFloorFixedRoom -.public IsLegendaryChallengeFloor -.public IsMonsterOnTeam .public IsMonster__0230A994 .public IsPunchMove .public IsRecoilMove -.public IsRecruitingAllowed .public IsRegularAttackOrProjectile .public ItemIsActive__0230A9DC -.public ItemIsActive__0230E578 -.public LogMessageByIdWithPopupCheckUser .public LogMessageByIdWithPopupCheckUserTarget .public ME_FIRST_MULTIPLIER .public MUNCH_BELT_STAT_BOOST @@ -98,66 +76,25 @@ .public PlayEffectAnimation0x1A9__022E617C .public PlayEffectAnimationEntity .public PointCameraToMonster -.public RECRUITMENT_LEVEL_BOOST_TABLE .public ResetDamageData .public RoundUpDiv256 .public SCOPE_LENS_CRIT_RATE_BOOST .public SPECIAL_BAND_STAT_BOOST .public SUPER_LUCK_CRIT_RATE_BOOST .public SetItemAcquired -.public SetMessageLogPreprocessorArgsString -.public SetPokemonJoined -.public SetPreprocessorArgsIdVal -.public SetPreprocessorArgsStringToName -.public StrcpySimple -.public StrncpyName -.public StrncpySimpleNoPad .public SubstitutePlaceholderStringTags .public TYPE_ADVANTAGE_MASTER_CRIT_RATE .public TYPE_MATCHUP_COMBINATOR_TABLE .public UpdateStateFlags .public ZINC_BAND_STAT_BOOST .public _s32_div_f -.public abs .public ov10_022BDE50 .public ov10_022BF964 -.public ov10_022C4410 -.public ov10_022C441C -.public ov10_022C443C -.public ov10_022C447C -.public ov10_022C44FC .public ov10_022C45B4 -.public ov10_022C46FC -.public ov10_022C4700 -.public ov10_022C4704 -.public ov10_022C4708 -.public ov10_022C470C -.public ov29_022E1B28 .public ov29_022E2470 -.public ov29_022E68BC -.public ov29_022E8104 -.public ov29_022E81F8 -.public ov29_022EACAC -.public ov29_022FBDE0 -.public ov29_02304A48 -.public ov29_02305F60 -.public ov29_0230E5A8 -.public ov29_0230E5FC -.public ov29_0230E658 -.public ov29_02337EC0 -.public ov29_0234B1A4 -.public ov29_0234BA54 -.public ov29_0234D630 -.public ov29_0234D7C0 -.public ov29_0234D838 -.public ov29_0234D8A0 -.public ov29_0234EE10 .public ov29_02352838 .public ov29_02352894 .public ov29_02352984 .public ov29_02352990 .public ov29_0235299C .public ov29_023535D4 -.public sub_02056698 -.public sub_020584FC -.public sub_020585B4 diff --git a/asm/include/overlay_29_0230DBD0.inc b/asm/include/overlay_29_0230DBD0.inc new file mode 100644 index 00000000..086c236a --- /dev/null +++ b/asm/include/overlay_29_0230DBD0.inc @@ -0,0 +1,69 @@ +#pragma once +.public CanSeeTarget +.public DUNGEON_PTR +.public DungeonModeSetupAndShowNameKeyboard +.public DungeonRandInt +.public EnableAllLearnableIqSkills +.public EnsureCanStandCurrentTile +.public GetActiveTeamMember +.public GetDirectionTowardsPosition +.public GetFirstEmptyMemberIdx +.public GetMessageLogPreprocessorArgs +.public GetNameString +.public GetRecruitRate1 +.public GetRecruitRate2 +.public HandleFaint +.public HasPlayedOldGame +.public InitTeamMember +.public IqSkillIsEnabled +.public IsCurrentMissionTypeExact +.public IsFullFloorFixedRoom +.public IsLegendaryChallengeFloor +.public IsMonsterOnTeam +.public IsRecruitingAllowed +.public ItemIsActive__0230E578 +.public LogMessageByIdWithPopupCheckUser +.public MonsterIsType +.public RECRUITMENT_LEVEL_BOOST_TABLE +.public SetMessageLogPreprocessorArgsString +.public SetPokemonJoined +.public SetPreprocessorArgsIdVal +.public SetPreprocessorArgsStringToName +.public SpecificRecruitCheck +.public StrcpySimple +.public StrncpyName +.public StrncpySimpleNoPad +.public SubstitutePlaceholderStringTags +.public abs +.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_022FBDE0 +.public ov29_02304A48 +.public ov29_02305F60 +.public ov29_0230E5A8 +.public ov29_0230E5FC +.public ov29_0230E658 +.public ov29_02337EC0 +.public ov29_0234B1A4 +.public ov29_0234BA54 +.public ov29_0234D630 +.public ov29_0234D7C0 +.public ov29_0234D838 +.public ov29_0234D8A0 +.public ov29_0234EE10 +.public sub_02056698 +.public sub_020584FC +.public sub_020585B4 diff --git a/asm/overlay_29_0230BBAC.s b/asm/overlay_29_0230BBAC.s index b24d71e3..0e17ae4b 100644 --- a/asm/overlay_29_0230BBAC.s +++ b/asm/overlay_29_0230BBAC.s @@ -2284,740 +2284,3 @@ ov29_0230DAB8: ; 0x0230DAB8 _0230F050: .word 0x00002497 #endif arm_func_end ov29_0230DAB8 - - arm_func_start SpecificRecruitCheck -SpecificRecruitCheck: ; 0x0230DB14 - stmdb sp!, {r4, lr} - ldr r1, _0230DBC8 ; =DUNGEON_PTR - mov r4, r0 - ldr r1, [r1] - ldrb r1, [r1, #0x759] - cmp r1, #0 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - bl DebugRecruitingEnabled - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - cmp r4, #0x97 - ldreq r0, _0230DBC8 ; =DUNGEON_PTR - ldreq r0, [r0] - addeq r0, r0, #0x700 - ldreqsb r0, [r0, #0x98] - cmpeq r0, #2 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - ldr r1, _0230DBCC ; =0x000001A3 - cmp r4, r1 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - cmp r4, #0x1a4 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - add r0, r1, #2 - cmp r4, r0 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - sub r0, r1, #0xa - cmp r4, r0 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - sub r0, r1, #9 - cmp r4, r0 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - sub r0, r1, #8 - cmp r4, r0 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff - ldmia sp!, {r4, pc} - .align 2, 0 -_0230DBC8: .word DUNGEON_PTR -_0230DBCC: .word 0x000001A3 - arm_func_end SpecificRecruitCheck - - arm_func_start RecruitCheck -RecruitCheck: ; 0x0230DBD0 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - ldr r2, _0230E024 ; =DUNGEON_PTR - mov r8, r0 - ldr r0, [r2] - mov r7, r1 - ldrb r0, [r0, #0x748] - ldr r5, [r8, #0xb4] - ldr r6, [r7, #0xb4] - bl IsRecruitingAllowed - cmp r0, #0 - beq _0230DC28 - bl IsFullFloorFixedRoom - cmp r0, #0 - bne _0230DC28 - bl IsLegendaryChallengeFloor - cmp r0, #0 - bne _0230DC28 - mov r0, #0xa - mov r1, #6 - bl IsCurrentMissionTypeExact - cmp r0, #0 - beq _0230DC30 -_0230DC28: - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_0230DC30: - ldr r0, _0230E024 ; =DUNGEON_PTR - ldr r1, [r0] - ldrb r0, [r1, #0x75d] - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - ldrb r0, [r1, #0x748] - cmp r0, #0x5b - bne _0230DC70 - ldrsh r1, [r6, #2] - ldr r0, _0230E028 ; =0x000001E6 - cmp r1, r0 - addne r0, r0, #0x258 - cmpne r1, r0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_0230DC70: - ldrsh r0, [r6, #2] - cmp r0, #0x91 - cmpne r0, #0x90 - cmpne r0, #0x92 - ldrne r2, _0230E02C ; =0x0000010F - cmpne r0, r2 - subne r1, r2, #1 - cmpne r0, r1 - cmpne r0, #0x110 - cmpne r0, #0x19c - addne r1, r2, #0x8e - cmpne r0, r1 - addne r1, r2, #0x92 - cmpne r0, r1 - cmpne r0, #0x1a0 - addne r1, r2, #0x93 - cmpne r0, r1 - addne r1, r2, #0x8a - cmpne r0, r1 - addne r1, r2, #0x8b - cmpne r0, r1 - addne r1, r2, #0x8c - cmpne r0, r1 - beq _0230DCF0 - ldr r1, _0230E030 ; =0xFFFFFDEA - add r1, r0, r1 - mov r1, r1, lsl #0x10 - mov r1, r1, asr #0x10 - mov r1, r1, lsl #0x10 - mov r1, r1, lsr #0x10 - cmp r1, #1 - bhi _0230DD04 -_0230DCF0: - mov r1, #1 - bl IsMonsterOnTeam - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_0230DD04: - mov r0, r6 - bl ov29_022FBDE0 - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - ldrsh r0, [r6, #2] - bl SpecificRecruitCheck - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - ldrsh r1, [r8, #4] - ldrsh r0, [r7, #4] - sub r0, r1, r0 - bl abs - cmp r0, #1 - bgt _0230DD5C - ldrsh r1, [r8, #6] - ldrsh r0, [r7, #6] - sub r0, r1, r0 - bl abs - cmp r0, #1 - ble _0230DD64 -_0230DD5C: - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_0230DD64: - ldrb r0, [r6, #0x48] - cmp r0, #0xfa - ldrneb r0, [r6, #0xbc] - cmpne r0, #7 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - mov r0, r7 - mov r1, r8 - bl CanSeeTarget - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - mov r0, #1 - bl ov29_022E1B28 - bl ov29_022E81F8 - ldrsh r0, [r6, #2] - mov r1, #1 - bl IsMonsterOnTeam - mov sb, r0 - mov r0, #0x3e8 - bl DungeonRandInt - mov r4, r0 - bl HasPlayedOldGame - cmp r0, #0 - beq _0230DDE0 - cmp sb, #0 - bne _0230DDE0 - ldrsh r0, [r6, #2] - bl GetRecruitRate2 - mov r6, r0 - b _0230DDEC -_0230DDE0: - ldrsh r0, [r6, #2] - bl GetRecruitRate1 - mov r6, r0 -_0230DDEC: - cmp r6, #0 - ble _0230DDFC - cmp sb, #0 - movne r6, r6, asr #1 -_0230DDFC: - ldr r0, _0230E034 ; =0xFFFFFC19 - cmp r6, r0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - mov r0, r8 - mov r1, #0x35 - bl ItemIsActive__0230E578 - cmp r0, #0 - ldrne r0, _0230E038 ; =ov10_022C44FC - ldrnesh r0, [r0] - addne r6, r6, r0 - bne _0230DFD4 - mov r0, r8 - mov r1, #0x39 - bl ItemIsActive__0230E578 - cmp r0, #0 - ldrne r0, _0230E03C ; =ov10_022C443C - ldrnesh r0, [r0] - addne r6, r6, r0 - bne _0230DFD4 - mov r0, r8 - mov r1, #0x3a - bl ItemIsActive__0230E578 - cmp r0, #0 - ldrne r0, _0230E040 ; =ov10_022C447C - ldrnesh r0, [r0] - addne r6, r6, r0 - bne _0230DFD4 - mov r0, r8 - mov r1, #0x3b - bl ItemIsActive__0230E578 - cmp r0, #0 - beq _0230DEA0 - mov r0, r7 - mov r1, #6 - bl MonsterIsType - cmp r0, #0 - ldrne r0, _0230E044 ; =ov10_022C441C - ldrnesh r0, [r0] - addne r6, r6, r0 - b _0230DFD4 -_0230DEA0: - mov r0, r8 - mov r1, #0x3c - bl ItemIsActive__0230E578 - cmp r0, #0 - beq _0230DED4 - mov r0, r7 - mov r1, #2 - bl MonsterIsType - cmp r0, #0 - ldrne r0, _0230E048 ; =ov10_022C4410 - ldrnesh r0, [r0] - addne r6, r6, r0 - b _0230DFD4 -_0230DED4: - mov r0, r8 - mov r1, #0x3d - bl ItemIsActive__0230E578 - cmp r0, #0 - beq _0230DF08 - mov r0, r7 - mov r1, #9 - bl MonsterIsType - cmp r0, #0 - ldrne r0, _0230E04C ; =ov10_022C470C - ldrnesh r0, [r0] - addne r6, r6, r0 - b _0230DFD4 -_0230DF08: - mov r0, r8 - mov r1, #0x3e - bl ItemIsActive__0230E578 - cmp r0, #0 - beq _0230DF3C - mov r0, r7 - mov r1, #3 - bl MonsterIsType - cmp r0, #0 - ldrne r0, _0230E050 ; =ov10_022C4708 - ldrnesh r0, [r0] - addne r6, r6, r0 - b _0230DFD4 -_0230DF3C: - mov r0, r8 - mov r1, #0x3f - bl ItemIsActive__0230E578 - cmp r0, #0 - beq _0230DF70 - mov r0, r7 - mov r1, #0xd - bl MonsterIsType - cmp r0, #0 - ldrne r0, _0230E054 ; =ov10_022C4704 - ldrnesh r0, [r0] - addne r6, r6, r0 - b _0230DFD4 -_0230DF70: - mov r0, r8 - mov r1, #0x40 - bl ItemIsActive__0230E578 - cmp r0, #0 - beq _0230DFA4 - mov r0, r7 - mov r1, #4 - bl MonsterIsType - cmp r0, #0 - ldrne r0, _0230E058 ; =ov10_022C4700 - ldrnesh r0, [r0] - addne r6, r6, r0 - b _0230DFD4 -_0230DFA4: - mov r0, r8 - mov r1, #0x41 - bl ItemIsActive__0230E578 - cmp r0, #0 - beq _0230DFD4 - mov r0, r7 - mov r1, #0xa - bl MonsterIsType - cmp r0, #0 - ldrne r0, _0230E05C ; =ov10_022C46FC - ldrnesh r0, [r0] - addne r6, r6, r0 -_0230DFD4: - mov r0, r8 - mov r1, #0x1e - bl IqSkillIsEnabled - cmp r0, #0 - ldrne r0, _0230E038 ; =ov10_022C44FC - ldrb r1, [r5, #0xa] - ldrnesh r0, [r0] - mov r1, r1, lsl #1 - addne r6, r6, r0 - ldr r0, _0230E060 ; =RECRUITMENT_LEVEL_BOOST_TABLE - ldrsh r0, [r0, r1] - add r0, r6, r0 - cmp r4, r0 - mov r0, #0 - ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - bl GetFirstEmptyMemberIdx - cmp r0, #0 - movlt r0, #0 - movge r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_0230E024: .word DUNGEON_PTR -_0230E028: .word 0x000001E6 -_0230E02C: .word 0x0000010F -_0230E030: .word 0xFFFFFDEA -_0230E034: .word 0xFFFFFC19 -_0230E038: .word ov10_022C44FC -_0230E03C: .word ov10_022C443C -_0230E040: .word ov10_022C447C -_0230E044: .word ov10_022C441C -_0230E048: .word ov10_022C4410 -_0230E04C: .word ov10_022C470C -_0230E050: .word ov10_022C4708 -_0230E054: .word ov10_022C4704 -_0230E058: .word ov10_022C4700 -_0230E05C: .word ov10_022C46FC -_0230E060: .word RECRUITMENT_LEVEL_BOOST_TABLE - arm_func_end RecruitCheck - - 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 ov29_0234BA54 - 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 ov29_02304A48 - 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 sub_020585B4 - 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 ov29_02337EC0 - 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 sub_020585B4 - b _0230E38C -_0230E380: - ldr r1, [r6, #0xb4] - ldrsh r1, [r1, #0xc] - bl sub_020584FC -_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_0230DBD0.s b/asm/overlay_29_0230DBD0.s new file mode 100644 index 00000000..98dc4d67 --- /dev/null +++ b/asm/overlay_29_0230DBD0.s @@ -0,0 +1,689 @@ + .include "asm/macros.inc" + .include "overlay_29_0230DBD0.inc" + + .text + + arm_func_start RecruitCheck +RecruitCheck: ; 0x0230DBD0 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + ldr r2, _0230E024 ; =DUNGEON_PTR + mov r8, r0 + ldr r0, [r2] + mov r7, r1 + ldrb r0, [r0, #0x748] + ldr r5, [r8, #0xb4] + ldr r6, [r7, #0xb4] + bl IsRecruitingAllowed + cmp r0, #0 + beq _0230DC28 + bl IsFullFloorFixedRoom + cmp r0, #0 + bne _0230DC28 + bl IsLegendaryChallengeFloor + cmp r0, #0 + bne _0230DC28 + mov r0, #0xa + mov r1, #6 + bl IsCurrentMissionTypeExact + cmp r0, #0 + beq _0230DC30 +_0230DC28: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0230DC30: + ldr r0, _0230E024 ; =DUNGEON_PTR + ldr r1, [r0] + ldrb r0, [r1, #0x75d] + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldrb r0, [r1, #0x748] + cmp r0, #0x5b + bne _0230DC70 + ldrsh r1, [r6, #2] + ldr r0, _0230E028 ; =0x000001E6 + cmp r1, r0 + addne r0, r0, #0x258 + cmpne r1, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0230DC70: + ldrsh r0, [r6, #2] + cmp r0, #0x91 + cmpne r0, #0x90 + cmpne r0, #0x92 + ldrne r2, _0230E02C ; =0x0000010F + cmpne r0, r2 + subne r1, r2, #1 + cmpne r0, r1 + cmpne r0, #0x110 + cmpne r0, #0x19c + addne r1, r2, #0x8e + cmpne r0, r1 + addne r1, r2, #0x92 + cmpne r0, r1 + cmpne r0, #0x1a0 + addne r1, r2, #0x93 + cmpne r0, r1 + addne r1, r2, #0x8a + cmpne r0, r1 + addne r1, r2, #0x8b + cmpne r0, r1 + addne r1, r2, #0x8c + cmpne r0, r1 + beq _0230DCF0 + ldr r1, _0230E030 ; =0xFFFFFDEA + add r1, r0, r1 + mov r1, r1, lsl #0x10 + mov r1, r1, asr #0x10 + mov r1, r1, lsl #0x10 + mov r1, r1, lsr #0x10 + cmp r1, #1 + bhi _0230DD04 +_0230DCF0: + mov r1, #1 + bl IsMonsterOnTeam + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0230DD04: + mov r0, r6 + bl ov29_022FBDE0 + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldrsh r0, [r6, #2] + bl SpecificRecruitCheck + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + ldrsh r1, [r8, #4] + ldrsh r0, [r7, #4] + sub r0, r1, r0 + bl abs + cmp r0, #1 + bgt _0230DD5C + ldrsh r1, [r8, #6] + ldrsh r0, [r7, #6] + sub r0, r1, r0 + bl abs + cmp r0, #1 + ble _0230DD64 +_0230DD5C: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_0230DD64: + ldrb r0, [r6, #0x48] + cmp r0, #0xfa + ldrneb r0, [r6, #0xbc] + cmpne r0, #7 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r0, r7 + mov r1, r8 + bl CanSeeTarget + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r0, #1 + bl ov29_022E1B28 + bl ov29_022E81F8 + ldrsh r0, [r6, #2] + mov r1, #1 + bl IsMonsterOnTeam + mov sb, r0 + mov r0, #0x3e8 + bl DungeonRandInt + mov r4, r0 + bl HasPlayedOldGame + cmp r0, #0 + beq _0230DDE0 + cmp sb, #0 + bne _0230DDE0 + ldrsh r0, [r6, #2] + bl GetRecruitRate2 + mov r6, r0 + b _0230DDEC +_0230DDE0: + ldrsh r0, [r6, #2] + bl GetRecruitRate1 + mov r6, r0 +_0230DDEC: + cmp r6, #0 + ble _0230DDFC + cmp sb, #0 + movne r6, r6, asr #1 +_0230DDFC: + ldr r0, _0230E034 ; =0xFFFFFC19 + cmp r6, r0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + mov r0, r8 + mov r1, #0x35 + bl ItemIsActive__0230E578 + cmp r0, #0 + ldrne r0, _0230E038 ; =ov10_022C44FC + ldrnesh r0, [r0] + addne r6, r6, r0 + bne _0230DFD4 + mov r0, r8 + mov r1, #0x39 + bl ItemIsActive__0230E578 + cmp r0, #0 + ldrne r0, _0230E03C ; =ov10_022C443C + ldrnesh r0, [r0] + addne r6, r6, r0 + bne _0230DFD4 + mov r0, r8 + mov r1, #0x3a + bl ItemIsActive__0230E578 + cmp r0, #0 + ldrne r0, _0230E040 ; =ov10_022C447C + ldrnesh r0, [r0] + addne r6, r6, r0 + bne _0230DFD4 + mov r0, r8 + mov r1, #0x3b + bl ItemIsActive__0230E578 + cmp r0, #0 + beq _0230DEA0 + mov r0, r7 + mov r1, #6 + bl MonsterIsType + cmp r0, #0 + ldrne r0, _0230E044 ; =ov10_022C441C + ldrnesh r0, [r0] + addne r6, r6, r0 + b _0230DFD4 +_0230DEA0: + mov r0, r8 + mov r1, #0x3c + bl ItemIsActive__0230E578 + cmp r0, #0 + beq _0230DED4 + mov r0, r7 + mov r1, #2 + bl MonsterIsType + cmp r0, #0 + ldrne r0, _0230E048 ; =ov10_022C4410 + ldrnesh r0, [r0] + addne r6, r6, r0 + b _0230DFD4 +_0230DED4: + mov r0, r8 + mov r1, #0x3d + bl ItemIsActive__0230E578 + cmp r0, #0 + beq _0230DF08 + mov r0, r7 + mov r1, #9 + bl MonsterIsType + cmp r0, #0 + ldrne r0, _0230E04C ; =ov10_022C470C + ldrnesh r0, [r0] + addne r6, r6, r0 + b _0230DFD4 +_0230DF08: + mov r0, r8 + mov r1, #0x3e + bl ItemIsActive__0230E578 + cmp r0, #0 + beq _0230DF3C + mov r0, r7 + mov r1, #3 + bl MonsterIsType + cmp r0, #0 + ldrne r0, _0230E050 ; =ov10_022C4708 + ldrnesh r0, [r0] + addne r6, r6, r0 + b _0230DFD4 +_0230DF3C: + mov r0, r8 + mov r1, #0x3f + bl ItemIsActive__0230E578 + cmp r0, #0 + beq _0230DF70 + mov r0, r7 + mov r1, #0xd + bl MonsterIsType + cmp r0, #0 + ldrne r0, _0230E054 ; =ov10_022C4704 + ldrnesh r0, [r0] + addne r6, r6, r0 + b _0230DFD4 +_0230DF70: + mov r0, r8 + mov r1, #0x40 + bl ItemIsActive__0230E578 + cmp r0, #0 + beq _0230DFA4 + mov r0, r7 + mov r1, #4 + bl MonsterIsType + cmp r0, #0 + ldrne r0, _0230E058 ; =ov10_022C4700 + ldrnesh r0, [r0] + addne r6, r6, r0 + b _0230DFD4 +_0230DFA4: + mov r0, r8 + mov r1, #0x41 + bl ItemIsActive__0230E578 + cmp r0, #0 + beq _0230DFD4 + mov r0, r7 + mov r1, #0xa + bl MonsterIsType + cmp r0, #0 + ldrne r0, _0230E05C ; =ov10_022C46FC + ldrnesh r0, [r0] + addne r6, r6, r0 +_0230DFD4: + mov r0, r8 + mov r1, #0x1e + bl IqSkillIsEnabled + cmp r0, #0 + ldrne r0, _0230E038 ; =ov10_022C44FC + ldrb r1, [r5, #0xa] + ldrnesh r0, [r0] + mov r1, r1, lsl #1 + addne r6, r6, r0 + ldr r0, _0230E060 ; =RECRUITMENT_LEVEL_BOOST_TABLE + ldrsh r0, [r0, r1] + add r0, r6, r0 + cmp r4, r0 + mov r0, #0 + ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + bl GetFirstEmptyMemberIdx + cmp r0, #0 + movlt r0, #0 + movge r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_0230E024: .word DUNGEON_PTR +_0230E028: .word 0x000001E6 +_0230E02C: .word 0x0000010F +_0230E030: .word 0xFFFFFDEA +_0230E034: .word 0xFFFFFC19 +_0230E038: .word ov10_022C44FC +_0230E03C: .word ov10_022C443C +_0230E040: .word ov10_022C447C +_0230E044: .word ov10_022C441C +_0230E048: .word ov10_022C4410 +_0230E04C: .word ov10_022C470C +_0230E050: .word ov10_022C4708 +_0230E054: .word ov10_022C4704 +_0230E058: .word ov10_022C4700 +_0230E05C: .word ov10_022C46FC +_0230E060: .word RECRUITMENT_LEVEL_BOOST_TABLE + arm_func_end RecruitCheck + + 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 ov29_0234BA54 + 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 ov29_02304A48 + 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 sub_020585B4 + 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 ov29_02337EC0 + 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 sub_020585B4 + b _0230E38C +_0230E380: + ldr r1, [r6, #0xb4] + ldrsh r1, [r1, #0xc] + bl sub_020584FC +_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/include/dungeon_recruitment.h b/include/dungeon_recruitment.h new file mode 100644 index 00000000..aa230179 --- /dev/null +++ b/include/dungeon_recruitment.h @@ -0,0 +1,9 @@ +#ifndef PMDSKY_DUNGEON_RECRUITMENT_H +#define PMDSKY_DUNGEON_RECRUITMENT_H + +#include "util.h" + +bool8 SpecificRecruitCheck(u32 monster_id); +extern bool8 DebugRecruitingEnabled(u32 monster_id); + +#endif //PMDSKY_DUNGEON_RECRUITMENT_H diff --git a/main.lsf b/main.lsf index 27713c68..dac9a5ee 100644 --- a/main.lsf +++ b/main.lsf @@ -491,6 +491,8 @@ Overlay OVY_29 Object src/dungeon_damage.o Object asm/overlay_29_rodata_02352894.o Object asm/overlay_29_0230BBAC.o + Object src/dungeon_recruitment.o + Object asm/overlay_29_0230DBD0.o Object src/overlay_29_0230E578.o Object asm/overlay_29_0230E5A8.o Object src/dungeon_ai_items.o diff --git a/src/dungeon_recruitment.c b/src/dungeon_recruitment.c new file mode 100644 index 00000000..91cda483 --- /dev/null +++ b/src/dungeon_recruitment.c @@ -0,0 +1,48 @@ +#include "dungeon_recruitment.h" +#include "dungeon.h" + +bool8 SpecificRecruitCheck(u32 monster_id) { + if (DUNGEON_PTR[0]->recruiting_enabled == FALSE) { + return FALSE; + } + + // DebugRecruitingEnabled always returns TRUE + if (DebugRecruitingEnabled(monster_id) == FALSE) { + return FALSE; + } + + if (monster_id == MONSTER_MEW) { + // The cast is needed to produce assembly code that matches the original. + // Accessing dungeon_objective using the enum directly gives + // different assembly code. + if (*(volatile s8 *)&DUNGEON_PTR[0]->dungeon_objective == OBJECTIVE_RESCUE) { + return FALSE; + } + } + + if (monster_id == MONSTER_DEOXYS_ATTACK) { + return FALSE; + } + + if (monster_id == MONSTER_DEOXYS_DEFENSE) { + return FALSE; + } + + if (monster_id == MONSTER_DEOXYS_SPEED) { + return FALSE; + } + + if (monster_id == MONSTER_REGIROCK) { + return FALSE; + } + + if (monster_id == MONSTER_REGICE) { + return FALSE; + } + + if (monster_id == MONSTER_REGISTEEL) { + return FALSE; + } else { + return TRUE; + } +}