From d387d4e2737b99d523dd7d23c73f2fd7004af266 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sun, 6 Sep 2026 12:47:01 -0700 Subject: [PATCH] Decomp ActivateEndOfTurnEffects; monster::bide_move_id is a 2-byte enum move_id ActivateEndOfTurnEffects (0x0230FC24, 1235 instructions in US) is the per-turn status tick: the warp-scarf counter, the leader's belly and hunger messages, weather damage, Shed Skin and Hydration, the burn, poison, bad-poison, constriction, wrap, ingrain, curse and leech-seed damage countdowns, perish song and bide. It is the last of five functions in asm/overlay_29_0230F9A4.s and the next object in main.lsf is src/overlay_29_02311010.o, so extract_function.py merges rather than splits and main.lsf is unchanged. struct monster declared 0xAC as u8 bide_move_id plus u8 field_0xad. Retail accesses it with ldrh/strh and stores 0x165 = MOVE_BIDE_UNLEASH, which does not fit in a byte; enum move_id runs to 558, so -enum min sizes it to two bytes - the width struct move's own enum move_id id at 0x2 already has. The field becomes enum move_id and absorbs field_0xad. The struct size and every later offset are unchanged, no other source reads either member, and InitMove already takes enum move_id so no cast is needed. This deviates from pmdsky-debug's u8; the reasoning note linked from the PR has the evidence. The 29 callees that are still asm are declared extern in the .c with prototypes read off their own asm, as the sibling files do, and so are the 24 data symbols - const on the read-only rodata ones, which is what places their loads correctly. Region handling: the sound-effect guard in the hunger block is a genuine three-way fork, EU calling ov29_022E34A8_EU where JP omits the end_floor_no_death_check_flag test that US performs, and nine message ids are file-scope defines at US - 0x2C0 under JAPAN. The JP struct and dungeon offset shifts are absorbed by the headers with no directive. Locals are generic and declared at function scope. That is not cosmetic: the allocator's unit is the coalesced web, and the function-scope declaration list is the only thing that orders it, so the declaration order is what reproduces retail's register assignment. Authored by Claude (Opus 5) under human direction. Confirmed by matching builds of all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/overlay_29_0230F9A4.inc | 79 +- asm/overlay_29_0230F9A4.s | 1356 --------------------------- include/dungeon_mode.h | 2 +- include/overlay_29_02311010.h | 1 + src/overlay_29_02311010.c | 639 +++++++++++++ 5 files changed, 645 insertions(+), 1432 deletions(-) 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) {