up to TryInflictParalysisStatus

This commit is contained in:
DizzyEggg 2025-11-05 11:40:17 +01:00
parent ba2816bf9f
commit 801ac7c93a
8 changed files with 111 additions and 331 deletions

View File

@ -17,7 +17,7 @@
.public LogMessageByIdWithPopupCheckUserTarget
.public MultiplyByFixedPoint
.public gCringeTurnRange
.public ov10_022C4894
.public gParalysisTurnRange
.public ov29_022E4240
.public ov29_022E4338
.public PlayOffensiveStatMultiplierUpEffect

View File

@ -440,8 +440,8 @@ ov10_022C488C:
.global ov10_022C4890
ov10_022C4890:
.byte 0x06, 0x00, 0x0C, 0x00
.global ov10_022C4894
ov10_022C4894:
.global gParalysisTurnRange
gParalysisTurnRange:
.byte 0x01, 0x00, 0x02, 0x00
.global ov10_022C4898
ov10_022C4898:

View File

@ -1,302 +0,0 @@
.include "asm/macros.inc"
.include "overlay_29_02313CE4.inc"
.text
arm_func_start TryInflictCringeStatus
TryInflictCringeStatus: ; 0x023143E8
stmdb sp!, {r3, r4, r5, r6, r7, lr}
mov r6, r1
mov r7, r0
mov r5, r2
mov r4, r3
bl AllocateTemp1024ByteBufferFromPool
mov r0, r6
bl EntityIsValid__023118B4
cmp r0, #0
moveq r0, #0
ldmeqia sp!, {r3, r4, r5, r6, r7, pc}
mov r0, r7
mov r1, r6
mov r2, r5
bl SafeguardIsActive
cmp r0, #0
movne r0, #0
ldmneia sp!, {r3, r4, r5, r6, r7, pc}
mov r0, r7
mov r1, r6
mov r2, r5
bl IsProtectedFromNegativeStatus
cmp r0, #0
movne r0, #0
ldmneia sp!, {r3, r4, r5, r6, r7, pc}
mov r0, r7
mov r1, r6
mov r2, #0x1f
#ifndef JAPAN
mov r3, #1
#endif
bl DefenderAbilityIsActive__02311B94
cmp r0, #0
beq _02314498
mov r0, #0
mov r1, r6
mov r2, r0
bl SubstitutePlaceholderStringTags
cmp r5, #0
beq _02314490
ldr r2, _02314534 ; =0x00000DA2
mov r0, r7
mov r1, r6
bl LogMessageByIdWithPopupCheckUserTarget
_02314490:
mov r0, #0
ldmia sp!, {r3, r4, r5, r6, r7, pc}
_02314498:
cmp r4, #0
movne r0, #1
ldmneia sp!, {r3, r4, r5, r6, r7, pc}
mov r0, #0
ldr r4, [r6, #0xb4]
mov r1, r6
mov r2, r0
bl SubstitutePlaceholderStringTags
ldrb r0, [r4, #0xd0]
cmp r0, #1
beq _02314514
ldr r1, _02314538 ; =gCringeTurnRange
mov r2, #1
mov r0, r6
strb r2, [r4, #0xd0]
bl CalcStatusDuration
add r1, r0, #1
mov r0, r6
strb r1, [r4, #0xd1]
bl PlayCringeExclamationPointEffect
ldr r2, _0231453C ; =0x00000D02
mov r0, r7
mov r1, r6
bl LogMessageByIdWithPopupCheckUserTarget
mov r0, r7
mov r1, r6
bl TryActivateSteadfast
mov r0, r7
mov r1, r6
bl TryActivateQuickFeet
b _02314524
_02314514:
ldr r2, _02314540 ; =0x00000D03
mov r0, r7
mov r1, r6
bl LogMessageByIdWithPopupCheckUserTarget
_02314524:
mov r0, r6
bl UpdateStatusIconFlags
mov r0, #1
ldmia sp!, {r3, r4, r5, r6, r7, pc}
.align 2, 0
#ifdef JAPAN
#define TRY_INFLICT_CRINGE_STATUS_OFFSET -0x2C0
#else
#define TRY_INFLICT_CRINGE_STATUS_OFFSET 0
#endif
_02314534: .word 0x00000DA2 + TRY_INFLICT_CRINGE_STATUS_OFFSET
_02314538: .word gCringeTurnRange
_0231453C: .word 0x00000D02 + TRY_INFLICT_CRINGE_STATUS_OFFSET
_02314540: .word 0x00000D03 + TRY_INFLICT_CRINGE_STATUS_OFFSET
arm_func_end TryInflictCringeStatus
arm_func_start TryInflictParalysisStatus
TryInflictParalysisStatus: ; 0x02314544
#ifdef JAPAN
#define TRY_INFLICT_PARALYSIS_STATUS_OFFSET -0x2C0
#else
#define TRY_INFLICT_PARALYSIS_STATUS_OFFSET 0
#endif
stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
sub sp, sp, #0xc
mov sb, r1
mov sl, r0
mov r0, sb
mov r8, r2
mov r4, r3
bl EntityIsValid__023118B4
cmp r0, #0
moveq r0, #0
beq _023147D0
mov r0, sl
mov r1, sb
mov r2, r8
bl SafeguardIsActive
cmp r0, #0
movne r0, #0
bne _023147D0
mov r0, sl
mov r1, sb
mov r2, r8
bl IsProtectedFromNegativeStatus
cmp r0, #0
movne r0, #0
bne _023147D0
mov r0, sl
mov r1, sb
mov r2, #0x16
#ifndef JAPAN
mov r3, #1
#endif
bl DefenderAbilityIsActive__02311B94
cmp r0, #0
beq _023145F4
mov r0, #0
mov r1, sb
mov r2, r0
bl SubstitutePlaceholderStringTags
cmp r8, #0
beq _023145EC
mov r0, sl
mov r1, sb
mov r2, #0xda0 + TRY_INFLICT_PARALYSIS_STATUS_OFFSET
bl LogMessageByIdWithPopupCheckUserTarget
_023145EC:
mov r0, #0
b _023147D0
_023145F4:
mov r0, sb
mov r1, #1
bl ExclusiveItemEffectIsActive__023147EC
cmp r0, #0
beq _02314654
cmp r8, #0
beq _0231464C
mov r0, #0
mov r1, sb
mov r2, r0
bl SubstitutePlaceholderStringTags
add r2, sp, #4
mov r0, sb
mov r1, #1
bl GetExclusiveItemWithEffectFromBag
add r1, sp, #4
mov r0, #1
bl PrepareItemForPrinting__02345728
ldr r2, _023147D8 ; =0x00000DA1
mov r0, sl
mov r1, sb
bl LogMessageByIdWithPopupCheckUserTarget
_0231464C:
mov r0, #0
b _023147D0
_02314654:
cmp r4, #0
movne r0, #1
bne _023147D0
mov r0, #0
ldr r7, [sb, #0xb4]
mov r1, sb
mov r2, r0
mov r4, #1
bl SubstitutePlaceholderStringTags
ldrb r0, [r7, #0xbf]
cmp r0, #4
beq _023146E0
ldr r1, _023147DC ; =ov10_022C4894
mov r3, #4
mov r0, sb
mov r2, r4
strb r3, [r7, #0xbf]
bl CalcStatusDuration
add r0, r0, #1
strb r0, [r7, #0xc0]
mov r4, #0
strb r4, [r7, #0xc1]
mov r0, sl
mov r1, sb
mov r2, #0xd00 + TRY_INFLICT_PARALYSIS_STATUS_OFFSET
strb r4, [r7, #0xc2]
bl LogMessageByIdWithPopupCheckUserTarget
mov r0, sb
bl ov29_022E4240
mov r0, sb
bl CalcSpeedStageWrapper
mov r0, sl
mov r1, sb
bl TryActivateQuickFeet
b _023146F0
_023146E0:
ldr r2, _023147E0 ; =0x00000D01
mov r0, sl
mov r1, sb
bl LogMessageByIdWithPopupCheckUserTarget
_023146F0:
mov r0, sb
mov r1, #0x19
bl AbilityIsActiveVeneer
cmp r0, #0
beq _023147C4
cmp r4, #0
bne _023147C4
mov r5, #0
ldr fp, _023147E4 ; =DIRECTIONS_XY
mov r4, r5
_02314718:
mov r1, r4, lsl #2
add r0, fp, r4, lsl #2
ldrsh r6, [sb, #4]
ldrsh r3, [fp, r1]
ldrsh r1, [r0, #2]
ldrsh r2, [sb, #6]
add r0, r6, r3
add r1, r2, r1
bl GetTile
ldr r6, [r0, #0xc]
mov r0, r6
bl EntityIsValid__023118B4
cmp r0, #0
beq _023147B8
ldr r0, [r6]
cmp r0, #1
bne _023147B8
cmp r5, #0
bne _02314790
mov r5, #1
bl GetMessageLogPreprocessorArgs
mov r1, #0
mov r2, r7
mov r3, r1
str r1, [sp]
bl SetPreprocessorArgsStringToName
ldr r2, _023147E8 ; =0x00000DC5
mov r0, sl
mov r1, sb
bl LogMessageByIdWithPopupCheckUserTarget
_02314790:
mov r0, sb
mov r1, r6
bl GetTreatmentBetweenMonstersIgnoreStatus
cmp r0, #1
bne _023147B8
mov r0, sl
mov r1, r6
mov r2, r8
mov r3, #0
bl TryInflictParalysisStatus
_023147B8:
add r4, r4, #1
cmp r4, #8
blt _02314718
_023147C4:
mov r0, sb
bl UpdateStatusIconFlags
mov r0, #1
_023147D0:
add sp, sp, #0xc
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc}
.align 2, 0
_023147D8: .word 0x00000DA1 + TRY_INFLICT_PARALYSIS_STATUS_OFFSET
_023147DC: .word ov10_022C4894
_023147E0: .word 0x00000D01 + TRY_INFLICT_PARALYSIS_STATUS_OFFSET
_023147E4: .word DIRECTIONS_XY
_023147E8: .word 0x00000DC5 + TRY_INFLICT_PARALYSIS_STATUS_OFFSET
arm_func_end TryInflictParalysisStatus

View File

@ -32,6 +32,9 @@ void ApplyOffensiveStatMultiplier(struct entity *user, struct entity *target, st
void ApplyDefensiveStatMultiplier(struct entity *user, struct entity *target, struct StatIndex stat, fx32_8 multiplier, bool8 displayMessage);
void BoostHitChanceStat(struct entity *user, struct entity *target, struct StatIndex stat);
void LowerHitChanceStat(struct entity *user, struct entity *target, struct StatIndex stat, bool8 displayMessage);
bool8 CringeStatusTarget(struct entity *user ,struct entity *target, bool8 displayMessage, bool8 onlyCheck);
bool8 TryInflictCringeStatus(struct entity *user ,struct entity *target, bool8 displayMessage, bool8 onlyCheck);
bool8 TryInflictParalysisStatus(struct entity *user, struct entity *target, bool8 displayMessage, bool8 onlyCheck);
// 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);
#endif //PMDSKY_OVERLAY_29_02313814_H

View File

@ -1,9 +0,0 @@
#ifndef PMDSKY_OVERLAY_29_023147EC_H
#define PMDSKY_OVERLAY_29_023147EC_H
#include "dungeon_mode.h"
// 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);
#endif //PMDSKY_OVERLAY_29_023147EC_H

View File

@ -542,8 +542,6 @@ 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_02313CE4.o
Object src/overlay_29_023147EC.o
Object asm/overlay_29_02314810.o
Object src/overlay_29_02315118.o
Object asm/overlay_29_0231516C.o

View File

@ -3,7 +3,10 @@
#include "overlay_29_023118B4.h"
#include "overlay_29_02313814.h"
#include "overlay_29_02311BF8.h"
#include "overlay_29_023018AC.h"
#include "math.h"
#include "dungeon_util.h"
#include "exclusive_item.h"
extern u8* AllocateTemp1024ByteBufferFromPool(void);
extern void CopyStringFromId(u8* buf, u32 string_id);
@ -24,14 +27,22 @@ extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct e
extern void UpdateStatusIconFlags(struct entity *);
extern void ov29_022E4338(struct entity *);
extern void PlayCringeExclamationPointEffect(struct entity *);
extern void ov29_022E4240(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);
extern void TryActivateSteadfast(struct entity *user ,struct entity *target);
extern void TryActivateQuickFeet(struct entity *user ,struct entity *target);
extern s32 CalcStatusDuration(struct entity *target, const s16 *turnRange, bool8 factorCurerSkills);
extern struct tile* GetTile(int x, int y);
extern bool8 GetExclusiveItemWithEffectFromBag(struct entity *, enum exclusive_item_effect_id effect_id, struct item *);
extern struct preprocessor_args* GetMessageLogPreprocessorArgs(void);
extern void SetPreprocessorArgsStringToName(struct preprocessor_args* preprocessor_args, u8 pos,struct monster* monster, u8 param_4, u8 name_type);
extern void PrepareItemForPrinting__02345728(u8, struct item*);
extern int CalcSpeedStageWrapper(struct entity* entity);
extern const s16 gCringeTurnRange[2];
extern const s16 gCringeTurnRange[];
extern const s16 gParalysisTurnRange[];
#ifdef JAPAN
#define JPN_MSG_OFFSET -0x2C0
@ -542,7 +553,7 @@ void LowerHitChanceStat(struct entity *user, struct entity *target, struct StatI
UpdateStatusIconFlags(target);
}
bool8 CringeStatusTarget(struct entity *user ,struct entity *target, bool8 displayMessage, bool8 onlyCheck)
bool8 TryInflictCringeStatus(struct entity *user ,struct entity *target, bool8 displayMessage, bool8 onlyCheck)
{
struct monster *entityInfo;
u8 *buffer1 = AllocateTemp1024ByteBufferFromPool();
@ -586,3 +597,94 @@ bool8 CringeStatusTarget(struct entity *user ,struct entity *target, bool8 displ
UpdateStatusIconFlags(target);
return TRUE;
}
bool8 TryInflictParalysisStatus(struct entity *user, struct entity *target, bool8 displayMessage, bool8 onlyCheck)
{
struct monster *entityInfo;
bool8 alreadyParalyzed;
if (!EntityIsValid__023118B4(target))
return FALSE;
if (SafeguardIsActive(user, target, displayMessage))
return FALSE;
if (IsProtectedFromNegativeStatus(user, target, displayMessage))
return FALSE;
#ifdef JAPAN
if (DefenderAbilityIsActive__02311B94(user, target, ABILITY_LIMBER)) {
#else
if (DefenderAbilityIsActive__02311B94(user, target, ABILITY_LIMBER, TRUE)) {
#endif
SubstitutePlaceholderStringTags(0,target,0);
if (displayMessage)
LogMessageByIdWithPopupCheckUserTarget(user,target,0xda0 + JPN_MSG_OFFSET);
return FALSE;
}
if (ExclusiveItemEffectIsActive__023147EC(target, EXCLUSIVE_EFF_NO_PARALYSIS)) {
if (displayMessage) {
struct item item;
SubstitutePlaceholderStringTags(0,target,0);
GetExclusiveItemWithEffectFromBag(target, EXCLUSIVE_EFF_NO_PARALYSIS, &item);
PrepareItemForPrinting__02345728(1, &item);
LogMessageByIdWithPopupCheckUserTarget(user,target,0xda1 + JPN_MSG_OFFSET);
}
return FALSE;
}
if (onlyCheck)
return TRUE;
alreadyParalyzed = TRUE;
entityInfo = GetEntInfo(target);
SubstitutePlaceholderStringTags(0,target,0);
if (entityInfo->burn_class_status.burn != STATUS_BURN_PARALYSIS) {
entityInfo->burn_class_status.burn = STATUS_BURN_PARALYSIS;
entityInfo->burn_class_status.burn_turns = CalcStatusDuration(target,gParalysisTurnRange,TRUE) + 1;
entityInfo->burn_class_status.burn_damage_countdown = 0;
entityInfo->burn_class_status.badly_poisoned_damage_count = 0;
alreadyParalyzed = FALSE;
LogMessageByIdWithPopupCheckUserTarget(user,target,0xd00 + JPN_MSG_OFFSET);
ov29_022E4240(target);
CalcSpeedStageWrapper(target);
TryActivateQuickFeet(user, target);
}
else {
LogMessageByIdWithPopupCheckUserTarget(user,target,0xd01 + JPN_MSG_OFFSET);
}
if (AbilityIsActiveVeneer(target, ABILITY_SYNCHRONIZE) && !alreadyParalyzed) {
s32 i;
bool8 synchronizePrinted = FALSE;
for (i = 0; i < NUM_DIRECTIONS; i++) {
const struct tile *mapTile = GetTile(target->pos.x + DIRECTIONS_XY[i].x,target->pos.y + DIRECTIONS_XY[i].y);
struct entity *mapMonster = mapTile->monster;
if (EntityIsValid__023118B4(mapMonster) && GetEntityType(mapMonster) == ENTITY_MONSTER) {
if (!synchronizePrinted) {
synchronizePrinted = TRUE;
SetPreprocessorArgsStringToName(GetMessageLogPreprocessorArgs(),0,entityInfo,0,0);
LogMessageByIdWithPopupCheckUserTarget(user,target,0xdc5 + JPN_MSG_OFFSET);
}
if (GetTreatmentBetweenMonstersIgnoreStatus(target,mapMonster) == TREATMENT_TREAT_AS_ENEMY) {
TryInflictParalysisStatus(user, mapMonster, displayMessage, FALSE);
}
}
}
}
UpdateStatusIconFlags(target);
return TRUE;
}
bool8 ExclusiveItemEffectIsActive__023147EC(struct entity *entity, enum exclusive_item_effect_id effect_id)
{
struct monster *monster = GetEntInfo(entity);
if (!monster->is_not_team_member)
return ExclusiveItemEffectFlagTest(monster->exclusive_item_effect_flags, effect_id);
return FALSE;
}

View File

@ -1,12 +0,0 @@
#include "overlay_29_023147EC.h"
#include "dungeon_util_static.h"
#include "exclusive_item.h"
bool8 ExclusiveItemEffectIsActive__023147EC(struct entity *entity, enum exclusive_item_effect_id effect_id)
{
struct monster *monster = GetEntInfo(entity);
if (!monster->is_not_team_member)
return ExclusiveItemEffectFlagTest(monster->exclusive_item_effect_flags, effect_id);
return FALSE;
}