mirror of
https://github.com/pret/pmd-red.git
synced 2025-02-17 03:48:09 +00:00
sub_8055DDC
This commit is contained in:
parent
389da1c570
commit
ef2868a2bc
@ -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}
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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))
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user