diff --git a/asm/main_rodata_020A190C.s b/asm/main_rodata_020A190C.s index b59639cd..0d10e6b9 100644 --- a/asm/main_rodata_020A190C.s +++ b/asm/main_rodata_020A190C.s @@ -49,15 +49,3 @@ VERSION_EXCLUSIVE_MONSTERS: .byte 0x19, 0x04, 0x00, 0x01, 0x0F, 0x00, 0x00, 0x01, 0x67, 0x02, 0x00, 0x01, 0xE9, 0x01, 0x01, 0x00 .byte 0x41, 0x04, 0x01, 0x00, 0xEA, 0x01, 0x01, 0x00, 0x42, 0x04, 0x01, 0x00, 0x16, 0x01, 0x01, 0x00 .byte 0x09, 0x02, 0x00, 0x01, 0x96, 0x00, 0x00, 0x01 - .global IQ_SKILL_RESTRICTIONS -IQ_SKILL_RESTRICTIONS: - .byte 0x0F, 0x27, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00 - .byte 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00 - .byte 0x0A, 0x00, 0x0A, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x10, 0x00 - .byte 0x14, 0x00, 0x09, 0x00, 0x11, 0x00, 0x06, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1A, 0x00, 0x1B, 0x00 - .byte 0x1C, 0x00, 0x1D, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00 - .byte 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2A, 0x00, 0x2B, 0x00 - .byte 0x2C, 0x00, 0x2D, 0x00, 0x2E, 0x00, 0x2F, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00 - .byte 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3A, 0x00, 0x3B, 0x00 - .byte 0x3C, 0x00, 0x3D, 0x00, 0x3E, 0x00, 0x3F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00 - .byte 0x44, 0x00, 0x00, 0x00 diff --git a/include/enums.h b/include/enums.h index c53a9cdf..5dbc5480 100644 --- a/include/enums.h +++ b/include/enums.h @@ -2,7 +2,6 @@ #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 { diff --git a/include/iq_skills.h b/include/iq_skills.h index b9101006..87bc433a 100644 --- a/include/iq_skills.h +++ b/include/iq_skills.h @@ -1,10 +1,14 @@ #ifndef PMDSKY_IQ_SKILLS_H #define PMDSKY_IQ_SKILLS_H +#define NUM_IQ_SKILLS 69 +#define NUM_IQ_SKILLS_PER_GROUP 25 +#define NUM_IQ_GROUPS 16 + #include "enums.h" // Table of 4-byte values for each IQ skill that represent the required IQ value to unlock a skill. -extern const s32 IQ_SKILLS[69]; -extern const enum iq_skill_id IQ_GROUP_SKILLS[16][25]; +extern const s32 IQ_SKILLS[NUM_IQ_SKILLS]; +extern const enum iq_skill_id IQ_GROUP_SKILLS[NUM_IQ_GROUPS][NUM_IQ_SKILLS_PER_GROUP]; #endif //PMDSKY_IQ_SKILLS_H diff --git a/include/monster_parameters.h b/include/monster_parameters.h new file mode 100644 index 00000000..3eca2e49 --- /dev/null +++ b/include/monster_parameters.h @@ -0,0 +1,9 @@ +#ifndef PMDSKY_MONSTER_PARAMETERS_H +#define PMDSKY_MONSTER_PARAMETERS_H + +#include "iq_skills.h" + +// Table of 2-byte values for each IQ skill that represent a group. IQ skills in the same group can not be enabled at the same time. +extern const s16 IQ_SKILL_RESTRICTIONS[NUM_IQ_SKILLS + 1]; + +#endif //PMDSKY_MONSTER_PARAMETERS_H diff --git a/main.lsf b/main.lsf index 861243e0..14bd2fb2 100644 --- a/main.lsf +++ b/main.lsf @@ -108,6 +108,7 @@ Static main Object asm/main_02051788.o Object src/tactics_data.o Object asm/main_rodata_020A190C.o + Object src/monster_parameters.o Object src/secondary_terrain_types.o Object asm/main_rodata_020A1BB0.o Object src/iq_skills.o diff --git a/src/dungeon_pokemon_attributes_1.c b/src/dungeon_pokemon_attributes_1.c index 9954b0aa..57069ed2 100644 --- a/src/dungeon_pokemon_attributes_1.c +++ b/src/dungeon_pokemon_attributes_1.c @@ -3,6 +3,7 @@ #include "dungeon_parameters_3.h" #include "dungeon_parameters_4.h" #include "dungeon_util_static.h" +#include "iq_skills.h" #include "main_02058CD8.h" #include "main_02058E68.h" #include "overlay_29_022FF898.h" @@ -58,7 +59,7 @@ void UpdateIqSkills(struct monster *monster) monster->iq_skill_flags.flags[1] = 0; monster->iq_skill_flags.flags[2] = 0; - for (s32 i = 0; i < MAX_NUM_IQ_SKILLS; i++) + for (s32 i = 0; i < NUM_IQ_SKILLS_PER_GROUP; i++) { enum iq_skill_id iq_skill = GetSpeciesIqSkill(monster->id, i); if (iq_skill == IQ_NONE_2) @@ -93,7 +94,7 @@ void UpdateIqSkills(struct monster *monster) 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++) + for (s32 i = 0; i < NUM_IQ_SKILLS_PER_GROUP; i++) { enum iq_skill_id iq_skill = GetSpeciesIqSkill(monster->id, i); if (iq_skill == IQ_NONE_2) diff --git a/src/monster_parameters.c b/src/monster_parameters.c new file mode 100644 index 00000000..5465d4df --- /dev/null +++ b/src/monster_parameters.c @@ -0,0 +1,75 @@ +#include "monster_parameters.h" + +const s16 IQ_SKILL_RESTRICTIONS[NUM_IQ_SKILLS + 1] = +{ + 9999, // IQ_NONE + 4, // IQ_TYPE_ADVANTAGE_MASTER + 1, // IQ_ITEM_CATCHER + 2, // IQ_COURSE_CHECKER + 4, // IQ_SURE_HIT_ATTACKER + 4, // IQ_QUICK_DODGER + 6, // IQ_PP_CHECKER + 7, // IQ_NONTRAITOR + 8, // IQ_STATUS_CHECKER + 9, // IQ_EXP_GO_GETTER + 9, // IQ_EFFICIENCY_EXPERT + 9, // IQ_WEAK_TYPE_PICKER + 10, // IQ_ALL_TERRAIN_HIKER + 10, // IQ_ABSOLUTE_MOVER + 11, // IQ_TRAP_AVOIDER + 11, // IQ_HOUSE_AVOIDER + 14, // IQ_ENERGY_SAVER + 14, // IQ_NONSLEEPER + 14, // IQ_SELF_CURER + 16, // IQ_TRAP_SEER + 20, // IQ_LAVA_EVADER + 9, // IQ_DEDICATED_TRAVELER + 17, // IQ_ITEM_MASTER + 6, // IQ_EXCLUSIVE_MOVE_USER + 24, // IQ_ESCAPIST + 25, // IQ_LOCK_PICKER + 26, // IQ_STAIR_SENSOR + 27, // IQ_COIN_WATCHER + 28, // IQ_EXP_ELITE + 29, // IQ_SHARPSHOOTER + 30, // IQ_FAST_FRIEND + 31, // IQ_PP_SAVER + 32, // IQ_BODYGUARD + 33, // IQ_CAUTIOUS_CREEPER + 34, // IQ_AGGRESSOR + 35, // IQ_DEFENDER + 36, // IQ_INTIMIDATOR + 37, // IQ_SURVIVALIST + 38, // IQ_TRAP_BUSTER + 39, // IQ_COUNTER_HITTER + 40, // IQ_EXTRA_STRIKER + 41, // IQ_HIT_AND_RUNNER + 42, // IQ_PARRY_EXPERT + 43, // IQ_QUICK_STRIKER + 44, // IQ_NO_CHARGER + 45, // IQ_WARY_FIGHTER + 46, // IQ_GAP_PROBER + 47, // IQ_POWER_PITCHER + 48, // IQ_CONCENTRATOR + 49, // IQ_COUNTER_BASHER + 50, // IQ_CHEERLEADER + 51, // IQ_NATURE_GIFTER + 52, // IQ_WISE_HEALER + 53, // IQ_QUICK_HEALER + 54, // IQ_ACUTE_SNIFFER + 55, // IQ_DEEP_BREATHER + 56, // IQ_BRICK_TOUGH + 57, // IQ_MULTITALENT + 58, // IQ_TIME_TRIPPER + 59, // IQ_ERRATIC_PLAYER + 60, // IQ_PRACTICE_SWINGER + 61, // IQ_NO_DEFEATIST + 62, // IQ_HAGGLER + 63, // IQ_CLUTCH_PERFORMER + 64, // IQ_CRITICAL_DODGER + 65, // IQ_MAP_SURVEYOR + 66, // IQ_PIERCE_HURLER + 67, // IQ_COLLECTOR + 68, // IQ_TRUE_POWERIST + 0, // IQ_NONE_2 +};