diff --git a/asm/include/overlay_29_02311C28.inc b/asm/include/overlay_29_02311C28.inc index 21fa9403..8aa65120 100644 --- a/asm/include/overlay_29_02311C28.inc +++ b/asm/include/overlay_29_02311C28.inc @@ -4,20 +4,29 @@ .public CalcStatusDuration .public ChangeShayminForme .public CopyStringFromId -.public DefenderAbilityIsActive__02311B94 .public DIRECTIONS_XY .public DUNGEON_PTR +.public DefenderAbilityIsActive__02311B94 .public EntityIsValid__023118B4 .public ExclusiveItemEffectIsActiveWithLogging .public GetMessageLogPreprocessorArgs .public GetTile .public GetTileAtEntity +.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 +.public TryActivateQuickFeet +.public UpdateStatusIconFlags .public ov10_022C4728 .public ov10_022C479C .public ov10_022C47A0 @@ -45,18 +54,6 @@ .public ov29_022E4C4C .public ov29_022E4D24 .public ov29_022E4D28 -.public ov29_022E4DCC -.public ov29_022E4E74 -.public ov29_022E4F1C .public ov29_022E53EC -.public GetTreatmentBetweenMonstersIgnoreStatus .public ov29_02304A48 .public ov29_02304A84 -.public SafeguardIsActive -.public SECONDARY_TERRAIN_TYPES -.public SetMessageLogPreprocessorArgsString -.public SetPreprocessorArgsIdVal -.public SetPreprocessorArgsStringToName -.public SubstitutePlaceholderStringTags -.public TryActivateQuickFeet -.public UpdateStatusIconFlags diff --git a/asm/include/overlay_29_0231399C.inc b/asm/include/overlay_29_0231399C.inc new file mode 100644 index 00000000..716d03fe --- /dev/null +++ b/asm/include/overlay_29_0231399C.inc @@ -0,0 +1,11 @@ +#pragma once +.public AbilityIsActiveVeneer +.public AllocateTemp1024ByteBufferFromPool +.public CopyStringFromId +.public EntityIsValid__023118B4 +.public LogMessageByIdWithPopupCheckUserTarget +.public SetMessageLogPreprocessorArgsString +.public SubstitutePlaceholderStringTags +.public UpdateStatusIconFlags +.public ov29_022E4E74 +.public ov29_022E4F1C diff --git a/asm/overlay_29_02311C28.s b/asm/overlay_29_02311C28.s index 0bdcb544..af5ef563 100644 --- a/asm/overlay_29_02311C28.s +++ b/asm/overlay_29_02311C28.s @@ -2135,336 +2135,3 @@ _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 - - arm_func_start LowerDefensiveStat -LowerDefensiveStat: ; 0x02313814 -#ifdef JAPAN -#define LOWER_DEFENSIVE_STAT_OFFSET -0x2C0 -#else -#define LOWER_DEFENSIVE_STAT_OFFSET 0 -#endif - 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 _0231397C - ldr r0, [sp, #0x20] - cmp r0, #0 - beq _02313878 - ldr r1, _02313988 ; =0x00000DC9 - mov r0, r6 - bl CopyStringFromId - mov r1, r6 - mov r0, #1 - bl SetMessageLogPreprocessorArgsString - b _02313890 -_02313878: - ldr r1, _0231398C ; =0x00000DC8 - mov r0, r6 - bl CopyStringFromId - mov r1, r6 - mov r0, #1 - bl SetMessageLogPreprocessorArgsString -_02313890: - ldrb r0, [sp, #0x28] - cmp r0, #0 - beq _023138B4 - ldrb r2, [sp, #0x2c] - mov r0, r8 - mov r1, r7 - bl IsProtectedFromStatDrops - cmp r0, #0 - bne _0231397C -_023138B4: - 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_022E4DCC - 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 _02313914 - ldr r1, _02313990 ; =0x00000DCD - mov r0, r4 - bl CopyStringFromId - mov r1, r4 - mov r0, #2 - bl SetMessageLogPreprocessorArgsString - b _0231392C -_02313914: - ldr r1, _02313994 ; =0x00000DCC - mov r0, r4 - bl CopyStringFromId - mov r1, r4 - mov r0, #2 - bl SetMessageLogPreprocessorArgsString -_0231392C: - ldr r1, [sp, #0x20] - add r0, r6, r1, lsl #1 - ldrsh r0, [r0, #0x28] - subs r4, r0, r5 - movmi r4, #0 - cmp r4, r0 - beq _02313964 - add r3, r6, r1, lsl #1 - mov r0, r8 - mov r1, r7 - mov r2, #0xd90 + LOWER_DEFENSIVE_STAT_OFFSET - strh r4, [r3, #0x28] - bl LogMessageByIdWithPopupCheckUserTarget - b _02313974 -_02313964: - ldr r2, _02313998 ; =0x00000DD7 - mov r0, r8 - mov r1, r7 - bl LogMessageByIdWithPopupCheckUserTarget -_02313974: - mov r0, r7 - bl UpdateStatusIconFlags -_0231397C: - ldmia sp!, {r4, r5, r6, r7, r8, lr} - add sp, sp, #0x10 - bx lr - .align 2, 0 -_02313988: .word 0x00000DC9 + LOWER_DEFENSIVE_STAT_OFFSET -_0231398C: .word 0x00000DC8 + LOWER_DEFENSIVE_STAT_OFFSET -_02313990: .word 0x00000DCD + LOWER_DEFENSIVE_STAT_OFFSET -_02313994: .word 0x00000DCC + LOWER_DEFENSIVE_STAT_OFFSET -_02313998: .word 0x00000DD7 + LOWER_DEFENSIVE_STAT_OFFSET - arm_func_end LowerDefensiveStat - - 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 - 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/asm/overlay_29_0231399C.s b/asm/overlay_29_0231399C.s new file mode 100644 index 00000000..292ce09b --- /dev/null +++ b/asm/overlay_29_0231399C.s @@ -0,0 +1,221 @@ + .include "asm/macros.inc" + .include "overlay_29_0231399C.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 + 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 new file mode 100644 index 00000000..93169f35 --- /dev/null +++ b/include/overlay_29_02313814.h @@ -0,0 +1,11 @@ +#ifndef PMDSKY_OVERLAY_29_02313814_H +#define PMDSKY_OVERLAY_29_02313814_H + +struct StatIndex +{ + int id; +}; + +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/main.lsf b/main.lsf index a2bda8ec..f02889f0 100644 --- a/main.lsf +++ b/main.lsf @@ -541,6 +541,8 @@ 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 asm/overlay_29_0231399C.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 new file mode 100644 index 00000000..518f738a --- /dev/null +++ b/src/overlay_29_02313814.c @@ -0,0 +1,76 @@ +#include "dungeon_pokemon_attributes.h" +#include "dungeon_util_static.h" +#include "overlay_29_023118B4.h" +#include "overlay_29_02313814.h" + +extern u8* AllocateTemp1024ByteBufferFromPool(void); +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_022E4DCC(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 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; + u8 *buffer1 = AllocateTemp1024ByteBufferFromPool(); + u8 *buffer2 = AllocateTemp1024ByteBufferFromPool(); + s16 nStages = nStagesRaw; + s32 newStage; + + if (!EntityIsValid__023118B4(target)) + return; + + if (stat.id != 0) { + CopyStringFromId(buffer1, 0xdc9 + LOWER_DEFENSIVE_STAT_OFFSET); + SetMessageLogPreprocessorArgsString(1, buffer1); + } + else { + CopyStringFromId(buffer1, 0xdc8 + LOWER_DEFENSIVE_STAT_OFFSET); + SetMessageLogPreprocessorArgsString(1, buffer1); + } + + if (checkProtected) { + if (IsProtectedFromStatDrops(pokemon, target, logMsgProtected)) + return; + } + + entityInfo = GetEntInfo(target); + SubstitutePlaceholderStringTags(0,target,0); + ov29_022E4DCC(target,stat); + + if (AbilityIsActiveVeneer(target, ABILITY_SIMPLE)) + nStages *= 2; + + if (nStages == 1) { + CopyStringFromId(buffer2, 0xdcd + LOWER_DEFENSIVE_STAT_OFFSET); + SetMessageLogPreprocessorArgsString(2, buffer2); + } + else { + CopyStringFromId(buffer2, 0xdcc + LOWER_DEFENSIVE_STAT_OFFSET); + SetMessageLogPreprocessorArgsString(2, buffer2); + } + + newStage = entityInfo->stat_modifiers.defensive_stages[stat.id]; + newStage -= nStages; + if (newStage < 0) { + newStage = 0; + } + + 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); + } + else { + LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xdd7 + LOWER_DEFENSIVE_STAT_OFFSET); + } + UpdateStatusIconFlags(target); +}