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);
|
||||
// Checks if a monster has a certain IQ skill enabled.
|
||||
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
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
#define PMDSKY_ENUMS_H
|
||||
|
||||
#define NUM_TACTICS TACTIC_NONE + 1
|
||||
#define MAX_NUM_IQ_SKILLS 25
|
||||
|
||||
// Tactic ID. These are usually encoded as bitvectors.
|
||||
enum tactic_id {
|
||||
|
|
@ -2909,6 +2910,7 @@ enum iq_skill_id {
|
|||
IQ_PIERCE_HURLER = 66,
|
||||
IQ_COLLECTOR = 67,
|
||||
IQ_TRUE_POWERIST = 68,
|
||||
IQ_NONE_2 = 255,
|
||||
};
|
||||
|
||||
enum movement_flag
|
||||
|
|
@ -3456,4 +3458,10 @@ enum script_calc_operation {
|
|||
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
|
||||
|
|
|
|||
|
|
@ -3,6 +3,6 @@
|
|||
|
||||
#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
|
||||
|
|
|
|||
2
main.lsf
2
main.lsf
|
|
@ -493,7 +493,7 @@ Overlay OVY_29
|
|||
Object src/dungeon_logic_3.o
|
||||
Object asm/overlay_29_02301E88.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 asm/overlay_29_0230231C.o
|
||||
Object src/dungeon_logic_2.o
|
||||
|
|
|
|||
|
|
@ -1,9 +1,19 @@
|
|||
#include "dungeon_pokemon_attributes_1.h"
|
||||
#include "dungeon_logic_7.h"
|
||||
#include "dungeon_util_static.h"
|
||||
#include "overlay_29_022FF898.h"
|
||||
#include "overlay_29_023000E4.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)
|
||||
{
|
||||
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)
|
||||
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"
|
||||
|
||||
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_section = iq_skill_flags->flags[flags_index];
|
||||
u32 flags_section = iq_skill_flags[flags_index];
|
||||
u32 flag_bit_index = iq_id - (flags_index << 5);
|
||||
return (flags_section & (1 << flag_bit_index)) != 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user