diff --git a/asm/include/overlay_29_0230F9A4.inc b/asm/include/overlay_29_0230F9A4.inc index 69ecd822..23811b18 100644 --- a/asm/include/overlay_29_0230F9A4.inc +++ b/asm/include/overlay_29_0230F9A4.inc @@ -1,93 +1,22 @@ #pragma once .public AbilityIsActiveVeneer -.public ApplyDamageAndEffectsWrapper -.public BAD_POISON_DAMAGE_COOLDOWN -.public BAD_POISON_DAMAGE_TABLE -.public BAD_WEATHER_DAMAGE -.public BinToDecFixedPoint -.public BoostSpeedOneStage -.public BURN_DAMAGE -.public BURN_DAMAGE_COOLDOWN -.public CeilFixedPoint -.public CheckVariousStatuses2__02301244 -.public CheckVariousStatuses__023016DC -.public CONSTRICTION_DAMAGE -.public CURSE_DAMAGE_COOLDOWN -.public DisplayActions .public DUNGEON_PTR .public DungeonRandInt .public DungeonRandOutcome__022EAB20 -.public EndBurnClassStatus -.public EndMagnetRiseStatus -.public EndNegativeStatusCondition -.public EndNegativeStatusConditionWrapper -.public EnsureCanStandCurrentTile -.public EntityIsValid__02311010 .public ExclusiveItemEffectIsActive__0230F8AC -.public ExclusiveItemEffectIsActive__02311064 -.public ExclusiveItemEffectIsActiveWithLogging .public GenerateStandardItem -.public GetApparentWeather -.public GetTileAtEntity -.public GravityIsActive .public HasHeldItem -.public INGRAIN_BONUS_REGEN -.public INGRAIN_BONUS_REGEN_COOLDOWN -.public InitMove .public IqSkillIsEnabled -.public IsFloating -.public IsFloorOver .public IsMonster__0230F980 -.public IsTileGround -.public ItemIsActive__02311034 -.public LEECH_SEED_DAMAGE_COOLDOWN -.public LEECH_SEED_HP_DRAIN .public LogMessageByIdWithPopupCheckUser -.public MonsterCannotAttack -.public MonsterHasNegativeStatus -.public MonsterIsType -.public MultiplyFixedPoint64 -.public ov10_022C4454 -.public ov10_022C464C +.public SpawnDroppedItemWrapper +.public SubstitutePlaceholderStringTags +.public TreasureBoxDropsEnabled +.public TryGenerateUnownStoneDrop .public ov10_022C4650 -.public ov10_022C4664 -.public ov10_022C4A5C -.public ov10_022C4BBC .public ov10_022C4BE4 -.public ov10_022C4FC4 -.public ov29_022E34A8_EU -.public ov29_022E53F0 -.public ov29_022E543C -.public ov29_022EA370 -.public ov29_022EC62C -.public ov29_022F2FE4 -.public ov29_022F42F8 -.public ov29_022FB718 -.public ov29_02322374 .public ov29_02344B9C .public ov29_023460DC .public ov29_02347184 .public ov29_0234908C .public ov29_023529A8 -.public PlayEffectAnimationEntityStandard -.public PlaySeByIdIfNotSilence -.public POISON_DAMAGE -.public POISON_DAMAGE_COOLDOWN -.public SetPreprocessorArgsIdVal -.public SHED_SKIN_ACTIVATION_CHANCE -.public SpawnDroppedItemWrapper -.public SPEED_BOOST_TURNS -.public sub_02050FF8 -.public SubFixedPoint -.public SubstitutePlaceholderStringTags -.public TickStatusTurnCounter -.public TreasureBoxDropsEnabled -.public TryActivateBadDreams -.public TryEndPetrifiedOrSleepStatus -.public TryGenerateUnownStoneDrop -.public TryIncreaseHp -.public TryWarp -.public TryWeatherFormChange -.public WaitUntilAlertBoxTextIsLoadedWrapper -.public WRAP_DAMAGE -.public WRAP_DAMAGE_COOLDOWN diff --git a/asm/overlay_29_0230F9A4.s b/asm/overlay_29_0230F9A4.s index 4e023e79..b139e3de 100644 --- a/asm/overlay_29_0230F9A4.s +++ b/asm/overlay_29_0230F9A4.s @@ -195,1359 +195,3 @@ _0230FBB8: .align 2, 0 _0230FC20: .word ov10_022C4BE4 arm_func_end TickNoSlipCap - - arm_func_start ActivateEndOfTurnEffects -ActivateEndOfTurnEffects: ; 0x0230FC24 -#ifdef JAPAN -#define OV29_0230FC24_OFFSET -4 -#define OV29_0230FC24_OFFSET_2 -0xA4 -#define OV29_0230FC24_OFFSET_3 -1 -#else -#define OV29_0230FC24_OFFSET 0 -#define OV29_0230FC24_OFFSET_2 0 -#define OV29_0230FC24_OFFSET_3 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr} - sub sp, sp, #0x34 - movs r5, r0 - beq _02310FF4 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - ldr r4, [r5, #0xb4] - mov r1, #0 - mov r0, r5 - strb r1, [r4, #0x150 + OV29_0230FC24_OFFSET] - bl ov29_022FB718 - bl WaitUntilAlertBoxTextIsLoadedWrapper - mov r0, r5 - bl TryWeatherFormChange - mov r0, r5 - mov r1, #0x1d - bl ItemIsActive__02311034 - cmp r0, #0 - beq _0230FD0C - ldrb r0, [r4, #0x17c + OV29_0230FC24_OFFSET] - add r1, r0, #1 - and r0, r1, #0xff - cmp r0, #0x14 - strb r1, [r4, #0x17c + OV29_0230FC24_OFFSET] - movhs r0, #0x13 - strhsb r0, [r4, #0x17c + OV29_0230FC24_OFFSET] - mov r0, #0x64 - bl DungeonRandInt - ldrb r2, [r4, #0x17c + OV29_0230FC24_OFFSET] - ldr r1, _02310A6C ; =ov10_022C4BBC - mov r2, r2, lsl #1 - ldrsh r1, [r1, r2] - cmp r0, r1 - bge _0230FD0C - mov r1, #0 - mov r0, r5 - strb r1, [r4, #0x17c + OV29_0230FC24_OFFSET] - bl ov29_022EC62C - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - mov r2, #0 - mov r0, r5 - mov r1, r5 - mov r3, r2 - bl TryWarp - mov r0, r5 - bl ov29_022F42F8 -_0230FD0C: - ldrb r0, [r4, #7] - cmp r0, #0 - beq _0231013C - mov r0, r5 - mov r1, #0x1e - mov r7, #0xa - bl ItemIsActive__02311034 - cmp r0, #0 - movne r2, r7 - moveq r2, #0 - mov r0, r5 - mov r1, #0x26 - sub r7, r7, r2 - bl ItemIsActive__02311034 - cmp r0, #0 - movne r2, #1 - moveq r2, #0 - mov r0, r5 - mov r1, #0x10 - sub r7, r7, r2 - bl IqSkillIsEnabled - cmp r0, #0 - mov r0, r5 - mov r1, #0x22 - subne r7, r7, #1 - bl ItemIsActive__02311034 - cmp r0, #0 - movne r2, #1 - moveq r2, #0 - mov r0, r5 - mov r1, #0x11 - add r7, r7, r2 - bl ItemIsActive__02311034 - cmp r0, #0 - movne r2, #1 - moveq r2, #0 - mov r0, r5 - mov r1, #0x32 - add r7, r7, r2 - bl ItemIsActive__02311034 - cmp r0, #0 - movne r2, #1 - moveq r2, #0 - mov r0, r5 - mov r1, #0x59 - add r7, r7, r2 - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r0, #1 - moveq r0, #0 - adds r7, r7, r0 - movmi r7, #0 - ldr r3, _02310A70 ; =0x0000199A - cmp r7, #0x13 - mov r6, #0 - ldr r2, _02310A74 ; =ov10_022C4FC4 - movgt r7, #0x13 - add r0, sp, #0x2c - add r1, sp, #0x24 - str r6, [sp, #0x24] - str r3, [sp, #0x28] - add r2, r2, r7, lsl #3 - bl MultiplyFixedPoint64 - ldrb r2, [r4, #0x15d + OV29_0230FC24_OFFSET] - cmp r2, #1 - ldrhi r0, _02310A78 ; =ov10_022C4A5C - ldrhi r1, [sp, #0x30] - ldrhi r0, [r0, r2, lsl #2] - addhi r0, r1, r0, lsl #16 - strhi r0, [sp, #0x30] - mov r0, #0 - strb r0, [r4, #0x15d + OV29_0230FC24_OFFSET] - add r0, r4, #0x100 - ldrh r2, [r0, #0x46 + OV29_0230FC24_OFFSET] - ldrh r1, [r0, #0x48 + OV29_0230FC24_OFFSET] - add r0, sp, #0x2c - strh r2, [sp, #0x20] - strh r1, [sp, #0x22] - bl BinToDecFixedPoint - strh r0, [sp, #0x14] - mov r0, r0, lsr #0x10 - add r1, r4, #0x100 - strh r0, [sp, #0x16] - ldrh r0, [r1, #0x46 + OV29_0230FC24_OFFSET] - sub r3, sp, #4 - ldrh r2, [sp, #0x14] - strh r0, [r3] - ldrh r0, [r1, #0x48 + OV29_0230FC24_OFFSET] - ldrh r1, [sp, #0x16] - strh r0, [r3, #2] - ldr r0, [r3] - strh r2, [r3] - strh r1, [r3, #2] - ldr r1, [r3] - bl SubFixedPoint - strh r0, [sp, #0x10] - mov r0, r0, lsr #0x10 - strh r0, [sp, #0x12] - ldrh r1, [sp, #0x10] - add r0, r4, #0x100 - ldrh r3, [sp, #0x12] - strh r1, [r0, #0x46 + OV29_0230FC24_OFFSET] - ldrh r2, [sp, #0x20] - strh r3, [r0, #0x48 + OV29_0230FC24_OFFSET] - sub r0, sp, #4 - ldrh r1, [sp, #0x22] - strh r2, [r0] - mov r6, #0 - strh r1, [r0, #2] - ldr r0, [r0] - mov r7, #1 - bl CeilFixedPoint - cmp r0, #0x14 - blt _0230FEFC - add r0, r4, #0x100 - ldrh r1, [r0, #0x46 + OV29_0230FC24_OFFSET] - sub r2, sp, #4 - strh r1, [r2] - ldrh r0, [r0, #0x48 + OV29_0230FC24_OFFSET] - strh r0, [r2, #2] - ldr r0, [r2] - bl CeilFixedPoint - cmp r0, #0x14 - ldrlt r6, _02310A7C ; =0x00000DE6 -_0230FEFC: - ldrh r1, [sp, #0x20] - ldrh r0, [sp, #0x22] - sub r2, sp, #4 - strh r1, [r2] - strh r0, [r2, #2] - ldr r0, [r2] - bl CeilFixedPoint - cmp r0, #0xa - blt _0230FF48 - add r0, r4, #0x100 - ldrh r1, [r0, #0x46 + OV29_0230FC24_OFFSET] - sub r2, sp, #4 - strh r1, [r2] - ldrh r0, [r0, #0x48 + OV29_0230FC24_OFFSET] - strh r0, [r2, #2] - ldr r0, [r2] - bl CeilFixedPoint - cmp r0, #0xa - ldrlt r6, _02310A80 ; =0x00000DE7 -_0230FF48: - add r0, r4, #0x100 - ldrh r1, [r0, #0x46 + OV29_0230FC24_OFFSET] - sub r2, sp, #4 - strh r1, [r2] - ldrh r0, [r0, #0x48 + OV29_0230FC24_OFFSET] - strh r0, [r2, #2] - ldr r0, [r2] - bl CeilFixedPoint - cmp r0, #0 - bne _0230FF98 - mov r0, #0 - bl sub_02050FF8 - strh r0, [sp, #0xc] - mov r0, r0, lsr #0x10 - strh r0, [sp, #0xe] - ldrh r2, [sp, #0xc] - add r0, r4, #0x100 - ldrh r1, [sp, #0xe] - strh r2, [r0, #0x46 + OV29_0230FC24_OFFSET] - strh r1, [r0, #0x48 + OV29_0230FC24_OFFSET] -_0230FF98: - add r0, r4, #0x100 - ldrh r1, [r0, #0x46 + OV29_0230FC24_OFFSET] - sub r2, sp, #4 - strh r1, [r2] - ldrh r0, [r0, #0x48 + OV29_0230FC24_OFFSET] - strh r0, [r2, #2] - ldr r0, [r2] - bl CeilFixedPoint - cmp r0, #0 - bge _0230FFE8 - mov r0, #0 - bl sub_02050FF8 - strh r0, [sp, #8] - mov r0, r0, lsr #0x10 - strh r0, [sp, #0xa] - ldrh r2, [sp, #8] - add r0, r4, #0x100 - ldrh r1, [sp, #0xa] - strh r2, [r0, #0x46 + OV29_0230FC24_OFFSET] - strh r1, [r0, #0x48 + OV29_0230FC24_OFFSET] -_0230FFE8: - add r0, r4, #0x100 - ldrh r1, [r0, #0x46 + OV29_0230FC24_OFFSET] - sub r2, sp, #4 - strh r1, [r2] - ldrh r0, [r0, #0x48 + OV29_0230FC24_OFFSET] - strh r0, [r2, #2] - ldr r0, [r2] - bl CeilFixedPoint - cmp r0, #0 - bne _023100D8 - bl ov29_022F2FE4 - mov r0, r5 - bl ov29_022EC62C - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - ldr r0, _02310A84 ; =DUNGEON_PTR - ldr r1, [r0] - ldrb r0, [r1, #0x799] - cmp r0, #0xa - addlo r0, r0, #1 - strlob r0, [r1, #0x799] - ldr r0, _02310A84 ; =DUNGEON_PTR - mov r1, r5 - ldr r0, [r0] - ldrb r0, [r0, #0x799] - cmp r0, #1 - ldreq r6, _02310A88 ; =0x00000DE8 - cmp r0, #2 - ldreq r6, _02310A8C ; =0x00000DE9 - moveq r7, #0 - cmp r0, #3 - mov r0, r5 - ldreq r6, _02310A90 ; =0x00000DEA - moveq r7, #0 - bl TryEndPetrifiedOrSleepStatus - mov r0, r5 - mov r1, #1 - mov r2, #0xe - mov r3, #0x250 - bl ApplyDamageAndEffectsWrapper - mov r0, #1 - strb r0, [r4, #0x150 + OV29_0230FC24_OFFSET] - add r0, r4, #0x100 - ldrh r1, [r0, #0x46 + OV29_0230FC24_OFFSET] - sub r2, sp, #4 - strh r1, [r2] - ldrh r0, [r0, #0x48 + OV29_0230FC24_OFFSET] - strh r0, [r2, #2] - ldr r0, [r2] - bl CeilFixedPoint - cmp r0, #0 - movne r6, #0 - b _023100E8 -_023100D8: - ldr r0, _02310A84 ; =DUNGEON_PTR - mov r1, #0 - ldr r0, [r0] - strb r1, [r0, #0x799] -_023100E8: - cmp r6, #0 - beq _0231013C - cmp r7, #0 - beq _02310124 -#if defined(EUROPE) - mov r0, r5 - bl ov29_022E34A8_EU -#elif defined(JAPAN) - mov r0, r5 - bl EntityIsValid__02311010 -#else - ldr r0, _02310A84 ; =DUNGEON_PTR - ldr r0, [r0] - ldrb r0, [r0, #8] - cmp r0, #0 - bne _02310124 - mov r0, r5 - bl EntityIsValid__02311010 -#endif - cmp r0, #0 - beq _02310124 - ldr r0, _02310A94 ; =0x00001303 - bl PlaySeByIdIfNotSilence -_02310124: - mov r0, r5 - mov r1, r6 - bl LogMessageByIdWithPopupCheckUser - mov r0, #0x1e - mov r1, #0x32 - bl ov29_022EA370 -_0231013C: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - ldr r0, _02310A84 ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, #0xc000 - ldrb r0, [r0, #0xd5a + OV29_0230FC24_OFFSET_2] - cmp r0, #0 - bne _0231037C - mov r0, r5 - bl GetApparentWeather - cmp r0, #5 - mov r0, r5 - bne _023101FC - mov r1, #0x77 - bl AbilityIsActiveVeneer - cmp r0, #0 - bne _02310360 - mov r0, r5 - mov r1, #0x4d - bl AbilityIsActiveVeneer - cmp r0, #0 - bne _02310360 - mov r0, r5 - mov r1, #6 - bl MonsterIsType - cmp r0, #0 - bne _02310360 - ldr r3, _02310A98 ; =0x00000DBD - mov r6, #9 - mov r0, r5 - mov r1, r5 - mov r2, #1 - str r6, [sp] - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - bne _02310360 - ldr r0, _02310A9C ; =BAD_WEATHER_DAMAGE - ldr r3, _02310AA0 ; =0x0000025F - ldrsh r1, [r0] - mov r0, r5 - mov r2, #0x12 - bl ApplyDamageAndEffectsWrapper - b _02310360 -_023101FC: - bl GetApparentWeather - cmp r0, #2 - mov r0, r5 - bne _02310298 - mov r1, #0x1d - bl AbilityIsActiveVeneer - cmp r0, #0 - bne _02310360 - mov r0, r5 - mov r1, #9 - bl MonsterIsType - cmp r0, #0 - bne _02310360 - mov r0, r5 - mov r1, #0xd - bl MonsterIsType - cmp r0, #0 - bne _02310360 - mov r0, r5 - mov r1, #0x11 - bl MonsterIsType - cmp r0, #0 - bne _02310360 - ldr r3, _02310A98 ; =0x00000DBD - mov r6, #9 - mov r0, r5 - mov r1, r5 - mov r2, #1 - str r6, [sp] - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - bne _02310360 - ldr r0, _02310A9C ; =BAD_WEATHER_DAMAGE - ldr r3, _02310AA0 ; =0x0000025F - ldrsh r1, [r0] - mov r0, r5 - mov r2, #0x12 - bl ApplyDamageAndEffectsWrapper - b _02310360 -_02310298: - bl GetApparentWeather - cmp r0, #1 - bne _02310360 - mov r0, r5 - mov r1, #0x5a - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _02310304 - ldr r3, _02310A98 ; =0x00000DBD - mov r6, #9 - mov r0, r5 - mov r1, r5 - mov r2, #1 - str r6, [sp] - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - bne _02310360 - mov r0, #2 - mov r1, #0x5a - bl SetPreprocessorArgsIdVal - ldr r0, _02310A9C ; =BAD_WEATHER_DAMAGE - mov r2, #0x19 - ldrsh r1, [r0] - mov r0, r5 - rsb r3, r2, #0x278 - bl ApplyDamageAndEffectsWrapper - b _02310360 -_02310304: - mov r0, r5 - mov r1, #0x55 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _02310360 - ldr r3, _02310A98 ; =0x00000DBD - mov r6, #9 - mov r0, r5 - mov r1, r5 - mov r2, #1 - str r6, [sp] - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - bne _02310360 - mov r0, #2 - mov r1, #0x55 - bl SetPreprocessorArgsIdVal - ldr r0, _02310A9C ; =BAD_WEATHER_DAMAGE - ldr r3, _02310AA0 ; =0x0000025F - ldrsh r1, [r0] - mov r0, r5 - mov r2, #0x1a - bl ApplyDamageAndEffectsWrapper -_02310360: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 -_0231037C: - mov r0, #0x64 - bl DungeonRandInt - mov r6, r0 - mov r0, r5 - mov r1, #0x21 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _023103F8 - ldr r0, _02310AA4 ; =SHED_SKIN_ACTIVATION_CHANCE - ldrsh r0, [r0] - cmp r6, r0 - bge _023103F8 - mov r0, r5 - mov r1, #0 - bl MonsterHasNegativeStatus - cmp r0, #0 - beq _023103F8 - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - mov r0, r5 - mov r1, r5 - mov r2, #1 - mov r3, #0 - bl EndNegativeStatusConditionWrapper -_023103F8: - mov r0, r5 - mov r1, #0x51 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _02310474 - mov r0, r5 - bl GetApparentWeather - cmp r0, #4 - bne _02310474 - mov r0, r5 - mov r1, #0 - bl MonsterHasNegativeStatus - cmp r0, #0 - ldrneb r0, [r4, #0xc4] - cmpne r0, #3 - beq _02310474 - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - mov r3, #0 - mov r0, r5 - mov r1, r5 - mov r2, #1 - str r3, [sp] - bl EndNegativeStatusCondition -_02310474: - mov r0, r5 - mov r1, #0xb - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _023104C0 - ldrb r1, [r4, #0x11f + OV29_0230FC24_OFFSET] - ldr r0, _02310AA8 ; =SPEED_BOOST_TURNS - add r2, r1, #1 - ldrsh r0, [r0] - and r1, r2, #0xff - strb r2, [r4, #0x11f + OV29_0230FC24_OFFSET] - cmp r1, r0 - blt _023104C0 - mov r3, #0 - mov r0, r5 - mov r1, r5 - mov r2, #0x7f - strb r3, [r4, #0x11f + OV29_0230FC24_OFFSET] - bl BoostSpeedOneStage -_023104C0: - ldrb r0, [r4, #0xbd] - cmp r0, #4 - bne _023104F8 - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - mov r0, r5 - bl ov29_022E53F0 -_023104F8: - ldrb r0, [r4, #0xbf] - cmp r0, #1 - bne _02310590 - ldrb r0, [r4, #0xc1] - cmp r0, #0 - subne r0, r0, #1 - strneb r0, [r4, #0xc1] - ldrb r0, [r4, #0xc1] - cmp r0, #0 - bne _02310574 - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - ldr r1, _02310AAC ; =BURN_DAMAGE_COOLDOWN - mov r0, r5 - ldrsh r2, [r1] - mov r1, r5 - strb r2, [r4, #0xc1] - bl TryEndPetrifiedOrSleepStatus - ldr r0, _02310AB0 ; =BURN_DAMAGE - mov r2, #1 - ldrsh r1, [r0] - mov r0, r5 - rsb r3, r2, #0x248 - bl ApplyDamageAndEffectsWrapper -_02310574: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 -_02310590: - bl GravityIsActive - cmp r0, #0 - beq _023105DC - mov r0, r5 - bl IsFloating - cmp r0, #0 - beq _023105C0 - mov r0, r5 - mov r1, r5 - bl EndMagnetRiseStatus - mov r0, r5 - bl EnsureCanStandCurrentTile -_023105C0: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 -_023105DC: - mov r0, r5 - mov r1, #0x69 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _02310614 - mov r0, r5 - bl TryActivateBadDreams - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 -_02310614: - mov r0, r5 - bl GetTileAtEntity - bl IsTileGround - cmp r0, #0 - bne _023106A4 - ldrsh r2, [r4, #0x12] - ldrsh r1, [r4, #0x16] - ldr r0, _02310AB4 ; =0x000003E7 - add r1, r2, r1 - cmp r1, r0 - movgt r1, r0 - ldrsh r0, [r4, #0x10] - cmp r0, r1 - bge _0231067C - mov r0, r5 - mov r1, #0x64 - bl ExclusiveItemEffectIsActive__02311064 - cmp r0, #0 - beq _0231067C - ldr r0, _02310AB8 ; =ov10_022C4664 - mov r3, #0 - ldrsh r2, [r0] - mov r0, r5 - mov r1, r5 - str r3, [sp] - bl TryIncreaseHp -_0231067C: - mov r0, r5 - mov r1, #0x65 - bl ExclusiveItemEffectIsActive__02311064 - cmp r0, #0 - beq _023106A4 - mov r2, #1 - mov r0, r5 - mov r1, r5 - mov r3, r2 - bl EndNegativeStatusConditionWrapper -_023106A4: - mov r0, r5 - mov r1, #0x5c - bl ExclusiveItemEffectIsActive__02311064 - cmp r0, #0 - beq _02310754 - mov sl, #0 - ldr r6, _02310A84 ; =DUNGEON_PTR - mov sb, sl - mov r7, #1 -_023106C8: - ldr r0, [r6] - add r0, r0, sb, lsl #2 - add r0, r0, #0x12000 - ldr r8, [r0, #0xb28 + OV29_0230FC24_OFFSET_2] - mov r0, r8 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310718 - ldr r0, [r8, #0xb4] - ldrb r0, [r0, #0xbf] - add r0, r0, #0xfe - and r0, r0, #0xff - cmp r0, #1 - bhi _02310718 - mov r0, r8 - bl ov29_022E543C - mov r0, r8 - mov r1, r8 - bl EndBurnClassStatus - mov sl, r7 -_02310718: - add r0, sb, #1 - mov r0, r0, lsl #0x10 - mov sb, r0, asr #0x10 - cmp sb, #4 - blt _023106C8 - cmp sl, #0 - beq _02310754 - ldr r0, _02310ABC ; =ov10_022C464C - mov r6, #1 - ldrsh r2, [r0] - mov r0, r5 - mov r1, r5 - mov r3, #0 - str r6, [sp] - bl TryIncreaseHp -_02310754: - ldrb r0, [r4, #0xbf] - cmp r0, #2 - bne _02310830 - ldrb r0, [r4, #0xc1] - cmp r0, #0 - subne r0, r0, #1 - strneb r0, [r4, #0xc1] - ldrb r0, [r4, #0xc1] - cmp r0, #0 - bne _02310810 - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - ldreqb r0, [r4, #0xbf] - cmpeq r0, #2 - bne _02310FF4 - ldr r1, _02310AC0 ; =POISON_DAMAGE_COOLDOWN - mov r0, r5 - ldrsh r2, [r1] - mov r1, r5 - strb r2, [r4, #0xc1] - bl TryEndPetrifiedOrSleepStatus - mov r0, r5 - mov r1, #0x72 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _023107F8 - ldr r0, _02310AC4 ; =POISON_DAMAGE - mov r6, #1 - ldrsh r2, [r0] - mov r0, r5 - mov r1, r5 - mov r3, #0 - str r6, [sp] - bl TryIncreaseHp - b _02310810 -_023107F8: - ldr r0, _02310AC4 ; =POISON_DAMAGE - mov r2, #3 - ldrsh r1, [r0] - mov r0, r5 - rsb r3, r2, #0x24c - bl ApplyDamageAndEffectsWrapper -_02310810: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - beq _0231092C - b _02310FF4 -_02310830: - cmp r0, #3 - bne _0231092C - ldrb r0, [r4, #0xc1] - cmp r0, #0 - subne r0, r0, #1 - strneb r0, [r4, #0xc1] - ldrb r0, [r4, #0xc1] - cmp r0, #0 - bne _02310910 - ldrb r6, [r4, #0xc2] - cmp r6, #0x1d - addlo r0, r6, #1 - strlob r0, [r4, #0xc2] - ldr r0, _02310AC8 ; =BAD_POISON_DAMAGE_COOLDOWN - cmp r6, #0x1d - ldrsh r0, [r0] - movge r6, #0x1d - cmp r6, #0 - strb r0, [r4, #0xc1] - mov r0, #0 - movlt r6, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - ldreqb r0, [r4, #0xbf] - cmpeq r0, #3 - bne _02310FF4 - mov r0, r5 - mov r1, r5 - bl TryEndPetrifiedOrSleepStatus - mov r0, r5 - mov r1, #0x72 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _023108F4 - ldr r0, _02310ACC ; =BAD_POISON_DAMAGE_TABLE - mov r1, r6, lsl #1 - ldrsh r2, [r0, r1] - mov r6, #1 - mov r0, r5 - mov r1, r5 - mov r3, #0 - str r6, [sp] - bl TryIncreaseHp - b _02310910 -_023108F4: - ldr r0, _02310ACC ; =BAD_POISON_DAMAGE_TABLE - mov r1, r6, lsl #1 - ldrsh r1, [r0, r1] - mov r2, #3 - mov r0, r5 - rsb r3, r2, #0x24c - bl ApplyDamageAndEffectsWrapper -_02310910: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 -_0231092C: - ldrb r0, [r4, #0xc4] - cmp r0, #7 - bne _023109D4 - ldrb r0, [r4, #0xcd] - cmp r0, #0 - subne r0, r0, #1 - strneb r0, [r4, #0xcd] - ldrb r0, [r4, #0xcd] - cmp r0, #0 - bne _023109B4 - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - ldr r1, _02310AD0 ; =ov10_022C4454 - mov r0, r5 - ldrsh r2, [r1] - mov r1, r5 - strb r2, [r4, #0xcd] - bl TryEndPetrifiedOrSleepStatus - ldr r1, [r4, #0xc8] - mov r0, r5 - bl PlayEffectAnimationEntityStandard - ldr r1, _02310AD4 ; =CONSTRICTION_DAMAGE - mov r0, r5 - ldrsh r1, [r1] - mov r2, #2 - mov r3, #0x248 - bl ApplyDamageAndEffectsWrapper -_023109B4: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - beq _02310B6C - b _02310FF4 -_023109D4: - cmp r0, #4 - bne _02310AF8 - ldrb r0, [r4, #0xcd] - cmp r0, #0 - subne r0, r0, #1 - strneb r0, [r4, #0xcd] - ldrb r0, [r4, #0xcd] - cmp r0, #0 - bne _02310A4C - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - ldr r1, _02310AD8 ; =WRAP_DAMAGE_COOLDOWN - mov r0, r5 - ldrsh r2, [r1] - mov r1, r5 - strb r2, [r4, #0xcd] - bl TryEndPetrifiedOrSleepStatus - ldr r0, _02310ADC ; =WRAP_DAMAGE - ldr r3, _02310AE0 ; =0x0000024A - ldrsh r1, [r0] - mov r0, r5 - mov r2, #5 - bl ApplyDamageAndEffectsWrapper -_02310A4C: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - beq _02310B6C - b _02310FF4 - .align 2, 0 -#ifdef JAPAN -#define OV29_0230FC24_DATA_OFFSET -0x2C0 -#else -#define OV29_0230FC24_DATA_OFFSET 0 -#endif -_02310A6C: .word ov10_022C4BBC -_02310A70: .word 0x0000199A -_02310A74: .word ov10_022C4FC4 -_02310A78: .word ov10_022C4A5C -_02310A7C: .word 0x00000DE6 + OV29_0230FC24_DATA_OFFSET -_02310A80: .word 0x00000DE7 + OV29_0230FC24_DATA_OFFSET -_02310A84: .word DUNGEON_PTR -_02310A88: .word 0x00000DE8 + OV29_0230FC24_DATA_OFFSET -_02310A8C: .word 0x00000DE9 + OV29_0230FC24_DATA_OFFSET -_02310A90: .word 0x00000DEA + OV29_0230FC24_DATA_OFFSET -_02310A94: .word 0x00001303 -_02310A98: .word 0x00000DBD + OV29_0230FC24_DATA_OFFSET -_02310A9C: .word BAD_WEATHER_DAMAGE -_02310AA0: .word 0x0000025F -_02310AA4: .word SHED_SKIN_ACTIVATION_CHANCE -_02310AA8: .word SPEED_BOOST_TURNS -_02310AAC: .word BURN_DAMAGE_COOLDOWN -_02310AB0: .word BURN_DAMAGE -_02310AB4: .word 0x000003E7 -_02310AB8: .word ov10_022C4664 -_02310ABC: .word ov10_022C464C -_02310AC0: .word POISON_DAMAGE_COOLDOWN -_02310AC4: .word POISON_DAMAGE -_02310AC8: .word BAD_POISON_DAMAGE_COOLDOWN -_02310ACC: .word BAD_POISON_DAMAGE_TABLE -_02310AD0: .word ov10_022C4454 -_02310AD4: .word CONSTRICTION_DAMAGE -_02310AD8: .word WRAP_DAMAGE_COOLDOWN -_02310ADC: .word WRAP_DAMAGE -_02310AE0: .word 0x0000024A -_02310AE4: .word INGRAIN_BONUS_REGEN_COOLDOWN -_02310AE8: .word INGRAIN_BONUS_REGEN -_02310AEC: .word CURSE_DAMAGE_COOLDOWN -_02310AF0: .word LEECH_SEED_DAMAGE_COOLDOWN -_02310AF4: .word LEECH_SEED_HP_DRAIN -_02310AF8: - cmp r0, #5 - bne _02310B6C - ldrb r0, [r4, #0xcd] - cmp r0, #0 - subne r0, r0, #1 - strneb r0, [r4, #0xcd] - ldrb r0, [r4, #0xcd] - cmp r0, #0 - bne _02310B6C - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - ldr r1, _02310AE4 ; =INGRAIN_BONUS_REGEN_COOLDOWN - ldr r0, _02310AE8 ; =INGRAIN_BONUS_REGEN - ldrsh r3, [r1] - ldrsh r2, [r0] - mov r0, r5 - mov r1, r5 - strb r3, [r4, #0xcd] - mov r6, #1 - mov r3, #0 - str r6, [sp] - bl TryIncreaseHp -_02310B6C: - ldrb r0, [r4, #0xd8] - cmp r0, #1 - bne _02310C28 - ldrb r0, [r4, #0xdc] - cmp r0, #0 - subne r0, r0, #1 - strneb r0, [r4, #0xdc] - ldrb r0, [r4, #0xdc] - cmp r0, #0 - bne _02310C0C - ldrsh r2, [r4, #0x12] - ldrsh r1, [r4, #0x16] - ldr r0, _02310AB4 ; =0x000003E7 - add r1, r2, r1 - cmp r1, r0 - movgt r1, r0 - mov r0, r1, asr #1 - add r0, r1, r0, lsr #30 - ldr r1, _02310AEC ; =CURSE_DAMAGE_COOLDOWN - movs r6, r0, asr #2 - ldrsh r1, [r1] - mov r0, #0 - addeq r6, r6, #1 - strb r1, [r4, #0xdc] - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - mov r0, r5 - mov r1, r5 - bl TryEndPetrifiedOrSleepStatus - mov r2, #7 - mov r0, r5 - mov r1, r6 - add r3, r2, #0x244 - bl ApplyDamageAndEffectsWrapper -_02310C0C: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 -_02310C28: - ldrb r0, [r4, #0xe0] - cmp r0, #1 - bne _02310DE0 - ldrb r0, [r4, #0xea] - cmp r0, #0 - subne r0, r0, #1 - strneb r0, [r4, #0xea] - ldrb r0, [r4, #0xea] - cmp r0, #0 - bne _02310DC4 - ldr r0, _02310A84 ; =DUNGEON_PTR - ldrb r2, [r4, #0xe8] - ldr r0, [r0] - ldr r1, _02310AF0 ; =LEECH_SEED_DAMAGE_COOLDOWN - add r0, r0, r2, lsl #2 - add r0, r0, #0x12000 - ldr r7, [r0, #0xb78 + OV29_0230FC24_OFFSET_2] - ldrsh r1, [r1] - ldr r0, _02310AF4 ; =LEECH_SEED_HP_DRAIN - cmp r7, #0 - ldrsh r6, [r0] - strb r1, [r4, #0xea] - moveq r0, #0 - streqb r0, [r4, #0xe0] - beq _02310DC4 - ldr r0, [r7, #0xb4] - ldr r1, [r4, #0xe4] - ldr r0, [r0, #0xb0] - cmp r1, r0 - movne r0, #0 - strneb r0, [r4, #0xe0] - bne _02310DC4 - cmp r7, r5 - beq _02310CF0 - cmp r7, #0 - moveq r0, #0 - beq _02310CD0 - ldr r0, [r7] - cmp r0, #1 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff -_02310CD0: - cmp r0, #0 - beq _02310CF0 - mov r0, r7 - mov r1, #0x53 - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r8, #0 - bne _02310D00 -_02310CF0: - mov r0, r5 - mov r1, #0x3a - bl AbilityIsActiveVeneer - mov r8, r0 -_02310D00: - mov r0, r5 - bl ov29_022EC62C - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - mov r0, r7 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - ldrb r0, [r4, #0xc4] - cmp r0, #1 - beq _02310DC4 - mov r0, r5 - mov r1, r5 - bl TryEndPetrifiedOrSleepStatus - mov r0, r5 - mov r1, r6 - mov r2, #9 - mov r3, #0x24c - bl ApplyDamageAndEffectsWrapper - cmp r8, #0 - beq _02310D94 - mov r0, r7 - mov r1, r7 - bl TryEndPetrifiedOrSleepStatus - mov r2, #0xd - mov r0, r7 - mov r1, r6 - add r3, r2, #0x22c - bl ApplyDamageAndEffectsWrapper - b _02310DC4 -_02310D94: - mov r0, r5 - mov r1, #0x73 - bl AbilityIsActiveVeneer - cmp r0, #0 - bne _02310DC4 - mov r8, #1 - mov r0, r7 - mov r1, r7 - mov r2, r6 - mov r3, #0 - str r8, [sp] - bl TryIncreaseHp -_02310DC4: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 -_02310DE0: - ldrb r0, [r4, #0x106 + OV29_0230FC24_OFFSET_3] - cmp r0, #0 - beq _02310E9C - add r0, r4, #6 + OV29_0230FC24_OFFSET_3 - add r0, r0, #0x100 - bl TickStatusTurnCounter - ldrb r0, [r4, #0x106 + OV29_0230FC24_OFFSET_3] - cmp r0, #0 - bne _02310E9C - mov r0, #0 - bl DisplayActions - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - mov r1, r5 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r1, _02310FFC ; =0x00000DEB - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - mov r0, r5 - mov r1, r5 - bl TryEndPetrifiedOrSleepStatus - ldrb r0, [r4, #0xd5] - cmp r0, #7 - bne _02310E6C - ldr r1, _02311000 ; =0x00000DEC - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - b _02310E80 -_02310E6C: - mov r2, #0xb - ldr r1, _02311004 ; =0x0000270F - mov r0, r5 - rsb r3, r2, #0x258 - bl ApplyDamageAndEffectsWrapper -_02310E80: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 -_02310E9C: - ldrb r0, [r4, #0xd2] - cmp r0, #1 - bne _02310F70 - add r0, r4, #0xd3 - bl TickStatusTurnCounter - ldrb r0, [r4, #0xd3] - cmp r0, #0 - bne _02310F70 - mov r1, #0 - mov r0, r5 - strb r1, [r4, #0xd2] - bl CheckVariousStatuses2__02301244 - cmp r0, #0 - bne _02310F70 - mov r0, r5 - mov r1, #0 - bl MonsterCannotAttack - cmp r0, #0 - bne _02310F70 - mov r0, r5 - bl CheckVariousStatuses__023016DC - cmp r0, #0 - bne _02310F70 - mov r0, #0 - bl DisplayActions - ldrh r0, [r4, #0xac] - cmp r0, #0 - ldreq r0, _02311008 ; =0x00000165 - streqh r0, [r4, #0xac] - ldrh r1, [r4, #0xac] - add r0, sp, #0x18 - bl InitMove - mov r1, #0 - ldrb r0, [sp, #0x18] - add r6, sp, #0x18 - mov r2, r1 - orr r0, r0, #0x10 - strb r0, [sp, #0x18] - mov r0, r5 - mov r3, r1 - stmia sp, {r1, r6} - bl ov29_02322374 - mov r1, #0 - mov r0, r5 - strh r1, [r4, #0xac] - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - mov r0, #0 - str r0, [r4, #0xb8] -_02310F70: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - ldrb r0, [r4, #0xd2] - cmp r0, #0xc - bne _02310FD0 - add r0, r4, #0xd3 - bl TickStatusTurnCounter - ldrb r0, [r4, #0xd3] - cmp r0, #0 - bne _02310FD0 - mov r0, #0 - strb r0, [r4, #0xd2] - mov r1, r5 - mov r2, r0 - strb r0, [r4, #0x154 + OV29_0230FC24_OFFSET] - bl SubstitutePlaceholderStringTags - ldr r1, _0231100C ; =0x00000CBA - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser -_02310FD0: - mov r0, r5 - bl EntityIsValid__02311010 - cmp r0, #0 - beq _02310FF4 - bl IsFloorOver - cmp r0, #0 - bne _02310FF4 - mov r0, r5 - bl TickNoSlipCap -_02310FF4: - add sp, sp, #0x34 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc} - .align 2, 0 -_02310FFC: .word 0x00000DEB + OV29_0230FC24_DATA_OFFSET -_02311000: .word 0x00000DEC + OV29_0230FC24_DATA_OFFSET -_02311004: .word 0x0000270F -_02311008: .word 0x00000165 -_0231100C: .word 0x00000CBA + OV29_0230FC24_DATA_OFFSET - arm_func_end ActivateEndOfTurnEffects diff --git a/include/dungeon_mode.h b/include/dungeon_mode.h index 9aada8db..5ff77a97 100644 --- a/include/dungeon_mode.h +++ b/include/dungeon_mode.h @@ -308,7 +308,7 @@ struct monster { // and restored to entity::types after statuses::roost ends. enum type_id original_types[2]; // 0xAC: The move id to be used if statuses::bide is 1. - s16 bide_move_id; + enum move_id bide_move_id; u8 field_0xae; u8 field_0xaf; // 0xB0: Unique number given to the monster when spawning to differentiate it from other diff --git a/include/overlay_29_02311010.h b/include/overlay_29_02311010.h index 16a43251..86eb4a0f 100644 --- a/include/overlay_29_02311010.h +++ b/include/overlay_29_02311010.h @@ -3,6 +3,7 @@ #include "dungeon_mode.h" +void ActivateEndOfTurnEffects(struct entity *entity); // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__02311010(struct entity *entity); // Checks if a monster is holding a certain item that isn't disabled by Klutz. diff --git a/src/overlay_29_02311010.c b/src/overlay_29_02311010.c index b7766ebd..0515cce5 100644 --- a/src/overlay_29_02311010.c +++ b/src/overlay_29_02311010.c @@ -3,6 +3,645 @@ #include "dungeon_pokemon_attributes.h" #include "dungeon_util_static.h" #include "exclusive_item.h" +#include "dg_random.h" +#include "dungeon_capabilities.h" +#include "dungeon_capabilities_1.h" +#include "dungeon_capabilities_3.h" +#include "dungeon_logic.h" +#include "dungeon_logic_3.h" +#include "dungeon_map_access_1.h" +#include "dungeon_pokemon_attributes_1.h" +#include "dungeon_util_1.h" +#include "move_orb_effects.h" +#include "moves_1.h" +#include "number_util.h" +#include "overlay_29_022EAC7C.h" +#include "overlay_29_02318A4C.h" +#include "overlay_29_0233836C.h" +#include "overlay_29_0234B024.h" +#include "weather.h" + +#ifdef JAPAN +#define MESSAGE_DE6 0xB26 +#define MESSAGE_DE7 0xB27 +#define MESSAGE_DE8 0xB28 +#define MESSAGE_DE9 0xB29 +#define MESSAGE_DEA 0xB2A +#define MESSAGE_DBD 0xAFD +#define MESSAGE_DEB 0xB2B +#define MESSAGE_DEC 0xB2C +#define MESSAGE_CBA 0x9FA +#else +#define MESSAGE_DE6 0xDE6 +#define MESSAGE_DE7 0xDE7 +#define MESSAGE_DE8 0xDE8 +#define MESSAGE_DE9 0xDE9 +#define MESSAGE_DEA 0xDEA +#define MESSAGE_DBD 0xDBD +#define MESSAGE_DEB 0xDEB +#define MESSAGE_DEC 0xDEC +#define MESSAGE_CBA 0xCBA +#endif + + +#ifdef EUROPE +extern bool8 ov29_022E34A8_EU(struct entity *entity); +#endif + +extern void ApplyDamageAndEffectsWrapper(struct entity *entity, s32 damage, s32 a, s32 b); +extern s32 IsFloorOver(); +extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); +extern bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity *user, struct entity *target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id); +extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); +extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); +extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); +extern void SubstitutePlaceholderStringTags(s32 string_id, struct entity *entity, u32 param_3); +extern void MultiplyFixedPoint64(struct fixed_point_64 *out, const struct fixed_point_64 *a, const struct fixed_point_64 *b); +extern void EndNegativeStatusConditionWrapper(struct entity *user, struct entity *target, bool8 displayMessage, bool8 fromMove); +extern void ov29_022EA370(s32 a, s32 b); +extern s32 ov29_022F2FE4(); + +extern void WaitUntilAlertBoxTextIsLoadedWrapper(void); +extern u8 TickStatusTurnCounter(u8 *counter); +extern void EnsureCanStandCurrentTile(struct entity *entity); +extern void ov29_022E543C(struct entity *entity); +extern void ov29_022E53F0(struct entity *entity); +extern void PlayEffectAnimationEntityStandard(struct entity *entity, s32 anim_id); +extern void ov29_022F42F8(struct entity *entity); +extern void EndMagnetRiseStatus(struct entity *user, struct entity *target); +extern void TickNoSlipCap(struct entity *entity); +extern void EndBurnClassStatus(struct entity *user, struct entity *target); +extern void ov29_022EC62C(struct entity *entity); +extern void ov29_022FB718(struct entity *entity); +extern void TryActivateBadDreams(struct entity *entity); +extern void TryWeatherFormChange(struct entity *entity); +extern s32 EndNegativeStatusCondition(struct entity *user, struct entity *target, bool8 a, bool8 b, bool8 c); +extern s32 DisplayActions(s32 a); +extern s32 ov29_02322374(struct entity *entity, s32 a, s32 b, s32 c, s32 d, struct move *move); + +extern struct dungeon *DUNGEON_PTR; +extern const s16 ov10_022C4BBC[20]; +extern struct fixed_point_64 ov10_022C4FC4[]; +extern s32 ov10_022C4A5C[]; +extern const s16 BAD_WEATHER_DAMAGE; +extern const s16 SHED_SKIN_ACTIVATION_CHANCE; +extern const s16 SPEED_BOOST_TURNS; +extern const s16 BURN_DAMAGE_COOLDOWN; +extern const s16 BURN_DAMAGE; +extern const s16 ov10_022C4664; +extern const s16 ov10_022C464C; +extern const s16 POISON_DAMAGE_COOLDOWN; +extern const s16 POISON_DAMAGE; +extern const s16 BAD_POISON_DAMAGE_COOLDOWN; +extern const s16 BAD_POISON_DAMAGE_TABLE[30]; +extern const s16 ov10_022C4454; +extern const s16 CONSTRICTION_DAMAGE; +extern const s16 WRAP_DAMAGE_COOLDOWN; +extern const s16 WRAP_DAMAGE; +extern const s16 INGRAIN_BONUS_REGEN_COOLDOWN; +extern const s16 INGRAIN_BONUS_REGEN; +extern const s16 CURSE_DAMAGE_COOLDOWN; +extern const s16 LEECH_SEED_DAMAGE_COOLDOWN; +extern const s16 LEECH_SEED_HP_DRAIN; + +void ActivateEndOfTurnEffects(struct entity *entity) +{ + s32 v1; + s32 v2; + s32 v3; + struct fixed_point_64 f2; + struct fixed_point_64 f1; + struct fixed_point f3; + struct entity *e1; + s16 i; + struct monster *monster; + bool8 b1; + struct monster *mon1; + struct move mv; + + if (entity == NULL) + return; + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + monster = entity->info; + monster->famished = FALSE; + ov29_022FB718(entity); + WaitUntilAlertBoxTextIsLoadedWrapper(); + TryWeatherFormChange(entity); + if (ItemIsActive__02311034(entity, ITEM_WARP_SCARF)) { + monster->field_0x17c++; + if (monster->field_0x17c >= 20) + monster->field_0x17c = 19; + if (DungeonRandInt(100) < ov10_022C4BBC[monster->field_0x17c]) { + monster->field_0x17c = 0; + ov29_022EC62C(entity); + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + TryWarp(entity, entity, 0, 0); + ov29_022F42F8(entity); + } + } + if (monster->is_team_leader) { + v1 = 10; + v1 -= ItemIsActive__02311034(entity, ITEM_TIGHT_BELT) ? 10 : 0; + v1 -= ItemIsActive__02311034(entity, ITEM_STAMINA_BAND) != 0; + if (IqSkillIsEnabled(entity, IQ_ENERGY_SAVER)) + v1--; + v1 += ItemIsActive__02311034(entity, ITEM_DIET_RIBBON) != 0; + v1 += ItemIsActive__02311034(entity, ITEM_HEAL_RIBBON) != 0; + v1 += ItemIsActive__02311034(entity, ITEM_MUNCH_BELT) != 0; + v1 += AbilityIsActiveVeneer(entity, ABILITY_GLUTTONY) != 0; + if (v1 < 0) + v1 = 0; + if (v1 > 19) + v1 = 19; + f1.upper = 0; + f1.lower = 0x199A; + MultiplyFixedPoint64(&f2, &f1, &ov10_022C4FC4[v1]); + if (monster->rollout_hit_counter > 1) + f2.lower += ov10_022C4A5C[monster->rollout_hit_counter] << 16; + monster->rollout_hit_counter = 0; + f3 = monster->belly; + monster->belly = SubFixedPoint(monster->belly, BinToDecFixedPoint(&f2)); + v2 = 0; + v3 = 1; + if (CeilFixedPoint(f3) >= 20 && CeilFixedPoint(monster->belly) < 20) + v2 = MESSAGE_DE6; + if (CeilFixedPoint(f3) >= 10 && CeilFixedPoint(monster->belly) < 10) + v2 = MESSAGE_DE7; + if (CeilFixedPoint(monster->belly) == 0) + monster->belly = sub_02050FF8(0); + if (CeilFixedPoint(monster->belly) < 0) + monster->belly = sub_02050FF8(0); + if (CeilFixedPoint(monster->belly) == 0) { + ov29_022F2FE4(); + ov29_022EC62C(entity); + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + if (DUNGEON_PTR->leader_hunger_message_tracker < 10) + DUNGEON_PTR->leader_hunger_message_tracker++; + if (DUNGEON_PTR->leader_hunger_message_tracker == 1) + v2 = MESSAGE_DE8; + if (DUNGEON_PTR->leader_hunger_message_tracker == 2) { + v2 = MESSAGE_DE9; + v3 = 0; + } + if (DUNGEON_PTR->leader_hunger_message_tracker == 3) { + v2 = MESSAGE_DEA; + v3 = 0; + } + TryEndPetrifiedOrSleepStatus(entity, entity); + ApplyDamageAndEffectsWrapper(entity, 1, 0xE, 0x250); + monster->famished = TRUE; + if (CeilFixedPoint(monster->belly) != 0) + v2 = 0; + } else { + DUNGEON_PTR->leader_hunger_message_tracker = 0; + } + if (v2 != 0) { +#if defined(EUROPE) + if (v3 != 0 && ov29_022E34A8_EU(entity)) +#elif defined(JAPAN) + if (v3 != 0 && EntityIsValid__02311010(entity)) +#else + if (v3 != 0 && !DUNGEON_PTR->end_floor_no_death_check_flag && + EntityIsValid__02311010(entity)) +#endif + PlaySeByIdIfNotSilence(0x1303); + LogMessageByIdWithPopupCheckUser(entity, v2); + ov29_022EA370(0x1E, 0x32); + } + } + + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + if (DUNGEON_PTR->weather.weather_damage_counter == 0) { + if (GetApparentWeather(entity) == WEATHER_HAIL) { + if (!AbilityIsActiveVeneer(entity, ABILITY_SNOW_CLOAK) && + !AbilityIsActiveVeneer(entity, ABILITY_ICE_BODY) && + !MonsterIsType(entity, TYPE_ICE) && + !ExclusiveItemEffectIsActiveWithLogging(entity, entity, TRUE, MESSAGE_DBD, + EXCLUSIVE_EFF_NO_WEATHER_DAMAGE)) { + ApplyDamageAndEffectsWrapper(entity, BAD_WEATHER_DAMAGE, 0x12, DAMAGE_SOURCE_WEATHER); + } + } else if (GetApparentWeather(entity) == WEATHER_SANDSTORM) { + if (!AbilityIsActiveVeneer(entity, ABILITY_SAND_VEIL) && + !MonsterIsType(entity, TYPE_GROUND) && + !MonsterIsType(entity, TYPE_ROCK) && + !MonsterIsType(entity, TYPE_STEEL) && + !ExclusiveItemEffectIsActiveWithLogging(entity, entity, TRUE, MESSAGE_DBD, + EXCLUSIVE_EFF_NO_WEATHER_DAMAGE)) { + ApplyDamageAndEffectsWrapper(entity, BAD_WEATHER_DAMAGE, 0x12, DAMAGE_SOURCE_WEATHER); + } + } else if (GetApparentWeather(entity) == WEATHER_SUNNY) { + if (AbilityIsActiveVeneer(entity, ABILITY_SOLAR_POWER)) { + if (!ExclusiveItemEffectIsActiveWithLogging(entity, entity, TRUE, MESSAGE_DBD, + EXCLUSIVE_EFF_NO_WEATHER_DAMAGE)) { + SetPreprocessorArgsIdVal(2, ABILITY_SOLAR_POWER); + ApplyDamageAndEffectsWrapper(entity, BAD_WEATHER_DAMAGE, 0x19, + DAMAGE_SOURCE_WEATHER); + } + } else if (AbilityIsActiveVeneer(entity, ABILITY_DRY_SKIN)) { + if (!ExclusiveItemEffectIsActiveWithLogging(entity, entity, TRUE, MESSAGE_DBD, + EXCLUSIVE_EFF_NO_WEATHER_DAMAGE)) { + SetPreprocessorArgsIdVal(2, ABILITY_DRY_SKIN); + ApplyDamageAndEffectsWrapper(entity, BAD_WEATHER_DAMAGE, 0x1A, + DAMAGE_SOURCE_WEATHER); + } + } + } + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } + v1 = DungeonRandInt(100); + if (AbilityIsActiveVeneer(entity, ABILITY_SHED_SKIN) && + v1 < SHED_SKIN_ACTIVATION_CHANCE && + MonsterHasNegativeStatus(entity, FALSE)) { + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + EndNegativeStatusConditionWrapper(entity, entity, TRUE, FALSE); + } + if (AbilityIsActiveVeneer(entity, ABILITY_HYDRATION) && + GetApparentWeather(entity) == WEATHER_RAIN && + MonsterHasNegativeStatus(entity, FALSE) && + monster->frozen_class_status.freeze != STATUS_FROZEN_WRAP) { + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + EndNegativeStatusCondition(entity, entity, TRUE, FALSE, FALSE); + } + + if (AbilityIsActiveVeneer(entity, ABILITY_SPEED_BOOST)) { + monster->field_0x11f++; + if (monster->field_0x11f >= SPEED_BOOST_TURNS) { + monster->field_0x11f = 0; + BoostSpeedOneStage(entity, entity, 0x7f, FALSE); + } + } + + if (monster->sleep_class_status.sleep == STATUS_SLEEP_YAWNING) { + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + ov29_022E53F0(entity); + } + + if (monster->burn_class_status.burn == STATUS_BURN_BURN) { + if (monster->burn_class_status.burn_damage_countdown != 0) + monster->burn_class_status.burn_damage_countdown--; + if (monster->burn_class_status.burn_damage_countdown == 0) { + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + monster->burn_class_status.burn_damage_countdown = BURN_DAMAGE_COOLDOWN; + TryEndPetrifiedOrSleepStatus(entity, entity); + ApplyDamageAndEffectsWrapper(entity, BURN_DAMAGE, 1, 0x247); + } + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } + + if (GravityIsActive()) { + if (IsFloating(entity)) { + EndMagnetRiseStatus(entity, entity); + EnsureCanStandCurrentTile(entity); + } + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } + + if (AbilityIsActiveVeneer(entity, ABILITY_BAD_DREAMS)) { + TryActivateBadDreams(entity); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } + + if (!IsTileGround(GetTileAtEntity(entity))) { + v1 = monster->max_hp_stat + monster->max_hp_boost; + if (v1 > 999) + v1 = 999; + if (monster->hp < v1 && + ExclusiveItemEffectIsActive__02311064(entity, EXCLUSIVE_EFF_RECOVER_HP_FROM_WATERY_TERRAIN)) { + TryIncreaseHp(entity, entity, ov10_022C4664, 0, FALSE); + } + if (ExclusiveItemEffectIsActive__02311064(entity, EXCLUSIVE_EFF_HEAL_STATUS_FROM_WATERY_TERRAIN)) + EndNegativeStatusConditionWrapper(entity, entity, TRUE, TRUE); + } + + if (ExclusiveItemEffectIsActive__02311064(entity, EXCLUSIVE_EFF_ABSORB_TEAMMATE_POISON)) { + b1 = FALSE; + for (i = 0; i < 4; i++) { + e1 = DUNGEON_PTR->monster_slot_ptrs[i]; + if (EntityIsValid__02311010(e1)) { + mon1 = e1->info; + if (mon1->burn_class_status.burn == STATUS_BURN_POISONED + || mon1->burn_class_status.burn == STATUS_BURN_BADLY_POISONED) { + ov29_022E543C(e1); + EndBurnClassStatus(e1, e1); + b1 = TRUE; + } + } + } + + if (b1) + TryIncreaseHp(entity, entity, ov10_022C464C, 0, TRUE); + } + + if (monster->burn_class_status.burn == STATUS_BURN_POISONED) { + if (monster->burn_class_status.burn_damage_countdown != 0) + monster->burn_class_status.burn_damage_countdown--; + + if (monster->burn_class_status.burn_damage_countdown == 0) { + DisplayActions(0); + + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver() || monster->burn_class_status.burn != STATUS_BURN_POISONED) + return; + + monster->burn_class_status.burn_damage_countdown = POISON_DAMAGE_COOLDOWN; + TryEndPetrifiedOrSleepStatus(entity, entity); + + if (AbilityIsActiveVeneer(entity, ABILITY_POISON_HEAL)) + TryIncreaseHp(entity, entity, POISON_DAMAGE, 0, TRUE); + else + ApplyDamageAndEffectsWrapper(entity, POISON_DAMAGE, 3, DAMAGE_SOURCE_POISON); + } + + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } else if (monster->burn_class_status.burn == STATUS_BURN_BADLY_POISONED) { + if (monster->burn_class_status.burn_damage_countdown != 0) + monster->burn_class_status.burn_damage_countdown--; + + if (monster->burn_class_status.burn_damage_countdown == 0) { + v1 = monster->burn_class_status.badly_poisoned_damage_count; + + if (monster->burn_class_status.badly_poisoned_damage_count < 0x1d) + monster->burn_class_status.badly_poisoned_damage_count++; + + monster->burn_class_status.burn_damage_countdown = BAD_POISON_DAMAGE_COOLDOWN; + + if (v1 >= 0x1d) + v1 = 0x1d; + if (v1 < 0) + v1 = 0; + + DisplayActions(0); + + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver() || monster->burn_class_status.burn != STATUS_BURN_BADLY_POISONED) + return; + + TryEndPetrifiedOrSleepStatus(entity, entity); + + if (AbilityIsActiveVeneer(entity, ABILITY_POISON_HEAL)) + TryIncreaseHp(entity, entity, BAD_POISON_DAMAGE_TABLE[v1], 0, TRUE); + else + ApplyDamageAndEffectsWrapper(entity, BAD_POISON_DAMAGE_TABLE[v1], 3, + DAMAGE_SOURCE_POISON); + } + + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } + + if (monster->frozen_class_status.freeze == STATUS_FROZEN_CONSTRICTION) { + if (monster->frozen_class_status.freeze_damage_countdown != 0) + monster->frozen_class_status.freeze_damage_countdown--; + if (monster->frozen_class_status.freeze_damage_countdown == 0) { + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + monster->frozen_class_status.freeze_damage_countdown = ov10_022C4454; + TryEndPetrifiedOrSleepStatus(entity, entity); + PlayEffectAnimationEntityStandard(entity, monster->frozen_class_status.constriction_animation); + ApplyDamageAndEffectsWrapper(entity, CONSTRICTION_DAMAGE, 2, 0x248); + } + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } else if (monster->frozen_class_status.freeze == STATUS_FROZEN_WRAPPED) { + if (monster->frozen_class_status.freeze_damage_countdown != 0) + monster->frozen_class_status.freeze_damage_countdown--; + if (monster->frozen_class_status.freeze_damage_countdown == 0) { + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + monster->frozen_class_status.freeze_damage_countdown = WRAP_DAMAGE_COOLDOWN; + TryEndPetrifiedOrSleepStatus(entity, entity); + ApplyDamageAndEffectsWrapper(entity, WRAP_DAMAGE, 5, 0x24A); + } + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } else if (monster->frozen_class_status.freeze == STATUS_FROZEN_INGRAIN) { + if (monster->frozen_class_status.freeze_damage_countdown != 0) + monster->frozen_class_status.freeze_damage_countdown--; + if (monster->frozen_class_status.freeze_damage_countdown == 0) { + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + monster->frozen_class_status.freeze_damage_countdown = INGRAIN_BONUS_REGEN_COOLDOWN; + TryIncreaseHp(entity, entity, INGRAIN_BONUS_REGEN, 0, TRUE); + } + } + + if (monster->curse_class_status.curse == STATUS_CURSE_CURSED) + { + if (monster->curse_class_status.curse_damage_countdown != 0) + monster->curse_class_status.curse_damage_countdown--; + + if (monster->curse_class_status.curse_damage_countdown == 0) + { + v1 = monster->max_hp_stat + monster->max_hp_boost; + if (v1 > 999) + v1 = 999; + v2 = v1 / 4; + if (v2 == 0) + v2++; + + monster->curse_class_status.curse_damage_countdown = CURSE_DAMAGE_COOLDOWN; + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + + TryEndPetrifiedOrSleepStatus(entity, entity); + ApplyDamageAndEffectsWrapper(entity, v2, 7, 0x24B); + } + + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } + + if (monster->leech_seed_class_status.leech_seed == STATUS_LEECH_SEED_LEECH_SEED) + { + if (monster->leech_seed_class_status.leech_seed_damage_countdown != 0) + monster->leech_seed_class_status.leech_seed_damage_countdown--; + + if (monster->leech_seed_class_status.leech_seed_damage_countdown == 0) + { + e1 = DUNGEON_PTR->active_monster_ptrs[monster->leech_seed_class_status.leech_seed_source_monster_index]; + v2 = LEECH_SEED_DAMAGE_COOLDOWN; + v3 = LEECH_SEED_HP_DRAIN; + + monster->leech_seed_class_status.leech_seed_damage_countdown = v2; + if (e1 == NULL) + { + monster->leech_seed_class_status.leech_seed = STATUS_LEECH_SEED_NONE; + } + else if (monster->leech_seed_class_status.statuses_applier_id != GetEntInfo(e1)->unique_id) + { + monster->leech_seed_class_status.leech_seed = STATUS_LEECH_SEED_NONE; + } + else + { + if (e1 != entity && + (e1 == NULL ? FALSE : (bool8)(GetEntityType(e1) == ENTITY_MONSTER)) && + AbilityIsActiveVeneer(e1, ABILITY_MOLD_BREAKER)) + b1 = FALSE; + else + b1 = AbilityIsActiveVeneer(entity, ABILITY_LIQUID_OOZE); + + ov29_022EC62C(entity); + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (!EntityIsValid__02311010(e1)) + return; + if (IsFloorOver()) + return; + + if (monster->frozen_class_status.freeze != STATUS_FROZEN_FROZEN) + { + TryEndPetrifiedOrSleepStatus(entity, entity); + ApplyDamageAndEffectsWrapper(entity, v3, 9, 0x24C); + if (b1) + { + TryEndPetrifiedOrSleepStatus(e1, e1); + ApplyDamageAndEffectsWrapper(e1, v3, 0xD, 0x239); + } + else if (!AbilityIsActiveVeneer(entity, ABILITY_MAGIC_GUARD)) + { + TryIncreaseHp(e1, e1, v3, 0, TRUE); + } + } + } + } + + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } + + if (monster->perish_song_turns != 0) { + TickStatusTurnCounter(&monster->perish_song_turns); + if (monster->perish_song_turns == 0) { + DisplayActions(0); + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + SubstitutePlaceholderStringTags(1, entity, 0); + LogMessageByIdWithPopupCheckUser(entity, MESSAGE_DEB); + TryEndPetrifiedOrSleepStatus(entity, entity); + if (monster->reflect_class_status.reflect == STATUS_REFLECT_PROTECT) { + LogMessageByIdWithPopupCheckUser(entity, MESSAGE_DEC); + } else { + ApplyDamageAndEffectsWrapper(entity, 9999, 0xB, 0x24D); + } + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + } + } + if (monster->bide_class_status.bide == STATUS_TWO_TURN_BIDE) { + TickStatusTurnCounter(&monster->bide_class_status.bide_turns); + if (monster->bide_class_status.bide_turns == 0) { + monster->bide_class_status.bide = STATUS_TWO_TURN_NONE; + if (!CheckVariousStatuses2__02301244(entity, FALSE) && + !MonsterCannotAttack(entity, FALSE) && + !CheckVariousStatuses__023016DC(entity)) { + DisplayActions(0); + if (monster->bide_move_id == MOVE_NOTHING) + monster->bide_move_id = MOVE_BIDE_UNLEASH; + InitMove(&mv, monster->bide_move_id); + mv.flags0 |= MOVE_FLAG_LAST_USED; + ov29_02322374(entity, 0, 0, 0, 0, &mv); + monster->bide_move_id = MOVE_NOTHING; + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + monster->bide_damage_tally = 0; + } + } + } + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + if (monster->bide_class_status.bide == STATUS_TWO_TURN_ENRAGED) { + TickStatusTurnCounter(&monster->bide_class_status.bide_turns); + if (monster->bide_class_status.bide_turns == 0) { + monster->bide_class_status.bide = STATUS_TWO_TURN_NONE; + monster->using_charged_move = FALSE; + SubstitutePlaceholderStringTags(0, entity, 0); + LogMessageByIdWithPopupCheckUser(entity, MESSAGE_CBA); + } + } + if (!EntityIsValid__02311010(entity)) + return; + if (IsFloorOver()) + return; + TickNoSlipCap(entity); +} bool8 EntityIsValid__02311010(struct entity *entity) {