LowerSpeed

This commit is contained in:
DizzyEggg 2025-11-05 15:26:50 +01:00
parent 7380759e51
commit 38a3e5732d
5 changed files with 62 additions and 131 deletions

View File

@ -12,9 +12,10 @@
.public GetExclusiveItemWithEffectFromBag
.public IsProtectedFromNegativeStatus
.public ItemIsActive__0231513C
.public LowerSpeed
.public LogMessageByIdWithPopupCheckUserTarget
.public ov10_022C4618
.public ov10_022C488C
.public gSpeedLowerTurnRange
.public ov10_022C4890
.public ov29_022E41CC
.public ov29_022E44CC

View File

@ -434,8 +434,8 @@ gCringeTurnRange:
.global SPEED_BOOST_TURN_RANGE
SPEED_BOOST_TURN_RANGE:
.byte 0x08, 0x00, 0x0A, 0x00
.global ov10_022C488C
ov10_022C488C:
.global gSpeedLowerTurnRange
gSpeedLowerTurnRange:
.byte 0x06, 0x00, 0x08, 0x00
.global ov10_022C4890
ov10_022C4890:

View File

@ -4,134 +4,6 @@
.text
arm_func_start BoostSpeedOneStage
BoostSpeedOneStage: ; 0x0231493C
stmdb sp!, {r3, lr}
str r3, [sp]
mov r3, r2
mov r2, #1
bl BoostSpeed
ldmia sp!, {r3, pc}
arm_func_end BoostSpeedOneStage
arm_func_start LowerSpeed
LowerSpeed: ; 0x02314954
stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr}
mov sb, r1
mov sl, r0
mov r0, sb
mov r8, r2
mov r7, r3
bl EntityIsValid__023118B4
cmp r0, #0
ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
mov r0, sl
mov r1, sb
mov r2, r7
bl SafeguardIsActive
cmp r0, #0
ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
mov r0, sl
mov r1, sb
mov r2, r7
bl IsProtectedFromNegativeStatus
cmp r0, #0
ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
mov r0, #0
mov r1, sb
mov r2, r0
ldr r4, [sb, #0xb4]
bl SubstitutePlaceholderStringTags
mov r0, sb
bl CalcSpeedStageWrapper
movs fp, r0
bne _023149E8
cmp r7, #0
beq _02314AA0
ldr r2, _02314AAC ; =0x00000DDC
mov r0, sl
mov r1, sb
bl LogMessageByIdWithPopupCheckUserTarget
b _02314AA0
_023149E8:
mov r5, #0
b _02314A34
_023149F0:
mov r1, #0
b _02314A28
_023149F8:
add r6, r4, r1
#ifdef JAPAN
ldrb r0, [r6, #0x115]
#else
ldrb r0, [r6, #0x119]
#endif
cmp r0, #0
bne _02314A24
ldr r1, _02314AB0 ; =ov10_022C488C
mov r0, sb
mov r2, #1
bl CalcStatusDuration
add r0, r0, #1
#ifdef JAPAN
strb r0, [r6, #0x115]
#else
strb r0, [r6, #0x119]
#endif
b _02314A30
_02314A24:
add r1, r1, #1
_02314A28:
cmp r1, #5
blt _023149F8
_02314A30:
add r5, r5, #1
_02314A34:
cmp r5, r8
blt _023149F0
mov r0, sb
bl CalcSpeedStageWrapper
mov r4, r0
cmp fp, r4
bne _02314A6C
cmp r7, #0
beq _02314AA0
ldr r2, _02314AB4 ; =0x00000DDA
mov r0, sl
mov r1, sb
bl LogMessageByIdWithPopupCheckUserTarget
b _02314AA0
_02314A6C:
mov r0, sb
bl ov29_022E451C
ldr r0, _02314AB8 ; =ov29_02353318
mov r1, r4, lsl #1
ldrh r2, [r0, r1]
mov r0, sl
mov r1, sb
bl LogMessageByIdWithPopupCheckUserTarget
cmp r4, #0
bne _02314AA0
mov r0, sl
mov r1, sb
bl TryActivateQuickFeet
_02314AA0:
mov r0, sb
bl UpdateStatusIconFlags
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
.align 2, 0
#ifdef JAPAN
_02314AAC: .word 0x00000B1C
_02314AB0: .word ov10_022C488C
_02314AB4: .word 0x00000B1A
#else
_02314AAC: .word 0x00000DDC
_02314AB0: .word ov10_022C488C
_02314AB4: .word 0x00000DDA
#endif
_02314AB8: .word ov29_02353318
arm_func_end LowerSpeed
arm_func_start TrySealMove
TrySealMove: ; 0x02314ABC
stmdb sp!, {r4, r5, r6, r7, r8, sb, lr}

View File

@ -37,5 +37,7 @@ bool8 TryInflictParalysisStatus(struct entity *user, struct entity *target, bool
// Checks if a monster is a team member under the effects of a certain exclusive item effect.
bool8 ExclusiveItemEffectIsActive__023147EC(struct entity *entity, enum exclusive_item_effect_id effect_id);
void BoostSpeed(struct entity *user, struct entity *target, s32 nStages, s32 turns, bool8 displayMessage);
void BoostSpeedOneStage(struct entity *user, struct entity *target, s32 turns, bool8 displayMessage);
void LowerSpeed(struct entity *user, struct entity *target, s32 nStages, bool8 displayMessage);
#endif //PMDSKY_OVERLAY_29_02313814_H

View File

@ -29,6 +29,7 @@ extern void ov29_022E4338(struct entity *);
extern void PlayCringeExclamationPointEffect(struct entity *);
extern void ov29_022E4240(struct entity *);
extern void ov29_022E44CC(struct entity *);
extern void ov29_022E451C(struct entity *);
extern fx32_8 MultiplyByFixedPoint(fx32_8 a, fx32_8 b);
extern bool8 IsProtectedFromNegativeStatus(struct entity *user ,struct entity *target, bool8 displayMessage);
extern bool8 SafeguardIsActive(struct entity *user ,struct entity *target, bool8 displayMessage);
@ -45,6 +46,7 @@ extern int CalcSpeedStage(struct entity *, int);
extern const s16 gCringeTurnRange[];
extern const s16 gParalysisTurnRange[];
extern const s16 gSpeedLowerTurnRange[];
extern const s16 SPEED_BOOST_TURN_RANGE[];
extern const u16 ov29_02353318[];
@ -736,3 +738,57 @@ void BoostSpeed(struct entity *user, struct entity *target, s32 nStages, s32 tur
UpdateStatusIconFlags(target);
}
void BoostSpeedOneStage(struct entity *user, struct entity *target, s32 turns, bool8 displayMessage)
{
BoostSpeed(user, target, 1, turns, displayMessage);
}
void LowerSpeed(struct entity *user, struct entity *target, s32 nStages, bool8 displayMessage)
{
s32 speedBefore;
s32 speedAfter;
struct monster *entityInfo;
if (!EntityIsValid__023118B4(target))
return;
if (SafeguardIsActive(user,target,displayMessage))
return;
if (IsProtectedFromNegativeStatus(user, target, displayMessage))
return;
entityInfo = GetEntInfo(target);
SubstitutePlaceholderStringTags(0,target,0);
speedBefore = CalcSpeedStageWrapper(target);
if (speedBefore == 0) {
if (displayMessage)
LogMessageByIdWithPopupCheckUserTarget(user,target,0xddc + JPN_MSG_OFFSET);
}
else {
s32 counter, i;
for (counter = 0; counter < nStages; counter++) {
for (i = 0; i < NUM_SPEED_COUNTERS; i++) {
if (entityInfo->speed_down_counters[i] == 0) {
entityInfo->speed_down_counters[i] = CalcStatusDuration(target,gSpeedLowerTurnRange,TRUE) + 1;
break;
}
}
}
speedAfter = CalcSpeedStageWrapper(target);
if (speedBefore == speedAfter) {
if (displayMessage)
LogMessageByIdWithPopupCheckUserTarget(user,target,0xdda + JPN_MSG_OFFSET);
}
else {
ov29_022E451C(target);
LogMessageByIdWithPopupCheckUserTarget(user,target,ov29_02353318[speedAfter]);
if (speedAfter == 0) {
TryActivateQuickFeet(user, target);
}
}
}
UpdateStatusIconFlags(target);
}