From b5f17acedf87673bd5774247bfa5b879f1c6f8be Mon Sep 17 00:00:00 2001 From: AnonymousRandomPerson Date: Sun, 21 Sep 2025 00:38:56 -0400 Subject: [PATCH] Decomped GetTypeMatchup Matched by @taxicat1 --- asm/include/overlay_29_0230AA0C.inc | 37 +- asm/include/overlay_29_0230AD04.inc | 45 ++ asm/overlay_29_0230AA0C.s | 834 ---------------------------- asm/overlay_29_0230AD04.s | 786 ++++++++++++++++++++++++++ include/enums.h | 2 + include/type_effectiveness.h | 19 + main.lsf | 2 + src/type_effectiveness.c | 27 + 8 files changed, 882 insertions(+), 870 deletions(-) create mode 100644 asm/include/overlay_29_0230AD04.inc create mode 100644 asm/overlay_29_0230AD04.s create mode 100644 include/type_effectiveness.h create mode 100644 src/type_effectiveness.c diff --git a/asm/include/overlay_29_0230AA0C.inc b/asm/include/overlay_29_0230AA0C.inc index 97c5999d..bd1d31b4 100644 --- a/asm/include/overlay_29_0230AA0C.inc +++ b/asm/include/overlay_29_0230AA0C.inc @@ -1,46 +1,11 @@ #pragma once .public AFTERMATH_CHANCE .public AbilityIsActiveVeneer -.public BURN_DAMAGE_MULTIPLIER -.public CLOUDY_DAMAGE_MULTIPLIER -.public DAMAGE_MULTIPLIER_0_5 -.public DAMAGE_MULTIPLIER_1_5 -.public DAMAGE_MULTIPLIER_2 .public DUNGEON_PTR .public DefenderAbilityIsActive__0230A940 .public DungeonRandOutcome__022EAB20 -.public EntityIsValid__02308FBC .public ExclusiveItemEffectIsActive__0230A9B8 -.public FixedPoint32To64 -.public FixedPoint64IsZero -.public FlashFireShouldActivate -.public GetApparentWeather -.public GravityIsActive -.public IntToFixedPoint64 -.public IqSkillIsEnabled -.public IsFloating -.public LevitateIsActive -.public LogMessageByIdWithPopupCheckParticipants -.public LogMessageByIdWithPopupCheckUserTarget -.public MATCHUP_IMMUNE_MULTIPLIER -.public MATCHUP_IMMUNE_MULTIPLIER_ERRATIC_PLAYER -.public MATCHUP_NEUTRAL_MULTIPLIER -.public MATCHUP_NEUTRAL_MULTIPLIER_ERRATIC_PLAYER -.public MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER -.public MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER -.public MATCHUP_SUPER_EFFECTIVE_MULTIPLIER -.public MATCHUP_SUPER_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER -.public MonsterIsType -.public MultiplyFixedPoint64 -.public PlayEffectAnimation0x1A9__022E61C8 -.public PlayEffectAnimation0x1A9__022E6214 -.public PlayEffectAnimation0x1A9__022E64C4 -.public PlayEffectAnimation0x1A9__022E6510 -.public SOLID_ROCK_MULTIPLIER -.public TECHNICIAN_MOVE_POWER_THRESHOLD -.public TINTED_LENS_MULTIPLIER +.public GetTypeMatchup .public TYPE_MATCHUP_COMBINATOR_TABLE -.public TYPE_MATCHUP_TABLE .public TryAftermathExplosion -.public UpdateStateFlags .public ov29_02352838 diff --git a/asm/include/overlay_29_0230AD04.inc b/asm/include/overlay_29_0230AD04.inc new file mode 100644 index 00000000..9747b6eb --- /dev/null +++ b/asm/include/overlay_29_0230AD04.inc @@ -0,0 +1,45 @@ +#pragma once +.public AbilityIsActiveVeneer +.public BURN_DAMAGE_MULTIPLIER +.public CLOUDY_DAMAGE_MULTIPLIER +.public DAMAGE_MULTIPLIER_0_5 +.public DAMAGE_MULTIPLIER_1_5 +.public DAMAGE_MULTIPLIER_2 +.public DUNGEON_PTR +.public DefenderAbilityIsActive__0230A940 +.public EntityIsValid__02308FBC +.public ExclusiveItemEffectIsActive__0230A9B8 +.public FixedPoint32To64 +.public FixedPoint64IsZero +.public FlashFireShouldActivate +.public GetApparentWeather +.public GetTypeMatchup +.public GhostImmunityIsActive +.public IntToFixedPoint64 +.public IqSkillIsEnabled +.public IsFloating +.public IsTypeIneffectiveAgainstGhost +.public LevitateIsActive +.public LogMessageByIdWithPopupCheckParticipants +.public LogMessageByIdWithPopupCheckUserTarget +.public MATCHUP_IMMUNE_MULTIPLIER +.public MATCHUP_IMMUNE_MULTIPLIER_ERRATIC_PLAYER +.public MATCHUP_NEUTRAL_MULTIPLIER +.public MATCHUP_NEUTRAL_MULTIPLIER_ERRATIC_PLAYER +.public MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER +.public MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER +.public MATCHUP_SUPER_EFFECTIVE_MULTIPLIER +.public MATCHUP_SUPER_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER +.public MonsterIsType +.public MultiplyFixedPoint64 +.public PlayEffectAnimation0x1A9__022E61C8 +.public PlayEffectAnimation0x1A9__022E6214 +.public PlayEffectAnimation0x1A9__022E64C4 +.public PlayEffectAnimation0x1A9__022E6510 +.public SOLID_ROCK_MULTIPLIER +.public ScrappyShouldActivate +.public TECHNICIAN_MOVE_POWER_THRESHOLD +.public TINTED_LENS_MULTIPLIER +.public TYPE_MATCHUP_COMBINATOR_TABLE +.public UpdateStateFlags +.public ov29_02352838 diff --git a/asm/overlay_29_0230AA0C.s b/asm/overlay_29_0230AA0C.s index 196d30cb..90807baa 100644 --- a/asm/overlay_29_0230AA0C.s +++ b/asm/overlay_29_0230AA0C.s @@ -187,837 +187,3 @@ _0230AC50: mov r0, #0 ldmia sp!, {r3, pc} arm_func_end GhostImmunityIsActive - - arm_func_start GetTypeMatchup -GetTypeMatchup: ; 0x0230AC58 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r1 - ldr r4, [r7, #0xb4] - mov r6, r2 - ldrb r1, [r4, #0xf5] - mov r5, r3 - cmp r1, #1 - beq _0230AC88 - mov r1, #0x46 - bl ExclusiveItemEffectIsActive__0230A9B8 - cmp r0, #0 - beq _0230ACA0 -_0230AC88: - cmp r5, #0xb - addeq r0, r4, r6 - ldreqb r0, [r0, #0x5e] - cmpeq r0, #0x10 - moveq r0, #2 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} -_0230ACA0: - cmp r5, #9 - bne _0230ACE0 - bl GravityIsActive - cmp r0, #0 - beq _0230ACCC - add r0, r4, r6 - ldrb r0, [r0, #0x5e] - cmp r0, #0xa - bne _0230ACE0 - mov r0, #2 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_0230ACCC: - mov r0, r7 - bl IsFloating - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} -_0230ACE0: - ldr r1, _0230AD00 ; =TYPE_MATCHUP_TABLE - mov r0, #0x24 - mla r0, r5, r0, r1 - add r1, r4, r6 - ldrb r1, [r1, #0x5e] - mov r1, r1, lsl #1 - ldrsh r0, [r1, r0] - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_0230AD00: .word TYPE_MATCHUP_TABLE - arm_func_end GetTypeMatchup - - arm_func_start CalcTypeBasedDamageEffects -CalcTypeBasedDamageEffects: ; 0x0230AD04 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x64 - ldr r5, _0230B774 ; =ov29_02352838 - mov sl, r1 - ldr r4, [r5, #0x1c] - ldr r5, [r5, #0x20] - ldr r8, [sp, #0x88] - ldr r1, [sp, #0x90] - ldr r7, [sp, #0x8c] - str r1, [sp, #0x90] - ldr r6, [sl, #0xb4] - mov r1, #1 - mov fp, r0 - mov sb, r2 - str r3, [sp, #4] - str r4, [sp, #0x34] - str r5, [sp, #0x38] - bl IntToFixedPoint64 - mov r0, #0 - str r0, [sp, #0x30] - strb r0, [r7, #0xe] - ldr r1, [sp, #0x30] - mov r0, sb - strb r1, [r7, #0xf] - bl EntityIsValid__02308FBC - cmp r0, #0 - moveq r0, #1 - beq _0230B76C - mov r0, r8 - bl IsTypeIneffectiveAgainstGhost - str r0, [sp, #0x2c] - mov r0, sl - mov r1, sb - mov r2, #0x35 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - cmpne r8, #0 - movne r0, #1 - strne r0, [sp, #0x30] - mov r3, #2 - mov r0, sl - mov r1, sb - mov r2, r8 - str r3, [r7, #8] - bl ScrappyShouldActivate - ldr r3, _0230B778 ; =MATCHUP_IMMUNE_MULTIPLIER_ERRATIC_PLAYER - str r0, [sp, #0x28] - ldr r0, [r3] - ldr r2, _0230B77C ; =MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER - str r0, [sp, #0x24] - ldr r0, [r2] - ldr r1, _0230B780 ; =MATCHUP_NEUTRAL_MULTIPLIER_ERRATIC_PLAYER - str r0, [sp, #0x20] - ldr r0, [r1] - ldr r1, _0230B784 ; =MATCHUP_IMMUNE_MULTIPLIER - str r0, [sp, #0x1c] - ldr r0, _0230B788 ; =MATCHUP_SUPER_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER - mov r4, #0 - ldr r0, [r0] - str r0, [sp, #0x18] - ldr r0, [r1] - ldr r1, _0230B78C ; =MATCHUP_NEUTRAL_MULTIPLIER - str r0, [sp, #0x14] - ldr r0, _0230B790 ; =MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER - ldr r0, [r0] - str r0, [sp, #0x10] - ldr r0, [r1] - str r0, [sp, #0xc] - ldr r0, _0230B794 ; =MATCHUP_SUPER_EFFECTIVE_MULTIPLIER - ldr r0, [r0] - str r0, [sp, #8] - b _0230AF8C -_0230AE28: - ldr r0, [sp, #0x90] - cmp r0, #0 - bne _0230AE90 - mov r0, sl - mov r1, #0x3b - bl IqSkillIsEnabled - cmp r0, #0 - bne _0230AE5C - mov r0, sb - mov r1, #0x3b - bl IqSkillIsEnabled - cmp r0, #0 - beq _0230AE90 -_0230AE5C: - ldr r1, [sp, #0x24] - add r0, sp, #0x44 - bl FixedPoint32To64 - ldr r1, [sp, #0x20] - add r0, sp, #0x4c - bl FixedPoint32To64 - ldr r1, [sp, #0x1c] - add r0, sp, #0x54 - bl FixedPoint32To64 - ldr r1, [sp, #0x18] - add r0, sp, #0x5c - bl FixedPoint32To64 - b _0230AEC0 -_0230AE90: - ldr r1, [sp, #0x14] - add r0, sp, #0x44 - bl FixedPoint32To64 - ldr r1, [sp, #0x10] - add r0, sp, #0x4c - bl FixedPoint32To64 - ldr r1, [sp, #0xc] - add r0, sp, #0x54 - bl FixedPoint32To64 - ldr r1, [sp, #8] - add r0, sp, #0x5c - bl FixedPoint32To64 -_0230AEC0: - mov r0, fp - bl FixedPoint64IsZero - cmp r0, #0 - bne _0230AF94 - ldr r0, [sp, #0x28] - cmp r0, #0 - bne _0230AF1C - ldr r0, [sp, #0x2c] - cmp r0, #0 - beq _0230AF1C - mov r0, sl - mov r1, sb - mov r2, r4, lsl #0x10 - mov r2, r2, asr #0x10 - bl GhostImmunityIsActive - cmp r0, #0 - beq _0230AF1C - ldr r0, _0230B798 ; =DUNGEON_PTR - mov r5, #0 - ldr r1, [r0] - mov r0, #1 - strb r0, [r1, #0x1d4] - b _0230AF38 -_0230AF1C: - mov r0, sl - mov r1, sb - mov r2, r4, lsl #0x10 - mov r2, r2, asr #0x10 - mov r3, r8 - bl GetTypeMatchup - mov r5, r0 -_0230AF38: - mov r0, sl - mov r1, #0x3b - bl IqSkillIsEnabled - cmp r0, #0 - beq _0230AF64 - add r2, sp, #0x44 - mov r0, fp - mov r1, fp - add r2, r2, r5, lsl #3 - bl MultiplyFixedPoint64 - b _0230AF80 -_0230AF64: - cmp r5, #2 - beq _0230AF80 - add r2, sp, #0x44 - mov r0, fp - mov r1, fp - add r2, r2, r5, lsl #3 - bl MultiplyFixedPoint64 -_0230AF80: - add r0, sp, #0x34 - str r5, [r0, r4, lsl #2] - add r4, r4, #1 -_0230AF8C: - cmp r4, #2 - blt _0230AE28 -_0230AF94: - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r4, [sp, #0x34] - ldr r2, [r0] - ldr r1, _0230B79C ; =TYPE_MATCHUP_COMBINATOR_TABLE - strb r4, [r2, #0x18c] - ldr r3, [sp, #0x38] - ldr r2, [r0] - add r1, r1, r4, lsl #4 - ldr r0, [r1, r3, lsl #2] - strb r3, [r2, #0x18d] - cmp r0, #3 - str r0, [r7, #8] - moveq r4, #1 - beq _0230AFEC - ldr r0, [sp, #0x30] - mov r4, #0 - cmp r0, #0 - ldrne r0, _0230B774 ; =ov29_02352838 - ldrne r1, [r0, #0x3c] - ldrne r0, [r0, #0x40] - strne r1, [fp] - strne r0, [fp, #4] -_0230AFEC: - mov r0, sl - mov r1, #0x50 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230B02C - ldr r0, [r7, #8] - cmp r0, #1 - bne _0230B02C - ldr r1, _0230B7A0 ; =TINTED_LENS_MULTIPLIER - add r0, sp, #0x3c - ldr r1, [r1] - bl FixedPoint32To64 - add r2, sp, #0x3c - mov r0, fp - mov r1, fp - bl MultiplyFixedPoint64 -_0230B02C: - mov r0, sl - mov r1, sb - mov r2, #0x6c -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - bne _0230B064 - mov r0, sl - mov r1, sb - mov r2, #0x6e -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _0230B080 -_0230B064: - ldr r0, [r7, #8] - cmp r0, #3 - bne _0230B080 - ldr r2, _0230B7A4 ; =SOLID_ROCK_MULTIPLIER - mov r0, fp - mov r1, fp - bl MultiplyFixedPoint64 -_0230B080: - mov r0, sb - mov r1, #0x5a - bl ExclusiveItemEffectIsActive__0230A9B8 - cmp r0, #0 - beq _0230B0A4 - ldr r2, _0230B7A8 ; =DAMAGE_MULTIPLIER_0_5 - mov r0, fp - mov r1, fp - bl MultiplyFixedPoint64 -_0230B0A4: - ldr r0, [sp, #0x90] - cmp r0, #0 - bne _0230B104 - mov r0, sl - mov r1, #0x64 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230B104 - ldr r0, _0230B7AC ; =TECHNICIAN_MOVE_POWER_THRESHOLD - ldrsh r1, [r0] - ldr r0, [sp, #4] - cmp r0, r1 - bgt _0230B104 - ldr r2, _0230B7B0 ; =DAMAGE_MULTIPLIER_1_5 - mov r0, fp - mov r1, fp - bl MultiplyFixedPoint64 - mov r1, #0x64 - ldr r2, _0230B7B4 ; =0x00000C3E - mov r0, sl - str r1, [sp] - mov r1, sb - mov r3, #2 - bl LogMessageByIdWithPopupCheckParticipants -_0230B104: - cmp r8, #2 - cmpne r8, #6 - bne _0230B14C - mov r0, sl - mov r1, sb - mov r2, #2 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _0230B14C - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7A8 ; =DAMAGE_MULTIPLIER_0_5 - ldr r3, [r0] - mov r5, #1 - mov r0, fp - mov r1, fp - strb r5, [r3, #0x1c5] - bl MultiplyFixedPoint64 -_0230B14C: - cmp r8, #2 - bne _0230B198 - mov r0, sl - mov r1, sb - bl FlashFireShouldActivate - cmp r0, #0 - beq _0230B198 - ldr r1, _0230B798 ; =DUNGEON_PTR - mov r0, fp - ldr r2, [r1] - mov r3, #1 - mov r1, #0 - strb r3, [r2, #0x1c6] - bl IntToFixedPoint64 - mov r4, #0 - str r4, [r7, #8] - strb r4, [r7, #0xe] - mov r0, #1 - strb r0, [r7, #0xf] -_0230B198: - cmp r8, #2 - bne _0230B1DC - mov r0, sl - mov r1, sb - mov r2, #0x5f -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _0230B1DC - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7A8 ; =DAMAGE_MULTIPLIER_0_5 - ldr r3, [r0] - mov r5, #1 - mov r0, fp - mov r1, fp - strb r5, [r3, #0x1c5] - bl MultiplyFixedPoint64 -_0230B1DC: - cmp r8, #9 - bne _0230B248 - mov r0, sl - mov r1, #0x53 - bl AbilityIsActiveVeneer - cmp r0, #0 - bne _0230B208 - mov r0, sb - bl LevitateIsActive - cmp r0, #0 - bne _0230B218 -_0230B208: - mov r0, sb - bl IsFloating - cmp r0, #0 - beq _0230B248 -_0230B218: - ldr r1, _0230B798 ; =DUNGEON_PTR - mov r0, fp - ldr r2, [r1] - mov r3, #1 - mov r1, #0 - strb r3, [r2, #0x1c7] - bl IntToFixedPoint64 - mov r4, #0 - str r4, [r7, #8] - strb r4, [r7, #0xe] - mov r0, #1 - strb r0, [r7, #0xf] -_0230B248: - cmp r8, #3 - bne _0230B2F4 - mov r0, sl - mov r1, #0x10 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230B2F4 - ldrsh r2, [r6, #0x12] - ldrsh r1, [r6, #0x16] - ldr r0, _0230B7B8 ; =0x000003E7 - add r2, r2, r1 - cmp r2, r0 - movgt r2, r0 - mov r0, r2, asr #1 - ldrsh r1, [r6, #0x10] - add r0, r2, r0, lsr #30 - cmp r1, r0, asr #2 - movle r0, #1 - movgt r0, #0 - and r7, r0, #0xff - mov r0, r6 - mov r2, r7 - mov r1, #0x80 - bl UpdateStateFlags - mov r5, r0 - cmp r7, #0 - beq _0230B2D4 - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7BC ; =DAMAGE_MULTIPLIER_2 - ldr r3, [r0] - mov r7, #1 - mov r0, fp - mov r1, fp - strb r7, [r3, #0x1c8] - bl MultiplyFixedPoint64 -_0230B2D4: - cmp r5, #0 - beq _0230B2F4 - mov r0, sl - bl PlayEffectAnimation0x1A9__022E6214 - ldr r2, _0230B7C0 ; =0x00000C4F - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget -_0230B2F4: - cmp r8, #4 - bne _0230B3A0 - mov r0, sl - mov r1, #0x1a - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230B3A0 - ldrsh r2, [r6, #0x12] - ldrsh r1, [r6, #0x16] - ldr r0, _0230B7B8 ; =0x000003E7 - add r2, r2, r1 - cmp r2, r0 - movgt r2, r0 - mov r0, r2, asr #1 - ldrsh r1, [r6, #0x10] - add r0, r2, r0, lsr #30 - cmp r1, r0, asr #2 - movle r0, #1 - movgt r0, #0 - and r7, r0, #0xff - mov r0, r6 - mov r2, r7 - mov r1, #2 - bl UpdateStateFlags - mov r5, r0 - cmp r7, #0 - beq _0230B380 - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7BC ; =DAMAGE_MULTIPLIER_2 - ldr r3, [r0] - mov r7, #1 - mov r0, fp - mov r1, fp - strb r7, [r3, #0x1c9] - bl MultiplyFixedPoint64 -_0230B380: - cmp r5, #0 - beq _0230B3A0 - mov r0, sl - bl PlayEffectAnimation0x1A9__022E61C8 -#ifdef JAPAN - ldr r2, _0230CD24 ; =0x0000098F - mov r0, sl - mov r1, sb -#else - mov r0, sl - mov r1, sb - mov r2, #0xc50 -#endif - bl LogMessageByIdWithPopupCheckUserTarget -_0230B3A0: - cmp r8, #0xc - bne _0230B44C - mov r0, sl - mov r1, #0x43 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230B44C - ldrsh r2, [r6, #0x12] - ldrsh r1, [r6, #0x16] - ldr r0, _0230B7B8 ; =0x000003E7 - add r2, r2, r1 - cmp r2, r0 - movgt r2, r0 - mov r0, r2, asr #1 - ldrsh r1, [r6, #0x10] - add r0, r2, r0, lsr #30 - cmp r1, r0, asr #2 - movle r0, #1 - movgt r0, #0 - and r7, r0, #0xff - mov r0, r6 - mov r2, r7 - mov r1, #0x10 - bl UpdateStateFlags - mov r5, r0 - cmp r7, #0 - beq _0230B42C - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7BC ; =DAMAGE_MULTIPLIER_2 - ldr r3, [r0] - mov r7, #1 - mov r0, fp - mov r1, fp - strb r7, [r3, #0x1ca] - bl MultiplyFixedPoint64 -_0230B42C: - cmp r5, #0 - beq _0230B44C - mov r0, sl - bl PlayEffectAnimation0x1A9__022E64C4 -#ifdef JAPAN - mov r0, sl - mov r1, sb - mov r2, #0x990 -#else - ldr r2, _0230B7C4 ; =0x00000C51 - mov r0, sl - mov r1, sb -#endif - bl LogMessageByIdWithPopupCheckUserTarget -_0230B44C: - cmp r8, #2 - bne _0230B534 - mov r0, sl - mov r1, #0x46 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230B4F8 - ldrsh r2, [r6, #0x12] - ldrsh r1, [r6, #0x16] - ldr r0, _0230B7B8 ; =0x000003E7 - add r2, r2, r1 - cmp r2, r0 - movgt r2, r0 - mov r0, r2, asr #1 - ldrsh r1, [r6, #0x10] - add r0, r2, r0, lsr #30 - cmp r1, r0, asr #2 - movle r0, #1 - movgt r0, #0 - and r7, r0, #0xff - mov r0, r6 - mov r2, r7 - mov r1, #0x20 - bl UpdateStateFlags - mov r5, r0 - cmp r7, #0 - beq _0230B4D8 - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7BC ; =DAMAGE_MULTIPLIER_2 - ldr r3, [r0] - mov r7, #1 - mov r0, fp - mov r1, fp - strb r7, [r3, #0x1cb] - bl MultiplyFixedPoint64 -_0230B4D8: - cmp r5, #0 - beq _0230B4F8 - mov r0, sl - bl PlayEffectAnimation0x1A9__022E6510 - ldr r2, _0230B7C8 ; =0x00000C52 - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget -_0230B4F8: - mov r0, sl - mov r1, sb - mov r2, #0x55 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__0230A940 - cmp r0, #0 - beq _0230B534 - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7B0 ; =DAMAGE_MULTIPLIER_1_5 - ldr r3, [r0] - mov r5, #1 - mov r0, fp - mov r1, fp - strb r5, [r3, #0x1cb] - bl MultiplyFixedPoint64 -_0230B534: - ldrb r0, [r6, #0xbf] - cmp r0, #1 - bne _0230B560 - ldr r1, _0230B7CC ; =BURN_DAMAGE_MULTIPLIER - add r0, sp, #0x3c - ldr r1, [r1] - bl FixedPoint32To64 - add r2, sp, #0x3c - mov r0, fp - mov r1, fp - bl MultiplyFixedPoint64 -_0230B560: - mov r0, fp - bl FixedPoint64IsZero - cmp r0, #0 - bne _0230B5CC - mov r0, sl - mov r1, r8 - bl MonsterIsType - cmp r0, #0 - beq _0230B5CC - ldr r1, _0230B798 ; =DUNGEON_PTR - mov r0, sl - ldr r2, [r1] - mov r3, #1 - mov r1, #0x63 - strb r3, [r2, #0x1cf] - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _0230B5BC - ldr r2, _0230B7BC ; =DAMAGE_MULTIPLIER_2 - mov r0, fp - mov r1, fp - bl MultiplyFixedPoint64 - b _0230B5CC -_0230B5BC: - ldr r2, _0230B7B0 ; =DAMAGE_MULTIPLIER_1_5 - mov r0, fp - mov r1, fp - bl MultiplyFixedPoint64 -_0230B5CC: - mov r0, sl - bl GetApparentWeather - mov r5, r0 - cmp r5, #1 - bne _0230B634 - cmp r8, #2 - bne _0230B60C - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7B0 ; =DAMAGE_MULTIPLIER_1_5 - ldr r3, [r0] - mov r7, #1 - mov r0, fp - mov r1, fp - strb r7, [r3, #0x1c4] - bl MultiplyFixedPoint64 - b _0230B634 -_0230B60C: - cmp r8, #3 - bne _0230B634 - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7A8 ; =DAMAGE_MULTIPLIER_0_5 - ldr r3, [r0] - mov r7, #1 - mov r0, fp - mov r1, fp - strb r7, [r3, #0x1c4] - bl MultiplyFixedPoint64 -_0230B634: - cmp r5, #4 - bne _0230B690 - cmp r8, #2 - bne _0230B668 - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7A8 ; =DAMAGE_MULTIPLIER_0_5 - ldr r3, [r0] - mov r7, #1 - mov r0, fp - mov r1, fp - strb r7, [r3, #0x1c3] - bl MultiplyFixedPoint64 - b _0230B690 -_0230B668: - cmp r8, #3 - bne _0230B690 - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7B0 ; =DAMAGE_MULTIPLIER_1_5 - ldr r3, [r0] - mov r7, #1 - mov r0, fp - mov r1, fp - strb r7, [r3, #0x1c3] - bl MultiplyFixedPoint64 -_0230B690: - cmp r5, #3 - bne _0230B6C0 - cmp r8, #1 - beq _0230B6C0 - ldr r2, _0230B7D0 ; =CLOUDY_DAMAGE_MULTIPLIER - mov r0, fp - mov r1, fp - bl MultiplyFixedPoint64 - ldr r0, _0230B798 ; =DUNGEON_PTR - mov r1, #1 - ldr r0, [r0] - strb r1, [r0, #0x1c2] -_0230B6C0: - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r7, [r0] - add r0, r7, #0xc000 -#ifdef JAPAN - ldrb r0, [r0, #0xcb7] -#else - ldrb r0, [r0, #0xd5b] -#endif - cmp r0, #0 - bne _0230B6E0 - cmp r5, #6 - bne _0230B700 -_0230B6E0: - cmp r8, #5 - bne _0230B700 - ldr r2, _0230B7A8 ; =DAMAGE_MULTIPLIER_0_5 - mov r3, #1 - mov r0, fp - mov r1, fp - strb r3, [r7, #0x1d0] - bl MultiplyFixedPoint64 -_0230B700: - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r5, [r0] - add r0, r5, #0xc000 -#ifdef JAPAN - ldrb r0, [r0, #0xcb8] -#else - ldrb r0, [r0, #0xd5c] -#endif - cmp r0, #0 - beq _0230B738 - cmp r8, #2 - bne _0230B738 - ldr r2, _0230B7A8 ; =DAMAGE_MULTIPLIER_0_5 - mov r3, #1 - mov r0, fp - mov r1, fp - strb r3, [r5, #0x1d1] - bl MultiplyFixedPoint64 -_0230B738: - cmp r8, #5 - ldreqb r0, [r6, #0xd2] - cmpeq r0, #0xb - bne _0230B768 - ldr r0, _0230B798 ; =DUNGEON_PTR - ldr r2, _0230B7BC ; =DAMAGE_MULTIPLIER_2 - ldr r3, [r0] - mov r5, #1 - mov r0, fp - mov r1, fp - strb r5, [r3, #0x1d2] - bl MultiplyFixedPoint64 -_0230B768: - mov r0, r4 -_0230B76C: - add sp, sp, #0x64 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -#ifdef JAPAN -#define CALC_TYPE_BASED_DAMAGE_EFFECTS_OFFSET -0x2C1 -#else -#define CALC_TYPE_BASED_DAMAGE_EFFECTS_OFFSET 0 -#endif -_0230B774: .word ov29_02352838 -_0230B778: .word MATCHUP_IMMUNE_MULTIPLIER_ERRATIC_PLAYER -_0230B77C: .word MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER -_0230B780: .word MATCHUP_NEUTRAL_MULTIPLIER_ERRATIC_PLAYER -_0230B784: .word MATCHUP_IMMUNE_MULTIPLIER -_0230B788: .word MATCHUP_SUPER_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER -_0230B78C: .word MATCHUP_NEUTRAL_MULTIPLIER -_0230B790: .word MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER -_0230B794: .word MATCHUP_SUPER_EFFECTIVE_MULTIPLIER -_0230B798: .word DUNGEON_PTR -_0230B79C: .word TYPE_MATCHUP_COMBINATOR_TABLE -_0230B7A0: .word TINTED_LENS_MULTIPLIER -_0230B7A4: .word SOLID_ROCK_MULTIPLIER -_0230B7A8: .word DAMAGE_MULTIPLIER_0_5 -_0230B7AC: .word TECHNICIAN_MOVE_POWER_THRESHOLD -_0230B7B0: .word DAMAGE_MULTIPLIER_1_5 -_0230B7B4: .word 0x00000C3E + CALC_TYPE_BASED_DAMAGE_EFFECTS_OFFSET -_0230B7B8: .word 0x000003E7 -_0230B7BC: .word DAMAGE_MULTIPLIER_2 -_0230B7C0: .word 0x00000C4F + CALC_TYPE_BASED_DAMAGE_EFFECTS_OFFSET -#ifdef JAPAN -_0230CD24: .word 0x0000098F -#else -_0230B7C4: .word 0x00000C51 -#endif -_0230B7C8: .word 0x00000C52 + CALC_TYPE_BASED_DAMAGE_EFFECTS_OFFSET -_0230B7CC: .word BURN_DAMAGE_MULTIPLIER -_0230B7D0: .word CLOUDY_DAMAGE_MULTIPLIER - arm_func_end CalcTypeBasedDamageEffects diff --git a/asm/overlay_29_0230AD04.s b/asm/overlay_29_0230AD04.s new file mode 100644 index 00000000..19702152 --- /dev/null +++ b/asm/overlay_29_0230AD04.s @@ -0,0 +1,786 @@ + .include "asm/macros.inc" + .include "overlay_29_0230AD04.inc" + + .text + + arm_func_start CalcTypeBasedDamageEffects +CalcTypeBasedDamageEffects: ; 0x0230AD04 + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x64 + ldr r5, _0230B774 ; =ov29_02352838 + mov sl, r1 + ldr r4, [r5, #0x1c] + ldr r5, [r5, #0x20] + ldr r8, [sp, #0x88] + ldr r1, [sp, #0x90] + ldr r7, [sp, #0x8c] + str r1, [sp, #0x90] + ldr r6, [sl, #0xb4] + mov r1, #1 + mov fp, r0 + mov sb, r2 + str r3, [sp, #4] + str r4, [sp, #0x34] + str r5, [sp, #0x38] + bl IntToFixedPoint64 + mov r0, #0 + str r0, [sp, #0x30] + strb r0, [r7, #0xe] + ldr r1, [sp, #0x30] + mov r0, sb + strb r1, [r7, #0xf] + bl EntityIsValid__02308FBC + cmp r0, #0 + moveq r0, #1 + beq _0230B76C + mov r0, r8 + bl IsTypeIneffectiveAgainstGhost + str r0, [sp, #0x2c] + mov r0, sl + mov r1, sb + mov r2, #0x35 +#ifndef JAPAN + mov r3, #1 +#endif + bl DefenderAbilityIsActive__0230A940 + cmp r0, #0 + cmpne r8, #0 + movne r0, #1 + strne r0, [sp, #0x30] + mov r3, #2 + mov r0, sl + mov r1, sb + mov r2, r8 + str r3, [r7, #8] + bl ScrappyShouldActivate + ldr r3, _0230B778 ; =MATCHUP_IMMUNE_MULTIPLIER_ERRATIC_PLAYER + str r0, [sp, #0x28] + ldr r0, [r3] + ldr r2, _0230B77C ; =MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER + str r0, [sp, #0x24] + ldr r0, [r2] + ldr r1, _0230B780 ; =MATCHUP_NEUTRAL_MULTIPLIER_ERRATIC_PLAYER + str r0, [sp, #0x20] + ldr r0, [r1] + ldr r1, _0230B784 ; =MATCHUP_IMMUNE_MULTIPLIER + str r0, [sp, #0x1c] + ldr r0, _0230B788 ; =MATCHUP_SUPER_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER + mov r4, #0 + ldr r0, [r0] + str r0, [sp, #0x18] + ldr r0, [r1] + ldr r1, _0230B78C ; =MATCHUP_NEUTRAL_MULTIPLIER + str r0, [sp, #0x14] + ldr r0, _0230B790 ; =MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER + ldr r0, [r0] + str r0, [sp, #0x10] + ldr r0, [r1] + str r0, [sp, #0xc] + ldr r0, _0230B794 ; =MATCHUP_SUPER_EFFECTIVE_MULTIPLIER + ldr r0, [r0] + str r0, [sp, #8] + b _0230AF8C +_0230AE28: + ldr r0, [sp, #0x90] + cmp r0, #0 + bne _0230AE90 + mov r0, sl + mov r1, #0x3b + bl IqSkillIsEnabled + cmp r0, #0 + bne _0230AE5C + mov r0, sb + mov r1, #0x3b + bl IqSkillIsEnabled + cmp r0, #0 + beq _0230AE90 +_0230AE5C: + ldr r1, [sp, #0x24] + add r0, sp, #0x44 + bl FixedPoint32To64 + ldr r1, [sp, #0x20] + add r0, sp, #0x4c + bl FixedPoint32To64 + ldr r1, [sp, #0x1c] + add r0, sp, #0x54 + bl FixedPoint32To64 + ldr r1, [sp, #0x18] + add r0, sp, #0x5c + bl FixedPoint32To64 + b _0230AEC0 +_0230AE90: + ldr r1, [sp, #0x14] + add r0, sp, #0x44 + bl FixedPoint32To64 + ldr r1, [sp, #0x10] + add r0, sp, #0x4c + bl FixedPoint32To64 + ldr r1, [sp, #0xc] + add r0, sp, #0x54 + bl FixedPoint32To64 + ldr r1, [sp, #8] + add r0, sp, #0x5c + bl FixedPoint32To64 +_0230AEC0: + mov r0, fp + bl FixedPoint64IsZero + cmp r0, #0 + bne _0230AF94 + ldr r0, [sp, #0x28] + cmp r0, #0 + bne _0230AF1C + ldr r0, [sp, #0x2c] + cmp r0, #0 + beq _0230AF1C + mov r0, sl + mov r1, sb + mov r2, r4, lsl #0x10 + mov r2, r2, asr #0x10 + bl GhostImmunityIsActive + cmp r0, #0 + beq _0230AF1C + ldr r0, _0230B798 ; =DUNGEON_PTR + mov r5, #0 + ldr r1, [r0] + mov r0, #1 + strb r0, [r1, #0x1d4] + b _0230AF38 +_0230AF1C: + mov r0, sl + mov r1, sb + mov r2, r4, lsl #0x10 + mov r2, r2, asr #0x10 + mov r3, r8 + bl GetTypeMatchup + mov r5, r0 +_0230AF38: + mov r0, sl + mov r1, #0x3b + bl IqSkillIsEnabled + cmp r0, #0 + beq _0230AF64 + add r2, sp, #0x44 + mov r0, fp + mov r1, fp + add r2, r2, r5, lsl #3 + bl MultiplyFixedPoint64 + b _0230AF80 +_0230AF64: + cmp r5, #2 + beq _0230AF80 + add r2, sp, #0x44 + mov r0, fp + mov r1, fp + add r2, r2, r5, lsl #3 + bl MultiplyFixedPoint64 +_0230AF80: + add r0, sp, #0x34 + str r5, [r0, r4, lsl #2] + add r4, r4, #1 +_0230AF8C: + cmp r4, #2 + blt _0230AE28 +_0230AF94: + ldr r0, _0230B798 ; =DUNGEON_PTR + ldr r4, [sp, #0x34] + ldr r2, [r0] + ldr r1, _0230B79C ; =TYPE_MATCHUP_COMBINATOR_TABLE + strb r4, [r2, #0x18c] + ldr r3, [sp, #0x38] + ldr r2, [r0] + add r1, r1, r4, lsl #4 + ldr r0, [r1, r3, lsl #2] + strb r3, [r2, #0x18d] + cmp r0, #3 + str r0, [r7, #8] + moveq r4, #1 + beq _0230AFEC + ldr r0, [sp, #0x30] + mov r4, #0 + cmp r0, #0 + ldrne r0, _0230B774 ; =ov29_02352838 + ldrne r1, [r0, #0x3c] + ldrne r0, [r0, #0x40] + strne r1, [fp] + strne r0, [fp, #4] +_0230AFEC: + mov r0, sl + mov r1, #0x50 + bl AbilityIsActiveVeneer + cmp r0, #0 + beq _0230B02C + ldr r0, [r7, #8] + cmp r0, #1 + bne _0230B02C + ldr r1, _0230B7A0 ; =TINTED_LENS_MULTIPLIER + add r0, sp, #0x3c + ldr r1, [r1] + bl FixedPoint32To64 + add r2, sp, #0x3c + mov r0, fp + mov r1, fp + bl MultiplyFixedPoint64 +_0230B02C: + mov r0, sl + mov r1, sb + mov r2, #0x6c +#ifndef JAPAN + mov r3, #1 +#endif + bl DefenderAbilityIsActive__0230A940 + cmp r0, #0 + bne _0230B064 + mov r0, sl + mov r1, sb + mov r2, #0x6e +#ifndef JAPAN + mov r3, #1 +#endif + bl DefenderAbilityIsActive__0230A940 + cmp r0, #0 + beq _0230B080 +_0230B064: + ldr r0, [r7, #8] + cmp r0, #3 + bne _0230B080 + ldr r2, _0230B7A4 ; =SOLID_ROCK_MULTIPLIER + mov r0, fp + mov r1, fp + bl MultiplyFixedPoint64 +_0230B080: + mov r0, sb + mov r1, #0x5a + bl ExclusiveItemEffectIsActive__0230A9B8 + cmp r0, #0 + beq _0230B0A4 + ldr r2, _0230B7A8 ; =DAMAGE_MULTIPLIER_0_5 + mov r0, fp + mov r1, fp + bl MultiplyFixedPoint64 +_0230B0A4: + ldr r0, [sp, #0x90] + cmp r0, #0 + bne _0230B104 + mov r0, sl + mov r1, #0x64 + bl AbilityIsActiveVeneer + cmp r0, #0 + beq _0230B104 + ldr r0, _0230B7AC ; =TECHNICIAN_MOVE_POWER_THRESHOLD + ldrsh r1, [r0] + ldr r0, [sp, #4] + cmp r0, r1 + bgt _0230B104 + ldr r2, _0230B7B0 ; =DAMAGE_MULTIPLIER_1_5 + mov r0, fp + mov r1, fp + bl MultiplyFixedPoint64 + mov r1, #0x64 + ldr r2, _0230B7B4 ; =0x00000C3E + mov r0, sl + str r1, [sp] + mov r1, sb + mov r3, #2 + bl LogMessageByIdWithPopupCheckParticipants +_0230B104: + cmp r8, #2 + cmpne r8, #6 + bne _0230B14C + mov r0, sl + mov r1, sb + mov r2, #2 +#ifndef JAPAN + mov r3, #1 +#endif + bl DefenderAbilityIsActive__0230A940 + cmp r0, #0 + beq _0230B14C + ldr r0, _0230B798 ; =DUNGEON_PTR + ldr r2, _0230B7A8 ; =DAMAGE_MULTIPLIER_0_5 + ldr r3, [r0] + mov r5, #1 + mov r0, fp + mov r1, fp + strb r5, [r3, #0x1c5] + bl MultiplyFixedPoint64 +_0230B14C: + cmp r8, #2 + bne _0230B198 + mov r0, sl + mov r1, sb + bl FlashFireShouldActivate + cmp r0, #0 + beq _0230B198 + ldr r1, _0230B798 ; =DUNGEON_PTR + mov r0, fp + ldr r2, [r1] + mov r3, #1 + mov r1, #0 + strb r3, [r2, #0x1c6] + bl IntToFixedPoint64 + mov r4, #0 + str r4, [r7, #8] + strb r4, [r7, #0xe] + mov r0, #1 + strb r0, [r7, #0xf] +_0230B198: + cmp r8, #2 + bne _0230B1DC + mov r0, sl + mov r1, sb + mov r2, #0x5f +#ifndef JAPAN + mov r3, #1 +#endif + bl DefenderAbilityIsActive__0230A940 + cmp r0, #0 + beq _0230B1DC + ldr r0, _0230B798 ; =DUNGEON_PTR + ldr r2, _0230B7A8 ; =DAMAGE_MULTIPLIER_0_5 + ldr r3, [r0] + mov r5, #1 + mov r0, fp + mov r1, fp + strb r5, [r3, #0x1c5] + bl MultiplyFixedPoint64 +_0230B1DC: + cmp r8, #9 + bne _0230B248 + mov r0, sl + mov r1, #0x53 + bl AbilityIsActiveVeneer + cmp r0, #0 + bne _0230B208 + mov r0, sb + bl LevitateIsActive + cmp r0, #0 + bne _0230B218 +_0230B208: + mov r0, sb + bl IsFloating + cmp r0, #0 + beq _0230B248 +_0230B218: + ldr r1, _0230B798 ; =DUNGEON_PTR + mov r0, fp + ldr r2, [r1] + mov r3, #1 + mov r1, #0 + strb r3, [r2, #0x1c7] + bl IntToFixedPoint64 + mov r4, #0 + str r4, [r7, #8] + strb r4, [r7, #0xe] + mov r0, #1 + strb r0, [r7, #0xf] +_0230B248: + cmp r8, #3 + bne _0230B2F4 + mov r0, sl + mov r1, #0x10 + bl AbilityIsActiveVeneer + cmp r0, #0 + beq _0230B2F4 + ldrsh r2, [r6, #0x12] + ldrsh r1, [r6, #0x16] + ldr r0, _0230B7B8 ; =0x000003E7 + add r2, r2, r1 + cmp r2, r0 + movgt r2, r0 + mov r0, r2, asr #1 + ldrsh r1, [r6, #0x10] + add r0, r2, r0, lsr #30 + cmp r1, r0, asr #2 + movle r0, #1 + movgt r0, #0 + and r7, r0, #0xff + mov r0, r6 + mov r2, r7 + mov r1, #0x80 + bl UpdateStateFlags + mov r5, r0 + cmp r7, #0 + beq _0230B2D4 + ldr r0, _0230B798 ; =DUNGEON_PTR + ldr r2, _0230B7BC ; =DAMAGE_MULTIPLIER_2 + ldr r3, [r0] + mov r7, #1 + mov r0, fp + mov r1, fp + strb r7, [r3, #0x1c8] + bl MultiplyFixedPoint64 +_0230B2D4: + cmp r5, #0 + beq _0230B2F4 + mov r0, sl + bl PlayEffectAnimation0x1A9__022E6214 + ldr r2, _0230B7C0 ; =0x00000C4F + mov r0, sl + mov r1, sb + bl LogMessageByIdWithPopupCheckUserTarget +_0230B2F4: + cmp r8, #4 + bne _0230B3A0 + mov r0, sl + mov r1, #0x1a + bl AbilityIsActiveVeneer + cmp r0, #0 + beq _0230B3A0 + ldrsh r2, [r6, #0x12] + ldrsh r1, [r6, #0x16] + ldr r0, _0230B7B8 ; =0x000003E7 + add r2, r2, r1 + cmp r2, r0 + movgt r2, r0 + mov r0, r2, asr #1 + ldrsh r1, [r6, #0x10] + add r0, r2, r0, lsr #30 + cmp r1, r0, asr #2 + movle r0, #1 + movgt r0, #0 + and r7, r0, #0xff + mov r0, r6 + mov r2, r7 + mov r1, #2 + bl UpdateStateFlags + mov r5, r0 + cmp r7, #0 + beq _0230B380 + ldr r0, _0230B798 ; =DUNGEON_PTR + ldr r2, _0230B7BC ; =DAMAGE_MULTIPLIER_2 + ldr r3, [r0] + mov r7, #1 + mov r0, fp + mov r1, fp + strb r7, [r3, #0x1c9] + bl MultiplyFixedPoint64 +_0230B380: + cmp r5, #0 + beq _0230B3A0 + mov r0, sl + bl PlayEffectAnimation0x1A9__022E61C8 +#ifdef JAPAN + ldr r2, _0230CD24 ; =0x0000098F + mov r0, sl + mov r1, sb +#else + mov r0, sl + mov r1, sb + mov r2, #0xc50 +#endif + bl LogMessageByIdWithPopupCheckUserTarget +_0230B3A0: + cmp r8, #0xc + bne _0230B44C + mov r0, sl + mov r1, #0x43 + bl AbilityIsActiveVeneer + cmp r0, #0 + beq _0230B44C + ldrsh r2, [r6, #0x12] + ldrsh r1, [r6, #0x16] + ldr r0, _0230B7B8 ; =0x000003E7 + add r2, r2, r1 + cmp r2, r0 + movgt r2, r0 + mov r0, r2, asr #1 + ldrsh r1, [r6, #0x10] + add r0, r2, r0, lsr #30 + cmp r1, r0, asr #2 + movle r0, #1 + movgt r0, #0 + and r7, r0, #0xff + mov r0, r6 + mov r2, r7 + mov r1, #0x10 + bl UpdateStateFlags + mov r5, r0 + cmp r7, #0 + beq _0230B42C + ldr r0, _0230B798 ; =DUNGEON_PTR + ldr r2, _0230B7BC ; =DAMAGE_MULTIPLIER_2 + ldr r3, [r0] + mov r7, #1 + mov r0, fp + mov r1, fp + strb r7, [r3, #0x1ca] + bl MultiplyFixedPoint64 +_0230B42C: + cmp r5, #0 + beq _0230B44C + mov r0, sl + bl PlayEffectAnimation0x1A9__022E64C4 +#ifdef JAPAN + mov r0, sl + mov r1, sb + mov r2, #0x990 +#else + ldr r2, _0230B7C4 ; =0x00000C51 + mov r0, sl + mov r1, sb +#endif + bl LogMessageByIdWithPopupCheckUserTarget +_0230B44C: + cmp r8, #2 + bne _0230B534 + mov r0, sl + mov r1, #0x46 + bl AbilityIsActiveVeneer + cmp r0, #0 + beq _0230B4F8 + ldrsh r2, [r6, #0x12] + ldrsh r1, [r6, #0x16] + ldr r0, _0230B7B8 ; =0x000003E7 + add r2, r2, r1 + cmp r2, r0 + movgt r2, r0 + mov r0, r2, asr #1 + ldrsh r1, [r6, #0x10] + add r0, r2, r0, lsr #30 + cmp r1, r0, asr #2 + movle r0, #1 + movgt r0, #0 + and r7, r0, #0xff + mov r0, r6 + mov r2, r7 + mov r1, #0x20 + bl UpdateStateFlags + mov r5, r0 + cmp r7, #0 + beq _0230B4D8 + ldr r0, _0230B798 ; =DUNGEON_PTR + ldr r2, _0230B7BC ; =DAMAGE_MULTIPLIER_2 + ldr r3, [r0] + mov r7, #1 + mov r0, fp + mov r1, fp + strb r7, [r3, #0x1cb] + bl MultiplyFixedPoint64 +_0230B4D8: + cmp r5, #0 + beq _0230B4F8 + mov r0, sl + bl PlayEffectAnimation0x1A9__022E6510 + ldr r2, _0230B7C8 ; =0x00000C52 + mov r0, sl + mov r1, sb + bl LogMessageByIdWithPopupCheckUserTarget +_0230B4F8: + mov r0, sl + mov r1, sb + mov r2, #0x55 +#ifndef JAPAN + mov r3, #1 +#endif + bl DefenderAbilityIsActive__0230A940 + cmp r0, #0 + beq _0230B534 + ldr r0, _0230B798 ; =DUNGEON_PTR + ldr r2, _0230B7B0 ; =DAMAGE_MULTIPLIER_1_5 + ldr r3, [r0] + mov r5, #1 + mov r0, fp + mov r1, fp + strb r5, [r3, #0x1cb] + bl MultiplyFixedPoint64 +_0230B534: + ldrb r0, [r6, #0xbf] + cmp r0, #1 + bne _0230B560 + ldr r1, _0230B7CC ; =BURN_DAMAGE_MULTIPLIER + add r0, sp, #0x3c + ldr r1, [r1] + bl FixedPoint32To64 + add r2, sp, #0x3c + mov r0, fp + mov r1, fp + bl MultiplyFixedPoint64 +_0230B560: + mov r0, fp + bl FixedPoint64IsZero + cmp r0, #0 + bne _0230B5CC + mov r0, sl + mov r1, r8 + bl MonsterIsType + cmp r0, #0 + beq _0230B5CC + ldr r1, _0230B798 ; =DUNGEON_PTR + mov r0, sl + ldr r2, [r1] + mov r3, #1 + mov r1, #0x63 + strb r3, [r2, #0x1cf] + bl AbilityIsActiveVeneer + cmp r0, #0 + beq _0230B5BC + ldr r2, _0230B7BC ; =DAMAGE_MULTIPLIER_2 + mov r0, fp + mov r1, fp + bl MultiplyFixedPoint64 + b _0230B5CC +_0230B5BC: + ldr r2, _0230B7B0 ; =DAMAGE_MULTIPLIER_1_5 + mov r0, fp + mov r1, fp + bl MultiplyFixedPoint64 +_0230B5CC: + mov r0, sl + bl GetApparentWeather + mov r5, r0 + cmp r5, #1 + bne _0230B634 + cmp r8, #2 + bne _0230B60C + ldr r0, _0230B798 ; =DUNGEON_PTR + ldr r2, _0230B7B0 ; =DAMAGE_MULTIPLIER_1_5 + ldr r3, [r0] + mov r7, #1 + mov r0, fp + mov r1, fp + strb r7, [r3, #0x1c4] + bl MultiplyFixedPoint64 + b _0230B634 +_0230B60C: + cmp r8, #3 + bne _0230B634 + ldr r0, _0230B798 ; =DUNGEON_PTR + ldr r2, _0230B7A8 ; =DAMAGE_MULTIPLIER_0_5 + ldr r3, [r0] + mov r7, #1 + mov r0, fp + mov r1, fp + strb r7, [r3, #0x1c4] + bl MultiplyFixedPoint64 +_0230B634: + cmp r5, #4 + bne _0230B690 + cmp r8, #2 + bne _0230B668 + ldr r0, _0230B798 ; =DUNGEON_PTR + ldr r2, _0230B7A8 ; =DAMAGE_MULTIPLIER_0_5 + ldr r3, [r0] + mov r7, #1 + mov r0, fp + mov r1, fp + strb r7, [r3, #0x1c3] + bl MultiplyFixedPoint64 + b _0230B690 +_0230B668: + cmp r8, #3 + bne _0230B690 + ldr r0, _0230B798 ; =DUNGEON_PTR + ldr r2, _0230B7B0 ; =DAMAGE_MULTIPLIER_1_5 + ldr r3, [r0] + mov r7, #1 + mov r0, fp + mov r1, fp + strb r7, [r3, #0x1c3] + bl MultiplyFixedPoint64 +_0230B690: + cmp r5, #3 + bne _0230B6C0 + cmp r8, #1 + beq _0230B6C0 + ldr r2, _0230B7D0 ; =CLOUDY_DAMAGE_MULTIPLIER + mov r0, fp + mov r1, fp + bl MultiplyFixedPoint64 + ldr r0, _0230B798 ; =DUNGEON_PTR + mov r1, #1 + ldr r0, [r0] + strb r1, [r0, #0x1c2] +_0230B6C0: + ldr r0, _0230B798 ; =DUNGEON_PTR + ldr r7, [r0] + add r0, r7, #0xc000 +#ifdef JAPAN + ldrb r0, [r0, #0xcb7] +#else + ldrb r0, [r0, #0xd5b] +#endif + cmp r0, #0 + bne _0230B6E0 + cmp r5, #6 + bne _0230B700 +_0230B6E0: + cmp r8, #5 + bne _0230B700 + ldr r2, _0230B7A8 ; =DAMAGE_MULTIPLIER_0_5 + mov r3, #1 + mov r0, fp + mov r1, fp + strb r3, [r7, #0x1d0] + bl MultiplyFixedPoint64 +_0230B700: + ldr r0, _0230B798 ; =DUNGEON_PTR + ldr r5, [r0] + add r0, r5, #0xc000 +#ifdef JAPAN + ldrb r0, [r0, #0xcb8] +#else + ldrb r0, [r0, #0xd5c] +#endif + cmp r0, #0 + beq _0230B738 + cmp r8, #2 + bne _0230B738 + ldr r2, _0230B7A8 ; =DAMAGE_MULTIPLIER_0_5 + mov r3, #1 + mov r0, fp + mov r1, fp + strb r3, [r5, #0x1d1] + bl MultiplyFixedPoint64 +_0230B738: + cmp r8, #5 + ldreqb r0, [r6, #0xd2] + cmpeq r0, #0xb + bne _0230B768 + ldr r0, _0230B798 ; =DUNGEON_PTR + ldr r2, _0230B7BC ; =DAMAGE_MULTIPLIER_2 + ldr r3, [r0] + mov r5, #1 + mov r0, fp + mov r1, fp + strb r5, [r3, #0x1d2] + bl MultiplyFixedPoint64 +_0230B768: + mov r0, r4 +_0230B76C: + add sp, sp, #0x64 + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +#ifdef JAPAN +#define CALC_TYPE_BASED_DAMAGE_EFFECTS_OFFSET -0x2C1 +#else +#define CALC_TYPE_BASED_DAMAGE_EFFECTS_OFFSET 0 +#endif +_0230B774: .word ov29_02352838 +_0230B778: .word MATCHUP_IMMUNE_MULTIPLIER_ERRATIC_PLAYER +_0230B77C: .word MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER +_0230B780: .word MATCHUP_NEUTRAL_MULTIPLIER_ERRATIC_PLAYER +_0230B784: .word MATCHUP_IMMUNE_MULTIPLIER +_0230B788: .word MATCHUP_SUPER_EFFECTIVE_MULTIPLIER_ERRATIC_PLAYER +_0230B78C: .word MATCHUP_NEUTRAL_MULTIPLIER +_0230B790: .word MATCHUP_NOT_VERY_EFFECTIVE_MULTIPLIER +_0230B794: .word MATCHUP_SUPER_EFFECTIVE_MULTIPLIER +_0230B798: .word DUNGEON_PTR +_0230B79C: .word TYPE_MATCHUP_COMBINATOR_TABLE +_0230B7A0: .word TINTED_LENS_MULTIPLIER +_0230B7A4: .word SOLID_ROCK_MULTIPLIER +_0230B7A8: .word DAMAGE_MULTIPLIER_0_5 +_0230B7AC: .word TECHNICIAN_MOVE_POWER_THRESHOLD +_0230B7B0: .word DAMAGE_MULTIPLIER_1_5 +_0230B7B4: .word 0x00000C3E + CALC_TYPE_BASED_DAMAGE_EFFECTS_OFFSET +_0230B7B8: .word 0x000003E7 +_0230B7BC: .word DAMAGE_MULTIPLIER_2 +_0230B7C0: .word 0x00000C4F + CALC_TYPE_BASED_DAMAGE_EFFECTS_OFFSET +#ifdef JAPAN +_0230CD24: .word 0x0000098F +#else +_0230B7C4: .word 0x00000C51 +#endif +_0230B7C8: .word 0x00000C52 + CALC_TYPE_BASED_DAMAGE_EFFECTS_OFFSET +_0230B7CC: .word BURN_DAMAGE_MULTIPLIER +_0230B7D0: .word CLOUDY_DAMAGE_MULTIPLIER + arm_func_end CalcTypeBasedDamageEffects diff --git a/include/enums.h b/include/enums.h index b73a5ee1..ef64bc91 100644 --- a/include/enums.h +++ b/include/enums.h @@ -1164,6 +1164,8 @@ enum type_id { TYPE_NEUTRAL = 18, }; +#define NUM_TYPES TYPE_NEUTRAL + // Modes related to shopkeeper behavior enum shopkeeper_mode { SHOPKEEPER_MODE_NORMAL = 0, diff --git a/include/type_effectiveness.h b/include/type_effectiveness.h new file mode 100644 index 00000000..d0c71dfb --- /dev/null +++ b/include/type_effectiveness.h @@ -0,0 +1,19 @@ +#ifndef PMDSKY_TYPE_EFFECTIVENESS_H +#define PMDSKY_TYPE_EFFECTIVENESS_H + +#include "dungeon_mode.h" + +// Type matchup table, not including TYPE_NEUTRAL. +// Note that Ghost's immunities seem to be hard-coded elsewhere. In this table, both Normal and +// Fighting are encoded as neutral against Ghost. +// +// Row index corresponds to the attack type and the column index corresponds to the defender type. +// C-style access: type_matchup_table[attack_type][target_type] or +// *(&type_matchup_table[0][0] + attack_type*18 + target_type) +struct type_matchup_table { + s16 matchups[NUM_TYPES][NUM_TYPES]; +}; + +s16 GetTypeMatchup(struct entity *attacker, struct entity *defender, s16 target_type_idx, enum type_id attack_type); + +#endif //PMDSKY_TYPE_EFFECTIVENESS_H diff --git a/main.lsf b/main.lsf index 20abf725..e8b1de41 100644 --- a/main.lsf +++ b/main.lsf @@ -474,6 +474,8 @@ Overlay OVY_29 Object src/overlay_29_0230A994.o Object src/overlay_29_0230A9DC.o Object asm/overlay_29_0230AA0C.o + Object src/type_effectiveness.o + Object asm/overlay_29_0230AD04.o Object src/dungeon_damage.o Object asm/overlay_29_rodata_02352894.o Object asm/overlay_29_0230BBAC.o diff --git a/src/type_effectiveness.c b/src/type_effectiveness.c new file mode 100644 index 00000000..8e07184c --- /dev/null +++ b/src/type_effectiveness.c @@ -0,0 +1,27 @@ +#include "type_effectiveness.h" +#include "dungeon_util_static.h" +#include "overlay_29_0230A994.h" +#include "overlay_29_02318A4C.h" +#include "overlay_29_02338390.h" + +extern struct type_matchup_table TYPE_MATCHUP_TABLE; + +s16 GetTypeMatchup(struct entity *attacker, struct entity *defender, s16 target_type_idx, enum type_id attack_type) +{ + struct monster *defender_monster = GetEntInfo(defender); + if ((defender_monster->miracle_eye == 1 || ExclusiveItemEffectIsActive__0230A9B8(attacker, EXCLUSIVE_EFF_MIRACLE_EYE)) && attack_type == TYPE_PSYCHIC && defender_monster->types[target_type_idx] == TYPE_DARK) + return MATCHUP_NEUTRAL; + + if (attack_type == TYPE_GROUND) + { + if (GravityIsActive()) + { + if (defender_monster->types[target_type_idx] == TYPE_FLYING) + return MATCHUP_NEUTRAL; + } + else if (IsFloating(defender)) + return MATCHUP_IMMUNE; + } + + return TYPE_MATCHUP_TABLE.matchups[attack_type][defender_monster->types[target_type_idx]]; +}