summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorCheng Hann Gan <chenghanngan.us@gmail.com>2021-09-09 19:22:48 -0400
committerGitHub <noreply@github.com>2021-09-09 16:22:48 -0700
commit8237e29a164211eb2ec4cd161eb4183cc1947fee (patch)
tree67dc502264b755dc620f56969f3bea68a40b17af /include
parent4eff1882443b0004d9c9fa4895cdfefdc356565f (diff)
Defined more in-dungeon structs and enums (#53)
* Defined DungeonEntity * Rename EntityType enums * Revert EntityType rename * Defined more in-dungeon structs and enums * Added more dungeon global structs/enums * Prefixed dungeonGlobalData with g * Fixed compile errors * Removed some CRLFs * Fixed compile after merge * Revert Makefile * Rename DungeonEntityData.entityType Co-authored-by: Seth Barberee <seth.barberee@gmail.com> * Renamed symbols per PR comments Co-authored-by: Cheng Hann Gan <chenghann_gan@ultimatesoftware.com> Co-authored-by: Seth Barberee <seth.barberee@gmail.com>
Diffstat (limited to 'include')
-rw-r--r--include/constants/ability.h84
-rw-r--r--include/constants/direction.h16
-rw-r--r--include/constants/dungeon.h106
-rw-r--r--include/constants/dungeon_action.h44
-rw-r--r--include/constants/iq_skill.h31
-rw-r--r--include/constants/move.h474
-rw-r--r--include/constants/status.h124
-rw-r--r--include/constants/tactic.h19
-rw-r--r--include/constants/trap.h28
-rw-r--r--include/constants/type.h25
-rw-r--r--include/dungeon_entity.h277
-rw-r--r--include/dungeon_global_data.h93
-rw-r--r--include/gUnknown_203B418.h47
-rw-r--r--include/item.h19
-rw-r--r--include/map.h61
-rw-r--r--include/pokemon.h19
16 files changed, 1372 insertions, 95 deletions
diff --git a/include/constants/ability.h b/include/constants/ability.h
new file mode 100644
index 0000000..27f87fc
--- /dev/null
+++ b/include/constants/ability.h
@@ -0,0 +1,84 @@
+#ifndef GUARD_CONSTANTS_ABILITY_H
+#define GUARD_CONSTANTS_ABILITY_H
+
+enum Ability
+{
+ ABILITY_STENCH = 0x1,
+ ABILITY_THICK_FAT = 0x2,
+ ABILITY_RAIN_DISH = 0x3,
+ ABILITY_DRIZZLE = 0x4,
+ ABILITY_ARENA_TRAP = 0x5,
+ ABILITY_INTIMIDATE = 0x6,
+ ABILITY_ROCK_HEAD = 0x7,
+ ABILITY_AIR_LOCK = 0x8,
+ ABILITY_HYPER_CUTTER = 0x9,
+ ABILITY_SHADOW_TAG = 0xA,
+ ABILITY_SPEED_BOOST = 0xB,
+ ABILITY_BATTLE_ARMOR = 0xC,
+ ABILITY_STURDY = 0xD,
+ ABILITY_SUCTION_CUPS = 0xE,
+ ABILITY_CLEAR_BODY = 0xF,
+ ABILITY_TORRENT = 0x10,
+ ABILITY_GUTS = 0x11,
+ ABILITY_ROUGH_SKIN = 0x12,
+ ABILITY_SHELL_ARMOR = 0x13,
+ ABILITY_NATURAL_CURE = 0x14,
+ ABILITY_DAMP = 0x15,
+ ABILITY_LIMBER = 0x16,
+ ABILITY_MAGNET_PULL = 0x17,
+ ABILITY_WHITE_SMOKE = 0x18,
+ ABILITY_SYNCHRONIZE = 0x19,
+ ABILITY_OVERGROW = 0x1A,
+ ABILITY_SWIFT_SWIM = 0x1B,
+ ABILITY_SAND_STREAM = 0x1C,
+ ABILITY_SAND_VEIL = 0x1D,
+ ABILITY_KEEN_EYE = 0x1E,
+ ABILITY_INNER_FOCUS = 0x1F,
+ ABILITY_STATIC = 0x20,
+ ABILITY_SHED_SKIN = 0x21,
+ ABILITY_HUGE_POWER = 0x22,
+ ABILITY_VOLT_ABSORB = 0x23,
+ ABILITY_WATER_ABSORB = 0x24,
+ ABILITY_FORECAST = 0x25,
+ ABILITY_SERENE_GRACE = 0x26,
+ ABILITY_POISON_POINT = 0x27,
+ ABILITY_TRACE = 0x28,
+ ABILITY_OBLIVIOUS = 0x29,
+ ABILITY_TRUANT = 0x2A,
+ ABILITY_RUN_AWAY = 0x2B,
+ ABILITY_STICKY_HOLD = 0x2C,
+ ABILITY_CLOUD_NINE = 0x2D,
+ ABILITY_ILLUMINATE = 0x2E,
+ ABILITY_EARLY_BIRD = 0x2F,
+ ABILITY_HUSTLE = 0x30,
+ ABILITY_DROUGHT = 0x31,
+ ABILITY_LIGHTNINGROD = 0x32,
+ ABILITY_COMPOUNDEYES = 0x33,
+ ABILITY_MARVEL_SCALE = 0x34,
+ ABILITY_WONDER_GUARD = 0x35,
+ ABILITY_INSOMNIA = 0x36,
+ ABILITY_LEVITATE = 0x37,
+ ABILITY_PLUS = 0x38,
+ ABILITY_PRESSURE = 0x39,
+ ABILITY_LIQUID_OOZE = 0x3A,
+ ABILITY_COLOR_CHANGE = 0x3B,
+ ABILITY_SOUNDPROOF = 0x3C,
+ ABILITY_EFFECT_SPORE = 0x3D,
+ ABILITY_FLAME_BODY = 0x3E,
+ ABILITY_MINUS = 0x3F,
+ ABILITY_OWN_TEMPO = 0x40,
+ ABILITY_MAGMA_ARMOR = 0x41,
+ ABILITY_WATER_VEIL = 0x42,
+ ABILITY_SWARM = 0x43,
+ ABILITY_CUTE_CHARM = 0x44,
+ ABILITY_IMMUNITY = 0x45,
+ ABILITY_BLAZE = 0x46,
+ ABILITY_PICKUP = 0x47,
+ ABILITY_FLASH_FIRE = 0x48,
+ ABILITY_VITAL_SPIRIT = 0x49,
+ ABILITY_CHLOROPHYLL = 0x4A,
+ ABILITY_PURE_POWER = 0x4B,
+ ABILITY_SHIELD_DUST = 0x4C
+};
+
+#endif
diff --git a/include/constants/direction.h b/include/constants/direction.h
new file mode 100644
index 0000000..5f2bfb3
--- /dev/null
+++ b/include/constants/direction.h
@@ -0,0 +1,16 @@
+#ifndef GUARD_CONSTANTS_DIRECTION_H
+#define GUARD_CONSTANTS_DIRECTION_H
+
+enum Direction
+{
+ DIRECTION_SOUTH,
+ DIRECTION_SOUTHEAST,
+ DIRECTION_EAST,
+ DIRECTION_NORTHEAST,
+ DIRECTION_NORTH,
+ DIRECTION_NORTHWEST,
+ DIRECTION_WEST,
+ DIRECTION_SOUTHWEST
+};
+
+#endif
diff --git a/include/constants/dungeon.h b/include/constants/dungeon.h
new file mode 100644
index 0000000..19f5340
--- /dev/null
+++ b/include/constants/dungeon.h
@@ -0,0 +1,106 @@
+#ifndef GUARD_CONSTANTS_DUNGEON_H
+#define GUARD_CONSTANTS_DUNGEON_H
+
+enum Dungeon
+{
+ DUNGEON_TINY_WOODS = 0,
+ DUNGEON_THUNDERWAVE_CAVE = 1,
+ DUNGEON_MT_STEEL = 2,
+ DUNGEON_SINISTER_WOODS = 3,
+ DUNGEON_SILENT_CHASM = 4,
+ DUNGEON_MT_THUNDER = 5,
+ DUNGEON_MT_THUNDER_PEAK = 6,
+ DUNGEON_GREAT_CANYON = 7,
+ DUNGEON_LAPIS_CAVE = 8,
+ DUNGEON_MT_BLAZE = 9,
+ DUNGEON_MT_BLAZE_PEAK = 10,
+ DUNGEON_FROSTY_FOREST = 11,
+ DUNGEON_FROSTY_GROTTO = 12,
+ DUNGEON_MT_FREEZE = 13,
+ DUNGEON_MT_FREEZE_PEAK = 14,
+ DUNGEON_MAGMA_CAVERN = 15,
+ DUNGEON_MAGMA_CAVERN_PIT = 16,
+ DUNGEON_SKY_TOWER = 17,
+ DUNGEON_SKY_TOWER_SUMMIT = 18,
+ DUNGEON_STORMY_SEA = 19,
+ DUNGEON_SILVER_TRENCH = 20,
+ DUNGEON_METEOR_CAVE = 21,
+ DUNGEON_MT_FREEZE_PEAK_2 = 22, // Duplicate
+ DUNGEON_WESTERN_CAVE = 23,
+ DUNGEON_BOSS_3 = 24,
+ DUNGEON_BOSS_4 = 25,
+ DUNGEON_WISH_CAVE = 26,
+ DUNGEON_BURIED_RELIC = 27,
+ DUNGEON_PITFALL_VALLEY = 28,
+ DUNGEON_NORTHERN_RANGE = 29,
+ DUNGEON_BOSS_9 = 30,
+ DUNGEON_DESERT_REGION = 31,
+ DUNGEON_SOUTHERN_CAVERN = 32,
+ DUNGEON_WYVERN_HILL = 33,
+ DUNGEON_FIERY_FIELD = 34,
+ DUNGEON_NORTHWIND_FIELD = 35,
+ DUNGEON_SOLAR_CAVE = 36,
+ DUNGEON_LIGHTNING_FIELD = 37,
+ DUNGEON_DARKNIGHT_RELIC = 38,
+ DUNGEON_WONDROUS_SEA = 39,
+ DUNGEON_MURKY_CAVE = 40,
+ DUNGEON_GRAND_SEA = 41,
+ DUNGEON_UPROAR_FOREST = 42,
+ DUNGEON_ODDITY_CAVE = 43,
+ DUNGEON_REMAINS_ISLAND = 44,
+ DUNGEON_MARVELOUS_SEA = 45,
+ DUNGEON_FANTASY_STRAIT = 46,
+ DUNGEON_ROCK_PATH = 47,
+ DUNGEON_SNOW_PATH = 48,
+ DUNGEON_AUTOPILOT = 49,
+ DUNGEON_D50 = 50,
+ DUNGEON_D51 = 51,
+ DUNGEON_NORMAL_MAZE = 52,
+ DUNGEON_HOWLING_FOREST = 53,
+ DUNGEON_D54 = 54,
+ DUNGEON_POISON_MAZE = 55,
+ DUNGEON_WATERFALL_POND = 56,
+ DUNGEON_UNKNOWN_RELIC = 57,
+ DUNGEON_JOYOUS_TOWER = 58,
+ DUNGEON_FAR_OFF_SEA = 59,
+ DUNGEON_MT_FARAWAY = 60,
+ DUNGEON_D61 = 61,
+ DUNGEON_PURITY_FOREST = 62,
+ DUNGEON_OUT_ON_RESCUE = 63,
+ DUNGEON_JOIN_LOCATION_LEADER = 64, // Displays as "???".
+ DUNGEON_JOIN_LOCATION_PARTNER = 65, // Displays as "Tiny Woods".
+ DUNGEON_UNKNOWN_WORLD = 66,
+ DUNGEON_FROSTY_GROTTO_2 = 67, // Duplicate
+ DUNGEON_HOWLING_FOREST_2 = 68, // Duplicate
+ DUNGEON_POKEMON_SQUARE = 69,
+ DUNGEON_POKEMON_SQUARE_2 = 70, // Duplicate
+ DUNGEON_RESCUE_TEAM_BASE = 71,
+ DUNGEON_RESCUE_TEAM_BASE_2 = 72, // Duplicate
+ DUNGEON_AGB_SLOT = 73,
+ DUNGEON_JOIN_LOCATION_CLIENT_POKEMON = 74,
+ DUNGEON_NORMAL_MAZE_2 = 75, // Duplicate
+ DUNGEON_FIRE_MAZE = 76,
+ DUNGEON_WATER_MAZE = 77,
+ DUNGEON_GRASS_MAZE = 78,
+ DUNGEON_ELECTRIC_MAZE = 79,
+ DUNGEON_ICE_MAZE = 80,
+ DUNGEON_FIGHTING_MAZE = 81,
+ DUNGEON_GROUND_MAZE = 82,
+ DUNGEON_FLYING_MAZE = 83,
+ DUNGEON_PSYCHIC_MAZE = 84,
+ DUNGEON_POISON_MAZE_2 = 85, // Duplicate
+ DUNGEON_BUG_MAZE = 86,
+ DUNGEON_ROCK_MAZE = 87,
+ DUNGEON_GHOST_MAZE = 88,
+ DUNGEON_DRAGON_MAZE = 89,
+ DUNGEON_DARK_MAZE = 90,
+ DUNGEON_STEEL_MAZE = 91,
+ DUNGEON_TEAM_SHIFTY = 92,
+ DUNGEON_TEAM_CONSTRICTOR = 93,
+ DUNGEON_TEAM_HYDRO = 94,
+ DUNGEON_TEAM_RUMBLEROCK = 95,
+ DUNGEON_RESCUE_TEAM_2 = 96,
+ DUNGEON_RESCUE_TEAM_MAZE = 97,
+};
+
+#endif
diff --git a/include/constants/dungeon_action.h b/include/constants/dungeon_action.h
new file mode 100644
index 0000000..f5e0290
--- /dev/null
+++ b/include/constants/dungeon_action.h
@@ -0,0 +1,44 @@
+#ifndef GUARD_CONSTANTS_DUNGEON_ACTION_H
+#define GUARD_CONSTANTS_DUNGEON_ACTION_H
+
+enum DungeonAction
+{
+ DUNGEON_ACTION_WAIT = 0x1,
+ DUNGEON_ACTION_WALK = 0x2,
+ // Switching between Pokémon in the moves menu.
+ DUNGEON_ACTION_NEXT_POKEMON_MOVES = 0x6,
+ DUNGEON_ACTION_PREVIOUS_POKEMON_MOVES = 0x7,
+ DUNGEON_ACTION_PLACE_ITEM = 0x8,
+ // Some actions are different between the leader and AI-controlled Pokémon.
+ DUNGEON_ACTION_TAKE_ITEM_LEADER = 0x9, // Picking up an item underfoot.
+ DUNGEON_ACTION_THROW_ITEM_LEADER = 0xB,
+ DUNGEON_ACTION_CONSUME_ITEM_LEADER = 0xD,
+ DUNGEON_ACTION_USE_ITEM_LEADER = 0x12,
+ DUNGEON_ACTION_TALK_FIELD = 0x13, // Talking to another Pokémon by facing them and interacting.
+ DUNGEON_ACTION_USE_MOVE_LEADER = 0x14,
+ DUNGEON_ACTION_USE_MOVE_AI = 0x15,
+ DUNGEON_ACTION_STRUGGLE = 0x17, // Using the Struggle move.
+ DUNGEON_ACTION_CHECK_MOVES = 0x19,
+ DUNGEON_ACTION_CHANGE_TACTICS = 0x1A,
+ DUNGEON_ACTION_CHECK_POKEMON_SUMMARY = 0x1B,
+ DUNGEON_ACTION_TALK_MENU = 0x1C, // Talking to another Pokémon via the menu.
+ DUNGEON_ACTION_SET_MOVE = 0x1E, // Registering a move.
+ DUNGEON_ACTION_CONSUME_ITEM_AI = 0x23,
+ DUNGEON_ACTION_THROW_ITEM_AI = 0x24,
+ DUNGEON_ACTION_THROW_STRAIGHT_THROWN_ITEM_LEADER = 0x27,
+ DUNGEON_ACTION_USE_LINK_BOX = 0x2C,
+ DUNGEON_ACTION_GIVE_UP = 0x2E,
+ DUNGEON_ACTION_CHANGE_IQ_SKILLS = 0x30,
+ DUNGEON_ACTION_USE_ORB = 0x31,
+ DUNGEON_ACTION_REGULAR_ATTACK = 0x32,
+ DUNGEON_ACTION_UNSET_MOVE = 0x33,
+ DUNGEON_ACTION_GIVE_HELD_ITEM = 0x36,
+ DUNGEON_ACTION_TAKE_HELD_ITEM = 0x37,
+ DUNGEON_ACTION_HAVE_SECOND_THOUGHTS = 0x39, // Happens with invalid actions, like attempting to eat a non-consumable item.
+ DUNGEON_ACTION_SET_ITEM = 0x3C,
+ DUNGEON_ACTION_UNSET_ITEM = 0x3D,
+ DUNGEON_ACTION_TAKE_ITEM_AI = 0x3F,
+ DUNGEON_ACTION_THROW_ARC_THROWN_ITEM_LEADER = 0x41, // Throwing Gravelerocks and Geo Pebbles.
+};
+
+#endif
diff --git a/include/constants/iq_skill.h b/include/constants/iq_skill.h
new file mode 100644
index 0000000..759c350
--- /dev/null
+++ b/include/constants/iq_skill.h
@@ -0,0 +1,31 @@
+#ifndef GUARD_CONSTANTS_IQ_SKILL_H
+#define GUARD_CONSTANTS_IQ_SKILL_H
+
+enum IQSkill
+{
+ IQ_SKILL_TYPE_ADVANTAGE_MASTER = 0x1,
+ IQ_SKILL_ITEM_CATCHER = 0x2,
+ IQ_SKILL_COURSE_CHECKER = 0x3,
+ IQ_SKILL_SURE_HIT_ATTACKER = 0x4,
+ IQ_SKILL_QUICK_DODGER = 0x5,
+ IQ_SKILL_PP_CHECKER = 0x6,
+ IQ_SKILL_NONTRAITOR = 0x7,
+ IQ_SKILL_STATUS_CHECKER = 0x8,
+ IQ_SKILL_EXP_GO_GETTER = 0x9,
+ IQ_SKILL_EFFICIENCY_EXPERT = 0xA,
+ IQ_SKILL_WEAK_TYPE_PICKER = 0xB,
+ IQ_SKILL_ALL_TERRAIN_HIKER = 0xC,
+ IQ_SKILL_SUPER_MOBILE = 0xD,
+ IQ_SKILL_TRAP_AVOIDER = 0xE,
+ IQ_SKILL_HOUSE_AVOIDER = 0xF,
+ IQ_SKILL_ENERGY_SAVER = 0x10,
+ IQ_SKILL_NONSLEEPER = 0x11,
+ IQ_SKILL_SELF_CURER = 0x12,
+ IQ_SKILL_TRAP_SEER = 0x13,
+ IQ_SKILL_LAVA_EVADER = 0x14,
+ IQ_SKILL_DEDICATED_TRAVELER = 0x15,
+ IQ_SKILL_ITEM_MASTER = 0x16,
+ IQ_SKILL_EXCLUSIVE_MOVE_USER = 0x17
+};
+
+#endif
diff --git a/include/constants/move.h b/include/constants/move.h
new file mode 100644
index 0000000..6f1ea70
--- /dev/null
+++ b/include/constants/move.h
@@ -0,0 +1,474 @@
+#ifndef GUARD_CONSTANTS_MOVE_H
+#define GUARD_CONSTANTS_MOVE_H
+
+enum MoveFlags
+{
+ MOVE_FLAG_EXISTS = 1 << 0,
+ MOVE_FLAG_LINKED = 1 << 1, // This move is linked with the previous move in the Pokémon's moveset.
+ MOVE_FLAG_ENABLED = 1 << 2, // Enabled for the AI to use.
+ MOVE_FLAG_SET = 1 << 3, // This move can be triggered by pressing L+A instead of having to go to the move menu.
+ MOVE_FLAG_LAST_USED = 1 << 4, // The most recent move used by the Pokémon.
+ MOVE_FLAG_DISABLED = 1 << 5 // Disabled by an effect like Taunt.
+};
+
+struct MoveData
+{
+ u8 fill0[0x8 - 0x0];
+ // Determines the range of moves.
+ /* 0x8 */ u16 targetingFlags;
+ /* 0xA */ u16 aiTargetingFlags; // The AI consider certain moves to have different range than they actually do.
+ /* 0xC */ u8 maxPP;
+ /* 0xD */ u8 defaultMoveWeight;
+ u8 fillE[0x10 - 0xE];
+ // Used by the AI to determine how often to use Spikes.
+ // Values exist for all other moves, though they seem to be unused.
+ /* 0x10 */ u8 moveUseChance;
+ u8 fill11[0x17 - 0x11];
+ /* 0x17 */ bool8 cannotHitFrozen; // Used by Status Checker to determine if a move can be used on a frozen target.
+ /* 0x18 */ bool8 dealsDirectDamage;
+};
+
+struct PokemonMove
+{
+ u8 moveFlags;
+ bool8 sealed;
+ u16 moveID;
+ u8 pp;
+ u8 powerBoost; // How much the move is boosted by Ginsengs.
+};
+
+enum TargetingFlag
+{
+ TARGETING_FLAG_TARGET_OTHER = 0x0,
+ TARGETING_FLAG_HEAL_TEAM = 0x1,
+ TARGETING_FLAG_SWAP_POSITIONS = 0x2,
+ TARGETING_FLAG_ATTACK_ALL = 0x5,
+ TARGETING_FLAG_BOOST_TEAM = 0x6,
+ TARGETING_FLAG_DONT_USE = 0xF,
+ TARGETING_FLAG_TARGET_FRONTAL_CONE = 0x10,
+ TARGETING_FLAG_TARGET_AROUND = 0x20,
+ TARGETING_FLAG_TARGET_ROOM = 0x30,
+ TARGETING_FLAG_TARGET_2_TILES_AHEAD = 0x40,
+ TARGETING_FLAG_TARGET_LINE = 0x50,
+ TARGETING_FLAG_TARGET_FLOOR = 0x60,
+ TARGETING_FLAG_SELF_HEAL = 0x70,
+ TARGETING_FLAG_CUT_CORNERS = 0x80,
+ TARGETING_FLAG_SET_TRAP = 0x100,
+ TARGETING_FLAG_HEAL_HP = 0x200,
+ TARGETING_FLAG_HEAL_STATUS = 0x300,
+ TARGETING_FLAG_DREAM_EATER = 0x400,
+ TARGETING_FLAG_HEAL_ALL = 0x500,
+ TARGETING_FLAG_EXPOSE = 0x600,
+};
+
+enum MoveID
+{
+ MOVE_IRON_TAIL = 0x1,
+ MOVE_ICE_BALL = 0x2,
+ MOVE_YAWN = 0x3,
+ MOVE_LOVELY_KISS = 0x4,
+ MOVE_NIGHTMARE = 0x5,
+ MOVE_MORNING_SUN = 0x6,
+ MOVE_VITAL_THROW = 0x7,
+ MOVE_DIG = 0x8,
+ MOVE_THRASH = 0x9,
+ MOVE_SWEET_SCENT = 0xA,
+ MOVE_CHARM = 0xB,
+ MOVE_RAIN_DANCE = 0xC,
+ MOVE_CONFUSE_RAY = 0xD,
+ MOVE_HAIL = 0xE,
+ MOVE_AROMATHERAPY = 0xF,
+ MOVE_BUBBLE = 0x10,
+ MOVE_ENCORE = 0x11,
+ MOVE_CUT = 0x12,
+ MOVE_RAGE = 0x13,
+ MOVE_SUPER_FANG = 0x14,
+ MOVE_PAIN_SPLIT = 0x15,
+ MOVE_TORMENT = 0x16,
+ MOVE_STRING_SHOT = 0x17,
+ MOVE_SWAGGER = 0x18,
+ MOVE_SNORE = 0x19,
+ MOVE_HEAL_BELL = 0x1A,
+ MOVE_SCREECH = 0x1B,
+ MOVE_ROCK_THROW = 0x1C,
+ MOVE_ROCK_SMASH = 0x1D,
+ MOVE_ROCK_SLIDE = 0x1E,
+ MOVE_WEATHER_BALL = 0x1F,
+ MOVE_WHIRLPOOL = 0x20,
+ MOVE_FAKE_TEARS = 0x21,
+ MOVE_SING = 0x22,
+ MOVE_SPITE = 0x23,
+ MOVE_AIR_CUTTER = 0x24,
+ MOVE_SMOKESCREEN = 0x25,
+ MOVE_PURSUIT = 0x26,
+ MOVE_DOUBLESLAP = 0x27,
+ MOVE_MIRROR_MOVE = 0x28,
+ MOVE_OVERHEAT = 0x29,
+ MOVE_AURORA_BEAM = 0x2A,
+ MOVE_MEMENTO = 0x2B,
+ MOVE_OCTAZOOKA = 0x2C,
+ MOVE_FLATTER = 0x2D,
+ MOVE_ASTONISH = 0x2E,
+ MOVE_WILL_O_WISP = 0x2F,
+ MOVE_RETURN = 0x30,
+ MOVE_GRUDGE = 0x31,
+ MOVE_STRENGTH = 0x32,
+ MOVE_COUNTER = 0x33,
+ MOVE_FLAME_WHEEL = 0x34,
+ MOVE_FLAMETHROWER = 0x35,
+ MOVE_ODOR_SLEUTH = 0x36,
+ MOVE_SHARPEN = 0x37,
+ MOVE_DOUBLE_TEAM = 0x38,
+ MOVE_GUST = 0x39,
+ MOVE_HARDEN = 0x3A,
+ MOVE_DISABLE = 0x3B,
+ MOVE_RAZOR_WIND = 0x3C,
+ MOVE_BIDE = 0x3D,
+ MOVE_CRUNCH = 0x3E,
+ MOVE_BITE = 0x3F,
+ MOVE_THUNDER = 0x40,
+ MOVE_THUNDERPUNCH = 0x41,
+ MOVE_ENDEAVOR = 0x42,
+ MOVE_FACADE = 0x43,
+ MOVE_KARATE_CHOP = 0x44,
+ MOVE_CLAMP = 0x45,
+ MOVE_WITHDRAW = 0x46,
+ MOVE_CONSTRICT = 0x47,
+ MOVE_BRICK_BREAK = 0x48,
+ MOVE_ROCK_TOMB = 0x49,
+ MOVE_FOCUS_ENERGY = 0x4A,
+ MOVE_FOCUS_PUNCH = 0x4B,
+ MOVE_GIGA_DRAIN = 0x4C,
+ MOVE_REVERSAL = 0x4D,
+ MOVE_SMELLINGSALT = 0x4E,
+ MOVE_SPORE = 0x4F,
+ MOVE_LEECH_LIFE = 0x50,
+ MOVE_SLASH = 0x51,
+ MOVE_SILVER_WIND = 0x52,
+ MOVE_METAL_SOUND = 0x53,
+ MOVE_GRASSWHISTLE = 0x54,
+ MOVE_TICKLE = 0x55,
+ MOVE_SPIDER_WEB = 0x56,
+ MOVE_CRABHAMMER = 0x57,
+ MOVE_HAZE = 0x58,
+ MOVE_MEAN_LOOK = 0x59,
+ MOVE_CROSS_CHOP = 0x5A,
+ MOVE_OUTRAGE = 0x5B,
+ MOVE_LOW_KICK = 0x5C,
+ MOVE_ANCIENTPOWER = 0x5D,
+ MOVE_SYNTHESIS = 0x5E,
+ MOVE_AGILITY = 0x5F,
+ MOVE_RAPID_SPIN = 0x60,
+ MOVE_ICY_WIND = 0x61,
+ MOVE_MIND_READER = 0x62,
+ MOVE_COSMIC_POWER = 0x63,
+ MOVE_SKY_ATTACK = 0x64,
+ MOVE_POWDER_SNOW = 0x65,
+ MOVE_FOLLOW_ME = 0x66,
+ MOVE_METEOR_MASH = 0x67,
+ MOVE_ENDURE = 0x68,
+ MOVE_ROLLOUT = 0x69,
+ MOVE_SCARY_FACE = 0x6A,
+ MOVE_PSYBEAM = 0x6B,
+ MOVE_PSYWAVE = 0x6C,
+ MOVE_PSYCHIC = 0x6D,
+ MOVE_PSYCHO_BOOST = 0x6E,
+ MOVE_HYPNOSIS = 0x6F,
+ MOVE_UPROAR = 0x70,
+ MOVE_WATER_SPOUT = 0x71,
+ MOVE_SIGNAL_BEAM = 0x72,
+ MOVE_PSYCH_UP = 0x73,
+ MOVE_SUBMISSION = 0x74,
+ MOVE_RECOVER = 0x75,
+ MOVE_EARTHQUAKE = 0x76,
+ MOVE_NATURE_POWER = 0x77,
+ MOVE_LICK = 0x78,
+ MOVE_FLAIL = 0x79,
+ MOVE_TAIL_WHIP = 0x7A,
+ MOVE_SELFDESTRUCT = 0x7B,
+ MOVE_STUN_SPORE = 0x7C,
+ MOVE_BIND = 0x7D,
+ MOVE_SHADOW_PUNCH = 0x7E,
+ MOVE_SHADOW_BALL = 0x7F,
+ MOVE_CHARGE = 0x80,
+ MOVE_THUNDERBOLT = 0x81,
+ MOVE_MIST = 0x82,
+ MOVE_FISSURE = 0x83,
+ MOVE_EXTREMESPEED = 0x84,
+ MOVE_EXTRASENSORY = 0x85,
+ MOVE_SAFEGUARD = 0x86,
+ MOVE_ABSORB = 0x87,
+ MOVE_SKY_UPPERCUT = 0x88,
+ MOVE_SKILL_SWAP = 0x89,
+ MOVE_SKETCH = 0x8A,
+ MOVE_HEADBUTT = 0x8B,
+ MOVE_DOUBLE_EDGE = 0x8C,
+ MOVE_SANDSTORM = 0x8D,
+ MOVE_SAND_ATTACK = 0x8E,
+ MOVE_SAND_TOMB = 0x8F,
+ MOVE_SPARK = 0x90,
+ MOVE_SWIFT = 0x91,
+ MOVE_KINESIS = 0x92,
+ MOVE_SMOG = 0x93,
+ MOVE_GROWTH = 0x94,
+ MOVE_SACRED_FIRE = 0x95,
+ MOVE_SHEER_COLD = 0x96,
+ MOVE_SOLARBEAM = 0x97,
+ MOVE_SONICBOOM = 0x98,
+ MOVE_FLY = 0x99,
+ MOVE_TACKLE = 0x9A,
+ MOVE_EXPLOSION = 0x9B,
+ MOVE_DIVE = 0x9C,
+ MOVE_FIRE_BLAST = 0x9D,
+ MOVE_WATERFALL = 0x9E,
+ MOVE_MUDDY_WATER = 0x9F,
+ MOVE_STOCKPILE = 0xA0,
+ MOVE_SLAM = 0xA1,
+ MOVE_TWISTER = 0xA2,
+ MOVE_BULLET_SEED = 0xA3,
+ MOVE_TWINEEDLE = 0xA4,
+ MOVE_SOFTBOILED = 0xA5,
+ MOVE_EGG_BOMB = 0xA6,
+ MOVE_FAINT_ATTACK = 0xA7,
+ MOVE_BARRAGE = 0xA8,
+ MOVE_MINIMIZE = 0xA9,
+ MOVE_SEISMIC_TOSS = 0xAA,
+ MOVE_SUPERSONIC = 0xAB,
+ MOVE_TAUNT = 0xAC,
+ MOVE_MOONLIGHT = 0xAD,
+ MOVE_PECK = 0xAE,
+ MOVE_ARM_THRUST = 0xAF,
+ MOVE_HORN_ATTACK = 0xB0,
+ MOVE_HORN_DRILL = 0xB1,
+ MOVE_WING_ATTACK = 0xB2,
+ MOVE_AERIAL_ACE = 0xB3,
+ MOVE_ICICLE_SPEAR = 0xB4,
+ MOVE_SWORDS_DANCE = 0xB5,
+ MOVE_VINE_WHIP = 0xB6,
+ MOVE_CONVERSION = 0xB7,
+ MOVE_CONVERSION_2 = 0xB8,
+ MOVE_HELPING_HAND = 0xB9,
+ MOVE_IRON_DEFENSE = 0xBA,
+ MOVE_TELEPORT = 0xBB,
+ MOVE_THUNDERSHOCK = 0xBC,
+ MOVE_SHOCK_WAVE = 0xBD,
+ MOVE_QUICK_ATTACK = 0xBE,
+ MOVE_SWEET_KISS = 0xBF,
+ MOVE_THUNDER_WAVE = 0xC0,
+ MOVE_ZAP_CANNON = 0xC1,
+ MOVE_BLOCK = 0xC2,
+ MOVE_HOWL = 0xC3,
+ MOVE_POISON_GAS = 0xC4,
+ MOVE_TOXIC = 0xC5,
+ MOVE_POISON_FANG = 0xC6,
+ MOVE_POISONPOWDER = 0xC7,
+ MOVE_POISON_STING = 0xC8,
+ MOVE_SPIKE_CANNON = 0xC9,
+ MOVE_ACID_ARMOR = 0xCA,
+ MOVE_TAKE_DOWN = 0xCB,
+ MOVE_JUMP_KICK = 0xCC,
+ MOVE_BOUNCE = 0xCD,
+ MOVE_HI_JUMP_KICK = 0xCE,
+ MOVE_TRI_ATTACK = 0xCF,
+ MOVE_DRAGON_CLAW = 0xD0,
+ MOVE_TRICK = 0xD1,
+ MOVE_TRIPLE_KICK = 0xD2,
+ MOVE_DRILL_PECK = 0xD3,
+ MOVE_MUD_SPORT = 0xD4,
+ MOVE_MUD_SLAP = 0xD5,
+ MOVE_THIEF = 0xD6,
+ MOVE_AMNESIA = 0xD7,
+ MOVE_NIGHT_SHADE = 0xD8,
+ MOVE_GROWL = 0xD9,
+ MOVE_SLACK_OFF = 0xDA,
+ MOVE_SURF = 0xDB,
+ MOVE_ROLE_PLAY = 0xDC,
+ MOVE_NEEDLE_ARM = 0xDD,
+ MOVE_DOUBLE_KICK = 0xDE,
+ MOVE_SUNNY_DAY = 0xDF,
+ MOVE_LEER = 0xE0,
+ MOVE_WISH = 0xE1,
+ MOVE_FAKE_OUT = 0xE2,
+ MOVE_SLEEP_TALK = 0xE3,
+ MOVE_PAY_DAY = 0xE4,
+ MOVE_ASSIST = 0xE5,
+ MOVE_HEAT_WAVE = 0xE6,
+ MOVE_SLEEP_POWDER = 0xE7,
+ MOVE_REST = 0xE8,
+ MOVE_INGRAIN = 0xE9,
+ MOVE_CONFUSION = 0xEA,
+ MOVE_BODY_SLAM = 0xEB,
+ MOVE_SWALLOW = 0xEC,
+ MOVE_CURSE = 0xED,
+ MOVE_FRENZY_PLANT = 0xEE,
+ MOVE_HYDRO_CANNON = 0xEF,
+ MOVE_HYDRO_PUMP = 0xF0,
+ MOVE_HYPER_VOICE = 0xF1,
+ MOVE_HYPER_BEAM = 0xF2,
+ MOVE_SUPERPOWER = 0xF3,
+ MOVE_STEEL_WING = 0xF4,
+ MOVE_SPIT_UP = 0xF5,
+ MOVE_DYNAMICPUNCH = 0xF6,
+ MOVE_GUILLOTINE = 0xF7,
+ MOVE_VICEGRIP = 0xF8,
+ MOVE_KNOCK_OFF = 0xF9,
+ MOVE_POUND = 0xFA,
+ MOVE_RAZOR_LEAF = 0xFB,
+ MOVE_BATON_PASS = 0xFC,
+ MOVE_PETAL_DANCE = 0xFD,
+ MOVE_SPLASH = 0xFE,
+ MOVE_BUBBLEBEAM = 0xFF,
+ MOVE_DOOM_DESIRE = 0x100,
+ MOVE_BELLY_DRUM = 0x101,
+ MOVE_BARRIER = 0x102,
+ MOVE_LIGHT_SCREEN = 0x103,
+ MOVE_SCRATCH = 0x104,
+ MOVE_HYPER_FANG = 0x105,
+ MOVE_EMBER = 0x106,
+ MOVE_SECRET_POWER = 0x107,
+ MOVE_DIZZY_PUNCH = 0x108,
+ MOVE_BULK_UP = 0x109,
+ MOVE_IMPRISON = 0x10A,
+ MOVE_FEATHERDANCE = 0x10B,
+ MOVE_WHIRLWIND = 0x10C,
+ MOVE_BEAT_UP = 0x10D,
+ MOVE_BLIZZARD = 0x10E,
+ MOVE_STOMP = 0x10F,
+ MOVE_BLAST_BURN = 0x110,
+ MOVE_FLASH = 0x111,
+ MOVE_TEETER_DANCE = 0x112,
+ MOVE_CRUSH_CLAW = 0x113,
+ MOVE_BLAZE_KICK = 0x114,
+ MOVE_PRESENT = 0x115,
+ MOVE_ERUPTION = 0x116,
+ MOVE_SLUDGE = 0x117,
+ MOVE_SLUDGE_BOMB = 0x118,
+ MOVE_GLARE = 0x119,
+ MOVE_TRANSFORM = 0x11A,
+ MOVE_POISON_TAIL = 0x11B,
+ MOVE_ROAR = 0x11C,
+ MOVE_BONE_RUSH = 0x11D,
+ MOVE_CAMOUFLAGE = 0x11E,
+ MOVE_COVET = 0x11F,
+ MOVE_TAIL_GLOW = 0x120,
+ MOVE_BONE_CLUB = 0x121,
+ MOVE_BONEMERANG = 0x122,
+ MOVE_FIRE_SPIN = 0x123,
+ MOVE_FIRE_PUNCH = 0x124,
+ MOVE_PERISH_SONG = 0x125,
+ MOVE_WRAP = 0x126,
+ MOVE_SPIKES = 0x127,
+ MOVE_MAGNITUDE = 0x128,
+ MOVE_MAGICAL_LEAF = 0x129,
+ MOVE_MAGIC_COAT = 0x12A,
+ MOVE_MUD_SHOT = 0x12B,
+ MOVE_MACH_PUNCH = 0x12C,
+ MOVE_PROTECT = 0x12D,
+ MOVE_DEFENSE_CURL = 0x12E,
+ MOVE_ROLLING_KICK = 0x12F,
+ MOVE_SUBSTITUTE = 0x130,
+ MOVE_DETECT = 0x131,
+ MOVE_PIN_MISSILE = 0x132,
+ MOVE_WATER_SPORT = 0x133,
+ MOVE_WATER_GUN = 0x134,
+ MOVE_MIST_BALL = 0x135,
+ MOVE_WATER_PULSE = 0x136,
+ MOVE_FURY_ATTACK = 0x137,
+ MOVE_FURY_SWIPES = 0x138,
+ MOVE_DESTINY_BOND = 0x139,
+ MOVE_FALSE_SWIPE = 0x13A,
+ MOVE_FORESIGHT = 0x13B,
+ MOVE_MIRROR_COAT = 0x13C,
+ MOVE_FUTURE_SIGHT = 0x13D,
+ MOVE_MILK_DRINK = 0x13E,
+ MOVE_CALM_MIND = 0x13F,
+ MOVE_MEGA_DRAIN = 0x140,
+ MOVE_MEGA_KICK = 0x141,
+ MOVE_MEGA_PUNCH = 0x142,
+ MOVE_MEGAHORN = 0x143,
+ MOVE_HIDDEN_POWER = 0x144,
+ MOVE_METAL_CLAW = 0x145,
+ MOVE_ATTRACT = 0x146,
+ MOVE_MIMIC = 0x147,
+ MOVE_FRUSTRATION = 0x148,
+ MOVE_LEECH_SEED = 0x149,
+ MOVE_METRONOME = 0x14A,
+ MOVE_DREAM_EATER = 0x14B,
+ MOVE_ACID = 0x14C,
+ MOVE_MEDITATE = 0x14D,
+ MOVE_SNATCH = 0x14E,
+ MOVE_LUSTER_PURGE = 0x14F,
+ MOVE_LEAF_BLADE = 0x150,
+ MOVE_RECYCLE = 0x151,
+ MOVE_REFLECT = 0x152,
+ MOVE_REFRESH = 0x153,
+ MOVE_REVENGE = 0x154,
+ MOVE_DRAGON_RAGE = 0x155,
+ MOVE_DRAGONBREATH = 0x156,
+ MOVE_DRAGON_DANCE = 0x157,
+ MOVE_ICE_PUNCH = 0x158,
+ MOVE_ICE_BEAM = 0x159,
+ MOVE_FURY_CUTTER = 0x15A,
+ MOVE_COMET_PUNCH = 0x15B,
+ MOVE_SKULL_BASH = 0x15C,
+ MOVE_LOCK_ON = 0x15D,
+ MOVE_ROCK_BLAST = 0x15E,
+ MOVE_COTTON_SPORE = 0x15F,
+ MOVE_STRUGGLE = 0x160,
+ MOVE_AEROBLAST = 0x161,
+ MOVE_VOLT_TACKLE = 0x162,
+ MOVE_REGULAR_ATTACK = 0x163,
+ MOVE_WIDE_SLASH = 0x168,
+ MOVE_EXCAVATE = 0x169, // Unused
+ MOVE_SPIN_SLASH = 0x16A, // Unused
+ // Orb effects
+ MOVE_SEE_TRAP = 0x16B,
+ MOVE_TAKEAWAY = 0x16C,
+ MOVE_REBOUND = 0x16D,
+ MOVE_BLOOP_SLASH = 0x16E,
+ MOVE_SWITCHER = 0x16F,
+ MOVE_BLOWBACK = 0x170,
+ MOVE_WARP = 0x171,
+ MOVE_TRANSFER = 0x172,
+ MOVE_SLOW_DOWN = 0x173,
+ MOVE_SPEED_BOOST = 0x174,
+ MOVE_SEARCHLIGHT = 0x175,
+ MOVE_PETRIFY = 0x176,
+ MOVE_STAY_AWAY = 0x177,
+ MOVE_POUNCE = 0x178,
+ MOVE_TRAWL = 0x179,
+ MOVE_CLEANSE = 0x17A,
+ MOVE_OBSERVER = 0x17B,
+ MOVE_DECOY_MAKER = 0x17C,
+ MOVE_SIESTA = 0x17D,
+ MOVE_TOTTER = 0x17E,
+ MOVE_TWO_EDGE = 0x17F,
+ MOVE_NO_MOVE = 0x180,
+ MOVE_ESCAPE = 0x181,
+ MOVE_SCAN = 0x182,
+ MOVE_POWER_EARS = 0x183,
+ MOVE_DROUGHT = 0x184,
+ MOVE_TRAP_BUSTER = 0x185,
+ MOVE_WILD_CALL = 0x186,
+ MOVE_INVISIFY = 0x187,
+ MOVE_ONE_SHOT = 0x188,
+ MOVE_HP_GAUGE = 0x189,
+ MOVE_VACUUM_CUT = 0x18A,
+ MOVE_REVIVER = 0x18B,
+ MOVE_SHOCKER = 0x18C,
+ MOVE_ECHO = 0x18D,
+ MOVE_FAMISH = 0x18E,
+ MOVE_ONE_ROOM = 0x18F,
+ MOVE_FILL_IN = 0x190,
+ MOVE_TRAPPER = 0x191,
+ MOVE_POSSESS = 0x192,
+ MOVE_ITEMIZE = 0x193,
+ MOVE_HURL = 0x196,
+ MOVE_MOBILE = 0x197,
+ MOVE_ITEM_TOSS = 0x198,
+ MOVE_SEE_STAIRS = 0x199,
+ MOVE_LONG_TOSS = 0x19A,
+ MOVE_PIERCE = 0x19B
+};
+
+#endif
diff --git a/include/constants/status.h b/include/constants/status.h
new file mode 100644
index 0000000..8445731
--- /dev/null
+++ b/include/constants/status.h
@@ -0,0 +1,124 @@
+#ifndef GUARD_CONSTANTS_STATUS_H
+#define GUARD_CONSTANTS_STATUS_H
+
+enum SleepStatus
+{
+ SLEEP_STATUS_SLEEP = 1,
+ SLEEP_STATUS_SLEEPLESS = 2,
+ SLEEP_STATUS_NIGHTMARE = 3,
+ SLEEP_STATUS_YAWNING = 4,
+ SLEEP_STATUS_NAPPING = 5
+};
+
+enum NonVolatileStatus
+{
+ NON_VOLATILE_STATUS_BURNED = 1,
+ NON_VOLATILE_STATUS_POISONED = 2,
+ NON_VOLATILE_STATUS_BADLY_POISONED = 3,
+ NON_VOLATILE_STATUS_PARALYZED = 4
+};
+
+enum ImmobilizeStatus
+{
+ IMMOBILIZE_STATUS_FROZEN = 1,
+ IMMOBILIZE_STATUS_IMMOBILIZED = 2,
+ IMMOBILIZE_STATUS_WRAPPED_AROUND_FOE = 3,
+ IMMOBILIZE_STATUS_WRAPPED_BY_FOE = 4,
+ IMMOBILIZE_STATUS_INGRAIN = 5,
+ IMMOBILIZE_STATUS_PETRIFIED = 6,
+ IMMOBILIZE_STATUS_SQUEEZED = 7
+};
+
+enum ChargingStatus
+{
+ CHARGING_STATUS_BIDE = 0x1,
+ CHARGING_STATUS_SOLARBEAM = 0x2,
+ CHARGING_STATUS_SKY_ATTACK = 0x3,
+ CHARGING_STATUS_RAZOR_WIND = 0x4,
+ CHARGING_STATUS_FOCUS_PUNCH = 0x5,
+ CHARGING_STATUS_SKULL_BASH = 0x6,
+ CHARGING_STATUS_FLY = 0x7,
+ CHARGING_STATUS_BOUNCE = 0x8,
+ CHARGING_STATUS_DIVE = 0x9,
+ CHARGING_STATUS_DIG = 0xA,
+ CHARGING_STATUS_CHARGE = 0xB,
+ CHARGING_STATUS_RAGE = 0xC
+};
+
+enum ProtectionStatus
+{
+ PROTECTION_STATUS_REFLECT = 0x1,
+ PROTECTION_STATUS_SAFEGUARD = 0x2,
+ PROTECTION_STATUS_LIGHT_SCREEN = 0x3,
+ PROTECTION_STATUS_COUNTER = 0x4,
+ PROTECTION_STATUS_MAGIC_COAT = 0x5,
+ PROTECTION_STATUS_WISH = 0x6,
+ PROTECTION_STATUS_PROTECT = 0x7,
+ PROTECTION_STATUS_MIRROR_COAT = 0x8,
+ PROTECTION_STATUS_ENDURE = 0x9,
+ PROTECTION_STATUS_MINI_COUNTER = 0xA,
+ PROTECTION_STATUS_MIRROR_MOVE = 0xB,
+ PROTECTION_STATUS_CONVERSION_2 = 0xC,
+ PROTECTION_STATUS_VITAL_THROW = 0xD,
+ PROTECTION_STATUS_MIST = 0xE
+};
+
+enum WaitingStatus
+{
+ WAITING_STATUS_CURSED = 1,
+ WAITING_STATUS_DECOY = 2,
+ WAITING_STATUS_SNATCH = 3
+};
+
+enum LinkedStatus
+{
+ LINKED_STATUS_LEECH_SEED = 1,
+ LINKED_STATUS_DESTINY_BOND = 2
+};
+
+enum MoveStatus
+{
+ MOVE_STATUS_SURE_SHOT = 1,
+ MOVE_STATUS_WHIFFER = 2,
+ MOVE_STATUS_SET_DAMAGE = 3,
+ MOVE_STATUS_FOCUS_ENERGY = 4
+};
+
+enum ItemStatus
+{
+ ITEM_STATUS_LONG_TOSS = 1,
+ ITEM_STATUS_PIERCE = 2
+};
+
+enum TransformStatus
+{
+ TRANSFORM_STATUS_INVISIBLE = 1,
+ TRANSFORM_STATUS_TRANSFORMED = 2,
+ TRANSFORM_STATUS_MOBILE = 3
+};
+
+enum EyesightStatus
+{
+ EYESIGHT_STATUS_BLINKER = 1,
+ EYESIGHT_STATUS_CROSS_EYED = 2,
+ EYESIGHT_STATUS_EYEDROPS = 3
+};
+
+enum VolatileStatus
+{
+ VOLATILE_STATUS_CRINGING = 1,
+ VOLATILE_STATUS_CONFUSED = 2,
+ VOLATILE_STATUS_PAUSED = 3,
+ VOLATILE_STATUS_COWERING = 4,
+ VOLATILE_STATUS_TAUNTED = 5,
+ VOLATILE_STATUS_ENCORE = 6,
+ VOLATILE_STATUS_INFATUATED = 7
+};
+
+enum TargetingDecoy
+{
+ TARGETING_DECOY_TEAM = 1,
+ TARGETING_DECOY_WILD = 2
+};
+
+#endif
diff --git a/include/constants/tactic.h b/include/constants/tactic.h
new file mode 100644
index 0000000..4d24b01
--- /dev/null
+++ b/include/constants/tactic.h
@@ -0,0 +1,19 @@
+#ifndef GUARD_CONSTANTS_TACTIC_H
+#define GUARD_CONSTANTS_TACTIC_H
+
+enum Tactic
+{
+ TACTIC_LETS_GO_TOGETHER = 0x0,
+ TACTIC_GO_THE_OTHER_WAY = 0x1,
+ TACTIC_GO_AFTER_FOES = 0x2,
+ TACTIC_AVOID_THE_FIRST_HIT = 0x3,
+ TACTIC_ALL_FOR_ONE = 0x4, // Unused
+ TACTIC_GROUP_SAFETY = 0x5, // Unused
+ TACTIC_AVOID_TROUBLE = 0x6,
+ TACTIC_BE_PATIENT = 0x7,
+ TACTIC_KEEP_YOUR_DISTANCE = 0x8,
+ TACTIC_WAIT_THERE = 0x9,
+ TACTIC_GET_AWAY = 0xA
+};
+
+#endif
diff --git a/include/constants/trap.h b/include/constants/trap.h
new file mode 100644
index 0000000..cbc3454
--- /dev/null
+++ b/include/constants/trap.h
@@ -0,0 +1,28 @@
+#ifndef GUARD_CONSTANTS_TRAP_H
+#define GUARD_CONSTANTS_TRAP_H
+
+enum TrapType
+{
+ TRIP_TRAP = 0x0,
+ MUD_TRAP = 0x1,
+ STICKY_TRAP = 0x2,
+ GRIMY_TRAP = 0x3,
+ SUMMON_TRAP = 0x4,
+ PITFALL_TRAP = 0x5,
+ WARP_TRAP = 0x6,
+ WHIRLWIND_TRAP = 0x7,
+ SPIN_TRAP = 0x8,
+ SLUMBER_TRAP = 0x9,
+ SLOW_TRAP = 0xA,
+ SEAL_TRAP = 0xB,
+ POISON_TRAP = 0xC,
+ SELFDESTRUCT_TRAP = 0xD,
+ EXPLOSION_TRAP = 0xE,
+ PP_ZERO_TRAP = 0xF,
+ CHESTNUT_TRAP = 0x10,
+ WONDER_TILE = 0x11,
+ POKEMON_TRAP = 0x12,
+ SPIKE_TRAP = 0x13
+};
+
+#endif
diff --git a/include/constants/type.h b/include/constants/type.h
new file mode 100644
index 0000000..8c982fd
--- /dev/null
+++ b/include/constants/type.h
@@ -0,0 +1,25 @@
+#ifndef GUARD_CONSTANTS_TYPE_H
+#define GUARD_CONSTANTS_TYPE_H
+
+enum Type
+{
+ TYPE_NORMAL = 0x1,
+ TYPE_FIRE = 0x2,
+ TYPE_WATER = 0x3,
+ TYPE_GRASS = 0x4,
+ TYPE_ELECTRIC = 0x5,
+ TYPE_ICE = 0x6,
+ TYPE_FIGHTING = 0x7,
+ TYPE_POISON = 0x8,
+ TYPE_GROUND = 0x9,
+ TYPE_FLYING = 0xA,
+ TYPE_PSYCHIC = 0xB,
+ TYPE_BUG = 0xC,
+ TYPE_ROCK = 0xD,
+ TYPE_GHOST = 0xE,
+ TYPE_DRAGON = 0xF,
+ TYPE_DARK = 0x10,
+ TYPE_STEEL = 0x11
+};
+
+#endif
diff --git a/include/dungeon_entity.h b/include/dungeon_entity.h
index 9f3033c..e7d0fc1 100644
--- a/include/dungeon_entity.h
+++ b/include/dungeon_entity.h
@@ -1,44 +1,227 @@
#ifndef GUARD_DUNGEON_ENTITY_H
#define GUARD_DUNGEON_ENTITY_H
-struct subStruct_8048524
+#include "item.h"
+#include "constants/move.h"
+
+struct DungeonEntityData
{
- /* 0x0 */ u8 unk0;
- /* 0x1 */ u8 unk1;
- /* 0x2 */ s16 species;
- /* 0x4 */ s16 transformSpecies;
+ // This has different purposes for Pokémon, items, and traps.
+ // Pokemon: MovementFlag
+ // Items: ItemFlag
+ // Traps: TrapType
+ /* 0x0 */ u8 flags;
+ /* 0x1 */ bool8 moving;
+ /* 0x2 */ u16 entityID; // Pokémon species or item ID.
+ // Everything from here on only applies to Pokémon.
+ /* 0x4 */ u16 transformSpecies; // Shows a different Pokémon when using Transform.
/* 0x6 */ bool8 isEnemy;
/* 0x7 */ bool8 isLeader;
- /* 0x8 */ u8 shopKeeper;
+ /* 0x8 */ u8 shopkeeperMode;
/* 0x9 */ u8 level;
- /* 0xA */ u16 partyIndex;
+ /* 0xA */ u8 partyIndex; // Leader is 0, partner is 1, etc.
+ u8 fillB;
/* 0xC */ u16 IQ;
/* 0xE */ s16 HP;
- /* 0x10 */ s16 maxHP;
- /* 0x12 */ s16 bossHPBackup;
- u8 fill14[0x46 - 0x14];
+ /* 0x10 */ u16 maxHP;
+ // Bosses have higher HP than normal for their level. This is the max HP they would normally have given their level.
+ /* 0x12 */ u16 originalHP;
+ /* 0x14 */ u8 attack;
+ /* 0x15 */ u8 specialAttack;
+ /* 0x16 */ u8 defense;
+ /* 0x17 */ u8 specialDefense;
+ /* 0x18 */ u32 expPoints;
+ // Temporary stat boosts/drops from effects like Growl or Swords Dance.
+ // These start at 10 and are in the range [1, 19].
+ /* 0x1C */ s16 attackStage;
+ /* 0x1E */ s16 specialAttackStage;
+ /* 0x20 */ s16 defenseStage;
+ /* 0x22 */ s16 specialDefenseStage;
+ /* 0x24 */ s16 accuracyStage;
+ /* 0x26 */ s16 evasionStage;
+ // // When a Fire-type move is used on a Pokémon with Flash Fire, this value increases the power of the Pokémon's Fire-type moves.
+ /* 0x28 */ s16 flashFireBoost;
+ u8 fill2A[0x2C - 0x2A];
+ // These start at 0x1000, and are halved by certain moves like Screech to lower the corresponding stat.
+ /* 0x2C */ s32 attackMultiplier;
+ /* 0x30 */ s32 specialAttackMultiplier;
+ /* 0x34 */ s32 defenseMultiplier;
+ /* 0x38 */ s32 specialDefenseMultiplier;
+ u8 fill3C[0x3E - 0x3C];
+ /* 0x3E */ u8 hiddenPowerType;
+ u8 fill3F;
+ /* 0x40 */ u8 joinLocation; // Uses the dungeon index in dungeon.h.
+ u8 fill41[0x44 - 0x41];
+ /* 0x44 */ u16 action;
/* 0x46 */ s8 facingDir;
- u8 fill47[0x8C - 0x47];
- u8 unk8C[4];
- u8 fill90[0xA4 - 0x90];
+ u8 fill47;
+ // Additional parameter alongside actionIndex. Used for things like indiciating which move a Pokémon should use from its moveset.
+ /* 0x48 */ u8 actionUseIndex;
+ u8 fill49[0x4C - 0x49];
+ // Position of the Pokémon the last time it threw an item.
+ /* 0x4C */ s16 lastItemThrowPositionX;
+ /* 0x4E */ s16 lastItemThrowPositionY;
+ u8 fill50[0x58 - 0x50];
+ // Position of the target that the Pokémon wants throw an item at.
+ /* 0x58 */ s16 itemTargetPositionX;
+ /* 0x5A */ s16 itemTargetPositionY;
+ /* 0x5C */ u8 type1;
+ /* 0x5D */ u8 type2;
+ /* 0x5E */ u8 ability1;
+ /* 0x5F */ u8 ability2;
+ // Same format as ItemSlot struct.
+ /* 0x60 */ u8 heldItemFlags;
+ /* 0x61 */ u8 heldItemNumItems;
+ /* 0x62 */ u8 heldItemIndex;
+ u8 fill63[0x68 - 0x63];
+ /* 0x68 */ s16 previousPosition1X;
+ /* 0x6A */ s16 previousPosition1Y;
+ /* 0x6C */ s16 previousPosition2X;
+ /* 0x6E */ s16 previousPosition2Y;
+ /* 0x70 */ s16 previousPosition3X;
+ /* 0x72 */ s16 previousPosition3Y;
+ /* 0x74 */ s16 previousPosition4X;
+ /* 0x76 */ s16 previousPosition4Y;
+ /* 0x78 */ u8 movementAction;
+ /* 0x79 */ bool8 notAdjacentToTarget;
+ /* 0x7A */ bool8 hasTarget;
+ /* 0x7B */ bool8 turnAround;
+ /* 0x7C */ u16 targetPokemonSpawnIndex;
+ u8 fill7E[0x80 - 0x7E];
+ /* 0x80 */ u32 targetPokemon;
+ u8 fill84[0x88 - 0x84];
+ /* 0x88 */ s16 targetMovePositionX;
+ /* 0x8A */ s16 targetMovePositionY;
+ // Bitwise flags corresponding to selected IQ skills.
+ /* 0x8C */ u8 IQSkillsSelected[4]; // IQ skills selected in the IQ skills menu.
+ /* 0x90 */ u8 IQSkillsEnabled[4];
+ /* 0x94 */ u8 tactics;
+ u8 fill95[0xA4 - 0x95];
/* 0xA4 */ u8 clientFlags;
- u8 fillA5[0xAC - 0xA5];
- /* 0xAC */ u8 statusCondition;
- u8 fillAD[0xF7 - 0xAD];
+ u8 fillA5[0xA8 - 0xA5];
+ // Statuses are split into groups based on which ones can't overlap.
+ // See status.h for which statuses are in each group.
+ /* 0xA8 */ u8 sleepStatus;
+ /* 0xA9 */ u8 sleepStatusTurnsLeft;
+ u8 fillAA[0xAC - 0xAA];
+ /* 0xAC */ u8 nonVolatileStatus;
+ /* 0xAD */ u8 nonVolatileStatusTurnsLeft;
+ /* 0xAE */ u8 nonVolatileStatusDamageTimer;
+ u8 fillAF;
+ /* 0xB0 */ u8 immobilizeStatus;
+ u8 fillB1[0xB8 - 0xB1];
+ /* 0xB8 */ u8 immobilizeStatusTurnsLeft;
+ /* 0xB9 */ u8 immobilizeStatusDamageTimer;
+ u8 fillBA[0xBC - 0xBA];
+ /* 0xBC */ u8 volatileStatus;
+ /* 0xBD */ u8 volatileStatusTurnsLeft;
+ u8 fillBE[0xC0 - 0xBE];
+ /* 0xC0 */ u8 chargingStatus;
+ /* 0xC1 */ u8 chargingStatusTurnsLeft;
+ /* 0xC2 */ u8 chargingStatusMoveIndex; // The position of the move in the Pokémon's moveset that triggered the status.
+ u8 fillC3;
+ /* 0xC4 */ u8 protectionStatus;
+ /* 0xC5 */ u8 protectionStatusTurnsLeft;
+ u8 fillC6[0xC8 - 0xC6];
+ /* 0xC8 */ u8 waitingStatus;
+ /* 0xC9 */ bool8 enemyDecoy; // True if the Pokémon is a decoy and a wild Pokémon (i.e., not an allied Pokémon).
+ u8 fillCA;
+ /* 0xCB */ u8 waitingStatusTurnsLeft;
+ /* 0xCC */ u8 cursedDamageTimer;
+ u8 fillCD[0xD0 - 0xCD];
+ /* 0xD0 */ u8 linkedStatus;
+ u8 fillD1[0xD9 - 0xD1];
+ /* 0xD9 */ u8 linkedStatusTurnsLeft;
+ /* 0xDA */ u8 linkedStatusDamageTimer;
+ u8 fillDB;
+ /* 0xDC */ u8 moveStatus;
+ /* 0xDD */ u8 moveStatusTurnsLeft;
+ u8 fillDE[0xE0 - 0xDE];
+ /* 0xE0 */ u8 itemStatus;
+ u8 fillE1[0xE4 - 0xE1];
+ /* 0xE4 */ u8 transformStatus;
+ /* 0xE5 */ u8 transformStatusTurnsLeft;
+ u8 fillE6[0xE8 - 0xE6];
+ /* 0xE8 */ u8 eyesightStatus;
+ u8 fillE9;
+ /* 0xEA */ u8 eyesightStatusTurnsLeft;
+ u8 fillEB;
+ /* 0xEC */ bool8 muzzledStatus;
+ /* 0xED */ u8 muzzledTurnsLeft;
+ u8 fillEE[0xF0 - 0xEE];
+ /* 0xF0 */ bool8 radarStatus;
+ /* 0xF1 */ bool8 scanningStatus;
+ /* 0xF2 */ bool8 stairSpotterStatus;
+ u8 fillF3;
+ /* 0xF4 */ bool8 grudgeStatus;
+ /* 0xF5 */ bool8 exposedStatus;
+ u8 fillF7;
/* 0xF7 */ bool8 isBoss;
- u8 fillF8[0xFB - 0xF8];
+ u8 fillF8[0xFA - 0xF8];
+ /* 0xFA */ u8 terrifiedTurnsLeft; // Doubles as a bool for whether the Pokémon is terrified.
u8 unkFB;
- u8 fillFC[0x112 - 0xFC];
+ /* 0xFC */ bool8 forceUseItem; // If true, an AI Pokémon is forced to try using their held item next turn. Unknown when this is set in regular gameplay.
+ /* 0xFD */ u8 perishSongTimer; // When this reaches 0, the Pokémon faints from Perish Song. Doubles as a bool for whether the Pokémon is afflicted by Perish Song.
+ u8 fillFE[0x100 - 0xFE];
+ /* 0x100 */ u8 targetingDecoy; // If the Pokémon is targeting a decoy, this indicates whether the decoy target is a team or wild Pokémon.
+ u8 fill101[0x104 - 0x101];
+ /* 0x104 */ u8 movementSpeed;
+ u8 fill105[0x108 - 0x105];
+ // The turn counter for movement speed up/down is split into five timers each. Multiple timers are used if the Pokémon is affected by multiple
+ // speed-up/slow effects at once, like using Agility twice.
+ /* 0x108 */ u8 speedUpTurnsLeft[5];
+ /* 0x10D */ u8 slowTurnsLeft[5];
/* 0x112 */ u8 stockpileCount;
- u8 fill113[0x13C - 0x113];
+ u8 fill113;
+ // When true, an AI Pokémon will move in a random direction every turn.
+ // Unclear where this is set in-game; it is not set by statuses (e.g., confusion) or mission clients.
+ /* 0x114 */ bool8 moveRandomly;
+ u8 fill115[0x118 - 0x115];
+ /* 0x118 */ struct PokemonMove moves[4];
+ /* 0x138 */ u8 struggleMoveFlags;
+ u8 fill139[0x13C - 0x139];
/* 0x13C */ u32 belly;
- u8 fill140[0x15C - 0x140];
+ /* 0x140 */ u32 maxBelly;
+ /* 0x144 */ bool8 movingIntoTarget; // True if an AI Pokémon is following another Pokémon and is already adjacent to them.
+ /* 0x145 */ bool8 recalculateFollow; // Used by the AI to defer a movement decision until after all other Pokémon have moved.
+ u8 fill146;
+ /* 0x147 */ bool8 waiting; // True if an AI Pokémon decided to do nothing this turn.
+ /* 0x148 */ bool8 attacking;
+ u8 fill149[0x14E - 0x149];
+ /* 0x14E */ u16 visualFlags;
+ /* 0x150 */ u16 previousVisualFlags;
+ u8 fill152[0x15C - 0x152];
u8 unk15C;
u8 unk15D;
u8 unk15E;
u8 unk15F;
- u8 fill160[0x174 - 0x160];
+ u8 fill160[0x16C - 0x160];
+ /* 0x16C */ s16 targetPositionX;
+ /* 0x16E */ s16 targetPositionY;
+ /* 0x170 */ s16 posPixelX;
+ /* 0x172 */ s16 posPixelY;
u32 unk174;
+ u8 fill178[0x184 - 0x178];
+ // Previous value of targetPosition for movement, 1 and 2 moves ago.
+ /* 0x184 */ s16 previousTargetMovePosition1X;
+ /* 0x186 */ s16 previousTargetMovePosition1Y;
+ /* 0x188 */ s32 previousTargetMovePosition2X;
+ /* 0x18C */ s32 previousTargetMovePosition2Y;
+ /* 0x190 */ u8 lastMoveDirection; // The last direction that the Pokémon moved in.
+ u8 fill191[0x194 - 0x191];
+ // Number of tiles that the Pokémon moved last, multiplied by 0x100.
+ /* 0x194 */ s32 lastMoveIncrementX;
+ /* 0x198 */ s32 lastMoveIncrementY;
+ /* 0x19C */ u8 walkAnimationCounter; // Set when the Pokémon starts moving, and counts down until the Pokémon's walk animation stops.
+ u8 fill19D[0x1F4 - 0x19D];
+ /* 0x1F4 */ u8 numMoveTiles; // Number of tiles to move in a turn. Can be greater than 1 if the user's movement speed is boosted.
+ u8 fill1F5;
+ /* 0x1F6 */ bool8 notMoving;
+ u8 fill1F7[0x1FA - 0x1F7];
+ /* 0x1FA */ u8 mobileTurnTimer; // When a Pokémon can pass through walls in a hallway, this counts up to 200 before the Pokémon turns in a random direction.
+ u8 fill1FB;
+ /* 0x1FC */ u16 expGainedInTurn; // Used to accumulate experience when multiple enemies are defeated in one turn.
+ u8 fill1FE[0x208 - 0x1FE];
};
// Used for Pokémon, items, and traps.
@@ -57,7 +240,7 @@ struct DungeonEntity
/* 0x14 */ s32 prevPosPixelX;
/* 0x18 */ s32 prevPosPixelY;
u8 fill1C[0x20 - 0x1C];
- /* 0x20 */ bool8 active; // Turned off when a Pokémon faints.
+ /* 0x20 */ bool8 visible; // Turned off when a Pokémon faints.
u8 fill21[0x25 - 0x21];
/* 0x25 */ u8 roomIndex;
// The global spawn index counter starts at 10. Each Pokémon that spawns increments the counter and
@@ -89,10 +272,10 @@ struct DungeonEntity
u8 fill52[0x54 - 0x52];
/* 0x54 */ u16 spriteGlobalIndex;
u8 fill56[0x6C - 0x56];
- /* 0x6C */ u8 facingDirection;
- /* 0x6D */ u8 facingDirection2; // Duplicate of 0x6C?
+ /* 0x6C */ u8 facingDir;
+ /* 0x6D */ u8 facingDir2; // Duplicate of 0x6C?
u8 fill6D[0x70 - 0x6D];
- struct subStruct_8048524 *unk70;
+ /* 0x70 */ struct DungeonEntityData *entityData;
};
enum EntityType
@@ -102,16 +285,42 @@ enum EntityType
ENTITY_TRAP = 3
};
-enum FacingDirection
+enum MovementFlag
+{
+ MOVEMENT_FLAG_SWAPPED_PLACES = 1 << 5,
+ MOVEMENT_FLAG_SWAPPED_PLACES_PETRIFIED = 1 << 15 // Set if the Pokémon is petrified and the leader cures them by swapping places.
+};
+
+enum ShopkeeperMode
+{
+ SHOPKEEPER_FRIENDLY = 1,
+ // These two modes trigger if an explosion damages the shopkeeper. The shopkeeper attacks the side that damaged it.
+ SHOPKEEPER_AGGRESSIVE_TO_WILD = 2,
+ SHOPKEEPER_AGGRESSIVE_TO_PLAYER = 3
+};
+
+enum MovementAction
+{
+ MOVEMENT_ACTION_FOLLOW = 1,
+ MOVEMENT_ACTION_WANDER = 2,
+ MOVEMENT_ACTION_RUN_AWAY_WANDER = 3,
+ MOVEMENT_ACTION_EXIT_ROOM = 4,
+ MOVEMENT_ACTION_RUN_AWAY_FROM_ENEMY = 5,
+ MOVEMENT_ACTION_FACE_RANDOM_DIRECTION = 6,
+ MOVEMENT_ACTION_TAKE_ITEM = 7
+};
+
+enum ClientFlag
+{
+ CLIENT_FLAGS_CLIENT = 1, // Used for mission clients that need rescuing.
+ CLIENT_FLAGS_DONT_MOVE = 3 // Used for Diglett in the Skarmory boss fight.
+};
+
+enum VisualFlag
{
- SOUTH,
- SOUTHEAST,
- EAST,
- NORTHEAST,
- NORTH,
- NORTHWEST,
- WEST,
- SOUTHWEST
+ // Set if Run Away's visual effect (green smoke cloud) has been triggered on this floor.
+ // Prevents the effect from showing again if the Pokémon stops running away and then starts running away again.
+ VISUAL_FLAG_RUN_AWAY = 2
};
#endif
diff --git a/include/dungeon_global_data.h b/include/dungeon_global_data.h
new file mode 100644
index 0000000..17f4b3a
--- /dev/null
+++ b/include/dungeon_global_data.h
@@ -0,0 +1,93 @@
+#ifndef GUARD_DUNGEON_DATA_H
+#define GUARD_DUNGEON_DATA_H
+
+#define DUNGEON_MAX_SIZE_X 55
+#define DUNGEON_MAX_SIZE_Y 31
+
+#include "constants/species.h"
+#include "dungeon_entity.h"
+#include "map.h"
+
+struct DungeonGlobalData
+{
+ u8 unk0;
+ u8 unk1;
+ u8 unk2;
+ u8 unk3;
+ u8 unk4;
+ u8 fill5[0x7 - 0x5];
+ u8 unk7;
+ u8 fill8[0xF - 0x8];
+ /* 0xF */ bool8 inputAllowed; // Whether the game is currently accepting input. Set to false while action animations play.
+ u8 fill10;
+ u8 unk11;
+ u8 fill12[0x16D - 0x12];
+ u8 unk16D;
+ u8 fill16E[0x179 - 0x16E];
+ /* 0x179 */ bool8 pokemonExposed; // True if a Pokémon on the floor has the Exposed status.
+ u8 fill17A[0x645 - 0x17A];
+ /* 0x645 */ u8 floorNumber;
+ u8 fill646[0x65C - 0x646];
+ u8 unk65C;
+ u8 fill65D[0x660 - 0x65D];
+ /* 0x660 */ u8 speedTurnCounter; // Handles turn order when Pokémon have different movement speeds.
+ u8 fill661[0x666 - 0x661];
+ /* 0x666 */ u16 turnsLeft; // Turns remaining before getting swept out of the dungeon.
+ u8 fill668[0x66A - 0x668];
+ u16 unk66A;
+ u8 fill66C[0x671 - 0x66C];
+ /* 0x671 */ bool8 monsterHouseActive;
+ u8 fill672[0x363C - 0x672];
+ /* 0x363C */ u8 expYieldRankings[NUM_SPECIES];
+ u8 fill37E3[0x37FC - 0x37D9];
+ /* 0x37FC */ bool8 decoyActive;
+ u8 fill37FD[0x3A0E - 0x37FD];
+ /* 0x3A0E */ s16 tileset;
+ u8 fill3A10[0x3A14 - 0x3A10];
+ /* 0x3A14 */ s16 bossBattleIndex;
+ u8 fill3A16[0x3A18 - 0x3A16];
+ /* 0x3A18 */ struct MapTile mapTiles[DUNGEON_MAX_SIZE_X * DUNGEON_MAX_SIZE_Y];
+ u8 fill54BC[0xE23C - 0xD9F0];
+ s16 unkE23C;
+ s16 unkE23E;
+ u8 fillE240[0xE264 - 0xE240];
+ /* 0xE264 */ u8 weather; // Uses the weather constants in weather.h.
+ u8 unkE265;
+ /* 0xE266 */ u8 weatherDamageTimer; // Timer for applying sandstorm/hail damage periodically.
+ u8 fillE266[0xE26B - 0xE267];
+ u8 unkE26B;
+ u8 weatherTurnsLeft;
+ u8 fillE26D[0xE270 - 0xE26D];
+ /* 0xE270 */ u8 startingWeather; // The weather at the start of the floor. If the weather changes, then expires, revert back to the starting weather.
+ u8 fillE271[0xE277 - 0xE271];
+ /* 0xE277 */ u8 mudSportTurnsLeft;
+ /* 0xE278 */ u8 waterSportTurnsLeft;
+ u8 fillE279[0xE8C0 - 0xE279];
+ /* 0xE8C0 */ u32 mapEntityPointers[DUNGEON_MAX_SIZE_X * DUNGEON_MAX_SIZE_Y];
+ u8 fill10364[0x10844 - 0x10364];
+ /* 0x10844 */ u16 numRoomExits[MAX_ROOM_COUNT];
+ u8 fill10874[0x10884 - 0x10874];
+ /* 0x10884 */ struct RoomExit roomExits[MAX_ROOM_COUNT][32]; // Arrays of room exits for each room.
+ u8 fill11444[0x1356C - 0x11484];
+ u8 unk1356C;
+ u8 fill1356D[0x1357C - 0x1356D];
+ /* 0x1357C */ struct DungeonEntity *teamPokemon[4];
+ /* 0x1358C */ struct DungeonEntity *wildPokemon[0x10];
+ /* 0x135CC */ struct DungeonEntity *allPokemon[0x14]; // Contains both team and wild Pokémon
+ /* 0x1361C */ struct DungeonEntity *clientPokemon[2]; // Not sure how large this array is.
+ u8 fill13624[0x181F8 - 0x13624];
+ /* 0x181F8 */ struct DungeonEntity *leader; // Pointer to the team leader.
+ u32 unk181FC;
+ u32 unk18200;
+ u32 unk18204;
+ u8 unk18208;
+ /* 0x18209 */ u8 visibility; // Dungeon light level.
+ /* 0x1820A */ bool8 displayBlinker; // Blacks out the screen when the player has the Blinker status.
+ u8 unk1820B;
+ u32 unk1820C;
+ /* 0x18210 */ bool8 displayCrossEyed; // Displays Subsitute and flower sprites when the player has the Cross-Eyed status.
+ u8 fill18211[0x18217 - 0x18211];
+ u8 unk18217;
+};
+
+#endif
diff --git a/include/gUnknown_203B418.h b/include/gUnknown_203B418.h
deleted file mode 100644
index e022b4b..0000000
--- a/include/gUnknown_203B418.h
+++ /dev/null
@@ -1,47 +0,0 @@
-#ifndef GUARD_GUNKNOWN_203B418_H
-#define GUARD_GUNKNOWN_203B418_H
-
-#include "dungeon_entity.h"
-
-struct unkStruct_203B418
-{
- u8 unk0;
- u8 unk1;
- u8 unk2;
- u8 unk3;
- u8 unk4;
- u8 fill5[2];
- u8 unk7;
- u8 fill8[0x11 - 8];
- u8 unk11;
- u8 fill12[0x16D - 0x12];
- u8 unk16D;
- u8 fill16E[0x65C - 0x16E];
- u8 unk65C;
- u8 fill65D[0x66A - 0x65D];
- u16 unk66A;
- u8 fill66B[0xE23C - 0x66C];
- s16 unkE23C;
- s16 unkE23E;
- u8 fillE240[0xE265 - 0xE240];
- u8 unkE265;
- u8 fillE266[0xE26B - 0xE266];
- u8 unkE26B;
- u8 unkE26C;
- u8 fillE26D[0x1356C - 0xE26D];
- u8 unk1356C;
- u8 fill1356D[0x1358C - 0x1356D];
- struct DungeonEntity *unk1358C[0x10];
- u8 fill135CC[0x181FC - 0x135CC];
- u32 unk181FC;
- u32 unk18200;
- u32 unk18204;
- u8 unk18208[3];
- u8 unk1820B;
- u32 unk1820C;
- u32 unk18210;
- u8 padding2[3];
- u8 unk18217;
-};
-
-#endif
diff --git a/include/item.h b/include/item.h
index 84f9de2..1d81116 100644
--- a/include/item.h
+++ b/include/item.h
@@ -12,8 +12,11 @@ struct Item
/* 0xD */ u8 icon;
/* 0xE */ u16 fill;
/* 0x10 */ u8 *descriptionPointer;
- /* 0x14 */ bool8 unkFood1[2];
- /* 0x16 */ u8 throwDmg;
+ // Determines how the AI can use the item.
+ // Index 0: Item can be used on self.
+ // Index 1: Item can be thrown at allies.
+ // Index 2: Item can be thrown at enemies.
+ /* 0x14 */ bool8 aiFlags[3];
/* 0x17 */ u8 fill2;
/* 0x18 */ s16 move;
/* 0x1A */ u8 order; // Numbered order they are in storage
@@ -25,7 +28,7 @@ struct Item
struct ItemSlot
{
- u8 unk0; // some sort of flags, bit 0 seems to indicate an empty slot
+ u8 itemFlags;
u8 numItems;
u8 itemIndex;
};
@@ -84,6 +87,14 @@ enum ItemCategory
ITEM_CATEGORY_ORBS
};
+enum ItemFlag
+{
+ ITEM_FLAG_EXISTS = 1 << 0,
+ ITEM_FLAG_FOR_SALE = 1 << 1,
+ ITEM_FLAG_STICKY = 1 << 3,
+ ITEM_FLAG_SET = 1 << 4 // This item can be thrown by pressing L+R instead of having to go to the bag menu.
+};
+
// see https://bulbapedia.bulbagarden.net/wiki/List_of_items_by_index_number_(Rescue_Team)
enum ItemID {
ITEM_ID_NOTHING,
@@ -343,7 +354,7 @@ u8 GetItemPalette(u8 itemIndex);
u8 GetItemCategory(u8 itemIndex);
u32 GetItemUnkThrow(u8 itemIndex, u32 r1);
u8 *GetItemDescription(u8 itemIndex);
-u32 GetItemUnkFood(u8 itemIndex, u32 r1);
+u32 GetItemAIFlags(u8 itemIndex, u32 r1);
s32 GetNumberOfFilledInventorySlots(void);
bool8 IsThrowableItem(u8 itemIndex);
void xxx_init_itemslot_8090A8C(struct ItemSlot *param_1,u8 itemIndex,u8 param_3);
diff --git a/include/map.h b/include/map.h
new file mode 100644
index 0000000..d3d1ed9
--- /dev/null
+++ b/include/map.h
@@ -0,0 +1,61 @@
+#ifndef GUARD_MAP_H
+#define GUARD_MAP_H
+
+#include "dungeon_entity.h"
+
+#define MAX_ROOM_COUNT 24 // Empirical max, not sure if the code supports any more.
+
+struct MapTile
+{
+ /* 0x0 */ u8 tileFlags;
+ /* 0x1 */ bool8 stairs;
+ u8 fill2[0x9 - 0x2];
+ /* 0x9 */ u8 roomIndex;
+ // Bitwise flags for whether Pokémon can move to an adjacent tile. Bits correspond to directions in direction.h.
+ // Different sets of flags are used for Pokémon that can cross special terrain.
+ /* 0xA */ u8 canMoveAdjacent;
+ /* 0xB */ u8 canMoveAdjacentLiquid;
+ /* 0xC */ u8 canMoveAdjacentCrevice;
+ /* 0xD */ u8 canMoveAdjacentWall;
+ u8 fillE[0x10 - 0xE];
+ /* 0x10 */ struct DungeonEntity *pokemon; // Pokémon on the tile.
+ /* 0x14 */ struct DungeonEntity *mapObject; // Item or trap on the tile.
+};
+
+struct MapRoom
+{
+ u8 fill0[0x2 - 0x0];
+ // All coordinates are inclusive.
+ /* 0x2 */ s16 startX;
+ /* 0x4 */ s16 startY;
+ /* 0x6 */ s16 endX;
+ /* 0x8 */ s16 endY;
+ u8 fillA[0x1C - 0xA];
+};
+
+struct RoomExit
+{
+ s16 x;
+ s16 y;
+};
+
+enum TileFlag
+{
+ TILE_TYPE_FLOOR = 1 << 0,
+ TILE_TYPE_LIQUID = 1 << 2, // Water or lava depending on the dungeon.
+ TILE_TYPE_ROOM_EXIT = 1 << 3,
+ TILE_TYPE_MAP_EDGE = 1 << 4,
+ TILE_TYPE_SHOP = 1 << 5,
+ TILE_TYPE_MONSTER_HOUSE = 1 << 6,
+ TILE_TYPE_STAIRS = 1 << 9
+};
+
+enum CrossableTerrain
+{
+ CROSSABLE_TERRAIN_REGULAR = 0,
+ CROSSABLE_TERRAIN_LIQUID = 1,
+ CROSSABLE_TERRAIN_CREVICE = 2,
+ CROSSABLE_TERRAIN_WALL = 3,
+};
+
+#endif
diff --git a/include/pokemon.h b/include/pokemon.h
index 874aa93..3df33b6 100644
--- a/include/pokemon.h
+++ b/include/pokemon.h
@@ -24,7 +24,7 @@ struct unkPokeSubStruct_4 {
u16 fill6;
};
-struct unkPokeSubStruct_2C
+struct unkPokeSubStruct_2C
{
u8 unk0;
u8 fill1;
@@ -138,13 +138,13 @@ struct gPokemon
/* 0x10 */ u16 dialogue_sprites;
/* 0x12 */ u8 unk12;
/* 0x13 */ u8 types[2];
- /* 0x15 */ u8 walkable_tiles;
+ /* 0x15 */ u8 walkable_tiles; // Uses the CrossableTerrain enum in map.h.
/* 0x16 */ u8 friend_area;
/* 0x17 */ u8 abilities[2];
/* 0x19 */ u8 shadow_size;
/* 0x1A */ u8 unk1A;
/* 0x1B */ u8 unk1B;
- /* 0x1C */ bool8 isMoving;
+ /* 0x1C */ bool8 isMoving; // Set to false for Pokémon who don't move unless they're the leader, like Kakuna.
/* 0x1D */ u8 unk1D;
/* 0x1E */ u16 base_hp;
/* 0x20 */ s32 base_exp;
@@ -155,7 +155,7 @@ struct gPokemon
/* 0x30 */ u8 unk30;
/* 0x31 */ u8 unk31;
/* 0x32 */ u8 unk32;
- /* 0x33 */ bool8 unk33;
+ /* 0x33 */ bool8 toolboxEnabled; // If false, the AI can't use items. Doesn't seem to be used, as it's true for all Pokémon.
/* 0x34 */ struct EvolveStruct1 pre;
/* 0x38 */ struct EvolveNeeds need;
/* 0x3C */ s16 dexInternal[2]; // dexNo and internalNo
@@ -165,7 +165,7 @@ struct gPokemon
// https://www.pokecommunity.com/showthread.php?t=407371
-struct LevelData
+struct LevelData
{
s32 expRequired;
u8 gainHP;
@@ -177,19 +177,18 @@ struct LevelData
u16 fillA;
};
-struct unkStruct_808E218_arg
+struct unkStruct_808E218_arg
{
u16 unk0[NUM_SPECIES];
u32 count;
};
-struct unkStruct_808E218
+struct unkStruct_808E218
{
// leveldata? (same size)
struct unkStruct_808E6F4 unk0[3];
};
-
void LoadMonsterParameters(void);
struct unkStruct_203B45C *GetRecruitedPokemon(void);
void InitializeRecruitedPokemon(void);
@@ -212,7 +211,7 @@ u16 GetLowKickDmg(s16 index);
u16 GetSizeOrbDmg(s16 index);
u8 GetFriendArea(s16 index);
u16 GetBaseHP(s16 index);
-bool8 GetUnk33(s16 index);
+bool8 IsToolboxEnabled(s16 index);
u8 GetUnk12(s16 index);
s16 GetPokemonEvolveFrom(s16 index);
u16 GetPokemonAttSpatt(s16 index, u32 r1);
@@ -237,4 +236,4 @@ void SavePokemonStruct(struct unkStruct_8094924* a1, struct PokemonStruct* pokem
void RestorePokemonStruct(struct unkStruct_8094924*, struct PokemonStruct*);
-#endif // GUARD_POKEMON_H
+#endif // GUARD_POKEMON_H