Decomped MonsterHasNegativeStatus

This commit is contained in:
AnonymousRandomPerson 2025-05-08 23:58:34 -04:00
parent b611d91008
commit ce66deac4c
9 changed files with 133 additions and 153 deletions

View File

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

View File

@ -0,0 +1 @@
#pragma once

View File

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

View File

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

View File

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

View File

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