mirror of
https://github.com/pret/pmd-sky.git
synced 2026-03-21 17:25:15 -05:00
Merge pull request #209 from AnonymousRandomPerson/main
Some checks failed
build / build (push) Has been cancelled
Some checks failed
build / build (push) Has been cancelled
Decomped UpdateIqSkills
This commit is contained in:
commit
152f7a3473
|
|
@ -1,10 +0,0 @@
|
||||||
#pragma once
|
|
||||||
.public CanLearnIqSkill
|
|
||||||
.public DisableIqSkill
|
|
||||||
.public EnableIqSkill
|
|
||||||
.public GetPerformanceFlagWithChecks
|
|
||||||
.public GetSpeciesIqSkill
|
|
||||||
.public IqSkillFlagTest
|
|
||||||
.public IsMonsterLoneOutlaw
|
|
||||||
.public MIN_IQ_EXCLUSIVE_MOVE_USER
|
|
||||||
.public MIN_IQ_ITEM_MASTER
|
|
||||||
2
asm/include/overlay_29_023021F0.inc
Normal file
2
asm/include/overlay_29_023021F0.inc
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
#pragma once
|
||||||
|
.public UpdateIqSkills
|
||||||
|
|
@ -1,176 +0,0 @@
|
||||||
.include "asm/macros.inc"
|
|
||||||
.include "overlay_29_02301FBC.inc"
|
|
||||||
|
|
||||||
.text
|
|
||||||
|
|
||||||
arm_func_start UpdateIqSkills
|
|
||||||
UpdateIqSkills: ; 0x02301FBC
|
|
||||||
stmdb sp!, {r4, r5, r6, lr}
|
|
||||||
mov r4, r0
|
|
||||||
ldrb r0, [r4, #6]
|
|
||||||
mov r6, #0
|
|
||||||
cmp r0, #0
|
|
||||||
str r6, [r4, #0x9c]
|
|
||||||
beq _02302118
|
|
||||||
str r6, [r4, #0xa0]
|
|
||||||
str r6, [r4, #0xa4]
|
|
||||||
b _0230202C
|
|
||||||
_02301FE4:
|
|
||||||
ldrsh r0, [r4, #2]
|
|
||||||
and r1, r6, #0xff
|
|
||||||
bl GetSpeciesIqSkill
|
|
||||||
mov r5, r0
|
|
||||||
cmp r5, #0xff
|
|
||||||
beq _02302034
|
|
||||||
ldrsh r0, [r4, #0xe]
|
|
||||||
mov r1, r5
|
|
||||||
bl CanLearnIqSkill
|
|
||||||
cmp r0, #0
|
|
||||||
beq _02302028
|
|
||||||
mov r1, r5
|
|
||||||
add r0, r4, #0x90
|
|
||||||
bl EnableIqSkill
|
|
||||||
mov r1, r5
|
|
||||||
add r0, r4, #0x9c
|
|
||||||
bl EnableIqSkill
|
|
||||||
_02302028:
|
|
||||||
add r6, r6, #1
|
|
||||||
_0230202C:
|
|
||||||
cmp r6, #0x19
|
|
||||||
blt _02301FE4
|
|
||||||
_02302034:
|
|
||||||
ldr r0, _023021E8 ; =MIN_IQ_EXCLUSIVE_MOVE_USER
|
|
||||||
ldrsh r1, [r4, #0xe]
|
|
||||||
ldrsh r0, [r0]
|
|
||||||
cmp r1, r0
|
|
||||||
bge _02302068
|
|
||||||
add r0, r4, #0x9c
|
|
||||||
mov r1, #0x17
|
|
||||||
bl IqSkillFlagTest
|
|
||||||
cmp r0, #0
|
|
||||||
beq _02302068
|
|
||||||
add r0, r4, #0x9c
|
|
||||||
mov r1, #0x17
|
|
||||||
bl DisableIqSkill
|
|
||||||
_02302068:
|
|
||||||
mov r0, r4
|
|
||||||
bl IsMonsterLoneOutlaw
|
|
||||||
cmp r0, #0
|
|
||||||
bne _0230208C
|
|
||||||
ldr r0, _023021EC ; =MIN_IQ_ITEM_MASTER
|
|
||||||
ldrsh r1, [r4, #0xe]
|
|
||||||
ldrsh r0, [r0]
|
|
||||||
cmp r1, r0
|
|
||||||
bge _023020AC
|
|
||||||
_0230208C:
|
|
||||||
add r0, r4, #0x9c
|
|
||||||
mov r1, #0x16
|
|
||||||
bl IqSkillFlagTest
|
|
||||||
cmp r0, #0
|
|
||||||
beq _023020AC
|
|
||||||
add r0, r4, #0x9c
|
|
||||||
mov r1, #0x16
|
|
||||||
bl DisableIqSkill
|
|
||||||
_023020AC:
|
|
||||||
add r0, r4, #0x9c
|
|
||||||
mov r1, #0x15
|
|
||||||
bl IqSkillFlagTest
|
|
||||||
cmp r0, #0
|
|
||||||
beq _023020CC
|
|
||||||
add r0, r4, #0x9c
|
|
||||||
mov r1, #0x15
|
|
||||||
bl DisableIqSkill
|
|
||||||
_023020CC:
|
|
||||||
add r0, r4, #0x9c
|
|
||||||
mov r1, #0x14
|
|
||||||
bl IqSkillFlagTest
|
|
||||||
cmp r0, #0
|
|
||||||
beq _023020EC
|
|
||||||
add r0, r4, #0x9c
|
|
||||||
mov r1, #0x14
|
|
||||||
bl DisableIqSkill
|
|
||||||
_023020EC:
|
|
||||||
add r0, r4, #0x9c
|
|
||||||
mov r1, #0xb
|
|
||||||
bl IqSkillFlagTest
|
|
||||||
cmp r0, #0
|
|
||||||
beq _0230210C
|
|
||||||
add r0, r4, #0x9c
|
|
||||||
mov r1, #0xb
|
|
||||||
bl DisableIqSkill
|
|
||||||
_0230210C:
|
|
||||||
mov r0, #2
|
|
||||||
strb r0, [r4, #0xa8]
|
|
||||||
ldmia sp!, {r4, r5, r6, pc}
|
|
||||||
_02302118:
|
|
||||||
str r6, [r4, #0xa0]
|
|
||||||
str r6, [r4, #0xa4]
|
|
||||||
b _02302174
|
|
||||||
_02302124:
|
|
||||||
ldrsh r0, [r4, #2]
|
|
||||||
and r1, r6, #0xff
|
|
||||||
bl GetSpeciesIqSkill
|
|
||||||
mov r5, r0
|
|
||||||
cmp r5, #0xff
|
|
||||||
beq _0230217C
|
|
||||||
ldrsh r0, [r4, #0xe]
|
|
||||||
mov r1, r5
|
|
||||||
bl CanLearnIqSkill
|
|
||||||
cmp r0, #0
|
|
||||||
beq _02302170
|
|
||||||
mov r1, r5
|
|
||||||
add r0, r4, #0x90
|
|
||||||
bl IqSkillFlagTest
|
|
||||||
cmp r0, #0
|
|
||||||
beq _02302170
|
|
||||||
mov r1, r5
|
|
||||||
add r0, r4, #0x9c
|
|
||||||
bl EnableIqSkill
|
|
||||||
_02302170:
|
|
||||||
add r6, r6, #1
|
|
||||||
_02302174:
|
|
||||||
cmp r6, #0x19
|
|
||||||
blt _02302124
|
|
||||||
_0230217C:
|
|
||||||
mov r0, #3
|
|
||||||
bl GetPerformanceFlagWithChecks
|
|
||||||
cmp r0, #0
|
|
||||||
beq _023021A4
|
|
||||||
add r0, r4, #0x90
|
|
||||||
mov r1, #0x18
|
|
||||||
bl EnableIqSkill
|
|
||||||
add r0, r4, #0x9c
|
|
||||||
mov r1, #0x18
|
|
||||||
bl EnableIqSkill
|
|
||||||
_023021A4:
|
|
||||||
add r0, r4, #0x90
|
|
||||||
mov r1, #0x38
|
|
||||||
bl IqSkillFlagTest
|
|
||||||
cmp r0, #0
|
|
||||||
beq _023021C4
|
|
||||||
add r0, r4, #0x9c
|
|
||||||
mov r1, #0x38
|
|
||||||
bl EnableIqSkill
|
|
||||||
_023021C4:
|
|
||||||
add r0, r4, #0x90
|
|
||||||
mov r1, #0x39
|
|
||||||
bl IqSkillFlagTest
|
|
||||||
cmp r0, #0
|
|
||||||
ldmeqia sp!, {r4, r5, r6, pc}
|
|
||||||
add r0, r4, #0x9c
|
|
||||||
mov r1, #0x39
|
|
||||||
bl EnableIqSkill
|
|
||||||
ldmia sp!, {r4, r5, r6, pc}
|
|
||||||
.align 2, 0
|
|
||||||
_023021E8: .word MIN_IQ_EXCLUSIVE_MOVE_USER
|
|
||||||
_023021EC: .word MIN_IQ_ITEM_MASTER
|
|
||||||
arm_func_end UpdateIqSkills
|
|
||||||
|
|
||||||
arm_func_start ov29_023021F0
|
|
||||||
ov29_023021F0: ; 0x023021F0
|
|
||||||
ldr ip, _023021FC ; =UpdateIqSkills
|
|
||||||
ldr r0, [r0, #0xb4]
|
|
||||||
bx ip
|
|
||||||
.align 2, 0
|
|
||||||
_023021FC: .word UpdateIqSkills
|
|
||||||
arm_func_end ov29_023021F0
|
|
||||||
13
asm/overlay_29_023021F0.s
Normal file
13
asm/overlay_29_023021F0.s
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
.include "asm/macros.inc"
|
||||||
|
.include "overlay_29_023021F0.inc"
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
|
arm_func_start ov29_023021F0
|
||||||
|
ov29_023021F0: ; 0x023021F0
|
||||||
|
ldr ip, _023021FC ; =UpdateIqSkills
|
||||||
|
ldr r0, [r0, #0xb4]
|
||||||
|
bx ip
|
||||||
|
.align 2, 0
|
||||||
|
_023021FC: .word UpdateIqSkills
|
||||||
|
arm_func_end ov29_023021F0
|
||||||
|
|
@ -12,5 +12,10 @@ bool8 IsTacticSet(struct entity *entity, enum tactic_id tactic_id);
|
||||||
bool8 HasDropeyeStatus(struct entity* entity);
|
bool8 HasDropeyeStatus(struct entity* entity);
|
||||||
// Checks if a monster has a certain IQ skill enabled.
|
// Checks if a monster has a certain IQ skill enabled.
|
||||||
bool8 IqSkillIsEnabled(struct entity *entity, enum iq_skill_id iq_skill);
|
bool8 IqSkillIsEnabled(struct entity *entity, enum iq_skill_id iq_skill);
|
||||||
|
// Updates the IQ skill flags of a monster.
|
||||||
|
// If the monster is a team member, copies monster::iq_skill_menu_flags to monster::iq_skill_flags. If the monster is an enemy, enables all the IQ skills it can learn (except a few that are only enabled in enemies that have a certain amount of IQ).
|
||||||
|
// If the monster is an enemy, it also sets its tactic to TACTIC_GO_AFTER_FOES.
|
||||||
|
// Called after exiting the IQ skills menu or after an enemy spawns.
|
||||||
|
void UpdateIqSkills(struct monster *monster);
|
||||||
|
|
||||||
#endif //PMDSKY_DUNGEON_POKEMON_ATTRIBUTES_1_H
|
#endif //PMDSKY_DUNGEON_POKEMON_ATTRIBUTES_1_H
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
#define PMDSKY_ENUMS_H
|
#define PMDSKY_ENUMS_H
|
||||||
|
|
||||||
#define NUM_TACTICS TACTIC_NONE + 1
|
#define NUM_TACTICS TACTIC_NONE + 1
|
||||||
|
#define MAX_NUM_IQ_SKILLS 25
|
||||||
|
|
||||||
// Tactic ID. These are usually encoded as bitvectors.
|
// Tactic ID. These are usually encoded as bitvectors.
|
||||||
enum tactic_id {
|
enum tactic_id {
|
||||||
|
|
@ -2909,6 +2910,7 @@ enum iq_skill_id {
|
||||||
IQ_PIERCE_HURLER = 66,
|
IQ_PIERCE_HURLER = 66,
|
||||||
IQ_COLLECTOR = 67,
|
IQ_COLLECTOR = 67,
|
||||||
IQ_TRUE_POWERIST = 68,
|
IQ_TRUE_POWERIST = 68,
|
||||||
|
IQ_NONE_2 = 255,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum movement_flag
|
enum movement_flag
|
||||||
|
|
@ -3456,4 +3458,10 @@ enum script_calc_operation {
|
||||||
CALC_RANDOM = 11,
|
CALC_RANDOM = 11,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// https://docs.google.com/spreadsheets/d/1NK3wkC8mOCu-tVkxULLkhpgPR-glApiD2v3zp-mdW7w
|
||||||
|
enum performance_progress_flag
|
||||||
|
{
|
||||||
|
PERFORMANCE_PROGRESS_FLAG_RANDOM_MISSION = 3
|
||||||
|
};
|
||||||
|
|
||||||
#endif //PMDSKY_ENUMS_H
|
#endif //PMDSKY_ENUMS_H
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,6 @@
|
||||||
|
|
||||||
#include "dungeon_mode.h"
|
#include "dungeon_mode.h"
|
||||||
|
|
||||||
bool8 IqSkillFlagTest(struct iq_skill_flags *iq_skill_flags, u32 iq_id);
|
bool8 IqSkillFlagTest(u32 *iq_skill_flags, u32 iq_id);
|
||||||
|
|
||||||
#endif //PMDSKY_POKEMON_H
|
#endif //PMDSKY_POKEMON_H
|
||||||
|
|
|
||||||
2
main.lsf
2
main.lsf
|
|
@ -493,7 +493,7 @@ Overlay OVY_29
|
||||||
Object src/dungeon_logic_3.o
|
Object src/dungeon_logic_3.o
|
||||||
Object asm/overlay_29_02301E88.o
|
Object asm/overlay_29_02301E88.o
|
||||||
Object src/dungeon_pokemon_attributes_1.o
|
Object src/dungeon_pokemon_attributes_1.o
|
||||||
Object asm/overlay_29_02301FBC.o
|
Object asm/overlay_29_023021F0.o
|
||||||
Object src/dungeon_logic_5.o
|
Object src/dungeon_logic_5.o
|
||||||
Object asm/overlay_29_0230231C.o
|
Object asm/overlay_29_0230231C.o
|
||||||
Object src/dungeon_logic_2.o
|
Object src/dungeon_logic_2.o
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,19 @@
|
||||||
#include "dungeon_pokemon_attributes_1.h"
|
#include "dungeon_pokemon_attributes_1.h"
|
||||||
|
#include "dungeon_logic_7.h"
|
||||||
#include "dungeon_util_static.h"
|
#include "dungeon_util_static.h"
|
||||||
#include "overlay_29_022FF898.h"
|
#include "overlay_29_022FF898.h"
|
||||||
#include "overlay_29_023000E4.h"
|
#include "overlay_29_023000E4.h"
|
||||||
#include "pokemon.h"
|
#include "pokemon.h"
|
||||||
|
|
||||||
|
extern bool8 CanLearnIqSkill(s32 iq_amount, enum iq_skill_id iq_id);
|
||||||
|
extern void DisableIqSkill(u32 *iq_skills_flags, enum iq_skill_id iq_id);
|
||||||
|
extern void EnableIqSkill(u32 *iq_skills_flags, enum iq_skill_id iq_id);
|
||||||
|
extern bool8 GetPerformanceFlagWithChecks(s32 flag_id);
|
||||||
|
extern enum iq_skill_id GetSpeciesIqSkill(s16 monster_id, u8 index);
|
||||||
|
|
||||||
|
extern s16 MIN_IQ_EXCLUSIVE_MOVE_USER;
|
||||||
|
extern s16 MIN_IQ_ITEM_MASTER;
|
||||||
|
|
||||||
bool8 CanSeeInvisibleMonsters(struct entity *entity)
|
bool8 CanSeeInvisibleMonsters(struct entity *entity)
|
||||||
{
|
{
|
||||||
if (GetEntInfo(entity)->blinker_class_status.blinded == STATUS_BLINKER_EYEDROPS)
|
if (GetEntInfo(entity)->blinker_class_status.blinded == STATUS_BLINKER_EYEDROPS)
|
||||||
|
|
@ -38,5 +48,72 @@ bool8 IqSkillIsEnabled(struct entity *entity, enum iq_skill_id iq_skill)
|
||||||
if (!entity_info->is_not_team_member && DUNGEON_PTR[0]->iq_disabled)
|
if (!entity_info->is_not_team_member && DUNGEON_PTR[0]->iq_disabled)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
return IqSkillFlagTest(&entity_info->iq_skill_flags, iq_skill);
|
return IqSkillFlagTest(entity_info->iq_skill_flags.flags, iq_skill);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateIqSkills(struct monster *monster)
|
||||||
|
{
|
||||||
|
if (monster->is_not_team_member)
|
||||||
|
{
|
||||||
|
monster->iq_skill_flags.flags[0] = 0;
|
||||||
|
monster->iq_skill_flags.flags[1] = 0;
|
||||||
|
monster->iq_skill_flags.flags[2] = 0;
|
||||||
|
|
||||||
|
for (s32 i = 0; i < MAX_NUM_IQ_SKILLS; i++)
|
||||||
|
{
|
||||||
|
enum iq_skill_id iq_skill = GetSpeciesIqSkill(monster->id, i);
|
||||||
|
if (iq_skill == IQ_NONE_2)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (CanLearnIqSkill(monster->iq, iq_skill))
|
||||||
|
{
|
||||||
|
EnableIqSkill(monster->iq_skill_menu_flags.flags, iq_skill);
|
||||||
|
EnableIqSkill(monster->iq_skill_flags.flags, iq_skill);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (monster->iq < MIN_IQ_EXCLUSIVE_MOVE_USER && IqSkillFlagTest(monster->iq_skill_flags.flags, IQ_EXCLUSIVE_MOVE_USER))
|
||||||
|
DisableIqSkill(monster->iq_skill_flags.flags, IQ_EXCLUSIVE_MOVE_USER);
|
||||||
|
|
||||||
|
if ((IsMonsterLoneOutlaw(monster) || monster->iq < MIN_IQ_ITEM_MASTER) && IqSkillFlagTest(monster->iq_skill_flags.flags, IQ_ITEM_MASTER))
|
||||||
|
DisableIqSkill(monster->iq_skill_flags.flags, IQ_ITEM_MASTER);
|
||||||
|
|
||||||
|
if (IqSkillFlagTest(monster->iq_skill_flags.flags, IQ_DEDICATED_TRAVELER))
|
||||||
|
DisableIqSkill(monster->iq_skill_flags.flags, IQ_DEDICATED_TRAVELER);
|
||||||
|
|
||||||
|
if (IqSkillFlagTest(monster->iq_skill_flags.flags, IQ_LAVA_EVADER))
|
||||||
|
DisableIqSkill(monster->iq_skill_flags.flags, IQ_LAVA_EVADER);
|
||||||
|
|
||||||
|
if (IqSkillFlagTest(monster->iq_skill_flags.flags, IQ_WEAK_TYPE_PICKER))
|
||||||
|
DisableIqSkill(monster->iq_skill_flags.flags, IQ_WEAK_TYPE_PICKER);
|
||||||
|
|
||||||
|
monster->tactic = TACTIC_GO_AFTER_FOES;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
monster->iq_skill_flags.flags[0] = 0;
|
||||||
|
monster->iq_skill_flags.flags[1] = 0;
|
||||||
|
monster->iq_skill_flags.flags[2] = 0;
|
||||||
|
for (s32 i = 0; i < MAX_NUM_IQ_SKILLS; i++)
|
||||||
|
{
|
||||||
|
enum iq_skill_id iq_skill = GetSpeciesIqSkill(monster->id, i);
|
||||||
|
if (iq_skill == IQ_NONE_2)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (CanLearnIqSkill(monster->iq, iq_skill) && IqSkillFlagTest(monster->iq_skill_menu_flags.flags, iq_skill))
|
||||||
|
EnableIqSkill(monster->iq_skill_flags.flags, iq_skill);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetPerformanceFlagWithChecks(PERFORMANCE_PROGRESS_FLAG_RANDOM_MISSION))
|
||||||
|
{
|
||||||
|
EnableIqSkill(monster->iq_skill_menu_flags.flags, IQ_ESCAPIST);
|
||||||
|
EnableIqSkill(monster->iq_skill_flags.flags, IQ_ESCAPIST);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IqSkillFlagTest(monster->iq_skill_menu_flags.flags, IQ_BRICK_TOUGH))
|
||||||
|
EnableIqSkill(monster->iq_skill_flags.flags, IQ_BRICK_TOUGH);
|
||||||
|
|
||||||
|
if (IqSkillFlagTest(monster->iq_skill_menu_flags.flags, IQ_MULTITALENT))
|
||||||
|
EnableIqSkill(monster->iq_skill_flags.flags, IQ_MULTITALENT);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
#include "pokemon.h"
|
#include "pokemon.h"
|
||||||
|
|
||||||
bool8 IqSkillFlagTest(struct iq_skill_flags *iq_skill_flags, u32 iq_id)
|
bool8 IqSkillFlagTest(u32 *iq_skill_flags, u32 iq_id)
|
||||||
{
|
{
|
||||||
u32 flags_index = iq_id >> 5;
|
u32 flags_index = iq_id >> 5;
|
||||||
u32 flags_section = iq_skill_flags->flags[flags_index];
|
u32 flags_section = iq_skill_flags[flags_index];
|
||||||
u32 flag_bit_index = iq_id - (flags_index << 5);
|
u32 flag_bit_index = iq_id - (flags_index << 5);
|
||||||
return (flags_section & (1 << flag_bit_index)) != 0;
|
return (flags_section & (1 << flag_bit_index)) != 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user