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