LowerOffensiveStat

This commit is contained in:
DizzyEggg 2025-10-31 13:35:14 +01:00
parent 2dd75e0c8e
commit 723dc40be7
4 changed files with 77 additions and 160 deletions

View File

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

View File

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

View File

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

View File

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