Merge pull request #205 from DizzyEggg/stat_functions
Some checks are pending
build / build (push) Waiting to run

Decompile & Sync with pmd-red some stat lowering functions
This commit is contained in:
AnonymousRandomPerson 2025-11-14 18:14:49 -05:00 committed by GitHub
commit e1ce72db65
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
29 changed files with 973 additions and 1714 deletions

View File

@ -11,7 +11,7 @@
.public ExclusiveItemEffectIsActive__0230A9B8
.public FixedPoint32To64
.public FixedPoint64IsZero
.public FlashFireShouldActivate
.public GetFlashFireStatus
.public GetApparentWeather
.public GetTypeMatchup
.public GhostImmunityIsActive

View File

@ -39,7 +39,7 @@
.public FixedPoint64CmpLt
.public FixedPoint64ToInt
.public FixedRoomIsSubstituteRoom
.public FlashFireShouldActivate
.public GetFlashFireStatus
.public GendersEqualNotGenderless
.public GendersNotEqualNotGenderless
.public GenerateStandardItem

View File

@ -1,9 +1,7 @@
#pragma once
.public AbilityIsActiveVeneer
.public AllocateTemp1024ByteBufferFromPool
.public CalcStatusDuration
.public ChangeShayminForme
.public CopyStringFromId
.public DIRECTIONS_XY
.public DUNGEON_PTR
.public DefenderAbilityIsActive__02311B94
@ -15,13 +13,11 @@
.public GetTreatmentBetweenMonstersIgnoreStatus
.public IsProtectedFromNegativeStatus
.public IsProtectedFromSleepClassStatus
.public IsProtectedFromStatDrops
.public ItemIsActive__02311BF8
.public LogMessageByIdWithPopupCheckUserTarget
.public MonsterIsType
.public SECONDARY_TERRAIN_TYPES
.public SafeguardIsActive
.public SetMessageLogPreprocessorArgsString
.public SetPreprocessorArgsIdVal
.public SetPreprocessorArgsStringToName
.public SubstitutePlaceholderStringTags
@ -53,7 +49,6 @@
.public ov29_022E4C00
.public ov29_022E4C4C
.public ov29_022E4D24
.public ov29_022E4D28
.public ov29_022E53EC
.public ov29_02304A48
.public ov29_02304A84

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1980,158 +1980,3 @@ _023135F4: .word 0x00000D33
#endif
_023135F8: .word DUNGEON_PTR
arm_func_end TryInflictPetrifiedStatus
arm_func_start LowerOffensiveStat
LowerOffensiveStat: ; 0x023135FC
stmdb sp!, {r0, r1, r2, r3}
stmdb sp!, {r4, r5, r6, r7, r8, lr}
mov r7, r1
mov r5, r3
mov r8, r0
bl AllocateTemp1024ByteBufferFromPool
mov r6, r0
bl AllocateTemp1024ByteBufferFromPool
mov r4, r0
mov r1, r5, lsl #0x10
mov r0, r7
mov r5, r1, asr #0x10
bl EntityIsValid__023118B4
cmp r0, #0
beq _023137E8
ldr r0, [sp, #0x20]
cmp r0, #0
beq _02313660
ldr r1, _023137F4 ; =0x00000DCB
mov r0, r6
bl CopyStringFromId
mov r1, r6
mov r0, #1
bl SetMessageLogPreprocessorArgsString
b _02313678
_02313660:
ldr r1, _023137F8 ; =0x00000DCA
mov r0, r6
bl CopyStringFromId
mov r1, r6
mov r0, #1
bl SetMessageLogPreprocessorArgsString
_02313678:
ldrb r0, [sp, #0x28]
cmp r0, #0
beq _02313720
ldrb r2, [sp, #0x2c]
mov r0, r8
mov r1, r7
bl IsProtectedFromStatDrops
cmp r0, #0
bne _023137E8
mov r0, r7
mov r1, #0x12
bl ItemIsActive__02311BF8
cmp r0, #0
beq _023136D4
mov r0, #0
mov r1, r7
mov r2, r0
bl SubstitutePlaceholderStringTags
ldr r2, _023137FC ; =0x00000DB2
mov r0, r8
mov r1, r7
bl LogMessageByIdWithPopupCheckUserTarget
b _023137E8
_023136D4:
mov r0, r8
mov r1, r7
mov r2, #9
#ifndef JAPAN
mov r3, #1
#endif
bl DefenderAbilityIsActive__02311B94
cmp r0, #0
beq _02313720
ldr r0, [sp, #0x20]
cmp r0, #0
bne _02313720
mov r0, #0
mov r1, r7
mov r2, r0
bl SubstitutePlaceholderStringTags
ldr r2, _02313800 ; =0x00000D9E
mov r0, r8
mov r1, r7
bl LogMessageByIdWithPopupCheckUserTarget
b _023137E8
_02313720:
mov r0, #0
mov r1, r7
mov r2, r0
ldr r6, [r7, #0xb4]
bl SubstitutePlaceholderStringTags
add r1, sp, #0x20
ldr r1, [r1]
mov r0, r7
bl ov29_022E4D28
mov r0, r7
mov r1, #0x61
bl AbilityIsActiveVeneer
cmp r0, #0
movne r0, r5, lsl #0x11
movne r5, r0, asr #0x10
cmp r5, #1
bne _02313780
ldr r1, _02313804 ; =0x00000DCD
mov r0, r4
bl CopyStringFromId
mov r1, r4
mov r0, #2
bl SetMessageLogPreprocessorArgsString
b _02313798
_02313780:
ldr r1, _02313808 ; =0x00000DCC
mov r0, r4
bl CopyStringFromId
mov r1, r4
mov r0, #2
bl SetMessageLogPreprocessorArgsString
_02313798:
ldr r1, [sp, #0x20]
add r0, r6, r1, lsl #1
ldrsh r0, [r0, #0x24]
subs r4, r0, r5
movmi r4, #0
cmp r4, r0
beq _023137D0
ldr r2, _0231380C ; =0x00000D91
add r3, r6, r1, lsl #1
mov r0, r8
mov r1, r7
strh r4, [r3, #0x24]
bl LogMessageByIdWithPopupCheckUserTarget
b _023137E0
_023137D0:
ldr r2, _02313810 ; =0x00000DD9
mov r0, r8
mov r1, r7
bl LogMessageByIdWithPopupCheckUserTarget
_023137E0:
mov r0, r7
bl UpdateStatusIconFlags
_023137E8:
ldmia sp!, {r4, r5, r6, r7, r8, lr}
add sp, sp, #0x10
bx lr
.align 2, 0
#ifdef JAPAN
#define LOWER_OFFENSIVE_STAT_OFFSET -0x2C0
#else
#define LOWER_OFFENSIVE_STAT_OFFSET 0
#endif
_023137F4: .word 0x00000DCB + LOWER_OFFENSIVE_STAT_OFFSET
_023137F8: .word 0x00000DCA + LOWER_OFFENSIVE_STAT_OFFSET
_023137FC: .word 0x00000DB2 + LOWER_OFFENSIVE_STAT_OFFSET
_02313800: .word 0x00000D9E + LOWER_OFFENSIVE_STAT_OFFSET
_02313804: .word 0x00000DCD + LOWER_OFFENSIVE_STAT_OFFSET
_02313808: .word 0x00000DCC + LOWER_OFFENSIVE_STAT_OFFSET
_0231380C: .word 0x00000D91 + LOWER_OFFENSIVE_STAT_OFFSET
_02313810: .word 0x00000DD9 + LOWER_OFFENSIVE_STAT_OFFSET
arm_func_end LowerOffensiveStat

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View 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

View File

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

View File

@ -1,9 +0,0 @@
#ifndef PMDSKY_OVERLAY_29_023147EC_H
#define PMDSKY_OVERLAY_29_023147EC_H
#include "dungeon_mode.h"
// Checks if a monster is a team member under the effects of a certain exclusive item effect.
bool8 ExclusiveItemEffectIsActive__023147EC(struct entity *entity, enum exclusive_item_effect_id effect_id);
#endif //PMDSKY_OVERLAY_29_023147EC_H

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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);
}

View File

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