From 723dc40be72a7dfd22d96ef612bb20b61d5d33a1 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 31 Oct 2025 13:35:14 +0100 Subject: [PATCH 01/15] LowerOffensiveStat --- asm/include/overlay_29_02311C28.inc | 5 - asm/overlay_29_02311C28.s | 155 ---------------------------- include/overlay_29_02313814.h | 6 ++ src/overlay_29_02313814.c | 71 +++++++++++++ 4 files changed, 77 insertions(+), 160 deletions(-) diff --git a/asm/include/overlay_29_02311C28.inc b/asm/include/overlay_29_02311C28.inc index 8aa65120..88f577f2 100644 --- a/asm/include/overlay_29_02311C28.inc +++ b/asm/include/overlay_29_02311C28.inc @@ -1,9 +1,7 @@ #pragma once .public AbilityIsActiveVeneer -.public AllocateTemp1024ByteBufferFromPool .public CalcStatusDuration .public ChangeShayminForme -.public CopyStringFromId .public DIRECTIONS_XY .public DUNGEON_PTR .public DefenderAbilityIsActive__02311B94 @@ -15,13 +13,11 @@ .public GetTreatmentBetweenMonstersIgnoreStatus .public IsProtectedFromNegativeStatus .public IsProtectedFromSleepClassStatus -.public IsProtectedFromStatDrops .public ItemIsActive__02311BF8 .public LogMessageByIdWithPopupCheckUserTarget .public MonsterIsType .public SECONDARY_TERRAIN_TYPES .public SafeguardIsActive -.public SetMessageLogPreprocessorArgsString .public SetPreprocessorArgsIdVal .public SetPreprocessorArgsStringToName .public SubstitutePlaceholderStringTags @@ -53,7 +49,6 @@ .public ov29_022E4C00 .public ov29_022E4C4C .public ov29_022E4D24 -.public ov29_022E4D28 .public ov29_022E53EC .public ov29_02304A48 .public ov29_02304A84 diff --git a/asm/overlay_29_02311C28.s b/asm/overlay_29_02311C28.s index af5ef563..61ac48bc 100644 --- a/asm/overlay_29_02311C28.s +++ b/asm/overlay_29_02311C28.s @@ -1980,158 +1980,3 @@ _023135F4: .word 0x00000D33 #endif _023135F8: .word DUNGEON_PTR arm_func_end TryInflictPetrifiedStatus - - arm_func_start LowerOffensiveStat -LowerOffensiveStat: ; 0x023135FC - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r7, r1 - mov r5, r3 - mov r8, r0 - bl AllocateTemp1024ByteBufferFromPool - mov r6, r0 - bl AllocateTemp1024ByteBufferFromPool - mov r4, r0 - mov r1, r5, lsl #0x10 - mov r0, r7 - mov r5, r1, asr #0x10 - bl EntityIsValid__023118B4 - cmp r0, #0 - beq _023137E8 - ldr r0, [sp, #0x20] - cmp r0, #0 - beq _02313660 - ldr r1, _023137F4 ; =0x00000DCB - mov r0, r6 - bl CopyStringFromId - mov r1, r6 - mov r0, #1 - bl SetMessageLogPreprocessorArgsString - b _02313678 -_02313660: - ldr r1, _023137F8 ; =0x00000DCA - mov r0, r6 - bl CopyStringFromId - mov r1, r6 - mov r0, #1 - bl SetMessageLogPreprocessorArgsString -_02313678: - ldrb r0, [sp, #0x28] - cmp r0, #0 - beq _02313720 - ldrb r2, [sp, #0x2c] - mov r0, r8 - mov r1, r7 - bl IsProtectedFromStatDrops - cmp r0, #0 - bne _023137E8 - mov r0, r7 - mov r1, #0x12 - bl ItemIsActive__02311BF8 - cmp r0, #0 - beq _023136D4 - mov r0, #0 - mov r1, r7 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _023137FC ; =0x00000DB2 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _023137E8 -_023136D4: - mov r0, r8 - mov r1, r7 - mov r2, #9 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__02311B94 - cmp r0, #0 - beq _02313720 - ldr r0, [sp, #0x20] - cmp r0, #0 - bne _02313720 - mov r0, #0 - mov r1, r7 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _02313800 ; =0x00000D9E - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget - b _023137E8 -_02313720: - mov r0, #0 - mov r1, r7 - mov r2, r0 - ldr r6, [r7, #0xb4] - bl SubstitutePlaceholderStringTags - add r1, sp, #0x20 - ldr r1, [r1] - mov r0, r7 - bl ov29_022E4D28 - mov r0, r7 - mov r1, #0x61 - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r0, r5, lsl #0x11 - movne r5, r0, asr #0x10 - cmp r5, #1 - bne _02313780 - ldr r1, _02313804 ; =0x00000DCD - mov r0, r4 - bl CopyStringFromId - mov r1, r4 - mov r0, #2 - bl SetMessageLogPreprocessorArgsString - b _02313798 -_02313780: - ldr r1, _02313808 ; =0x00000DCC - mov r0, r4 - bl CopyStringFromId - mov r1, r4 - mov r0, #2 - bl SetMessageLogPreprocessorArgsString -_02313798: - ldr r1, [sp, #0x20] - add r0, r6, r1, lsl #1 - ldrsh r0, [r0, #0x24] - subs r4, r0, r5 - movmi r4, #0 - cmp r4, r0 - beq _023137D0 - ldr r2, _0231380C ; =0x00000D91 - add r3, r6, r1, lsl #1 - mov r0, r8 - mov r1, r7 - strh r4, [r3, #0x24] - bl LogMessageByIdWithPopupCheckUserTarget - b _023137E0 -_023137D0: - ldr r2, _02313810 ; =0x00000DD9 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget -_023137E0: - mov r0, r7 - bl UpdateStatusIconFlags -_023137E8: - ldmia sp!, {r4, r5, r6, r7, r8, lr} - add sp, sp, #0x10 - bx lr - .align 2, 0 -#ifdef JAPAN -#define LOWER_OFFENSIVE_STAT_OFFSET -0x2C0 -#else -#define LOWER_OFFENSIVE_STAT_OFFSET 0 -#endif -_023137F4: .word 0x00000DCB + LOWER_OFFENSIVE_STAT_OFFSET -_023137F8: .word 0x00000DCA + LOWER_OFFENSIVE_STAT_OFFSET -_023137FC: .word 0x00000DB2 + LOWER_OFFENSIVE_STAT_OFFSET -_02313800: .word 0x00000D9E + LOWER_OFFENSIVE_STAT_OFFSET -_02313804: .word 0x00000DCD + LOWER_OFFENSIVE_STAT_OFFSET -_02313808: .word 0x00000DCC + LOWER_OFFENSIVE_STAT_OFFSET -_0231380C: .word 0x00000D91 + LOWER_OFFENSIVE_STAT_OFFSET -_02313810: .word 0x00000DD9 + LOWER_OFFENSIVE_STAT_OFFSET - arm_func_end LowerOffensiveStat diff --git a/include/overlay_29_02313814.h b/include/overlay_29_02313814.h index 93169f35..88cc65c5 100644 --- a/include/overlay_29_02313814.h +++ b/include/overlay_29_02313814.h @@ -1,11 +1,17 @@ #ifndef PMDSKY_OVERLAY_29_02313814_H #define PMDSKY_OVERLAY_29_02313814_H +#define STAT_INDEX_PHYSICAL 0 // Atk, Def +#define STAT_INDEX_SPECIAL 1 // Sp Atk, Sp Def +#define STAT_INDEX_ACCURACY STAT_INDEX_PHYSICAL +#define STAT_INDEX_EVASION STAT_INDEX_SPECIAL + struct StatIndex { int id; }; +void LowerOffensiveStat(struct entity *pokemon, struct entity *target, struct StatIndex stat, s32 nStagesRaw, bool8 checkProtected, bool8 logMsgProtected); void LowerDefensiveStat(struct entity *pokemon, struct entity *target, struct StatIndex stat, s32 increment, bool8 checkProtected, bool8 logMsgProtected); #endif //PMDSKY_OVERLAY_29_02313814_H diff --git a/src/overlay_29_02313814.c b/src/overlay_29_02313814.c index 518f738a..c5ab4203 100644 --- a/src/overlay_29_02313814.c +++ b/src/overlay_29_02313814.c @@ -2,6 +2,7 @@ #include "dungeon_util_static.h" #include "overlay_29_023118B4.h" #include "overlay_29_02313814.h" +#include "overlay_29_02311BF8.h" extern u8* AllocateTemp1024ByteBufferFromPool(void); extern void CopyStringFromId(u8* buf, u32 string_id); @@ -9,9 +10,79 @@ extern void SetMessageLogPreprocessorArgsString(u32 a, u8 *buf); extern bool8 IsProtectedFromStatDrops(struct entity *user, struct entity *target, bool8 logMsg); extern void SubstitutePlaceholderStringTags(int a, struct entity *entity, u32 param_3); extern void ov29_022E4DCC(struct entity *pokemon, struct StatIndex); +extern void ov29_022E4D28(struct entity *pokemon, struct StatIndex); extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern void UpdateStatusIconFlags(struct entity *); +void LowerOffensiveStat(struct entity *pokemon, struct entity *target, struct StatIndex stat, s32 nStagesRaw, bool8 checkProtected, bool8 logMsgProtected) +{ + struct monster *entityInfo; + u8 *buffer1 = AllocateTemp1024ByteBufferFromPool(); + u8 *buffer2 = AllocateTemp1024ByteBufferFromPool(); + s16 nStages = nStagesRaw; + s32 newStage; + + if (!EntityIsValid__023118B4(target)) + return; + + if (stat.id != 0) { + CopyStringFromId(buffer1, 0xdcb); + SetMessageLogPreprocessorArgsString(1, buffer1); + } + else { + CopyStringFromId(buffer1, 0xdca); + SetMessageLogPreprocessorArgsString(1, buffer1); + } + + if (checkProtected) { + if (IsProtectedFromStatDrops(pokemon, target, logMsgProtected)) + return; + + if (ItemIsActive__02311BF8(target, ITEM_TWIST_BAND)) { + SubstitutePlaceholderStringTags(0,target,0); + LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xdb2); + return; + } + + if (DefenderAbilityIsActive__02311B94(pokemon, target, ABILITY_HYPER_CUTTER, TRUE) && stat.id == STAT_INDEX_PHYSICAL) { + SubstitutePlaceholderStringTags(0,target,0); + LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xd9e); + return; + } + } + + entityInfo = GetEntInfo(target); + SubstitutePlaceholderStringTags(0,target,0); + ov29_022E4D28(target,stat); + + if (AbilityIsActiveVeneer(target, ABILITY_SIMPLE)) + nStages *= 2; + + if (nStages == 1) { + CopyStringFromId(buffer2, 0xdcd); + SetMessageLogPreprocessorArgsString(2, buffer2); + } + else { + CopyStringFromId(buffer2, 0xdcc); + SetMessageLogPreprocessorArgsString(2, buffer2); + } + + newStage = entityInfo->stat_modifiers.offensive_stages[stat.id]; + newStage -= nStages; + if (newStage < 0) { + newStage = 0; + } + + if (entityInfo->stat_modifiers.offensive_stages[stat.id] != newStage) { + entityInfo->stat_modifiers.offensive_stages[stat.id] = newStage; + LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xd91); + } + else { + LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xdd9); + } + UpdateStatusIconFlags(target); +} + #ifdef JAPAN #define LOWER_DEFENSIVE_STAT_OFFSET -0x2C0 #else From f1bdf4a6120fb05d851dcd1673fd5590bc868978 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 31 Oct 2025 15:08:18 +0100 Subject: [PATCH 02/15] fix jpn --- src/overlay_29_02313814.c | 44 +++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/src/overlay_29_02313814.c b/src/overlay_29_02313814.c index c5ab4203..b2c10a90 100644 --- a/src/overlay_29_02313814.c +++ b/src/overlay_29_02313814.c @@ -14,6 +14,12 @@ extern void ov29_022E4D28(struct entity *pokemon, struct StatIndex); extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern void UpdateStatusIconFlags(struct entity *); +#ifdef JAPAN +#define JPN_MSG_OFFSET -0x2C0 +#else +#define JPN_MSG_OFFSET 0 +#endif // JAPAN + void LowerOffensiveStat(struct entity *pokemon, struct entity *target, struct StatIndex stat, s32 nStagesRaw, bool8 checkProtected, bool8 logMsgProtected) { struct monster *entityInfo; @@ -26,11 +32,11 @@ void LowerOffensiveStat(struct entity *pokemon, struct entity *target, struct St return; if (stat.id != 0) { - CopyStringFromId(buffer1, 0xdcb); + CopyStringFromId(buffer1, 0xdcb + JPN_MSG_OFFSET); SetMessageLogPreprocessorArgsString(1, buffer1); } else { - CopyStringFromId(buffer1, 0xdca); + CopyStringFromId(buffer1, 0xdca + JPN_MSG_OFFSET); SetMessageLogPreprocessorArgsString(1, buffer1); } @@ -40,13 +46,17 @@ void LowerOffensiveStat(struct entity *pokemon, struct entity *target, struct St if (ItemIsActive__02311BF8(target, ITEM_TWIST_BAND)) { SubstitutePlaceholderStringTags(0,target,0); - LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xdb2); + LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xdb2 + JPN_MSG_OFFSET); return; } + #ifdef JAPAN + if (DefenderAbilityIsActive__02311B94(pokemon, target, ABILITY_HYPER_CUTTER) && stat.id == STAT_INDEX_PHYSICAL) { + #else if (DefenderAbilityIsActive__02311B94(pokemon, target, ABILITY_HYPER_CUTTER, TRUE) && stat.id == STAT_INDEX_PHYSICAL) { + #endif SubstitutePlaceholderStringTags(0,target,0); - LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xd9e); + LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xd9e + JPN_MSG_OFFSET); return; } } @@ -59,11 +69,11 @@ void LowerOffensiveStat(struct entity *pokemon, struct entity *target, struct St nStages *= 2; if (nStages == 1) { - CopyStringFromId(buffer2, 0xdcd); + CopyStringFromId(buffer2, 0xdcd + JPN_MSG_OFFSET); SetMessageLogPreprocessorArgsString(2, buffer2); } else { - CopyStringFromId(buffer2, 0xdcc); + CopyStringFromId(buffer2, 0xdcc + JPN_MSG_OFFSET); SetMessageLogPreprocessorArgsString(2, buffer2); } @@ -75,20 +85,14 @@ void LowerOffensiveStat(struct entity *pokemon, struct entity *target, struct St if (entityInfo->stat_modifiers.offensive_stages[stat.id] != newStage) { entityInfo->stat_modifiers.offensive_stages[stat.id] = newStage; - LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xd91); + LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xd91 + JPN_MSG_OFFSET); } else { - LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xdd9); + LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xdd9 + JPN_MSG_OFFSET); } UpdateStatusIconFlags(target); } -#ifdef JAPAN -#define LOWER_DEFENSIVE_STAT_OFFSET -0x2C0 -#else -#define LOWER_DEFENSIVE_STAT_OFFSET 0 -#endif // JAPAN - void LowerDefensiveStat(struct entity *pokemon, struct entity *target, struct StatIndex stat, s32 nStagesRaw, bool8 checkProtected, bool8 logMsgProtected) { struct monster *entityInfo; @@ -101,11 +105,11 @@ void LowerDefensiveStat(struct entity *pokemon, struct entity *target, struct St return; if (stat.id != 0) { - CopyStringFromId(buffer1, 0xdc9 + LOWER_DEFENSIVE_STAT_OFFSET); + CopyStringFromId(buffer1, 0xdc9 + JPN_MSG_OFFSET); SetMessageLogPreprocessorArgsString(1, buffer1); } else { - CopyStringFromId(buffer1, 0xdc8 + LOWER_DEFENSIVE_STAT_OFFSET); + CopyStringFromId(buffer1, 0xdc8 + JPN_MSG_OFFSET); SetMessageLogPreprocessorArgsString(1, buffer1); } @@ -122,11 +126,11 @@ void LowerDefensiveStat(struct entity *pokemon, struct entity *target, struct St nStages *= 2; if (nStages == 1) { - CopyStringFromId(buffer2, 0xdcd + LOWER_DEFENSIVE_STAT_OFFSET); + CopyStringFromId(buffer2, 0xdcd + JPN_MSG_OFFSET); SetMessageLogPreprocessorArgsString(2, buffer2); } else { - CopyStringFromId(buffer2, 0xdcc + LOWER_DEFENSIVE_STAT_OFFSET); + CopyStringFromId(buffer2, 0xdcc + JPN_MSG_OFFSET); SetMessageLogPreprocessorArgsString(2, buffer2); } @@ -138,10 +142,10 @@ void LowerDefensiveStat(struct entity *pokemon, struct entity *target, struct St if (entityInfo->stat_modifiers.defensive_stages[stat.id] != newStage) { entityInfo->stat_modifiers.defensive_stages[stat.id] = newStage; - LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xd90 + LOWER_DEFENSIVE_STAT_OFFSET); + LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xd90 + JPN_MSG_OFFSET); } else { - LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xdd7 + LOWER_DEFENSIVE_STAT_OFFSET); + LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xdd7 + JPN_MSG_OFFSET); } UpdateStatusIconFlags(target); } From c5338b3c6de5248ac17e94ced359da2c8bd9824a Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 31 Oct 2025 15:25:56 +0100 Subject: [PATCH 03/15] BoostOffensiveStat --- ...9_0231399C.inc => overlay_29_02313B08.inc} | 1 - ...ay_29_0231399C.s => overlay_29_02313B08.s} | 110 +----------------- include/overlay_29_02313814.h | 1 + main.lsf | 2 +- src/overlay_29_02313814.c | 56 ++++++++- 5 files changed, 57 insertions(+), 113 deletions(-) rename asm/include/{overlay_29_0231399C.inc => overlay_29_02313B08.inc} (93%) rename asm/{overlay_29_0231399C.s => overlay_29_02313B08.s} (50%) diff --git a/asm/include/overlay_29_0231399C.inc b/asm/include/overlay_29_02313B08.inc similarity index 93% rename from asm/include/overlay_29_0231399C.inc rename to asm/include/overlay_29_02313B08.inc index 716d03fe..e0937690 100644 --- a/asm/include/overlay_29_0231399C.inc +++ b/asm/include/overlay_29_02313B08.inc @@ -7,5 +7,4 @@ .public SetMessageLogPreprocessorArgsString .public SubstitutePlaceholderStringTags .public UpdateStatusIconFlags -.public ov29_022E4E74 .public ov29_022E4F1C diff --git a/asm/overlay_29_0231399C.s b/asm/overlay_29_02313B08.s similarity index 50% rename from asm/overlay_29_0231399C.s rename to asm/overlay_29_02313B08.s index 292ce09b..e463de77 100644 --- a/asm/overlay_29_0231399C.s +++ b/asm/overlay_29_02313B08.s @@ -1,116 +1,8 @@ .include "asm/macros.inc" - .include "overlay_29_0231399C.inc" + .include "overlay_29_02313B08.inc" .text - arm_func_start BoostOffensiveStat -BoostOffensiveStat: ; 0x0231399C - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - mov r8, r1 - mov r6, r3 - mov sb, r0 - bl AllocateTemp1024ByteBufferFromPool - mov r4, r0 - bl AllocateTemp1024ByteBufferFromPool - mov r5, r0 - mov r1, r6, lsl #0x10 - mov r0, r8 - mov r6, r1, asr #0x10 - bl EntityIsValid__023118B4 - cmp r0, #0 - beq _02313AE4 - mov r0, #0 - mov r1, r8 - mov r2, r0 - ldr r7, [r8, #0xb4] - bl SubstitutePlaceholderStringTags - add r1, sp, #0x28 - ldr r1, [r1] - mov r0, r8 - bl ov29_022E4E74 - ldr r0, [sp, #0x28] - cmp r0, #0 - beq _02313A24 - ldr r1, _02313AF0 ; =0x00000DCB - mov r0, r4 - bl CopyStringFromId - mov r1, r4 - mov r0, #1 - bl SetMessageLogPreprocessorArgsString - b _02313A3C -_02313A24: - ldr r1, _02313AF4 ; =0x00000DCA - mov r0, r4 - bl CopyStringFromId - mov r1, r4 - mov r0, #1 - bl SetMessageLogPreprocessorArgsString -_02313A3C: - mov r0, r8 - mov r1, #0x61 - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r0, r6, lsl #0x11 - movne r6, r0, asr #0x10 - cmp r6, #1 - bne _02313A78 - ldr r1, _02313AF8 ; =0x00000DCD - mov r0, r5 - bl CopyStringFromId - mov r1, r5 - mov r0, #2 - bl SetMessageLogPreprocessorArgsString - b _02313A90 -_02313A78: - ldr r1, _02313AFC ; =0x00000DCC - mov r0, r5 - bl CopyStringFromId - mov r1, r5 - mov r0, #2 - bl SetMessageLogPreprocessorArgsString -_02313A90: - ldr r1, [sp, #0x28] - add r0, r7, r1, lsl #1 - ldrsh r0, [r0, #0x24] - add r4, r0, r6 - cmp r4, #0x14 - movge r4, #0x14 - cmp r4, r0 - beq _02313ACC - ldr r2, _02313B00 ; =0x00000D8F - add r3, r7, r1, lsl #1 - mov r0, sb - mov r1, r8 - strh r4, [r3, #0x24] - bl LogMessageByIdWithPopupCheckUserTarget - b _02313ADC -_02313ACC: - ldr r2, _02313B04 ; =0x00000DD8 - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget -_02313ADC: - mov r0, r8 - bl UpdateStatusIconFlags -_02313AE4: - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - add sp, sp, #0x10 - bx lr - .align 2, 0 -#ifdef JAPAN -#define BOOST_OFFENSIVE_STAT_OFFSET -0x2C0 -#else -#define BOOST_OFFENSIVE_STAT_OFFSET 0 -#endif -_02313AF0: .word 0x00000DCB + BOOST_OFFENSIVE_STAT_OFFSET -_02313AF4: .word 0x00000DCA + BOOST_OFFENSIVE_STAT_OFFSET -_02313AF8: .word 0x00000DCD + BOOST_OFFENSIVE_STAT_OFFSET -_02313AFC: .word 0x00000DCC + BOOST_OFFENSIVE_STAT_OFFSET -_02313B00: .word 0x00000D8F + BOOST_OFFENSIVE_STAT_OFFSET -_02313B04: .word 0x00000DD8 + BOOST_OFFENSIVE_STAT_OFFSET - arm_func_end BoostOffensiveStat - ; https://decomp.me/scratch/90P8f arm_func_start BoostDefensiveStat BoostDefensiveStat: ; 0x02313B08 diff --git a/include/overlay_29_02313814.h b/include/overlay_29_02313814.h index 88cc65c5..c0428aac 100644 --- a/include/overlay_29_02313814.h +++ b/include/overlay_29_02313814.h @@ -13,5 +13,6 @@ struct StatIndex void LowerOffensiveStat(struct entity *pokemon, struct entity *target, struct StatIndex stat, s32 nStagesRaw, bool8 checkProtected, bool8 logMsgProtected); void LowerDefensiveStat(struct entity *pokemon, struct entity *target, struct StatIndex stat, s32 increment, bool8 checkProtected, bool8 logMsgProtected); +void BoostOffensiveStat(struct entity *pokemon, struct entity *target, struct StatIndex stat, s32 nStagesRaw); #endif //PMDSKY_OVERLAY_29_02313814_H diff --git a/main.lsf b/main.lsf index f02889f0..60b6625b 100644 --- a/main.lsf +++ b/main.lsf @@ -542,7 +542,7 @@ Overlay OVY_29 Object src/overlay_29_02311BF8.o Object asm/overlay_29_02311C28.o Object src/overlay_29_02313814.o - Object asm/overlay_29_0231399C.o + Object asm/overlay_29_02313B08.o Object src/move_orb_effects.o Object asm/overlay_29_02313CE4.o Object src/overlay_29_023147EC.o diff --git a/src/overlay_29_02313814.c b/src/overlay_29_02313814.c index b2c10a90..be30a9d8 100644 --- a/src/overlay_29_02313814.c +++ b/src/overlay_29_02313814.c @@ -9,6 +9,7 @@ extern void CopyStringFromId(u8* buf, u32 string_id); extern void SetMessageLogPreprocessorArgsString(u32 a, u8 *buf); extern bool8 IsProtectedFromStatDrops(struct entity *user, struct entity *target, bool8 logMsg); extern void SubstitutePlaceholderStringTags(int a, struct entity *entity, u32 param_3); +extern void ov29_022E4E74(struct entity *pokemon, struct StatIndex); extern void ov29_022E4DCC(struct entity *pokemon, struct StatIndex); extern void ov29_022E4D28(struct entity *pokemon, struct StatIndex); extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); @@ -31,7 +32,7 @@ void LowerOffensiveStat(struct entity *pokemon, struct entity *target, struct St if (!EntityIsValid__023118B4(target)) return; - if (stat.id != 0) { + if (stat.id != STAT_INDEX_PHYSICAL) { CopyStringFromId(buffer1, 0xdcb + JPN_MSG_OFFSET); SetMessageLogPreprocessorArgsString(1, buffer1); } @@ -104,7 +105,7 @@ void LowerDefensiveStat(struct entity *pokemon, struct entity *target, struct St if (!EntityIsValid__023118B4(target)) return; - if (stat.id != 0) { + if (stat.id != STAT_INDEX_PHYSICAL) { CopyStringFromId(buffer1, 0xdc9 + JPN_MSG_OFFSET); SetMessageLogPreprocessorArgsString(1, buffer1); } @@ -149,3 +150,54 @@ void LowerDefensiveStat(struct entity *pokemon, struct entity *target, struct St } UpdateStatusIconFlags(target); } + +void BoostOffensiveStat(struct entity *pokemon, struct entity *target, struct StatIndex stat, s32 nStagesRaw) +{ + struct monster *entityInfo; + u8 *buffer1 = AllocateTemp1024ByteBufferFromPool(); + u8 *buffer2 = AllocateTemp1024ByteBufferFromPool(); + s16 nStages = nStagesRaw; + s32 newStage; + + if (!EntityIsValid__023118B4(target)) + return; + + entityInfo = GetEntInfo(target); + SubstitutePlaceholderStringTags(0,target,0); + ov29_022E4E74(target,stat); + if (stat.id != STAT_INDEX_PHYSICAL) { + CopyStringFromId(buffer1, 0xdcb + JPN_MSG_OFFSET); + SetMessageLogPreprocessorArgsString(1, buffer1); + } + else { + CopyStringFromId(buffer1, 0xdca + JPN_MSG_OFFSET); + SetMessageLogPreprocessorArgsString(1, buffer1); + } + + if (AbilityIsActiveVeneer(target, ABILITY_SIMPLE)) + nStages *= 2; + + if (nStages == 1) { + CopyStringFromId(buffer2, 0xdcd + JPN_MSG_OFFSET); + SetMessageLogPreprocessorArgsString(2, buffer2); + } + else { + CopyStringFromId(buffer2, 0xdcc + JPN_MSG_OFFSET); + SetMessageLogPreprocessorArgsString(2, buffer2); + } + + newStage = entityInfo->stat_modifiers.offensive_stages[stat.id]; + newStage += nStages; + if (newStage >= MAX_STAT_STAGE) { + newStage = MAX_STAT_STAGE; + } + + if (entityInfo->stat_modifiers.offensive_stages[stat.id] != newStage) { + entityInfo->stat_modifiers.offensive_stages[stat.id] = newStage; + LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xd8f + JPN_MSG_OFFSET); + } + else { + LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xdd8 + JPN_MSG_OFFSET); + } + UpdateStatusIconFlags(target); +} From 06478b3266ded0c9d9bed321d6a7c05f63e4adab Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 31 Oct 2025 16:06:52 +0100 Subject: [PATCH 04/15] BoostDefensiveStat --- asm/include/overlay_29_02313B08.inc | 10 --- asm/overlay_29_02313B08.s | 113 ---------------------------- include/overlay_29_02313814.h | 7 +- main.lsf | 1 - src/overlay_29_02313814.c | 88 +++++++++++++++++----- 5 files changed, 74 insertions(+), 145 deletions(-) delete mode 100644 asm/include/overlay_29_02313B08.inc delete mode 100644 asm/overlay_29_02313B08.s diff --git a/asm/include/overlay_29_02313B08.inc b/asm/include/overlay_29_02313B08.inc deleted file mode 100644 index e0937690..00000000 --- a/asm/include/overlay_29_02313B08.inc +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once -.public AbilityIsActiveVeneer -.public AllocateTemp1024ByteBufferFromPool -.public CopyStringFromId -.public EntityIsValid__023118B4 -.public LogMessageByIdWithPopupCheckUserTarget -.public SetMessageLogPreprocessorArgsString -.public SubstitutePlaceholderStringTags -.public UpdateStatusIconFlags -.public ov29_022E4F1C diff --git a/asm/overlay_29_02313B08.s b/asm/overlay_29_02313B08.s deleted file mode 100644 index e463de77..00000000 --- a/asm/overlay_29_02313B08.s +++ /dev/null @@ -1,113 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_02313B08.inc" - - .text - -; https://decomp.me/scratch/90P8f - arm_func_start BoostDefensiveStat -BoostDefensiveStat: ; 0x02313B08 - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - mov r8, r1 - mov r6, r3 - mov sb, r0 - bl AllocateTemp1024ByteBufferFromPool - mov r4, r0 - bl AllocateTemp1024ByteBufferFromPool - mov r5, r0 - mov r1, r6, lsl #0x10 - mov r0, r8 - mov r6, r1, asr #0x10 - bl EntityIsValid__023118B4 - cmp r0, #0 - beq _02313C50 - mov r0, #0 - mov r1, r8 - mov r2, r0 - ldr r7, [r8, #0xb4] - bl SubstitutePlaceholderStringTags - add r1, sp, #0x28 - ldr r1, [r1] - mov r0, r8 - bl ov29_022E4F1C - ldr r0, [sp, #0x28] - cmp r0, #0 - beq _02313B90 - ldr r1, _02313C5C ; =0x00000DC9 - mov r0, r4 - bl CopyStringFromId - mov r1, r4 - mov r0, #1 - bl SetMessageLogPreprocessorArgsString - b _02313BA8 -_02313B90: - ldr r1, _02313C60 ; =0x00000DC8 - mov r0, r4 - bl CopyStringFromId - mov r1, r4 - mov r0, #1 - bl SetMessageLogPreprocessorArgsString -_02313BA8: - mov r0, r8 - mov r1, #0x61 - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r0, r6, lsl #0x11 - movne r6, r0, asr #0x10 - cmp r6, #1 - bne _02313BE4 - ldr r1, _02313C64 ; =0x00000DCD - mov r0, r5 - bl CopyStringFromId - mov r1, r5 - mov r0, #2 - bl SetMessageLogPreprocessorArgsString - b _02313BFC -_02313BE4: - ldr r1, _02313C68 ; =0x00000DCC - mov r0, r5 - bl CopyStringFromId - mov r1, r5 - mov r0, #2 - bl SetMessageLogPreprocessorArgsString -_02313BFC: - ldr r1, [sp, #0x28] - add r0, r7, r1, lsl #1 - ldrsh r0, [r0, #0x28] - add r4, r0, r6 - cmp r4, #0x14 - movge r4, #0x14 - cmp r4, r0 - beq _02313C38 - ldr r2, _02313C6C ; =0x00000D8E - add r3, r7, r1, lsl #1 - mov r0, sb - mov r1, r8 - strh r4, [r3, #0x28] - bl LogMessageByIdWithPopupCheckUserTarget - b _02313C48 -_02313C38: - ldr r2, _02313C70 ; =0x00000DD6 - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget -_02313C48: - mov r0, r8 - bl UpdateStatusIconFlags -_02313C50: - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - add sp, sp, #0x10 - bx lr - .align 2, 0 -#ifdef JAPAN -#define BOOST_DEFENSIVE_STAT_OFFSET -0x2C0 -#else -#define BOOST_DEFENSIVE_STAT_OFFSET 0 -#endif -_02313C5C: .word 0x00000DC9 + BOOST_DEFENSIVE_STAT_OFFSET -_02313C60: .word 0x00000DC8 + BOOST_DEFENSIVE_STAT_OFFSET -_02313C64: .word 0x00000DCD + BOOST_DEFENSIVE_STAT_OFFSET -_02313C68: .word 0x00000DCC + BOOST_DEFENSIVE_STAT_OFFSET -_02313C6C: .word 0x00000D8E + BOOST_DEFENSIVE_STAT_OFFSET -_02313C70: .word 0x00000DD6 + BOOST_DEFENSIVE_STAT_OFFSET - arm_func_end BoostDefensiveStat diff --git a/include/overlay_29_02313814.h b/include/overlay_29_02313814.h index c0428aac..bb6fc44f 100644 --- a/include/overlay_29_02313814.h +++ b/include/overlay_29_02313814.h @@ -11,8 +11,9 @@ struct StatIndex int id; }; -void LowerOffensiveStat(struct entity *pokemon, struct entity *target, struct StatIndex stat, s32 nStagesRaw, bool8 checkProtected, bool8 logMsgProtected); -void LowerDefensiveStat(struct entity *pokemon, struct entity *target, struct StatIndex stat, s32 increment, bool8 checkProtected, bool8 logMsgProtected); -void BoostOffensiveStat(struct entity *pokemon, struct entity *target, struct StatIndex stat, s32 nStagesRaw); +void LowerOffensiveStat(struct entity *user, struct entity *target, struct StatIndex stat, s32 nStagesRaw, bool8 checkProtected, bool8 logMsgProtected); +void LowerDefensiveStat(struct entity *user, struct entity *target, struct StatIndex stat, s32 increment, bool8 checkProtected, bool8 logMsgProtected); +void BoostOffensiveStat(struct entity *user, struct entity *target, struct StatIndex stat, s32 nStagesRaw); +void BoostDefensiveStat(struct entity *user, struct entity *target, struct StatIndex stat, s32 nStagesRaw); #endif //PMDSKY_OVERLAY_29_02313814_H diff --git a/main.lsf b/main.lsf index 60b6625b..b431e90f 100644 --- a/main.lsf +++ b/main.lsf @@ -542,7 +542,6 @@ Overlay OVY_29 Object src/overlay_29_02311BF8.o Object asm/overlay_29_02311C28.o Object src/overlay_29_02313814.o - Object asm/overlay_29_02313B08.o Object src/move_orb_effects.o Object asm/overlay_29_02313CE4.o Object src/overlay_29_023147EC.o diff --git a/src/overlay_29_02313814.c b/src/overlay_29_02313814.c index be30a9d8..ff046a9f 100644 --- a/src/overlay_29_02313814.c +++ b/src/overlay_29_02313814.c @@ -9,9 +9,10 @@ extern void CopyStringFromId(u8* buf, u32 string_id); extern void SetMessageLogPreprocessorArgsString(u32 a, u8 *buf); extern bool8 IsProtectedFromStatDrops(struct entity *user, struct entity *target, bool8 logMsg); extern void SubstitutePlaceholderStringTags(int a, struct entity *entity, u32 param_3); -extern void ov29_022E4E74(struct entity *pokemon, struct StatIndex); -extern void ov29_022E4DCC(struct entity *pokemon, struct StatIndex); -extern void ov29_022E4D28(struct entity *pokemon, struct StatIndex); +extern void ov29_022E4E74(struct entity *user, struct StatIndex); +extern void ov29_022E4DCC(struct entity *user, struct StatIndex); +extern void ov29_022E4F1C(struct entity *user, struct StatIndex); +extern void ov29_022E4D28(struct entity *user, struct StatIndex); extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern void UpdateStatusIconFlags(struct entity *); @@ -21,7 +22,7 @@ extern void UpdateStatusIconFlags(struct entity *); #define JPN_MSG_OFFSET 0 #endif // JAPAN -void LowerOffensiveStat(struct entity *pokemon, struct entity *target, struct StatIndex stat, s32 nStagesRaw, bool8 checkProtected, bool8 logMsgProtected) +void LowerOffensiveStat(struct entity *user, struct entity *target, struct StatIndex stat, s32 nStagesRaw, bool8 checkProtected, bool8 logMsgProtected) { struct monster *entityInfo; u8 *buffer1 = AllocateTemp1024ByteBufferFromPool(); @@ -42,22 +43,22 @@ void LowerOffensiveStat(struct entity *pokemon, struct entity *target, struct St } if (checkProtected) { - if (IsProtectedFromStatDrops(pokemon, target, logMsgProtected)) + if (IsProtectedFromStatDrops(user, target, logMsgProtected)) return; if (ItemIsActive__02311BF8(target, ITEM_TWIST_BAND)) { SubstitutePlaceholderStringTags(0,target,0); - LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xdb2 + JPN_MSG_OFFSET); + LogMessageByIdWithPopupCheckUserTarget(user,target,0xdb2 + JPN_MSG_OFFSET); return; } #ifdef JAPAN - if (DefenderAbilityIsActive__02311B94(pokemon, target, ABILITY_HYPER_CUTTER) && stat.id == STAT_INDEX_PHYSICAL) { + if (DefenderAbilityIsActive__02311B94(user, target, ABILITY_HYPER_CUTTER) && stat.id == STAT_INDEX_PHYSICAL) { #else - if (DefenderAbilityIsActive__02311B94(pokemon, target, ABILITY_HYPER_CUTTER, TRUE) && stat.id == STAT_INDEX_PHYSICAL) { + if (DefenderAbilityIsActive__02311B94(user, target, ABILITY_HYPER_CUTTER, TRUE) && stat.id == STAT_INDEX_PHYSICAL) { #endif SubstitutePlaceholderStringTags(0,target,0); - LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xd9e + JPN_MSG_OFFSET); + LogMessageByIdWithPopupCheckUserTarget(user,target,0xd9e + JPN_MSG_OFFSET); return; } } @@ -86,15 +87,15 @@ void LowerOffensiveStat(struct entity *pokemon, struct entity *target, struct St if (entityInfo->stat_modifiers.offensive_stages[stat.id] != newStage) { entityInfo->stat_modifiers.offensive_stages[stat.id] = newStage; - LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xd91 + JPN_MSG_OFFSET); + LogMessageByIdWithPopupCheckUserTarget(user,target,0xd91 + JPN_MSG_OFFSET); } else { - LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xdd9 + JPN_MSG_OFFSET); + LogMessageByIdWithPopupCheckUserTarget(user,target,0xdd9 + JPN_MSG_OFFSET); } UpdateStatusIconFlags(target); } -void LowerDefensiveStat(struct entity *pokemon, struct entity *target, struct StatIndex stat, s32 nStagesRaw, bool8 checkProtected, bool8 logMsgProtected) +void LowerDefensiveStat(struct entity *user, struct entity *target, struct StatIndex stat, s32 nStagesRaw, bool8 checkProtected, bool8 logMsgProtected) { struct monster *entityInfo; u8 *buffer1 = AllocateTemp1024ByteBufferFromPool(); @@ -115,7 +116,7 @@ void LowerDefensiveStat(struct entity *pokemon, struct entity *target, struct St } if (checkProtected) { - if (IsProtectedFromStatDrops(pokemon, target, logMsgProtected)) + if (IsProtectedFromStatDrops(user, target, logMsgProtected)) return; } @@ -143,15 +144,15 @@ void LowerDefensiveStat(struct entity *pokemon, struct entity *target, struct St if (entityInfo->stat_modifiers.defensive_stages[stat.id] != newStage) { entityInfo->stat_modifiers.defensive_stages[stat.id] = newStage; - LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xd90 + JPN_MSG_OFFSET); + LogMessageByIdWithPopupCheckUserTarget(user,target,0xd90 + JPN_MSG_OFFSET); } else { - LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xdd7 + JPN_MSG_OFFSET); + LogMessageByIdWithPopupCheckUserTarget(user,target,0xdd7 + JPN_MSG_OFFSET); } UpdateStatusIconFlags(target); } -void BoostOffensiveStat(struct entity *pokemon, struct entity *target, struct StatIndex stat, s32 nStagesRaw) +void BoostOffensiveStat(struct entity *user, struct entity *target, struct StatIndex stat, s32 nStagesRaw) { struct monster *entityInfo; u8 *buffer1 = AllocateTemp1024ByteBufferFromPool(); @@ -194,10 +195,61 @@ void BoostOffensiveStat(struct entity *pokemon, struct entity *target, struct St if (entityInfo->stat_modifiers.offensive_stages[stat.id] != newStage) { entityInfo->stat_modifiers.offensive_stages[stat.id] = newStage; - LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xd8f + JPN_MSG_OFFSET); + LogMessageByIdWithPopupCheckUserTarget(user,target,0xd8f + JPN_MSG_OFFSET); } else { - LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xdd8 + JPN_MSG_OFFSET); + LogMessageByIdWithPopupCheckUserTarget(user,target,0xdd8 + JPN_MSG_OFFSET); + } + UpdateStatusIconFlags(target); +} + +void BoostDefensiveStat(struct entity *user, struct entity *target, struct StatIndex stat, s32 nStagesRaw) +{ + struct monster *entityInfo; + u8 *buffer1 = AllocateTemp1024ByteBufferFromPool(); + u8 *buffer2 = AllocateTemp1024ByteBufferFromPool(); + s16 nStages = nStagesRaw; + s32 newStage; + + if (!EntityIsValid__023118B4(target)) + return; + + entityInfo = GetEntInfo(target); + SubstitutePlaceholderStringTags(0,target,0); + ov29_022E4F1C(target,stat); + if (stat.id != STAT_INDEX_PHYSICAL) { + CopyStringFromId(buffer1, 0xdc9 + JPN_MSG_OFFSET); + SetMessageLogPreprocessorArgsString(1, buffer1); + } + else { + CopyStringFromId(buffer1, 0xdc8 + JPN_MSG_OFFSET); + SetMessageLogPreprocessorArgsString(1, buffer1); + } + + if (AbilityIsActiveVeneer(target, ABILITY_SIMPLE)) + nStages *= 2; + + if (nStages == 1) { + CopyStringFromId(buffer2, 0xdcd + JPN_MSG_OFFSET); + SetMessageLogPreprocessorArgsString(2, buffer2); + } + else { + CopyStringFromId(buffer2, 0xdcc + JPN_MSG_OFFSET); + SetMessageLogPreprocessorArgsString(2, buffer2); + } + + newStage = entityInfo->stat_modifiers.defensive_stages[stat.id]; + newStage += nStages; + if (newStage >= MAX_STAT_STAGE) { + newStage = MAX_STAT_STAGE; + } + + if (entityInfo->stat_modifiers.defensive_stages[stat.id] != newStage) { + entityInfo->stat_modifiers.defensive_stages[stat.id] = newStage; + LogMessageByIdWithPopupCheckUserTarget(user,target,0xd8e + JPN_MSG_OFFSET); + } + else { + LogMessageByIdWithPopupCheckUserTarget(user,target,0xdd6 + JPN_MSG_OFFSET); } UpdateStatusIconFlags(target); } From dcb463cd541b762bd74eee66035a5d6235789baf Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 3 Nov 2025 11:06:57 +0100 Subject: [PATCH 05/15] remove move orb effects file --- include/move_orb_effects.h | 16 ---------------- include/overlay_29_02313814.h | 11 +++++++++++ main.lsf | 1 - src/overlay_29_02313814.c | 21 +++++++++++++++++++++ 4 files changed, 32 insertions(+), 17 deletions(-) delete mode 100644 include/move_orb_effects.h diff --git a/include/move_orb_effects.h b/include/move_orb_effects.h deleted file mode 100644 index 39fb09e2..00000000 --- a/include/move_orb_effects.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef PMDSKY_MOVE_ORB_EFFECTS_H -#define PMDSKY_MOVE_ORB_EFFECTS_H - -#include "dungeon_mode.h" - -enum flash_fire_status { - FLASH_FIRE_STATUS_NONE = 0, - FLASH_FIRE_STATUS_MAXED = 1, - FLASH_FIRE_STATUS_NOT_MAXED = 2 -}; - -// Checks whether Flash Fire should activate, assuming the defender is being hit by a Fire-type move. -// This checks that the defender is valid and Flash Fire is active, and that Normalize isn't active on the attacker. -enum flash_fire_status FlashFireShouldActivate(struct entity *attacker, struct entity *defender); - -#endif //PMDSKY_MOVE_ORB_EFFECTS_H diff --git a/include/overlay_29_02313814.h b/include/overlay_29_02313814.h index bb6fc44f..9b793560 100644 --- a/include/overlay_29_02313814.h +++ b/include/overlay_29_02313814.h @@ -1,6 +1,14 @@ #ifndef PMDSKY_OVERLAY_29_02313814_H #define PMDSKY_OVERLAY_29_02313814_H +#include "dungeon_mode.h" + +enum flash_fire_status { + FLASH_FIRE_STATUS_NONE = 0, + FLASH_FIRE_STATUS_MAXED = 1, + FLASH_FIRE_STATUS_NOT_MAXED = 2 +}; + #define STAT_INDEX_PHYSICAL 0 // Atk, Def #define STAT_INDEX_SPECIAL 1 // Sp Atk, Sp Def #define STAT_INDEX_ACCURACY STAT_INDEX_PHYSICAL @@ -15,5 +23,8 @@ void LowerOffensiveStat(struct entity *user, struct entity *target, struct StatI void LowerDefensiveStat(struct entity *user, struct entity *target, struct StatIndex stat, s32 increment, bool8 checkProtected, bool8 logMsgProtected); void BoostOffensiveStat(struct entity *user, struct entity *target, struct StatIndex stat, s32 nStagesRaw); void BoostDefensiveStat(struct entity *user, struct entity *target, struct StatIndex stat, s32 nStagesRaw); +// Checks whether Flash Fire should activate, assuming the defender is being hit by a Fire-type move. +// This checks that the defender is valid and Flash Fire is active, and that Normalize isn't active on the attacker. +enum flash_fire_status FlashFireShouldActivate(struct entity *attacker, struct entity *defender); #endif //PMDSKY_OVERLAY_29_02313814_H diff --git a/main.lsf b/main.lsf index b431e90f..360f7351 100644 --- a/main.lsf +++ b/main.lsf @@ -542,7 +542,6 @@ Overlay OVY_29 Object src/overlay_29_02311BF8.o Object asm/overlay_29_02311C28.o Object src/overlay_29_02313814.o - Object src/move_orb_effects.o Object asm/overlay_29_02313CE4.o Object src/overlay_29_023147EC.o Object asm/overlay_29_02314810.o diff --git a/src/overlay_29_02313814.c b/src/overlay_29_02313814.c index ff046a9f..9ac9a6c6 100644 --- a/src/overlay_29_02313814.c +++ b/src/overlay_29_02313814.c @@ -253,3 +253,24 @@ void BoostDefensiveStat(struct entity *user, struct entity *target, struct StatI } UpdateStatusIconFlags(target); } + +enum flash_fire_status FlashFireShouldActivate(struct entity *attacker, struct entity *defender) +{ + if (!EntityIsValid__023118B4(defender)) + return FLASH_FIRE_STATUS_NONE; + + if (AbilityIsActiveVeneer(attacker, ABILITY_NORMALIZE)) + return FLASH_FIRE_STATUS_NONE; + +#ifdef JAPAN + if (!DefenderAbilityIsActive__02311B94(attacker, defender, ABILITY_FLASH_FIRE)) +#else + if (!DefenderAbilityIsActive__02311B94(attacker, defender, ABILITY_FLASH_FIRE, TRUE)) +#endif + return FLASH_FIRE_STATUS_NONE; + + if (GetEntInfo(defender)->stat_modifiers.flash_fire_boost >= 2) + return FLASH_FIRE_STATUS_MAXED; + + return FLASH_FIRE_STATUS_NOT_MAXED; +} From 679e10b0a95cc5ff5073325fa31ae9abc23095ad Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 3 Nov 2025 11:38:35 +0100 Subject: [PATCH 06/15] ActivateFlashFire --- asm/include/overlay_29_0230AD04.inc | 2 +- asm/include/overlay_29_0230BBAC.inc | 2 +- asm/include/overlay_29_02325644.inc | 2 +- asm/overlay_29_0230AD04.s | 2 +- asm/overlay_29_0230BBAC.s | 2 +- asm/overlay_29_02313CE4.s | 27 --------------------------- asm/overlay_29_02325644.s | 2 +- include/overlay_29_02313814.h | 3 ++- src/dungeon_damage.c | 4 ++-- src/move_orb_effects.c | 26 -------------------------- src/overlay_29_02313814.c | 22 +++++++++++++++++++++- 11 files changed, 31 insertions(+), 63 deletions(-) delete mode 100644 src/move_orb_effects.c diff --git a/asm/include/overlay_29_0230AD04.inc b/asm/include/overlay_29_0230AD04.inc index b2ccddb8..190bdd97 100644 --- a/asm/include/overlay_29_0230AD04.inc +++ b/asm/include/overlay_29_0230AD04.inc @@ -11,7 +11,7 @@ .public ExclusiveItemEffectIsActive__0230A9B8 .public FixedPoint32To64 .public FixedPoint64IsZero -.public FlashFireShouldActivate +.public GetFlashFireStatus .public GetApparentWeather .public GetTypeMatchup .public GhostImmunityIsActive diff --git a/asm/include/overlay_29_0230BBAC.inc b/asm/include/overlay_29_0230BBAC.inc index 9ef5a2ab..8b19023c 100644 --- a/asm/include/overlay_29_0230BBAC.inc +++ b/asm/include/overlay_29_0230BBAC.inc @@ -39,7 +39,7 @@ .public FixedPoint64CmpLt .public FixedPoint64ToInt .public FixedRoomIsSubstituteRoom -.public FlashFireShouldActivate +.public GetFlashFireStatus .public GendersEqualNotGenderless .public GendersNotEqualNotGenderless .public GenerateStandardItem diff --git a/asm/include/overlay_29_02325644.inc b/asm/include/overlay_29_02325644.inc index 4c9615c7..669df375 100644 --- a/asm/include/overlay_29_02325644.inc +++ b/asm/include/overlay_29_02325644.inc @@ -35,7 +35,7 @@ .public FACADE_DAMAGE_MULTIPLIER .public FLAME_WHEEL_BURN_CHANCE .public FLAMETHROWER_BURN_CHANCE -.public FlashFireShouldActivate +.public GetFlashFireStatus .public FOCUS_PUNCH_DAMAGE_MULTIPLIER .public FormatMoveStringMore .public GetApparentWeather diff --git a/asm/overlay_29_0230AD04.s b/asm/overlay_29_0230AD04.s index 19702152..efba6e62 100644 --- a/asm/overlay_29_0230AD04.s +++ b/asm/overlay_29_0230AD04.s @@ -308,7 +308,7 @@ _0230B14C: bne _0230B198 mov r0, sl mov r1, sb - bl FlashFireShouldActivate + bl GetFlashFireStatus cmp r0, #0 beq _0230B198 ldr r1, _0230B798 ; =DUNGEON_PTR diff --git a/asm/overlay_29_0230BBAC.s b/asm/overlay_29_0230BBAC.s index 0e17ae4b..c72dc8a9 100644 --- a/asm/overlay_29_0230BBAC.s +++ b/asm/overlay_29_0230BBAC.s @@ -1132,7 +1132,7 @@ _0230CB78: bne _0230CC78 mov r0, sl mov r1, sb - bl FlashFireShouldActivate + bl GetFlashFireStatus movs r4, r0 beq _0230CC78 ldrb r0, [r7, #0x15c + CALC_DAMAGE_OFFSET] diff --git a/asm/overlay_29_02313CE4.s b/asm/overlay_29_02313CE4.s index 6f927cb5..1fb2870c 100644 --- a/asm/overlay_29_02313CE4.s +++ b/asm/overlay_29_02313CE4.s @@ -3,33 +3,6 @@ .text - arm_func_start ActivateFlashFire -ActivateFlashFire: ; 0x02313CE4 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r1 - mov r0, r5 - bl EntityIsValid__023118B4 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, #0 - ldr r4, [r5, #0xb4] - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldrsh r0, [r4, #0x30] - add r1, r0, #1 - cmp r1, #2 - movge r1, #2 - cmp r0, r1 - beq _02313D34 - mov r0, r5 - strh r1, [r4, #0x30] - bl ov29_022E4338 -_02313D34: - mov r0, r5 - bl UpdateStatusIconFlags - ldmia sp!, {r3, r4, r5, pc} - arm_func_end ActivateFlashFire arm_func_start ApplyOffensiveStatMultiplier ApplyOffensiveStatMultiplier: ; 0x02313D40 diff --git a/asm/overlay_29_02325644.s b/asm/overlay_29_02325644.s index 4a462a3e..83de1a89 100644 --- a/asm/overlay_29_02325644.s +++ b/asm/overlay_29_02325644.s @@ -1710,7 +1710,7 @@ DoMoveWillOWisp: ; 0x02326B24 sub sp, sp, #4 mov r6, r0 mov r5, r1 - bl FlashFireShouldActivate + bl GetFlashFireStatus movs r4, r0 beq _02326B94 ldr r3, [r5, #0xb4] diff --git a/include/overlay_29_02313814.h b/include/overlay_29_02313814.h index 9b793560..151b381a 100644 --- a/include/overlay_29_02313814.h +++ b/include/overlay_29_02313814.h @@ -25,6 +25,7 @@ void BoostOffensiveStat(struct entity *user, struct entity *target, struct StatI void BoostDefensiveStat(struct entity *user, struct entity *target, struct StatIndex stat, s32 nStagesRaw); // Checks whether Flash Fire should activate, assuming the defender is being hit by a Fire-type move. // This checks that the defender is valid and Flash Fire is active, and that Normalize isn't active on the attacker. -enum flash_fire_status FlashFireShouldActivate(struct entity *attacker, struct entity *defender); +enum flash_fire_status GetFlashFireStatus(struct entity *attacker, struct entity *defender); +void ActivateFlashFire(struct entity *pokemon, struct entity *target); #endif //PMDSKY_OVERLAY_29_02313814_H diff --git a/src/dungeon_damage.c b/src/dungeon_damage.c index 5d072205..a3074c83 100644 --- a/src/dungeon_damage.c +++ b/src/dungeon_damage.c @@ -2,7 +2,7 @@ #include "dungeon_logic_3.h" #include "dungeon_pokemon_attributes.h" #include "dungeon_util_static.h" -#include "move_orb_effects.h" +#include "overlay_29_02313814.h" #include "overlay_29_02308FBC.h" #include "overlay_29_0230A994.h" #include "overlay_29_0230AB58.h" @@ -28,7 +28,7 @@ s32 WeightWeakTypePicker(struct entity *user, struct entity *target, enum type_i if (move_type == TYPE_NORMAL || move_type == TYPE_FIGHTING) check_exposed = TRUE; - if (move_type == TYPE_FIRE && FlashFireShouldActivate(user, target) != FLASH_FIRE_STATUS_NONE) + if (move_type == TYPE_FIRE && GetFlashFireStatus(user, target) != FLASH_FIRE_STATUS_NONE) return 0; #ifdef JAPAN diff --git a/src/move_orb_effects.c b/src/move_orb_effects.c deleted file mode 100644 index 146d110f..00000000 --- a/src/move_orb_effects.c +++ /dev/null @@ -1,26 +0,0 @@ -#include "move_orb_effects.h" -#include "dungeon_pokemon_attributes.h" -#include "dungeon_util_static.h" -#include "overlay_29_023118B4.h" -#include "overlay_29_02311BF8.h" - -enum flash_fire_status FlashFireShouldActivate(struct entity *attacker, struct entity *defender) -{ - if (!EntityIsValid__023118B4(defender)) - return FLASH_FIRE_STATUS_NONE; - - if (AbilityIsActiveVeneer(attacker, ABILITY_NORMALIZE)) - return FLASH_FIRE_STATUS_NONE; - -#ifdef JAPAN - if (!DefenderAbilityIsActive__02311B94(attacker, defender, ABILITY_FLASH_FIRE)) -#else - if (!DefenderAbilityIsActive__02311B94(attacker, defender, ABILITY_FLASH_FIRE, TRUE)) -#endif - return FLASH_FIRE_STATUS_NONE; - - if (GetEntInfo(defender)->stat_modifiers.flash_fire_boost >= 2) - return FLASH_FIRE_STATUS_MAXED; - - return FLASH_FIRE_STATUS_NOT_MAXED; -} diff --git a/src/overlay_29_02313814.c b/src/overlay_29_02313814.c index 9ac9a6c6..2b3a3269 100644 --- a/src/overlay_29_02313814.c +++ b/src/overlay_29_02313814.c @@ -15,6 +15,7 @@ extern void ov29_022E4F1C(struct entity *user, struct StatIndex); extern void ov29_022E4D28(struct entity *user, struct StatIndex); extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern void UpdateStatusIconFlags(struct entity *); +extern void ov29_022E4338(struct entity *); #ifdef JAPAN #define JPN_MSG_OFFSET -0x2C0 @@ -254,7 +255,7 @@ void BoostDefensiveStat(struct entity *user, struct entity *target, struct StatI UpdateStatusIconFlags(target); } -enum flash_fire_status FlashFireShouldActivate(struct entity *attacker, struct entity *defender) +enum flash_fire_status GetFlashFireStatus(struct entity *attacker, struct entity *defender) { if (!EntityIsValid__023118B4(defender)) return FLASH_FIRE_STATUS_NONE; @@ -274,3 +275,22 @@ enum flash_fire_status FlashFireShouldActivate(struct entity *attacker, struct e return FLASH_FIRE_STATUS_NOT_MAXED; } + +void ActivateFlashFire(struct entity *pokemon, struct entity *target) +{ + s32 flashFireBoost; + + if (EntityIsValid__023118B4(target)) { + struct monster * entityInfo = GetEntInfo(target); + SubstitutePlaceholderStringTags(0,target,0); + flashFireBoost = entityInfo->stat_modifiers.flash_fire_boost; + if (++flashFireBoost >= 2) { + flashFireBoost = 2; + } + if (entityInfo->stat_modifiers.flash_fire_boost != flashFireBoost) { + entityInfo->stat_modifiers.flash_fire_boost = flashFireBoost; + ov29_022E4338(target); + } + UpdateStatusIconFlags(target); + } +} From 8e794e3a26177ece14ee9dae2d161d40631d4800 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 3 Nov 2025 11:47:29 +0100 Subject: [PATCH 07/15] some renames --- asm/overlay_29_022E37DC.s | 24 ++++++++++++------------ src/overlay_29_02313814.c | 16 ++++++++-------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/asm/overlay_29_022E37DC.s b/asm/overlay_29_022E37DC.s index babce157..3f23224d 100644 --- a/asm/overlay_29_022E37DC.s +++ b/asm/overlay_29_022E37DC.s @@ -1825,8 +1825,8 @@ ov29_022E4D24: ; 0x022E4D24 bx lr arm_func_end ov29_022E4D24 - arm_func_start ov29_022E4D28 -ov29_022E4D28: ; 0x022E4D28 + arm_func_start PlayOffensiveStatDownEffect +PlayOffensiveStatDownEffect: ; 0x022E4D28 stmdb sp!, {r0, r1, r2, r3} stmdb sp!, {r4, lr} sub sp, sp, #0x10 @@ -1871,10 +1871,10 @@ _022E4DB8: bx lr .align 2, 0 _022E4DC8: .word 0x00000193 - arm_func_end ov29_022E4D28 + arm_func_end PlayOffensiveStatDownEffect - arm_func_start ov29_022E4DCC -ov29_022E4DCC: ; 0x022E4DCC + arm_func_start PlayDefensiveStatDownEffect +PlayDefensiveStatDownEffect: ; 0x022E4DCC stmdb sp!, {r0, r1, r2, r3} stmdb sp!, {r4, lr} sub sp, sp, #0x10 @@ -1920,10 +1920,10 @@ _022E4E5C: .align 2, 0 _022E4E6C: .word 0x0000018F _022E4E70: .word 0x00000191 - arm_func_end ov29_022E4DCC + arm_func_end PlayDefensiveStatDownEffect - arm_func_start ov29_022E4E74 -ov29_022E4E74: ; 0x022E4E74 + arm_func_start PlayOffensiveStatUpEffect +PlayOffensiveStatUpEffect: ; 0x022E4E74 stmdb sp!, {r0, r1, r2, r3} stmdb sp!, {r4, lr} sub sp, sp, #0x10 @@ -1969,10 +1969,10 @@ _022E4F04: .align 2, 0 _022E4F14: .word 0x000001A9 _022E4F18: .word 0x00000192 - arm_func_end ov29_022E4E74 + arm_func_end PlayOffensiveStatUpEffect - arm_func_start ov29_022E4F1C -ov29_022E4F1C: ; 0x022E4F1C + arm_func_start PlayDefensiveStatUpEffect +PlayDefensiveStatUpEffect: ; 0x022E4F1C stmdb sp!, {r0, r1, r2, r3} stmdb sp!, {r4, lr} sub sp, sp, #0x10 @@ -2017,7 +2017,7 @@ _022E4FAC: bx lr .align 2, 0 _022E4FBC: .word 0x0000018E - arm_func_end ov29_022E4F1C + arm_func_end PlayDefensiveStatUpEffect arm_func_start ov29_022E4FC0 ov29_022E4FC0: ; 0x022E4FC0 diff --git a/src/overlay_29_02313814.c b/src/overlay_29_02313814.c index 2b3a3269..8214e794 100644 --- a/src/overlay_29_02313814.c +++ b/src/overlay_29_02313814.c @@ -9,10 +9,10 @@ extern void CopyStringFromId(u8* buf, u32 string_id); extern void SetMessageLogPreprocessorArgsString(u32 a, u8 *buf); extern bool8 IsProtectedFromStatDrops(struct entity *user, struct entity *target, bool8 logMsg); extern void SubstitutePlaceholderStringTags(int a, struct entity *entity, u32 param_3); -extern void ov29_022E4E74(struct entity *user, struct StatIndex); -extern void ov29_022E4DCC(struct entity *user, struct StatIndex); -extern void ov29_022E4F1C(struct entity *user, struct StatIndex); -extern void ov29_022E4D28(struct entity *user, struct StatIndex); +extern void PlayOffensiveStatUpEffect(struct entity *user, struct StatIndex); +extern void PlayDefensiveStatDownEffect(struct entity *user, struct StatIndex); +extern void PlayDefensiveStatUpEffect(struct entity *user, struct StatIndex); +extern void PlayOffensiveStatDownEffect(struct entity *user, struct StatIndex); extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern void UpdateStatusIconFlags(struct entity *); extern void ov29_022E4338(struct entity *); @@ -66,7 +66,7 @@ void LowerOffensiveStat(struct entity *user, struct entity *target, struct StatI entityInfo = GetEntInfo(target); SubstitutePlaceholderStringTags(0,target,0); - ov29_022E4D28(target,stat); + PlayOffensiveStatDownEffect(target,stat); if (AbilityIsActiveVeneer(target, ABILITY_SIMPLE)) nStages *= 2; @@ -123,7 +123,7 @@ void LowerDefensiveStat(struct entity *user, struct entity *target, struct StatI entityInfo = GetEntInfo(target); SubstitutePlaceholderStringTags(0,target,0); - ov29_022E4DCC(target,stat); + PlayDefensiveStatDownEffect(target,stat); if (AbilityIsActiveVeneer(target, ABILITY_SIMPLE)) nStages *= 2; @@ -166,7 +166,7 @@ void BoostOffensiveStat(struct entity *user, struct entity *target, struct StatI entityInfo = GetEntInfo(target); SubstitutePlaceholderStringTags(0,target,0); - ov29_022E4E74(target,stat); + PlayOffensiveStatUpEffect(target,stat); if (stat.id != STAT_INDEX_PHYSICAL) { CopyStringFromId(buffer1, 0xdcb + JPN_MSG_OFFSET); SetMessageLogPreprocessorArgsString(1, buffer1); @@ -217,7 +217,7 @@ void BoostDefensiveStat(struct entity *user, struct entity *target, struct StatI entityInfo = GetEntInfo(target); SubstitutePlaceholderStringTags(0,target,0); - ov29_022E4F1C(target,stat); + PlayDefensiveStatUpEffect(target,stat); if (stat.id != STAT_INDEX_PHYSICAL) { CopyStringFromId(buffer1, 0xdc9 + JPN_MSG_OFFSET); SetMessageLogPreprocessorArgsString(1, buffer1); From 16a1651ef5ee738dc3a3bfd91c244e1499762540 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 3 Nov 2025 12:42:54 +0100 Subject: [PATCH 08/15] ApplyOffensiveStatMultiplier --- asm/overlay_29_02313CE4.s | 160 +--------------------------------- include/math.h | 8 +- include/overlay_29_02313814.h | 2 + src/overlay_29_02313814.c | 78 +++++++++++++++++ 4 files changed, 88 insertions(+), 160 deletions(-) diff --git a/asm/overlay_29_02313CE4.s b/asm/overlay_29_02313CE4.s index 1fb2870c..dcf84b70 100644 --- a/asm/overlay_29_02313CE4.s +++ b/asm/overlay_29_02313CE4.s @@ -4,165 +4,7 @@ .text - arm_func_start ApplyOffensiveStatMultiplier -ApplyOffensiveStatMultiplier: ; 0x02313D40 -#ifdef JAPAN -#define APPLY_OFFENSIVE_STAT_MULTIPLIER_OFFSET -0x2C0 -#else -#define APPLY_OFFENSIVE_STAT_MULTIPLIER_OFFSET 0 -#endif - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - mov r8, r1 - mov sb, r0 - mov r7, r3 - bl AllocateTemp1024ByteBufferFromPool - mov r4, r0 - mov r0, r8 - bl EntityIsValid__023118B4 - cmp r0, #0 - beq _02313F3C - ldr r0, [sp, #0x28] - cmp r0, #0 - beq _02313D94 - ldr r1, _02313F48 ; =0x00000DCB - mov r0, r4 - bl CopyStringFromId - mov r1, r4 - mov r0, #1 - bl SetMessageLogPreprocessorArgsString - b _02313DAC -_02313D94: - ldr r1, _02313F4C ; =0x00000DCA - mov r0, r4 - bl CopyStringFromId - mov r1, r4 - mov r0, #1 - bl SetMessageLogPreprocessorArgsString -_02313DAC: - cmp r7, #0x100 - bge _02313DCC - ldrb r2, [sp, #0x30] - mov r0, sb - mov r1, r8 - bl IsProtectedFromStatDrops - cmp r0, #0 - bne _02313F3C -_02313DCC: - mov r0, r8 - mov r1, #0x12 - bl ItemIsActive__02311BF8 - cmp r0, #0 - beq _02313E0C - cmp r7, #0x100 - bge _02313E0C - mov r0, #0 - mov r1, r8 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _02313F50 ; =0x00000DB2 - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget - b _02313F3C -_02313E0C: - mov r0, sb - mov r1, r8 - mov r2, #9 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__02311B94 - cmp r0, #0 - beq _02313E6C - ldr r0, [sp, #0x28] - cmp r0, #0 - bne _02313E6C - cmp r7, #0x100 - bge _02313E6C - ldrb r0, [sp, #0x30] - cmp r0, #0 - beq _02313F3C - mov r0, #0 - mov r1, r8 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _02313F54 ; =0x00000D9E - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget - b _02313F3C -_02313E6C: - mov r0, #0 - mov r1, r8 - mov r2, r0 - ldr r5, [r8, #0xb4] - bl SubstitutePlaceholderStringTags - ldr r6, [sp, #0x28] - cmp r7, #0x100 - add r0, r5, r6, lsl #2 - ldr r4, [r0, #0x34] - add r1, sp, #0x28 - mov r0, r8 - bge _02313EA8 - ldr r1, [r1] - bl ov29_022E5068 - b _02313EB0 -_02313EA8: - ldr r1, [r1] - bl ov29_022E4FC0 -_02313EB0: - add r0, r5, r6, lsl #2 - ldr r0, [r0, #0x34] - mov r1, r7 - bl MultiplyByFixedPoint - add r1, r5, r6, lsl #2 - str r0, [r1, #0x34] - cmp r0, #2 - movlt r0, #2 - strlt r0, [r1, #0x34] - add r2, r5, r6, lsl #2 - ldr r1, [r2, #0x34] - ldr r0, _02313F58 ; =0x000063FD - cmp r1, r0 - strgt r0, [r2, #0x34] - add r0, r5, r6, lsl #2 - ldr r0, [r0, #0x34] - cmp r4, r0 - ble _02313F0C - ldr r2, _02313F5C ; =0x00000DD1 - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget - b _02313F34 -_02313F0C: - bge _02313F24 - mov r0, sb - mov r1, r8 - mov r2, #0xdd0 + APPLY_OFFENSIVE_STAT_MULTIPLIER_OFFSET - bl LogMessageByIdWithPopupCheckUserTarget - b _02313F34 -_02313F24: - ldr r2, _02313F60 ; =0x00000DD3 - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget -_02313F34: - mov r0, r8 - bl UpdateStatusIconFlags -_02313F3C: - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - add sp, sp, #0x10 - bx lr - .align 2, 0 -_02313F48: .word 0x00000DCB + APPLY_OFFENSIVE_STAT_MULTIPLIER_OFFSET -_02313F4C: .word 0x00000DCA + APPLY_OFFENSIVE_STAT_MULTIPLIER_OFFSET -_02313F50: .word 0x00000DB2 + APPLY_OFFENSIVE_STAT_MULTIPLIER_OFFSET -_02313F54: .word 0x00000D9E + APPLY_OFFENSIVE_STAT_MULTIPLIER_OFFSET -_02313F58: .word 0x000063FD -_02313F5C: .word 0x00000DD1 + APPLY_OFFENSIVE_STAT_MULTIPLIER_OFFSET -_02313F60: .word 0x00000DD3 + APPLY_OFFENSIVE_STAT_MULTIPLIER_OFFSET - arm_func_end ApplyOffensiveStatMultiplier + arm_func_start ApplyDefensiveStatMultiplier ApplyDefensiveStatMultiplier: ; 0x02313F64 diff --git a/include/math.h b/include/math.h index ee4c3881..d6b9161e 100644 --- a/include/math.h +++ b/include/math.h @@ -7,5 +7,11 @@ #define F248LessThanFloat(x, y) (x < (int)(y * 0x100)) #define F248LessThanInt(x, y) (x < 0x100 * y) +#define FloatToF248(x) (x * 0x100) +#define FloatLessThanF248(x, y) ((int)(x * 0x100) < y) +#define F248LessThan(x, y) (x < y) +#define F248GreaterThan(x, y) (x > y) +#define F248Equal(x, y) (x == y) +#define F248EqualsInt(x, y) (x == 0x100 * y) -#endif //PMDSKY_MATH_H \ No newline at end of file +#endif // PMDSKY_MATH_H diff --git a/include/overlay_29_02313814.h b/include/overlay_29_02313814.h index 151b381a..391f286d 100644 --- a/include/overlay_29_02313814.h +++ b/include/overlay_29_02313814.h @@ -1,6 +1,7 @@ #ifndef PMDSKY_OVERLAY_29_02313814_H #define PMDSKY_OVERLAY_29_02313814_H +#include "util.h" #include "dungeon_mode.h" enum flash_fire_status { @@ -27,5 +28,6 @@ void BoostDefensiveStat(struct entity *user, struct entity *target, struct StatI // This checks that the defender is valid and Flash Fire is active, and that Normalize isn't active on the attacker. enum flash_fire_status GetFlashFireStatus(struct entity *attacker, struct entity *defender); void ActivateFlashFire(struct entity *pokemon, struct entity *target); +void ApplyOffensiveStatMultiplier(struct entity *user, struct entity *target, struct StatIndex stat, fx32_8 multiplier, bool8 displayMessage); #endif //PMDSKY_OVERLAY_29_02313814_H diff --git a/src/overlay_29_02313814.c b/src/overlay_29_02313814.c index 8214e794..dc901dbd 100644 --- a/src/overlay_29_02313814.c +++ b/src/overlay_29_02313814.c @@ -3,6 +3,7 @@ #include "overlay_29_023118B4.h" #include "overlay_29_02313814.h" #include "overlay_29_02311BF8.h" +#include "math.h" extern u8* AllocateTemp1024ByteBufferFromPool(void); extern void CopyStringFromId(u8* buf, u32 string_id); @@ -13,9 +14,12 @@ extern void PlayOffensiveStatUpEffect(struct entity *user, struct StatIndex); extern void PlayDefensiveStatDownEffect(struct entity *user, struct StatIndex); extern void PlayDefensiveStatUpEffect(struct entity *user, struct StatIndex); extern void PlayOffensiveStatDownEffect(struct entity *user, struct StatIndex); +extern void ov29_022E5068(struct entity *user, struct StatIndex); +extern void ov29_022E4FC0(struct entity *user, struct StatIndex); extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern void UpdateStatusIconFlags(struct entity *); extern void ov29_022E4338(struct entity *); +extern fx32_8 MultiplyByFixedPoint(fx32_8 a, fx32_8 b); #ifdef JAPAN #define JPN_MSG_OFFSET -0x2C0 @@ -294,3 +298,77 @@ void ActivateFlashFire(struct entity *pokemon, struct entity *target) UpdateStatusIconFlags(target); } } + +void ApplyOffensiveStatMultiplier(struct entity *user, struct entity *target, struct StatIndex stat, fx32_8 multiplier, bool8 displayMessage) +{ + struct monster *entityInfo; + fx32_8 oldMulti; + u8 *buffer1 = AllocateTemp1024ByteBufferFromPool(); + + if (!EntityIsValid__023118B4(target)) + return; + + if (stat.id != STAT_INDEX_PHYSICAL) { + CopyStringFromId(buffer1, 0xdcb + JPN_MSG_OFFSET); + SetMessageLogPreprocessorArgsString(1, buffer1); + } + else { + CopyStringFromId(buffer1, 0xdca + JPN_MSG_OFFSET); + SetMessageLogPreprocessorArgsString(1, buffer1); + } + + if (F248LessThanInt(multiplier, 1) && IsProtectedFromStatDrops(user,target,displayMessage)) + return; + + if (ItemIsActive__02311BF8(target,ITEM_TWIST_BAND) && F248LessThanInt(multiplier, 1)) { + SubstitutePlaceholderStringTags(0,target,0); + LogMessageByIdWithPopupCheckUserTarget(user,target,0xdb2 + JPN_MSG_OFFSET); + return; + } + + #ifdef JAPAN + if (DefenderAbilityIsActive__02311B94(user, target, ABILITY_HYPER_CUTTER) + #else + if (DefenderAbilityIsActive__02311B94(user, target, ABILITY_HYPER_CUTTER, TRUE) + #endif // JAPAN + && stat.id == STAT_INDEX_PHYSICAL + && F248LessThanInt(multiplier, 1)) + { + if (displayMessage) { + SubstitutePlaceholderStringTags(0,target,0); + LogMessageByIdWithPopupCheckUserTarget(user,target,0xd9e + JPN_MSG_OFFSET); + } + return; + } + + entityInfo = GetEntInfo(target); + SubstitutePlaceholderStringTags(0,target,0); + oldMulti = entityInfo->stat_modifiers.offensive_multipliers[stat.id]; + + if (F248LessThanInt(multiplier, 1)) { + ov29_022E5068(target,stat); + } + else { + ov29_022E4FC0(target,stat); + } + + entityInfo->stat_modifiers.offensive_multipliers[stat.id] = MultiplyByFixedPoint(entityInfo->stat_modifiers.offensive_multipliers[stat.id],multiplier); + + if (F248LessThanFloat(entityInfo->stat_modifiers.offensive_multipliers[stat.id], 0.01)) { + entityInfo->stat_modifiers.offensive_multipliers[stat.id] = FloatToF248(0.01); + } + if (FloatLessThanF248(99.99, entityInfo->stat_modifiers.offensive_multipliers[stat.id])) { + entityInfo->stat_modifiers.offensive_multipliers[stat.id] = FloatToF248(99.99); + } + + if (F248GreaterThan(oldMulti, entityInfo->stat_modifiers.offensive_multipliers[stat.id])) { + LogMessageByIdWithPopupCheckUserTarget(user,target,0xdd1 + JPN_MSG_OFFSET); + } + else if (F248LessThan(oldMulti, entityInfo->stat_modifiers.offensive_multipliers[stat.id])) { + LogMessageByIdWithPopupCheckUserTarget(user,target,0xdd0 + JPN_MSG_OFFSET); + } + else { + LogMessageByIdWithPopupCheckUserTarget(user,target,0xdd3 + JPN_MSG_OFFSET); + } + UpdateStatusIconFlags(target); +} From b3a8bacb94e3fc28582be84a0c94d5d42b4b7f26 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 3 Nov 2025 15:18:17 +0100 Subject: [PATCH 09/15] LowerHitChanceStat --- asm/include/overlay_29_02313CE4.inc | 8 +- asm/overlay_29_022E37DC.s | 24 +- asm/overlay_29_02313CE4.s | 344 ---------------------------- include/math.h | 23 +- include/overlay_29_02313814.h | 3 + src/overlay_29_02313814.c | 173 +++++++++++++- 6 files changed, 201 insertions(+), 374 deletions(-) diff --git a/asm/include/overlay_29_02313CE4.inc b/asm/include/overlay_29_02313CE4.inc index 97f24280..67a3923e 100644 --- a/asm/include/overlay_29_02313CE4.inc +++ b/asm/include/overlay_29_02313CE4.inc @@ -20,10 +20,10 @@ .public ov10_022C4894 .public ov29_022E4240 .public ov29_022E4338 -.public ov29_022E4FC0 -.public ov29_022E5068 -.public ov29_022E510C -.public ov29_022E51B0 +.public PlayOffensiveStatMultiplierUpEffect +.public PlayOffensiveStatMultiplierDownEffect +.public PlayDefensiveStatMultiplierUpEffect +.public PlayDefensiveStatMultiplierDownEffect .public ov29_022E5258 .public ov29_022E52F8 .public GetTreatmentBetweenMonstersIgnoreStatus diff --git a/asm/overlay_29_022E37DC.s b/asm/overlay_29_022E37DC.s index 3f23224d..aa658998 100644 --- a/asm/overlay_29_022E37DC.s +++ b/asm/overlay_29_022E37DC.s @@ -2019,8 +2019,8 @@ _022E4FAC: _022E4FBC: .word 0x0000018E arm_func_end PlayDefensiveStatUpEffect - arm_func_start ov29_022E4FC0 -ov29_022E4FC0: ; 0x022E4FC0 + arm_func_start PlayOffensiveStatMultiplierUpEffect +PlayOffensiveStatMultiplierUpEffect: ; 0x022E4FC0 stmdb sp!, {r0, r1, r2, r3} stmdb sp!, {r4, lr} sub sp, sp, #0x10 @@ -2066,10 +2066,10 @@ _022E5050: .align 2, 0 _022E5060: .word 0x000001A9 _022E5064: .word 0x00000192 - arm_func_end ov29_022E4FC0 + arm_func_end PlayOffensiveStatMultiplierUpEffect - arm_func_start ov29_022E5068 -ov29_022E5068: ; 0x022E5068 + arm_func_start PlayOffensiveStatMultiplierDownEffect +PlayOffensiveStatMultiplierDownEffect: ; 0x022E5068 stmdb sp!, {r0, r1, r2, r3} stmdb sp!, {r4, lr} sub sp, sp, #0x10 @@ -2114,10 +2114,10 @@ _022E50F8: bx lr .align 2, 0 _022E5108: .word 0x00000193 - arm_func_end ov29_022E5068 + arm_func_end PlayOffensiveStatMultiplierDownEffect - arm_func_start ov29_022E510C -ov29_022E510C: ; 0x022E510C + arm_func_start PlayDefensiveStatMultiplierUpEffect +PlayDefensiveStatMultiplierUpEffect: ; 0x022E510C stmdb sp!, {r0, r1, r2, r3} stmdb sp!, {r4, lr} sub sp, sp, #0x10 @@ -2162,10 +2162,10 @@ _022E519C: bx lr .align 2, 0 _022E51AC: .word 0x0000018E - arm_func_end ov29_022E510C + arm_func_end PlayDefensiveStatMultiplierUpEffect - arm_func_start ov29_022E51B0 -ov29_022E51B0: ; 0x022E51B0 + arm_func_start PlayDefensiveStatMultiplierDownEffect +PlayDefensiveStatMultiplierDownEffect: ; 0x022E51B0 stmdb sp!, {r0, r1, r2, r3} stmdb sp!, {r4, lr} sub sp, sp, #0x10 @@ -2211,7 +2211,7 @@ _022E5240: .align 2, 0 _022E5250: .word 0x0000018F _022E5254: .word 0x00000191 - arm_func_end ov29_022E51B0 + arm_func_end PlayDefensiveStatMultiplierDownEffect arm_func_start ov29_022E5258 ov29_022E5258: ; 0x022E5258 diff --git a/asm/overlay_29_02313CE4.s b/asm/overlay_29_02313CE4.s index dcf84b70..548dd5c3 100644 --- a/asm/overlay_29_02313CE4.s +++ b/asm/overlay_29_02313CE4.s @@ -4,350 +4,6 @@ .text - - - arm_func_start ApplyDefensiveStatMultiplier -ApplyDefensiveStatMultiplier: ; 0x02313F64 - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - mov r8, r1 - mov sb, r0 - mov r7, r3 - bl AllocateTemp1024ByteBufferFromPool - mov r4, r0 - mov r0, r8 - bl EntityIsValid__023118B4 - cmp r0, #0 - beq _023140C0 - ldr r0, [sp, #0x28] - cmp r0, #0 - beq _02313FB8 - ldr r1, _023140CC ; =0x00000DC9 - mov r0, r4 - bl CopyStringFromId - mov r1, r4 - mov r0, #1 - bl SetMessageLogPreprocessorArgsString - b _02313FD0 -_02313FB8: - ldr r1, _023140D0 ; =0x00000DC8 - mov r0, r4 - bl CopyStringFromId - mov r1, r4 - mov r0, #1 - bl SetMessageLogPreprocessorArgsString -_02313FD0: - cmp r7, #0x100 - bge _02313FF0 - ldrb r2, [sp, #0x30] - mov r0, sb - mov r1, r8 - bl IsProtectedFromStatDrops - cmp r0, #0 - bne _023140C0 -_02313FF0: - mov r0, #0 - mov r1, r8 - mov r2, r0 - ldr r5, [r8, #0xb4] - bl SubstitutePlaceholderStringTags - ldr r6, [sp, #0x28] - cmp r7, #0x100 - add r0, r5, r6, lsl #2 - ldr r4, [r0, #0x3c] - add r1, sp, #0x28 - mov r0, r8 - bge _0231402C - ldr r1, [r1] - bl ov29_022E51B0 - b _02314034 -_0231402C: - ldr r1, [r1] - bl ov29_022E510C -_02314034: - add r0, r5, r6, lsl #2 - ldr r0, [r0, #0x3c] - mov r1, r7 - bl MultiplyByFixedPoint - add r1, r5, r6, lsl #2 - str r0, [r1, #0x3c] - cmp r0, #2 - movlt r0, #2 - strlt r0, [r1, #0x3c] - add r2, r5, r6, lsl #2 - ldr r1, [r2, #0x3c] - ldr r0, _023140D4 ; =0x000063FD - cmp r1, r0 - strgt r0, [r2, #0x3c] - add r0, r5, r6, lsl #2 - ldr r0, [r0, #0x3c] - cmp r4, r0 - ble _02314090 - ldr r2, _023140D8 ; =0x00000DCF - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget - b _023140B8 -_02314090: - bge _023140A8 - ldr r2, _023140DC ; =0x00000DCE - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget - b _023140B8 -_023140A8: - ldr r2, _023140E0 ; =0x00000DD2 - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget -_023140B8: - mov r0, r8 - bl UpdateStatusIconFlags -_023140C0: - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - add sp, sp, #0x10 - bx lr - .align 2, 0 -#ifdef JAPAN -#define APPLY_DEFENSIVE_STAT_MULTIPLIER_OFFSET -0x2C0 -#else -#define APPLY_DEFENSIVE_STAT_MULTIPLIER_OFFSET 0 -#endif -_023140CC: .word 0x00000DC9 + APPLY_DEFENSIVE_STAT_MULTIPLIER_OFFSET -_023140D0: .word 0x00000DC8 + APPLY_DEFENSIVE_STAT_MULTIPLIER_OFFSET -_023140D4: .word 0x000063FD -_023140D8: .word 0x00000DCF + APPLY_DEFENSIVE_STAT_MULTIPLIER_OFFSET -_023140DC: .word 0x00000DCE + APPLY_DEFENSIVE_STAT_MULTIPLIER_OFFSET -_023140E0: .word 0x00000DD2 + APPLY_DEFENSIVE_STAT_MULTIPLIER_OFFSET - arm_func_end ApplyDefensiveStatMultiplier - - arm_func_start BoostHitChanceStat -BoostHitChanceStat: ; 0x023140E4 - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r6, r1 - mov r7, r0 - bl AllocateTemp1024ByteBufferFromPool - mov r8, r0 - mov r0, r6 - mov r4, #1 - bl EntityIsValid__023118B4 - cmp r0, #0 - beq _0231420C - mov r0, #0 - mov r1, r6 - mov r2, r0 - ldr r5, [r6, #0xb4] - bl SubstitutePlaceholderStringTags - add r1, sp, #0x20 - ldr r1, [r1] - mov r0, r6 - bl ov29_022E5258 - ldr r0, [sp, #0x20] - cmp r0, #0 - beq _0231415C - ldr r1, _02314218 ; =0x00000DC7 - mov r0, r8 - bl CopyStringFromId - mov r1, r8 - mov r0, r4 - bl SetMessageLogPreprocessorArgsString - b _02314174 -_0231415C: - ldr r1, _0231421C ; =0x00000DC6 - mov r0, r8 - bl CopyStringFromId - mov r1, r8 - mov r0, r4 - bl SetMessageLogPreprocessorArgsString -_02314174: - mov r0, r6 - mov r1, #0x61 - bl AbilityIsActiveVeneer - ldr r1, [sp, #0x20] - cmp r0, #0 - movne r0, r4, lsl #0x11 - add r2, r5, r1, lsl #1 - movne r4, r0, asr #0x10 - ldrsh r0, [r2, #0x2c] - mov r3, r1, lsl #1 - cmp r0, #0x14 - bge _023141F4 - add r1, r5, #0x2c - ldrsh r0, [r1, r3] - add r0, r0, r4 - strh r0, [r1, r3] - ldrsh r0, [r2, #0x2c] - cmp r0, #0x14 - movgt r0, #0x14 - strgth r0, [r2, #0x2c] - cmp r4, #2 - blt _023141E0 - ldr r2, _02314220 ; =0x00000D95 - mov r0, r7 - mov r1, r6 - bl LogMessageByIdWithPopupCheckUserTarget - b _02314204 -_023141E0: - ldr r2, _02314224 ; =0x00000D93 - mov r0, r7 - mov r1, r6 - bl LogMessageByIdWithPopupCheckUserTarget - b _02314204 -_023141F4: - ldr r2, _02314228 ; =0x00000DD5 - mov r0, r7 - mov r1, r6 - bl LogMessageByIdWithPopupCheckUserTarget -_02314204: - mov r0, r6 - bl UpdateStatusIconFlags -_0231420C: - ldmia sp!, {r4, r5, r6, r7, r8, lr} - add sp, sp, #0x10 - bx lr - .align 2, 0 -#ifdef JAPAN -#define BOOST_HIT_CHANCE_STAT_OFFSET -0x2C0 -#else -#define BOOST_HIT_CHANCE_STAT_OFFSET 0 -#endif -_02314218: .word 0x00000DC7 + BOOST_HIT_CHANCE_STAT_OFFSET -_0231421C: .word 0x00000DC6 + BOOST_HIT_CHANCE_STAT_OFFSET -_02314220: .word 0x00000D95 + BOOST_HIT_CHANCE_STAT_OFFSET -_02314224: .word 0x00000D93 + BOOST_HIT_CHANCE_STAT_OFFSET -_02314228: .word 0x00000DD5 + BOOST_HIT_CHANCE_STAT_OFFSET - arm_func_end BoostHitChanceStat - - arm_func_start LowerHitChanceStat -LowerHitChanceStat: ; 0x0231422C - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r6, r1 - mov r7, r0 - mov r8, r3 - bl AllocateTemp1024ByteBufferFromPool - mov r5, r0 - mov r0, r6 - mov r4, #1 - bl EntityIsValid__023118B4 - cmp r0, #0 - beq _023143C4 - ldr r0, [sp, #0x20] - cmp r0, #0 - beq _02314284 - ldr r1, _023143D0 ; =0x00000DC7 - mov r0, r5 - bl CopyStringFromId - mov r1, r5 - mov r0, r4 - bl SetMessageLogPreprocessorArgsString - b _0231429C -_02314284: - ldr r1, _023143D4 ; =0x00000DC6 - mov r0, r5 - bl CopyStringFromId - mov r1, r5 - mov r0, r4 - bl SetMessageLogPreprocessorArgsString -_0231429C: - mov r0, r7 - mov r1, r6 - mov r2, r8 - bl IsProtectedFromStatDrops - cmp r0, #0 - bne _023143C4 - mov r0, r7 - mov r1, r6 - mov r2, #0x1e -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__02311B94 - cmp r0, #0 - beq _02314308 - ldr r0, [sp, #0x20] - cmp r0, #0 - bne _02314308 - cmp r8, #0 - beq _023143C4 - mov r0, #0 - mov r1, r6 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _023143D8 ; =0x00000D9F - mov r0, r7 - mov r1, r6 - bl LogMessageByIdWithPopupCheckUserTarget - b _023143C4 -_02314308: - mov r0, r6 - mov r1, #0x61 - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r0, r4, lsl #0x11 - movne r4, r0, asr #0x10 - mov r0, #0 - mov r1, r6 - mov r2, r0 - ldr r5, [r6, #0xb4] - bl SubstitutePlaceholderStringTags - add r1, sp, #0x20 - ldr r1, [r1] - mov r0, r6 - bl ov29_022E52F8 - ldr r1, [sp, #0x20] - add r2, r5, r1, lsl #1 - ldrsh r0, [r2, #0x2c] - mov r3, r1, lsl #1 - cmp r0, #0 - ble _023143AC - add r1, r5, #0x2c - ldrsh r0, [r1, r3] - sub r0, r0, r4 - strh r0, [r1, r3] - ldrsh r0, [r2, #0x2c] - cmp r0, #0 - movlt r0, #0 - strlth r0, [r2, #0x2c] - cmp r4, #2 - blt _02314398 - ldr r2, _023143DC ; =0x00000D94 - mov r0, r7 - mov r1, r6 - bl LogMessageByIdWithPopupCheckUserTarget - b _023143BC -_02314398: - ldr r2, _023143E0 ; =0x00000D92 - mov r0, r7 - mov r1, r6 - bl LogMessageByIdWithPopupCheckUserTarget - b _023143BC -_023143AC: - ldr r2, _023143E4 ; =0x00000DD4 - mov r0, r7 - mov r1, r6 - bl LogMessageByIdWithPopupCheckUserTarget -_023143BC: - mov r0, r6 - bl UpdateStatusIconFlags -_023143C4: - ldmia sp!, {r4, r5, r6, r7, r8, lr} - add sp, sp, #0x10 - bx lr - .align 2, 0 -#ifdef JAPAN -#define LOWER_HIT_CHANCE_STAT_OFFSET -0x2C0 -#else -#define LOWER_HIT_CHANCE_STAT_OFFSET 0 -#endif -_023143D0: .word 0x00000DC7 + LOWER_HIT_CHANCE_STAT_OFFSET -_023143D4: .word 0x00000DC6 + LOWER_HIT_CHANCE_STAT_OFFSET -_023143D8: .word 0x00000D9F + LOWER_HIT_CHANCE_STAT_OFFSET -_023143DC: .word 0x00000D94 + LOWER_HIT_CHANCE_STAT_OFFSET -_023143E0: .word 0x00000D92 + LOWER_HIT_CHANCE_STAT_OFFSET -_023143E4: .word 0x00000DD4 + LOWER_HIT_CHANCE_STAT_OFFSET - arm_func_end LowerHitChanceStat arm_func_start TryInflictCringeStatus TryInflictCringeStatus: ; 0x023143E8 diff --git a/include/math.h b/include/math.h index d6b9161e..2dace633 100644 --- a/include/math.h +++ b/include/math.h @@ -5,13 +5,20 @@ #define INFINITY_2 999999 #define INFINITY_3 10000 -#define F248LessThanFloat(x, y) (x < (int)(y * 0x100)) -#define F248LessThanInt(x, y) (x < 0x100 * y) -#define FloatToF248(x) (x * 0x100) -#define FloatLessThanF248(x, y) ((int)(x * 0x100) < y) -#define F248LessThan(x, y) (x < y) -#define F248GreaterThan(x, y) (x > y) -#define F248Equal(x, y) (x == y) -#define F248EqualsInt(x, y) (x == 0x100 * y) +#define IntToF248(x) ((int)((x) * 0x100)) +#define F248ToInt(x) ((s24_8)((x) / 256)) + +#define F248LessThanInt(x, y) ((x) < 0x100 * (y)) +#define F248LessThanFloat(x, y) ((x) < (int)((y) * 0x100)) +#define FloatLessThanF248(x, y) ((int)((x) * 0x100) < (y)) +#define F248LessThan(x, y) ((x) < (y)) +#define F248GreaterThan(x, y) ((x) > (y)) +#define F248Equal(x, y) ((x) == (y)) +#define F248EqualsInt(x, y) ((x) == 0x100 * (y)) +#define F248_AddInt(x, y) ((s24_8)((x) + 0x100 * (y)) +#define F248_SubInt(x, y) ((s24_8)((x) - 0x100 * (y)) +#define F248_Add(x, y)((x) + (y)) +#define F248_Sub(x, y)((x) - (y)) +#define F248_MulInt(x, y)((x) * (y)) #endif // PMDSKY_MATH_H diff --git a/include/overlay_29_02313814.h b/include/overlay_29_02313814.h index 391f286d..91df908d 100644 --- a/include/overlay_29_02313814.h +++ b/include/overlay_29_02313814.h @@ -29,5 +29,8 @@ void BoostDefensiveStat(struct entity *user, struct entity *target, struct StatI enum flash_fire_status GetFlashFireStatus(struct entity *attacker, struct entity *defender); void ActivateFlashFire(struct entity *pokemon, struct entity *target); void ApplyOffensiveStatMultiplier(struct entity *user, struct entity *target, struct StatIndex stat, fx32_8 multiplier, bool8 displayMessage); +void ApplyDefensiveStatMultiplier(struct entity *user, struct entity *target, struct StatIndex stat, fx32_8 multiplier, bool8 displayMessage); +void BoostHitChanceStat(struct entity *user, struct entity *target, struct StatIndex stat); +void LowerHitChanceStat(struct entity *user, struct entity *target, struct StatIndex stat, bool8 displayMessage); #endif //PMDSKY_OVERLAY_29_02313814_H diff --git a/src/overlay_29_02313814.c b/src/overlay_29_02313814.c index dc901dbd..9724efb9 100644 --- a/src/overlay_29_02313814.c +++ b/src/overlay_29_02313814.c @@ -14,8 +14,12 @@ extern void PlayOffensiveStatUpEffect(struct entity *user, struct StatIndex); extern void PlayDefensiveStatDownEffect(struct entity *user, struct StatIndex); extern void PlayDefensiveStatUpEffect(struct entity *user, struct StatIndex); extern void PlayOffensiveStatDownEffect(struct entity *user, struct StatIndex); -extern void ov29_022E5068(struct entity *user, struct StatIndex); -extern void ov29_022E4FC0(struct entity *user, struct StatIndex); +extern void PlayOffensiveStatMultiplierDownEffect(struct entity *user, struct StatIndex); +extern void PlayOffensiveStatMultiplierUpEffect(struct entity *user, struct StatIndex); +extern void PlayDefensiveStatMultiplierDownEffect(struct entity *user, struct StatIndex); +extern void PlayDefensiveStatMultiplierUpEffect(struct entity *user, struct StatIndex); +extern void ov29_022E5258(struct entity *user, struct StatIndex); +extern void ov29_022E52F8(struct entity *user, struct StatIndex); extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern void UpdateStatusIconFlags(struct entity *); extern void ov29_022E4338(struct entity *); @@ -346,19 +350,19 @@ void ApplyOffensiveStatMultiplier(struct entity *user, struct entity *target, st oldMulti = entityInfo->stat_modifiers.offensive_multipliers[stat.id]; if (F248LessThanInt(multiplier, 1)) { - ov29_022E5068(target,stat); + PlayOffensiveStatMultiplierDownEffect(target,stat); } else { - ov29_022E4FC0(target,stat); + PlayOffensiveStatMultiplierUpEffect(target,stat); } entityInfo->stat_modifiers.offensive_multipliers[stat.id] = MultiplyByFixedPoint(entityInfo->stat_modifiers.offensive_multipliers[stat.id],multiplier); if (F248LessThanFloat(entityInfo->stat_modifiers.offensive_multipliers[stat.id], 0.01)) { - entityInfo->stat_modifiers.offensive_multipliers[stat.id] = FloatToF248(0.01); + entityInfo->stat_modifiers.offensive_multipliers[stat.id] = IntToF248(0.01); } if (FloatLessThanF248(99.99, entityInfo->stat_modifiers.offensive_multipliers[stat.id])) { - entityInfo->stat_modifiers.offensive_multipliers[stat.id] = FloatToF248(99.99); + entityInfo->stat_modifiers.offensive_multipliers[stat.id] = IntToF248(99.99); } if (F248GreaterThan(oldMulti, entityInfo->stat_modifiers.offensive_multipliers[stat.id])) { @@ -372,3 +376,160 @@ void ApplyOffensiveStatMultiplier(struct entity *user, struct entity *target, st } UpdateStatusIconFlags(target); } + +void ApplyDefensiveStatMultiplier(struct entity *user, struct entity *target, struct StatIndex stat, fx32_8 multiplier, bool8 displayMessage) +{ + struct monster *entityInfo; + fx32_8 oldMulti; + u8 *buffer1 = AllocateTemp1024ByteBufferFromPool(); + + if (!EntityIsValid__023118B4(target)) + return; + + if (stat.id != STAT_INDEX_PHYSICAL) { + CopyStringFromId(buffer1, 0xdc9 + JPN_MSG_OFFSET); + SetMessageLogPreprocessorArgsString(1, buffer1); + } + else { + CopyStringFromId(buffer1, 0xdc8 + JPN_MSG_OFFSET); + SetMessageLogPreprocessorArgsString(1, buffer1); + } + + if (F248LessThanInt(multiplier, 1) && IsProtectedFromStatDrops(user,target,displayMessage)) + return; + + entityInfo = GetEntInfo(target); + SubstitutePlaceholderStringTags(0,target,0); + oldMulti = entityInfo->stat_modifiers.defensive_multipliers[stat.id]; + + if (F248LessThanInt(multiplier, 1)) { + PlayDefensiveStatMultiplierDownEffect(target,stat); + } + else { + PlayDefensiveStatMultiplierUpEffect(target,stat); + } + + entityInfo->stat_modifiers.defensive_multipliers[stat.id] = MultiplyByFixedPoint(entityInfo->stat_modifiers.defensive_multipliers[stat.id],multiplier); + + if (F248LessThanFloat(entityInfo->stat_modifiers.defensive_multipliers[stat.id], 0.01)) { + entityInfo->stat_modifiers.defensive_multipliers[stat.id] = IntToF248(0.01); + } + if (FloatLessThanF248(99.99, entityInfo->stat_modifiers.defensive_multipliers[stat.id])) { + entityInfo->stat_modifiers.defensive_multipliers[stat.id] = IntToF248(99.99); + } + + if (F248GreaterThan(oldMulti, entityInfo->stat_modifiers.defensive_multipliers[stat.id])) { + LogMessageByIdWithPopupCheckUserTarget(user,target,0xdcf + JPN_MSG_OFFSET); + } + else if (F248LessThan(oldMulti, entityInfo->stat_modifiers.defensive_multipliers[stat.id])) { + LogMessageByIdWithPopupCheckUserTarget(user,target,0xdce + JPN_MSG_OFFSET); + } + else { + LogMessageByIdWithPopupCheckUserTarget(user,target,0xdd2 + JPN_MSG_OFFSET); + } + UpdateStatusIconFlags(target); +} + +void BoostHitChanceStat(struct entity *user, struct entity *target, struct StatIndex stat) +{ + struct monster *entityInfo; + u8 *buffer1 = AllocateTemp1024ByteBufferFromPool(); + s16 nStages = 1; + + if (!EntityIsValid__023118B4(target)) + return; + + entityInfo = GetEntInfo(target); + SubstitutePlaceholderStringTags(0,target,0); + ov29_022E5258(target,stat); + if (stat.id != STAT_INDEX_ACCURACY) { + CopyStringFromId(buffer1, 0xdc7 + JPN_MSG_OFFSET); + SetMessageLogPreprocessorArgsString(1, buffer1); + } + else { + CopyStringFromId(buffer1, 0xdc6 + JPN_MSG_OFFSET); + SetMessageLogPreprocessorArgsString(1, buffer1); + } + + if (AbilityIsActiveVeneer(target, ABILITY_SIMPLE)) + nStages *= 2; + + if (entityInfo->stat_modifiers.hit_chance_stages[stat.id] < MAX_STAT_STAGE) { + entityInfo->stat_modifiers.hit_chance_stages[stat.id] += nStages; + if (entityInfo->stat_modifiers.hit_chance_stages[stat.id] > MAX_STAT_STAGE) { + entityInfo->stat_modifiers.hit_chance_stages[stat.id] = MAX_STAT_STAGE; + } + + if (nStages >= 2) { + LogMessageByIdWithPopupCheckUserTarget(user,target,0xd95 + JPN_MSG_OFFSET); + } + else { + LogMessageByIdWithPopupCheckUserTarget(user,target,0xd93 + JPN_MSG_OFFSET); + } + } + else { + LogMessageByIdWithPopupCheckUserTarget(user,target,0xdd5 + JPN_MSG_OFFSET); + } + + UpdateStatusIconFlags(target); +} + +void LowerHitChanceStat(struct entity *user, struct entity *target, struct StatIndex stat, bool8 displayMessage) +{ + struct monster *entityInfo; + u8 *buffer1 = AllocateTemp1024ByteBufferFromPool(); + s16 nStages = 1; + + if (!EntityIsValid__023118B4(target)) + return; + + if (stat.id != STAT_INDEX_ACCURACY) { + CopyStringFromId(buffer1, 0xdc7 + JPN_MSG_OFFSET); + SetMessageLogPreprocessorArgsString(1, buffer1); + } + else { + CopyStringFromId(buffer1, 0xdc6 + JPN_MSG_OFFSET); + SetMessageLogPreprocessorArgsString(1, buffer1); + } + + if (IsProtectedFromStatDrops(user,target,displayMessage)) + return; + + #ifdef JAPAN + if (DefenderAbilityIsActive__02311B94(user, target, ABILITY_KEEN_EYE) && stat.id == STAT_INDEX_ACCURACY) { + #else + if (DefenderAbilityIsActive__02311B94(user, target, ABILITY_KEEN_EYE, TRUE) && stat.id == STAT_INDEX_ACCURACY) { + #endif // JAPAN + if (displayMessage) { + SubstitutePlaceholderStringTags(0,target,0); + LogMessageByIdWithPopupCheckUserTarget(user,target,0xd9f + JPN_MSG_OFFSET); + } + return; + } + + if (AbilityIsActiveVeneer(target, ABILITY_SIMPLE)) + nStages *= 2; + + entityInfo = GetEntInfo(target); + SubstitutePlaceholderStringTags(0,target,0); + ov29_022E52F8(target,stat); + + if (entityInfo->stat_modifiers.hit_chance_stages[stat.id] > 0) { + entityInfo->stat_modifiers.hit_chance_stages[stat.id] -= nStages; + if (entityInfo->stat_modifiers.hit_chance_stages[stat.id] < 0) { + entityInfo->stat_modifiers.hit_chance_stages[stat.id] = 0; + } + + if (nStages >= 2) { + LogMessageByIdWithPopupCheckUserTarget(user,target,0xd94 + JPN_MSG_OFFSET); + } + else { + LogMessageByIdWithPopupCheckUserTarget(user,target,0xd92 + JPN_MSG_OFFSET); + } + } + else { + LogMessageByIdWithPopupCheckUserTarget(user,target,0xdd4 + JPN_MSG_OFFSET); + } + + UpdateStatusIconFlags(target); +} From ba2816bf9fbe7c3405c7e97b06fa6702aad7bc65 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 3 Nov 2025 15:44:38 +0100 Subject: [PATCH 10/15] CringeStatusTarget --- asm/include/overlay_29_02313CE4.inc | 4 +-- asm/overlay_10_rodata_022C464C.s | 4 +-- asm/overlay_29_022E37DC.s | 6 ++-- asm/overlay_29_02313CE4.s | 6 ++-- include/overlay_29_02313814.h | 1 + src/overlay_29_02313814.c | 53 +++++++++++++++++++++++++++++ 6 files changed, 64 insertions(+), 10 deletions(-) diff --git a/asm/include/overlay_29_02313CE4.inc b/asm/include/overlay_29_02313CE4.inc index 67a3923e..4057e9a3 100644 --- a/asm/include/overlay_29_02313CE4.inc +++ b/asm/include/overlay_29_02313CE4.inc @@ -16,7 +16,7 @@ .public ItemIsActive__02311BF8 .public LogMessageByIdWithPopupCheckUserTarget .public MultiplyByFixedPoint -.public ov10_022C4884 +.public gCringeTurnRange .public ov10_022C4894 .public ov29_022E4240 .public ov29_022E4338 @@ -27,7 +27,7 @@ .public ov29_022E5258 .public ov29_022E52F8 .public GetTreatmentBetweenMonstersIgnoreStatus -.public PlayExclamationPointEffect__022E5D4C +.public PlayCringeExclamationPointEffect .public PrepareItemForPrinting__02345728 .public SafeguardIsActive .public SetMessageLogPreprocessorArgsString diff --git a/asm/overlay_10_rodata_022C464C.s b/asm/overlay_10_rodata_022C464C.s index c4653d3b..69ede8ae 100644 --- a/asm/overlay_10_rodata_022C464C.s +++ b/asm/overlay_10_rodata_022C464C.s @@ -428,8 +428,8 @@ ov10_022C487C: .global ov10_022C4880 ov10_022C4880: .byte 0x7F, 0x00, 0x7F, 0x00 - .global ov10_022C4884 -ov10_022C4884: + .global gCringeTurnRange +gCringeTurnRange: .byte 0x01, 0x00, 0x01, 0x00 .global SPEED_BOOST_TURN_RANGE SPEED_BOOST_TURN_RANGE: diff --git a/asm/overlay_29_022E37DC.s b/asm/overlay_29_022E37DC.s index aa658998..eac38357 100644 --- a/asm/overlay_29_022E37DC.s +++ b/asm/overlay_29_022E37DC.s @@ -2307,8 +2307,8 @@ _022E5388: _022E5398: .word 0x0000018D arm_func_end ov29_022E52F8 - arm_func_start PlayExclamationPointEffect__022E5D4C -PlayExclamationPointEffect__022E5D4C: ; 0x022E539C + arm_func_start PlayCringeExclamationPointEffect +PlayCringeExclamationPointEffect: ; 0x022E539C stmdb sp!, {r4, lr} sub sp, sp, #0x10 mov r4, r0 @@ -2330,7 +2330,7 @@ PlayExclamationPointEffect__022E5D4C: ; 0x022E539C ldmia sp!, {r4, pc} .align 2, 0 _022E53E8: .word 0x00000143 - arm_func_end PlayExclamationPointEffect__022E5D4C + arm_func_end PlayCringeExclamationPointEffect arm_func_start ov29_022E53EC ov29_022E53EC: ; 0x022E53EC diff --git a/asm/overlay_29_02313CE4.s b/asm/overlay_29_02313CE4.s index 548dd5c3..5ced2681 100644 --- a/asm/overlay_29_02313CE4.s +++ b/asm/overlay_29_02313CE4.s @@ -66,7 +66,7 @@ _02314498: ldrb r0, [r4, #0xd0] cmp r0, #1 beq _02314514 - ldr r1, _02314538 ; =ov10_022C4884 + ldr r1, _02314538 ; =gCringeTurnRange mov r2, #1 mov r0, r6 strb r2, [r4, #0xd0] @@ -74,7 +74,7 @@ _02314498: add r1, r0, #1 mov r0, r6 strb r1, [r4, #0xd1] - bl PlayExclamationPointEffect__022E5D4C + bl PlayCringeExclamationPointEffect ldr r2, _0231453C ; =0x00000D02 mov r0, r7 mov r1, r6 @@ -103,7 +103,7 @@ _02314524: #define TRY_INFLICT_CRINGE_STATUS_OFFSET 0 #endif _02314534: .word 0x00000DA2 + TRY_INFLICT_CRINGE_STATUS_OFFSET -_02314538: .word ov10_022C4884 +_02314538: .word gCringeTurnRange _0231453C: .word 0x00000D02 + TRY_INFLICT_CRINGE_STATUS_OFFSET _02314540: .word 0x00000D03 + TRY_INFLICT_CRINGE_STATUS_OFFSET arm_func_end TryInflictCringeStatus diff --git a/include/overlay_29_02313814.h b/include/overlay_29_02313814.h index 91df908d..8d0bf877 100644 --- a/include/overlay_29_02313814.h +++ b/include/overlay_29_02313814.h @@ -32,5 +32,6 @@ void ApplyOffensiveStatMultiplier(struct entity *user, struct entity *target, st void ApplyDefensiveStatMultiplier(struct entity *user, struct entity *target, struct StatIndex stat, fx32_8 multiplier, bool8 displayMessage); void BoostHitChanceStat(struct entity *user, struct entity *target, struct StatIndex stat); void LowerHitChanceStat(struct entity *user, struct entity *target, struct StatIndex stat, bool8 displayMessage); +bool8 CringeStatusTarget(struct entity *user ,struct entity *target, bool8 displayMessage, bool8 onlyCheck); #endif //PMDSKY_OVERLAY_29_02313814_H diff --git a/src/overlay_29_02313814.c b/src/overlay_29_02313814.c index 9724efb9..ad033373 100644 --- a/src/overlay_29_02313814.c +++ b/src/overlay_29_02313814.c @@ -23,7 +23,15 @@ extern void ov29_022E52F8(struct entity *user, struct StatIndex); extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern void UpdateStatusIconFlags(struct entity *); extern void ov29_022E4338(struct entity *); +extern void PlayCringeExclamationPointEffect(struct entity *); extern fx32_8 MultiplyByFixedPoint(fx32_8 a, fx32_8 b); +extern bool8 IsProtectedFromNegativeStatus(struct entity *user ,struct entity *target, bool8 displayMessage); +extern bool8 SafeguardIsActive(struct entity *user ,struct entity *target, bool8 displayMessage); +extern void TryActivateSteadfast(struct entity *user ,struct entity *target); +extern void TryActivateQuickFeet(struct entity *user ,struct entity *target); +extern s32 CalcStatusDuration(struct entity *target, const s16 *turnRange, bool8 factorCurerSkills); + +extern const s16 gCringeTurnRange[2]; #ifdef JAPAN #define JPN_MSG_OFFSET -0x2C0 @@ -533,3 +541,48 @@ void LowerHitChanceStat(struct entity *user, struct entity *target, struct StatI UpdateStatusIconFlags(target); } + +bool8 CringeStatusTarget(struct entity *user ,struct entity *target, bool8 displayMessage, bool8 onlyCheck) +{ + struct monster *entityInfo; + u8 *buffer1 = AllocateTemp1024ByteBufferFromPool(); + + if (!EntityIsValid__023118B4(target)) + return FALSE; + + if (SafeguardIsActive(user, target, displayMessage)) + return FALSE; + + if (IsProtectedFromNegativeStatus(user, target, displayMessage)) + return FALSE; + + #ifdef JAPAN + if (DefenderAbilityIsActive__02311B94(user, target, ABILITY_INNER_FOCUS)) { + #else + if (DefenderAbilityIsActive__02311B94(user, target, ABILITY_INNER_FOCUS, TRUE)) { + #endif + SubstitutePlaceholderStringTags(0,target,0); + if (displayMessage) + LogMessageByIdWithPopupCheckUserTarget(user,target,0xda2 + JPN_MSG_OFFSET); + return FALSE; + } + + if (onlyCheck) + return TRUE; + + entityInfo = GetEntInfo(target); + SubstitutePlaceholderStringTags(0,target,0); + if (entityInfo->cringe_class_status.cringe != STATUS_CRINGE_CRINGE) { + entityInfo->cringe_class_status.cringe = STATUS_CRINGE_CRINGE; + entityInfo->cringe_class_status.cringe_turns = CalcStatusDuration(target, gCringeTurnRange, TRUE) + 1; + PlayCringeExclamationPointEffect(target); + LogMessageByIdWithPopupCheckUserTarget(user,target,0xd02 + JPN_MSG_OFFSET); + TryActivateSteadfast(user, target); + TryActivateQuickFeet(user, target); + } + else { + LogMessageByIdWithPopupCheckUserTarget(user,target,0xd03 + JPN_MSG_OFFSET); + } + UpdateStatusIconFlags(target); + return TRUE; +} From 801ac7c93a0b31a34a01a9e6d2de725e53275505 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 5 Nov 2025 11:40:17 +0100 Subject: [PATCH 11/15] up to TryInflictParalysisStatus --- asm/include/overlay_29_02313CE4.inc | 2 +- asm/overlay_10_rodata_022C464C.s | 4 +- asm/overlay_29_02313CE4.s | 302 ---------------------------- include/overlay_29_02313814.h | 5 +- include/overlay_29_023147EC.h | 9 - main.lsf | 2 - src/overlay_29_02313814.c | 106 +++++++++- src/overlay_29_023147EC.c | 12 -- 8 files changed, 111 insertions(+), 331 deletions(-) delete mode 100644 asm/overlay_29_02313CE4.s delete mode 100644 include/overlay_29_023147EC.h delete mode 100644 src/overlay_29_023147EC.c diff --git a/asm/include/overlay_29_02313CE4.inc b/asm/include/overlay_29_02313CE4.inc index 4057e9a3..ba9ceefb 100644 --- a/asm/include/overlay_29_02313CE4.inc +++ b/asm/include/overlay_29_02313CE4.inc @@ -17,7 +17,7 @@ .public LogMessageByIdWithPopupCheckUserTarget .public MultiplyByFixedPoint .public gCringeTurnRange -.public ov10_022C4894 +.public gParalysisTurnRange .public ov29_022E4240 .public ov29_022E4338 .public PlayOffensiveStatMultiplierUpEffect diff --git a/asm/overlay_10_rodata_022C464C.s b/asm/overlay_10_rodata_022C464C.s index 69ede8ae..0086b7df 100644 --- a/asm/overlay_10_rodata_022C464C.s +++ b/asm/overlay_10_rodata_022C464C.s @@ -440,8 +440,8 @@ ov10_022C488C: .global ov10_022C4890 ov10_022C4890: .byte 0x06, 0x00, 0x0C, 0x00 - .global ov10_022C4894 -ov10_022C4894: + .global gParalysisTurnRange +gParalysisTurnRange: .byte 0x01, 0x00, 0x02, 0x00 .global ov10_022C4898 ov10_022C4898: diff --git a/asm/overlay_29_02313CE4.s b/asm/overlay_29_02313CE4.s deleted file mode 100644 index 5ced2681..00000000 --- a/asm/overlay_29_02313CE4.s +++ /dev/null @@ -1,302 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_02313CE4.inc" - - .text - - - - arm_func_start TryInflictCringeStatus -TryInflictCringeStatus: ; 0x023143E8 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r6, r1 - mov r7, r0 - mov r5, r2 - mov r4, r3 - bl AllocateTemp1024ByteBufferFromPool - mov r0, r6 - bl EntityIsValid__023118B4 - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - mov r0, r7 - mov r1, r6 - mov r2, r5 - bl SafeguardIsActive - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - mov r0, r7 - mov r1, r6 - mov r2, r5 - bl IsProtectedFromNegativeStatus - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - mov r0, r7 - mov r1, r6 - mov r2, #0x1f -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__02311B94 - cmp r0, #0 - beq _02314498 - mov r0, #0 - mov r1, r6 - mov r2, r0 - bl SubstitutePlaceholderStringTags - cmp r5, #0 - beq _02314490 - ldr r2, _02314534 ; =0x00000DA2 - mov r0, r7 - mov r1, r6 - bl LogMessageByIdWithPopupCheckUserTarget -_02314490: - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_02314498: - cmp r4, #0 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - mov r0, #0 - ldr r4, [r6, #0xb4] - mov r1, r6 - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldrb r0, [r4, #0xd0] - cmp r0, #1 - beq _02314514 - ldr r1, _02314538 ; =gCringeTurnRange - mov r2, #1 - mov r0, r6 - strb r2, [r4, #0xd0] - bl CalcStatusDuration - add r1, r0, #1 - mov r0, r6 - strb r1, [r4, #0xd1] - bl PlayCringeExclamationPointEffect - ldr r2, _0231453C ; =0x00000D02 - mov r0, r7 - mov r1, r6 - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, r7 - mov r1, r6 - bl TryActivateSteadfast - mov r0, r7 - mov r1, r6 - bl TryActivateQuickFeet - b _02314524 -_02314514: - ldr r2, _02314540 ; =0x00000D03 - mov r0, r7 - mov r1, r6 - bl LogMessageByIdWithPopupCheckUserTarget -_02314524: - mov r0, r6 - bl UpdateStatusIconFlags - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -#ifdef JAPAN -#define TRY_INFLICT_CRINGE_STATUS_OFFSET -0x2C0 -#else -#define TRY_INFLICT_CRINGE_STATUS_OFFSET 0 -#endif -_02314534: .word 0x00000DA2 + TRY_INFLICT_CRINGE_STATUS_OFFSET -_02314538: .word gCringeTurnRange -_0231453C: .word 0x00000D02 + TRY_INFLICT_CRINGE_STATUS_OFFSET -_02314540: .word 0x00000D03 + TRY_INFLICT_CRINGE_STATUS_OFFSET - arm_func_end TryInflictCringeStatus - - arm_func_start TryInflictParalysisStatus -TryInflictParalysisStatus: ; 0x02314544 -#ifdef JAPAN -#define TRY_INFLICT_PARALYSIS_STATUS_OFFSET -0x2C0 -#else -#define TRY_INFLICT_PARALYSIS_STATUS_OFFSET 0 -#endif - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0xc - mov sb, r1 - mov sl, r0 - mov r0, sb - mov r8, r2 - mov r4, r3 - bl EntityIsValid__023118B4 - cmp r0, #0 - moveq r0, #0 - beq _023147D0 - mov r0, sl - mov r1, sb - mov r2, r8 - bl SafeguardIsActive - cmp r0, #0 - movne r0, #0 - bne _023147D0 - mov r0, sl - mov r1, sb - mov r2, r8 - bl IsProtectedFromNegativeStatus - cmp r0, #0 - movne r0, #0 - bne _023147D0 - mov r0, sl - mov r1, sb - mov r2, #0x16 -#ifndef JAPAN - mov r3, #1 -#endif - bl DefenderAbilityIsActive__02311B94 - cmp r0, #0 - beq _023145F4 - mov r0, #0 - mov r1, sb - mov r2, r0 - bl SubstitutePlaceholderStringTags - cmp r8, #0 - beq _023145EC - mov r0, sl - mov r1, sb - mov r2, #0xda0 + TRY_INFLICT_PARALYSIS_STATUS_OFFSET - bl LogMessageByIdWithPopupCheckUserTarget -_023145EC: - mov r0, #0 - b _023147D0 -_023145F4: - mov r0, sb - mov r1, #1 - bl ExclusiveItemEffectIsActive__023147EC - cmp r0, #0 - beq _02314654 - cmp r8, #0 - beq _0231464C - mov r0, #0 - mov r1, sb - mov r2, r0 - bl SubstitutePlaceholderStringTags - add r2, sp, #4 - mov r0, sb - mov r1, #1 - bl GetExclusiveItemWithEffectFromBag - add r1, sp, #4 - mov r0, #1 - bl PrepareItemForPrinting__02345728 - ldr r2, _023147D8 ; =0x00000DA1 - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget -_0231464C: - mov r0, #0 - b _023147D0 -_02314654: - cmp r4, #0 - movne r0, #1 - bne _023147D0 - mov r0, #0 - ldr r7, [sb, #0xb4] - mov r1, sb - mov r2, r0 - mov r4, #1 - bl SubstitutePlaceholderStringTags - ldrb r0, [r7, #0xbf] - cmp r0, #4 - beq _023146E0 - ldr r1, _023147DC ; =ov10_022C4894 - mov r3, #4 - mov r0, sb - mov r2, r4 - strb r3, [r7, #0xbf] - bl CalcStatusDuration - add r0, r0, #1 - strb r0, [r7, #0xc0] - mov r4, #0 - strb r4, [r7, #0xc1] - mov r0, sl - mov r1, sb - mov r2, #0xd00 + TRY_INFLICT_PARALYSIS_STATUS_OFFSET - strb r4, [r7, #0xc2] - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, sb - bl ov29_022E4240 - mov r0, sb - bl CalcSpeedStageWrapper - mov r0, sl - mov r1, sb - bl TryActivateQuickFeet - b _023146F0 -_023146E0: - ldr r2, _023147E0 ; =0x00000D01 - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget -_023146F0: - mov r0, sb - mov r1, #0x19 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _023147C4 - cmp r4, #0 - bne _023147C4 - mov r5, #0 - ldr fp, _023147E4 ; =DIRECTIONS_XY - mov r4, r5 -_02314718: - mov r1, r4, lsl #2 - add r0, fp, r4, lsl #2 - ldrsh r6, [sb, #4] - ldrsh r3, [fp, r1] - ldrsh r1, [r0, #2] - ldrsh r2, [sb, #6] - add r0, r6, r3 - add r1, r2, r1 - bl GetTile - ldr r6, [r0, #0xc] - mov r0, r6 - bl EntityIsValid__023118B4 - cmp r0, #0 - beq _023147B8 - ldr r0, [r6] - cmp r0, #1 - bne _023147B8 - cmp r5, #0 - bne _02314790 - mov r5, #1 - bl GetMessageLogPreprocessorArgs - mov r1, #0 - mov r2, r7 - mov r3, r1 - str r1, [sp] - bl SetPreprocessorArgsStringToName - ldr r2, _023147E8 ; =0x00000DC5 - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget -_02314790: - mov r0, sb - mov r1, r6 - bl GetTreatmentBetweenMonstersIgnoreStatus - cmp r0, #1 - bne _023147B8 - mov r0, sl - mov r1, r6 - mov r2, r8 - mov r3, #0 - bl TryInflictParalysisStatus -_023147B8: - add r4, r4, #1 - cmp r4, #8 - blt _02314718 -_023147C4: - mov r0, sb - bl UpdateStatusIconFlags - mov r0, #1 -_023147D0: - add sp, sp, #0xc - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_023147D8: .word 0x00000DA1 + TRY_INFLICT_PARALYSIS_STATUS_OFFSET -_023147DC: .word ov10_022C4894 -_023147E0: .word 0x00000D01 + TRY_INFLICT_PARALYSIS_STATUS_OFFSET -_023147E4: .word DIRECTIONS_XY -_023147E8: .word 0x00000DC5 + TRY_INFLICT_PARALYSIS_STATUS_OFFSET - arm_func_end TryInflictParalysisStatus diff --git a/include/overlay_29_02313814.h b/include/overlay_29_02313814.h index 8d0bf877..622700c8 100644 --- a/include/overlay_29_02313814.h +++ b/include/overlay_29_02313814.h @@ -32,6 +32,9 @@ void ApplyOffensiveStatMultiplier(struct entity *user, struct entity *target, st void ApplyDefensiveStatMultiplier(struct entity *user, struct entity *target, struct StatIndex stat, fx32_8 multiplier, bool8 displayMessage); void BoostHitChanceStat(struct entity *user, struct entity *target, struct StatIndex stat); void LowerHitChanceStat(struct entity *user, struct entity *target, struct StatIndex stat, bool8 displayMessage); -bool8 CringeStatusTarget(struct entity *user ,struct entity *target, bool8 displayMessage, bool8 onlyCheck); +bool8 TryInflictCringeStatus(struct entity *user ,struct entity *target, bool8 displayMessage, bool8 onlyCheck); +bool8 TryInflictParalysisStatus(struct entity *user, struct entity *target, bool8 displayMessage, bool8 onlyCheck); +// Checks if a monster is a team member under the effects of a certain exclusive item effect. +bool8 ExclusiveItemEffectIsActive__023147EC(struct entity *entity, enum exclusive_item_effect_id effect_id); #endif //PMDSKY_OVERLAY_29_02313814_H diff --git a/include/overlay_29_023147EC.h b/include/overlay_29_023147EC.h deleted file mode 100644 index 72643936..00000000 --- a/include/overlay_29_023147EC.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef PMDSKY_OVERLAY_29_023147EC_H -#define PMDSKY_OVERLAY_29_023147EC_H - -#include "dungeon_mode.h" - -// Checks if a monster is a team member under the effects of a certain exclusive item effect. -bool8 ExclusiveItemEffectIsActive__023147EC(struct entity *entity, enum exclusive_item_effect_id effect_id); - -#endif //PMDSKY_OVERLAY_29_023147EC_H diff --git a/main.lsf b/main.lsf index 360f7351..dba10f9c 100644 --- a/main.lsf +++ b/main.lsf @@ -542,8 +542,6 @@ Overlay OVY_29 Object src/overlay_29_02311BF8.o Object asm/overlay_29_02311C28.o Object src/overlay_29_02313814.o - Object asm/overlay_29_02313CE4.o - Object src/overlay_29_023147EC.o Object asm/overlay_29_02314810.o Object src/overlay_29_02315118.o Object asm/overlay_29_0231516C.o diff --git a/src/overlay_29_02313814.c b/src/overlay_29_02313814.c index ad033373..a54e3774 100644 --- a/src/overlay_29_02313814.c +++ b/src/overlay_29_02313814.c @@ -3,7 +3,10 @@ #include "overlay_29_023118B4.h" #include "overlay_29_02313814.h" #include "overlay_29_02311BF8.h" +#include "overlay_29_023018AC.h" #include "math.h" +#include "dungeon_util.h" +#include "exclusive_item.h" extern u8* AllocateTemp1024ByteBufferFromPool(void); extern void CopyStringFromId(u8* buf, u32 string_id); @@ -24,14 +27,22 @@ extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct e extern void UpdateStatusIconFlags(struct entity *); extern void ov29_022E4338(struct entity *); extern void PlayCringeExclamationPointEffect(struct entity *); +extern void ov29_022E4240(struct entity *); extern fx32_8 MultiplyByFixedPoint(fx32_8 a, fx32_8 b); extern bool8 IsProtectedFromNegativeStatus(struct entity *user ,struct entity *target, bool8 displayMessage); extern bool8 SafeguardIsActive(struct entity *user ,struct entity *target, bool8 displayMessage); extern void TryActivateSteadfast(struct entity *user ,struct entity *target); extern void TryActivateQuickFeet(struct entity *user ,struct entity *target); extern s32 CalcStatusDuration(struct entity *target, const s16 *turnRange, bool8 factorCurerSkills); +extern struct tile* GetTile(int x, int y); +extern bool8 GetExclusiveItemWithEffectFromBag(struct entity *, enum exclusive_item_effect_id effect_id, struct item *); +extern struct preprocessor_args* GetMessageLogPreprocessorArgs(void); +extern void SetPreprocessorArgsStringToName(struct preprocessor_args* preprocessor_args, u8 pos,struct monster* monster, u8 param_4, u8 name_type); +extern void PrepareItemForPrinting__02345728(u8, struct item*); +extern int CalcSpeedStageWrapper(struct entity* entity); -extern const s16 gCringeTurnRange[2]; +extern const s16 gCringeTurnRange[]; +extern const s16 gParalysisTurnRange[]; #ifdef JAPAN #define JPN_MSG_OFFSET -0x2C0 @@ -542,7 +553,7 @@ void LowerHitChanceStat(struct entity *user, struct entity *target, struct StatI UpdateStatusIconFlags(target); } -bool8 CringeStatusTarget(struct entity *user ,struct entity *target, bool8 displayMessage, bool8 onlyCheck) +bool8 TryInflictCringeStatus(struct entity *user ,struct entity *target, bool8 displayMessage, bool8 onlyCheck) { struct monster *entityInfo; u8 *buffer1 = AllocateTemp1024ByteBufferFromPool(); @@ -586,3 +597,94 @@ bool8 CringeStatusTarget(struct entity *user ,struct entity *target, bool8 displ UpdateStatusIconFlags(target); return TRUE; } + +bool8 TryInflictParalysisStatus(struct entity *user, struct entity *target, bool8 displayMessage, bool8 onlyCheck) +{ + struct monster *entityInfo; + bool8 alreadyParalyzed; + + if (!EntityIsValid__023118B4(target)) + return FALSE; + + if (SafeguardIsActive(user, target, displayMessage)) + return FALSE; + + if (IsProtectedFromNegativeStatus(user, target, displayMessage)) + return FALSE; + + #ifdef JAPAN + if (DefenderAbilityIsActive__02311B94(user, target, ABILITY_LIMBER)) { + #else + if (DefenderAbilityIsActive__02311B94(user, target, ABILITY_LIMBER, TRUE)) { + #endif + SubstitutePlaceholderStringTags(0,target,0); + if (displayMessage) + LogMessageByIdWithPopupCheckUserTarget(user,target,0xda0 + JPN_MSG_OFFSET); + return FALSE; + } + + if (ExclusiveItemEffectIsActive__023147EC(target, EXCLUSIVE_EFF_NO_PARALYSIS)) { + if (displayMessage) { + struct item item; + + SubstitutePlaceholderStringTags(0,target,0); + GetExclusiveItemWithEffectFromBag(target, EXCLUSIVE_EFF_NO_PARALYSIS, &item); + PrepareItemForPrinting__02345728(1, &item); + LogMessageByIdWithPopupCheckUserTarget(user,target,0xda1 + JPN_MSG_OFFSET); + } + return FALSE; + } + + if (onlyCheck) + return TRUE; + + alreadyParalyzed = TRUE; + entityInfo = GetEntInfo(target); + SubstitutePlaceholderStringTags(0,target,0); + if (entityInfo->burn_class_status.burn != STATUS_BURN_PARALYSIS) { + entityInfo->burn_class_status.burn = STATUS_BURN_PARALYSIS; + entityInfo->burn_class_status.burn_turns = CalcStatusDuration(target,gParalysisTurnRange,TRUE) + 1; + entityInfo->burn_class_status.burn_damage_countdown = 0; + entityInfo->burn_class_status.badly_poisoned_damage_count = 0; + alreadyParalyzed = FALSE; + LogMessageByIdWithPopupCheckUserTarget(user,target,0xd00 + JPN_MSG_OFFSET); + ov29_022E4240(target); + CalcSpeedStageWrapper(target); + TryActivateQuickFeet(user, target); + } + else { + LogMessageByIdWithPopupCheckUserTarget(user,target,0xd01 + JPN_MSG_OFFSET); + } + + if (AbilityIsActiveVeneer(target, ABILITY_SYNCHRONIZE) && !alreadyParalyzed) { + s32 i; + bool8 synchronizePrinted = FALSE; + + for (i = 0; i < NUM_DIRECTIONS; i++) { + const struct tile *mapTile = GetTile(target->pos.x + DIRECTIONS_XY[i].x,target->pos.y + DIRECTIONS_XY[i].y); + struct entity *mapMonster = mapTile->monster; + if (EntityIsValid__023118B4(mapMonster) && GetEntityType(mapMonster) == ENTITY_MONSTER) { + if (!synchronizePrinted) { + synchronizePrinted = TRUE; + SetPreprocessorArgsStringToName(GetMessageLogPreprocessorArgs(),0,entityInfo,0,0); + LogMessageByIdWithPopupCheckUserTarget(user,target,0xdc5 + JPN_MSG_OFFSET); + } + if (GetTreatmentBetweenMonstersIgnoreStatus(target,mapMonster) == TREATMENT_TREAT_AS_ENEMY) { + TryInflictParalysisStatus(user, mapMonster, displayMessage, FALSE); + } + } + } + } + + UpdateStatusIconFlags(target); + return TRUE; +} + +bool8 ExclusiveItemEffectIsActive__023147EC(struct entity *entity, enum exclusive_item_effect_id effect_id) +{ + struct monster *monster = GetEntInfo(entity); + if (!monster->is_not_team_member) + return ExclusiveItemEffectFlagTest(monster->exclusive_item_effect_flags, effect_id); + + return FALSE; +} diff --git a/src/overlay_29_023147EC.c b/src/overlay_29_023147EC.c deleted file mode 100644 index 87e2cf71..00000000 --- a/src/overlay_29_023147EC.c +++ /dev/null @@ -1,12 +0,0 @@ -#include "overlay_29_023147EC.h" -#include "dungeon_util_static.h" -#include "exclusive_item.h" - -bool8 ExclusiveItemEffectIsActive__023147EC(struct entity *entity, enum exclusive_item_effect_id effect_id) -{ - struct monster *monster = GetEntInfo(entity); - if (!monster->is_not_team_member) - return ExclusiveItemEffectFlagTest(monster->exclusive_item_effect_flags, effect_id); - - return FALSE; -} From 7380759e512f7665cf728af3bc13e7321b083d76 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 5 Nov 2025 12:10:35 +0100 Subject: [PATCH 12/15] BoostSpeed --- asm/include/overlay_29_02314810.inc | 1 + asm/overlay_29_02314810.s | 96 ----------------------------- include/overlay_29_02313814.h | 1 + src/overlay_29_02313814.c | 48 +++++++++++++++ 4 files changed, 50 insertions(+), 96 deletions(-) diff --git a/asm/include/overlay_29_02314810.inc b/asm/include/overlay_29_02314810.inc index 02408b90..232ac858 100644 --- a/asm/include/overlay_29_02314810.inc +++ b/asm/include/overlay_29_02314810.inc @@ -6,6 +6,7 @@ .public DungeonRandInt .public DungeonRandOutcome__022EAB20 .public EntityIsValid__023118B4 +.public BoostSpeed .public EntityIsValid__02315118 .public ExclusiveItemEffectIsActive__023147EC .public GetExclusiveItemWithEffectFromBag diff --git a/asm/overlay_29_02314810.s b/asm/overlay_29_02314810.s index d766a19c..a18d11c6 100644 --- a/asm/overlay_29_02314810.s +++ b/asm/overlay_29_02314810.s @@ -3,102 +3,6 @@ .text - arm_func_start BoostSpeed -BoostSpeed: ; 0x02314810 -#ifdef JAPAN -#define BOOST_SPEED_OFFSET -4 -#else -#define BOOST_SPEED_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - mov r8, r1 - mov sb, r0 - mov r0, r8 - mov r7, r2 - mov r6, r3 - bl EntityIsValid__023118B4 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - cmp r6, #0 - bne _02314850 - ldr r1, _0231492C ; =SPEED_BOOST_TURN_RANGE - mov r0, r8 - mov r2, #0 - bl CalcStatusDuration - add r6, r0, #1 -_02314850: - mov r0, #0 - mov r1, r8 - mov r2, r0 - ldr r5, [r8, #0xb4] - bl SubstitutePlaceholderStringTags - mov r0, r8 - mov r1, r7 - bl CalcSpeedStage - mov r4, r0 - cmp r4, #4 - bne _0231489C - ldrb r0, [sp, #0x20] - cmp r0, #0 - beq _02314920 - ldr r2, _02314930 ; =0x00000DDB - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget - b _02314920 -_0231489C: - mov r2, #0 - b _023148BC -_023148A4: - add r1, r5, r2 - ldrb r0, [r1, #0x114 + BOOST_SPEED_OFFSET] - cmp r0, #0 - streqb r6, [r1, #0x114 + BOOST_SPEED_OFFSET] - beq _023148C4 - add r2, r2, #1 -_023148BC: - cmp r2, #5 - blt _023148A4 -_023148C4: - mov r0, r8 - mov r1, r7 - bl CalcSpeedStage - mov r6, r0 - cmp r4, r6 - bne _023148F0 - ldr r2, _02314934 ; =0x00000DDA - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget - b _02314920 -_023148F0: - mov r0, r8 - bl ov29_022E44CC - ldr r0, _02314938 ; =ov29_02353318 - mov r1, r6, lsl #1 - ldrh r2, [r0, r1] - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, #1 - strb r0, [r5, #0x101] - mov r0, #0 - strb r0, [r5, #0x152 + BOOST_SPEED_OFFSET] -_02314920: - mov r0, r8 - bl UpdateStatusIconFlags - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_0231492C: .word SPEED_BOOST_TURN_RANGE -#ifdef JAPAN -_02314930: .word 0x00000B1B -_02314934: .word 0x00000B1A -#else -_02314930: .word 0x00000DDB -_02314934: .word 0x00000DDA -#endif -_02314938: .word ov29_02353318 - arm_func_end BoostSpeed arm_func_start BoostSpeedOneStage BoostSpeedOneStage: ; 0x0231493C diff --git a/include/overlay_29_02313814.h b/include/overlay_29_02313814.h index 622700c8..9e1fa15e 100644 --- a/include/overlay_29_02313814.h +++ b/include/overlay_29_02313814.h @@ -36,5 +36,6 @@ bool8 TryInflictCringeStatus(struct entity *user ,struct entity *target, bool8 d bool8 TryInflictParalysisStatus(struct entity *user, struct entity *target, bool8 displayMessage, bool8 onlyCheck); // Checks if a monster is a team member under the effects of a certain exclusive item effect. bool8 ExclusiveItemEffectIsActive__023147EC(struct entity *entity, enum exclusive_item_effect_id effect_id); +void BoostSpeed(struct entity *user, struct entity *target, s32 nStages, s32 turns, bool8 displayMessage); #endif //PMDSKY_OVERLAY_29_02313814_H diff --git a/src/overlay_29_02313814.c b/src/overlay_29_02313814.c index a54e3774..05bd87d4 100644 --- a/src/overlay_29_02313814.c +++ b/src/overlay_29_02313814.c @@ -28,6 +28,7 @@ extern void UpdateStatusIconFlags(struct entity *); extern void ov29_022E4338(struct entity *); extern void PlayCringeExclamationPointEffect(struct entity *); extern void ov29_022E4240(struct entity *); +extern void ov29_022E44CC(struct entity *); extern fx32_8 MultiplyByFixedPoint(fx32_8 a, fx32_8 b); extern bool8 IsProtectedFromNegativeStatus(struct entity *user ,struct entity *target, bool8 displayMessage); extern bool8 SafeguardIsActive(struct entity *user ,struct entity *target, bool8 displayMessage); @@ -40,9 +41,12 @@ extern struct preprocessor_args* GetMessageLogPreprocessorArgs(void); extern void SetPreprocessorArgsStringToName(struct preprocessor_args* preprocessor_args, u8 pos,struct monster* monster, u8 param_4, u8 name_type); extern void PrepareItemForPrinting__02345728(u8, struct item*); extern int CalcSpeedStageWrapper(struct entity* entity); +extern int CalcSpeedStage(struct entity *, int); extern const s16 gCringeTurnRange[]; extern const s16 gParalysisTurnRange[]; +extern const s16 SPEED_BOOST_TURN_RANGE[]; +extern const u16 ov29_02353318[]; #ifdef JAPAN #define JPN_MSG_OFFSET -0x2C0 @@ -688,3 +692,47 @@ bool8 ExclusiveItemEffectIsActive__023147EC(struct entity *entity, enum exclusiv return FALSE; } + +void BoostSpeed(struct entity *user, struct entity *target, s32 nStages, s32 turns, bool8 displayMessage) +{ + s32 speedBefore; + s32 i; + s32 speedAfter; + struct monster *entityInfo; + + if (!EntityIsValid__023118B4(target)) + return; + + if (turns == 0) { + turns = CalcStatusDuration(target,SPEED_BOOST_TURN_RANGE,FALSE) + 1; + } + + entityInfo = GetEntInfo(target); + SubstitutePlaceholderStringTags(0,target,0); + speedBefore = CalcSpeedStage(target, nStages); + if (speedBefore == MAX_SPEED_STAGE) { + if (displayMessage) + LogMessageByIdWithPopupCheckUserTarget(user,target,0xddb + JPN_MSG_OFFSET); + } + else { + for (i = 0; i < NUM_SPEED_COUNTERS; i++) { + if (entityInfo->speed_up_counters[i] == 0) { + entityInfo->speed_up_counters[i] = turns; + break; + } + } + + speedAfter = CalcSpeedStage(target, nStages); + if (speedBefore == speedAfter) { + LogMessageByIdWithPopupCheckUserTarget(user,target,0xdda + JPN_MSG_OFFSET); + } + else { + ov29_022E44CC(target); + LogMessageByIdWithPopupCheckUserTarget(user,target,ov29_02353318[speedAfter]); + entityInfo->unk_sped_up_tracker = TRUE; + entityInfo->already_acted = FALSE; + } + } + + UpdateStatusIconFlags(target); +} From 38a3e5732df7da02b667b11360775fb14df84a40 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 5 Nov 2025 15:26:50 +0100 Subject: [PATCH 13/15] LowerSpeed --- asm/include/overlay_29_02314810.inc | 3 +- asm/overlay_10_rodata_022C464C.s | 4 +- asm/overlay_29_02314810.s | 128 ---------------------------- include/overlay_29_02313814.h | 2 + src/overlay_29_02313814.c | 56 ++++++++++++ 5 files changed, 62 insertions(+), 131 deletions(-) diff --git a/asm/include/overlay_29_02314810.inc b/asm/include/overlay_29_02314810.inc index 232ac858..fe80195c 100644 --- a/asm/include/overlay_29_02314810.inc +++ b/asm/include/overlay_29_02314810.inc @@ -12,9 +12,10 @@ .public GetExclusiveItemWithEffectFromBag .public IsProtectedFromNegativeStatus .public ItemIsActive__0231513C +.public LowerSpeed .public LogMessageByIdWithPopupCheckUserTarget .public ov10_022C4618 -.public ov10_022C488C +.public gSpeedLowerTurnRange .public ov10_022C4890 .public ov29_022E41CC .public ov29_022E44CC diff --git a/asm/overlay_10_rodata_022C464C.s b/asm/overlay_10_rodata_022C464C.s index 0086b7df..cff47569 100644 --- a/asm/overlay_10_rodata_022C464C.s +++ b/asm/overlay_10_rodata_022C464C.s @@ -434,8 +434,8 @@ gCringeTurnRange: .global SPEED_BOOST_TURN_RANGE SPEED_BOOST_TURN_RANGE: .byte 0x08, 0x00, 0x0A, 0x00 - .global ov10_022C488C -ov10_022C488C: + .global gSpeedLowerTurnRange +gSpeedLowerTurnRange: .byte 0x06, 0x00, 0x08, 0x00 .global ov10_022C4890 ov10_022C4890: diff --git a/asm/overlay_29_02314810.s b/asm/overlay_29_02314810.s index a18d11c6..6bdfbf5b 100644 --- a/asm/overlay_29_02314810.s +++ b/asm/overlay_29_02314810.s @@ -4,134 +4,6 @@ .text - arm_func_start BoostSpeedOneStage -BoostSpeedOneStage: ; 0x0231493C - stmdb sp!, {r3, lr} - str r3, [sp] - mov r3, r2 - mov r2, #1 - bl BoostSpeed - ldmia sp!, {r3, pc} - arm_func_end BoostSpeedOneStage - - arm_func_start LowerSpeed -LowerSpeed: ; 0x02314954 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov sb, r1 - mov sl, r0 - mov r0, sb - mov r8, r2 - mov r7, r3 - bl EntityIsValid__023118B4 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sl - mov r1, sb - mov r2, r7 - bl SafeguardIsActive - cmp r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, sl - mov r1, sb - mov r2, r7 - bl IsProtectedFromNegativeStatus - cmp r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r0, #0 - mov r1, sb - mov r2, r0 - ldr r4, [sb, #0xb4] - bl SubstitutePlaceholderStringTags - mov r0, sb - bl CalcSpeedStageWrapper - movs fp, r0 - bne _023149E8 - cmp r7, #0 - beq _02314AA0 - ldr r2, _02314AAC ; =0x00000DDC - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget - b _02314AA0 -_023149E8: - mov r5, #0 - b _02314A34 -_023149F0: - mov r1, #0 - b _02314A28 -_023149F8: - add r6, r4, r1 -#ifdef JAPAN - ldrb r0, [r6, #0x115] -#else - ldrb r0, [r6, #0x119] -#endif - cmp r0, #0 - bne _02314A24 - ldr r1, _02314AB0 ; =ov10_022C488C - mov r0, sb - mov r2, #1 - bl CalcStatusDuration - add r0, r0, #1 -#ifdef JAPAN - strb r0, [r6, #0x115] -#else - strb r0, [r6, #0x119] -#endif - b _02314A30 -_02314A24: - add r1, r1, #1 -_02314A28: - cmp r1, #5 - blt _023149F8 -_02314A30: - add r5, r5, #1 -_02314A34: - cmp r5, r8 - blt _023149F0 - mov r0, sb - bl CalcSpeedStageWrapper - mov r4, r0 - cmp fp, r4 - bne _02314A6C - cmp r7, #0 - beq _02314AA0 - ldr r2, _02314AB4 ; =0x00000DDA - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget - b _02314AA0 -_02314A6C: - mov r0, sb - bl ov29_022E451C - ldr r0, _02314AB8 ; =ov29_02353318 - mov r1, r4, lsl #1 - ldrh r2, [r0, r1] - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget - cmp r4, #0 - bne _02314AA0 - mov r0, sl - mov r1, sb - bl TryActivateQuickFeet -_02314AA0: - mov r0, sb - bl UpdateStatusIconFlags - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -#ifdef JAPAN -_02314AAC: .word 0x00000B1C -_02314AB0: .word ov10_022C488C -_02314AB4: .word 0x00000B1A -#else -_02314AAC: .word 0x00000DDC -_02314AB0: .word ov10_022C488C -_02314AB4: .word 0x00000DDA -#endif -_02314AB8: .word ov29_02353318 - arm_func_end LowerSpeed - arm_func_start TrySealMove TrySealMove: ; 0x02314ABC stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} diff --git a/include/overlay_29_02313814.h b/include/overlay_29_02313814.h index 9e1fa15e..309bd901 100644 --- a/include/overlay_29_02313814.h +++ b/include/overlay_29_02313814.h @@ -37,5 +37,7 @@ bool8 TryInflictParalysisStatus(struct entity *user, struct entity *target, bool // Checks if a monster is a team member under the effects of a certain exclusive item effect. bool8 ExclusiveItemEffectIsActive__023147EC(struct entity *entity, enum exclusive_item_effect_id effect_id); void BoostSpeed(struct entity *user, struct entity *target, s32 nStages, s32 turns, bool8 displayMessage); +void BoostSpeedOneStage(struct entity *user, struct entity *target, s32 turns, bool8 displayMessage); +void LowerSpeed(struct entity *user, struct entity *target, s32 nStages, bool8 displayMessage); #endif //PMDSKY_OVERLAY_29_02313814_H diff --git a/src/overlay_29_02313814.c b/src/overlay_29_02313814.c index 05bd87d4..d371c8ec 100644 --- a/src/overlay_29_02313814.c +++ b/src/overlay_29_02313814.c @@ -29,6 +29,7 @@ extern void ov29_022E4338(struct entity *); extern void PlayCringeExclamationPointEffect(struct entity *); extern void ov29_022E4240(struct entity *); extern void ov29_022E44CC(struct entity *); +extern void ov29_022E451C(struct entity *); extern fx32_8 MultiplyByFixedPoint(fx32_8 a, fx32_8 b); extern bool8 IsProtectedFromNegativeStatus(struct entity *user ,struct entity *target, bool8 displayMessage); extern bool8 SafeguardIsActive(struct entity *user ,struct entity *target, bool8 displayMessage); @@ -45,6 +46,7 @@ extern int CalcSpeedStage(struct entity *, int); extern const s16 gCringeTurnRange[]; extern const s16 gParalysisTurnRange[]; +extern const s16 gSpeedLowerTurnRange[]; extern const s16 SPEED_BOOST_TURN_RANGE[]; extern const u16 ov29_02353318[]; @@ -736,3 +738,57 @@ void BoostSpeed(struct entity *user, struct entity *target, s32 nStages, s32 tur UpdateStatusIconFlags(target); } + +void BoostSpeedOneStage(struct entity *user, struct entity *target, s32 turns, bool8 displayMessage) +{ + BoostSpeed(user, target, 1, turns, displayMessage); +} + +void LowerSpeed(struct entity *user, struct entity *target, s32 nStages, bool8 displayMessage) +{ + s32 speedBefore; + s32 speedAfter; + struct monster *entityInfo; + + if (!EntityIsValid__023118B4(target)) + return; + + if (SafeguardIsActive(user,target,displayMessage)) + return; + + if (IsProtectedFromNegativeStatus(user, target, displayMessage)) + return; + + entityInfo = GetEntInfo(target); + SubstitutePlaceholderStringTags(0,target,0); + speedBefore = CalcSpeedStageWrapper(target); + if (speedBefore == 0) { + if (displayMessage) + LogMessageByIdWithPopupCheckUserTarget(user,target,0xddc + JPN_MSG_OFFSET); + } + else { + s32 counter, i; + for (counter = 0; counter < nStages; counter++) { + for (i = 0; i < NUM_SPEED_COUNTERS; i++) { + if (entityInfo->speed_down_counters[i] == 0) { + entityInfo->speed_down_counters[i] = CalcStatusDuration(target,gSpeedLowerTurnRange,TRUE) + 1; + break; + } + } + } + speedAfter = CalcSpeedStageWrapper(target); + if (speedBefore == speedAfter) { + if (displayMessage) + LogMessageByIdWithPopupCheckUserTarget(user,target,0xdda + JPN_MSG_OFFSET); + } + else { + ov29_022E451C(target); + LogMessageByIdWithPopupCheckUserTarget(user,target,ov29_02353318[speedAfter]); + if (speedAfter == 0) { + TryActivateQuickFeet(user, target); + } + } + } + + UpdateStatusIconFlags(target); +} From 8a442d9ad4a1c7b5f65ad6de2936fafb33a1b9bf Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 7 Nov 2025 14:38:33 +0100 Subject: [PATCH 14/15] File rename --- asm/include/overlay_29_02313CE4.inc | 6 +- asm/include/overlay_29_02314810.inc | 4 +- asm/overlay_29_022E37DC.s | 30 +++++----- ...lay_29_02313814.h => move_orb_effects_1.h} | 6 +- main.lsf | 2 +- src/dungeon_ai_attack.c | 55 +++++++++++-------- src/dungeon_damage.c | 2 +- src/dungeon_range.c | 31 +++++------ ...lay_29_02313814.c => move_orb_effects_1.c} | 24 ++++---- 9 files changed, 84 insertions(+), 76 deletions(-) rename include/{overlay_29_02313814.h => move_orb_effects_1.h} (95%) rename src/{overlay_29_02313814.c => move_orb_effects_1.c} (97%) diff --git a/asm/include/overlay_29_02313CE4.inc b/asm/include/overlay_29_02313CE4.inc index ba9ceefb..d2a8bd28 100644 --- a/asm/include/overlay_29_02313CE4.inc +++ b/asm/include/overlay_29_02313CE4.inc @@ -18,14 +18,14 @@ .public MultiplyByFixedPoint .public gCringeTurnRange .public gParalysisTurnRange -.public ov29_022E4240 +.public PlayParalysisEffect .public ov29_022E4338 .public PlayOffensiveStatMultiplierUpEffect .public PlayOffensiveStatMultiplierDownEffect .public PlayDefensiveStatMultiplierUpEffect .public PlayDefensiveStatMultiplierDownEffect -.public ov29_022E5258 -.public ov29_022E52F8 +.public PlayHitChanceUpEffect +.public PlayHitChanceDownEffect .public GetTreatmentBetweenMonstersIgnoreStatus .public PlayCringeExclamationPointEffect .public PrepareItemForPrinting__02345728 diff --git a/asm/include/overlay_29_02314810.inc b/asm/include/overlay_29_02314810.inc index fe80195c..2fa10367 100644 --- a/asm/include/overlay_29_02314810.inc +++ b/asm/include/overlay_29_02314810.inc @@ -18,8 +18,8 @@ .public gSpeedLowerTurnRange .public ov10_022C4890 .public ov29_022E41CC -.public ov29_022E44CC -.public ov29_022E451C +.public PlaySpeedUpEffect +.public PlaySpeedDownEffect .public ov29_022E543C .public ov29_022E60E4 .public ov29_02353318 diff --git a/asm/overlay_29_022E37DC.s b/asm/overlay_29_022E37DC.s index eac38357..a98cc774 100644 --- a/asm/overlay_29_022E37DC.s +++ b/asm/overlay_29_022E37DC.s @@ -863,8 +863,8 @@ ov29_022E41F0: ; 0x022E41F0 _022E423C: .word 0x000001A7 arm_func_end ov29_022E41F0 - arm_func_start ov29_022E4240 -ov29_022E4240: ; 0x022E4240 + arm_func_start PlayParalysisEffect +PlayParalysisEffect: ; 0x022E4240 stmdb sp!, {r4, lr} sub sp, sp, #0x10 mov r4, r0 @@ -886,7 +886,7 @@ ov29_022E4240: ; 0x022E4240 ldmia sp!, {r4, pc} .align 2, 0 _022E428C: .word 0x000001A7 - arm_func_end ov29_022E4240 + arm_func_end PlayParalysisEffect arm_func_start ov29_022E4290 ov29_022E4290: ; 0x022E4290 @@ -1083,8 +1083,8 @@ ov29_022E4480: ; 0x022E4480 ldmia sp!, {r4, pc} arm_func_end ov29_022E4480 - arm_func_start ov29_022E44CC -ov29_022E44CC: ; 0x022E44CC + arm_func_start PlaySpeedUpEffect +PlaySpeedUpEffect: ; 0x022E44CC stmdb sp!, {r4, lr} sub sp, sp, #0x10 mov r4, r0 @@ -1106,10 +1106,10 @@ ov29_022E44CC: ; 0x022E44CC ldmia sp!, {r4, pc} .align 2, 0 _022E4518: .word 0x0000018B - arm_func_end ov29_022E44CC + arm_func_end PlaySpeedUpEffect - arm_func_start ov29_022E451C -ov29_022E451C: ; 0x022E451C + arm_func_start PlaySpeedDownEffect +PlaySpeedDownEffect: ; 0x022E451C stmdb sp!, {r4, lr} sub sp, sp, #0x10 mov r4, r0 @@ -1131,7 +1131,7 @@ ov29_022E451C: ; 0x022E451C ldmia sp!, {r4, pc} .align 2, 0 _022E4568: .word 0x0000018A - arm_func_end ov29_022E451C + arm_func_end PlaySpeedDownEffect arm_func_start ov29_022E456C ov29_022E456C: ; 0x022E456C @@ -2213,8 +2213,8 @@ _022E5250: .word 0x0000018F _022E5254: .word 0x00000191 arm_func_end PlayDefensiveStatMultiplierDownEffect - arm_func_start ov29_022E5258 -ov29_022E5258: ; 0x022E5258 + arm_func_start PlayHitChanceUpEffect +PlayHitChanceUpEffect: ; 0x022E5258 stmdb sp!, {r0, r1, r2, r3} stmdb sp!, {r4, lr} sub sp, sp, #0x10 @@ -2257,10 +2257,10 @@ _022E52E8: ldmia sp!, {r4, lr} add sp, sp, #0x10 bx lr - arm_func_end ov29_022E5258 + arm_func_end PlayHitChanceUpEffect - arm_func_start ov29_022E52F8 -ov29_022E52F8: ; 0x022E52F8 + arm_func_start PlayHitChanceDownEffect +PlayHitChanceDownEffect: ; 0x022E52F8 stmdb sp!, {r0, r1, r2, r3} stmdb sp!, {r4, lr} sub sp, sp, #0x10 @@ -2305,7 +2305,7 @@ _022E5388: bx lr .align 2, 0 _022E5398: .word 0x0000018D - arm_func_end ov29_022E52F8 + arm_func_end PlayHitChanceDownEffect arm_func_start PlayCringeExclamationPointEffect PlayCringeExclamationPointEffect: ; 0x022E539C diff --git a/include/overlay_29_02313814.h b/include/move_orb_effects_1.h similarity index 95% rename from include/overlay_29_02313814.h rename to include/move_orb_effects_1.h index 309bd901..ca896187 100644 --- a/include/overlay_29_02313814.h +++ b/include/move_orb_effects_1.h @@ -1,5 +1,5 @@ -#ifndef PMDSKY_OVERLAY_29_02313814_H -#define PMDSKY_OVERLAY_29_02313814_H +#ifndef PMDSKY_MOVE_ORB_EFFECTS_1_H +#define PMDSKY_MOVE_ORB_EFFECTS_1_H #include "util.h" #include "dungeon_mode.h" @@ -40,4 +40,4 @@ void BoostSpeed(struct entity *user, struct entity *target, s32 nStages, s32 tur void BoostSpeedOneStage(struct entity *user, struct entity *target, s32 turns, bool8 displayMessage); void LowerSpeed(struct entity *user, struct entity *target, s32 nStages, bool8 displayMessage); -#endif //PMDSKY_OVERLAY_29_02313814_H +#endif //PMDSKY_MOVE_ORB_EFFECTS_1_H diff --git a/main.lsf b/main.lsf index dba10f9c..193f020c 100644 --- a/main.lsf +++ b/main.lsf @@ -541,7 +541,7 @@ Overlay OVY_29 Object asm/overlay_29_023118D8.o Object src/overlay_29_02311BF8.o Object asm/overlay_29_02311C28.o - Object src/overlay_29_02313814.o + Object src/move_orb_effects_1.o Object asm/overlay_29_02314810.o Object src/overlay_29_02315118.o Object asm/overlay_29_0231516C.o diff --git a/src/dungeon_ai_attack.c b/src/dungeon_ai_attack.c index 2706fada..66c67a1b 100644 --- a/src/dungeon_ai_attack.c +++ b/src/dungeon_ai_attack.c @@ -840,8 +840,9 @@ bool8 IsAiTargetEligible(s32 move_ai_range, struct entity *user, struct entity * if (GetTreatmentBetweenMonsters(user, target, FALSE, TRUE) == TREATMENT_TREAT_AS_ALLY) has_target = TRUE; } - else if (move_ai_target - 3 <= 1) // move_ai_target == TARGET_SPECIAL + else if (move_ai_target == TARGET_USER || move_ai_target == TARGET_ENEMIES_AFTER_CHARGING) { has_target = TRUE; + } if (has_target) { @@ -1018,35 +1019,41 @@ bool8 IsTargetInRange(struct entity *user, struct entity *target, s32 direction, if (effective_max_range > n_tiles) effective_max_range = n_tiles; - if (!IqSkillIsEnabled(user, IQ_COURSE_CHECKER)) + if (!IqSkillIsEnabled(user, IQ_COURSE_CHECKER)) { // BUG: effective_max_range is already capped at max_range, so this condition always evaluates to TRUE. // The AI also has range checks elsewhere, so this doesn't become an issue in most cases. // If the AI has the Long Toss or Pierce statuses and Course Checker is disabled, // this incorrect check causes the AI to throw items at targets further than 10 tiles away. - return effective_max_range <= n_tiles; - - s32 i; - s32 current_pos_x = user->pos.x; - s32 current_pos_y = user->pos.y; - s32 adjacent_tile_offset_x = DIRECTIONS_XY[direction].x; - s32 adjacent_tile_offset_y = DIRECTIONS_XY[direction].y; - for (i = 0; i <= effective_max_range; i++) - { - current_pos_x += adjacent_tile_offset_x; - current_pos_y += adjacent_tile_offset_y; - if (current_pos_x < 1 || current_pos_y < 1 || - current_pos_x >= DUNGEON_MAX_SIZE_X - 1 || current_pos_y >= DUNGEON_MAX_SIZE_Y - 1) - break; - - const struct tile *map_tile = GetTile(current_pos_x, current_pos_y); - if (GetTerrainType(map_tile) == TERRAIN_TYPE_WALL) - return FALSE; - - if (map_tile->monster == target) + if (effective_max_range <= n_tiles) return TRUE; - - if (map_tile->monster != NULL) + else return FALSE; } + else { + s32 i; + s32 current_pos_x = user->pos.x; + s32 current_pos_y = user->pos.y; + s32 adjacent_tile_offset_x = DIRECTIONS_XY[direction].x; + s32 adjacent_tile_offset_y = DIRECTIONS_XY[direction].y; + for (i = 0; i <= effective_max_range; i++) + { + current_pos_x += adjacent_tile_offset_x; + current_pos_y += adjacent_tile_offset_y; + if (current_pos_x < 1 || current_pos_y < 1 || + current_pos_x >= DUNGEON_MAX_SIZE_X - 1 || current_pos_y >= DUNGEON_MAX_SIZE_Y - 1) + break; + + const struct tile *map_tile = GetTile(current_pos_x, current_pos_y); + if (!(map_tile->terrain_flags & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY))) + return FALSE; + + if (map_tile->monster == target) + return TRUE; + + if (map_tile->monster != NULL) + return FALSE; + } + } + return FALSE; } diff --git a/src/dungeon_damage.c b/src/dungeon_damage.c index a3074c83..349e5532 100644 --- a/src/dungeon_damage.c +++ b/src/dungeon_damage.c @@ -2,7 +2,7 @@ #include "dungeon_logic_3.h" #include "dungeon_pokemon_attributes.h" #include "dungeon_util_static.h" -#include "overlay_29_02313814.h" +#include "move_orb_effects_1.h" #include "overlay_29_02308FBC.h" #include "overlay_29_0230A994.h" #include "overlay_29_0230AB58.h" diff --git a/src/dungeon_range.c b/src/dungeon_range.c index 17499f7f..de6aa98d 100644 --- a/src/dungeon_range.c +++ b/src/dungeon_range.c @@ -7,17 +7,14 @@ bool8 IsPositionActuallyInSight(struct position *origin, struct position *target, bool8 user_has_dropeye) { - u8 origin_room; s16 visibility = GetVisibilityRange(); const struct tile *tile_1 = GetTile(origin->x, origin->y); - origin_room = tile_1->room; - if (user_has_dropeye || origin_room == CORRIDOR_ROOM) - { + u8 origin_room = tile_1->room; + if (user_has_dropeye || origin_room == CORRIDOR_ROOM) { if (abs(origin->x - target->x) <= visibility && abs(origin->y - target->y) <= visibility) return TRUE; } - else - { + else { struct room_data *origin_room_data = &DUNGEON_PTR[0]->room_data[origin_room]; if (origin_room_data->bottom_right_corner.x - 1 <= target->x && origin_room_data->bottom_right_corner.y - 1 <= target->y && @@ -33,8 +30,7 @@ bool8 IsPositionInSight(struct position *origin, struct position *target, bool8 { const struct tile *tile = GetTile(origin->x, origin->y); u8 origin_room = tile->room; - if (origin_room != CORRIDOR_ROOM && !user_has_dropeye) - { + if (origin_room != CORRIDOR_ROOM && !user_has_dropeye) { struct room_data *origin_room_data = &DUNGEON_PTR[0]->room_data[origin_room]; if (origin_room_data->bottom_right_corner.x - 1 <= target->x && origin_room_data->bottom_right_corner.y - 1 <= target->y && @@ -43,15 +39,18 @@ bool8 IsPositionInSight(struct position *origin, struct position *target, bool8 return TRUE; } - s32 y_diff = abs(origin->y - target->y); - s32 diff = abs(origin->x - target->x); - if (diff <= y_diff) - diff = y_diff; + s32 absY = abs(origin->y - target->y); + s32 absX = abs(origin->x - target->x); + s32 diff = MAX(absX, absY); if (diff > 2) return FALSE; - else if (diff == 2) - return !!IsPositionWithinTwoTiles(origin, target); - else - return TRUE; + else if (diff == 2) { + if (IsPositionWithinTwoTiles(origin, target)) + return TRUE; + else + return FALSE; + } + + return TRUE; } diff --git a/src/overlay_29_02313814.c b/src/move_orb_effects_1.c similarity index 97% rename from src/overlay_29_02313814.c rename to src/move_orb_effects_1.c index d371c8ec..6dadefd1 100644 --- a/src/overlay_29_02313814.c +++ b/src/move_orb_effects_1.c @@ -1,7 +1,7 @@ #include "dungeon_pokemon_attributes.h" #include "dungeon_util_static.h" #include "overlay_29_023118B4.h" -#include "overlay_29_02313814.h" +#include "move_orb_effects_1.h" #include "overlay_29_02311BF8.h" #include "overlay_29_023018AC.h" #include "math.h" @@ -21,15 +21,15 @@ extern void PlayOffensiveStatMultiplierDownEffect(struct entity *user, struct St extern void PlayOffensiveStatMultiplierUpEffect(struct entity *user, struct StatIndex); extern void PlayDefensiveStatMultiplierDownEffect(struct entity *user, struct StatIndex); extern void PlayDefensiveStatMultiplierUpEffect(struct entity *user, struct StatIndex); -extern void ov29_022E5258(struct entity *user, struct StatIndex); -extern void ov29_022E52F8(struct entity *user, struct StatIndex); +extern void PlayHitChanceUpEffect(struct entity *user, struct StatIndex); +extern void PlayHitChanceDownEffect(struct entity *user, struct StatIndex); extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id); extern void UpdateStatusIconFlags(struct entity *); extern void ov29_022E4338(struct entity *); extern void PlayCringeExclamationPointEffect(struct entity *); -extern void ov29_022E4240(struct entity *); -extern void ov29_022E44CC(struct entity *); -extern void ov29_022E451C(struct entity *); +extern void PlayParalysisEffect(struct entity *); +extern void PlaySpeedUpEffect(struct entity *); +extern void PlaySpeedDownEffect(struct entity *); extern fx32_8 MultiplyByFixedPoint(fx32_8 a, fx32_8 b); extern bool8 IsProtectedFromNegativeStatus(struct entity *user ,struct entity *target, bool8 displayMessage); extern bool8 SafeguardIsActive(struct entity *user ,struct entity *target, bool8 displayMessage); @@ -466,7 +466,7 @@ void BoostHitChanceStat(struct entity *user, struct entity *target, struct StatI entityInfo = GetEntInfo(target); SubstitutePlaceholderStringTags(0,target,0); - ov29_022E5258(target,stat); + PlayHitChanceUpEffect(target,stat); if (stat.id != STAT_INDEX_ACCURACY) { CopyStringFromId(buffer1, 0xdc7 + JPN_MSG_OFFSET); SetMessageLogPreprocessorArgsString(1, buffer1); @@ -537,7 +537,7 @@ void LowerHitChanceStat(struct entity *user, struct entity *target, struct StatI entityInfo = GetEntInfo(target); SubstitutePlaceholderStringTags(0,target,0); - ov29_022E52F8(target,stat); + PlayHitChanceDownEffect(target,stat); if (entityInfo->stat_modifiers.hit_chance_stages[stat.id] > 0) { entityInfo->stat_modifiers.hit_chance_stages[stat.id] -= nStages; @@ -654,7 +654,7 @@ bool8 TryInflictParalysisStatus(struct entity *user, struct entity *target, bool entityInfo->burn_class_status.badly_poisoned_damage_count = 0; alreadyParalyzed = FALSE; LogMessageByIdWithPopupCheckUserTarget(user,target,0xd00 + JPN_MSG_OFFSET); - ov29_022E4240(target); + PlayParalysisEffect(target); CalcSpeedStageWrapper(target); TryActivateQuickFeet(user, target); } @@ -729,7 +729,7 @@ void BoostSpeed(struct entity *user, struct entity *target, s32 nStages, s32 tur LogMessageByIdWithPopupCheckUserTarget(user,target,0xdda + JPN_MSG_OFFSET); } else { - ov29_022E44CC(target); + PlaySpeedUpEffect(target); LogMessageByIdWithPopupCheckUserTarget(user,target,ov29_02353318[speedAfter]); entityInfo->unk_sped_up_tracker = TRUE; entityInfo->already_acted = FALSE; @@ -782,7 +782,7 @@ void LowerSpeed(struct entity *user, struct entity *target, s32 nStages, bool8 d LogMessageByIdWithPopupCheckUserTarget(user,target,0xdda + JPN_MSG_OFFSET); } else { - ov29_022E451C(target); + PlaySpeedDownEffect(target); LogMessageByIdWithPopupCheckUserTarget(user,target,ov29_02353318[speedAfter]); if (speedAfter == 0) { TryActivateQuickFeet(user, target); @@ -792,3 +792,5 @@ void LowerSpeed(struct entity *user, struct entity *target, s32 nStages, bool8 d UpdateStatusIconFlags(target); } + +// If Red's file boundaries are anything to go by, this file should end just before TryInflictConfusedStatus. From 57594cd6ec7d8c199ec30b3a5f0ebcccc4f20092 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 14 Nov 2025 09:16:04 +0100 Subject: [PATCH 15/15] change label names --- asm/include/overlay_29_02313CE4.inc | 4 ++-- asm/include/overlay_29_02314810.inc | 2 +- asm/overlay_10_rodata_022C464C.s | 12 ++++++------ src/move_orb_effects_1.c | 12 ++++++------ 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/asm/include/overlay_29_02313CE4.inc b/asm/include/overlay_29_02313CE4.inc index d2a8bd28..87232ce0 100644 --- a/asm/include/overlay_29_02313CE4.inc +++ b/asm/include/overlay_29_02313CE4.inc @@ -16,8 +16,8 @@ .public ItemIsActive__02311BF8 .public LogMessageByIdWithPopupCheckUserTarget .public MultiplyByFixedPoint -.public gCringeTurnRange -.public gParalysisTurnRange +.public CRINGE_TURN_RANGE +.public PARALYSIS_TURN_RANGE .public PlayParalysisEffect .public ov29_022E4338 .public PlayOffensiveStatMultiplierUpEffect diff --git a/asm/include/overlay_29_02314810.inc b/asm/include/overlay_29_02314810.inc index 2fa10367..5766c126 100644 --- a/asm/include/overlay_29_02314810.inc +++ b/asm/include/overlay_29_02314810.inc @@ -15,7 +15,7 @@ .public LowerSpeed .public LogMessageByIdWithPopupCheckUserTarget .public ov10_022C4618 -.public gSpeedLowerTurnRange +.public SPEED_LOWER_TURN_RANGE .public ov10_022C4890 .public ov29_022E41CC .public PlaySpeedUpEffect diff --git a/asm/overlay_10_rodata_022C464C.s b/asm/overlay_10_rodata_022C464C.s index cff47569..212e7436 100644 --- a/asm/overlay_10_rodata_022C464C.s +++ b/asm/overlay_10_rodata_022C464C.s @@ -428,20 +428,20 @@ ov10_022C487C: .global ov10_022C4880 ov10_022C4880: .byte 0x7F, 0x00, 0x7F, 0x00 - .global gCringeTurnRange -gCringeTurnRange: + .global CRINGE_TURN_RANGE +CRINGE_TURN_RANGE: .byte 0x01, 0x00, 0x01, 0x00 .global SPEED_BOOST_TURN_RANGE SPEED_BOOST_TURN_RANGE: .byte 0x08, 0x00, 0x0A, 0x00 - .global gSpeedLowerTurnRange -gSpeedLowerTurnRange: + .global SPEED_LOWER_TURN_RANGE +SPEED_LOWER_TURN_RANGE: .byte 0x06, 0x00, 0x08, 0x00 .global ov10_022C4890 ov10_022C4890: .byte 0x06, 0x00, 0x0C, 0x00 - .global gParalysisTurnRange -gParalysisTurnRange: + .global PARALYSIS_TURN_RANGE +PARALYSIS_TURN_RANGE: .byte 0x01, 0x00, 0x02, 0x00 .global ov10_022C4898 ov10_022C4898: diff --git a/src/move_orb_effects_1.c b/src/move_orb_effects_1.c index 6dadefd1..4b88254b 100644 --- a/src/move_orb_effects_1.c +++ b/src/move_orb_effects_1.c @@ -44,9 +44,9 @@ extern void PrepareItemForPrinting__02345728(u8, struct item*); extern int CalcSpeedStageWrapper(struct entity* entity); extern int CalcSpeedStage(struct entity *, int); -extern const s16 gCringeTurnRange[]; -extern const s16 gParalysisTurnRange[]; -extern const s16 gSpeedLowerTurnRange[]; +extern const s16 CRINGE_TURN_RANGE[]; +extern const s16 PARALYSIS_TURN_RANGE[]; +extern const s16 SPEED_LOWER_TURN_RANGE[]; extern const s16 SPEED_BOOST_TURN_RANGE[]; extern const u16 ov29_02353318[]; @@ -591,7 +591,7 @@ bool8 TryInflictCringeStatus(struct entity *user ,struct entity *target, bool8 d SubstitutePlaceholderStringTags(0,target,0); if (entityInfo->cringe_class_status.cringe != STATUS_CRINGE_CRINGE) { entityInfo->cringe_class_status.cringe = STATUS_CRINGE_CRINGE; - entityInfo->cringe_class_status.cringe_turns = CalcStatusDuration(target, gCringeTurnRange, TRUE) + 1; + entityInfo->cringe_class_status.cringe_turns = CalcStatusDuration(target, CRINGE_TURN_RANGE, TRUE) + 1; PlayCringeExclamationPointEffect(target); LogMessageByIdWithPopupCheckUserTarget(user,target,0xd02 + JPN_MSG_OFFSET); TryActivateSteadfast(user, target); @@ -649,7 +649,7 @@ bool8 TryInflictParalysisStatus(struct entity *user, struct entity *target, bool SubstitutePlaceholderStringTags(0,target,0); if (entityInfo->burn_class_status.burn != STATUS_BURN_PARALYSIS) { entityInfo->burn_class_status.burn = STATUS_BURN_PARALYSIS; - entityInfo->burn_class_status.burn_turns = CalcStatusDuration(target,gParalysisTurnRange,TRUE) + 1; + entityInfo->burn_class_status.burn_turns = CalcStatusDuration(target,PARALYSIS_TURN_RANGE,TRUE) + 1; entityInfo->burn_class_status.burn_damage_countdown = 0; entityInfo->burn_class_status.badly_poisoned_damage_count = 0; alreadyParalyzed = FALSE; @@ -771,7 +771,7 @@ void LowerSpeed(struct entity *user, struct entity *target, s32 nStages, bool8 d for (counter = 0; counter < nStages; counter++) { for (i = 0; i < NUM_SPEED_COUNTERS; i++) { if (entityInfo->speed_down_counters[i] == 0) { - entityInfo->speed_down_counters[i] = CalcStatusDuration(target,gSpeedLowerTurnRange,TRUE) + 1; + entityInfo->speed_down_counters[i] = CalcStatusDuration(target,SPEED_LOWER_TURN_RANGE,TRUE) + 1; break; } }