diff --git a/asm/include/overlay_29_02314810.inc b/asm/include/overlay_29_02314810.inc index 232ac858..fe80195c 100644 --- a/asm/include/overlay_29_02314810.inc +++ b/asm/include/overlay_29_02314810.inc @@ -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 diff --git a/asm/overlay_10_rodata_022C464C.s b/asm/overlay_10_rodata_022C464C.s index 0086b7df..cff47569 100644 --- a/asm/overlay_10_rodata_022C464C.s +++ b/asm/overlay_10_rodata_022C464C.s @@ -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: diff --git a/asm/overlay_29_02314810.s b/asm/overlay_29_02314810.s index a18d11c6..6bdfbf5b 100644 --- a/asm/overlay_29_02314810.s +++ b/asm/overlay_29_02314810.s @@ -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} diff --git a/include/overlay_29_02313814.h b/include/overlay_29_02313814.h index 9e1fa15e..309bd901 100644 --- a/include/overlay_29_02313814.h +++ b/include/overlay_29_02313814.h @@ -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 diff --git a/src/overlay_29_02313814.c b/src/overlay_29_02313814.c index 05bd87d4..d371c8ec 100644 --- a/src/overlay_29_02313814.c +++ b/src/overlay_29_02313814.c @@ -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); +}