mirror of
https://github.com/pret/pmd-sky.git
synced 2026-04-18 23:57:20 -05:00
Decomped MonsterHasNegativeStatus
This commit is contained in:
parent
b611d91008
commit
ce66deac4c
|
|
@ -7,11 +7,11 @@
|
|||
.public GetNameRaw
|
||||
.public GetNameWithGender
|
||||
.public IsBlinded
|
||||
.public StringFromId
|
||||
.public ov29_0234B0B4
|
||||
.public ov29_023527C0
|
||||
.public ov29_023527D0
|
||||
.public strcpy
|
||||
.public StringFromId
|
||||
.public sub_02024FB8
|
||||
.public sub_02056084
|
||||
.public sub_02058534
|
||||
|
|
|
|||
1
asm/include/overlay_29_023007A8.inc
Normal file
1
asm/include/overlay_29_023007A8.inc
Normal file
|
|
@ -0,0 +1 @@
|
|||
#pragma once
|
||||
|
|
@ -539,154 +539,3 @@ MonsterHasMiracleEyeStatus: ; 0x02300618
|
|||
and r0, r0, #0xff
|
||||
bx lr
|
||||
arm_func_end MonsterHasMiracleEyeStatus
|
||||
|
||||
arm_func_start MonsterHasNegativeStatus
|
||||
MonsterHasNegativeStatus: ; 0x02300634
|
||||
stmdb sp!, {r4, r5, r6, lr}
|
||||
mov r6, r0
|
||||
ldr r4, [r6, #0xb4]
|
||||
mov r5, r1
|
||||
bl IsMonsterDrowsy
|
||||
cmp r0, #0
|
||||
movne r0, #1
|
||||
ldmneia sp!, {r4, r5, r6, pc}
|
||||
mov r0, r6
|
||||
bl MonsterHasNonvolatileNonsleepStatus
|
||||
cmp r0, #0
|
||||
movne r0, #1
|
||||
ldmneia sp!, {r4, r5, r6, pc}
|
||||
mov r0, r6
|
||||
bl MonsterHasImmobilizingStatus
|
||||
cmp r0, #0
|
||||
movne r0, #1
|
||||
ldmneia sp!, {r4, r5, r6, pc}
|
||||
mov r0, r6
|
||||
bl MonsterHasAttackInterferingStatus
|
||||
cmp r0, #0
|
||||
movne r0, #1
|
||||
ldmneia sp!, {r4, r5, r6, pc}
|
||||
mov r0, r6
|
||||
bl MonsterHasSkillInterferingStatus
|
||||
cmp r0, #0
|
||||
movne r0, #1
|
||||
ldmneia sp!, {r4, r5, r6, pc}
|
||||
mov r0, r6
|
||||
bl MonsterHasLeechSeedStatus
|
||||
cmp r0, #0
|
||||
movne r0, #1
|
||||
ldmneia sp!, {r4, r5, r6, pc}
|
||||
mov r0, r6
|
||||
bl MonsterHasWhifferStatus
|
||||
cmp r0, #0
|
||||
movne r0, #1
|
||||
ldmneia sp!, {r4, r5, r6, pc}
|
||||
mov r0, r6
|
||||
mov r1, r5
|
||||
bl IsMonsterVisuallyImpaired
|
||||
cmp r0, #0
|
||||
movne r0, #1
|
||||
ldmneia sp!, {r4, r5, r6, pc}
|
||||
mov r0, r6
|
||||
bl IsMonsterMuzzled
|
||||
cmp r0, #0
|
||||
movne r0, #1
|
||||
ldmneia sp!, {r4, r5, r6, pc}
|
||||
mov r0, r6
|
||||
bl MonsterHasMiracleEyeStatus
|
||||
cmp r0, #0
|
||||
movne r0, #1
|
||||
ldmneia sp!, {r4, r5, r6, pc}
|
||||
ldrb r0, [r4, #0xfe]
|
||||
cmp r0, #0
|
||||
movne r0, #1
|
||||
ldmneia sp!, {r4, r5, r6, pc}
|
||||
#ifdef JAPAN
|
||||
ldrb r0, [r4, #0x105]
|
||||
#else
|
||||
ldrb r0, [r4, #0x106]
|
||||
#endif
|
||||
cmp r0, #0
|
||||
movne r0, #1
|
||||
ldmneia sp!, {r4, r5, r6, pc}
|
||||
mov ip, #0
|
||||
#ifdef JAPAN
|
||||
add r3, r4, #0x120
|
||||
#else
|
||||
add r3, r4, #0x124
|
||||
#endif
|
||||
mov r1, ip
|
||||
mov r2, #1
|
||||
b _02300770
|
||||
_02300740:
|
||||
ldrb r0, [r3, ip, lsl #3]
|
||||
add lr, r3, ip, lsl #3
|
||||
tst r0, #1
|
||||
movne r0, r2
|
||||
moveq r0, r1
|
||||
tst r0, #0xff
|
||||
beq _0230076C
|
||||
ldrh r0, [lr, #2]
|
||||
tst r0, #1
|
||||
movne r0, #1
|
||||
ldmneia sp!, {r4, r5, r6, pc}
|
||||
_0230076C:
|
||||
add ip, ip, #1
|
||||
_02300770:
|
||||
cmp ip, #4
|
||||
blt _02300740
|
||||
mov r1, #0
|
||||
b _02300798
|
||||
_02300780:
|
||||
add r0, r4, r1
|
||||
#ifdef JAPAN
|
||||
ldrb r0, [r0, #0x115]
|
||||
#else
|
||||
ldrb r0, [r0, #0x119]
|
||||
#endif
|
||||
cmp r0, #0
|
||||
movne r0, #1
|
||||
ldmneia sp!, {r4, r5, r6, pc}
|
||||
add r1, r1, #1
|
||||
_02300798:
|
||||
cmp r1, #5
|
||||
blt _02300780
|
||||
mov r0, #0
|
||||
ldmia sp!, {r4, r5, r6, pc}
|
||||
arm_func_end MonsterHasNegativeStatus
|
||||
|
||||
arm_func_start IsMonsterSleeping
|
||||
IsMonsterSleeping: ; 0x023007A8
|
||||
ldr r0, [r0, #0xb4]
|
||||
ldrb r0, [r0, #0xbd]
|
||||
cmp r0, #1
|
||||
moveq r0, #1
|
||||
bxeq lr
|
||||
cmp r0, #5
|
||||
moveq r0, #1
|
||||
bxeq lr
|
||||
cmp r0, #3
|
||||
moveq r0, #1
|
||||
movne r0, #0
|
||||
and r0, r0, #0xff
|
||||
bx lr
|
||||
arm_func_end IsMonsterSleeping
|
||||
|
||||
arm_func_start ov29_023007DC
|
||||
ov29_023007DC: ; 0x023007DC
|
||||
ldr r3, [r0, #0xb4]
|
||||
ldr r0, _02300814 ; =0x000003E7
|
||||
ldrsh r2, [r3, #0x12]
|
||||
ldrsh r1, [r3, #0x16]
|
||||
add r2, r2, r1
|
||||
cmp r2, r0
|
||||
movgt r2, r0
|
||||
mov r0, r2, asr #1
|
||||
ldrsh r1, [r3, #0x10]
|
||||
add r0, r2, r0, lsr #30
|
||||
cmp r1, r0, asr #2
|
||||
movle r0, #1
|
||||
movgt r0, #0
|
||||
bx lr
|
||||
.align 2, 0
|
||||
_02300814: .word 0x000003E7
|
||||
arm_func_end ov29_023007DC
|
||||
|
|
|
|||
41
asm/overlay_29_023007A8.s
Normal file
41
asm/overlay_29_023007A8.s
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
.include "asm/macros.inc"
|
||||
.include "overlay_29_023007A8.inc"
|
||||
|
||||
.text
|
||||
|
||||
arm_func_start IsMonsterSleeping
|
||||
IsMonsterSleeping: ; 0x023007A8
|
||||
ldr r0, [r0, #0xb4]
|
||||
ldrb r0, [r0, #0xbd]
|
||||
cmp r0, #1
|
||||
moveq r0, #1
|
||||
bxeq lr
|
||||
cmp r0, #5
|
||||
moveq r0, #1
|
||||
bxeq lr
|
||||
cmp r0, #3
|
||||
moveq r0, #1
|
||||
movne r0, #0
|
||||
and r0, r0, #0xff
|
||||
bx lr
|
||||
arm_func_end IsMonsterSleeping
|
||||
|
||||
arm_func_start ov29_023007DC
|
||||
ov29_023007DC: ; 0x023007DC
|
||||
ldr r3, [r0, #0xb4]
|
||||
ldr r0, _02300814 ; =0x000003E7
|
||||
ldrsh r2, [r3, #0x12]
|
||||
ldrsh r1, [r3, #0x16]
|
||||
add r2, r2, r1
|
||||
cmp r2, r0
|
||||
movgt r2, r0
|
||||
mov r0, r2, asr #1
|
||||
ldrsh r1, [r3, #0x10]
|
||||
add r0, r2, r0, lsr #30
|
||||
cmp r1, r0, asr #2
|
||||
movle r0, #1
|
||||
movgt r0, #0
|
||||
bx lr
|
||||
.align 2, 0
|
||||
_02300814: .word 0x000003E7
|
||||
arm_func_end ov29_023007DC
|
||||
11
include/dungeon_logic.h
Normal file
11
include/dungeon_logic.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
#ifndef PMDSKY_DUNGEON_LOGIC_H
|
||||
#define PMDSKY_DUNGEON_LOGIC_H
|
||||
|
||||
#include "dungeon_mode.h"
|
||||
|
||||
// Checks if a monster has any "negative" status conditions. This includes a wide variety of non-self-inflicted statuses that could traditionally be viewed as actual "status conditions", as well as speed being lowered and moves being sealed.
|
||||
// monster: entity pointer
|
||||
// check_held_item: flag for whether to check for the held item (see IsMonsterVisuallyImpaired)
|
||||
bool8 MonsterHasNegativeStatus(struct entity *monster, bool8 check_held_item);
|
||||
|
||||
#endif //PMDSKY_DUNGEON_LOGIC_H
|
||||
|
|
@ -11,6 +11,7 @@
|
|||
#define NUM_PICKED_IQ_SKILLS 3
|
||||
#define MAX_MON_MOVES 4
|
||||
#define MAX_SPEED_STAGE 4
|
||||
#define NUM_SPEED_COUNTERS 5
|
||||
|
||||
// Used in various contexts, like with entity positions in the dungeon
|
||||
struct position {
|
||||
|
|
|
|||
2
main.lsf
2
main.lsf
|
|
@ -296,6 +296,8 @@ Overlay OVY_29
|
|||
Object asm/overlay_29_022FF8C8.o
|
||||
Object src/overlay_29_023000E4.o
|
||||
Object asm/overlay_29_02300108.o
|
||||
Object src/dungeon_logic.o
|
||||
Object asm/overlay_29_023007A8.o
|
||||
Object src/dungeon_capabilities.o
|
||||
Object asm/overlay_29_023008DC.o
|
||||
Object src/dungeon_capabilities_1.o
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
#include "dungeon_ai_item_weight.h"
|
||||
#include "dungeon_ai_targeting_1.h"
|
||||
#include "dungeon_logic.h"
|
||||
#include "dungeon_map_access.h"
|
||||
#include "dungeon_pokemon_attributes_1.h"
|
||||
#include "dungeon_statuses.h"
|
||||
|
|
@ -11,7 +12,6 @@
|
|||
#include "targeting.h"
|
||||
#include "util.h"
|
||||
|
||||
extern bool8 MonsterHasNegativeStatus(struct entity *monster, bool8 check_held_item);
|
||||
extern enum mobility_type GetMobilityType(s16 monster_id);
|
||||
|
||||
u32 GetAiUseItemProbability(struct entity *item_consumer, struct item *item, u32 flags)
|
||||
|
|
|
|||
75
src/dungeon_logic.c
Normal file
75
src/dungeon_logic.c
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
#include "dungeon_logic.h"
|
||||
#include "dungeon_util_static.h"
|
||||
|
||||
extern bool8 IsMonsterDrowsy(struct entity *monster);
|
||||
extern bool8 MonsterHasNonvolatileNonsleepStatus(struct entity *monster);
|
||||
extern bool8 MonsterHasImmobilizingStatus(struct entity *monster);
|
||||
extern bool8 MonsterHasAttackInterferingStatus(struct entity *monster);
|
||||
extern bool8 MonsterHasSkillInterferingStatus(struct entity *monster);
|
||||
extern bool8 MonsterHasLeechSeedStatus(struct entity *monster);
|
||||
extern bool8 MonsterHasWhifferStatus(struct entity *monster);
|
||||
extern bool8 IsMonsterVisuallyImpaired(struct entity *monster, bool8 check_held_item);
|
||||
extern bool8 IsMonsterMuzzled(struct entity *monster);
|
||||
extern bool8 MonsterHasMiracleEyeStatus(struct entity *monster);
|
||||
|
||||
bool8 MonsterHasNegativeStatus(struct entity *monster, bool8 check_held_item)
|
||||
{
|
||||
struct monster *pokemon_info = GetEntInfo(monster);
|
||||
|
||||
if (IsMonsterDrowsy(monster))
|
||||
return TRUE;
|
||||
|
||||
if (MonsterHasNonvolatileNonsleepStatus(monster))
|
||||
return TRUE;
|
||||
|
||||
if (MonsterHasImmobilizingStatus(monster))
|
||||
return TRUE;
|
||||
|
||||
if (MonsterHasAttackInterferingStatus(monster))
|
||||
return TRUE;
|
||||
|
||||
if (MonsterHasSkillInterferingStatus(monster))
|
||||
return TRUE;
|
||||
|
||||
if (MonsterHasLeechSeedStatus(monster))
|
||||
return TRUE;
|
||||
|
||||
if (MonsterHasWhifferStatus(monster))
|
||||
return TRUE;
|
||||
|
||||
if (IsMonsterVisuallyImpaired(monster, check_held_item))
|
||||
return TRUE;
|
||||
|
||||
if (IsMonsterMuzzled(monster))
|
||||
return TRUE;
|
||||
|
||||
if (MonsterHasMiracleEyeStatus(monster))
|
||||
return TRUE;
|
||||
|
||||
if (pokemon_info->exposed)
|
||||
return TRUE;
|
||||
|
||||
if (pokemon_info->perish_song_turns != 0)
|
||||
return TRUE;
|
||||
|
||||
for (s32 i = 0; i < MAX_MON_MOVES; i++)
|
||||
{
|
||||
bool8 move_exists;
|
||||
struct move *move = &pokemon_info->moves.moves[i];
|
||||
if (move->flags0 & MOVE_FLAG_EXISTS)
|
||||
move_exists = TRUE;
|
||||
else
|
||||
move_exists = FALSE;
|
||||
|
||||
if (move_exists && move->flags2 & MOVE_FLAG_SEALED)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
for (s32 i = 0; i < NUM_SPEED_COUNTERS; i++)
|
||||
{
|
||||
if (pokemon_info->speed_down_counters[i] != 0)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user