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); +}