BoostOffensiveStat

This commit is contained in:
DizzyEggg
2025-10-31 15:25:56 +01:00
parent f1bdf4a612
commit c5338b3c6d
5 changed files with 57 additions and 113 deletions

View File

@@ -7,5 +7,4 @@
.public SetMessageLogPreprocessorArgsString
.public SubstitutePlaceholderStringTags
.public UpdateStatusIconFlags
.public ov29_022E4E74
.public ov29_022E4F1C

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

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