sub_8055DDC

This commit is contained in:
DizzyEggg 2024-10-23 12:35:56 +02:00
parent 389da1c570
commit ef2868a2bc
6 changed files with 298 additions and 699 deletions

View File

@ -5,690 +5,6 @@
.text
thumb_func_start sub_8055A00
sub_8055A00:
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
sub sp, 0x34
adds r5, r0, 0
mov r9, r1
str r2, [sp, 0x20]
str r3, [sp, 0x24]
ldr r0, [r5, 0x70]
mov r10, r0
mov r7, r9
cmp r7, 0x3
ble _08055A22
movs r0, 0
b _08055DB4
_08055A22:
movs r0, 0xBC
lsls r0, 1
add r0, r10
movs r1, 0
movs r2, 0
strh r2, [r0]
ldr r0, _08055A4C
add r0, r10
strb r1, [r0]
mov r0, r10
adds r0, 0xBC
ldrb r0, [r0]
cmp r0, 0x1
bne _08055A58
ldr r0, _08055A50
adds r1, r5, 0
bl SetMessageArgument
ldr r0, _08055A54
b _08055A8A
.align 2, 0
_08055A4C: .4byte 0x00000159
_08055A50: .4byte gAvailablePokemonNames
_08055A54: .4byte gUnknown_80FC714
_08055A58:
cmp r0, 0x7
bne _08055A74
ldr r0, _08055A6C
adds r1, r5, 0
movs r2, 0
bl SetMessageArgument
ldr r0, _08055A70
b _08055A8A
.align 2, 0
_08055A6C: .4byte gAvailablePokemonNames
_08055A70: .4byte gUnknown_80FC718
_08055A74:
mov r0, r10
adds r0, 0xAC
ldrb r0, [r0]
cmp r0, 0x4
bne _08055AA0
ldr r0, _08055A98
adds r1, r5, 0
movs r2, 0
bl SetMessageArgument
ldr r0, _08055A9C
_08055A8A:
ldr r1, [r0]
adds r0, r5, 0
bl TryDisplayDungeonLoggableMessage
movs r0, 0
b _08055DB4
.align 2, 0
_08055A98: .4byte gAvailablePokemonNames
_08055A9C: .4byte gUnknown_80FC6A8
_08055AA0:
ldr r0, _08055B24
strb r1, [r0]
ldr r0, _08055B28
str r2, [r0]
ldr r0, _08055B2C
strb r1, [r0]
adds r0, r7, 0x1
movs r2, 0
movs r6, 0x3
movs r1, 0xC0
lsls r1, 1
add r1, r10
_08055AB8:
strh r2, [r1]
subs r1, 0x2
subs r6, 0x1
cmp r6, 0
bge _08055AB8
movs r6, 0
movs r3, 0x1
adds r7, r0, 0
cmp r7, 0x3
bgt _08055B06
lsls r2, r7, 3
mov r1, r10
adds r0, r1, r2
movs r4, 0x8C
lsls r4, 1
adds r0, r4
ldrb r1, [r0]
movs r0, 0x2
ands r0, r1
cmp r0, 0
beq _08055B06
movs r0, 0x2
mov r8, r0
adds r0, r2, r4
mov r1, r10
adds r2, r0, r1
_08055AEC:
adds r6, 0x1
cmp r6, 0x3
bgt _08055B06
adds r3, 0x1
adds r2, 0x8
adds r7, 0x1
cmp r7, 0x3
bgt _08055B06
ldrb r1, [r2]
mov r0, r8
ands r0, r1
cmp r0, 0
bne _08055AEC
_08055B06:
movs r0, 0
str r0, [sp, 0x28]
cmp r3, 0x1
ble _08055B12
movs r1, 0x1
str r1, [sp, 0x28]
_08055B12:
mov r7, r9
lsls r0, r7, 3
movs r1, 0x8C
lsls r1, 1
adds r0, r1
add r0, r10
mov r8, r0
b _08055CB4
.align 2, 0
_08055B24: .4byte gUnknown_202F222
_08055B28: .4byte gUnknown_202F208
_08055B2C: .4byte gUnknown_202F221
_08055B30:
mov r1, r8
ldrh r0, [r1, 0x2]
cmp r0, 0x19
beq _08055B3C
cmp r0, 0xE3
bne _08055B4E
_08055B3C:
adds r0, r5, 0
bl IsSleeping
lsls r0, 24
cmp r0, 0
bne _08055B5E
adds r0, r5, 0
movs r1, 0x1
b _08055B52
_08055B4E:
adds r0, r5, 0
movs r1, 0
_08055B52:
bl CannotAttack
lsls r0, 24
cmp r0, 0
beq _08055B5E
b _08055CCE
_08055B5E:
ldr r0, _08055B9C
ldrb r0, [r0]
cmp r0, 0
beq _08055B68
b _08055CCE
_08055B68:
ldrb r1, [r6]
movs r0, 0x1
ands r0, r1
cmp r0, 0
bne _08055B74
b _08055C82
_08055B74:
movs r2, 0x1
movs r0, 0
str r0, [sp, 0x2C]
adds r0, r5, 0
adds r1, r6, 0
str r2, [sp, 0x30]
bl MoveMatchesChargingStatus
lsls r0, 24
lsrs r4, r0, 24
ldrb r0, [r6, 0x4]
ldr r2, [sp, 0x30]
cmp r0, 0
beq _08055BA0
cmp r4, 0
bne _08055BBA
movs r1, 0x1
str r1, [sp, 0x2C]
b _08055BBA
.align 2, 0
_08055B9C: .4byte gUnknown_202F221
_08055BA0:
cmp r4, 0
bne _08055BBA
ldr r0, _08055C08
adds r1, r6, 0
movs r2, 0
bl sub_80928C0
ldr r0, _08055C0C
ldr r1, [r0]
adds r0, r5, 0
bl TryDisplayDungeonLoggableMessage
movs r2, 0
_08055BBA:
cmp r2, 0
beq _08055C82
ldr r0, _08055C10
ldr r0, [r0]
mov r9, r0
ldr r0, _08055C14
add r0, r10
strb r4, [r0]
ldrh r0, [r6, 0x2]
cmp r0, 0xE5
bne _08055C20
ldr r0, [r6]
ldr r1, [r6, 0x4]
str r0, [sp, 0x8]
str r1, [sp, 0xC]
adds r0, r5, 0
bl sub_8057144
lsls r0, 16
ldr r2, _08055C18
ldr r1, [sp, 0x8]
ands r1, r2
orrs r1, r0
str r1, [sp, 0x8]
ldr r0, _08055C08
add r1, sp, 0x8
movs r2, 0
bl sub_80928C0
ldr r0, _08055C1C
ldr r1, [r0]
adds r0, r5, 0
bl TryDisplayDungeonLoggableMessage
ldr r0, [sp, 0x28]
str r0, [sp]
add r1, sp, 0x8
str r1, [sp, 0x4]
b _08055C26
.align 2, 0
_08055C08: .4byte gFormatItems
_08055C0C: .4byte gUnknown_80F93C8
_08055C10: .4byte gUnknown_202F208
_08055C14: .4byte 0x00000159
_08055C18: .4byte 0x0000ffff
_08055C1C: .4byte gUnknown_80FD2DC
_08055C20:
ldr r0, [sp, 0x28]
str r0, [sp]
str r6, [sp, 0x4]
_08055C26:
adds r0, r5, 0
ldr r1, [sp, 0x20]
ldr r2, [sp, 0x24]
ldr r3, [sp, 0x54]
bl sub_8055FA0
lsls r0, 24
lsrs r0, 24
ldr r1, [sp, 0x2C]
cmp r1, 0
beq _08055C56
cmp r0, 0
beq _08055C56
ldrb r1, [r6, 0x1]
movs r0, 0x4
ands r0, r1
cmp r0, 0
beq _08055C50
movs r0, 0xFB
ands r0, r1
b _08055C54
_08055C50:
movs r0, 0x8
orrs r0, r1
_08055C54:
strb r0, [r6, 0x1]
_08055C56:
ldr r0, _08055C70
ldr r0, [r0]
cmp r9, r0
bne _08055C82
ldr r0, [sp, 0x24]
cmp r0, 0
bne _08055C78
ldr r0, _08055C74
ldr r1, [r0]
adds r0, r5, 0
bl TryDisplayDungeonLoggableMessage
b _08055C82
.align 2, 0
_08055C70: .4byte gUnknown_202F208
_08055C74: .4byte gUnknown_80FC690
_08055C78:
ldr r0, _08055DC4
ldr r1, [r0]
adds r0, r5, 0
bl TryDisplayDungeonLoggableMessage
_08055C82:
movs r0, 0x1
bl sub_804178C
adds r0, r5, 0
bl EntityExists
lsls r0, 24
cmp r0, 0
beq _08055CCE
bl sub_8044B28
lsls r0, 24
cmp r0, 0
bne _08055CCE
movs r1, 0x8
add r8, r1
adds r7, 0x1
cmp r7, 0x3
bgt _08055CCE
mov r0, r8
ldrb r1, [r0]
movs r0, 0x2
ands r0, r1
cmp r0, 0
beq _08055CCE
_08055CB4:
mov r6, r8
adds r0, r5, 0
bl EntityExists
lsls r0, 24
cmp r0, 0
beq _08055CCE
bl sub_8044B28
lsls r0, 24
cmp r0, 0
bne _08055CCE
b _08055B30
_08055CCE:
adds r0, r5, 0
bl EntityExists
lsls r0, 24
cmp r0, 0
beq _08055D54
movs r6, 0
_08055CDC:
lsls r0, r6, 1
movs r1, 0xBD
lsls r1, 1
add r1, r10
adds r1, r0
ldrh r0, [r1]
cmp r0, 0
beq _08055D4E
add r4, sp, 0x10
adds r1, r0, 0
adds r0, r4, 0
bl sub_8092AA8
ldrb r1, [r4]
movs r0, 0x1
ands r0, r1
cmp r0, 0
beq _08055D48
ldrh r0, [r4, 0x2]
cmp r0, 0xE5
bne _08055D36
ldr r0, [sp, 0x10]
ldr r1, [sp, 0x14]
str r0, [sp, 0x18]
str r1, [sp, 0x1C]
adds r0, r5, 0
bl sub_8057144
lsls r0, 16
ldr r2, _08055DC8
ldr r1, [sp, 0x18]
ands r1, r2
orrs r1, r0
str r1, [sp, 0x18]
add r4, sp, 0x18
ldr r0, _08055DCC
adds r1, r4, 0
movs r2, 0
bl sub_80928C0
ldr r0, _08055DD0
ldr r1, [r0]
adds r0, r5, 0
bl TryDisplayDungeonLoggableMessage
_08055D36:
ldr r1, [sp, 0x28]
str r1, [sp]
str r4, [sp, 0x4]
adds r0, r5, 0
movs r1, 0
ldr r2, [sp, 0x24]
ldr r3, [sp, 0x54]
bl sub_8055FA0
_08055D48:
movs r0, 0x1
bl sub_804178C
_08055D4E:
adds r6, 0x1
cmp r6, 0x3
ble _08055CDC
_08055D54:
adds r0, r5, 0
bl EntityExists
lsls r0, 24
cmp r0, 0
beq _08055DB2
adds r0, r5, 0
bl sub_8071DA4
adds r0, r5, 0
bl EntityExists
lsls r0, 24
cmp r0, 0
beq _08055DB2
ldr r1, _08055DD4
ldrb r0, [r1]
cmp r0, 0
beq _08055DB2
movs r0, 0
strb r0, [r1]
adds r0, r5, 0
bl EntityExists
lsls r0, 24
cmp r0, 0
beq _08055DB2
ldr r4, [r5, 0x70]
ldr r1, _08055DD8
adds r0, r5, 0
movs r2, 0x1
bl CalculateStatusTurns
adds r3, r0, 0
movs r0, 0
str r0, [sp]
adds r0, r5, 0
adds r1, r5, 0
movs r2, 0x1
bl PausedStatusTarget
adds r4, 0xFB
ldrb r0, [r4]
cmp r0, 0
bne _08055DB2
movs r0, 0x1
strb r0, [r4]
_08055DB2:
movs r0, 0x1
_08055DB4:
add sp, 0x34
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r1}
bx r1
.align 2, 0
_08055DC4: .4byte gUnknown_80FC6A4
_08055DC8: .4byte 0x0000ffff
_08055DCC: .4byte gFormatItems
_08055DD0: .4byte gUnknown_80FD2DC
_08055DD4: .4byte gUnknown_202F222
_08055DD8: .4byte gUnknown_80F4E70
thumb_func_end sub_8055A00
thumb_func_start sub_8055DDC
sub_8055DDC:
push {r4-r7,lr}
adds r4, r0, 0
bl EntityExists
lsls r0, 24
cmp r0, 0
bne _08055DEC
b _08055F62
_08055DEC:
ldr r6, [r4, 0x70]
movs r7, 0xBC
lsls r7, 1
adds r5, r6, r7
ldrh r1, [r5]
movs r0, 0x1
ands r0, r1
cmp r0, 0
beq _08055E10
ldr r0, _08055F68
ldr r1, [r0]
adds r0, r4, 0
bl TryDisplayDungeonLoggableMessage
adds r0, r4, 0
adds r1, r4, 0
bl ImmobilizedStatusTarget
_08055E10:
ldrh r1, [r5]
movs r0, 0x2
ands r0, r1
cmp r0, 0
beq _08055E2C
ldr r0, _08055F6C
ldr r1, [r0]
adds r0, r4, 0
bl TryDisplayDungeonLoggableMessage
adds r0, r4, 0
adds r1, r4, 0
bl ImmobilizedStatusTarget
_08055E2C:
ldrh r1, [r5]
movs r0, 0x4
ands r0, r1
cmp r0, 0
beq _08055E48
ldr r0, _08055F70
ldr r1, [r0]
adds r0, r4, 0
bl TryDisplayDungeonLoggableMessage
adds r0, r4, 0
adds r1, r4, 0
bl ImmobilizedStatusTarget
_08055E48:
ldrh r1, [r5]
movs r0, 0x8
ands r0, r1
cmp r0, 0
beq _08055E66
ldr r0, _08055F74
ldr r1, [r0]
adds r0, r4, 0
bl TryDisplayDungeonLoggableMessage
adds r0, r4, 0
adds r1, r4, 0
movs r2, 0x1
bl ParalyzeStatusTarget
_08055E66:
ldrh r1, [r5]
movs r0, 0x10
ands r0, r1
cmp r0, 0
beq _08055E84
ldr r0, _08055F78
ldr r1, [r0]
adds r0, r4, 0
bl TryDisplayDungeonLoggableMessage
adds r0, r4, 0
adds r1, r4, 0
movs r2, 0x1
bl ParalyzeStatusTarget
_08055E84:
ldrh r1, [r5]
movs r0, 0x20
ands r0, r1
cmp r0, 0
beq _08055EA2
ldr r0, _08055F7C
ldr r1, [r0]
adds r0, r4, 0
bl TryDisplayDungeonLoggableMessage
adds r0, r4, 0
adds r1, r4, 0
movs r2, 0x1
bl PoisonedStatusTarget
_08055EA2:
ldrh r1, [r5]
movs r0, 0x40
ands r0, r1
cmp r0, 0
beq _08055EC0
ldr r0, _08055F80
ldr r1, [r0]
adds r0, r4, 0
bl TryDisplayDungeonLoggableMessage
adds r0, r4, 0
adds r1, r4, 0
movs r2, 0x1
bl PoisonedStatusTarget
_08055EC0:
ldrh r1, [r5]
movs r0, 0x80
ands r0, r1
cmp r0, 0
beq _08055EEA
ldr r0, _08055F84
ldr r1, [r0]
adds r0, r4, 0
bl TryDisplayDungeonLoggableMessage
ldr r1, _08055F88
adds r0, r4, 0
movs r2, 0x1
bl CalculateStatusTurns
adds r2, r0, 0
adds r0, r4, 0
adds r1, r4, 0
movs r3, 0x1
bl sub_8075C58
_08055EEA:
ldrh r1, [r5]
movs r0, 0x80
lsls r0, 1
ands r0, r1
cmp r0, 0
beq _08055F0C
ldr r0, _08055F8C
ldr r1, [r0]
adds r0, r4, 0
bl TryDisplayDungeonLoggableMessage
adds r0, r4, 0
adds r1, r4, 0
movs r2, 0x1
movs r3, 0x1
bl BurnedStatusTarget
_08055F0C:
ldrh r1, [r5]
movs r0, 0x80
lsls r0, 2
ands r0, r1
cmp r0, 0
beq _08055F2C
ldr r0, _08055F90
ldr r1, [r0]
adds r0, r4, 0
bl TryDisplayDungeonLoggableMessage
adds r0, r4, 0
adds r1, r4, 0
movs r2, 0x1
bl InfatuateStatusTarget
_08055F2C:
adds r5, r6, r7
ldrh r1, [r5]
movs r0, 0x80
lsls r0, 3
ands r0, r1
cmp r0, 0
beq _08055F5E
ldr r0, _08055F94
adds r1, r4, 0
movs r2, 0
bl SetMessageArgument
ldr r0, _08055F98
ldr r1, [r0]
adds r0, r4, 0
bl TryDisplayDungeonLoggableMessage
adds r0, r4, 0
bl sub_80428A0
ldr r0, _08055F9C
ldrh r1, [r0]
adds r0, r6, 0
adds r0, 0xFA
strb r1, [r0]
_08055F5E:
movs r0, 0
strh r0, [r5]
_08055F62:
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_08055F68: .4byte gUnknown_80FEEA4
_08055F6C: .4byte gUnknown_80FEEC8
_08055F70: .4byte gUnknown_80FEEEC
_08055F74: .4byte gUnknown_80FEF0C
_08055F78: .4byte gUnknown_80FEF30
_08055F7C: .4byte gUnknown_80FEF4C
_08055F80: .4byte gUnknown_80FEF50
_08055F84: .4byte gUnknown_80FEF54
_08055F88: .4byte gUnknown_80F4E74
_08055F8C: .4byte gUnknown_80FEF74
_08055F90: .4byte gUnknown_80FEF98
_08055F94: .4byte gAvailablePokemonNames
_08055F98: .4byte gUnknown_80FEFD0
_08055F9C: .4byte gUnknown_80F5004
thumb_func_end sub_8055DDC
thumb_func_start sub_8055FA0
sub_8055FA0:
push {r4-r7,lr}

View File

@ -3,6 +3,6 @@
#include "structs/dungeon_entity.h"
s32 CalculateStatusTurns(Entity *target, s16 *turnRange, bool8 factorCurerSkills);
s32 CalculateStatusTurns(Entity *target, const s16 *turnRange, bool8 factorCurerSkills);
#endif // GUARD_808417C_H

View File

@ -318,7 +318,7 @@ typedef struct EntityInfo
/* 0x16C */ Position targetPos;
/* 0x170 */ Position pixelPos;
u32 unk174;
u16 unk178;
u16 abilityEffectFlags; // See enum AbilityEffectFlags
/* 0x17A */ u16 mimicMoveIDs[MAX_MON_MOVES]; // All moves that Mimic has copied (not sure on size...)
// Previous value of targetPosition for movement, 1 and 2 moves ago.
/* 0x184 */ Unk_Entity_x184 unk184[4];
@ -381,6 +381,21 @@ enum MovementFlag
MOVEMENT_FLAG_SWAPPING_PLACES_PETRIFIED_ALLY = 1 << 15 // Set if the Pokémon is petrified and the leader cures them by swapping places.
};
enum AbilityEffectFlags
{
ABILITY_FLAG_ARENA_TRAP = 1 << 0,
ABILITY_FLAG_SHADOW_TAG = 1 << 1,
ABILITY_FLAG_MAGNET_PULL = 1 << 2,
ABILITY_FLAG_STATIC = 1 << 3,
ABILITY_FLAG_EFFECT_SPORE_PRLZ = 1 << 4,
ABILITY_FLAG_POISON_POINT = 1 << 5,
ABILITY_FLAG_EFFECT_SPORE_PSN = 1 << 6,
ABILITY_FLAG_EFFECT_SPORE_SLP = 1 << 7,
ABILITY_FLAG_FLAME_BODY = 1 << 8,
ABILITY_FLAG_CUTE_CHARM = 1 << 9,
ABILITY_FLAG_STENCH = 1 << 10,
};
enum ShopkeeperMode
{
SHOPKEEPER_MODE_NORMAL,

View File

@ -409,30 +409,30 @@ void HandleDealingDamage(Entity *attacker, Entity *target, struct DamageStruct *
&& !HasAbility(attacker, ABILITY_LEVITATE)
&& DungeonRandInt(100) < gUnknown_80F4E10)
{
attackerInfo->unk178 |= 1;
attackerInfo->abilityEffectFlags |= ABILITY_FLAG_ARENA_TRAP;
}
if (HasAbility(target, ABILITY_SHADOW_TAG)
&& DungeonRandInt(100) < gUnknown_80F4E12)
{
attackerInfo->unk178 |= 2;
attackerInfo->abilityEffectFlags |= ABILITY_FLAG_SHADOW_TAG;
}
if (HasAbility(target, ABILITY_MAGNET_PULL)
&& MonsterIsType(attacker, TYPE_STEEL)
&& DungeonRandInt(100) < gUnknown_80F4E14)
{
attackerInfo->unk178 |= 4;
attackerInfo->abilityEffectFlags |= ABILITY_FLAG_MAGNET_PULL;
}
if (HasAbility(target, ABILITY_STATIC)
&& isPhysical
&& DungeonRandInt(100) < gUnknown_80F4E16)
{
attackerInfo->unk178 |= 8;
attackerInfo->abilityEffectFlags |= ABILITY_FLAG_STATIC;
}
if (HasAbility(target, ABILITY_POISON_POINT)
&& DungeonRandInt(100) < gUnknown_80F4E18)
{
attackerInfo->unk178 |= 0x20;
attackerInfo->abilityEffectFlags |= ABILITY_FLAG_POISON_POINT;
}
if (HasAbility(target, ABILITY_EFFECT_SPORE)
&& isPhysical
@ -440,27 +440,27 @@ void HandleDealingDamage(Entity *attacker, Entity *target, struct DamageStruct *
{
s32 rnd = DungeonRandInt(3);
if (rnd < 1)
attackerInfo->unk178 |= 0x40;
attackerInfo->abilityEffectFlags |= ABILITY_FLAG_EFFECT_SPORE_PSN;
else if (rnd < 2)
attackerInfo->unk178 |= 0x10;
attackerInfo->abilityEffectFlags |= ABILITY_FLAG_EFFECT_SPORE_PRLZ;
else
attackerInfo->unk178 |= 0x80;
attackerInfo->abilityEffectFlags |= ABILITY_FLAG_EFFECT_SPORE_SLP;
}
if (HasAbility(target, ABILITY_FLAME_BODY)
&& DungeonRandInt(100) < gUnknown_80F4E1C)
{
attackerInfo->unk178 |= 0x100;
attackerInfo->abilityEffectFlags |= ABILITY_FLAG_FLAME_BODY;
}
if (HasAbility(target, ABILITY_CUTE_CHARM)
&& isPhysical
&& DungeonRandInt(100) < gUnknown_80F4E1E)
{
attackerInfo->unk178 |= 0x200;
attackerInfo->abilityEffectFlags |= ABILITY_FLAG_CUTE_CHARM;
}
if (HasAbility(target, ABILITY_STENCH)
&& DungeonRandInt(100) < gUnknown_80F4E20)
{
attackerInfo->unk178 |= 0x400;
attackerInfo->abilityEffectFlags |= ABILITY_FLAG_STENCH;
}
}
if (!EntityExists(attacker) || !EntityExists(target))

View File

@ -1081,9 +1081,16 @@ static void CreateMessageLogArrow(bool8 upArrow, s32 y)
#include "dungeon_ai_targeting.h"
#include "structs/str_damage.h"
#include "constants/ability.h"
#include "constants/status.h"
#include "type_chart.h"
#include "position_util.h"
#include "code_806CD90.h"
#include "move_util.h"
#include "code_808417C.h"
#include "dungeon_capabilities.h"
#include "move_effects_target.h"
#include "status.h"
#include "charge_move.h"
NAKED void sub_8053704(void)
{
@ -4394,7 +4401,7 @@ NAKED void sub_8053704(void)
" cmp r1, 0x89\n"
" beq _08055568\n"
" adds r0, r7, 0\n"
" bl sub_8055DDC\n"
" bl TriggerAbilityEffect\n"
" adds r0, r7, 0\n"
" adds r1, r5, 0\n"
" mov r2, r8\n"
@ -4648,3 +4655,264 @@ void sub_80559DC(Entity *entity1, Entity *entity2)
entInfo->action.direction = direction & DIRECTION_MASK;
sub_806CE68(entity1, direction);
}
extern const u8 *const gUnknown_80FC714;
extern const u8 *const gUnknown_80FC718;
extern const u8 *const gUnknown_80FC6A8;
extern const u8 *const gUnknown_80FD2D0;
extern const u8 *const gUnknown_80FD2DC;
extern const u8 *const gUnknown_80F93C8;
extern const u8 *const gUnknown_80FC690;
extern const u8 *const gUnknown_80FC6A4;
extern const s16 gUnknown_80F4E70[];
extern const s16 gUnknown_80F4E74[];
extern u8 gFormatItems[];
extern u8 gUnknown_202F221;
extern u8 gUnknown_202F222;
extern s32 gUnknown_202F208;
extern bool8 sub_8055FA0(struct Entity *, u32, u32, u32, u32, struct Move *);
extern bool8 sub_8044B28(void);
extern void sub_804178C(u32);
extern void sub_8071DA4(Entity *);
extern void sub_80428A0(Entity *r0);
bool32 sub_8055A00(Entity *entity, s32 firstMoveId, s32 var_34, bool32 isOrb, s32 arg_0)
{
s32 i, j;
s32 moveId;
EntityInfo *entInfo = GetEntInfo(entity);
bool32 var_2C;
moveId = firstMoveId;
if (firstMoveId >= MAX_MON_MOVES)
return FALSE;
entInfo->abilityEffectFlags = 0;
entInfo->unk159 = 0;
if (entInfo->volatileStatus.volatileStatus == STATUS_CRINGE) {
SetMessageArgument(gAvailablePokemonNames, entity, 0);
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FC714); // is cringing!
return FALSE;
}
else if (entInfo->volatileStatus.volatileStatus == STATUS_INFATUATED) {
SetMessageArgument(gAvailablePokemonNames, entity, 0);
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FC718); // is infatuated!
return FALSE;
}
else if (entInfo->nonVolatile.nonVolatileStatus == STATUS_PARALYSIS) {
SetMessageArgument(gAvailablePokemonNames, entity, 0);
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FC6A8); // is paralyzed!
return FALSE;
}
gUnknown_202F222 = 0;
gUnknown_202F208 = 0;
gUnknown_202F221 = 0;
for (i = 0; i < MAX_MON_MOVES; i++) {
entInfo->mimicMoveIDs[i] = 0;
}
for (i = 0, j = 0; i < MAX_MON_MOVES; i++) {
j++;
if (++moveId >= MAX_MON_MOVES)
break;
if (!(entInfo->moves.moves[moveId].moveFlags & MOVE_FLAG_SUBSEQUENT_IN_LINK_CHAIN))
break;
}
var_2C = (j > 1);
moveId = firstMoveId;
while (1) {
Move *currMove = &entInfo->moves.moves[moveId];
if (!EntityExists(entity) || sub_8044B28())
break;
if (currMove->id == MOVE_SNORE || currMove->id == MOVE_SLEEP_TALK) {
if (!IsSleeping(entity)) {
if (CannotAttack(entity, TRUE))
break;
}
}
else {
if (CannotAttack(entity, FALSE))
break;
}
if (gUnknown_202F221 != 0)
break;
if (MoveFlagExists(currMove)) {
bool32 moveUsable = TRUE;
bool32 var_28 = FALSE;
bool32 statusMoveMatch = MoveMatchesChargingStatus(entity, currMove);
if (currMove->PP != 0) {
if (!statusMoveMatch) {
var_28 = TRUE;
}
}
else {
if (!statusMoveMatch) {
sub_80928C0(gFormatItems, currMove, NULL);
TryDisplayDungeonLoggableMessage(entity, gUnknown_80F93C8); // The move can't be used!
moveUsable = FALSE;
}
}
if (moveUsable) {
bool32 r0;
s32 unkBefore = gUnknown_202F208;
entInfo->unk159 = statusMoveMatch;
if (currMove->id == MOVE_ASSIST) {
Move assistMove = *currMove;
assistMove.id = sub_8057144(entity);
sub_80928C0(gFormatItems, &assistMove, NULL);
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FD2DC); // Assist:
r0 = sub_8055FA0(entity, var_34, isOrb, arg_0, var_2C, &assistMove);
}
else {
r0 = sub_8055FA0(entity, var_34, isOrb, arg_0, var_2C, currMove);
}
if (var_28 && r0) {
if (currMove->moveFlags2 & MOVE_FLAG2_UNK4) {
currMove->moveFlags2 &= ~(MOVE_FLAG2_UNK4);
}
else {
currMove->moveFlags2 |= MOVE_FLAG_TEMPORARY;
}
}
if (unkBefore == gUnknown_202F208) {
if (!isOrb) {
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FC690); // The currMove failed!
}
else {
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FC6A4); // The Orb failed!
}
}
}
}
sub_804178C(1);
if (!EntityExists(entity) || sub_8044B28())
break;
if (++moveId >= MAX_MON_MOVES)
break;
if (!MoveFlagLinkChain(&entInfo->moves.moves[moveId]))
break;
}
if (EntityExists(entity)) {
for (i = 0; i < MAX_MON_MOVES; i++) {
if (entInfo->mimicMoveIDs[i] != 0) {
Move mimicMove, assistMove;
Move *movePtr;
movePtr = &mimicMove;
sub_8092AA8(&mimicMove, entInfo->mimicMoveIDs[i]);
if (MoveFlagExists(&mimicMove)) {
if (mimicMove.id == MOVE_ASSIST) {
assistMove = mimicMove;
assistMove.id = sub_8057144(entity);
movePtr = &assistMove;
sub_80928C0(gFormatItems, &assistMove, NULL);
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FD2DC); // Assist:
}
sub_8055FA0(entity, 0, isOrb, arg_0, var_2C, movePtr);
}
sub_804178C(1);
}
}
}
if (EntityExists(entity)) {
sub_8071DA4(entity);
if (EntityExists(entity) && gUnknown_202F222 != 0) {
gUnknown_202F222 = 0;
if (EntityExists(entity)) {
EntityInfo *entInfo = GetEntInfo(entity);
s32 statusTurns = CalculateStatusTurns(entity, gUnknown_80F4E70, TRUE);
PausedStatusTarget(entity, entity, 1, statusTurns, FALSE);
SetExpMultplier(entInfo);
}
}
}
return TRUE;
}
extern const u16 gUnknown_80F5004;
extern const u8 *const gUnknown_80FEEA4;
extern const u8 *const gUnknown_80FEEC8;
extern const u8 *const gUnknown_80FEEEC;
extern const u8 *const gUnknown_80FEF0C;
extern const u8 *const gUnknown_80FEF30;
extern const u8 *const gUnknown_80FEF4C;
extern const u8 *const gUnknown_80FEF50;
extern const u8 *const gUnknown_80FEF54;
extern const u8 *const gUnknown_80FEF74;
extern const u8 *const gUnknown_80FEF98;
extern const u8 *const gUnknown_80FEFD0;
void TriggerAbilityEffect(Entity *entity)
{
if (EntityExists(entity)) {
EntityInfo *entInfo = GetEntInfo(entity);
if (entInfo->abilityEffectFlags & ABILITY_FLAG_ARENA_TRAP) {
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEEA4); // Arena Trap prevents movement!
ImmobilizedStatusTarget(entity, entity);
}
if (entInfo->abilityEffectFlags & ABILITY_FLAG_SHADOW_TAG) {
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEEC8); // Shadow Tag prevents movement!
ImmobilizedStatusTarget(entity, entity);
}
if (entInfo->abilityEffectFlags & ABILITY_FLAG_MAGNET_PULL) {
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEEEC); // Magnet Pull prevents movement!
ImmobilizedStatusTarget(entity, entity);
}
if (entInfo->abilityEffectFlags & ABILITY_FLAG_STATIC) {
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEF0C); // Static caused paralysis!
ParalyzeStatusTarget(entity, entity, TRUE);
}
if (entInfo->abilityEffectFlags & ABILITY_FLAG_EFFECT_SPORE_PRLZ) {
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEF30); // Effect Spore scattered spores
ParalyzeStatusTarget(entity, entity, TRUE);
}
if (entInfo->abilityEffectFlags & ABILITY_FLAG_POISON_POINT) {
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEF4C); // Poison Point struck!
PoisonedStatusTarget(entity, entity, TRUE);
}
if (entInfo->abilityEffectFlags & ABILITY_FLAG_EFFECT_SPORE_PSN) {
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEF50); // Effect Spore scattered spores!
PoisonedStatusTarget(entity, entity, TRUE);
}
if (entInfo->abilityEffectFlags & ABILITY_FLAG_EFFECT_SPORE_SLP) {
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEF54); // Effect Spore scattered spores!
sub_8075C58(entity, entity, CalculateStatusTurns(entity, gUnknown_80F4E74, TRUE), TRUE);
}
if (entInfo->abilityEffectFlags & ABILITY_FLAG_FLAME_BODY) {
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEF74); // Flame Body caused a burn!
BurnedStatusTarget(entity, entity, TRUE, TRUE);
}
if (entInfo->abilityEffectFlags & ABILITY_FLAG_CUTE_CHARM) {
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEF98); // Cute Charm caused infatuation
InfatuateStatusTarget(entity, entity, TRUE);
}
if (entInfo->abilityEffectFlags & ABILITY_FLAG_STENCH) {
SetMessageArgument(gAvailablePokemonNames, entity, 0);
TryDisplayDungeonLoggableMessage(entity, gUnknown_80FEFD0); // A horrid stench billowed out
sub_80428A0(entity);
entInfo->terrifiedTurns = gUnknown_80F5004;
}
entInfo->abilityEffectFlags = 0;
}
}

View File

@ -469,7 +469,7 @@ void SaveEntity(unkStruct_8094924 *param_1, Entity *param_2)
sub_8083060(param_1,info->turnsSinceWarpScarfActivation);
SavePosition(param_1,&(info->targetPos));
sub_80830A0(param_1,info->unk174);
sub_8083030(param_1,info->unk178);
sub_8083030(param_1,info->abilityEffectFlags);
sub_8083048(param_1,info->unk1F8);
sub_8083048(param_1,info->mobileTurnTimer);
sub_8083078(param_1,info->expGainedInTurn);