mirror of
https://github.com/pret/pmd-sky.git
synced 2026-03-21 17:25:15 -05:00
Merge pull request #205 from DizzyEggg/stat_functions
Some checks are pending
build / build (push) Waiting to run
Some checks are pending
build / build (push) Waiting to run
Decompile & Sync with pmd-red some stat lowering functions
This commit is contained in:
commit
e1ce72db65
|
|
@ -11,7 +11,7 @@
|
|||
.public ExclusiveItemEffectIsActive__0230A9B8
|
||||
.public FixedPoint32To64
|
||||
.public FixedPoint64IsZero
|
||||
.public FlashFireShouldActivate
|
||||
.public GetFlashFireStatus
|
||||
.public GetApparentWeather
|
||||
.public GetTypeMatchup
|
||||
.public GhostImmunityIsActive
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@
|
|||
.public FixedPoint64CmpLt
|
||||
.public FixedPoint64ToInt
|
||||
.public FixedRoomIsSubstituteRoom
|
||||
.public FlashFireShouldActivate
|
||||
.public GetFlashFireStatus
|
||||
.public GendersEqualNotGenderless
|
||||
.public GendersNotEqualNotGenderless
|
||||
.public GenerateStandardItem
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1,11 +0,0 @@
|
|||
#pragma once
|
||||
.public AbilityIsActiveVeneer
|
||||
.public AllocateTemp1024ByteBufferFromPool
|
||||
.public CopyStringFromId
|
||||
.public EntityIsValid__023118B4
|
||||
.public LogMessageByIdWithPopupCheckUserTarget
|
||||
.public SetMessageLogPreprocessorArgsString
|
||||
.public SubstitutePlaceholderStringTags
|
||||
.public UpdateStatusIconFlags
|
||||
.public ov29_022E4E74
|
||||
.public ov29_022E4F1C
|
||||
|
|
@ -16,18 +16,18 @@
|
|||
.public ItemIsActive__02311BF8
|
||||
.public LogMessageByIdWithPopupCheckUserTarget
|
||||
.public MultiplyByFixedPoint
|
||||
.public ov10_022C4884
|
||||
.public ov10_022C4894
|
||||
.public ov29_022E4240
|
||||
.public CRINGE_TURN_RANGE
|
||||
.public PARALYSIS_TURN_RANGE
|
||||
.public PlayParalysisEffect
|
||||
.public ov29_022E4338
|
||||
.public ov29_022E4FC0
|
||||
.public ov29_022E5068
|
||||
.public ov29_022E510C
|
||||
.public ov29_022E51B0
|
||||
.public ov29_022E5258
|
||||
.public ov29_022E52F8
|
||||
.public PlayOffensiveStatMultiplierUpEffect
|
||||
.public PlayOffensiveStatMultiplierDownEffect
|
||||
.public PlayDefensiveStatMultiplierUpEffect
|
||||
.public PlayDefensiveStatMultiplierDownEffect
|
||||
.public PlayHitChanceUpEffect
|
||||
.public PlayHitChanceDownEffect
|
||||
.public GetTreatmentBetweenMonstersIgnoreStatus
|
||||
.public PlayExclamationPointEffect__022E5D4C
|
||||
.public PlayCringeExclamationPointEffect
|
||||
.public PrepareItemForPrinting__02345728
|
||||
.public SafeguardIsActive
|
||||
.public SetMessageLogPreprocessorArgsString
|
||||
|
|
|
|||
|
|
@ -6,18 +6,20 @@
|
|||
.public DungeonRandInt
|
||||
.public DungeonRandOutcome__022EAB20
|
||||
.public EntityIsValid__023118B4
|
||||
.public BoostSpeed
|
||||
.public EntityIsValid__02315118
|
||||
.public ExclusiveItemEffectIsActive__023147EC
|
||||
.public GetExclusiveItemWithEffectFromBag
|
||||
.public IsProtectedFromNegativeStatus
|
||||
.public ItemIsActive__0231513C
|
||||
.public LowerSpeed
|
||||
.public LogMessageByIdWithPopupCheckUserTarget
|
||||
.public ov10_022C4618
|
||||
.public ov10_022C488C
|
||||
.public SPEED_LOWER_TURN_RANGE
|
||||
.public ov10_022C4890
|
||||
.public ov29_022E41CC
|
||||
.public ov29_022E44CC
|
||||
.public ov29_022E451C
|
||||
.public PlaySpeedUpEffect
|
||||
.public PlaySpeedDownEffect
|
||||
.public ov29_022E543C
|
||||
.public ov29_022E60E4
|
||||
.public ov29_02353318
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@
|
|||
.public FACADE_DAMAGE_MULTIPLIER
|
||||
.public FLAME_WHEEL_BURN_CHANCE
|
||||
.public FLAMETHROWER_BURN_CHANCE
|
||||
.public FlashFireShouldActivate
|
||||
.public GetFlashFireStatus
|
||||
.public FOCUS_PUNCH_DAMAGE_MULTIPLIER
|
||||
.public FormatMoveStringMore
|
||||
.public GetApparentWeather
|
||||
|
|
|
|||
|
|
@ -428,20 +428,20 @@ ov10_022C487C:
|
|||
.global ov10_022C4880
|
||||
ov10_022C4880:
|
||||
.byte 0x7F, 0x00, 0x7F, 0x00
|
||||
.global ov10_022C4884
|
||||
ov10_022C4884:
|
||||
.global CRINGE_TURN_RANGE
|
||||
CRINGE_TURN_RANGE:
|
||||
.byte 0x01, 0x00, 0x01, 0x00
|
||||
.global SPEED_BOOST_TURN_RANGE
|
||||
SPEED_BOOST_TURN_RANGE:
|
||||
.byte 0x08, 0x00, 0x0A, 0x00
|
||||
.global ov10_022C488C
|
||||
ov10_022C488C:
|
||||
.global SPEED_LOWER_TURN_RANGE
|
||||
SPEED_LOWER_TURN_RANGE:
|
||||
.byte 0x06, 0x00, 0x08, 0x00
|
||||
.global ov10_022C4890
|
||||
ov10_022C4890:
|
||||
.byte 0x06, 0x00, 0x0C, 0x00
|
||||
.global ov10_022C4894
|
||||
ov10_022C4894:
|
||||
.global PARALYSIS_TURN_RANGE
|
||||
PARALYSIS_TURN_RANGE:
|
||||
.byte 0x01, 0x00, 0x02, 0x00
|
||||
.global ov10_022C4898
|
||||
ov10_022C4898:
|
||||
|
|
|
|||
|
|
@ -863,8 +863,8 @@ ov29_022E41F0: ; 0x022E41F0
|
|||
_022E423C: .word 0x000001A7
|
||||
arm_func_end ov29_022E41F0
|
||||
|
||||
arm_func_start ov29_022E4240
|
||||
ov29_022E4240: ; 0x022E4240
|
||||
arm_func_start PlayParalysisEffect
|
||||
PlayParalysisEffect: ; 0x022E4240
|
||||
stmdb sp!, {r4, lr}
|
||||
sub sp, sp, #0x10
|
||||
mov r4, r0
|
||||
|
|
@ -886,7 +886,7 @@ ov29_022E4240: ; 0x022E4240
|
|||
ldmia sp!, {r4, pc}
|
||||
.align 2, 0
|
||||
_022E428C: .word 0x000001A7
|
||||
arm_func_end ov29_022E4240
|
||||
arm_func_end PlayParalysisEffect
|
||||
|
||||
arm_func_start ov29_022E4290
|
||||
ov29_022E4290: ; 0x022E4290
|
||||
|
|
@ -1083,8 +1083,8 @@ ov29_022E4480: ; 0x022E4480
|
|||
ldmia sp!, {r4, pc}
|
||||
arm_func_end ov29_022E4480
|
||||
|
||||
arm_func_start ov29_022E44CC
|
||||
ov29_022E44CC: ; 0x022E44CC
|
||||
arm_func_start PlaySpeedUpEffect
|
||||
PlaySpeedUpEffect: ; 0x022E44CC
|
||||
stmdb sp!, {r4, lr}
|
||||
sub sp, sp, #0x10
|
||||
mov r4, r0
|
||||
|
|
@ -1106,10 +1106,10 @@ ov29_022E44CC: ; 0x022E44CC
|
|||
ldmia sp!, {r4, pc}
|
||||
.align 2, 0
|
||||
_022E4518: .word 0x0000018B
|
||||
arm_func_end ov29_022E44CC
|
||||
arm_func_end PlaySpeedUpEffect
|
||||
|
||||
arm_func_start ov29_022E451C
|
||||
ov29_022E451C: ; 0x022E451C
|
||||
arm_func_start PlaySpeedDownEffect
|
||||
PlaySpeedDownEffect: ; 0x022E451C
|
||||
stmdb sp!, {r4, lr}
|
||||
sub sp, sp, #0x10
|
||||
mov r4, r0
|
||||
|
|
@ -1131,7 +1131,7 @@ ov29_022E451C: ; 0x022E451C
|
|||
ldmia sp!, {r4, pc}
|
||||
.align 2, 0
|
||||
_022E4568: .word 0x0000018A
|
||||
arm_func_end ov29_022E451C
|
||||
arm_func_end PlaySpeedDownEffect
|
||||
|
||||
arm_func_start ov29_022E456C
|
||||
ov29_022E456C: ; 0x022E456C
|
||||
|
|
@ -1825,8 +1825,8 @@ ov29_022E4D24: ; 0x022E4D24
|
|||
bx lr
|
||||
arm_func_end ov29_022E4D24
|
||||
|
||||
arm_func_start ov29_022E4D28
|
||||
ov29_022E4D28: ; 0x022E4D28
|
||||
arm_func_start PlayOffensiveStatDownEffect
|
||||
PlayOffensiveStatDownEffect: ; 0x022E4D28
|
||||
stmdb sp!, {r0, r1, r2, r3}
|
||||
stmdb sp!, {r4, lr}
|
||||
sub sp, sp, #0x10
|
||||
|
|
@ -1871,10 +1871,10 @@ _022E4DB8:
|
|||
bx lr
|
||||
.align 2, 0
|
||||
_022E4DC8: .word 0x00000193
|
||||
arm_func_end ov29_022E4D28
|
||||
arm_func_end PlayOffensiveStatDownEffect
|
||||
|
||||
arm_func_start ov29_022E4DCC
|
||||
ov29_022E4DCC: ; 0x022E4DCC
|
||||
arm_func_start PlayDefensiveStatDownEffect
|
||||
PlayDefensiveStatDownEffect: ; 0x022E4DCC
|
||||
stmdb sp!, {r0, r1, r2, r3}
|
||||
stmdb sp!, {r4, lr}
|
||||
sub sp, sp, #0x10
|
||||
|
|
@ -1920,10 +1920,10 @@ _022E4E5C:
|
|||
.align 2, 0
|
||||
_022E4E6C: .word 0x0000018F
|
||||
_022E4E70: .word 0x00000191
|
||||
arm_func_end ov29_022E4DCC
|
||||
arm_func_end PlayDefensiveStatDownEffect
|
||||
|
||||
arm_func_start ov29_022E4E74
|
||||
ov29_022E4E74: ; 0x022E4E74
|
||||
arm_func_start PlayOffensiveStatUpEffect
|
||||
PlayOffensiveStatUpEffect: ; 0x022E4E74
|
||||
stmdb sp!, {r0, r1, r2, r3}
|
||||
stmdb sp!, {r4, lr}
|
||||
sub sp, sp, #0x10
|
||||
|
|
@ -1969,10 +1969,10 @@ _022E4F04:
|
|||
.align 2, 0
|
||||
_022E4F14: .word 0x000001A9
|
||||
_022E4F18: .word 0x00000192
|
||||
arm_func_end ov29_022E4E74
|
||||
arm_func_end PlayOffensiveStatUpEffect
|
||||
|
||||
arm_func_start ov29_022E4F1C
|
||||
ov29_022E4F1C: ; 0x022E4F1C
|
||||
arm_func_start PlayDefensiveStatUpEffect
|
||||
PlayDefensiveStatUpEffect: ; 0x022E4F1C
|
||||
stmdb sp!, {r0, r1, r2, r3}
|
||||
stmdb sp!, {r4, lr}
|
||||
sub sp, sp, #0x10
|
||||
|
|
@ -2017,10 +2017,10 @@ _022E4FAC:
|
|||
bx lr
|
||||
.align 2, 0
|
||||
_022E4FBC: .word 0x0000018E
|
||||
arm_func_end ov29_022E4F1C
|
||||
arm_func_end PlayDefensiveStatUpEffect
|
||||
|
||||
arm_func_start ov29_022E4FC0
|
||||
ov29_022E4FC0: ; 0x022E4FC0
|
||||
arm_func_start PlayOffensiveStatMultiplierUpEffect
|
||||
PlayOffensiveStatMultiplierUpEffect: ; 0x022E4FC0
|
||||
stmdb sp!, {r0, r1, r2, r3}
|
||||
stmdb sp!, {r4, lr}
|
||||
sub sp, sp, #0x10
|
||||
|
|
@ -2066,10 +2066,10 @@ _022E5050:
|
|||
.align 2, 0
|
||||
_022E5060: .word 0x000001A9
|
||||
_022E5064: .word 0x00000192
|
||||
arm_func_end ov29_022E4FC0
|
||||
arm_func_end PlayOffensiveStatMultiplierUpEffect
|
||||
|
||||
arm_func_start ov29_022E5068
|
||||
ov29_022E5068: ; 0x022E5068
|
||||
arm_func_start PlayOffensiveStatMultiplierDownEffect
|
||||
PlayOffensiveStatMultiplierDownEffect: ; 0x022E5068
|
||||
stmdb sp!, {r0, r1, r2, r3}
|
||||
stmdb sp!, {r4, lr}
|
||||
sub sp, sp, #0x10
|
||||
|
|
@ -2114,10 +2114,10 @@ _022E50F8:
|
|||
bx lr
|
||||
.align 2, 0
|
||||
_022E5108: .word 0x00000193
|
||||
arm_func_end ov29_022E5068
|
||||
arm_func_end PlayOffensiveStatMultiplierDownEffect
|
||||
|
||||
arm_func_start ov29_022E510C
|
||||
ov29_022E510C: ; 0x022E510C
|
||||
arm_func_start PlayDefensiveStatMultiplierUpEffect
|
||||
PlayDefensiveStatMultiplierUpEffect: ; 0x022E510C
|
||||
stmdb sp!, {r0, r1, r2, r3}
|
||||
stmdb sp!, {r4, lr}
|
||||
sub sp, sp, #0x10
|
||||
|
|
@ -2162,10 +2162,10 @@ _022E519C:
|
|||
bx lr
|
||||
.align 2, 0
|
||||
_022E51AC: .word 0x0000018E
|
||||
arm_func_end ov29_022E510C
|
||||
arm_func_end PlayDefensiveStatMultiplierUpEffect
|
||||
|
||||
arm_func_start ov29_022E51B0
|
||||
ov29_022E51B0: ; 0x022E51B0
|
||||
arm_func_start PlayDefensiveStatMultiplierDownEffect
|
||||
PlayDefensiveStatMultiplierDownEffect: ; 0x022E51B0
|
||||
stmdb sp!, {r0, r1, r2, r3}
|
||||
stmdb sp!, {r4, lr}
|
||||
sub sp, sp, #0x10
|
||||
|
|
@ -2211,10 +2211,10 @@ _022E5240:
|
|||
.align 2, 0
|
||||
_022E5250: .word 0x0000018F
|
||||
_022E5254: .word 0x00000191
|
||||
arm_func_end ov29_022E51B0
|
||||
arm_func_end PlayDefensiveStatMultiplierDownEffect
|
||||
|
||||
arm_func_start ov29_022E5258
|
||||
ov29_022E5258: ; 0x022E5258
|
||||
arm_func_start PlayHitChanceUpEffect
|
||||
PlayHitChanceUpEffect: ; 0x022E5258
|
||||
stmdb sp!, {r0, r1, r2, r3}
|
||||
stmdb sp!, {r4, lr}
|
||||
sub sp, sp, #0x10
|
||||
|
|
@ -2257,10 +2257,10 @@ _022E52E8:
|
|||
ldmia sp!, {r4, lr}
|
||||
add sp, sp, #0x10
|
||||
bx lr
|
||||
arm_func_end ov29_022E5258
|
||||
arm_func_end PlayHitChanceUpEffect
|
||||
|
||||
arm_func_start ov29_022E52F8
|
||||
ov29_022E52F8: ; 0x022E52F8
|
||||
arm_func_start PlayHitChanceDownEffect
|
||||
PlayHitChanceDownEffect: ; 0x022E52F8
|
||||
stmdb sp!, {r0, r1, r2, r3}
|
||||
stmdb sp!, {r4, lr}
|
||||
sub sp, sp, #0x10
|
||||
|
|
@ -2305,10 +2305,10 @@ _022E5388:
|
|||
bx lr
|
||||
.align 2, 0
|
||||
_022E5398: .word 0x0000018D
|
||||
arm_func_end ov29_022E52F8
|
||||
arm_func_end PlayHitChanceDownEffect
|
||||
|
||||
arm_func_start PlayExclamationPointEffect__022E5D4C
|
||||
PlayExclamationPointEffect__022E5D4C: ; 0x022E539C
|
||||
arm_func_start PlayCringeExclamationPointEffect
|
||||
PlayCringeExclamationPointEffect: ; 0x022E539C
|
||||
stmdb sp!, {r4, lr}
|
||||
sub sp, sp, #0x10
|
||||
mov r4, r0
|
||||
|
|
@ -2330,7 +2330,7 @@ PlayExclamationPointEffect__022E5D4C: ; 0x022E539C
|
|||
ldmia sp!, {r4, pc}
|
||||
.align 2, 0
|
||||
_022E53E8: .word 0x00000143
|
||||
arm_func_end PlayExclamationPointEffect__022E5D4C
|
||||
arm_func_end PlayCringeExclamationPointEffect
|
||||
|
||||
arm_func_start ov29_022E53EC
|
||||
ov29_022E53EC: ; 0x022E53EC
|
||||
|
|
|
|||
|
|
@ -308,7 +308,7 @@ _0230B14C:
|
|||
bne _0230B198
|
||||
mov r0, sl
|
||||
mov r1, sb
|
||||
bl FlashFireShouldActivate
|
||||
bl GetFlashFireStatus
|
||||
cmp r0, #0
|
||||
beq _0230B198
|
||||
ldr r1, _0230B798 ; =DUNGEON_PTR
|
||||
|
|
|
|||
|
|
@ -1132,7 +1132,7 @@ _0230CB78:
|
|||
bne _0230CC78
|
||||
mov r0, sl
|
||||
mov r1, sb
|
||||
bl FlashFireShouldActivate
|
||||
bl GetFlashFireStatus
|
||||
movs r4, r0
|
||||
beq _0230CC78
|
||||
ldrb r0, [r7, #0x15c + CALC_DAMAGE_OFFSET]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1,221 +0,0 @@
|
|||
.include "asm/macros.inc"
|
||||
.include "overlay_29_0231399C.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
|
||||
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 _02313C50
|
||||
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_022E4F1C
|
||||
ldr r0, [sp, #0x28]
|
||||
cmp r0, #0
|
||||
beq _02313B90
|
||||
ldr r1, _02313C5C ; =0x00000DC9
|
||||
mov r0, r4
|
||||
bl CopyStringFromId
|
||||
mov r1, r4
|
||||
mov r0, #1
|
||||
bl SetMessageLogPreprocessorArgsString
|
||||
b _02313BA8
|
||||
_02313B90:
|
||||
ldr r1, _02313C60 ; =0x00000DC8
|
||||
mov r0, r4
|
||||
bl CopyStringFromId
|
||||
mov r1, r4
|
||||
mov r0, #1
|
||||
bl SetMessageLogPreprocessorArgsString
|
||||
_02313BA8:
|
||||
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 _02313BE4
|
||||
ldr r1, _02313C64 ; =0x00000DCD
|
||||
mov r0, r5
|
||||
bl CopyStringFromId
|
||||
mov r1, r5
|
||||
mov r0, #2
|
||||
bl SetMessageLogPreprocessorArgsString
|
||||
b _02313BFC
|
||||
_02313BE4:
|
||||
ldr r1, _02313C68 ; =0x00000DCC
|
||||
mov r0, r5
|
||||
bl CopyStringFromId
|
||||
mov r1, r5
|
||||
mov r0, #2
|
||||
bl SetMessageLogPreprocessorArgsString
|
||||
_02313BFC:
|
||||
ldr r1, [sp, #0x28]
|
||||
add r0, r7, r1, lsl #1
|
||||
ldrsh r0, [r0, #0x28]
|
||||
add r4, r0, r6
|
||||
cmp r4, #0x14
|
||||
movge r4, #0x14
|
||||
cmp r4, r0
|
||||
beq _02313C38
|
||||
ldr r2, _02313C6C ; =0x00000D8E
|
||||
add r3, r7, r1, lsl #1
|
||||
mov r0, sb
|
||||
mov r1, r8
|
||||
strh r4, [r3, #0x28]
|
||||
bl LogMessageByIdWithPopupCheckUserTarget
|
||||
b _02313C48
|
||||
_02313C38:
|
||||
ldr r2, _02313C70 ; =0x00000DD6
|
||||
mov r0, sb
|
||||
mov r1, r8
|
||||
bl LogMessageByIdWithPopupCheckUserTarget
|
||||
_02313C48:
|
||||
mov r0, r8
|
||||
bl UpdateStatusIconFlags
|
||||
_02313C50:
|
||||
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr}
|
||||
add sp, sp, #0x10
|
||||
bx lr
|
||||
.align 2, 0
|
||||
#ifdef JAPAN
|
||||
#define BOOST_DEFENSIVE_STAT_OFFSET -0x2C0
|
||||
#else
|
||||
#define BOOST_DEFENSIVE_STAT_OFFSET 0
|
||||
#endif
|
||||
_02313C5C: .word 0x00000DC9 + BOOST_DEFENSIVE_STAT_OFFSET
|
||||
_02313C60: .word 0x00000DC8 + BOOST_DEFENSIVE_STAT_OFFSET
|
||||
_02313C64: .word 0x00000DCD + BOOST_DEFENSIVE_STAT_OFFSET
|
||||
_02313C68: .word 0x00000DCC + BOOST_DEFENSIVE_STAT_OFFSET
|
||||
_02313C6C: .word 0x00000D8E + BOOST_DEFENSIVE_STAT_OFFSET
|
||||
_02313C70: .word 0x00000DD6 + BOOST_DEFENSIVE_STAT_OFFSET
|
||||
arm_func_end BoostDefensiveStat
|
||||
|
|
@ -1,831 +0,0 @@
|
|||
.include "asm/macros.inc"
|
||||
.include "overlay_29_02313CE4.inc"
|
||||
|
||||
.text
|
||||
|
||||
arm_func_start ActivateFlashFire
|
||||
ActivateFlashFire: ; 0x02313CE4
|
||||
stmdb sp!, {r3, r4, r5, lr}
|
||||
mov r5, r1
|
||||
mov r0, r5
|
||||
bl EntityIsValid__023118B4
|
||||
cmp r0, #0
|
||||
ldmeqia sp!, {r3, r4, r5, pc}
|
||||
mov r0, #0
|
||||
ldr r4, [r5, #0xb4]
|
||||
mov r1, r5
|
||||
mov r2, r0
|
||||
bl SubstitutePlaceholderStringTags
|
||||
ldrsh r0, [r4, #0x30]
|
||||
add r1, r0, #1
|
||||
cmp r1, #2
|
||||
movge r1, #2
|
||||
cmp r0, r1
|
||||
beq _02313D34
|
||||
mov r0, r5
|
||||
strh r1, [r4, #0x30]
|
||||
bl ov29_022E4338
|
||||
_02313D34:
|
||||
mov r0, r5
|
||||
bl UpdateStatusIconFlags
|
||||
ldmia sp!, {r3, r4, r5, pc}
|
||||
arm_func_end ActivateFlashFire
|
||||
|
||||
arm_func_start ApplyOffensiveStatMultiplier
|
||||
ApplyOffensiveStatMultiplier: ; 0x02313D40
|
||||
#ifdef JAPAN
|
||||
#define APPLY_OFFENSIVE_STAT_MULTIPLIER_OFFSET -0x2C0
|
||||
#else
|
||||
#define APPLY_OFFENSIVE_STAT_MULTIPLIER_OFFSET 0
|
||||
#endif
|
||||
stmdb sp!, {r0, r1, r2, r3}
|
||||
stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr}
|
||||
mov r8, r1
|
||||
mov sb, r0
|
||||
mov r7, r3
|
||||
bl AllocateTemp1024ByteBufferFromPool
|
||||
mov r4, r0
|
||||
mov r0, r8
|
||||
bl EntityIsValid__023118B4
|
||||
cmp r0, #0
|
||||
beq _02313F3C
|
||||
ldr r0, [sp, #0x28]
|
||||
cmp r0, #0
|
||||
beq _02313D94
|
||||
ldr r1, _02313F48 ; =0x00000DCB
|
||||
mov r0, r4
|
||||
bl CopyStringFromId
|
||||
mov r1, r4
|
||||
mov r0, #1
|
||||
bl SetMessageLogPreprocessorArgsString
|
||||
b _02313DAC
|
||||
_02313D94:
|
||||
ldr r1, _02313F4C ; =0x00000DCA
|
||||
mov r0, r4
|
||||
bl CopyStringFromId
|
||||
mov r1, r4
|
||||
mov r0, #1
|
||||
bl SetMessageLogPreprocessorArgsString
|
||||
_02313DAC:
|
||||
cmp r7, #0x100
|
||||
bge _02313DCC
|
||||
ldrb r2, [sp, #0x30]
|
||||
mov r0, sb
|
||||
mov r1, r8
|
||||
bl IsProtectedFromStatDrops
|
||||
cmp r0, #0
|
||||
bne _02313F3C
|
||||
_02313DCC:
|
||||
mov r0, r8
|
||||
mov r1, #0x12
|
||||
bl ItemIsActive__02311BF8
|
||||
cmp r0, #0
|
||||
beq _02313E0C
|
||||
cmp r7, #0x100
|
||||
bge _02313E0C
|
||||
mov r0, #0
|
||||
mov r1, r8
|
||||
mov r2, r0
|
||||
bl SubstitutePlaceholderStringTags
|
||||
ldr r2, _02313F50 ; =0x00000DB2
|
||||
mov r0, sb
|
||||
mov r1, r8
|
||||
bl LogMessageByIdWithPopupCheckUserTarget
|
||||
b _02313F3C
|
||||
_02313E0C:
|
||||
mov r0, sb
|
||||
mov r1, r8
|
||||
mov r2, #9
|
||||
#ifndef JAPAN
|
||||
mov r3, #1
|
||||
#endif
|
||||
bl DefenderAbilityIsActive__02311B94
|
||||
cmp r0, #0
|
||||
beq _02313E6C
|
||||
ldr r0, [sp, #0x28]
|
||||
cmp r0, #0
|
||||
bne _02313E6C
|
||||
cmp r7, #0x100
|
||||
bge _02313E6C
|
||||
ldrb r0, [sp, #0x30]
|
||||
cmp r0, #0
|
||||
beq _02313F3C
|
||||
mov r0, #0
|
||||
mov r1, r8
|
||||
mov r2, r0
|
||||
bl SubstitutePlaceholderStringTags
|
||||
ldr r2, _02313F54 ; =0x00000D9E
|
||||
mov r0, sb
|
||||
mov r1, r8
|
||||
bl LogMessageByIdWithPopupCheckUserTarget
|
||||
b _02313F3C
|
||||
_02313E6C:
|
||||
mov r0, #0
|
||||
mov r1, r8
|
||||
mov r2, r0
|
||||
ldr r5, [r8, #0xb4]
|
||||
bl SubstitutePlaceholderStringTags
|
||||
ldr r6, [sp, #0x28]
|
||||
cmp r7, #0x100
|
||||
add r0, r5, r6, lsl #2
|
||||
ldr r4, [r0, #0x34]
|
||||
add r1, sp, #0x28
|
||||
mov r0, r8
|
||||
bge _02313EA8
|
||||
ldr r1, [r1]
|
||||
bl ov29_022E5068
|
||||
b _02313EB0
|
||||
_02313EA8:
|
||||
ldr r1, [r1]
|
||||
bl ov29_022E4FC0
|
||||
_02313EB0:
|
||||
add r0, r5, r6, lsl #2
|
||||
ldr r0, [r0, #0x34]
|
||||
mov r1, r7
|
||||
bl MultiplyByFixedPoint
|
||||
add r1, r5, r6, lsl #2
|
||||
str r0, [r1, #0x34]
|
||||
cmp r0, #2
|
||||
movlt r0, #2
|
||||
strlt r0, [r1, #0x34]
|
||||
add r2, r5, r6, lsl #2
|
||||
ldr r1, [r2, #0x34]
|
||||
ldr r0, _02313F58 ; =0x000063FD
|
||||
cmp r1, r0
|
||||
strgt r0, [r2, #0x34]
|
||||
add r0, r5, r6, lsl #2
|
||||
ldr r0, [r0, #0x34]
|
||||
cmp r4, r0
|
||||
ble _02313F0C
|
||||
ldr r2, _02313F5C ; =0x00000DD1
|
||||
mov r0, sb
|
||||
mov r1, r8
|
||||
bl LogMessageByIdWithPopupCheckUserTarget
|
||||
b _02313F34
|
||||
_02313F0C:
|
||||
bge _02313F24
|
||||
mov r0, sb
|
||||
mov r1, r8
|
||||
mov r2, #0xdd0 + APPLY_OFFENSIVE_STAT_MULTIPLIER_OFFSET
|
||||
bl LogMessageByIdWithPopupCheckUserTarget
|
||||
b _02313F34
|
||||
_02313F24:
|
||||
ldr r2, _02313F60 ; =0x00000DD3
|
||||
mov r0, sb
|
||||
mov r1, r8
|
||||
bl LogMessageByIdWithPopupCheckUserTarget
|
||||
_02313F34:
|
||||
mov r0, r8
|
||||
bl UpdateStatusIconFlags
|
||||
_02313F3C:
|
||||
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr}
|
||||
add sp, sp, #0x10
|
||||
bx lr
|
||||
.align 2, 0
|
||||
_02313F48: .word 0x00000DCB + APPLY_OFFENSIVE_STAT_MULTIPLIER_OFFSET
|
||||
_02313F4C: .word 0x00000DCA + APPLY_OFFENSIVE_STAT_MULTIPLIER_OFFSET
|
||||
_02313F50: .word 0x00000DB2 + APPLY_OFFENSIVE_STAT_MULTIPLIER_OFFSET
|
||||
_02313F54: .word 0x00000D9E + APPLY_OFFENSIVE_STAT_MULTIPLIER_OFFSET
|
||||
_02313F58: .word 0x000063FD
|
||||
_02313F5C: .word 0x00000DD1 + APPLY_OFFENSIVE_STAT_MULTIPLIER_OFFSET
|
||||
_02313F60: .word 0x00000DD3 + APPLY_OFFENSIVE_STAT_MULTIPLIER_OFFSET
|
||||
arm_func_end ApplyOffensiveStatMultiplier
|
||||
|
||||
arm_func_start ApplyDefensiveStatMultiplier
|
||||
ApplyDefensiveStatMultiplier: ; 0x02313F64
|
||||
stmdb sp!, {r0, r1, r2, r3}
|
||||
stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr}
|
||||
mov r8, r1
|
||||
mov sb, r0
|
||||
mov r7, r3
|
||||
bl AllocateTemp1024ByteBufferFromPool
|
||||
mov r4, r0
|
||||
mov r0, r8
|
||||
bl EntityIsValid__023118B4
|
||||
cmp r0, #0
|
||||
beq _023140C0
|
||||
ldr r0, [sp, #0x28]
|
||||
cmp r0, #0
|
||||
beq _02313FB8
|
||||
ldr r1, _023140CC ; =0x00000DC9
|
||||
mov r0, r4
|
||||
bl CopyStringFromId
|
||||
mov r1, r4
|
||||
mov r0, #1
|
||||
bl SetMessageLogPreprocessorArgsString
|
||||
b _02313FD0
|
||||
_02313FB8:
|
||||
ldr r1, _023140D0 ; =0x00000DC8
|
||||
mov r0, r4
|
||||
bl CopyStringFromId
|
||||
mov r1, r4
|
||||
mov r0, #1
|
||||
bl SetMessageLogPreprocessorArgsString
|
||||
_02313FD0:
|
||||
cmp r7, #0x100
|
||||
bge _02313FF0
|
||||
ldrb r2, [sp, #0x30]
|
||||
mov r0, sb
|
||||
mov r1, r8
|
||||
bl IsProtectedFromStatDrops
|
||||
cmp r0, #0
|
||||
bne _023140C0
|
||||
_02313FF0:
|
||||
mov r0, #0
|
||||
mov r1, r8
|
||||
mov r2, r0
|
||||
ldr r5, [r8, #0xb4]
|
||||
bl SubstitutePlaceholderStringTags
|
||||
ldr r6, [sp, #0x28]
|
||||
cmp r7, #0x100
|
||||
add r0, r5, r6, lsl #2
|
||||
ldr r4, [r0, #0x3c]
|
||||
add r1, sp, #0x28
|
||||
mov r0, r8
|
||||
bge _0231402C
|
||||
ldr r1, [r1]
|
||||
bl ov29_022E51B0
|
||||
b _02314034
|
||||
_0231402C:
|
||||
ldr r1, [r1]
|
||||
bl ov29_022E510C
|
||||
_02314034:
|
||||
add r0, r5, r6, lsl #2
|
||||
ldr r0, [r0, #0x3c]
|
||||
mov r1, r7
|
||||
bl MultiplyByFixedPoint
|
||||
add r1, r5, r6, lsl #2
|
||||
str r0, [r1, #0x3c]
|
||||
cmp r0, #2
|
||||
movlt r0, #2
|
||||
strlt r0, [r1, #0x3c]
|
||||
add r2, r5, r6, lsl #2
|
||||
ldr r1, [r2, #0x3c]
|
||||
ldr r0, _023140D4 ; =0x000063FD
|
||||
cmp r1, r0
|
||||
strgt r0, [r2, #0x3c]
|
||||
add r0, r5, r6, lsl #2
|
||||
ldr r0, [r0, #0x3c]
|
||||
cmp r4, r0
|
||||
ble _02314090
|
||||
ldr r2, _023140D8 ; =0x00000DCF
|
||||
mov r0, sb
|
||||
mov r1, r8
|
||||
bl LogMessageByIdWithPopupCheckUserTarget
|
||||
b _023140B8
|
||||
_02314090:
|
||||
bge _023140A8
|
||||
ldr r2, _023140DC ; =0x00000DCE
|
||||
mov r0, sb
|
||||
mov r1, r8
|
||||
bl LogMessageByIdWithPopupCheckUserTarget
|
||||
b _023140B8
|
||||
_023140A8:
|
||||
ldr r2, _023140E0 ; =0x00000DD2
|
||||
mov r0, sb
|
||||
mov r1, r8
|
||||
bl LogMessageByIdWithPopupCheckUserTarget
|
||||
_023140B8:
|
||||
mov r0, r8
|
||||
bl UpdateStatusIconFlags
|
||||
_023140C0:
|
||||
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, lr}
|
||||
add sp, sp, #0x10
|
||||
bx lr
|
||||
.align 2, 0
|
||||
#ifdef JAPAN
|
||||
#define APPLY_DEFENSIVE_STAT_MULTIPLIER_OFFSET -0x2C0
|
||||
#else
|
||||
#define APPLY_DEFENSIVE_STAT_MULTIPLIER_OFFSET 0
|
||||
#endif
|
||||
_023140CC: .word 0x00000DC9 + APPLY_DEFENSIVE_STAT_MULTIPLIER_OFFSET
|
||||
_023140D0: .word 0x00000DC8 + APPLY_DEFENSIVE_STAT_MULTIPLIER_OFFSET
|
||||
_023140D4: .word 0x000063FD
|
||||
_023140D8: .word 0x00000DCF + APPLY_DEFENSIVE_STAT_MULTIPLIER_OFFSET
|
||||
_023140DC: .word 0x00000DCE + APPLY_DEFENSIVE_STAT_MULTIPLIER_OFFSET
|
||||
_023140E0: .word 0x00000DD2 + APPLY_DEFENSIVE_STAT_MULTIPLIER_OFFSET
|
||||
arm_func_end ApplyDefensiveStatMultiplier
|
||||
|
||||
arm_func_start BoostHitChanceStat
|
||||
BoostHitChanceStat: ; 0x023140E4
|
||||
stmdb sp!, {r0, r1, r2, r3}
|
||||
stmdb sp!, {r4, r5, r6, r7, r8, lr}
|
||||
mov r6, r1
|
||||
mov r7, r0
|
||||
bl AllocateTemp1024ByteBufferFromPool
|
||||
mov r8, r0
|
||||
mov r0, r6
|
||||
mov r4, #1
|
||||
bl EntityIsValid__023118B4
|
||||
cmp r0, #0
|
||||
beq _0231420C
|
||||
mov r0, #0
|
||||
mov r1, r6
|
||||
mov r2, r0
|
||||
ldr r5, [r6, #0xb4]
|
||||
bl SubstitutePlaceholderStringTags
|
||||
add r1, sp, #0x20
|
||||
ldr r1, [r1]
|
||||
mov r0, r6
|
||||
bl ov29_022E5258
|
||||
ldr r0, [sp, #0x20]
|
||||
cmp r0, #0
|
||||
beq _0231415C
|
||||
ldr r1, _02314218 ; =0x00000DC7
|
||||
mov r0, r8
|
||||
bl CopyStringFromId
|
||||
mov r1, r8
|
||||
mov r0, r4
|
||||
bl SetMessageLogPreprocessorArgsString
|
||||
b _02314174
|
||||
_0231415C:
|
||||
ldr r1, _0231421C ; =0x00000DC6
|
||||
mov r0, r8
|
||||
bl CopyStringFromId
|
||||
mov r1, r8
|
||||
mov r0, r4
|
||||
bl SetMessageLogPreprocessorArgsString
|
||||
_02314174:
|
||||
mov r0, r6
|
||||
mov r1, #0x61
|
||||
bl AbilityIsActiveVeneer
|
||||
ldr r1, [sp, #0x20]
|
||||
cmp r0, #0
|
||||
movne r0, r4, lsl #0x11
|
||||
add r2, r5, r1, lsl #1
|
||||
movne r4, r0, asr #0x10
|
||||
ldrsh r0, [r2, #0x2c]
|
||||
mov r3, r1, lsl #1
|
||||
cmp r0, #0x14
|
||||
bge _023141F4
|
||||
add r1, r5, #0x2c
|
||||
ldrsh r0, [r1, r3]
|
||||
add r0, r0, r4
|
||||
strh r0, [r1, r3]
|
||||
ldrsh r0, [r2, #0x2c]
|
||||
cmp r0, #0x14
|
||||
movgt r0, #0x14
|
||||
strgth r0, [r2, #0x2c]
|
||||
cmp r4, #2
|
||||
blt _023141E0
|
||||
ldr r2, _02314220 ; =0x00000D95
|
||||
mov r0, r7
|
||||
mov r1, r6
|
||||
bl LogMessageByIdWithPopupCheckUserTarget
|
||||
b _02314204
|
||||
_023141E0:
|
||||
ldr r2, _02314224 ; =0x00000D93
|
||||
mov r0, r7
|
||||
mov r1, r6
|
||||
bl LogMessageByIdWithPopupCheckUserTarget
|
||||
b _02314204
|
||||
_023141F4:
|
||||
ldr r2, _02314228 ; =0x00000DD5
|
||||
mov r0, r7
|
||||
mov r1, r6
|
||||
bl LogMessageByIdWithPopupCheckUserTarget
|
||||
_02314204:
|
||||
mov r0, r6
|
||||
bl UpdateStatusIconFlags
|
||||
_0231420C:
|
||||
ldmia sp!, {r4, r5, r6, r7, r8, lr}
|
||||
add sp, sp, #0x10
|
||||
bx lr
|
||||
.align 2, 0
|
||||
#ifdef JAPAN
|
||||
#define BOOST_HIT_CHANCE_STAT_OFFSET -0x2C0
|
||||
#else
|
||||
#define BOOST_HIT_CHANCE_STAT_OFFSET 0
|
||||
#endif
|
||||
_02314218: .word 0x00000DC7 + BOOST_HIT_CHANCE_STAT_OFFSET
|
||||
_0231421C: .word 0x00000DC6 + BOOST_HIT_CHANCE_STAT_OFFSET
|
||||
_02314220: .word 0x00000D95 + BOOST_HIT_CHANCE_STAT_OFFSET
|
||||
_02314224: .word 0x00000D93 + BOOST_HIT_CHANCE_STAT_OFFSET
|
||||
_02314228: .word 0x00000DD5 + BOOST_HIT_CHANCE_STAT_OFFSET
|
||||
arm_func_end BoostHitChanceStat
|
||||
|
||||
arm_func_start LowerHitChanceStat
|
||||
LowerHitChanceStat: ; 0x0231422C
|
||||
stmdb sp!, {r0, r1, r2, r3}
|
||||
stmdb sp!, {r4, r5, r6, r7, r8, lr}
|
||||
mov r6, r1
|
||||
mov r7, r0
|
||||
mov r8, r3
|
||||
bl AllocateTemp1024ByteBufferFromPool
|
||||
mov r5, r0
|
||||
mov r0, r6
|
||||
mov r4, #1
|
||||
bl EntityIsValid__023118B4
|
||||
cmp r0, #0
|
||||
beq _023143C4
|
||||
ldr r0, [sp, #0x20]
|
||||
cmp r0, #0
|
||||
beq _02314284
|
||||
ldr r1, _023143D0 ; =0x00000DC7
|
||||
mov r0, r5
|
||||
bl CopyStringFromId
|
||||
mov r1, r5
|
||||
mov r0, r4
|
||||
bl SetMessageLogPreprocessorArgsString
|
||||
b _0231429C
|
||||
_02314284:
|
||||
ldr r1, _023143D4 ; =0x00000DC6
|
||||
mov r0, r5
|
||||
bl CopyStringFromId
|
||||
mov r1, r5
|
||||
mov r0, r4
|
||||
bl SetMessageLogPreprocessorArgsString
|
||||
_0231429C:
|
||||
mov r0, r7
|
||||
mov r1, r6
|
||||
mov r2, r8
|
||||
bl IsProtectedFromStatDrops
|
||||
cmp r0, #0
|
||||
bne _023143C4
|
||||
mov r0, r7
|
||||
mov r1, r6
|
||||
mov r2, #0x1e
|
||||
#ifndef JAPAN
|
||||
mov r3, #1
|
||||
#endif
|
||||
bl DefenderAbilityIsActive__02311B94
|
||||
cmp r0, #0
|
||||
beq _02314308
|
||||
ldr r0, [sp, #0x20]
|
||||
cmp r0, #0
|
||||
bne _02314308
|
||||
cmp r8, #0
|
||||
beq _023143C4
|
||||
mov r0, #0
|
||||
mov r1, r6
|
||||
mov r2, r0
|
||||
bl SubstitutePlaceholderStringTags
|
||||
ldr r2, _023143D8 ; =0x00000D9F
|
||||
mov r0, r7
|
||||
mov r1, r6
|
||||
bl LogMessageByIdWithPopupCheckUserTarget
|
||||
b _023143C4
|
||||
_02314308:
|
||||
mov r0, r6
|
||||
mov r1, #0x61
|
||||
bl AbilityIsActiveVeneer
|
||||
cmp r0, #0
|
||||
movne r0, r4, lsl #0x11
|
||||
movne r4, r0, asr #0x10
|
||||
mov r0, #0
|
||||
mov r1, r6
|
||||
mov r2, r0
|
||||
ldr r5, [r6, #0xb4]
|
||||
bl SubstitutePlaceholderStringTags
|
||||
add r1, sp, #0x20
|
||||
ldr r1, [r1]
|
||||
mov r0, r6
|
||||
bl ov29_022E52F8
|
||||
ldr r1, [sp, #0x20]
|
||||
add r2, r5, r1, lsl #1
|
||||
ldrsh r0, [r2, #0x2c]
|
||||
mov r3, r1, lsl #1
|
||||
cmp r0, #0
|
||||
ble _023143AC
|
||||
add r1, r5, #0x2c
|
||||
ldrsh r0, [r1, r3]
|
||||
sub r0, r0, r4
|
||||
strh r0, [r1, r3]
|
||||
ldrsh r0, [r2, #0x2c]
|
||||
cmp r0, #0
|
||||
movlt r0, #0
|
||||
strlth r0, [r2, #0x2c]
|
||||
cmp r4, #2
|
||||
blt _02314398
|
||||
ldr r2, _023143DC ; =0x00000D94
|
||||
mov r0, r7
|
||||
mov r1, r6
|
||||
bl LogMessageByIdWithPopupCheckUserTarget
|
||||
b _023143BC
|
||||
_02314398:
|
||||
ldr r2, _023143E0 ; =0x00000D92
|
||||
mov r0, r7
|
||||
mov r1, r6
|
||||
bl LogMessageByIdWithPopupCheckUserTarget
|
||||
b _023143BC
|
||||
_023143AC:
|
||||
ldr r2, _023143E4 ; =0x00000DD4
|
||||
mov r0, r7
|
||||
mov r1, r6
|
||||
bl LogMessageByIdWithPopupCheckUserTarget
|
||||
_023143BC:
|
||||
mov r0, r6
|
||||
bl UpdateStatusIconFlags
|
||||
_023143C4:
|
||||
ldmia sp!, {r4, r5, r6, r7, r8, lr}
|
||||
add sp, sp, #0x10
|
||||
bx lr
|
||||
.align 2, 0
|
||||
#ifdef JAPAN
|
||||
#define LOWER_HIT_CHANCE_STAT_OFFSET -0x2C0
|
||||
#else
|
||||
#define LOWER_HIT_CHANCE_STAT_OFFSET 0
|
||||
#endif
|
||||
_023143D0: .word 0x00000DC7 + LOWER_HIT_CHANCE_STAT_OFFSET
|
||||
_023143D4: .word 0x00000DC6 + LOWER_HIT_CHANCE_STAT_OFFSET
|
||||
_023143D8: .word 0x00000D9F + LOWER_HIT_CHANCE_STAT_OFFSET
|
||||
_023143DC: .word 0x00000D94 + LOWER_HIT_CHANCE_STAT_OFFSET
|
||||
_023143E0: .word 0x00000D92 + LOWER_HIT_CHANCE_STAT_OFFSET
|
||||
_023143E4: .word 0x00000DD4 + LOWER_HIT_CHANCE_STAT_OFFSET
|
||||
arm_func_end LowerHitChanceStat
|
||||
|
||||
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 ; =ov10_022C4884
|
||||
mov r2, #1
|
||||
mov r0, r6
|
||||
strb r2, [r4, #0xd0]
|
||||
bl CalcStatusDuration
|
||||
add r1, r0, #1
|
||||
mov r0, r6
|
||||
strb r1, [r4, #0xd1]
|
||||
bl PlayExclamationPointEffect__022E5D4C
|
||||
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 ov10_022C4884
|
||||
_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
|
||||
|
|
@ -3,230 +3,6 @@
|
|||
|
||||
.text
|
||||
|
||||
arm_func_start BoostSpeed
|
||||
BoostSpeed: ; 0x02314810
|
||||
#ifdef JAPAN
|
||||
#define BOOST_SPEED_OFFSET -4
|
||||
#else
|
||||
#define BOOST_SPEED_OFFSET 0
|
||||
#endif
|
||||
stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr}
|
||||
mov r8, r1
|
||||
mov sb, r0
|
||||
mov r0, r8
|
||||
mov r7, r2
|
||||
mov r6, r3
|
||||
bl EntityIsValid__023118B4
|
||||
cmp r0, #0
|
||||
ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
|
||||
cmp r6, #0
|
||||
bne _02314850
|
||||
ldr r1, _0231492C ; =SPEED_BOOST_TURN_RANGE
|
||||
mov r0, r8
|
||||
mov r2, #0
|
||||
bl CalcStatusDuration
|
||||
add r6, r0, #1
|
||||
_02314850:
|
||||
mov r0, #0
|
||||
mov r1, r8
|
||||
mov r2, r0
|
||||
ldr r5, [r8, #0xb4]
|
||||
bl SubstitutePlaceholderStringTags
|
||||
mov r0, r8
|
||||
mov r1, r7
|
||||
bl CalcSpeedStage
|
||||
mov r4, r0
|
||||
cmp r4, #4
|
||||
bne _0231489C
|
||||
ldrb r0, [sp, #0x20]
|
||||
cmp r0, #0
|
||||
beq _02314920
|
||||
ldr r2, _02314930 ; =0x00000DDB
|
||||
mov r0, sb
|
||||
mov r1, r8
|
||||
bl LogMessageByIdWithPopupCheckUserTarget
|
||||
b _02314920
|
||||
_0231489C:
|
||||
mov r2, #0
|
||||
b _023148BC
|
||||
_023148A4:
|
||||
add r1, r5, r2
|
||||
ldrb r0, [r1, #0x114 + BOOST_SPEED_OFFSET]
|
||||
cmp r0, #0
|
||||
streqb r6, [r1, #0x114 + BOOST_SPEED_OFFSET]
|
||||
beq _023148C4
|
||||
add r2, r2, #1
|
||||
_023148BC:
|
||||
cmp r2, #5
|
||||
blt _023148A4
|
||||
_023148C4:
|
||||
mov r0, r8
|
||||
mov r1, r7
|
||||
bl CalcSpeedStage
|
||||
mov r6, r0
|
||||
cmp r4, r6
|
||||
bne _023148F0
|
||||
ldr r2, _02314934 ; =0x00000DDA
|
||||
mov r0, sb
|
||||
mov r1, r8
|
||||
bl LogMessageByIdWithPopupCheckUserTarget
|
||||
b _02314920
|
||||
_023148F0:
|
||||
mov r0, r8
|
||||
bl ov29_022E44CC
|
||||
ldr r0, _02314938 ; =ov29_02353318
|
||||
mov r1, r6, lsl #1
|
||||
ldrh r2, [r0, r1]
|
||||
mov r0, sb
|
||||
mov r1, r8
|
||||
bl LogMessageByIdWithPopupCheckUserTarget
|
||||
mov r0, #1
|
||||
strb r0, [r5, #0x101]
|
||||
mov r0, #0
|
||||
strb r0, [r5, #0x152 + BOOST_SPEED_OFFSET]
|
||||
_02314920:
|
||||
mov r0, r8
|
||||
bl UpdateStatusIconFlags
|
||||
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
|
||||
.align 2, 0
|
||||
_0231492C: .word SPEED_BOOST_TURN_RANGE
|
||||
#ifdef JAPAN
|
||||
_02314930: .word 0x00000B1B
|
||||
_02314934: .word 0x00000B1A
|
||||
#else
|
||||
_02314930: .word 0x00000DDB
|
||||
_02314934: .word 0x00000DDA
|
||||
#endif
|
||||
_02314938: .word ov29_02353318
|
||||
arm_func_end BoostSpeed
|
||||
|
||||
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
|
||||
|
|
|
|||
|
|
@ -1710,7 +1710,7 @@ DoMoveWillOWisp: ; 0x02326B24
|
|||
sub sp, sp, #4
|
||||
mov r6, r0
|
||||
mov r5, r1
|
||||
bl FlashFireShouldActivate
|
||||
bl GetFlashFireStatus
|
||||
movs r4, r0
|
||||
beq _02326B94
|
||||
ldr r3, [r5, #0xb4]
|
||||
|
|
|
|||
|
|
@ -5,7 +5,20 @@
|
|||
#define INFINITY_2 999999
|
||||
#define INFINITY_3 10000
|
||||
|
||||
#define F248LessThanFloat(x, y) (x < (int)(y * 0x100))
|
||||
#define F248LessThanInt(x, y) (x < 0x100 * y)
|
||||
#define IntToF248(x) ((int)((x) * 0x100))
|
||||
#define F248ToInt(x) ((s24_8)((x) / 256))
|
||||
|
||||
#endif //PMDSKY_MATH_H
|
||||
#define F248LessThanInt(x, y) ((x) < 0x100 * (y))
|
||||
#define F248LessThanFloat(x, y) ((x) < (int)((y) * 0x100))
|
||||
#define FloatLessThanF248(x, y) ((int)((x) * 0x100) < (y))
|
||||
#define F248LessThan(x, y) ((x) < (y))
|
||||
#define F248GreaterThan(x, y) ((x) > (y))
|
||||
#define F248Equal(x, y) ((x) == (y))
|
||||
#define F248EqualsInt(x, y) ((x) == 0x100 * (y))
|
||||
#define F248_AddInt(x, y) ((s24_8)((x) + 0x100 * (y))
|
||||
#define F248_SubInt(x, y) ((s24_8)((x) - 0x100 * (y))
|
||||
#define F248_Add(x, y)((x) + (y))
|
||||
#define F248_Sub(x, y)((x) - (y))
|
||||
#define F248_MulInt(x, y)((x) * (y))
|
||||
|
||||
#endif // PMDSKY_MATH_H
|
||||
|
|
|
|||
|
|
@ -1,16 +0,0 @@
|
|||
#ifndef PMDSKY_MOVE_ORB_EFFECTS_H
|
||||
#define PMDSKY_MOVE_ORB_EFFECTS_H
|
||||
|
||||
#include "dungeon_mode.h"
|
||||
|
||||
enum flash_fire_status {
|
||||
FLASH_FIRE_STATUS_NONE = 0,
|
||||
FLASH_FIRE_STATUS_MAXED = 1,
|
||||
FLASH_FIRE_STATUS_NOT_MAXED = 2
|
||||
};
|
||||
|
||||
// Checks whether Flash Fire should activate, assuming the defender is being hit by a Fire-type move.
|
||||
// This checks that the defender is valid and Flash Fire is active, and that Normalize isn't active on the attacker.
|
||||
enum flash_fire_status FlashFireShouldActivate(struct entity *attacker, struct entity *defender);
|
||||
|
||||
#endif //PMDSKY_MOVE_ORB_EFFECTS_H
|
||||
43
include/move_orb_effects_1.h
Normal file
43
include/move_orb_effects_1.h
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
#ifndef PMDSKY_MOVE_ORB_EFFECTS_1_H
|
||||
#define PMDSKY_MOVE_ORB_EFFECTS_1_H
|
||||
|
||||
#include "util.h"
|
||||
#include "dungeon_mode.h"
|
||||
|
||||
enum flash_fire_status {
|
||||
FLASH_FIRE_STATUS_NONE = 0,
|
||||
FLASH_FIRE_STATUS_MAXED = 1,
|
||||
FLASH_FIRE_STATUS_NOT_MAXED = 2
|
||||
};
|
||||
|
||||
#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 *user, struct entity *target, struct StatIndex stat, s32 nStagesRaw, bool8 checkProtected, bool8 logMsgProtected);
|
||||
void LowerDefensiveStat(struct entity *user, struct entity *target, struct StatIndex stat, s32 increment, bool8 checkProtected, bool8 logMsgProtected);
|
||||
void BoostOffensiveStat(struct entity *user, struct entity *target, struct StatIndex stat, s32 nStagesRaw);
|
||||
void BoostDefensiveStat(struct entity *user, struct entity *target, struct StatIndex stat, s32 nStagesRaw);
|
||||
// Checks whether Flash Fire should activate, assuming the defender is being hit by a Fire-type move.
|
||||
// This checks that the defender is valid and Flash Fire is active, and that Normalize isn't active on the attacker.
|
||||
enum flash_fire_status GetFlashFireStatus(struct entity *attacker, struct entity *defender);
|
||||
void ActivateFlashFire(struct entity *pokemon, struct entity *target);
|
||||
void ApplyOffensiveStatMultiplier(struct entity *user, struct entity *target, struct StatIndex stat, fx32_8 multiplier, bool8 displayMessage);
|
||||
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 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);
|
||||
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_MOVE_ORB_EFFECTS_1_H
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
#ifndef PMDSKY_OVERLAY_29_02313814_H
|
||||
#define PMDSKY_OVERLAY_29_02313814_H
|
||||
|
||||
struct StatIndex
|
||||
{
|
||||
int id;
|
||||
};
|
||||
|
||||
void LowerDefensiveStat(struct entity *pokemon, struct entity *target, struct StatIndex stat, s32 increment, bool8 checkProtected, bool8 logMsgProtected);
|
||||
|
||||
#endif //PMDSKY_OVERLAY_29_02313814_H
|
||||
|
|
@ -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
|
||||
6
main.lsf
6
main.lsf
|
|
@ -541,11 +541,7 @@ Overlay OVY_29
|
|||
Object asm/overlay_29_023118D8.o
|
||||
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 src/move_orb_effects.o
|
||||
Object asm/overlay_29_02313CE4.o
|
||||
Object src/overlay_29_023147EC.o
|
||||
Object src/move_orb_effects_1.o
|
||||
Object asm/overlay_29_02314810.o
|
||||
Object src/overlay_29_02315118.o
|
||||
Object asm/overlay_29_0231516C.o
|
||||
|
|
|
|||
|
|
@ -840,8 +840,9 @@ bool8 IsAiTargetEligible(s32 move_ai_range, struct entity *user, struct entity *
|
|||
if (GetTreatmentBetweenMonsters(user, target, FALSE, TRUE) == TREATMENT_TREAT_AS_ALLY)
|
||||
has_target = TRUE;
|
||||
}
|
||||
else if (move_ai_target - 3 <= 1) // move_ai_target == TARGET_SPECIAL
|
||||
else if (move_ai_target == TARGET_USER || move_ai_target == TARGET_ENEMIES_AFTER_CHARGING) {
|
||||
has_target = TRUE;
|
||||
}
|
||||
|
||||
if (has_target)
|
||||
{
|
||||
|
|
@ -1018,35 +1019,41 @@ bool8 IsTargetInRange(struct entity *user, struct entity *target, s32 direction,
|
|||
if (effective_max_range > n_tiles)
|
||||
effective_max_range = n_tiles;
|
||||
|
||||
if (!IqSkillIsEnabled(user, IQ_COURSE_CHECKER))
|
||||
if (!IqSkillIsEnabled(user, IQ_COURSE_CHECKER)) {
|
||||
// BUG: effective_max_range is already capped at max_range, so this condition always evaluates to TRUE.
|
||||
// The AI also has range checks elsewhere, so this doesn't become an issue in most cases.
|
||||
// If the AI has the Long Toss or Pierce statuses and Course Checker is disabled,
|
||||
// this incorrect check causes the AI to throw items at targets further than 10 tiles away.
|
||||
return effective_max_range <= n_tiles;
|
||||
|
||||
s32 i;
|
||||
s32 current_pos_x = user->pos.x;
|
||||
s32 current_pos_y = user->pos.y;
|
||||
s32 adjacent_tile_offset_x = DIRECTIONS_XY[direction].x;
|
||||
s32 adjacent_tile_offset_y = DIRECTIONS_XY[direction].y;
|
||||
for (i = 0; i <= effective_max_range; i++)
|
||||
{
|
||||
current_pos_x += adjacent_tile_offset_x;
|
||||
current_pos_y += adjacent_tile_offset_y;
|
||||
if (current_pos_x < 1 || current_pos_y < 1 ||
|
||||
current_pos_x >= DUNGEON_MAX_SIZE_X - 1 || current_pos_y >= DUNGEON_MAX_SIZE_Y - 1)
|
||||
break;
|
||||
|
||||
const struct tile *map_tile = GetTile(current_pos_x, current_pos_y);
|
||||
if (GetTerrainType(map_tile) == TERRAIN_TYPE_WALL)
|
||||
return FALSE;
|
||||
|
||||
if (map_tile->monster == target)
|
||||
if (effective_max_range <= n_tiles)
|
||||
return TRUE;
|
||||
|
||||
if (map_tile->monster != NULL)
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
else {
|
||||
s32 i;
|
||||
s32 current_pos_x = user->pos.x;
|
||||
s32 current_pos_y = user->pos.y;
|
||||
s32 adjacent_tile_offset_x = DIRECTIONS_XY[direction].x;
|
||||
s32 adjacent_tile_offset_y = DIRECTIONS_XY[direction].y;
|
||||
for (i = 0; i <= effective_max_range; i++)
|
||||
{
|
||||
current_pos_x += adjacent_tile_offset_x;
|
||||
current_pos_y += adjacent_tile_offset_y;
|
||||
if (current_pos_x < 1 || current_pos_y < 1 ||
|
||||
current_pos_x >= DUNGEON_MAX_SIZE_X - 1 || current_pos_y >= DUNGEON_MAX_SIZE_Y - 1)
|
||||
break;
|
||||
|
||||
const struct tile *map_tile = GetTile(current_pos_x, current_pos_y);
|
||||
if (!(map_tile->terrain_flags & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY)))
|
||||
return FALSE;
|
||||
|
||||
if (map_tile->monster == target)
|
||||
return TRUE;
|
||||
|
||||
if (map_tile->monster != NULL)
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
#include "dungeon_logic_3.h"
|
||||
#include "dungeon_pokemon_attributes.h"
|
||||
#include "dungeon_util_static.h"
|
||||
#include "move_orb_effects.h"
|
||||
#include "move_orb_effects_1.h"
|
||||
#include "overlay_29_02308FBC.h"
|
||||
#include "overlay_29_0230A994.h"
|
||||
#include "overlay_29_0230AB58.h"
|
||||
|
|
@ -28,7 +28,7 @@ s32 WeightWeakTypePicker(struct entity *user, struct entity *target, enum type_i
|
|||
if (move_type == TYPE_NORMAL || move_type == TYPE_FIGHTING)
|
||||
check_exposed = TRUE;
|
||||
|
||||
if (move_type == TYPE_FIRE && FlashFireShouldActivate(user, target) != FLASH_FIRE_STATUS_NONE)
|
||||
if (move_type == TYPE_FIRE && GetFlashFireStatus(user, target) != FLASH_FIRE_STATUS_NONE)
|
||||
return 0;
|
||||
|
||||
#ifdef JAPAN
|
||||
|
|
|
|||
|
|
@ -7,17 +7,14 @@
|
|||
|
||||
bool8 IsPositionActuallyInSight(struct position *origin, struct position *target, bool8 user_has_dropeye)
|
||||
{
|
||||
u8 origin_room;
|
||||
s16 visibility = GetVisibilityRange();
|
||||
const struct tile *tile_1 = GetTile(origin->x, origin->y);
|
||||
origin_room = tile_1->room;
|
||||
if (user_has_dropeye || origin_room == CORRIDOR_ROOM)
|
||||
{
|
||||
u8 origin_room = tile_1->room;
|
||||
if (user_has_dropeye || origin_room == CORRIDOR_ROOM) {
|
||||
if (abs(origin->x - target->x) <= visibility && abs(origin->y - target->y) <= visibility)
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
else {
|
||||
struct room_data *origin_room_data = &DUNGEON_PTR[0]->room_data[origin_room];
|
||||
if (origin_room_data->bottom_right_corner.x - 1 <= target->x &&
|
||||
origin_room_data->bottom_right_corner.y - 1 <= target->y &&
|
||||
|
|
@ -33,8 +30,7 @@ bool8 IsPositionInSight(struct position *origin, struct position *target, bool8
|
|||
{
|
||||
const struct tile *tile = GetTile(origin->x, origin->y);
|
||||
u8 origin_room = tile->room;
|
||||
if (origin_room != CORRIDOR_ROOM && !user_has_dropeye)
|
||||
{
|
||||
if (origin_room != CORRIDOR_ROOM && !user_has_dropeye) {
|
||||
struct room_data *origin_room_data = &DUNGEON_PTR[0]->room_data[origin_room];
|
||||
if (origin_room_data->bottom_right_corner.x - 1 <= target->x &&
|
||||
origin_room_data->bottom_right_corner.y - 1 <= target->y &&
|
||||
|
|
@ -43,15 +39,18 @@ bool8 IsPositionInSight(struct position *origin, struct position *target, bool8
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
s32 y_diff = abs(origin->y - target->y);
|
||||
s32 diff = abs(origin->x - target->x);
|
||||
if (diff <= y_diff)
|
||||
diff = y_diff;
|
||||
s32 absY = abs(origin->y - target->y);
|
||||
s32 absX = abs(origin->x - target->x);
|
||||
s32 diff = MAX(absX, absY);
|
||||
|
||||
if (diff > 2)
|
||||
return FALSE;
|
||||
else if (diff == 2)
|
||||
return !!IsPositionWithinTwoTiles(origin, target);
|
||||
else
|
||||
return TRUE;
|
||||
else if (diff == 2) {
|
||||
if (IsPositionWithinTwoTiles(origin, target))
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,26 +0,0 @@
|
|||
#include "move_orb_effects.h"
|
||||
#include "dungeon_pokemon_attributes.h"
|
||||
#include "dungeon_util_static.h"
|
||||
#include "overlay_29_023118B4.h"
|
||||
#include "overlay_29_02311BF8.h"
|
||||
|
||||
enum flash_fire_status FlashFireShouldActivate(struct entity *attacker, struct entity *defender)
|
||||
{
|
||||
if (!EntityIsValid__023118B4(defender))
|
||||
return FLASH_FIRE_STATUS_NONE;
|
||||
|
||||
if (AbilityIsActiveVeneer(attacker, ABILITY_NORMALIZE))
|
||||
return FLASH_FIRE_STATUS_NONE;
|
||||
|
||||
#ifdef JAPAN
|
||||
if (!DefenderAbilityIsActive__02311B94(attacker, defender, ABILITY_FLASH_FIRE))
|
||||
#else
|
||||
if (!DefenderAbilityIsActive__02311B94(attacker, defender, ABILITY_FLASH_FIRE, TRUE))
|
||||
#endif
|
||||
return FLASH_FIRE_STATUS_NONE;
|
||||
|
||||
if (GetEntInfo(defender)->stat_modifiers.flash_fire_boost >= 2)
|
||||
return FLASH_FIRE_STATUS_MAXED;
|
||||
|
||||
return FLASH_FIRE_STATUS_NOT_MAXED;
|
||||
}
|
||||
796
src/move_orb_effects_1.c
Normal file
796
src/move_orb_effects_1.c
Normal file
|
|
@ -0,0 +1,796 @@
|
|||
#include "dungeon_pokemon_attributes.h"
|
||||
#include "dungeon_util_static.h"
|
||||
#include "overlay_29_023118B4.h"
|
||||
#include "move_orb_effects_1.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);
|
||||
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 PlayOffensiveStatUpEffect(struct entity *user, struct StatIndex);
|
||||
extern void PlayDefensiveStatDownEffect(struct entity *user, struct StatIndex);
|
||||
extern void PlayDefensiveStatUpEffect(struct entity *user, struct StatIndex);
|
||||
extern void PlayOffensiveStatDownEffect(struct entity *user, struct StatIndex);
|
||||
extern void PlayOffensiveStatMultiplierDownEffect(struct entity *user, struct StatIndex);
|
||||
extern void PlayOffensiveStatMultiplierUpEffect(struct entity *user, struct StatIndex);
|
||||
extern void PlayDefensiveStatMultiplierDownEffect(struct entity *user, struct StatIndex);
|
||||
extern void PlayDefensiveStatMultiplierUpEffect(struct entity *user, struct StatIndex);
|
||||
extern void PlayHitChanceUpEffect(struct entity *user, struct StatIndex);
|
||||
extern void PlayHitChanceDownEffect(struct entity *user, struct StatIndex);
|
||||
extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id);
|
||||
extern void UpdateStatusIconFlags(struct entity *);
|
||||
extern void ov29_022E4338(struct entity *);
|
||||
extern void PlayCringeExclamationPointEffect(struct entity *);
|
||||
extern void PlayParalysisEffect(struct entity *);
|
||||
extern void PlaySpeedUpEffect(struct entity *);
|
||||
extern void PlaySpeedDownEffect(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 int CalcSpeedStage(struct entity *, int);
|
||||
|
||||
extern const s16 CRINGE_TURN_RANGE[];
|
||||
extern const s16 PARALYSIS_TURN_RANGE[];
|
||||
extern const s16 SPEED_LOWER_TURN_RANGE[];
|
||||
extern const s16 SPEED_BOOST_TURN_RANGE[];
|
||||
extern const u16 ov29_02353318[];
|
||||
|
||||
#ifdef JAPAN
|
||||
#define JPN_MSG_OFFSET -0x2C0
|
||||
#else
|
||||
#define JPN_MSG_OFFSET 0
|
||||
#endif // JAPAN
|
||||
|
||||
void LowerOffensiveStat(struct entity *user, 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 != STAT_INDEX_PHYSICAL) {
|
||||
CopyStringFromId(buffer1, 0xdcb + JPN_MSG_OFFSET);
|
||||
SetMessageLogPreprocessorArgsString(1, buffer1);
|
||||
}
|
||||
else {
|
||||
CopyStringFromId(buffer1, 0xdca + JPN_MSG_OFFSET);
|
||||
SetMessageLogPreprocessorArgsString(1, buffer1);
|
||||
}
|
||||
|
||||
if (checkProtected) {
|
||||
if (IsProtectedFromStatDrops(user, target, logMsgProtected))
|
||||
return;
|
||||
|
||||
if (ItemIsActive__02311BF8(target, ITEM_TWIST_BAND)) {
|
||||
SubstitutePlaceholderStringTags(0,target,0);
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xdb2 + JPN_MSG_OFFSET);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef JAPAN
|
||||
if (DefenderAbilityIsActive__02311B94(user, target, ABILITY_HYPER_CUTTER) && stat.id == STAT_INDEX_PHYSICAL) {
|
||||
#else
|
||||
if (DefenderAbilityIsActive__02311B94(user, target, ABILITY_HYPER_CUTTER, TRUE) && stat.id == STAT_INDEX_PHYSICAL) {
|
||||
#endif
|
||||
SubstitutePlaceholderStringTags(0,target,0);
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xd9e + JPN_MSG_OFFSET);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
entityInfo = GetEntInfo(target);
|
||||
SubstitutePlaceholderStringTags(0,target,0);
|
||||
PlayOffensiveStatDownEffect(target,stat);
|
||||
|
||||
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 < 0) {
|
||||
newStage = 0;
|
||||
}
|
||||
|
||||
if (entityInfo->stat_modifiers.offensive_stages[stat.id] != newStage) {
|
||||
entityInfo->stat_modifiers.offensive_stages[stat.id] = newStage;
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xd91 + JPN_MSG_OFFSET);
|
||||
}
|
||||
else {
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xdd9 + JPN_MSG_OFFSET);
|
||||
}
|
||||
UpdateStatusIconFlags(target);
|
||||
}
|
||||
|
||||
void LowerDefensiveStat(struct entity *user, 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 != STAT_INDEX_PHYSICAL) {
|
||||
CopyStringFromId(buffer1, 0xdc9 + JPN_MSG_OFFSET);
|
||||
SetMessageLogPreprocessorArgsString(1, buffer1);
|
||||
}
|
||||
else {
|
||||
CopyStringFromId(buffer1, 0xdc8 + JPN_MSG_OFFSET);
|
||||
SetMessageLogPreprocessorArgsString(1, buffer1);
|
||||
}
|
||||
|
||||
if (checkProtected) {
|
||||
if (IsProtectedFromStatDrops(user, target, logMsgProtected))
|
||||
return;
|
||||
}
|
||||
|
||||
entityInfo = GetEntInfo(target);
|
||||
SubstitutePlaceholderStringTags(0,target,0);
|
||||
PlayDefensiveStatDownEffect(target,stat);
|
||||
|
||||
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.defensive_stages[stat.id];
|
||||
newStage -= nStages;
|
||||
if (newStage < 0) {
|
||||
newStage = 0;
|
||||
}
|
||||
|
||||
if (entityInfo->stat_modifiers.defensive_stages[stat.id] != newStage) {
|
||||
entityInfo->stat_modifiers.defensive_stages[stat.id] = newStage;
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xd90 + JPN_MSG_OFFSET);
|
||||
}
|
||||
else {
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xdd7 + JPN_MSG_OFFSET);
|
||||
}
|
||||
UpdateStatusIconFlags(target);
|
||||
}
|
||||
|
||||
void BoostOffensiveStat(struct entity *user, 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);
|
||||
PlayOffensiveStatUpEffect(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(user,target,0xd8f + JPN_MSG_OFFSET);
|
||||
}
|
||||
else {
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xdd8 + JPN_MSG_OFFSET);
|
||||
}
|
||||
UpdateStatusIconFlags(target);
|
||||
}
|
||||
|
||||
void BoostDefensiveStat(struct entity *user, 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);
|
||||
PlayDefensiveStatUpEffect(target,stat);
|
||||
if (stat.id != STAT_INDEX_PHYSICAL) {
|
||||
CopyStringFromId(buffer1, 0xdc9 + JPN_MSG_OFFSET);
|
||||
SetMessageLogPreprocessorArgsString(1, buffer1);
|
||||
}
|
||||
else {
|
||||
CopyStringFromId(buffer1, 0xdc8 + 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.defensive_stages[stat.id];
|
||||
newStage += nStages;
|
||||
if (newStage >= MAX_STAT_STAGE) {
|
||||
newStage = MAX_STAT_STAGE;
|
||||
}
|
||||
|
||||
if (entityInfo->stat_modifiers.defensive_stages[stat.id] != newStage) {
|
||||
entityInfo->stat_modifiers.defensive_stages[stat.id] = newStage;
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xd8e + JPN_MSG_OFFSET);
|
||||
}
|
||||
else {
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xdd6 + JPN_MSG_OFFSET);
|
||||
}
|
||||
UpdateStatusIconFlags(target);
|
||||
}
|
||||
|
||||
enum flash_fire_status GetFlashFireStatus(struct entity *attacker, struct entity *defender)
|
||||
{
|
||||
if (!EntityIsValid__023118B4(defender))
|
||||
return FLASH_FIRE_STATUS_NONE;
|
||||
|
||||
if (AbilityIsActiveVeneer(attacker, ABILITY_NORMALIZE))
|
||||
return FLASH_FIRE_STATUS_NONE;
|
||||
|
||||
#ifdef JAPAN
|
||||
if (!DefenderAbilityIsActive__02311B94(attacker, defender, ABILITY_FLASH_FIRE))
|
||||
#else
|
||||
if (!DefenderAbilityIsActive__02311B94(attacker, defender, ABILITY_FLASH_FIRE, TRUE))
|
||||
#endif
|
||||
return FLASH_FIRE_STATUS_NONE;
|
||||
|
||||
if (GetEntInfo(defender)->stat_modifiers.flash_fire_boost >= 2)
|
||||
return FLASH_FIRE_STATUS_MAXED;
|
||||
|
||||
return FLASH_FIRE_STATUS_NOT_MAXED;
|
||||
}
|
||||
|
||||
void ActivateFlashFire(struct entity *pokemon, struct entity *target)
|
||||
{
|
||||
s32 flashFireBoost;
|
||||
|
||||
if (EntityIsValid__023118B4(target)) {
|
||||
struct monster * entityInfo = GetEntInfo(target);
|
||||
SubstitutePlaceholderStringTags(0,target,0);
|
||||
flashFireBoost = entityInfo->stat_modifiers.flash_fire_boost;
|
||||
if (++flashFireBoost >= 2) {
|
||||
flashFireBoost = 2;
|
||||
}
|
||||
if (entityInfo->stat_modifiers.flash_fire_boost != flashFireBoost) {
|
||||
entityInfo->stat_modifiers.flash_fire_boost = flashFireBoost;
|
||||
ov29_022E4338(target);
|
||||
}
|
||||
UpdateStatusIconFlags(target);
|
||||
}
|
||||
}
|
||||
|
||||
void ApplyOffensiveStatMultiplier(struct entity *user, struct entity *target, struct StatIndex stat, fx32_8 multiplier, bool8 displayMessage)
|
||||
{
|
||||
struct monster *entityInfo;
|
||||
fx32_8 oldMulti;
|
||||
u8 *buffer1 = AllocateTemp1024ByteBufferFromPool();
|
||||
|
||||
if (!EntityIsValid__023118B4(target))
|
||||
return;
|
||||
|
||||
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 (F248LessThanInt(multiplier, 1) && IsProtectedFromStatDrops(user,target,displayMessage))
|
||||
return;
|
||||
|
||||
if (ItemIsActive__02311BF8(target,ITEM_TWIST_BAND) && F248LessThanInt(multiplier, 1)) {
|
||||
SubstitutePlaceholderStringTags(0,target,0);
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xdb2 + JPN_MSG_OFFSET);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef JAPAN
|
||||
if (DefenderAbilityIsActive__02311B94(user, target, ABILITY_HYPER_CUTTER)
|
||||
#else
|
||||
if (DefenderAbilityIsActive__02311B94(user, target, ABILITY_HYPER_CUTTER, TRUE)
|
||||
#endif // JAPAN
|
||||
&& stat.id == STAT_INDEX_PHYSICAL
|
||||
&& F248LessThanInt(multiplier, 1))
|
||||
{
|
||||
if (displayMessage) {
|
||||
SubstitutePlaceholderStringTags(0,target,0);
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xd9e + JPN_MSG_OFFSET);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
entityInfo = GetEntInfo(target);
|
||||
SubstitutePlaceholderStringTags(0,target,0);
|
||||
oldMulti = entityInfo->stat_modifiers.offensive_multipliers[stat.id];
|
||||
|
||||
if (F248LessThanInt(multiplier, 1)) {
|
||||
PlayOffensiveStatMultiplierDownEffect(target,stat);
|
||||
}
|
||||
else {
|
||||
PlayOffensiveStatMultiplierUpEffect(target,stat);
|
||||
}
|
||||
|
||||
entityInfo->stat_modifiers.offensive_multipliers[stat.id] = MultiplyByFixedPoint(entityInfo->stat_modifiers.offensive_multipliers[stat.id],multiplier);
|
||||
|
||||
if (F248LessThanFloat(entityInfo->stat_modifiers.offensive_multipliers[stat.id], 0.01)) {
|
||||
entityInfo->stat_modifiers.offensive_multipliers[stat.id] = IntToF248(0.01);
|
||||
}
|
||||
if (FloatLessThanF248(99.99, entityInfo->stat_modifiers.offensive_multipliers[stat.id])) {
|
||||
entityInfo->stat_modifiers.offensive_multipliers[stat.id] = IntToF248(99.99);
|
||||
}
|
||||
|
||||
if (F248GreaterThan(oldMulti, entityInfo->stat_modifiers.offensive_multipliers[stat.id])) {
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xdd1 + JPN_MSG_OFFSET);
|
||||
}
|
||||
else if (F248LessThan(oldMulti, entityInfo->stat_modifiers.offensive_multipliers[stat.id])) {
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xdd0 + JPN_MSG_OFFSET);
|
||||
}
|
||||
else {
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xdd3 + JPN_MSG_OFFSET);
|
||||
}
|
||||
UpdateStatusIconFlags(target);
|
||||
}
|
||||
|
||||
void ApplyDefensiveStatMultiplier(struct entity *user, struct entity *target, struct StatIndex stat, fx32_8 multiplier, bool8 displayMessage)
|
||||
{
|
||||
struct monster *entityInfo;
|
||||
fx32_8 oldMulti;
|
||||
u8 *buffer1 = AllocateTemp1024ByteBufferFromPool();
|
||||
|
||||
if (!EntityIsValid__023118B4(target))
|
||||
return;
|
||||
|
||||
if (stat.id != STAT_INDEX_PHYSICAL) {
|
||||
CopyStringFromId(buffer1, 0xdc9 + JPN_MSG_OFFSET);
|
||||
SetMessageLogPreprocessorArgsString(1, buffer1);
|
||||
}
|
||||
else {
|
||||
CopyStringFromId(buffer1, 0xdc8 + JPN_MSG_OFFSET);
|
||||
SetMessageLogPreprocessorArgsString(1, buffer1);
|
||||
}
|
||||
|
||||
if (F248LessThanInt(multiplier, 1) && IsProtectedFromStatDrops(user,target,displayMessage))
|
||||
return;
|
||||
|
||||
entityInfo = GetEntInfo(target);
|
||||
SubstitutePlaceholderStringTags(0,target,0);
|
||||
oldMulti = entityInfo->stat_modifiers.defensive_multipliers[stat.id];
|
||||
|
||||
if (F248LessThanInt(multiplier, 1)) {
|
||||
PlayDefensiveStatMultiplierDownEffect(target,stat);
|
||||
}
|
||||
else {
|
||||
PlayDefensiveStatMultiplierUpEffect(target,stat);
|
||||
}
|
||||
|
||||
entityInfo->stat_modifiers.defensive_multipliers[stat.id] = MultiplyByFixedPoint(entityInfo->stat_modifiers.defensive_multipliers[stat.id],multiplier);
|
||||
|
||||
if (F248LessThanFloat(entityInfo->stat_modifiers.defensive_multipliers[stat.id], 0.01)) {
|
||||
entityInfo->stat_modifiers.defensive_multipliers[stat.id] = IntToF248(0.01);
|
||||
}
|
||||
if (FloatLessThanF248(99.99, entityInfo->stat_modifiers.defensive_multipliers[stat.id])) {
|
||||
entityInfo->stat_modifiers.defensive_multipliers[stat.id] = IntToF248(99.99);
|
||||
}
|
||||
|
||||
if (F248GreaterThan(oldMulti, entityInfo->stat_modifiers.defensive_multipliers[stat.id])) {
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xdcf + JPN_MSG_OFFSET);
|
||||
}
|
||||
else if (F248LessThan(oldMulti, entityInfo->stat_modifiers.defensive_multipliers[stat.id])) {
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xdce + JPN_MSG_OFFSET);
|
||||
}
|
||||
else {
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xdd2 + JPN_MSG_OFFSET);
|
||||
}
|
||||
UpdateStatusIconFlags(target);
|
||||
}
|
||||
|
||||
void BoostHitChanceStat(struct entity *user, struct entity *target, struct StatIndex stat)
|
||||
{
|
||||
struct monster *entityInfo;
|
||||
u8 *buffer1 = AllocateTemp1024ByteBufferFromPool();
|
||||
s16 nStages = 1;
|
||||
|
||||
if (!EntityIsValid__023118B4(target))
|
||||
return;
|
||||
|
||||
entityInfo = GetEntInfo(target);
|
||||
SubstitutePlaceholderStringTags(0,target,0);
|
||||
PlayHitChanceUpEffect(target,stat);
|
||||
if (stat.id != STAT_INDEX_ACCURACY) {
|
||||
CopyStringFromId(buffer1, 0xdc7 + JPN_MSG_OFFSET);
|
||||
SetMessageLogPreprocessorArgsString(1, buffer1);
|
||||
}
|
||||
else {
|
||||
CopyStringFromId(buffer1, 0xdc6 + JPN_MSG_OFFSET);
|
||||
SetMessageLogPreprocessorArgsString(1, buffer1);
|
||||
}
|
||||
|
||||
if (AbilityIsActiveVeneer(target, ABILITY_SIMPLE))
|
||||
nStages *= 2;
|
||||
|
||||
if (entityInfo->stat_modifiers.hit_chance_stages[stat.id] < MAX_STAT_STAGE) {
|
||||
entityInfo->stat_modifiers.hit_chance_stages[stat.id] += nStages;
|
||||
if (entityInfo->stat_modifiers.hit_chance_stages[stat.id] > MAX_STAT_STAGE) {
|
||||
entityInfo->stat_modifiers.hit_chance_stages[stat.id] = MAX_STAT_STAGE;
|
||||
}
|
||||
|
||||
if (nStages >= 2) {
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xd95 + JPN_MSG_OFFSET);
|
||||
}
|
||||
else {
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xd93 + JPN_MSG_OFFSET);
|
||||
}
|
||||
}
|
||||
else {
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xdd5 + JPN_MSG_OFFSET);
|
||||
}
|
||||
|
||||
UpdateStatusIconFlags(target);
|
||||
}
|
||||
|
||||
void LowerHitChanceStat(struct entity *user, struct entity *target, struct StatIndex stat, bool8 displayMessage)
|
||||
{
|
||||
struct monster *entityInfo;
|
||||
u8 *buffer1 = AllocateTemp1024ByteBufferFromPool();
|
||||
s16 nStages = 1;
|
||||
|
||||
if (!EntityIsValid__023118B4(target))
|
||||
return;
|
||||
|
||||
if (stat.id != STAT_INDEX_ACCURACY) {
|
||||
CopyStringFromId(buffer1, 0xdc7 + JPN_MSG_OFFSET);
|
||||
SetMessageLogPreprocessorArgsString(1, buffer1);
|
||||
}
|
||||
else {
|
||||
CopyStringFromId(buffer1, 0xdc6 + JPN_MSG_OFFSET);
|
||||
SetMessageLogPreprocessorArgsString(1, buffer1);
|
||||
}
|
||||
|
||||
if (IsProtectedFromStatDrops(user,target,displayMessage))
|
||||
return;
|
||||
|
||||
#ifdef JAPAN
|
||||
if (DefenderAbilityIsActive__02311B94(user, target, ABILITY_KEEN_EYE) && stat.id == STAT_INDEX_ACCURACY) {
|
||||
#else
|
||||
if (DefenderAbilityIsActive__02311B94(user, target, ABILITY_KEEN_EYE, TRUE) && stat.id == STAT_INDEX_ACCURACY) {
|
||||
#endif // JAPAN
|
||||
if (displayMessage) {
|
||||
SubstitutePlaceholderStringTags(0,target,0);
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xd9f + JPN_MSG_OFFSET);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (AbilityIsActiveVeneer(target, ABILITY_SIMPLE))
|
||||
nStages *= 2;
|
||||
|
||||
entityInfo = GetEntInfo(target);
|
||||
SubstitutePlaceholderStringTags(0,target,0);
|
||||
PlayHitChanceDownEffect(target,stat);
|
||||
|
||||
if (entityInfo->stat_modifiers.hit_chance_stages[stat.id] > 0) {
|
||||
entityInfo->stat_modifiers.hit_chance_stages[stat.id] -= nStages;
|
||||
if (entityInfo->stat_modifiers.hit_chance_stages[stat.id] < 0) {
|
||||
entityInfo->stat_modifiers.hit_chance_stages[stat.id] = 0;
|
||||
}
|
||||
|
||||
if (nStages >= 2) {
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xd94 + JPN_MSG_OFFSET);
|
||||
}
|
||||
else {
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xd92 + JPN_MSG_OFFSET);
|
||||
}
|
||||
}
|
||||
else {
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xdd4 + JPN_MSG_OFFSET);
|
||||
}
|
||||
|
||||
UpdateStatusIconFlags(target);
|
||||
}
|
||||
|
||||
bool8 TryInflictCringeStatus(struct entity *user ,struct entity *target, bool8 displayMessage, bool8 onlyCheck)
|
||||
{
|
||||
struct monster *entityInfo;
|
||||
u8 *buffer1 = AllocateTemp1024ByteBufferFromPool();
|
||||
|
||||
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_INNER_FOCUS)) {
|
||||
#else
|
||||
if (DefenderAbilityIsActive__02311B94(user, target, ABILITY_INNER_FOCUS, TRUE)) {
|
||||
#endif
|
||||
SubstitutePlaceholderStringTags(0,target,0);
|
||||
if (displayMessage)
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xda2 + JPN_MSG_OFFSET);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (onlyCheck)
|
||||
return TRUE;
|
||||
|
||||
entityInfo = GetEntInfo(target);
|
||||
SubstitutePlaceholderStringTags(0,target,0);
|
||||
if (entityInfo->cringe_class_status.cringe != STATUS_CRINGE_CRINGE) {
|
||||
entityInfo->cringe_class_status.cringe = STATUS_CRINGE_CRINGE;
|
||||
entityInfo->cringe_class_status.cringe_turns = CalcStatusDuration(target, CRINGE_TURN_RANGE, TRUE) + 1;
|
||||
PlayCringeExclamationPointEffect(target);
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xd02 + JPN_MSG_OFFSET);
|
||||
TryActivateSteadfast(user, target);
|
||||
TryActivateQuickFeet(user, target);
|
||||
}
|
||||
else {
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xd03 + JPN_MSG_OFFSET);
|
||||
}
|
||||
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,PARALYSIS_TURN_RANGE,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);
|
||||
PlayParalysisEffect(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;
|
||||
}
|
||||
|
||||
void BoostSpeed(struct entity *user, struct entity *target, s32 nStages, s32 turns, bool8 displayMessage)
|
||||
{
|
||||
s32 speedBefore;
|
||||
s32 i;
|
||||
s32 speedAfter;
|
||||
struct monster *entityInfo;
|
||||
|
||||
if (!EntityIsValid__023118B4(target))
|
||||
return;
|
||||
|
||||
if (turns == 0) {
|
||||
turns = CalcStatusDuration(target,SPEED_BOOST_TURN_RANGE,FALSE) + 1;
|
||||
}
|
||||
|
||||
entityInfo = GetEntInfo(target);
|
||||
SubstitutePlaceholderStringTags(0,target,0);
|
||||
speedBefore = CalcSpeedStage(target, nStages);
|
||||
if (speedBefore == MAX_SPEED_STAGE) {
|
||||
if (displayMessage)
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xddb + JPN_MSG_OFFSET);
|
||||
}
|
||||
else {
|
||||
for (i = 0; i < NUM_SPEED_COUNTERS; i++) {
|
||||
if (entityInfo->speed_up_counters[i] == 0) {
|
||||
entityInfo->speed_up_counters[i] = turns;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
speedAfter = CalcSpeedStage(target, nStages);
|
||||
if (speedBefore == speedAfter) {
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xdda + JPN_MSG_OFFSET);
|
||||
}
|
||||
else {
|
||||
PlaySpeedUpEffect(target);
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,ov29_02353318[speedAfter]);
|
||||
entityInfo->unk_sped_up_tracker = TRUE;
|
||||
entityInfo->already_acted = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
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,SPEED_LOWER_TURN_RANGE,TRUE) + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
speedAfter = CalcSpeedStageWrapper(target);
|
||||
if (speedBefore == speedAfter) {
|
||||
if (displayMessage)
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,0xdda + JPN_MSG_OFFSET);
|
||||
}
|
||||
else {
|
||||
PlaySpeedDownEffect(target);
|
||||
LogMessageByIdWithPopupCheckUserTarget(user,target,ov29_02353318[speedAfter]);
|
||||
if (speedAfter == 0) {
|
||||
TryActivateQuickFeet(user, target);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
UpdateStatusIconFlags(target);
|
||||
}
|
||||
|
||||
// If Red's file boundaries are anything to go by, this file should end just before TryInflictConfusedStatus.
|
||||
|
|
@ -1,76 +0,0 @@
|
|||
#include "dungeon_pokemon_attributes.h"
|
||||
#include "dungeon_util_static.h"
|
||||
#include "overlay_29_023118B4.h"
|
||||
#include "overlay_29_02313814.h"
|
||||
|
||||
extern u8* AllocateTemp1024ByteBufferFromPool(void);
|
||||
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_022E4DCC(struct entity *pokemon, struct StatIndex);
|
||||
extern void LogMessageByIdWithPopupCheckUserTarget(struct entity *user, struct entity *target, u32 message_id);
|
||||
extern void UpdateStatusIconFlags(struct entity *);
|
||||
|
||||
#ifdef JAPAN
|
||||
#define LOWER_DEFENSIVE_STAT_OFFSET -0x2C0
|
||||
#else
|
||||
#define LOWER_DEFENSIVE_STAT_OFFSET 0
|
||||
#endif // JAPAN
|
||||
|
||||
void LowerDefensiveStat(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, 0xdc9 + LOWER_DEFENSIVE_STAT_OFFSET);
|
||||
SetMessageLogPreprocessorArgsString(1, buffer1);
|
||||
}
|
||||
else {
|
||||
CopyStringFromId(buffer1, 0xdc8 + LOWER_DEFENSIVE_STAT_OFFSET);
|
||||
SetMessageLogPreprocessorArgsString(1, buffer1);
|
||||
}
|
||||
|
||||
if (checkProtected) {
|
||||
if (IsProtectedFromStatDrops(pokemon, target, logMsgProtected))
|
||||
return;
|
||||
}
|
||||
|
||||
entityInfo = GetEntInfo(target);
|
||||
SubstitutePlaceholderStringTags(0,target,0);
|
||||
ov29_022E4DCC(target,stat);
|
||||
|
||||
if (AbilityIsActiveVeneer(target, ABILITY_SIMPLE))
|
||||
nStages *= 2;
|
||||
|
||||
if (nStages == 1) {
|
||||
CopyStringFromId(buffer2, 0xdcd + LOWER_DEFENSIVE_STAT_OFFSET);
|
||||
SetMessageLogPreprocessorArgsString(2, buffer2);
|
||||
}
|
||||
else {
|
||||
CopyStringFromId(buffer2, 0xdcc + LOWER_DEFENSIVE_STAT_OFFSET);
|
||||
SetMessageLogPreprocessorArgsString(2, buffer2);
|
||||
}
|
||||
|
||||
newStage = entityInfo->stat_modifiers.defensive_stages[stat.id];
|
||||
newStage -= nStages;
|
||||
if (newStage < 0) {
|
||||
newStage = 0;
|
||||
}
|
||||
|
||||
if (entityInfo->stat_modifiers.defensive_stages[stat.id] != newStage) {
|
||||
entityInfo->stat_modifiers.defensive_stages[stat.id] = newStage;
|
||||
LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xd90 + LOWER_DEFENSIVE_STAT_OFFSET);
|
||||
}
|
||||
else {
|
||||
LogMessageByIdWithPopupCheckUserTarget(pokemon,target,0xdd7 + LOWER_DEFENSIVE_STAT_OFFSET);
|
||||
}
|
||||
UpdateStatusIconFlags(target);
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user