diff --git a/asm/include/overlay_29_0230AD04.inc b/asm/include/overlay_29_0230AD04.inc index b2ccddb8..190bdd97 100644 --- a/asm/include/overlay_29_0230AD04.inc +++ b/asm/include/overlay_29_0230AD04.inc @@ -11,7 +11,7 @@ .public ExclusiveItemEffectIsActive__0230A9B8 .public FixedPoint32To64 .public FixedPoint64IsZero -.public FlashFireShouldActivate +.public GetFlashFireStatus .public GetApparentWeather .public GetTypeMatchup .public GhostImmunityIsActive diff --git a/asm/include/overlay_29_0230BBAC.inc b/asm/include/overlay_29_0230BBAC.inc index 9ef5a2ab..8b19023c 100644 --- a/asm/include/overlay_29_0230BBAC.inc +++ b/asm/include/overlay_29_0230BBAC.inc @@ -39,7 +39,7 @@ .public FixedPoint64CmpLt .public FixedPoint64ToInt .public FixedRoomIsSubstituteRoom -.public FlashFireShouldActivate +.public GetFlashFireStatus .public GendersEqualNotGenderless .public GendersNotEqualNotGenderless .public GenerateStandardItem diff --git a/asm/include/overlay_29_02311C28.inc b/asm/include/overlay_29_02311C28.inc index 8aa65120..88f577f2 100644 --- a/asm/include/overlay_29_02311C28.inc +++ b/asm/include/overlay_29_02311C28.inc @@ -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 diff --git a/asm/include/overlay_29_0231399C.inc b/asm/include/overlay_29_0231399C.inc deleted file mode 100644 index 716d03fe..00000000 --- a/asm/include/overlay_29_0231399C.inc +++ /dev/null @@ -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 diff --git a/asm/include/overlay_29_02313CE4.inc b/asm/include/overlay_29_02313CE4.inc index 97f24280..87232ce0 100644 --- a/asm/include/overlay_29_02313CE4.inc +++ b/asm/include/overlay_29_02313CE4.inc @@ -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 diff --git a/asm/include/overlay_29_02314810.inc b/asm/include/overlay_29_02314810.inc index 02408b90..5766c126 100644 --- a/asm/include/overlay_29_02314810.inc +++ b/asm/include/overlay_29_02314810.inc @@ -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 diff --git a/asm/include/overlay_29_02325644.inc b/asm/include/overlay_29_02325644.inc index 4c9615c7..669df375 100644 --- a/asm/include/overlay_29_02325644.inc +++ b/asm/include/overlay_29_02325644.inc @@ -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 diff --git a/asm/overlay_10_rodata_022C464C.s b/asm/overlay_10_rodata_022C464C.s index c4653d3b..212e7436 100644 --- a/asm/overlay_10_rodata_022C464C.s +++ b/asm/overlay_10_rodata_022C464C.s @@ -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: diff --git a/asm/overlay_29_022E37DC.s b/asm/overlay_29_022E37DC.s index babce157..a98cc774 100644 --- a/asm/overlay_29_022E37DC.s +++ b/asm/overlay_29_022E37DC.s @@ -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 diff --git a/asm/overlay_29_0230AD04.s b/asm/overlay_29_0230AD04.s index 19702152..efba6e62 100644 --- a/asm/overlay_29_0230AD04.s +++ b/asm/overlay_29_0230AD04.s @@ -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 diff --git a/asm/overlay_29_0230BBAC.s b/asm/overlay_29_0230BBAC.s index 0e17ae4b..c72dc8a9 100644 --- a/asm/overlay_29_0230BBAC.s +++ b/asm/overlay_29_0230BBAC.s @@ -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] diff --git a/asm/overlay_29_02311C28.s b/asm/overlay_29_02311C28.s index af5ef563..61ac48bc 100644 --- a/asm/overlay_29_02311C28.s +++ b/asm/overlay_29_02311C28.s @@ -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 diff --git a/asm/overlay_29_0231399C.s b/asm/overlay_29_0231399C.s deleted file mode 100644 index 292ce09b..00000000 --- a/asm/overlay_29_0231399C.s +++ /dev/null @@ -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 diff --git a/asm/overlay_29_02313CE4.s b/asm/overlay_29_02313CE4.s deleted file mode 100644 index 6f927cb5..00000000 --- a/asm/overlay_29_02313CE4.s +++ /dev/null @@ -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 diff --git a/asm/overlay_29_02314810.s b/asm/overlay_29_02314810.s index d766a19c..6bdfbf5b 100644 --- a/asm/overlay_29_02314810.s +++ b/asm/overlay_29_02314810.s @@ -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 diff --git a/asm/overlay_29_02325644.s b/asm/overlay_29_02325644.s index 4a462a3e..83de1a89 100644 --- a/asm/overlay_29_02325644.s +++ b/asm/overlay_29_02325644.s @@ -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] diff --git a/include/math.h b/include/math.h index ee4c3881..2dace633 100644 --- a/include/math.h +++ b/include/math.h @@ -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 \ No newline at end of file +#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 diff --git a/include/move_orb_effects.h b/include/move_orb_effects.h deleted file mode 100644 index 39fb09e2..00000000 --- a/include/move_orb_effects.h +++ /dev/null @@ -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 diff --git a/include/move_orb_effects_1.h b/include/move_orb_effects_1.h new file mode 100644 index 00000000..ca896187 --- /dev/null +++ b/include/move_orb_effects_1.h @@ -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 diff --git a/include/overlay_29_02313814.h b/include/overlay_29_02313814.h deleted file mode 100644 index 93169f35..00000000 --- a/include/overlay_29_02313814.h +++ /dev/null @@ -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 diff --git a/include/overlay_29_023147EC.h b/include/overlay_29_023147EC.h deleted file mode 100644 index 72643936..00000000 --- a/include/overlay_29_023147EC.h +++ /dev/null @@ -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 diff --git a/main.lsf b/main.lsf index 9360fa71..6e0ea3b9 100644 --- a/main.lsf +++ b/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 diff --git a/src/dungeon_ai_attack.c b/src/dungeon_ai_attack.c index 2706fada..66c67a1b 100644 --- a/src/dungeon_ai_attack.c +++ b/src/dungeon_ai_attack.c @@ -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; } diff --git a/src/dungeon_damage.c b/src/dungeon_damage.c index 5d072205..349e5532 100644 --- a/src/dungeon_damage.c +++ b/src/dungeon_damage.c @@ -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 diff --git a/src/dungeon_range.c b/src/dungeon_range.c index 17499f7f..de6aa98d 100644 --- a/src/dungeon_range.c +++ b/src/dungeon_range.c @@ -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; } diff --git a/src/move_orb_effects.c b/src/move_orb_effects.c deleted file mode 100644 index 146d110f..00000000 --- a/src/move_orb_effects.c +++ /dev/null @@ -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; -} diff --git a/src/move_orb_effects_1.c b/src/move_orb_effects_1.c new file mode 100644 index 00000000..4b88254b --- /dev/null +++ b/src/move_orb_effects_1.c @@ -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. diff --git a/src/overlay_29_02313814.c b/src/overlay_29_02313814.c deleted file mode 100644 index 518f738a..00000000 --- a/src/overlay_29_02313814.c +++ /dev/null @@ -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); -} diff --git a/src/overlay_29_023147EC.c b/src/overlay_29_023147EC.c deleted file mode 100644 index 87e2cf71..00000000 --- a/src/overlay_29_023147EC.c +++ /dev/null @@ -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; -}