summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/battle.h1008
-rw-r--r--include/battle_2.h55
-rw-r--r--include/battle_ai_script_commands.h13
-rw-r--r--include/battle_ai_switch_items.h17
-rw-r--r--include/battle_anim.h118
-rw-r--r--include/battle_controllers.h278
-rw-r--r--include/battle_dome_cards.h13
-rw-r--r--include/battle_gfx_sfx_util.h50
-rw-r--r--include/battle_interface.h75
-rw-r--r--include/battle_message.h235
-rw-r--r--include/battle_script_commands.h66
-rw-r--r--include/battle_scripts.h290
-rw-r--r--include/battle_setup.h18
-rw-r--r--include/battle_string_ids.h387
-rw-r--r--include/battle_tower.h6
-rw-r--r--include/battle_transition.h6
-rw-r--r--include/battle_util.h84
-rw-r--r--include/battle_util2.h10
-rw-r--r--include/berry.h73
-rw-r--r--include/bg.h85
-rw-r--r--include/blend_palette.h12
-rw-r--r--include/calculate_base_damage.h6
-rw-r--r--include/coins.h12
-rw-r--r--include/config.h12
-rw-r--r--include/constants/abilities.h83
-rw-r--r--include/constants/battle_move_effects.h219
-rw-r--r--include/constants/decorations.h126
-rw-r--r--include/constants/easy_chat.h1079
-rw-r--r--include/constants/flags.h1578
-rw-r--r--include/constants/game_stat.h59
-rw-r--r--include/constants/hold_effects.h72
-rw-r--r--include/constants/items.h393
-rw-r--r--include/constants/map_objects.h263
-rw-r--r--include/constants/maps.h595
-rw-r--r--include/constants/moves.h362
-rw-r--r--include/constants/songs.h465
-rw-r--r--include/constants/species.h450
-rw-r--r--include/constants/vars.h288
-rw-r--r--include/data2.h20
-rw-r--r--include/daycare.h27
-rw-r--r--include/decompress.h33
-rw-r--r--include/diploma.h6
-rw-r--r--include/dma3.h10
-rw-r--r--include/easy_chat.h39
-rw-r--r--include/egg_hatch.h10
-rw-r--r--include/event_data.h52
-rw-r--r--include/event_scripts.h375
-rw-r--r--include/evolution_graphics.h15
-rw-r--r--include/evolution_scene.h10
-rw-r--r--include/field_camera.h28
-rw-r--r--include/field_door.h11
-rw-r--r--include/field_effect.h78
-rw-r--r--include/field_effect_helpers.h16
-rw-r--r--include/field_fadetransition.h12
-rw-r--r--include/field_ground_effect.h22
-rw-r--r--include/field_map_obj.h84
-rw-r--r--include/field_map_obj_helpers.h7
-rw-r--r--include/field_message_box.h10
-rw-r--r--include/field_player_avatar.h16
-rw-r--r--include/field_poison.h19
-rw-r--r--include/field_screen.h14
-rw-r--r--include/field_screen_effect.h8
-rw-r--r--include/field_specials.h6
-rw-r--r--include/field_tasks.h6
-rw-r--r--include/field_weather.h12
-rw-r--r--include/fieldmap.h19
-rw-r--r--include/fldeff_80F9BCC.h14
-rw-r--r--include/gba/gba.h13
-rw-r--r--include/gba/isagbprint.h36
-rw-r--r--include/global.berry.h76
-rw-r--r--include/global.fieldmap.h336
-rw-r--r--include/global.h620
-rw-r--r--include/gpu_regs.h19
-rw-r--r--include/graphics.h144
-rw-r--r--include/hall_of_fame.h9
-rw-r--r--include/heal_location.h25
-rw-r--r--include/international_string_util.h23
-rw-r--r--include/item.h64
-rw-r--r--include/item_icon.h17
-rw-r--r--include/item_menu.h12
-rw-r--r--include/item_menu_icons.h6
-rw-r--r--include/librfu.h108
-rw-r--r--include/link.h198
-rw-r--r--include/list_menu.h56
-rw-r--r--include/load_save.h24
-rw-r--r--include/m4a.h20
-rw-r--r--include/mail.h23
-rw-r--r--include/mail_data.h12
-rw-r--r--include/main.h64
-rw-r--r--include/malloc.h20
-rw-r--r--include/map_name_popup.h11
-rw-r--r--include/map_obj_8097404.h32
-rw-r--r--include/map_obj_lock.h11
-rw-r--r--include/menu.h38
-rw-r--r--include/menu_helpers.h20
-rw-r--r--include/menu_indicators.h12
-rw-r--r--include/metatile_behavior.h149
-rw-r--r--include/metatile_behaviors.h179
-rw-r--r--include/money.h20
-rw-r--r--include/multiboot.h21
-rw-r--r--include/mystery_event_script.h8
-rw-r--r--include/naming_screen.h12
-rw-r--r--include/new_game.h16
-rw-r--r--include/new_menu_helpers.h18
-rw-r--r--include/overworld.h74
-rw-r--r--include/palette.h71
-rw-r--r--include/party_menu.h18
-rw-r--r--include/play_time.h10
-rw-r--r--include/player_pc.h12
-rw-r--r--include/pokeball.h32
-rw-r--r--include/pokedex.h23
-rw-r--r--include/pokemon.h663
-rw-r--r--include/pokemon_3.h7
-rw-r--r--include/pokemon_icon.h12
-rw-r--r--include/pokemon_item_effects.h62
-rw-r--r--include/pokemon_size_record.h14
-rw-r--r--include/pokemon_storage_system.h13
-rw-r--r--include/pokenav.h6
-rw-r--r--include/random.h18
-rw-r--r--include/region_map.h314
-rw-r--r--include/reshow_battle_screen.h7
-rw-r--r--include/roamer.h17
-rw-r--r--include/rom6.h15
-rw-r--r--include/rom_818CFC8.h11
-rw-r--r--include/rom_81BE66C.h12
-rw-r--r--include/safari_zone.h19
-rw-r--r--include/save.h97
-rw-r--r--include/save_location.h9
-rw-r--r--include/script.h64
-rw-r--r--include/script_menu.h13
-rw-r--r--include/script_movement.h8
-rw-r--r--include/script_pokemon_80F8.h10
-rw-r--r--include/script_pokemon_81B9.h6
-rw-r--r--include/shop.h10
-rw-r--r--include/slot_machine.h6
-rw-r--r--include/songs.h466
-rw-r--r--include/sound.h48
-rw-r--r--include/sprite.h302
-rw-r--r--include/start_menu.h6
-rw-r--r--include/string_util.h42
-rw-r--r--include/strings.h91
-rw-r--r--include/task.h33
-rw-r--r--include/text.h255
-rw-r--r--include/text_window.h22
-rw-r--r--include/tilesets.h13
-rw-r--r--include/trainer_classes.h74
-rw-r--r--include/trainer_front_sprites.h101
-rw-r--r--include/trainer_ids.h7
-rw-r--r--include/trainer_see.h8
-rw-r--r--include/trig.h11
-rw-r--r--include/unk_text_util.h9
-rw-r--r--include/unknown_task.h22
-rw-r--r--include/util.h17
-rw-r--r--include/wild_encounter.h44
-rw-r--r--include/window.h72
155 files changed, 15702 insertions, 6 deletions
diff --git a/include/battle.h b/include/battle.h
new file mode 100644
index 000000000..7c8c81f52
--- /dev/null
+++ b/include/battle.h
@@ -0,0 +1,1008 @@
+#ifndef GUARD_BATTLE_H
+#define GUARD_BATTLE_H
+
+// should they be included here or included individually by every file?
+#include "battle_util.h"
+#include "battle_script_commands.h"
+#include "battle_2.h"
+#include "battle_ai_switch_items.h"
+#include "battle_gfx_sfx_util.h"
+#include "battle_util2.h"
+
+/*
+ Banks are a name given to what could be called a 'battlerId' or 'monControllerId'.
+ Each bank has a value consisting of two bits.
+ 0x1 bit is responsible for the side, 0 = player's side, 1 = opponent's side.
+ 0x2 bit is responsible for the id of sent out pokemon. 0 means it's the first sent out pokemon, 1 it's the second one. (Triple battle didn't exist at the time yet.)
+*/
+
+#define BATTLE_BANKS_COUNT 4
+
+#define IDENTITY_PLAYER_MON1 0
+#define IDENTITY_OPPONENT_MON1 1
+#define IDENTITY_PLAYER_MON2 2
+#define IDENTITY_OPPONENT_MON2 3
+
+#define SIDE_PLAYER 0x0
+#define SIDE_OPPONENT 0x1
+
+#define BIT_SIDE 0x1
+#define BIT_MON 0x2
+
+#define GET_BANK_IDENTITY(bank)((gBanksByIdentity[bank]))
+#define GET_BANK_SIDE(bank)((GetBankIdentity(bank) & BIT_SIDE))
+#define GET_BANK_SIDE2(bank)((GET_BANK_IDENTITY(bank) & BIT_SIDE))
+
+#define BATTLE_TYPE_DOUBLE 0x0001
+#define BATTLE_TYPE_LINK 0x0002
+#define BATTLE_TYPE_WILD 0x0004
+#define BATTLE_TYPE_TRAINER 0x0008
+#define BATTLE_TYPE_FIRST_BATTLE 0x0010
+#define BATTLE_TYPE_20 0x0020
+#define BATTLE_TYPE_MULTI 0x0040
+#define BATTLE_TYPE_SAFARI 0x0080
+#define BATTLE_TYPE_BATTLE_TOWER 0x0100
+#define BATTLE_TYPE_WALLY_TUTORIAL 0x0200
+#define BATTLE_TYPE_ROAMER 0x0400
+#define BATTLE_TYPE_EREADER_TRAINER 0x0800
+#define BATTLE_TYPE_KYOGRE_GROUDON 0x1000
+#define BATTLE_TYPE_LEGENDARY 0x2000
+#define BATTLE_TYPE_REGI 0x4000
+#define BATTLE_TYPE_TWO_OPPONENTS 0x8000
+#define BATTLE_TYPE_DOME 0x10000
+#define BATTLE_TYPE_PALACE 0x20000
+#define BATTLE_TYPE_ARENA 0x40000
+#define BATTLE_TYPE_FACTORY 0x80000
+#define BATTLE_TYPE_x100000 0x100000
+#define BATTLE_TYPE_PYRAMID 0x200000
+#define BATTLE_TYPE_INGAME_PARTNER 0x400000
+#define BATTLE_TYPE_x800000 0x800000
+#define BATTLE_TYPE_RECORDED 0x1000000
+#define BATTLE_TYPE_x2000000 0x2000000
+#define BATTLE_TYPE_x4000000 0x4000000
+#define BATTLE_TYPE_SECRET_BASE 0x8000000
+#define BATTLE_TYPE_GROUDON 0x10000000
+#define BATTLE_TYPE_KYORGE 0x20000000
+#define BATTLE_TYPE_RAYQUAZA 0x40000000
+#define BATTLE_TYPE_x80000000 0x80000000
+
+#define TRAINER_OPPONENT_3FE 0x3FE
+#define TRAINER_OPPONENT_C00 0xC00
+#define TRAINER_OPPONENT_800 0x800
+#define STEVEN_PARTNER_ID 0xC03
+#define SECRET_BASE_OPPONENT 0x400
+
+#define BATTLE_TYPE_FRONTIER (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_DOME | BATTLE_TYPE_PALACE | BATTLE_TYPE_ARENA | BATTLE_TYPE_FACTORY | BATTLE_TYPE_x100000 | BATTLE_TYPE_PYRAMID)
+#define BATTLE_TYPE_FRONTIER_NO_PYRAMID (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_DOME | BATTLE_TYPE_PALACE | BATTLE_TYPE_ARENA | BATTLE_TYPE_FACTORY | BATTLE_TYPE_x100000)
+
+#define BATTLE_WON 0x1
+#define BATTLE_LOST 0x2
+#define BATTLE_DREW 0x3
+#define BATTLE_RAN 0x4
+#define BATTLE_PLAYER_TELEPORTED 0x5
+#define BATTLE_POKE_FLED 0x6
+#define BATTLE_CAUGHT 0x7
+#define BATTLE_SAFARI_OUT_OF_BALLS 0x8
+#define BATTLE_FORFEITED 0x9
+#define BATTLE_OPPONENT_TELEPORTED 0xA
+
+#define OUTCOME_LINK_BATTLE_RUN 0x80
+
+#define STATUS_NONE 0x0
+#define STATUS_SLEEP 0x7
+#define STATUS_POISON 0x8
+#define STATUS_BURN 0x10
+#define STATUS_FREEZE 0x20
+#define STATUS_PARALYSIS 0x40
+#define STATUS_TOXIC_POISON 0x80
+#define STATUS_TOXIC_COUNTER 0xF00
+
+#define STATUS_PSN_ANY ((STATUS_POISON | STATUS_TOXIC_POISON))
+#define STATUS_ANY ((STATUS_SLEEP | STATUS_POISON | STATUS_BURN | STATUS_FREEZE | STATUS_PARALYSIS | STATUS_TOXIC_POISON))
+
+#define STATUS2_CONFUSION 0x00000007
+#define STATUS2_FLINCHED 0x00000008
+#define STATUS2_UPROAR 0x00000070
+#define STATUS2_BIDE 0x00000300 // two bits 0x100, 0x200
+#define STATUS2_LOCK_CONFUSE 0x00000C00
+#define STATUS2_MULTIPLETURNS 0x00001000
+#define STATUS2_WRAPPED 0x0000E000
+#define STATUS2_INFATUATION 0x000F0000 // 4 bits, one for every bank
+#define STATUS2_INFATUATED_WITH(bank)((gBitTable[bank] << 16))
+#define STATUS2_FOCUS_ENERGY 0x00100000
+#define STATUS2_TRANSFORMED 0x00200000
+#define STATUS2_RECHARGE 0x00400000
+#define STATUS2_RAGE 0x00800000
+#define STATUS2_SUBSTITUTE 0x01000000
+#define STATUS2_DESTINY_BOND 0x02000000
+#define STATUS2_ESCAPE_PREVENTION 0x04000000
+#define STATUS2_NIGHTMARE 0x08000000
+#define STATUS2_CURSED 0x10000000
+#define STATUS2_FORESIGHT 0x20000000
+#define STATUS2_DEFENSE_CURL 0x40000000
+#define STATUS2_TORMENT 0x80000000
+
+#define STATUS3_LEECHSEED_BANK 0x3
+#define STATUS3_LEECHSEED 0x4
+#define STATUS3_ALWAYS_HITS 0x18 // two bits
+#define STATUS3_PERISH_SONG 0x20
+#define STATUS3_ON_AIR 0x40
+#define STATUS3_UNDERGROUND 0x80
+#define STATUS3_MINIMIZED 0x100
+#define STATUS3_ROOTED 0x400
+#define STATUS3_CHARGED_UP 0x200
+#define STATUS3_YAWN 0x1800 // two bits
+#define STATUS3_IMPRISONED_OTHERS 0x2000
+#define STATUS3_GRUDGE 0x4000
+#define STATUS3_CANT_SCORE_A_CRIT 0x8000
+#define STATUS3_MUDSPORT 0x10000
+#define STATUS3_WATERSPORT 0x20000
+#define STATUS3_UNDERWATER 0x40000
+#define STATUS3_INTIMIDATE_POKES 0x80000
+#define STATUS3_TRACE 0x100000
+
+#define STATUS3_SEMI_INVULNERABLE ((STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER))
+
+#define HITMARKER_x10 0x00000010
+#define HITMARKER_x20 0x00000020
+#define HITMARKER_DESTINYBOND 0x00000040
+#define HITMARKER_NO_ANIMATIONS 0x00000080
+#define HITMARKER_IGNORE_SUBSTITUTE 0x00000100
+#define HITMARKER_NO_ATTACKSTRING 0x00000200
+#define HITMARKER_ATTACKSTRING_PRINTED 0x00000400
+#define HITMARKER_NO_PPDEDUCT 0x00000800
+#define HITMARKER_PURSUIT_TRAP 0x00001000
+#define HITMARKER_IGNORE_SAFEGUARD 0x00002000
+#define HITMARKER_SYNCHRONISE_EFFECT 0x00004000
+#define HITMARKER_RUN 0x00008000
+#define HITMARKER_IGNORE_ON_AIR 0x00010000
+#define HITMARKER_IGNORE_UNDERGROUND 0x00020000
+#define HITMARKER_IGNORE_UNDERWATER 0x00040000
+#define HITMARKER_UNABLE_TO_USE_MOVE 0x00080000
+#define HITMARKER_x100000 0x00100000
+#define HITMARKER_x200000 0x00200000
+#define HITMARKER_x400000 0x00400000
+#define HITMARKER_x800000 0x00800000
+#define HITMARKER_GRUDGE 0x01000000
+#define HITMARKER_OBEYS 0x02000000
+#define HITMARKER_x4000000 0x04000000
+#define HITMARKER_x8000000 0x08000000
+#define HITMARKER_FAINTED(bank) ((gBitTable[bank] << 0x1C))
+#define HITMARKER_UNK(bank) ((0x10000000 << bank))
+
+#define SIDE_STATUS_REFLECT (1 << 0)
+#define SIDE_STATUS_LIGHTSCREEN (1 << 1)
+#define SIDE_STATUS_X4 (1 << 2)
+#define SIDE_STATUS_SPIKES (1 << 4)
+#define SIDE_STATUS_SAFEGUARD (1 << 5)
+#define SIDE_STATUS_FUTUREATTACK (1 << 6)
+#define SIDE_STATUS_MIST (1 << 8)
+#define SIDE_STATUS_SPIKES_DAMAGED (1 << 9)
+
+#define ACTION_USE_MOVE 0
+#define ACTION_USE_ITEM 1
+#define ACTION_SWITCH 2
+#define ACTION_RUN 3
+#define ACTION_WATCHES_CAREFULLY 4
+#define ACTION_SAFARI_ZONE_BALL 5
+#define ACTION_POKEBLOCK_CASE 6
+#define ACTION_GO_NEAR 7
+#define ACTION_SAFARI_ZONE_RUN 8
+#define ACTION_9 9
+#define ACTION_RUN_BATTLESCRIPT 10 // when executing an action
+#define ACTION_CANCEL_PARTNER 12 // when choosing an action
+#define ACTION_FINISHED 12 // when executing an action
+#define ACTION_NOTHING_FAINTED 13 // when choosing an action
+#define ACTION_INIT_VALUE 0xFF
+
+#define MOVESTATUS_MISSED (1 << 0)
+#define MOVESTATUS_SUPEREFFECTIVE (1 << 1)
+#define MOVESTATUS_NOTVERYEFFECTIVE (1 << 2)
+#define MOVESTATUS_NOTAFFECTED (1 << 3)
+#define MOVESTATUS_ONEHITKO (1 << 4)
+#define MOVESTATUS_FAILED (1 << 5)
+#define MOVESTATUS_ENDURED (1 << 6)
+#define MOVESTATUS_HUNGON (1 << 7)
+
+#define MOVESTATUS_NOEFFECT ((MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED | MOVESTATUS_FAILED))
+
+#define MAX_TRAINER_ITEMS 4
+#define MAX_MON_MOVES 4
+
+#define WEATHER_RAIN_TEMPORARY (1 << 0)
+#define WEATHER_RAIN_DOWNPOUR (1 << 1)
+#define WEATHER_RAIN_PERMANENT (1 << 2)
+#define WEATHER_RAIN_ANY ((WEATHER_RAIN_TEMPORARY | WEATHER_RAIN_DOWNPOUR | WEATHER_RAIN_PERMANENT))
+#define WEATHER_SANDSTORM_TEMPORARY (1 << 3)
+#define WEATHER_SANDSTORM_PERMANENT (1 << 4)
+#define WEATHER_SANDSTORM_ANY ((WEATHER_SANDSTORM_TEMPORARY | WEATHER_SANDSTORM_PERMANENT))
+#define WEATHER_SUN_TEMPORARY (1 << 5)
+#define WEATHER_SUN_PERMANENT (1 << 6)
+#define WEATHER_SUN_ANY ((WEATHER_SUN_TEMPORARY | WEATHER_SUN_PERMANENT))
+#define WEATHER_HAIL (1 << 7)
+#define WEATHER_HAIL_ANY ((WEATHER_HAIL))
+#define WEATHER_ANY ((WEATHER_RAIN_ANY | WEATHER_SANDSTORM_ANY | WEATHER_SUN_ANY | WEATHER_HAIL_ANY))
+
+#define BATTLE_TERRAIN_GRASS 0
+#define BATTLE_TERRAIN_LONG_GRASS 1
+#define BATTLE_TERRAIN_SAND 2
+#define BATTLE_TERRAIN_UNDERWATER 3
+#define BATTLE_TERRAIN_WATER 4
+#define BATTLE_TERRAIN_POND 5
+#define BATTLE_TERRAIN_ROCK 6
+#define BATTLE_TERRAIN_CAVE 7
+#define BATTLE_TERRAIN_INSIDE 8
+#define BATTLE_TERRAIN_PLAIN 9
+
+// array entries for battle communication
+#define MULTIUSE_STATE 0x0
+#define CURSOR_POSITION 0x1
+#define TASK_ID 0x1 // task Id and cursor position share the same field
+#define SPRITES_INIT_STATE1 0x1 // shares the Id as well
+#define SPRITES_INIT_STATE2 0x2
+#define MOVE_EFFECT_BYTE 0x3
+#define ACTIONS_CONFIRMED_COUNT 0x4
+#define MULTISTRING_CHOOSER 0x5
+#define MSG_DISPLAY 0x7
+#define BATTLE_COMMUNICATION_ENTRIES_COUNT 0x8
+
+#define MOVE_TARGET_SELECTED 0x0
+#define MOVE_TARGET_DEPENDS 0x1
+#define MOVE_TARGET_USER 0x2
+#define MOVE_TARGET_RANDOM 0x4
+#define MOVE_TARGET_x10 0x10
+#define MOVE_TARGET_BOTH 0x8
+#define MOVE_TARGET_FOES_AND_ALLY 0x20
+#define MOVE_TARGET_OPPONENTS_FIELD 0x40
+
+// defines for the u8 array gTypeEffectiveness
+#define TYPE_EFFECT_ATK_TYPE(i)((gTypeEffectiveness[i + 0]))
+#define TYPE_EFFECT_DEF_TYPE(i)((gTypeEffectiveness[i + 1]))
+#define TYPE_EFFECT_MULTIPLIER(i)((gTypeEffectiveness[i + 2]))
+
+// defines for the gTypeEffectiveness multipliers
+#define TYPE_MUL_NO_EFFECT 0
+#define TYPE_MUL_NOT_EFFECTIVE 5
+#define TYPE_MUL_NORMAL 10
+#define TYPE_MUL_SUPER_EFFECTIVE 20
+
+// special type table Ids
+#define TYPE_FORESIGHT 0xFE
+#define TYPE_ENDTABLE 0xFF
+
+#define BS_GET_TARGET 0
+#define BS_GET_ATTACKER 1
+#define BS_GET_EFFECT_BANK 2
+#define BS_GET_gBank1 3
+#define BS_GET_BANK_0 7
+#define BS_ATTACKER_WITH_PARTNER 4 // for atk98_status_icon_update
+#define BS_GET_ATTACKER_SIDE 8 // for atk1E_jumpifability
+#define BS_GET_NOT_ATTACKER_SIDE 9 // for atk1E_jumpifability
+#define BS_GET_SCRIPTING_BANK 10
+#define BS_GET_OPPONENT1 12
+#define BS_GET_PLAYER2 13
+#define BS_GET_OPPONENT2 14
+
+// for battle script commands
+#define CMP_EQUAL 0x0
+#define CMP_NOT_EQUAL 0x1
+#define CMP_GREATER_THAN 0x2
+#define CMP_LESS_THAN 0x3
+#define CMP_COMMON_BITS 0x4
+#define CMP_NO_COMMON_BITS 0x5
+
+struct TrainerMonNoItemDefaultMoves
+{
+ u16 iv;
+ u8 lvl;
+ u16 species;
+};
+
+u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg);
+u8 GetBankSide(u8 bank);
+
+struct TrainerMonItemDefaultMoves
+{
+ u16 iv;
+ u8 lvl;
+ u16 species;
+ u16 heldItem;
+};
+
+struct TrainerMonNoItemCustomMoves
+{
+ u16 iv;
+ u8 lvl;
+ u16 species;
+ u16 moves[4];
+};
+
+struct TrainerMonItemCustomMoves
+{
+ u16 iv;
+ u8 lvl;
+ u16 species;
+ u16 heldItem;
+ u16 moves[4];
+};
+
+union TrainerMonPtr
+{
+ struct TrainerMonNoItemDefaultMoves* NoItemDefaultMoves;
+ struct TrainerMonNoItemCustomMoves* NoItemCustomMoves;
+ struct TrainerMonItemDefaultMoves* ItemDefaultMoves;
+ struct TrainerMonItemCustomMoves* ItemCustomMoves;
+};
+
+struct Trainer
+{
+ /*0x00*/ u8 partyFlags;
+ /*0x01*/ u8 trainerClass;
+ /*0x02*/ u8 encounterMusic_gender; // last bit is gender
+ /*0x03*/ u8 trainerPic;
+ /*0x04*/ u8 trainerName[12];
+ /*0x10*/ u16 items[4];
+ /*0x18*/ bool8 doubleBattle;
+ /*0x1C*/ u32 aiFlags;
+ /*0x20*/ u8 partySize;
+ /*0x24*/ union TrainerMonPtr party;
+};
+
+#define PARTY_FLAG_CUSTOM_MOVES 0x1
+#define PARTY_FLAG_HAS_ITEM 0x2
+
+extern const struct Trainer gTrainers[];
+
+#define TRAINER_ENCOUNTER_MUSIC(trainer)((gTrainers[trainer].encounterMusic_gender & 0x7F))
+
+struct UnknownFlags
+{
+ u32 flags[4];
+};
+
+#define UNKNOWN_FLAG_FLASH_FIRE 1
+
+struct DisableStruct
+{
+ /*0x00*/ u32 transformedMonPersonality;
+ /*0x04*/ u16 disabledMove;
+ /*0x06*/ u16 encoredMove;
+ /*0x08*/ u8 protectUses;
+ /*0x09*/ u8 stockpileCounter;
+ /*0x0A*/ u8 substituteHP;
+ /*0x0B*/ u8 disableTimer1 : 4;
+ /*0x0B*/ u8 disableTimer2 : 4;
+ /*0x0C*/ u8 encoredMovePos;
+ /*0x0D*/ u8 unkD;
+ /*0x0E*/ u8 encoreTimer1 : 4;
+ /*0x0E*/ u8 encoreTimer2 : 4;
+ /*0x0F*/ u8 perishSongTimer1 : 4;
+ /*0x0F*/ u8 perishSongTimer2 : 4;
+ /*0x10*/ u8 furyCutterCounter;
+ /*0x11*/ u8 rolloutCounter1 : 4;
+ /*0x11*/ u8 rolloutCounter2 : 4;
+ /*0x12*/ u8 chargeTimer1 : 4;
+ /*0x12*/ u8 chargeTimer2 : 4;
+ /*0x13*/ u8 tauntTimer1:4;
+ /*0x13*/ u8 tauntTimer2:4;
+ /*0x14*/ u8 bankPreventingEscape;
+ /*0x15*/ u8 bankWithSureHit;
+ /*0x16*/ u8 isFirstTurn;
+ /*0x17*/ u8 unk17;
+ /*0x18*/ u8 truantCounter : 1;
+ /*0x18*/ u8 truantUnknownBit : 1;
+ /*0x18*/ u8 unk18_a_2 : 2;
+ /*0x18*/ u8 unk18_b : 4;
+ /*0x19*/ u8 rechargeCounter;
+ /*0x1A*/ u8 unk1A[2];
+};
+
+extern struct DisableStruct gDisableStructs[BATTLE_BANKS_COUNT];
+
+struct ProtectStruct
+{
+ /* field_0 */
+ u32 protected:1;
+ u32 endured:1;
+ u32 onlyStruggle:1;
+ u32 helpingHand:1;
+ u32 bounceMove:1;
+ u32 stealMove:1;
+ u32 flag0Unknown:1;
+ u32 prlzImmobility:1;
+ /* field_1 */
+ u32 confusionSelfDmg:1;
+ u32 targetNotAffected:1;
+ u32 chargingTurn:1;
+ u32 fleeFlag:2; // for RunAway and Smoke Ball
+ u32 usedImprisionedMove:1;
+ u32 loveImmobility:1;
+ u32 usedDisabledMove:1;
+ /* field_2 */
+ u32 usedTauntedMove:1; // 0x1
+ u32 flag2Unknown:1; // 0x2
+ u32 flinchImmobility:1; // 0x4
+ u32 notFirstStrike:1; // 0x8
+ u32 flag_x10 : 1; // 0x10
+ u32 flag_x20 : 1; // 0x20
+ u32 flag_x40 : 1; // 0x40
+ u32 flag_x80 : 1; // 0x80
+ /* field_3 */
+ u32 field3 : 8;
+
+ /* field_4 */ u32 physicalDmg;
+ /* field_8 */ u32 specialDmg;
+ /* field_C */ u8 physicalBank;
+ /* field_D */ u8 specialBank;
+ /* field_E */ u16 fieldE;
+};
+
+extern struct ProtectStruct gProtectStructs[BATTLE_BANKS_COUNT];
+
+struct SpecialStatus
+{
+ u8 statLowered : 1; // 0x1
+ u8 lightningRodRedirected : 1; // 0x2
+ u8 restoredBankSprite: 1; // 0x4
+ u8 intimidatedPoke : 1; // 0x8
+ u8 traced : 1; // 0x10
+ u8 flag20 : 1;
+ u8 flag40 : 1;
+ u8 focusBanded : 1;
+ u8 field1[3];
+ s32 moveturnLostHP;
+ s32 moveturnLostHP_physical;
+ s32 moveturnLostHP_special;
+ u8 moveturnPhysicalBank;
+ u8 moveturnSpecialBank;
+ u8 field12;
+ u8 field13;
+};
+
+extern struct SpecialStatus gSpecialStatuses[BATTLE_BANKS_COUNT];
+
+struct SideTimer
+{
+ /*0x00*/ u8 reflectTimer;
+ /*0x01*/ u8 reflectBank;
+ /*0x02*/ u8 lightscreenTimer;
+ /*0x03*/ u8 lightscreenBank;
+ /*0x04*/ u8 mistTimer;
+ /*0x05*/ u8 mistBank;
+ /*0x06*/ u8 safeguardTimer;
+ /*0x07*/ u8 safeguardBank;
+ /*0x08*/ u8 followmeTimer;
+ /*0x09*/ u8 followmeTarget;
+ /*0x0A*/ u8 spikesAmount;
+ /*0x0B*/ u8 fieldB;
+};
+
+extern struct SideTimer gSideTimers[];
+
+struct WishFutureKnock
+{
+ u8 futureSightCounter[BATTLE_BANKS_COUNT];
+ u8 futureSightAttacker[BATTLE_BANKS_COUNT];
+ s32 futureSightDmg[BATTLE_BANKS_COUNT];
+ u16 futureSightMove[BATTLE_BANKS_COUNT];
+ u8 wishCounter[BATTLE_BANKS_COUNT];
+ u8 wishUserID[BATTLE_BANKS_COUNT];
+ u8 weatherDuration;
+ u8 knockedOffPokes[2];
+};
+
+extern struct WishFutureKnock gWishFutureKnock;
+
+struct AI_ThinkingStruct
+{
+ u8 aiState;
+ u8 movesetIndex;
+ u16 moveConsidered;
+ s8 score[4];
+ u32 funcResult;
+ u32 aiFlags;
+ u8 aiAction;
+ u8 aiLogicId;
+ u8 filler12[6];
+ u8 simulatedRNG[4];
+};
+
+struct UsedMoves
+{
+ u16 moves[BATTLE_BANKS_COUNT];
+ u16 unknown[BATTLE_BANKS_COUNT];
+};
+
+struct BattleHistory
+{
+ struct UsedMoves usedMoves[BATTLE_BANKS_COUNT];
+ u8 abilities[BATTLE_BANKS_COUNT];
+ u8 itemEffects[BATTLE_BANKS_COUNT];
+ u16 trainerItems[BATTLE_BANKS_COUNT];
+ u8 itemsNo;
+};
+
+struct BattleScriptsStack
+{
+ const u8 *ptr[8];
+ u8 size;
+};
+
+struct BattleCallbacksStack
+{
+ void (*function[8])(void);
+ u8 size;
+};
+
+struct StatsArray
+{
+ u16 hp;
+ u16 atk;
+ u16 def;
+ u16 spd;
+ u16 spAtk;
+ u16 spDef;
+};
+
+struct BattleResources
+{
+ struct SecretBaseRecord* secretBase;
+ struct UnknownFlags *flags;
+ struct BattleScriptsStack* battleScriptsStack;
+ struct BattleCallbacksStack* battleCallbackStack;
+ struct StatsArray* statsBeforeLvlUp;
+ struct AI_ThinkingStruct *ai;
+ struct BattleHistory *battleHistory;
+ struct BattleScriptsStack *AI_ScriptsStack;
+};
+
+extern struct BattleResources* gBattleResources;
+
+#define BATTLESCRIPTS_STACK (gBattleResources->battleScriptsStack)
+#define BATTLE_CALLBACKS_STACK (gBattleResources->battleCallbackStack)
+#define BATTLE_LVLUP_STATS (gBattleResources->statsBeforeLvlUp)
+
+struct BattleResults
+{
+ u8 playerFaintCounter; // 0x0
+ u8 opponentFaintCounter; // 0x1
+ u8 playerSwitchesCounter; // 0x2
+ u8 unk3; // 0x3
+ u8 unk4; // 0x4
+ u8 unk5_0:1; // 0x5
+ u8 usedMasterBall:1; // 0x5
+ u8 caughtMonBall:4; // 0x5
+ u8 unk5_6:1; // 0x5
+ u8 unk5_7:1; // 0x5
+ u16 playerMon1Species; // 0x6
+ u8 playerMon1Name[11]; // 0x8
+ u8 battleTurnCounter; // 0x13
+ u8 playerMon2Name[11]; // 0x14
+ u8 field_1F; // 0x1F
+ u16 lastOpponentSpecies; // 0x20
+ u16 lastUsedMovePlayer; // 0x22
+ u16 lastUsedMoveOpponent; // 0x24
+ u16 playerMon2Species; // 0x26
+ u16 caughtMonSpecies; // 0x28
+ u8 caughtMonNick[10]; // 0x2A
+ u8 filler34[2];
+ u8 catchAttempts[11]; // 0x36
+};
+
+extern struct BattleResults gBattleResults;
+
+struct BattleStruct
+{
+ u8 turnEffectsTracker;
+ u8 turnEffectsBank;
+ u8 filler2;
+ u8 turncountersTracker;
+ u8 wrappedMove[8]; // ask gamefreak why they declared it that way
+ u8 moveTarget[4];
+ u8 expGetterId;
+ u8 field_11;
+ u8 wildVictorySong;
+ u8 dynamicMoveType;
+ u8 wrappedBy[4];
+ u16 assistPossibleMoves[5 * 4]; // 5 mons, each of them knowing 4 moves
+ u8 field_40;
+ u8 field_41;
+ u8 field_42;
+ u8 field_43;
+ u8 field_44;
+ u8 field_45;
+ u8 field_46;
+ u8 field_47;
+ u8 focusPunchBank;
+ u8 field_49;
+ u8 moneyMultiplier;
+ u8 savedTurnActionNumber;
+ u8 switchInAbilitiesCounter;
+ u8 faintedActionsState;
+ u8 faintedActionsBank;
+ u8 field_4F;
+ u16 expValue;
+ u8 field_52;
+ u8 sentInPokes;
+ bool8 selectionScriptFinished[BATTLE_BANKS_COUNT];
+ u8 field_58[4];
+ u8 monToSwitchIntoId[BATTLE_BANKS_COUNT];
+ u8 field_60[4][3];
+ u8 runTries;
+ u8 caughtMonNick[11];
+ u8 field_78;
+ u8 field_79;
+ u8 field_7A;
+ u8 field_7B;
+ u8 field_7C;
+ u8 field_7D;
+ u8 field_7E;
+ u8 formToChangeInto;
+ u8 chosenMovePositions[BATTLE_BANKS_COUNT];
+ u8 stateIdAfterSelScript[BATTLE_BANKS_COUNT];
+ u8 field_88;
+ u8 field_89;
+ u8 field_8A;
+ u8 field_8B;
+ u8 field_8C;
+ u8 field_8D;
+ u8 stringMoveType;
+ u8 expGetterBank;
+ u8 field_90;
+ u8 field_91;
+ u8 field_92;
+ u8 field_93;
+ u8 wallyBattleState;
+ u8 wallyMovesState;
+ u8 wallyWaitFrames;
+ u8 wallyMoveFrames;
+ u8 mirrorMoves[8]; // ask gamefreak why they declared it that way
+ u8 field_A0;
+ u8 field_A1;
+ u8 field_A2;
+ u8 field_A3;
+ u8 field_A4;
+ u8 field_A5;
+ u8 field_A6;
+ u8 field_A7;
+ u16 hpOnSwitchout[2];
+ u32 savedBattleTypeFlags;
+ u8 field_B0;
+ u8 hpScale;
+ u8 synchronizeMoveEffect;
+ u8 field_B3;
+ void (*savedCallback)(void);
+ u16 usedHeldItems[BATTLE_BANKS_COUNT];
+ u8 chosenItem[4]; // why is this an u8?
+ u8 AI_itemType[2];
+ u8 AI_itemFlags[2];
+ u16 choicedMove[BATTLE_BANKS_COUNT];
+ u16 changedItems[BATTLE_BANKS_COUNT];
+ u8 intimidateBank;
+ u8 switchInItemsCounter;
+ u8 field_DA;
+ u8 turnSideTracker;
+ u8 fillerDC[0xDF-0xDC];
+ u8 field_DF;
+ u8 mirrorMoveArrays[32];
+ u16 castformPalette[BATTLE_BANKS_COUNT][16];
+ u8 field_180;
+ u8 field_181;
+ u8 field_182;
+ u8 field_183;
+ struct BattleEnigmaBerry battleEnigmaBerry;
+ u8 wishPerishSongState;
+ u8 wishPerishSongBank;
+ bool8 overworldWeatherDone;
+ u8 atkCancellerTracker;
+ u8 field_1A4[96];
+ u8 field_204[104];
+ u8 field_26C[40];
+ u8 AI_monToSwitchIntoId[BATTLE_BANKS_COUNT];
+ u8 field_298[8];
+ u8 field_2A0;
+ u8 field_2A1;
+ u8 field_2A2;
+};
+
+extern struct BattleStruct* gBattleStruct;
+
+#define GET_MOVE_TYPE(move, typeArg) \
+{ \
+ if (gBattleStruct->dynamicMoveType) \
+ typeArg = gBattleStruct->dynamicMoveType & 0x3F; \
+ else \
+ typeArg = gBattleMoves[move].type; \
+}
+
+#define MOVE_EFFECT_SLEEP 0x1
+#define MOVE_EFFECT_POISON 0x2
+#define MOVE_EFFECT_BURN 0x3
+#define MOVE_EFFECT_FREEZE 0x4
+#define MOVE_EFFECT_PARALYSIS 0x5
+#define MOVE_EFFECT_TOXIC 0x6
+#define MOVE_EFFECT_CONFUSION 0x7
+#define MOVE_EFFECT_FLINCH 0x8
+#define MOVE_EFFECT_TRI_ATTACK 0x9
+#define MOVE_EFFECT_UPROAR 0xA
+#define MOVE_EFFECT_PAYDAY 0xB
+#define MOVE_EFFECT_CHARGING 0xC
+#define MOVE_EFFECT_WRAP 0xD
+#define MOVE_EFFECT_RECOIL_25 0xE
+#define MOVE_EFFECT_ATK_PLUS_1 0xF
+#define MOVE_EFFECT_DEF_PLUS_1 0x10
+#define MOVE_EFFECT_SPD_PLUS_1 0x11
+#define MOVE_EFFECT_SP_ATK_PLUS_1 0x12
+#define MOVE_EFFECT_SP_DEF_PLUS_1 0x13
+#define MOVE_EFFECT_ACC_PLUS_1 0x14
+#define MOVE_EFFECT_EVS_PLUS_1 0x15
+#define MOVE_EFFECT_ATK_MINUS_1 0x16
+#define MOVE_EFFECT_DEF_MINUS_1 0x17
+#define MOVE_EFFECT_SPD_MINUS_1 0x18
+#define MOVE_EFFECT_SP_ATK_MINUS_1 0x19
+#define MOVE_EFFECT_SP_DEF_MINUS_1 0x1A
+#define MOVE_EFFECT_ACC_MINUS_1 0x1B
+#define MOVE_EFFECT_EVS_MINUS_1 0x1C
+#define MOVE_EFFECT_RECHARGE 0x1D
+#define MOVE_EFFECT_RAGE 0x1E
+#define MOVE_EFFECT_STEAL_ITEM 0x1F
+#define MOVE_EFFECT_PREVENT_ESCAPE 0x20
+#define MOVE_EFFECT_NIGHTMARE 0x21
+#define MOVE_EFFECT_ALL_STATS_UP 0x22
+#define MOVE_EFFECT_RAPIDSPIN 0x23
+#define MOVE_EFFECT_REMOVE_PARALYSIS 0x24
+#define MOVE_EFFECT_ATK_DEF_DOWN 0x25
+#define MOVE_EFFECT_RECOIL_33_PARALYSIS 0x26
+#define MOVE_EFFECT_ATK_PLUS_2 0x27
+#define MOVE_EFFECT_DEF_PLUS_2 0x28
+#define MOVE_EFFECT_SPD_PLUS_2 0x29
+#define MOVE_EFFECT_SP_ATK_PLUS_2 0x2A
+#define MOVE_EFFECT_SP_DEF_PLUS_2 0x2B
+#define MOVE_EFFECT_ACC_PLUS_2 0x2C
+#define MOVE_EFFECT_EVS_PLUS_2 0x2D
+#define MOVE_EFFECT_ATK_MINUS_2 0x2E
+#define MOVE_EFFECT_DEF_MINUS_2 0x2F
+#define MOVE_EFFECT_SPD_MINUS_2 0x30
+#define MOVE_EFFECT_SP_ATK_MINUS_2 0x31
+#define MOVE_EFFECT_SP_DEF_MINUS_2 0x32
+#define MOVE_EFFECT_ACC_MINUS_2 0x33
+#define MOVE_EFFECT_EVS_MINUS_2 0x34
+#define MOVE_EFFECT_THRASH 0x35
+#define MOVE_EFFECT_KNOCK_OFF 0x36
+#define MOVE_EFFECT_NOTHING_37 0x37
+#define MOVE_EFFECT_NOTHING_38 0x38
+#define MOVE_EFFECT_NOTHING_39 0x39
+#define MOVE_EFFECT_NOTHING_3A 0x3A
+#define MOVE_EFFECT_SP_ATK_TWO_DOWN 0x3B
+#define MOVE_EFFECT_NOTHING_3C 0x3C
+#define MOVE_EFFECT_NOTHING_3D 0x3D
+#define MOVE_EFFECT_NOTHING_3E 0x3E
+#define MOVE_EFFECT_NOTHING_3F 0x3F
+#define MOVE_EFFECT_AFFECTS_USER 0x40
+#define MOVE_EFFECT_CERTAIN 0x80
+
+// table ids for general animations
+#define B_ANIM_CASTFORM_CHANGE 0x0
+#define B_ANIM_STATS_CHANGE 0x1
+#define B_ANIM_SUBSTITUTE_FADE 0x2
+#define B_ANIM_SUBSTITUTE_APPEAR 0x3
+#define B_ANIM_x4 0x4
+#define B_ANIM_ITEM_KNOCKOFF 0x5
+#define B_ANIM_TURN_TRAP 0x6
+#define B_ANIM_ITEM_EFFECT 0x7
+#define B_ANIM_SMOKEBALL_ESCAPE 0x8
+#define B_ANIM_HANGED_ON 0x9
+#define B_ANIM_RAIN_CONTINUES 0xA
+#define B_ANIM_SUN_CONTINUES 0xB
+#define B_ANIM_SANDSTORM_CONTINUES 0xC
+#define B_ANIM_HAIL_CONTINUES 0xD
+#define B_ANIM_LEECH_SEED_DRAIN 0xE
+#define B_ANIM_MON_HIT 0xF
+#define B_ANIM_ITEM_STEAL 0x10
+#define B_ANIM_SNATCH_MOVE 0x11
+#define B_ANIM_FUTURE_SIGHT_HIT 0x12
+#define B_ANIM_DOOM_DESIRE_HIT 0x13
+#define B_ANIM_x14 0x14
+#define B_ANIM_INGRAIN_HEAL 0x15
+#define B_ANIM_WISH_HEAL 0x16
+
+// special animations table
+#define B_ANIM_LVL_UP 0x0
+#define B_ANIM_SWITCH_OUT_PLAYER_MON 0x1
+#define B_ANIM_SWITCH_OUT_OPPONENT_MON 0x2
+#define B_ANIM_BALL_THROW 0x3
+#define B_ANIM_SAFARI_BALL_THROW 0x4
+#define B_ANIM_SUBSTITUTE_TO_MON 0x5
+#define B_ANIM_MON_TO_SUBSTITUTE 0x6
+
+// status animation table
+#define B_ANIM_STATUS_PSN 0x0
+#define B_ANIM_STATUS_CONFUSION 0x1
+#define B_ANIM_STATUS_BRN 0x2
+#define B_ANIM_STATUS_INFATUATION 0x3
+#define B_ANIM_STATUS_SLP 0x4
+#define B_ANIM_STATUS_PRZ 0x5
+#define B_ANIM_STATUS_FRZ 0x6
+#define B_ANIM_STATUS_CURSED 0x7
+#define B_ANIM_STATUS_NIGHTMARE 0x8
+#define B_ANIM_STATUS_WRAPPED 0x9
+
+#define GET_STAT_BUFF_ID(n)((n & 0xF)) // first four bits 0x1, 0x2, 0x4, 0x8
+#define GET_STAT_BUFF_VALUE(n)(((n >> 4) & 7)) // 0x10, 0x20, 0x40
+#define STAT_BUFF_NEGATIVE 0x80 // 0x80, the sign bit
+
+#define SET_STAT_BUFF_VALUE(n)(((s8)(((s8)(n) << 4)) & 0xF0))
+
+#define SET_STATCHANGER(statId, stage, goesDown)(gBattleScripting.statChanger = (statId) + (stage << 4) + (goesDown << 7))
+
+struct BattleScripting
+{
+ s32 painSplitHp;
+ s32 bideDmg;
+ u8 multihitString[6];
+ u8 dmgMultiplier;
+ u8 twoTurnsMoveStringId;
+ u8 animArg1;
+ u8 animArg2;
+ u16 tripleKickPower;
+ u8 atk49_state;
+ u8 bankWithAbility;
+ u8 multihitMoveEffect;
+ u8 bank;
+ u8 animTurn;
+ u8 animTargetsHit;
+ u8 statChanger;
+ u8 field_1B;
+ u8 atk23_state;
+ u8 battleStyle;
+ u8 atk6C_state;
+ u8 learnMoveState;
+ u8 field_20;
+ u8 reshowMainState;
+ u8 reshowHelperState;
+ u8 field_23;
+ u8 field_24;
+ u8 multiplayerId;
+};
+
+extern struct BattleScripting gBattleScripting;
+
+// functions
+
+// battle_1
+void LoadBattleTextboxAndBackground(void);
+void LoadBattleEntryBackground(void);
+void ApplyPlayerChosenFrameToBattleMenu(void);
+bool8 LoadChosenBattleElement(u8 caseId);
+void DrawMainBattleBackground(void);
+void task00_0800F6FC(u8 taskId);
+
+enum
+{
+ BACK_PIC_BRENDAN,
+ BACK_PIC_MAY,
+ BACK_PIC_RED,
+ BACK_PIC_LEAF,
+ BACK_PIC_RS_BRENDAN,
+ BACK_PIC_RS_MAY,
+ BACK_PIC_WALLY,
+ BACK_PIC_STEVEN
+};
+
+// rom_80A5C6C
+u8 GetBankSide(u8 bank);
+u8 GetBankIdentity(u8 bank);
+u8 GetBankByIdentity(u8 bank);
+
+struct BattleSpriteInfo
+{
+ u16 invisible : 1; // 0x1
+ u16 lowHpSong : 1; // 0x2
+ u16 behindSubstitute : 1; // 0x4
+ u16 flag_x8 : 1; // 0x8
+ u16 hpNumbersNoBars : 1; // 0x10
+ u16 transformSpecies;
+};
+
+struct BattleAnimationInfo
+{
+ u16 animArg; // to fill up later
+ u8 field_2;
+ u8 field_3;
+ u8 field_4;
+ u8 field_5;
+ u8 field_6;
+ u8 field_7;
+ u8 ballThrowCaseId;
+ u8 field_9_x1 : 1;
+ u8 field_9_x2 : 1;
+ u8 field_9_x1C : 3;
+ u8 field_9_x20 : 1;
+ u8 field_9_x40 : 1;
+ u8 field_9_x80 : 1;
+ u8 field_A;
+ u8 field_B;
+ u8 field_C;
+ u8 field_D;
+ u8 field_E;
+ u8 field_F;
+};
+
+struct BattleHealthboxInfo
+{
+ u8 flag_x1 : 1;
+ u8 flag_x2 : 1;
+ u8 flag_x4 : 1;
+ u8 ballAnimActive : 1; // 0x8
+ u8 statusAnimActive : 1; // x10
+ u8 animFromTableActive : 1; // x20
+ u8 specialAnimActive : 1; //x40
+ u8 flag_x80 : 1;
+ u8 field_1_x1 : 1;
+ u8 field_1_x1E : 4;
+ u8 field_1_x20 : 1;
+ u8 field_1_x40 : 1;
+ u8 field_1_x80 : 1;
+ u8 field_2;
+ u8 field_3;
+ u8 animationState;
+ u8 field_5;
+ u8 field_6;
+ u8 shadowSpriteId;
+ u8 field_8;
+ u8 field_9;
+ u8 field_A;
+ u8 field_B;
+};
+
+struct BattleBarInfo
+{
+ u8 healthboxSpriteId;
+ s32 maxValue;
+ s32 currentValue;
+ s32 receivedValue;
+ s32 field_10;
+};
+
+struct BattleSpriteData
+{
+ struct BattleSpriteInfo *bankData;
+ struct BattleHealthboxInfo *healthBoxesData;
+ struct BattleAnimationInfo *animationData;
+ struct BattleBarInfo *battleBars;
+};
+
+extern struct BattleSpriteData *gBattleSpritesDataPtr;
+
+#define BATTLE_BUFFER_LINK_SIZE 0x1000
+
+extern u8 *gLinkBattleSendBuffer;
+extern u8 *gLinkBattleRecvBuffer;
+
+extern u8 *gUnknown_0202305C;
+extern u8 *gUnknown_02023060;
+
+// Move this somewhere else
+
+#include "sprite.h"
+
+struct MonSpritesGfx
+{
+ void* firstDecompressed; // ptr to the decompressed sprite of the first pokemon
+ void* sprites[4];
+ struct SpriteTemplate templates[4];
+ struct SpriteFrameImage field_74[4][4];
+ u8 field_F4[0x80];
+ u8 *barFontGfx;
+ void *field_178;
+ void *field_17C;
+};
+
+extern struct BattleSpritesGfx* gMonSpritesGfx;
+extern u8 gBattleOutcome;
+extern u16 gLastUsedItem;
+extern u32 gBattleTypeFlags;
+extern struct MonSpritesGfx* gMonSpritesGfxPtr;
+extern u16 gTrainerBattleOpponent_A;
+
+#endif // GUARD_BATTLE_H
diff --git a/include/battle_2.h b/include/battle_2.h
new file mode 100644
index 000000000..ee61efd9b
--- /dev/null
+++ b/include/battle_2.h
@@ -0,0 +1,55 @@
+#ifndef GUARD_BATTLE_2_H
+#define GUARD_BATTLE_2_H
+
+void CB2_InitBattle(void);
+void BattleMainCB2(void);
+void CB2_QuitRecordedBattle(void);
+void sub_8038528(struct Sprite* sprite);
+void sub_8038A04(void); // unused
+void VBlankCB_Battle(void);
+void nullsub_17(void);
+void sub_8038B74(struct Sprite *sprite);
+void sub_8038D64(void);
+u32 sub_80391E0(u8 arrayId, u8 caseId);
+u32 sub_80397C4(u32 setId, u32 tableId);
+void oac_poke_opponent(struct Sprite *sprite);
+void SpriteCallbackDummy_2(struct Sprite *sprite);
+void sub_8039934(struct Sprite *sprite);
+void sub_8039AD8(struct Sprite *sprite);
+void sub_8039B2C(struct Sprite *sprite);
+void sub_8039B58(struct Sprite *sprite);
+void sub_8039BB4(struct Sprite *sprite);
+void sub_80105DC(struct Sprite *sprite);
+void sub_8039C00(struct Sprite *sprite);
+void dp11b_obj_instanciate(u8 bank, u8 b, s8 c, s8 d);
+void dp11b_obj_free(u8 bank, bool8 b);
+void sub_8039E44(struct Sprite *sprite);
+void sub_8039E60(struct Sprite *sprite);
+void sub_8039E84(struct Sprite *sprite);
+void sub_8039E9C(struct Sprite *sprite);
+void nullsub_20(void);
+void BeginBattleIntro(void);
+void SwitchInClearSetData(void);
+void FaintClearSetData(void);
+void sub_803B3AC(void); // unused
+void sub_803B598(void); // unused
+void BattleTurnPassed(void);
+u8 IsRunningFromBattleImpossible(void);
+void sub_803BDA0(u8 bank);
+void SwapTurnOrder(u8 id1, u8 id2);
+u8 GetWhoStrikesFirst(u8 bank1, u8 bank2, bool8 ignoreChosenMoves);
+void RunBattleScriptCommands_PopCallbacksStack(void);
+void RunBattleScriptCommands(void);
+bool8 TryRunFromBattle(u8 bank);
+
+extern const u8 gStatusConditionString_PoisonJpn[8];
+extern const u8 gStatusConditionString_SleepJpn[8];
+extern const u8 gStatusConditionString_ParalysisJpn[8];
+extern const u8 gStatusConditionString_BurnJpn[8];
+extern const u8 gStatusConditionString_IceJpn[8];
+extern const u8 gStatusConditionString_ConfusionJpn[8];
+extern const u8 gStatusConditionString_LoveJpn[8];
+
+extern const u8 * const gStatusConditionStringsTable[7][2];
+
+#endif // GUARD_BATTLE_2_H
diff --git a/include/battle_ai_script_commands.h b/include/battle_ai_script_commands.h
new file mode 100644
index 000000000..5fb422b41
--- /dev/null
+++ b/include/battle_ai_script_commands.h
@@ -0,0 +1,13 @@
+#ifndef GUARD_BATTLE_AI_SCRIPT_COMMANDS_H
+#define GUARD_BATTLE_AI_SCRIPT_COMMANDS_H
+
+void BattleAI_HandleItemUseBeforeAISetup(u8 defaultScoreMoves);
+void BattleAI_SetupAIData(u8 defaultScoreMoves);
+u8 BattleAI_ChooseMoveOrAction(void);
+void ClearBankMoveHistory(u8 bank);
+void RecordAbilityBattle(u8 bank, u8 abilityId);
+void ClearBankAbilityHistory(u8 bank);
+void RecordItemEffectBattle(u8 bank, u8 itemEffect);
+void ClearBankItemEffectHistory(u8 bank);
+
+#endif // GUARD_BATTLE_AI_SCRIPT_COMMANDS_H
diff --git a/include/battle_ai_switch_items.h b/include/battle_ai_switch_items.h
new file mode 100644
index 000000000..0a230e7f6
--- /dev/null
+++ b/include/battle_ai_switch_items.h
@@ -0,0 +1,17 @@
+#ifndef GUARD_BATTLE_AI_SWITCH_ITEMS_H
+#define GUARD_BATTLE_AI_SWITCH_ITEMS_H
+
+enum
+{
+ AI_ITEM_FULL_RESTORE = 1,
+ AI_ITEM_HEAL_HP,
+ AI_ITEM_CURE_CONDITION,
+ AI_ITEM_X_STAT,
+ AI_ITEM_GUARD_SPECS,
+ AI_ITEM_NOT_RECOGNIZABLE
+};
+
+void AI_TrySwitchOrUseItem(void);
+u8 GetMostSuitableMonToSwitchInto(void);
+
+#endif // GUARD_BATTLE_AI_SWITCH_ITEMS_H
diff --git a/include/battle_anim.h b/include/battle_anim.h
new file mode 100644
index 000000000..9fb7ccd53
--- /dev/null
+++ b/include/battle_anim.h
@@ -0,0 +1,118 @@
+#ifndef GUARD_BATTLE_ANIM_H
+#define GUARD_BATTLE_ANIM_H
+
+enum
+{
+ ANIM_BANK_ATTACKER,
+ ANIM_BANK_TARGET,
+ ANIM_BANK_ATK_PARTNER,
+ ANIM_BANK_DEF_PARTNER,
+};
+
+enum
+{
+ BG_ANIM_SCREEN_SIZE,
+ BG_ANIM_AREA_OVERFLOW_MODE,
+ BG_ANIM2,
+ BG_ANIM3,
+ BG_ANIM_PRIORITY,
+ BG_ANIM_5,
+ BG_ANIM_6
+};
+
+struct UnknownAnimStruct2
+{
+ void *unk0;
+ u16 *unk4;
+ u8 unk8;
+ u8 unk9;
+ u16 unkA;
+ u16 unkC;
+};
+
+struct BattleAnimBackground
+{
+ void *image;
+ void *palette;
+ void *tilemap;
+};
+
+#define ANIM_ARGS_COUNT 8
+
+#define PAN_SIDE_PLAYER -64
+#define PAN_SIDE_OPPONENT 63
+
+extern void (*gAnimScriptCallback)(void);
+extern bool8 gAnimScriptActive;
+extern u8 gAnimVisualTaskCount;
+extern u8 gAnimSoundTaskCount;
+extern struct DisableStruct *gAnimDisableStructPtr;
+extern u32 gAnimMoveDmg;
+extern u16 gAnimMovePower;
+extern u8 gAnimFriendship;
+extern u16 gWeatherMoveAnim;
+extern s16 gBattleAnimArgs[ANIM_ARGS_COUNT];
+extern u8 gAnimMoveTurn;
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+extern u16 gAnimSpeciesByBanks[BATTLE_BANKS_COUNT];
+extern u8 gUnknown_02038440;
+
+void ClearBattleAnimationVars(void);
+void DoMoveAnim(u16 move);
+void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMoveAnim);
+void DestroyAnimSprite(struct Sprite *sprite);
+void DestroyAnimVisualTask(u8 taskId);
+void DestroyAnimSoundTask(u8 taskId);
+bool8 IsAnimBankSpriteVisible(u8 bank);
+void sub_80A438C(u8 bank, bool8 toBG_2, bool8 setSpriteInvisible);
+bool8 IsContest(void);
+s8 BattleAnimAdjustPanning(s8 pan);
+s8 BattleAnimAdjustPanning2(s8 pan);
+s16 sub_80A52EC(s16 a);
+s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan);
+
+// battle_anim_80FE840.s
+void SetAnimBgAttribute(u8 bgId, u8 attributeId, u8 value);
+void sub_8118FBC(u8 arg0, u8 arg1, u8 arg2, u8 bankIdentity, u8 arg4, void *arg5, u16 *arg6, u16 arg7);
+void HandleIntroSlide(u8 terrainId);
+
+// battle_anim_80A5C6C.s
+void sub_80A6EEC(struct Sprite *sprite);
+void sub_80A68D4(struct Sprite *sprite);
+void sub_80A6F3C(struct Sprite *sprite);
+void sub_80A8278(void);
+void sub_80A6B30(struct UnknownAnimStruct2*);
+void sub_80A6B90(struct UnknownAnimStruct2*, u32 arg1);
+u8 sub_80A82E4(u8 bank);
+bool8 AnimateBallThrow(struct Sprite *sprite);
+
+enum
+{
+ BANK_X_POS,
+ BANK_Y_POS,
+};
+
+u8 GetBankPosition(u8 bank, u8 attributeId);
+
+bool8 IsBankSpritePresent(u8 bank);
+void sub_80A6C68(u8 arg0);
+u8 GetAnimBankSpriteId(u8 wantedBank);
+bool8 IsDoubleBattle(void);
+u8 sub_80A6D94(void);
+u8 sub_80A8364(u8);
+void StoreSpriteCallbackInData6(struct Sprite *sprite, void (*spriteCallback)(struct Sprite*));
+void oamt_add_pos2_onto_pos1(struct Sprite *sprite);
+u8 GetBankSpriteDefault_Y(u8 bank);
+u8 sub_80A82E4(u8 bank);
+u8 GetSubstituteSpriteDefault_Y(u8 bank);
+
+// battle_anim_80A9C70.s
+void LaunchStatusAnimation(u8 bank, u8 statusAnimId);
+
+// battle_anim_8170478.s
+u8 ItemIdToBallId(u16 itemId);
+u8 LaunchBallStarsTask(u8 x, u8 y, u8 kindOfStars, u8 arg3, u8 ballId);
+u8 LaunchBallFadeMonTask(bool8 unFadeLater, u8 bank, u32 arg2, u8 ballId);
+
+#endif // GUARD_BATTLE_ANIM_H
diff --git a/include/battle_controllers.h b/include/battle_controllers.h
new file mode 100644
index 000000000..c69cb1017
--- /dev/null
+++ b/include/battle_controllers.h
@@ -0,0 +1,278 @@
+#ifndef GUARD_BATTLE_CONTROLLERS_H
+#define GUARD_BATTLE_CONTROLLERS_H
+
+enum
+{
+ REQUEST_ALL_BATTLE,
+ REQUEST_SPECIES_BATTLE,
+ REQUEST_HELDITEM_BATTLE,
+ REQUEST_MOVES_PP_BATTLE,
+ REQUEST_MOVE1_BATTLE,
+ REQUEST_MOVE2_BATTLE,
+ REQUEST_MOVE3_BATTLE,
+ REQUEST_MOVE4_BATTLE,
+ REQUEST_PP_DATA_BATTLE,
+ REQUEST_PPMOVE1_BATTLE,
+ REQUEST_PPMOVE2_BATTLE,
+ REQUEST_PPMOVE3_BATTLE,
+ REQUEST_PPMOVE4_BATTLE,
+ REQUEST_UNUSED_13_BATTLE,
+ REQUEST_UNUSED_14_BATTLE,
+ REQUEST_UNUSED_15_BATTLE,
+ REQUEST_UNUSED_16_BATTLE,
+ REQUEST_OTID_BATTLE,
+ REQUEST_EXP_BATTLE,
+ REQUEST_HP_EV_BATTLE,
+ REQUEST_ATK_EV_BATTLE,
+ REQUEST_DEF_EV_BATTLE,
+ REQUEST_SPEED_EV_BATTLE,
+ REQUEST_SPATK_EV_BATTLE,
+ REQUEST_SPDEF_EV_BATTLE,
+ REQUEST_FRIENDSHIP_BATTLE,
+ REQUEST_POKERUS_BATTLE,
+ REQUEST_MET_LOCATION_BATTLE,
+ REQUEST_MET_LEVEL_BATTLE,
+ REQUEST_MET_GAME_BATTLE,
+ REQUEST_POKEBALL_BATTLE,
+ REQUEST_ALL_IVS_BATTLE,
+ REQUEST_HP_IV_BATTLE,
+ REQUEST_ATK_IV_BATTLE,
+ REQUEST_DEF_IV_BATTLE,
+ REQUEST_SPEED_IV_BATTLE,
+ REQUEST_SPATK_IV_BATTLE,
+ REQUEST_SPDEF_IV_BATTLE,
+ REQUEST_PERSONALITY_BATTLE,
+ REQUEST_CHECKSUM_BATTLE,
+ REQUEST_STATUS_BATTLE,
+ REQUEST_LEVEL_BATTLE,
+ REQUEST_HP_BATTLE,
+ REQUEST_MAX_HP_BATTLE,
+ REQUEST_ATK_BATTLE,
+ REQUEST_DEF_BATTLE,
+ REQUEST_SPEED_BATTLE,
+ REQUEST_SPATK_BATTLE,
+ REQUEST_SPDEF_BATTLE,
+ REQUEST_COOL_BATTLE,
+ REQUEST_BEAUTY_BATTLE,
+ REQUEST_CUTE_BATTLE,
+ REQUEST_SMART_BATTLE,
+ REQUEST_TOUGH_BATTLE,
+ REQUEST_SHEEN_BATTLE,
+ REQUEST_COOL_RIBBON_BATTLE,
+ REQUEST_BEAUTY_RIBBON_BATTLE,
+ REQUEST_CUTE_RIBBON_BATTLE,
+ REQUEST_SMART_RIBBON_BATTLE,
+ REQUEST_TOUGH_RIBBON_BATTLE,
+};
+
+#define RESET_ACTION_MOVE_SELECTION 0
+#define RESET_ACTION_SELECTION 1
+#define RESET_MOVE_SELECTION 2
+
+#define BALL_NO_SHAKES 0
+#define BALL_1_SHAKE 1
+#define BALL_2_SHAKES 2
+#define BALL_3_SHAKES_FAIL 3
+#define BALL_3_SHAKES_SUCCESS 4
+#define BALL_TRAINER_BLOCK 5
+
+#define RET_VALUE_LEVELLED_UP 11
+
+#define INSTANT_HP_BAR_DROP 32767
+
+struct UnusedControllerStruct
+{
+ u8 field_0 : 7;
+ u8 flag_x80 : 1;
+};
+
+struct HpAndStatus
+{
+ u16 hp;
+ u32 status;
+};
+
+struct MovePpInfo
+{
+ u16 moves[4];
+ u8 pp[4];
+ u8 ppBonuses;
+};
+
+struct ChooseMoveStruct
+{
+ u16 moves[4];
+ u8 currentPp[4];
+ u8 maxPp[4];
+ u16 species;
+ u8 monType1;
+ u8 monType2;
+};
+
+enum
+{
+ CONTROLLER_GETMONDATA,
+ CONTROLLER_GETRAWMONDATA,
+ CONTROLLER_SETMONDATA,
+ CONTROLLER_SETRAWMONDATA,
+ CONTROLLER_LOADMONSPRITE,
+ CONTROLLER_SWITCHINANIM,
+ CONTROLLER_RETURNMONTOBALL,
+ CONTROLLER_DRAWTRAINERPIC,
+ CONTROLLER_TRAINERSLIDE,
+ CONTROLLER_TRAINERSLIDEBACK,
+ CONTROLLER_FAINTANIMATION,
+ CONTROLLER_PALETTEFADE,
+ CONTROLLER_SUCCESSBALLTHROWANIM,
+ CONTROLLER_BALLTHROWANIM,
+ CONTROLLER_PAUSE,
+ CONTROLLER_MOVEANIMATION,
+ CONTROLLER_PRINTSTRING,
+ CONTROLLER_PRINTSTRINGPLAYERONLY,
+ CONTROLLER_CHOOSEACTION,
+ CONTROLLER_UNKNOWNYESNOBOX,
+ CONTROLLER_CHOOSEMOVE,
+ CONTROLLER_OPENBAG,
+ CONTROLLER_CHOOSEPOKEMON,
+ CONTROLLER_23,
+ CONTROLLER_HEALTHBARUPDATE,
+ CONTROLLER_EXPUPDATE,
+ CONTROLLER_STATUSICONUPDATE,
+ CONTROLLER_STATUSANIMATION,
+ CONTROLLER_STATUSXOR,
+ CONTROLLER_DATATRANSFER,
+ CONTROLLER_DMA3TRANSFER,
+ CONTROLLER_31,
+ CONTROLLER_32,
+ CONTROLLER_TWORETURNVALUES,
+ CONTROLLER_CHOSENMONRETURNVALUE,
+ CONTROLLER_ONERETURNVALUE,
+ CONTROLLER_ONERETURNVALUE_DUPLICATE,
+ CONTROLLER_37,
+ CONTROLLER_38,
+ CONTROLLER_39,
+ CONTROLLER_40,
+ CONTROLLER_HITANIMATION,
+ CONTROLLER_42,
+ CONTROLLER_EFFECTIVENESSSOUND,
+ CONTROLLER_PLAYFANFAREORBGM,
+ CONTROLLER_FAINTINGCRY,
+ CONTROLLER_INTROSLIDE,
+ CONTROLLER_INTROTRAINERBALLTHROW,
+ CONTROLLER_DRAWPARTYSTATUSSUMMARY,
+ CONTROLLER_49,
+ CONTROLLER_50,
+ CONTROLLER_SPRITEINVISIBILITY,
+ CONTROLLER_BATTLEANIMATION,
+ CONTROLLER_LINKSTANDBYMSG,
+ CONTROLLER_RESETACTIONMOVESELECTION,
+ CONTROLLER_55,
+ /*new controllers should go here*/
+ CONTROLLER_TERMINATOR_NOP,
+ CONTROLLER_CMDS_COUNT
+};
+
+
+// general functions
+void HandleLinkBattleSetup(void);
+void SetUpBattleVarsAndBirchZigzagoon(void);
+void sub_8032768(void);
+void sub_8033648(void);
+void PrepareBufferDataTransferLink(u8 bufferId, u16 size, u8 *data);
+
+// emitters
+void EmitGetMonData(u8 bufferId, u8 requestId, u8 monToCheck);
+void EmitGetRawMonData(u8 bufferId, u8 monId, u8 bytes); // unused
+void EmitSetMonData(u8 bufferId, u8 requestId, u8 monToCheck, u8 bytes, void *data);
+void EmitSetRawMonData(u8 bufferId, u8 monId, u8 bytes, void *data); // unused
+void EmitLoadMonSprite(u8 bufferId);
+void EmitSwitchInAnim(u8 bufferId, u8 partyId, bool8 dontClearSubstituteBit);
+void EmitReturnMonToBall(u8 bufferId, u8 arg1);
+void EmitDrawTrainerPic(u8 bufferId);
+void EmitTrainerSlide(u8 bufferId);
+void EmitTrainerSlideBack(u8 bufferId);
+void EmitFaintAnimation(u8 bufferId);
+void EmitPaletteFade(u8 bufferId); // unused
+void EmitSuccessBallThrowAnim(u8 bufferId); // unused
+void EmitBallThrowAnim(u8 bufferId, u8 caseId);
+void EmitPause(u8 bufferId, u8 toWait, void *data); // unused
+void EmitMoveAnimation(u8 bufferId, u16 move, u8 turnOfMove, u16 movePower, s32 dmg, u8 friendship, struct DisableStruct *disableStructPtr, u8 multihit);
+void EmitPrintString(u8 bufferId, u16 stringId);
+void EmitPrintSelectionString(u8 bufferId, u16 stringId);
+void EmitChooseAction(u8 bufferId, u8 arg1, u16 arg2);
+void EmitUnknownYesNoBox(u8 bufferId);
+void EmitChooseMove(u8 bufferId, bool8 isDoubleBattle, bool8 NoPpNumber, struct ChooseMoveStruct *movePpData);
+void EmitChooseItem(u8 bufferId, u8* arg1);
+void EmitChoosePokemon(u8 bufferId, u8 caseId, u8 arg2, u8 abilityId, u8* arg4);
+void EmitCmd23(u8 bufferId); // unused
+void EmitHealthBarUpdate(u8 bufferId, u16 hpValue);
+void EmitExpUpdate(u8 bufferId, u8 partyId, u16 expPoints);
+void EmitStatusIconUpdate(u8 bufferId, u32 status1, u32 status2);
+void EmitStatusAnimation(u8 bufferId, bool8 status2, u32 status);
+void EmitStatusXor(u8 bufferId, u8 b); // unused
+void EmitDataTransfer(u8 bufferId, u16 size, void *data);
+void EmitDMA3Transfer(u8 bufferId, void *dst, u16 size, void *data); // unused
+void EmitPlayBGM(u8 bufferId, u16 songId, void *unusedDumbDataParameter); // unused
+void EmitCmd32(u8 bufferId, u16 size, void *c); // unused
+void EmitTwoReturnValues(u8 bufferId, u8 arg1, u16 arg2);
+void EmitChosenMonReturnValue(u8 bufferId, u8 b, u8 *c);
+void EmitOneReturnValue(u8 bufferId, u16 arg1);
+void EmitOneReturnValue_Duplicate(u8 bufferId, u16 b);
+void EmitCmd37(u8 bufferId); // unused
+void EmitCmd38(u8 bufferId, u8 b); // unused
+void EmitCmd39(u8 bufferId); // unused
+void EmitCmd40(u8 bufferId); // unused
+void EmitHitAnimation(u8 bufferId);
+void EmitCmd42(u8 bufferId);
+void EmitPlaySE(u8 bufferId, u16 songId);
+void EmitPlayFanfareOrBGM(u8 bufferId, u16 songId, bool8 playBGM);
+void EmitFaintingCry(u8 bufferId);
+void EmitIntroSlide(u8 bufferId, u8 terrainId);
+void EmitIntroTrainerBallThrow(u8 bufferId);
+void EmitDrawPartyStatusSummary(u8 bufferId, struct HpAndStatus* hpAndStatus, u8 arg2);
+void EmitCmd49(u8 bufferId);
+void EmitCmd50(u8 bufferId);
+void EmitSpriteInvisibility(u8 bufferId, bool8 isInvisible);
+void EmitBattleAnimation(u8 bufferId, u8 animationId, u16 argument);
+void EmitLinkStandbyMsg(u8 bufferId, u8 arg1, bool32 arg2);
+void EmitResetActionMoveSelection(u8 bufferId, u8 caseId);
+void EmitCmd55(u8 bufferId, u8 arg1);
+
+// player controller
+void SetControllerToPlayer(void);
+void nullsub_21(void);
+void PlayerHandleGetRawMonData(void);
+void sub_80587B0(void);
+void sub_805CC00(struct Sprite *sprite);
+void SetCB2ToReshowScreenAfterMenu(void);
+void SetCB2ToReshowScreenAfterMenu2(void);
+void c3_0802FDF4(u8 taskId);
+void ActionSelectionCreateCursorAt(u8 cursorPos, u8 unused);
+void ActionSelectionDestroyCursorAt(u8 cursorPos);
+void InitMoveSelectionsVarsAndStrings(void);
+
+// recorded player controller
+void SetControllerToRecordedPlayer(void);
+
+// opponent controller
+void SetControllerToOpponent(void);
+
+// player partner controller
+void SetControllerToPlayerPartner(void);
+
+// safari controller
+void SetControllerToSafari(void);
+
+// wally controller
+void SetControllerToWally(void);
+
+// recorded opponent controller
+void SetControllerToRecordedOpponent(void);
+
+// link opponent
+void SetControllerToLinkOpponent(void);
+
+// link partner
+void SetControllerToLinkPartner(void);
+
+#endif // GUARD_BATTLE_CONTROLLERS_H
diff --git a/include/battle_dome_cards.h b/include/battle_dome_cards.h
new file mode 100644
index 000000000..a0696d156
--- /dev/null
+++ b/include/battle_dome_cards.h
@@ -0,0 +1,13 @@
+#ifndef GUARD_BATTLE_DOME_CARDS_H
+#define GUARD_BATTLE_DOME_CARDS_H
+
+bool16 dp13_810BB8C(void);
+u16 sub_818D3E4(u16 species, u32 otId, u32 personality, u8 flags, s16 x, s16 y, u8 paletteSlot, u16 paletteTag);
+u16 sub_818D7D8(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag);
+u16 sub_818D820(u16 spriteId);
+u16 sub_818D8AC(u16 species, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag);
+u16 sub_818D8F0(u16 spriteId);
+u16 sub_818D938(u16 species, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId);
+u8 sub_818D97C(u8 a0, u8 a1);
+
+#endif //GUARD_BATTLE_DOME_CARDS_H
diff --git a/include/battle_gfx_sfx_util.h b/include/battle_gfx_sfx_util.h
new file mode 100644
index 000000000..313a29811
--- /dev/null
+++ b/include/battle_gfx_sfx_util.h
@@ -0,0 +1,50 @@
+#ifndef GUARD_BATTLE_GFX_SFX_UTIL
+#define GUARD_BATTLE_GFX_SFX_UTIL
+
+void AllocateBattleSpritesData(void);
+void FreeBattleSpritesData(void);
+u16 ChooseMoveAndTargetInBattlePalace(void);
+void sub_805D714(struct Sprite *sprite);
+void sub_805D770(struct Sprite *sprite, bool8 arg1);
+void sub_805D7AC(struct Sprite *sprite);
+void InitAndLaunchChosenStatusAnimation(bool8 isStatus2, u32 status);
+bool8 TryHandleLaunchBattleTableAnimation(u8 activeBank, u8 atkBank, u8 defBank, u8 tableId, u16 argument);
+void InitAndLaunchSpecialAnimation(u8 activeBank, u8 atkBank, u8 defBank, u8 tableId);
+bool8 IsMoveWithoutAnimation(u16 moveId, u8 animationTurn);
+bool8 mplay_80342A4(u8 bank);
+void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 bank);
+void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 bank);
+void nullsub_23(void);
+void nullsub_24(u16 species);
+void DecompressTrainerFrontPic(u16 frontPicId, u8 bank);
+void DecompressTrainerBackPic(u16 backPicId, u8 bank);
+void nullsub_25(u8 arg0);
+void FreeTrainerFrontPicPalette(u16 frontPicId);
+void sub_805DFFC(void);
+bool8 BattleLoadAllHealthBoxesGfx(u8 state);
+void LoadBattleBarGfx(u8 arg0);
+bool8 BattleInitAllSprites(u8 *state1, u8 *bank);
+void ClearSpritesHealthboxAnimData(void);
+void CopyAllBattleSpritesInvisibilities(void);
+void CopyBattleSpriteInvisibility(u8 bank);
+void HandleSpeciesGfxDataChange(u8 bankAtk, u8 bankDef, bool8 notTransform);
+void BattleLoadSubstituteOrMonSpriteGfx(u8 bank, bool8 loadMonSprite);
+void LoadBattleMonGfxAndAnimate(u8 bank, bool8 loadMonSprite, u8 spriteId);
+void TrySetBehindSubstituteSpriteBit(u8 bank, u16 move);
+void ClearBehindSubstituteBit(u8 bank);
+void HandleLowHpMusicChange(struct Pokemon *mon, u8 bank);
+void BattleStopLowHpSound(void);
+u8 GetMonHPBarLevel(struct Pokemon *mon);
+void sub_805EAE8(void);
+void sub_805EB9C(u8 affineMode);
+void LoadAndCreateEnemyShadowSprites(void);
+void SpriteCB_SetInvisible(struct Sprite *sprite);
+void SetBankEnemyShadowSpriteCallback(u8 bank, u16 species);
+void EnemyShadowCallbackToSetInvisible(u8 bank);
+void sub_805EF14(void);
+void ClearTemporarySpeciesSpriteData(u8 bank, bool8 dontClearSubstitute);
+void AllocateMonSpritesGfx(void);
+void FreeMonSpritesGfx(void);
+bool32 ShouldPlayNormalPokeCry(struct Pokemon *mon);
+
+#endif // GUARD_BATTLE_GFX_SFX_UTIL
diff --git a/include/battle_interface.h b/include/battle_interface.h
new file mode 100644
index 000000000..b2d3b1b97
--- /dev/null
+++ b/include/battle_interface.h
@@ -0,0 +1,75 @@
+#ifndef GUARD_BATTLE_INTERFACE_H
+#define GUARD_BATTLE_INTERFACE_H
+
+#include "battle_controllers.h"
+
+enum
+{
+ HP_CURRENT,
+ HP_MAX
+};
+
+enum
+{
+ HEALTH_BAR,
+ EXP_BAR
+};
+
+enum
+{
+ HP_BAR_EMPTY,
+ HP_BAR_RED,
+ HP_BAR_YELLOW,
+ HP_BAR_GREEN,
+ HP_BAR_FULL,
+};
+
+#define TAG_HEALTHBOX_PLAYER1_TILE 0xD6FF
+#define TAG_HEALTHBOX_PLAYER2_TILE 0xD700
+#define TAG_HEALTHBOX_OPPONENT1_TILE 0xD701
+#define TAG_HEALTHBOX_OPPONENT2_TILE 0xD702
+
+#define TAG_HEALTHBOX_SAFARI_TILE 0xD70B
+
+#define TAG_STATUS_SUMMARY_BAR_TILE 0xD70C
+#define TAG_STATUS_SUMMARY_BALLS_TILE 0xD714
+
+#define TAG_HEALTHBOX_PAL 0xD6FF
+#define TAG_STATUS_SUMMARY_BAR_PAL 0xD710
+#define TAG_STATUS_SUMMARY_BALLS_PAL 0xD712
+
+enum
+{
+ HEALTHBOX_ALL,
+ HEALTHBOX_CURRENT_HP,
+ HEALTHBOX_MAX_HP,
+ HEALTHBOX_LEVEL,
+ HEALTHBOX_NICK,
+ HEALTHBOX_HEALTH_BAR,
+ HEALTHBOX_EXP_BAR,
+ HEALTHBOX_UNUSED_7,
+ HEALTHBOX_UNUSED_8,
+ HEALTHBOX_STATUS_ICON,
+ HEALTHBOX_SAFARI_ALL_TEXT,
+ HEALTHBOX_SAFARI_BALLS_TEXT
+};
+
+u8 CreateBankHealthboxSprites(u8 bank);
+u8 CreateSafariPlayerHealthboxSprites(void);
+void SetBattleBarStruct(u8 bank, u8 healthboxSpriteId, s32 maxVal, s32 currVal, s32 receivedValue);
+void SetHealthboxSpriteInvisible(u8 healthboxSpriteId);
+void SetHealthboxSpriteVisible(u8 healthboxSpriteId);
+void DestoryHealthboxSprite(u8 healthboxSpriteId);
+void DummyBattleInterfaceFunc(u8 healthboxSpriteId, bool8 isDoubleBattleBankOnly);
+void UpdateOamPriorityInAllHealthboxes(u8 priority);
+void SetBankHealthboxSpritePos(u8 bank);
+void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent);
+void SwapHpBarsWithHpText(void);
+u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 arg2, bool8 isBattleStart);
+void sub_8073C30(u8 taskId);
+void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elementId);
+s32 sub_8074AA0(u8 bank, u8 healthboxSpriteId, u8 whichBar, u8 arg3);
+u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale);
+u8 GetHPBarLevel(s16 hp, s16 maxhp);
+
+#endif // GUARD_BATTLE_INTERFACE_H
diff --git a/include/battle_message.h b/include/battle_message.h
new file mode 100644
index 000000000..30ddca469
--- /dev/null
+++ b/include/battle_message.h
@@ -0,0 +1,235 @@
+#ifndef GUARD_BATTLE_MESSAGE_H
+#define GUARD_BATTLE_MESSAGE_H
+
+// for 0xFD
+
+#define B_TXT_BUFF1 0x0
+#define B_TXT_BUFF2 0x1
+#define B_TXT_COPY_VAR_1 0x2
+#define B_TXT_COPY_VAR_2 0x3
+#define B_TXT_COPY_VAR_3 0x4
+#define B_TXT_PLAYER_MON1_NAME 0x5
+#define B_TXT_OPPONENT_MON1_NAME 0x6
+#define B_TXT_PLAYER_MON2_NAME 0x7
+#define B_TXT_OPPONENT_MON2_NAME 0x8
+#define B_TXT_LINK_PLAYER_MON1_NAME 0x9
+#define B_TXT_LINK_OPPONENT_MON1_NAME 0xA
+#define B_TXT_LINK_PLAYER_MON2_NAME 0xB
+#define B_TXT_LINK_OPPONENT_MON2_NAME 0xC
+#define B_TXT_ATK_NAME_WITH_PREFIX_MON1 0xD
+#define B_TXT_ATK_PARTNER_NAME 0xE
+#define B_TXT_ATK_NAME_WITH_PREFIX 0xF
+#define B_TXT_DEF_NAME_WITH_PREFIX 0x10
+#define B_TXT_EFF_NAME_WITH_PREFIX 0x11 // EFF = short for gEffectBank
+#define B_TXT_ACTIVE_NAME_WITH_PREFIX 0x12
+#define B_TXT_SCR_ACTIVE_NAME_WITH_PREFIX 0x13
+#define B_TXT_CURRENT_MOVE 0x14
+#define B_TXT_LAST_MOVE 0x15
+#define B_TXT_LAST_ITEM 0x16
+#define B_TXT_LAST_ABILITY 0x17
+#define B_TXT_ATK_ABILITY 0x18
+#define B_TXT_DEF_ABILITY 0x19
+#define B_TXT_SCR_ACTIVE_ABILITY 0x1A
+#define B_TXT_EFF_ABILITY 0x1B
+#define B_TXT_TRAINER1_CLASS 0x1C
+#define B_TXT_TRAINER1_NAME 0x1D
+#define B_TXT_1E 0x1E // trainer name for a link player
+#define B_TXT_1F 0x1F // trainer name for a link player
+#define B_TXT_20 0x20 // trainer name for a link player
+#define B_TXT_21 0x21 // trainer name for a link player
+#define B_TXT_22 0x22 // trainer name for a link player
+#define B_TXT_PLAYER_NAME 0x23
+#define B_TXT_TRAINER1_LOSE_TEXT 0x24
+#define B_TXT_TRAINER1_WIN_TEXT 0x25
+#define B_TXT_26 0x26
+#define B_TXT_PC_CREATOR_NAME 0x27
+#define B_TXT_ATK_PREFIX1 0x28
+#define B_TXT_DEF_PREFIX1 0x29
+#define B_TXT_ATK_PREFIX2 0x2A
+#define B_TXT_DEF_PREFIX2 0x2B
+#define B_TXT_ATK_PREFIX3 0x2C
+#define B_TXT_DEF_PREFIX3 0x2D
+#define B_TXT_TRAINER2_CLASS 0x2E
+#define B_TXT_TRAINER2_NAME 0x2F
+#define B_TXT_TRAINER2_LOSE_TEXT 0x30
+#define B_TXT_TRAINER2_WIN_TEXT 0x31
+#define B_TXT_PARTNER_CLASS 0x32
+#define B_TXT_PARTNER_NAME 0x33
+#define B_TXT_BUFF3 0x34
+
+// for B_TXT_BUFF1, B_TXT_BUFF2 and B_TXT_BUFF3
+
+#define B_BUFF_STRING 0
+#define B_BUFF_NUMBER 1
+#define B_BUFF_MOVE 2
+#define B_BUFF_TYPE 3
+#define B_BUFF_MON_NICK_WITH_PREFIX 4
+#define B_BUFF_STAT 5
+#define B_BUFF_SPECIES 6
+#define B_BUFF_MON_NICK 7
+#define B_BUFF_NEGATIVE_FLAVOR 8
+#define B_BUFF_ABILITY 9
+#define B_BUFF_ITEM 10
+
+#define B_BUFF_PLACEHOLDER_BEGIN 0xFD
+#define B_BUFF_EOS 0xFF
+
+#define PREPARE_FLAVOR_BUFFER(textVar, flavorId) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_NEGATIVE_FLAVOR; \
+ textVar[2] = flavorId; \
+ textVar[3] = B_BUFF_EOS; \
+}
+
+#define PREPARE_STAT_BUFFER(textVar, statId) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_STAT; \
+ textVar[2] = statId; \
+ textVar[3] = B_BUFF_EOS; \
+}
+
+#define PREPARE_ABILITY_BUFFER(textVar, abilityId) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_ABILITY; \
+ textVar[2] = abilityId; \
+ textVar[3] = B_BUFF_EOS; \
+}
+
+#define PREPARE_TYPE_BUFFER(textVar, typeId) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_TYPE; \
+ textVar[2] = typeId; \
+ textVar[3] = B_BUFF_EOS; \
+}
+
+#define PREPARE_BYTE_NUMBER_BUFFER(textVar, maxDigits, number) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_NUMBER; \
+ textVar[2] = 1; \
+ textVar[3] = maxDigits; \
+ textVar[4] = (number); \
+ textVar[5] = B_BUFF_EOS; \
+}
+
+#define PREPARE_HWORD_NUMBER_BUFFER(textVar, maxDigits, number) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_NUMBER; \
+ textVar[2] = 2; \
+ textVar[3] = maxDigits; \
+ textVar[4] = (number); \
+ textVar[5] = (number & 0x0000FF00) >> 8; \
+ textVar[6] = B_BUFF_EOS; \
+}
+
+#define PREPARE_WORD_NUMBER_BUFFER(textVar, maxDigits, number) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_NUMBER; \
+ textVar[2] = 4; \
+ textVar[3] = maxDigits; \
+ textVar[4] = (number); \
+ textVar[5] = (number & 0x0000FF00) >> 8; \
+ textVar[6] = (number & 0x00FF0000) >> 16; \
+ textVar[7] = (number & 0xFF000000) >> 24; \
+ textVar[8] = B_BUFF_EOS; \
+}
+
+#define PREPARE_STRING_BUFFER(textVar, stringId) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_STRING; \
+ textVar[2] = stringId; \
+ textVar[3] = (stringId & 0xFF00) >> 8; \
+ textVar[4] = B_BUFF_EOS; \
+}
+
+#define PREPARE_MOVE_BUFFER(textVar, move) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_MOVE; \
+ textVar[2] = move; \
+ textVar[3] = (move & 0xFF00) >> 8; \
+ textVar[4] = B_BUFF_EOS; \
+}
+
+#define PREPARE_ITEM_BUFFER(textVar, item) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_ITEM; \
+ textVar[2] = item; \
+ textVar[3] = (item & 0xFF00) >> 8; \
+ textVar[4] = B_BUFF_EOS; \
+}
+
+#define PREPARE_SPECIES_BUFFER(textVar, species) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_SPECIES; \
+ textVar[2] = species; \
+ textVar[3] = (species & 0xFF00) >> 8; \
+ textVar[4] = B_BUFF_EOS; \
+}
+
+#define PREPARE_MON_NICK_WITH_PREFIX_BUFFER(textVar, bank, partyId) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_MON_NICK_WITH_PREFIX; \
+ textVar[2] = bank; \
+ textVar[3] = partyId; \
+ textVar[4] = B_BUFF_EOS; \
+}
+
+#define PREPARE_MON_NICK_BUFFER(textVar, bank, partyId) \
+{ \
+ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
+ textVar[1] = B_BUFF_MON_NICK; \
+ textVar[2] = bank; \
+ textVar[3] = partyId; \
+ textVar[4] = B_BUFF_EOS; \
+}
+
+struct StringInfoBattle
+{
+ u16 currentMove;
+ u16 originallyUsedMove;
+ u16 lastItem;
+ u8 lastAbility;
+ u8 scrActive;
+ u8 unk1605E;
+ u8 hpScale;
+ u8 StringBank;
+ u8 moveType;
+ u8 abilities[4];
+ u8 textBuffs[3][0x10];
+};
+
+void BufferStringBattle(u16 stringID);
+u32 BattleStringExpandPlaceholdersToDisplayedString(const u8* src);
+u32 BattleStringExpandPlaceholders(const u8* src, u8* dst);
+void BattleHandleAddTextPrinter(const u8* text, u8 arg1);
+void SetPpNumbersPaletteInMoveSelection(void);
+u8 GetCurrentPpToMaxPpState(u8 currentPp, u8 maxPp);
+
+#define TEXT_BUFF_ARRAY_COUNT 16
+
+extern u8 gDisplayedStringBattle[300];
+extern u8 gBattleTextBuff1[TEXT_BUFF_ARRAY_COUNT];
+extern u8 gBattleTextBuff2[TEXT_BUFF_ARRAY_COUNT];
+extern u8 gBattleTextBuff3[TEXT_BUFF_ARRAY_COUNT];
+
+extern const u8* const gBattleStringsTable[];
+extern const u8* const gStatNamesTable[];
+extern const u8* const gPokeblockWasTooXStringTable[];
+extern const u8* const gRefereeStringsTable[];
+extern const u8* const gStatNamesTable2[];
+
+extern const u16 gMissStringIds[];
+extern const u16 gTrappingMoves[];
+
+#endif // GUARD_BATTLE_MESSAGE_H
diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h
new file mode 100644
index 000000000..80fabaa64
--- /dev/null
+++ b/include/battle_script_commands.h
@@ -0,0 +1,66 @@
+#ifndef GUARD_BATTLE_SCRIPT_COMMANDS_H
+#define GUARD_BATTLE_SCRIPT_COMMANDS_H
+
+#define NO_ACC_CALC 0xFFFE
+#define NO_ACC_CALC_CHECK_LOCK_ON 0xFFFF
+#define ACC_CURR_MOVE 0
+
+#define CMP_EQUAL 0x0
+#define CMP_NOT_EQUAL 0x1
+#define CMP_GREATER_THAN 0x2
+#define CMP_LESS_THAN 0x3
+#define CMP_COMMON_BITS 0x4
+#define CMP_NO_COMMON_BITS 0x5
+
+#define BS_ATTACKER_WITH_PARTNER 4 // for atk98_status_icon_update
+#define BS_GET_ATTACKER_SIDE 8 // for atk1E_jumpifability
+#define BS_GET_NOT_ATTACKER_SIDE 9 // for atk1E_jumpifability
+
+#define ATK48_STAT_NEGATIVE 0x1
+#define ATK48_STAT_BY_TWO 0x2
+#define ATK48_BIT_x4 0x4
+#define ATK48_LOWER_FAIL_CHECK 0x8
+
+#define ATK4F_DONT_CHECK_STATUSES 0x80
+
+#define VARIOUS_CANCEL_MULTI_TURN_MOVES 0
+#define VARIOUS_SET_MAGIC_COAT_TARGET 1
+#define VARIOUS_IS_RUNNING_IMPOSSIBLE 2
+#define VARIOUS_GET_MOVE_TARGET 3
+#define VARIOUS_RESET_INTIMIDATE_TRACE_BITS 5
+#define VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP 6
+#define VARIOUS_EMIT_YESNOBOX 13
+#define VARIOUS_WAIT_CRY 18
+#define VARIOUS_RETURN_OPPONENT_MON1 19
+#define VARIOUS_RETURN_OPPONENT_MON2 20
+#define VARIOUS_SET_TELEPORT_OUTCOME 25
+#define VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC 26
+
+#define ATK80_DMG_CHANGE_SIGN 0
+#define ATK80_DMG_HALF_BY_TWO_NOT_MORE_THAN_HALF_MAX_HP 1
+#define ATK80_DMG_DOUBLED 2
+
+#define STAT_CHANGE_BS_PTR 0x1
+#define STAT_CHANGE_NOT_PROTECT_AFFECTED 0x20
+
+#define STAT_CHANGE_WORKED 0
+#define STAT_CHANGE_DIDNT_WORK 1
+
+#define WINDOW_CLEAR 0x1
+#define WINDOW_x80 0x80
+
+void AI_CalcDmg(u8 bankAtk, u8 bankDef);
+u8 TypeCalc(u16 move, u8 bankAtk, u8 bankDef);
+u8 AI_TypeCalc(u16 move, u16 targetSpecies, u8 targetAbility);
+u8 BankGetTurnOrder(u8 bank);
+void SetMoveEffect(bool8 primary, u8 certain);
+void BattleDestroyYesNoCursorAt(u8 cursorPosition);
+void BattleCreateYesNoCursorAt(u8 cursorPosition);
+void BufferMoveToLearnIntoBattleTextBuff2(void);
+void HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags);
+bool8 UproarWakeUpCheck(u8 bank);
+
+extern void (* const gBattleScriptingCommandsTable[])(void);
+extern const u8 gUnknown_0831C494[][4];
+
+#endif // GUARD_BATTLE_SCRIPT_COMMANDS_H
diff --git a/include/battle_scripts.h b/include/battle_scripts.h
new file mode 100644
index 000000000..2e31a37c5
--- /dev/null
+++ b/include/battle_scripts.h
@@ -0,0 +1,290 @@
+#ifndef GUARD_BATTLE_SCRIPTS_H
+#define GUARD_BATTLE_SCRIPTS_H
+
+extern const u8 BattleScript_HitFromCritCalc[];
+extern const u8 BattleScript_MoveEnd[];
+extern const u8 BattleScript_MakeMoveMissed[];
+extern const u8 BattleScript_PrintMoveMissed[];
+extern const u8 BattleScript_MoveMissedPause[];
+extern const u8 BattleScript_MoveMissed[];
+extern const u8 BattleScript_ButItFailed[];
+extern const u8 BattleScript_StatUp[];
+extern const u8 BattleScript_StatDown[];
+extern const u8 BattleScript_AlreadyAtFullHp[];
+extern const u8 BattleScript_PresentHealTarget[];
+extern const u8 BattleScript_MoveUsedMustRecharge[];
+extern const u8 BattleScript_FaintAttacker[];
+extern const u8 BattleScript_FaintTarget[];
+extern const u8 BattleScript_GiveExp[];
+extern const u8 BattleScript_HandleFaintedMon[];
+extern const u8 BattleScript_LocalTrainerBattleWon[];
+extern const u8 BattleScript_LocalTwoTrainersDefeated[];
+extern const u8 BattleScript_LocalBattleWonLoseTexts[];
+extern const u8 BattleScript_LocalBattleWonReward[];
+extern const u8 BattleScript_PayDayMoneyAndPickUpItems[];
+extern const u8 BattleScript_LocalBattleLost[];
+extern const u8 BattleScript_LocalBattleLostPrintWhiteOut[];
+extern const u8 BattleScript_LocalBattleLostEnd[];
+extern const u8 BattleScript_CheckDomeDrew[];
+extern const u8 BattleScript_82DAA0B[];
+extern const u8 BattleScript_82DAA31[];
+extern const u8 BattleScript_LinkBattleWonOrLost[];
+extern const u8 BattleScript_82DAA5C[];
+extern const u8 BattleScript_82DAA83[];
+extern const u8 BattleScript_FrontierTrainerBattleWon[];
+extern const u8 BattleScript_82DAAAB[];
+extern const u8 BattleScript_82DAAAE[];
+extern const u8 BattleScript_82DAACB[];
+extern const u8 BattleScript_82DAADA[];
+extern const u8 BattleScript_SmokeBallEscape[];
+extern const u8 BattleScript_RanAwayUsingMonAbility[];
+extern const u8 BattleScript_GotAwaySafely[];
+extern const u8 BattleScript_WildMonFled[];
+extern const u8 BattleScript_PrintCantRunFromTrainer[];
+extern const u8 BattleScript_PrintFailedToRunString[];
+extern const u8 BattleScript_PrintCantEscapeFromBattle[];
+extern const u8 BattleScript_PrintFullBox[];
+extern const u8 BattleScript_ActionSwitch[];
+extern const u8 BattleScript_82DAB35[];
+extern const u8 BattleScript_82DAB37[];
+extern const u8 BattleScript_82DAB44[];
+extern const u8 BattleScript_82DAB77[];
+extern const u8 BattleScript_82DABB8[];
+extern const u8 BattleScript_Pausex20[];
+extern const u8 BattleScript_LevelUp[];
+extern const u8 BattleScript_RainContinuesOrEnds[];
+extern const u8 BattleScript_DamagingWeatherContinues[];
+extern const u8 BattleScript_SandStormHailEnds[];
+extern const u8 BattleScript_SunlightContinues[];
+extern const u8 BattleScript_SunlightFaded[];
+extern const u8 BattleScript_OverworldWeatherStarts[];
+extern const u8 BattleScript_SideStatusWoreOff[];
+extern const u8 BattleScript_SafeguardProtected[];
+extern const u8 BattleScript_SafeguardEnds[];
+extern const u8 BattleScript_LeechSeedTurnDrain[];
+extern const u8 BattleScript_82DAD47[];
+extern const u8 BattleScript_82DAD4D[];
+extern const u8 BattleScript_BideStoringEnergy[];
+extern const u8 BattleScript_BideAttack[];
+extern const u8 BattleScript_BideNoEnergyToAttack[];
+extern const u8 BattleScript_SuccessForceOut[];
+extern const u8 BattleScript_82DADF1[];
+extern const u8 BattleScript_MistProtected[];
+extern const u8 BattleScript_RageIsBuilding[];
+extern const u8 BattleScript_MoveUsedIsDisabled[];
+extern const u8 BattleScript_SelectingDisabledMove[];
+extern const u8 BattleScript_DisabledNoMore[];
+extern const u8 BattleScript_SelectingDisabledMoveInPalace[];
+extern const u8 BattleScript_SelectingUnusableMoveInPalace[];
+extern const u8 BattleScript_EncoredNoMore[];
+extern const u8 BattleScript_DestinyBondTakesLife[];
+extern const u8 BattleScript_SpikesOnAttacker[];
+extern const u8 BattleScript_82DAE7A[];
+extern const u8 BattleScript_SpikesOnTarget[];
+extern const u8 BattleScript_82DAEB1[];
+extern const u8 BattleScript_SpikesOngBank1[];
+extern const u8 BattleScript_82DAEE8[];
+extern const u8 BattleScript_82DAEFE[];
+extern const u8 BattleScript_PerishSongTakesLife[];
+extern const u8 BattleScript_PerishSongCountGoesDown[];
+extern const u8 BattleScript_AllStatsUp[];
+extern const u8 BattleScript_82DAF54[];
+extern const u8 BattleScript_82DAF72[];
+extern const u8 BattleScript_82DAF86[];
+extern const u8 BattleScript_82DAF9A[];
+extern const u8 BattleScript_82DAFAE[];
+extern const u8 BattleScript_82DAFC2[];
+extern const u8 BattleScript_RapidSpinAway[];
+extern const u8 BattleScript_WrapFree[];
+extern const u8 BattleScript_LeechSeedFree[];
+extern const u8 BattleScript_SpikesFree[];
+extern const u8 BattleScript_MonTookFutureAttack[];
+extern const u8 BattleScript_82DB001[];
+extern const u8 BattleScript_82DB008[];
+extern const u8 BattleScript_82DB020[];
+extern const u8 BattleScript_82DB027[];
+extern const u8 BattleScript_82DB03F[];
+extern const u8 BattleScript_82DB058[];
+extern const u8 BattleScript_NoMovesLeft[];
+extern const u8 BattleScript_SelectingMoveWithNoPP[];
+extern const u8 BattleScript_NoPPForMove[];
+extern const u8 BattleScript_SelectingTormentedMove[];
+extern const u8 BattleScript_MoveUsedIsTormented[];
+extern const u8 BattleScript_SelectingTormentedMoveInPalace[];
+extern const u8 BattleScript_SelectingNotAllowedMoveTaunt[];
+extern const u8 BattleScript_MoveUsedIsTaunted[];
+extern const u8 BattleScript_SelectingNotAllowedMoveTauntInPalace[];
+extern const u8 BattleScript_WishComesTrue[];
+extern const u8 BattleScript_IngrainTurnHeal[];
+extern const u8 BattleScript_AtkDefDown[];
+extern const u8 BattleScript_82DB144[];
+extern const u8 BattleScript_82DB167[];
+extern const u8 BattleScript_KnockedOff[];
+extern const u8 BattleScript_MoveUsedIsImprisoned[];
+extern const u8 BattleScript_SelectingImprisionedMove[];
+extern const u8 BattleScript_SelectingImprisionedMoveInPalace[];
+extern const u8 BattleScript_GrudgeTakesPp[];
+extern const u8 BattleScript_MagicCoatBounce[];
+extern const u8 BattleScript_SnatchedMove[];
+extern const u8 BattleScript_EnduredMsg[];
+extern const u8 BattleScript_OneHitKOMsg[];
+extern const u8 BattleScript_SAtkDown2[];
+extern const u8 BattleScript_82DB1FE[];
+extern const u8 BattleScript_FocusPunchSetUp[];
+extern const u8 BattleScript_MoveUsedIsAsleep[];
+extern const u8 BattleScript_MoveUsedWokeUp[];
+extern const u8 BattleScript_MonWokeUpInUproar[];
+extern const u8 BattleScript_PoisonTurnDmg[];
+extern const u8 BattleScript_82DB243[];
+extern const u8 BattleScript_82DB245[];
+extern const u8 BattleScript_82DB25E[];
+extern const u8 BattleScript_BurnTurnDmg[];
+extern const u8 BattleScript_MoveUsedIsFrozen[];
+extern const u8 BattleScript_MoveUsedUnfroze[];
+extern const u8 BattleScript_DefrostedViaFireMove[];
+extern const u8 BattleScript_MoveUsedIsParalyzed[];
+extern const u8 BattleScript_MoveUsedFlinched[];
+extern const u8 BattleScript_PrintUproarOverTurns[];
+extern const u8 BattleScript_ThrashConfuses[];
+extern const u8 BattleScript_MoveUsedIsConfused[];
+extern const u8 BattleScript_82DB2D4[];
+extern const u8 BattleScript_82DB2FF[];
+extern const u8 BattleScript_MoveUsedIsConfusedNoMore[];
+extern const u8 BattleScript_PrintPayDayMoneyString[];
+extern const u8 BattleScript_WrapTurnDmg[];
+extern const u8 BattleScript_WrapEnds[];
+extern const u8 BattleScript_MoveUsedIsInLove[];
+extern const u8 BattleScript_MoveUsedIsParalyzedCantAttack[];
+extern const u8 BattleScript_NightmareTurnDmg[];
+extern const u8 BattleScript_CurseTurnDmg[];
+extern const u8 BattleScript_TargetPRLZHeal[];
+extern const u8 BattleScript_MoveEffectSleep[];
+extern const u8 BattleScript_82DB374[];
+extern const u8 BattleScript_YawnMakesAsleep[];
+extern const u8 BattleScript_MoveEffectPoison[];
+extern const u8 BattleScript_MoveEffectBurn[];
+extern const u8 BattleScript_MoveEffectFreeze[];
+extern const u8 BattleScript_MoveEffectParalysis[];
+extern const u8 BattleScript_MoveEffectUproar[];
+extern const u8 BattleScript_MoveEffectToxic[];
+extern const u8 BattleScript_MoveEffectPayDay[];
+extern const u8 BattleScript_MoveEffectWrap[];
+extern const u8 BattleScript_MoveEffectConfusion[];
+extern const u8 BattleScript_MoveEffectRecoil33[];
+extern const u8 BattleScript_DoRecoil33[];
+extern const u8 BattleScript_Recoil33End[];
+extern const u8 BattleScript_ItemSteal[];
+extern const u8 BattleScript_DrizzleActivates[];
+extern const u8 BattleScript_SpeedBoostActivates[];
+extern const u8 BattleScript_TraceActivates[];
+extern const u8 BattleScript_RainDishActivates[];
+extern const u8 BattleScript_SandstreamActivates[];
+extern const u8 BattleScript_ShedSkinActivates[];
+extern const u8 BattleScript_WeatherFormChanges[];
+extern const u8 BattleScript_WeatherFormChangesLoop[];
+extern const u8 BattleScript_CastformChange[];
+extern const u8 BattleScript_82DB4AF[];
+extern const u8 BattleScript_82DB4B8[];
+extern const u8 BattleScript_82DB4BE[];
+extern const u8 BattleScript_82DB4C1[];
+extern const u8 BattleScript_82DB4CD[];
+extern const u8 BattleScript_82DB510[];
+extern const u8 BattleScript_82DB51B[];
+extern const u8 BattleScript_82DB51C[];
+extern const u8 BattleScript_DroughtActivates[];
+extern const u8 BattleScript_TookAttack[];
+extern const u8 BattleScript_SturdyPreventsOHKO[];
+extern const u8 BattleScript_DampStopsExplosion[];
+extern const u8 BattleScript_MoveHPDrain_PPLoss[];
+extern const u8 BattleScript_MoveHPDrain[];
+extern const u8 BattleScript_MonMadeMoveUseless_PPLoss[];
+extern const u8 BattleScript_MonMadeMoveUseless[];
+extern const u8 BattleScript_FlashFireBoost_PPLoss[];
+extern const u8 BattleScript_FlashFireBoost[];
+extern const u8 BattleScript_AbilityNoStatLoss[];
+extern const u8 BattleScript_BRNPrevention[];
+extern const u8 BattleScript_PRLZPrevention[];
+extern const u8 BattleScript_PSNPrevention[];
+extern const u8 BattleScript_ObliviousPreventsAttraction[];
+extern const u8 BattleScript_FlinchPrevention[];
+extern const u8 BattleScript_OwnTempoPrevents[];
+extern const u8 BattleScript_SoundproofProtected[];
+extern const u8 BattleScript_AbilityNoSpecificStatLoss[];
+extern const u8 BattleScript_StickyHoldActivates[];
+extern const u8 BattleScript_ColorChangeActivates[];
+extern const u8 BattleScript_RoughSkinActivates[];
+extern const u8 BattleScript_CuteCharmActivates[];
+extern const u8 BattleScript_ApplySecondaryEffect[];
+extern const u8 BattleScript_SynchronizeActivates[];
+extern const u8 BattleScript_NoItemSteal[];
+extern const u8 BattleScript_AbilityCuredStatus[];
+extern const u8 BattleScript_82DB695[];
+extern const u8 BattleScript_IgnoresAndUsesRandomMove[];
+extern const u8 BattleScript_MoveUsedLoafingAround[];
+extern const u8 BattleScript_82DB6C7[];
+extern const u8 BattleScript_IgnoresAndFallsAsleep[];
+extern const u8 BattleScript_82DB6F0[];
+extern const u8 BattleScript_SubstituteFade[];
+extern const u8 BattleScript_BerryCurePrlzEnd2[];
+extern const u8 BattleScript_BerryCureParRet[];
+extern const u8 BattleScript_BerryCurePsnEnd2[];
+extern const u8 BattleScript_BerryCurePsnRet[];
+extern const u8 BattleScript_BerryCureBrnEnd2[];
+extern const u8 BattleScript_BerryCureBrnRet[];
+extern const u8 BattleScript_BerryCureFrzEnd2[];
+extern const u8 BattleScript_BerryCureFrzRet[];
+extern const u8 BattleScript_BerryCureSlpEnd2[];
+extern const u8 BattleScript_BerryCureSlpRet[];
+extern const u8 BattleScript_BerryCureConfusionEnd2[];
+extern const u8 BattleScript_BerryCureConfusionRet[];
+extern const u8 BattleScript_BerryCureChosenStatusEnd2[];
+extern const u8 BattleScript_BerryCureChosenStatusRet[];
+extern const u8 BattleScript_WhiteHerbEnd2[];
+extern const u8 BattleScript_WhiteHerbRet[];
+extern const u8 BattleScript_ItemHealHP_RemoveItem[];
+extern const u8 BattleScript_BerryPPHealEnd2[];
+extern const u8 BattleScript_ItemHealHP_End2[];
+extern const u8 BattleScript_ItemHealHP_Ret[];
+extern const u8 BattleScript_SelectingNotAllowedMoveChoiceItem[];
+extern const u8 BattleScript_HangedOnMsg[];
+extern const u8 BattleScript_BerryConfuseHealEnd2[];
+extern const u8 BattleScript_BerryStatRaiseEnd2[];
+extern const u8 BattleScript_82DB85B[];
+extern const u8 BattleScript_BerryFocusEnergyEnd2[];
+extern const u8 BattleScript_ActionSelectionItemsCantBeUsed[];
+extern const u8 BattleScript_82DB87D[];
+extern const u8 BattleScript_82DB881[];
+extern const u8 BattleScript_82DB887[];
+extern const u8 BattleScript_82DB89D[];
+extern const u8 BattleScript_82DB8BE[];
+extern const u8 BattleScript_82DB8E0[];
+extern const u8 BattleScript_82DB8F3[];
+extern const u8 BattleScript_82DB973[];
+extern const u8 BattleScript_82DB992[];
+extern const u8 BattleScript_AskIfWantsToForfeitMatch[];
+extern const u8 BattleScript_PrintPlayerForfeited[];
+extern const u8 BattleScript_PrintPlayerForfeitedLinkBattle[];
+extern const u8 BattleScript_BallThrow[];
+extern const u8 BattleScript_BallThrowByWally[];
+extern const u8 BattleScript_SafariBallThrow[];
+extern const u8 BattleScript_SuccessBallThrow[];
+extern const u8 BattleScript_82DBD92[];
+extern const u8 BattleScript_82DBDA5[];
+extern const u8 BattleScript_82DBDC2[];
+extern const u8 BattleScript_82DBDC3[];
+extern const u8 BattleScript_WallyBallThrow[];
+extern const u8 BattleScript_ShakeBallThrow[];
+extern const u8 BattleScript_82DBE01[];
+extern const u8 BattleScript_TrainerBallBlock[];
+extern const u8 BattleScript_82DBE12[];
+extern const u8 BattleScript_82DBE1C[];
+extern const u8 BattleScript_82DBE4B[];
+extern const u8 BattleScript_82DBE6F[];
+extern const u8 BattleScript_82DBE91[];
+extern const u8 BattleScript_RunByUsingItem[];
+extern const u8 BattleScript_ActionWatchesCarefully[];
+extern const u8 BattleScript_ActionGetNear[];
+extern const u8 BattleScript_ActionThrowPokeblock[];
+extern const u8 BattleScript_82DBEE3[];
+
+#endif // GUARD_BATTLE_SCRIPTS_H
diff --git a/include/battle_setup.h b/include/battle_setup.h
new file mode 100644
index 000000000..0168022cc
--- /dev/null
+++ b/include/battle_setup.h
@@ -0,0 +1,18 @@
+#ifndef GUARD_BATTLE_SETUP_H
+#define GUARD_BATTLE_SETUP_H
+
+void BattleSetup_StartScriptedWildBattle(void);
+u8 BattleSetup_GetTerrainId(void);
+u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data);
+void BattleSetup_StartBattlePikeWildBattle(void);
+void BattleSetup_StartWildBattle(void);
+void BattleSetup_StartRoamerBattle(void);
+
+u8 HasTrainerAlreadyBeenFought(u16);
+void trainer_flag_set(u16);
+void trainer_flag_clear(u16);
+void BattleSetup_StartTrainerBattle(void);
+u8 *BattleSetup_GetScriptAddrAfterBattle(void);
+u8 *BattleSetup_GetTrainerPostBattleScript(void);
+
+#endif // GUARD_BATTLE_SETUP_H
diff --git a/include/battle_string_ids.h b/include/battle_string_ids.h
new file mode 100644
index 000000000..f242284b0
--- /dev/null
+++ b/include/battle_string_ids.h
@@ -0,0 +1,387 @@
+#ifndef GUARD_BATTLE_STRING_IDS_H
+#define GUARD_BATTLE_STRING_IDS_H
+
+#define BATTLESTRINGS_COUNT 369
+
+#define BATTLESTRINGS_ID_ADDER 12 // all battlestrings have its ID + 12, because first 5 are reserved
+
+#define STRINGID_INTROMSG 0
+#define STRINGID_INTROSENDOUT 1
+#define STRINGID_RETURNMON 2
+#define STRINGID_SWITCHINMON 3
+#define STRINGID_USEDMOVE 4
+#define STRINGID_BATTLEEND 5
+
+
+// todo: make some of those names less vague: attacker/target vs pkmn, etc.
+#define STRINGID_TRAINER1LOSETEXT 12
+#define STRINGID_PKMNGAINEDEXP 13
+#define STRINGID_PKMNGREWTOLV 14
+#define STRINGID_PKMNLEARNEDMOVE 15
+#define STRINGID_TRYTOLEARNMOVE1 16
+#define STRINGID_TRYTOLEARNMOVE2 17
+#define STRINGID_TRYTOLEARNMOVE3 18
+#define STRINGID_PKMNFORGOTMOVE 19
+#define STRINGID_STOPLEARNINGMOVE 20
+#define STRINGID_DIDNOTLEARNMOVE 21
+#define STRINGID_PKMNLEARNEDMOVE2 22
+#define STRINGID_ATTACKMISSED 23
+#define STRINGID_PKMNPROTECTEDITSELF 24
+#define STRINGID_STATSWONTINCREASE2 25
+#define STRINGID_AVOIDEDDAMAGE 26
+#define STRINGID_ITDOESNTAFFECT 27
+#define STRINGID_ATTACKERFAINTED 28
+#define STRINGID_TARGETFAINTED 29
+#define STRINGID_PLAYERGOTMONEY 30
+#define STRINGID_PLAYERWHITEOUT 31
+#define STRINGID_PLAYERWHITEOUT2 32
+#define STRINGID_PREVENTSESCAPE 33
+#define STRINGID_HITXTIMES 34
+#define STRINGID_PKMNFELLASLEEP 35
+#define STRINGID_PKMNMADESLEEP 36
+#define STRINGID_PKMNALREADYASLEEP 37
+#define STRINGID_PKMNALREADYASLEEP2 38
+#define STRINGID_PKMNWASNTAFFECTED 39
+#define STRINGID_PKMNWASPOISONED 40
+#define STRINGID_PKMNPOISONEDBY 41
+#define STRINGID_PKMNHURTBYPOISON 42
+#define STRINGID_PKMNALREADYPOISONED 43
+#define STRINGID_PKMNBADLYPOISONED 44
+#define STRINGID_PKMNENERGYDRAINED 45
+#define STRINGID_PKMNWASBURNED 46
+#define STRINGID_PKMNBURNEDBY 47
+#define STRINGID_PKMNHURTBYBURN 48
+#define STRINGID_PKMNWASFROZEN 49
+#define STRINGID_PKMNFROZENBY 50
+#define STRINGID_PKMNISFROZEN 51
+#define STRINGID_PKMNWASDEFROSTED 52
+#define STRINGID_PKMNWASDEFROSTED2 53
+#define STRINGID_PKMNWASDEFROSTEDBY 54
+#define STRINGID_PKMNWASPARALYZED 55
+#define STRINGID_PKMNWASPARALYZEDBY 56
+#define STRINGID_PKMNISPARALYZED 57
+#define STRINGID_PKMNISALREADYPARALYZED 58
+#define STRINGID_PKMNHEALEDPARALYSIS 59
+#define STRINGID_PKMNDREAMEATEN 60
+#define STRINGID_STATSWONTINCREASE 61
+#define STRINGID_STATSWONTDECREASE 62
+#define STRINGID_TEAMSTOPPEDWORKING 63
+#define STRINGID_FOESTOPPEDWORKING 64
+#define STRINGID_PKMNISCONFUSED 65
+#define STRINGID_PKMNHEALEDCONFUSION 66
+#define STRINGID_PKMNWASCONFUSED 67
+#define STRINGID_PKMNALREADYCONFUSED 68
+#define STRINGID_PKMNFELLINLOVE 69
+#define STRINGID_PKMNINLOVE 70
+#define STRINGID_PKMNIMMOBILIZEDBYLOVE 71
+#define STRINGID_PKMNBLOWNAWAY 72
+#define STRINGID_PKMNCHANGEDTYPE 73
+#define STRINGID_PKMNFLINCHED 74
+#define STRINGID_PKMNREGAINEDHEALTH 75
+#define STRINGID_PKMNHPFULL 76
+#define STRINGID_PKMNRAISEDSPDEF 77
+#define STRINGID_PKMNRAISEDDEF 78
+#define STRINGID_PKMNCOVEREDBYVEIL 79
+#define STRINGID_PKMNUSEDSAFEGUARD 80
+#define STRINGID_PKMNSAFEGUARDEXPIRED 81
+#define STRINGID_PKMNWENTTOSLEEP 82
+#define STRINGID_PKMNSLEPTHEALTHY 83
+#define STRINGID_PKMNWHIPPEDWHIRLWIND 84
+#define STRINGID_PKMNTOOKSUNLIGHT 85
+#define STRINGID_PKMNLOWEREDHEAD 86
+#define STRINGID_PKMNISGLOWING 87
+#define STRINGID_PKMNFLEWHIGH 88
+#define STRINGID_PKMNDUGHOLE 89
+#define STRINGID_PKMNSQUEEZEDBYBIND 90
+#define STRINGID_PKMNTRAPPEDINVORTEX 91
+#define STRINGID_PKMNWRAPPEDBY 92
+#define STRINGID_PKMNCLAMPED 93
+#define STRINGID_PKMNHURTBY 94
+#define STRINGID_PKMNFREEDFROM 95
+#define STRINGID_PKMNCRASHED 96
+#define STRINGID_PKMNSHROUDEDINMIST 97
+#define STRINGID_PKMNPROTECTEDBYMIST 98
+#define STRINGID_PKMNGETTINGPUMPED 99
+#define STRINGID_PKMNHITWITHRECOIL 100
+#define STRINGID_PKMNPROTECTEDITSELF2 101
+#define STRINGID_PKMNBUFFETEDBYSANDSTORM 102
+#define STRINGID_PKMNPELTEDBYHAIL 103
+#define STRINGID_PKMNSEEDED 104
+#define STRINGID_PKMNEVADEDATTACK 105
+#define STRINGID_PKMNSAPPEDBYLEECHSEED 106
+#define STRINGID_PKMNFASTASLEEP 107
+#define STRINGID_PKMNWOKEUP 108
+#define STRINGID_PKMNUPROARKEPTAWAKE 109
+#define STRINGID_PKMNWOKEUPINUPROAR 110
+#define STRINGID_PKMNCAUSEDUPROAR 111
+#define STRINGID_PKMNMAKINGUPROAR 112
+#define STRINGID_PKMNCALMEDDOWN 113
+#define STRINGID_PKMNCANTSLEEPINUPROAR 114
+#define STRINGID_PKMNSTOCKPILED 115
+#define STRINGID_PKMNCANTSTOCKPILE 116
+#define STRINGID_PKMNCANTSLEEPINUPROAR2 117
+#define STRINGID_UPROARKEPTPKMNAWAKE 118
+#define STRINGID_PKMNSTAYEDAWAKEUSING 119
+#define STRINGID_PKMNSTORINGENERGY 120
+#define STRINGID_PKMNUNLEASHEDENERGY 121
+#define STRINGID_PKMNFATIGUECONFUSION 122
+#define STRINGID_PKMNPICKEDUPITEM 123
+#define STRINGID_PKMNUNAFFECTED 124
+#define STRINGID_PKMNTRANSFORMEDINTO 125
+#define STRINGID_PKMNMADESUBSTITUTE 126
+#define STRINGID_PKMNHASSUBSTITUTE 127
+#define STRINGID_SUBSTITUTEDAMAGED 128
+#define STRINGID_PKMNSUBSTITUTEFADED 129
+#define STRINGID_PKMNMUSTRECHARGE 130
+#define STRINGID_PKMNRAGEBUILDING 131
+#define STRINGID_PKMNMOVEWASDISABLED 132
+#define STRINGID_PKMNMOVEISDISABLED 133
+#define STRINGID_PKMNMOVEDISABLEDNOMORE 134
+#define STRINGID_PKMNGOTENCORE 135
+#define STRINGID_PKMNENCOREENDED 136
+#define STRINGID_PKMNTOOKAIM 137
+#define STRINGID_PKMNSKETCHEDMOVE 138
+#define STRINGID_PKMNTRYINGTOTAKEFOE 139
+#define STRINGID_PKMNTOOKFOE 140
+#define STRINGID_PKMNREDUCEDPP 141
+#define STRINGID_PKMNSTOLEITEM 142
+#define STRINGID_TARGETCANTESCAPENOW 143
+#define STRINGID_PKMNFELLINTONIGHTMARE 144
+#define STRINGID_PKMNLOCKEDINNIGHTMARE 145
+#define STRINGID_PKMNLAIDCURSE 146
+#define STRINGID_PKMNAFFLICTEDBYCURSE 147
+#define STRINGID_SPIKESSCATTERED 148
+#define STRINGID_PKMNHURTBYSPIKES 149
+#define STRINGID_PKMNIDENTIFIED 150
+#define STRINGID_PKMNPERISHCOUNTFELL 151
+#define STRINGID_PKMNBRACEDITSELF 152
+#define STRINGID_PKMNENDUREDHIT 153
+#define STRINGID_MAGNITUDESTRENGTH 154
+#define STRINGID_PKMNCUTHPMAXEDATTACK 155
+#define STRINGID_PKMNCOPIEDSTATCHANGES 156
+#define STRINGID_PKMNGOTFREE 157
+#define STRINGID_PKMNSHEDLEECHSEED 158
+#define STRINGID_PKMNBLEWAWAYSPIKES 159
+#define STRINGID_PKMNFLEDFROMBATTLE 160
+#define STRINGID_PKMNFORESAWATTACK 161
+#define STRINGID_PKMNTOOKATTACK 162
+#define STRINGID_PKMNATTACK 163
+#define STRINGID_PKMNCENTERATTENTION 164
+#define STRINGID_PKMNCHARGINGPOWER 165
+#define STRINGID_NATUREPOWERTURNEDINTO 166
+#define STRINGID_PKMNSTATUSNORMAL 167
+#define STRINGID_PKMNHASNOMOVESLEFT 168
+#define STRINGID_PKMNSUBJECTEDTOTORMENT 169
+#define STRINGID_PKMNCANTUSEMOVETORMENT 170
+#define STRINGID_PKMNTIGHTENINGFOCUS 171
+#define STRINGID_PKMNFELLFORTAUNT 172
+#define STRINGID_PKMNCANTUSEMOVETAUNT 173
+#define STRINGID_PKMNREADYTOHELP 174
+#define STRINGID_PKMNSWITCHEDITEMS 175
+#define STRINGID_PKMNCOPIEDFOE 176
+#define STRINGID_PKMNMADEWISH 177
+#define STRINGID_PKMNWISHCAMETRUE 178
+#define STRINGID_PKMNPLANTEDROOTS 179
+#define STRINGID_PKMNABSORBEDNUTRIENTS 180
+#define STRINGID_PKMNANCHOREDITSELF 181
+#define STRINGID_PKMNWASMADEDROWSY 182
+#define STRINGID_PKMNKNOCKEDOFF 183
+#define STRINGID_PKMNSWAPPEDABILITIES 184
+#define STRINGID_PKMNSEALEDOPPONENTMOVE 185
+#define STRINGID_PKMNCANTUSEMOVESEALED 186
+#define STRINGID_PKMNWANTSGRUDGE 187
+#define STRINGID_PKMNLOSTPPGRUDGE 188
+#define STRINGID_PKMNSHROUDEDITSELF 189
+#define STRINGID_PKMNMOVEBOUNCED 190
+#define STRINGID_PKMNWAITSFORTARGET 191
+#define STRINGID_PKMNSNATCHEDMOVE 192
+#define STRINGID_PKMNMADEITRAIN 193
+#define STRINGID_PKMNRAISEDSPEED 194
+#define STRINGID_PKMNPROTECTEDBY 195
+#define STRINGID_PKMNPREVENTSUSAGE 196
+#define STRINGID_PKMNRESTOREDHPUSING 197
+#define STRINGID_PKMNCHANGEDTYPEWITH 198
+#define STRINGID_PKMNPREVENTSPARALYSISWITH 199
+#define STRINGID_PKMNPREVENTSROMANCEWITH 200
+#define STRINGID_PKMNPREVENTSPOISONINGWITH 201
+#define STRINGID_PKMNPREVENTSCONFUSIONWITH 202
+#define STRINGID_PKMNRAISEDFIREPOWERWITH 203
+#define STRINGID_PKMNANCHORSITSELFWITH 204
+#define STRINGID_PKMNCUTSATTACKWITH 205
+#define STRINGID_PKMNPREVENTSSTATLOSSWITH 206
+#define STRINGID_PKMNHURTSWITH 207
+#define STRINGID_PKMNTRACED 208
+#define STRINGID_STATSHARPLY 209
+#define STRINGID_STATROSE 210
+#define STRINGID_STATHARSHLY 211
+#define STRINGID_STATFELL 212
+#define STRINGID_PKMNSSTATCHANGED 213
+#define STRINGID_PKMNSSTATCHANGED2 214
+#define STRINGID_PKMNSSTATCHANGED3 215
+#define STRINGID_PKMNSSTATCHANGED4 216
+#define STRINGID_CRITICALHIT 217
+#define STRINGID_ONEHITKO 218
+#define STRINGID_123POOF 219
+#define STRINGID_ANDELLIPSIS 220
+#define STRINGID_NOTVERYEFFECTIVE 221
+#define STRINGID_SUPEREFFECTIVE 222
+#define STRINGID_GOTAWAYSAFELY 223
+#define STRINGID_WILDPKMNFLED 224
+#define STRINGID_NORUNNINGFROMTRAINERS 225
+#define STRINGID_CANTESCAPE 226
+#define STRINGID_DONTLEAVEBIRCH 227
+#define STRINGID_BUTNOTHINGHAPPENED 228
+#define STRINGID_BUTITFAILED 229
+#define STRINGID_ITHURTCONFUSION 230
+#define STRINGID_MIRRORMOVEFAILED 231
+#define STRINGID_STARTEDTORAIN 232
+#define STRINGID_DOWNPOURSTARTED 233
+#define STRINGID_RAINCONTINUES 234
+#define STRINGID_DOWNPOURCONTINUES 235
+#define STRINGID_RAINSTOPPED 236
+#define STRINGID_SANDSTORMBREWED 237
+#define STRINGID_SANDSTORMRAGES 238
+#define STRINGID_SANDSTORMSUBSIDED 239
+#define STRINGID_SUNLIGHTGOTBRIGHT 240
+#define STRINGID_SUNLIGHTSTRONG 241
+#define STRINGID_SUNLIGHTFADED 242
+#define STRINGID_STARTEDHAIL 243
+#define STRINGID_HAILCONTINUES 244
+#define STRINGID_HAILSTOPPED 245
+#define STRINGID_FAILEDTOSPITUP 246
+#define STRINGID_FAILEDTOSWALLOW 247
+#define STRINGID_WINDBECAMEHEATWAVE 248
+#define STRINGID_STATCHANGESGONE 249
+#define STRINGID_COINSSCATTERED 250
+#define STRINGID_TOOWEAKFORSUBSTITUTE 251
+#define STRINGID_SHAREDPAIN 252
+#define STRINGID_BELLCHIMED 253
+#define STRINGID_FAINTINTHREE 254
+#define STRINGID_NOPPLEFT 255
+#define STRINGID_BUTNOPPLEFT 256
+#define STRINGID_PLAYERUSEDITEM 257
+#define STRINGID_WALLYUSEDITEM 258
+#define STRINGID_TRAINERBLOCKEDBALL 259
+#define STRINGID_DONTBEATHIEF 260
+#define STRINGID_ITDODGEDBALL 261
+#define STRINGID_YOUMISSEDPKMN 262
+#define STRINGID_PKMNBROKEFREE 263
+#define STRINGID_ITAPPEAREDCAUGHT 264
+#define STRINGID_AARGHALMOSTHADIT 265
+#define STRINGID_SHOOTSOCLOSE 266
+#define STRINGID_GOTCHAPKMNCAUGHT 267
+#define STRINGID_GOTCHAPKMNCAUGHT2 268
+#define STRINGID_GIVENICKNAMECAPTURED 269
+#define STRINGID_PKMNSENTTOPC 270
+#define STRINGID_PKMNDATAADDEDTODEX 271
+#define STRINGID_ITISRAINING 272
+#define STRINGID_SANDSTORMISRAGING 273
+#define STRINGID_CANTESCAPE2 274
+#define STRINGID_PKMNIGNORESASLEEP 275
+#define STRINGID_PKMNIGNOREDORDERS 276
+#define STRINGID_PKMNBEGANTONAP 277
+#define STRINGID_PKMNLOAFING 278
+#define STRINGID_PKMNWONTOBEY 279
+#define STRINGID_PKMNTURNEDAWAY 280
+#define STRINGID_PKMNPRETENDNOTNOTICE 281
+#define STRINGID_ENEMYABOUTTOSWITCHPKMN 282
+#define STRINGID_CREPTCLOSER 283
+#define STRINGID_CANTGETCLOSER 284
+#define STRINGID_PKMNWATCHINGCAREFULLY 285
+#define STRINGID_PKMNCURIOUSABOUTX 286
+#define STRINGID_PKMNENTHRALLEDBYX 287
+#define STRINGID_PKMNIGNOREDX 288
+#define STRINGID_THREWPOKEBLOCKATPKMN 289
+#define STRINGID_OUTOFSAFARIBALLS 290
+#define STRINGID_PKMNSITEMCUREDPARALYSIS 291
+#define STRINGID_PKMNSITEMCUREDPOISON 292
+#define STRINGID_PKMNSITEMHEALEDBURN 293
+#define STRINGID_PKMNSITEMDEFROSTEDIT 294
+#define STRINGID_PKMNSITEMWOKEIT 295
+#define STRINGID_PKMNSITEMSNAPPEDOUT 296
+#define STRINGID_PKMNSITEMCUREDPROBLEM 297
+#define STRINGID_PKMNSITEMRESTOREDHEALTH 298
+#define STRINGID_PKMNSITEMRESTOREDPP 299
+#define STRINGID_PKMNSITEMRESTOREDSTATUS 300
+#define STRINGID_PKMNSITEMRESTOREDHPALITTLE 301
+#define STRINGID_ITEMALLOWSONLYYMOVE 302
+#define STRINGID_PKMNHUNGONWITHX 303
+#define STRINGID_EMPTYSTRING3 304
+#define STRINGID_PKMNSXPREVENTSBURNS 305
+#define STRINGID_PKMNSXBLOCKSY 306
+#define STRINGID_PKMNSXRESTOREDHPALITTLE2 307
+#define STRINGID_PKMNSXWHIPPEDUPSANDSTORM 308
+#define STRINGID_PKMNSXPREVENTSYLOSS 309
+#define STRINGID_PKMNSXINFATUATEDY 310
+#define STRINGID_PKMNSXMADEYINEFFECTIVE 311
+#define STRINGID_PKMNSXCUREDYPROBLEM 312
+#define STRINGID_ITSUCKEDLIQUIDOOZE 313
+#define STRINGID_PKMNTRANSFORMED 314
+#define STRINGID_ELECTRICITYWEAKENED 315
+#define STRINGID_FIREWEAKENED 316
+#define STRINGID_PKMNHIDUNDERWATER 317
+#define STRINGID_PKMNSPRANGUP 318
+#define STRINGID_HMMOVESCANTBEFORGOTTEN 319
+#define STRINGID_XFOUNDONEY 320
+#define STRINGID_PLAYERDEFEATEDTRAINER1 321
+#define STRINGID_SOOTHINGAROMA 322
+#define STRINGID_ITEMSCANTBEUSEDNOW 323
+#define STRINGID_FORXCOMMAYZ 324
+#define STRINGID_USINGXTHEYOFZN 325
+#define STRINGID_PKMNUSEDXTOGETPUMPED 326
+#define STRINGID_PKMNSXMADEYUSELESS 327
+#define STRINGID_PKMNTRAPPEDBYSANDTOMB 328
+#define STRINGID_EMPTYSTRING4 329
+#define STRINGID_ABOOSTED 330
+#define STRINGID_PKMNSXINTENSIFIEDSUN 331
+#define STRINGID_PKMNMAKESGROUNDMISS 332
+#define STRINGID_YOUTHROWABALLNOWRIGHT 333
+#define STRINGID_PKMNSXTOOKATTACK 334
+#define STRINGID_PKMNCHOSEXASDESTINY 335
+#define STRINGID_PKMNLOSTFOCUS 336
+#define STRINGID_USENEXTPKMN 337
+#define STRINGID_PKMNFLEDUSINGITS 338
+#define STRINGID_PKMNFLEDUSING 339
+#define STRINGID_PKMNWASDRAGGEDOUT 340
+#define STRINGID_PREVENTEDFROMWORKING 341
+#define STRINGID_PKMNSITEMNORMALIZEDSTATUS 342
+#define STRINGID_TRAINER1USEDITEM 343
+#define STRINGID_BOXISFULL 344
+#define STRINGID_PKMNAVOIDEDATTACK 345
+#define STRINGID_PKMNSXMADEITINEFFECTIVE 346
+#define STRINGID_PKMNSXPREVENTSFLINCHING 347
+#define STRINGID_PKMNALREADYHASBURN 348
+#define STRINGID_STATSWONTDECREASE2 349
+#define STRINGID_PKMNSXBLOCKSY2 350
+#define STRINGID_PKMNSXWOREOFF 351
+#define STRINGID_PKMNRAISEDDEFALITTLE 352
+#define STRINGID_PKMNRAISEDSPDEFALITTLE 353
+#define STRINGID_THEWALLSHATTERED 354
+#define STRINGID_PKMNSXPREVENTSYSZ 355
+#define STRINGID_PKMNSXCUREDITSYPROBLEM 356
+#define STRINGID_ATTACKERCANTESCAPE 357
+#define STRINGID_PKMNOBTAINEDX 358
+#define STRINGID_PKMNOBTAINEDX2 359
+#define STRINGID_PKMNOBTAINEDXYOBTAINEDZ 360
+#define STRINGID_BUTNOEFFECT 361
+#define STRINGID_PKMNSXHADNOEFFECTONY 362
+#define STRINGID_TWOENEMIESDEFEATED 363
+#define STRINGID_TRAINER2LOSETEXT 364
+#define STRINGID_PKMNINCAPABLEOFPOWER 365
+#define STRINGID_GLINTAPPEARSINEYE 366
+#define STRINGID_PKMNGETTINGINTOPOSITION 367
+#define STRINGID_PKMNBEGANGROWLINGDEEPLY 368
+#define STRINGID_PKMNEAGERFORMORE 369
+#define STRINGID_DEFEATEDOPPONENTBYREFEREE 370
+#define STRINGID_LOSTTOOPPONENTBYREFEREE 371
+#define STRINGID_TIEDOPPONENTBYREFEREE 372
+#define STRINGID_QUESTIONFORFEITMATCH 373
+#define STRINGID_FORFEITEDMATCH 374
+#define STRINGID_PKMNTRANSFERREDSOMEONESPC 375
+#define STRINGID_PKMNTRANSFERREDLANETTESPC 376
+#define STRINGID_PKMNBOXSOMEONESPCFULL 377
+#define STRINGID_PKMNBOXLANETTESPCFULL 378
+#define STRINGID_TRAINER1WINTEXT 379
+#define STRINGID_TRAINER2WINTEXT 380
+
+#endif // GUARD_BATTLE_STRING_IDS_H
diff --git a/include/battle_tower.h b/include/battle_tower.h
new file mode 100644
index 000000000..25b439c1b
--- /dev/null
+++ b/include/battle_tower.h
@@ -0,0 +1,6 @@
+#ifndef GUARD_BATTLE_TOWER_H
+#define GUARD_BATTLE_TOWER_H
+
+u16 sub_8164FCC(u8, u8);
+
+#endif //GUARD_BATTLE_TOWER_H
diff --git a/include/battle_transition.h b/include/battle_transition.h
new file mode 100644
index 000000000..1603f5c93
--- /dev/null
+++ b/include/battle_transition.h
@@ -0,0 +1,6 @@
+#ifndef GUARD_BATTLE_TRANSITION_H
+#define GUARD_BATTLE_TRANSITION_H
+
+void sub_8149DFC(u8 a1);
+
+#endif // GUARD_BATTLE_TRANSITION_H
diff --git a/include/battle_util.h b/include/battle_util.h
new file mode 100644
index 000000000..81eb85dc7
--- /dev/null
+++ b/include/battle_util.h
@@ -0,0 +1,84 @@
+#ifndef GUARD_BATTLE_UTIL_H
+#define GUARD_BATTLE_UTIL_H
+
+#define MOVE_LIMITATION_ZEROMOVE (1 << 0)
+#define MOVE_LIMITATION_PP (1 << 1)
+#define MOVE_LIMITATION_DISABLED (1 << 2)
+#define MOVE_LIMITATION_TORMENTED (1 << 3)
+#define MOVE_LIMITATION_TAUNT (1 << 4)
+#define MOVE_LIMITATION_IMPRISION (1 << 5)
+
+#define ABILITYEFFECT_ON_SWITCHIN 0x0
+#define ABILITYEFFECT_ENDTURN 0x1
+#define ABILITYEFFECT_MOVES_BLOCK 0x2
+#define ABILITYEFFECT_ABSORBING 0x3
+#define ABILITYEFFECT_CONTACT 0x4
+#define ABILITYEFFECT_IMMUNITY 0x5
+#define ABILITYEFFECT_FORECAST 0x6
+#define ABILITYEFFECT_SYNCHRONIZE 0x7
+#define ABILITYEFFECT_ATK_SYNCHRONIZE 0x8
+#define ABILITYEFFECT_INTIMIDATE1 0x9
+#define ABILITYEFFECT_INTIMIDATE2 0xA
+#define ABILITYEFFECT_TRACE 0xB
+#define ABILITYEFFECT_CHECK_OTHER_SIDE 0xC
+#define ABILITYEFFECT_CHECK_BANK_SIDE 0xD
+#define ABILITYEFFECT_FIELD_SPORT 0xE
+#define ABILITYEFFECT_CHECK_FIELD_EXCEPT_BANK 0xF
+#define ABILITYEFFECT_COUNT_OTHER_SIDE 0x10
+#define ABILITYEFFECT_COUNT_BANK_SIDE 0x11
+#define ABILITYEFFECT_COUNT_ON_FIELD 0x12
+#define ABILITYEFFECT_CHECK_ON_FIELD 0x13
+#define ABILITYEFFECT_SWITCH_IN_WEATHER 0xFF
+
+#define ITEMEFFECT_ON_SWITCH_IN 0x0
+
+#define WEATHER_HAS_EFFECT ((!AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, ABILITY_CLOUD_NINE, 0, 0) && !AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, ABILITY_AIR_LOCK, 0, 0)))
+#define WEATHER_HAS_EFFECT2 ((!AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_CLOUD_NINE, 0, 0) && !AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_AIR_LOCK, 0, 0)))
+
+#define BS_GET_TARGET 0
+#define BS_GET_ATTACKER 1
+#define BS_GET_EFFECT_BANK 2
+#define BS_GET_SCRIPTING_BANK 10
+#define BS_GET_PLAYER1 11
+#define BS_GET_OPPONENT1 12
+#define BS_GET_PLAYER2 13
+#define BS_GET_OPPONENT2 14
+
+u8 GetBattleBank(u8 caseId);
+void PressurePPLose(u8 bankDef, u8 bankAtk, u16 move);
+void PressurePPLoseOnUsingPerishSong(u8 bankAtk);
+void PressurePPLoseOnUsingImprision(u8 bankAtk);
+void MarkAllBufferBanksForExecution(void); // unused
+void MarkBufferBankForExecution(u8 bank);
+void sub_803F850(u8 arg0);
+void CancelMultiTurnMoves(u8 bank);
+bool8 WasUnableToUseMove(u8 bank);
+void PrepareStringBattle(u16 stringId, u8 bank);
+void ResetSentPokesToOpponentValue(void);
+void sub_803F9EC(u8 bank);
+void sub_803FA70(u8 bank);
+void BattleScriptPush(const u8* bsPtr);
+void BattleScriptPushCursor(void);
+void BattleScriptPop(void);
+u8 TrySetCantSelectMoveBattleScript(void);
+u8 CheckMoveLimitations(u8 bank, u8 unusableMoves, u8 check);
+bool8 AreAllMovesUnusable(void);
+u8 GetImprisonedMovesCount(u8 bank, u16 move);
+u8 UpdateTurnCounters(void);
+u8 TurnBasedEffects(void);
+bool8 HandleWishPerishSongOnTurnEnd(void);
+bool8 HandleFaintedMonActions(void);
+void TryClearRageStatuses(void);
+u8 AtkCanceller_UnableToUseMove(void);
+bool8 sub_80423F4(u8 bank, u8 r1, u8 r2);
+u8 CastformDataTypeChange(u8 bank);
+u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg);
+void BattleScriptExecute(const u8* BS_ptr);
+void BattleScriptPushCursorAndCallback(const u8* BS_ptr);
+u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn);
+void ClearFuryCutterDestinyBondGrudge(u8 bank);
+void HandleAction_RunBattleScript(void);
+u8 GetMoveTarget(u16 move, u8 useMoveTarget);
+u8 IsMonDisobedient(void);
+
+#endif // GUARD_BATTLE_UTIL_H
diff --git a/include/battle_util2.h b/include/battle_util2.h
new file mode 100644
index 000000000..3954e42dc
--- /dev/null
+++ b/include/battle_util2.h
@@ -0,0 +1,10 @@
+#ifndef GUARD_BATTLE_UTIL2_H
+#define GUARD_BATTLE_UTIL2_H
+
+void AllocateBattleResources(void);
+void FreeBattleResources(void);
+void AdjustFriendshipOnBattleFaint(u8 bank);
+void sub_80571DC(u8 bank, u8 arg1);
+u32 sub_805725C(u8 bank);
+
+#endif // GUARD_BATTLE_UTIL_H
diff --git a/include/berry.h b/include/berry.h
new file mode 100644
index 000000000..425a664c9
--- /dev/null
+++ b/include/berry.h
@@ -0,0 +1,73 @@
+#ifndef GUARD_BERRY_H
+#define GUARD_BERRY_H
+
+enum
+{
+ BERRY_FIRMNESS_UNKNOWN,
+ BERRY_FIRMNESS_VERY_SOFT,
+ BERRY_FIRMNESS_SOFT,
+ BERRY_FIRMNESS_HARD,
+ BERRY_FIRMNESS_VERY_HARD,
+ BERRY_FIRMNESS_SUPER_HARD,
+};
+
+enum
+{
+ FLAVOR_SPICY,
+ FLAVOR_DRY,
+ FLAVOR_SWEET,
+ FLAVOR_BITTER,
+ FLAVOR_SOUR,
+ FLAVOR_COUNT
+};
+
+#define NUM_BERRIES 44
+
+extern const u8 *const gBerryTreeFieldObjectGraphicsIdTablePointers[NUM_BERRIES];
+extern const struct SpriteFrameImage *const gBerryTreePicTablePointers[NUM_BERRIES];
+extern const u8 *const gBerryTreePaletteSlotTablePointers[NUM_BERRIES];
+
+void ClearEnigmaBerries(void);
+void SetEnigmaBerry(u8 *src);
+u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry);
+bool32 IsEnigmaBerryValid(void);
+const struct Berry *GetBerryInfo(u8 berry);
+struct BerryTree *GetBerryTreeInfo(u8 id);
+bool32 FieldObjectInteractionWaterBerryTree(void);
+bool8 IsPlayerFacingPlantedBerryTree(void);
+bool8 TryToWaterBerryTree(void);
+void ClearBerryTrees(void);
+bool32 BerryTreeGrow(struct BerryTree *tree);
+void BerryTreeTimeUpdate(s32 minutes);
+void PlantBerryTree(u8 id, u8 berry, u8 stage, bool8 sparkle);
+void RemoveBerryTree(u8 id);
+u8 GetBerryTypeByBerryTreeId(u8 id);
+u8 GetStageByBerryTreeId(u8);
+u8 ItemIdToBerryType(u16 item);
+u16 BerryTypeToItemId(u16 berry);
+void GetBerryNameByBerryType(u8 berry, u8 *string);
+void ResetBerryTreeSparkleFlag(u8 id);
+u8 BerryTreeGetNumStagesWatered(struct BerryTree *tree);
+u8 GetNumStagesWateredByBerryTreeId(u8 id);
+u8 CalcBerryYieldInternal(u16 max, u16 min, u8 water);
+u8 CalcBerryYield(struct BerryTree *tree);
+u8 GetBerryCountByBerryTreeId(u8 id);
+u16 GetStageDurationByBerryType(u8);
+void Bag_ChooseBerry(void);
+void FieldObjectInteractionGetBerryTreeData(void);
+void FieldObjectInteractionPlantBerryTree(void);
+void FieldObjectInteractionPickBerryTree(void);
+void FieldObjectInteractionRemoveBerryTree(void);
+u8 PlayerHasBerries(void);
+void ResetBerryTreeSparkleFlags(void);
+
+extern const struct Berry gBerries[];
+
+struct UnkStruct_0858AB24 {
+ u8 unk0;
+ u16 unk1;
+};
+
+extern const struct UnkStruct_0858AB24 gUnknown_0858AB24[];
+
+#endif // GUARD_BERRY_H
diff --git a/include/bg.h b/include/bg.h
new file mode 100644
index 000000000..0c6b4ac26
--- /dev/null
+++ b/include/bg.h
@@ -0,0 +1,85 @@
+#ifndef GUARD_BG_H
+#define GUARD_BG_H
+
+struct BGCntrlBitfield // for the I/O registers
+{
+ volatile u16 priority:2;
+ volatile u16 charBaseBlock:2;
+ volatile u16 field_0_2:4;
+ volatile u16 field_1_0:5;
+ volatile u16 areaOverflowMode:1;
+ volatile u16 screenSize:2;
+};
+
+enum
+{
+ BG_CTRL_ATTR_VISIBLE = 1,
+ BG_CTRL_ATTR_CHARBASEINDEX = 2,
+ BG_CTRL_ATTR_MAPBASEINDEX = 3,
+ BG_CTRL_ATTR_SCREENSIZE = 4,
+ BG_CTRL_ATTR_PALETTEMODE = 5,
+ BG_CTRL_ATTR_PRIORITY = 6,
+ BG_CTRL_ATTR_MOSAIC = 7,
+ BG_CTRL_ATTR_WRAPAROUND = 8,
+};
+
+struct BgTemplate
+{
+ u32 bg:2; // 0x1, 0x2 -> 0x3
+ u32 charBaseIndex:2; // 0x4, 0x8 -> 0xC
+ u32 mapBaseIndex:5; // 0x10, 0x20, 0x40, 0x80, 0x100 -> 0x1F0
+ u32 screenSize:2; // 0x200, 0x400 -> 0x600
+ u32 paletteMode:1; // 0x800
+ u32 priority:2; // 0x1000, 0x2000 > 0x3000
+ u32 baseTile:10;
+};
+
+void ResetBgs(void);
+u8 GetBgMode(void);
+void ResetBgControlStructs(void);
+void Unused_ResetBgControlStruct(u8 bg);
+void SetBgControlAttributes(u8 bg, u8 charBaseIndex, u8 mapBaseIndex, u8 screenSize, u8 paletteMode, u8 priority, u8 mosaic, u8 wraparound);
+u16 GetBgControlAttribute(u8 bg, u8 attributeId);
+u8 LoadBgVram(u8 bg, const void *src, u16 size, u16 destOffset, u8 mode);
+void SetTextModeAndHideBgs(void);
+bool8 IsInvalidBg(u8 bg);
+int DummiedOutFireRedLeafGreenTileAllocFunc(int a1, int a2, int a3, int a4);
+void ResetBgsAndClearDma3BusyFlags(u32 leftoverFireRedLeafGreenVariable);
+void InitBgsFromTemplates(u8 bgMode, const struct BgTemplate *templates, u8 numTemplates);
+void InitBgFromTemplate(const struct BgTemplate *template);
+void SetBgMode(u8 bgMode);
+u16 LoadBgTiles(u8 bg, const void* src, u16 size, u16 destOffset);
+u16 LoadBgTilemap(u8 bg, const void *src, u16 size, u16 destOffset);
+u16 Unused_LoadBgPalette(u8 bg, const void *src, u16 size, u16 destOffset);
+bool8 IsDma3ManagerBusyWithBgCopy(void);
+void ShowBg(u8 bg);
+void HideBg(u8 bg);
+void SetBgAttribute(u8 bg, u8 attributeId, u8 value);
+u16 GetBgAttribute(u8 bg, u8 attributeId);
+u32 ChangeBgX(u8 bg, u32 value, u8 op);
+u32 GetBgX(u8 bg);
+u32 ChangeBgY(u8 bg, u32 value, u8 op);
+u32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op);
+u32 GetBgY(u8 bg);
+void SetBgAffine(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle);
+u8 Unused_AdjustBgMosaic(u8 a1, u8 a2);
+void SetBgTilemapBuffer(u8 bg, void *tilemap);
+void UnsetBgTilemapBuffer(u8 bg);
+void* GetBgTilemapBuffer(u8 bg);
+void CopyToBgTilemapBuffer(u8 bg, const void *src, u16 mode, u16 destOffset);
+void CopyBgTilemapBufferToVram(u8 bg);
+void CopyToBgTilemapBufferRect(u8 bg, void* src, u8 destX, u8 destY, u8 width, u8 height);
+void CopyToBgTilemapBufferRect_ChangePalette(u8 bg, void *src, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette);
+void CopyRectToBgTilemapBufferRect(u8 bg, void* src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, u16 tileOffset, u16 palette2);
+void FillBgTilemapBufferRect_Palette0(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height);
+void FillBgTilemapBufferRect(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height, u8 palette);
+void WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 width, u8 height, u8 paletteSlot, s16 tileNumDelta);
+u16 GetBgMetricTextMode(u8 bg, u8 whichMetric);
+u32 GetBgMetricAffineMode(u8 bg, u8 whichMetric);
+u32 GetTileMapIndexFromCoords(s32 x, s32 y, s32 screenSize, u32 screenWidth, u32 screenHeight);
+void CopyTileMapEntry(u16 *src, u16 *dest, s32 palette1, u32 tileOffset, u32 palette2);
+u32 GetBgType(u8 bg);
+bool32 IsInvalidBg32(u8 bg);
+bool32 IsTileMapOutsideWram(u8 bg);
+
+#endif // GUARD_BG_H
diff --git a/include/blend_palette.h b/include/blend_palette.h
new file mode 100644
index 000000000..1db3f4eb0
--- /dev/null
+++ b/include/blend_palette.h
@@ -0,0 +1,12 @@
+#ifndef GUARD_BLEND_PALETTE_H
+#define GUARD_BLEND_PALETTE_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+
+void BlendPalette(u16, u16, u8, u16);
+
+#endif //GUARD_BLEND_PALETTE_H
diff --git a/include/calculate_base_damage.h b/include/calculate_base_damage.h
new file mode 100644
index 000000000..e9146c188
--- /dev/null
+++ b/include/calculate_base_damage.h
@@ -0,0 +1,6 @@
+#ifndef GUARD_CALCULATE_BASE_DAMAGE_H
+#define GUARD_CALCULATE_BASE_DAMAGE_H
+
+s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 sideStatus, u16 powerOverride, u8 typeOverride, u8 bankAtk, u8 bankDef);
+
+#endif // GUARD_CALCULATE_BASE_DAMAGE_H
diff --git a/include/coins.h b/include/coins.h
new file mode 100644
index 000000000..996519605
--- /dev/null
+++ b/include/coins.h
@@ -0,0 +1,12 @@
+#ifndef GUARD_COINS_H
+#define GUARD_COINS_H
+
+void PrintCoinsString(u32 coinAmount);
+void ShowCoinsWindow(u32 coinAmount, u8 x, u8 y);
+void HideCoinsWindow(void);
+u16 GetCoins(void);
+void SetCoins(u16 coinAmount);
+bool8 GiveCoins(u16 toAdd);
+bool8 TakeCoins(u16 toSub);
+
+#endif // GUARD_COINS_H
diff --git a/include/config.h b/include/config.h
new file mode 100644
index 000000000..162af3143
--- /dev/null
+++ b/include/config.h
@@ -0,0 +1,12 @@
+#ifndef GUARD_CONFIG_H
+#define GUARD_CONFIG_H
+
+#define ENGLISH
+
+#ifdef ENGLISH
+#define UNITS_IMPERIAL
+#else
+#define UNITS_METRIC
+#endif
+
+#endif // GUARD_CONFIG_H
diff --git a/include/constants/abilities.h b/include/constants/abilities.h
new file mode 100644
index 000000000..4e2c4056c
--- /dev/null
+++ b/include/constants/abilities.h
@@ -0,0 +1,83 @@
+#ifndef GUARD_CONSTANTS_ABILITIES_H
+#define GUARD_CONSTANTS_ABILITIES_H
+
+#define ABILITY_NONE 0
+#define ABILITY_STENCH 1
+#define ABILITY_DRIZZLE 2
+#define ABILITY_SPEED_BOOST 3
+#define ABILITY_BATTLE_ARMOR 4
+#define ABILITY_STURDY 5
+#define ABILITY_DAMP 6
+#define ABILITY_LIMBER 7
+#define ABILITY_SAND_VEIL 8
+#define ABILITY_STATIC 9
+#define ABILITY_VOLT_ABSORB 10
+#define ABILITY_WATER_ABSORB 11
+#define ABILITY_OBLIVIOUS 12
+#define ABILITY_CLOUD_NINE 13
+#define ABILITY_COMPOUND_EYES 14
+#define ABILITY_INSOMNIA 15
+#define ABILITY_COLOR_CHANGE 16
+#define ABILITY_IMMUNITY 17
+#define ABILITY_FLASH_FIRE 18
+#define ABILITY_SHIELD_DUST 19
+#define ABILITY_OWN_TEMPO 20
+#define ABILITY_SUCTION_CUPS 21
+#define ABILITY_INTIMIDATE 22
+#define ABILITY_SHADOW_TAG 23
+#define ABILITY_ROUGH_SKIN 24
+#define ABILITY_WONDER_GUARD 25
+#define ABILITY_LEVITATE 26
+#define ABILITY_EFFECT_SPORE 27
+#define ABILITY_SYNCHRONIZE 28
+#define ABILITY_CLEAR_BODY 29
+#define ABILITY_NATURAL_CURE 30
+#define ABILITY_LIGHTNING_ROD 31
+#define ABILITY_SERENE_GRACE 32
+#define ABILITY_SWIFT_SWIM 33
+#define ABILITY_CHLOROPHYLL 34
+#define ABILITY_ILLUMINATE 35
+#define ABILITY_TRACE 36
+#define ABILITY_HUGE_POWER 37
+#define ABILITY_POISON_POINT 38
+#define ABILITY_INNER_FOCUS 39
+#define ABILITY_MAGMA_ARMOR 40
+#define ABILITY_WATER_VEIL 41
+#define ABILITY_MAGNET_PULL 42
+#define ABILITY_SOUNDPROOF 43
+#define ABILITY_RAIN_DISH 44
+#define ABILITY_SAND_STREAM 45
+#define ABILITY_PRESSURE 46
+#define ABILITY_THICK_FAT 47
+#define ABILITY_EARLY_BIRD 48
+#define ABILITY_FLAME_BODY 49
+#define ABILITY_RUN_AWAY 50
+#define ABILITY_KEEN_EYE 51
+#define ABILITY_HYPER_CUTTER 52
+#define ABILITY_PICKUP 53
+#define ABILITY_TRUANT 54
+#define ABILITY_HUSTLE 55
+#define ABILITY_CUTE_CHARM 56
+#define ABILITY_PLUS 57
+#define ABILITY_MINUS 58
+#define ABILITY_FORECAST 59
+#define ABILITY_STICKY_HOLD 60
+#define ABILITY_SHED_SKIN 61
+#define ABILITY_GUTS 62
+#define ABILITY_MARVEL_SCALE 63
+#define ABILITY_LIQUID_OOZE 64
+#define ABILITY_OVERGROW 65
+#define ABILITY_BLAZE 66
+#define ABILITY_TORRENT 67
+#define ABILITY_SWARM 68
+#define ABILITY_ROCK_HEAD 69
+#define ABILITY_DROUGHT 70
+#define ABILITY_ARENA_TRAP 71
+#define ABILITY_VITAL_SPIRIT 72
+#define ABILITY_WHITE_SMOKE 73
+#define ABILITY_PURE_POWER 74
+#define ABILITY_SHELL_ARMOR 75
+#define ABILITY_CACOPHONY 76
+#define ABILITY_AIR_LOCK 77
+
+#endif // GUARD_CONSTANTS_ABILITIES_H
diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h
new file mode 100644
index 000000000..1b59f2f64
--- /dev/null
+++ b/include/constants/battle_move_effects.h
@@ -0,0 +1,219 @@
+#ifndef GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H
+#define GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H
+
+#define EFFECT_HIT 0
+#define EFFECT_SLEEP 1
+#define EFFECT_POISON_HIT 2
+#define EFFECT_ABSORB 3
+#define EFFECT_BURN_HIT 4
+#define EFFECT_FREEZE_HIT 5
+#define EFFECT_PARALYZE_HIT 6
+#define EFFECT_EXPLOSION 7
+#define EFFECT_DREAM_EATER 8
+#define EFFECT_MIRROR_MOVE 9
+#define EFFECT_ATTACK_UP 10
+#define EFFECT_DEFENSE_UP 11
+#define EFFECT_SPEED_UP 12
+#define EFFECT_SPECIAL_ATTACK_UP 13
+#define EFFECT_SPECIAL_DEFENSE_UP 14
+#define EFFECT_ACCURACY_UP 15
+#define EFFECT_EVASION_UP 16
+#define EFFECT_ALWAYS_HIT 17
+#define EFFECT_ATTACK_DOWN 18
+#define EFFECT_DEFENSE_DOWN 19
+#define EFFECT_SPEED_DOWN 20
+#define EFFECT_SPECIAL_ATTACK_DOWN 21 // unused
+#define EFFECT_SPECIAL_DEFENSE_DOWN 22 // unused
+#define EFFECT_ACCURACY_DOWN 23
+#define EFFECT_EVASION_DOWN 24
+#define EFFECT_HAZE 25
+#define EFFECT_BIDE 26
+#define EFFECT_RAMPAGE 27
+#define EFFECT_ROAR 28
+#define EFFECT_MULTI_HIT 29
+#define EFFECT_CONVERSION 30
+#define EFFECT_FLINCH_HIT 31
+#define EFFECT_RESTORE_HP 32
+#define EFFECT_TOXIC 33
+#define EFFECT_PAY_DAY 34
+#define EFFECT_LIGHT_SCREEN 35
+#define EFFECT_TRI_ATTACK 36
+#define EFFECT_REST 37
+#define EFFECT_OHKO 38
+#define EFFECT_RAZOR_WIND 39
+#define EFFECT_SUPER_FANG 40
+#define EFFECT_DRAGON_RAGE 41
+#define EFFECT_TRAP 42
+#define EFFECT_HIGH_CRITICAL 43
+#define EFFECT_DOUBLE_HIT 44
+#define EFFECT_RECOIL_IF_MISS 45
+#define EFFECT_MIST 46
+#define EFFECT_FOCUS_ENERGY 47
+#define EFFECT_RECOIL 48
+#define EFFECT_CONFUSE 49
+#define EFFECT_ATTACK_UP_2 50
+#define EFFECT_DEFENSE_UP_2 51
+#define EFFECT_SPEED_UP_2 52
+#define EFFECT_SPECIAL_ATTACK_UP_2 53
+#define EFFECT_SPECIAL_DEFENSE_UP_2 54
+#define EFFECT_ACCURACY_UP_2 55
+#define EFFECT_EVASION_UP_2 56
+#define EFFECT_TRANSFORM 57
+#define EFFECT_ATTACK_DOWN_2 58
+#define EFFECT_DEFENSE_DOWN_2 59
+#define EFFECT_SPEED_DOWN_2 60
+#define EFFECT_SPECIAL_ATTACK_DOWN_2 61
+#define EFFECT_SPECIAL_DEFENSE_DOWN_2 62
+#define EFFECT_ACCURACY_DOWN_2 63
+#define EFFECT_EVASION_DOWN_2 64
+#define EFFECT_REFLECT 65
+#define EFFECT_POISON 66
+#define EFFECT_PARALYZE 67
+#define EFFECT_ATTACK_DOWN_HIT 68
+#define EFFECT_DEFENSE_DOWN_HIT 69
+#define EFFECT_SPEED_DOWN_HIT 70
+#define EFFECT_SPECIAL_ATTACK_DOWN_HIT 71
+#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT 72
+#define EFFECT_ACCURACY_DOWN_HIT 73
+#define EFFECT_EVASION_DOWN_HIT 74
+#define EFFECT_SKY_ATTACK 75
+#define EFFECT_CONFUSE_HIT 76
+#define EFFECT_TWINEEDLE 77
+#define EFFECT_VITAL_THROW 78
+#define EFFECT_SUBSTITUTE 79
+#define EFFECT_RECHARGE 80
+#define EFFECT_RAGE 81
+#define EFFECT_MIMIC 82
+#define EFFECT_METRONOME 83
+#define EFFECT_LEECH_SEED 84
+#define EFFECT_SPLASH 85
+#define EFFECT_DISABLE 86
+#define EFFECT_LEVEL_DAMAGE 87
+#define EFFECT_PSYWAVE 88
+#define EFFECT_COUNTER 89
+#define EFFECT_ENCORE 90
+#define EFFECT_PAIN_SPLIT 91
+#define EFFECT_SNORE 92
+#define EFFECT_CONVERSION_2 93
+#define EFFECT_LOCK_ON 94
+#define EFFECT_SKETCH 95
+#define EFFECT_UNUSED_60 96 // thaw
+#define EFFECT_SLEEP_TALK 97
+#define EFFECT_DESTINY_BOND 98
+#define EFFECT_FLAIL 99
+#define EFFECT_SPITE 100
+#define EFFECT_FALSE_SWIPE 101
+#define EFFECT_HEAL_BELL 102
+#define EFFECT_QUICK_ATTACK 103
+#define EFFECT_TRIPLE_KICK 104
+#define EFFECT_THIEF 105
+#define EFFECT_MEAN_LOOK 106
+#define EFFECT_NIGHTMARE 107
+#define EFFECT_MINIMIZE 108
+#define EFFECT_CURSE 109
+#define EFFECT_UNUSED_6E 110
+#define EFFECT_PROTECT 111
+#define EFFECT_SPIKES 112
+#define EFFECT_FORESIGHT 113
+#define EFFECT_PERISH_SONG 114
+#define EFFECT_SANDSTORM 115
+#define EFFECT_ENDURE 116
+#define EFFECT_ROLLOUT 117
+#define EFFECT_SWAGGER 118
+#define EFFECT_FURY_CUTTER 119
+#define EFFECT_ATTRACT 120
+#define EFFECT_RETURN 121
+#define EFFECT_PRESENT 122
+#define EFFECT_FRUSTRATION 123
+#define EFFECT_SAFEGUARD 124
+#define EFFECT_THAW_HIT 125
+#define EFFECT_MAGNITUDE 126
+#define EFFECT_BATON_PASS 127
+#define EFFECT_PURSUIT 128
+#define EFFECT_RAPID_SPIN 129
+#define EFFECT_SONICBOOM 130
+#define EFFECT_UNUSED_83 131
+#define EFFECT_MORNING_SUN 132
+#define EFFECT_SYNTHESIS 133
+#define EFFECT_MOONLIGHT 134
+#define EFFECT_HIDDEN_POWER 135
+#define EFFECT_RAIN_DANCE 136
+#define EFFECT_SUNNY_DAY 137
+#define EFFECT_DEFENSE_UP_HIT 138
+#define EFFECT_ATTACK_UP_HIT 139
+#define EFFECT_ALL_STATS_UP_HIT 140
+#define EFFECT_UNUSED_8D 141 // incomplete fake out in gen 2
+#define EFFECT_BELLY_DRUM 142
+#define EFFECT_PSYCH_UP 143
+#define EFFECT_MIRROR_COAT 144
+#define EFFECT_SKULL_BASH 145
+#define EFFECT_TWISTER 146
+#define EFFECT_EARTHQUAKE 147
+#define EFFECT_FUTURE_SIGHT 148
+#define EFFECT_GUST 149
+#define EFFECT_FLINCH_HIT_2 150 // STOMP ASTONISH EXTRASENSORY NEEDLE_ARM
+#define EFFECT_SOLARBEAM 151
+#define EFFECT_THUNDER 152
+#define EFFECT_TELEPORT 153
+#define EFFECT_BEAT_UP 154
+#define EFFECT_SEMI_INVULNERABLE 155
+#define EFFECT_DEFENSE_CURL 156
+#define EFFECT_SOFTBOILED 157
+#define EFFECT_FAKE_OUT 158
+#define EFFECT_UPROAR 159
+#define EFFECT_STOCKPILE 160
+#define EFFECT_SPIT_UP 161
+#define EFFECT_SWALLOW 162
+#define EFFECT_UNUSED_A3 163
+#define EFFECT_HAIL 164
+#define EFFECT_TORMENT 165
+#define EFFECT_FLATTER 166
+#define EFFECT_WILL_O_WISP 167
+#define EFFECT_MEMENTO 168
+#define EFFECT_FACADE 169
+#define EFFECT_FOCUS_PUNCH 170
+#define EFFECT_SMELLINGSALT 171
+#define EFFECT_FOLLOW_ME 172
+#define EFFECT_NATURE_POWER 173
+#define EFFECT_CHARGE 174
+#define EFFECT_TAUNT 175
+#define EFFECT_HELPING_HAND 176
+#define EFFECT_TRICK 177
+#define EFFECT_ROLE_PLAY 178
+#define EFFECT_WISH 179
+#define EFFECT_ASSIST 180
+#define EFFECT_INGRAIN 181
+#define EFFECT_SUPERPOWER 182
+#define EFFECT_MAGIC_COAT 183
+#define EFFECT_RECYCLE 184
+#define EFFECT_REVENGE 185
+#define EFFECT_BRICK_BREAK 186
+#define EFFECT_YAWN 187
+#define EFFECT_KNOCK_OFF 188
+#define EFFECT_ENDEAVOR 189
+#define EFFECT_ERUPTION 190
+#define EFFECT_SKILL_SWAP 191
+#define EFFECT_IMPRISON 192
+#define EFFECT_REFRESH 193
+#define EFFECT_GRUDGE 194
+#define EFFECT_SNATCH 195
+#define EFFECT_LOW_KICK 196
+#define EFFECT_SECRET_POWER 197
+#define EFFECT_DOUBLE_EDGE 198
+#define EFFECT_TEETER_DANCE 199
+#define EFFECT_BLAZE_KICK 200
+#define EFFECT_MUD_SPORT 201
+#define EFFECT_POISON_FANG 202
+#define EFFECT_WEATHER_BALL 203
+#define EFFECT_OVERHEAT 204
+#define EFFECT_TICKLE 205
+#define EFFECT_COSMIC_POWER 206
+#define EFFECT_SKY_UPPERCUT 207
+#define EFFECT_BULK_UP 208
+#define EFFECT_POISON_TAIL 209
+#define EFFECT_WATER_SPORT 210
+#define EFFECT_CALM_MIND 211
+#define EFFECT_DRAGON_DANCE 212
+#define EFFECT_CAMOUFLAGE 213
+
+#endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H
diff --git a/include/constants/decorations.h b/include/constants/decorations.h
new file mode 100644
index 000000000..2e3558721
--- /dev/null
+++ b/include/constants/decorations.h
@@ -0,0 +1,126 @@
+#ifndef GUARD_CONSTANTS_DECORATIONS_H
+#define GUARD_CONSTANTS_DECORATIONS_H
+
+#define DECOR_NONE 0
+#define DECOR_SMALL_DESK 1
+#define DECOR_POKEMON_DESK 2
+#define DECOR_HEAVY_DESK 3
+#define DECOR_RAGGED_DESK 4
+#define DECOR_COMFORT_DESK 5
+#define DECOR_PRETTY_DESK 6
+#define DECOR_BRICK_DESK 7
+#define DECOR_CAMP_DESK 8
+#define DECOR_HARD_DESK 9
+#define DECOR_SMALL_CHAIR 10
+#define DECOR_POKEMON_CHAIR 11
+#define DECOR_HEAVY_CHAIR 12
+#define DECOR_PRETTY_CHAIR 13
+#define DECOR_COMFORT_CHAIR 14
+#define DECOR_RAGGED_CHAIR 15
+#define DECOR_BRICK_CHAIR 16
+#define DECOR_CAMP_CHAIR 17
+#define DECOR_HARD_CHAIR 18
+#define DECOR_RED_PLANT 19
+#define DECOR_TROPICAL_PLANT 20
+#define DECOR_PRETTY_FLOWERS 21
+#define DECOR_COLORFUL_PLANT 22
+#define DECOR_BIG_PLANT 23
+#define DECOR_GORGEOUS_PLANT 24
+#define DECOR_RED_BRICK 25
+#define DECOR_YELLOW_BRICK 26
+#define DECOR_BLUE_BRICK 27
+#define DECOR_RED_BALLOON 28
+#define DECOR_BLUE_BALLOON 29
+#define DECOR_YELLOW_BALLOON 30
+#define DECOR_RED_TENT 31
+#define DECOR_BLUE_TENT 32
+#define DECOR_SOLID_BOARD 33
+#define DECOR_SLIDE 34
+#define DECOR_FENCE_LENGTH 35
+#define DECOR_FENCE_WIDTH 36
+#define DECOR_TIRE 37
+#define DECOR_STAND 38
+#define DECOR_MUD_BALL 39
+#define DECOR_BREAKABLE_DOOR 40
+#define DECOR_SAND_ORNAMENT 41
+#define DECOR_SILVER_SHIELD 42
+#define DECOR_GOLD_SHIELD 43
+#define DECOR_GLASS_ORNAMENT 44
+#define DECOR_TV 45
+#define DECOR_ROUND_TV 46
+#define DECOR_CUTE_TV 47
+#define DECOR_GLITTER_MAT 48
+#define DECOR_JUMP_MAT 49
+#define DECOR_SPIN_MAT 50
+#define DECOR_C_LOW_NOTE_MAT 51
+#define DECOR_D_NOTE_MAT 52
+#define DECOR_E_NOTE_MAT 53
+#define DECOR_F_NOTE_MAT 54
+#define DECOR_G_NOTE_MAT 55
+#define DECOR_A_NOTE_MAT 56
+#define DECOR_B_NOTE_MAT 57
+#define DECOR_C_HIGH_NOTE_MAT 58
+#define DECOR_SURF_MAT 59
+#define DECOR_THUNDER_MAT 60
+#define DECOR_FIRE_BLAST_MAT 61
+#define DECOR_POWDER_SNOW_MAT 62
+#define DECOR_ATTRACT_MAT 63
+#define DECOR_FISSURE_MAT 64
+#define DECOR_SPIKES_MAT 65
+#define DECOR_BALL_POSTER 66
+#define DECOR_GREEN_POSTER 67
+#define DECOR_RED_POSTER 68
+#define DECOR_BLUE_POSTER 69
+#define DECOR_CUTE_POSTER 70
+#define DECOR_PIKA_POSTER 71
+#define DECOR_LONG_POSTER 72
+#define DECOR_SEA_POSTER 73
+#define DECOR_SKY_POSTER 74
+#define DECOR_KISS_POSTER 75
+#define DECOR_PICHU_DOLL 76
+#define DECOR_PIKACHU_DOLL 77
+#define DECOR_MARILL_DOLL 78
+#define DECOR_TOGEPI_DOLL 79
+#define DECOR_CYNDAQUIL_DOLL 80
+#define DECOR_CHIKORITA_DOLL 81
+#define DECOR_TOTODILE_DOLL 82
+#define DECOR_JIGGLYPUFF_DOLL 83
+#define DECOR_MEOWTH_DOLL 84
+#define DECOR_CLEFAIRY_DOLL 85
+#define DECOR_DITTO_DOLL 86
+#define DECOR_SMOOCHUM_DOLL 87
+#define DECOR_TREECKO_DOLL 88
+#define DECOR_TORCHIC_DOLL 89
+#define DECOR_MUDKIP_DOLL 90
+#define DECOR_DUSKULL_DOLL 91
+#define DECOR_WYNAUT_DOLL 92
+#define DECOR_BALTOY_DOLL 93
+#define DECOR_KECLEON_DOLL 94
+#define DECOR_AZURILL_DOLL 95
+#define DECOR_SKITTY_DOLL 96
+#define DECOR_SWABLU_DOLL 97
+#define DECOR_GULPIN_DOLL 98
+#define DECOR_LOTAD_DOLL 99
+#define DECOR_SEEDOT_DOLL 100
+#define DECOR_PIKA_CUSHION 101
+#define DECOR_ROUND_CUSHION 102
+#define DECOR_KISS_CUSHION 103
+#define DECOR_ZIGZAG_CUSHION 104
+#define DECOR_SPIN_CUSHION 105
+#define DECOR_DIAMOND_CUSHION 106
+#define DECOR_BALL_CUSHION 107
+#define DECOR_GRASS_CUSHION 108
+#define DECOR_FIRE_CUSHION 109
+#define DECOR_WATER_CUSHION 110
+#define DECOR_SNORLAX_DOLL 111
+#define DECOR_RHYDON_DOLL 112
+#define DECOR_LAPRAS_DOLL 113
+#define DECOR_VENUSAUR_DOLL 114
+#define DECOR_CHARIZARD_DOLL 115
+#define DECOR_BLASTOISE_DOLL 116
+#define DECOR_WAILMER_DOLL 117
+#define DECOR_REGIROCK_DOLL 118
+#define DECOR_REGICE_DOLL 119
+#define DECOR_REGISTEEL_DOLL 120
+
+#endif // GUARD_CONSTANTS_DECORATIONS_H
diff --git a/include/constants/easy_chat.h b/include/constants/easy_chat.h
new file mode 100644
index 000000000..2c437c88e
--- /dev/null
+++ b/include/constants/easy_chat.h
@@ -0,0 +1,1079 @@
+#ifndef GUARD_CONSTANTS_EASY_CHAT_H
+#define GUARD_CONSTANTS_EASY_CHAT_H
+
+#define EC_GROUP_POKEMON 0x0
+#define EC_GROUP_TRAINER 0x1
+#define EC_GROUP_STATUS 0x2
+#define EC_GROUP_BATTLE 0x3
+#define EC_GROUP_GREETINGS 0x4
+#define EC_GROUP_PEOPLE 0x5
+#define EC_GROUP_VOICES 0x6
+#define EC_GROUP_SPEECH 0x7
+#define EC_GROUP_ENDINGS 0x8
+#define EC_GROUP_FEELINGS 0x9
+#define EC_GROUP_CONDITIONS 0xa
+#define EC_GROUP_ACTIONS 0xb
+#define EC_GROUP_LIFESTYLE 0xc
+#define EC_GROUP_HOBBIES 0xd
+#define EC_GROUP_TIME 0xe
+#define EC_GROUP_MISC 0xf
+#define EC_GROUP_ADJECTIVES 0x10
+#define EC_GROUP_EVENTS 0x11
+#define EC_GROUP_MOVE_1 0x12
+#define EC_GROUP_MOVE_2 0x13
+#define EC_GROUP_TRENDY_SAYING 0x14
+#define EC_GROUP_POKEMON_2 0x15
+
+// TRAINER
+#define EC_WORD_I_CHOOSE_YOU (EC_GROUP_TRAINER << 9) | 0x0
+#define EC_WORD_GOTCHA (EC_GROUP_TRAINER << 9) | 0x1
+#define EC_WORD_TRADE (EC_GROUP_TRAINER << 9) | 0x2
+#define EC_WORD_SAPPHIRE (EC_GROUP_TRAINER << 9) | 0x3
+#define EC_WORD_EVOLVE (EC_GROUP_TRAINER << 9) | 0x4
+#define EC_WORD_ENCYCLOPEDIA (EC_GROUP_TRAINER << 9) | 0x5
+#define EC_WORD_NATURE (EC_GROUP_TRAINER << 9) | 0x6
+#define EC_WORD_CENTER (EC_GROUP_TRAINER << 9) | 0x7
+#define EC_WORD_EGG (EC_GROUP_TRAINER << 9) | 0x8
+#define EC_WORD_LINK (EC_GROUP_TRAINER << 9) | 0x9
+#define EC_WORD_SP_ABILITY (EC_GROUP_TRAINER << 9) | 0xa
+#define EC_WORD_TRAINER (EC_GROUP_TRAINER << 9) | 0xb
+#define EC_WORD_VERSION (EC_GROUP_TRAINER << 9) | 0xc
+#define EC_WORD_POKENAV (EC_GROUP_TRAINER << 9) | 0xd
+#define EC_WORD_POKEMON (EC_GROUP_TRAINER << 9) | 0xe
+#define EC_WORD_GET (EC_GROUP_TRAINER << 9) | 0xf
+#define EC_WORD_POKEDEX (EC_GROUP_TRAINER << 9) | 0x10
+#define EC_WORD_RUBY (EC_GROUP_TRAINER << 9) | 0x11
+#define EC_WORD_LEVEL (EC_GROUP_TRAINER << 9) | 0x12
+#define EC_WORD_RED (EC_GROUP_TRAINER << 9) | 0x13
+#define EC_WORD_GREEN (EC_GROUP_TRAINER << 9) | 0x14
+#define EC_WORD_BAG (EC_GROUP_TRAINER << 9) | 0x15
+#define EC_WORD_FLAME (EC_GROUP_TRAINER << 9) | 0x16
+#define EC_WORD_GOLD (EC_GROUP_TRAINER << 9) | 0x17
+#define EC_WORD_LEAF (EC_GROUP_TRAINER << 9) | 0x18
+#define EC_WORD_SILVER (EC_GROUP_TRAINER << 9) | 0x19
+#define EC_WORD_EMERALD (EC_GROUP_TRAINER << 9) | 0x1a
+
+// STATUS
+#define EC_WORD_DARK (EC_GROUP_STATUS << 9) | 0x0
+#define EC_WORD_STENCH (EC_GROUP_STATUS << 9) | 0x1
+#define EC_WORD_THICK_FAT (EC_GROUP_STATUS << 9) | 0x2
+#define EC_WORD_RAIN_DISH (EC_GROUP_STATUS << 9) | 0x3
+#define EC_WORD_DRIZZLE (EC_GROUP_STATUS << 9) | 0x4
+#define EC_WORD_ARENA_TRAP (EC_GROUP_STATUS << 9) | 0x5
+#define EC_WORD_INTIMIDATE (EC_GROUP_STATUS << 9) | 0x6
+#define EC_WORD_ROCK_HEAD (EC_GROUP_STATUS << 9) | 0x7
+#define EC_WORD_COLOR (EC_GROUP_STATUS << 9) | 0x8
+#define EC_WORD_ALT_COLOR (EC_GROUP_STATUS << 9) | 0x9
+#define EC_WORD_ROCK (EC_GROUP_STATUS << 9) | 0xa
+#define EC_WORD_BEAUTIFUL (EC_GROUP_STATUS << 9) | 0xb
+#define EC_WORD_BEAUTY (EC_GROUP_STATUS << 9) | 0xc
+#define EC_WORD_AIR_LOCK (EC_GROUP_STATUS << 9) | 0xd
+#define EC_WORD_PSYCHIC (EC_GROUP_STATUS << 9) | 0xe
+#define EC_WORD_HYPER_CUTTER (EC_GROUP_STATUS << 9) | 0xf
+#define EC_WORD_FIGHTING (EC_GROUP_STATUS << 9) | 0x10
+#define EC_WORD_SHADOW_TAG (EC_GROUP_STATUS << 9) | 0x11
+#define EC_WORD_SMART (EC_GROUP_STATUS << 9) | 0x12
+#define EC_WORD_SMARTNESS (EC_GROUP_STATUS << 9) | 0x13
+#define EC_WORD_SPEED_BOOST (EC_GROUP_STATUS << 9) | 0x14
+#define EC_WORD_COOL (EC_GROUP_STATUS << 9) | 0x15
+#define EC_WORD_COOLNESS (EC_GROUP_STATUS << 9) | 0x16
+#define EC_WORD_BATTLE_ARMOR (EC_GROUP_STATUS << 9) | 0x17
+#define EC_WORD_CUTE (EC_GROUP_STATUS << 9) | 0x18
+#define EC_WORD_CUTENESS (EC_GROUP_STATUS << 9) | 0x19
+#define EC_WORD_STURDY (EC_GROUP_STATUS << 9) | 0x1a
+#define EC_WORD_SUCTION_CUPS (EC_GROUP_STATUS << 9) | 0x1b
+#define EC_WORD_GRASS (EC_GROUP_STATUS << 9) | 0x1c
+#define EC_WORD_CLEAR_BODY (EC_GROUP_STATUS << 9) | 0x1d
+#define EC_WORD_TORRENT (EC_GROUP_STATUS << 9) | 0x1e
+#define EC_WORD_GHOST (EC_GROUP_STATUS << 9) | 0x1f
+#define EC_WORD_ICE (EC_GROUP_STATUS << 9) | 0x20
+#define EC_WORD_GUTS (EC_GROUP_STATUS << 9) | 0x21
+#define EC_WORD_ROUGH_SKIN (EC_GROUP_STATUS << 9) | 0x22
+#define EC_WORD_SHELL_ARMOR (EC_GROUP_STATUS << 9) | 0x23
+#define EC_WORD_NATURAL_CURE (EC_GROUP_STATUS << 9) | 0x24
+#define EC_WORD_DAMP (EC_GROUP_STATUS << 9) | 0x25
+#define EC_WORD_GROUND (EC_GROUP_STATUS << 9) | 0x26
+#define EC_WORD_LIMBER (EC_GROUP_STATUS << 9) | 0x27
+#define EC_WORD_MAGNET_PULL (EC_GROUP_STATUS << 9) | 0x28
+#define EC_WORD_WHITE_SMOKE (EC_GROUP_STATUS << 9) | 0x29
+#define EC_WORD_SYNCHRONIZE (EC_GROUP_STATUS << 9) | 0x2a
+#define EC_WORD_OVERGROW (EC_GROUP_STATUS << 9) | 0x2b
+#define EC_WORD_SWIFT_SWIM (EC_GROUP_STATUS << 9) | 0x2c
+#define EC_WORD_SAND_STREAM (EC_GROUP_STATUS << 9) | 0x2d
+#define EC_WORD_SAND_VEIL (EC_GROUP_STATUS << 9) | 0x2e
+#define EC_WORD_KEEN_EYE (EC_GROUP_STATUS << 9) | 0x2f
+#define EC_WORD_INNER_FOCUS (EC_GROUP_STATUS << 9) | 0x30
+#define EC_WORD_STATIC (EC_GROUP_STATUS << 9) | 0x31
+#define EC_WORD_TYPE (EC_GROUP_STATUS << 9) | 0x32
+#define EC_WORD_TOUGH (EC_GROUP_STATUS << 9) | 0x33
+#define EC_WORD_TOUGHNESS (EC_GROUP_STATUS << 9) | 0x34
+#define EC_WORD_SHED_SKIN (EC_GROUP_STATUS << 9) | 0x35
+#define EC_WORD_HUGE_POWER (EC_GROUP_STATUS << 9) | 0x36
+#define EC_WORD_VOLT_ABSORB (EC_GROUP_STATUS << 9) | 0x37
+#define EC_WORD_WATER_ABSORB (EC_GROUP_STATUS << 9) | 0x38
+#define EC_WORD_ELECTRIC (EC_GROUP_STATUS << 9) | 0x39
+#define EC_WORD_FORECAST (EC_GROUP_STATUS << 9) | 0x3a
+#define EC_WORD_SERENE_GRACE (EC_GROUP_STATUS << 9) | 0x3b
+#define EC_WORD_POISON (EC_GROUP_STATUS << 9) | 0x3c
+#define EC_WORD_POISON_POINT (EC_GROUP_STATUS << 9) | 0x3d
+#define EC_WORD_DRAGON (EC_GROUP_STATUS << 9) | 0x3e
+#define EC_WORD_TRACE (EC_GROUP_STATUS << 9) | 0x3f
+#define EC_WORD_OBLIVIOUS (EC_GROUP_STATUS << 9) | 0x40
+#define EC_WORD_TRUANT (EC_GROUP_STATUS << 9) | 0x41
+#define EC_WORD_RUN_AWAY (EC_GROUP_STATUS << 9) | 0x42
+#define EC_WORD_STICKY_HOLD (EC_GROUP_STATUS << 9) | 0x43
+#define EC_WORD_CLOUD_NINE (EC_GROUP_STATUS << 9) | 0x44
+#define EC_WORD_NORMAL (EC_GROUP_STATUS << 9) | 0x45
+#define EC_WORD_STEEL (EC_GROUP_STATUS << 9) | 0x46
+#define EC_WORD_ILLUMINATE (EC_GROUP_STATUS << 9) | 0x47
+#define EC_WORD_EARLY_BIRD (EC_GROUP_STATUS << 9) | 0x48
+#define EC_WORD_HUSTLE (EC_GROUP_STATUS << 9) | 0x49
+#define EC_WORD_SHINE (EC_GROUP_STATUS << 9) | 0x4a
+#define EC_WORD_FLYING (EC_GROUP_STATUS << 9) | 0x4b
+#define EC_WORD_DROUGHT (EC_GROUP_STATUS << 9) | 0x4c
+#define EC_WORD_LIGHTNINGROD (EC_GROUP_STATUS << 9) | 0x4d
+#define EC_WORD_COMPOUNDEYES (EC_GROUP_STATUS << 9) | 0x4e
+#define EC_WORD_MARVEL_SCALE (EC_GROUP_STATUS << 9) | 0x4f
+#define EC_WORD_WONDER_GUARD (EC_GROUP_STATUS << 9) | 0x50
+#define EC_WORD_INSOMNIA (EC_GROUP_STATUS << 9) | 0x51
+#define EC_WORD_LEVITATE (EC_GROUP_STATUS << 9) | 0x52
+#define EC_WORD_PLUS (EC_GROUP_STATUS << 9) | 0x53
+#define EC_WORD_PRESSURE (EC_GROUP_STATUS << 9) | 0x54
+#define EC_WORD_LIQUID_OOZE (EC_GROUP_STATUS << 9) | 0x55
+#define EC_WORD_COLOR_CHANGE (EC_GROUP_STATUS << 9) | 0x56
+#define EC_WORD_SOUNDPROOF (EC_GROUP_STATUS << 9) | 0x57
+#define EC_WORD_EFFECT_SPORE (EC_GROUP_STATUS << 9) | 0x58
+#define EC_WORD_PKRS (EC_GROUP_STATUS << 9) | 0x59
+#define EC_WORD_FIRE (EC_GROUP_STATUS << 9) | 0x5a
+#define EC_WORD_FLAME_BODY (EC_GROUP_STATUS << 9) | 0x5b
+#define EC_WORD_MINUS (EC_GROUP_STATUS << 9) | 0x5c
+#define EC_WORD_OWN_TEMPO (EC_GROUP_STATUS << 9) | 0x5d
+#define EC_WORD_MAGMA_ARMOR (EC_GROUP_STATUS << 9) | 0x5e
+#define EC_WORD_WATER (EC_GROUP_STATUS << 9) | 0x5f
+#define EC_WORD_WATER_VEIL (EC_GROUP_STATUS << 9) | 0x60
+#define EC_WORD_BUG (EC_GROUP_STATUS << 9) | 0x61
+#define EC_WORD_SWARM (EC_GROUP_STATUS << 9) | 0x62
+#define EC_WORD_CUTE_CHARM (EC_GROUP_STATUS << 9) | 0x63
+#define EC_WORD_IMMUNITY (EC_GROUP_STATUS << 9) | 0x64
+#define EC_WORD_BLAZE (EC_GROUP_STATUS << 9) | 0x65
+#define EC_WORD_PICKUP (EC_GROUP_STATUS << 9) | 0x66
+#define EC_WORD_PATTERN (EC_GROUP_STATUS << 9) | 0x67
+#define EC_WORD_FLASH_FIRE (EC_GROUP_STATUS << 9) | 0x68
+#define EC_WORD_VITAL_SPIRIT (EC_GROUP_STATUS << 9) | 0x69
+#define EC_WORD_CHLOROPHYLL (EC_GROUP_STATUS << 9) | 0x6a
+#define EC_WORD_PURE_POWER (EC_GROUP_STATUS << 9) | 0x6b
+#define EC_WORD_SHIELD_DUST (EC_GROUP_STATUS << 9) | 0x6c
+
+// BATTLE
+#define EC_WORD_MATCH_UP (EC_GROUP_BATTLE << 9) | 0x0
+#define EC_WORD_GO (EC_GROUP_BATTLE << 9) | 0x1
+#define EC_WORD_NO_1 (EC_GROUP_BATTLE << 9) | 0x2
+#define EC_WORD_DECIDE (EC_GROUP_BATTLE << 9) | 0x3
+#define EC_WORD_LET_ME_WIN (EC_GROUP_BATTLE << 9) | 0x4
+#define EC_WORD_WINS (EC_GROUP_BATTLE << 9) | 0x5
+#define EC_WORD_WIN (EC_GROUP_BATTLE << 9) | 0x6
+#define EC_WORD_WON (EC_GROUP_BATTLE << 9) | 0x7
+#define EC_WORD_IF_I_WIN (EC_GROUP_BATTLE << 9) | 0x8
+#define EC_WORD_WHEN_I_WIN (EC_GROUP_BATTLE << 9) | 0x9
+#define EC_WORD_CAN_T_WIN (EC_GROUP_BATTLE << 9) | 0xa
+#define EC_WORD_CAN_WIN (EC_GROUP_BATTLE << 9) | 0xb
+#define EC_WORD_NO_MATCH (EC_GROUP_BATTLE << 9) | 0xc
+#define EC_WORD_SPIRIT (EC_GROUP_BATTLE << 9) | 0xd
+#define EC_WORD_DECIDED (EC_GROUP_BATTLE << 9) | 0xe
+#define EC_WORD_TRUMP_CARD (EC_GROUP_BATTLE << 9) | 0xf
+#define EC_WORD_TAKE_THAT (EC_GROUP_BATTLE << 9) | 0x10
+#define EC_WORD_COME_ON (EC_GROUP_BATTLE << 9) | 0x11
+#define EC_WORD_ATTACK (EC_GROUP_BATTLE << 9) | 0x12
+#define EC_WORD_SURRENDER (EC_GROUP_BATTLE << 9) | 0x13
+#define EC_WORD_GUTSY (EC_GROUP_BATTLE << 9) | 0x14
+#define EC_WORD_TALENT (EC_GROUP_BATTLE << 9) | 0x15
+#define EC_WORD_STRATEGY (EC_GROUP_BATTLE << 9) | 0x16
+#define EC_WORD_SMITE (EC_GROUP_BATTLE << 9) | 0x17
+#define EC_WORD_MATCH (EC_GROUP_BATTLE << 9) | 0x18
+#define EC_WORD_VICTORY (EC_GROUP_BATTLE << 9) | 0x19
+#define EC_WORD_OFFENSIVE (EC_GROUP_BATTLE << 9) | 0x1a
+#define EC_WORD_SENSE (EC_GROUP_BATTLE << 9) | 0x1b
+#define EC_WORD_VERSUS (EC_GROUP_BATTLE << 9) | 0x1c
+#define EC_WORD_FIGHTS (EC_GROUP_BATTLE << 9) | 0x1d
+#define EC_WORD_POWER (EC_GROUP_BATTLE << 9) | 0x1e
+#define EC_WORD_CHALLENGE (EC_GROUP_BATTLE << 9) | 0x1f
+#define EC_WORD_STRONG (EC_GROUP_BATTLE << 9) | 0x20
+#define EC_WORD_TOO_STRONG (EC_GROUP_BATTLE << 9) | 0x21
+#define EC_WORD_GO_EASY (EC_GROUP_BATTLE << 9) | 0x22
+#define EC_WORD_FOE (EC_GROUP_BATTLE << 9) | 0x23
+#define EC_WORD_GENIUS (EC_GROUP_BATTLE << 9) | 0x24
+#define EC_WORD_LEGEND (EC_GROUP_BATTLE << 9) | 0x25
+#define EC_WORD_ESCAPE (EC_GROUP_BATTLE << 9) | 0x26
+#define EC_WORD_AIM (EC_GROUP_BATTLE << 9) | 0x27
+#define EC_WORD_BATTLE (EC_GROUP_BATTLE << 9) | 0x28
+#define EC_WORD_FIGHT (EC_GROUP_BATTLE << 9) | 0x29
+#define EC_WORD_RESUSCITATE (EC_GROUP_BATTLE << 9) | 0x2a
+#define EC_WORD_POINTS (EC_GROUP_BATTLE << 9) | 0x2b
+#define EC_WORD_SERIOUS (EC_GROUP_BATTLE << 9) | 0x2c
+#define EC_WORD_GIVE_UP (EC_GROUP_BATTLE << 9) | 0x2d
+#define EC_WORD_LOSS (EC_GROUP_BATTLE << 9) | 0x2e
+#define EC_WORD_IF_I_LOSE (EC_GROUP_BATTLE << 9) | 0x2f
+#define EC_WORD_LOST (EC_GROUP_BATTLE << 9) | 0x30
+#define EC_WORD_LOSE (EC_GROUP_BATTLE << 9) | 0x31
+#define EC_WORD_GUARD (EC_GROUP_BATTLE << 9) | 0x32
+#define EC_WORD_PARTNER (EC_GROUP_BATTLE << 9) | 0x33
+#define EC_WORD_REJECT (EC_GROUP_BATTLE << 9) | 0x34
+#define EC_WORD_ACCEPT (EC_GROUP_BATTLE << 9) | 0x35
+#define EC_WORD_INVINCIBLE (EC_GROUP_BATTLE << 9) | 0x36
+#define EC_WORD_RECEIVED (EC_GROUP_BATTLE << 9) | 0x37
+#define EC_WORD_EASY (EC_GROUP_BATTLE << 9) | 0x38
+#define EC_WORD_WEAK (EC_GROUP_BATTLE << 9) | 0x39
+#define EC_WORD_TOO_WEAK (EC_GROUP_BATTLE << 9) | 0x3a
+#define EC_WORD_PUSHOVER (EC_GROUP_BATTLE << 9) | 0x3b
+#define EC_WORD_LEADER (EC_GROUP_BATTLE << 9) | 0x3c
+#define EC_WORD_RULE (EC_GROUP_BATTLE << 9) | 0x3d
+#define EC_WORD_MOVE (EC_GROUP_BATTLE << 9) | 0x3e
+
+// GREETINGS
+#define EC_WORD_THANKS (EC_GROUP_GREETINGS << 9) | 0x0
+#define EC_WORD_YES (EC_GROUP_GREETINGS << 9) | 0x1
+#define EC_WORD_HERE_GOES (EC_GROUP_GREETINGS << 9) | 0x2
+#define EC_WORD_HERE_I_COME (EC_GROUP_GREETINGS << 9) | 0x3
+#define EC_WORD_HERE_IT_IS (EC_GROUP_GREETINGS << 9) | 0x4
+#define EC_WORD_YEAH (EC_GROUP_GREETINGS << 9) | 0x5
+#define EC_WORD_WELCOME (EC_GROUP_GREETINGS << 9) | 0x6
+#define EC_WORD_OI (EC_GROUP_GREETINGS << 9) | 0x7
+#define EC_WORD_HOW_DO (EC_GROUP_GREETINGS << 9) | 0x8
+#define EC_WORD_CONGRATS (EC_GROUP_GREETINGS << 9) | 0x9
+#define EC_WORD_GIVE_ME (EC_GROUP_GREETINGS << 9) | 0xa
+#define EC_WORD_SORRY (EC_GROUP_GREETINGS << 9) | 0xb
+#define EC_WORD_APOLOGIZE (EC_GROUP_GREETINGS << 9) | 0xc
+#define EC_WORD_FORGIVE (EC_GROUP_GREETINGS << 9) | 0xd
+#define EC_WORD_HEY_THERE (EC_GROUP_GREETINGS << 9) | 0xe
+#define EC_WORD_HELLO (EC_GROUP_GREETINGS << 9) | 0xf
+#define EC_WORD_GOOD_BYE (EC_GROUP_GREETINGS << 9) | 0x10
+#define EC_WORD_THANK_YOU (EC_GROUP_GREETINGS << 9) | 0x11
+#define EC_WORD_I_VE_ARRIVED (EC_GROUP_GREETINGS << 9) | 0x12
+#define EC_WORD_PARDON (EC_GROUP_GREETINGS << 9) | 0x13
+#define EC_WORD_EXCUSE (EC_GROUP_GREETINGS << 9) | 0x14
+#define EC_WORD_SEE_YA (EC_GROUP_GREETINGS << 9) | 0x15
+#define EC_WORD_EXCUSE_ME (EC_GROUP_GREETINGS << 9) | 0x16
+#define EC_WORD_WELL_THEN (EC_GROUP_GREETINGS << 9) | 0x17
+#define EC_WORD_GO_AHEAD (EC_GROUP_GREETINGS << 9) | 0x18
+#define EC_WORD_APPRECIATE (EC_GROUP_GREETINGS << 9) | 0x19
+#define EC_WORD_HEY_QUES (EC_GROUP_GREETINGS << 9) | 0x1a
+#define EC_WORD_WHAT_S_UP_QUES (EC_GROUP_GREETINGS << 9) | 0x1b
+#define EC_WORD_HUH_QUES (EC_GROUP_GREETINGS << 9) | 0x1c
+#define EC_WORD_NO (EC_GROUP_GREETINGS << 9) | 0x1d
+#define EC_WORD_HI (EC_GROUP_GREETINGS << 9) | 0x1e
+#define EC_WORD_YEAH_YEAH (EC_GROUP_GREETINGS << 9) | 0x1f
+#define EC_WORD_BYE_BYE (EC_GROUP_GREETINGS << 9) | 0x20
+#define EC_WORD_MEET_YOU (EC_GROUP_GREETINGS << 9) | 0x21
+#define EC_WORD_HEY (EC_GROUP_GREETINGS << 9) | 0x22
+#define EC_WORD_SMELL (EC_GROUP_GREETINGS << 9) | 0x23
+#define EC_WORD_LISTENING (EC_GROUP_GREETINGS << 9) | 0x24
+#define EC_WORD_HOO_HAH (EC_GROUP_GREETINGS << 9) | 0x25
+#define EC_WORD_YAHOO (EC_GROUP_GREETINGS << 9) | 0x26
+#define EC_WORD_YO (EC_GROUP_GREETINGS << 9) | 0x27
+#define EC_WORD_COME_OVER (EC_GROUP_GREETINGS << 9) | 0x28
+#define EC_WORD_COUNT_ON (EC_GROUP_GREETINGS << 9) | 0x29
+
+// PEOPLE
+#define EC_WORD_OPPONENT (EC_GROUP_PEOPLE << 9) | 0x0
+#define EC_WORD_I (EC_GROUP_PEOPLE << 9) | 0x1
+#define EC_WORD_YOU (EC_GROUP_PEOPLE << 9) | 0x2
+#define EC_WORD_YOURS (EC_GROUP_PEOPLE << 9) | 0x3
+#define EC_WORD_SON (EC_GROUP_PEOPLE << 9) | 0x4
+#define EC_WORD_YOUR (EC_GROUP_PEOPLE << 9) | 0x5
+#define EC_WORD_YOU_RE (EC_GROUP_PEOPLE << 9) | 0x6
+#define EC_WORD_YOU_VE (EC_GROUP_PEOPLE << 9) | 0x7
+#define EC_WORD_MOTHER (EC_GROUP_PEOPLE << 9) | 0x8
+#define EC_WORD_GRANDFATHER (EC_GROUP_PEOPLE << 9) | 0x9
+#define EC_WORD_UNCLE (EC_GROUP_PEOPLE << 9) | 0xa
+#define EC_WORD_FATHER (EC_GROUP_PEOPLE << 9) | 0xb
+#define EC_WORD_BOY (EC_GROUP_PEOPLE << 9) | 0xc
+#define EC_WORD_ADULT (EC_GROUP_PEOPLE << 9) | 0xd
+#define EC_WORD_BROTHER (EC_GROUP_PEOPLE << 9) | 0xe
+#define EC_WORD_SISTER (EC_GROUP_PEOPLE << 9) | 0xf
+#define EC_WORD_GRANDMOTHER (EC_GROUP_PEOPLE << 9) | 0x10
+#define EC_WORD_AUNT (EC_GROUP_PEOPLE << 9) | 0x11
+#define EC_WORD_PARENT (EC_GROUP_PEOPLE << 9) | 0x12
+#define EC_WORD_MAN (EC_GROUP_PEOPLE << 9) | 0x13
+#define EC_WORD_ME (EC_GROUP_PEOPLE << 9) | 0x14
+#define EC_WORD_GIRL (EC_GROUP_PEOPLE << 9) | 0x15
+#define EC_WORD_BABE (EC_GROUP_PEOPLE << 9) | 0x16
+#define EC_WORD_FAMILY (EC_GROUP_PEOPLE << 9) | 0x17
+#define EC_WORD_HER (EC_GROUP_PEOPLE << 9) | 0x18
+#define EC_WORD_HIM (EC_GROUP_PEOPLE << 9) | 0x19
+#define EC_WORD_HE (EC_GROUP_PEOPLE << 9) | 0x1a
+#define EC_WORD_PLACE (EC_GROUP_PEOPLE << 9) | 0x1b
+#define EC_WORD_DAUGHTER (EC_GROUP_PEOPLE << 9) | 0x1c
+#define EC_WORD_HIS (EC_GROUP_PEOPLE << 9) | 0x1d
+#define EC_WORD_HE_S (EC_GROUP_PEOPLE << 9) | 0x1e
+#define EC_WORD_AREN_T (EC_GROUP_PEOPLE << 9) | 0x1f
+#define EC_WORD_SIBLINGS (EC_GROUP_PEOPLE << 9) | 0x20
+#define EC_WORD_KID (EC_GROUP_PEOPLE << 9) | 0x21
+#define EC_WORD_CHILDREN (EC_GROUP_PEOPLE << 9) | 0x22
+#define EC_WORD_MR (EC_GROUP_PEOPLE << 9) | 0x23
+#define EC_WORD_MRS (EC_GROUP_PEOPLE << 9) | 0x24
+#define EC_WORD_MYSELF (EC_GROUP_PEOPLE << 9) | 0x25
+#define EC_WORD_I_WAS (EC_GROUP_PEOPLE << 9) | 0x26
+#define EC_WORD_TO_ME (EC_GROUP_PEOPLE << 9) | 0x27
+#define EC_WORD_MY (EC_GROUP_PEOPLE << 9) | 0x28
+#define EC_WORD_I_AM (EC_GROUP_PEOPLE << 9) | 0x29
+#define EC_WORD_I_VE (EC_GROUP_PEOPLE << 9) | 0x2a
+#define EC_WORD_WHO (EC_GROUP_PEOPLE << 9) | 0x2b
+#define EC_WORD_SOMEONE (EC_GROUP_PEOPLE << 9) | 0x2c
+#define EC_WORD_WHO_WAS (EC_GROUP_PEOPLE << 9) | 0x2d
+#define EC_WORD_TO_WHOM (EC_GROUP_PEOPLE << 9) | 0x2e
+#define EC_WORD_WHOSE (EC_GROUP_PEOPLE << 9) | 0x2f
+#define EC_WORD_WHO_IS (EC_GROUP_PEOPLE << 9) | 0x30
+#define EC_WORD_IT_S (EC_GROUP_PEOPLE << 9) | 0x31
+#define EC_WORD_LADY (EC_GROUP_PEOPLE << 9) | 0x32
+#define EC_WORD_FRIEND (EC_GROUP_PEOPLE << 9) | 0x33
+#define EC_WORD_ALLY (EC_GROUP_PEOPLE << 9) | 0x34
+#define EC_WORD_PERSON (EC_GROUP_PEOPLE << 9) | 0x35
+#define EC_WORD_DUDE (EC_GROUP_PEOPLE << 9) | 0x36
+#define EC_WORD_THEY (EC_GROUP_PEOPLE << 9) | 0x37
+#define EC_WORD_THEY_WERE (EC_GROUP_PEOPLE << 9) | 0x38
+#define EC_WORD_TO_THEM (EC_GROUP_PEOPLE << 9) | 0x39
+#define EC_WORD_THEIR (EC_GROUP_PEOPLE << 9) | 0x3a
+#define EC_WORD_THEY_RE (EC_GROUP_PEOPLE << 9) | 0x3b
+#define EC_WORD_THEY_VE (EC_GROUP_PEOPLE << 9) | 0x3c
+#define EC_WORD_WE (EC_GROUP_PEOPLE << 9) | 0x3d
+#define EC_WORD_BEEN (EC_GROUP_PEOPLE << 9) | 0x3e
+#define EC_WORD_TO_US (EC_GROUP_PEOPLE << 9) | 0x3f
+#define EC_WORD_OUR (EC_GROUP_PEOPLE << 9) | 0x40
+#define EC_WORD_WE_RE (EC_GROUP_PEOPLE << 9) | 0x41
+#define EC_WORD_RIVAL (EC_GROUP_PEOPLE << 9) | 0x42
+#define EC_WORD_WE_VE (EC_GROUP_PEOPLE << 9) | 0x43
+#define EC_WORD_WOMAN (EC_GROUP_PEOPLE << 9) | 0x44
+#define EC_WORD_SHE (EC_GROUP_PEOPLE << 9) | 0x45
+#define EC_WORD_SHE_WAS (EC_GROUP_PEOPLE << 9) | 0x46
+#define EC_WORD_TO_HER (EC_GROUP_PEOPLE << 9) | 0x47
+#define EC_WORD_HERS (EC_GROUP_PEOPLE << 9) | 0x48
+#define EC_WORD_SHE_IS (EC_GROUP_PEOPLE << 9) | 0x49
+#define EC_WORD_SOME (EC_GROUP_PEOPLE << 9) | 0x4a
+
+// VOICES
+#define EC_WORD_EXCL (EC_GROUP_VOICES << 9) | 0x0
+#define EC_WORD_EXCL_EXCL (EC_GROUP_VOICES << 9) | 0x1
+#define EC_WORD_QUES_EXCL (EC_GROUP_VOICES << 9) | 0x2
+#define EC_WORD_QUES (EC_GROUP_VOICES << 9) | 0x3
+#define EC_WORD_ELLIPSIS (EC_GROUP_VOICES << 9) | 0x4
+#define EC_WORD_ELLIPSIS_EXCL (EC_GROUP_VOICES << 9) | 0x5
+#define EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS (EC_GROUP_VOICES << 9) | 0x6
+#define EC_WORD_DASH (EC_GROUP_VOICES << 9) | 0x7
+#define EC_WORD_DASH_DASH_DASH (EC_GROUP_VOICES << 9) | 0x8
+#define EC_WORD_UH_OH (EC_GROUP_VOICES << 9) | 0x9
+#define EC_WORD_WAAAH (EC_GROUP_VOICES << 9) | 0xa
+#define EC_WORD_AHAHA (EC_GROUP_VOICES << 9) | 0xb
+#define EC_WORD_OH_QUES (EC_GROUP_VOICES << 9) | 0xc
+#define EC_WORD_NOPE (EC_GROUP_VOICES << 9) | 0xd
+#define EC_WORD_URGH (EC_GROUP_VOICES << 9) | 0xe
+#define EC_WORD_HMM (EC_GROUP_VOICES << 9) | 0xf
+#define EC_WORD_WHOAH (EC_GROUP_VOICES << 9) | 0x10
+#define EC_WORD_WROOOAAR_EXCL (EC_GROUP_VOICES << 9) | 0x11
+#define EC_WORD_WOW (EC_GROUP_VOICES << 9) | 0x12
+#define EC_WORD_GIGGLE (EC_GROUP_VOICES << 9) | 0x13
+#define EC_WORD_SIGH (EC_GROUP_VOICES << 9) | 0x14
+#define EC_WORD_UNBELIEVABLE (EC_GROUP_VOICES << 9) | 0x15
+#define EC_WORD_CRIES (EC_GROUP_VOICES << 9) | 0x16
+#define EC_WORD_AGREE (EC_GROUP_VOICES << 9) | 0x17
+#define EC_WORD_EH_QUES (EC_GROUP_VOICES << 9) | 0x18
+#define EC_WORD_CRY (EC_GROUP_VOICES << 9) | 0x19
+#define EC_WORD_EHEHE (EC_GROUP_VOICES << 9) | 0x1a
+#define EC_WORD_OI_OI_OI (EC_GROUP_VOICES << 9) | 0x1b
+#define EC_WORD_OH_YEAH (EC_GROUP_VOICES << 9) | 0x1c
+#define EC_WORD_OH (EC_GROUP_VOICES << 9) | 0x1d
+#define EC_WORD_OOPS (EC_GROUP_VOICES << 9) | 0x1e
+#define EC_WORD_SHOCKED (EC_GROUP_VOICES << 9) | 0x1f
+#define EC_WORD_EEK (EC_GROUP_VOICES << 9) | 0x20
+#define EC_WORD_GRAAAH (EC_GROUP_VOICES << 9) | 0x21
+#define EC_WORD_GWAHAHAHA (EC_GROUP_VOICES << 9) | 0x22
+#define EC_WORD_WAY (EC_GROUP_VOICES << 9) | 0x23
+#define EC_WORD_TCH (EC_GROUP_VOICES << 9) | 0x24
+#define EC_WORD_HEHE (EC_GROUP_VOICES << 9) | 0x25
+#define EC_WORD_HAH (EC_GROUP_VOICES << 9) | 0x26
+#define EC_WORD_YUP (EC_GROUP_VOICES << 9) | 0x27
+#define EC_WORD_HAHAHA (EC_GROUP_VOICES << 9) | 0x28
+#define EC_WORD_AIYEEH (EC_GROUP_VOICES << 9) | 0x29
+#define EC_WORD_HIYAH (EC_GROUP_VOICES << 9) | 0x2a
+#define EC_WORD_FUFUFU (EC_GROUP_VOICES << 9) | 0x2b
+#define EC_WORD_LOL (EC_GROUP_VOICES << 9) | 0x2c
+#define EC_WORD_SNORT (EC_GROUP_VOICES << 9) | 0x2d
+#define EC_WORD_HUMPH (EC_GROUP_VOICES << 9) | 0x2e
+#define EC_WORD_HEHEHE (EC_GROUP_VOICES << 9) | 0x2f
+#define EC_WORD_HEH (EC_GROUP_VOICES << 9) | 0x30
+#define EC_WORD_HOHOHO (EC_GROUP_VOICES << 9) | 0x31
+#define EC_WORD_UH_HUH (EC_GROUP_VOICES << 9) | 0x32
+#define EC_WORD_OH_DEAR (EC_GROUP_VOICES << 9) | 0x33
+#define EC_WORD_ARRGH (EC_GROUP_VOICES << 9) | 0x34
+#define EC_WORD_MUFUFU (EC_GROUP_VOICES << 9) | 0x35
+#define EC_WORD_MMM (EC_GROUP_VOICES << 9) | 0x36
+#define EC_WORD_OH_KAY (EC_GROUP_VOICES << 9) | 0x37
+#define EC_WORD_OKAY (EC_GROUP_VOICES << 9) | 0x38
+#define EC_WORD_LALALA (EC_GROUP_VOICES << 9) | 0x39
+#define EC_WORD_YAY (EC_GROUP_VOICES << 9) | 0x3a
+#define EC_WORD_AWW (EC_GROUP_VOICES << 9) | 0x3b
+#define EC_WORD_WOWEE (EC_GROUP_VOICES << 9) | 0x3c
+#define EC_WORD_GWAH (EC_GROUP_VOICES << 9) | 0x3d
+#define EC_WORD_WAHAHAHA (EC_GROUP_VOICES << 9) | 0x3e
+
+// SPEECH
+#define EC_WORD_LISTEN (EC_GROUP_SPEECH << 9) | 0x0
+#define EC_WORD_NOT_VERY (EC_GROUP_SPEECH << 9) | 0x1
+#define EC_WORD_MEAN (EC_GROUP_SPEECH << 9) | 0x2
+#define EC_WORD_LIE (EC_GROUP_SPEECH << 9) | 0x3
+#define EC_WORD_LAY (EC_GROUP_SPEECH << 9) | 0x4
+#define EC_WORD_RECOMMEND (EC_GROUP_SPEECH << 9) | 0x5
+#define EC_WORD_NITWIT (EC_GROUP_SPEECH << 9) | 0x6
+#define EC_WORD_QUITE (EC_GROUP_SPEECH << 9) | 0x7
+#define EC_WORD_FROM (EC_GROUP_SPEECH << 9) | 0x8
+#define EC_WORD_FEELING (EC_GROUP_SPEECH << 9) | 0x9
+#define EC_WORD_BUT (EC_GROUP_SPEECH << 9) | 0xa
+#define EC_WORD_HOWEVER (EC_GROUP_SPEECH << 9) | 0xb
+#define EC_WORD_CASE (EC_GROUP_SPEECH << 9) | 0xc
+#define EC_WORD_THE (EC_GROUP_SPEECH << 9) | 0xd
+#define EC_WORD_MISS (EC_GROUP_SPEECH << 9) | 0xe
+#define EC_WORD_HOW (EC_GROUP_SPEECH << 9) | 0xf
+#define EC_WORD_HIT (EC_GROUP_SPEECH << 9) | 0x10
+#define EC_WORD_ENOUGH (EC_GROUP_SPEECH << 9) | 0x11
+#define EC_WORD_A_LOT (EC_GROUP_SPEECH << 9) | 0x12
+#define EC_WORD_A_LITTLE (EC_GROUP_SPEECH << 9) | 0x13
+#define EC_WORD_ABSOLUTELY (EC_GROUP_SPEECH << 9) | 0x14
+#define EC_WORD_AND (EC_GROUP_SPEECH << 9) | 0x15
+#define EC_WORD_ONLY (EC_GROUP_SPEECH << 9) | 0x16
+#define EC_WORD_AROUND (EC_GROUP_SPEECH << 9) | 0x17
+#define EC_WORD_PROBABLY (EC_GROUP_SPEECH << 9) | 0x18
+#define EC_WORD_IF (EC_GROUP_SPEECH << 9) | 0x19
+#define EC_WORD_VERY (EC_GROUP_SPEECH << 9) | 0x1a
+#define EC_WORD_A_TINY_BIT (EC_GROUP_SPEECH << 9) | 0x1b
+#define EC_WORD_WILD (EC_GROUP_SPEECH << 9) | 0x1c
+#define EC_WORD_THAT_S (EC_GROUP_SPEECH << 9) | 0x1d
+#define EC_WORD_JUST (EC_GROUP_SPEECH << 9) | 0x1e
+#define EC_WORD_EVEN_SO (EC_GROUP_SPEECH << 9) | 0x1f
+#define EC_WORD_MUST_BE (EC_GROUP_SPEECH << 9) | 0x20
+#define EC_WORD_NATURALLY (EC_GROUP_SPEECH << 9) | 0x21
+#define EC_WORD_FOR_NOW (EC_GROUP_SPEECH << 9) | 0x22
+#define EC_WORD_UNDERSTOOD (EC_GROUP_SPEECH << 9) | 0x23
+#define EC_WORD_JOKING (EC_GROUP_SPEECH << 9) | 0x24
+#define EC_WORD_READY (EC_GROUP_SPEECH << 9) | 0x25
+#define EC_WORD_SOMETHING (EC_GROUP_SPEECH << 9) | 0x26
+#define EC_WORD_SOMEHOW (EC_GROUP_SPEECH << 9) | 0x27
+#define EC_WORD_ALTHOUGH (EC_GROUP_SPEECH << 9) | 0x28
+#define EC_WORD_ALSO (EC_GROUP_SPEECH << 9) | 0x29
+#define EC_WORD_PERFECT (EC_GROUP_SPEECH << 9) | 0x2a
+#define EC_WORD_AS_MUCH_AS (EC_GROUP_SPEECH << 9) | 0x2b
+#define EC_WORD_REALLY (EC_GROUP_SPEECH << 9) | 0x2c
+#define EC_WORD_TRULY (EC_GROUP_SPEECH << 9) | 0x2d
+#define EC_WORD_SERIOUSLY (EC_GROUP_SPEECH << 9) | 0x2e
+#define EC_WORD_TOTALLY (EC_GROUP_SPEECH << 9) | 0x2f
+#define EC_WORD_UNTIL (EC_GROUP_SPEECH << 9) | 0x30
+#define EC_WORD_AS_IF (EC_GROUP_SPEECH << 9) | 0x31
+#define EC_WORD_MOOD (EC_GROUP_SPEECH << 9) | 0x32
+#define EC_WORD_RATHER (EC_GROUP_SPEECH << 9) | 0x33
+#define EC_WORD_AWFULLY (EC_GROUP_SPEECH << 9) | 0x34
+#define EC_WORD_MODE (EC_GROUP_SPEECH << 9) | 0x35
+#define EC_WORD_MORE (EC_GROUP_SPEECH << 9) | 0x36
+#define EC_WORD_TOO_LATE (EC_GROUP_SPEECH << 9) | 0x37
+#define EC_WORD_FINALLY (EC_GROUP_SPEECH << 9) | 0x38
+#define EC_WORD_ANY (EC_GROUP_SPEECH << 9) | 0x39
+#define EC_WORD_INSTEAD (EC_GROUP_SPEECH << 9) | 0x3a
+#define EC_WORD_FANTASTIC (EC_GROUP_SPEECH << 9) | 0x3b
+
+// ENDINGS
+#define EC_WORD_WILL (EC_GROUP_ENDINGS << 9) | 0x0
+#define EC_WORD_WILL_BE_HERE (EC_GROUP_ENDINGS << 9) | 0x1
+#define EC_WORD_OR (EC_GROUP_ENDINGS << 9) | 0x2
+#define EC_WORD_TIMES (EC_GROUP_ENDINGS << 9) | 0x3
+#define EC_WORD_WONDER (EC_GROUP_ENDINGS << 9) | 0x4
+#define EC_WORD_IS_IT_QUES (EC_GROUP_ENDINGS << 9) | 0x5
+#define EC_WORD_BE (EC_GROUP_ENDINGS << 9) | 0x6
+#define EC_WORD_GIMME (EC_GROUP_ENDINGS << 9) | 0x7
+#define EC_WORD_COULD (EC_GROUP_ENDINGS << 9) | 0x8
+#define EC_WORD_LIKELY_TO (EC_GROUP_ENDINGS << 9) | 0x9
+#define EC_WORD_WOULD (EC_GROUP_ENDINGS << 9) | 0xa
+#define EC_WORD_IS (EC_GROUP_ENDINGS << 9) | 0xb
+#define EC_WORD_ISN_T_IT_QUES (EC_GROUP_ENDINGS << 9) | 0xc
+#define EC_WORD_LET_S (EC_GROUP_ENDINGS << 9) | 0xd
+#define EC_WORD_OTHER (EC_GROUP_ENDINGS << 9) | 0xe
+#define EC_WORD_ARE (EC_GROUP_ENDINGS << 9) | 0xf
+#define EC_WORD_WAS (EC_GROUP_ENDINGS << 9) | 0x10
+#define EC_WORD_WERE (EC_GROUP_ENDINGS << 9) | 0x11
+#define EC_WORD_THOSE (EC_GROUP_ENDINGS << 9) | 0x12
+#define EC_WORD_ISN_T (EC_GROUP_ENDINGS << 9) | 0x13
+#define EC_WORD_WON_T (EC_GROUP_ENDINGS << 9) | 0x14
+#define EC_WORD_CAN_T (EC_GROUP_ENDINGS << 9) | 0x15
+#define EC_WORD_CAN (EC_GROUP_ENDINGS << 9) | 0x16
+#define EC_WORD_DON_T (EC_GROUP_ENDINGS << 9) | 0x17
+#define EC_WORD_DO (EC_GROUP_ENDINGS << 9) | 0x18
+#define EC_WORD_DOES (EC_GROUP_ENDINGS << 9) | 0x19
+#define EC_WORD_WHOM (EC_GROUP_ENDINGS << 9) | 0x1a
+#define EC_WORD_WHICH (EC_GROUP_ENDINGS << 9) | 0x1b
+#define EC_WORD_WASN_T (EC_GROUP_ENDINGS << 9) | 0x1c
+#define EC_WORD_WEREN_T (EC_GROUP_ENDINGS << 9) | 0x1d
+#define EC_WORD_HAVE (EC_GROUP_ENDINGS << 9) | 0x1e
+#define EC_WORD_HAVEN_T (EC_GROUP_ENDINGS << 9) | 0x1f
+#define EC_WORD_A (EC_GROUP_ENDINGS << 9) | 0x20
+#define EC_WORD_AN (EC_GROUP_ENDINGS << 9) | 0x21
+#define EC_WORD_NOT (EC_GROUP_ENDINGS << 9) | 0x22
+#define EC_WORD_THERE (EC_GROUP_ENDINGS << 9) | 0x23
+#define EC_WORD_OK_QUES (EC_GROUP_ENDINGS << 9) | 0x24
+#define EC_WORD_SO (EC_GROUP_ENDINGS << 9) | 0x25
+#define EC_WORD_MAYBE (EC_GROUP_ENDINGS << 9) | 0x26
+#define EC_WORD_ABOUT (EC_GROUP_ENDINGS << 9) | 0x27
+#define EC_WORD_OVER (EC_GROUP_ENDINGS << 9) | 0x28
+#define EC_WORD_IT (EC_GROUP_ENDINGS << 9) | 0x29
+#define EC_WORD_ALL (EC_GROUP_ENDINGS << 9) | 0x2a
+#define EC_WORD_FOR (EC_GROUP_ENDINGS << 9) | 0x2b
+#define EC_WORD_ON (EC_GROUP_ENDINGS << 9) | 0x2c
+#define EC_WORD_OFF (EC_GROUP_ENDINGS << 9) | 0x2d
+#define EC_WORD_AS (EC_GROUP_ENDINGS << 9) | 0x2e
+#define EC_WORD_TO (EC_GROUP_ENDINGS << 9) | 0x2f
+#define EC_WORD_WITH (EC_GROUP_ENDINGS << 9) | 0x30
+#define EC_WORD_BETTER (EC_GROUP_ENDINGS << 9) | 0x31
+#define EC_WORD_EVER (EC_GROUP_ENDINGS << 9) | 0x32
+#define EC_WORD_SINCE (EC_GROUP_ENDINGS << 9) | 0x33
+#define EC_WORD_OF (EC_GROUP_ENDINGS << 9) | 0x34
+#define EC_WORD_BELONGS_TO (EC_GROUP_ENDINGS << 9) | 0x35
+#define EC_WORD_AT (EC_GROUP_ENDINGS << 9) | 0x36
+#define EC_WORD_IN (EC_GROUP_ENDINGS << 9) | 0x37
+#define EC_WORD_OUT (EC_GROUP_ENDINGS << 9) | 0x38
+#define EC_WORD_TOO (EC_GROUP_ENDINGS << 9) | 0x39
+#define EC_WORD_LIKE (EC_GROUP_ENDINGS << 9) | 0x3a
+#define EC_WORD_DID (EC_GROUP_ENDINGS << 9) | 0x3b
+#define EC_WORD_DIDN_T (EC_GROUP_ENDINGS << 9) | 0x3c
+#define EC_WORD_DOESN_T (EC_GROUP_ENDINGS << 9) | 0x3d
+#define EC_WORD_WITHOUT (EC_GROUP_ENDINGS << 9) | 0x3e
+#define EC_WORD_AFTER (EC_GROUP_ENDINGS << 9) | 0x3f
+#define EC_WORD_BEFORE (EC_GROUP_ENDINGS << 9) | 0x40
+#define EC_WORD_WHILE (EC_GROUP_ENDINGS << 9) | 0x41
+#define EC_WORD_THAN (EC_GROUP_ENDINGS << 9) | 0x42
+#define EC_WORD_ONCE (EC_GROUP_ENDINGS << 9) | 0x43
+#define EC_WORD_ANYWHERE (EC_GROUP_ENDINGS << 9) | 0x44
+
+// FEELINGS
+#define EC_WORD_MEET (EC_GROUP_FEELINGS << 9) | 0x0
+#define EC_WORD_PLAY (EC_GROUP_FEELINGS << 9) | 0x1
+#define EC_WORD_HURRIED (EC_GROUP_FEELINGS << 9) | 0x2
+#define EC_WORD_GOES (EC_GROUP_FEELINGS << 9) | 0x3
+#define EC_WORD_GIDDY (EC_GROUP_FEELINGS << 9) | 0x4
+#define EC_WORD_HAPPY (EC_GROUP_FEELINGS << 9) | 0x5
+#define EC_WORD_HAPPINESS (EC_GROUP_FEELINGS << 9) | 0x6
+#define EC_WORD_EXCITE (EC_GROUP_FEELINGS << 9) | 0x7
+#define EC_WORD_IMPORTANT (EC_GROUP_FEELINGS << 9) | 0x8
+#define EC_WORD_FUNNY (EC_GROUP_FEELINGS << 9) | 0x9
+#define EC_WORD_GOT (EC_GROUP_FEELINGS << 9) | 0xa
+#define EC_WORD_GO_HOME (EC_GROUP_FEELINGS << 9) | 0xb
+#define EC_WORD_DISAPPOINTED (EC_GROUP_FEELINGS << 9) | 0xc
+#define EC_WORD_DISAPPOINTS (EC_GROUP_FEELINGS << 9) | 0xd
+#define EC_WORD_SAD (EC_GROUP_FEELINGS << 9) | 0xe
+#define EC_WORD_TRY (EC_GROUP_FEELINGS << 9) | 0xf
+#define EC_WORD_TRIES (EC_GROUP_FEELINGS << 9) | 0x10
+#define EC_WORD_HEARS (EC_GROUP_FEELINGS << 9) | 0x11
+#define EC_WORD_THINK (EC_GROUP_FEELINGS << 9) | 0x12
+#define EC_WORD_HEAR (EC_GROUP_FEELINGS << 9) | 0x13
+#define EC_WORD_WANTS (EC_GROUP_FEELINGS << 9) | 0x14
+#define EC_WORD_MISHEARD (EC_GROUP_FEELINGS << 9) | 0x15
+#define EC_WORD_DISLIKE (EC_GROUP_FEELINGS << 9) | 0x16
+#define EC_WORD_ANGRY (EC_GROUP_FEELINGS << 9) | 0x17
+#define EC_WORD_ANGER (EC_GROUP_FEELINGS << 9) | 0x18
+#define EC_WORD_SCARY (EC_GROUP_FEELINGS << 9) | 0x19
+#define EC_WORD_LONESOME (EC_GROUP_FEELINGS << 9) | 0x1a
+#define EC_WORD_DISAPPOINT (EC_GROUP_FEELINGS << 9) | 0x1b
+#define EC_WORD_JOY (EC_GROUP_FEELINGS << 9) | 0x1c
+#define EC_WORD_GETS (EC_GROUP_FEELINGS << 9) | 0x1d
+#define EC_WORD_NEVER (EC_GROUP_FEELINGS << 9) | 0x1e
+#define EC_WORD_DARN (EC_GROUP_FEELINGS << 9) | 0x1f
+#define EC_WORD_DOWNCAST (EC_GROUP_FEELINGS << 9) | 0x20
+#define EC_WORD_INCREDIBLE (EC_GROUP_FEELINGS << 9) | 0x21
+#define EC_WORD_LIKES (EC_GROUP_FEELINGS << 9) | 0x22
+#define EC_WORD_DISLIKES (EC_GROUP_FEELINGS << 9) | 0x23
+#define EC_WORD_BORING (EC_GROUP_FEELINGS << 9) | 0x24
+#define EC_WORD_CARE (EC_GROUP_FEELINGS << 9) | 0x25
+#define EC_WORD_CARES (EC_GROUP_FEELINGS << 9) | 0x26
+#define EC_WORD_ALL_RIGHT (EC_GROUP_FEELINGS << 9) | 0x27
+#define EC_WORD_ADORE (EC_GROUP_FEELINGS << 9) | 0x28
+#define EC_WORD_DISASTER (EC_GROUP_FEELINGS << 9) | 0x29
+#define EC_WORD_ENJOY (EC_GROUP_FEELINGS << 9) | 0x2a
+#define EC_WORD_ENJOYS (EC_GROUP_FEELINGS << 9) | 0x2b
+#define EC_WORD_EAT (EC_GROUP_FEELINGS << 9) | 0x2c
+#define EC_WORD_LACKING (EC_GROUP_FEELINGS << 9) | 0x2d
+#define EC_WORD_BAD (EC_GROUP_FEELINGS << 9) | 0x2e
+#define EC_WORD_HARD (EC_GROUP_FEELINGS << 9) | 0x2f
+#define EC_WORD_TERRIBLE (EC_GROUP_FEELINGS << 9) | 0x30
+#define EC_WORD_SHOULD (EC_GROUP_FEELINGS << 9) | 0x31
+#define EC_WORD_NICE (EC_GROUP_FEELINGS << 9) | 0x32
+#define EC_WORD_DRINK (EC_GROUP_FEELINGS << 9) | 0x33
+#define EC_WORD_SURPRISE (EC_GROUP_FEELINGS << 9) | 0x34
+#define EC_WORD_FEAR (EC_GROUP_FEELINGS << 9) | 0x35
+#define EC_WORD_WANT (EC_GROUP_FEELINGS << 9) | 0x36
+#define EC_WORD_WAIT (EC_GROUP_FEELINGS << 9) | 0x37
+#define EC_WORD_SATISFIED (EC_GROUP_FEELINGS << 9) | 0x38
+#define EC_WORD_SEE (EC_GROUP_FEELINGS << 9) | 0x39
+#define EC_WORD_RARE (EC_GROUP_FEELINGS << 9) | 0x3a
+#define EC_WORD_NEGATIVE (EC_GROUP_FEELINGS << 9) | 0x3b
+#define EC_WORD_DONE (EC_GROUP_FEELINGS << 9) | 0x3c
+#define EC_WORD_DANGER (EC_GROUP_FEELINGS << 9) | 0x3d
+#define EC_WORD_DEFEATED (EC_GROUP_FEELINGS << 9) | 0x3e
+#define EC_WORD_BEAT (EC_GROUP_FEELINGS << 9) | 0x3f
+#define EC_WORD_GREAT (EC_GROUP_FEELINGS << 9) | 0x40
+#define EC_WORD_ROMANTIC (EC_GROUP_FEELINGS << 9) | 0x41
+#define EC_WORD_QUESTION (EC_GROUP_FEELINGS << 9) | 0x42
+#define EC_WORD_UNDERSTAND (EC_GROUP_FEELINGS << 9) | 0x43
+#define EC_WORD_UNDERSTANDS (EC_GROUP_FEELINGS << 9) | 0x44
+
+// CONDITIONS
+#define EC_WORD_HOT (EC_GROUP_CONDITIONS << 9) | 0x0
+#define EC_WORD_EXISTS (EC_GROUP_CONDITIONS << 9) | 0x1
+#define EC_WORD_EXCESS (EC_GROUP_CONDITIONS << 9) | 0x2
+#define EC_WORD_APPROVED (EC_GROUP_CONDITIONS << 9) | 0x3
+#define EC_WORD_HAS (EC_GROUP_CONDITIONS << 9) | 0x4
+#define EC_WORD_GOOD (EC_GROUP_CONDITIONS << 9) | 0x5
+#define EC_WORD_LESS (EC_GROUP_CONDITIONS << 9) | 0x6
+#define EC_WORD_MOMENTUM (EC_GROUP_CONDITIONS << 9) | 0x7
+#define EC_WORD_GOING (EC_GROUP_CONDITIONS << 9) | 0x8
+#define EC_WORD_WEIRD (EC_GROUP_CONDITIONS << 9) | 0x9
+#define EC_WORD_BUSY (EC_GROUP_CONDITIONS << 9) | 0xa
+#define EC_WORD_TOGETHER (EC_GROUP_CONDITIONS << 9) | 0xb
+#define EC_WORD_FULL (EC_GROUP_CONDITIONS << 9) | 0xc
+#define EC_WORD_ABSENT (EC_GROUP_CONDITIONS << 9) | 0xd
+#define EC_WORD_BEING (EC_GROUP_CONDITIONS << 9) | 0xe
+#define EC_WORD_NEED (EC_GROUP_CONDITIONS << 9) | 0xf
+#define EC_WORD_TASTY (EC_GROUP_CONDITIONS << 9) | 0x10
+#define EC_WORD_SKILLED (EC_GROUP_CONDITIONS << 9) | 0x11
+#define EC_WORD_NOISY (EC_GROUP_CONDITIONS << 9) | 0x12
+#define EC_WORD_BIG (EC_GROUP_CONDITIONS << 9) | 0x13
+#define EC_WORD_LATE (EC_GROUP_CONDITIONS << 9) | 0x14
+#define EC_WORD_CLOSE (EC_GROUP_CONDITIONS << 9) | 0x15
+#define EC_WORD_DOCILE (EC_GROUP_CONDITIONS << 9) | 0x16
+#define EC_WORD_AMUSING (EC_GROUP_CONDITIONS << 9) | 0x17
+#define EC_WORD_ENTERTAINING (EC_GROUP_CONDITIONS << 9) | 0x18
+#define EC_WORD_PERFECTION (EC_GROUP_CONDITIONS << 9) | 0x19
+#define EC_WORD_PRETTY (EC_GROUP_CONDITIONS << 9) | 0x1a
+#define EC_WORD_HEALTHY (EC_GROUP_CONDITIONS << 9) | 0x1b
+#define EC_WORD_EXCELLENT (EC_GROUP_CONDITIONS << 9) | 0x1c
+#define EC_WORD_UPSIDE_DOWN (EC_GROUP_CONDITIONS << 9) | 0x1d
+#define EC_WORD_COLD (EC_GROUP_CONDITIONS << 9) | 0x1e
+#define EC_WORD_REFRESHING (EC_GROUP_CONDITIONS << 9) | 0x1f
+#define EC_WORD_UNAVOIDABLE (EC_GROUP_CONDITIONS << 9) | 0x20
+#define EC_WORD_MUCH (EC_GROUP_CONDITIONS << 9) | 0x21
+#define EC_WORD_OVERWHELMING (EC_GROUP_CONDITIONS << 9) | 0x22
+#define EC_WORD_FABULOUS (EC_GROUP_CONDITIONS << 9) | 0x23
+#define EC_WORD_ELSE (EC_GROUP_CONDITIONS << 9) | 0x24
+#define EC_WORD_EXPENSIVE (EC_GROUP_CONDITIONS << 9) | 0x25
+#define EC_WORD_CORRECT (EC_GROUP_CONDITIONS << 9) | 0x26
+#define EC_WORD_IMPOSSIBLE (EC_GROUP_CONDITIONS << 9) | 0x27
+#define EC_WORD_SMALL (EC_GROUP_CONDITIONS << 9) | 0x28
+#define EC_WORD_DIFFERENT (EC_GROUP_CONDITIONS << 9) | 0x29
+#define EC_WORD_TIRED (EC_GROUP_CONDITIONS << 9) | 0x2a
+#define EC_WORD_SKILL (EC_GROUP_CONDITIONS << 9) | 0x2b
+#define EC_WORD_TOP (EC_GROUP_CONDITIONS << 9) | 0x2c
+#define EC_WORD_NON_STOP (EC_GROUP_CONDITIONS << 9) | 0x2d
+#define EC_WORD_PREPOSTEROUS (EC_GROUP_CONDITIONS << 9) | 0x2e
+#define EC_WORD_NONE (EC_GROUP_CONDITIONS << 9) | 0x2f
+#define EC_WORD_NOTHING (EC_GROUP_CONDITIONS << 9) | 0x30
+#define EC_WORD_NATURAL (EC_GROUP_CONDITIONS << 9) | 0x31
+#define EC_WORD_BECOMES (EC_GROUP_CONDITIONS << 9) | 0x32
+#define EC_WORD_LUKEWARM (EC_GROUP_CONDITIONS << 9) | 0x33
+#define EC_WORD_FAST (EC_GROUP_CONDITIONS << 9) | 0x34
+#define EC_WORD_LOW (EC_GROUP_CONDITIONS << 9) | 0x35
+#define EC_WORD_AWFUL (EC_GROUP_CONDITIONS << 9) | 0x36
+#define EC_WORD_ALONE (EC_GROUP_CONDITIONS << 9) | 0x37
+#define EC_WORD_BORED (EC_GROUP_CONDITIONS << 9) | 0x38
+#define EC_WORD_SECRET (EC_GROUP_CONDITIONS << 9) | 0x39
+#define EC_WORD_MYSTERY (EC_GROUP_CONDITIONS << 9) | 0x3a
+#define EC_WORD_LACKS (EC_GROUP_CONDITIONS << 9) | 0x3b
+#define EC_WORD_BEST (EC_GROUP_CONDITIONS << 9) | 0x3c
+#define EC_WORD_LOUSY (EC_GROUP_CONDITIONS << 9) | 0x3d
+#define EC_WORD_MISTAKE (EC_GROUP_CONDITIONS << 9) | 0x3e
+#define EC_WORD_KIND (EC_GROUP_CONDITIONS << 9) | 0x3f
+#define EC_WORD_WELL (EC_GROUP_CONDITIONS << 9) | 0x40
+#define EC_WORD_WEAKENED (EC_GROUP_CONDITIONS << 9) | 0x41
+#define EC_WORD_SIMPLE (EC_GROUP_CONDITIONS << 9) | 0x42
+#define EC_WORD_SEEMS (EC_GROUP_CONDITIONS << 9) | 0x43
+#define EC_WORD_BADLY (EC_GROUP_CONDITIONS << 9) | 0x44
+
+// ACTIONS
+#define EC_WORD_MEETS (EC_GROUP_ACTIONS << 9) | 0x0
+#define EC_WORD_CONCEDE (EC_GROUP_ACTIONS << 9) | 0x1
+#define EC_WORD_GIVE (EC_GROUP_ACTIONS << 9) | 0x2
+#define EC_WORD_GIVES (EC_GROUP_ACTIONS << 9) | 0x3
+#define EC_WORD_PLAYED (EC_GROUP_ACTIONS << 9) | 0x4
+#define EC_WORD_PLAYS (EC_GROUP_ACTIONS << 9) | 0x5
+#define EC_WORD_COLLECT (EC_GROUP_ACTIONS << 9) | 0x6
+#define EC_WORD_WALKING (EC_GROUP_ACTIONS << 9) | 0x7
+#define EC_WORD_WALKS (EC_GROUP_ACTIONS << 9) | 0x8
+#define EC_WORD_SAYS (EC_GROUP_ACTIONS << 9) | 0x9
+#define EC_WORD_WENT (EC_GROUP_ACTIONS << 9) | 0xa
+#define EC_WORD_SAID (EC_GROUP_ACTIONS << 9) | 0xb
+#define EC_WORD_WAKE_UP (EC_GROUP_ACTIONS << 9) | 0xc
+#define EC_WORD_WAKES_UP (EC_GROUP_ACTIONS << 9) | 0xd
+#define EC_WORD_ANGERS (EC_GROUP_ACTIONS << 9) | 0xe
+#define EC_WORD_TEACH (EC_GROUP_ACTIONS << 9) | 0xf
+#define EC_WORD_TEACHES (EC_GROUP_ACTIONS << 9) | 0x10
+#define EC_WORD_PLEASE (EC_GROUP_ACTIONS << 9) | 0x11
+#define EC_WORD_LEARN (EC_GROUP_ACTIONS << 9) | 0x12
+#define EC_WORD_CHANGE (EC_GROUP_ACTIONS << 9) | 0x13
+#define EC_WORD_STORY (EC_GROUP_ACTIONS << 9) | 0x14
+#define EC_WORD_TRUST (EC_GROUP_ACTIONS << 9) | 0x15
+#define EC_WORD_LAVISH (EC_GROUP_ACTIONS << 9) | 0x16
+#define EC_WORD_LISTENS (EC_GROUP_ACTIONS << 9) | 0x17
+#define EC_WORD_HEARING (EC_GROUP_ACTIONS << 9) | 0x18
+#define EC_WORD_TRAINS (EC_GROUP_ACTIONS << 9) | 0x19
+#define EC_WORD_CHOOSE (EC_GROUP_ACTIONS << 9) | 0x1a
+#define EC_WORD_COME (EC_GROUP_ACTIONS << 9) | 0x1b
+#define EC_WORD_CAME (EC_GROUP_ACTIONS << 9) | 0x1c
+#define EC_WORD_SEARCH (EC_GROUP_ACTIONS << 9) | 0x1d
+#define EC_WORD_MAKE (EC_GROUP_ACTIONS << 9) | 0x1e
+#define EC_WORD_CAUSE (EC_GROUP_ACTIONS << 9) | 0x1f
+#define EC_WORD_KNOW (EC_GROUP_ACTIONS << 9) | 0x20
+#define EC_WORD_KNOWS (EC_GROUP_ACTIONS << 9) | 0x21
+#define EC_WORD_REFUSE (EC_GROUP_ACTIONS << 9) | 0x22
+#define EC_WORD_STORES (EC_GROUP_ACTIONS << 9) | 0x23
+#define EC_WORD_BRAG (EC_GROUP_ACTIONS << 9) | 0x24
+#define EC_WORD_IGNORANT (EC_GROUP_ACTIONS << 9) | 0x25
+#define EC_WORD_THINKS (EC_GROUP_ACTIONS << 9) | 0x26
+#define EC_WORD_BELIEVE (EC_GROUP_ACTIONS << 9) | 0x27
+#define EC_WORD_SLIDE (EC_GROUP_ACTIONS << 9) | 0x28
+#define EC_WORD_EATS (EC_GROUP_ACTIONS << 9) | 0x29
+#define EC_WORD_USE (EC_GROUP_ACTIONS << 9) | 0x2a
+#define EC_WORD_USES (EC_GROUP_ACTIONS << 9) | 0x2b
+#define EC_WORD_USING (EC_GROUP_ACTIONS << 9) | 0x2c
+#define EC_WORD_COULDN_T (EC_GROUP_ACTIONS << 9) | 0x2d
+#define EC_WORD_CAPABLE (EC_GROUP_ACTIONS << 9) | 0x2e
+#define EC_WORD_DISAPPEAR (EC_GROUP_ACTIONS << 9) | 0x2f
+#define EC_WORD_APPEAR (EC_GROUP_ACTIONS << 9) | 0x30
+#define EC_WORD_THROW (EC_GROUP_ACTIONS << 9) | 0x31
+#define EC_WORD_WORRY (EC_GROUP_ACTIONS << 9) | 0x32
+#define EC_WORD_SLEPT (EC_GROUP_ACTIONS << 9) | 0x33
+#define EC_WORD_SLEEP (EC_GROUP_ACTIONS << 9) | 0x34
+#define EC_WORD_RELEASE (EC_GROUP_ACTIONS << 9) | 0x35
+#define EC_WORD_DRINKS (EC_GROUP_ACTIONS << 9) | 0x36
+#define EC_WORD_RUNS (EC_GROUP_ACTIONS << 9) | 0x37
+#define EC_WORD_RUN (EC_GROUP_ACTIONS << 9) | 0x38
+#define EC_WORD_WORKS (EC_GROUP_ACTIONS << 9) | 0x39
+#define EC_WORD_WORKING (EC_GROUP_ACTIONS << 9) | 0x3a
+#define EC_WORD_TALKING (EC_GROUP_ACTIONS << 9) | 0x3b
+#define EC_WORD_TALK (EC_GROUP_ACTIONS << 9) | 0x3c
+#define EC_WORD_SINK (EC_GROUP_ACTIONS << 9) | 0x3d
+#define EC_WORD_SMACK (EC_GROUP_ACTIONS << 9) | 0x3e
+#define EC_WORD_PRETEND (EC_GROUP_ACTIONS << 9) | 0x3f
+#define EC_WORD_PRAISE (EC_GROUP_ACTIONS << 9) | 0x40
+#define EC_WORD_OVERDO (EC_GROUP_ACTIONS << 9) | 0x41
+#define EC_WORD_SHOW (EC_GROUP_ACTIONS << 9) | 0x42
+#define EC_WORD_LOOKS (EC_GROUP_ACTIONS << 9) | 0x43
+#define EC_WORD_SEES (EC_GROUP_ACTIONS << 9) | 0x44
+#define EC_WORD_SEEK (EC_GROUP_ACTIONS << 9) | 0x45
+#define EC_WORD_OWN (EC_GROUP_ACTIONS << 9) | 0x46
+#define EC_WORD_TAKE (EC_GROUP_ACTIONS << 9) | 0x47
+#define EC_WORD_ALLOW (EC_GROUP_ACTIONS << 9) | 0x48
+#define EC_WORD_FORGET (EC_GROUP_ACTIONS << 9) | 0x49
+#define EC_WORD_FORGETS (EC_GROUP_ACTIONS << 9) | 0x4a
+#define EC_WORD_APPEARS (EC_GROUP_ACTIONS << 9) | 0x4b
+#define EC_WORD_FAINT (EC_GROUP_ACTIONS << 9) | 0x4c
+#define EC_WORD_FAINTED (EC_GROUP_ACTIONS << 9) | 0x4d
+
+// LIFESTYLE
+#define EC_WORD_CHORES (EC_GROUP_LIFESTYLE << 9) | 0x0
+#define EC_WORD_HOME (EC_GROUP_LIFESTYLE << 9) | 0x1
+#define EC_WORD_MONEY (EC_GROUP_LIFESTYLE << 9) | 0x2
+#define EC_WORD_ALLOWANCE (EC_GROUP_LIFESTYLE << 9) | 0x3
+#define EC_WORD_BATH (EC_GROUP_LIFESTYLE << 9) | 0x4
+#define EC_WORD_CONVERSATION (EC_GROUP_LIFESTYLE << 9) | 0x5
+#define EC_WORD_SCHOOL (EC_GROUP_LIFESTYLE << 9) | 0x6
+#define EC_WORD_COMMEMORATE (EC_GROUP_LIFESTYLE << 9) | 0x7
+#define EC_WORD_HABIT (EC_GROUP_LIFESTYLE << 9) | 0x8
+#define EC_WORD_GROUP (EC_GROUP_LIFESTYLE << 9) | 0x9
+#define EC_WORD_WORD (EC_GROUP_LIFESTYLE << 9) | 0xa
+#define EC_WORD_STORE (EC_GROUP_LIFESTYLE << 9) | 0xb
+#define EC_WORD_SERVICE (EC_GROUP_LIFESTYLE << 9) | 0xc
+#define EC_WORD_WORK (EC_GROUP_LIFESTYLE << 9) | 0xd
+#define EC_WORD_SYSTEM (EC_GROUP_LIFESTYLE << 9) | 0xe
+#define EC_WORD_TRAIN (EC_GROUP_LIFESTYLE << 9) | 0xf
+#define EC_WORD_CLASS (EC_GROUP_LIFESTYLE << 9) | 0x10
+#define EC_WORD_LESSONS (EC_GROUP_LIFESTYLE << 9) | 0x11
+#define EC_WORD_INFORMATION (EC_GROUP_LIFESTYLE << 9) | 0x12
+#define EC_WORD_LIVING (EC_GROUP_LIFESTYLE << 9) | 0x13
+#define EC_WORD_TEACHER (EC_GROUP_LIFESTYLE << 9) | 0x14
+#define EC_WORD_TOURNAMENT (EC_GROUP_LIFESTYLE << 9) | 0x15
+#define EC_WORD_LETTER (EC_GROUP_LIFESTYLE << 9) | 0x16
+#define EC_WORD_EVENT (EC_GROUP_LIFESTYLE << 9) | 0x17
+#define EC_WORD_DIGITAL (EC_GROUP_LIFESTYLE << 9) | 0x18
+#define EC_WORD_TEST (EC_GROUP_LIFESTYLE << 9) | 0x19
+#define EC_WORD_DEPT_STORE (EC_GROUP_LIFESTYLE << 9) | 0x1a
+#define EC_WORD_TELEVISION (EC_GROUP_LIFESTYLE << 9) | 0x1b
+#define EC_WORD_PHONE (EC_GROUP_LIFESTYLE << 9) | 0x1c
+#define EC_WORD_ITEM (EC_GROUP_LIFESTYLE << 9) | 0x1d
+#define EC_WORD_NAME (EC_GROUP_LIFESTYLE << 9) | 0x1e
+#define EC_WORD_NEWS (EC_GROUP_LIFESTYLE << 9) | 0x1f
+#define EC_WORD_POPULAR (EC_GROUP_LIFESTYLE << 9) | 0x20
+#define EC_WORD_PARTY (EC_GROUP_LIFESTYLE << 9) | 0x21
+#define EC_WORD_STUDY (EC_GROUP_LIFESTYLE << 9) | 0x22
+#define EC_WORD_MACHINE (EC_GROUP_LIFESTYLE << 9) | 0x23
+#define EC_WORD_MAIL (EC_GROUP_LIFESTYLE << 9) | 0x24
+#define EC_WORD_MESSAGE (EC_GROUP_LIFESTYLE << 9) | 0x25
+#define EC_WORD_PROMISE (EC_GROUP_LIFESTYLE << 9) | 0x26
+#define EC_WORD_DREAM (EC_GROUP_LIFESTYLE << 9) | 0x27
+#define EC_WORD_KINDERGARTEN (EC_GROUP_LIFESTYLE << 9) | 0x28
+#define EC_WORD_LIFE (EC_GROUP_LIFESTYLE << 9) | 0x29
+#define EC_WORD_RADIO (EC_GROUP_LIFESTYLE << 9) | 0x2a
+#define EC_WORD_RENTAL (EC_GROUP_LIFESTYLE << 9) | 0x2b
+#define EC_WORD_WORLD (EC_GROUP_LIFESTYLE << 9) | 0x2c
+
+// HOBBIES
+#define EC_WORD_IDOL (EC_GROUP_HOBBIES << 9) | 0x0
+#define EC_WORD_ANIME (EC_GROUP_HOBBIES << 9) | 0x1
+#define EC_WORD_SONG (EC_GROUP_HOBBIES << 9) | 0x2
+#define EC_WORD_MOVIE (EC_GROUP_HOBBIES << 9) | 0x3
+#define EC_WORD_SWEETS (EC_GROUP_HOBBIES << 9) | 0x4
+#define EC_WORD_CHAT (EC_GROUP_HOBBIES << 9) | 0x5
+#define EC_WORD_CHILD_S_PLAY (EC_GROUP_HOBBIES << 9) | 0x6
+#define EC_WORD_TOYS (EC_GROUP_HOBBIES << 9) | 0x7
+#define EC_WORD_MUSIC (EC_GROUP_HOBBIES << 9) | 0x8
+#define EC_WORD_CARDS (EC_GROUP_HOBBIES << 9) | 0x9
+#define EC_WORD_SHOPPING (EC_GROUP_HOBBIES << 9) | 0xa
+#define EC_WORD_CAMERA (EC_GROUP_HOBBIES << 9) | 0xb
+#define EC_WORD_VIEWING (EC_GROUP_HOBBIES << 9) | 0xc
+#define EC_WORD_SPECTATOR (EC_GROUP_HOBBIES << 9) | 0xd
+#define EC_WORD_GOURMET (EC_GROUP_HOBBIES << 9) | 0xe
+#define EC_WORD_GAME (EC_GROUP_HOBBIES << 9) | 0xf
+#define EC_WORD_RPG (EC_GROUP_HOBBIES << 9) | 0x10
+#define EC_WORD_COLLECTION (EC_GROUP_HOBBIES << 9) | 0x11
+#define EC_WORD_COMPLETE (EC_GROUP_HOBBIES << 9) | 0x12
+#define EC_WORD_MAGAZINE (EC_GROUP_HOBBIES << 9) | 0x13
+#define EC_WORD_WALK (EC_GROUP_HOBBIES << 9) | 0x14
+#define EC_WORD_BIKE (EC_GROUP_HOBBIES << 9) | 0x15
+#define EC_WORD_HOBBY (EC_GROUP_HOBBIES << 9) | 0x16
+#define EC_WORD_SPORTS (EC_GROUP_HOBBIES << 9) | 0x17
+#define EC_WORD_SOFTWARE (EC_GROUP_HOBBIES << 9) | 0x18
+#define EC_WORD_SONGS (EC_GROUP_HOBBIES << 9) | 0x19
+#define EC_WORD_DIET (EC_GROUP_HOBBIES << 9) | 0x1a
+#define EC_WORD_TREASURE (EC_GROUP_HOBBIES << 9) | 0x1b
+#define EC_WORD_TRAVEL (EC_GROUP_HOBBIES << 9) | 0x1c
+#define EC_WORD_DANCE (EC_GROUP_HOBBIES << 9) | 0x1d
+#define EC_WORD_CHANNEL (EC_GROUP_HOBBIES << 9) | 0x1e
+#define EC_WORD_MAKING (EC_GROUP_HOBBIES << 9) | 0x1f
+#define EC_WORD_FISHING (EC_GROUP_HOBBIES << 9) | 0x20
+#define EC_WORD_DATE (EC_GROUP_HOBBIES << 9) | 0x21
+#define EC_WORD_DESIGN (EC_GROUP_HOBBIES << 9) | 0x22
+#define EC_WORD_LOCOMOTIVE (EC_GROUP_HOBBIES << 9) | 0x23
+#define EC_WORD_PLUSH_DOLL (EC_GROUP_HOBBIES << 9) | 0x24
+#define EC_WORD_PC (EC_GROUP_HOBBIES << 9) | 0x25
+#define EC_WORD_FLOWERS (EC_GROUP_HOBBIES << 9) | 0x26
+#define EC_WORD_HERO (EC_GROUP_HOBBIES << 9) | 0x27
+#define EC_WORD_NAP (EC_GROUP_HOBBIES << 9) | 0x28
+#define EC_WORD_HEROINE (EC_GROUP_HOBBIES << 9) | 0x29
+#define EC_WORD_FASHION (EC_GROUP_HOBBIES << 9) | 0x2a
+#define EC_WORD_ADVENTURE (EC_GROUP_HOBBIES << 9) | 0x2b
+#define EC_WORD_BOARD (EC_GROUP_HOBBIES << 9) | 0x2c
+#define EC_WORD_BALL (EC_GROUP_HOBBIES << 9) | 0x2d
+#define EC_WORD_BOOK (EC_GROUP_HOBBIES << 9) | 0x2e
+#define EC_WORD_FESTIVAL (EC_GROUP_HOBBIES << 9) | 0x2f
+#define EC_WORD_COMICS (EC_GROUP_HOBBIES << 9) | 0x30
+#define EC_WORD_HOLIDAY (EC_GROUP_HOBBIES << 9) | 0x31
+#define EC_WORD_PLANS (EC_GROUP_HOBBIES << 9) | 0x32
+#define EC_WORD_TRENDY (EC_GROUP_HOBBIES << 9) | 0x33
+#define EC_WORD_VACATION (EC_GROUP_HOBBIES << 9) | 0x34
+#define EC_WORD_LOOK (EC_GROUP_HOBBIES << 9) | 0x35
+
+// TIME
+#define EC_WORD_FALL (EC_GROUP_TIME << 9) | 0x0
+#define EC_WORD_MORNING (EC_GROUP_TIME << 9) | 0x1
+#define EC_WORD_TOMORROW (EC_GROUP_TIME << 9) | 0x2
+#define EC_WORD_LAST (EC_GROUP_TIME << 9) | 0x3
+#define EC_WORD_DAY (EC_GROUP_TIME << 9) | 0x4
+#define EC_WORD_SOMETIME (EC_GROUP_TIME << 9) | 0x5
+#define EC_WORD_ALWAYS (EC_GROUP_TIME << 9) | 0x6
+#define EC_WORD_CURRENT (EC_GROUP_TIME << 9) | 0x7
+#define EC_WORD_FOREVER (EC_GROUP_TIME << 9) | 0x8
+#define EC_WORD_DAYS (EC_GROUP_TIME << 9) | 0x9
+#define EC_WORD_END (EC_GROUP_TIME << 9) | 0xa
+#define EC_WORD_TUESDAY (EC_GROUP_TIME << 9) | 0xb
+#define EC_WORD_YESTERDAY (EC_GROUP_TIME << 9) | 0xc
+#define EC_WORD_TODAY (EC_GROUP_TIME << 9) | 0xd
+#define EC_WORD_FRIDAY (EC_GROUP_TIME << 9) | 0xe
+#define EC_WORD_MONDAY (EC_GROUP_TIME << 9) | 0xf
+#define EC_WORD_LATER (EC_GROUP_TIME << 9) | 0x10
+#define EC_WORD_EARLIER (EC_GROUP_TIME << 9) | 0x11
+#define EC_WORD_ANOTHER (EC_GROUP_TIME << 9) | 0x12
+#define EC_WORD_TIME (EC_GROUP_TIME << 9) | 0x13
+#define EC_WORD_FINISH (EC_GROUP_TIME << 9) | 0x14
+#define EC_WORD_WEDNESDAY (EC_GROUP_TIME << 9) | 0x15
+#define EC_WORD_SOON (EC_GROUP_TIME << 9) | 0x16
+#define EC_WORD_START (EC_GROUP_TIME << 9) | 0x17
+#define EC_WORD_MONTH (EC_GROUP_TIME << 9) | 0x18
+#define EC_WORD_STOP (EC_GROUP_TIME << 9) | 0x19
+#define EC_WORD_NOW (EC_GROUP_TIME << 9) | 0x1a
+#define EC_WORD_FINAL (EC_GROUP_TIME << 9) | 0x1b
+#define EC_WORD_NEXT (EC_GROUP_TIME << 9) | 0x1c
+#define EC_WORD_AGE (EC_GROUP_TIME << 9) | 0x1d
+#define EC_WORD_SATURDAY (EC_GROUP_TIME << 9) | 0x1e
+#define EC_WORD_SUMMER (EC_GROUP_TIME << 9) | 0x1f
+#define EC_WORD_SUNDAY (EC_GROUP_TIME << 9) | 0x20
+#define EC_WORD_BEGINNING (EC_GROUP_TIME << 9) | 0x21
+#define EC_WORD_SPRING (EC_GROUP_TIME << 9) | 0x22
+#define EC_WORD_DAYTIME (EC_GROUP_TIME << 9) | 0x23
+#define EC_WORD_WINTER (EC_GROUP_TIME << 9) | 0x24
+#define EC_WORD_DAILY (EC_GROUP_TIME << 9) | 0x25
+#define EC_WORD_OLDEN (EC_GROUP_TIME << 9) | 0x26
+#define EC_WORD_ALMOST (EC_GROUP_TIME << 9) | 0x27
+#define EC_WORD_NEARLY (EC_GROUP_TIME << 9) | 0x28
+#define EC_WORD_THURSDAY (EC_GROUP_TIME << 9) | 0x29
+#define EC_WORD_NIGHTTIME (EC_GROUP_TIME << 9) | 0x2a
+#define EC_WORD_NIGHT (EC_GROUP_TIME << 9) | 0x2b
+#define EC_WORD_WEEK (EC_GROUP_TIME << 9) | 0x2c
+
+// MISC
+#define EC_WORD_HIGHS (EC_GROUP_MISC << 9) | 0x0
+#define EC_WORD_LOWS (EC_GROUP_MISC << 9) | 0x1
+#define EC_WORD_UM (EC_GROUP_MISC << 9) | 0x2
+#define EC_WORD_REAR (EC_GROUP_MISC << 9) | 0x3
+#define EC_WORD_THINGS (EC_GROUP_MISC << 9) | 0x4
+#define EC_WORD_THING (EC_GROUP_MISC << 9) | 0x5
+#define EC_WORD_BELOW (EC_GROUP_MISC << 9) | 0x6
+#define EC_WORD_ABOVE (EC_GROUP_MISC << 9) | 0x7
+#define EC_WORD_BACK (EC_GROUP_MISC << 9) | 0x8
+#define EC_WORD_HIGH (EC_GROUP_MISC << 9) | 0x9
+#define EC_WORD_HERE (EC_GROUP_MISC << 9) | 0xa
+#define EC_WORD_INSIDE (EC_GROUP_MISC << 9) | 0xb
+#define EC_WORD_OUTSIDE (EC_GROUP_MISC << 9) | 0xc
+#define EC_WORD_BESIDE (EC_GROUP_MISC << 9) | 0xd
+#define EC_WORD_THIS_IS_IT_EXCL (EC_GROUP_MISC << 9) | 0xe
+#define EC_WORD_THIS (EC_GROUP_MISC << 9) | 0xf
+#define EC_WORD_EVERY (EC_GROUP_MISC << 9) | 0x10
+#define EC_WORD_THESE (EC_GROUP_MISC << 9) | 0x11
+#define EC_WORD_THESE_WERE (EC_GROUP_MISC << 9) | 0x12
+#define EC_WORD_DOWN (EC_GROUP_MISC << 9) | 0x13
+#define EC_WORD_THAT (EC_GROUP_MISC << 9) | 0x14
+#define EC_WORD_THOSE_ARE (EC_GROUP_MISC << 9) | 0x15
+#define EC_WORD_THOSE_WERE (EC_GROUP_MISC << 9) | 0x16
+#define EC_WORD_THAT_S_IT_EXCL (EC_GROUP_MISC << 9) | 0x17
+#define EC_WORD_AM (EC_GROUP_MISC << 9) | 0x18
+#define EC_WORD_THAT_WAS (EC_GROUP_MISC << 9) | 0x19
+#define EC_WORD_FRONT (EC_GROUP_MISC << 9) | 0x1a
+#define EC_WORD_UP (EC_GROUP_MISC << 9) | 0x1b
+#define EC_WORD_CHOICE (EC_GROUP_MISC << 9) | 0x1c
+#define EC_WORD_FAR (EC_GROUP_MISC << 9) | 0x1d
+#define EC_WORD_AWAY (EC_GROUP_MISC << 9) | 0x1e
+#define EC_WORD_NEAR (EC_GROUP_MISC << 9) | 0x1f
+#define EC_WORD_WHERE (EC_GROUP_MISC << 9) | 0x20
+#define EC_WORD_WHEN (EC_GROUP_MISC << 9) | 0x21
+#define EC_WORD_WHAT (EC_GROUP_MISC << 9) | 0x22
+#define EC_WORD_DEEP (EC_GROUP_MISC << 9) | 0x23
+#define EC_WORD_SHALLOW (EC_GROUP_MISC << 9) | 0x24
+#define EC_WORD_WHY (EC_GROUP_MISC << 9) | 0x25
+#define EC_WORD_CONFUSED (EC_GROUP_MISC << 9) | 0x26
+#define EC_WORD_OPPOSITE (EC_GROUP_MISC << 9) | 0x27
+#define EC_WORD_LEFT (EC_GROUP_MISC << 9) | 0x28
+#define EC_WORD_RIGHT (EC_GROUP_MISC << 9) | 0x29
+
+// ADJECTIVES
+#define EC_WORD_WANDERING (EC_GROUP_ADJECTIVES << 9) | 0x0
+#define EC_WORD_RICKETY (EC_GROUP_ADJECTIVES << 9) | 0x1
+#define EC_WORD_ROCK_SOLID (EC_GROUP_ADJECTIVES << 9) | 0x2
+#define EC_WORD_HUNGRY (EC_GROUP_ADJECTIVES << 9) | 0x3
+#define EC_WORD_TIGHT (EC_GROUP_ADJECTIVES << 9) | 0x4
+#define EC_WORD_TICKLISH (EC_GROUP_ADJECTIVES << 9) | 0x5
+#define EC_WORD_TWIRLING (EC_GROUP_ADJECTIVES << 9) | 0x6
+#define EC_WORD_SPIRALING (EC_GROUP_ADJECTIVES << 9) | 0x7
+#define EC_WORD_THIRSTY (EC_GROUP_ADJECTIVES << 9) | 0x8
+#define EC_WORD_LOLLING (EC_GROUP_ADJECTIVES << 9) | 0x9
+#define EC_WORD_SILKY (EC_GROUP_ADJECTIVES << 9) | 0xa
+#define EC_WORD_SADLY (EC_GROUP_ADJECTIVES << 9) | 0xb
+#define EC_WORD_HOPELESS (EC_GROUP_ADJECTIVES << 9) | 0xc
+#define EC_WORD_USELESS (EC_GROUP_ADJECTIVES << 9) | 0xd
+#define EC_WORD_DROOLING (EC_GROUP_ADJECTIVES << 9) | 0xe
+#define EC_WORD_EXCITING (EC_GROUP_ADJECTIVES << 9) | 0xf
+#define EC_WORD_THICK (EC_GROUP_ADJECTIVES << 9) | 0x10
+#define EC_WORD_SMOOTH (EC_GROUP_ADJECTIVES << 9) | 0x11
+#define EC_WORD_SLIMY (EC_GROUP_ADJECTIVES << 9) | 0x12
+#define EC_WORD_THIN (EC_GROUP_ADJECTIVES << 9) | 0x13
+#define EC_WORD_BREAK (EC_GROUP_ADJECTIVES << 9) | 0x14
+#define EC_WORD_VORACIOUS (EC_GROUP_ADJECTIVES << 9) | 0x15
+#define EC_WORD_SCATTER (EC_GROUP_ADJECTIVES << 9) | 0x16
+#define EC_WORD_AWESOME (EC_GROUP_ADJECTIVES << 9) | 0x17
+#define EC_WORD_WIMPY (EC_GROUP_ADJECTIVES << 9) | 0x18
+#define EC_WORD_WOBBLY (EC_GROUP_ADJECTIVES << 9) | 0x19
+#define EC_WORD_SHAKY (EC_GROUP_ADJECTIVES << 9) | 0x1a
+#define EC_WORD_RIPPED (EC_GROUP_ADJECTIVES << 9) | 0x1b
+#define EC_WORD_SHREDDED (EC_GROUP_ADJECTIVES << 9) | 0x1c
+#define EC_WORD_INCREASING (EC_GROUP_ADJECTIVES << 9) | 0x1d
+#define EC_WORD_YET (EC_GROUP_ADJECTIVES << 9) | 0x1e
+#define EC_WORD_DESTROYED (EC_GROUP_ADJECTIVES << 9) | 0x1f
+#define EC_WORD_FIERY (EC_GROUP_ADJECTIVES << 9) | 0x20
+#define EC_WORD_LOVEY_DOVEY (EC_GROUP_ADJECTIVES << 9) | 0x21
+#define EC_WORD_HAPPILY (EC_GROUP_ADJECTIVES << 9) | 0x22
+#define EC_WORD_ANTICIPATION (EC_GROUP_ADJECTIVES << 9) | 0x23
+
+// EVENTS
+#define EC_WORD_APPEAL (EC_GROUP_EVENTS << 9) | 0x0
+#define EC_WORD_EVENTS (EC_GROUP_EVENTS << 9) | 0x1
+#define EC_WORD_STAY_AT_HOME (EC_GROUP_EVENTS << 9) | 0x2
+#define EC_WORD_BERRY (EC_GROUP_EVENTS << 9) | 0x3
+#define EC_WORD_CONTEST (EC_GROUP_EVENTS << 9) | 0x4
+#define EC_WORD_MC (EC_GROUP_EVENTS << 9) | 0x5
+#define EC_WORD_JUDGE (EC_GROUP_EVENTS << 9) | 0x6
+#define EC_WORD_SUPER (EC_GROUP_EVENTS << 9) | 0x7
+#define EC_WORD_STAGE (EC_GROUP_EVENTS << 9) | 0x8
+#define EC_WORD_HALL_OF_FAME (EC_GROUP_EVENTS << 9) | 0x9
+#define EC_WORD_EVOLUTION (EC_GROUP_EVENTS << 9) | 0xa
+#define EC_WORD_HYPER (EC_GROUP_EVENTS << 9) | 0xb
+#define EC_WORD_BATTLE_TOWER (EC_GROUP_EVENTS << 9) | 0xc
+#define EC_WORD_LEADERS (EC_GROUP_EVENTS << 9) | 0xd
+#define EC_WORD_BATTLE_ROOM (EC_GROUP_EVENTS << 9) | 0xe
+#define EC_WORD_HIDDEN (EC_GROUP_EVENTS << 9) | 0xf
+#define EC_WORD_SECRET_BASE (EC_GROUP_EVENTS << 9) | 0x10
+#define EC_WORD_BLEND (EC_GROUP_EVENTS << 9) | 0x11
+#define EC_WORD_POKEBLOCK (EC_GROUP_EVENTS << 9) | 0x12
+#define EC_WORD_MASTER (EC_GROUP_EVENTS << 9) | 0x13
+#define EC_WORD_RANK (EC_GROUP_EVENTS << 9) | 0x14
+#define EC_WORD_RIBBON (EC_GROUP_EVENTS << 9) | 0x15
+#define EC_WORD_CRUSH (EC_GROUP_EVENTS << 9) | 0x16
+#define EC_WORD_DIRECT (EC_GROUP_EVENTS << 9) | 0x17
+#define EC_WORD_TOWER (EC_GROUP_EVENTS << 9) | 0x18
+#define EC_WORD_UNION (EC_GROUP_EVENTS << 9) | 0x19
+#define EC_WORD_ROOM (EC_GROUP_EVENTS << 9) | 0x1a
+#define EC_WORD_WIRELESS (EC_GROUP_EVENTS << 9) | 0x1b
+#define EC_WORD_FRONTIER (EC_GROUP_EVENTS << 9) | 0x1c
+
+// TRENDY_SAYING
+#define EC_WORD_KTHX_BYE (EC_GROUP_TRENDY_SAYING << 9) | 0x0
+#define EC_WORD_YES_SIR_EXCL (EC_GROUP_TRENDY_SAYING << 9) | 0x1
+#define EC_WORD_AVANT_GARDE (EC_GROUP_TRENDY_SAYING << 9) | 0x2
+#define EC_WORD_COUPLE (EC_GROUP_TRENDY_SAYING << 9) | 0x3
+#define EC_WORD_MUCH_OBLIGED (EC_GROUP_TRENDY_SAYING << 9) | 0x4
+#define EC_WORD_YEEHAW_EXCL (EC_GROUP_TRENDY_SAYING << 9) | 0x5
+#define EC_WORD_MEGA (EC_GROUP_TRENDY_SAYING << 9) | 0x6
+#define EC_WORD_1_HIT_KO_EXCL (EC_GROUP_TRENDY_SAYING << 9) | 0x7
+#define EC_WORD_DESTINY (EC_GROUP_TRENDY_SAYING << 9) | 0x8
+#define EC_WORD_CANCEL (EC_GROUP_TRENDY_SAYING << 9) | 0x9
+#define EC_WORD_NEW (EC_GROUP_TRENDY_SAYING << 9) | 0xa
+#define EC_WORD_FLATTEN (EC_GROUP_TRENDY_SAYING << 9) | 0xb
+#define EC_WORD_KIDDING (EC_GROUP_TRENDY_SAYING << 9) | 0xc
+#define EC_WORD_LOSER (EC_GROUP_TRENDY_SAYING << 9) | 0xd
+#define EC_WORD_LOSING (EC_GROUP_TRENDY_SAYING << 9) | 0xe
+#define EC_WORD_HAPPENING (EC_GROUP_TRENDY_SAYING << 9) | 0xf
+#define EC_WORD_HIP_AND (EC_GROUP_TRENDY_SAYING << 9) | 0x10
+#define EC_WORD_SHAKE (EC_GROUP_TRENDY_SAYING << 9) | 0x11
+#define EC_WORD_SHADY (EC_GROUP_TRENDY_SAYING << 9) | 0x12
+#define EC_WORD_UPBEAT (EC_GROUP_TRENDY_SAYING << 9) | 0x13
+#define EC_WORD_MODERN (EC_GROUP_TRENDY_SAYING << 9) | 0x14
+#define EC_WORD_SMELL_YA (EC_GROUP_TRENDY_SAYING << 9) | 0x15
+#define EC_WORD_BANG (EC_GROUP_TRENDY_SAYING << 9) | 0x16
+#define EC_WORD_KNOCKOUT (EC_GROUP_TRENDY_SAYING << 9) | 0x17
+#define EC_WORD_HASSLE (EC_GROUP_TRENDY_SAYING << 9) | 0x18
+#define EC_WORD_WINNER (EC_GROUP_TRENDY_SAYING << 9) | 0x19
+#define EC_WORD_FEVER (EC_GROUP_TRENDY_SAYING << 9) | 0x1a
+#define EC_WORD_WANNABE (EC_GROUP_TRENDY_SAYING << 9) | 0x1b
+#define EC_WORD_BABY (EC_GROUP_TRENDY_SAYING << 9) | 0x1c
+#define EC_WORD_HEART (EC_GROUP_TRENDY_SAYING << 9) | 0x1d
+#define EC_WORD_OLD (EC_GROUP_TRENDY_SAYING << 9) | 0x1e
+#define EC_WORD_YOUNG (EC_GROUP_TRENDY_SAYING << 9) | 0x1f
+#define EC_WORD_UGLY (EC_GROUP_TRENDY_SAYING << 9) | 0x20
+
+#define EC_POKEMON(mon) ((EC_GROUP_POKEMON << 9) | SPECIES_##mon)
+#define EC_POKEMON2(mon) ((EC_GROUP_POKEMON_2 << 9) | SPECIES_##mon)
+#define EC_MOVE(move) ((EC_GROUP_MOVE_1 << 9) | MOVE_##move)
+#define EC_MOVE2(move) ((EC_GROUP_MOVE_2 << 9) | MOVE_##move)
+
+#define EC_GROUP(word) ((word) >> 9)
+#define EC_INDEX(word) ((word) & 0x1FF)
+
+#endif // GUARD_CONSTANTS_EASY_CHAT_H
diff --git a/include/constants/flags.h b/include/constants/flags.h
new file mode 100644
index 000000000..e74ef1ef0
--- /dev/null
+++ b/include/constants/flags.h
@@ -0,0 +1,1578 @@
+#ifndef GUARD_CONSTANTS_FLAGS_H
+#define GUARD_CONSTANTS_FLAGS_H
+
+#define FLAG_0x001 0x1
+#define FLAG_0x002 0x2
+#define FLAG_0x003 0x3
+#define FLAG_0x004 0x4
+#define FLAG_0x005 0x5
+#define FLAG_0x006 0x6
+#define FLAG_0x007 0x7
+#define FLAG_0x008 0x8
+#define FLAG_0x009 0x9
+#define FLAG_0x00A 0xA
+#define FLAG_0x00B 0xB
+#define FLAG_0x00C 0xC
+#define FLAG_0x00D 0xD
+#define FLAG_0x00E 0xE
+#define FLAG_0x00F 0xF
+#define FLAG_0x010 0x10
+#define FLAG_0x011 0x11
+#define FLAG_0x012 0x12
+#define FLAG_0x013 0x13
+#define FLAG_0x014 0x14
+#define FLAG_0x015 0x15
+#define FLAG_0x016 0x16
+#define FLAG_0x017 0x17
+#define FLAG_0x018 0x18
+#define FLAG_0x019 0x19
+#define FLAG_0x01A 0x1A
+#define FLAG_0x01B 0x1B
+#define FLAG_0x01C 0x1C
+#define FLAG_0x01D 0x1D
+#define FLAG_0x01E 0x1E
+#define FLAG_0x01F 0x1F
+#define FLAG_0x020 0x20
+#define FLAG_0x021 0x21
+#define FLAG_0x022 0x22
+#define FLAG_0x023 0x23
+#define FLAG_0x024 0x24
+#define FLAG_0x025 0x25
+#define FLAG_0x026 0x26
+#define FLAG_0x027 0x27
+#define FLAG_0x028 0x28
+#define FLAG_0x029 0x29
+#define FLAG_0x02A 0x2A
+#define FLAG_0x02B 0x2B
+#define FLAG_0x02C 0x2C
+#define FLAG_0x02D 0x2D
+#define FLAG_0x02E 0x2E
+#define FLAG_0x02F 0x2F
+#define FLAG_0x030 0x30
+#define FLAG_0x031 0x31
+#define FLAG_0x032 0x32
+#define FLAG_0x033 0x33
+#define FLAG_0x034 0x34
+#define FLAG_0x035 0x35
+#define FLAG_0x036 0x36
+#define FLAG_0x037 0x37
+#define FLAG_0x038 0x38
+#define FLAG_0x039 0x39
+#define FLAG_0x03A 0x3A
+#define FLAG_0x03B 0x3B
+#define FLAG_0x03C 0x3C
+#define FLAG_0x03D 0x3D
+#define FLAG_0x03E 0x3E
+#define FLAG_0x03F 0x3F
+#define FLAG_0x040 0x40
+#define FLAG_0x041 0x41
+#define FLAG_0x042 0x42
+#define FLAG_0x043 0x43
+#define FLAG_0x044 0x44
+#define FLAG_0x045 0x45
+#define FLAG_0x046 0x46
+#define FLAG_0x047 0x47
+#define FLAG_0x048 0x48
+#define FLAG_0x049 0x49
+#define FLAG_0x04A 0x4A
+#define FLAG_0x04B 0x4B
+#define FLAG_0x04C 0x4C
+#define FLAG_0x04D 0x4D
+#define FLAG_0x04E 0x4E
+#define FLAG_0x04F 0x4F
+#define FLAG_0x050 0x50
+#define FLAG_0x051 0x51
+#define FLAG_0x052 0x52
+#define FLAG_LEGENDARIES_IN_SOOTOPOLIS 0x53
+#define FLAG_0x054 0x54
+#define FLAG_0x055 0x55
+#define FLAG_0x056 0x56
+#define FLAG_0x057 0x57
+#define FLAG_0x058 0x58
+#define FLAG_0x059 0x59
+#define FLAG_0x05A 0x5A
+#define FLAG_0x05B 0x5B
+#define FLAG_0x05C 0x5C
+#define FLAG_0x05D 0x5D
+#define FLAG_0x05E 0x5E
+#define FLAG_0x05F 0x5F
+#define FLAG_0x060 0x60
+#define FLAG_0x061 0x61
+#define FLAG_0x062 0x62
+#define FLAG_0x063 0x63
+#define FLAG_0x064 0x64
+#define FLAG_0x065 0x65
+#define FLAG_0x066 0x66
+#define FLAG_0x067 0x67
+#define FLAG_0x068 0x68
+#define FLAG_0x069 0x69
+#define FLAG_0x06A 0x6A
+#define FLAG_0x06B 0x6B
+#define FLAG_0x06C 0x6C
+#define FLAG_0x06D 0x6D
+#define FLAG_0x06E 0x6E
+#define FLAG_0x06F 0x6F
+#define FLAG_0x070 0x70
+#define FLAG_0x071 0x71
+#define FLAG_0x072 0x72
+#define FLAG_0x073 0x73
+#define FLAG_0x074 0x74
+#define FLAG_0x075 0x75
+#define FLAG_0x076 0x76
+#define FLAG_0x077 0x77
+#define FLAG_0x078 0x78
+#define FLAG_0x079 0x79
+#define FLAG_0x07A 0x7A
+#define FLAG_0x07B 0x7B
+#define FLAG_0x07C 0x7C
+#define FLAG_0x07D 0x7D
+#define FLAG_0x07E 0x7E
+#define FLAG_0x07F 0x7F
+#define FLAG_0x080 0x80
+#define FLAG_0x081 0x81
+#define FLAG_0x082 0x82
+#define FLAG_0x083 0x83
+#define FLAG_0x084 0x84
+#define FLAG_0x085 0x85
+#define FLAG_PENDING_DAYCARE_EGG 0x86
+#define FLAG_0x087 0x87
+#define FLAG_0x088 0x88
+#define FLAG_0x089 0x89
+#define FLAG_0x08A 0x8A
+#define FLAG_0x08B 0x8B
+#define FLAG_0x08C 0x8C
+#define FLAG_0x08D 0x8D
+#define FLAG_0x08E 0x8E
+#define FLAG_0x08F 0x8F
+#define FLAG_0x090 0x90
+#define FLAG_0x091 0x91
+#define FLAG_0x092 0x92
+#define FLAG_0x093 0x93
+#define FLAG_0x094 0x94
+#define FLAG_0x095 0x95
+#define FLAG_0x096 0x96
+#define FLAG_0x097 0x97
+#define FLAG_0x098 0x98
+#define FLAG_0x099 0x99
+#define FLAG_0x09A 0x9A
+#define FLAG_0x09B 0x9B
+#define FLAG_0x09C 0x9C
+#define FLAG_0x09D 0x9D
+#define FLAG_0x09E 0x9E
+#define FLAG_0x09F 0x9F
+#define FLAG_0x0A0 0xA0
+#define FLAG_0x0A1 0xA1
+#define FLAG_0x0A2 0xA2
+#define FLAG_0x0A3 0xA3
+#define FLAG_0x0A4 0xA4
+#define FLAG_0x0A5 0xA5
+#define FLAG_0x0A6 0xA6
+#define FLAG_0x0A7 0xA7
+#define FLAG_0x0A8 0xA8
+#define FLAG_0x0A9 0xA9
+#define FLAG_0x0AA 0xAA
+#define FLAG_0x0AB 0xAB
+#define FLAG_0x0AC 0xAC
+#define FLAG_0x0AD 0xAD
+#define FLAG_0x0AE 0xAE
+#define FLAG_0x0AF 0xAF
+#define FLAG_0x0B0 0xB0
+#define FLAG_0x0B1 0xB1
+#define FLAG_0x0B2 0xB2
+#define FLAG_0x0B3 0xB3
+#define FLAG_0x0B4 0xB4
+#define FLAG_0x0B5 0xB5
+#define FLAG_0x0B6 0xB6
+#define FLAG_0x0B7 0xB7
+#define FLAG_0x0B8 0xB8
+#define FLAG_0x0B9 0xB9
+#define FLAG_0x0BA 0xBA
+#define FLAG_0x0BB 0xBB
+#define FLAG_0x0BC 0xBC
+#define FLAG_0x0BD 0xBD
+#define FLAG_0x0BE 0xBE
+#define FLAG_0x0BF 0xBF
+#define FLAG_0x0C0 0xC0
+#define FLAG_0x0C1 0xC1
+#define FLAG_0x0C2 0xC2
+#define FLAG_0x0C3 0xC3
+#define FLAG_0x0C4 0xC4
+#define FLAG_0x0C5 0xC5
+#define FLAG_0x0C6 0xC6
+#define FLAG_0x0C7 0xC7
+#define FLAG_0x0C8 0xC8
+#define FLAG_0x0C9 0xC9
+#define FLAG_0x0CA 0xCA
+#define FLAG_0x0CB 0xCB
+#define FLAG_0x0CC 0xCC
+#define FLAG_0x0CD 0xCD
+#define FLAG_0x0CE 0xCE
+#define FLAG_0x0CF 0xCF
+#define FLAG_0x0D0 0xD0
+#define FLAG_0x0D1 0xD1
+#define FLAG_0x0D2 0xD2
+#define FLAG_0x0D3 0xD3
+#define FLAG_0x0D4 0xD4
+#define FLAG_0x0D5 0xD5
+#define FLAG_0x0D6 0xD6
+#define FLAG_0x0D7 0xD7
+#define FLAG_0x0D8 0xD8
+#define FLAG_0x0D9 0xD9
+#define FLAG_0x0DA 0xDA
+#define FLAG_0x0DB 0xDB
+#define FLAG_0x0DC 0xDC
+#define FLAG_0x0DD 0xDD
+#define FLAG_0x0DE 0xDE
+#define FLAG_0x0DF 0xDF
+#define FLAG_0x0E0 0xE0
+#define FLAG_0x0E1 0xE1
+#define FLAG_0x0E2 0xE2
+#define FLAG_0x0E3 0xE3
+#define FLAG_0x0E4 0xE4
+#define FLAG_0x0E5 0xE5
+#define FLAG_0x0E6 0xE6
+#define FLAG_0x0E7 0xE7
+#define FLAG_0x0E8 0xE8
+#define FLAG_0x0E9 0xE9
+#define FLAG_0x0EA 0xEA
+#define FLAG_0x0EB 0xEB
+#define FLAG_0x0EC 0xEC
+#define FLAG_0x0ED 0xED
+#define FLAG_0x0EE 0xEE
+#define FLAG_0x0EF 0xEF
+#define FLAG_0x0F0 0xF0
+#define FLAG_0x0F1 0xF1
+#define FLAG_0x0F2 0xF2
+#define FLAG_0x0F3 0xF3
+#define FLAG_0x0F4 0xF4
+#define FLAG_0x0F5 0xF5
+#define FLAG_0x0F6 0xF6
+#define FLAG_0x0F7 0xF7
+#define FLAG_0x0F8 0xF8
+#define FLAG_0x0F9 0xF9
+#define FLAG_0x0FA 0xFA
+#define FLAG_0x0FB 0xFB
+#define FLAG_0x0FC 0xFC
+#define FLAG_0x0FD 0xFD
+#define FLAG_0x0FE 0xFE
+#define FLAG_0x0FF 0xFF
+#define FLAG_0x100 0x100
+#define FLAG_0x101 0x101
+#define FLAG_0x102 0x102
+#define FLAG_0x103 0x103
+#define FLAG_0x104 0x104
+#define FLAG_0x105 0x105
+#define FLAG_0x106 0x106
+#define FLAG_0x107 0x107
+#define FLAG_0x108 0x108
+#define FLAG_0x109 0x109
+#define FLAG_0x10A 0x10A
+#define FLAG_0x10B 0x10B
+#define FLAG_0x10C 0x10C
+#define FLAG_0x10D 0x10D
+#define FLAG_0x10E 0x10E
+#define FLAG_0x10F 0x10F
+#define FLAG_0x110 0x110
+#define FLAG_0x111 0x111
+#define FLAG_0x112 0x112
+#define FLAG_0x113 0x113
+#define FLAG_0x114 0x114
+#define FLAG_0x115 0x115
+#define FLAG_0x116 0x116
+#define FLAG_0x117 0x117
+#define FLAG_0x118 0x118
+#define FLAG_0x119 0x119
+#define FLAG_0x11A 0x11A
+#define FLAG_0x11B 0x11B
+#define FLAG_0x11C 0x11C
+#define FLAG_0x11D 0x11D
+#define FLAG_0x11E 0x11E
+#define FLAG_0x11F 0x11F
+#define FLAG_0x120 0x120
+#define FLAG_0x121 0x121
+#define FLAG_0x122 0x122
+#define FLAG_0x123 0x123
+#define FLAG_0x124 0x124
+#define FLAG_0x125 0x125
+#define FLAG_0x126 0x126
+#define FLAG_0x127 0x127
+#define FLAG_0x128 0x128
+#define FLAG_0x129 0x129
+#define FLAG_0x12A 0x12A
+#define FLAG_0x12B 0x12B
+#define FLAG_0x12C 0x12C
+#define FLAG_0x12D 0x12D
+#define FLAG_0x12E 0x12E
+#define FLAG_0x12F 0x12F
+#define FLAG_0x130 0x130
+#define FLAG_0x131 0x131
+#define FLAG_0x132 0x132
+#define FLAG_0x133 0x133
+#define FLAG_0x134 0x134
+#define FLAG_0x135 0x135
+#define FLAG_0x136 0x136
+#define FLAG_0x137 0x137
+#define FLAG_0x138 0x138
+#define FLAG_0x139 0x139
+#define FLAG_0x13A 0x13A
+#define FLAG_0x13B 0x13B
+#define FLAG_0x13C 0x13C
+#define FLAG_0x13D 0x13D
+#define FLAG_0x13E 0x13E
+#define FLAG_0x13F 0x13F
+#define FLAG_0x140 0x140
+#define FLAG_0x141 0x141
+#define FLAG_0x142 0x142
+#define FLAG_0x143 0x143
+#define FLAG_0x144 0x144
+#define FLAG_0x145 0x145
+#define FLAG_0x146 0x146
+#define FLAG_0x147 0x147
+#define FLAG_0x148 0x148
+#define FLAG_0x149 0x149
+#define FLAG_0x14A 0x14A
+#define FLAG_0x14B 0x14B
+#define FLAG_0x14C 0x14C
+#define FLAG_0x14D 0x14D
+#define FLAG_0x14E 0x14E
+#define FLAG_0x14F 0x14F
+#define FLAG_0x150 0x150
+#define FLAG_0x151 0x151
+#define FLAG_0x152 0x152
+#define FLAG_0x153 0x153
+#define FLAG_0x154 0x154
+#define FLAG_0x155 0x155
+#define FLAG_0x156 0x156
+#define FLAG_0x157 0x157
+#define FLAG_0x158 0x158
+#define FLAG_0x159 0x159
+#define FLAG_0x15A 0x15A
+#define FLAG_0x15B 0x15B
+#define FLAG_0x15C 0x15C
+#define FLAG_0x15D 0x15D
+#define FLAG_0x15E 0x15E
+#define FLAG_0x15F 0x15F
+#define FLAG_0x160 0x160
+#define FLAG_0x161 0x161
+#define FLAG_0x162 0x162
+#define FLAG_0x163 0x163
+#define FLAG_0x164 0x164
+#define FLAG_0x165 0x165
+#define FLAG_0x166 0x166
+#define FLAG_0x167 0x167
+#define FLAG_0x168 0x168
+#define FLAG_0x169 0x169
+#define FLAG_0x16A 0x16A
+#define FLAG_0x16B 0x16B
+#define FLAG_0x16C 0x16C
+#define FLAG_0x16D 0x16D
+#define FLAG_0x16E 0x16E
+#define FLAG_0x16F 0x16F
+#define FLAG_0x170 0x170
+#define FLAG_0x171 0x171
+#define FLAG_0x172 0x172
+#define FLAG_0x173 0x173
+#define FLAG_0x174 0x174
+#define FLAG_0x175 0x175
+#define FLAG_0x176 0x176
+#define FLAG_0x177 0x177
+#define FLAG_0x178 0x178
+#define FLAG_0x179 0x179
+#define FLAG_0x17A 0x17A
+#define FLAG_0x17B 0x17B
+#define FLAG_0x17C 0x17C
+#define FLAG_0x17D 0x17D
+#define FLAG_0x17E 0x17E
+#define FLAG_0x17F 0x17F
+#define FLAG_0x180 0x180
+#define FLAG_0x181 0x181
+#define FLAG_0x182 0x182
+#define FLAG_0x183 0x183
+#define FLAG_0x184 0x184
+#define FLAG_0x185 0x185
+#define FLAG_0x186 0x186
+#define FLAG_0x187 0x187
+#define FLAG_0x188 0x188
+#define FLAG_0x189 0x189
+#define FLAG_0x18A 0x18A
+#define FLAG_0x18B 0x18B
+#define FLAG_0x18C 0x18C
+#define FLAG_0x18D 0x18D
+#define FLAG_0x18E 0x18E
+#define FLAG_0x18F 0x18F
+#define FLAG_0x190 0x190
+#define FLAG_0x191 0x191
+#define FLAG_0x192 0x192
+#define FLAG_0x193 0x193
+#define FLAG_0x194 0x194
+#define FLAG_0x195 0x195
+#define FLAG_0x196 0x196
+#define FLAG_0x197 0x197
+#define FLAG_0x198 0x198
+#define FLAG_0x199 0x199
+#define FLAG_0x19A 0x19A
+#define FLAG_0x19B 0x19B
+#define FLAG_0x19C 0x19C
+#define FLAG_0x19D 0x19D
+#define FLAG_0x19E 0x19E
+#define FLAG_0x19F 0x19F
+#define FLAG_0x1A0 0x1A0
+#define FLAG_0x1A1 0x1A1
+#define FLAG_0x1A2 0x1A2
+#define FLAG_0x1A3 0x1A3
+#define FLAG_0x1A4 0x1A4
+#define FLAG_0x1A5 0x1A5
+#define FLAG_0x1A6 0x1A6
+#define FLAG_0x1A7 0x1A7
+#define FLAG_0x1A8 0x1A8
+#define FLAG_0x1A9 0x1A9
+#define FLAG_0x1AA 0x1AA
+#define FLAG_0x1AB 0x1AB
+#define FLAG_0x1AC 0x1AC
+#define FLAG_0x1AD 0x1AD
+#define FLAG_0x1AE 0x1AE
+#define FLAG_0x1AF 0x1AF
+#define FLAG_0x1B0 0x1B0
+#define FLAG_0x1B1 0x1B1
+#define FLAG_0x1B2 0x1B2
+#define FLAG_0x1B3 0x1B3
+#define FLAG_0x1B4 0x1B4
+#define FLAG_0x1B5 0x1B5
+#define FLAG_0x1B6 0x1B6
+#define FLAG_0x1B7 0x1B7
+#define FLAG_0x1B8 0x1B8
+#define FLAG_0x1B9 0x1B9
+#define FLAG_0x1BA 0x1BA
+#define FLAG_0x1BB 0x1BB
+#define FLAG_0x1BC 0x1BC
+#define FLAG_0x1BD 0x1BD
+#define FLAG_0x1BE 0x1BE
+#define FLAG_0x1BF 0x1BF
+#define FLAG_0x1C0 0x1C0
+#define FLAG_0x1C1 0x1C1
+#define FLAG_0x1C2 0x1C2
+#define FLAG_0x1C3 0x1C3
+#define FLAG_0x1C4 0x1C4
+#define FLAG_0x1C5 0x1C5
+#define FLAG_0x1C6 0x1C6
+#define FLAG_0x1C7 0x1C7
+#define FLAG_0x1C8 0x1C8
+#define FLAG_0x1C9 0x1C9
+#define FLAG_0x1CA 0x1CA
+#define FLAG_0x1CB 0x1CB
+#define FLAG_0x1CC 0x1CC
+#define FLAG_0x1CD 0x1CD
+#define FLAG_0x1CE 0x1CE
+#define FLAG_0x1CF 0x1CF
+#define FLAG_0x1D0 0x1D0
+#define FLAG_0x1D1 0x1D1
+#define FLAG_0x1D2 0x1D2
+#define FLAG_0x1D3 0x1D3
+#define FLAG_0x1D4 0x1D4
+#define FLAG_0x1D5 0x1D5
+#define FLAG_0x1D6 0x1D6
+#define FLAG_0x1D7 0x1D7
+#define FLAG_0x1D8 0x1D8
+#define FLAG_0x1D9 0x1D9
+#define FLAG_0x1DA 0x1DA
+#define FLAG_0x1DB 0x1DB
+#define FLAG_0x1DC 0x1DC
+#define FLAG_0x1DD 0x1DD
+#define FLAG_0x1DE 0x1DE
+#define FLAG_0x1DF 0x1DF
+#define FLAG_0x1E0 0x1E0
+#define FLAG_0x1E1 0x1E1
+#define FLAG_0x1E2 0x1E2
+#define FLAG_0x1E3 0x1E3
+#define FLAG_0x1E4 0x1E4
+#define FLAG_0x1E5 0x1E5
+#define FLAG_0x1E6 0x1E6
+#define FLAG_0x1E7 0x1E7
+#define FLAG_0x1E8 0x1E8
+#define FLAG_0x1E9 0x1E9
+#define FLAG_0x1EA 0x1EA
+#define FLAG_0x1EB 0x1EB
+#define FLAG_0x1EC 0x1EC
+#define FLAG_0x1ED 0x1ED
+#define FLAG_0x1EE 0x1EE
+#define FLAG_0x1EF 0x1EF
+#define FLAG_0x1F0 0x1F0
+#define FLAG_0x1F1 0x1F1
+#define FLAG_0x1F2 0x1F2
+#define FLAG_0x1F3 0x1F3
+#define FLAG_0x1F4 0x1F4
+#define FLAG_0x1F5 0x1F5
+#define FLAG_0x1F6 0x1F6
+#define FLAG_0x1F7 0x1F7
+#define FLAG_0x1F8 0x1F8
+#define FLAG_0x1F9 0x1F9
+#define FLAG_0x1FA 0x1FA
+#define FLAG_0x1FB 0x1FB
+#define FLAG_0x1FC 0x1FC
+#define FLAG_0x1FD 0x1FD
+#define FLAG_0x1FE 0x1FE
+#define FLAG_0x1FF 0x1FF
+#define FLAG_0x200 0x200
+#define FLAG_0x201 0x201
+#define FLAG_0x202 0x202
+#define FLAG_0x203 0x203
+#define FLAG_0x204 0x204
+#define FLAG_0x205 0x205
+#define FLAG_0x206 0x206
+#define FLAG_0x207 0x207
+#define FLAG_0x208 0x208
+#define FLAG_0x209 0x209
+#define FLAG_0x20A 0x20A
+#define FLAG_0x20B 0x20B
+#define FLAG_0x20C 0x20C
+#define FLAG_0x20D 0x20D
+#define FLAG_0x20E 0x20E
+#define FLAG_0x20F 0x20F
+#define FLAG_0x210 0x210
+#define FLAG_0x211 0x211
+#define FLAG_0x212 0x212
+#define FLAG_0x213 0x213
+#define FLAG_0x214 0x214
+#define FLAG_0x215 0x215
+#define FLAG_0x216 0x216
+#define FLAG_0x217 0x217
+#define FLAG_0x218 0x218
+#define FLAG_0x219 0x219
+#define FLAG_0x21A 0x21A
+#define FLAG_0x21B 0x21B
+#define FLAG_0x21C 0x21C
+#define FLAG_0x21D 0x21D
+#define FLAG_0x21E 0x21E
+#define FLAG_0x21F 0x21F
+#define FLAG_0x220 0x220
+#define FLAG_0x221 0x221
+#define FLAG_0x222 0x222
+#define FLAG_0x223 0x223
+#define FLAG_0x224 0x224
+#define FLAG_0x225 0x225
+#define FLAG_0x226 0x226
+#define FLAG_0x227 0x227
+#define FLAG_0x228 0x228
+#define FLAG_0x229 0x229
+#define FLAG_0x22A 0x22A
+#define FLAG_0x22B 0x22B
+#define FLAG_0x22C 0x22C
+#define FLAG_0x22D 0x22D
+#define FLAG_0x22E 0x22E
+#define FLAG_0x22F 0x22F
+#define FLAG_0x230 0x230
+#define FLAG_0x231 0x231
+#define FLAG_0x232 0x232
+#define FLAG_0x233 0x233
+#define FLAG_0x234 0x234
+#define FLAG_0x235 0x235
+#define FLAG_0x236 0x236
+#define FLAG_0x237 0x237
+#define FLAG_0x238 0x238
+#define FLAG_0x239 0x239
+#define FLAG_0x23A 0x23A
+#define FLAG_0x23B 0x23B
+#define FLAG_0x23C 0x23C
+#define FLAG_0x23D 0x23D
+#define FLAG_0x23E 0x23E
+#define FLAG_0x23F 0x23F
+#define FLAG_0x240 0x240
+#define FLAG_0x241 0x241
+#define FLAG_0x242 0x242
+#define FLAG_0x243 0x243
+#define FLAG_0x244 0x244
+#define FLAG_0x245 0x245
+#define FLAG_0x246 0x246
+#define FLAG_0x247 0x247
+#define FLAG_0x248 0x248
+#define FLAG_0x249 0x249
+#define FLAG_0x24A 0x24A
+#define FLAG_0x24B 0x24B
+#define FLAG_0x24C 0x24C
+#define FLAG_0x24D 0x24D
+#define FLAG_0x24E 0x24E
+#define FLAG_0x24F 0x24F
+#define FLAG_0x250 0x250
+#define FLAG_0x251 0x251
+#define FLAG_0x252 0x252
+#define FLAG_0x253 0x253
+#define FLAG_0x254 0x254
+#define FLAG_0x255 0x255
+#define FLAG_0x256 0x256
+#define FLAG_0x257 0x257
+#define FLAG_0x258 0x258
+#define FLAG_0x259 0x259
+#define FLAG_0x25A 0x25A
+#define FLAG_0x25B 0x25B
+#define FLAG_0x25C 0x25C
+#define FLAG_0x25D 0x25D
+#define FLAG_0x25E 0x25E
+#define FLAG_0x25F 0x25F
+#define FLAG_0x260 0x260
+#define FLAG_0x261 0x261
+#define FLAG_0x262 0x262
+#define FLAG_0x263 0x263
+#define FLAG_0x264 0x264
+#define FLAG_0x265 0x265
+#define FLAG_0x266 0x266
+#define FLAG_0x267 0x267
+#define FLAG_0x268 0x268
+#define FLAG_0x269 0x269
+#define FLAG_0x26A 0x26A
+#define FLAG_0x26B 0x26B
+#define FLAG_0x26C 0x26C
+#define FLAG_0x26D 0x26D
+#define FLAG_0x26E 0x26E
+#define FLAG_0x26F 0x26F
+#define FLAG_0x270 0x270
+#define FLAG_0x271 0x271
+#define FLAG_0x272 0x272
+#define FLAG_0x273 0x273
+#define FLAG_0x274 0x274
+#define FLAG_0x275 0x275
+#define FLAG_0x276 0x276
+#define FLAG_0x277 0x277
+#define FLAG_0x278 0x278
+#define FLAG_0x279 0x279
+#define FLAG_0x27A 0x27A
+#define FLAG_0x27B 0x27B
+#define FLAG_0x27C 0x27C
+#define FLAG_0x27D 0x27D
+#define FLAG_0x27E 0x27E
+#define FLAG_0x27F 0x27F
+#define FLAG_0x280 0x280
+#define FLAG_0x281 0x281
+#define FLAG_0x282 0x282
+#define FLAG_0x283 0x283
+#define FLAG_0x284 0x284
+#define FLAG_0x285 0x285
+#define FLAG_0x286 0x286
+#define FLAG_0x287 0x287
+#define FLAG_0x288 0x288
+#define FLAG_0x289 0x289
+#define FLAG_0x28A 0x28A
+#define FLAG_0x28B 0x28B
+#define FLAG_0x28C 0x28C
+#define FLAG_0x28D 0x28D
+#define FLAG_0x28E 0x28E
+#define FLAG_0x28F 0x28F
+#define FLAG_0x290 0x290
+#define FLAG_0x291 0x291
+#define FLAG_0x292 0x292
+#define FLAG_0x293 0x293
+#define FLAG_0x294 0x294
+#define FLAG_0x295 0x295
+#define FLAG_0x296 0x296
+#define FLAG_0x297 0x297
+#define FLAG_0x298 0x298
+#define FLAG_0x299 0x299
+#define FLAG_0x29A 0x29A
+#define FLAG_0x29B 0x29B
+#define FLAG_0x29C 0x29C
+#define FLAG_0x29D 0x29D
+#define FLAG_0x29E 0x29E
+#define FLAG_0x29F 0x29F
+#define FLAG_0x2A0 0x2A0
+#define FLAG_0x2A1 0x2A1
+#define FLAG_0x2A2 0x2A2
+#define FLAG_0x2A3 0x2A3
+#define FLAG_0x2A4 0x2A4
+#define FLAG_0x2A5 0x2A5
+#define FLAG_0x2A6 0x2A6
+#define FLAG_0x2A7 0x2A7
+#define FLAG_0x2A8 0x2A8
+#define FLAG_0x2A9 0x2A9
+#define FLAG_0x2AA 0x2AA
+#define FLAG_0x2AB 0x2AB
+#define FLAG_0x2AC 0x2AC
+#define FLAG_0x2AD 0x2AD
+#define FLAG_0x2AE 0x2AE
+#define FLAG_0x2AF 0x2AF
+#define FLAG_0x2B0 0x2B0
+#define FLAG_0x2B1 0x2B1
+#define FLAG_0x2B2 0x2B2
+#define FLAG_0x2B3 0x2B3
+#define FLAG_0x2B4 0x2B4
+#define FLAG_0x2B5 0x2B5
+#define FLAG_0x2B6 0x2B6
+#define FLAG_0x2B7 0x2B7
+#define FLAG_0x2B8 0x2B8
+#define FLAG_0x2B9 0x2B9
+#define FLAG_0x2BA 0x2BA
+#define FLAG_0x2BB 0x2BB
+#define FLAG_0x2BC 0x2BC
+#define FLAG_0x2BD 0x2BD
+#define FLAG_0x2BE 0x2BE
+#define FLAG_0x2BF 0x2BF
+#define FLAG_0x2C0 0x2C0
+#define FLAG_0x2C1 0x2C1
+#define FLAG_0x2C2 0x2C2
+#define FLAG_0x2C3 0x2C3
+#define FLAG_0x2C4 0x2C4
+#define FLAG_0x2C5 0x2C5
+#define FLAG_0x2C6 0x2C6
+#define FLAG_0x2C7 0x2C7
+#define FLAG_0x2C8 0x2C8
+#define FLAG_0x2C9 0x2C9
+#define FLAG_0x2CA 0x2CA
+#define FLAG_0x2CB 0x2CB
+#define FLAG_0x2CC 0x2CC
+#define FLAG_0x2CD 0x2CD
+#define FLAG_0x2CE 0x2CE
+#define FLAG_0x2CF 0x2CF
+#define FLAG_0x2D0 0x2D0
+#define FLAG_0x2D1 0x2D1
+#define FLAG_0x2D2 0x2D2
+#define FLAG_0x2D3 0x2D3
+#define FLAG_0x2D4 0x2D4
+#define FLAG_0x2D5 0x2D5
+#define FLAG_0x2D6 0x2D6
+#define FLAG_0x2D7 0x2D7
+#define FLAG_0x2D8 0x2D8
+#define FLAG_0x2D9 0x2D9
+#define FLAG_0x2DA 0x2DA
+#define FLAG_0x2DB 0x2DB
+#define FLAG_0x2DC 0x2DC
+#define FLAG_0x2DD 0x2DD
+#define FLAG_0x2DE 0x2DE
+#define FLAG_0x2DF 0x2DF
+#define FLAG_0x2E0 0x2E0
+#define FLAG_0x2E1 0x2E1
+#define FLAG_0x2E2 0x2E2
+#define FLAG_0x2E3 0x2E3
+#define FLAG_0x2E4 0x2E4
+#define FLAG_0x2E5 0x2E5
+#define FLAG_0x2E6 0x2E6
+#define FLAG_0x2E7 0x2E7
+#define FLAG_0x2E8 0x2E8
+#define FLAG_0x2E9 0x2E9
+#define FLAG_0x2EA 0x2EA
+#define FLAG_0x2EB 0x2EB
+#define FLAG_0x2EC 0x2EC
+#define FLAG_0x2ED 0x2ED
+#define FLAG_0x2EE 0x2EE
+#define FLAG_0x2EF 0x2EF
+#define FLAG_0x2F0 0x2F0
+#define FLAG_0x2F1 0x2F1
+#define FLAG_0x2F2 0x2F2
+#define FLAG_0x2F3 0x2F3
+#define FLAG_0x2F4 0x2F4
+#define FLAG_0x2F5 0x2F5
+#define FLAG_0x2F6 0x2F6
+#define FLAG_0x2F7 0x2F7
+#define FLAG_0x2F8 0x2F8
+#define FLAG_0x2F9 0x2F9
+#define FLAG_0x2FA 0x2FA
+#define FLAG_0x2FB 0x2FB
+#define FLAG_0x2FC 0x2FC
+#define FLAG_0x2FD 0x2FD
+#define FLAG_0x2FE 0x2FE
+#define FLAG_0x2FF 0x2FF
+#define FLAG_0x300 0x300
+#define FLAG_0x301 0x301
+#define FLAG_0x302 0x302
+#define FLAG_0x303 0x303
+#define FLAG_0x304 0x304
+#define FLAG_0x305 0x305
+#define FLAG_0x306 0x306
+#define FLAG_0x307 0x307
+#define FLAG_0x308 0x308
+#define FLAG_0x309 0x309
+#define FLAG_0x30A 0x30A
+#define FLAG_0x30B 0x30B
+#define FLAG_0x30C 0x30C
+#define FLAG_0x30D 0x30D
+#define FLAG_0x30E 0x30E
+#define FLAG_0x30F 0x30F
+#define FLAG_0x310 0x310
+#define FLAG_0x311 0x311
+#define FLAG_0x312 0x312
+#define FLAG_0x313 0x313
+#define FLAG_0x314 0x314
+#define FLAG_0x315 0x315
+#define FLAG_0x316 0x316
+#define FLAG_0x317 0x317
+#define FLAG_0x318 0x318
+#define FLAG_0x319 0x319
+#define FLAG_0x31A 0x31A
+#define FLAG_0x31B 0x31B
+#define FLAG_0x31C 0x31C
+#define FLAG_0x31D 0x31D
+#define FLAG_0x31E 0x31E
+#define FLAG_0x31F 0x31F
+#define FLAG_0x320 0x320
+#define FLAG_0x321 0x321
+#define FLAG_0x322 0x322
+#define FLAG_0x323 0x323
+#define FLAG_0x324 0x324
+#define FLAG_0x325 0x325
+#define FLAG_0x326 0x326
+#define FLAG_0x327 0x327
+#define FLAG_0x328 0x328
+#define FLAG_0x329 0x329
+#define FLAG_0x32A 0x32A
+#define FLAG_0x32B 0x32B
+#define FLAG_0x32C 0x32C
+#define FLAG_0x32D 0x32D
+#define FLAG_0x32E 0x32E
+#define FLAG_0x32F 0x32F
+#define FLAG_0x330 0x330
+#define FLAG_0x331 0x331
+#define FLAG_0x332 0x332
+#define FLAG_0x333 0x333
+#define FLAG_0x334 0x334
+#define FLAG_0x335 0x335
+#define FLAG_0x336 0x336
+#define FLAG_0x337 0x337
+#define FLAG_0x338 0x338
+#define FLAG_0x339 0x339
+#define FLAG_0x33A 0x33A
+#define FLAG_0x33B 0x33B
+#define FLAG_0x33C 0x33C
+#define FLAG_0x33D 0x33D
+#define FLAG_0x33E 0x33E
+#define FLAG_0x33F 0x33F
+#define FLAG_0x340 0x340
+#define FLAG_0x341 0x341
+#define FLAG_0x342 0x342
+#define FLAG_0x343 0x343
+#define FLAG_0x344 0x344
+#define FLAG_0x345 0x345
+#define FLAG_0x346 0x346
+#define FLAG_0x347 0x347
+#define FLAG_0x348 0x348
+#define FLAG_0x349 0x349
+#define FLAG_0x34A 0x34A
+#define FLAG_0x34B 0x34B
+#define FLAG_0x34C 0x34C
+#define FLAG_0x34D 0x34D
+#define FLAG_0x34E 0x34E
+#define FLAG_0x34F 0x34F
+#define FLAG_0x350 0x350
+#define FLAG_0x351 0x351
+#define FLAG_0x352 0x352
+#define FLAG_0x353 0x353
+#define FLAG_0x354 0x354
+#define FLAG_0x355 0x355
+#define FLAG_0x356 0x356
+#define FLAG_0x357 0x357
+#define FLAG_0x358 0x358
+#define FLAG_0x359 0x359
+#define FLAG_0x35A 0x35A
+#define FLAG_0x35B 0x35B
+#define FLAG_0x35C 0x35C
+#define FLAG_0x35D 0x35D
+#define FLAG_0x35E 0x35E
+#define FLAG_0x35F 0x35F
+#define FLAG_0x360 0x360
+#define FLAG_0x361 0x361
+#define FLAG_0x362 0x362
+#define FLAG_0x363 0x363
+#define FLAG_0x364 0x364
+#define FLAG_0x365 0x365
+#define FLAG_0x366 0x366
+#define FLAG_0x367 0x367
+#define FLAG_0x368 0x368
+#define FLAG_0x369 0x369
+#define FLAG_0x36A 0x36A
+#define FLAG_0x36B 0x36B
+#define FLAG_0x36C 0x36C
+#define FLAG_0x36D 0x36D
+#define FLAG_0x36E 0x36E
+#define FLAG_0x36F 0x36F
+#define FLAG_0x370 0x370
+#define FLAG_0x371 0x371
+#define FLAG_0x372 0x372
+#define FLAG_0x373 0x373
+#define FLAG_0x374 0x374
+#define FLAG_0x375 0x375
+#define FLAG_0x376 0x376
+#define FLAG_0x377 0x377
+#define FLAG_0x378 0x378
+#define FLAG_0x379 0x379
+#define FLAG_0x37A 0x37A
+#define FLAG_0x37B 0x37B
+#define FLAG_0x37C 0x37C
+#define FLAG_0x37D 0x37D
+#define FLAG_0x37E 0x37E
+#define FLAG_0x37F 0x37F
+#define FLAG_0x380 0x380
+#define FLAG_0x381 0x381
+#define FLAG_0x382 0x382
+#define FLAG_0x383 0x383
+#define FLAG_0x384 0x384
+#define FLAG_0x385 0x385
+#define FLAG_0x386 0x386
+#define FLAG_0x387 0x387
+#define FLAG_0x388 0x388
+#define FLAG_0x389 0x389
+#define FLAG_0x38A 0x38A
+#define FLAG_0x38B 0x38B
+#define FLAG_0x38C 0x38C
+#define FLAG_0x38D 0x38D
+#define FLAG_0x38E 0x38E
+#define FLAG_0x38F 0x38F
+#define FLAG_0x390 0x390
+#define FLAG_0x391 0x391
+#define FLAG_0x392 0x392
+#define FLAG_0x393 0x393
+#define FLAG_0x394 0x394
+#define FLAG_0x395 0x395
+#define FLAG_0x396 0x396
+#define FLAG_0x397 0x397
+#define FLAG_0x398 0x398
+#define FLAG_0x399 0x399
+#define FLAG_0x39A 0x39A
+#define FLAG_0x39B 0x39B
+#define FLAG_0x39C 0x39C
+#define FLAG_0x39D 0x39D
+#define FLAG_0x39E 0x39E
+#define FLAG_0x39F 0x39F
+#define FLAG_0x3A0 0x3A0
+#define FLAG_0x3A1 0x3A1
+#define FLAG_0x3A2 0x3A2
+#define FLAG_0x3A3 0x3A3
+#define FLAG_0x3A4 0x3A4
+#define FLAG_0x3A5 0x3A5
+#define FLAG_0x3A6 0x3A6
+#define FLAG_0x3A7 0x3A7
+#define FLAG_0x3A8 0x3A8
+#define FLAG_0x3A9 0x3A9
+#define FLAG_0x3AA 0x3AA
+#define FLAG_0x3AB 0x3AB
+#define FLAG_0x3AC 0x3AC
+#define FLAG_0x3AD 0x3AD
+#define FLAG_0x3AE 0x3AE
+#define FLAG_0x3AF 0x3AF
+#define FLAG_0x3B0 0x3B0
+#define FLAG_0x3B1 0x3B1
+#define FLAG_0x3B2 0x3B2
+#define FLAG_0x3B3 0x3B3
+#define FLAG_0x3B4 0x3B4
+#define FLAG_0x3B5 0x3B5
+#define FLAG_0x3B6 0x3B6
+#define FLAG_0x3B7 0x3B7
+#define FLAG_0x3B8 0x3B8
+#define FLAG_0x3B9 0x3B9
+#define FLAG_0x3BA 0x3BA
+#define FLAG_0x3BB 0x3BB
+#define FLAG_0x3BC 0x3BC
+#define FLAG_0x3BD 0x3BD
+#define FLAG_0x3BE 0x3BE
+#define FLAG_0x3BF 0x3BF
+#define FLAG_0x3C0 0x3C0
+#define FLAG_0x3C1 0x3C1
+#define FLAG_0x3C2 0x3C2
+#define FLAG_0x3C3 0x3C3
+#define FLAG_0x3C4 0x3C4
+#define FLAG_0x3C5 0x3C5
+#define FLAG_0x3C6 0x3C6
+#define FLAG_0x3C7 0x3C7
+#define FLAG_0x3C8 0x3C8
+#define FLAG_0x3C9 0x3C9
+#define FLAG_0x3CA 0x3CA
+#define FLAG_0x3CB 0x3CB
+#define FLAG_0x3CC 0x3CC
+#define FLAG_0x3CD 0x3CD
+#define FLAG_0x3CE 0x3CE
+#define FLAG_0x3CF 0x3CF
+#define FLAG_0x3D0 0x3D0
+#define FLAG_0x3D1 0x3D1
+#define FLAG_0x3D2 0x3D2
+#define FLAG_0x3D3 0x3D3
+#define FLAG_0x3D4 0x3D4
+#define FLAG_0x3D5 0x3D5
+#define FLAG_0x3D6 0x3D6
+#define FLAG_0x3D7 0x3D7
+#define FLAG_0x3D8 0x3D8
+#define FLAG_0x3D9 0x3D9
+#define FLAG_0x3DA 0x3DA
+#define FLAG_0x3DB 0x3DB
+#define FLAG_0x3DC 0x3DC
+#define FLAG_0x3DD 0x3DD
+#define FLAG_0x3DE 0x3DE
+#define FLAG_0x3DF 0x3DF
+#define FLAG_0x3E0 0x3E0
+#define FLAG_0x3E1 0x3E1
+#define FLAG_0x3E2 0x3E2
+#define FLAG_0x3E3 0x3E3
+#define FLAG_0x3E4 0x3E4
+#define FLAG_0x3E5 0x3E5
+#define FLAG_0x3E6 0x3E6
+#define FLAG_0x3E7 0x3E7
+#define FLAG_0x3E8 0x3E8
+#define FLAG_0x3E9 0x3E9
+#define FLAG_0x3EA 0x3EA
+#define FLAG_0x3EB 0x3EB
+#define FLAG_0x3EC 0x3EC
+#define FLAG_0x3ED 0x3ED
+#define FLAG_0x3EE 0x3EE
+#define FLAG_0x3EF 0x3EF
+#define FLAG_0x3F0 0x3F0
+#define FLAG_0x3F1 0x3F1
+#define FLAG_0x3F2 0x3F2
+#define FLAG_0x3F3 0x3F3
+#define FLAG_0x3F4 0x3F4
+#define FLAG_0x3F5 0x3F5
+#define FLAG_0x3F6 0x3F6
+#define FLAG_0x3F7 0x3F7
+#define FLAG_0x3F8 0x3F8
+#define FLAG_0x3F9 0x3F9
+#define FLAG_0x3FA 0x3FA
+#define FLAG_0x3FB 0x3FB
+#define FLAG_0x3FC 0x3FC
+#define FLAG_0x3FD 0x3FD
+#define FLAG_0x3FE 0x3FE
+#define FLAG_0x3FF 0x3FF
+#define FLAG_0x400 0x400
+#define FLAG_0x401 0x401
+#define FLAG_0x402 0x402
+#define FLAG_0x403 0x403
+#define FLAG_0x404 0x404
+#define FLAG_0x405 0x405
+#define FLAG_0x406 0x406
+#define FLAG_0x407 0x407
+#define FLAG_0x408 0x408
+#define FLAG_0x409 0x409
+#define FLAG_0x40A 0x40A
+#define FLAG_0x40B 0x40B
+#define FLAG_0x40C 0x40C
+#define FLAG_0x40D 0x40D
+#define FLAG_0x40E 0x40E
+#define FLAG_0x40F 0x40F
+#define FLAG_0x410 0x410
+#define FLAG_0x411 0x411
+#define FLAG_0x412 0x412
+#define FLAG_0x413 0x413
+#define FLAG_0x414 0x414
+#define FLAG_0x415 0x415
+#define FLAG_0x416 0x416
+#define FLAG_0x417 0x417
+#define FLAG_0x418 0x418
+#define FLAG_0x419 0x419
+#define FLAG_0x41A 0x41A
+#define FLAG_0x41B 0x41B
+#define FLAG_0x41C 0x41C
+#define FLAG_0x41D 0x41D
+#define FLAG_0x41E 0x41E
+#define FLAG_0x41F 0x41F
+#define FLAG_0x420 0x420
+#define FLAG_0x421 0x421
+#define FLAG_0x422 0x422
+#define FLAG_0x423 0x423
+#define FLAG_0x424 0x424
+#define FLAG_0x425 0x425
+#define FLAG_0x426 0x426
+#define FLAG_0x427 0x427
+#define FLAG_0x428 0x428
+#define FLAG_0x429 0x429
+#define FLAG_0x42A 0x42A
+#define FLAG_0x42B 0x42B
+#define FLAG_0x42C 0x42C
+#define FLAG_0x42D 0x42D
+#define FLAG_0x42E 0x42E
+#define FLAG_0x42F 0x42F
+#define FLAG_0x430 0x430
+#define FLAG_0x431 0x431
+#define FLAG_0x432 0x432
+#define FLAG_0x433 0x433
+#define FLAG_0x434 0x434
+#define FLAG_0x435 0x435
+#define FLAG_0x436 0x436
+#define FLAG_0x437 0x437
+#define FLAG_0x438 0x438
+#define FLAG_0x439 0x439
+#define FLAG_0x43A 0x43A
+#define FLAG_0x43B 0x43B
+#define FLAG_0x43C 0x43C
+#define FLAG_0x43D 0x43D
+#define FLAG_0x43E 0x43E
+#define FLAG_0x43F 0x43F
+#define FLAG_0x440 0x440
+#define FLAG_0x441 0x441
+#define FLAG_0x442 0x442
+#define FLAG_0x443 0x443
+#define FLAG_0x444 0x444
+#define FLAG_0x445 0x445
+#define FLAG_0x446 0x446
+#define FLAG_0x447 0x447
+#define FLAG_0x448 0x448
+#define FLAG_0x449 0x449
+#define FLAG_0x44A 0x44A
+#define FLAG_0x44B 0x44B
+#define FLAG_0x44C 0x44C
+#define FLAG_0x44D 0x44D
+#define FLAG_0x44E 0x44E
+#define FLAG_0x44F 0x44F
+#define FLAG_0x450 0x450
+#define FLAG_0x451 0x451
+#define FLAG_0x452 0x452
+#define FLAG_0x453 0x453
+#define FLAG_0x454 0x454
+#define FLAG_0x455 0x455
+#define FLAG_0x456 0x456
+#define FLAG_0x457 0x457
+#define FLAG_0x458 0x458
+#define FLAG_0x459 0x459
+#define FLAG_0x45A 0x45A
+#define FLAG_0x45B 0x45B
+#define FLAG_0x45C 0x45C
+#define FLAG_0x45D 0x45D
+#define FLAG_0x45E 0x45E
+#define FLAG_0x45F 0x45F
+#define FLAG_0x460 0x460
+#define FLAG_0x461 0x461
+#define FLAG_0x462 0x462
+#define FLAG_0x463 0x463
+#define FLAG_0x464 0x464
+#define FLAG_0x465 0x465
+#define FLAG_0x466 0x466
+#define FLAG_0x467 0x467
+#define FLAG_0x468 0x468
+#define FLAG_0x469 0x469
+#define FLAG_0x46A 0x46A
+#define FLAG_0x46B 0x46B
+#define FLAG_0x46C 0x46C
+#define FLAG_0x46D 0x46D
+#define FLAG_0x46E 0x46E
+#define FLAG_0x46F 0x46F
+#define FLAG_0x470 0x470
+#define FLAG_0x471 0x471
+#define FLAG_0x472 0x472
+#define FLAG_0x473 0x473
+#define FLAG_0x474 0x474
+#define FLAG_0x475 0x475
+#define FLAG_0x476 0x476
+#define FLAG_0x477 0x477
+#define FLAG_0x478 0x478
+#define FLAG_0x479 0x479
+#define FLAG_0x47A 0x47A
+#define FLAG_0x47B 0x47B
+#define FLAG_0x47C 0x47C
+#define FLAG_0x47D 0x47D
+#define FLAG_0x47E 0x47E
+#define FLAG_0x47F 0x47F
+#define FLAG_0x480 0x480
+#define FLAG_0x481 0x481
+#define FLAG_0x482 0x482
+#define FLAG_0x483 0x483
+#define FLAG_0x484 0x484
+#define FLAG_0x485 0x485
+#define FLAG_0x486 0x486
+#define FLAG_0x487 0x487
+#define FLAG_0x488 0x488
+#define FLAG_0x489 0x489
+#define FLAG_0x48A 0x48A
+#define FLAG_0x48B 0x48B
+#define FLAG_0x48C 0x48C
+#define FLAG_0x48D 0x48D
+#define FLAG_0x48E 0x48E
+#define FLAG_0x48F 0x48F
+#define FLAG_0x490 0x490
+#define FLAG_0x491 0x491
+#define FLAG_0x492 0x492
+#define FLAG_0x493 0x493
+#define FLAG_0x494 0x494
+#define FLAG_0x495 0x495
+#define FLAG_0x496 0x496
+#define FLAG_0x497 0x497
+#define FLAG_0x498 0x498
+#define FLAG_0x499 0x499
+#define FLAG_0x49A 0x49A
+#define FLAG_0x49B 0x49B
+#define FLAG_0x49C 0x49C
+#define FLAG_0x49D 0x49D
+#define FLAG_0x49E 0x49E
+#define FLAG_0x49F 0x49F
+#define FLAG_0x4A0 0x4A0
+#define FLAG_0x4A1 0x4A1
+#define FLAG_0x4A2 0x4A2
+#define FLAG_0x4A3 0x4A3
+#define FLAG_0x4A4 0x4A4
+#define FLAG_0x4A5 0x4A5
+#define FLAG_0x4A6 0x4A6
+#define FLAG_0x4A7 0x4A7
+#define FLAG_0x4A8 0x4A8
+#define FLAG_0x4A9 0x4A9
+#define FLAG_0x4AA 0x4AA
+#define FLAG_0x4AB 0x4AB
+#define FLAG_0x4AC 0x4AC
+#define FLAG_0x4AD 0x4AD
+#define FLAG_0x4AE 0x4AE
+#define FLAG_0x4AF 0x4AF
+#define FLAG_0x4B0 0x4B0
+#define FLAG_0x4B1 0x4B1
+#define FLAG_0x4B2 0x4B2
+#define FLAG_0x4B3 0x4B3
+#define FLAG_0x4B4 0x4B4
+#define FLAG_0x4B5 0x4B5
+#define FLAG_0x4B6 0x4B6
+#define FLAG_0x4B7 0x4B7
+#define FLAG_0x4B8 0x4B8
+#define FLAG_0x4B9 0x4B9
+#define FLAG_0x4BA 0x4BA
+#define FLAG_0x4BB 0x4BB
+#define FLAG_0x4BC 0x4BC
+#define FLAG_0x4BD 0x4BD
+#define FLAG_0x4BE 0x4BE
+#define FLAG_0x4BF 0x4BF
+#define FLAG_0x4C0 0x4C0
+#define FLAG_0x4C1 0x4C1
+#define FLAG_0x4C2 0x4C2
+#define FLAG_0x4C3 0x4C3
+#define FLAG_0x4C4 0x4C4
+#define FLAG_0x4C5 0x4C5
+#define FLAG_0x4C6 0x4C6
+#define FLAG_0x4C7 0x4C7
+#define FLAG_0x4C8 0x4C8
+#define FLAG_0x4C9 0x4C9
+#define FLAG_0x4CA 0x4CA
+#define FLAG_0x4CB 0x4CB
+#define FLAG_0x4CC 0x4CC
+#define FLAG_0x4CD 0x4CD
+#define FLAG_0x4CE 0x4CE
+#define FLAG_0x4CF 0x4CF
+#define FLAG_0x4D0 0x4D0
+#define FLAG_0x4D1 0x4D1
+#define FLAG_0x4D2 0x4D2
+#define FLAG_0x4D3 0x4D3
+#define FLAG_0x4D4 0x4D4
+#define FLAG_0x4D5 0x4D5
+#define FLAG_0x4D6 0x4D6
+#define FLAG_0x4D7 0x4D7
+#define FLAG_0x4D8 0x4D8
+#define FLAG_0x4D9 0x4D9
+#define FLAG_0x4DA 0x4DA
+#define FLAG_0x4DB 0x4DB
+#define FLAG_0x4DC 0x4DC
+#define FLAG_0x4DD 0x4DD
+#define FLAG_0x4DE 0x4DE
+#define FLAG_0x4DF 0x4DF
+#define FLAG_0x4E0 0x4E0
+#define FLAG_0x4E1 0x4E1
+#define FLAG_0x4E2 0x4E2
+#define FLAG_0x4E3 0x4E3
+#define FLAG_0x4E4 0x4E4
+#define FLAG_0x4E5 0x4E5
+#define FLAG_0x4E6 0x4E6
+#define FLAG_0x4E7 0x4E7
+#define FLAG_0x4E8 0x4E8
+#define FLAG_0x4E9 0x4E9
+#define FLAG_0x4EA 0x4EA
+#define FLAG_0x4EB 0x4EB
+#define FLAG_0x4EC 0x4EC
+#define FLAG_0x4ED 0x4ED
+#define FLAG_0x4EE 0x4EE
+#define FLAG_0x4EF 0x4EF
+#define FLAG_0x4F0 0x4F0
+#define FLAG_0x4F1 0x4F1
+#define FLAG_0x4F2 0x4F2
+#define FLAG_0x4F3 0x4F3
+#define FLAG_0x4F4 0x4F4
+#define FLAG_0x4F5 0x4F5
+#define FLAG_0x4F6 0x4F6
+#define FLAG_0x4F7 0x4F7
+#define FLAG_0x4F8 0x4F8
+#define FLAG_0x4F9 0x4F9
+#define FLAG_0x4FA 0x4FA
+#define FLAG_0x4FB 0x4FB
+#define FLAG_0x4FC 0x4FC
+#define FLAG_0x4FD 0x4FD
+#define FLAG_0x4FE 0x4FE
+#define FLAG_0x4FF 0x4FF
+
+#define FLAG_TRAINER_FLAG_START 0x500
+
+#define TRAINERS_FLAG_NO 0x356
+#define CODE_FLAGS (FLAG_TRAINER_FLAG_START + TRAINERS_FLAG_NO + 0xA) // 0x860
+
+// SYSTEM FLAGS
+
+// 0x860
+#define FLAG_SYS_POKEMON_GET (CODE_FLAGS + 0)
+#define FLAG_SYS_POKEDEX_GET (CODE_FLAGS + 1)
+#define FLAG_SYS_POKENAV_GET (CODE_FLAGS + 2)
+// third one appears unused
+#define FLAG_SYS_GAME_CLEAR (CODE_FLAGS + 4)
+#define FLAG_SYS_CHAT_USED (CODE_FLAGS + 5)
+#define FLAG_SYS_HIPSTER_MEET (CODE_FLAGS + 6)
+
+// badges
+#define FLAG_BADGE01_GET (CODE_FLAGS + 7)
+#define FLAG_BADGE02_GET (CODE_FLAGS + 8)
+#define FLAG_BADGE03_GET (CODE_FLAGS + 9)
+#define FLAG_BADGE04_GET (CODE_FLAGS + 0xA)
+#define FLAG_BADGE05_GET (CODE_FLAGS + 0xB)
+#define FLAG_BADGE06_GET (CODE_FLAGS + 0xC)
+#define FLAG_BADGE07_GET (CODE_FLAGS + 0xD)
+#define FLAG_BADGE08_GET (CODE_FLAGS + 0xE)
+
+// cities and towns
+#define FLAG_VISITED_LITTLEROOT_TOWN (CODE_FLAGS + 0xF)
+#define FLAG_VISITED_OLDALE_TOWN (CODE_FLAGS + 0x10)
+#define FLAG_VISITED_DEWFORD_TOWN (CODE_FLAGS + 0x11)
+#define FLAG_VISITED_LAVARIDGE_TOWN (CODE_FLAGS + 0x12)
+#define FLAG_VISITED_FALLARBOR_TOWN (CODE_FLAGS + 0x13)
+#define FLAG_VISITED_VERDANTURF_TOWN (CODE_FLAGS + 0x14)
+#define FLAG_VISITED_PACIFIDLOG_TOWN (CODE_FLAGS + 0x15)
+#define FLAG_VISITED_PETALBURG_CITY (CODE_FLAGS + 0x16)
+#define FLAG_VISITED_SLATEPORT_CITY (CODE_FLAGS + 0x17)
+#define FLAG_VISITED_MAUVILLE_CITY (CODE_FLAGS + 0x18)
+#define FLAG_VISITED_RUSTBORO_CITY (CODE_FLAGS + 0x19)
+#define FLAG_VISITED_FORTREE_CITY (CODE_FLAGS + 0x1A)
+#define FLAG_VISITED_LILYCOVE_CITY (CODE_FLAGS + 0x1B)
+#define FLAG_VISITED_MOSSDEEP_CITY (CODE_FLAGS + 0x1C)
+#define FLAG_VISITED_SOOTOPOLIS_CITY (CODE_FLAGS + 0x1D)
+#define FLAG_VISITED_EVER_GRANDE_CITY (CODE_FLAGS + 0x1E)
+
+#define FLAG_0x87F (CODE_FLAGS + 0x1F)
+#define FLAG_0x880 (CODE_FLAGS + 0x20)
+#define FLAG_0x881 (CODE_FLAGS + 0x21)
+#define FLAG_0x882 (CODE_FLAGS + 0x22)
+#define FLAG_0x883 (CODE_FLAGS + 0x23)
+#define FLAG_0x884 (CODE_FLAGS + 0x24)
+#define FLAG_0x885 (CODE_FLAGS + 0x25)
+#define FLAG_0x886 (CODE_FLAGS + 0x26)
+#define FLAG_0x887 (CODE_FLAGS + 0x27)
+
+#define FLAG_SYS_USE_FLASH (CODE_FLAGS + 0x28)
+#define FLAG_SYS_USE_STRENGTH (CODE_FLAGS + 0x29)
+#define FLAG_SYS_WEATHER_CTRL (CODE_FLAGS + 0x2A)
+#define FLAG_SYS_CYCLING_ROAD (CODE_FLAGS + 0x2B)
+#define FLAG_SYS_SAFARI_MODE (CODE_FLAGS + 0x2C)
+#define FLAG_SYS_CRUISE_MODE (CODE_FLAGS + 0x2D)
+
+#define FLAG_0x88E (CODE_FLAGS + 0x2E)
+#define FLAG_0x88F (CODE_FLAGS + 0x2F)
+
+#define FLAG_SYS_TV_HOME (CODE_FLAGS + 0x30)
+#define FLAG_SYS_TV_WATCH (CODE_FLAGS + 0x31)
+#define FLAG_SYS_TV_START (CODE_FLAGS + 0x32)
+#define FLAG_SYS_POPWORD_INPUT (CODE_FLAGS + 0x33)
+#define FLAG_SYS_MIX_RECORD (CODE_FLAGS + 0x34)
+#define FLAG_SYS_CLOCK_SET (CODE_FLAGS + 0x35)
+#define FLAG_SYS_NATIONAL_DEX (CODE_FLAGS + 0x36)
+#define FLAG_SYS_CAVE_SHIP (CODE_FLAGS + 0x37)
+#define FLAG_SYS_CAVE_WONDER (CODE_FLAGS + 0x38)
+#define FLAG_SYS_CAVE_BATTLE (CODE_FLAGS + 0x39)
+#define FLAG_SYS_SHOAL_TIDE (CODE_FLAGS + 0x3A)
+#define FLAG_SYS_RIBBON_GET (CODE_FLAGS + 0x3B)
+
+#define FLAG_0x89C (CODE_FLAGS + 0x3C)
+#define FLAG_0x89D (CODE_FLAGS + 0x3D)
+#define FLAG_0x89E (CODE_FLAGS + 0x3E)
+#define FLAG_0x89F (CODE_FLAGS + 0x3F)
+#define FLAG_0x8A0 (CODE_FLAGS + 0x40)
+#define FLAG_0x8A1 (CODE_FLAGS + 0x41)
+#define FLAG_0x8A2 (CODE_FLAGS + 0x42)
+#define FLAG_0x8A3 (CODE_FLAGS + 0x43)
+#define FLAG_0x8A4 (CODE_FLAGS + 0x44)
+#define FLAG_0x8A5 (CODE_FLAGS + 0x45)
+#define FLAG_0x8A6 (CODE_FLAGS + 0x46)
+#define FLAG_0x8A7 (CODE_FLAGS + 0x47)
+#define FLAG_UNLOCK_BATTLE_FRONTIER (CODE_FLAGS + 0x48)
+#define FLAG_UNLOCK_SOUTHERN_ISLAND (CODE_FLAGS + 0x49)
+#define FLAG_0x8AA (CODE_FLAGS + 0x4A)
+
+#define FLAG_SYS_PC_LANETTE (CODE_FLAGS + 0x4B)
+#define FLAG_SYS_MYSTERY_EVENT_ENABLE (CODE_FLAGS + 0x4C)
+#define FLAG_SYS_ENC_UP_ITEM (CODE_FLAGS + 0x4D)
+#define FLAG_SYS_ENC_DOWN_ITEM (CODE_FLAGS + 0x4E)
+#define FLAG_SYS_BRAILLE_DIG (CODE_FLAGS + 0x4F)
+#define FLAG_SYS_BRAILLE_STRENGTH (CODE_FLAGS + 0x50)
+#define FLAG_SYS_BRAILLE_WAIT (CODE_FLAGS + 0x51)
+#define FLAG_SYS_BRAILLE_FLY (CODE_FLAGS + 0x52)
+#define FLAG_SYS_HAS_EON_TICKET (CODE_FLAGS + 0x53)
+
+#define FLAG_SYS_POKEMON_LEAGUE_FLY (CODE_FLAGS + 0x54)
+
+#define FLAG_0x8B5 (CODE_FLAGS + 0x55)
+#define FLAG_0x8B6 (CODE_FLAGS + 0x56)
+#define FLAG_0x8B7 (CODE_FLAGS + 0x57)
+#define FLAG_0x8B8 (CODE_FLAGS + 0x58)
+#define FLAG_0x8B9 (CODE_FLAGS + 0x59)
+#define FLAG_0x8BA (CODE_FLAGS + 0x5A)
+#define FLAG_0x8BB (CODE_FLAGS + 0x5B)
+#define FLAG_0x8BC (CODE_FLAGS + 0x5C)
+
+#define FLAG_SYS_TV_LATI (CODE_FLAGS + 0x5D)
+
+#define FLAG_0x8BE (CODE_FLAGS + 0x5E)
+
+#define FLAG_SYS_SHOAL_ITEM (CODE_FLAGS + 0x5F)
+#define FLAG_SYS_B_DASH (CODE_FLAGS + 0x60) // got Running Shoes
+#define FLAG_SYS_CTRL_OBJ_DELETE (CODE_FLAGS + 0x61)
+#define FLAG_SYS_RESET_RTC_ENABLE (CODE_FLAGS + 0x62)
+
+#define FLAG_0x8C3 (CODE_FLAGS + 0x63)
+
+#define FLAG_SYS_TOWER_SILVER (CODE_FLAGS + 0x64)
+#define FLAG_SYS_TOWER_GOLD (CODE_FLAGS + 0x65)
+#define FLAG_SYS_DOME_SILVER (CODE_FLAGS + 0x66)
+#define FLAG_SYS_DOME_GOLD (CODE_FLAGS + 0x67)
+#define FLAG_SYS_PALACE_SILVER (CODE_FLAGS + 0x68)
+#define FLAG_SYS_PALACE_GOLD (CODE_FLAGS + 0x69)
+#define FLAG_SYS_ARENA_SILVER (CODE_FLAGS + 0x6A)
+#define FLAG_SYS_ARENA_GOLD (CODE_FLAGS + 0x6B)
+#define FLAG_SYS_FACTORY_SILVER (CODE_FLAGS + 0x6C)
+#define FLAG_SYS_FACTORY_GOLD (CODE_FLAGS + 0x6D)
+#define FLAG_SYS_PIKE_SILVER (CODE_FLAGS + 0x6E)
+#define FLAG_SYS_PIKE_GOLD (CODE_FLAGS + 0x6F)
+#define FLAG_SYS_PYRAMID_SILVER (CODE_FLAGS + 0x70)
+#define FLAG_SYS_PYRAMID_GOLD (CODE_FLAGS + 0x71)
+#define FLAG_SYS_FRONTIER_PASS (CODE_FLAGS + 0x72)
+
+#define FLAG_0x8D3 (CODE_FLAGS + 0x73)
+#define FLAG_0x8D4 (CODE_FLAGS + 0x74)
+#define FLAG_0x8D5 (CODE_FLAGS + 0x75)
+#define FLAG_0x8D6 (CODE_FLAGS + 0x76)
+
+#define FLAG_SYS_STORAGE_UNKNOWN_FLAG (CODE_FLAGS + 0x77)
+
+#define FLAG_0x8D8 (CODE_FLAGS + 0x78)
+#define FLAG_0x8D9 (CODE_FLAGS + 0x79)
+#define FLAG_0x8DA (CODE_FLAGS + 0x7A)
+
+#define FLAG_SYS_MYSTERY_GIFT_ENABLE (CODE_FLAGS + 0x7B)
+
+#define FLAG_0x8DC (CODE_FLAGS + 0x7C)
+#define FLAG_0x8DD (CODE_FLAGS + 0x7D)
+#define FLAG_0x8DE (CODE_FLAGS + 0x7E)
+#define FLAG_0x8DF (CODE_FLAGS + 0x7F)
+#define FLAG_0x8E0 (CODE_FLAGS + 0x80)
+#define FLAG_0x8E1 (CODE_FLAGS + 0x81)
+#define FLAG_0x8E2 (CODE_FLAGS + 0x82)
+#define FLAG_0x8E3 (CODE_FLAGS + 0x83)
+#define FLAG_0x8E4 (CODE_FLAGS + 0x84)
+#define FLAG_0x8E5 (CODE_FLAGS + 0x85)
+#define FLAG_0x8E6 (CODE_FLAGS + 0x86)
+#define FLAG_0x8E7 (CODE_FLAGS + 0x87)
+#define FLAG_0x8E8 (CODE_FLAGS + 0x88)
+#define FLAG_0x8E9 (CODE_FLAGS + 0x89)
+#define FLAG_0x8EA (CODE_FLAGS + 0x8A)
+#define FLAG_0x8EB (CODE_FLAGS + 0x8B)
+#define FLAG_0x8EC (CODE_FLAGS + 0x8C)
+#define FLAG_0x8ED (CODE_FLAGS + 0x8D)
+#define FLAG_0x8EE (CODE_FLAGS + 0x8E)
+#define FLAG_0x8EF (CODE_FLAGS + 0x8F)
+#define FLAG_0x8F0 (CODE_FLAGS + 0x90)
+#define FLAG_0x8F1 (CODE_FLAGS + 0x91)
+#define FLAG_0x8F2 (CODE_FLAGS + 0x92)
+#define FLAG_0x8F3 (CODE_FLAGS + 0x93)
+#define FLAG_0x8F4 (CODE_FLAGS + 0x94)
+#define FLAG_0x8F5 (CODE_FLAGS + 0x95)
+#define FLAG_0x8F6 (CODE_FLAGS + 0x96)
+#define FLAG_0x8F7 (CODE_FLAGS + 0x97)
+#define FLAG_0x8F8 (CODE_FLAGS + 0x98)
+#define FLAG_0x8F9 (CODE_FLAGS + 0x99)
+#define FLAG_0x8FA (CODE_FLAGS + 0x9A)
+#define FLAG_0x8FB (CODE_FLAGS + 0x9B)
+#define FLAG_0x8FC (CODE_FLAGS + 0x9C)
+#define FLAG_0x8FD (CODE_FLAGS + 0x9D)
+#define FLAG_0x8FE (CODE_FLAGS + 0x9E)
+#define FLAG_0x8FF (CODE_FLAGS + 0x9F)
+#define FLAG_0x900 (CODE_FLAGS + 0xA0)
+#define FLAG_0x901 (CODE_FLAGS + 0xA1)
+#define FLAG_0x902 (CODE_FLAGS + 0xA2)
+#define FLAG_0x903 (CODE_FLAGS + 0xA3)
+#define FLAG_0x904 (CODE_FLAGS + 0xA4)
+#define FLAG_0x905 (CODE_FLAGS + 0xA5)
+#define FLAG_0x906 (CODE_FLAGS + 0xA6)
+#define FLAG_0x907 (CODE_FLAGS + 0xA7)
+#define FLAG_0x908 (CODE_FLAGS + 0xA8)
+#define FLAG_0x909 (CODE_FLAGS + 0xA9)
+#define FLAG_0x90A (CODE_FLAGS + 0xAA)
+#define FLAG_0x90B (CODE_FLAGS + 0xAB)
+#define FLAG_0x90C (CODE_FLAGS + 0xAC)
+#define FLAG_0x90D (CODE_FLAGS + 0xAD)
+#define FLAG_0x90E (CODE_FLAGS + 0xAE)
+#define FLAG_0x90F (CODE_FLAGS + 0xAF)
+#define FLAG_0x910 (CODE_FLAGS + 0xB0)
+#define FLAG_0x911 (CODE_FLAGS + 0xB1)
+#define FLAG_0x912 (CODE_FLAGS + 0xB2)
+#define FLAG_0x913 (CODE_FLAGS + 0xB3)
+#define FLAG_0x914 (CODE_FLAGS + 0xB4)
+#define FLAG_0x915 (CODE_FLAGS + 0xB5)
+#define FLAG_0x916 (CODE_FLAGS + 0xB6)
+#define FLAG_0x917 (CODE_FLAGS + 0xB7)
+#define FLAG_0x918 (CODE_FLAGS + 0xB8)
+#define FLAG_0x919 (CODE_FLAGS + 0xB9)
+#define FLAG_0x91A (CODE_FLAGS + 0xBA)
+#define FLAG_0x91B (CODE_FLAGS + 0xBB)
+#define FLAG_0x91C (CODE_FLAGS + 0xBC)
+#define FLAG_0x91D (CODE_FLAGS + 0xBD)
+#define FLAG_0x91E (CODE_FLAGS + 0xBE)
+#define FLAG_0x91F (CODE_FLAGS + 0xBF)
+#define FLAG_0x920 (CODE_FLAGS + 0xC0)
+#define FLAG_0x921 (CODE_FLAGS + 0xC1)
+#define FLAG_0x922 (CODE_FLAGS + 0xC2)
+#define FLAG_0x923 (CODE_FLAGS + 0xC3)
+#define FLAG_0x924 (CODE_FLAGS + 0xC4)
+#define FLAG_0x925 (CODE_FLAGS + 0xC5)
+#define FLAG_0x926 (CODE_FLAGS + 0xC6)
+#define FLAG_0x927 (CODE_FLAGS + 0xC7)
+#define FLAG_0x928 (CODE_FLAGS + 0xC8)
+#define FLAG_0x929 (CODE_FLAGS + 0xC9)
+#define FLAG_0x92A (CODE_FLAGS + 0xCA)
+#define FLAG_0x92B (CODE_FLAGS + 0xCB)
+#define FLAG_0x92C (CODE_FLAGS + 0xCC)
+#define FLAG_0x92D (CODE_FLAGS + 0xCD)
+#define FLAG_0x92E (CODE_FLAGS + 0xCE)
+#define FLAG_0x92F (CODE_FLAGS + 0xCF)
+#define FLAG_0x930 (CODE_FLAGS + 0xD0)
+#define FLAG_0x931 (CODE_FLAGS + 0xD1)
+#define FLAG_0x932 (CODE_FLAGS + 0xD2)
+#define FLAG_0x933 (CODE_FLAGS + 0xD3)
+#define FLAG_0x934 (CODE_FLAGS + 0xD4)
+#define FLAG_0x935 (CODE_FLAGS + 0xD5)
+#define FLAG_0x936 (CODE_FLAGS + 0xD6)
+#define FLAG_0x937 (CODE_FLAGS + 0xD7)
+#define FLAG_0x938 (CODE_FLAGS + 0xD8)
+#define FLAG_0x939 (CODE_FLAGS + 0xD9)
+#define FLAG_0x93A (CODE_FLAGS + 0xDA)
+#define FLAG_0x93B (CODE_FLAGS + 0xDB)
+#define FLAG_0x93C (CODE_FLAGS + 0xDC)
+#define FLAG_0x93D (CODE_FLAGS + 0xDD)
+#define FLAG_0x93E (CODE_FLAGS + 0xDE)
+#define FLAG_0x93F (CODE_FLAGS + 0xDF)
+#define FLAG_0x940 (CODE_FLAGS + 0xE0)
+#define FLAG_0x941 (CODE_FLAGS + 0xE1)
+#define FLAG_0x942 (CODE_FLAGS + 0xE2)
+#define FLAG_0x943 (CODE_FLAGS + 0xE3)
+#define FLAG_0x944 (CODE_FLAGS + 0xE4)
+#define FLAG_0x945 (CODE_FLAGS + 0xE5)
+#define FLAG_0x946 (CODE_FLAGS + 0xE6)
+#define FLAG_0x947 (CODE_FLAGS + 0xE7)
+#define FLAG_0x948 (CODE_FLAGS + 0xE8)
+#define FLAG_0x949 (CODE_FLAGS + 0xE9)
+#define FLAG_0x94A (CODE_FLAGS + 0xEA)
+#define FLAG_0x94B (CODE_FLAGS + 0xEB)
+#define FLAG_0x94C (CODE_FLAGS + 0xEC)
+#define FLAG_0x94D (CODE_FLAGS + 0xED)
+#define FLAG_0x94E (CODE_FLAGS + 0xEE)
+#define FLAG_0x94F (CODE_FLAGS + 0xEF)
+#define FLAG_0x950 (CODE_FLAGS + 0xF0)
+#define FLAG_0x951 (CODE_FLAGS + 0xF1)
+#define FLAG_0x952 (CODE_FLAGS + 0xF2)
+#define FLAG_0x953 (CODE_FLAGS + 0xF3)
+#define FLAG_0x954 (CODE_FLAGS + 0xF4)
+#define FLAG_0x955 (CODE_FLAGS + 0xF5)
+#define FLAG_0x956 (CODE_FLAGS + 0xF6)
+#define FLAG_0x957 (CODE_FLAGS + 0xF7)
+#define FLAG_0x958 (CODE_FLAGS + 0xF8)
+#define FLAG_0x959 (CODE_FLAGS + 0xF9)
+#define FLAG_0x95A (CODE_FLAGS + 0xFA)
+#define FLAG_0x95B (CODE_FLAGS + 0xFB)
+#define FLAG_0x95C (CODE_FLAGS + 0xFC)
+#define FLAG_0x95D (CODE_FLAGS + 0xFD)
+#define FLAG_0x95E (CODE_FLAGS + 0xFE)
+#define FLAG_0x95F (CODE_FLAGS + 0xFF)
+
+// SPECIAL FLAGS (unknown purpose)
+#define FLAG_SPECIAL_FLAG_0x4000 0x4000
+#define FLAG_SPECIAL_FLAG_0x4001 0x4001
+#define FLAG_SPECIAL_FLAG_0x4002 0x4002
+#define FLAG_SPECIAL_FLAG_0x4003 0x4003
+#define FLAG_SPECIAL_FLAG_0x4004 0x4004
+
+#endif // GUARD_CONSTANTS_FLAGS_H
diff --git a/include/constants/game_stat.h b/include/constants/game_stat.h
new file mode 100644
index 000000000..b1f3d4197
--- /dev/null
+++ b/include/constants/game_stat.h
@@ -0,0 +1,59 @@
+#ifndef GUARD_CONSTANTS_GAME_STAT_H
+#define GUARD_CONSTANTS_GAME_STAT_H
+
+#define GAME_STAT_SAVED_GAME 0
+#define GAME_STAT_FIRST_HOF_PLAY_TIME 1
+#define GAME_STAT_STARTED_TRENDS 2
+#define GAME_STAT_PLANTED_BERRIES 3
+#define GAME_STAT_TRADED_BIKES 4
+#define GAME_STAT_STEPS 5
+#define GAME_STAT_GOT_INTERVIEWED 6
+#define GAME_STAT_TOTAL_BATTLES 7
+#define GAME_STAT_WILD_BATTLES 8
+#define GAME_STAT_TRAINER_BATTLES 9
+#define GAME_STAT_ENTERED_HOF 10
+#define GAME_STAT_POKEMON_CAPTURES 11
+#define GAME_STAT_FISHING_CAPTURES 12
+#define GAME_STAT_HATCHED_EGGS 13
+#define GAME_STAT_EVOLVED_POKEMON 14
+#define GAME_STAT_USED_POKECENTER 15
+#define GAME_STAT_RESTED_AT_HOME 16
+#define GAME_STAT_ENTERED_SAFARI_ZONE 17
+#define GAME_STAT_USED_CUT 18
+#define GAME_STAT_USED_ROCK_SMASH 19
+#define GAME_STAT_MOVED_SECRET_BASE 20
+#define GAME_STAT_POKEMON_TRADES 21
+#define GAME_STAT_UNKNOWN_22 22
+#define GAME_STAT_LINK_BATTLE_WINS 23
+#define GAME_STAT_LINK_BATTLE_LOSSES 24
+#define GAME_STAT_LINK_BATTLE_DRAWS 25
+#define GAME_STAT_USED_SPLASH 26
+#define GAME_STAT_USED_STRUGGLE 27
+#define GAME_STAT_SLOT_JACKPOTS 28
+#define GAME_STAT_CONSECUTIVE_ROULETTE_WINS 29
+#define GAME_STAT_ENTERED_BATTLE_TOWER 30
+#define GAME_STAT_UNKNOWN_31 31
+#define GAME_STAT_BATTLE_TOWER_BEST_STREAK 32
+#define GAME_STAT_POKEBLOCKS 33
+#define GAME_STAT_POKEBLOCKS_WITH_FRIENDS 34
+#define GAME_STAT_WON_LINK_CONTEST 35
+#define GAME_STAT_ENTERED_CONTEST 36
+#define GAME_STAT_WON_CONTEST 37
+#define GAME_STAT_SHOPPED 38
+#define GAME_STAT_USED_ITEMFINDER 39
+#define GAME_STAT_GOT_RAINED_ON 40
+#define GAME_STAT_CHECKED_POKEDEX 41
+#define GAME_STAT_RECEIVED_RIBBONS 42
+#define GAME_STAT_JUMPED_DOWN_LEDGES 43
+#define GAME_STAT_WATCHED_TV 44
+#define GAME_STAT_CHECKED_CLOCK 45
+#define GAME_STAT_WON_POKEMON_LOTTERY 46
+#define GAME_STAT_USED_DAYCARE 47
+#define GAME_STAT_RODE_CABLE_CAR 48
+#define GAME_STAT_ENTERED_HOT_SPRINGS 49
+
+/*TODO: add new stats added in Emerald*/
+
+#define NUM_GAME_STATS 64
+
+#endif // GUARD_CONSTANTS_GAME_STAT_H
diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h
new file mode 100644
index 000000000..b653f5a92
--- /dev/null
+++ b/include/constants/hold_effects.h
@@ -0,0 +1,72 @@
+#ifndef GUARD_HOLD_EFFECTS_H
+#define GUARD_HOLD_EFFECTS_H
+
+#define HOLD_EFFECT_NONE 0
+#define HOLD_EFFECT_RESTORE_HP 1
+#define HOLD_EFFECT_CURE_PAR 2
+#define HOLD_EFFECT_CURE_SLP 3
+#define HOLD_EFFECT_CURE_PSN 4
+#define HOLD_EFFECT_CURE_BRN 5
+#define HOLD_EFFECT_CURE_FRZ 6
+#define HOLD_EFFECT_RESTORE_PP 7
+#define HOLD_EFFECT_CURE_CONFUSION 8
+#define HOLD_EFFECT_CURE_STATUS 9
+#define HOLD_EFFECT_CONFUSE_SPICY 10
+#define HOLD_EFFECT_CONFUSE_DRY 11
+#define HOLD_EFFECT_CONFUSE_SWEET 12
+#define HOLD_EFFECT_CONFUSE_BITTER 13
+#define HOLD_EFFECT_CONFUSE_SOUR 14
+#define HOLD_EFFECT_ATTACK_UP 15
+#define HOLD_EFFECT_DEFENSE_UP 16
+#define HOLD_EFFECT_SPEED_UP 17
+#define HOLD_EFFECT_SP_ATTACK_UP 18
+#define HOLD_EFFECT_SP_DEFENSE_UP 19
+#define HOLD_EFFECT_CRITICAL_UP 20
+#define HOLD_EFFECT_RANDOM_STAT_UP 21
+#define HOLD_EFFECT_EVASION_UP 22
+#define HOLD_EFFECT_RESTORE_STATS 23
+#define HOLD_EFFECT_MACHO_BRACE 24
+#define HOLD_EFFECT_EXP_SHARE 25
+#define HOLD_EFFECT_QUICK_CLAW 26
+#define HOLD_EFFECT_HAPPINESS_UP 27
+#define HOLD_EFFECT_CURE_ATTRACT 28
+#define HOLD_EFFECT_CHOICE_BAND 29
+#define HOLD_EFFECT_FLINCH 30
+#define HOLD_EFFECT_BUG_POWER 31
+#define HOLD_EFFECT_DOUBLE_PRIZE 32
+#define HOLD_EFFECT_REPEL 33
+#define HOLD_EFFECT_SOUL_DEW 34
+#define HOLD_EFFECT_DEEP_SEA_TOOTH 35
+#define HOLD_EFFECT_DEEP_SEA_SCALE 36
+#define HOLD_EFFECT_CAN_ALWAYS_RUN 37
+#define HOLD_EFFECT_PREVENT_EVOLVE 38
+#define HOLD_EFFECT_FOCUS_BAND 39
+#define HOLD_EFFECT_LUCKY_EGG 40
+#define HOLD_EFFECT_SCOPE_LENS 41
+#define HOLD_EFFECT_STEEL_POWER 42
+#define HOLD_EFFECT_LEFTOVERS 43
+#define HOLD_EFFECT_DRAGON_SCALE 44
+#define HOLD_EFFECT_LIGHT_BALL 45
+#define HOLD_EFFECT_GROUND_POWER 46
+#define HOLD_EFFECT_ROCK_POWER 47
+#define HOLD_EFFECT_GRASS_POWER 48
+#define HOLD_EFFECT_DARK_POWER 49
+#define HOLD_EFFECT_FIGHTING_POWER 50
+#define HOLD_EFFECT_ELECTRIC_POWER 51
+#define HOLD_EFFECT_WATER_POWER 52
+#define HOLD_EFFECT_FLYING_POWER 53
+#define HOLD_EFFECT_POISON_POWER 54
+#define HOLD_EFFECT_ICE_POWER 55
+#define HOLD_EFFECT_GHOST_POWER 56
+#define HOLD_EFFECT_PSYCHIC_POWER 57
+#define HOLD_EFFECT_FIRE_POWER 58
+#define HOLD_EFFECT_DRAGON_POWER 59
+#define HOLD_EFFECT_NORMAL_POWER 60
+#define HOLD_EFFECT_UP_GRADE 61
+#define HOLD_EFFECT_SHELL_BELL 62
+#define HOLD_EFFECT_LUCKY_PUNCH 63
+#define HOLD_EFFECT_METAL_POWDER 64
+#define HOLD_EFFECT_THICK_CLUB 65
+#define HOLD_EFFECT_STICK 66
+
+#endif // GUARD_HOLD_EFFECTS_H
diff --git a/include/constants/items.h b/include/constants/items.h
new file mode 100644
index 000000000..6135b8d6f
--- /dev/null
+++ b/include/constants/items.h
@@ -0,0 +1,393 @@
+#ifndef GUARD_CONSTANTS_ITEMS_H
+#define GUARD_CONSTANTS_ITEMS_H
+
+#define ITEM_NONE 0
+#define ITEM_MASTER_BALL 1
+#define ITEM_ULTRA_BALL 2
+#define ITEM_GREAT_BALL 3
+#define ITEM_POKE_BALL 4
+#define ITEM_SAFARI_BALL 5
+#define ITEM_NET_BALL 6
+#define ITEM_DIVE_BALL 7
+#define ITEM_NEST_BALL 8
+#define ITEM_REPEAT_BALL 9
+#define ITEM_TIMER_BALL 10
+#define ITEM_LUXURY_BALL 11
+#define ITEM_PREMIER_BALL 12
+#define ITEM_POTION 13
+#define ITEM_ANTIDOTE 14
+#define ITEM_BURN_HEAL 15
+#define ITEM_ICE_HEAL 16
+#define ITEM_AWAKENING 17
+#define ITEM_PARALYZE_HEAL 18
+#define ITEM_FULL_RESTORE 19
+#define ITEM_MAX_POTION 20
+#define ITEM_HYPER_POTION 21
+#define ITEM_SUPER_POTION 22
+#define ITEM_FULL_HEAL 23
+#define ITEM_REVIVE 24
+#define ITEM_MAX_REVIVE 25
+#define ITEM_FRESH_WATER 26
+#define ITEM_SODA_POP 27
+#define ITEM_LEMONADE 28
+#define ITEM_MOOMOO_MILK 29
+#define ITEM_ENERGY_POWDER 30
+#define ITEM_ENERGY_ROOT 31
+#define ITEM_HEAL_POWDER 32
+#define ITEM_REVIVAL_HERB 33
+#define ITEM_ETHER 34
+#define ITEM_MAX_ETHER 35
+#define ITEM_ELIXIR 36
+#define ITEM_MAX_ELIXIR 37
+#define ITEM_LAVA_COOKIE 38
+#define ITEM_BLUE_FLUTE 39
+#define ITEM_YELLOW_FLUTE 40
+#define ITEM_RED_FLUTE 41
+#define ITEM_BLACK_FLUTE 42
+#define ITEM_WHITE_FLUTE 43
+#define ITEM_BERRY_JUICE 44
+#define ITEM_SACRED_ASH 45
+#define ITEM_SHOAL_SALT 46
+#define ITEM_SHOAL_SHELL 47
+#define ITEM_RED_SHARD 48
+#define ITEM_BLUE_SHARD 49
+#define ITEM_YELLOW_SHARD 50
+#define ITEM_GREEN_SHARD 51
+#define ITEM_034 52
+#define ITEM_035 53
+#define ITEM_036 54
+#define ITEM_037 55
+#define ITEM_038 56
+#define ITEM_039 57
+#define ITEM_03A 58
+#define ITEM_03B 59
+#define ITEM_03C 60
+#define ITEM_03D 61
+#define ITEM_03E 62
+#define ITEM_HP_UP 63
+#define ITEM_PROTEIN 64
+#define ITEM_IRON 65
+#define ITEM_CARBOS 66
+#define ITEM_CALCIUM 67
+#define ITEM_RARE_CANDY 68
+#define ITEM_PP_UP 69
+#define ITEM_ZINC 70
+#define ITEM_PP_MAX 71
+#define ITEM_048 72
+#define ITEM_GUARD_SPEC 73
+#define ITEM_DIRE_HIT 74
+#define ITEM_X_ATTACK 75
+#define ITEM_X_DEFEND 76
+#define ITEM_X_SPEED 77
+#define ITEM_X_ACCURACY 78
+#define ITEM_X_SPECIAL 79
+#define ITEM_POKE_DOLL 80
+#define ITEM_FLUFFY_TAIL 81
+#define ITEM_052 82
+#define ITEM_SUPER_REPEL 83
+#define ITEM_MAX_REPEL 84
+#define ITEM_ESCAPE_ROPE 85
+#define ITEM_REPEL 86
+#define ITEM_057 87
+#define ITEM_058 88
+#define ITEM_059 89
+#define ITEM_05A 90
+#define ITEM_05B 91
+#define ITEM_05C 92
+#define ITEM_SUN_STONE 93
+#define ITEM_MOON_STONE 94
+#define ITEM_FIRE_STONE 95
+#define ITEM_THUNDER_STONE 96
+#define ITEM_WATER_STONE 97
+#define ITEM_LEAF_STONE 98
+#define ITEM_063 99
+#define ITEM_064 100
+#define ITEM_065 101
+#define ITEM_066 102
+#define ITEM_TINY_MUSHROOM 103
+#define ITEM_BIG_MUSHROOM 104
+#define ITEM_069 105
+#define ITEM_PEARL 106
+#define ITEM_BIG_PEARL 107
+#define ITEM_STARDUST 108
+#define ITEM_STAR_PIECE 109
+#define ITEM_NUGGET 110
+#define ITEM_HEART_SCALE 111
+#define ITEM_070 112
+#define ITEM_071 113
+#define ITEM_072 114
+#define ITEM_073 115
+#define ITEM_074 116
+#define ITEM_075 117
+#define ITEM_076 118
+#define ITEM_077 119
+#define ITEM_078 120
+#define ITEM_ORANGE_MAIL 121
+#define ITEM_HARBOR_MAIL 122
+#define ITEM_GLITTER_MAIL 123
+#define ITEM_MECH_MAIL 124
+#define ITEM_WOOD_MAIL 125
+#define ITEM_WAVE_MAIL 126
+#define ITEM_BEAD_MAIL 127
+#define ITEM_SHADOW_MAIL 128
+#define ITEM_TROPIC_MAIL 129
+#define ITEM_DREAM_MAIL 130
+#define ITEM_FAB_MAIL 131
+#define ITEM_RETRO_MAIL 132
+#define ITEM_CHERI_BERRY 133
+#define ITEM_CHESTO_BERRY 134
+#define ITEM_PECHA_BERRY 135
+#define ITEM_RAWST_BERRY 136
+#define ITEM_ASPEAR_BERRY 137
+#define ITEM_LEPPA_BERRY 138
+#define ITEM_ORAN_BERRY 139
+#define ITEM_PERSIM_BERRY 140
+#define ITEM_LUM_BERRY 141
+#define ITEM_SITRUS_BERRY 142
+#define ITEM_FIGY_BERRY 143
+#define ITEM_WIKI_BERRY 144
+#define ITEM_MAGO_BERRY 145
+#define ITEM_AGUAV_BERRY 146
+#define ITEM_IAPAPA_BERRY 147
+#define ITEM_RAZZ_BERRY 148
+#define ITEM_BLUK_BERRY 149
+#define ITEM_NANAB_BERRY 150
+#define ITEM_WEPEAR_BERRY 151
+#define ITEM_PINAP_BERRY 152
+#define ITEM_POMEG_BERRY 153
+#define ITEM_KELPSY_BERRY 154
+#define ITEM_QUALOT_BERRY 155
+#define ITEM_HONDEW_BERRY 156
+#define ITEM_GREPA_BERRY 157
+#define ITEM_TAMATO_BERRY 158
+#define ITEM_CORNN_BERRY 159
+#define ITEM_MAGOST_BERRY 160
+#define ITEM_RABUTA_BERRY 161
+#define ITEM_NOMEL_BERRY 162
+#define ITEM_SPELON_BERRY 163
+#define ITEM_PAMTRE_BERRY 164
+#define ITEM_WATMEL_BERRY 165
+#define ITEM_DURIN_BERRY 166
+#define ITEM_BELUE_BERRY 167
+#define ITEM_LIECHI_BERRY 168
+#define ITEM_GANLON_BERRY 169
+#define ITEM_SALAC_BERRY 170
+#define ITEM_PETAYA_BERRY 171
+#define ITEM_APICOT_BERRY 172
+#define ITEM_LANSAT_BERRY 173
+#define ITEM_STARF_BERRY 174
+#define ITEM_ENIGMA_BERRY 175
+#define ITEM_0B0 176
+#define ITEM_0B1 177
+#define ITEM_0B2 178
+#define ITEM_BRIGHT_POWDER 179
+#define ITEM_WHITE_HERB 180
+#define ITEM_MACHO_BRACE 181
+#define ITEM_EXP_SHARE 182
+#define ITEM_QUICK_CLAW 183
+#define ITEM_SOOTHE_BELL 184
+#define ITEM_MENTAL_HERB 185
+#define ITEM_CHOICE_BAND 186
+#define ITEM_KINGS_ROCK 187
+#define ITEM_SILVER_POWDER 188
+#define ITEM_AMULET_COIN 189
+#define ITEM_CLEANSE_TAG 190
+#define ITEM_SOUL_DEW 191
+#define ITEM_DEEP_SEA_TOOTH 192
+#define ITEM_DEEP_SEA_SCALE 193
+#define ITEM_SMOKE_BALL 194
+#define ITEM_EVERSTONE 195
+#define ITEM_FOCUS_BAND 196
+#define ITEM_LUCKY_EGG 197
+#define ITEM_SCOPE_LENS 198
+#define ITEM_METAL_COAT 199
+#define ITEM_LEFTOVERS 200
+#define ITEM_DRAGON_SCALE 201
+#define ITEM_LIGHT_BALL 202
+#define ITEM_SOFT_SAND 203
+#define ITEM_HARD_STONE 204
+#define ITEM_MIRACLE_SEED 205
+#define ITEM_BLACK_GLASSES 206
+#define ITEM_BLACK_BELT 207
+#define ITEM_MAGNET 208
+#define ITEM_MYSTIC_WATER 209
+#define ITEM_SHARP_BEAK 210
+#define ITEM_POISON_BARB 211
+#define ITEM_NEVER_MELT_ICE 212
+#define ITEM_SPELL_TAG 213
+#define ITEM_TWISTED_SPOON 214
+#define ITEM_CHARCOAL 215
+#define ITEM_DRAGON_FANG 216
+#define ITEM_SILK_SCARF 217
+#define ITEM_UP_GRADE 218
+#define ITEM_SHELL_BELL 219
+#define ITEM_SEA_INCENSE 220
+#define ITEM_LAX_INCENSE 221
+#define ITEM_LUCKY_PUNCH 222
+#define ITEM_METAL_POWDER 223
+#define ITEM_THICK_CLUB 224
+#define ITEM_STICK 225
+#define ITEM_0E2 226
+#define ITEM_0E3 227
+#define ITEM_0E4 228
+#define ITEM_0E5 229
+#define ITEM_0E6 230
+#define ITEM_0E7 231
+#define ITEM_0E8 232
+#define ITEM_0E9 233
+#define ITEM_0EA 234
+#define ITEM_0EB 235
+#define ITEM_0EC 236
+#define ITEM_0ED 237
+#define ITEM_0EE 238
+#define ITEM_0EF 239
+#define ITEM_0F0 240
+#define ITEM_0F1 241
+#define ITEM_0F2 242
+#define ITEM_0F3 243
+#define ITEM_0F4 244
+#define ITEM_0F5 245
+#define ITEM_0F6 246
+#define ITEM_0F7 247
+#define ITEM_0F8 248
+#define ITEM_0F9 249
+#define ITEM_0FA 250
+#define ITEM_0FB 251
+#define ITEM_0FC 252
+#define ITEM_0FD 253
+#define ITEM_RED_SCARF 254
+#define ITEM_BLUE_SCARF 255
+#define ITEM_PINK_SCARF 256
+#define ITEM_GREEN_SCARF 257
+#define ITEM_YELLOW_SCARF 258
+#define ITEM_MACH_BIKE 259
+#define ITEM_COIN_CASE 260
+#define ITEM_ITEMFINDER 261
+#define ITEM_OLD_ROD 262
+#define ITEM_GOOD_ROD 263
+#define ITEM_SUPER_ROD 264
+#define ITEM_SS_TICKET 265
+#define ITEM_CONTEST_PASS 266
+#define ITEM_10B 267
+#define ITEM_WAILMER_PAIL 268
+#define ITEM_DEVON_GOODS 269
+#define ITEM_SOOT_SACK 270
+#define ITEM_BASEMENT_KEY 271
+#define ITEM_ACRO_BIKE 272
+#define ITEM_POKEBLOCK_CASE 273
+#define ITEM_LETTER 274
+#define ITEM_EON_TICKET 275
+#define ITEM_RED_ORB 276
+#define ITEM_BLUE_ORB 277
+#define ITEM_SCANNER 278
+#define ITEM_GO_GOGGLES 279
+#define ITEM_METEORITE 280
+#define ITEM_ROOM_1_KEY 281
+#define ITEM_ROOM_2_KEY 282
+#define ITEM_ROOM_4_KEY 283
+#define ITEM_ROOM_6_KEY 284
+#define ITEM_STORAGE_KEY 285
+#define ITEM_ROOT_FOSSIL 286
+#define ITEM_CLAW_FOSSIL 287
+#define ITEM_DEVON_SCOPE 288
+#define ITEM_TM01 289
+#define ITEM_TM02 290
+#define ITEM_TM03 291
+#define ITEM_TM04 292
+#define ITEM_TM05 293
+#define ITEM_TM06 294
+#define ITEM_TM07 295
+#define ITEM_TM08 296
+#define ITEM_TM09 297
+#define ITEM_TM10 298
+#define ITEM_TM11 299
+#define ITEM_TM12 300
+#define ITEM_TM13 301
+#define ITEM_TM14 302
+#define ITEM_TM15 303
+#define ITEM_TM16 304
+#define ITEM_TM17 305
+#define ITEM_TM18 306
+#define ITEM_TM19 307
+#define ITEM_TM20 308
+#define ITEM_TM21 309
+#define ITEM_TM22 310
+#define ITEM_TM23 311
+#define ITEM_TM24 312
+#define ITEM_TM25 313
+#define ITEM_TM26 314
+#define ITEM_TM27 315
+#define ITEM_TM28 316
+#define ITEM_TM29 317
+#define ITEM_TM30 318
+#define ITEM_TM31 319
+#define ITEM_TM32 320
+#define ITEM_TM33 321
+#define ITEM_TM34 322
+#define ITEM_TM35 323
+#define ITEM_TM36 324
+#define ITEM_TM37 325
+#define ITEM_TM38 326
+#define ITEM_TM39 327
+#define ITEM_TM40 328
+#define ITEM_TM41 329
+#define ITEM_TM42 330
+#define ITEM_TM43 331
+#define ITEM_TM44 332
+#define ITEM_TM45 333
+#define ITEM_TM46 334
+#define ITEM_TM47 335
+#define ITEM_TM48 336
+#define ITEM_TM49 337
+#define ITEM_TM50 338
+#define ITEM_HM01 339
+#define ITEM_HM02 340
+#define ITEM_HM03 341
+#define ITEM_HM04 342
+#define ITEM_HM05 343
+#define ITEM_HM06 344
+#define ITEM_HM07 345
+#define ITEM_HM08 346
+#define ITEM_15B 347
+#define ITEM_15C 348
+
+// FireRed/LeafGreen
+#define ITEM_OAKS_PARCEL 349
+#define ITEM_POKE_FLUTE 350
+#define ITEM_SECRET_KEY 351
+#define ITEM_BIKE_VOUCHER 352
+#define ITEM_GOLD_TEETH 353
+#define ITEM_OLD_AMBER 354
+#define ITEM_CARD_KEY 355
+#define ITEM_LIFT_KEY 356
+#define ITEM_HELIX_FOSSIL 357
+#define ITEM_DOME_FOSSIL 358
+#define ITEM_SILPH_SCOPE 359
+#define ITEM_BICYCLE 360
+#define ITEM_TOWN_MAP 361
+#define ITEM_VS_SEEKER 362
+#define ITEM_FAME_CHECKER 363
+#define ITEM_TM_CASE 364
+#define ITEM_BERRY_POUCH 365
+#define ITEM_TEACHY_TV 366
+#define ITEM_TRI_PASS 367
+#define ITEM_RAINBOW_PASS 368
+#define ITEM_TEA 369
+#define ITEM_MYSTIC_TICKET 370
+#define ITEM_AURORA_TICKET 371
+#define ITEM_POWDER_JAR 372
+#define ITEM_RUBY 373
+#define ITEM_SAPPHIRE 374
+
+// Emerald
+#define ITEM_MAGMA_EMBLEM 375
+#define ITEM_OLD_SEA_MAP 376
+
+#define FIRST_BERRY_INDEX ITEM_CHERI_BERRY
+#define LAST_BERRY_INDEX ITEM_ENIGMA_BERRY
+#define ITEM_TO_BERRY(itemId)(((itemId - FIRST_BERRY_INDEX) + 1))
+
+#define NUM_TECHNICAL_MACHINES 50
+#define NUM_HIDDEN_MACHINES 8
+
+#endif // GUARD_CONSTANTS_ITEMS_H
diff --git a/include/constants/map_objects.h b/include/constants/map_objects.h
new file mode 100644
index 000000000..d5b983005
--- /dev/null
+++ b/include/constants/map_objects.h
@@ -0,0 +1,263 @@
+#ifndef GUARD_CONSTANTS_MAP_OBJECTS_H
+#define GUARD_CONSTANTS_MAP_OBJECTS_H
+
+#define MAP_OBJ_GFX_BRENDAN_NORMAL 0
+#define MAP_OBJ_GFX_BRENDAN_MACH_BIKE 1
+#define MAP_OBJ_GFX_BRENDAN_SURFING 2
+#define MAP_OBJ_GFX_BRENDAN_FIELD_MOVE 3
+#define MAP_OBJ_GFX_QUINTY_PLUMP 4
+#define MAP_OBJ_GFX_LITTLE_BOY_1 5
+#define MAP_OBJ_GFX_LITTLE_GIRL_1 6
+#define MAP_OBJ_GFX_BOY_1 7
+#define MAP_OBJ_GFX_GIRL_1 8
+#define MAP_OBJ_GFX_BOY_2 9
+#define MAP_OBJ_GFX_GIRL_2 10
+#define MAP_OBJ_GFX_LITTLE_BOY_2 11
+#define MAP_OBJ_GFX_LITTLE_GIRL_2 12
+#define MAP_OBJ_GFX_BOY_3 13
+#define MAP_OBJ_GFX_GIRL_3 14
+#define MAP_OBJ_GFX_BOY_4 15
+#define MAP_OBJ_GFX_WOMAN_1 16
+#define MAP_OBJ_GFX_FAT_MAN 17
+#define MAP_OBJ_GFX_WOMAN_2 18
+#define MAP_OBJ_GFX_MAN_1 19
+#define MAP_OBJ_GFX_WOMAN_3 20
+#define MAP_OBJ_GFX_OLD_MAN_1 21
+#define MAP_OBJ_GFX_OLD_WOMAN_1 22
+#define MAP_OBJ_GFX_MAN_2 23
+#define MAP_OBJ_GFX_WOMAN_4 24
+#define MAP_OBJ_GFX_MAN_3 25
+#define MAP_OBJ_GFX_WOMAN_5 26
+#define MAP_OBJ_GFX_COOK 27
+#define MAP_OBJ_GFX_WOMAN_6 28
+#define MAP_OBJ_GFX_OLD_MAN_2 29
+#define MAP_OBJ_GFX_OLD_WOMAN_2 30
+#define MAP_OBJ_GFX_CAMPER 31
+#define MAP_OBJ_GFX_PICNICKER 32
+#define MAP_OBJ_GFX_MAN_4 33
+#define MAP_OBJ_GFX_WOMAN_7 34
+#define MAP_OBJ_GFX_YOUNGSTER 35
+#define MAP_OBJ_GFX_BUG_CATCHER 36
+#define MAP_OBJ_GFX_PSYCHIC_M 37
+#define MAP_OBJ_GFX_SCHOOL_KID_M 38
+#define MAP_OBJ_GFX_MANIAC 39
+#define MAP_OBJ_GFX_HEX_MANIAC 40
+#define MAP_OBJ_GFX_RAYQUAZA_1 41
+#define MAP_OBJ_GFX_SWIMMER_M 42
+#define MAP_OBJ_GFX_SWIMMER_F 43
+#define MAP_OBJ_GFX_BLACK_BELT 44
+#define MAP_OBJ_GFX_BEAUTY 45
+#define MAP_OBJ_GFX_SCIENTIST_1 46
+#define MAP_OBJ_GFX_LASS 47
+#define MAP_OBJ_GFX_GENTLEMAN 48
+#define MAP_OBJ_GFX_SAILOR 49
+#define MAP_OBJ_GFX_FISHERMAN 50
+#define MAP_OBJ_GFX_RUNNING_TRIATHLETE_M 51
+#define MAP_OBJ_GFX_RUNNING_TRIATHLETE_F 52
+#define MAP_OBJ_GFX_TUBER_F 53
+#define MAP_OBJ_GFX_TUBER_M 54
+#define MAP_OBJ_GFX_HIKER 55
+#define MAP_OBJ_GFX_CYCLING_TRIATHLETE_M 56
+#define MAP_OBJ_GFX_CYCLING_TRIATHLETE_F 57
+#define MAP_OBJ_GFX_NURSE 58
+#define MAP_OBJ_GFX_ITEM_BALL 59
+#define MAP_OBJ_GFX_BERRY_TREE 60
+#define MAP_OBJ_GFX_BERRY_TREE_EARLY_STAGES 61
+#define MAP_OBJ_GFX_BERRY_TREE_LATE_STAGES 62
+#define MAP_OBJ_GFX_BRENDAN_ACRO_BIKE 63
+#define MAP_OBJ_GFX_PROF_BIRCH 64
+#define MAP_OBJ_GFX_MAN_5 65
+#define MAP_OBJ_GFX_MAN_6 66
+#define MAP_OBJ_GFX_REPORTER_M 67
+#define MAP_OBJ_GFX_REPORTER_F 68
+#define MAP_OBJ_GFX_BARD 69
+#define MAP_OBJ_GFX_ANABEL 70
+#define MAP_OBJ_GFX_TUCKER 71
+#define MAP_OBJ_GFX_GRETA 72
+#define MAP_OBJ_GFX_SPENSER 73
+#define MAP_OBJ_GFX_NOLAND 74
+#define MAP_OBJ_GFX_LUCY 75
+#define MAP_OBJ_GFX_UNUSED_NATU_DOLL 76
+#define MAP_OBJ_GFX_UNUSED_MAGNEMITE_DOLL 77
+#define MAP_OBJ_GFX_UNUSED_SQUIRTLE_DOLL 78
+#define MAP_OBJ_GFX_UNUSED_WOOPER_DOLL 79
+#define MAP_OBJ_GFX_UNUSED_PIKACHU_DOLL 80
+#define MAP_OBJ_GFX_UNUSED_PORYGON2_DOLL 81
+#define MAP_OBJ_GFX_CUTTABLE_TREE 82
+#define MAP_OBJ_GFX_MART_EMPLOYEE 83
+#define MAP_OBJ_GFX_ROOFTOP_SALE_WOMAN 84
+#define MAP_OBJ_GFX_TEALA 85
+#define MAP_OBJ_GFX_BREAKABLE_ROCK 86
+#define MAP_OBJ_GFX_PUSHABLE_BOULDER 87
+#define MAP_OBJ_GFX_MR_BRINEYS_BOAT 88
+#define MAP_OBJ_GFX_MAY_NORMAL 89
+#define MAP_OBJ_GFX_MAY_MACH_BIKE 90
+#define MAP_OBJ_GFX_MAY_ACRO_BIKE 91
+#define MAP_OBJ_GFX_MAY_SURFING 92
+#define MAP_OBJ_GFX_MAY_FIELD_MOVE 93
+#define MAP_OBJ_GFX_TRUCK 94
+#define MAP_OBJ_GFX_VIGAROTH_CARRYING_BOX 95
+#define MAP_OBJ_GFX_VIGAROTH_FACING_AWAY 96
+#define MAP_OBJ_GFX_BIRCHS_BAG 97
+#define MAP_OBJ_GFX_ZIGZAGOON_1 98
+#define MAP_OBJ_GFX_ARTIST 99
+#define MAP_OBJ_GFX_RIVAL_BRENDAN_NORMAL 100
+#define MAP_OBJ_GFX_RIVAL_BRENDAN_MACH_BIKE 101
+#define MAP_OBJ_GFX_RIVAL_BRENDAN_ACRO_BIKE 102
+#define MAP_OBJ_GFX_RIVAL_BRENDAN_SURFING 103
+#define MAP_OBJ_GFX_RIVAL_BRENDAN_FIELD_MOVE 104
+#define MAP_OBJ_GFX_RIVAL_MAY_NORMAL 105
+#define MAP_OBJ_GFX_RIVAL_MAY_MACH_BIKE 106
+#define MAP_OBJ_GFX_RIVAL_MAY_ACRO_BIKE 107
+#define MAP_OBJ_GFX_RIVAL_MAY_SURFING 108
+#define MAP_OBJ_GFX_RIVAL_MAY_FIELD_MOVE 109
+#define MAP_OBJ_GFX_CAMERAMAN 110
+#define MAP_OBJ_GFX_BRENDAN_UNDERWATER 111
+#define MAP_OBJ_GFX_MAY_UNDERWATER 112
+#define MAP_OBJ_GFX_MOVING_BOX 113
+#define MAP_OBJ_GFX_CABLE_CAR 114
+#define MAP_OBJ_GFX_SCIENTIST_2 115
+#define MAP_OBJ_GFX_MAN_7 116
+#define MAP_OBJ_GFX_AQUA_MEMBER_M 117
+#define MAP_OBJ_GFX_AQUA_MEMBER_F 118
+#define MAP_OBJ_GFX_MAGMA_MEMBER_M 119
+#define MAP_OBJ_GFX_MAGMA_MEMBER_F 120
+#define MAP_OBJ_GFX_SIDNEY 121
+#define MAP_OBJ_GFX_PHOEBE 122
+#define MAP_OBJ_GFX_GLACIA 123
+#define MAP_OBJ_GFX_DRAKE 124
+#define MAP_OBJ_GFX_ROXANNE 125
+#define MAP_OBJ_GFX_BRAWLY 126
+#define MAP_OBJ_GFX_WATTSON 127
+#define MAP_OBJ_GFX_FLANNERY 128
+#define MAP_OBJ_GFX_NORMAN 129
+#define MAP_OBJ_GFX_WINONA 130
+#define MAP_OBJ_GFX_LIZA 131
+#define MAP_OBJ_GFX_TATE 132
+#define MAP_OBJ_GFX_WALLACE 133
+#define MAP_OBJ_GFX_STEVEN 134
+#define MAP_OBJ_GFX_WALLY 135
+#define MAP_OBJ_GFX_LITTLE_BOY_3 136
+#define MAP_OBJ_GFX_BRENDAN_FISHING 137
+#define MAP_OBJ_GFX_MAY_FISHING 138
+#define MAP_OBJ_GFX_HOT_SPRINGS_OLD_WOMAN 139
+#define MAP_OBJ_GFX_SS_TIDAL 140
+#define MAP_OBJ_GFX_SUBMARINE_SHADOW 141
+#define MAP_OBJ_GFX_PICHU_DOLL 142
+#define MAP_OBJ_GFX_PIKACHU_DOLL 143
+#define MAP_OBJ_GFX_MARILL_DOLL 144
+#define MAP_OBJ_GFX_TOGEPI_DOLL 145
+#define MAP_OBJ_GFX_CYNDAQUIL_DOLL 146
+#define MAP_OBJ_GFX_CHIKORITA_DOLL 147
+#define MAP_OBJ_GFX_TOTODILE_DOLL 148
+#define MAP_OBJ_GFX_JIGGLYPUFF_DOLL 149
+#define MAP_OBJ_GFX_MEOWTH_DOLL 150
+#define MAP_OBJ_GFX_CLEFAIRY_DOLL 151
+#define MAP_OBJ_GFX_DITTO_DOLL 152
+#define MAP_OBJ_GFX_SMOOCHUM_DOLL 153
+#define MAP_OBJ_GFX_TREECKO_DOLL 154
+#define MAP_OBJ_GFX_TORCHIC_DOLL 155
+#define MAP_OBJ_GFX_MUDKIP_DOLL 156
+#define MAP_OBJ_GFX_DUSKULL_DOLL 157
+#define MAP_OBJ_GFX_WYNAUT_DOLL 158
+#define MAP_OBJ_GFX_BALTOY_DOLL 159
+#define MAP_OBJ_GFX_KECLEON_DOLL 160
+#define MAP_OBJ_GFX_AZURILL_DOLL 161
+#define MAP_OBJ_GFX_SKITTY_DOLL 162
+#define MAP_OBJ_GFX_SWABLU_DOLL 163
+#define MAP_OBJ_GFX_GULPIN_DOLL 164
+#define MAP_OBJ_GFX_LOTAD_DOLL 165
+#define MAP_OBJ_GFX_SEEDOT_DOLL 166
+#define MAP_OBJ_GFX_PIKA_CUSHION 167
+#define MAP_OBJ_GFX_ROUND_CUSHION 168
+#define MAP_OBJ_GFX_KISS_CUSHION 169
+#define MAP_OBJ_GFX_ZIGZAG_CUSHION 170
+#define MAP_OBJ_GFX_SPIN_CUSHION 171
+#define MAP_OBJ_GFX_DIAMOND_CUSHION 172
+#define MAP_OBJ_GFX_BALL_CUSHION 173
+#define MAP_OBJ_GFX_GRASS_CUSHION 174
+#define MAP_OBJ_GFX_FIRE_CUSHION 175
+#define MAP_OBJ_GFX_WATER_CUSHION 176
+#define MAP_OBJ_GFX_BIG_SNORLAX_DOLL 177
+#define MAP_OBJ_GFX_BIG_RHYDON_DOLL 178
+#define MAP_OBJ_GFX_BIG_LAPRAS_DOLL 179
+#define MAP_OBJ_GFX_BIG_VENUSAUR_DOLL 180
+#define MAP_OBJ_GFX_BIG_CHARIZARD_DOLL 181
+#define MAP_OBJ_GFX_BIG_BLASTOISE_DOLL 182
+#define MAP_OBJ_GFX_BIG_WAILMER_DOLL 183
+#define MAP_OBJ_GFX_BIG_REGIROCK_DOLL 184
+#define MAP_OBJ_GFX_BIG_REGICE_DOLL 185
+#define MAP_OBJ_GFX_BIG_REGISTEEL_DOLL 186
+#define MAP_OBJ_GFX_LATIAS 187
+#define MAP_OBJ_GFX_LATIOS 188
+#define MAP_OBJ_GFX_BOY_5 189
+#define MAP_OBJ_GFX_CONTEST_JUDGE 190
+#define MAP_OBJ_GFX_BRENDAN_WATERING 191
+#define MAP_OBJ_GFX_MAY_WATERING 192
+#define MAP_OBJ_GFX_BRENDAN_DECORATING 193
+#define MAP_OBJ_GFX_MAY_DECORATING 194
+#define MAP_OBJ_GFX_ARCHIE 195
+#define MAP_OBJ_GFX_MAXIE 196
+#define MAP_OBJ_GFX_KYOGRE_1 197
+#define MAP_OBJ_GFX_GROUDON_1 198
+#define MAP_OBJ_GFX_FOSSIL 199
+#define MAP_OBJ_GFX_REGIROCK 200
+#define MAP_OBJ_GFX_REGICE 201
+#define MAP_OBJ_GFX_REGISTEEL 202
+#define MAP_OBJ_GFX_SKITTY 203
+#define MAP_OBJ_GFX_KECLEON_1 204
+#define MAP_OBJ_GFX_KYOGRE_2 205
+#define MAP_OBJ_GFX_GROUDON_2 206
+#define MAP_OBJ_GFX_RAYQUAZA_2 207
+#define MAP_OBJ_GFX_ZIGZAGOON_2 208
+#define MAP_OBJ_GFX_PIKACHU 209
+#define MAP_OBJ_GFX_AZUMARILL 210
+#define MAP_OBJ_GFX_WINGULL 211
+#define MAP_OBJ_GFX_KECLEON_2 212
+#define MAP_OBJ_GFX_TUBER_M_SWIMMING 213
+#define MAP_OBJ_GFX_AZURILL 214
+#define MAP_OBJ_GFX_MOM 215
+#define MAP_OBJ_GFX_LINK_BRENDAN 216
+#define MAP_OBJ_GFX_LINK_MAY 217
+#define MAP_OBJ_GFX_JUAN 218
+#define MAP_OBJ_GFX_SCOTT 219
+#define MAP_OBJ_GFX_POOCHYENA 220
+#define MAP_OBJ_GFX_KYOGRE_3 221
+#define MAP_OBJ_GFX_GROUDON_3 222
+#define MAP_OBJ_GFX_MYSTERY_GIFT_MAN 223
+#define MAP_OBJ_GFX_TRICK_HOUSE_STATUE 224
+#define MAP_OBJ_GFX_KIRLIA 225
+#define MAP_OBJ_GFX_DUSCLOPS 226
+#define MAP_OBJ_GFX_UNION_ROOM_NURSE 227
+#define MAP_OBJ_GFX_SUDOWOODO 228
+#define MAP_OBJ_GFX_MEW 229
+#define MAP_OBJ_GFX_RED 230
+#define MAP_OBJ_GFX_LEAF 231
+#define MAP_OBJ_GFX_DEOXYS 232
+#define MAP_OBJ_GFX_DEOXYS_TRIANGLE 233
+#define MAP_OBJ_GFX_BRANDON 234
+#define MAP_OBJ_GFX_LINK_RS_BRENDAN 235
+#define MAP_OBJ_GFX_LINK_RS_MAY 236
+#define MAP_OBJ_GFX_LUGIA 237
+#define MAP_OBJ_GFX_HOOH 238
+#define MAP_OBJ_GFX_BARD_2 239
+#define MAP_OBJ_GFX_HIPSTER 240
+#define MAP_OBJ_GFX_TRADER 241
+#define MAP_OBJ_GFX_STORYTELLER 242
+#define MAP_OBJ_GFX_GIDDY 243
+#define MAP_OBJ_GFX_PLACEHOLDER_1 244
+#define MAP_OBJ_GFX_PLACEHOLDER_2 245
+
+#define SHADOW_SIZE_S 0
+#define SHADOW_SIZE_M 1
+#define SHADOW_SIZE_L 2
+#define SHADOW_SIZE_XL 3
+
+#define F_INANIMATE (1 << 6)
+#define F_DISABLE_REFLECTION_PALETTE_LOAD (1 << 7)
+
+#define TRACKS_NONE 0
+#define TRACKS_FOOT 1
+#define TRACKS_BIKE_TIRE 2
+
+#endif // GUARD_CONSTANTS_MAP_OBJECTS_H
diff --git a/include/constants/maps.h b/include/constants/maps.h
new file mode 100644
index 000000000..737edd7de
--- /dev/null
+++ b/include/constants/maps.h
@@ -0,0 +1,595 @@
+#ifndef GUARD_CONSTANTS_MAPS_H
+#define GUARD_CONSTANTS_MAPS_H
+
+// Map Group 0
+#define MAP_PETALBURG_CITY (0 | (0 << 8))
+#define MAP_SLATEPORT_CITY (1 | (0 << 8))
+#define MAP_MAUVILLE_CITY (2 | (0 << 8))
+#define MAP_RUSTBORO_CITY (3 | (0 << 8))
+#define MAP_FORTREE_CITY (4 | (0 << 8))
+#define MAP_LILYCOVE_CITY (5 | (0 << 8))
+#define MAP_MOSSDEEP_CITY (6 | (0 << 8))
+#define MAP_SOOTOPOLIS_CITY (7 | (0 << 8))
+#define MAP_EVER_GRANDE_CITY (8 | (0 << 8))
+#define MAP_LITTLEROOT_TOWN (9 | (0 << 8))
+#define MAP_OLDALE_TOWN (10 | (0 << 8))
+#define MAP_DEWFORD_TOWN (11 | (0 << 8))
+#define MAP_LAVARIDGE_TOWN (12 | (0 << 8))
+#define MAP_FALLARBOR_TOWN (13 | (0 << 8))
+#define MAP_VERDANTURF_TOWN (14 | (0 << 8))
+#define MAP_PACIFIDLOG_TOWN (15 | (0 << 8))
+#define MAP_ROUTE101 (16 | (0 << 8))
+#define MAP_ROUTE102 (17 | (0 << 8))
+#define MAP_ROUTE103 (18 | (0 << 8))
+#define MAP_ROUTE104 (19 | (0 << 8))
+#define MAP_ROUTE105 (20 | (0 << 8))
+#define MAP_ROUTE106 (21 | (0 << 8))
+#define MAP_ROUTE107 (22 | (0 << 8))
+#define MAP_ROUTE108 (23 | (0 << 8))
+#define MAP_ROUTE109 (24 | (0 << 8))
+#define MAP_ROUTE110 (25 | (0 << 8))
+#define MAP_ROUTE111 (26 | (0 << 8))
+#define MAP_ROUTE112 (27 | (0 << 8))
+#define MAP_ROUTE113 (28 | (0 << 8))
+#define MAP_ROUTE114 (29 | (0 << 8))
+#define MAP_ROUTE115 (30 | (0 << 8))
+#define MAP_ROUTE116 (31 | (0 << 8))
+#define MAP_ROUTE117 (32 | (0 << 8))
+#define MAP_ROUTE118 (33 | (0 << 8))
+#define MAP_ROUTE119 (34 | (0 << 8))
+#define MAP_ROUTE120 (35 | (0 << 8))
+#define MAP_ROUTE121 (36 | (0 << 8))
+#define MAP_ROUTE122 (37 | (0 << 8))
+#define MAP_ROUTE123 (38 | (0 << 8))
+#define MAP_ROUTE124 (39 | (0 << 8))
+#define MAP_ROUTE125 (40 | (0 << 8))
+#define MAP_ROUTE126 (41 | (0 << 8))
+#define MAP_ROUTE127 (42 | (0 << 8))
+#define MAP_ROUTE128 (43 | (0 << 8))
+#define MAP_ROUTE129 (44 | (0 << 8))
+#define MAP_ROUTE130 (45 | (0 << 8))
+#define MAP_ROUTE131 (46 | (0 << 8))
+#define MAP_ROUTE132 (47 | (0 << 8))
+#define MAP_ROUTE133 (48 | (0 << 8))
+#define MAP_ROUTE134 (49 | (0 << 8))
+#define MAP_UNDERWATER1 (50 | (0 << 8))
+#define MAP_UNDERWATER2 (51 | (0 << 8))
+#define MAP_UNDERWATER3 (52 | (0 << 8))
+#define MAP_UNDERWATER4 (53 | (0 << 8))
+
+// Map Group 1
+#define MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F (0 | (1 << 8))
+#define MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F (1 | (1 << 8))
+#define MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F (2 | (1 << 8))
+#define MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F (3 | (1 << 8))
+#define MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB (4 | (1 << 8))
+
+// Map Group 2
+#define MAP_OLDALE_TOWN_HOUSE1 (0 | (2 << 8))
+#define MAP_OLDALE_TOWN_HOUSE2 (1 | (2 << 8))
+#define MAP_OLDALE_TOWN_POKEMON_CENTER_1F (2 | (2 << 8))
+#define MAP_OLDALE_TOWN_POKEMON_CENTER_2F (3 | (2 << 8))
+#define MAP_OLDALE_TOWN_MART (4 | (2 << 8))
+
+// Map Group 3
+#define MAP_DEWFORD_TOWN_HOUSE1 (0 | (3 << 8))
+#define MAP_DEWFORD_TOWN_POKEMON_CENTER_1F (1 | (3 << 8))
+#define MAP_DEWFORD_TOWN_POKEMON_CENTER_2F (2 | (3 << 8))
+#define MAP_DEWFORD_TOWN_GYM (3 | (3 << 8))
+#define MAP_DEWFORD_TOWN_HALL (4 | (3 << 8))
+#define MAP_DEWFORD_TOWN_HOUSE2 (5 | (3 << 8))
+
+// Map Group 4
+#define MAP_LAVARIDGE_TOWN_HERB_SHOP (0 | (4 << 8))
+#define MAP_LAVARIDGE_TOWN_GYM_1F (1 | (4 << 8))
+#define MAP_LAVARIDGE_TOWN_GYM_B1F (2 | (4 << 8))
+#define MAP_LAVARIDGE_TOWN_HOUSE (3 | (4 << 8))
+#define MAP_LAVARIDGE_TOWN_MART (4 | (4 << 8))
+#define MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F (5 | (4 << 8))
+#define MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F (6 | (4 << 8))
+
+// Map Group 5
+#define MAP_FALLARBOR_TOWN_MART (0 | (5 << 8))
+#define MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY (1 | (5 << 8))
+#define MAP_FALLARBOR_TOWN_BATTLE_TENT_CORRIDOR (2 | (5 << 8))
+#define MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM (3 | (5 << 8))
+#define MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F (4 | (5 << 8))
+#define MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F (5 | (5 << 8))
+#define MAP_FALLARBOR_TOWN_HOUSE1 (6 | (5 << 8))
+#define MAP_FALLARBOR_TOWN_HOUSE2 (7 | (5 << 8))
+
+// Map Group 6
+#define MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY (0 | (6 << 8))
+#define MAP_VERDANTURF_TOWN_BATTLE_TENT_CORRIDOR (1 | (6 << 8))
+#define MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM (2 | (6 << 8))
+#define MAP_VERDANTURF_TOWN_MART (3 | (6 << 8))
+#define MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F (4 | (6 << 8))
+#define MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F (5 | (6 << 8))
+#define MAP_VERDANTURF_TOWN_WANDAS_HOUSE (6 | (6 << 8))
+#define MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE (7 | (6 << 8))
+#define MAP_VERDANTURF_TOWN_HOUSE (8 | (6 << 8))
+
+// Map Group 7
+#define MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F (0 | (7 << 8))
+#define MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F (1 | (7 << 8))
+#define MAP_PACIFIDLOG_TOWN_HOUSE1 (2 | (7 << 8))
+#define MAP_PACIFIDLOG_TOWN_HOUSE2 (3 | (7 << 8))
+#define MAP_PACIFIDLOG_TOWN_HOUSE3 (4 | (7 << 8))
+#define MAP_PACIFIDLOG_TOWN_HOUSE4 (5 | (7 << 8))
+#define MAP_PACIFIDLOG_TOWN_HOUSE5 (6 | (7 << 8))
+
+// Map Group 8
+#define MAP_PETALBURG_CITY_WALLYS_HOUSE (0 | (8 << 8))
+#define MAP_PETALBURG_CITY_GYM (1 | (8 << 8))
+#define MAP_PETALBURG_CITY_HOUSE1 (2 | (8 << 8))
+#define MAP_PETALBURG_CITY_HOUSE2 (3 | (8 << 8))
+#define MAP_PETALBURG_CITY_POKEMON_CENTER_1F (4 | (8 << 8))
+#define MAP_PETALBURG_CITY_POKEMON_CENTER_2F (5 | (8 << 8))
+#define MAP_PETALBURG_CITY_MART (6 | (8 << 8))
+
+// Map Group 9
+#define MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F (0 | (9 << 8))
+#define MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F (1 | (9 << 8))
+#define MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY (2 | (9 << 8))
+#define MAP_SLATEPORT_CITY_BATTLE_TENT_CORRIDOR (3 | (9 << 8))
+#define MAP_SLATEPORT_CITY_BATTLE_TENT_BATTLE_ROOM (4 | (9 << 8))
+#define MAP_SLATEPORT_CITY_HOUSE1 (5 | (9 << 8))
+#define MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB (6 | (9 << 8))
+#define MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F (7 | (9 << 8))
+#define MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F (8 | (9 << 8))
+#define MAP_SLATEPORT_CITY_HARBOR (9 | (9 << 8))
+#define MAP_SLATEPORT_CITY_HOUSE2 (10 | (9 << 8))
+#define MAP_SLATEPORT_CITY_POKEMON_CENTER_1F (11 | (9 << 8))
+#define MAP_SLATEPORT_CITY_POKEMON_CENTER_2F (12 | (9 << 8))
+#define MAP_SLATEPORT_CITY_MART (13 | (9 << 8))
+
+// Map Group 10
+#define MAP_MAUVILLE_CITY_GYM (0 | (10 << 8))
+#define MAP_MAUVILLE_CITY_BIKE_SHOP (1 | (10 << 8))
+#define MAP_MAUVILLE_CITY_HOUSE1 (2 | (10 << 8))
+#define MAP_MAUVILLE_CITY_GAME_CORNER (3 | (10 << 8))
+#define MAP_MAUVILLE_CITY_HOUSE2 (4 | (10 << 8))
+#define MAP_MAUVILLE_CITY_POKEMON_CENTER_1F (5 | (10 << 8))
+#define MAP_MAUVILLE_CITY_POKEMON_CENTER_2F (6 | (10 << 8))
+#define MAP_MAUVILLE_CITY_MART (7 | (10 << 8))
+
+// Map Group 11
+#define MAP_RUSTBORO_CITY_DEVON_CORP_1F (0 | (11 << 8))
+#define MAP_RUSTBORO_CITY_DEVON_CORP_2F (1 | (11 << 8))
+#define MAP_RUSTBORO_CITY_DEVON_CORP_3F (2 | (11 << 8))
+#define MAP_RUSTBORO_CITY_GYM (3 | (11 << 8))
+#define MAP_RUSTBORO_CITY_POKEMON_SCHOOL (4 | (11 << 8))
+#define MAP_RUSTBORO_CITY_POKEMON_CENTER_1F (5 | (11 << 8))
+#define MAP_RUSTBORO_CITY_POKEMON_CENTER_2F (6 | (11 << 8))
+#define MAP_RUSTBORO_CITY_MART (7 | (11 << 8))
+#define MAP_RUSTBORO_CITY_FLAT1_1F (8 | (11 << 8))
+#define MAP_RUSTBORO_CITY_FLAT1_2F (9 | (11 << 8))
+#define MAP_RUSTBORO_CITY_HOUSE1 (10 | (11 << 8))
+#define MAP_RUSTBORO_CITY_CUTTERS_HOUSE (11 | (11 << 8))
+#define MAP_RUSTBORO_CITY_HOUSE2 (12 | (11 << 8))
+#define MAP_RUSTBORO_CITY_FLAT2_1F (13 | (11 << 8))
+#define MAP_RUSTBORO_CITY_FLAT2_2F (14 | (11 << 8))
+#define MAP_RUSTBORO_CITY_FLAT2_3F (15 | (11 << 8))
+#define MAP_RUSTBORO_CITY_HOUSE3 (16 | (11 << 8))
+
+// Map Group 12
+#define MAP_FORTREE_CITY_HOUSE1 (0 | (12 << 8))
+#define MAP_FORTREE_CITY_GYM (1 | (12 << 8))
+#define MAP_FORTREE_CITY_POKEMON_CENTER_1F (2 | (12 << 8))
+#define MAP_FORTREE_CITY_POKEMON_CENTER_2F (3 | (12 << 8))
+#define MAP_FORTREE_CITY_MART (4 | (12 << 8))
+#define MAP_FORTREE_CITY_HOUSE2 (5 | (12 << 8))
+#define MAP_FORTREE_CITY_HOUSE3 (6 | (12 << 8))
+#define MAP_FORTREE_CITY_HOUSE4 (7 | (12 << 8))
+#define MAP_FORTREE_CITY_HOUSE5 (8 | (12 << 8))
+#define MAP_FORTREE_CITY_DECORATION_SHOP (9 | (12 << 8))
+
+// Map Group 13
+#define MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F (0 | (13 << 8))
+#define MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F (1 | (13 << 8))
+#define MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F (2 | (13 << 8))
+#define MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F (3 | (13 << 8))
+#define MAP_LILYCOVE_CITY_CONTEST_LOBBY (4 | (13 << 8))
+#define MAP_LILYCOVE_CITY_CONTEST_HALL (5 | (13 << 8))
+#define MAP_LILYCOVE_CITY_POKEMON_CENTER_1F (6 | (13 << 8))
+#define MAP_LILYCOVE_CITY_POKEMON_CENTER_2F (7 | (13 << 8))
+#define MAP_LILYCOVE_CITY_UNUSED_MART (8 | (13 << 8))
+#define MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB (9 | (13 << 8))
+#define MAP_LILYCOVE_CITY_HARBOR (10 | (13 << 8))
+#define MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE (11 | (13 << 8))
+#define MAP_LILYCOVE_CITY_HOUSE1 (12 | (13 << 8))
+#define MAP_LILYCOVE_CITY_HOUSE2 (13 | (13 << 8))
+#define MAP_LILYCOVE_CITY_HOUSE3 (14 | (13 << 8))
+#define MAP_LILYCOVE_CITY_HOUSE4 (15 | (13 << 8))
+#define MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F (16 | (13 << 8))
+#define MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F (17 | (13 << 8))
+#define MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F (18 | (13 << 8))
+#define MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F (19 | (13 << 8))
+#define MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F (20 | (13 << 8))
+#define MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP (21 | (13 << 8))
+#define MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR (22 | (13 << 8))
+
+// Map Group 14
+#define MAP_MOSSDEEP_CITY_GYM (0 | (14 << 8))
+#define MAP_MOSSDEEP_CITY_HOUSE1 (1 | (14 << 8))
+#define MAP_MOSSDEEP_CITY_HOUSE2 (2 | (14 << 8))
+#define MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F (3 | (14 << 8))
+#define MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F (4 | (14 << 8))
+#define MAP_MOSSDEEP_CITY_MART (5 | (14 << 8))
+#define MAP_MOSSDEEP_CITY_HOUSE3 (6 | (14 << 8))
+#define MAP_MOSSDEEP_CITY_STEVENS_HOUSE (7 | (14 << 8))
+#define MAP_MOSSDEEP_CITY_HOUSE4 (8 | (14 << 8))
+#define MAP_MOSSDEEP_CITY_SPACE_CENTER_1F (9 | (14 << 8))
+#define MAP_MOSSDEEP_CITY_SPACE_CENTER_2F (10 | (14 << 8))
+#define MAP_MOSSDEEP_CITY_GAME_CORNER_1F (11 | (14 << 8))
+#define MAP_MOSSDEEP_CITY_GAME_CORNER_B1F (12 | (14 << 8))
+
+// Map Group 15
+#define MAP_SOOTOPOLIS_CITY_GYM_1F (0 | (15 << 8))
+#define MAP_SOOTOPOLIS_CITY_GYM_B1F (1 | (15 << 8))
+#define MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F (2 | (15 << 8))
+#define MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F (3 | (15 << 8))
+#define MAP_SOOTOPOLIS_CITY_MART (4 | (15 << 8))
+#define MAP_SOOTOPOLIS_CITY_HOUSE1 (5 | (15 << 8))
+#define MAP_SOOTOPOLIS_CITY_HOUSE2 (6 | (15 << 8))
+#define MAP_SOOTOPOLIS_CITY_HOUSE3 (7 | (15 << 8))
+#define MAP_SOOTOPOLIS_CITY_HOUSE4 (8 | (15 << 8))
+#define MAP_SOOTOPOLIS_CITY_HOUSE5 (9 | (15 << 8))
+#define MAP_SOOTOPOLIS_CITY_HOUSE6 (10 | (15 << 8))
+#define MAP_SOOTOPOLIS_CITY_HOUSE7 (11 | (15 << 8))
+#define MAP_SOOTOPOLIS_CITY_HOUSE8 (12 | (15 << 8))
+#define MAP_SOOTOPOLIS_CITY_HOUSE9_1F (13 | (15 << 8))
+#define MAP_SOOTOPOLIS_CITY_HOUSE9_B1F (14 | (15 << 8))
+
+// Map Group 16
+#define MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM (0 | (16 << 8))
+#define MAP_EVER_GRANDE_CITY_PHOEBES_ROOM (1 | (16 << 8))
+#define MAP_EVER_GRANDE_CITY_GLACIAS_ROOM (2 | (16 << 8))
+#define MAP_EVER_GRANDE_CITY_DRAKES_ROOM (3 | (16 << 8))
+#define MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM (4 | (16 << 8))
+#define MAP_EVER_GRANDE_CITY_CORRIDOR1 (5 | (16 << 8))
+#define MAP_EVER_GRANDE_CITY_CORRIDOR2 (6 | (16 << 8))
+#define MAP_EVER_GRANDE_CITY_CORRIDOR3 (7 | (16 << 8))
+#define MAP_EVER_GRANDE_CITY_CORRIDOR4 (8 | (16 << 8))
+#define MAP_EVER_GRANDE_CITY_CORRIDOR5 (9 | (16 << 8))
+#define MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F (10 | (16 << 8))
+#define MAP_EVER_GRANDE_CITY_HALL_OF_FAME (11 | (16 << 8))
+#define MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F (12 | (16 << 8))
+#define MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F (13 | (16 << 8))
+#define MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F (14 | (16 << 8))
+
+// Map Group 17
+#define MAP_ROUTE104_MR_BRINEYS_HOUSE (0 | (17 << 8))
+#define MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP (1 | (17 << 8))
+
+// Map Group 18
+#define MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE (0 | (18 << 8))
+#define MAP_ROUTE111_OLD_LADYS_REST_STOP (1 | (18 << 8))
+
+// Map Group 19
+#define MAP_ROUTE112_CABLE_CAR_STATION (0 | (19 << 8))
+#define MAP_MT_CHIMNEY_CABLE_CAR_STATION (1 | (19 << 8))
+
+// Map Group 20
+#define MAP_ROUTE114_FOSSIL_MANIACS_HOUSE (0 | (20 << 8))
+#define MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL (1 | (20 << 8))
+#define MAP_ROUTE114_LANETTES_HOUSE (2 | (20 << 8))
+
+// Map Group 21
+#define MAP_ROUTE116_TUNNELERS_REST_HOUSE (0 | (21 << 8))
+
+// Map Group 22
+#define MAP_ROUTE117_POKEMON_DAY_CARE (0 | (22 << 8))
+
+// Map Group 23
+#define MAP_ROUTE121_SAFARI_ZONE_ENTRANCE (0 | (23 << 8))
+
+// Map Group 24
+#define MAP_METEOR_FALLS_1F_1R (0 | (24 << 8))
+#define MAP_METEOR_FALLS_1F_2R (1 | (24 << 8))
+#define MAP_METEOR_FALLS_B1F_1R (2 | (24 << 8))
+#define MAP_METEOR_FALLS_B1F_2R (3 | (24 << 8))
+#define MAP_RUSTURF_TUNNEL (4 | (24 << 8))
+#define MAP_UNDERWATER_SOOTOPOLIS_CITY (5 | (24 << 8))
+#define MAP_DESERT_RUINS (6 | (24 << 8))
+#define MAP_GRANITE_CAVE_1F (7 | (24 << 8))
+#define MAP_GRANITE_CAVE_B1F (8 | (24 << 8))
+#define MAP_GRANITE_CAVE_B2F (9 | (24 << 8))
+#define MAP_GRANITE_CAVE_STEVENS_ROOM (10 | (24 << 8))
+#define MAP_PETALBURG_WOODS (11 | (24 << 8))
+#define MAP_MT_CHIMNEY (12 | (24 << 8))
+#define MAP_JAGGED_PASS (13 | (24 << 8))
+#define MAP_FIERY_PATH (14 | (24 << 8))
+#define MAP_MT_PYRE_1F (15 | (24 << 8))
+#define MAP_MT_PYRE_2F (16 | (24 << 8))
+#define MAP_MT_PYRE_3F (17 | (24 << 8))
+#define MAP_MT_PYRE_4F (18 | (24 << 8))
+#define MAP_MT_PYRE_5F (19 | (24 << 8))
+#define MAP_MT_PYRE_6F (20 | (24 << 8))
+#define MAP_MT_PYRE_EXTERIOR (21 | (24 << 8))
+#define MAP_MT_PYRE_SUMMIT (22 | (24 << 8))
+#define MAP_AQUA_HIDEOUT_1F (23 | (24 << 8))
+#define MAP_AQUA_HIDEOUT_B1F (24 | (24 << 8))
+#define MAP_AQUA_HIDEOUT_B2F (25 | (24 << 8))
+#define MAP_UNDERWATER_SEAFLOOR_CAVERN (26 | (24 << 8))
+#define MAP_SEAFLOOR_CAVERN_ENTRANCE (27 | (24 << 8))
+#define MAP_SEAFLOOR_CAVERN_ROOM1 (28 | (24 << 8))
+#define MAP_SEAFLOOR_CAVERN_ROOM2 (29 | (24 << 8))
+#define MAP_SEAFLOOR_CAVERN_ROOM3 (30 | (24 << 8))
+#define MAP_SEAFLOOR_CAVERN_ROOM4 (31 | (24 << 8))
+#define MAP_SEAFLOOR_CAVERN_ROOM5 (32 | (24 << 8))
+#define MAP_SEAFLOOR_CAVERN_ROOM6 (33 | (24 << 8))
+#define MAP_SEAFLOOR_CAVERN_ROOM7 (34 | (24 << 8))
+#define MAP_SEAFLOOR_CAVERN_ROOM8 (35 | (24 << 8))
+#define MAP_SEAFLOOR_CAVERN_ROOM9 (36 | (24 << 8))
+#define MAP_CAVE_OF_ORIGIN_ENTRANCE (37 | (24 << 8))
+#define MAP_CAVE_OF_ORIGIN_1F (38 | (24 << 8))
+#define MAP_CAVE_OF_ORIGIN_UNUSED_RS_B1F (39 | (24 << 8)) //
+#define MAP_CAVE_OF_ORIGIN_UNUSED_RS_B2F (40 | (24 << 8)) // Ruby/Sapphire leftovers
+#define MAP_CAVE_OF_ORIGIN_UNUSED_RS_B3F (41 | (24 << 8)) //
+#define MAP_CAVE_OF_ORIGIN_B1F (42 | (24 << 8))
+#define MAP_VICTORY_ROAD_1F (43 | (24 << 8))
+#define MAP_VICTORY_ROAD_B1F (44 | (24 << 8))
+#define MAP_VICTORY_ROAD_B2F (45 | (24 << 8))
+#define MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM (46 | (24 << 8))
+#define MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM (47 | (24 << 8))
+#define MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM (48 | (24 << 8))
+#define MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM (49 | (24 << 8))
+#define MAP_SHOAL_CAVE_HIGH_TIDE_ENTRANCE_ROOM (50 | (24 << 8))
+#define MAP_SHOAL_CAVE_HIGH_TIDE_INNER_ROOM (51 | (24 << 8))
+#define MAP_NEW_MAUVILLE_ENTRANCE (52 | (24 << 8))
+#define MAP_NEW_MAUVILLE_INSIDE (53 | (24 << 8))
+#define MAP_ABANDONED_SHIP_DECK (54 | (24 << 8))
+#define MAP_ABANDONED_SHIP_CORRIDORS_1F (55 | (24 << 8))
+#define MAP_ABANDONED_SHIP_ROOMS_1F (56 | (24 << 8))
+#define MAP_ABANDONED_SHIP_CORRIDORS_B1F (57 | (24 << 8))
+#define MAP_ABANDONED_SHIP_ROOMS_B1F (58 | (24 << 8))
+#define MAP_ABANDONED_SHIP_ROOMS2_B1F (59 | (24 << 8))
+#define MAP_ABANDONED_SHIP_UNDERWATER1 (60 | (24 << 8))
+#define MAP_ABANDONED_SHIP_ROOM_B1F (61 | (24 << 8))
+#define MAP_ABANDONED_SHIP_ROOMS2_1F (62 | (24 << 8))
+#define MAP_ABANDONED_SHIP_CAPTAINS_OFFICE (63 | (24 << 8))
+#define MAP_ABANDONED_SHIP_UNDERWATER2 (64 | (24 << 8))
+#define MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS (65 | (24 << 8))
+#define MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS (66 | (24 << 8))
+#define MAP_ISLAND_CAVE (67 | (24 << 8))
+#define MAP_ANCIENT_TOMB (68 | (24 << 8))
+#define MAP_UNDERWATER_ROUTE134 (69 | (24 << 8))
+#define MAP_UNDERWATER_SEALED_CHAMBER (70 | (24 << 8))
+#define MAP_SEALED_CHAMBER_OUTER_ROOM (71 | (24 << 8))
+#define MAP_SEALED_CHAMBER_INNER_ROOM (72 | (24 << 8))
+#define MAP_SCORCHED_SLAB (73 | (24 << 8))
+#define MAP_UNUSED_RUBY_MAGMA_HIDEOUT_1F (74 | (24 << 8)) //
+#define MAP_UNUSED_RUBY_MAGMA_HIDEOUT_B1F (75 | (24 << 8)) // Ruby/Sapphire leftovers
+#define MAP_UNUSED_RUBY_MAGMA_HIDEOUT_B2F (76 | (24 << 8)) //
+#define MAP_SKY_PILLAR_ENTRANCE (77 | (24 << 8))
+#define MAP_SKY_PILLAR_OUTSIDE (78 | (24 << 8))
+#define MAP_SKY_PILLAR_1F (79 | (24 << 8))
+#define MAP_SKY_PILLAR_2F (80 | (24 << 8))
+#define MAP_SKY_PILLAR_3F (81 | (24 << 8))
+#define MAP_SKY_PILLAR_4F (82 | (24 << 8))
+#define MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM (83 | (24 << 8))
+#define MAP_SKY_PILLAR_5F (84 | (24 << 8))
+#define MAP_SKY_PILLAR_TOP (85 | (24 << 8))
+#define MAP_MAGMA_HIDEOUT_1F (86 | (24 << 8))
+#define MAP_MAGMA_HIDEOUT_2F_1R (87 | (24 << 8))
+#define MAP_MAGMA_HIDEOUT_2F_2R (88 | (24 << 8))
+#define MAP_MAGMA_HIDEOUT_3F_1R (89 | (24 << 8))
+#define MAP_MAGMA_HIDEOUT_3F_2R (90 | (24 << 8))
+#define MAP_MAGMA_HIDEOUT_4F (91 | (24 << 8))
+#define MAP_MAGMA_HIDEOUT_3F_3R (92 | (24 << 8))
+#define MAP_MAGMA_HIDEOUT_2F_3R (93 | (24 << 8))
+#define MAP_MIRAGE_TOWER_1F (94 | (24 << 8))
+#define MAP_MIRAGE_TOWER_2F (95 | (24 << 8))
+#define MAP_MIRAGE_TOWER_3F (96 | (24 << 8))
+#define MAP_MIRAGE_TOWER_4F (97 | (24 << 8))
+#define MAP_DESERT_UNDERPASS (98 | (24 << 8))
+#define MAP_ARTISAN_CAVE_B1F (99 | (24 << 8))
+#define MAP_ARTISAN_CAVE_1F (100 | (24 << 8))
+#define MAP_UNDERWATER_MARINE_CAVE (101 | (24 << 8))
+#define MAP_MARINE_CAVE_ENTRANCE (102 | (24 << 8))
+#define MAP_MARINE_CAVE_END (103 | (24 << 8))
+#define MAP_TERRA_CAVE_ENTRANCE (104 | (24 << 8))
+#define MAP_TERRA_CAVE_END (105 | (24 << 8))
+#define MAP_ALTERING_CAVE (106 | (24 << 8))
+#define MAP_METEOR_FALLS_STEVENS_CAVE (107 | (24 << 8))
+
+// Map Group 25
+#define MAP_SECRET_BASE_RED_CAVE1 (0 | (25 << 8))
+#define MAP_SECRET_BASE_BROWN_CAVE1 (1 | (25 << 8))
+#define MAP_SECRET_BASE_BLUE_CAVE1 (2 | (25 << 8))
+#define MAP_SECRET_BASE_YELLOW_CAVE1 (3 | (25 << 8))
+#define MAP_SECRET_BASE_TREE1 (4 | (25 << 8))
+#define MAP_SECRET_BASE_SHRUB1 (5 | (25 << 8))
+#define MAP_SECRET_BASE_RED_CAVE2 (6 | (25 << 8))
+#define MAP_SECRET_BASE_BROWN_CAVE2 (7 | (25 << 8))
+#define MAP_SECRET_BASE_BLUE_CAVE2 (8 | (25 << 8))
+#define MAP_SECRET_BASE_YELLOW_CAVE2 (9 | (25 << 8))
+#define MAP_SECRET_BASE_TREE2 (10 | (25 << 8))
+#define MAP_SECRET_BASE_SHRUB2 (11 | (25 << 8))
+#define MAP_SECRET_BASE_RED_CAVE3 (12 | (25 << 8))
+#define MAP_SECRET_BASE_BROWN_CAVE3 (13 | (25 << 8))
+#define MAP_SECRET_BASE_BLUE_CAVE3 (14 | (25 << 8))
+#define MAP_SECRET_BASE_YELLOW_CAVE3 (15 | (25 << 8))
+#define MAP_SECRET_BASE_TREE3 (16 | (25 << 8))
+#define MAP_SECRET_BASE_SHRUB3 (17 | (25 << 8))
+#define MAP_SECRET_BASE_RED_CAVE4 (18 | (25 << 8))
+#define MAP_SECRET_BASE_BROWN_CAVE4 (19 | (25 << 8))
+#define MAP_SECRET_BASE_BLUE_CAVE4 (20 | (25 << 8))
+#define MAP_SECRET_BASE_YELLOW_CAVE4 (21 | (25 << 8))
+#define MAP_SECRET_BASE_TREE4 (22 | (25 << 8))
+#define MAP_SECRET_BASE_SHRUB4 (23 | (25 << 8))
+#define MAP_SINGLE_BATTLE_COLOSSEUM (24 | (25 << 8))
+#define MAP_TRADE_CENTER (25 | (25 << 8))
+#define MAP_RECORD_CORNER (26 | (25 << 8))
+#define MAP_DOUBLE_BATTLE_COLOSSEUM (27 | (25 << 8))
+#define MAP_LINK_CONTEST_ROOM1 (28 | (25 << 8))
+#define MAP_UNKNOWN_MAP_25_29 (29 | (25 << 8))
+#define MAP_UNKNOWN_MAP_25_30 (30 | (25 << 8))
+#define MAP_UNKNOWN_MAP_25_31 (31 | (25 << 8))
+#define MAP_UNKNOWN_MAP_25_32 (32 | (25 << 8))
+#define MAP_UNKNOWN_MAP_25_33 (33 | (25 << 8))
+#define MAP_UNKNOWN_MAP_25_34 (34 | (25 << 8))
+#define MAP_LINK_CONTEST_ROOM2 (35 | (25 << 8))
+#define MAP_LINK_CONTEST_ROOM3 (36 | (25 << 8))
+#define MAP_LINK_CONTEST_ROOM4 (37 | (25 << 8))
+#define MAP_LINK_CONTEST_ROOM5 (38 | (25 << 8))
+#define MAP_LINK_CONTEST_ROOM6 (39 | (25 << 8))
+#define MAP_INSIDE_OF_TRUCK (40 | (25 << 8))
+#define MAP_SS_TIDAL_CORRIDOR (41 | (25 << 8))
+#define MAP_SS_TIDAL_LOWER_DECK (42 | (25 << 8))
+#define MAP_SS_TIDAL_ROOMS (43 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE_01 (44 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE_02 (45 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE_03 (46 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE_04 (47 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE_05 (48 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE_06 (49 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE_07 (50 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE_08 (51 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE_09 (52 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE_10 (53 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE_11 (54 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE_12 (55 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE_13 (56 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE_14 (57 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE_15 (58 | (25 << 8))
+#define MAP_BATTLE_PYRAMID_SQUARE_16 (59 | (25 << 8))
+#define MAP_UNION_ROOM (60 | (25 << 8))
+
+// Map Group 26
+#define MAP_SAFARI_ZONE_NORTHWEST (0 | (26 << 8))
+#define MAP_SAFARI_ZONE_NORTHEAST (1 | (26 << 8))
+#define MAP_SAFARI_ZONE_SOUTHWEST (2 | (26 << 8))
+#define MAP_SAFARI_ZONE_SOUTHEAST (3 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_OUTSIDE_WEST (4 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY (5 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_TOWER_ELEVATOR (6 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR (7 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM (8 | (26 << 8))
+#define MAP_SOUTHERN_ISLAND_EXTERIOR (9 | (26 << 8))
+#define MAP_SOUTHERN_ISLAND_INTERIOR (10 | (26 << 8))
+#define MAP_SAFARI_ZONE_REST_HOUSE (11 | (26 << 8))
+#define MAP_SAFARI_ZONE_EM_1 (12 | (26 << 8))
+#define MAP_SAFARI_ZONE_EM_2 (13 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_OUTSIDE_EAST (14 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM (15 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR_2 (16 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM_2 (17 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY (18 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR (19 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM (20 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM (21 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY (22 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR (23 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM (24 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY (25 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_EMPTY_SQUARE (26 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP (27 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY (28 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR (29 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM (30 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY (31 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM (32 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM (33 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY (34 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR (35 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM (36 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_PIKE_RANDOM_ROOM_1 (37 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_PIKE_RANDOM_ROOM_2 (38 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_PIKE_RANDOM_ROOM_3 (39 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_RANKING_HALL (40 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_LOUNGE_1 (41 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_BATTLE_POINT_EXCHANGE_SERVICE_CORNER (42 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_LOUNGE_2 (43 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_LOUNGE_3 (44 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_LOUNGE_4 (45 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_SCOTTS_HOUSE (46 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_LOUNGE_5 (47 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_LOUNGE_6 (48 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_LOUNGE_7 (49 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_RECEPTION_GATE (50 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_LOUNGE_8 (51 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_LOUNGE_9 (52 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F (53 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F (54 | (26 << 8))
+#define MAP_BATTLE_FRONTIER_MART (55 | (26 << 8))
+#define MAP_FARAWAY_ISLAND_ENTRANCE (56 | (26 << 8))
+#define MAP_FARAWAY_ISLAND_INTERIOR (57 | (26 << 8))
+#define MAP_BIRTH_ISLAND_EXTERIOR (58 | (26 << 8))
+#define MAP_BIRTH_ISLAND_HARBOR (59 | (26 << 8))
+#define MAP_TRAINER_HILL_ENTRANCE (60 | (26 << 8))
+#define MAP_TRAINER_HILL_1F (61 | (26 << 8))
+#define MAP_TRAINER_HILL_2F (62 | (26 << 8))
+#define MAP_TRAINER_HILL_3F (63 | (26 << 8))
+#define MAP_TRAINER_HILL_4F (64 | (26 << 8))
+#define MAP_TRAINER_HILL_ROOF (65 | (26 << 8))
+#define MAP_NAVEL_ROCK_EXTERIOR (66 | (26 << 8))
+#define MAP_NAVEL_ROCK_HARBOR (67 | (26 << 8))
+#define MAP_NAVEL_ROCK_ENTRANCE (68 | (26 << 8))
+#define MAP_NAVEL_ROCK_B1F (69 | (26 << 8))
+#define MAP_NAVEL_ROCK_FORK (70 | (26 << 8))
+#define MAP_NAVEL_ROCK_UP_1 (71 | (26 << 8))
+#define MAP_NAVEL_ROCK_UP_2 (72 | (26 << 8))
+#define MAP_NAVEL_ROCK_UP_3 (73 | (26 << 8))
+#define MAP_NAVEL_ROCK_UP_4 (74 | (26 << 8))
+#define MAP_NAVEL_ROCK_TOP (75 | (26 << 8))
+#define MAP_NAVEL_ROCK_DOWN_01 (76 | (26 << 8))
+#define MAP_NAVEL_ROCK_DOWN_02 (77 | (26 << 8))
+#define MAP_NAVEL_ROCK_DOWN_03 (78 | (26 << 8))
+#define MAP_NAVEL_ROCK_DOWN_04 (79 | (26 << 8))
+#define MAP_NAVEL_ROCK_DOWN_05 (80 | (26 << 8))
+#define MAP_NAVEL_ROCK_DOWN_06 (81 | (26 << 8))
+#define MAP_NAVEL_ROCK_DOWN_07 (82 | (26 << 8))
+#define MAP_NAVEL_ROCK_DOWN_08 (83 | (26 << 8))
+#define MAP_NAVEL_ROCK_DOWN_09 (84 | (26 << 8))
+#define MAP_NAVEL_ROCK_DOWN_10 (85 | (26 << 8))
+#define MAP_NAVEL_ROCK_DOWN_11 (86 | (26 << 8))
+#define MAP_NAVEL_ROCK_BOTTOM (87 | (26 << 8))
+#define MAP_TRAINER_HILL_ELEVATOR (88 | (26 << 8))
+
+// Map Group 27
+#define MAP_ROUTE104_PROTOTYPE (0 | (27 << 8))
+#define MAP_ROUTE104_PROTOTYPE_PRETTY_PETAL_FLOWER_SHOP (1 | (27 << 8))
+
+// Map Group 28
+#define MAP_ROUTE109_SEASHORE_HOUSE (0 | (28 << 8))
+
+// Map Group 29
+#define MAP_ROUTE110_TRICK_HOUSE_ENTRANCE (0 | (29 << 8))
+#define MAP_ROUTE110_TRICK_HOUSE_END (1 | (29 << 8))
+#define MAP_ROUTE110_TRICK_HOUSE_CORRIDOR (2 | (29 << 8))
+#define MAP_ROUTE110_TRICK_HOUSE_PUZZLE1 (3 | (29 << 8))
+#define MAP_ROUTE110_TRICK_HOUSE_PUZZLE2 (4 | (29 << 8))
+#define MAP_ROUTE110_TRICK_HOUSE_PUZZLE3 (5 | (29 << 8))
+#define MAP_ROUTE110_TRICK_HOUSE_PUZZLE4 (6 | (29 << 8))
+#define MAP_ROUTE110_TRICK_HOUSE_PUZZLE5 (7 | (29 << 8))
+#define MAP_ROUTE110_TRICK_HOUSE_PUZZLE6 (8 | (29 << 8))
+#define MAP_ROUTE110_TRICK_HOUSE_PUZZLE7 (9 | (29 << 8))
+#define MAP_ROUTE110_TRICK_HOUSE_PUZZLE8 (10 | (29 << 8))
+#define MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE (11 | (29 << 8))
+#define MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE (12 | (29 << 8))
+
+// Map Group 30
+#define MAP_ROUTE113_GLASS_WORKSHOP (0 | (30 << 8))
+
+// Map Group 31
+#define MAP_ROUTE123_BERRY_MASTERS_HOUSE (0 | (31 << 8))
+
+// Map Group 32
+#define MAP_ROUTE119_WEATHER_INSTITUTE_1F (0 | (32 << 8))
+#define MAP_ROUTE119_WEATHER_INSTITUTE_2F (1 | (32 << 8))
+#define MAP_ROUTE119_HOUSE (2 | (32 << 8))
+
+// Map Group 33
+#define MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE (0 | (33 << 8))
+
+
+#define MAP_NONE (0x7F | (0x7F << 8))
+#define MAP_UNDEFINED (0xFF | (0xFF << 8))
+
+
+#define MAP_GROUP(map) (MAP_##map >> 8)
+#define MAP_NUM(map) (MAP_##map & 0xFF)
+
+#endif // GUARD_CONSTANTS_MAPS_H
diff --git a/include/constants/moves.h b/include/constants/moves.h
new file mode 100644
index 000000000..f3a3acb90
--- /dev/null
+++ b/include/constants/moves.h
@@ -0,0 +1,362 @@
+#ifndef GUARD_CONSTANTS_MOVES_H
+#define GUARD_CONSTANTS_MOVES_H
+
+#define MOVE_NONE 0
+#define MOVE_POUND 1
+#define MOVE_KARATE_CHOP 2
+#define MOVE_DOUBLE_SLAP 3
+#define MOVE_COMET_PUNCH 4
+#define MOVE_MEGA_PUNCH 5
+#define MOVE_PAY_DAY 6
+#define MOVE_FIRE_PUNCH 7
+#define MOVE_ICE_PUNCH 8
+#define MOVE_THUNDER_PUNCH 9
+#define MOVE_SCRATCH 10
+#define MOVE_VICE_GRIP 11
+#define MOVE_GUILLOTINE 12
+#define MOVE_RAZOR_WIND 13
+#define MOVE_SWORDS_DANCE 14
+#define MOVE_CUT 15
+#define MOVE_GUST 16
+#define MOVE_WING_ATTACK 17
+#define MOVE_WHIRLWIND 18
+#define MOVE_FLY 19
+#define MOVE_BIND 20
+#define MOVE_SLAM 21
+#define MOVE_VINE_WHIP 22
+#define MOVE_STOMP 23
+#define MOVE_DOUBLE_KICK 24
+#define MOVE_MEGA_KICK 25
+#define MOVE_JUMP_KICK 26
+#define MOVE_ROLLING_KICK 27
+#define MOVE_SAND_ATTACK 28
+#define MOVE_HEADBUTT 29
+#define MOVE_HORN_ATTACK 30
+#define MOVE_FURY_ATTACK 31
+#define MOVE_HORN_DRILL 32
+#define MOVE_TACKLE 33
+#define MOVE_BODY_SLAM 34
+#define MOVE_WRAP 35
+#define MOVE_TAKE_DOWN 36
+#define MOVE_THRASH 37
+#define MOVE_DOUBLE_EDGE 38
+#define MOVE_TAIL_WHIP 39
+#define MOVE_POISON_STING 40
+#define MOVE_TWINEEDLE 41
+#define MOVE_PIN_MISSILE 42
+#define MOVE_LEER 43
+#define MOVE_BITE 44
+#define MOVE_GROWL 45
+#define MOVE_ROAR 46
+#define MOVE_SING 47
+#define MOVE_SUPERSONIC 48
+#define MOVE_SONIC_BOOM 49
+#define MOVE_DISABLE 50
+#define MOVE_ACID 51
+#define MOVE_EMBER 52
+#define MOVE_FLAMETHROWER 53
+#define MOVE_MIST 54
+#define MOVE_WATER_GUN 55
+#define MOVE_HYDRO_PUMP 56
+#define MOVE_SURF 57
+#define MOVE_ICE_BEAM 58
+#define MOVE_BLIZZARD 59
+#define MOVE_PSYBEAM 60
+#define MOVE_BUBBLE_BEAM 61
+#define MOVE_AURORA_BEAM 62
+#define MOVE_HYPER_BEAM 63
+#define MOVE_PECK 64
+#define MOVE_DRILL_PECK 65
+#define MOVE_SUBMISSION 66
+#define MOVE_LOW_KICK 67
+#define MOVE_COUNTER 68
+#define MOVE_SEISMIC_TOSS 69
+#define MOVE_STRENGTH 70
+#define MOVE_ABSORB 71
+#define MOVE_MEGA_DRAIN 72
+#define MOVE_LEECH_SEED 73
+#define MOVE_GROWTH 74
+#define MOVE_RAZOR_LEAF 75
+#define MOVE_SOLAR_BEAM 76
+#define MOVE_POISON_POWDER 77
+#define MOVE_STUN_SPORE 78
+#define MOVE_SLEEP_POWDER 79
+#define MOVE_PETAL_DANCE 80
+#define MOVE_STRING_SHOT 81
+#define MOVE_DRAGON_RAGE 82
+#define MOVE_FIRE_SPIN 83
+#define MOVE_THUNDER_SHOCK 84
+#define MOVE_THUNDERBOLT 85
+#define MOVE_THUNDER_WAVE 86
+#define MOVE_THUNDER 87
+#define MOVE_ROCK_THROW 88
+#define MOVE_EARTHQUAKE 89
+#define MOVE_FISSURE 90
+#define MOVE_DIG 91
+#define MOVE_TOXIC 92
+#define MOVE_CONFUSION 93
+#define MOVE_PSYCHIC 94
+#define MOVE_HYPNOSIS 95
+#define MOVE_MEDITATE 96
+#define MOVE_AGILITY 97
+#define MOVE_QUICK_ATTACK 98
+#define MOVE_RAGE 99
+#define MOVE_TELEPORT 100
+#define MOVE_NIGHT_SHADE 101
+#define MOVE_MIMIC 102
+#define MOVE_SCREECH 103
+#define MOVE_DOUBLE_TEAM 104
+#define MOVE_RECOVER 105
+#define MOVE_HARDEN 106
+#define MOVE_MINIMIZE 107
+#define MOVE_SMOKESCREEN 108
+#define MOVE_CONFUSE_RAY 109
+#define MOVE_WITHDRAW 110
+#define MOVE_DEFENSE_CURL 111
+#define MOVE_BARRIER 112
+#define MOVE_LIGHT_SCREEN 113
+#define MOVE_HAZE 114
+#define MOVE_REFLECT 115
+#define MOVE_FOCUS_ENERGY 116
+#define MOVE_BIDE 117
+#define MOVE_METRONOME 118
+#define MOVE_MIRROR_MOVE 119
+#define MOVE_SELF_DESTRUCT 120
+#define MOVE_EGG_BOMB 121
+#define MOVE_LICK 122
+#define MOVE_SMOG 123
+#define MOVE_SLUDGE 124
+#define MOVE_BONE_CLUB 125
+#define MOVE_FIRE_BLAST 126
+#define MOVE_WATERFALL 127
+#define MOVE_CLAMP 128
+#define MOVE_SWIFT 129
+#define MOVE_SKULL_BASH 130
+#define MOVE_SPIKE_CANNON 131
+#define MOVE_CONSTRICT 132
+#define MOVE_AMNESIA 133
+#define MOVE_KINESIS 134
+#define MOVE_SOFT_BOILED 135
+#define MOVE_HI_JUMP_KICK 136
+#define MOVE_GLARE 137
+#define MOVE_DREAM_EATER 138
+#define MOVE_POISON_GAS 139
+#define MOVE_BARRAGE 140
+#define MOVE_LEECH_LIFE 141
+#define MOVE_LOVELY_KISS 142
+#define MOVE_SKY_ATTACK 143
+#define MOVE_TRANSFORM 144
+#define MOVE_BUBBLE 145
+#define MOVE_DIZZY_PUNCH 146
+#define MOVE_SPORE 147
+#define MOVE_FLASH 148
+#define MOVE_PSYWAVE 149
+#define MOVE_SPLASH 150
+#define MOVE_ACID_ARMOR 151
+#define MOVE_CRABHAMMER 152
+#define MOVE_EXPLOSION 153
+#define MOVE_FURY_SWIPES 154
+#define MOVE_BONEMERANG 155
+#define MOVE_REST 156
+#define MOVE_ROCK_SLIDE 157
+#define MOVE_HYPER_FANG 158
+#define MOVE_SHARPEN 159
+#define MOVE_CONVERSION 160
+#define MOVE_TRI_ATTACK 161
+#define MOVE_SUPER_FANG 162
+#define MOVE_SLASH 163
+#define MOVE_SUBSTITUTE 164
+#define MOVE_STRUGGLE 165
+#define MOVE_SKETCH 166
+#define MOVE_TRIPLE_KICK 167
+#define MOVE_THIEF 168
+#define MOVE_SPIDER_WEB 169
+#define MOVE_MIND_READER 170
+#define MOVE_NIGHTMARE 171
+#define MOVE_FLAME_WHEEL 172
+#define MOVE_SNORE 173
+#define MOVE_CURSE 174
+#define MOVE_FLAIL 175
+#define MOVE_CONVERSION_2 176
+#define MOVE_AEROBLAST 177
+#define MOVE_COTTON_SPORE 178
+#define MOVE_REVERSAL 179
+#define MOVE_SPITE 180
+#define MOVE_POWDER_SNOW 181
+#define MOVE_PROTECT 182
+#define MOVE_MACH_PUNCH 183
+#define MOVE_SCARY_FACE 184
+#define MOVE_FAINT_ATTACK 185
+#define MOVE_SWEET_KISS 186
+#define MOVE_BELLY_DRUM 187
+#define MOVE_SLUDGE_BOMB 188
+#define MOVE_MUD_SLAP 189
+#define MOVE_OCTAZOOKA 190
+#define MOVE_SPIKES 191
+#define MOVE_ZAP_CANNON 192
+#define MOVE_FORESIGHT 193
+#define MOVE_DESTINY_BOND 194
+#define MOVE_PERISH_SONG 195
+#define MOVE_ICY_WIND 196
+#define MOVE_DETECT 197
+#define MOVE_BONE_RUSH 198
+#define MOVE_LOCK_ON 199
+#define MOVE_OUTRAGE 200
+#define MOVE_SANDSTORM 201
+#define MOVE_GIGA_DRAIN 202
+#define MOVE_ENDURE 203
+#define MOVE_CHARM 204
+#define MOVE_ROLLOUT 205
+#define MOVE_FALSE_SWIPE 206
+#define MOVE_SWAGGER 207
+#define MOVE_MILK_DRINK 208
+#define MOVE_SPARK 209
+#define MOVE_FURY_CUTTER 210
+#define MOVE_STEEL_WING 211
+#define MOVE_MEAN_LOOK 212
+#define MOVE_ATTRACT 213
+#define MOVE_SLEEP_TALK 214
+#define MOVE_HEAL_BELL 215
+#define MOVE_RETURN 216
+#define MOVE_PRESENT 217
+#define MOVE_FRUSTRATION 218
+#define MOVE_SAFEGUARD 219
+#define MOVE_PAIN_SPLIT 220
+#define MOVE_SACRED_FIRE 221
+#define MOVE_MAGNITUDE 222
+#define MOVE_DYNAMIC_PUNCH 223
+#define MOVE_MEGAHORN 224
+#define MOVE_DRAGON_BREATH 225
+#define MOVE_BATON_PASS 226
+#define MOVE_ENCORE 227
+#define MOVE_PURSUIT 228
+#define MOVE_RAPID_SPIN 229
+#define MOVE_SWEET_SCENT 230
+#define MOVE_IRON_TAIL 231
+#define MOVE_METAL_CLAW 232
+#define MOVE_VITAL_THROW 233
+#define MOVE_MORNING_SUN 234
+#define MOVE_SYNTHESIS 235
+#define MOVE_MOONLIGHT 236
+#define MOVE_HIDDEN_POWER 237
+#define MOVE_CROSS_CHOP 238
+#define MOVE_TWISTER 239
+#define MOVE_RAIN_DANCE 240
+#define MOVE_SUNNY_DAY 241
+#define MOVE_CRUNCH 242
+#define MOVE_MIRROR_COAT 243
+#define MOVE_PSYCH_UP 244
+#define MOVE_EXTREME_SPEED 245
+#define MOVE_ANCIENT_POWER 246
+#define MOVE_SHADOW_BALL 247
+#define MOVE_FUTURE_SIGHT 248
+#define MOVE_ROCK_SMASH 249
+#define MOVE_WHIRLPOOL 250
+#define MOVE_BEAT_UP 251
+#define MOVE_FAKE_OUT 252
+#define MOVE_UPROAR 253
+#define MOVE_STOCKPILE 254
+#define MOVE_SPIT_UP 255
+#define MOVE_SWALLOW 256
+#define MOVE_HEAT_WAVE 257
+#define MOVE_HAIL 258
+#define MOVE_TORMENT 259
+#define MOVE_FLATTER 260
+#define MOVE_WILL_O_WISP 261
+#define MOVE_MEMENTO 262
+#define MOVE_FACADE 263
+#define MOVE_FOCUS_PUNCH 264
+#define MOVE_SMELLING_SALT 265
+#define MOVE_FOLLOW_ME 266
+#define MOVE_NATURE_POWER 267
+#define MOVE_CHARGE 268
+#define MOVE_TAUNT 269
+#define MOVE_HELPING_HAND 270
+#define MOVE_TRICK 271
+#define MOVE_ROLE_PLAY 272
+#define MOVE_WISH 273
+#define MOVE_ASSIST 274
+#define MOVE_INGRAIN 275
+#define MOVE_SUPERPOWER 276
+#define MOVE_MAGIC_COAT 277
+#define MOVE_RECYCLE 278
+#define MOVE_REVENGE 279
+#define MOVE_BRICK_BREAK 280
+#define MOVE_YAWN 281
+#define MOVE_KNOCK_OFF 282
+#define MOVE_ENDEAVOR 283
+#define MOVE_ERUPTION 284
+#define MOVE_SKILL_SWAP 285
+#define MOVE_IMPRISON 286
+#define MOVE_REFRESH 287
+#define MOVE_GRUDGE 288
+#define MOVE_SNATCH 289
+#define MOVE_SECRET_POWER 290
+#define MOVE_DIVE 291
+#define MOVE_ARM_THRUST 292
+#define MOVE_CAMOUFLAGE 293
+#define MOVE_TAIL_GLOW 294
+#define MOVE_LUSTER_PURGE 295
+#define MOVE_MIST_BALL 296
+#define MOVE_FEATHER_DANCE 297
+#define MOVE_TEETER_DANCE 298
+#define MOVE_BLAZE_KICK 299
+#define MOVE_MUD_SPORT 300
+#define MOVE_ICE_BALL 301
+#define MOVE_NEEDLE_ARM 302
+#define MOVE_SLACK_OFF 303
+#define MOVE_HYPER_VOICE 304
+#define MOVE_POISON_FANG 305
+#define MOVE_CRUSH_CLAW 306
+#define MOVE_BLAST_BURN 307
+#define MOVE_HYDRO_CANNON 308
+#define MOVE_METEOR_MASH 309
+#define MOVE_ASTONISH 310
+#define MOVE_WEATHER_BALL 311
+#define MOVE_AROMATHERAPY 312
+#define MOVE_FAKE_TEARS 313
+#define MOVE_AIR_CUTTER 314
+#define MOVE_OVERHEAT 315
+#define MOVE_ODOR_SLEUTH 316
+#define MOVE_ROCK_TOMB 317
+#define MOVE_SILVER_WIND 318
+#define MOVE_METAL_SOUND 319
+#define MOVE_GRASS_WHISTLE 320
+#define MOVE_TICKLE 321
+#define MOVE_COSMIC_POWER 322
+#define MOVE_WATER_SPOUT 323
+#define MOVE_SIGNAL_BEAM 324
+#define MOVE_SHADOW_PUNCH 325
+#define MOVE_EXTRASENSORY 326
+#define MOVE_SKY_UPPERCUT 327
+#define MOVE_SAND_TOMB 328
+#define MOVE_SHEER_COLD 329
+#define MOVE_MUDDY_WATER 330
+#define MOVE_BULLET_SEED 331
+#define MOVE_AERIAL_ACE 332
+#define MOVE_ICICLE_SPEAR 333
+#define MOVE_IRON_DEFENSE 334
+#define MOVE_BLOCK 335
+#define MOVE_HOWL 336
+#define MOVE_DRAGON_CLAW 337
+#define MOVE_FRENZY_PLANT 338
+#define MOVE_BULK_UP 339
+#define MOVE_BOUNCE 340
+#define MOVE_MUD_SHOT 341
+#define MOVE_POISON_TAIL 342
+#define MOVE_COVET 343
+#define MOVE_VOLT_TACKLE 344
+#define MOVE_MAGICAL_LEAF 345
+#define MOVE_WATER_SPORT 346
+#define MOVE_CALM_MIND 347
+#define MOVE_LEAF_BLADE 348
+#define MOVE_DRAGON_DANCE 349
+#define MOVE_ROCK_BLAST 350
+#define MOVE_SHOCK_WAVE 351
+#define MOVE_WATER_PULSE 352
+#define MOVE_DOOM_DESIRE 353
+#define MOVE_PSYCHO_BOOST 354
+
+#define LAST_MOVE_INDEX MOVE_PSYCHO_BOOST
+
+#endif // GUARD_CONSTANTS_MOVES_H
diff --git a/include/constants/songs.h b/include/constants/songs.h
new file mode 100644
index 000000000..2e3adcbbf
--- /dev/null
+++ b/include/constants/songs.h
@@ -0,0 +1,465 @@
+#ifndef GUARD_CONSTANTS_SONGS_H
+#define GUARD_CONSTANTS_SONGS_H
+
+#define SE_STOP 0
+#define SE_KAIFUKU 1
+#define SE_PC_LOGON 2
+#define SE_PC_OFF 3
+#define SE_PC_ON 4
+#define SE_SELECT 5
+#define SE_WIN_OPEN 6
+#define SE_WALL_HIT 7
+#define SE_DOOR 8
+#define SE_KAIDAN 9
+#define SE_DANSA 10
+#define SE_JITENSYA 11
+#define SE_KOUKA_L 12
+#define SE_KOUKA_M 13
+#define SE_KOUKA_H 14
+#define SE_BOWA2 15
+#define SE_POKE_DEAD 16
+#define SE_NIGERU 17
+#define SE_JIDO_DOA 18
+#define SE_NAMINORI 19
+#define SE_BAN 20
+#define SE_PIN 21
+#define SE_BOO 22
+#define SE_BOWA 23
+#define SE_JYUNI 24
+#define SE_A 25
+#define SE_I 26
+#define SE_U 27
+#define SE_E 28
+#define SE_O 29
+#define SE_N 30
+#define SE_SEIKAI 31
+#define SE_HAZURE 32
+#define SE_EXP 33
+#define SE_JITE_PYOKO 34
+#define SE_MU_PACHI 35
+#define SE_TK_KASYA 36
+#define SE_FU_ZAKU 37
+#define SE_FU_ZAKU2 38
+#define SE_FU_ZUZUZU 39
+#define SE_RU_GASHIN 40
+#define SE_RU_GASYAN 41
+#define SE_RU_BARI 42
+#define SE_RU_HYUU 43
+#define SE_KI_GASYAN 44
+#define SE_TK_WARPIN 45
+#define SE_TK_WARPOUT 46
+#define SE_TU_SAA 47
+#define SE_HI_TURUN 48
+#define SE_TRACK_MOVE 49
+#define SE_TRACK_STOP 50
+#define SE_TRACK_HAIK 51
+#define SE_TRACK_DOOR 52
+#define SE_MOTER 53
+#define SE_CARD 54
+#define SE_SAVE 55
+#define SE_KON 56
+#define SE_KON2 57
+#define SE_KON3 58
+#define SE_KON4 59
+#define SE_SUIKOMU 60
+#define SE_NAGERU 61
+#define SE_TOY_C 62
+#define SE_TOY_D 63
+#define SE_TOY_E 64
+#define SE_TOY_F 65
+#define SE_TOY_G 66
+#define SE_TOY_A 67
+#define SE_TOY_B 68
+#define SE_TOY_C1 69
+#define SE_MIZU 70
+#define SE_HASHI 71
+#define SE_DAUGI 72
+#define SE_PINPON 73
+#define SE_FUUSEN1 74
+#define SE_FUUSEN2 75
+#define SE_FUUSEN3 76
+#define SE_TOY_KABE 77
+#define SE_TOY_DANGO 78
+#define SE_DOKU 79
+#define SE_ESUKA 80
+#define SE_T_AME 81
+#define SE_T_AME_E 82
+#define SE_T_OOAME 83
+#define SE_T_OOAME_E 84
+#define SE_T_KOAME 85
+#define SE_T_KOAME_E 86
+#define SE_T_KAMI 87
+#define SE_T_KAMI2 88
+#define SE_ELEBETA 89
+#define SE_HINSI 90
+#define SE_EXPMAX 91
+#define SE_TAMAKORO 92
+#define SE_TAMAKORO_E 93
+#define SE_BASABASA 94
+#define SE_REGI 95
+#define SE_C_GAJI 96
+#define SE_C_MAKU_U 97
+#define SE_C_MAKU_D 98
+#define SE_C_PASI 99
+#define SE_C_SYU 100
+#define SE_C_PIKON 101
+#define SE_REAPOKE 102
+#define SE_OP_BASYU 103
+#define SE_BT_START 104
+#define SE_DENDOU 105
+#define SE_JIHANKI 106
+#define SE_TAMA 107
+#define SE_Z_SCROLL 108
+#define SE_Z_PAGE 109
+#define SE_PN_ON 110
+#define SE_PN_OFF 111
+#define SE_Z_SEARCH 112
+#define SE_TAMAGO 113
+#define SE_TB_START 114
+#define SE_TB_KON 115
+#define SE_TB_KARA 116
+#define SE_BIDORO 117
+#define SE_W085 118
+#define SE_W085B 119
+#define SE_W231 120
+#define SE_W171 121
+#define SE_W233 122
+#define SE_W233B 123
+#define SE_W145 124
+#define SE_W145B 125
+#define SE_W145C 126
+#define SE_W240 127
+#define SE_W015 128
+#define SE_W081 129
+#define SE_W081B 130
+#define SE_W088 131
+#define SE_W016 132
+#define SE_W016B 133
+#define SE_W003 134
+#define SE_W104 135
+#define SE_W013 136
+#define SE_W196 137
+#define SE_W086 138
+#define SE_W004 139
+#define SE_W025 140
+#define SE_W025B 141
+#define SE_W152 142
+#define SE_W026 143
+#define SE_W172 144
+#define SE_W172B 145
+#define SE_W053 146
+#define SE_W007 147
+#define SE_W092 148
+#define SE_W221 149
+#define SE_W221B 150
+#define SE_W052 151
+#define SE_W036 152
+#define SE_W059 153
+#define SE_W059B 154
+#define SE_W010 155
+#define SE_W011 156
+#define SE_W017 157
+#define SE_W019 158
+#define SE_W028 159
+#define SE_W013B 160
+#define SE_W044 161
+#define SE_W029 162
+#define SE_W057 163
+#define SE_W056 164
+#define SE_W250 165
+#define SE_W030 166
+#define SE_W039 167
+#define SE_W054 168
+#define SE_W077 169
+#define SE_W020 170
+#define SE_W082 171
+#define SE_W047 172
+#define SE_W195 173
+#define SE_W006 174
+#define SE_W091 175
+#define SE_W146 176
+#define SE_W120 177
+#define SE_W153 178
+#define SE_W071B 179
+#define SE_W071 180
+#define SE_W103 181
+#define SE_W062 182
+#define SE_W062B 183
+#define SE_W048 184
+#define SE_W187 185
+#define SE_W118 186
+#define SE_W155 187
+#define SE_W122 188
+#define SE_W060 189
+#define SE_W185 190
+#define SE_W014 191
+#define SE_W043 192
+#define SE_W207 193
+#define SE_W207B 194
+#define SE_W215 195
+#define SE_W109 196
+#define SE_W173 197
+#define SE_W280 198
+#define SE_W202 199
+#define SE_W060B 200
+#define SE_W076 201
+#define SE_W080 202
+#define SE_W100 203
+#define SE_W107 204
+#define SE_W166 205
+#define SE_W129 206
+#define SE_W115 207
+#define SE_W112 208
+#define SE_W197 209
+#define SE_W199 210
+#define SE_W236 211
+#define SE_W204 212
+#define SE_W268 213
+#define SE_W070 214
+#define SE_W063 215
+#define SE_W127 216
+#define SE_W179 217
+#define SE_W151 218
+#define SE_W201 219
+#define SE_W161 220
+#define SE_W161B 221
+#define SE_W227 222
+#define SE_W227B 223
+#define SE_W226 224
+#define SE_W208 225
+#define SE_W213 226
+#define SE_W213B 227
+#define SE_W234 228
+#define SE_W260 229
+#define SE_W328 230
+#define SE_W320 231
+#define SE_W255 232
+#define SE_W291 233
+#define SE_W089 234
+#define SE_W239 235
+#define SE_W230 236
+#define SE_W281 237
+#define SE_W327 238
+#define SE_W287 239
+#define SE_W257 240
+#define SE_W253 241
+#define SE_W258 242
+#define SE_W322 243
+#define SE_W298 244
+#define SE_W287B 245
+#define SE_W114 246
+#define SE_W063B 247
+#define BGM_STOP 349
+#define BGM_TETSUJI 350
+#define BGM_FIELD13 351
+#define BGM_KACHI22 352
+#define BGM_KACHI2 353
+#define BGM_KACHI3 354
+#define BGM_KACHI5 355
+#define BGM_PCC 356
+#define BGM_NIBI 357
+#define BGM_SUIKUN 358
+#define BGM_DOORO1 359
+#define BGM_DOORO_X1 360
+#define BGM_DOORO_X3 361
+#define BGM_MACHI_S2 362
+#define BGM_MACHI_S4 363
+#define BGM_GIM 364
+#define BGM_NAMINORI 365
+#define BGM_DAN01 366
+#define BGM_FANFA1 367
+#define BGM_ME_ASA 368
+#define BGM_ME_BACHI 369
+#define BGM_FANFA4 370
+#define BGM_FANFA5 371
+#define BGM_ME_WAZA 372
+#define BGM_BIJYUTU 373
+#define BGM_DOORO_X4 374
+#define BGM_FUNE_KAN 375
+#define BGM_ME_SHINKA 376
+#define BGM_SHINKA 377
+#define BGM_ME_WASURE 378
+#define BGM_SYOUJOEYE 379
+#define BGM_BOYEYE 380
+#define BGM_DAN02 381
+#define BGM_MACHI_S3 382
+#define BGM_ODAMAKI 383
+#define BGM_B_TOWER 384
+#define BGM_SWIMEYE 385
+#define BGM_DAN03 386
+#define BGM_ME_KINOMI 387
+#define BGM_ME_TAMA 388
+#define BGM_ME_B_BIG 389
+#define BGM_ME_B_SMALL 390
+#define BGM_ME_ZANNEN 391
+#define BGM_BD_TIME 392
+#define BGM_TEST1 393
+#define BGM_TEST2 394
+#define BGM_TEST3 395
+#define BGM_TEST4 396
+#define BGM_TEST 397
+#define BGM_GOMACHI0 398
+#define BGM_GOTOWN 399
+#define BGM_POKECEN 400
+#define BGM_NEXTROAD 401
+#define BGM_GRANROAD 402
+#define BGM_CYCLING 403
+#define BGM_FRIENDLY 404
+#define BGM_MISHIRO 405
+#define BGM_TOZAN 406
+#define BGM_GIRLEYE 407
+#define BGM_MINAMO 408
+#define BGM_ASHROAD 409
+#define BGM_EVENT0 410
+#define BGM_DEEPDEEP 411
+#define BGM_KACHI1 412
+#define BGM_TITLE3 413
+#define BGM_DEMO1 414
+#define BGM_GIRL_SUP 415
+#define BGM_HAGESHII 416
+#define BGM_KAKKOII 417
+#define BGM_KAZANBAI 418
+#define BGM_AQA_0 419
+#define BGM_TSURETEK 420
+#define BGM_BOY_SUP 421
+#define BGM_RAINBOW 422
+#define BGM_AYASII 423
+#define BGM_KACHI4 424
+#define BGM_ROPEWAY 425
+#define BGM_CASINO 426
+#define BGM_HIGHTOWN 427
+#define BGM_SAFARI 428
+#define BGM_C_ROAD 429
+#define BGM_AJITO 430
+#define BGM_M_BOAT 431
+#define BGM_M_DUNGON 432
+#define BGM_FINECITY 433
+#define BGM_MACHUPI 434
+#define BGM_P_SCHOOL 435
+#define BGM_DENDOU 436
+#define BGM_TONEKUSA 437
+#define BGM_MABOROSI 438
+#define BGM_CON_FAN 439
+#define BGM_CONTEST0 440
+#define BGM_MGM0 441
+#define BGM_T_BATTLE 442
+#define BGM_OOAME 443
+#define BGM_HIDERI 444
+#define BGM_RUNECITY 445
+#define BGM_CON_K 446
+#define BGM_EIKOU_R 447
+#define BGM_KARAKURI 448
+#define BGM_HUTAGO 449
+#define BGM_SITENNOU 450
+#define BGM_YAMA_EYE 451
+#define BGM_CONLOBBY 452
+#define BGM_INTER_V 453
+#define BGM_DAIGO 454
+#define BGM_THANKFOR 455
+#define BGM_END 456
+#define BGM_BATTLE_FRONTIER 457
+#define BGM_BATTLE_ARENA 458
+#define BGM_ME_BATTLE_POINTS 459
+#define BGM_ME_MATCH_CALL 460
+#define BGM_BATTLE_PYRAMID 461
+#define BGM_BATTLE_PYRAMID_SUMMIT 462
+#define BGM_BATTLE_PALACE 463
+#define BGM_FANFA_RAYQUAZA 464
+#define BGM_BATTLE_TOWER 465
+#define BGM_ME_BATTLE_SYMBOL 466
+#define BGM_BATTLE_DOME_TOURNAMENT 467
+#define BGM_BATTLE_PIKE 468
+#define BGM_BATTLE_FACTORY 469
+#define BGM_BATTLE_LEGENDARY 470
+#define BGM_BATTLE_FRONTIER_BRAIN 471
+#define BGM_BATTLE_MEW 472
+#define BGM_BATTLE_DOME 473
+#define BGM_BATTLE27 474
+#define BGM_BATTLE31 475
+#define BGM_BATTLE20 476
+#define BGM_BATTLE32 477
+#define BGM_BATTLE33 478
+#define BGM_BATTLE36 479
+#define BGM_BATTLE34 480
+#define BGM_BATTLE35 481
+#define BGM_BATTLE38 482
+#define BGM_BATTLE30 483
+#define BGM_FRLG_FOLLOW_ME 484
+#define BGM_FRLG_GAMECORNER 485
+#define BGM_FRLG_ROCKET_HIDEOUT 486
+#define BGM_FRLG_GYM 487
+#define BGM_FRLG_JIGGLYPUFF 488
+#define BGM_FRLG_OPENING 489
+#define BGM_FRLG_TITLE 490
+#define BGM_FRLG_CINNABAR_ISLAND 491
+#define BGM_FRLG_LAVENDER_TOWN 492
+#define BGM_FRLG_HEALING_TEST 493
+#define BGM_FRLG_BICYCLE 494
+#define BGM_FRLG_SUSPICIOUS_EYE 495
+#define BGM_FRLG_GIRL_EYE 496
+#define BGM_FRLG_BOY_EYE 497
+#define BGM_FRLG_CONGRATULATIONS_HALL_OF_FAME 498
+#define BGM_FRLG_VIRIDIAN_FOREST 499
+#define BGM_FRLG_MT_MOON 500
+#define BGM_FRLG_POKEMON_MANSION 501
+#define BGM_FRLG_CREDITS 502
+#define BGM_FRLG_ROUTE_1 503
+#define BGM_FRLG_ROUTE_24 504
+#define BGM_FRLG_ROUTE_3 505
+#define BGM_FRLG_ROUTE_11 506
+#define BGM_FRLG_INDIGO_PLATEAU 507
+#define BGM_FRLG_BATTLE_LEADER 508
+#define BGM_FRLG_BATTLE_TRAINER 509
+#define BGM_FRLG_BATTLE_WILD_POKEMON 510
+#define BGM_FRLG_BATTLE_CHAMPION 511
+#define BGM_FRLG_PALLET_TOWN 512
+#define BGM_FRLG_OAK_LAB 513
+#define BGM_FRLG_PROF_OAK 514
+#define BGM_FRLG_POKEMON_CENTER 515
+#define BGM_FRLG_SS_ANNE 516
+#define BGM_FRLG_SURF 517
+#define BGM_FRLG_POKEMON_TOWER 518
+#define BGM_FRLG_SILPH 519
+#define BGM_FRLG_CERULEAN_CITY 520
+#define BGM_FRLG_CELADON_CITY 521
+#define BGM_FRLG_KACHI_TRAINER 522
+#define BGM_FRLG_KACHI_WILD_POKEMON 523
+#define BGM_FRLG_KACHI_LEADER 524
+#define BGM_FRLG_VERMILION_CITY 525
+#define BGM_FRLG_VIRIDIAN_CITY 526
+#define BGM_FRLG_RIVAL 527
+#define BGM_FRLG_RIVAL_POSTBATTLE 528
+#define BGM_FRLG_ME_POKEDEX_EVAL 529
+#define BGM_FRLG_ME_KEYITEM 530
+#define BGM_FRLG_FANFA_POKEMON_CAUGHT 531
+#define BGM_FRLG_FANFA_TRAINERCARD_PHOTO 532
+#define BGM_FRLG_GAMEFREAK_LOGO 533
+#define BGM_FRLG_CAUGHT_POKEMON 534
+#define BGM_FRLG_GAME_EXPLANATION_START 535
+#define BGM_FRLG_GAME_EXPLANATION_MIDDLE 536
+#define BGM_FRLG_GAME_EXPLANATION_END 537
+#define BGM_FRLG_POKEMON_JUMP 538
+#define BGM_FRLG_UNION_ROOM 539
+#define BGM_FRLG_POKEMON_NETWORK_CENTER 540
+#define BGM_FRLG_MYSTERY_GIFT 541
+#define BGM_FRLG_DODRIO_BERRY_PICK 542
+#define BGM_FRLG_MT_EMBER 543
+#define BGM_FRLG_TEACHY_TV_EPISODE 544
+#define BGM_FRLG_SEVII_ISLANDS 545
+#define BGM_FRLG_TANOBY_RUINS 546
+#define BGM_FRLG_ISLAND_ONE 547
+#define BGM_FRLG_ISLAND_FOUR 548
+#define BGM_FRLG_ISLAND_SIX 549
+#define BGM_FRLG_FLUTE 550
+#define BGM_FRLG_BATTLE_DEOXYS 551
+#define BGM_FRLG_BATTLE_MEWTWO 552
+#define BGM_FRLG_BATTLE_LEGENDARY 553
+#define BGM_FRLG_LEADER_EYE 554
+#define BGM_FRLG_DEOXYS_EYE 555
+#define BGM_FRLG_TRAINER_TOWER 556
+#define BGM_FRLG_HALL_OF_FAME_PALLET_TOWN 557
+#define BGM_FRLG_TEACHY_TV 558
+
+#define BGM_ROUTE_118 0x7FFF // What is this for?
+
+#endif // GUARD_CONSTANTS_SONGS_H
diff --git a/include/constants/species.h b/include/constants/species.h
new file mode 100644
index 000000000..f698ada14
--- /dev/null
+++ b/include/constants/species.h
@@ -0,0 +1,450 @@
+#ifndef GUARD_CONSTANTS_SPECIES_H
+#define GUARD_CONSTANTS_SPECIES_H
+
+#define SPECIES_NONE 0
+#define SPECIES_BULBASAUR 1
+#define SPECIES_IVYSAUR 2
+#define SPECIES_VENUSAUR 3
+#define SPECIES_CHARMANDER 4
+#define SPECIES_CHARMELEON 5
+#define SPECIES_CHARIZARD 6
+#define SPECIES_SQUIRTLE 7
+#define SPECIES_WARTORTLE 8
+#define SPECIES_BLASTOISE 9
+#define SPECIES_CATERPIE 10
+#define SPECIES_METAPOD 11
+#define SPECIES_BUTTERFREE 12
+#define SPECIES_WEEDLE 13
+#define SPECIES_KAKUNA 14
+#define SPECIES_BEEDRILL 15
+#define SPECIES_PIDGEY 16
+#define SPECIES_PIDGEOTTO 17
+#define SPECIES_PIDGEOT 18
+#define SPECIES_RATTATA 19
+#define SPECIES_RATICATE 20
+#define SPECIES_SPEAROW 21
+#define SPECIES_FEAROW 22
+#define SPECIES_EKANS 23
+#define SPECIES_ARBOK 24
+#define SPECIES_PIKACHU 25
+#define SPECIES_RAICHU 26
+#define SPECIES_SANDSHREW 27
+#define SPECIES_SANDSLASH 28
+#define SPECIES_NIDORAN_F 29
+#define SPECIES_NIDORINA 30
+#define SPECIES_NIDOQUEEN 31
+#define SPECIES_NIDORAN_M 32
+#define SPECIES_NIDORINO 33
+#define SPECIES_NIDOKING 34
+#define SPECIES_CLEFAIRY 35
+#define SPECIES_CLEFABLE 36
+#define SPECIES_VULPIX 37
+#define SPECIES_NINETALES 38
+#define SPECIES_JIGGLYPUFF 39
+#define SPECIES_WIGGLYTUFF 40
+#define SPECIES_ZUBAT 41
+#define SPECIES_GOLBAT 42
+#define SPECIES_ODDISH 43
+#define SPECIES_GLOOM 44
+#define SPECIES_VILEPLUME 45
+#define SPECIES_PARAS 46
+#define SPECIES_PARASECT 47
+#define SPECIES_VENONAT 48
+#define SPECIES_VENOMOTH 49
+#define SPECIES_DIGLETT 50
+#define SPECIES_DUGTRIO 51
+#define SPECIES_MEOWTH 52
+#define SPECIES_PERSIAN 53
+#define SPECIES_PSYDUCK 54
+#define SPECIES_GOLDUCK 55
+#define SPECIES_MANKEY 56
+#define SPECIES_PRIMEAPE 57
+#define SPECIES_GROWLITHE 58
+#define SPECIES_ARCANINE 59
+#define SPECIES_POLIWAG 60
+#define SPECIES_POLIWHIRL 61
+#define SPECIES_POLIWRATH 62
+#define SPECIES_ABRA 63
+#define SPECIES_KADABRA 64
+#define SPECIES_ALAKAZAM 65
+#define SPECIES_MACHOP 66
+#define SPECIES_MACHOKE 67
+#define SPECIES_MACHAMP 68
+#define SPECIES_BELLSPROUT 69
+#define SPECIES_WEEPINBELL 70
+#define SPECIES_VICTREEBEL 71
+#define SPECIES_TENTACOOL 72
+#define SPECIES_TENTACRUEL 73
+#define SPECIES_GEODUDE 74
+#define SPECIES_GRAVELER 75
+#define SPECIES_GOLEM 76
+#define SPECIES_PONYTA 77
+#define SPECIES_RAPIDASH 78
+#define SPECIES_SLOWPOKE 79
+#define SPECIES_SLOWBRO 80
+#define SPECIES_MAGNEMITE 81
+#define SPECIES_MAGNETON 82
+#define SPECIES_FARFETCHD 83
+#define SPECIES_DODUO 84
+#define SPECIES_DODRIO 85
+#define SPECIES_SEEL 86
+#define SPECIES_DEWGONG 87
+#define SPECIES_GRIMER 88
+#define SPECIES_MUK 89
+#define SPECIES_SHELLDER 90
+#define SPECIES_CLOYSTER 91
+#define SPECIES_GASTLY 92
+#define SPECIES_HAUNTER 93
+#define SPECIES_GENGAR 94
+#define SPECIES_ONIX 95
+#define SPECIES_DROWZEE 96
+#define SPECIES_HYPNO 97
+#define SPECIES_KRABBY 98
+#define SPECIES_KINGLER 99
+#define SPECIES_VOLTORB 100
+#define SPECIES_ELECTRODE 101
+#define SPECIES_EXEGGCUTE 102
+#define SPECIES_EXEGGUTOR 103
+#define SPECIES_CUBONE 104
+#define SPECIES_MAROWAK 105
+#define SPECIES_HITMONLEE 106
+#define SPECIES_HITMONCHAN 107
+#define SPECIES_LICKITUNG 108
+#define SPECIES_KOFFING 109
+#define SPECIES_WEEZING 110
+#define SPECIES_RHYHORN 111
+#define SPECIES_RHYDON 112
+#define SPECIES_CHANSEY 113
+#define SPECIES_TANGELA 114
+#define SPECIES_KANGASKHAN 115
+#define SPECIES_HORSEA 116
+#define SPECIES_SEADRA 117
+#define SPECIES_GOLDEEN 118
+#define SPECIES_SEAKING 119
+#define SPECIES_STARYU 120
+#define SPECIES_STARMIE 121
+#define SPECIES_MR_MIME 122
+#define SPECIES_SCYTHER 123
+#define SPECIES_JYNX 124
+#define SPECIES_ELECTABUZZ 125
+#define SPECIES_MAGMAR 126
+#define SPECIES_PINSIR 127
+#define SPECIES_TAUROS 128
+#define SPECIES_MAGIKARP 129
+#define SPECIES_GYARADOS 130
+#define SPECIES_LAPRAS 131
+#define SPECIES_DITTO 132
+#define SPECIES_EEVEE 133
+#define SPECIES_VAPOREON 134
+#define SPECIES_JOLTEON 135
+#define SPECIES_FLAREON 136
+#define SPECIES_PORYGON 137
+#define SPECIES_OMANYTE 138
+#define SPECIES_OMASTAR 139
+#define SPECIES_KABUTO 140
+#define SPECIES_KABUTOPS 141
+#define SPECIES_AERODACTYL 142
+#define SPECIES_SNORLAX 143
+#define SPECIES_ARTICUNO 144
+#define SPECIES_ZAPDOS 145
+#define SPECIES_MOLTRES 146
+#define SPECIES_DRATINI 147
+#define SPECIES_DRAGONAIR 148
+#define SPECIES_DRAGONITE 149
+#define SPECIES_MEWTWO 150
+#define SPECIES_MEW 151
+#define SPECIES_CHIKORITA 152
+#define SPECIES_BAYLEEF 153
+#define SPECIES_MEGANIUM 154
+#define SPECIES_CYNDAQUIL 155
+#define SPECIES_QUILAVA 156
+#define SPECIES_TYPHLOSION 157
+#define SPECIES_TOTODILE 158
+#define SPECIES_CROCONAW 159
+#define SPECIES_FERALIGATR 160
+#define SPECIES_SENTRET 161
+#define SPECIES_FURRET 162
+#define SPECIES_HOOTHOOT 163
+#define SPECIES_NOCTOWL 164
+#define SPECIES_LEDYBA 165
+#define SPECIES_LEDIAN 166
+#define SPECIES_SPINARAK 167
+#define SPECIES_ARIADOS 168
+#define SPECIES_CROBAT 169
+#define SPECIES_CHINCHOU 170
+#define SPECIES_LANTURN 171
+#define SPECIES_PICHU 172
+#define SPECIES_CLEFFA 173
+#define SPECIES_IGGLYBUFF 174
+#define SPECIES_TOGEPI 175
+#define SPECIES_TOGETIC 176
+#define SPECIES_NATU 177
+#define SPECIES_XATU 178
+#define SPECIES_MAREEP 179
+#define SPECIES_FLAAFFY 180
+#define SPECIES_AMPHAROS 181
+#define SPECIES_BELLOSSOM 182
+#define SPECIES_MARILL 183
+#define SPECIES_AZUMARILL 184
+#define SPECIES_SUDOWOODO 185
+#define SPECIES_POLITOED 186
+#define SPECIES_HOPPIP 187
+#define SPECIES_SKIPLOOM 188
+#define SPECIES_JUMPLUFF 189
+#define SPECIES_AIPOM 190
+#define SPECIES_SUNKERN 191
+#define SPECIES_SUNFLORA 192
+#define SPECIES_YANMA 193
+#define SPECIES_WOOPER 194
+#define SPECIES_QUAGSIRE 195
+#define SPECIES_ESPEON 196
+#define SPECIES_UMBREON 197
+#define SPECIES_MURKROW 198
+#define SPECIES_SLOWKING 199
+#define SPECIES_MISDREAVUS 200
+#define SPECIES_UNOWN 201
+#define SPECIES_WOBBUFFET 202
+#define SPECIES_GIRAFARIG 203
+#define SPECIES_PINECO 204
+#define SPECIES_FORRETRESS 205
+#define SPECIES_DUNSPARCE 206
+#define SPECIES_GLIGAR 207
+#define SPECIES_STEELIX 208
+#define SPECIES_SNUBBULL 209
+#define SPECIES_GRANBULL 210
+#define SPECIES_QWILFISH 211
+#define SPECIES_SCIZOR 212
+#define SPECIES_SHUCKLE 213
+#define SPECIES_HERACROSS 214
+#define SPECIES_SNEASEL 215
+#define SPECIES_TEDDIURSA 216
+#define SPECIES_URSARING 217
+#define SPECIES_SLUGMA 218
+#define SPECIES_MAGCARGO 219
+#define SPECIES_SWINUB 220
+#define SPECIES_PILOSWINE 221
+#define SPECIES_CORSOLA 222
+#define SPECIES_REMORAID 223
+#define SPECIES_OCTILLERY 224
+#define SPECIES_DELIBIRD 225
+#define SPECIES_MANTINE 226
+#define SPECIES_SKARMORY 227
+#define SPECIES_HOUNDOUR 228
+#define SPECIES_HOUNDOOM 229
+#define SPECIES_KINGDRA 230
+#define SPECIES_PHANPY 231
+#define SPECIES_DONPHAN 232
+#define SPECIES_PORYGON2 233
+#define SPECIES_STANTLER 234
+#define SPECIES_SMEARGLE 235
+#define SPECIES_TYROGUE 236
+#define SPECIES_HITMONTOP 237
+#define SPECIES_SMOOCHUM 238
+#define SPECIES_ELEKID 239
+#define SPECIES_MAGBY 240
+#define SPECIES_MILTANK 241
+#define SPECIES_BLISSEY 242
+#define SPECIES_RAIKOU 243
+#define SPECIES_ENTEI 244
+#define SPECIES_SUICUNE 245
+#define SPECIES_LARVITAR 246
+#define SPECIES_PUPITAR 247
+#define SPECIES_TYRANITAR 248
+#define SPECIES_LUGIA 249
+#define SPECIES_HO_OH 250
+#define SPECIES_CELEBI 251
+
+#define SPECIES_OLD_UNOWN_B 252
+#define SPECIES_OLD_UNOWN_C 253
+#define SPECIES_OLD_UNOWN_D 254
+#define SPECIES_OLD_UNOWN_E 255
+#define SPECIES_OLD_UNOWN_F 256
+#define SPECIES_OLD_UNOWN_G 257
+#define SPECIES_OLD_UNOWN_H 258
+#define SPECIES_OLD_UNOWN_I 259
+#define SPECIES_OLD_UNOWN_J 260
+#define SPECIES_OLD_UNOWN_K 261
+#define SPECIES_OLD_UNOWN_L 262
+#define SPECIES_OLD_UNOWN_M 263
+#define SPECIES_OLD_UNOWN_N 264
+#define SPECIES_OLD_UNOWN_O 265
+#define SPECIES_OLD_UNOWN_P 266
+#define SPECIES_OLD_UNOWN_Q 267
+#define SPECIES_OLD_UNOWN_R 268
+#define SPECIES_OLD_UNOWN_S 269
+#define SPECIES_OLD_UNOWN_T 270
+#define SPECIES_OLD_UNOWN_U 271
+#define SPECIES_OLD_UNOWN_V 272
+#define SPECIES_OLD_UNOWN_W 273
+#define SPECIES_OLD_UNOWN_X 274
+#define SPECIES_OLD_UNOWN_Y 275
+#define SPECIES_OLD_UNOWN_Z 276
+
+#define SPECIES_TREECKO 277
+#define SPECIES_GROVYLE 278
+#define SPECIES_SCEPTILE 279
+#define SPECIES_TORCHIC 280
+#define SPECIES_COMBUSKEN 281
+#define SPECIES_BLAZIKEN 282
+#define SPECIES_MUDKIP 283
+#define SPECIES_MARSHTOMP 284
+#define SPECIES_SWAMPERT 285
+#define SPECIES_POOCHYENA 286
+#define SPECIES_MIGHTYENA 287
+#define SPECIES_ZIGZAGOON 288
+#define SPECIES_LINOONE 289
+#define SPECIES_WURMPLE 290
+#define SPECIES_SILCOON 291
+#define SPECIES_BEAUTIFLY 292
+#define SPECIES_CASCOON 293
+#define SPECIES_DUSTOX 294
+#define SPECIES_LOTAD 295
+#define SPECIES_LOMBRE 296
+#define SPECIES_LUDICOLO 297
+#define SPECIES_SEEDOT 298
+#define SPECIES_NUZLEAF 299
+#define SPECIES_SHIFTRY 300
+#define SPECIES_NINCADA 301
+#define SPECIES_NINJASK 302
+#define SPECIES_SHEDINJA 303
+#define SPECIES_TAILLOW 304
+#define SPECIES_SWELLOW 305
+#define SPECIES_SHROOMISH 306
+#define SPECIES_BRELOOM 307
+#define SPECIES_SPINDA 308
+#define SPECIES_WINGULL 309
+#define SPECIES_PELIPPER 310
+#define SPECIES_SURSKIT 311
+#define SPECIES_MASQUERAIN 312
+#define SPECIES_WAILMER 313
+#define SPECIES_WAILORD 314
+#define SPECIES_SKITTY 315
+#define SPECIES_DELCATTY 316
+#define SPECIES_KECLEON 317
+#define SPECIES_BALTOY 318
+#define SPECIES_CLAYDOL 319
+#define SPECIES_NOSEPASS 320
+#define SPECIES_TORKOAL 321
+#define SPECIES_SABLEYE 322
+#define SPECIES_BARBOACH 323
+#define SPECIES_WHISCASH 324
+#define SPECIES_LUVDISC 325
+#define SPECIES_CORPHISH 326
+#define SPECIES_CRAWDAUNT 327
+#define SPECIES_FEEBAS 328
+#define SPECIES_MILOTIC 329
+#define SPECIES_CARVANHA 330
+#define SPECIES_SHARPEDO 331
+#define SPECIES_TRAPINCH 332
+#define SPECIES_VIBRAVA 333
+#define SPECIES_FLYGON 334
+#define SPECIES_MAKUHITA 335
+#define SPECIES_HARIYAMA 336
+#define SPECIES_ELECTRIKE 337
+#define SPECIES_MANECTRIC 338
+#define SPECIES_NUMEL 339
+#define SPECIES_CAMERUPT 340
+#define SPECIES_SPHEAL 341
+#define SPECIES_SEALEO 342
+#define SPECIES_WALREIN 343
+#define SPECIES_CACNEA 344
+#define SPECIES_CACTURNE 345
+#define SPECIES_SNORUNT 346
+#define SPECIES_GLALIE 347
+#define SPECIES_LUNATONE 348
+#define SPECIES_SOLROCK 349
+#define SPECIES_AZURILL 350
+#define SPECIES_SPOINK 351
+#define SPECIES_GRUMPIG 352
+#define SPECIES_PLUSLE 353
+#define SPECIES_MINUN 354
+#define SPECIES_MAWILE 355
+#define SPECIES_MEDITITE 356
+#define SPECIES_MEDICHAM 357
+#define SPECIES_SWABLU 358
+#define SPECIES_ALTARIA 359
+#define SPECIES_WYNAUT 360
+#define SPECIES_DUSKULL 361
+#define SPECIES_DUSCLOPS 362
+#define SPECIES_ROSELIA 363
+#define SPECIES_SLAKOTH 364
+#define SPECIES_VIGOROTH 365
+#define SPECIES_SLAKING 366
+#define SPECIES_GULPIN 367
+#define SPECIES_SWALOT 368
+#define SPECIES_TROPIUS 369
+#define SPECIES_WHISMUR 370
+#define SPECIES_LOUDRED 371
+#define SPECIES_EXPLOUD 372
+#define SPECIES_CLAMPERL 373
+#define SPECIES_HUNTAIL 374
+#define SPECIES_GOREBYSS 375
+#define SPECIES_ABSOL 376
+#define SPECIES_SHUPPET 377
+#define SPECIES_BANETTE 378
+#define SPECIES_SEVIPER 379
+#define SPECIES_ZANGOOSE 380
+#define SPECIES_RELICANTH 381
+#define SPECIES_ARON 382
+#define SPECIES_LAIRON 383
+#define SPECIES_AGGRON 384
+#define SPECIES_CASTFORM 385
+#define SPECIES_VOLBEAT 386
+#define SPECIES_ILLUMISE 387
+#define SPECIES_LILEEP 388
+#define SPECIES_CRADILY 389
+#define SPECIES_ANORITH 390
+#define SPECIES_ARMALDO 391
+#define SPECIES_RALTS 392
+#define SPECIES_KIRLIA 393
+#define SPECIES_GARDEVOIR 394
+#define SPECIES_BAGON 395
+#define SPECIES_SHELGON 396
+#define SPECIES_SALAMENCE 397
+#define SPECIES_BELDUM 398
+#define SPECIES_METANG 399
+#define SPECIES_METAGROSS 400
+#define SPECIES_REGIROCK 401
+#define SPECIES_REGICE 402
+#define SPECIES_REGISTEEL 403
+#define SPECIES_KYOGRE 404
+#define SPECIES_GROUDON 405
+#define SPECIES_RAYQUAZA 406
+#define SPECIES_LATIAS 407
+#define SPECIES_LATIOS 408
+#define SPECIES_JIRACHI 409
+#define SPECIES_DEOXYS 410
+#define SPECIES_CHIMECHO 411
+#define SPECIES_EGG 412
+
+#define SPECIES_UNOWN_B 413
+#define SPECIES_UNOWN_C 414
+#define SPECIES_UNOWN_D 415
+#define SPECIES_UNOWN_E 416
+#define SPECIES_UNOWN_F 417
+#define SPECIES_UNOWN_G 418
+#define SPECIES_UNOWN_H 419
+#define SPECIES_UNOWN_I 420
+#define SPECIES_UNOWN_J 421
+#define SPECIES_UNOWN_K 422
+#define SPECIES_UNOWN_L 423
+#define SPECIES_UNOWN_M 424
+#define SPECIES_UNOWN_N 425
+#define SPECIES_UNOWN_O 426
+#define SPECIES_UNOWN_P 427
+#define SPECIES_UNOWN_Q 428
+#define SPECIES_UNOWN_R 429
+#define SPECIES_UNOWN_S 430
+#define SPECIES_UNOWN_T 431
+#define SPECIES_UNOWN_U 432
+#define SPECIES_UNOWN_V 433
+#define SPECIES_UNOWN_W 434
+#define SPECIES_UNOWN_X 435
+#define SPECIES_UNOWN_Y 436
+#define SPECIES_UNOWN_Z 437
+#define SPECIES_UNOWN_EMARK 438
+#define SPECIES_UNOWN_QMARK 439
+
+#define NUM_SPECIES SPECIES_EGG
+
+#endif // GUARD_CONSTANTS_SPECIES_H
diff --git a/include/constants/vars.h b/include/constants/vars.h
new file mode 100644
index 000000000..6dc8d0ccd
--- /dev/null
+++ b/include/constants/vars.h
@@ -0,0 +1,288 @@
+#ifndef GUARD_CONSTANTS_VARS_H
+#define GUARD_CONSTANTS_VARS_H
+
+#define VAR_0x3F20 0x3F20
+
+#define VAR_0x4000 0x4000
+#define VAR_0x4001 0x4001
+#define VAR_0x4002 0x4002
+#define VAR_0x4003 0x4003
+#define VAR_0x4004 0x4004
+#define VAR_0x4005 0x4005
+#define VAR_0x4006 0x4006
+#define VAR_0x4007 0x4007
+#define VAR_0x4008 0x4008
+#define VAR_0x4009 0x4009
+#define VAR_0x400A 0x400A
+#define VAR_0x400B 0x400B
+#define VAR_0x400C 0x400C
+#define VAR_0x400D 0x400D
+#define VAR_0x400E 0x400E
+#define VAR_0x400F 0x400F
+#define VAR_0x4010 0x4010
+#define VAR_0x4011 0x4011
+#define VAR_0x4012 0x4012
+#define VAR_0x4013 0x4013
+#define VAR_0x4014 0x4014
+#define VAR_0x4015 0x4015
+#define VAR_0x4016 0x4016
+#define VAR_0x4017 0x4017
+#define VAR_0x4018 0x4018
+#define VAR_0x4019 0x4019
+#define VAR_0x401A 0x401A
+#define VAR_0x401B 0x401B
+#define VAR_0x401C 0x401C
+#define VAR_0x401D 0x401D
+#define VAR_0x401E 0x401E
+#define VAR_0x401F 0x401F
+#define VAR_RECYCLE_GOODS 0x4020
+#define VAR_REPEL_STEP_COUNT 0x4021
+#define VAR_ICE_STEP_COUNT 0x4022
+#define VAR_FIRST_POKE 0x4023
+#define VAR_MIRAGE_RND_H 0x4024
+#define VAR_MIRAGE_RND_L 0x4025
+#define VAR_SECRET_BASE_MAP 0x4026
+#define VAR_0x4027 0x4027
+#define VAR_0x4028 0x4028
+#define VAR_0x4029 0x4029
+#define VAR_HAPPINESS_STEP_COUNTER 0x402A
+#define VAR_POISON_STEP_COUNTER 0x402B
+#define VAR_RESET_RTC_ENABLE 0x402C
+#define VAR_0x402D 0x402D
+#define VAR_0x402E 0x402E
+
+#define VAR_FRONTIER_MANIAC_FACILITY 0x402F
+
+#define VAR_FRONTIER_GAMBLER_FACILITY 0x4030
+#define VAR_FRONTIER_GAMBLER_SET_FACILITY_F 0x4031
+#define VAR_FRONTIER_GAMBLER_AMOUNT_BET 0x4032
+#define VAR_FRONTIER_GAMBLER_PLACED_BET_F 0x4033
+
+#define VAR_0x4034 0x4034
+#define VAR_0x4035 0x4035
+#define VAR_STORAGE_UNKNOWN 0x4036
+#define VAR_0x4037 0x4037
+#define VAR_0x4038 0x4038
+#define VAR_0x4039 0x4039
+#define VAR_0x403A 0x403A
+#define VAR_0x403B 0x403B
+#define VAR_0x403C 0x403C
+#define VAR_0x403D 0x403D
+#define VAR_ALTERING_CAVE_WILD_SET 0x403E
+#define VAR_0x403F 0x403F
+#define VAR_DAYS 0x4040
+#define VAR_0x4041 0x4041
+#define VAR_0x4042 0x4042
+#define VAR_DEPT_STORE_FLOOR 0x4043
+#define VAR_0x4044 0x4044
+#define VAR_POKELOT_PRIZE 0x4045
+#define VAR_NATIONAL_DEX 0x4046
+#define VAR_SEEDOT_SIZE_RECORD 0x4047
+#define VAR_ASH_GATHER_COUNT 0x4048
+#define VAR_BIRCH_STATE 0x4049
+#define VAR_CRUISE_STEP_COUNT 0x404A
+#define VAR_POKELOT_RND1 0x404B
+#define VAR_POKELOT_RND2 0x404C
+#define VAR_0x404D 0x404D
+#define VAR_0x404E 0x404E
+#define VAR_LOTAD_SIZE_RECORD 0x404F
+#define VAR_0x4050 0x4050
+#define VAR_0x4051 0x4051
+#define VAR_0x4052 0x4052
+#define VAR_0x4053 0x4053
+#define VAR_0x4054 0x4054
+#define VAR_0x4055 0x4055
+#define VAR_0x4056 0x4056
+#define VAR_0x4057 0x4057
+#define VAR_0x4058 0x4058
+#define VAR_0x4059 0x4059
+#define VAR_0x405A 0x405A
+#define VAR_0x405B 0x405B
+#define VAR_0x405C 0x405C
+#define VAR_0x405D 0x405D
+#define VAR_0x405E 0x405E
+#define VAR_0x405F 0x405F
+#define VAR_0x4060 0x4060
+#define VAR_0x4061 0x4061
+#define VAR_0x4062 0x4062
+#define VAR_0x4063 0x4063
+#define VAR_0x4064 0x4064
+#define VAR_0x4065 0x4065
+#define VAR_0x4066 0x4066
+#define VAR_0x4067 0x4067
+#define VAR_0x4068 0x4068
+#define VAR_0x4069 0x4069
+#define VAR_0x406A 0x406A
+#define VAR_0x406B 0x406B
+#define VAR_0x406C 0x406C
+#define VAR_0x406D 0x406D
+#define VAR_0x406E 0x406E
+#define VAR_0x406F 0x406F
+#define VAR_0x4070 0x4070
+#define VAR_0x4071 0x4071
+#define VAR_0x4072 0x4072
+#define VAR_0x4073 0x4073
+#define VAR_0x4074 0x4074
+#define VAR_0x4075 0x4075
+#define VAR_0x4076 0x4076
+#define VAR_0x4077 0x4077
+#define VAR_0x4078 0x4078
+#define VAR_0x4079 0x4079
+#define VAR_0x407A 0x407A
+#define VAR_0x407B 0x407B
+#define VAR_0x407C 0x407C
+#define VAR_0x407D 0x407D
+#define VAR_0x407E 0x407E
+#define VAR_0x407F 0x407F
+#define VAR_0x4080 0x4080
+#define VAR_0x4081 0x4081
+#define VAR_0x4082 0x4082
+#define VAR_0x4083 0x4083
+#define VAR_0x4084 0x4084
+#define VAR_0x4085 0x4085
+#define VAR_0x4086 0x4086
+#define VAR_0x4087 0x4087
+#define VAR_0x4088 0x4088
+#define VAR_0x4089 0x4089
+#define VAR_0x408A 0x408A
+#define VAR_0x408B 0x408B
+#define VAR_0x408C 0x408C
+#define VAR_0x408D 0x408D
+#define VAR_0x408E 0x408E
+#define VAR_0x408F 0x408F
+#define VAR_0x4090 0x4090
+#define VAR_0x4091 0x4091
+#define VAR_0x4092 0x4092
+#define VAR_0x4093 0x4093
+#define VAR_0x4094 0x4094
+#define VAR_0x4095 0x4095
+#define VAR_0x4096 0x4096
+#define VAR_0x4097 0x4097
+#define VAR_0x4098 0x4098
+#define VAR_0x4099 0x4099
+#define VAR_0x409A 0x409A
+#define VAR_0x409B 0x409B
+#define VAR_0x409C 0x409C
+#define VAR_0x409D 0x409D
+#define VAR_0x409E 0x409E
+#define VAR_0x409F 0x409F
+#define VAR_0x40A0 0x40A0
+#define VAR_0x40A1 0x40A1
+#define VAR_0x40A2 0x40A2
+#define VAR_0x40A3 0x40A3
+#define VAR_0x40A4 0x40A4
+#define VAR_0x40A5 0x40A5
+#define VAR_0x40A6 0x40A6
+#define VAR_0x40A7 0x40A7
+#define VAR_0x40A8 0x40A8
+#define VAR_0x40A9 0x40A9
+#define VAR_0x40AA 0x40AA
+#define VAR_0x40AB 0x40AB
+#define VAR_0x40AC 0x40AC
+#define VAR_0x40AD 0x40AD
+#define VAR_0x40AE 0x40AE
+#define VAR_0x40AF 0x40AF
+#define VAR_0x40B0 0x40B0
+#define VAR_0x40B1 0x40B1
+#define VAR_0x40B2 0x40B2
+#define VAR_0x40B3 0x40B3
+#define VAR_PORTHOLE 0x40B4
+#define VAR_0x40B5 0x40B5
+#define VAR_0x40B6 0x40B6
+#define VAR_0x40B7 0x40B7
+#define VAR_0x40B8 0x40B8
+#define VAR_0x40B9 0x40B9
+#define VAR_0x40BA 0x40BA
+#define VAR_0x40BB 0x40BB
+#define VAR_0x40BC 0x40BC
+#define VAR_0x40BD 0x40BD
+#define VAR_0x40BE 0x40BE
+#define VAR_0x40BF 0x40BF
+#define VAR_0x40C0 0x40C0
+#define VAR_0x40C1 0x40C1
+#define VAR_0x40C2 0x40C2
+#define VAR_0x40C3 0x40C3
+#define VAR_0x40C4 0x40C4
+#define VAR_0x40C5 0x40C5
+#define VAR_0x40C6 0x40C6
+#define VAR_0x40C7 0x40C7
+#define VAR_0x40C8 0x40C8
+#define VAR_0x40C9 0x40C9
+#define VAR_0x40CA 0x40CA
+#define VAR_0x40CB 0x40CB
+#define VAR_0x40CC 0x40CC
+#define VAR_0x40CD 0x40CD
+#define VAR_0x40CE 0x40CE
+#define VAR_FRONTIER_FACILITY 0x40CF
+#define VAR_0x40D0 0x40D0
+#define VAR_0x40D1 0x40D1
+#define VAR_0x40D2 0x40D2
+#define VAR_0x40D3 0x40D3
+#define VAR_0x40D4 0x40D4
+#define VAR_0x40D5 0x40D5
+#define VAR_0x40D6 0x40D6
+#define VAR_0x40D7 0x40D7
+#define VAR_0x40D8 0x40D8
+#define VAR_0x40D9 0x40D9
+#define VAR_0x40DA 0x40DA
+#define VAR_0x40DB 0x40DB
+#define VAR_0x40DC 0x40DC
+#define VAR_0x40DD 0x40DD
+#define VAR_0x40DE 0x40DE
+#define VAR_0x40DF 0x40DF
+#define VAR_0x40E0 0x40E0
+#define VAR_0x40E1 0x40E1
+#define VAR_0x40E2 0x40E2
+#define VAR_0x40E3 0x40E3
+#define VAR_0x40E4 0x40E4
+#define VAR_0x40E5 0x40E5
+#define VAR_DAILY_SLOTS 0x40E6
+#define VAR_DAILY_WILDS 0x40E7
+#define VAR_DAILY_BLENDER 0x40E8
+#define VAR_DAILY_PLANTED_BERRIES 0x40E9
+#define VAR_DAILY_PICKED_BERRIES 0x40EA
+#define VAR_DAILY_ROULETTE 0x40EB
+#define VAR_0x40EC 0x40EC
+#define VAR_0x40ED 0x40ED
+#define VAR_0x40EE 0x40EE
+#define VAR_0x40EF 0x40EF
+#define VAR_0x40F0 0x40F0
+#define VAR_DAILY_BP 0x40F1
+#define VAR_0x40F2 0x40F2
+#define VAR_0x40F3 0x40F3
+#define VAR_0x40F4 0x40F4
+#define VAR_0x40F5 0x40F5
+#define VAR_0x40F6 0x40F6
+#define VAR_0x40F7 0x40F7
+#define VAR_0x40F8 0x40F8
+#define VAR_0x40F9 0x40F9
+#define VAR_0x40FA 0x40FA
+#define VAR_0x40FB 0x40FB
+#define VAR_0x40FC 0x40FC
+#define VAR_0x40FD 0x40FD
+#define VAR_0x40FE 0x40FE
+#define VAR_0x40FF 0x40FF
+
+#define VAR_0x8000 0x8000
+#define VAR_0x8001 0x8001
+#define VAR_0x8002 0x8002
+#define VAR_0x8003 0x8003
+#define VAR_0x8004 0x8004
+#define VAR_0x8005 0x8005
+#define VAR_0x8006 0x8006
+#define VAR_0x8007 0x8007
+#define VAR_0x8008 0x8008
+#define VAR_0x8009 0x8009
+#define VAR_0x800A 0x800A
+#define VAR_0x800B 0x800B
+#define VAR_FACING 0x800C
+#define VAR_RESULT 0x800D
+#define VAR_ITEM_ID 0x800E
+#define VAR_LAST_TALKED 0x800F
+#define VAR_CONTEST_RANK 0x8010
+#define VAR_CONTEST_CATEGORY 0x8011
+#define VAR_MON_BOX_ID 0x8012
+#define VAR_MON_BOX_POS 0x8013
+#define VAR_0x8014 0x8014
+
+#endif // GUARD_CONSTANTS_VARS_H
diff --git a/include/data2.h b/include/data2.h
new file mode 100644
index 000000000..be0f33ab8
--- /dev/null
+++ b/include/data2.h
@@ -0,0 +1,20 @@
+#ifndef GUARD_DATA2_H
+#define GUARD_DATA2_H
+
+struct MonCoords
+{
+ // This would use a bitfield, but some function
+ // uses it as a u8 and casting won't match.
+ u8 coords; // u8 x:4, y:4;
+ u8 y_offset;
+};
+
+extern struct MonCoords gTrainerBackPicCoords[];
+extern struct MonCoords gTrainerFrontPicCoords[];
+
+extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1];
+extern const u8 gMoveNames[][13];
+extern const u8 gAbilityNames[][13];
+extern const u8 gTypeNames[][7];
+
+#endif // GUARD_DATA2_H
diff --git a/include/daycare.h b/include/daycare.h
new file mode 100644
index 000000000..7db44e024
--- /dev/null
+++ b/include/daycare.h
@@ -0,0 +1,27 @@
+#ifndef GUARD_DAYCARE_H
+#define GUARD_DAYCARE_H
+
+#define EGG_HATCH_LEVEL 5
+
+u8 *GetMonNick(struct Pokemon *mon, u8 *dest);
+u8 *GetBoxMonNick(struct BoxPokemon *mon, u8 *dest);
+u8 CountPokemonInDaycare(struct DayCare *daycare);
+void InitDaycareMailRecordMixing(struct DayCare *daycare, struct RecordMixingDayCareMail *daycareMail);
+void StoreSelectedPokemonInDaycare(void);
+u16 TakePokemonFromDaycare(void);
+void GetDaycareCost(void);
+u8 GetNumLevelsGainedFromDaycare(void);
+void TriggerPendingDaycareEgg(void);
+void RejectEggFromDayCare(void);
+void CreateEgg(struct Pokemon *mon, u16 species, bool8 setHotSpringsLocation);
+void GiveEggFromDaycare(void);
+bool8 DoEggActions_CheckHatch(void);
+u16 GetSelectedMonNickAndSpecies(void);
+void GetDaycareMonNicknames(void);
+u8 GetDaycareState(void);
+void SetDaycareCompatibilityString(void);
+bool8 NameHasGenderSymbol(const u8 *name, u8 genderRatio);
+void ShowDaycareLevelMenu(void);
+void ChooseSendDaycareMon(void);
+
+#endif // GUARD_DAYCARE_H
diff --git a/include/decompress.h b/include/decompress.h
new file mode 100644
index 000000000..34a678cda
--- /dev/null
+++ b/include/decompress.h
@@ -0,0 +1,33 @@
+#ifndef GUARD_DECOMPRESS_H
+#define GUARD_DECOMPRESS_H
+
+#include "sprite.h"
+
+extern u8 gDecompressionBuffer[0x4000];
+
+void LZDecompressWram(const void *src, void *dest);
+void LZDecompressVram(const void *src, void *dest);
+
+u16 LoadCompressedObjectPic(const struct CompressedSpriteSheet *src);
+void LoadCompressedObjectPicOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer);
+bool8 LoadCompressedObjectPicUsingHeap(const struct CompressedSpriteSheet* src);
+
+void LoadCompressedObjectPalette(const struct CompressedSpritePalette *src);
+void LoadCompressedObjectPaletteOverrideBuffer(const struct CompressedSpritePalette *a, void *buffer);
+bool8 LoadCompressedObjectPaletteUsingHeap(const struct CompressedSpritePalette *src);
+
+void DecompressPicFromTable(const struct CompressedSpriteSheet *src, void* buffer, s32 species);
+void DecompressPicFromTable_2(const struct CompressedSpriteSheet *src, void* buffer, s32 species);
+void DecompressPicFromTable_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void* buffer, s32 species);
+
+void HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality);
+void HandleLoadSpecialPokePic_2(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality);
+void HandleLoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality);
+
+void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic);
+void LoadSpecialPokePic_2(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic);
+void LoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic);
+
+u32 sub_8034974(const u8 *ptr);
+
+#endif // GUARD_DECOMPRESS_H
diff --git a/include/diploma.h b/include/diploma.h
new file mode 100644
index 000000000..8d730fa05
--- /dev/null
+++ b/include/diploma.h
@@ -0,0 +1,6 @@
+#ifndef GUARD_DIPLOMA_H
+#define GUARD_DIPLOMA_H
+
+void CB2_ShowDiploma(void);
+
+#endif // GUARD_DIPLOMA_H
diff --git a/include/dma3.h b/include/dma3.h
new file mode 100644
index 000000000..265b47824
--- /dev/null
+++ b/include/dma3.h
@@ -0,0 +1,10 @@
+#ifndef GUARD_DMA3_H
+#define GUARD_DMA3_H
+
+void ClearDma3Requests(void);
+void ProcessDma3Requests(void);
+int RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode);
+int RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode);
+int CheckForSpaceForDma3Request(s16 index);
+
+#endif // GUARD_DMA3_H
diff --git a/include/easy_chat.h b/include/easy_chat.h
new file mode 100644
index 000000000..f0ac51c22
--- /dev/null
+++ b/include/easy_chat.h
@@ -0,0 +1,39 @@
+#ifndef GUARD_EASYCHAT_H
+#define GUARD_EASYCHAT_H
+
+// Taken from Pokeruby, check if it's correct
+enum
+{
+ EC_GROUP_POKEMON,
+ EC_GROUP_TRAINER,
+ EC_GROUP_STATUS,
+ EC_GROUP_BATTLE,
+ EC_GROUP_GREETINGS,
+ EC_GROUP_PEOPLE,
+ EC_GROUP_VOICES,
+ EC_GROUP_SPEECH,
+ EC_GROUP_ENDINGS,
+ EC_GROUP_FEELINGS,
+ EC_GROUP_CONDITIONS,
+ EC_GROUP_ACTIONS,
+ EC_GROUP_LIFESTYLE,
+ EC_GROUP_HOBBIES,
+ EC_GROUP_TIME,
+ EC_GROUP_MISC,
+ EC_GROUP_ADJECTIVES,
+ EC_GROUP_EVENTS,
+ EC_GROUP_MOVE_1,
+ EC_GROUP_MOVE_2,
+ EC_GROUP_TRENDY_SAYING,
+ EC_GROUP_POKEMON_2,
+};
+
+void InitEasyChatPhrases(void);
+void easy_chat_input_maybe(void);
+void CopyEasyChatWord(u8 *dest, u16 word);
+bool32 sub_811F8D8(u16 word);
+void InitializeEasyChatWordArray(u16 *words, u16 length);
+void ConvertEasyChatWordsToString(u8 *dest, const u16 *src, u16 length1, u16 length2);
+bool8 ECWord_CheckIfOutsideOfValidRange(u16 word);
+
+#endif // GUARD_EASYCHAT_H
diff --git a/include/egg_hatch.h b/include/egg_hatch.h
new file mode 100644
index 000000000..862d33947
--- /dev/null
+++ b/include/egg_hatch.h
@@ -0,0 +1,10 @@
+#ifndef GUARD_EGG_HATCH_H
+#define GUARD_EGG_HATCH_H
+
+void ScriptHatchMon(void);
+bool8 sub_8071614(void);
+void EggHatch(void);
+u8 GetEggStepsToSubtract(void);
+u16 sub_80722E0(void);
+
+#endif // GUARD_EGG_HATCH_H
diff --git a/include/event_data.h b/include/event_data.h
new file mode 100644
index 000000000..f829d3b87
--- /dev/null
+++ b/include/event_data.h
@@ -0,0 +1,52 @@
+#ifndef GUARD_EVENT_DATA_H
+#define GUARD_EVENT_DATA_H
+
+#include "constants/flags.h"
+#include "constants/vars.h"
+
+void InitEventData(void);
+void ClearTempFieldEventData(void);
+void ClearUpperFlags(void);
+void DisableNationalPokedex(void);
+void EnableNationalPokedex(void);
+bool32 IsNationalPokedexEnabled(void);
+void DisableMysteryEvent(void);
+void EnableMysteryEvent(void);
+bool32 IsMysteryEventEnabled(void);
+void DisableMysteryGift(void);
+void EnableMysteryGift(void);
+bool32 IsMysteryGiftEnabled(void);
+void sub_809D4D8(void);
+void sub_809D570(void);
+void DisableResetRTC(void);
+void EnableResetRTC(void);
+bool32 CanResetRTC(void);
+u16 *GetVarPointer(u16 id);
+u16 VarGet(u16 id);
+bool8 VarSet(u16 id, u16 value);
+u8 VarGetFieldObjectGraphicsId(u8 id);
+u8 *GetFlagPointer(u16 id);
+u8 FlagSet(u16 id);
+u8 FlagClear(u16 id);
+bool8 FlagGet(u16 id);
+
+extern u16 gSpecialVar_0x8000;
+extern u16 gSpecialVar_0x8001;
+extern u16 gSpecialVar_0x8002;
+extern u16 gSpecialVar_0x8003;
+extern u16 gSpecialVar_0x8004;
+extern u16 gSpecialVar_0x8005;
+extern u16 gSpecialVar_0x8006;
+extern u16 gSpecialVar_0x8007;
+extern u16 gSpecialVar_0x8008;
+extern u16 gSpecialVar_0x8009;
+extern u16 gSpecialVar_0x800A;
+extern u16 gSpecialVar_0x800B;
+extern u16 gSpecialVar_Result;
+extern u16 gSpecialVar_LastTalked;
+extern u16 gSpecialVar_Facing;
+extern u16 gSpecialVar_MonBoxId;
+extern u16 gSpecialVar_MonBoxPos;
+extern u16 gSpecialVar_0x8014;
+
+#endif // GUARD_EVENT_DATA_H
diff --git a/include/event_scripts.h b/include/event_scripts.h
new file mode 100644
index 000000000..844f1052a
--- /dev/null
+++ b/include/event_scripts.h
@@ -0,0 +1,375 @@
+//
+// Created by scott on 9/12/2017.
+//
+
+#ifndef GUARD_EVENT_SCRIPTS_H
+#define GUARD_EVENT_SCRIPTS_H
+
+extern const u8 gUnknown_0823B4E8[];
+extern const u8 gUnknown_0823B5E9[];
+extern const u8 EventScript_275BB7[];
+extern const u8 EventScript_275D0C[];
+extern const u8 EventScript_275D1F[];
+extern const u8 EventScript_275D2E[];
+extern const u8 EventScript_2766A2[];
+extern const u8 EventScript_2766A6[];
+
+extern const u8 gTVBravoTrainerText00[];
+extern const u8 gTVBravoTrainerText01[];
+extern const u8 gTVBravoTrainerText02[];
+extern const u8 gTVBravoTrainerText03[];
+extern const u8 gTVBravoTrainerText04[];
+extern const u8 gTVBravoTrainerText05[];
+extern const u8 gTVBravoTrainerText06[];
+extern const u8 gTVBravoTrainerText07[];
+extern const u8 gTVBravoTrainerText08[];
+extern const u8 gTVBravoTrainerBattleTowerText00[];
+extern const u8 gTVBravoTrainerBattleTowerText01[];
+extern const u8 gTVBravoTrainerBattleTowerText02[];
+extern const u8 gTVBravoTrainerBattleTowerText03[];
+extern const u8 gTVBravoTrainerBattleTowerText04[];
+extern const u8 gTVBravoTrainerBattleTowerText05[];
+extern const u8 gTVBravoTrainerBattleTowerText06[];
+extern const u8 gTVBravoTrainerBattleTowerText07[];
+extern const u8 gTVBravoTrainerBattleTowerText08[];
+extern const u8 gTVBravoTrainerBattleTowerText09[];
+extern const u8 gTVBravoTrainerBattleTowerText10[];
+extern const u8 gTVBravoTrainerBattleTowerText11[];
+extern const u8 gTVBravoTrainerBattleTowerText12[];
+extern const u8 gTVBravoTrainerBattleTowerText13[];
+extern const u8 gTVBravoTrainerBattleTowerText14[];
+extern const u8 gTVFanClubOpinionsText00[];
+extern const u8 gTVFanClubOpinionsText01[];
+extern const u8 gTVFanClubOpinionsText02[];
+extern const u8 gTVFanClubOpinionsText03[];
+extern const u8 gTVFanClubOpinionsText04[];
+extern const u8 gTVFanClubText00[];
+extern const u8 gTVFanClubText01[];
+extern const u8 gTVFanClubText02[];
+extern const u8 gTVFanClubText03[];
+extern const u8 gTVFanClubText04[];
+extern const u8 gTVFanClubText05[];
+extern const u8 gTVFanClubText06[];
+extern const u8 gTVFanClubText07[];
+extern const u8 gTVRecentHappeningsText00[];
+extern const u8 gTVRecentHappeningsText01[];
+extern const u8 gTVRecentHappeningsText02[];
+extern const u8 gTVRecentHappeningsText03[];
+extern const u8 gTVRecentHappeningsText04[];
+extern const u8 gTVRecentHappeningsText05[];
+extern const u8 gTVMassOutbreakText00[];
+extern const u8 gTV3CheersForPokeblocksText00[];
+extern const u8 gTV3CheersForPokeblocksText01[];
+extern const u8 gTV3CheersForPokeblocksText02[];
+extern const u8 gTV3CheersForPokeblocksText03[];
+extern const u8 gTV3CheersForPokeblocksText04[];
+extern const u8 gTV3CheersForPokeblocksText05[];
+extern const u8 gTVTrainerFanClubSpecialText00[];
+extern const u8 gTVTrainerFanClubSpecialText01[];
+extern const u8 gTVTrainerFanClubSpecialText02[];
+extern const u8 gTVTrainerFanClubSpecialText03[];
+extern const u8 gTVTrainerFanClubSpecialText04[];
+extern const u8 gTVTrainerFanClubSpecialText05[];
+extern const u8 gTVNameRaterText00[];
+extern const u8 gTVNameRaterText01[];
+extern const u8 gTVNameRaterText02[];
+extern const u8 gTVNameRaterText03[];
+extern const u8 gTVNameRaterText04[];
+extern const u8 gTVNameRaterText05[];
+extern const u8 gTVNameRaterText06[];
+extern const u8 gTVNameRaterText07[];
+extern const u8 gTVNameRaterText08[];
+extern const u8 gTVNameRaterText09[];
+extern const u8 gTVNameRaterText10[];
+extern const u8 gTVNameRaterText11[];
+extern const u8 gTVNameRaterText12[];
+extern const u8 gTVNameRaterText13[];
+extern const u8 gTVNameRaterText14[];
+extern const u8 gTVNameRaterText15[];
+extern const u8 gTVNameRaterText16[];
+extern const u8 gTVNameRaterText17[];
+extern const u8 gTVNameRaterText18[];
+extern const u8 gTVPokemonAnglerText00[];
+extern const u8 gTVPokemonAnglerText01[];
+extern const u8 gTVPokemonTodayFailedText00[];
+extern const u8 gTVPokemonTodayFailedText01[];
+extern const u8 gTVPokemonTodayFailedText02[];
+extern const u8 gTVPokemonTodayFailedText03[];
+extern const u8 gTVPokemonTodayFailedText04[];
+extern const u8 gTVPokemonTodayFailedText05[];
+extern const u8 gTVPokemonTodayFailedText06[];
+extern const u8 gTVPokemonTodaySuccessfulText00[];
+extern const u8 gTVPokemonTodaySuccessfulText01[];
+extern const u8 gTVPokemonTodaySuccessfulText02[];
+extern const u8 gTVPokemonTodaySuccessfulText03[];
+extern const u8 gTVPokemonTodaySuccessfulText04[];
+extern const u8 gTVPokemonTodaySuccessfulText05[];
+extern const u8 gTVPokemonTodaySuccessfulText06[];
+extern const u8 gTVPokemonTodaySuccessfulText07[];
+extern const u8 gTVPokemonTodaySuccessfulText08[];
+extern const u8 gTVPokemonTodaySuccessfulText09[];
+extern const u8 gTVPokemonTodaySuccessfulText10[];
+extern const u8 gTVPokemonTodaySuccessfulText11[];
+extern const u8 gTVTodaysSmartShopperText00[];
+extern const u8 gTVTodaysSmartShopperText01[];
+extern const u8 gTVTodaysSmartShopperText02[];
+extern const u8 gTVTodaysSmartShopperText03[];
+extern const u8 gTVTodaysSmartShopperText04[];
+extern const u8 gTVTodaysSmartShopperText05[];
+extern const u8 gTVTodaysSmartShopperText06[];
+extern const u8 gTVTodaysSmartShopperText07[];
+extern const u8 gTVTodaysSmartShopperText08[];
+extern const u8 gTVTodaysSmartShopperText09[];
+extern const u8 gTVTodaysSmartShopperText10[];
+extern const u8 gTVTodaysSmartShopperText11[];
+extern const u8 gTVTodaysSmartShopperText12[];
+extern const u8 gTVWorldOfMastersText00[];
+extern const u8 gTVWorldOfMastersText01[];
+extern const u8 gTVWorldOfMastersText02[];
+extern const u8 gTVTodaysRivalTrainerText00[];
+extern const u8 gTVTodaysRivalTrainerText07[];
+extern const u8 gTVTodaysRivalTrainerText08[];
+extern const u8 gTVTodaysRivalTrainerText09[];
+extern const u8 gTVTodaysRivalTrainerText10[];
+extern const u8 gTVTodaysRivalTrainerText01[];
+extern const u8 gTVTodaysRivalTrainerText02[];
+extern const u8 gTVTodaysRivalTrainerText03[];
+extern const u8 gTVTodaysRivalTrainerText04[];
+extern const u8 gTVTodaysRivalTrainerText05[];
+extern const u8 gTVTodaysRivalTrainerText06[];
+extern const u8 gTVDewfordTrendWatcherNetworkText00[];
+extern const u8 gTVDewfordTrendWatcherNetworkText01[];
+extern const u8 gTVDewfordTrendWatcherNetworkText02[];
+extern const u8 gTVDewfordTrendWatcherNetworkText03[];
+extern const u8 gTVDewfordTrendWatcherNetworkText04[];
+extern const u8 gTVDewfordTrendWatcherNetworkText05[];
+extern const u8 gTVDewfordTrendWatcherNetworkText06[];
+extern const u8 gTVHoennTreasureInvestigatorsText00[];
+extern const u8 gTVHoennTreasureInvestigatorsText01[];
+extern const u8 gTVHoennTreasureInvestigatorsText02[];
+extern const u8 gTVFindThatGamerText00[];
+extern const u8 gTVFindThatGamerText01[];
+extern const u8 gTVFindThatGamerText02[];
+extern const u8 gTVFindThatGamerText03[];
+extern const u8 gTVBreakingNewsText00[];
+extern const u8 gTVBreakingNewsText01[];
+extern const u8 gTVBreakingNewsText02[];
+extern const u8 gTVBreakingNewsText03[];
+extern const u8 gTVBreakingNewsText04[];
+extern const u8 gTVBreakingNewsText05[];
+extern const u8 gTVBreakingNewsText06[];
+extern const u8 gTVBreakingNewsText07[];
+extern const u8 gTVBreakingNewsText12[];
+extern const u8 gTVBreakingNewsText08[];
+extern const u8 gTVBreakingNewsText09[];
+extern const u8 gTVBreakingNewsText10[];
+extern const u8 gTVBreakingNewsText11[];
+extern const u8 gTVSecretBaseVisitText00[];
+extern const u8 gTVSecretBaseVisitText01[];
+extern const u8 gTVSecretBaseVisitText02[];
+extern const u8 gTVSecretBaseVisitText03[];
+extern const u8 gTVSecretBaseVisitText04[];
+extern const u8 gTVSecretBaseVisitText05[];
+extern const u8 gTVSecretBaseVisitText06[];
+extern const u8 gTVSecretBaseVisitText07[];
+extern const u8 gTVSecretBaseVisitText08[];
+extern const u8 gTVSecretBaseVisitText09[];
+extern const u8 gTVSecretBaseVisitText10[];
+extern const u8 gTVSecretBaseVisitText11[];
+extern const u8 gTVSecretBaseVisitText12[];
+extern const u8 gTVSecretBaseVisitText13[];
+extern const u8 gTVPokemonLotteryWinnerFlashReportText00[];
+extern const u8 gTVThePokemonBattleSeminarText00[];
+extern const u8 gTVThePokemonBattleSeminarText01[];
+extern const u8 gTVThePokemonBattleSeminarText02[];
+extern const u8 gTVThePokemonBattleSeminarText03[];
+extern const u8 gTVThePokemonBattleSeminarText04[];
+extern const u8 gTVThePokemonBattleSeminarText05[];
+extern const u8 gTVThePokemonBattleSeminarText06[];
+extern const u8 gTVTrainerFanClubText00[];
+extern const u8 gTVTrainerFanClubText01[];
+extern const u8 gTVTrainerFanClubText02[];
+extern const u8 gTVTrainerFanClubText03[];
+extern const u8 gTVTrainerFanClubText04[];
+extern const u8 gTVTrainerFanClubText05[];
+extern const u8 gTVTrainerFanClubText06[];
+extern const u8 gTVTrainerFanClubText07[];
+extern const u8 gTVTrainerFanClubText08[];
+extern const u8 gTVTrainerFanClubText09[];
+extern const u8 gTVTrainerFanClubText10[];
+extern const u8 gTVTrainerFanClubText11[];
+extern const u8 gTVCutiesText00[];
+extern const u8 gTVCutiesText01[];
+extern const u8 gTVCutiesText02[];
+extern const u8 gTVCutiesText03[];
+extern const u8 gTVCutiesText04[];
+extern const u8 gTVCutiesText05[];
+extern const u8 gTVCutiesText06[];
+extern const u8 gTVCutiesText07[];
+extern const u8 gTVCutiesText08[];
+extern const u8 gTVCutiesText09[];
+extern const u8 gTVCutiesText10[];
+extern const u8 gTVCutiesText11[];
+extern const u8 gTVCutiesText12[];
+extern const u8 gTVCutiesText13[];
+extern const u8 gTVCutiesText14[];
+extern const u8 gTVCutiesText15[];
+extern const u8 gTVPokemonNewsBattleFrontierText00[];
+extern const u8 gTVPokemonNewsBattleFrontierText01[];
+extern const u8 gTVPokemonNewsBattleFrontierText02[];
+extern const u8 gTVPokemonNewsBattleFrontierText03[];
+extern const u8 gTVPokemonNewsBattleFrontierText04[];
+extern const u8 gTVPokemonNewsBattleFrontierText05[];
+extern const u8 gTVPokemonNewsBattleFrontierText06[];
+extern const u8 gTVPokemonNewsBattleFrontierText07[];
+extern const u8 gTVPokemonNewsBattleFrontierText08[];
+extern const u8 gTVPokemonNewsBattleFrontierText09[];
+extern const u8 gTVPokemonNewsBattleFrontierText10[];
+extern const u8 gTVPokemonNewsBattleFrontierText11[];
+extern const u8 gTVPokemonNewsBattleFrontierText12[];
+extern const u8 gTVPokemonNewsBattleFrontierText13[];
+extern const u8 gTVPokemonNewsBattleFrontierText14[];
+extern const u8 gTVPokemonNewsBattleFrontierText15[];
+extern const u8 gTVPokemonNewsBattleFrontierText16[];
+extern const u8 gTVPokemonNewsBattleFrontierText17[];
+extern const u8 gTVPokemonNewsBattleFrontierText18[];
+extern const u8 gTVWhatsNo1InHoennTodayText00[];
+extern const u8 gTVWhatsNo1InHoennTodayText01[];
+extern const u8 gTVWhatsNo1InHoennTodayText02[];
+extern const u8 gTVWhatsNo1InHoennTodayText03[];
+extern const u8 gTVWhatsNo1InHoennTodayText04[];
+extern const u8 gTVWhatsNo1InHoennTodayText05[];
+extern const u8 gTVWhatsNo1InHoennTodayText06[];
+extern const u8 gTVWhatsNo1InHoennTodayText07[];
+extern const u8 gTVWhatsNo1InHoennTodayText08[];
+extern const u8 gTVSecretBaseSecretsText00[];
+extern const u8 gTVSecretBaseSecretsText01[];
+extern const u8 gTVSecretBaseSecretsText02[];
+extern const u8 gTVSecretBaseSecretsText03[];
+extern const u8 gTVSecretBaseSecretsText04[];
+extern const u8 gTVSecretBaseSecretsText05[];
+extern const u8 gTVSecretBaseSecretsText06[];
+extern const u8 gTVSecretBaseSecretsText07[];
+extern const u8 gTVSecretBaseSecretsText08[];
+extern const u8 gTVSecretBaseSecretsText09[];
+extern const u8 gTVSecretBaseSecretsText10[];
+extern const u8 gTVSecretBaseSecretsText11[];
+extern const u8 gTVSecretBaseSecretsText12[];
+extern const u8 gTVSecretBaseSecretsText13[];
+extern const u8 gTVSecretBaseSecretsText14[];
+extern const u8 gTVSecretBaseSecretsText15[];
+extern const u8 gTVSecretBaseSecretsText16[];
+extern const u8 gTVSecretBaseSecretsText17[];
+extern const u8 gTVSecretBaseSecretsText18[];
+extern const u8 gTVSecretBaseSecretsText19[];
+extern const u8 gTVSecretBaseSecretsText20[];
+extern const u8 gTVSecretBaseSecretsText21[];
+extern const u8 gTVSecretBaseSecretsText22[];
+extern const u8 gTVSecretBaseSecretsText23[];
+extern const u8 gTVSecretBaseSecretsText24[];
+extern const u8 gTVSecretBaseSecretsText25[];
+extern const u8 gTVSecretBaseSecretsText26[];
+extern const u8 gTVSecretBaseSecretsText27[];
+extern const u8 gTVSecretBaseSecretsText28[];
+extern const u8 gTVSecretBaseSecretsText29[];
+extern const u8 gTVSecretBaseSecretsText30[];
+extern const u8 gTVSecretBaseSecretsText31[];
+extern const u8 gTVSecretBaseSecretsText32[];
+extern const u8 gTVSecretBaseSecretsText33[];
+extern const u8 gTVSecretBaseSecretsText34[];
+extern const u8 gTVSecretBaseSecretsText35[];
+extern const u8 gTVSecretBaseSecretsText36[];
+extern const u8 gTVSecretBaseSecretsText37[];
+extern const u8 gTVSecretBaseSecretsText38[];
+extern const u8 gTVSecretBaseSecretsText39[];
+extern const u8 gTVSecretBaseSecretsText40[];
+extern const u8 gTVSecretBaseSecretsText41[];
+extern const u8 gTVSecretBaseSecretsText42[];
+extern const u8 gTVSafariFanClubText00[];
+extern const u8 gTVSafariFanClubText01[];
+extern const u8 gTVSafariFanClubText02[];
+extern const u8 gTVSafariFanClubText03[];
+extern const u8 gTVSafariFanClubText04[];
+extern const u8 gTVSafariFanClubText05[];
+extern const u8 gTVSafariFanClubText06[];
+extern const u8 gTVSafariFanClubText07[];
+extern const u8 gTVSafariFanClubText08[];
+extern const u8 gTVSafariFanClubText09[];
+extern const u8 gTVSafariFanClubText10[];
+extern const u8 gTVContestLiveUpdatesText00[];
+extern const u8 gTVContestLiveUpdatesText01[];
+extern const u8 gTVContestLiveUpdatesText02[];
+extern const u8 gTVContestLiveUpdatesText03[];
+extern const u8 gTVContestLiveUpdatesText04[];
+extern const u8 gTVContestLiveUpdatesText05[];
+extern const u8 gTVContestLiveUpdatesText06[];
+extern const u8 gTVContestLiveUpdatesText07[];
+extern const u8 gTVContestLiveUpdatesText08[];
+extern const u8 gTVContestLiveUpdatesText09[];
+extern const u8 gTVContestLiveUpdatesText10[];
+extern const u8 gTVContestLiveUpdatesText11[];
+extern const u8 gTVContestLiveUpdatesText12[];
+extern const u8 gTVContestLiveUpdatesText13[];
+extern const u8 gTVContestLiveUpdatesText14[];
+extern const u8 gTVContestLiveUpdatesText15[];
+extern const u8 gTVContestLiveUpdatesText16[];
+extern const u8 gTVContestLiveUpdatesText17[];
+extern const u8 gTVContestLiveUpdatesText18[];
+extern const u8 gTVContestLiveUpdatesText19[];
+extern const u8 gTVContestLiveUpdatesText20[];
+extern const u8 gTVContestLiveUpdatesText21[];
+extern const u8 gTVContestLiveUpdatesText22[];
+extern const u8 gTVContestLiveUpdatesText23[];
+extern const u8 gTVContestLiveUpdatesText24[];
+extern const u8 gTVContestLiveUpdatesText25[];
+extern const u8 gTVContestLiveUpdatesText26[];
+extern const u8 gTVContestLiveUpdatesText27[];
+extern const u8 gTVContestLiveUpdatesText28[];
+extern const u8 gTVContestLiveUpdatesText29[];
+extern const u8 gTVContestLiveUpdatesText30[];
+extern const u8 gTVContestLiveUpdatesText31[];
+extern const u8 gTVContestLiveUpdatesText32[];
+extern const u8 gTVPokemonBattleUpdateText00[];
+extern const u8 gTVPokemonBattleUpdateText01[];
+extern const u8 gTVPokemonBattleUpdateText02[];
+extern const u8 gTVPokemonBattleUpdateText03[];
+extern const u8 gTVPokemonBattleUpdateText04[];
+extern const u8 gTVPokemonBattleUpdateText05[];
+extern const u8 gTVPokemonBattleUpdateText06[];
+extern const u8 gTVPokemonBattleUpdateText07[];
+extern const u8 gTVInSearchOfTrainersText00[];
+extern const u8 gTVInSearchOfTrainersText01[];
+extern const u8 gTVInSearchOfTrainersText02[];
+extern const u8 gTVInSearchOfTrainersText03[];
+extern const u8 gTVInSearchOfTrainersText04[];
+extern const u8 gTVInSearchOfTrainersText05[];
+extern const u8 gTVInSearchOfTrainersText06[];
+extern const u8 gTVInSearchOfTrainersText07[];
+extern const u8 gTVInSearchOfTrainersText08[];
+extern const u8 gTVPokemonContestLiveUpdates2Text00[];
+extern const u8 gTVPokemonContestLiveUpdates2Text01[];
+extern const u8 gTVPokemonContestLiveUpdates2Text02[];
+extern const u8 gTVPokemonContestLiveUpdates2Text03[];
+extern const u8 gPokeNewsTextSlateport_Upcoming[];
+extern const u8 gPokeNewsTextSlateport_Ongoing[];
+extern const u8 gPokeNewsTextSlateport_Ending[];
+extern const u8 gPokeNewsTextGameCorner_Upcoming[];
+extern const u8 gPokeNewsTextGameCorner_Ongoing[];
+extern const u8 gPokeNewsTextGameCorner_Ending[];
+extern const u8 gPokeNewsTextLilycove_Upcoming[];
+extern const u8 gPokeNewsTextLilycove_Ongoing[];
+extern const u8 gPokeNewsTextLilycove_Ending[];
+extern const u8 gPokeNewsTextBlendMaster_Upcoming[];
+extern const u8 gPokeNewsTextBlendMaster_Ongoing[];
+extern const u8 gPokeNewsTextBlendMaster_Ending[];
+extern const u8 SecretBase_RedCave1_Text_274966[];
+extern const u8 SecretBase_RedCave1_Text_274D13[];
+extern const u8 SecretBase_RedCave1_Text_274FFE[];
+extern const u8 SecretBase_RedCave1_Text_275367[];
+extern const u8 SecretBase_RedCave1_Text_2756C7[];
+extern const u8 SecretBase_RedCave1_Text_274B24[];
+extern const u8 SecretBase_RedCave1_Text_274E75[];
+extern const u8 SecretBase_RedCave1_Text_2751E1[];
+extern const u8 SecretBase_RedCave1_Text_2754F6[];
+extern const u8 SecretBase_RedCave1_Text_2758CC[];
+#endif //GUARD_EVENT_SCRIPTS_H
diff --git a/include/evolution_graphics.h b/include/evolution_graphics.h
new file mode 100644
index 000000000..f52105815
--- /dev/null
+++ b/include/evolution_graphics.h
@@ -0,0 +1,15 @@
+#ifndef GUARD_EVOLUTION_GRAPHICS_H
+#define GUARD_EVOLUTION_GRAPHICS_H
+
+void LoadEvoSparkleSpriteAndPal(void);
+
+u8 LaunchTask_PreEvoSparklesSet1(u16 arg0);
+u8 LaunchTask_PreEvoSparklesSet2(void);
+u8 LaunchTask_PostEvoSparklesSet1(void);
+u8 LaunchTask_PostEvoSparklesSet2AndFlash(u16 species);
+u8 LaunchTask_PostEvoSparklesSet2AndFlash_Trade(u16 species);
+u8 sub_817C3A0(u8 preEvoSpriteID, u8 postEvoSpriteID);
+
+#define EvoGraphicsTaskEvoStop data[8]
+
+#endif // GUARD_EVOLUTION_GRAPHICS_H
diff --git a/include/evolution_scene.h b/include/evolution_scene.h
new file mode 100644
index 000000000..5f8c534b9
--- /dev/null
+++ b/include/evolution_scene.h
@@ -0,0 +1,10 @@
+#ifndef GUARD_EVOLUTION_SCENE_H
+#define GUARD_EVOLUTION_SCENE_H
+
+void BeginEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, u8 partyID);
+void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, u8 partyID);
+void TradeEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, u8 preEvoSpriteID, u8 partyID);
+
+extern void (*gCB2_AfterEvolution)(void);
+
+#endif // GUARD_EVOLUTION_SCENE_H
diff --git a/include/field_camera.h b/include/field_camera.h
new file mode 100644
index 000000000..a8559e1c2
--- /dev/null
+++ b/include/field_camera.h
@@ -0,0 +1,28 @@
+#ifndef GUARD_FIELD_CAMERA_H
+#define GUARD_FIELD_CAMERA_H
+
+// Exported type declarations
+
+struct CameraObject
+{
+ void (*callback)(struct CameraObject *);
+ u32 unk4;
+ s32 unk8;
+ s32 unkC;
+ s32 x;
+ s32 y;
+};
+
+extern struct CameraObject gUnknown_03005DD0;
+
+// Exported RAM declarations
+
+extern u16 gUnknown_03005DEC;
+extern u16 gUnknown_03005DE8;
+
+// Exported ROM declarations
+
+void DrawWholeMapView(void);
+void CurrentMapDrawMetatileAt(int x, int y);
+
+#endif //GUARD_FIELD_CAMERA_H
diff --git a/include/field_door.h b/include/field_door.h
new file mode 100644
index 000000000..f1dfc551d
--- /dev/null
+++ b/include/field_door.h
@@ -0,0 +1,11 @@
+#ifndef GUARD_FIELDDOOR_H
+#define GUARD_FIELDDOOR_H
+
+void FieldSetDoorOpened(u32, u32);
+void FieldSetDoorClosed(u32, u32);
+s8 FieldAnimateDoorClose(u32, u32);
+s8 FieldAnimateDoorOpen(u32, u32);
+bool8 FieldIsDoorAnimationRunning(void);
+u32 GetDoorSoundEffect(u32 x, u32 y);
+
+#endif
diff --git a/include/field_effect.h b/include/field_effect.h
new file mode 100644
index 000000000..629ae07c7
--- /dev/null
+++ b/include/field_effect.h
@@ -0,0 +1,78 @@
+#ifndef GUARD_FIELD_EFFECTS_H
+#define GUARD_FIELD_EFFECTS_H
+
+enum FieldEffectScriptIdx
+{
+ FLDEFF_EXCLAMATION_MARK_ICON_1,
+ FLDEFF_USE_CUT_ON_GRASS,
+ FLDEFF_USE_CUT_ON_TREE,
+ FLDEFF_SHADOW,
+ FLDEFF_TALL_GRASS,
+ FLDEFF_RIPPLE,
+ FLDEFF_FIELD_MOVE_SHOW_MON,
+ FLDEFF_ASH,
+ FLDEFF_SURF_BLOB,
+ FLDEFF_USE_SURF,
+ FLDEFF_DUST,
+ FLDEFF_USE_SECRET_POWER_CAVE,
+ FLDEFF_JUMP_TALL_GRASS,
+ FLDEFF_SAND_FOOTPRINTS,
+ FLDEFF_JUMP_BIG_SPLASH,
+ FLDEFF_SPLASH,
+ FLDEFF_JUMP_SMALL_SPLASH,
+ FLDEFF_LONG_GRASS,
+ FLDEFF_JUMP_LONG_GRASS,
+ FLDEFF_UNKNOWN_19,
+ FLDEFF_UNKNOWN_20,
+ FLDEFF_UNKNOWN_21,
+ FLDEFF_UNKNOWN_22,
+ FLDEFF_BERRY_TREE_GROWTH_SPARKLE,
+ FLDEFF_DEEP_SAND_FOOTPRINTS,
+ FLDEFF_POKECENTER_HEAL,
+ FLDEFF_USE_SECRET_POWER_TREE,
+ FLDEFF_USE_SECRET_POWER_SHRUB,
+ FLDEFF_TREE_DISGUISE,
+ FLDEFF_MOUNTAIN_DISGUISE,
+ FLDEFF_NPCFLY_OUT,
+ FLDEFF_USE_FLY,
+ FLDEFF_FLY_IN,
+ FLDEFF_EXCLAMATION_MARK_ICON_2,
+ FLDEFF_FEET_IN_FLOWING_WATER,
+ FLDEFF_BIKE_TIRE_TRACKS,
+ FLDEFF_SAND_DISGUISE,
+ FLDEFF_USE_ROCK_SMASH,
+ FLDEFF_USE_DIG,
+ FLDEFF_SAND_PILE,
+ FLDEFF_USE_STRENGTH,
+ FLDEFF_SHORT_GRASS,
+ FLDEFF_HOT_SPRINGS_WATER,
+ FLDEFF_USE_WATERFALL,
+ FLDEFF_USE_DIVE,
+ FLDEFF_POKEBALL,
+ FLDEFF_HEART_ICON,
+ FLDEFF_NOP_47,
+ FLDEFF_NOP_48,
+ FLDEFF_POP_OUT_OF_ASH,
+ FLDEFF_LAVARIDGE_GYM_WARP,
+ FLDEFF_SWEET_SCENT,
+ FLDEFF_SAND_PILLAR,
+ FLDEFF_BUBBLES,
+ FLDEFF_SPARKLE,
+ FLDEFF_SECRET_POWER_CAVE,
+ FLDEFF_SECRET_POWER_TREE,
+ FLDEFF_SECRET_POWER_SHRUB,
+ FLDEFF_CUT_GRASS,
+ FLDEFF_FIELD_MOVE_SHOW_MON_INIT,
+ FLDEFF_USE_FLY_ANCIENT_TOMB,
+ FLDEFF_PCTURN_ON,
+ FLDEFF_HALL_OF_FAME_RECORD,
+ FLDEFF_USE_TELEPORT
+};
+
+extern u32 gFieldEffectArguments[8];
+
+u8 FieldEffectStart(u8);
+bool8 FieldEffectActiveListContains(u8 id);
+void sub_80B69DC(void);
+
+#endif //GUARD_FIELD_EFFECTS_H
diff --git a/include/field_effect_helpers.h b/include/field_effect_helpers.h
new file mode 100644
index 000000000..e80daf3bd
--- /dev/null
+++ b/include/field_effect_helpers.h
@@ -0,0 +1,16 @@
+//
+// Created by scott on 9/7/2017.
+//
+
+#ifndef GUARD_FIELD_EFFECT_HELPERS_H
+#define GUARD_FIELD_EFFECT_HELPERS_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+u8 sub_8154228(void);
+bool8 sub_8155DA0(struct MapObject *);
+
+#endif //GUARD_FIELD_EFFECT_HELPERS_H
diff --git a/include/field_fadetransition.h b/include/field_fadetransition.h
new file mode 100644
index 000000000..7c2d16a24
--- /dev/null
+++ b/include/field_fadetransition.h
@@ -0,0 +1,12 @@
+#ifndef GUARD_FIELD_FADETRANSITION_H
+#define GUARD_FIELD_FADETRANSITION_H
+
+void sub_80AF734(void);
+void sp13E_warp_to_last_warp(void);
+void sub_80AF7D0(void);
+void sp13F_fall_to_last_warp(void);
+
+void sub_80AF848(void);
+void sub_80AF87C(void);
+
+#endif // GUARD_FIELD_FADETRANSITION_H
diff --git a/include/field_ground_effect.h b/include/field_ground_effect.h
new file mode 100644
index 000000000..63b67ceaf
--- /dev/null
+++ b/include/field_ground_effect.h
@@ -0,0 +1,22 @@
+//
+// Created by scott on 9/6/2017.
+//
+
+#ifndef GUARD_FIELD_GROUND_EFFECT_H
+#define GUARD_FIELD_GROUND_EFFECT_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+void SetObjectSubpriorityByZCoord(u8, struct Sprite *, u8);
+void InitObjectPriorityByZCoord(struct Sprite *, u8);
+bool8 IsZCoordMismatchAt(u8, s16, s16);
+bool8 AreZCoordsCompatible(u8, u8);
+void FieldObjectUpdateSubpriority(struct MapObject *, struct Sprite *);
+void DoGroundEffects_OnSpawn(struct MapObject *, struct Sprite *);
+void DoGroundEffects_OnBeginStep(struct MapObject *, struct Sprite *);
+void DoGroundEffects_OnFinishStep(struct MapObject *, struct Sprite *);
+
+#endif //GUARD_FIELD_GROUND_EFFECT_H
diff --git a/include/field_map_obj.h b/include/field_map_obj.h
new file mode 100644
index 000000000..0107fa10f
--- /dev/null
+++ b/include/field_map_obj.h
@@ -0,0 +1,84 @@
+#ifndef GUARD_FIELD_MAP_OBJ_H
+#define GUARD_FIELD_MAP_OBJ_H
+
+#define NUM_OBJECT_GRAPHICS_INFO 239
+#define SPRITE_VAR 240
+
+// Exported struct declarations
+
+enum SpinnerRunnerFollowPatterns {
+ RUNFOLLOW_ANY,
+ RUNFOLLOW_NORTH_SOUTH,
+ RUNFOLLOW_EAST_WEST,
+ RUNFOLLOW_NORTH_WEST,
+ RUNFOLLOW_NORTH_EAST,
+ RUNFOLLOW_SOUTH_WEST,
+ RUNFOLLOW_SOUTH_EAST,
+ RUNFOLLOW_NORTH_SOUTH_WEST,
+ RUNFOLLOW_NORTH_SOUTH_EAST,
+ RUNFOLLOW_NORTH_EAST_WEST,
+ RUNFOLLOW_SOUTH_EAST_WEST
+};
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+
+void sub_808D438(void);
+u8 GetFieldObjectIdByLocalIdAndMap(u8, u8, u8);
+bool8 TryGetFieldObjectIdByLocalIdAndMap(u8, u8, u8, u8 *);
+u8 GetFieldObjectIdByXY(s16, s16);
+void FieldObjectSetDirection(struct MapObject *, u8);
+u8 sub_808D4F4(void);
+void RemoveFieldObjectByLocalIdAndMap(u8, u8, u8);
+void npc_load_two_palettes__no_record(u16, u8);
+void npc_load_two_palettes__and_record(u16, u8);
+void sub_808EBA8(u8, u8, u8, s16, s16);
+void pal_patch_for_npc(u16, u8);
+void sub_808E16C(s16, s16);
+void sub_808F28C(u8 localId, u8 mapNum, u8 mapGroup, u8 decorCat);
+void sub_8092FF0(s16, s16, s16 *, s16 *);
+u8 FieldObjectDirectionToImageAnimId(u8);
+void sub_80930E0(s16 *, s16 *, s16, s16);
+void FieldObjectClearAnim(struct MapObject *);
+void FieldObjectClearAnimIfSpecialAnimActive(struct MapObject *);
+void SpawnFieldObjectsInView(s16, s16);
+u8 sprite_new(u8, u8, s16, s16, u8, u8);
+u8 AddPseudoFieldObject(u16, void (*)(struct Sprite *), s16, s16, u8);
+u8 show_sprite(u8, u8, u8);
+u8 SpawnSpecialFieldObjectParametrized(u8, u8, u8, s16, s16, u8);
+u8 SpawnSpecialFieldObject(struct MapObjectTemplate *);
+void sub_8093038(s16, s16, s16 *, s16 *);
+void CameraObjectReset1(void);
+void FieldObjectSetGraphicsId(struct MapObject *, u8);
+void FieldObjectTurn(struct MapObject *, u8);
+void FieldObjectTurnByLocalIdAndMap(u8, u8, u8, u8);
+const struct MapObjectGraphicsInfo *GetFieldObjectGraphicsInfo(u8);
+void npc_by_local_id_and_map_set_field_1_bit_x20(u8, u8, u8, u8);
+void gpu_pal_allocator_reset__manage_upper_four(void);
+void sub_808E82C(u8, u8, u8, s16, s16);
+void sub_808E7E4(u8, u8, u8);
+void sub_808E78C(u8, u8, u8, u8);
+void sub_808E75C(s16, s16);
+void FieldObjectGetLocalIdAndMap(struct MapObject *, u8 *, u8 *, u8 *);
+void npc_coords_shift(struct MapObject *, s16, s16);
+void sub_808EB08(struct MapObject *, s16, s16);
+void sub_808F254(u8, u8, u8);
+void FieldObjectStep(struct MapObject *, struct Sprite *, bool8(struct MapObject *, struct Sprite *));
+u8 FieldObjectFaceOppositeDirection(struct MapObject *, u8);
+u8 GetOppositeDirection(u8);
+u8 GetStepInPlaceDelay4AnimId(u32);
+u8 GetStepInPlaceDelay8AnimId(u32);
+u8 GetStepInPlaceDelay16AnimId(u32);
+u8 GetStepInPlaceDelay32AnimId(u32);
+u8 npc_block_way(struct MapObject *, s16, s16, u32);
+void MoveCoords(u8, s16 *, s16 *);
+bool8 FieldObjectIsSpecialAnimActive(struct MapObject *);
+u8 FieldObjectClearAnimIfSpecialAnimFinished(struct MapObject *);
+u8 GetFieldObjectIdByXYZ(u16 x, u16 y, u8 z);
+
+// Exported data declarations
+
+extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[];
+
+#endif //GUARD_FIELD_MAP_OBJ_H
diff --git a/include/field_map_obj_helpers.h b/include/field_map_obj_helpers.h
new file mode 100644
index 000000000..ba797ec98
--- /dev/null
+++ b/include/field_map_obj_helpers.h
@@ -0,0 +1,7 @@
+#ifndef GUARD_FIELDMAPOBJHELP_H
+#define GUARD_FIELDMAPOBJHELP_H
+
+void UnfreezeMapObjects(void);
+void sub_8097B78(u8, u8);
+
+#endif
diff --git a/include/field_message_box.h b/include/field_message_box.h
new file mode 100644
index 000000000..432c9078b
--- /dev/null
+++ b/include/field_message_box.h
@@ -0,0 +1,10 @@
+#ifndef GUARD_FIELD_MESSAGE_BOX_H
+#define GUARD_FIELD_MESSAGE_BOX_H
+
+bool8 ShowFieldMessage(const u8 *message);
+bool8 sub_8098238(const u8 *message);
+bool8 ShowFieldAutoScrollMessage(const u8 *message);
+void HideFieldMessageBox(void);
+bool8 IsFieldMessageBoxHidden(void);
+
+#endif // GUARD_FIELD_MESSAGE_BOX_H
diff --git a/include/field_player_avatar.h b/include/field_player_avatar.h
new file mode 100644
index 000000000..25b7f2d71
--- /dev/null
+++ b/include/field_player_avatar.h
@@ -0,0 +1,16 @@
+#ifndef GUARD_FIELD_PLAYER_AVATAR_H
+#define GUARD_FIELD_PLAYER_AVATAR_H
+
+void ClearPlayerAvatarInfo(void);
+void SetPlayerAvatarExtraStateTransition(u8, u8);
+u8 GetPlayerAvatarGenderByGraphicsId(u8);
+bool8 TestPlayerAvatarFlags(u8);
+void PlayerGetDestCoords(s16 *, s16 *);
+u8 player_get_direction_lower_nybble(void);
+u8 player_get_direction_upper_nybble(void);
+u8 player_get_x22(void);
+
+void sub_808D074(u8);
+void GetXYCoordsOneStepInFrontOfPlayer(s16 *xPtr, s16 *yPtr);
+
+#endif //GUARD_FIELD_PLAYER_AVATAR_H
diff --git a/include/field_poison.h b/include/field_poison.h
new file mode 100644
index 000000000..d1a4c823b
--- /dev/null
+++ b/include/field_poison.h
@@ -0,0 +1,19 @@
+#ifndef GUARD_FIELD_POISON_H
+#define GUARD_FIELD_POISON_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+
+enum {
+ FLDPSN_NONE,
+ FLDPSN_PSN,
+ FLDPSN_FNT
+};
+
+void sub_80F972C(void);
+unsigned int overworld_poison(void);
+
+#endif //GUARD_FIELD_POISON_H
diff --git a/include/field_screen.h b/include/field_screen.h
new file mode 100644
index 000000000..cfc0d081f
--- /dev/null
+++ b/include/field_screen.h
@@ -0,0 +1,14 @@
+#ifndef GUARD_FIELD_SCREEN_H
+#define GUARD_FIELD_SCREEN_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+void pal_fill_black(void);
+bool8 sub_80ABDFC(void);
+void sub_80AF168(void);
+void UpdateWeatherPerDay(u16 days);
+
+#endif //GUARD_FIELD_SCREEN_H
diff --git a/include/field_screen_effect.h b/include/field_screen_effect.h
new file mode 100644
index 000000000..ef81c2f9e
--- /dev/null
+++ b/include/field_screen_effect.h
@@ -0,0 +1,8 @@
+#ifndef GUARD_FIELD_SCREEN_EFFECT_H
+#define GUARD_FIELD_SCREEN_EFFECT_H
+
+void sub_80AF79C(void);
+void sub_80B009C(u8);
+void sub_80B0244(void);
+
+#endif // GUARD_FIELD_SCREEN_EFFECT_H
diff --git a/include/field_specials.h b/include/field_specials.h
new file mode 100644
index 000000000..1f8fbf147
--- /dev/null
+++ b/include/field_specials.h
@@ -0,0 +1,6 @@
+#ifndef GUARD_FIELD_SPECIALS_H
+#define GUARD_FIELD_SPECIALS_H
+
+u8 GetLeadMonIndex(void);
+
+#endif // GUARD_FIELD_SPECIALS_H
diff --git a/include/field_tasks.h b/include/field_tasks.h
new file mode 100644
index 000000000..2a2a772d8
--- /dev/null
+++ b/include/field_tasks.h
@@ -0,0 +1,6 @@
+#ifndef GUARD_FIELD_TASKS_H
+#define GUARD_FIELD_TASKS_H
+
+void ActivatePerStepCallback(u8);
+
+#endif // GUARD_FIELD_TASKS_H
diff --git a/include/field_weather.h b/include/field_weather.h
new file mode 100644
index 000000000..e12107e70
--- /dev/null
+++ b/include/field_weather.h
@@ -0,0 +1,12 @@
+#ifndef GUARD_WEATHER_H
+#define GUARD_WEATHER_H
+
+void fade_screen(u8, s8);
+
+void SetSav1Weather(u32);
+u8 GetSav1Weather(void);
+void sub_80AEDBC(void);
+
+void DoCurrentWeather(void);
+
+#endif // GUARD_WEATHER_H
diff --git a/include/fieldmap.h b/include/fieldmap.h
new file mode 100644
index 000000000..06cb7cc77
--- /dev/null
+++ b/include/fieldmap.h
@@ -0,0 +1,19 @@
+#ifndef GUARD_FIELDMAP_H
+#define GUARD_FIELDMAP_H
+
+extern struct MapCoords {
+ int width;
+ int height;
+} gUnknown_03005DC0;
+
+u32 MapGridGetMetatileIdAt(int, int);
+u32 MapGridGetMetatileBehaviorAt(int, int);
+void MapGridSetMetatileIdAt(int, int, u16);
+void MapGridSetMetatileEntryAt(int, int, u16);
+void GetCameraCoords(u16*, u16*);
+bool8 MapGridIsImpassableAt(s16, s16);
+s32 GetMapBorderIdAt(s16, s16);
+bool32 CanCameraMoveInDirection(u8);
+u16 GetBehaviorByMetatileId(u16 metatileId);
+
+#endif //GUARD_FIELDMAP_H
diff --git a/include/fldeff_80F9BCC.h b/include/fldeff_80F9BCC.h
new file mode 100644
index 000000000..d57665c68
--- /dev/null
+++ b/include/fldeff_80F9BCC.h
@@ -0,0 +1,14 @@
+#ifndef GUARD_FLDEFF_80F9BCC_H
+#define GUARD_FLDEFF_80F9BCC_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+
+void sub_80FA5E4(s16 id, s16 x, s16 y);
+void sub_80FA794(s16 x, s16 y);
+void overworld_poison_effect(void);
+
+#endif //GUARD_FLDEFF_80F9BCC_H
diff --git a/include/gba/gba.h b/include/gba/gba.h
index 42ae3cdde..7e58efb9f 100644
--- a/include/gba/gba.h
+++ b/include/gba/gba.h
@@ -1,11 +1,12 @@
#ifndef GUARD_GBA_GBA_H
#define GUARD_GBA_GBA_H
-#include "gba/defines.h"
-#include "gba/io_reg.h"
-#include "gba/types.h"
-#include "gba/multiboot.h"
-#include "gba/syscall.h"
-#include "gba/macro.h"
+#include "defines.h"
+#include "io_reg.h"
+#include "types.h"
+#include "multiboot.h"
+#include "syscall.h"
+#include "macro.h"
+#include "isagbprint.h"
#endif // GUARD_GBA_GBA_H
diff --git a/include/gba/isagbprint.h b/include/gba/isagbprint.h
new file mode 100644
index 000000000..ce547928c
--- /dev/null
+++ b/include/gba/isagbprint.h
@@ -0,0 +1,36 @@
+#ifndef GUARD_GBA_ISAGBPRINT_H
+#define GUARD_GBA_ISAGBPRINT_H
+
+#ifdef NDEBUG
+#define AGBPrintInit()
+#define AGBPutc(cChr)
+#define AGBPrint(pBuf)
+#define AGBPrintf(pBuf, ...)
+#define AGBPrintFlush1Block()
+#define AGBPrintFlush()
+#define AGBAssert(pFile, nLine, pExpression, nStopProgram)
+#else
+void AGBPrintInit(void);
+void AGBPutc(const char cChr);
+void AGBPrint(const char *pBuf);
+void AGBPrintf(const char *pBuf, ...);
+void AGBPrintFlush1Block(void);
+void AGBPrintFlush(void);
+void AGBAssert(const char *pFile, int nLine, const char *pExpression, int nStopProgram);
+#endif
+
+#undef AGB_ASSERT
+#ifdef NDEBUG
+#define AGB_ASSERT(exp)
+#else
+#define AGB_ASSERT(exp) (exp) ? ((void*)0) : AGBAssert(__FILE__, __LINE__, #exp, 1);
+#endif
+
+#undef AGB_WARNING
+#ifdef NDEBUG
+#define AGB_WARNING(exp)
+#else
+#define AGB_WARNING(exp) (exp) ? ((void*)0) : AGBAssert(__FILE__, __LINE__, #exp, 0);
+#endif
+
+#endif // GUARD_GBA_ISAGBPRINT_H
diff --git a/include/global.berry.h b/include/global.berry.h
new file mode 100644
index 000000000..5c8a43a02
--- /dev/null
+++ b/include/global.berry.h
@@ -0,0 +1,76 @@
+#ifndef GUARD_GLOBAL_BERRY_H
+#define GUARD_GLOBAL_BERRY_H
+
+#define BERRY_NAME_COUNT 7
+#define BERRY_ITEM_EFFECT_COUNT 18
+
+struct Berry
+{
+ const u8 name[BERRY_NAME_COUNT];
+ u8 firmness;
+ u16 size;
+ u8 maxYield;
+ u8 minYield;
+ const u8 *description1;
+ const u8 *description2;
+ u8 stageDuration;
+ u8 spicy;
+ u8 dry;
+ u8 sweet;
+ u8 bitter;
+ u8 sour;
+ u8 smoothness;
+};
+
+// with no const fields
+
+struct Berry2
+{
+ u8 name[BERRY_NAME_COUNT];
+ u8 firmness;
+ u16 size;
+ u8 maxYield;
+ u8 minYield;
+ u8 *description1;
+ u8 *description2;
+ u8 stageDuration;
+ u8 spicy;
+ u8 dry;
+ u8 sweet;
+ u8 bitter;
+ u8 sour;
+ u8 smoothness;
+};
+
+struct EnigmaBerry
+{
+ struct Berry2 berry;
+ u8 itemEffect[BERRY_ITEM_EFFECT_COUNT];
+ u8 holdEffect;
+ u8 holdEffectParam;
+ u32 checksum;
+};
+
+struct BattleEnigmaBerry
+{
+ /*0x00*/ u8 name[BERRY_NAME_COUNT];
+ /*0x07*/ u8 holdEffect;
+ /*0x08*/ u8 itemEffect[BERRY_ITEM_EFFECT_COUNT];
+ /*0x1A*/ u8 holdEffectParam;
+};
+
+struct BerryTree
+{
+ u8 berry;
+ u8 stage:7;
+ u8 growthSparkle:1;
+ u16 minutesUntilNextStage;
+ u8 berryYield;
+ u8 regrowthCount:4;
+ u8 watered1:1;
+ u8 watered2:1;
+ u8 watered3:1;
+ u8 watered4:1;
+};
+
+#endif // GUARD_GLOBAL_BERRY_H
diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h
new file mode 100644
index 000000000..ed5054b7d
--- /dev/null
+++ b/include/global.fieldmap.h
@@ -0,0 +1,336 @@
+#ifndef GUARD_GLOBAL_FIELDMAP_H
+#define GUARD_GLOBAL_FIELDMAP_H
+
+#define NUM_FIELD_OBJECTS 16
+
+enum
+{
+ CONNECTION_SOUTH = 1,
+ CONNECTION_NORTH,
+ CONNECTION_WEST,
+ CONNECTION_EAST,
+ CONNECTION_DIVE,
+ CONNECTION_EMERGE
+};
+
+// map types
+enum
+{
+ MAP_TYPE_0,
+ MAP_TYPE_TOWN,
+ MAP_TYPE_CITY,
+ MAP_TYPE_ROUTE,
+ MAP_TYPE_UNDERGROUND,
+ MAP_TYPE_UNDERWATER,
+ MAP_TYPE_6,
+ MAP_TYPE_7,
+ MAP_TYPE_INDOOR,
+ MAP_TYPE_SECRET_BASE
+};
+
+// map battle scenes
+enum
+{
+ MAP_BATTLE_SCENE_NORMAL, // 0
+ MAP_BATTLE_SCENE_GYM, // 1
+ MAP_BATTLE_SCENE_MAGMA, // 2
+ MAP_BATTLE_SCENE_AQUA, // 3
+ MAP_BATTLE_SCENE_SIDNEY, // 4
+ MAP_BATTLE_SCENE_PHOEBE, // 5
+ MAP_BATTLE_SCENE_GLACIA, // 6
+ MAP_BATTLE_SCENE_DRAKE, // 7
+ MAP_BATTLE_SCENE_BATTLE_TOWER, // 8
+};
+
+typedef void (*TilesetCB)(void);
+
+struct Tileset
+{
+ /*0x00*/ bool8 isCompressed;
+ /*0x01*/ bool8 isSecondary;
+ /*0x04*/ void *tiles;
+ /*0x08*/ void *palettes;
+ /*0x0c*/ void *metatiles;
+ /*0x10*/ void *metatileAttributes;
+ /*0x14*/ TilesetCB callback;
+};
+
+struct MapData
+{
+ /*0x00*/ s32 width;
+ /*0x04*/ s32 height;
+ /*0x08*/ u16 *border;
+ /*0x0c*/ u16 *map;
+ /*0x10*/ struct Tileset *primaryTileset;
+ /*0x14*/ struct Tileset *secondaryTileset;
+};
+
+struct BackupMapData
+{
+ s32 width;
+ s32 height;
+ u16 *map;
+};
+
+struct MapObjectTemplate
+{
+ /*0x00*/ u8 localId;
+ /*0x01*/ u8 graphicsId;
+ /*0x02*/ u8 unk2;
+ /*0x04*/ s16 x;
+ /*0x06*/ s16 y;
+ /*0x08*/ u8 elevation;
+ /*0x09*/ u8 movementType;
+ /*0x0A*/ u8 unkA_0:4;
+ u8 unkA_4:4;
+ ///*0x0B*/ u8 fillerB[1];
+ /*0x0C*/ u16 unkC;
+ /*0x0E*/ u16 unkE;
+ /*0x10*/ const u8 *script;
+ /*0x14*/ u16 flagId;
+ /*0x16*/ u8 filler_16[2];
+}; /*size = 0x18*/
+
+struct WarpEvent
+{
+ s16 x, y;
+ s8 warpId;
+ u8 mapGroup;
+ u8 mapNum;
+ u8 unk7;
+};
+
+struct CoordEvent
+{
+ s16 x, y;
+ u8 unk4;
+ u8 filler_5;
+ u16 trigger;
+ u16 index;
+ u8 filler_A[0x2];
+ u8 *script;
+};
+
+struct BgEvent
+{
+ u16 x, y;
+ u8 unk4;
+ u8 kind;
+ // 0x2 padding for the union beginning.
+ union { // carried over from diego's FR/LG work, seems to be the same struct
+ // in gen 3, "kind" (0x3 in BgEvent struct) determines the method to read the union.
+ u8 *script;
+
+ // hidden item type probably
+ struct {
+ u8 filler6[0x2];
+ u16 hiddenItemId; // flag offset to determine flag lookup
+ } hiddenItem;
+
+ // secret base type
+ u32 secretBaseId;
+
+ } bgUnion;
+};
+
+struct MapEvents
+{
+ u8 mapObjectCount;
+ u8 warpCount;
+ u8 coordEventCount;
+ u8 bgEventCount;
+
+ struct MapObjectTemplate *mapObjects;
+ struct WarpEvent *warps;
+ struct CoordEvent *coordEvents;
+ struct BgEvent *bgEvents;
+};
+
+struct MapConnection
+{
+ /*0x00*/ u8 direction;
+ /*0x01*/ u32 offset;
+ /*0x05*/ u8 mapGroup;
+ /*0x06*/ u8 mapNum;
+};
+
+struct MapConnections
+{
+ s32 count;
+ struct MapConnection *connections;
+};
+
+struct MapHeader
+{
+ /* 0x00 */ struct MapData *mapData;
+ /* 0x04 */ struct MapEvents *events;
+ /* 0x08 */ u8 *mapScripts;
+ /* 0x0C */ struct MapConnections *connections;
+ /* 0x10 */ u16 music;
+ /* 0x12 */ u16 mapDataId;
+ /* 0x14 */ u8 regionMapSectionId;
+ /* 0x15 */ u8 cave;
+ /* 0x16 */ u8 weather;
+ /* 0x17 */ u8 mapType;
+ /* 0x18 */ u8 filler_18;
+ /* 0x19 */ u8 escapeRope;
+ /* 0x1A */ u8 flags;
+ /* 0x1B */ u8 battleType;
+};
+
+struct MapObject
+{
+ /*0x00*/ u32 active:1;
+ u32 mapobj_bit_1:1;
+ u32 mapobj_bit_2:1;
+ u32 mapobj_bit_3:1;
+ u32 mapobj_bit_4:1;
+ u32 mapobj_bit_5:1;
+ u32 mapobj_bit_6:1;
+ u32 mapobj_bit_7:1;
+ /*0x01*/ u32 mapobj_bit_8:1;
+ u32 mapobj_bit_9:1;
+ u32 mapobj_bit_10:1;
+ u32 mapobj_bit_11:1;
+ u32 mapobj_bit_12:1;
+ u32 mapobj_bit_13:1;
+ u32 mapobj_bit_14:1;
+ u32 mapobj_bit_15:1;
+ /*0x02*/ u32 mapobj_bit_16:1;
+ u32 mapobj_bit_17:1;
+ u32 mapobj_bit_18:1;
+ u32 mapobj_bit_19:1;
+ u32 mapobj_bit_20:1;
+ u32 mapobj_bit_21:1;
+ u32 mapobj_bit_22:1;
+ u32 mapobj_bit_23:1;
+ /*0x03*/ u32 mapobj_bit_24:1;
+ u32 mapobj_bit_25:1;
+ u32 mapobj_bit_26:1;
+ u32 mapobj_bit_27:1;
+ u32 mapobj_bit_28:1;
+ u32 mapobj_bit_29:1;
+ u32 mapobj_bit_30:1;
+ u32 mapobj_bit_31:1;
+ /*0x04*/ u8 spriteId;
+ /*0x05*/ u8 graphicsId;
+ /*0x06*/ u8 animPattern;
+ /*0x07*/ u8 trainerType;
+ /*0x08*/ u8 localId;
+ /*0x09*/ u8 mapNum;
+ /*0x0A*/ u8 mapGroup;
+ /*0x0B*/ u8 mapobj_unk_0B_0:4;
+ u8 elevation:4;
+ /*0x0C*/ struct Coords16 coords1;
+ /*0x10*/ struct Coords16 coords2;
+ /*0x14*/ struct Coords16 coords3;
+ /*0x18*/ u8 mapobj_unk_18:4; //current direction?
+ /*0x18*/ u8 placeholder18:4;
+ /*0x19*/ union __attribute__((packed)) {
+ u8 as_byte;
+ struct __attribute__((packed)) {
+ u8 x:4;
+ u8 y:4;
+ } __attribute__((aligned (1))) as_nybbles;
+ } __attribute__((aligned (1))) range;
+ /*0x1A*/ u8 mapobj_unk_1A;
+ /*0x1B*/ u8 mapobj_unk_1B;
+ /*0x1C*/ u8 mapobj_unk_1C;
+ /*0x1D*/ u8 trainerRange_berryTreeId;
+ /*0x1E*/ u8 mapobj_unk_1E;
+ /*0x1F*/ u8 mapobj_unk_1F;
+ /*0x20*/ u8 mapobj_unk_20;
+ /*0x21*/ u8 mapobj_unk_21;
+ /*0x22*/ u8 animId;
+ /*size = 0x24*/
+};
+
+struct MapObjectGraphicsInfo
+{
+ /*0x00*/ u16 tileTag;
+ /*0x02*/ u16 paletteTag1;
+ /*0x04*/ u16 paletteTag2;
+ /*0x06*/ u16 size;
+ /*0x08*/ s16 width;
+ /*0x0A*/ s16 height;
+ /*0x0C*/ u8 paletteSlot:4;
+ u8 shadowSize:2;
+ u8 inanimate:1;
+ u8 disableReflectionPaletteLoad:1;
+ /*0x0D*/ u8 tracks;
+ /*0x10*/ const struct OamData *oam;
+ /*0x14*/ const struct SubspriteTable *subspriteTables;
+ /*0x18*/ const union AnimCmd *const *anims;
+ /*0x1C*/ const struct SpriteFrameImage *images;
+ /*0x20*/ const union AffineAnimCmd *const *affineAnims;
+};
+
+#define PLAYER_AVATAR_FLAG_ON_FOOT (1 << 0)
+#define PLAYER_AVATAR_FLAG_MACH_BIKE (1 << 1)
+#define PLAYER_AVATAR_FLAG_ACRO_BIKE (1 << 2)
+#define PLAYER_AVATAR_FLAG_SURFING (1 << 3)
+#define PLAYER_AVATAR_FLAG_4 (1 << 4)
+#define PLAYER_AVATAR_FLAG_5 (1 << 5)
+#define PLAYER_AVATAR_FLAG_6 (1 << 6)
+#define PLAYER_AVATAR_FLAG_DASH (1 << 7)
+
+enum
+{
+ ACRO_BIKE_NORMAL,
+ ACRO_BIKE_TURNING,
+ ACRO_BIKE_WHEELIE_STANDING,
+ ACRO_BIKE_BUNNY_HOP,
+ ACRO_BIKE_WHEELIE_MOVING,
+ ACRO_BIKE_STATE5,
+ ACRO_BIKE_STATE6,
+};
+
+enum
+{
+ DIR_NONE,
+ DIR_SOUTH,
+ DIR_NORTH,
+ DIR_WEST,
+ DIR_EAST,
+};
+
+enum
+{
+ COLLISION_LEDGE_JUMP = 6
+};
+
+struct PlayerAvatar /* 0x202E858 */
+{
+ /*0x00*/ u8 flags;
+ /*0x01*/ u8 bike;
+ /*0x02*/ u8 running2;
+ /*0x03*/ u8 running1;
+ /*0x04*/ u8 spriteId;
+ /*0x05*/ u8 mapObjectId;
+ /*0x06*/ u8 unk6;
+ /*0x07*/ u8 gender;
+ u8 acroBikeState;
+ u8 unk9;
+ u8 bikeFrameCounter;
+ u8 unkB;
+ u32 unkC;
+ u32 unk10;
+ u8 unk14[8];
+ u8 unk1C[8];
+ // TODO: rest of struct
+};
+
+struct Camera
+{
+ bool8 active:1;
+ s32 x;
+ s32 y;
+};
+
+extern struct MapObject gMapObjects[NUM_FIELD_OBJECTS];
+extern u8 gSelectedMapObject;
+extern struct MapHeader gMapHeader;
+extern struct PlayerAvatar gPlayerAvatar;
+extern struct Camera gCamera;
+
+#endif // GUARD_GLOBAL_FIELDMAP_H
diff --git a/include/global.h b/include/global.h
new file mode 100644
index 000000000..d864a6ab7
--- /dev/null
+++ b/include/global.h
@@ -0,0 +1,620 @@
+#ifndef GUARD_GLOBAL_H
+#define GUARD_GLOBAL_H
+
+#include "gba/gba.h"
+#include "config.h"
+
+// Prevent cross-jump optimization.
+#define BLOCK_CROSS_JUMP asm("");
+
+// to help in decompiling
+#define asm_comment(x) asm volatile("@ -- " x " -- ")
+#define asm_unified(x) asm(".syntax unified\n" x "\n.syntax divided")
+
+#if defined (__APPLE__) || defined (__CYGWIN__)
+void *memset(void *, int, size_t);
+void *memcpy(void *, const void *, size_t);
+int strcmp(const char *s1, const char *s2);
+char* strcpy(char *dst0, const char *src0);
+#endif // __APPLE__
+
+#define ARRAY_COUNT(array) (sizeof(array) / sizeof((array)[0]))
+
+// useful math macros
+
+// Converts a number to Q8.8 fixed-point format
+#define Q_8_8(n) ((s16)((n) * 256))
+
+// Converts a number to Q4.12 fixed-point format
+#define Q_4_12(n) ((s16)((n) * 4096))
+
+#define POKEMON_NAME_LENGTH 10
+#define OT_NAME_LENGTH 7
+
+extern u8 gStringVar1[];
+extern u8 gStringVar2[];
+extern u8 gStringVar3[];
+extern u8 gStringVar4[];
+
+enum
+{
+ VERSION_SAPPHIRE = 1,
+ VERSION_RUBY = 2,
+ VERSION_EMERALD = 3,
+ VERSION_FIRE_RED = 4,
+ VERSION_LEAF_GREEN = 5,
+};
+
+enum LanguageId {
+ LANGUAGE_JAPANESE = 1,
+ LANGUAGE_ENGLISH = 2,
+ LANGUAGE_FRENCH = 3,
+ LANGUAGE_ITALIAN = 4,
+ LANGUAGE_GERMAN = 5,
+ // 6 goes unused but the theory is it was meant to be Korean
+ LANGUAGE_SPANISH = 7,
+};
+
+#define GAME_LANGUAGE (LANGUAGE_ENGLISH)
+
+enum
+{
+ MALE,
+ FEMALE
+};
+
+enum
+{
+ OPTIONS_BUTTON_MODE_NORMAL,
+ OPTIONS_BUTTON_MODE_LR,
+ OPTIONS_BUTTON_MODE_L_EQUALS_A
+};
+
+enum
+{
+ OPTIONS_TEXT_SPEED_SLOW,
+ OPTIONS_TEXT_SPEED_MID,
+ OPTIONS_TEXT_SPEED_FAST
+};
+
+enum
+{
+ OPTIONS_SOUND_MONO,
+ OPTIONS_SOUND_STEREO
+};
+
+enum
+{
+ OPTIONS_BATTLE_STYLE_SHIFT,
+ OPTIONS_BATTLE_STYLE_SET
+};
+
+enum
+{
+ BAG_ITEMS = 1,
+ BAG_POKEBALLS,
+ BAG_TMsHMs,
+ BAG_BERRIES,
+ BAG_KEYITEMS
+};
+
+struct Coords16
+{
+ s16 x;
+ s16 y;
+};
+
+struct UCoords16
+{
+ u16 x;
+ u16 y;
+};
+
+struct Time
+{
+ /*0x00*/ s16 days;
+ /*0x02*/ s8 hours;
+ /*0x03*/ s8 minutes;
+ /*0x04*/ s8 seconds;
+};
+
+struct Pokedex
+{
+ /*0x00*/ u8 order;
+ /*0x01*/ u8 unknown1;
+ /*0x02*/ u8 nationalMagic; // must equal 0xDA in order to have National mode
+ /*0x03*/ u8 unknown2;
+ /*0x04*/ u32 unownPersonality; // set when you first see Unown
+ /*0x08*/ u32 spindaPersonality; // set when you first see Spinda
+ /*0x0C*/ u32 unknown3;
+ /*0x10*/ u8 owned[52];
+ /*0x44*/ u8 seen[52];
+};
+
+struct PokemonJumpResults // possibly used in the game itself?
+{
+ u16 jumpsInRow;
+ u16 field2;
+ u16 excellentsInRow;
+ u16 field6;
+ u16 field8;
+ u16 fieldA;
+ u32 bestJumpScore;
+};
+
+struct BerryPickingResults // possibly used in the game itself? Size may be wrong as well
+{
+ u32 bestScore;
+ u16 berriesPicked;
+ u16 berriesPickedInRow;
+ u8 field_8;
+ u8 field_9;
+ u8 field_A;
+ u8 field_B;
+ u8 field_C;
+ u8 field_D;
+ u8 field_E;
+ u8 field_F;
+};
+
+struct PyramidBag
+{
+ u16 items_Lvl50[10];
+ u16 items_OpenLvl[10];
+ u8 quantity[10];
+};
+
+struct BerryCrush
+{
+ u16 berryCrushResults[4];
+ u32 berryPowderAmount;
+ u32 unk;
+};
+
+#define PLAYER_NAME_LENGTH 8
+
+struct UnknownSaveBlock2Struct
+{
+ u8 field_0;
+ u8 field_1;
+ u8 field_2[2];
+ u8 field_4[8];
+ u8 field_C[16];
+ u16 field_1C[6];
+ u16 field_28[6];
+ u8 field_34[176];
+ u8 field_E4;
+ u8 field_E5;
+ u8 field_E6;
+ u8 field_E7;
+ u8 field_E8;
+ u8 field_E9;
+ u8 field_EA;
+ u8 field_EB;
+}; // sizeof = 0xEC
+
+struct SaveBlock2
+{
+ /*0x000*/ u8 playerName[PLAYER_NAME_LENGTH];
+ /*0x008*/ u8 playerGender; // MALE, FEMALE
+ /*0x009*/ u8 specialSaveWarp;
+ /*0x00A*/ u8 playerTrainerId[4];
+ /*0x00E*/ u16 playTimeHours;
+ /*0x010*/ u8 playTimeMinutes;
+ /*0x011*/ u8 playTimeSeconds;
+ /*0x012*/ u8 playTimeVBlanks;
+ /*0x013*/ u8 optionsButtonMode; // OPTIONS_BUTTON_MODE_[NORMAL/LR/L_EQUALS_A]
+ /*0x014*/ u16 optionsTextSpeed:3; // OPTIONS_TEXT_SPEED_[SLOW/MID/FAST]
+ u16 optionsWindowFrameType:5; // Specifies one of the 20 decorative borders for text boxes
+ u16 optionsSound:1; // OPTIONS_SOUND_[MONO/STEREO]
+ u16 optionsBattleStyle:1; // OPTIONS_BATTLE_STYLE_[SHIFT/SET]
+ u16 optionsBattleSceneOff:1; // whether battle animations are disabled
+ u16 regionMapZoom:1; // whether the map is zoomed in
+ /*0x018*/ struct Pokedex pokedex;
+ /*0x090*/ u8 filler_90[0x8];
+ /*0x098*/ struct Time localTimeOffset;
+ /*0x0A0*/ struct Time lastBerryTreeUpdate;
+ /*0x0A8*/ u32 field_A8;
+ /*0x0AC*/ u8 filler_AC[0xE74];
+ /*0xF20*/ u32 encryptionKey;
+};
+
+extern struct SaveBlock2 *gSaveBlock2Ptr;
+
+struct SecretBaseRecord
+{
+ /*0x1A9C*/ u8 secretBaseId;
+ /*0x1A9D*/ u8 sbr_field_1_0:4;
+ /*0x1A9D*/ u8 gender:1;
+ /*0x1A9D*/ u8 sbr_field_1_5:1;
+ /*0x1A9D*/ u8 sbr_field_1_6:2;
+ /*0x1A9E*/ u8 trainerName[OT_NAME_LENGTH];
+ /*0x1AA5*/ u8 trainerId[4]; // byte 0 is used for determining trainer class
+ /*0x1AA9*/ u8 language;
+ /*0x1AAA*/ u16 sbr_field_e;
+ /*0x1AAC*/ u8 sbr_field_10;
+ /*0x1AAD*/ u8 sbr_field_11;
+ /*0x1AAE*/ u8 decorations[16];
+ /*0x1ABE*/ u8 decorationPos[16];
+ /*0x1AD0*/ u32 partyPersonality[6];
+ /*0x1AE8*/ u16 partyMoves[6 * 4];
+ /*0x1B18*/ u16 partySpecies[6];
+ /*0x1B24*/ u16 partyHeldItems[6];
+ /*0x1B2E*/ u8 partyLevels[6];
+ /*0x1B34*/ u8 partyEVs[6];
+};
+
+#include "constants/game_stat.h"
+#include "global.fieldmap.h"
+#include "global.berry.h"
+#include "pokemon.h"
+
+struct WarpData
+{
+ s8 mapGroup;
+ s8 mapNum;
+ s8 warpId;
+ s16 x, y;
+};
+
+struct ItemSlot
+{
+ u16 itemId;
+ u16 quantity;
+};
+
+struct Pokeblock
+{
+ u8 color;
+ u8 spicy;
+ u8 dry;
+ u8 sweet;
+ u8 bitter;
+ u8 sour;
+ u8 feel;
+};
+
+struct Roamer
+{
+ /*0x00*/ u32 ivs;
+ /*0x04*/ u32 personality;
+ /*0x08*/ u16 species;
+ /*0x0A*/ u16 hp;
+ /*0x0C*/ u8 level;
+ /*0x0D*/ u8 status;
+ /*0x0E*/ u8 cool;
+ /*0x0F*/ u8 beauty;
+ /*0x10*/ u8 cute;
+ /*0x11*/ u8 smart;
+ /*0x12*/ u8 tough;
+ /*0x13*/ bool8 active;
+ /*0x14*/ u8 filler[0x8];
+};
+
+struct RamScriptData
+{
+ u8 magic;
+ u8 mapGroup;
+ u8 mapNum;
+ u8 objectId;
+ u8 script[995];
+};
+
+struct RamScript
+{
+ u32 checksum;
+ struct RamScriptData data;
+};
+
+struct EasyChatPair
+{
+ u16 unk0_0:7;
+ u16 unk0_7:7;
+ u16 unk1_6:1;
+ u16 unk2;
+ u16 words[2];
+}; /*size = 0x8*/
+
+struct MailStruct
+{
+ /*0x00*/ u16 words[9];
+ /*0x12*/ u8 playerName[8];
+ /*0x1A*/ u8 trainerId[4];
+ /*0x1E*/ u16 species;
+ /*0x20*/ u16 itemId;
+};
+
+struct UnkMauvilleOldManStruct
+{
+ u8 unk_2D94;
+ u8 unk_2D95;
+ /*0x2D96*/ u16 mauvilleOldMan_ecArray[6];
+ /*0x2DA2*/ u16 mauvilleOldMan_ecArray2[6];
+ /*0x2DAE*/ u8 playerName[8];
+ /*0x2DB6*/ u8 filler_2DB6[0x3];
+ /*0x2DB9*/ u8 playerTrainerId[4];
+ u8 unk_2DBD;
+}; /*size = 0x2C*/
+
+struct UnkMauvilleOldManStruct2
+{
+ u8 filler0;
+ u8 unk1;
+ u8 unk2;
+ u16 mauvilleOldMan_ecArray[10];
+ u8 mauvilleOldMan_ecArray2[12];
+ u8 fillerF[0x2];
+}; /*size = 0x2C*/
+
+struct MauvilleOldManTrader
+{
+ u8 unk0;
+ u8 unk1[4];
+ u8 unk5[4][11];
+ u8 unk31;
+};
+
+typedef union OldMan
+{
+ struct UnkMauvilleOldManStruct oldMan1;
+ struct UnkMauvilleOldManStruct2 oldMan2;
+ struct MauvilleOldManTrader trader;
+ u8 filler[0x40];
+} OldMan;
+
+struct RecordMixing_UnknownStructSub
+{
+ u32 unk0;
+ u8 data[0x34];
+ //u8 data[0x38];
+};
+
+struct RecordMixing_UnknownStruct
+{
+ struct RecordMixing_UnknownStructSub data[2];
+ u32 unk70;
+ u16 unk74[0x2];
+};
+
+struct LinkBattleRecord
+{
+ u8 name[8];
+ u16 trainerId;
+ u16 wins;
+ u16 losses;
+ u16 draws;
+};
+
+struct RecordMixingGiftData
+{
+ u8 unk0;
+ u8 quantity;
+ u16 itemId;
+ u8 filler4[8];
+};
+
+struct RecordMixingGift
+{
+ int checksum;
+ struct RecordMixingGiftData data;
+};
+
+struct ContestWinner
+{
+ u32 personality;
+ u32 trainerId;
+ u16 species;
+ u8 contestCategory;
+ u8 monName[11];
+ u8 trainerName[8];
+ u8 contestRank;
+};
+
+struct DaycareMiscMon
+{
+ struct MailStruct mail;
+ u8 OT_name[OT_NAME_LENGTH + 1];
+ u8 monName[POKEMON_NAME_LENGTH + 1];
+ u8 gameLanguage:4;
+ u8 monLanguage:4;
+};
+
+struct DaycareMon
+{
+ struct BoxPokemon mon;
+ struct DaycareMiscMon misc;
+ u32 steps;
+};
+
+#define DAYCARE_MON_COUNT 2
+
+struct DayCare
+{
+ struct DaycareMon mons[DAYCARE_MON_COUNT];
+ u32 offspringPersonality;
+ u8 stepCounter;
+};
+
+struct DayCareMail
+{
+ /*0x00*/ struct MailStruct message;
+ /*0x24*/ u8 names[19];
+};
+
+struct RecordMixingDayCareMail
+{
+ struct DayCareMail mail[DAYCARE_MON_COUNT];
+ u32 numDaycareMons;
+ bool16 holdsItem[DAYCARE_MON_COUNT];
+};
+
+#define MAP_OBJECTS_COUNT 16
+#define BERRY_TREES_COUNT 128
+#define FLAGS_COUNT 300
+#define VARS_COUNT 256
+#define MAIL_COUNT 16
+
+enum
+{
+ LILYCOVE_LADY_QUIZ,
+ LILYCOVE_LADY_FAVOUR,
+ LILYCOVE_LADY_CONTEST
+};
+
+struct LilycoveLadyQuiz
+{
+ /*0x000*/ u8 id;
+ /*0x001*/ u8 phase;
+ /*0x002*/ u16 unk_002[9];
+ /*0x014*/ u16 unk_014;
+ /*0x016*/ u16 unk_016;
+ /*0x018*/ u8 playerName[8];
+ /*0x020*/ u16 playerTrainerId[4];
+ /*0x028*/ u16 itemId;
+ /*0x02a*/ u8 unk_02a;
+ /*0x02b*/ u8 unk_02b;
+ /*0x02c*/ u8 unk_02c;
+ /*0x02d*/ u8 language;
+};
+
+struct LilycoveLadyFavour
+{
+ /*0x000*/ u8 id;
+ /*0x001*/ u8 phase;
+ /*0x002*/ u8 unk_002;
+ /*0x003*/ u8 unk_003;
+ /*0x004*/ u8 playerName[8];
+ /*0x00c*/ u8 unk_00c;
+ /*0x00e*/ u16 itemId;
+ /*0x010*/ u16 unk_010;
+ /*0x012*/ u8 language;
+};
+
+struct LilycoveLadyContest
+{
+ /*0x000*/ u8 id;
+ /*0x001*/ u8 phase;
+ /*0x002*/ u8 fave_pkblk;
+ /*0x003*/ u8 other_pkblk;
+ /*0x004*/ u8 playerName[8];
+ /*0x00c*/ u8 max_sheen;
+ /*0x00d*/ u8 category;
+ /*0x00e*/ u8 language;
+};
+
+typedef union // TODO
+{
+ struct LilycoveLadyQuiz quiz;
+ struct LilycoveLadyFavour favour;
+ struct LilycoveLadyContest contest;
+ u8 id;
+} LilycoveLady;
+
+struct WaldaPhrase
+{
+ u16 field_0;
+ u16 field_2;
+ u8 text[16];
+ u8 iconId;
+ u8 patternId;
+ bool8 patternUnlocked;
+};
+
+struct SaveBlock1
+{
+ /*0x00*/ struct Coords16 pos;
+ /*0x04*/ struct WarpData location;
+ /*0x0C*/ struct WarpData warp1;
+ /*0x14*/ struct WarpData warp2;
+ /*0x1C*/ struct WarpData warp3;
+ /*0x24*/ struct WarpData warp4;
+ /*0x2C*/ u16 battleMusic;
+ /*0x2E*/ u8 weather;
+ /*0x2F*/ u8 filler_2F;
+ /*0x30*/ u8 flashUsed;
+ /*0x32*/ u16 mapDataId;
+ /*0x34*/ u16 mapView[0x100];
+ /*0x234*/ u8 playerPartyCount;
+ /*0x238*/ struct Pokemon playerParty[6];
+ /*0x490*/ u32 money;
+ /*0x494*/ u16 coins;
+ /*0x496*/ u16 registeredItem; // registered for use with SELECT button
+ /*0x498*/ struct ItemSlot pcItems[50];
+ /*0x560*/ struct ItemSlot bagPocket_Items[30];
+ /*0x5D8*/ struct ItemSlot bagPocket_KeyItems[30];
+ /*0x650*/ struct ItemSlot bagPocket_PokeBalls[16];
+ /*0x690*/ struct ItemSlot bagPocket_TMHM[64];
+ /*0x790*/ struct ItemSlot bagPocket_Berries[46];
+ /*0x848*/ struct Pokeblock pokeblocks[40];
+ /*0x988*/ u8 seen1[52];
+ /*0x9BC*/ u16 berryBlenderRecords[3];
+ /*0x9C2*/ u8 field_9C2[6];
+ /*0x9C8*/ u16 trainerRematchStepCounter;
+ /*0x9CA*/ u8 trainerRematches[100];
+ /*0xA30*/ struct MapObject mapObjects[MAP_OBJECTS_COUNT];
+ /*0xC70*/ struct MapObjectTemplate mapObjectTemplates[64];
+ /*0x1270*/ u8 flags[FLAGS_COUNT];
+ /*0x139C*/ u16 vars[VARS_COUNT];
+ /*0x159C*/ u32 gameStats[NUM_GAME_STATS];
+ /*0x169C*/ struct BerryTree berryTrees[BERRY_TREES_COUNT];
+ /*0x1A9C*/ struct SecretBaseRecord secretBases[20];
+ /*0x271C*/ u8 playerRoomDecor[12];
+ /*0x2728*/ u8 playerRoomDecorPos[12];
+ /*0x2734*/ u8 decorDesk[10];
+ /*0x????*/ u8 decorChair[10];
+ /*0x????*/ u8 decorPlant[10];
+ /*0x????*/ u8 decorOrnament[30];
+ /*0x????*/ u8 decorMat[30];
+ /*0x????*/ u8 decorPoster[10];
+ /*0x????*/ u8 decorDoll[40];
+ /*0x????*/ u8 decorCushion[10];
+ /*0x27CA*/ u8 padding_27CA[2];
+ /*0x2B90*/ u16 outbreakPokemonSpecies;
+ /*0x2B92*/ u8 outbreakLocationMapNum;
+ /*0x2B93*/ u8 outbreakLocationMapGroup;
+ /*0x2B94*/ u8 outbreakPokemonLevel;
+ /*0x2B95*/ u8 outbreakUnk1;
+ /*0x2B96*/ u16 outbreakUnk2;
+ /*0x2B98*/ u16 outbreakPokemonMoves[4];
+ /*0x2BA0*/ u8 outbreakUnk4;
+ /*0x2BA1*/ u8 outbreakPokemonProbability;
+ /*0x2BA2*/ u16 outbreakDaysLeft;
+ /*0x2BB0*/ u16 unk2BB0[6];
+ /*0x2BBC*/ u16 unk2BBC[6];
+ /*0x2BC8*/ u16 unk2BC8[6];
+ /*0x2BD4*/ u16 unk2BD4[6];
+ /*0x2BE0*/ struct MailStruct mail[MAIL_COUNT];
+ /*0x2E20*/ u8 additionalPhrases[5]; // bitfield for 33 additional phrases in easy chat system
+ /*0x2E25*/ u8 unk2E25[3]; // possibly padding?
+ /*0x2E28*/ OldMan oldMan;
+ /*0x2e64*/ struct EasyChatPair easyChatPairs[5]; //Dewford trend [0] and some other stuff
+ /*0x2e90*/ struct ContestWinner contestWinners[13]; // 0 - 5 used in contest hall, 6 - 7 unused?, 8 - 12 museum
+ /*0x3030*/ struct DayCare daycare;
+ /*0x3150*/ struct LinkBattleRecord linkBattleRecords[5];
+ /*0x31A0*/ u8 unk_31A0;
+ /*0x31A1*/ u8 filler_31A1[7];
+ /*0x31A8*/ u8 giftRibbons[52];
+ /*0x31DC*/ struct Roamer roamer;
+ /*0x31F8*/ struct EnigmaBerry enigmaBerry;
+ /*0x322C*/ u8 field_322C[1276];
+ /*0x3728*/ struct RamScript ramScript;
+ /*0x3B14*/ struct RecordMixingGift recordMixingGift;
+ /*0x3B24*/ u8 seen2[52];
+ /*0x3B58*/ LilycoveLady lilycoveLady;
+ /*0x3B88*/ u8 filler_3B88[0x1E8];
+ /*0x3D70*/ struct WaldaPhrase waldaPhrase;
+ // sizeof: 0x3D88
+};
+
+extern struct SaveBlock1* gSaveBlock1Ptr;
+
+struct Bitmap // TODO: Find a better spot for this
+{
+ u8* pixels;
+ u32 width:16;
+ u32 height:16;
+};
+
+extern u8 gReservedSpritePaletteCount;
+
+#endif // GUARD_GLOBAL_H
diff --git a/include/gpu_regs.h b/include/gpu_regs.h
new file mode 100644
index 000000000..89e0cb64b
--- /dev/null
+++ b/include/gpu_regs.h
@@ -0,0 +1,19 @@
+#ifndef GUARD_GPU_REGS_H
+#define GUARD_GPU_REGS_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+void InitGpuRegManager(void);
+void CopyBufferedValuesToGpuRegs(void);
+void SetGpuReg(u8 regOffset, u16 value);
+void SetGpuReg_ForcedBlank(u8 regOffset, u16 value);
+u16 GetGpuReg(u8 regOffset);
+void SetGpuRegBits(u8 regOffset, u16 mask);
+void ClearGpuRegBits(u8 regOffset, u16 mask);
+void EnableInterrupts(u16 mask);
+void DisableInterrupts(u16 mask);
+
+#endif //GUARD_GPU_REGS_H
diff --git a/include/graphics.h b/include/graphics.h
new file mode 100644
index 000000000..aad5c0190
--- /dev/null
+++ b/include/graphics.h
@@ -0,0 +1,144 @@
+//
+// Created by scott on 10/21/2017.
+//
+
+#ifndef GUARD_GRAPHICS_H
+#define GUARD_GRAPHICS_H
+
+extern const u8 gInterfaceGfx_PokeBall[];
+extern const u8 gInterfacePal_PokeBall[];
+extern const u8 gInterfaceGfx_GreatBall[];
+extern const u8 gInterfacePal_GreatBall[];
+extern const u8 gInterfaceGfx_SafariBall[];
+extern const u8 gInterfacePal_SafariBall[];
+extern const u8 gInterfaceGfx_UltraBall[];
+extern const u8 gInterfacePal_UltraBall[];
+extern const u8 gInterfaceGfx_MasterBall[];
+extern const u8 gInterfacePal_MasterBall[];
+extern const u8 gInterfaceGfx_NetBall[];
+extern const u8 gInterfacePal_NetBall[];
+extern const u8 gInterfaceGfx_DiveBall[];
+extern const u8 gInterfacePal_DiveBall[];
+extern const u8 gInterfaceGfx_NestBall[];
+extern const u8 gInterfacePal_NestBall[];
+extern const u8 gInterfaceGfx_RepeatBall[];
+extern const u8 gInterfacePal_RepeatBall[];
+extern const u8 gInterfaceGfx_TimerBall[];
+extern const u8 gInterfacePal_TimerBall[];
+extern const u8 gInterfaceGfx_LuxuryBall[];
+extern const u8 gInterfacePal_LuxuryBall[];
+extern const u8 gInterfaceGfx_PremierBall[];
+extern const u8 gInterfacePal_PremierBall[];
+extern const u8 gOpenPokeballGfx[];
+
+extern const u8 gItemIcon_QuestionMark[];
+extern const u8 gItemIconPalette_QuestionMark[];
+extern const u8 gUnknown_08DB7AA0[];
+extern const u8 gUnknown_08DB7B34[];
+extern const u8 gUnknown_08DB7B5C[];
+extern const u8 gUnknown_08DB7BEC[];
+extern const u8 gUnknown_08DB7C08[];
+extern const u8 gUnknown_08DB7CE8[];
+extern const u8 gUnknown_08DB7D08[];
+extern const u8 gUnknown_08DB7DCC[];
+extern const u8 gUnknown_08DB7DF4[];
+extern const u8 gUnknown_08DB7EA0[];
+extern const u8 gUnknown_08DB7EC4[];
+extern const u8 gUnknown_08DB7F60[];
+extern const u8 gUnknown_08DB7F7C[];
+extern const u8 gUnknown_08DB8070[];
+extern const u8 gUnknown_08DB808C[];
+extern const u8 gUnknown_08DB8138[];
+extern const u8 gUnknown_08DB8160[];
+extern const u8 gUnknown_08DB8218[];
+extern const u8 gUnknown_08DB823C[];
+extern const u8 gUnknown_08DB8300[];
+extern const u8 gUnknown_08DB8328[];
+extern const u8 gUnknown_08DB8430[];
+extern const u8 gUnknown_08DB8458[];
+extern const u8 gUnknown_08DB8528[];
+extern const u8 gUnknown_08DB854C[];
+extern const u8 gUnknown_08DB862C[];
+extern const u8 gUnknown_08DB8654[];
+extern const u8 gUnknown_08DB86C4[];
+extern const u8 gUnknown_08DB86E0[];
+extern const u8 gUnknown_08DB8750[];
+extern const u8 gUnknown_08DB876C[];
+extern const u8 gUnknown_08DB87DC[];
+extern const u8 gUnknown_08DB87F8[];
+extern const u8 gUnknown_08DB88D8[];
+extern const u8 gUnknown_08DB8900[];
+extern const u8 gUnknown_08DB89E0[];
+extern const u8 gUnknown_08DB8A08[];
+extern const u8 gUnknown_08DB8A68[];
+extern const u8 gUnknown_08DB8A84[];
+extern const u8 gUnknown_08DB8B40[];
+extern const u8 gUnknown_08DB8B68[];
+extern const u8 gUnknown_08DB8C40[];
+extern const u8 gUnknown_08DB8C5C[];
+extern const u8 gUnknown_08DB8CF4[];
+extern const u8 gUnknown_08DB8D18[];
+extern const u8 gUnknown_08DB8DB0[];
+extern const u8 gUnknown_08DB8DD4[];
+extern const u8 gUnknown_08DB8E80[];
+extern const u8 gUnknown_08DB8EA0[];
+extern const u8 gUnknown_08DB8F58[];
+extern const u8 gUnknown_08DB8F7C[];
+extern const u8 gUnknown_08DB9038[];
+extern const u8 gUnknown_08DB9058[];
+extern const u8 gUnknown_08DB9130[];
+extern const u8 gUnknown_08DB9154[];
+extern const u8 gUnknown_08DB9218[];
+extern const u8 gUnknown_08DB9234[];
+extern const u8 gUnknown_08DB92FC[];
+extern const u8 gUnknown_08DB931C[];
+extern const u8 gUnknown_08DB93E8[];
+extern const u8 gUnknown_08DB940C[];
+extern const u8 gUnknown_08DB94CC[];
+extern const u8 gUnknown_08DB94E8[];
+extern const u8 gUnknown_08DB95AC[];
+extern const u8 gUnknown_08DB95D0[];
+extern const u8 gUnknown_08DB96C4[];
+extern const u8 gUnknown_08DB96EC[];
+extern const u8 gUnknown_08DB97F4[];
+extern const u8 gUnknown_08DB981C[];
+extern const u8 gUnknown_08DB9908[];
+extern const u8 gUnknown_08DB9930[];
+extern const u8 gUnknown_08DB9A54[];
+extern const u8 gUnknown_08DB9A7C[];
+extern const u8 gUnknown_08DB9B7C[];
+extern const u8 gUnknown_08DB9BA4[];
+extern const u8 gUnknown_08DB9CB0[];
+extern const u8 gUnknown_08DB9CD8[];
+extern const u8 gUnknown_08DB9DAC[];
+extern const u8 gUnknown_08DB9DD4[];
+extern const u8 gUnknown_08DB9EE4[];
+extern const u8 gUnknown_08DB9F08[];
+extern const u8 gUnknown_08DB9FFC[];
+extern const u8 gUnknown_08DBA020[];
+extern const u8 gUnknown_08DBA12C[];
+extern const u8 gUnknown_08DCC05C[];
+extern const u16 gUnknown_08DCC01C[];
+extern const u16 gUnknown_08DCC03C[];
+extern const u8 gUnknown_08DCC648[];
+extern const u8 gUnknown_08DCC908[];
+extern const u8 gUnknown_08DD87C0[];
+extern const u8 gUnknown_08DD8EE0[];
+extern const u16 gUnknown_08DD8780[];
+extern const u8 gUnknown_08DD90E0[];
+extern const u8 gUnknown_08DD9718[];
+extern const u16 gUnknown_08DD9080[];
+extern const u8 gUnknown_08DD98B4[];
+extern const u8 gUnknown_08DD9E58[];
+extern const u16 gUnknown_08DD9874[];
+extern const u8 gUnknown_08DDA02C[];
+extern const u8 gUnknown_08DDA63C[];
+extern const u16 gUnknown_08DD9FEC[];
+extern const u8 gUnknown_08DDA840[];
+extern const u8 gUnknown_08DDAE40[];
+extern const u16 gUnknown_08DDA800[];
+extern const u8 gUnknown_08DDB020[];
+extern const u8 gUnknown_08DDB2C4[];
+extern const u16 gUnknown_08DDAFE0[];
+
+#endif //GUARD_GRAPHICS_H
diff --git a/include/hall_of_fame.h b/include/hall_of_fame.h
new file mode 100644
index 000000000..d35ecf268
--- /dev/null
+++ b/include/hall_of_fame.h
@@ -0,0 +1,9 @@
+#ifndef GUARD_HALL_OF_FAME_H
+#define GUARD_HALL_OF_FAME_H
+
+void CB2_DoHallOfFameScreen(void);
+void CB2_DoHallOfFameScreenDontSaveData(void);
+void CB2_DoHallOfFamePC(void);
+void sub_8175280(void);
+
+#endif // GUARD_HALL_OF_FAME_H
diff --git a/include/heal_location.h b/include/heal_location.h
new file mode 100644
index 000000000..1f966f1ae
--- /dev/null
+++ b/include/heal_location.h
@@ -0,0 +1,25 @@
+#ifndef GUARD_HEAL_LOCATION_H
+#define GUARD_HEAL_LOCATION_H
+
+// Exported type declarations
+
+struct UnkStruct_0859F534 {
+ const union AffineAnimCmd *const *const affineAnims;
+ void (* callback)(struct Sprite *sprite);
+};
+
+struct HealLocation
+{
+ s8 group;
+ s8 map;
+ u16 x;
+ u16 y;
+};
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+
+const struct HealLocation *GetHealLocationPointer(u32 loc);
+
+#endif //GUARD_HEAL_LOCATION_H
diff --git a/include/international_string_util.h b/include/international_string_util.h
new file mode 100644
index 000000000..e7876162e
--- /dev/null
+++ b/include/international_string_util.h
@@ -0,0 +1,23 @@
+#ifndef GUARD_INTERNATIONAL_STRING_UTIL_H
+#define GUARD_INTERNATIONAL_STRING_UTIL_H
+
+#include "menu.h"
+
+void sub_81DB52C(const u8 *src);
+void TVShowConvertInternationalString(u8 *dest, const u8 *src, u8 language);
+s32 GetStringCenterAlignXOffset(s32 fontId, const u8 *str, s32 totalWidth);
+s32 GetStringRightAlignXOffset(s32 fontId, const u8 *str, s32 totalWidth);
+s32 GetStringCenterAlignXOffsetWithLetterSpacing(s32 fontId, const u8 *str, s32 totalWidth, s32 letterSpacing);
+s32 GetStringWidthDifference(s32 fontId, const u8 *str, s32 totalWidth, s32 letterSpacing);
+s32 GetMaxWidthInMenuTable(const struct MenuAction *str, s32 arg1);
+s32 sub_81DB3D8(const struct MenuAction *str, u8* arg1, s32 arg2);
+// sub_81DB41C
+// CopyMonCategoryText
+// sub_81DB494
+// sub_81DB4DC
+// sub_81DB554
+// sub_81DB5AC
+u32 sub_81DB604(const u8 *);
+// sub_81DB620
+
+#endif // GUARD_INTERNATIONAL_STRING_UTIL_H
diff --git a/include/item.h b/include/item.h
new file mode 100644
index 000000000..a136f03ec
--- /dev/null
+++ b/include/item.h
@@ -0,0 +1,64 @@
+#ifndef ITEM_H
+#define ITEM_H
+
+typedef void (*ItemUseFunc)(u8);
+
+struct Item
+{
+ u8 name[14];
+ u16 itemId;
+ u16 price;
+ u8 holdEffect;
+ u8 holdEffectParam;
+ const u8 *description;
+ u8 importance;
+ u8 unk19;
+ u8 pocket;
+ u8 type;
+ ItemUseFunc fieldUseFunc;
+ u8 battleUsage;
+ ItemUseFunc battleUseFunc;
+ u8 secondaryId;
+};
+
+struct BagPocket
+{
+ struct ItemSlot *itemSlots;
+ u8 capacity;
+};
+
+extern struct BagPocket gBagPockets[];
+
+void GetBerryCountString(u8* dst, const u8* berryName, u32 quantity);
+void CopyItemName(u16 itemId, u8 *string);
+void CopyItemNameHandlePlural(u16 itemId, u8 *string, u32 quantity);
+bool8 IsBagPocketNonEmpty(u8 pocket);
+bool8 CheckBagHasItem(u16 itemId, u16 count);
+bool8 CheckBagHasSpace(u16 itemId, u16 count);
+bool8 AddBagItem(u16 itemId, u16 count);
+bool8 RemoveBagItem(u16 itemId, u16 count);
+u8 GetPocketByItemId(u16 itemId);
+void ClearItemSlots(struct ItemSlot *itemSlots, u8 b);
+u8 CountUsedPCItemSlots(void);
+bool8 CheckPCHasItem(u16 itemId, u16 count);
+bool8 AddPCItem(u16 itemId, u16 count);
+void RemovePCItem(u8 index, u16 count);
+void SwapRegisteredBike(void);
+const struct Item *ItemId_GetItem(u16 itemId);
+u16 ItemId_GetId(u16 itemId);
+u16 ItemId_GetPrice(u16 itemId);
+u8 ItemId_GetHoldEffect(u16 itemId);
+u8 ItemId_GetHoldEffectParam(u16 itemId);
+const u8 *ItemId_GetDescription(u16 itemId);
+bool32 ItemId_CopyDescription(u8 *a, u32 itemId, u32 c);
+u8 ItemId_GetImportance(u16 itemId);
+u8 ItemId_GetUnknownValue(u16 itemId);
+u8 ItemId_GetPocket(u16 itemId);
+u8 ItemId_GetType(u16 itemId);
+ItemUseFunc ItemId_GetFieldFunc(u16 itemId);
+u8 ItemId_GetBattleUsage(u16 itemId);
+ItemUseFunc ItemId_GetBattleFunc(u16 itemId);
+u8 ItemId_GetSecondaryId(u16 itemId);
+u16 itemid_get_market_price(u16 itemId);
+
+#endif // ITEM_H
diff --git a/include/item_icon.h b/include/item_icon.h
new file mode 100644
index 000000000..a43b72f39
--- /dev/null
+++ b/include/item_icon.h
@@ -0,0 +1,17 @@
+//
+// Created by scott on 10/20/2017.
+//
+
+#ifndef GUARD_ITEM_ICON_H
+#define GUARD_ITEM_ICON_H
+
+extern EWRAM_DATA void *gUnknown_0203CEBC;
+extern EWRAM_DATA void *gUnknown_0203CEC0;
+
+extern const struct SpriteTemplate gUnknown_08614FF4;
+
+bool8 AllocItemIconTemporaryBuffers(void);
+void CopyItemIconPicTo4x4Buffer(void *src, void *dest);
+void FreeItemIconTemporaryBuffers(void);
+
+#endif //GUARD_ITEM_ICON_H
diff --git a/include/item_menu.h b/include/item_menu.h
new file mode 100644
index 000000000..85655e9d5
--- /dev/null
+++ b/include/item_menu.h
@@ -0,0 +1,12 @@
+#ifndef GUARD_item_menu_H
+#define GUARD_item_menu_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+void sub_81AAC50(void);
+void sub_81AAC70(void);
+
+#endif //GUARD_item_menu_H
diff --git a/include/item_menu_icons.h b/include/item_menu_icons.h
new file mode 100644
index 000000000..553e7c262
--- /dev/null
+++ b/include/item_menu_icons.h
@@ -0,0 +1,6 @@
+#ifndef GUARD_ITEM_MENU_ICONS
+#define GUARD_ITEM_MENU_ICONS
+
+u8 sub_80D511C(u8 a0, u8 a1, u8 a2, u8 a3);
+
+#endif // GUARD_ITEM_MENU_ICONS
diff --git a/include/librfu.h b/include/librfu.h
new file mode 100644
index 000000000..dbc8a41a6
--- /dev/null
+++ b/include/librfu.h
@@ -0,0 +1,108 @@
+#include "main.h"
+
+enum
+{
+ RFU_RESET = 0x10,
+ RFU_LINK_STATUS,
+ RFU_VERSION_STATUS,
+ RFU_SYSTEM_STATUS,
+ RFU_SLOT_STATUS,
+ RFU_CONFIG_STATUS,
+ RFU_GAME_CONFIG,
+ RFU_SYSTEM_CONFIG,
+ RFU_UNK18,
+ RFU_SC_START,
+ RFU_SC_POLLING,
+ RFU_SC_END,
+ RFU_SP_START,
+ RFU_SP_POLLING,
+ RFU_SP_END,
+ RFU_CP_START,
+ RFU_CP_POLLING,
+ RFU_CP_END,
+ RFU_UNK22,
+ RFU_UNK23,
+ RFU_DATA_TX,
+ RFU_DATA_TX_AND_CHANGE,
+ RFU_DATA_RX,
+ RFU_MS_CHANGE,
+ RFU_DATA_READY_AND_CHANGE,
+ RFU_DISCONNECTED_AND_CHANGE,
+ RFU_UNK2A,
+ RFU_UNK2B,
+ RFU_UNK2C,
+ RFU_UNK2D,
+ RFU_UNK2E,
+ RFU_UNK2F,
+ RFU_DISCONNECT,
+ RFU_TEST_MODE,
+ RFU_CPR_START,
+ RFU_CPR_POLLING,
+ RFU_CPR_END,
+ RFU_UNK35,
+ RFU_UNK36,
+ RFU_RESUME_RETRANSMIT_AND_CHANGE,
+ RFU_UNK38,
+ RFU_UNK39,
+ RFU_UNK3A,
+ RFU_UNK3B,
+ RFU_UNK3C,
+ RFU_STOP_MODE, //3D
+};
+
+struct RfuPacket8
+{
+ u8 data[0x74];
+};
+
+struct RfuPacket32
+{
+ u32 command;
+ u32 data[0x1C];
+};
+
+union RfuPacket
+{
+ struct RfuPacket32 rfuPacket32;
+ struct RfuPacket8 rfuPacket8;
+};
+
+struct RfuStruct
+{
+ vs32 unk_0;
+ u8 txParams;
+ u8 unk_5;
+ u8 activeCommand;
+ u8 unk_7;
+ u8 unk_8;
+ u8 unk_9;
+ u8 timerSelect;
+ u8 unk_b;
+ int timerState;
+ vu8 timerActive;
+ u8 unk_11;
+ vu16 unk_12;
+ vu8 msMode;
+ u8 unk_15;
+ u8 unk_16;
+ u8 unk_17;
+ void (*callbackM)();
+ void (*callbackS)();
+ u32 callbackID;
+ union RfuPacket *txPacket;
+ union RfuPacket *rxPacket;
+ vu8 unk_2c;
+ u8 padding[3];
+};
+
+struct RfuIntrStruct
+{
+ u8 rxPacketAlloc[0x74];
+ u8 txPacketAlloc[0x74];
+ u8 block1[0x960];
+ u8 block2[0x30];
+};
+
+extern struct RfuStruct *gRfuState;
+
+void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam);
diff --git a/include/link.h b/include/link.h
new file mode 100644
index 000000000..1f91ebfeb
--- /dev/null
+++ b/include/link.h
@@ -0,0 +1,198 @@
+#ifndef GUARD_LINK_H
+#define GUARD_LINK_H
+
+#define MAX_LINK_PLAYERS 4
+#define MAX_RFU_PLAYERS 5
+#define CMD_LENGTH 8
+#define QUEUE_CAPACITY 50
+#define BLOCK_BUFFER_SIZE 0x100
+
+#define LINK_STAT_LOCAL_ID 0x00000003
+#define LINK_STAT_PLAYER_COUNT 0x0000001C
+#define LINK_STAT_PLAYER_COUNT_SHIFT 2
+#define LINK_STAT_MASTER 0x00000020
+#define LINK_STAT_MASTER_SHIFT 5
+#define LINK_STAT_CONN_ESTABLISHED 0x00000040
+#define LINK_STAT_CONN_ESTABLISHED_SHIFT 6
+#define LINK_STAT_RECEIVED_NOTHING 0x00000100
+#define LINK_STAT_RECEIVED_NOTHING_SHIFT 8
+#define LINK_STAT_ERRORS 0x0007F000
+
+#define EXTRACT_PLAYER_COUNT(status) \
+(((status) & LINK_STAT_PLAYER_COUNT) >> LINK_STAT_PLAYER_COUNT_SHIFT)
+#define EXTRACT_MASTER(status) \
+(((status) >> LINK_STAT_MASTER_SHIFT) & 1)
+#define EXTRACT_CONN_ESTABLISHED(status) \
+(((status) >> LINK_STAT_CONN_ESTABLISHED_SHIFT) & 1)
+#define EXTRACT_RECEIVED_NOTHING(status) \
+(((status) >> LINK_STAT_RECEIVED_NOTHING_SHIFT) & 1)
+
+#define MASTER_HANDSHAKE 0x8FFF
+#define SLAVE_HANDSHAKE 0xB9A0
+
+enum
+{
+ LINK_STATE_START0,
+ LINK_STATE_START1,
+ LINK_STATE_HANDSHAKE,
+ LINK_STATE_INIT_TIMER,
+ LINK_STATE_CONN_ESTABLISHED,
+};
+
+enum
+{
+ EXCHANGE_NOT_STARTED,
+ EXCHANGE_COMPLETE,
+ EXCHANGE_TIMED_OUT,
+ EXCHANGE_IN_PROGRESS,
+};
+
+enum
+{
+ QUEUE_FULL_NONE,
+ QUEUE_FULL_SEND,
+ QUEUE_FULL_RECV,
+};
+
+enum
+{
+ LAG_NONE,
+ LAG_MASTER,
+ LAG_SLAVE,
+};
+
+struct LinkPlayer
+{
+ /* 0x00 */ u16 version;
+ /* 0x02 */ u16 lp_field_2;
+ /* 0x04 */ u32 trainerId;
+ /* 0x08 */ u8 name[11];
+ /* 0x13 */ u8 gender;
+ /* 0x14 */ u32 linkType;
+ /* 0x18 */ u16 lp_field_18; // battle bank in battles
+ /* 0x1A */ u16 language;
+};
+
+struct LinkPlayerBlock
+{
+ u8 magic1[16];
+ struct LinkPlayer linkPlayer;
+ u8 magic2[16];
+};
+
+// circular queues
+
+struct SendQueue
+{
+ u16 data[CMD_LENGTH][QUEUE_CAPACITY];
+ u8 pos;
+ u8 count;
+};
+
+struct RecvQueue
+{
+ u16 data[MAX_LINK_PLAYERS][CMD_LENGTH][QUEUE_CAPACITY];
+ u8 pos;
+ u8 count;
+};
+
+struct Link
+{
+ u8 isMaster; // 0: slave, 8: master
+ u8 state;
+ u8 localId; // local multi-player ID
+ u8 playerCount;
+ u16 tempRecvBuffer[4];
+ bool8 receivedNothing;
+ s8 serialIntrCounter;
+ bool8 handshakeAsMaster;
+ u8 link_field_F;
+
+ // error conditions
+ bool8 hardwareError; // hardware reported an error
+ bool8 badChecksum; // checksum didn't match between devices
+ u8 queueFull; // send or recv queue out of space
+ u8 lag; // connection is lagging
+
+ u16 checksum;
+
+ u8 sendCmdIndex;
+ u8 recvCmdIndex;
+
+ struct SendQueue sendQueue;
+ struct RecvQueue recvQueue;
+};
+
+struct BlockRequest
+{
+ void * address;
+ u32 size;
+};
+
+extern const struct BlockRequest sBlockRequestLookupTable[5];
+
+extern struct Link gLink;
+extern u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH];
+extern u8 gBlockSendBuffer[BLOCK_BUFFER_SIZE];
+extern u16 gLinkType;
+extern u32 gLinkStatus;
+extern u16 gBlockRecvBuffer[MAX_LINK_PLAYERS][BLOCK_BUFFER_SIZE / 2];
+extern u16 gSendCmd[CMD_LENGTH];
+extern u8 gShouldAdvanceLinkState;
+extern struct LinkPlayer gLinkPlayers[];
+extern u16 word_3002910[];
+extern bool8 gReceivedRemoteLinkPlayers;
+extern bool8 gLinkVSyncDisabled;
+
+void Task_DestroySelf(u8);
+void OpenLink(void);
+void CloseLink(void);
+u16 LinkMain2(u16 *);
+void sub_8007B14(void);
+bool32 sub_8007B24(void);
+void ClearLinkCallback(void);
+void ClearLinkCallback_2(void);
+u8 GetLinkPlayerCount(void);
+void OpenLinkTimed(void);
+u8 GetLinkPlayerDataExchangeStatusTimed(void);
+bool8 IsLinkPlayerDataExchangeComplete(void);
+u32 GetLinkPlayerTrainerId(u8);
+void ResetLinkPlayers(void);
+void sub_8007E24(void);
+void sub_8007E4C(void);
+u8 GetMultiplayerId(void);
+u8 bitmask_all_link_players_but_self(void);
+bool8 SendBlock(u8, void *, u16);
+u8 GetBlockReceivedStatus(void);
+void ResetBlockReceivedFlags(void);
+void ResetBlockReceivedFlag(u8);
+void SetLinkDebugValues(u32, u32);
+u8 GetLinkPlayerCount_2(void);
+bool8 IsLinkMaster(void);
+void CB2_LinkError(void);
+u8 GetSioMultiSI(void);
+bool8 IsLinkConnectionEstablished(void);
+void SetSuppressLinkErrorMessage(bool8);
+bool8 HasLinkErrorOccurred(void);
+void ResetSerial(void);
+u32 LinkMain1(u8 *, u16 *, u16[CMD_LENGTH][MAX_LINK_PLAYERS]);
+void RFUVSync(void);
+void Timer3Intr(void);
+void SerialCB(void);
+u8 GetLinkPlayerCount(void);
+bool32 InUnionRoom(void);
+
+void sub_800E0E8(void);
+bool8 sub_800A520(void);
+bool8 sub_8010500(void);
+void sub_800DFB4(u8, u8);
+void sub_800ADF8(void);
+void sub_800B488(void);
+void sub_8009734(void);
+void sub_800A620(void);
+void sub_8011BD0(void);
+u8 sub_800ABAC(void);
+u8 sub_800ABBC(void);
+void sub_800AC34(void);
+
+#endif // GUARD_LINK_H
diff --git a/include/list_menu.h b/include/list_menu.h
new file mode 100644
index 000000000..0249b06af
--- /dev/null
+++ b/include/list_menu.h
@@ -0,0 +1,56 @@
+#ifndef GUARD_LIST_MENU_H
+#define GUARD_LIST_MENU_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+struct ListMenuItem
+{
+ const u8 *unk_00;
+ s32 unk_04;
+};
+
+struct ListMenu;
+
+struct ListMenuTemplate
+{
+ const struct ListMenuItem *items;
+ void (* unk_04)(u32, bool8, struct ListMenu *);
+ void (* unk_08)(u8, s32, u8);
+ u16 totalItems;
+ u16 maxShowed;
+ u8 unk_10;
+ u8 unk_11;
+ u8 unk_12;
+ u8 cursor_Y;
+ u32 upText_Y:4; // x1, x2, x4, x8 = xF
+ u32 cursorColor:4; // x10, x20, x40, x80 = xF0
+ u32 fillColor:4; // x100, x200, x400, x800 = xF00
+ u32 cursorShadowColor:4; // x1000, x2000, x4000, x8000 = xF000
+ u32 unk_16_0:1; // x10000
+ u32 spaceBetweenItems:6; // x20000, x40000, x80000, x100000, x200000, x400000 = x7E0000
+ u32 unk_16_7:1; // x800000
+ u32 unk_17_0:6; // x1000000, x2000000, x4000000, x8000000, x10000000, x20000000 = x3F000000
+};
+
+struct ListMenu {
+ struct ListMenuTemplate _template;
+ u16 scrollOffset;
+ u16 selectedRow;
+ u8 unk_1C;
+ u8 unk_1D;
+ u8 unk_1E;
+ u8 unk_1F;
+};
+
+extern struct ListMenuTemplate gUnknown_03006310;
+
+// Exported ROM declarations
+
+u8 ListMenuInit(struct ListMenuTemplate *template, u16 a1, u16 a2);
+s32 ListMenuHandleInput(u8 id);
+void get_coro_args_x18_x1A(u8 a0, u16 *a1, u16 *a2);
+void sub_81AE6C8(u8 a0, u16 *a1, u16 *a2);
+
+#endif //GUARD_LIST_MENU_H
diff --git a/include/load_save.h b/include/load_save.h
new file mode 100644
index 000000000..1f406bbad
--- /dev/null
+++ b/include/load_save.h
@@ -0,0 +1,24 @@
+#ifndef GUARD_LOAD_SAVE_H
+#define GUARD_LOAD_SAVE_H
+
+extern bool32 gFlashMemoryPresent;
+
+void ClearSav2(void);
+void ClearSav1(void);
+void CheckForFlashMemory(void);
+void MoveSaveBlocks_ResetHeap(void);
+bool32 GetSecretBase2Field_9(void);
+void ClearSecretBase2Field_9(void);
+void SetSecretBase2Field_9(void);
+void SetSecretBase2Field_9_AndHideBG(void);
+void ClearSecretBase2Field_9_2(void);
+void SavePlayerParty(void);
+void LoadPlayerParty(void);
+void SaveSerializedGame(void);
+void LoadSerializedGame(void);
+void LoadPlayerBag(void);
+void SavePlayerBag(void);
+void SetSaveBlocksPointers(u16);
+void MoveSaveBlocks_ResetHeap(void);
+
+#endif // GUARD_LOAD_SAVE_H
diff --git a/include/m4a.h b/include/m4a.h
new file mode 100644
index 000000000..8c3380dd8
--- /dev/null
+++ b/include/m4a.h
@@ -0,0 +1,20 @@
+#ifndef GUARD_M4A_H
+#define GUARD_M4A_H
+
+#include "gba/m4a_internal.h"
+
+void m4aSoundVSync(void);
+void m4aSoundVSyncOn(void);
+
+void m4aSoundInit(void);
+void m4aSoundMain(void);
+void m4aSongNumStart(u16);
+void m4aSongNumStop(u16 n);
+void m4aMPlayAllStop(void);
+void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo);
+void m4aMPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed);
+void m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed);
+void m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed);
+void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo);
+
+#endif //GUARD_M4A_H
diff --git a/include/mail.h b/include/mail.h
new file mode 100644
index 000000000..0a70237bf
--- /dev/null
+++ b/include/mail.h
@@ -0,0 +1,23 @@
+#ifndef GUARD_MAIL_H
+#define GUARD_MAIL_H
+
+#define IS_ITEM_MAIL(itemId)((itemId == ITEM_ORANGE_MAIL \
+ || itemId == ITEM_HARBOR_MAIL \
+ || itemId == ITEM_GLITTER_MAIL \
+ || itemId == ITEM_MECH_MAIL \
+ || itemId == ITEM_WOOD_MAIL \
+ || itemId == ITEM_WAVE_MAIL \
+ || itemId == ITEM_BEAD_MAIL \
+ || itemId == ITEM_SHADOW_MAIL \
+ || itemId == ITEM_TROPIC_MAIL \
+ || itemId == ITEM_DREAM_MAIL \
+ || itemId == ITEM_FAB_MAIL \
+ || itemId == ITEM_RETRO_MAIL))
+
+
+bool8 MonHasMail(struct Pokemon *mon);
+void TakeMailFromMon(struct Pokemon *mon);
+u8 GiveMailToMon2(struct Pokemon *mon, struct MailStruct *mail);
+void ClearMailStruct(struct MailStruct *mail);
+
+#endif // GUARD_MAIL_H
diff --git a/include/mail_data.h b/include/mail_data.h
new file mode 100644
index 000000000..bf6540bad
--- /dev/null
+++ b/include/mail_data.h
@@ -0,0 +1,12 @@
+#ifndef GUARD_MAIL_DATA_H
+#define GUARD_MAIL_DATA_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+
+u16 sub_80D45E8(u16, u16 *);
+
+#endif //GUARD_MAIL_DATA_H
diff --git a/include/main.h b/include/main.h
new file mode 100644
index 000000000..82f85f881
--- /dev/null
+++ b/include/main.h
@@ -0,0 +1,64 @@
+#ifndef GUARD_MAIN_H
+#define GUARD_MAIN_H
+
+#include "global.h"
+
+typedef void (*MainCallback)(void);
+typedef void (*IntrCallback)(void);
+typedef void (*IntrFunc)(void);
+
+struct Main
+{
+ /*0x000*/ MainCallback callback1;
+ /*0x004*/ MainCallback callback2;
+
+ /*0x008*/ MainCallback savedCallback;
+
+ /*0x00C*/ IntrCallback vblankCallback;
+ /*0x010*/ IntrCallback hblankCallback;
+ /*0x014*/ IntrCallback vcountCallback;
+ /*0x018*/ IntrCallback serialCallback;
+
+ /*0x01C*/ vu16 intrCheck;
+
+ /*0x020*/ u32 *vblankCounter1;
+ /*0x024*/ u32 vblankCounter2;
+
+ /*0x028*/ u16 heldKeysRaw; // held keys without L=A remapping
+ /*0x02A*/ u16 newKeysRaw; // newly pressed keys without L=A remapping
+ /*0x02C*/ u16 heldKeys; // held keys with L=A remapping
+ /*0x02E*/ u16 newKeys; // newly pressed keys with L=A remapping
+ /*0x030*/ u16 newAndRepeatedKeys; // newly pressed keys plus key repeat
+ /*0x032*/ u16 keyRepeatCounter; // counts down to 0, triggering key repeat
+ /*0x034*/ bool16 watchedKeysPressed; // whether one of the watched keys was pressed
+ /*0x036*/ u16 watchedKeysMask; // bit mask for watched keys
+
+ /*0x038*/ struct OamData oamBuffer[128];
+
+ /*0x438*/ u8 state;
+
+ /*0x439*/ u8 oamLoadDisabled:1;
+ /*0x439*/ u8 inBattle:1;
+ /*0x439*/ u8 field_439_x4:1;
+};
+
+extern u8 gUnknown_3001764;
+extern struct Main gMain;
+extern bool8 gSoftResetDisabled;
+extern bool8 gLinkVSyncDisabled;
+
+extern const u8 gGameVersion;
+extern const u8 gGameLanguage;
+
+void AgbMain(void);
+void SetMainCallback2(MainCallback callback);
+void InitKeys(void);
+void SetVBlankCallback(IntrCallback callback);
+void SetHBlankCallback(IntrCallback callback);
+void SetVCountCallback(IntrCallback callback);
+void SetSerialCallback(IntrCallback callback);
+void InitFlashTimer(void);
+void DoSoftReset(void);
+void ClearPokemonCrySongs(void);
+
+#endif // GUARD_MAIN_H
diff --git a/include/malloc.h b/include/malloc.h
new file mode 100644
index 000000000..003ee1f03
--- /dev/null
+++ b/include/malloc.h
@@ -0,0 +1,20 @@
+#ifndef GUARD_MALLOC_H
+#define GUARD_MALLOC_H
+
+#define malloc Alloc
+#define calloc(ct, sz) AllocZeroed((ct) * (sz))
+#define free Free
+
+#define FREE_AND_SET_NULL(ptr) \
+{ \
+ free(ptr); \
+ ptr = NULL; \
+}
+
+extern u8 gHeap[];
+void *Alloc(u32 size);
+void *AllocZeroed(u32 size);
+void Free(void *pointer);
+void InitHeap(void *pointer, u32 size);
+
+#endif // GUARD_MALLOC_H
diff --git a/include/map_name_popup.h b/include/map_name_popup.h
new file mode 100644
index 000000000..8a9043a3f
--- /dev/null
+++ b/include/map_name_popup.h
@@ -0,0 +1,11 @@
+#ifndef GUARD_MAP_NAME_POPUP_H
+#define GUARD_MAP_NAME_POPUP_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+void HideMapNamePopUpWindow(void);
+
+#endif //GUARD_MAP_NAME_POPUP_H
diff --git a/include/map_obj_8097404.h b/include/map_obj_8097404.h
new file mode 100644
index 000000000..27ffd18cb
--- /dev/null
+++ b/include/map_obj_8097404.h
@@ -0,0 +1,32 @@
+//
+// Created by scott on 9/7/2017.
+//
+
+#ifndef GUARD_MAP_OBJ_8097404_H
+#define GUARD_MAP_OBJ_8097404_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+extern void *gUnknown_020375B8;
+
+// Exported ROM declarations
+void sub_8097AC8(struct Sprite *);
+void npc_sync_anim_pause_bits(struct MapObject *);
+void oamt_npc_ministep_reset(struct Sprite *, u8, u8);
+u8 sub_8097F78(struct MapObject *);
+bool8 obj_npc_ministep(struct Sprite *sprite);
+bool8 sub_80976EC(struct Sprite *sprite);
+void sub_80976DC(struct Sprite *, u8);
+void sub_809783C(struct Sprite *, u8, u8, u8);
+void DoShadowFieldEffect(struct MapObject *);
+u8 sub_809785C(struct Sprite *);
+u8 sub_80978E4(struct Sprite *);
+void obj_anim_image_set_and_seek(struct Sprite *, u8, u8);
+bool8 sub_80979BC(struct Sprite *);
+void sub_8097750(struct Sprite *);
+bool8 sub_8097758(struct Sprite *);
+void sub_8097FA4(struct MapObject *);
+void sub_8098044(u8);
+
+#endif //GUARD_MAP_OBJ_8097404_H
diff --git a/include/map_obj_lock.h b/include/map_obj_lock.h
new file mode 100644
index 000000000..a10648f2f
--- /dev/null
+++ b/include/map_obj_lock.h
@@ -0,0 +1,11 @@
+#ifndef GUARD_MAP_OBJ_LOCK_H
+#define GUARD_MAP_OBJ_LOCK_H
+
+bool8 sub_80983C4(void);
+void ScriptFreezeMapObjects(void);
+bool8 sub_809847C(void);
+void LockSelectedMapObject(void);
+void sub_8098630(void);
+bool8 sub_8098734(void);
+
+#endif // GUARD_MAP_OBJ_LOCK_H
diff --git a/include/menu.h b/include/menu.h
new file mode 100644
index 000000000..99ff35adb
--- /dev/null
+++ b/include/menu.h
@@ -0,0 +1,38 @@
+#ifndef GUARD_MENU_H
+#define GUARD_MENU_H
+
+#include "text.h"
+#include "window.h"
+
+struct MenuAction
+{
+ const u8 *text;
+ union {
+ void (*void_u8)(u8);
+ u8 (*u8_void)(void);
+ } func;
+};
+
+void box_print(u8, u8, u8, u8, const void *, s8, const u8 *);
+void sub_8198070(u8 windowId, bool8 copyToVram);
+void SetWindowTemplateFields(struct WindowTemplate* template, u8 priority, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 palNum, u16 baseBlock);
+void SetWindowBorderStyle(u8 windowId, bool8 copyToVram, u16 tileStart, u8 palette);
+void schedule_bg_copy_tilemap_to_vram(u8 bgNum);
+void PrintMenuTable(u8 idx, u8 nstrs, const struct MenuAction *strs);
+void InitMenuInUpperLeftCornerPlaySoundWhenAPressed(u8 idx, u8 nstrs,u8);
+u8 GetMenuCursorPos(void);
+s8 ProcessMenuInput(void);
+s8 ProcessMenuInputNoWrapAround(void);
+void blit_move_info_icon(u8 winId, u8 a2, u16 x, u16 y);
+void reset_temp_tile_data_buffers(void);
+int decompress_and_copy_tile_data_to_vram(u8 bg_id, const void *src, int size, u16 offset, u8 mode);
+bool8 free_temp_tile_data_buffers_if_possible(void);
+u64 sub_8198A50(struct WindowTemplate*, u8, u8, u8, u8, u8, u8, u16); // returns something but it isn't used, fix when menu.s is decomp'd
+void CreateYesNoMenu(const struct WindowTemplate *windowTemplate, u16 borderFirstTileNum, u8 borderPalette, u8 initialCursorPos);
+s8 ProcessMenuInputNoWrap_(void);
+void do_scheduled_bg_tilemap_copies_to_vram(void);
+void clear_scheduled_bg_copies_to_vram(void);
+void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor *color, s8 speed, const u8 *str);
+void sub_8197B1C(u8 windowId, bool8 copyToVram, u16 a2, u16 a3);
+
+#endif // GUARD_MENU_H
diff --git a/include/menu_helpers.h b/include/menu_helpers.h
new file mode 100644
index 000000000..f083a10e2
--- /dev/null
+++ b/include/menu_helpers.h
@@ -0,0 +1,20 @@
+#ifndef GUARD_MENU_HELPERS_H
+#define GUARD_MENU_HELPERS_H
+
+// Exported type declarations
+
+struct YesNoFuncTable {
+ TaskFunc yesFunc;
+ TaskFunc noFunc;
+};
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+
+void sub_812225C(u16 *, u16 *, u8, u8);
+void sub_8122298(u16 *, u16 *, u8, u8, u8);
+void sub_8121F68(u8 taskId, const struct YesNoFuncTable *data);
+bool8 sub_81221AC(void);
+
+#endif //GUARD_MENU_HELPERS_H
diff --git a/include/menu_indicators.h b/include/menu_indicators.h
new file mode 100644
index 000000000..d0baac810
--- /dev/null
+++ b/include/menu_indicators.h
@@ -0,0 +1,12 @@
+#ifndef GUARD_MENU_INDICATORS_H
+#define GUARD_MENU_INDICATORS_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+u8 AddScrollIndicatorArrowPairParametrized(u8, u8, u8, u8, s32, u16, u16, u16 *);
+void RemoveScrollIndicatorArrowPair(u8);
+
+#endif //GUARD_MENU_INDICATORS_H
diff --git a/include/metatile_behavior.h b/include/metatile_behavior.h
new file mode 100644
index 000000000..d6743b788
--- /dev/null
+++ b/include/metatile_behavior.h
@@ -0,0 +1,149 @@
+#ifndef GUARD_METATILE_BEHAVIOR
+#define GUARD_METATILE_BEHAVIOR
+
+bool8 ShouldDoJumpLandingDustEffect(u8);
+bool8 MetatileBehavior_IsEncounterTile(u8);
+bool8 MetatileBehavior_IsJumpEast(u8);
+bool8 MetatileBehavior_IsJumpWest(u8);
+bool8 MetatileBehavior_IsJumpNorth(u8);
+bool8 MetatileBehavior_IsJumpSouth(u8);
+bool8 MetatileBehavior_IsPokeGrass(u8);
+bool8 MetatileBehavior_IsSandOrDeepSand(u8);
+bool8 MetatileBehavior_IsDeepSand(u8);
+bool8 MetatileBehavior_IsReflective(u8);
+bool8 MetatileBehavior_IsIce(u8);
+bool8 MetatileBehavior_IsWarpDoor(u8);
+bool8 MetatileBehavior_IsDoor(u8);
+bool8 MetatileBehavior_IsEscalator(u8);
+bool8 MetatileBehavior_IsMB_04(u8);
+bool8 MetatileBehavior_IsLadder(u8);
+bool8 MetatileBehavior_IsNonAnimDoor(u8);
+bool8 MetatileBehavior_IsDeepSouthWarp(u8);
+bool8 MetatileBehavior_IsSurfableWaterOrUnderwater(u8);
+bool8 MetatileBehavior_IsEastArrowWarp(u8);
+bool8 MetatileBehavior_IsWestArrowWarp(u8);
+bool8 MetatileBehavior_IsNorthArrowWarp(u8);
+bool8 MetatileBehavior_IsSouthArrowWarp(u8);
+bool8 MetatileBehavior_IsArrowWarp(u8);
+bool8 MetatileBehavior_IsMoveTile(u8);
+bool8 MetatileBehavior_IsIce_2(u8);
+bool8 MetatileBehavior_IsTrickHouseSlipperyFloor(u8);
+bool8 MetatileBehavior_IsMB_05(u8);
+bool8 MetatileBehavior_IsWalkNorth(u8);
+bool8 MetatileBehavior_IsWalkSouth(u8);
+bool8 MetatileBehavior_IsWalkWest(u8);
+bool8 MetatileBehavior_IsWalkEast(u8);
+bool8 MetatileBehavior_IsNorthwardCurrent(u8);
+bool8 MetatileBehavior_IsSouthwardCurrent(u8);
+bool8 MetatileBehavior_IsWestwardCurrent(u8);
+bool8 MetatileBehavior_IsEastwardCurrent(u8);
+bool8 MetatileBehavior_IsSlideNorth(u8);
+bool8 MetatileBehavior_IsSlideSouth(u8);
+bool8 MetatileBehavior_IsSlideWest(u8);
+bool8 MetatileBehavior_IsSlideEast(u8);
+bool8 MetatileBehavior_IsCounter(u8);
+bool8 MetatileBehavior_IsPlayerFacingTVScreen(u8 tile, u8 playerDir);
+bool8 MetatileBehavior_IsPC(u8);
+bool8 MetatileBehavior_IsCableBoxResults1(u8);
+bool8 MetatileBehavior_IsSecretBaseOpen(u8);
+bool8 MetatileBehavior_IsSecretBaseCave(u8);
+bool8 MetatileBehavior_IsSecretBaseTree(u8);
+bool8 MetatileBehavior_IsSecretBaseShrub(u8);
+bool8 MetatileBehavior_IsSecretBasePC(u8);
+bool8 MetatileBehavior_IsSecretBaseRegisterPC(u8);
+bool8 MetatileBehavior_IsMB_B2(u8);
+bool8 MetatileBehavior_IsMB_B3(u8);
+bool8 MetatileBehavior_IsMB_B9(u8);
+bool8 MetatileBehavior_IsMB_C6(u8);
+bool8 MetatileBehavior_IsSecretBasePoster(u8);
+bool8 MetatileBehavior_IsNormal(u8);
+bool8 MetatileBehavior_IsMB_B7(u8);
+bool8 MetatileBehavior_IsMB_B2_Duplicate(u8);
+bool8 MetatileBehavior_IsMB_B5(u8);
+bool8 MetatileBehavior_IsMB_C3(u8);
+bool8 MetatileBehavior_IsMB_C2(u8);
+bool8 MetatileBehavior_IsSecretBaseBalloon(u8);
+bool8 MetatileBehavior_IsMB_BE(u8);
+bool8 MetatileBehavior_IsSecretBaseSoundMat(u8);
+bool8 MetatileBehavior_IsSecretBaseGlitterMat(u8);
+bool8 MetatileBehavior_IsMB_BF(u8);
+bool8 MetatileBehavior_IsSecretBaseTvOrShield(u8);
+bool8 MetatileBehavior_IsMB_C5(u8);
+bool8 MetatileBehavior_HasRipples(u8);
+bool8 MetatileBehavior_IsPuddle(u8);
+bool8 MetatileBehavior_IsTallGrass(u8);
+bool8 MetatileBehavior_IsLongGrass(u8);
+bool8 MetatileBehavior_IsBerryTreeSoil(u8);
+bool8 MetatileBehavior_IsAsh(u8);
+bool8 MetatileBehavior_IsUnusedFootprintMetatile(u8);
+bool8 MetatileBehavior_IsBridge(u8);
+u8 MetatileBehavior_GetBridgeSth(u8);
+u8 MetatileBehavior_8089510(u8);
+bool8 MetatileBehavior_IsLandWildEncounter(u8);
+bool8 MetatileBehavior_IsWaterWildEncounter(u8);
+bool8 MetatileBehavior_IsMB_0B(u8);
+bool8 MetatileBehavior_IsMountain(u8);
+bool8 MetatileBehavior_IsDiveable(u8);
+bool8 MetatileBehavior_IsUnableToEmerge(u8);
+bool8 MetatileBehavior_IsShallowFlowingWater(u8);
+bool8 MetatileBehavior_IsThinIce(u8);
+bool8 MetatileBehavior_IsCrackedIce(u8);
+bool8 MetatileBehavior_IsDeepOrOceanWater(u8);
+bool8 MetatileBehavior_IsMB_18_OrMB_1A(u8);
+bool8 MetatileBehavior_IsSurfableAndNotWaterfall(u8);
+bool8 MetatileBehavior_IsEastBlocked(u8);
+bool8 MetatileBehavior_IsWestBlocked(u8);
+bool8 MetatileBehavior_IsNorthBlocked(u8);
+bool8 MetatileBehavior_IsSouthBlocked(u8);
+bool8 MetatileBehavior_IsShortGrass(u8);
+bool8 MetatileBehavior_IsHotSprings(u8);
+bool8 MetatileBehavior_IsWaterfall(u8);
+bool8 MetatileBehavior_IsFortreeBridge(u8);
+bool8 MetatileBehavior_IsPacifilogVerticalLog1(u8);
+bool8 MetatileBehavior_IsPacifilogVerticalLog2(u8);
+bool8 MetatileBehavior_IsPacifilogHorizontalLog1(u8);
+bool8 MetatileBehavior_IsPacifilogHorizontalLog2(u8);
+bool8 MetatileBehavior_IsPacifidlogLog(u8);
+bool8 MetatileBehavior_IsTrickHousePuzzleDoor(u8);
+bool8 MetatileBehavior_IsRegionMap(u8);
+bool8 MetatileBehavior_IsClosedSootopolisGymDoor(u8);
+bool8 MetatileBehavior_IsUnknownClosedDoor(u8);
+bool8 MetatileBehavior_IsRoulette(u8);
+bool8 MetatileBehavior_IsPokeblockFeeder(u8);
+bool8 MetatileBehavior_IsSecretBaseJumpMat(u8);
+bool8 MetatileBehavior_IsSecretBaseSpinMat(u8);
+bool8 MetatileBehavior_IsLavaridgeB1FWarp(u8);
+bool8 MetatileBehavior_IsLavaridgeB1FWarp(u8);
+bool8 MetatileBehavior_IsAquaHideoutWarp(u8);
+bool8 MetatileBehavior_IsWarpOrBridge(u8);
+bool8 MetatileBehavior_IsMossdeepGymWarp(u8);
+bool8 MetatileBehavior_IsSurfableFishableWater(u8);
+bool8 MetatileBehavior_IsMtPyreHole(u8);
+bool8 MetatileBehavior_IsCrackedFloorHole(u8);
+bool8 MetatileBehavior_IsCrackedFloor(u8);
+bool8 MetatileBehavior_IsMuddySlope(u8);
+bool8 MetatileBehavior_IsBumpySlope(u8);
+bool8 MetatileBehavior_IsIsolatedVerticalRail(u8);
+bool8 MetatileBehavior_IsIsolatedHorizontalRail(u8);
+bool8 MetatileBehavior_IsVerticalRail(u8);
+bool8 MetatileBehavior_IsHorizontalRail(u8);
+bool8 MetatileBehavior_IsSeaweed(u8);
+bool8 MetatileBehavior_IsRunningDisallowed(u8);
+bool8 MetatileBehavior_IsCuttableGrass(u8);
+bool8 MetatileBehavior_IsRunningShoesInstruction(u8);
+bool8 MetatileBehavior_IsPictureBookShelf(u8);
+bool8 MetatileBehavior_IsBookShelf(u8);
+bool8 MetatileBehavior_IsPokeCenterBookShelf(u8);
+bool8 MetatileBehavior_IsVase(u8);
+bool8 MetatileBehavior_IsTrashCan(u8);
+bool8 MetatileBehavior_IsShopShelf(u8);
+bool8 MetatileBehavior_IsBlueprint(u8);
+bool8 MetatileBehavior_IsBattlePyramidWarp(u8);
+bool8 MetatileBehavior_IsPlayerFacingWirelessBoxResults(u8 tile, u8 playerDir);
+bool8 MetatileBehavior_IsCableBoxResults2(u8 tile, u8 playerDir);
+bool8 MetatileBehavior_IsQuestionnaire(u8);
+bool8 MetatileBehavior_IsLongGrass_Duplicate(u8);
+bool8 MetatileBehavior_IsLongGrassSouthEdge(u8);
+bool8 MetatileBehavior_IsTrainerHillTimer(u8);
+
+#endif // GUARD_METATILE_BEHAVIOR
diff --git a/include/metatile_behaviors.h b/include/metatile_behaviors.h
new file mode 100644
index 000000000..dd3a8b4f4
--- /dev/null
+++ b/include/metatile_behaviors.h
@@ -0,0 +1,179 @@
+#ifndef GUARD_METATILE_BEHAVIORS
+#define GUARD_METATILE_BEHAVIORS
+
+#define MB_NORMAL 0x00
+#define MB_TALL_GRASS 0x02
+#define MB_LONG_GRASS 0x03
+#define MB_04 0x04
+#define MB_05 0x05
+#define MB_DEEP_SAND 0x06
+#define MB_SHORT_GRASS 0x07
+#define MB_CAVE 0x08
+#define MB_LONG_GRASS_SOUTH_EDGE 0x09
+#define MB_NO_RUNNING 0x0A
+#define MB_0B 0x0B
+#define MB_MOUNTAIN_TOP 0x0C
+#define MB_BATTLE_PYRAMID_WARP 0x0D
+#define MB_MOSSDEEP_GYM_WARP 0x0E
+#define MB_MT_PYRE_HOLE 0x0F
+#define MB_POND_WATER 0x10
+#define MB_SEMI_DEEP_WATER 0x11
+#define MB_DEEP_WATER 0x12
+#define MB_WATERFALL 0x13
+#define MB_SOOTOPOLIS_DEEP_WATER 0x14
+#define MB_OCEAN_WATER 0x15
+#define MB_PUDDLE 0x16
+#define MB_SHALLOW_WATER 0x17
+#define MB_18 0x18
+#define MB_NO_SURFACING 0x19
+#define MB_1A 0x1A
+#define MB_STAIRS_OUTSIDE_ABANDONED_SHIP 0x1B
+#define MB_SHOAL_CAVE_ENTRANCE 0x1C
+#define MB_ICE 0x20
+#define MB_SAND 0x21
+#define MB_SEAWEED 0x22
+#define MB_ASHGRASS 0x24
+#define MB_25 0x25
+#define MB_THIN_ICE 0x26
+#define MB_CRACKED_ICE 0x27
+#define MB_HOT_SPRINGS 0x28
+#define MB_LAVARIDGE_GYM_B1F_WARP 0x29
+#define MB_SEAWEED_NO_SURFACING 0x2A
+#define MB_REFLECTION_UNDER_BRIDGE 0x2B
+#define MB_IMPASSABLE_EAST 0x30
+#define MB_IMPASSABLE_WEST 0x31
+#define MB_IMPASSABLE_NORTH 0x32
+#define MB_IMPASSABLE_SOUTH 0x33
+#define MB_IMPASSABLE_NORTHEAST 0x34
+#define MB_IMPASSABLE_NORTHWEST 0x35
+#define MB_IMPASSABLE_SOUTHEAST 0x36
+#define MB_IMPASSABLE_SOUTHWEST 0x37
+#define MB_JUMP_EAST 0x38
+#define MB_JUMP_WEST 0x39
+#define MB_JUMP_NORTH 0x3A
+#define MB_JUMP_SOUTH 0x3B
+#define MB_JUMP_SOUTHEAST 0x3E
+#define MB_JUMP_SOUTHWEST 0x3F
+#define MB_WALK_EAST 0x40
+#define MB_WALK_WEST 0x41
+#define MB_WALK_NORTH 0x42
+#define MB_WALK_SOUTH 0x43
+#define MB_SLIDE_EAST 0x44
+#define MB_SLIDE_WEST 0x45
+#define MB_SLIDE_NORTH 0x46
+#define MB_SLIDE_SOUTH 0x47
+#define MB_TRICK_HOUSE_PUZZLE_8_FLOOR 0x48
+#define MB_EASTWARD_CURRENT 0x50
+#define MB_WESTWARD_CURRENT 0x51
+#define MB_NORTHWARD_CURRENT 0x52
+#define MB_SOUTHWARD_CURRENT 0x53
+#define MB_NON_ANIMATED_DOOR 0x60
+#define MB_LADDER 0x61
+#define MB_EAST_ARROW_WARP 0x62
+#define MB_WEST_ARROW_WARP 0x63
+#define MB_NORTH_ARROW_WARP 0x64
+#define MB_SOUTH_ARROW_WARP 0x65
+#define MB_CRACKED_FLOOR_HOLE 0x66
+#define MB_AQUA_HIDEOUT_WARP 0x67
+#define MB_LAVARIDGE_GYM_1F_WARP 0x68
+#define MB_ANIMATED_DOOR 0x69
+#define MB_UP_ESCALATOR 0x6A
+#define MB_DOWN_ESCALATOR 0x6B
+#define MB_WATER_DOOR 0x6C
+#define MB_WATER_SOUTH_ARROW_WARP 0x6D
+#define MB_DEEP_SOUTH_WARP 0x6E
+#define MB_WARP_OR_BRIDGE 0x70
+#define MB_71 0x71
+#define MB_ROUTE120_NORTH_BRIDGE_1 0x72
+#define MB_ROUTE120_NORTH_BRIDGE_2 0x73
+#define MB_PACIFIDLOG_VERTICAL_LOG_1 0x74
+#define MB_PACIFIDLOG_VERTICAL_LOG_2 0x75
+#define MB_PACIFIDLOG_HORIZONTAL_LOG_1 0x76
+#define MB_PACIFIDLOG_HORIZONTAL_LOG_2 0x77
+#define MB_FORTREE_BRIDGE 0x78
+#define MB_ROUTE120_SOUTH_BRIDGE_1 0x7A
+#define MB_ROUTE120_SOUTH_BRIDGE_2 0x7B
+#define MB_ROUTE120_NORTH_BRIDGE_3 0x7C
+#define MB_ROUTE120_NORTH_BRIDGE_4 0x7D
+#define MB_7E 0x7E
+#define MB_ROUTE110_BRIDGE 0x7F
+#define MB_COUNTER 0x80
+#define MB_PC 0x83
+#define MB_CABLE_BOX_RESULTS_1 0x84
+#define MB_REGION_MAP 0x85
+#define MB_TELEVISION 0x86
+#define MB_POKEBLOCK_FEEDER 0x87
+#define MB_SLOT_MACHINE 0x89
+#define MB_ROULETTE 0x8A
+#define MB_CLOSED_SOOTOPOLIS_GYM_DOOR 0x8B
+#define MB_TRICK_HOUSE_PUZZLE_DOOR 0x8C
+#define MB_8D 0x8D
+#define MB_RUNNING_SHOES_INSTRUCTION 0x8E
+#define MB_QUESTIONNAIRE 0x8F
+#define MB_SECRET_BASE_SPOT_RED_CAVE 0x90
+#define MB_SECRET_BASE_SPOT_RED_CAVE_OPEN 0x91
+#define MB_SECRET_BASE_SPOT_BROWN_CAVE 0x92
+#define MB_SECRET_BASE_SPOT_BROWN_CAVE_OPEN 0x93
+#define MB_SECRET_BASE_SPOT_YELLOW_CAVE 0x94
+#define MB_SECRET_BASE_SPOT_YELLOW_CAVE_OPEN 0x95
+#define MB_SECRET_BASE_SPOT_TREE_LEFT 0x96
+#define MB_SECRET_BASE_SPOT_TREE_LEFT_OPEN 0x97
+#define MB_SECRET_BASE_SPOT_SHRUB 0x98
+#define MB_SECRET_BASE_SPOT_SHRUB_OPEN 0x99
+#define MB_SECRET_BASE_SPOT_BLUE_CAVE 0x9A
+#define MB_SECRET_BASE_SPOT_BLUE_CAVE_OPEN 0x9B
+#define MB_SECRET_BASE_SPOT_TREE_RIGHT 0x9C
+#define MB_SECRET_BASE_SPOT_TREE_RIGHT_OPEN 0x9D
+#define MB_BERRY_TREE_SOIL 0xA0
+#define MB_SECRET_BASE_PC 0xB0
+#define MB_SECRET_BASE_REGISTER_PC 0xB1
+#define MB_B2 0xB2
+#define MB_B3 0xB3
+#define MB_B4 0xB4
+#define MB_B5 0xB5
+#define MB_B6 0xB6
+#define MB_B7 0xB7
+#define MB_SECRET_BASE_BALLOON 0xB8
+#define MB_B9 0xB9
+#define MB_SECRET_BASE_GLITTER_MAT 0xBA
+#define MB_SECRET_BASE_JUMP_MAT 0xBB
+#define MB_SECRET_BASE_SPIN_MAT 0xBC
+#define MB_SECRET_BASE_SOUND_MAT 0xBD
+#define MB_BE 0xBE
+#define MB_BF 0xBF
+#define MB_BED 0xC0
+#define MB_C1 0xC1
+#define MB_C2 0xC2
+#define MB_C3 0xC3
+#define MB_SECRET_BASE_TV_SHIELD 0xC4
+#define MB_C5 0xC5
+#define MB_C6 0xC6
+#define MB_SECRET_BASE_POSTER 0xC7
+#define MB_C8 0xC8
+#define MB_C9 0xC9
+#define MB_CA 0xCA
+#define MB_CB 0xCB
+#define MB_CC 0xCC
+#define MB_CD 0xCD
+#define MB_CE 0xCE
+#define MB_CF 0xCF
+#define MB_MUDDY_SLOPE 0xD0
+#define MB_BUMPY_SLOPE 0xD1
+#define MB_CRACKED_FLOOR 0xD2
+#define MB_ISOLATED_VERTICAL_RAIL 0xD3
+#define MB_ISOLATED_HORIZONTAL_RAIL 0xD4
+#define MB_VERTICAL_RAIL 0xD5
+#define MB_HORIZONTAL_RAIL 0xD6
+#define MB_PICTURE_BOOK_SHELF 0xE0
+#define MB_BOOKSHELF 0xE1
+#define MB_POKEMON_CENTER_BOOKSHELF 0xE2
+#define MB_VASE 0xE3
+#define MB_TRASH_CAN 0xE4
+#define MB_SHOP_SHELF 0xE5
+#define MB_BLUEPRINT 0xE6
+#define MB_CABLE_BOX_RESULTS_2 0xE7
+#define MB_WIRELESS_BOX_RESULTS 0xE8
+#define MB_TRAINER_HILL_TIMER 0xE9
+#define MB_UNKNOWN_CLOSED_DOOR 0xEA
+
+#endif // GUARD_METATILE_BEHAVIORS
diff --git a/include/money.h b/include/money.h
new file mode 100644
index 000000000..5c7c1c984
--- /dev/null
+++ b/include/money.h
@@ -0,0 +1,20 @@
+#ifndef GUARD_MONEY_H
+#define GUARD_MONEY_H
+
+u32 GetMoney(u32* moneyPtr);
+void SetMoney(u32* moneyPtr, u32 newValue);
+bool8 IsEnoughMoney(u32* moneyPtr, u32 cost);
+void AddMoney(u32* moneyPtr, u32 toAdd);
+void RemoveMoney(u32* moneyPtr, u32 toSub);
+bool8 IsEnoughForCostInVar0x8005(void);
+void SubtractMoneyFromVar0x8005(void);
+void PrintMoneyAmountInMoneyBox(u8 windowId, int amount, u8 speed);
+void PrintMoneyAmount(u8 windowId, u8 x, u8 y, int amount, u8 speed);
+void PrintMoneyAmountInMoneyBoxWithBorder(u8 windowId, u16 tileStart, u8 pallete, int amount);
+void ChangeAmountInMoneyBox(int amount);
+void DrawMoneyBox(int amount, u8 x, u8 y);
+void HideMoneyBox(void);
+void AddMoneyLabelObject(u16 x, u16 y);
+void RemoveMoneyLabelObject(void);
+
+#endif // GUARD_MONEY_H
diff --git a/include/multiboot.h b/include/multiboot.h
new file mode 100644
index 000000000..d4700ff4e
--- /dev/null
+++ b/include/multiboot.h
@@ -0,0 +1,21 @@
+#ifndef GUARD_MULTIBOOT_H
+#define GUARD_MULTIBOOT_H
+
+#define MULTIBOOT_MASTER_INFO 0x62
+#define MULTIBOOT_CLIENT_INFO 0x72
+#define MULTIBOOT_MASTER_START_PROBE 0x61
+#define MULTIBOOT_MASTER_REQUEST_DLREADY 0x63
+#define MULTIBOOT_CLIENT_DLREADY 0x73
+#define MULTIBOOT_MASTER_START_DL 0x64
+#define MULTIBOOT_MASTER_REQUEST_CRC 0x65
+#define MULTIBOOT_CLIENT_CALC_CRC 0x74
+#define MULTIBOOT_CLIENT_CRCREADY 0x75
+#define MULTIBOOT_MASTER_VERIFY_CRC 0x66
+
+void MultiBootInit(struct MultiBootParam *mp);
+int MultiBootMain(struct MultiBootParam *mp);
+void MultiBootStartProbe(struct MultiBootParam *mp);
+void MultiBootStartMaster(struct MultiBootParam *mp, const u8 *srcp, int length, u8 palette_color, s8 palette_speed);
+int MultiBootCheckComplete(struct MultiBootParam *mp);
+
+#endif // GUARD_MULTIBOOT_H
diff --git a/include/mystery_event_script.h b/include/mystery_event_script.h
new file mode 100644
index 000000000..ab23a8d00
--- /dev/null
+++ b/include/mystery_event_script.h
@@ -0,0 +1,8 @@
+#ifndef GUARD_MYSTERY_EVENT_SCRIPT_H
+#define GUARD_MYSTERY_EVENT_SCRIPT_H
+
+u32 RunMysteryEventScript(u8 *);
+void SetMysteryEventScriptStatus(u32 val);
+u16 GetRecordMixingGift(void);
+
+#endif // GUARD_MYSTERY_EVENT_SCRIPT_H
diff --git a/include/naming_screen.h b/include/naming_screen.h
new file mode 100644
index 000000000..3d69b834f
--- /dev/null
+++ b/include/naming_screen.h
@@ -0,0 +1,12 @@
+#ifndef GUARD_NAMING_SCREEN_H
+#define GUARD_NAMING_SCREEN_H
+
+#define NAMING_SCREEN_PLAYER 0
+#define NAMING_SCREEN_BOX 1
+#define NAMING_SCREEN_CAUGHT_MON 2
+#define NAMING_SCREEN_3 3
+#define NAMING_SCREEN_WALDA 4
+
+void DoNamingScreen(u8 caseId, u8* dst, u16 monSpecies, u8 monGender, u32 monPersonality, void (*callback)(void));
+
+#endif // GUARD_NAMING_SCREEN_H
diff --git a/include/new_game.h b/include/new_game.h
new file mode 100644
index 000000000..2088d1826
--- /dev/null
+++ b/include/new_game.h
@@ -0,0 +1,16 @@
+#ifndef GUARD_NEW_GAME_H
+#define GUARD_NEW_GAME_H
+
+void WriteUnalignedWord(u32 var, u8 *dataPtr);
+u32 ReadUnalignedWord(u8* dataPtr);
+void CopyUnalignedWord(u8 *copyTo, u8 *copyFrom);
+void InitPlayerTrainerId(void);
+void SetDefaultOptions(void);
+void ClearPokedexFlags(void);
+void WarpToTruck(void);
+void NewGameInitData(void);
+void ResetMiniGamesResults(void);
+void sub_808447C(void);
+void Sav2_ClearSetDefault(void);
+
+#endif // GUARD_NEW_GAME_H
diff --git a/include/new_menu_helpers.h b/include/new_menu_helpers.h
new file mode 100644
index 000000000..c52184972
--- /dev/null
+++ b/include/new_menu_helpers.h
@@ -0,0 +1,18 @@
+#ifndef GUARD_NEW_MENU_HELPERS_H
+#define GUARD_NEW_MENU_HELPERS_H
+
+#include "text.h"
+#include "task.h"
+
+void sub_81973A4(void);
+void sub_81973C4(u8, u8);
+void sub_819746C(u8 windowId, bool8 copyToVram);
+void sub_81973FC(u8, u8);
+u16 AddTextPrinterParametrized(u8 windowId, u8 fontId, const u8 *str, u8 speed, void ( *callback)(u16, struct TextPrinter *), u8 fgColor, u8 bgColor, u8 shadowColor);
+void DisplayItemMessageOnField(u8 taskId, const u8 *src, TaskFunc callback);
+void sub_8197434(u8 a0, u8 a1);
+void SetStandardWindowBorderStyle(u8 a0, u8 a1);
+void sub_8197930(void);
+u8 GetPlayerTextSpeed(void);
+
+#endif // GUARD_NEW_MENU_HELPERS_H
diff --git a/include/overworld.h b/include/overworld.h
new file mode 100644
index 000000000..a5fba0c10
--- /dev/null
+++ b/include/overworld.h
@@ -0,0 +1,74 @@
+#ifndef GUARD_ROM4_H
+#define GUARD_ROM4_H
+
+#include "main.h"
+
+struct UnkPlayerStruct
+{
+ u8 player_field_0;
+ u8 player_field_1;
+};
+
+struct LinkPlayerMapObject
+{
+ u8 active;
+ u8 linkPlayerId;
+ u8 mapObjId;
+ u8 mode;
+};
+
+struct UCoords32
+{
+ u32 x, y;
+};
+
+extern struct LinkPlayerMapObject gLinkPlayerMapObjects[4];
+extern MainCallback gFieldCallback;
+
+void IncrementGameStat(u8 index);
+
+void Overworld_SetMapObjTemplateCoords(u8, s16, s16);
+void Overworld_SetMapObjTemplateMovementType(u8, u8);
+
+void Overworld_SetWarpDestination(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y);
+
+void saved_warp2_set(int unused, s8 mapGroup, s8 mapNum, s8 warpId);
+void saved_warp2_set_2(int unused, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y);
+void Overworld_SetHealLocationWarp(u8);
+void sub_8084DD4(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y);
+void sub_8084E2C(s8, s8, s8, s8, s8);
+void sub_8084E80(s8, s8, s8, s8, s8);
+void sub_8084EBC(s16, s16);
+
+void player_avatar_init_params_reset(void);
+
+void Overworld_SetFlashLevel(s32 a1);
+//u8 Overworld_GetFlashLevel(void);
+void sub_8085524(u16);
+
+void Overworld_SetSavedMusic(u16);
+void Overworld_ChangeMusicToDefault(void);
+void Overworld_ChangeMusicTo(u16);
+
+bool32 is_c1_link_related_active(void);
+
+void strange_npc_table_clear(void);
+const struct MapHeader *get_mapheader_by_bank_and_number(u16, u16);
+void FieldObjectMoveDestCoords(struct MapObject *, u32, s16 *, s16 *);
+void sub_8086230(void);
+void c2_exit_to_overworld_2_switch(void);
+bool32 sub_8087598(void);
+void c2_exit_to_overworld_1_continue_scripts_restart_music(void);
+void warp_in(void);
+u8 get_map_light_level_by_bank_and_number(s8 mapGroup, s8 mapNum);
+void sub_8086194(void);
+void sub_8084CCC(u8 spawn);
+void warp1_set_2(s8 mapGroup, s8 mapNum, s8 warpNum);
+void c2_load_new_map(void);
+void copy_saved_warp2_bank_and_enter_x_to_warp1(u8 unused);
+void mapldr_default(void);
+
+void IncrementGameStat(u8);
+u32 GetGameStat(u8);
+
+#endif //GUARD_ROM4_H
diff --git a/include/palette.h b/include/palette.h
new file mode 100644
index 000000000..d3bcd2271
--- /dev/null
+++ b/include/palette.h
@@ -0,0 +1,71 @@
+#ifndef GUARD_PALETTE_H
+#define GUARD_PALETTE_H
+
+#include "global.h"
+
+#define gPaletteFade_selectedPalettes (gPaletteFade.multipurpose1) // normal and fast fade
+#define gPaletteFade_blendCnt (gPaletteFade.multipurpose1) // hardware fade
+#define gPaletteFade_delay (gPaletteFade.multipurpose2) // normal and hardware fade
+#define gPaletteFade_submode (gPaletteFade.multipurpose2) // fast fade
+
+#define PLTT_BUFFER_SIZE 0x200
+#define PLTT_DECOMP_BUFFER_SIZE (PLTT_BUFFER_SIZE * 2)
+
+enum
+{
+ FAST_FADE_IN_FROM_WHITE,
+ FAST_FADE_OUT_TO_WHTIE,
+ FAST_FADE_IN_FROM_BLACK,
+ FAST_FADE_OUT_TO_BLACK,
+};
+
+struct PaletteFadeControl
+{
+ u32 multipurpose1;
+ u8 delayCounter:6;
+ u16 y:5; // blend coefficient
+ u16 targetY:5; // target blend coefficient
+ u16 blendColor:15;
+ u16 active:1;
+ u16 multipurpose2:6;
+ u16 yDec:1; // whether blend coefficient is decreasing
+ u16 bufferTransferDisabled:1;
+ u16 mode:2;
+ u16 shouldResetBlendRegisters:1;
+ u16 hardwareFadeFinishing:1;
+ u16 softwareFadeFinishingCounter:5;
+ u16 softwareFadeFinishing:1;
+ u16 objPaletteToggle:1;
+ u8 deltaY:4; // rate of change of blend coefficient
+};
+
+extern struct PaletteFadeControl gPaletteFade;
+extern u32 gPlttBufferTransferPending;
+extern u8 gPaletteDecompressionBuffer[];
+extern u16 gPlttBufferUnfaded[];
+extern u16 gPlttBufferFaded[];
+
+void LoadCompressedPalette(const void *, u16, u16);
+void LoadPalette(const void *, u16, u16);
+void FillPalette(u16, u16, u16);
+void TransferPlttBuffer(void);
+u8 UpdatePaletteFade(void);
+void ResetPaletteFade(void);
+void ReadPlttIntoBuffers(void);
+bool8 BeginNormalPaletteFade(u32, s8, u8, u8, u16);
+bool8 unref_sub_8073D3C(u32, u8, u8, u8, u16);
+void unref_sub_8073D84(u8, u32 *);
+void ResetPaletteStructByUid(u16);
+void ResetPaletteStruct(u8);
+void ResetPaletteFadeControl();
+void unref_sub_8074168(u16);
+void unref_sub_8074194(u16);
+void InvertPlttBuffer(u32);
+void TintPlttBuffer(u32, s8, s8, s8);
+void UnfadePlttBuffer(u32);
+void BeginFastPaletteFade(u8);
+void BeginHardwarePaletteFade(u8, u8, u8, u8, u8);
+void BlendPalettes(u32, u8, u16);
+void BlendPalettesUnfaded(u32, u8, u16);
+
+#endif // GUARD_PALETTE_H
diff --git a/include/party_menu.h b/include/party_menu.h
new file mode 100644
index 000000000..c787bafb1
--- /dev/null
+++ b/include/party_menu.h
@@ -0,0 +1,18 @@
+#ifndef GUARD_PARTY_MENU_H
+#define GUARD_PARTY_MENU_H
+
+enum {
+ AILMENT_NONE,
+ AILMENT_PSN,
+ AILMENT_PRZ,
+ AILMENT_SLP,
+ AILMENT_FRZ,
+ AILMENT_BRN
+};
+
+bool8 pokemon_has_move(struct Pokemon *, u16);
+void sub_81B58A8(void);
+void DoWallyTutorialBagMenu(void);
+u8 pokemon_ailments_get_primary(u32 status);
+
+#endif // GUARD_PARTY_MENU_H
diff --git a/include/play_time.h b/include/play_time.h
new file mode 100644
index 000000000..49091f4b1
--- /dev/null
+++ b/include/play_time.h
@@ -0,0 +1,10 @@
+#ifndef GUARD_PLAY_TIME_H
+#define GUARD_PLAY_TIME_H
+
+void PlayTimeCounter_Reset(void);
+void PlayTimeCounter_Start(void);
+void PlayTimeCounter_Stop(void);
+void PlayTimeCounter_Update(void);
+void PlayTimeCounter_SetToMax(void);
+
+#endif // GUARD_PLAY_TIME_H
diff --git a/include/player_pc.h b/include/player_pc.h
new file mode 100644
index 000000000..b14d1ede3
--- /dev/null
+++ b/include/player_pc.h
@@ -0,0 +1,12 @@
+#ifndef GUARD_PLAYER_PC_H
+#define GUARD_PLAYER_PC_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+
+void sub_816B060(u8 taskId);
+
+#endif //GUARD_PLAYER_PC_H
diff --git a/include/pokeball.h b/include/pokeball.h
new file mode 100644
index 000000000..84178b5b2
--- /dev/null
+++ b/include/pokeball.h
@@ -0,0 +1,32 @@
+#ifndef GUARD_POKEBALL_H
+#define GUARD_POKEBALL_H
+
+enum
+{
+ BALL_POKE,
+ BALL_GREAT,
+ BALL_SAFARI,
+ BALL_ULTRA,
+ BALL_MASTER,
+ BALL_NET,
+ BALL_DIVE,
+ BALL_NEST,
+ BALL_REPEAT,
+ BALL_TIMER,
+ BALL_LUXURY,
+ BALL_PREMIER,
+ POKEBALL_COUNT
+};
+
+#define POKEBALL_PLAYER_SENDOUT 0xFF
+#define POKEBALL_OPPONENT_SENDOUT 0xFE
+
+u8 DoPokeballSendOutAnimation(s16 pan, u8 kindOfThrow);
+void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 bank, u8 x, u8 y, u8 oamPriority, u8 subpriortiy, u8 g, u32 h, u16 species);
+u8 sub_807671C(u8 a, u8 b, u8 x, u8 y, u8 oamPriority, u8 subPriority, u8 g, u32 h);
+void sub_8076918(u8 bank);
+void DoHitAnimHealthboxEffect(u8 bank);
+void LoadBallGfx(u8 ballId);
+void FreeBallGfx(u8 ballId);
+
+#endif // GUARD_POKEBALL_H
diff --git a/include/pokedex.h b/include/pokedex.h
new file mode 100644
index 000000000..236feac45
--- /dev/null
+++ b/include/pokedex.h
@@ -0,0 +1,23 @@
+#ifndef GUARD_POKEDEX_H
+#define GUARD_POKEDEX_H
+
+void ResetPokedex(void);
+void CopyMonCategoryText(u16 species, u8 *dst);
+u16 GetPokedexHeightWeight(u16 dexNum, u8 data);
+u16 GetNationalPokedexCount(u8);
+u16 GetHoennPokedexCount(u8);
+u8 CreateDexDisplayMonDataTask(u16 dexNum, u32 trainerId, u32 personality);
+
+enum
+{
+ FLAG_GET_SEEN,
+ FLAG_GET_CAUGHT,
+ FLAG_SET_SEEN,
+ FLAG_SET_CAUGHT
+};
+
+s8 GetSetPokedexFlag(u16 nationalNum, u8 caseId);
+u16 pokedex_count(u8);
+u16 sub_80C0844(u8);
+
+#endif // GUARD_POKEDEX_H
diff --git a/include/pokemon.h b/include/pokemon.h
new file mode 100644
index 000000000..480c8d9b9
--- /dev/null
+++ b/include/pokemon.h
@@ -0,0 +1,663 @@
+#ifndef GUARD_POKEMON_H
+#define GUARD_POKEMON_H
+
+#define MON_DATA_PERSONALITY 0
+#define MON_DATA_OT_ID 1
+#define MON_DATA_NICKNAME 2
+#define MON_DATA_LANGUAGE 3
+#define MON_DATA_SANITY_BIT1 4
+#define MON_DATA_SANITY_BIT2 5
+#define MON_DATA_SANITY_BIT3 6
+#define MON_DATA_OT_NAME 7
+#define MON_DATA_MARKINGS 8
+#define MON_DATA_CHECKSUM 9
+#define MON_DATA_10 10
+#define MON_DATA_SPECIES 11
+#define MON_DATA_HELD_ITEM 12
+#define MON_DATA_MOVE1 13
+#define MON_DATA_MOVE2 14
+#define MON_DATA_MOVE3 15
+#define MON_DATA_MOVE4 16
+#define MON_DATA_PP1 17
+#define MON_DATA_PP2 18
+#define MON_DATA_PP3 19
+#define MON_DATA_PP4 20
+#define MON_DATA_PP_BONUSES 21
+#define MON_DATA_COOL 22
+#define MON_DATA_BEAUTY 23
+#define MON_DATA_CUTE 24
+#define MON_DATA_EXP 25
+#define MON_DATA_HP_EV 26
+#define MON_DATA_ATK_EV 27
+#define MON_DATA_DEF_EV 28
+#define MON_DATA_SPEED_EV 29
+#define MON_DATA_SPATK_EV 30
+#define MON_DATA_SPDEF_EV 31
+#define MON_DATA_FRIENDSHIP 32
+#define MON_DATA_SMART 33
+#define MON_DATA_POKERUS 34
+#define MON_DATA_MET_LOCATION 35
+#define MON_DATA_MET_LEVEL 36
+#define MON_DATA_MET_GAME 37
+#define MON_DATA_POKEBALL 38
+#define MON_DATA_HP_IV 39
+#define MON_DATA_ATK_IV 40
+#define MON_DATA_DEF_IV 41
+#define MON_DATA_SPEED_IV 42
+#define MON_DATA_SPATK_IV 43
+#define MON_DATA_SPDEF_IV 44
+#define MON_DATA_IS_EGG 45
+#define MON_DATA_ALT_ABILITY 46
+#define MON_DATA_TOUGH 47
+#define MON_DATA_SHEEN 48
+#define MON_DATA_OT_GENDER 49
+#define MON_DATA_COOL_RIBBON 50
+#define MON_DATA_BEAUTY_RIBBON 51
+#define MON_DATA_CUTE_RIBBON 52
+#define MON_DATA_SMART_RIBBON 53
+#define MON_DATA_TOUGH_RIBBON 54
+#define MON_DATA_STATUS 55
+#define MON_DATA_LEVEL 56
+#define MON_DATA_HP 57
+#define MON_DATA_MAX_HP 58
+#define MON_DATA_ATK 59
+#define MON_DATA_DEF 60
+#define MON_DATA_SPEED 61
+#define MON_DATA_SPATK 62
+#define MON_DATA_SPDEF 63
+#define MON_DATA_MAIL 64
+#define MON_DATA_SPECIES2 65
+#define MON_DATA_IVS 66
+#define MON_DATA_CHAMPION_RIBBON 67
+#define MON_DATA_WINNING_RIBBON 68
+#define MON_DATA_VICTORY_RIBBON 69
+#define MON_DATA_ARTIST_RIBBON 70
+#define MON_DATA_EFFORT_RIBBON 71
+#define MON_DATA_GIFT_RIBBON_1 72
+#define MON_DATA_GIFT_RIBBON_2 73
+#define MON_DATA_GIFT_RIBBON_3 74
+#define MON_DATA_GIFT_RIBBON_4 75
+#define MON_DATA_GIFT_RIBBON_5 76
+#define MON_DATA_GIFT_RIBBON_6 77
+#define MON_DATA_GIFT_RIBBON_7 78
+#define MON_DATA_FATEFUL_ENCOUNTER 79
+#define MON_DATA_OBEDIENCE 80
+#define MON_DATA_KNOWN_MOVES 81
+#define MON_DATA_RIBBON_COUNT 82
+#define MON_DATA_RIBBONS 83
+#define MON_DATA_ATK2 84
+#define MON_DATA_DEF2 85
+#define MON_DATA_SPEED2 86
+#define MON_DATA_SPATK2 87
+#define MON_DATA_SPDEF2 88
+
+#define OT_ID_RANDOM_NO_SHINY 2
+#define OT_ID_PRESET 1
+#define OT_ID_PLAYER_ID 0
+
+#define MON_GIVEN_TO_PARTY 0x0
+#define MON_GIVEN_TO_PC 0x1
+#define MON_CANT_GIVE 0x2
+
+#define PLAYER_HAS_TWO_USABLE_MONS 0x0
+#define PLAYER_HAS_ONE_MON 0x1
+#define PLAYER_HAS_ONE_USABLE_MON 0x2
+
+#define MON_MALE 0x00
+#define MON_FEMALE 0xFE
+#define MON_GENDERLESS 0xFF
+
+#define TYPE_NORMAL 0x00
+#define TYPE_FIGHTING 0x01
+#define TYPE_FLYING 0x02
+#define TYPE_POISON 0x03
+#define TYPE_GROUND 0x04
+#define TYPE_ROCK 0x05
+#define TYPE_BUG 0x06
+#define TYPE_GHOST 0x07
+#define TYPE_STEEL 0x08
+#define TYPE_MYSTERY 0x09
+#define TYPE_FIRE 0x0a
+#define TYPE_WATER 0x0b
+#define TYPE_GRASS 0x0c
+#define TYPE_ELECTRIC 0x0d
+#define TYPE_PSYCHIC 0x0e
+#define TYPE_ICE 0x0f
+#define TYPE_DRAGON 0x10
+#define TYPE_DARK 0x11
+
+#define NUMBER_OF_MON_TYPES 0x12
+
+#define PARTY_SIZE 6
+#define MAX_TOTAL_EVS 510
+#define NUM_STATS 6
+#define UNOWN_FORM_COUNT 28
+#define MAX_MON_LEVEL 100
+
+enum
+{
+ EGG_GROUP_NONE,
+ EGG_GROUP_MONSTER,
+ EGG_GROUP_WATER_1,
+ EGG_GROUP_BUG,
+ EGG_GROUP_FLYING,
+ EGG_GROUP_FIELD,
+ EGG_GROUP_FAIRY,
+ EGG_GROUP_GRASS,
+ EGG_GROUP_HUMAN_LIKE,
+ EGG_GROUP_WATER_3,
+ EGG_GROUP_MINERAL,
+ EGG_GROUP_AMORPHOUS,
+ EGG_GROUP_WATER_2,
+ EGG_GROUP_DITTO,
+ EGG_GROUP_DRAGON,
+ EGG_GROUP_UNDISCOVERED
+};
+
+enum
+{
+ NATURE_HARDY,
+ NATURE_LONELY,
+ NATURE_BRAVE,
+ NATURE_ADAMANT,
+ NATURE_NAUGHTY,
+ NATURE_BOLD,
+ NATURE_DOCILE,
+ NATURE_RELAXED,
+ NATURE_IMPISH,
+ NATURE_LAX,
+ NATURE_TIMID,
+ NATURE_HASTY,
+ NATURE_SERIOUS,
+ NATURE_JOLLY,
+ NATURE_NAIVE,
+ NATURE_MODEST,
+ NATURE_MILD,
+ NATURE_QUIET,
+ NATURE_BASHFUL,
+ NATURE_RASH,
+ NATURE_CALM,
+ NATURE_GENTLE,
+ NATURE_SASSY,
+ NATURE_CAREFUL,
+ NATURE_QUIRKY,
+};
+
+struct PokemonSubstruct0
+{
+ u16 species;
+ u16 heldItem;
+ u32 experience;
+ u8 ppBonuses;
+ u8 friendship;
+};
+
+struct PokemonSubstruct1
+{
+ u16 moves[4];
+ u8 pp[4];
+};
+
+struct PokemonSubstruct2
+{
+ u8 hpEV;
+ u8 attackEV;
+ u8 defenseEV;
+ u8 speedEV;
+ u8 spAttackEV;
+ u8 spDefenseEV;
+ u8 cool;
+ u8 beauty;
+ u8 cute;
+ u8 smart;
+ u8 tough;
+ u8 sheen;
+};
+
+struct PokemonSubstruct3
+{
+ /* 0x00 */ u8 pokerus;
+ /* 0x01 */ u8 metLocation;
+
+ /* 0x02 */ u16 metLevel:7;
+ /* 0x02 */ u16 metGame:4;
+ /* 0x03 */ u16 pokeball:4;
+ /* 0x03 */ u16 otGender:1;
+
+ /* 0x04 */ u32 hpIV:5;
+ /* 0x04 */ u32 attackIV:5;
+ /* 0x05 */ u32 defenseIV:5;
+ /* 0x05 */ u32 speedIV:5;
+ /* 0x05 */ u32 spAttackIV:5;
+ /* 0x06 */ u32 spDefenseIV:5;
+ /* 0x07 */ u32 isEgg:1;
+ /* 0x07 */ u32 altAbility:1;
+
+ /* 0x08 */ u32 coolRibbon:3;
+ /* 0x08 */ u32 beautyRibbon:3;
+ /* 0x08 */ u32 cuteRibbon:3;
+ /* 0x09 */ u32 smartRibbon:3;
+ /* 0x09 */ u32 toughRibbon:3;
+ /* 0x09 */ u32 championRibbon:1;
+ /* 0x0A */ u32 winningRibbon:1;
+ /* 0x0A */ u32 victoryRibbon:1;
+ /* 0x0A */ u32 artistRibbon:1;
+ /* 0x0A */ u32 effortRibbon:1;
+ /* 0x0A */ u32 giftRibbon1:1;
+ /* 0x0A */ u32 giftRibbon2:1;
+ /* 0x0A */ u32 giftRibbon3:1;
+ /* 0x0A */ u32 giftRibbon4:1;
+ /* 0x0B */ u32 giftRibbon5:1;
+ /* 0x0B */ u32 giftRibbon6:1;
+ /* 0x0B */ u32 giftRibbon7:1;
+ /* 0x0B */ u32 fatefulEncounter:4;
+ /* 0x0B */ u32 obedient:1;
+};
+
+union PokemonSubstruct
+{
+ struct PokemonSubstruct0 type0;
+ struct PokemonSubstruct1 type1;
+ struct PokemonSubstruct2 type2;
+ struct PokemonSubstruct3 type3;
+ u16 raw[6];
+};
+
+struct BoxPokemon
+{
+ u32 personality;
+ u32 otId;
+ u8 nickname[POKEMON_NAME_LENGTH];
+ u8 language;
+ u8 isBadEgg:1;
+ u8 hasSpecies:1;
+ u8 isEgg:1;
+ u8 unused:5;
+ u8 otName[OT_NAME_LENGTH];
+ u8 markings;
+ u16 checksum;
+ u16 unknown;
+
+ union
+ {
+ u32 raw[12];
+ union PokemonSubstruct substructs[4];
+ } secure;
+};
+
+struct Pokemon
+{
+ struct BoxPokemon box;
+ u32 status;
+ u8 level;
+ u8 mail;
+ u16 hp;
+ u16 maxHP;
+ u16 attack;
+ u16 defense;
+ u16 speed;
+ u16 spAttack;
+ u16 spDefense;
+};
+
+struct PokemonStorage
+{
+ /*0x0000*/ u8 currentBox;
+ /*0x0001*/ struct BoxPokemon boxes[14][30];
+ /*0x8344*/ u8 boxNames[14][9];
+ /*0x83C2*/ u8 boxWallpapers[14];
+};
+
+struct UnknownPokemonStruct
+{
+ u16 species;
+ u16 heldItem;
+ u16 moves[4];
+ u8 level;
+ u8 ppBonuses;
+ u8 hpEV;
+ u8 attackEV;
+ u8 defenseEV;
+ u8 speedEV;
+ u8 spAttackEV;
+ u8 spDefenseEV;
+ u32 otId;
+ u32 hpIV:5;
+ u32 attackIV:5;
+ u32 defenseIV:5;
+ u32 speedIV:5;
+ u32 spAttackIV:5;
+ u32 spDefenseIV:5;
+ u32 gap:1;
+ u32 altAbility:1;
+ u32 personality;
+ u8 nickname[POKEMON_NAME_LENGTH + 1];
+ u8 friendship;
+};
+
+#define BATTLE_STATS_NO 8
+
+struct BattlePokemon
+{
+ /*0x00*/ u16 species;
+ /*0x02*/ u16 attack;
+ /*0x04*/ u16 defense;
+ /*0x06*/ u16 speed;
+ /*0x08*/ u16 spAttack;
+ /*0x0A*/ u16 spDefense;
+ /*0x0C*/ u16 moves[4];
+ /*0x14*/ u32 hpIV:5;
+ /*0x14*/ u32 attackIV:5;
+ /*0x15*/ u32 defenseIV:5;
+ /*0x15*/ u32 speedIV:5;
+ /*0x16*/ u32 spAttackIV:5;
+ /*0x17*/ u32 spDefenseIV:5;
+ /*0x17*/ u32 isEgg:1;
+ /*0x17*/ u32 altAbility:1;
+ /*0x18*/ s8 statStages[BATTLE_STATS_NO];
+ /*0x20*/ u8 ability;
+ /*0x21*/ u8 type1;
+ /*0x22*/ u8 type2;
+ /*0x23*/ u8 unknown;
+ /*0x24*/ u8 pp[4];
+ /*0x28*/ u16 hp;
+ /*0x2A*/ u8 level;
+ /*0x2B*/ u8 friendship;
+ /*0x2C*/ u16 maxHP;
+ /*0x2E*/ u16 item;
+ /*0x30*/ u8 nickname[POKEMON_NAME_LENGTH + 1];
+ /*0x3B*/ u8 ppBonuses;
+ /*0x3C*/ u8 otName[8];
+ /*0x44*/ u32 experience;
+ /*0x48*/ u32 personality;
+ /*0x4C*/ u32 status1;
+ /*0x50*/ u32 status2;
+ /*0x54*/ u32 otId;
+};
+
+enum
+{
+ STAT_STAGE_HP, // 0
+ STAT_STAGE_ATK, // 1
+ STAT_STAGE_DEF, // 2
+ STAT_STAGE_SPEED, // 3
+ STAT_STAGE_SPATK, // 4
+ STAT_STAGE_SPDEF, // 5
+ STAT_STAGE_ACC, // 6
+ STAT_STAGE_EVASION, // 7
+};
+
+enum
+{
+ STAT_HP, // 0
+ STAT_ATK, // 1
+ STAT_DEF, // 2
+ STAT_SPD, // 3
+ STAT_SPATK, // 4
+ STAT_SPDEF, // 5
+};
+
+struct BaseStats
+{
+ /* 0x00 */ u8 baseHP;
+ /* 0x01 */ u8 baseAttack;
+ /* 0x02 */ u8 baseDefense;
+ /* 0x03 */ u8 baseSpeed;
+ /* 0x04 */ u8 baseSpAttack;
+ /* 0x05 */ u8 baseSpDefense;
+ /* 0x06 */ u8 type1;
+ /* 0x07 */ u8 type2;
+ /* 0x08 */ u8 catchRate;
+ /* 0x09 */ u8 expYield;
+ /* 0x0A */ u16 evYield_HP:2;
+ /* 0x0A */ u16 evYield_Attack:2;
+ /* 0x0A */ u16 evYield_Defense:2;
+ /* 0x0A */ u16 evYield_Speed:2;
+ /* 0x0B */ u16 evYield_SpAttack:2;
+ /* 0x0B */ u16 evYield_SpDefense:2;
+ /* 0x0C */ u16 item1;
+ /* 0x0E */ u16 item2;
+ /* 0x10 */ u8 genderRatio;
+ /* 0x11 */ u8 eggCycles;
+ /* 0x12 */ u8 friendship;
+ /* 0x13 */ u8 growthRate;
+ /* 0x14 */ u8 eggGroup1;
+ /* 0x15 */ u8 eggGroup2;
+ /* 0x16 */ u8 ability1;
+ /* 0x17 */ u8 ability2;
+ /* 0x18 */ u8 safariZoneFleeRate;
+ /* 0x19 */ u8 bodyColor : 7;
+ u8 noFlip : 1;
+};
+
+struct BattleMove
+{
+ u8 effect;
+ u8 power;
+ u8 type;
+ u8 accuracy;
+ u8 pp;
+ u8 secondaryEffectChance;
+ u8 target;
+ s8 priority;
+ u8 flags;
+};
+
+#define FLAG_MAKES_CONTACT 0x1
+#define FLAG_PROTECT_AFFECTED 0x2
+#define FLAG_MAGICCOAT_AFFECTED 0x4
+#define FLAG_SNATCH_AFFECTED 0x8
+#define FLAG_MIRROR_MOVE_AFFECTED 0x10
+#define FLAG_KINGSROCK_AFFECTED 0x20
+
+struct SpindaSpot
+{
+ u8 x, y;
+ u16 image[16];
+};
+
+struct __attribute__((packed)) LevelUpMove
+{
+ u16 move:9;
+ u16 level:7;
+};
+
+enum
+{
+ GROWTH_MEDIUM_FAST,
+ GROWTH_ERRATIC,
+ GROWTH_FLUCTUATING,
+ GROWTH_MEDIUM_SLOW,
+ GROWTH_FAST,
+ GROWTH_SLOW
+};
+
+enum
+{
+ BODY_COLOR_RED,
+ BODY_COLOR_BLUE,
+ BODY_COLOR_YELLOW,
+ BODY_COLOR_GREEN,
+ BODY_COLOR_BLACK,
+ BODY_COLOR_BROWN,
+ BODY_COLOR_PURPLE,
+ BODY_COLOR_GRAY,
+ BODY_COLOR_WHITE,
+ BODY_COLOR_PINK
+};
+
+#define EVO_FRIENDSHIP 0x0001 // Pokémon levels up with friendship ≥ 220
+#define EVO_FRIENDSHIP_DAY 0x0002 // Pokémon levels up during the day with friendship ≥ 220
+#define EVO_FRIENDSHIP_NIGHT 0x0003 // Pokémon levels up at night with friendship ≥ 220
+#define EVO_LEVEL 0x0004 // Pokémon reaches the specified level
+#define EVO_TRADE 0x0005 // Pokémon is traded
+#define EVO_TRADE_ITEM 0x0006 // Pokémon is traded while it's holding the specified item
+#define EVO_ITEM 0x0007 // specified item is used on Pokémon
+#define EVO_LEVEL_ATK_GT_DEF 0x0008 // Pokémon reaches the specified level with attack > defense
+#define EVO_LEVEL_ATK_EQ_DEF 0x0009 // Pokémon reaches the specified level with attack = defense
+#define EVO_LEVEL_ATK_LT_DEF 0x000a // Pokémon reaches the specified level with attack < defense
+#define EVO_LEVEL_SILCOON 0x000b // Pokémon reaches the specified level with a Silcoon personality value
+#define EVO_LEVEL_CASCOON 0x000c // Pokémon reaches the specified level with a Cascoon personality value
+#define EVO_LEVEL_NINJASK 0x000d // Pokémon reaches the specified level (special value for Ninjask)
+#define EVO_LEVEL_SHEDINJA 0x000e // Pokémon reaches the specified level (special value for Shedinja)
+#define EVO_BEAUTY 0x000f // Pokémon levels up with beauty ≥ specified value
+
+struct Evolution
+{
+ u16 method;
+ u16 param;
+ u16 targetSpecies;
+};
+
+#define EVOS_PER_MON 5
+
+struct EvolutionData
+{
+ struct Evolution evolutions[EVOS_PER_MON];
+};
+
+extern u8 gPlayerPartyCount;
+extern struct Pokemon gPlayerParty[PARTY_SIZE];
+extern u8 gEnemyPartyCount;
+extern struct Pokemon gEnemyParty[PARTY_SIZE];
+extern const struct BaseStats gBaseStats[];
+extern const u8 *const gItemEffectTable[];
+extern const struct EvolutionData gEvolutionTable[];
+extern struct PokemonStorage* gPokemonStoragePtr;
+extern const u32 gExperienceTables[][MAX_MON_LEVEL + 1];
+extern const u16 *const gLevelUpLearnsets[];
+
+u8 CountAliveMonsInBattle(u8 caseId);
+#define BATTLE_ALIVE_EXCEPT_ACTIVE 0
+#define BATTLE_ALIVE_ATK_SIDE 1
+#define BATTLE_ALIVE_DEF_SIDE 2
+
+void ZeroBoxMonData(struct BoxPokemon *boxMon);
+void ZeroMonData(struct Pokemon *mon);
+void ZeroPlayerPartyMons(void);
+void ZeroEnemyPartyMons(void);
+void CreateMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId);
+void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId);
+void CreateMonWithNature(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 nature);
+void CreateMonWithGenderNatureLetter(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 gender, u8 nature, u8 unownLetter);
+void CreateMaleMon(struct Pokemon *mon, u16 species, u8 level);
+void CreateMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u32 ivs, u32 personality);
+void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId);
+void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 evSpread);
+u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon);
+void CalculateMonStats(struct Pokemon *mon);
+u8 GetLevelFromMonExp(struct Pokemon *mon);
+u8 GetLevelFromBoxMonExp(struct BoxPokemon *boxMon);
+u16 GiveMoveToMon(struct Pokemon *mon, u16 move);
+u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move);
+u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move);
+void MonRestorePP(struct Pokemon *mon);
+void SetMonMoveSlot(struct Pokemon *mon, u16 move, u8 slot);
+void SetBattleMonMoveSlot(struct BattlePokemon *mon, u16 move, u8 slot);
+void GiveMonInitialMoveset(struct Pokemon *mon);
+void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon);
+void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move);
+void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move);
+
+u8 GetMonGender(struct Pokemon *mon);
+u8 GetBoxMonGender(struct BoxPokemon *boxMon);
+u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality);
+void EncryptBoxMon(struct BoxPokemon *boxMon);
+void DecryptBoxMon(struct BoxPokemon *boxMon);
+
+// These are full type signatures for GetMonData() and GetBoxMonData(),
+// but they are not used since some code erroneously omits the third arg.
+// u32 GetMonData(struct Pokemon *mon, s32 field, u8 *data);
+// u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data);
+u32 GetMonData();
+u32 GetBoxMonData();
+
+void SetMonData(struct Pokemon *mon, s32 field, const void *data);
+void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *data);
+void CopyMon(void *dest, void *src, size_t size);
+u8 GiveMonToPlayer(struct Pokemon *mon);
+u8 SendMonToPC(struct Pokemon *mon);
+u8 CalculatePlayerPartyCount(void);
+u8 CalculateEnemyPartyCount(void);
+
+u8 GetAbilityBySpecies(u16 species, bool8 altAbility);
+u8 GetMonAbility(struct Pokemon *mon);
+void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord);
+u8 GetSecretBaseTrainerPicIndex(void);
+u8 GetSecretBaseTrainerNameIndex(void);
+bool8 IsPlayerPartyAndPokemonStorageFull(void);
+bool8 IsPokemonStorageFull(void);
+void GetSpeciesName(u8 *name, u16 species);
+u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex);
+void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex);
+void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex);
+void CopyPlayerPartyMonToBattleData(u8 battleIndex, u8 partyIndex);
+
+u8 GetNature(struct Pokemon *mon);
+u8 GetNatureFromPersonality(u32 personality);
+
+u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex);
+
+void MonRestorePP(struct Pokemon *);
+void BoxMonRestorePP(struct BoxPokemon *);
+
+u16 NationalPokedexNumToSpecies(u16 nationalNum);
+u16 NationalToHoennOrder(u16);
+u16 SpeciesToNationalPokedexNum(u16);
+u16 HoennToNationalOrder(u16);
+u16 SpeciesToCryId(u16 species);
+void DrawSpindaSpots(u16, u32, u8 *, u8);
+void AdjustFriendship(struct Pokemon *, u8);
+u8 CheckPartyHasHadPokerus(struct Pokemon *, u8);
+void UpdatePartyPokerusTime(u16);
+u32 CanMonLearnTMHM(struct Pokemon *, u8);
+u32 CanSpeciesLearnTMHM(u16 species, u8 tm);
+u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves);
+void ClearBattleMonForms(void);
+const u8 *GetMonFrontSpritePal(struct Pokemon *mon);
+const u8 *GetFrontSpritePalFromSpeciesAndPersonality(u16, u32, u32);
+const struct CompressedSpritePalette *sub_80409C8(u16, u32, u32);
+bool8 IsOtherTrainer(u32, u8 *);
+void SetWildMonHeldItem(void);
+u16 GetMonEVCount(struct Pokemon *);
+
+const struct CompressedSpritePalette *sub_806E794(struct Pokemon *mon);
+const struct CompressedSpritePalette *GetMonSpritePalStructFromOtIdPersonality(u16 species, u32 otId , u32 personality);
+bool32 IsHMMove2(u16 move);
+bool8 IsPokeSpriteNotFlipped(u16 species);
+bool8 IsMonShiny(struct Pokemon *mon);
+bool8 IsShinyOtIdPersonality(u32 otId, u32 personality);
+
+void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies);
+bool8 IsTradedMon(struct Pokemon *mon);
+void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality);
+s32 GetBankMultiplayerId(u16 a1);
+bool16 sub_806D82C(u8 id);
+u16 MonTryLearningNewMove(struct Pokemon* mon, bool8);
+void sub_8068AA4(void); // sets stats for deoxys
+bool8 HasTwoFramesAnimation(u16 species);
+u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem);
+void RandomlyGivePartyPokerus(struct Pokemon *party);
+u8 CheckPartyPokerus(struct Pokemon *party, u8 selection);
+u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection);
+void UpdatePartyPokerusTime(u16 days);
+void PartySpreadPokerus(struct Pokemon *party);
+s8 GetMonFlavorRelation(struct Pokemon *mon, u8 a2);
+s8 GetFlavorRelationByPersonality(u32 personality, u8 a2);
+u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit);
+u8 GetDefaultMoveTarget(u8 atkBank);
+u16 PlayerGenderToFrontTrainerPicId(u8 playerGender);
+void sub_806A1C0(u16 arg0, u8 bankIdentity);
+void sub_806A12C(u16 trainerSpriteId, u8 bankIdentity);
+u8 GetSecretBaseTrainerPicIndex(void);
+bool8 TryIncrementMonLevel(struct Pokemon *mon);
+void BoxMonToMon(struct BoxPokemon *srcMon, struct Pokemon *dstMon);
+u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves);
+
+#include "sprite.h"
+
+void DoMonFrontSpriteAnimation(struct Sprite* sprite, u16 species, bool8 noCry, u8 arg3);
+void BattleAnimateFrontSprite(struct Sprite* sprite, u16 species, bool8 noCry, u8 arg3);
+void BattleAnimateBackSprite(struct Sprite* sprite, u16 species);
+
+#endif // GUARD_POKEMON_H
diff --git a/include/pokemon_3.h b/include/pokemon_3.h
new file mode 100644
index 000000000..5c9862d57
--- /dev/null
+++ b/include/pokemon_3.h
@@ -0,0 +1,7 @@
+#ifndef GUARD_POKEMON_3_H
+#define GUARD_POKEMON_3_H
+
+const u8* GetTrainerClassNameFromId(u16 trainerId);
+const u8* GetTrainerNameFromId(u16 trainerId);
+
+#endif // GUARD_POKEMON_3_H
diff --git a/include/pokemon_icon.h b/include/pokemon_icon.h
new file mode 100644
index 000000000..b6d21823e
--- /dev/null
+++ b/include/pokemon_icon.h
@@ -0,0 +1,12 @@
+#ifndef GUARD_POKEMON_ICON_H
+#define GUARD_POKEMON_ICON_H
+
+const u8 *GetMonIconPtr(u16 speciesId, u32 personality, u32 frameNo);
+const u16 *GetValidMonIconPalettePtr(u16 speciesId);
+u16 sub_80D2E84(u16 speciesId);
+void sub_80D2F68(u16 iconId);
+u8 sub_80D2D78(u16 iconId, void callback(struct Sprite *), u16 x, u16 y, u16 a4, u8 a5);
+void sub_80D2FF0(u16 iconId);
+void sub_80D2EF8(struct Sprite *sprite);
+
+#endif // GUARD_POKEMON_ICON_H
diff --git a/include/pokemon_item_effects.h b/include/pokemon_item_effects.h
new file mode 100644
index 000000000..505cc0f25
--- /dev/null
+++ b/include/pokemon_item_effects.h
@@ -0,0 +1,62 @@
+#ifndef GUARD_POKEMON_ITEM_EFFECTS
+#define GUARD_POKEMON_ITEM_EFFECTS
+
+#include "pokemon.h"
+
+// TODO once pokemon item effects is decompiled
+/*
+struct PokemonItemEffect
+{
+ //field 0
+ u8 xAtk : 4; // x1, x2, x4, x8 = xF
+ u8 field_0_x10 : 1; // x10
+ u8 critRatioUp : 1; // x20
+ u8 field_0_x40 : 1; // x40
+ u8 cureInfatuation : 1; // x80
+
+ /*field 1
+ u8 xSpeed : 4; // x1, x2, x4, x8 = xF
+ u8 xDefense : 4; // x10, x20, x40, xF0
+
+ /*field 2
+ u8 xSpAtk : 4; // x1, x2, x4, x8 = xF
+ u8 xAccuracy : 4; // x10, x20, x40, xF0
+
+ /*field 3
+ u8 cureConfusion : 1; // x1
+ u8 cureParalysis : 1; // x2
+ u8 cureFreeze : 1; // x4
+ u8 cureBurn : 1; // x8
+ u8 curePoison : 1; // x10
+ u8 cureSleep : 1; // x20
+ u8 field_3_x40 : 1; // x40
+ u8 cantLowerStats : 1; // x80
+
+ /*field 4
+ u8 hpEv : 1; // x1
+ u8 attackEv : 1; // x2
+ u8 healHp : 1; // x4
+ u8 field_4_x8 : 1; // x8
+ u8 field_4_x10 : 1; // x10
+ u8 ppUp : 1; // x20
+ u8 levelUp : 1; // x40
+ u8 evolutionStone : 1; // x80
+
+ /*field 5
+ u8 defEv: 1; // x1
+ u8 speedEv : 1; // x2
+ u8 spDefEv : 1; // x4
+ u8 spAtkEv : 1; // x8
+ u8 ppMax : 1; // x10
+ u8 field_5_x20 : 1; // x20
+ u8 field_5_x40 : 1; // x40
+ u8 field_5_x80 : 1; // x80
+
+ /*field 6
+ u8 value;
+};
+*/
+
+bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 itemId, u8 partyId, u8 monMoveIndex, u8 a5);
+
+#endif // GUARD_POKEMON_ITEM_EFFECTS
diff --git a/include/pokemon_size_record.h b/include/pokemon_size_record.h
new file mode 100644
index 000000000..f61286bd4
--- /dev/null
+++ b/include/pokemon_size_record.h
@@ -0,0 +1,14 @@
+#ifndef GUARD_POKEMON_SIZE_RECORD_H
+#define GUARD_POKEMON_SIZE_RECORD_H
+
+void InitSeedotSizeRecord(void);
+void GetSeedotSizeRecordInfo(void);
+void CompareSeedotSize(void);
+
+void InitLotadSizeRecord(void);
+void GetLotadSizeRecordInfo(void);
+void CompareLotadSize(void);
+
+void GiveGiftRibbonToParty(u8 index, u8 ribbonId);
+
+#endif // GUARD_POKEMON_SIZE_RECORD_H
diff --git a/include/pokemon_storage_system.h b/include/pokemon_storage_system.h
new file mode 100644
index 000000000..9fcfdba96
--- /dev/null
+++ b/include/pokemon_storage_system.h
@@ -0,0 +1,13 @@
+#ifndef GUARD_POKEMON_STORAGE_SYSTEM_H
+#define GUARD_POKEMON_STORAGE_SYSTEM_H
+
+#define TOTAL_BOXES_COUNT 14
+#define IN_BOX_COUNT 30
+
+u8* GetBoxNamePtr(u8 boxNumber);
+struct BoxPokemon *GetBoxedMonPtr(u8, u8);
+void SetBoxMonNickFromAnyBox(u8, u8, u8 *);
+void CompactPartySlots(void);
+u32 GetBoxMonDataFromAnyBox(u8 boxId, u8 monPosition, u32 request);
+
+#endif // GUARD_POKEMON_STORAGE_SYSTEM_H
diff --git a/include/pokenav.h b/include/pokenav.h
new file mode 100644
index 000000000..06676610a
--- /dev/null
+++ b/include/pokenav.h
@@ -0,0 +1,6 @@
+#ifndef GUARD_POKENAV_H
+#define GUARD_POKENAV_H
+
+bool8 sub_81D5C18(void);
+
+#endif //GUARD_POKENAV_H
diff --git a/include/random.h b/include/random.h
new file mode 100644
index 000000000..79a9d71dc
--- /dev/null
+++ b/include/random.h
@@ -0,0 +1,18 @@
+#ifndef GUARD_RANDOM_H
+#define GUARD_RANDOM_H
+
+extern u32 gRngValue;
+extern u32 gRng2Value;
+
+//Returns a 16-bit pseudorandom number
+u16 Random(void);
+u16 Random2(void);
+
+//Returns a 32-bit pseudorandom number
+#define Random32() (Random() | (Random() << 16))
+
+//Sets the initial seed value of the pseudorandom number generator
+void SeedRng(u16 seed);
+void SeedRng2(u16 seed);
+
+#endif // GUARD_RANDOM_H
diff --git a/include/region_map.h b/include/region_map.h
new file mode 100644
index 000000000..91384d166
--- /dev/null
+++ b/include/region_map.h
@@ -0,0 +1,314 @@
+#ifndef GUARD_REGION_MAP_H
+#define GUARD_REGION_MAP_H
+
+#include "bg.h"
+
+// Exported type declarations
+
+enum {
+ MAPSEC_LITTLEROOT_TOWN,
+ MAPSEC_OLDALE_TOWN,
+ MAPSEC_DEWFORD_TOWN,
+ MAPSEC_LAVARIDGE_TOWN,
+ MAPSEC_FALLARBOR_TOWN,
+ MAPSEC_VERDANTURF_TOWN,
+ MAPSEC_PACIFIDLOG_TOWN,
+ MAPSEC_PETALBURG_CITY,
+ MAPSEC_SLATEPORT_CITY,
+ MAPSEC_MAUVILLE_CITY,
+ MAPSEC_RUSTBORO_CITY,
+ MAPSEC_FORTREE_CITY,
+ MAPSEC_LILYCOVE_CITY,
+ MAPSEC_MOSSDEEP_CITY,
+ MAPSEC_SOOTOPOLIS_CITY,
+ MAPSEC_EVER_GRANDE_CITY,
+ MAPSEC_ROUTE_101,
+ MAPSEC_ROUTE_102,
+ MAPSEC_ROUTE_103,
+ MAPSEC_ROUTE_104,
+ MAPSEC_ROUTE_105,
+ MAPSEC_ROUTE_106,
+ MAPSEC_ROUTE_107,
+ MAPSEC_ROUTE_108,
+ MAPSEC_ROUTE_109,
+ MAPSEC_ROUTE_110,
+ MAPSEC_ROUTE_111,
+ MAPSEC_ROUTE_112,
+ MAPSEC_ROUTE_113,
+ MAPSEC_ROUTE_114,
+ MAPSEC_ROUTE_115,
+ MAPSEC_ROUTE_116,
+ MAPSEC_ROUTE_117,
+ MAPSEC_ROUTE_118,
+ MAPSEC_ROUTE_119,
+ MAPSEC_ROUTE_120,
+ MAPSEC_ROUTE_121,
+ MAPSEC_ROUTE_122,
+ MAPSEC_ROUTE_123,
+ MAPSEC_ROUTE_124,
+ MAPSEC_ROUTE_125,
+ MAPSEC_ROUTE_126,
+ MAPSEC_ROUTE_127,
+ MAPSEC_ROUTE_128,
+ MAPSEC_ROUTE_129,
+ MAPSEC_ROUTE_130,
+ MAPSEC_ROUTE_131,
+ MAPSEC_ROUTE_132,
+ MAPSEC_ROUTE_133,
+ MAPSEC_ROUTE_134,
+ MAPSEC_UNDERWATER_124,
+ MAPSEC_UNDERWATER_125,
+ MAPSEC_UNDERWATER_126,
+ MAPSEC_UNDERWATER_127,
+ MAPSEC_UNDERWATER_SOOTOPOLIS,
+ MAPSEC_GRANITE_CAVE,
+ MAPSEC_MT_CHIMNEY,
+ MAPSEC_SAFARI_ZONE,
+ MAPSEC_BATTLE_FRONTIER,
+ MAPSEC_PETALBURG_WOODS,
+ MAPSEC_RUSTURF_TUNNEL,
+ MAPSEC_ABANDONED_SHIP,
+ MAPSEC_NEW_MAUVILLE,
+ MAPSEC_METEOR_FALLS,
+ MAPSEC_METEOR_FALLS2,
+ MAPSEC_MT_PYRE,
+ MAPSEC_AQUA_HIDEOUT_OLD,
+ MAPSEC_SHOAL_CAVE,
+ MAPSEC_SEAFLOOR_CAVERN,
+ MAPSEC_UNDERWATER_128,
+ MAPSEC_VICTORY_ROAD,
+ MAPSEC_MIRAGE_ISLAND,
+ MAPSEC_CAVE_OF_ORIGIN,
+ MAPSEC_SOUTHERN_ISLAND,
+ MAPSEC_FIERY_PATH,
+ MAPSEC_FIERY_PATH2,
+ MAPSEC_JAGGED_PASS,
+ MAPSEC_JAGGED_PASS2,
+ MAPSEC_SEALED_CHAMBER,
+ MAPSEC_UNDERWATER_SEALED_CHAMBER,
+ MAPSEC_SCORCHED_SLAB,
+ MAPSEC_ISLAND_CAVE,
+ MAPSEC_DESERT_RUINS,
+ MAPSEC_ANCIENT_TOMB,
+ MAPSEC_INSIDE_OF_TRUCK,
+ MAPSEC_SKY_PILLAR,
+ MAPSEC_SECRET_BASE,
+ MAPSEC_DYNAMIC,
+ MAPSEC_PALLET_TOWN,
+ MAPSEC_VIRIDIAN_CITY,
+ MAPSEC_PEWTER_CITY,
+ MAPSEC_CERULEAN_CITY,
+ MAPSEC_LAVENDER_TOWN,
+ MAPSEC_VERMILION_CITY,
+ MAPSEC_CELADON_CITY,
+ MAPSEC_FUCHSIA_CITY,
+ MAPSEC_CINNABAR_ISLAND,
+ MAPSEC_INDIGO_PLATEAU,
+ MAPSEC_SAFFRON_CITY,
+ MAPSEC_ROUTE_4,
+ MAPSEC_ROUTE_10,
+ MAPSEC_ROUTE_1,
+ MAPSEC_ROUTE_2,
+ MAPSEC_ROUTE_3,
+ MAPSEC_ROUTE_4_2,
+ MAPSEC_ROUTE_5,
+ MAPSEC_ROUTE_6,
+ MAPSEC_ROUTE_7,
+ MAPSEC_ROUTE_8,
+ MAPSEC_ROUTE_9,
+ MAPSEC_ROUTE_10_2,
+ MAPSEC_ROUTE_11,
+ MAPSEC_ROUTE_12,
+ MAPSEC_ROUTE_13,
+ MAPSEC_ROUTE_14,
+ MAPSEC_ROUTE_15,
+ MAPSEC_ROUTE_16,
+ MAPSEC_ROUTE_17,
+ MAPSEC_ROUTE_18,
+ MAPSEC_ROUTE_19,
+ MAPSEC_ROUTE_20,
+ MAPSEC_ROUTE_21,
+ MAPSEC_ROUTE_22,
+ MAPSEC_ROUTE_23,
+ MAPSEC_ROUTE_24,
+ MAPSEC_ROUTE_25,
+ MAPSEC_VIRIDIAN_FOREST,
+ MAPSEC_MT_MOON,
+ MAPSEC_S_S_ANNE,
+ MAPSEC_UNDERGROUND_PATH,
+ MAPSEC_UNDERGROUND_PATH_2,
+ MAPSEC_DIGLETTS_CAVE,
+ MAPSEC_KANTO_VICTORY_ROAD,
+ MAPSEC_ROCKET_HIDEOUT,
+ MAPSEC_SILPH_CO,
+ MAPSEC_POKEMON_MANSION,
+ MAPSEC_KANTO_SAFARI_ZONE,
+ MAPSEC_POKEMON_LEAGUE,
+ MAPSEC_ROCK_TUNNEL,
+ MAPSEC_SEAFOAM_ISLANDS,
+ MAPSEC_POKEMON_TOWER,
+ MAPSEC_CERULEAN_CAVE,
+ MAPSEC_POWER_PLANT,
+ MAPSEC_ONE_ISLAND,
+ MAPSEC_TWO_ISLAND,
+ MAPSEC_THREE_ISLAND,
+ MAPSEC_FOUR_ISLAND,
+ MAPSEC_FIVE_ISLAND,
+ MAPSEC_SEVEN_ISLAND,
+ MAPSEC_SIX_ISLAND,
+ MAPSEC_KINDLE_ROAD,
+ MAPSEC_TREASURE_BEACH,
+ MAPSEC_CAPE_BRINK,
+ MAPSEC_BOND_BRIDGE,
+ MAPSEC_THREE_ISLE_PORT,
+ MAPSEC_SEVII_ISLE_6,
+ MAPSEC_SEVII_ISLE_7,
+ MAPSEC_SEVII_ISLE_8,
+ MAPSEC_SEVII_ISLE_9,
+ MAPSEC_RESORT_GORGEOUS,
+ MAPSEC_WATER_LABYRINTH,
+ MAPSEC_FIVE_ISLE_MEADOW,
+ MAPSEC_MEMORIAL_PILLAR,
+ MAPSEC_OUTCAST_ISLAND,
+ MAPSEC_GREEN_PATH,
+ MAPSEC_WATER_PATH,
+ MAPSEC_RUIN_VALLEY,
+ MAPSEC_TRAINER_TOWER,
+ MAPSEC_CANYON_ENTRANCE,
+ MAPSEC_SEVAULT_CANYON,
+ MAPSEC_TANOBY_RUINS,
+ MAPSEC_SEVII_ISLE_22,
+ MAPSEC_SEVII_ISLE_23,
+ MAPSEC_SEVII_ISLE_24,
+ MAPSEC_NAVEL_ROCK,
+ MAPSEC_MT_EMBER,
+ MAPSEC_BERRY_FOREST,
+ MAPSEC_ICEFALL_CAVE,
+ MAPSEC_ROCKET_WAREHOUSE,
+ MAPSEC_TRAINER_TOWER_2,
+ MAPSEC_DOTTED_HOLE,
+ MAPSEC_LOST_CAVE,
+ MAPSEC_PATTERN_BUSH,
+ MAPSEC_ALTERING_CAVE,
+ MAPSEC_TANOBY_CHAMBERS,
+ MAPSEC_THREE_ISLE_PATH,
+ MAPSEC_TANOBY_KEY,
+ MAPSEC_BIRTH_ISLAND,
+ MAPSEC_MONEAN_CHAMBER,
+ MAPSEC_LIPTOO_CHAMBER,
+ MAPSEC_WEEPTH_CHAMBER,
+ MAPSEC_DILFORD_CHAMBER,
+ MAPSEC_SCUFIB_CHAMBER,
+ MAPSEC_RIXY_CHAMBER,
+ MAPSEC_VIAPOIS_CHAMBER,
+ MAPSEC_EMBER_SPA,
+ MAPSEC_SPECIAL_AREA,
+ MAPSEC_AQUA_HIDEOUT,
+ MAPSEC_MAGMA_HIDEOUT,
+ MAPSEC_MIRAGE_TOWER,
+ MAPSEC_BIRTH_ISLAND_2,
+ MAPSEC_FARAWAY_ISLAND,
+ MAPSEC_ARTISAN_CAVE,
+ MAPSEC_MARINE_CAVE,
+ MAPSEC_UNDERWATER_MARINE_CAVE,
+ MAPSEC_TERRA_CAVE,
+ MAPSEC_UNDERWATER_TERRA_CAVE,
+ MAPSEC_UNDERWATER_UNK1,
+ MAPSEC_UNDERWATER_129,
+ MAPSEC_DESERT_UNDERPASS,
+ MAPSEC_ALTERING_CAVE_2,
+ MAPSEC_NAVEL_ROCK2,
+ MAPSEC_TRAINER_HILL,
+ MAPSEC_NONE
+};
+
+enum
+{
+ INPUT_EVENT_NONE,
+ INPUT_EVENT_MOVE_START,
+ INPUT_EVENT_MOVE_CONT,
+ INPUT_EVENT_MOVE_END,
+ INPUT_EVENT_A_BUTTON,
+ INPUT_EVENT_B_BUTTON,
+};
+
+enum {
+ MAPSECTYPE_NONE,
+ MAPSECTYPE_PLAIN,
+ MAPSECTYPE_CITY_CANFLY,
+ MAPSECTYPE_CITY_CANTFLY,
+ MAPSECTYPE_BATTLE_FRONTIER
+};
+
+struct RegionMap {
+ /*0x000*/ u16 mapSecId;
+ /*0x002*/ u8 iconDrawType;
+ /*0x003*/ u8 posWithinMapSec;
+ /*0x004*/ u8 mapSecName[0x14];
+ /*0x018*/ u8 (*inputCallback)(void);
+ /*0x01c*/ struct Sprite *cursorSprite;
+ /*0x020*/ struct Sprite *playerIconSprite;
+ /*0x024*/ s32 bg2x;
+ /*0x028*/ s32 bg2y;
+ /*0x02c*/ u32 bg2pa;
+ /*0x034*/ u32 bg2pc;
+ /*0x030*/ u32 bg2pb;
+ /*0x038*/ u32 bg2pd;
+ /*0x03c*/ s32 unk_03c;
+ /*0x040*/ s32 unk_040;
+ /*0x044*/ s32 unk_044;
+ /*0x048*/ s32 unk_048;
+ /*0x04c*/ s32 unk_04c;
+ /*0x050*/ s32 unk_050;
+ /*0x054*/ u16 cursorPosX;
+ /*0x056*/ u16 cursorPosY;
+ /*0x058*/ u16 cursorTileTag;
+ /*0x05a*/ u16 cursorPaletteTag;
+ /*0x05c*/ s16 scrollX;
+ /*0x05e*/ s16 scrollY;
+ /*0x060*/ s16 unk_060;
+ /*0x062*/ s16 unk_062;
+ /*0x064*/ u16 zoomedCursorPosX;
+ /*0x066*/ u16 zoomedCursorPosY;
+ /*0x068*/ s16 zoomedCursorDeltaY;
+ /*0x06a*/ s16 zoomedCursorDeltaX;
+ /*0x06c*/ u16 zoomedCursorMovementFrameCounter;
+ /*0x06e*/ u16 unk_06e;
+ /*0x070*/ u16 playerIconTileTag;
+ /*0x072*/ u16 playerIconPaletteTag;
+ /*0x074*/ u16 playerIconSpritePosX;
+ /*0x076*/ u16 playerIconSpritePosY;
+ /*0x078*/ bool8 zoomed;
+ /*0x079*/ u8 initStep;
+ /*0x07a*/ s8 cursorMovementFrameCounter;
+ /*0x07b*/ s8 cursorDeltaX;
+ /*0x07c*/ s8 cursorDeltaY;
+ /*0x07d*/ bool8 needUpdateVideoRegs;
+ /*0x07e*/ bool8 blinkPlayerIcon;
+ /*0x07f*/ bool8 playerIsInCave;
+ /*0x080*/ u8 bgNum;
+ /*0x081*/ u8 charBaseIdx;
+ /*0x082*/ u8 mapBaseIdx;
+ /*0x083*/ bool8 bgManaged;
+ /*0x084*/ u8 filler_084[0x100];
+ /*0x184*/ u8 cursorSmallImage[0x100];
+ /*0x284*/ u8 cursorLargeImage[0x600];
+}; // size = 0x884
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+void sub_8122CF8(struct RegionMap *regionMap, struct BgTemplate *template, bool8 zoomed);
+bool8 sub_8122DB0(void);
+void UpdateRegionMapVideoRegs(void);
+void InitRegionMap(struct RegionMap *regionMap, u8 argument);
+u8 sub_81230AC(void);
+bool8 sub_8123514(void);
+void FreeRegionMapIconResources(void);
+u16 GetRegionMapSectionIdAt(u16 x, u16 y);
+void CreateRegionMapPlayerIcon(u16 x, u16 y);
+void CreateRegionMapCursor(u16 tileTag, u16 paletteTag);
+u8 *GetMapName(u8 *, u16, u16);
+bool32 sub_8124668(u8 mapSecId);
+
+#endif //GUARD_REGION_MAP_H
diff --git a/include/reshow_battle_screen.h b/include/reshow_battle_screen.h
new file mode 100644
index 000000000..c22135280
--- /dev/null
+++ b/include/reshow_battle_screen.h
@@ -0,0 +1,7 @@
+#ifndef GUARD_RESHOW_BATTLE_SCREEN_H
+#define GUARD_RESHOW_BATTLE_SCREEN_H
+
+void nullsub_35(void);
+void ReshowBattleScreenAfterMenu(void);
+
+#endif // GUARD_RESHOW_BATTLE_SCREEN_H
diff --git a/include/roamer.h b/include/roamer.h
new file mode 100644
index 000000000..ba1b09b54
--- /dev/null
+++ b/include/roamer.h
@@ -0,0 +1,17 @@
+#ifndef GUARD_ROAMER_H
+#define GUARD_ROAMER_H
+
+void ClearRoamerData(void);
+void ClearRoamerLocationData(void);
+void InitRoamer(void);
+void UpdateLocationHistoryForRoamer(void);
+void RoamerMoveToOtherLocationSet(void);
+void RoamerMove(void);
+bool8 IsRoamerAt(u8 mapGroup, u8 mapNum);
+void CreateRoamerMonInstance(void);
+u8 TryStartRoamerEncounter(void);
+void UpdateRoamerHPStatus(struct Pokemon *mon);
+void SetRoamerInactive(void);
+void GetRoamerLocation(u8 *mapGroup, u8 *mapNum);
+
+#endif // GUARD_ROAMER_H
diff --git a/include/rom6.h b/include/rom6.h
new file mode 100644
index 000000000..6d20752e2
--- /dev/null
+++ b/include/rom6.h
@@ -0,0 +1,15 @@
+#ifndef GUARD_ROM6_H
+#define GUARD_ROM6_H
+
+void sub_81357FC(u8, void(void));
+u8 GetLeadMonIndex(void);
+u8 GetSSTidalLocation(u8 *grp, u8 *num, s16 *x, s16 *y);
+void sub_813BADC(bool8);
+bool8 sub_813B9C0(void);
+void UpdateMirageRnd(u16 days);
+void UpdateBirchState(u16 days);
+void UpdateFrontierManiac(u16 days);
+void UpdateFrontierGambler(u16 days);
+void SetShoalItemFlag(u16 days);
+
+#endif //GUARD_ROM6_H
diff --git a/include/rom_818CFC8.h b/include/rom_818CFC8.h
new file mode 100644
index 000000000..1d0626b2b
--- /dev/null
+++ b/include/rom_818CFC8.h
@@ -0,0 +1,11 @@
+//
+// Created by Scott Norton on 9/6/17.
+//
+
+#ifndef GUARD_ROM_818CFC8_H
+#define GUARD_ROM_818CFC8_H
+
+bool8 InBattlePyramid(void);
+u8 sub_81AAA40(void);
+
+#endif //GUARD_ROM_818CFC8_H
diff --git a/include/rom_81BE66C.h b/include/rom_81BE66C.h
new file mode 100644
index 000000000..5b4f80249
--- /dev/null
+++ b/include/rom_81BE66C.h
@@ -0,0 +1,12 @@
+//
+// Created by Scott Norton on 9/6/17.
+//
+
+#ifndef GUARD_ROM_81BE66C_H
+#define GUARD_ROM_81BE66C_H
+
+bool32 InTrainerHill(void);
+bool8 FieldObjectIsFarawayIslandMew(struct MapObject *);
+u32 sub_81D427C(void);
+
+#endif //GUARD_ROM_81BE66C_H
diff --git a/include/safari_zone.h b/include/safari_zone.h
new file mode 100644
index 000000000..9a81894b8
--- /dev/null
+++ b/include/safari_zone.h
@@ -0,0 +1,19 @@
+#ifndef GUARD_SAFARI_ZONE_H
+#define GUARD_SAFARI_ZONE_H
+
+extern u8 gNumSafariBalls;
+
+bool32 GetSafariZoneFlag(void);
+void SetSafariZoneFlag(void);
+void ResetSafariZoneFlag(void);
+
+void EnterSafariMode(void);
+void ExitSafariMode(void);
+
+bool8 SafariZoneTakeStep(void);
+void SafariZoneRetirePrompt(void);
+
+struct Pokeblock *SafariZoneGetActivePokeblock(void);
+void SafariZoneActivatePokeblockFeeder(u8 pokeblock_index);
+
+#endif // GUARD_SAFARI_ZONE_H
diff --git a/include/save.h b/include/save.h
new file mode 100644
index 000000000..3bd1ff8cf
--- /dev/null
+++ b/include/save.h
@@ -0,0 +1,97 @@
+#ifndef GUARD_SAVE_H
+#define GUARD_SAVE_H
+
+extern u16 gSaveFileStatus;
+
+struct SaveSectionLocation
+{
+ void *data;
+ u16 size;
+};
+
+struct SaveSection
+{
+ u8 data[0xFF4];
+ u16 id;
+ u16 checksum;
+ u32 security;
+ u32 counter;
+}; // size is 0x1000
+
+// headless save section?
+struct UnkSaveSection
+{
+ u8 data[0xFF4];
+ u32 security;
+}; // size is 0xFF8
+
+struct SaveSectionOffsets
+{
+ u16 toAdd;
+ u16 size;
+};
+
+// Emerald changes this definition to be the sectors per slot.
+#define NUM_SECTORS_PER_SLOT 16 // move to save.h
+
+#define UNKNOWN_CHECK_VALUE 0x8012025
+
+// SetDamagedSectorBits states
+enum
+{
+ ENABLE,
+ DISABLE,
+ CHECK // unused
+};
+
+// Do save types
+enum
+{
+ NORMAL_SAVE,
+ LINK_SAVE,
+ //EREADER_SAVE, // depreciated in Emerald
+ LINK2_SAVE, // unknown 2nd link save
+ HOF_SAVE,
+ DIFFERENT_FILE_SAVE,
+ HOF_DELETE_SAVE // unused
+};
+
+#define SECTION_ID_RECORDED_BATTLE 31
+
+void ClearSaveData(void);
+void ResetSaveCounters(void);
+bool32 SetDamagedSectorBits(u8 op, u8 bit);
+u8 save_write_to_flash(u16 a1, const struct SaveSectionLocation *location);
+u8 HandleWriteSector(u16 a1, const struct SaveSectionLocation *location);
+u8 HandleWriteSectorNBytes(u8 sector, u8 *data, u16 size);
+u8 TryWriteSector(u8 sector, u8 *data);
+u32 RestoreSaveBackupVarsAndIncrement(const struct SaveSectionLocation *location);
+u32 RestoreSaveBackupVars(const struct SaveSectionLocation *location);
+u8 sub_81529D4(u16 a1, const struct SaveSectionLocation *location);
+u8 sub_8152A34(u16 a1, const struct SaveSectionLocation *location);
+u8 ClearSaveData_2(u16 a1, const struct SaveSectionLocation *location);
+u8 sav12_xor_get(u16 a1, const struct SaveSectionLocation *location);
+u8 sub_8152CAC(u16 a1, const struct SaveSectionLocation *location);
+u8 sub_8152D44(u16 a1, const struct SaveSectionLocation *location);
+u8 sub_8152DD0(u16 a1, const struct SaveSectionLocation *location);
+u8 sub_8152E10(u16 a1, const struct SaveSectionLocation *location);
+u8 GetSaveValidStatus(const struct SaveSectionLocation *location);
+u8 sub_81530DC(u8 a1, u8 *data, u16 size);
+u8 DoReadFlashWholeSection(u8 sector, struct SaveSection *section);
+u16 CalculateChecksum(void *data, u16 size);
+void UpdateSaveAddresses(void);
+u8 HandleSavingData(u8 saveType);
+u8 TrySavingData(u8 saveType);
+u8 sub_8153380(void);
+bool8 sub_81533AC(void);
+u8 sub_81533E0(void);
+u8 sub_8153408(void);
+u8 sub_8153430(void);
+bool8 sub_8153474(void);
+u8 sub_81534D0(u8 a1);
+u16 sub_815355C(void);
+u32 TryCopySpecialSaveSection(u8 sector, u8* dst);
+u32 sub_8153634(u8 sector, u8* src);
+void sub_8153688(u8 taskId);
+
+#endif // GUARD_SAVE_H
diff --git a/include/save_location.h b/include/save_location.h
new file mode 100644
index 000000000..95b3a7d7d
--- /dev/null
+++ b/include/save_location.h
@@ -0,0 +1,9 @@
+#ifndef GUARD_SAVE_LOCATION_H
+#define GUARD_SAVE_LOCATION_H
+
+bool32 sub_81AFCEC(void);
+void TrySetMapSaveWarpStatus(void);
+void sub_81AFDA0(void);
+void sub_81AFDD0(void);
+
+#endif // GUARD_SAVE_LOCATION_H
diff --git a/include/script.h b/include/script.h
new file mode 100644
index 000000000..2b5f8c2ce
--- /dev/null
+++ b/include/script.h
@@ -0,0 +1,64 @@
+#ifndef GUARD_SCRIPT_H
+#define GUARD_SCRIPT_H
+
+struct ScriptContext;
+
+typedef bool8 (*ScrCmdFunc)(struct ScriptContext *);
+typedef u8 Script[];
+
+struct ScriptContext
+{
+ u8 stackDepth;
+ u8 mode;
+ u8 comparisonResult;
+ u8 (*nativePtr)(void);
+ const u8 *scriptPtr;
+ const u8 *stack[20];
+ ScrCmdFunc *cmdTable;
+ ScrCmdFunc *cmdTableEnd;
+ u32 data[4];
+};
+
+#define ScriptReadByte(ctx) (*(ctx->scriptPtr++))
+
+void InitScriptContext(struct ScriptContext *ctx, void *cmdTable, void *cmdTableEnd);
+u8 SetupBytecodeScript(struct ScriptContext *ctx, const u8 *ptr);
+void SetupNativeScript(struct ScriptContext *ctx, bool8 (*ptr)(void));
+void StopScript(struct ScriptContext *ctx);
+bool8 RunScriptCommand(struct ScriptContext *ctx);
+u8 ScriptPush(struct ScriptContext *ctx, const u8 *ptr);
+const u8 *ScriptPop(struct ScriptContext *ctx);
+void ScriptJump(struct ScriptContext *ctx, const u8 *ptr);
+void ScriptCall(struct ScriptContext *ctx, const u8 *ptr);
+void ScriptReturn(struct ScriptContext *ctx);
+u16 ScriptReadHalfword(struct ScriptContext *ctx);
+u32 ScriptReadWord(struct ScriptContext *ctx);
+void ScriptContext2_Enable(void);
+void ScriptContext2_Disable(void);
+bool8 ScriptContext2_IsEnabled(void);
+void ScriptContext1_Init(void);
+bool8 ScriptContext1_IsScriptSetUp(void);
+bool8 ScriptContext2_RunScript(void);
+void ScriptContext1_SetupScript(const u8 *ptr);
+void ScriptContext1_Stop(void);
+void EnableBothScriptContexts(void);
+void ScriptContext2_RunNewScript(const u8 *ptr);
+u8 *mapheader_get_tagged_pointer(u8 tag);
+void mapheader_run_script_by_tag(u8 tag);
+u8 *mapheader_get_first_match_from_tagged_ptr_list(u8 tag);
+void mapheader_run_script_with_tag_x1(void);
+void mapheader_run_script_with_tag_x3(void);
+void mapheader_run_script_with_tag_x5(void);
+void mapheader_run_script_with_tag_x7(void);
+void mapheader_run_script_with_tag_x6(void);
+bool8 mapheader_run_first_tag2_script_list_match(void);
+void mapheader_run_first_tag4_script_list_match(void);
+u32 CalculateRamScriptChecksum(void);
+void ClearRamScript(void);
+bool8 InitRamScript(u8 *script, u16 scriptSize, u8 mapGroup, u8 mapNum, u8 objectId);
+u8 *GetRamScript(u8 objectId, u8 *script);
+bool32 sub_80991F8(void);
+u8 *sub_8099244(void);
+void sub_80992A0(u8 *script, u16 scriptSize);
+
+#endif // GUARD_SCRIPT_H
diff --git a/include/script_menu.h b/include/script_menu.h
new file mode 100644
index 000000000..717eda041
--- /dev/null
+++ b/include/script_menu.h
@@ -0,0 +1,13 @@
+#ifndef GUARD_SCRIPT_MENU_H
+#define GUARD_SCRIPT_MENU_H
+
+extern const u8 *const gUnknown_0858BAF0[9];
+
+bool8 ScriptMenu_Multichoice(u8 left, u8 top, u8 var3, u8 var4);
+bool8 ScriptMenu_MultichoiceWithDefault(u8 left, u8 top, u8 var3, u8 var4, u8 var5);
+bool8 ScriptMenu_YesNo(u8 var1, u8 var2);
+bool8 ScriptMenu_MultichoiceGrid(u8 left, u8 top, u8 multichoiceId, u8 a4, u8 columnCount);
+bool8 ScriptMenu_ShowPokemonPic(u16 var1, u8 var2, u8 var3);
+bool8 (*ScriptMenu_GetPicboxWaitFunc(void))(void);
+
+#endif //GUARD_SCRIPT_MENU_H
diff --git a/include/script_movement.h b/include/script_movement.h
new file mode 100644
index 000000000..4c3fa6002
--- /dev/null
+++ b/include/script_movement.h
@@ -0,0 +1,8 @@
+#ifndef GUARD_SCRIPT_MOVEMENT_H
+#define GUARD_SCRIPT_MOVEMENT_H
+
+bool8 ScriptMovement_StartObjectMovementScript(u8, u8, u8, const u8 *);
+bool8 ScriptMovement_IsObjectMovementFinished(u8, u8, u8);
+void sub_80D338C(void);
+
+#endif // GUARD_SCRIPT_MOVEMENT_H
diff --git a/include/script_pokemon_80F8.h b/include/script_pokemon_80F8.h
new file mode 100644
index 000000000..8dd7ed0c0
--- /dev/null
+++ b/include/script_pokemon_80F8.h
@@ -0,0 +1,10 @@
+#ifndef GUARD_SCRIPTPOKE80F8_H
+#define GUARD_SCRIPTPOKE80F8_H
+
+void ShowContestWinner(void);
+u8 ScriptGiveMon(u16, u8, u16, u32, u32, u8);
+u8 ScriptGiveEgg(u16);
+void CreateScriptedWildMon(u16, u8, u16);
+void ScriptSetMonMoveSlot(u8, u16, u8);
+
+#endif
diff --git a/include/script_pokemon_81B9.h b/include/script_pokemon_81B9.h
new file mode 100644
index 000000000..1b8563ee6
--- /dev/null
+++ b/include/script_pokemon_81B9.h
@@ -0,0 +1,6 @@
+#ifndef GUARD_SCRIPTPOKE81B9_H
+#define GUARD_SCRIPTPOKE81B9_H
+
+void sub_81B9404(void);
+
+#endif
diff --git a/include/shop.h b/include/shop.h
new file mode 100644
index 000000000..d3e86408c
--- /dev/null
+++ b/include/shop.h
@@ -0,0 +1,10 @@
+#ifndef GUARD_SHOP_H
+#define GUARD_SHOP_H
+
+extern EWRAM_DATA struct ItemSlot gUnknown_02039F80[3];
+
+void CreatePokemartMenu(const u16 *);
+void CreateDecorationShop1Menu(const u16 *);
+void CreateDecorationShop2Menu(const u16 *);
+
+#endif // GUARD_SHOP_H
diff --git a/include/slot_machine.h b/include/slot_machine.h
new file mode 100644
index 000000000..8334e56fc
--- /dev/null
+++ b/include/slot_machine.h
@@ -0,0 +1,6 @@
+#ifndef GUARD_SLOT_MACHINE_H
+#define GUARD_SLOT_MACHINE_H
+
+void PlaySlotMachine(u8, void *);
+
+#endif // GUARD_SLOT_MACHINE_H
diff --git a/include/songs.h b/include/songs.h
new file mode 100644
index 000000000..5a1fff00c
--- /dev/null
+++ b/include/songs.h
@@ -0,0 +1,466 @@
+#ifndef GUARD_SONGS_H
+#define GUARD_SONGS_H
+
+enum
+{
+ /*0x00*/ SE_STOP,
+ /*0x01*/ SE_KAIFUKU,
+ /*0x02*/ SE_PC_LOGON,
+ /*0x03*/ SE_PC_OFF,
+ /*0x04*/ SE_PC_ON,
+ /*0x05*/ SE_SELECT,
+ /*0x06*/ SE_WIN_OPEN,
+ /*0x07*/ SE_WALL_HIT,
+ /*0x08*/ SE_DOOR,
+ /*0x09*/ SE_KAIDAN,
+ /*0x0A*/ SE_DANSA,
+ /*0x0B*/ SE_JITENSYA,
+ /*0x0C*/ SE_KOUKA_L, // Goggle told me Kouka means 'effectiveness' which makes sense, because
+ /*0x0D*/ SE_KOUKA_M, // those three sounds play whenever you use a move
+ /*0x0E*/ SE_KOUKA_H,
+ /*0x0F*/ SE_BOWA2,
+ /*0x10*/ SE_POKE_DEAD,
+ /*0x11*/ SE_NIGERU,
+ /*0x12*/ SE_JIDO_DOA,
+ /*0x13*/ SE_NAMINORI,
+ /*0x14*/ SE_BAN,
+ /*0x15*/ SE_PIN,
+ /*0x16*/ SE_BOO,
+ /*0x17*/ SE_BOWA,
+ /*0x18*/ SE_JYUNI,
+ /*0x19*/ SE_A,
+ /*0x1A*/ SE_I,
+ /*0x1B*/ SE_U,
+ /*0x1C*/ SE_E,
+ /*0x1D*/ SE_O,
+ /*0x1E*/ SE_N,
+ /*0x1F*/ SE_SEIKAI,
+ /*0x20*/ SE_HAZURE,
+ /*0x21*/ SE_EXP,
+ /*0x22*/ SE_JITE_PYOKO,
+ /*0x23*/ SE_MU_PACHI,
+ /*0x24*/ SE_TK_KASYA,
+ /*0x25*/ SE_FU_ZAKU,
+ /*0x26*/ SE_FU_ZAKU2,
+ /*0x27*/ SE_FU_ZUZUZU,
+ /*0x28*/ SE_RU_GASHIN,
+ /*0x29*/ SE_RU_GASYAN,
+ /*0x2A*/ SE_RU_BARI,
+ /*0x2B*/ SE_RU_HYUU,
+ /*0x2C*/ SE_KI_GASYAN,
+ /*0x2D*/ SE_TK_WARPIN,
+ /*0x2E*/ SE_TK_WARPOUT,
+ /*0x2F*/ SE_TU_SAA,
+ /*0x30*/ SE_HI_TURUN,
+ /*0x31*/ SE_TRACK_MOVE,
+ /*0x32*/ SE_TRACK_STOP,
+ /*0x33*/ SE_TRACK_HAIK,
+ /*0x34*/ SE_TRACK_DOOR,
+ /*0x35*/ SE_MOTER,
+ /*0x36*/ SE_CARD,
+ /*0x37*/ SE_SAVE,
+ /*0x38*/ SE_KON,
+ /*0x39*/ SE_KON2,
+ /*0x3A*/ SE_KON3,
+ /*0x3B*/ SE_KON4,
+ /*0x3C*/ SE_SUIKOMU,
+ /*0x3D*/ SE_NAGERU,
+ SE_TOY_C,
+ SE_TOY_D,
+ SE_TOY_E,
+ SE_TOY_F,
+ SE_TOY_G,
+ SE_TOY_A,
+ SE_TOY_B,
+ SE_TOY_C1,
+ SE_MIZU,
+ SE_HASHI,
+ SE_DAUGI,
+ SE_PINPON,
+ SE_FUUSEN1,
+ SE_FUUSEN2,
+ SE_FUUSEN3,
+ SE_TOY_KABE,
+ SE_TOY_DANGO,
+ SE_DOKU,
+ SE_ESUKA,
+ SE_T_AME,
+ SE_T_AME_E,
+ SE_T_OOAME,
+ SE_T_OOAME_E,
+ SE_T_KOAME,
+ SE_T_KOAME_E,
+ SE_T_KAMI,
+ SE_T_KAMI2,
+ SE_ELEBETA,
+ /*0x5A*/ SE_HINSI,
+ /*0x5B*/ SE_EXPMAX,
+ /*0x5C*/ SE_TAMAKORO,
+ /*0x5D*/ SE_TAMAKORO_E,
+ /*0x5E*/ SE_BASABASA,
+ /*0x5F*/ SE_REGI,
+ SE_C_GAJI,
+ SE_C_MAKU_U,
+ SE_C_MAKU_D,
+ SE_C_PASI,
+ SE_C_SYU,
+ SE_C_PIKON,
+ /*0x66*/ SE_REAPOKE,
+ /*0x67*/ SE_OP_BASYU,
+ /*0x68*/ SE_BT_START,
+ SE_DENDOU,
+ SE_JIHANKI,
+ SE_TAMA,
+ SE_Z_SCROLL,
+ /*0x6D*/ SE_Z_PAGE,
+ /*0x6E*/ SE_PN_ON,
+ /*0x6F*/ SE_PN_OFF,
+ /*0x70*/ SE_Z_SEARCH,
+ /*0x71*/ SE_TAMAGO,
+ /*0x72*/ SE_TB_START,
+ /*0x73*/ SE_TB_KON,
+ /*0x74*/ SE_TB_KARA,
+ /*0x75*/ SE_BIDORO,
+ /*0x76*/ SE_W085,
+ /*0x77*/ SE_W085B,
+ /*0x78*/ SE_W231,
+ /*0x79*/ SE_W171,
+ /*0x7A*/ SE_W233,
+ /*0x7B*/ SE_W233B,
+ /*0x7C*/ SE_W145,
+ /*0x7D*/ SE_W145B,
+ /*0x7E*/ SE_W145C,
+ /*0x7F*/ SE_W240,
+ /*0x80*/ SE_W015,
+ /*0x81*/ SE_W081,
+ /*0x82*/ SE_W081B,
+ /*0x83*/ SE_W088,
+ /*0x84*/ SE_W016,
+ /*0x85*/ SE_W016B,
+ /*0x86*/ SE_W003,
+ /*0x87*/ SE_W104,
+ /*0x88*/ SE_W013,
+ /*0x89*/ SE_W196,
+ /*0x8A*/ SE_W086,
+ /*0x8B*/ SE_W004,
+ /*0x8C*/ SE_W025,
+ /*0x8D*/ SE_W025B,
+ SE_W152,
+ SE_W026,
+ SE_W172,
+ SE_W172B,
+ SE_W053,
+ SE_W007,
+ SE_W092,
+ SE_W221,
+ SE_W221B,
+ SE_W052,
+ SE_W036,
+ SE_W059,
+ SE_W059B,
+ SE_W010,
+ SE_W011,
+ SE_W017,
+ SE_W019,
+ SE_W028,
+ SE_W013B,
+ SE_W044,
+ SE_W029,
+ SE_W057,
+ SE_W056,
+ SE_W250,
+ SE_W030,
+ SE_W039,
+ SE_W054,
+ SE_W077,
+ SE_W020,
+ SE_W082,
+ SE_W047,
+ SE_W195,
+ SE_W006,
+ SE_W091,
+ SE_W146,
+ SE_W120,
+ SE_W153,
+ SE_W071B,
+ SE_W071,
+ SE_W103,
+ /*0xB6*/ SE_W062,
+ /*0xB7*/ SE_W062B,
+ /*0xB8*/ SE_W048,
+ /*0xB9*/ SE_W187,
+ /*0xBA*/ SE_W118,
+ /*0xBB*/ SE_W155,
+ /*0xBC*/ SE_W122,
+ /*0xBD*/ SE_W060,
+ /*0xBE*/ SE_W185,
+ /*0xBF*/ SE_W014,
+ /*0xC0*/ SE_W043,
+ /*0xC1*/ SE_W207,
+ /*0xC2*/ SE_W207B,
+ /*0xC3*/ SE_W215,
+ /*0xC4*/ SE_W109,
+ /*0xC5*/ SE_W173,
+ /*0xC6*/ SE_W280,
+ /*0xC7*/ SE_W202,
+ /*0xC8*/ SE_W060B,
+ /*0xC9*/ SE_W076,
+ /*0xCA*/ SE_W080,
+ /*0xCB*/ SE_W100,
+ /*0xCC*/ SE_W107,
+ SE_W166,
+ SE_W129,
+ SE_W115,
+ SE_W112,
+ SE_W197,
+ SE_W199,
+ SE_W236,
+ SE_W204,
+ SE_W268,
+ SE_W070,
+ SE_W063,
+ SE_W127,
+ SE_W179,
+ SE_W151,
+ SE_W201,
+ SE_W161,
+ SE_W161B,
+ SE_W227,
+ SE_W227B,
+ SE_W226,
+ SE_W208,
+ SE_W213,
+ SE_W213B,
+ SE_W234,
+ SE_W260,
+ SE_W328,
+ SE_W320,
+ SE_W255,
+ SE_W291,
+ SE_W089,
+ SE_W239,
+ SE_W230,
+ SE_W281,
+ SE_W327,
+ SE_W287,
+ SE_W257,
+ SE_W253,
+ SE_W258,
+ SE_W322,
+ SE_W298,
+ SE_W287B,
+ SE_W114,
+ SE_W063B,
+ BGM_STOP = 349,
+ /*0x15E*/ BGM_TETSUJI,
+ /*0x15F*/ BGM_FIELD13,
+ /*0x160*/ BGM_KACHI22,
+ /*0x161*/ BGM_KACHI2,
+ /*0x162*/ BGM_KACHI3,
+ /*0x163*/ BGM_KACHI5,
+ /*0x164*/ BGM_PCC,
+ /*0x165*/ BGM_NIBI,
+ /*0x166*/ BGM_SUIKUN,
+ /*0x167*/ BGM_DOORO1,
+ /*0x168*/ BGM_DOORO_X1,
+ /*0x169*/ BGM_DOORO_X3,
+ /*0x16A*/ BGM_MACHI_S2,
+ /*0x16B*/ BGM_MACHI_S4,
+ /*0x16C*/ BGM_GIM,
+ /*0x16D*/ BGM_NAMINORI,
+ /*0x16E*/ BGM_DAN01,
+ /*0x16F*/ BGM_FANFA1,
+ /*0x170*/ BGM_ME_ASA,
+ /*0x171*/ BGM_ME_BACHI,
+ /*0x172*/ BGM_FANFA4,
+ /*0x173*/ BGM_FANFA5,
+ /*0x174*/ BGM_ME_WAZA,
+ /*0x175*/ BGM_BIJYUTU,
+ /*0x176*/ BGM_DOORO_X4,
+ /*0x177*/ BGM_FUNE_KAN,
+ /*0x178*/ BGM_ME_SHINKA,
+ /*0x179*/ BGM_SHINKA,
+ /*0x17A*/ BGM_ME_WASURE,
+ /*0x17B*/ BGM_SYOUJOEYE,
+ /*0x17C*/ BGM_BOYEYE,
+ /*0x17D*/ BGM_DAN02,
+ /*0x17E*/ BGM_MACHI_S3,
+ /*0x17F*/ BGM_ODAMAKI,
+ /*0x180*/ BGM_B_TOWER,
+ /*0x181*/ BGM_SWIMEYE,
+ /*0x182*/ BGM_DAN03,
+ /*0x183*/ BGM_ME_KINOMI,
+ /*0x184*/ BGM_ME_TAMA,
+ /*0x185*/ BGM_ME_B_BIG,
+ /*0x186*/ BGM_ME_B_SMALL,
+ /*0x187*/ BGM_ME_ZANNEN,
+ /*0x188*/ BGM_BD_TIME,
+ /*0x189*/ BGM_TEST1,
+ /*0x18A*/ BGM_TEST2,
+ /*0x18B*/ BGM_TEST3,
+ /*0x18C*/ BGM_TEST4,
+ /*0x18D*/ BGM_TEST,
+ /*0x18E*/ BGM_GOMACHI0,
+ /*0x18F*/ BGM_GOTOWN,
+ /*0x190*/ BGM_POKECEN,
+ /*0x191*/ BGM_NEXTROAD,
+ /*0x192*/ BGM_GRANROAD,
+ /*0x193*/ BGM_CYCLING,
+ /*0x194*/ BGM_FRIENDLY,
+ /*0x195*/ BGM_MISHIRO,
+ /*0x196*/ BGM_TOZAN,
+ /*0x197*/ BGM_GIRLEYE,
+ /*0x198*/ BGM_MINAMO,
+ /*0x199*/ BGM_ASHROAD,
+ /*0x19A*/ BGM_EVENT0,
+ /*0x19B*/ BGM_DEEPDEEP,
+ /*0x19C*/ BGM_KACHI1,
+ /*0x19D*/ BGM_TITLE3,
+ /*0x19E*/ BGM_DEMO1,
+ /*0x19F*/ BGM_GIRL_SUP,
+ /*0x1A0*/ BGM_HAGESHII,
+ /*0x1A1*/ BGM_KAKKOII,
+ /*0x1A2*/ BGM_KAZANBAI,
+ /*0x1A3*/ BGM_AQA_0,
+ /*0x1A4*/ BGM_TSURETEK,
+ /*0x1A5*/ BGM_BOY_SUP,
+ /*0x1A6*/ BGM_RAINBOW,
+ /*0x1A7*/ BGM_AYASII,
+ /*0x1A8*/ BGM_KACHI4,
+ /*0x1A9*/ BGM_ROPEWAY,
+ /*0x1AA*/ BGM_CASINO,
+ /*0x1AB*/ BGM_HIGHTOWN,
+ /*0x1AC*/ BGM_SAFARI,
+ BGM_C_ROAD,
+ BGM_AJITO,
+ BGM_M_BOAT,
+ BGM_M_DUNGON,
+ BGM_FINECITY,
+ BGM_MACHUPI,
+ BGM_P_SCHOOL,
+ BGM_DENDOU,
+ BGM_TONEKUSA,
+ BGM_MABOROSI,
+ BGM_CON_FAN,
+ BGM_CONTEST0,
+ BGM_MGM0,
+ BGM_T_BATTLE,
+ BGM_OOAME,
+ BGM_HIDERI,
+ BGM_RUNECITY,
+ BGM_CON_K,
+ BGM_EIKOU_R,
+ BGM_KARAKURI,
+ BGM_HUTAGO,
+ BGM_SITENNOU,
+ BGM_YAMA_EYE,
+ BGM_CONLOBBY,
+ BGM_INTER_V,
+ BGM_DAIGO,
+ BGM_THANKFOR,
+ BGM_END,
+ /*0x1C9*/ BGM_BATTLE_FRONTIER, // human-readable names start here because we don't know the actual filenames
+ BGM_BATTLE_ARENA,
+ BGM_ME_BATTLE_POINTS, // ME_ as in messagebox? Used for KINOMI (berries) and stuff above
+ BGM_ME_MATCH_CALL,
+ BGM_BATTLE_PYRAMID,
+ BGM_BATTLE_PYRAMID_SUMMIT,
+ BGM_BATTLE_PALACE,
+ BGM_FANFA_RAYQUAZA,
+ BGM_BATTLE_TOWER,
+ BGM_ME_BATTLE_SYMBOL,
+ BGM_BATTLE_DOME_TOURNAMENT,
+ BGM_BATTLE_PIKE,
+ BGM_BATTLE_FACTORY,
+ BGM_BATTLE_LEGENDARY,
+ BGM_BATTLE_FRONTIER_BRAIN,
+ BGM_BATTLE_MEW,
+ BGM_BATTLE_DOME, // end of the human-readable names
+ /*0x1DA*/ BGM_BATTLE27, // wild
+ BGM_BATTLE31, // aqua/magma grunt
+ BGM_BATTLE20, // trainer
+ BGM_BATTLE32, // gym leader
+ BGM_BATTLE33, // champion
+ BGM_BATTLE36, // regi
+ BGM_BATTLE34, // weather trio
+ BGM_BATTLE35, // rival
+ BGM_BATTLE38, // elite four
+ BGM_BATTLE30, // aqua/magma leader
+ /*0x1E4*/ BGM_FRLG_FOLLOW_ME, // FR/LG names not known, human-readable again!
+ BGM_FRLG_GAMECORNER,
+ BGM_FRLG_ROCKET_HIDEOUT,
+ BGM_FRLG_GYM,
+ BGM_FRLG_JIGGLYPUFF,
+ BGM_FRLG_OPENING,
+ BGM_FRLG_TITLE,
+ BGM_FRLG_CINNABAR_ISLAND,
+ BGM_FRLG_LAVENDER_TOWN,
+ BGM_FRLG_HEALING_TEST,
+ BGM_FRLG_BICYCLE,
+ BGM_FRLG_SUSPICIOUS_EYE,
+ BGM_FRLG_GIRL_EYE,
+ BGM_FRLG_BOY_EYE,
+ BGM_FRLG_CONGRATULATIONS_HALL_OF_FAME,
+ BGM_FRLG_VIRIDIAN_FOREST,
+ BGM_FRLG_MT_MOON,
+ BGM_FRLG_POKEMON_MANSION,
+ BGM_FRLG_CREDITS,
+ BGM_FRLG_ROUTE_1,
+ BGM_FRLG_ROUTE_24,
+ BGM_FRLG_ROUTE_3,
+ BGM_FRLG_ROUTE_11,
+ BGM_FRLG_INDIGO_PLATEAU,
+ BGM_FRLG_BATTLE_LEADER,
+ BGM_FRLG_BATTLE_TRAINER,
+ BGM_FRLG_BATTLE_WILD_POKEMON,
+ BGM_FRLG_BATTLE_CHAMPION,
+ BGM_FRLG_PALLET_TOWN,
+ BGM_FRLG_OAK_LAB,
+ BGM_FRLG_PROF_OAK,
+ BGM_FRLG_POKEMON_CENTER,
+ BGM_FRLG_SS_ANNE,
+ BGM_FRLG_SURF,
+ BGM_FRLG_POKEMON_TOWER,
+ BGM_FRLG_SILPH,
+ BGM_FRLG_CERULEAN_CITY,
+ BGM_FRLG_CELADON_CITY,
+ BGM_FRLG_KACHI_TRAINER, // KACHI used in RS test - victory
+ BGM_FRLG_KACHI_WILD_POKEMON,
+ BGM_FRLG_KACHI_LEADER,
+ BGM_FRLG_VERMILION_CITY,
+ BGM_FRLG_VIRIDIAN_CITY,
+ BGM_FRLG_RIVAL,
+ BGM_FRLG_RIVAL_POSTBATTLE,
+ BGM_FRLG_ME_POKEDEX_EVAL,
+ BGM_FRLG_ME_KEYITEM,
+ BGM_FRLG_FANFA_POKEMON_CAUGHT,
+ BGM_FRLG_FANFA_TRAINERCARD_PHOTO,
+ BGM_FRLG_GAMEFREAK_LOGO,
+ BGM_FRLG_CAUGHT_POKEMON,
+ BGM_FRLG_GAME_EXPLANATION_START,
+ BGM_FRLG_GAME_EXPLANATION_MIDDLE,
+ BGM_FRLG_GAME_EXPLANATION_END,
+ BGM_FRLG_POKEMON_JUMP,
+ BGM_FRLG_UNION_ROOM,
+ BGM_FRLG_POKEMON_NETWORK_CENTER,
+ BGM_FRLG_MYSTERY_GIFT,
+ BGM_FRLG_DODRIO_BERRY_PICK,
+ BGM_FRLG_MT_EMBER,
+ BGM_FRLG_TEACHY_TV_EPISODE,
+ BGM_FRLG_SEVII_ISLANDS,
+ BGM_FRLG_TANOBY_RUINS,
+ BGM_FRLG_ISLAND_ONE,
+ BGM_FRLG_ISLAND_FOUR,
+ BGM_FRLG_ISLAND_SIX,
+ BGM_FRLG_FLUTE,
+ BGM_FRLG_BATTLE_DEOXYS,
+ BGM_FRLG_BATTLE_MEWTWO,
+ BGM_FRLG_BATTLE_LEGENDARY,
+ BGM_FRLG_LEADER_EYE,
+ BGM_FRLG_DEOXYS_EYE,
+ BGM_FRLG_TRAINER_TOWER,
+ BGM_FRLG_HALL_OF_FAME_PALLET_TOWN,
+ /*0x22E*/BGM_FRLG_TEACHY_TV,
+};
+
+#endif // GUARD_SONGS_H
diff --git a/include/sound.h b/include/sound.h
new file mode 100644
index 000000000..7d47b7456
--- /dev/null
+++ b/include/sound.h
@@ -0,0 +1,48 @@
+#ifndef GUARD_SOUND_H
+#define GUARD_SOUND_H
+
+void InitMapMusic(void);
+void MapMusicMain(void);
+void ResetMapMusic(void);
+u16 GetCurrentMapMusic(void);
+void PlayNewMapMusic(u16 songNum);
+void StopMapMusic(void);
+void FadeOutMapMusic(u8 speed);
+void FadeOutAndPlayNewMapMusic(u16 songNum, u8 speed);
+void FadeOutAndFadeInNewMapMusic(u16 songNum, u8 fadeOutSpeed, u8 fadeInSpeed);
+void FadeInNewMapMusic(u16 songNum, u8 speed);
+bool8 IsNotWaitingForBGMStop(void);
+void PlayFanfareByFanfareNum(u8 fanfareNum);
+bool8 WaitFanfare(bool8 stop);
+void StopFanfareByFanfareNum(u8 fanfareNum);
+void PlayFanfare(u16 songNum);
+bool8 IsFanfareTaskInactive(void);
+void FadeInNewBGM(u16 songNum, u8 speed);
+void FadeOutBGMTemporarily(u8 speed);
+bool8 IsBGMPausedOrStopped(void);
+void FadeInBGM(u8 speed);
+void FadeOutBGM(u8 speed);
+bool8 IsBGMStopped(void);
+void PlayCry1(u16 species, s8 pan);
+void PlayCry2(u16 species, s8 pan, s8 volume, u8 priority);
+void PlayCry3(u16 species, s8 pan, u8 mode);
+void PlayCry4(u16 species, s8 pan, u8 mode);
+void PlayCry5(u16 species, u8 mode);
+void PlayCry6(u16 species, s8 pan, u8 mode);
+void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode);
+bool8 IsCryFinished(void);
+void StopCryAndClearCrySongs(void);
+void StopCry(void);
+bool8 IsCryPlayingOrClearCrySongs(void);
+bool8 IsCryPlaying(void);
+void PlayBGM(u16 songNum);
+void PlaySE(u16 songNum);
+void PlaySE12WithPanning(u16 songNum, s8 pan);
+void PlaySE1WithPanning(u16 songNum, s8 pan);
+void PlaySE2WithPanning(u16 songNum, s8 pan);
+void SE12PanpotControl(s8 pan);
+bool8 IsSEPlaying(void);
+bool8 IsBGMPlaying(void);
+bool8 IsSpecialSEPlaying(void);
+
+#endif // GUARD_SOUND_H
diff --git a/include/sprite.h b/include/sprite.h
new file mode 100644
index 000000000..170d77c3f
--- /dev/null
+++ b/include/sprite.h
@@ -0,0 +1,302 @@
+#ifndef GUARD_SPRITE_H
+#define GUARD_SPRITE_H
+
+#define MAX_SPRITES 64
+
+struct SpriteSheet
+{
+ const u8 *data; // Raw uncompressed pixel data
+ u16 size;
+ u16 tag;
+};
+
+struct CompressedSpriteSheet
+{
+ const u8 *data; // LZ77 compressed pixel data
+ u16 size; // Uncompressed size of pixel data
+ u16 tag;
+};
+
+struct SpriteFrameImage
+{
+ const u8 *data;
+ u16 size;
+};
+
+#define obj_frame_tiles(ptr) {.data = (u8 *)ptr, .size = sizeof ptr}
+
+struct SpritePalette
+{
+ const u16 *data; // Raw uncompressed palette data
+ u16 tag;
+};
+
+struct CompressedSpritePalette
+{
+ const u8 *data; // LZ77 compressed palette data
+ u16 tag;
+};
+
+struct AnimFrameCmd
+{
+ // If the sprite has an array of images, this is the array index.
+ // If the sprite has a sheet, this is the tile offset.
+ u32 imageValue:16;
+
+ u32 duration:6;
+ u32 hFlip:1;
+ u32 vFlip:1;
+};
+
+struct AnimLoopCmd
+{
+ u32 type:16;
+ u32 count:6;
+};
+
+struct AnimJumpCmd
+{
+ u32 type:16;
+ u32 target:6;
+};
+
+// The first halfword of this union specifies the type of command.
+// If it -2, then it is a jump command. If it is -1, then it is the end of the script.
+// Otherwise, it is the imageValue for a frame command.
+union AnimCmd
+{
+ s16 type;
+ struct AnimFrameCmd frame;
+ struct AnimLoopCmd loop;
+ struct AnimJumpCmd jump;
+};
+
+#define ANIMCMD_FRAME(...) \
+ {.frame = {__VA_ARGS__}}
+#define ANIMCMD_LOOP(_count) \
+ {.loop = {.type = -3, .count = _count}}
+#define ANIMCMD_JUMP(_target) \
+ {.jump = {.type = -2, .target = _target}}
+#define ANIMCMD_END \
+ {.type = -1}
+
+struct AffineAnimFrameCmd
+{
+ s16 xScale;
+ s16 yScale;
+ u8 rotation;
+ u8 duration;
+};
+
+struct AffineAnimLoopCmd
+{
+ s16 type;
+ s16 count;
+};
+
+struct AffineAnimJumpCmd
+{
+ s16 type;
+ u16 target;
+};
+
+union AffineAnimCmd
+{
+ s16 type;
+ struct AffineAnimFrameCmd frame;
+ struct AffineAnimLoopCmd loop;
+ struct AffineAnimJumpCmd jump;
+};
+
+#define AFFINEANIMCMDTYPE_LOOP 0x7FFD
+#define AFFINEANIMCMDTYPE_JUMP 0x7FFE
+#define AFFINEANIMCMDTYPE_END 0x7FFF
+
+#define AFFINEANIMCMD_FRAME(_xScale, _yScale, _rotation, _duration) \
+ {.frame = {.xScale = _xScale, .yScale = _yScale, .rotation = _rotation, .duration = _duration}}
+#define AFFINEANIMCMD_LOOP(_count) \
+ {.loop = {.type = AFFINEANIMCMDTYPE_LOOP, .count = _count}}
+#define AFFINEANIMCMD_JUMP(_target) \
+ {.jump = {.type = AFFINEANIMCMDTYPE_JUMP, .target = _target}}
+#define AFFINEANIMCMD_END \
+ {.type = AFFINEANIMCMDTYPE_END}
+#define AFFINEANIMCMD_LOOP(_count) \
+ {.loop = {.type = AFFINEANIMCMDTYPE_LOOP, .count = _count}}
+#define AFFINEANIMCMD_JUMP(_target) \
+ {.jump = {.type = AFFINEANIMCMDTYPE_JUMP, .target = _target}}
+
+struct AffineAnimState
+{
+ u8 animNum;
+ u8 animCmdIndex;
+ u8 delayCounter;
+ u8 loopCounter;
+ s16 xScale;
+ s16 yScale;
+ u16 rotation;
+};
+
+enum
+{
+ SUBSPRITES_OFF,
+ SUBSPRITES_ON,
+ SUBSPRITES_IGNORE_PRIORITY, // on but priority is ignored
+};
+
+struct Subsprite
+{
+ s8 x; // was u16 in R/S
+ s8 y; // was u16 in R/S
+ u16 shape:2;
+ u16 size:2;
+ u16 tileOffset:10;
+ u16 priority:2;
+};
+
+struct SubspriteTable
+{
+ u8 subspriteCount;
+ const struct Subsprite *subsprites;
+};
+
+struct Sprite;
+
+struct SpriteTemplate
+{
+ u16 tileTag;
+ u16 paletteTag;
+ const struct OamData *oam;
+ const union AnimCmd *const *anims;
+ const struct SpriteFrameImage *images;
+ const union AffineAnimCmd *const *affineAnims;
+ void (*callback)(struct Sprite *);
+};
+
+struct Sprite
+{
+ /*0x00*/ struct OamData oam;
+ /*0x08*/ const union AnimCmd *const *anims;
+ /*0x0C*/ const struct SpriteFrameImage *images;
+ /*0x10*/ const union AffineAnimCmd *const *affineAnims;
+ /*0x14*/ const struct SpriteTemplate *template;
+ /*0x18*/ const struct SubspriteTable *subspriteTables;
+ /*0x1C*/ void (*callback)(struct Sprite *);
+
+ /*0x20*/ struct Coords16 pos1;
+ /*0x24*/ struct Coords16 pos2;
+ /*0x28*/ s8 centerToCornerVecX;
+ /*0x29*/ s8 centerToCornerVecY;
+
+ /*0x2A*/ u8 animNum;
+ /*0x2B*/ u8 animCmdIndex;
+ /*0x2C*/ u8 animDelayCounter:6;
+ u8 animPaused:1;
+ u8 affineAnimPaused:1;
+ /*0x2D*/ u8 animLoopCounter;
+
+ // general purpose data fields
+ /*0x2E*/ s16 data[8];
+
+ /*0x3E*/ u16 inUse:1; //1
+ u16 coordOffsetEnabled:1; //2
+ u16 invisible:1; //4
+ u16 flags_3:1; //8
+ u16 flags_4:1; //0x10
+ u16 flags_5:1; //0x20
+ u16 flags_6:1; //0x40
+ u16 flags_7:1; //0x80
+ /*0x3F*/ u16 hFlip:1; //1
+ u16 vFlip:1; //2
+ u16 animBeginning:1; //4
+ u16 affineAnimBeginning:1; //8
+ u16 animEnded:1; //0x10
+ u16 affineAnimEnded:1; //0x20
+ u16 usingSheet:1; //0x40
+ u16 flags_f:1; //0x80
+
+ /*0x40*/ u16 sheetTileStart;
+
+ /*0x42*/ u8 subspriteTableNum:6;
+ u8 subspriteMode:2;
+
+ /*0x43*/ u8 subpriority;
+};
+
+struct OamMatrix
+{
+ s16 a;
+ s16 b;
+ s16 c;
+ s16 d;
+};
+
+extern const struct OamData gDummyOamData;
+extern const union AnimCmd *const gDummySpriteAnimTable[];
+extern const union AffineAnimCmd *const gDummySpriteAffineAnimTable[];
+extern s16 gSpriteCoordOffsetX;
+extern s16 gSpriteCoordOffsetY;
+
+extern struct Sprite gSprites[];
+
+void ResetSpriteData(void);
+void AnimateSprites(void);
+void BuildOamBuffer(void);
+u8 CreateSprite(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority);
+u8 CreateSpriteAtEnd(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority);
+u8 CreateInvisibleSprite(void (*callback)(struct Sprite *));
+u8 CreateSpriteAndAnimate(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority);
+void DestroySprite(struct Sprite *sprite);
+void ResetOamRange(u8 a, u8 b);
+void LoadOam(void);
+void SetOamMatrix(u8 matrixNum, u16 a, u16 b, u16 c, u16 d);
+void CalcCenterToCornerVec(struct Sprite *sprite, u8 shape, u8 size, u8 affineMode);
+void SpriteCallbackDummy(struct Sprite *sprite);
+void ProcessSpriteCopyRequests(void);
+void RequestSpriteCopy(const u8 *src, u8 *dest, u16 size);
+void FreeSpriteTiles(struct Sprite *sprite);
+void FreeSpritePalette(struct Sprite *sprite);
+void FreeSpriteOamMatrix(struct Sprite *sprite);
+void DestroySpriteAndFreeResources(struct Sprite *sprite);
+void sub_800142C(u32 a1, u32 a2, u16 *a3, u16 a4, u32 a5);
+void AnimateSprite(struct Sprite *sprite);
+void StartSpriteAnim(struct Sprite *sprite, u8 animNum);
+void StartSpriteAnimIfDifferent(struct Sprite *sprite, u8 animNum);
+void SeekSpriteAnim(struct Sprite *sprite, u8 animCmdIndex);
+void StartSpriteAffineAnim(struct Sprite *sprite, u8 animNum);
+void StartSpriteAffineAnimIfDifferent(struct Sprite *sprite, u8 animNum);
+void ChangeSpriteAffineAnim(struct Sprite *sprite, u8 animNum);
+void ChangeSpriteAffineAnimIfDifferent(struct Sprite *sprite, u8 animNum);
+void SetSpriteSheetFrameTileNum(struct Sprite *sprite);
+u8 AllocOamMatrix(void);
+void FreeOamMatrix(u8 matrixNum);
+void InitSpriteAffineAnim(struct Sprite *sprite);
+void SetOamMatrixRotationScaling(u8 matrixNum, s16 xScale, s16 yScale, u16 rotation);
+u16 LoadSpriteSheet(const struct SpriteSheet *sheet);
+void LoadSpriteSheets(const struct SpriteSheet *sheets);
+u16 AllocTilesForSpriteSheet(struct SpriteSheet *sheet);
+void AllocTilesForSpriteSheets(struct SpriteSheet *sheets);
+void LoadTilesForSpriteSheet(const struct SpriteSheet *sheet);
+void LoadTilesForSpriteSheets(struct SpriteSheet *sheets);
+void FreeSpriteTilesByTag(u16 tag);
+void FreeSpriteTileRanges(void);
+u16 GetSpriteTileStartByTag(u16 tag);
+u16 GetSpriteTileTagByTileStart(u16 start);
+void RequestSpriteSheetCopy(const struct SpriteSheet *sheet);
+u16 LoadSpriteSheetDeferred(const struct SpriteSheet *sheet);
+void FreeAllSpritePalettes(void);
+u8 LoadSpritePalette(const struct SpritePalette *palette);
+void LoadSpritePalettes(const struct SpritePalette *palettes);
+u8 AllocSpritePalette(u16 tag);
+u8 IndexOfSpritePaletteTag(u16 tag);
+u16 GetSpritePaletteTagByPaletteNum(u8 paletteNum);
+void FreeSpritePaletteByTag(u16 tag);
+void SetSubspriteTables(struct Sprite *sprite, const struct SubspriteTable *subspriteTables);
+bool8 AddSpriteToOamBuffer(struct Sprite *object, u8 *oamIndex);
+bool8 AddSubspritesToOamBuffer(struct Sprite *sprite, struct OamData *destOam, u8 *oamIndex);
+void CopyToSprites(u8 *src);
+void CopyFromSprites(u8 *dest);
+u8 SpriteTileAllocBitmapOp(u16 bit, u8 op);
+void ClearSpriteCopyRequests(void);
+void ResetAffineAnimData(void);
+
+#endif //GUARD_SPRITE_H
diff --git a/include/start_menu.h b/include/start_menu.h
new file mode 100644
index 000000000..6c7cb3237
--- /dev/null
+++ b/include/start_menu.h
@@ -0,0 +1,6 @@
+#ifndef GUARD_START_MENU_H
+#define GUARD_START_MENU_H
+
+void AppendToList(u8* list, u8* pos, u8 newEntry);
+
+#endif // GUARD_START_MENU_H
diff --git a/include/string_util.h b/include/string_util.h
new file mode 100644
index 000000000..f26646082
--- /dev/null
+++ b/include/string_util.h
@@ -0,0 +1,42 @@
+#ifndef GUARD_STRING_UTIL_H
+#define GUARD_STRING_UTIL_H
+
+enum StringConvertMode
+{
+ STR_CONV_MODE_LEFT_ALIGN,
+ STR_CONV_MODE_RIGHT_ALIGN,
+ STR_CONV_MODE_LEADING_ZEROS
+};
+
+u8 *StringCopy10(u8 *dest, const u8 *src);
+u8 *StringGetEnd10(u8 *str);
+u8 *StringCopy7(u8 *dest, const u8 *src);
+u8 *StringCopy(u8 *dest, const u8 *src);
+u8 *StringAppend(u8 *dest, const u8 *src);
+u8 *StringCopyN(u8 *dest, const u8 *src, u8 n);
+u8 *StringAppendN(u8 *dest, const u8 *src, u8 n);
+u16 StringLength(const u8 *str);
+s32 StringCompare(const u8 *str1, const u8 *str2);
+s32 StringCompareN(const u8 *str1, const u8 *str2, u32 n);
+bool8 IsStringLengthAtLeast(const u8 *str, s32 n);
+u8 *ConvertIntToDecimalStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n);
+u8 *ConvertUIntToDecimalStringN(u8 *dest, u32 value, enum StringConvertMode mode, u8 n);
+u8 *ConvertIntToHexStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n);
+u8 *StringExpandPlaceholders(u8 *dest, const u8 *src);
+u8 *StringBraille(u8 *dest, const u8 *src);
+u8 *GetExpandedPlaceholder(u32 id);
+u8 *StringFill(u8 *dest, u8 c, u16 n);
+u8 *StringCopyPadded(u8 *dest, const u8 *src, u8 c, u16 n);
+u8 *StringFillWithTerminator(u8 *dest, u16 n);
+u8 *StringCopyN_Multibyte(u8 *dest, u8 *src, u32 n);
+u32 StringLength_Multibyte(u8 *str);
+u8 *WriteColorChangeControlCode(u8 *dest, u32 colorType, u8 color);
+bool32 IsStringJapanese(u8 *str);
+bool32 sub_800924C(u8 *str, s32 n);
+u8 GetExtCtrlCodeLength(u8 code);
+static const u8 *SkipExtCtrlCode(const u8 *s);
+s32 StringCompareWithoutExtCtrlCodes(const u8 *str1, const u8 *str2);
+void ConvertInternationalString(u8 *s, u8 language);
+void StripExtCtrlCodes(u8 *str);
+
+#endif // GUARD_STRING_UTIL_H
diff --git a/include/strings.h b/include/strings.h
new file mode 100644
index 000000000..8b218e1e9
--- /dev/null
+++ b/include/strings.h
@@ -0,0 +1,91 @@
+#ifndef GUARD_STRINGS_H
+#define GUARD_STRINGS_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+
+extern const u8 gText_FromSpace[];
+extern const u8 gText_Lv50[];
+extern const u8 gText_OpenLevel[];
+extern const u8 gText_Mom[];
+extern const u8 gText_Dad[];
+extern const u8 gText_Cool[];
+extern const u8 gText_Beauty[];
+extern const u8 gText_Cute[];
+extern const u8 gText_Smart[];
+extern const u8 gText_Tough[];
+extern const u8 gText_Single[];
+extern const u8 gText_Double[];
+extern const u8 gText_Spicy2[];
+extern const u8 gText_Dry2[];
+extern const u8 gText_Sweet2[];
+extern const u8 gText_Bitter2[];
+extern const u8 gText_Sour2[];
+extern const u8 gText_Excellent[];
+extern const u8 gText_VeryGood[];
+extern const u8 gText_Good[];
+extern const u8 gText_SoSo[];
+extern const u8 gText_Bad[];
+extern const u8 gText_TheWorst[];
+extern const u8 gText_Slots[];
+extern const u8 gText_Roulette[];
+extern const u8 gText_Jackpot[];
+extern const u8 gText_First[];
+extern const u8 gText_Second[];
+extern const u8 gText_Third[];
+extern const u8 gText_NoDecorations[];
+extern const u8 gText_NoDecorationsInUse[];
+extern const u8 gText_Exit[];
+extern const u8 gText_Cancel[];
+extern const u8 gText_Color161Shadow161[];
+extern const u8 gText_GoBackPrevMenu[];
+extern const u8 gText_CantPlaceInRoom[];
+extern const u8 gText_NoMoreDecorations[];
+extern const u8 gText_NoMoreDecorations2[];
+extern const u8 gText_InUseAlready[];
+extern const u8 gText_CancelDecorating[];
+extern const u8 gText_PlaceItHere[];
+extern const u8 gText_CantBePlacedHere[];
+extern const u8 gText_DecorationReturnedToPC[];
+extern const u8 gText_StopPuttingAwayDecorations[];
+extern const u8 gText_ReturnDecorationToPC[];
+extern const u8 gText_NoDecorationHere[];
+extern const u8 gText_DecorationWillBeDiscarded[];
+extern const u8 gText_CantThrowAwayInUse[];
+extern const u8 gText_DecorationThrownAway[];
+extern const u8 gText_Desk[];
+extern const u8 gText_Chair[];
+extern const u8 gText_Plant[];
+extern const u8 gText_Ornament[];
+extern const u8 gText_Mat[];
+extern const u8 gText_Poster[];
+extern const u8 gText_PutOutSelectedDecorItem[];
+extern const u8 gText_StoreChosenDecorInPC[];
+extern const u8 gText_ThrowAwayUnwantedDecors[];
+extern const u8 gText_Doll[];
+extern const u8 gText_Cushion[];
+extern const u8 gText_Decorate[];
+extern const u8 gText_PutAway[];
+extern const u8 gText_Toss2[];
+extern const u8 gText_Hoenn[];
+extern const u8 gText_Ferry[];
+extern const u8 gText_SecretBase[];
+extern const u8 gText_Hideout[];
+extern const u8 gText_FlyToWhere[];
+extern const u8 gText_PokemonLeague[];
+extern const u8 gText_PokemonCenter[];
+extern const u8 gText_ApostropheSBase[];
+extern const u8 gText_NoRegistry[];
+extern const u8 gText_OkayToDeleteFromRegistry[];
+extern const u8 gText_RegisteredDataDeleted[];
+extern const u8 gUnknown_085EA79D[];
+extern const u8 gText_Confirm3[];
+extern const u8 gText_Cancel4[];
+extern const u8 gText_IsThisTheCorrectTime[];
+extern const u8 gText_PkmnFainted3[];
+extern const u8 gText_Coins[];
+
+#endif //GUARD_STRINGS_H
diff --git a/include/task.h b/include/task.h
new file mode 100644
index 000000000..a199ba128
--- /dev/null
+++ b/include/task.h
@@ -0,0 +1,33 @@
+#ifndef GUARD_TASK_H
+#define GUARD_TASK_H
+
+#define NUM_TASKS 16
+
+typedef void (*TaskFunc)(u8 taskId);
+
+struct Task
+{
+ TaskFunc func;
+ bool8 isActive;
+ u8 prev;
+ u8 next;
+ u8 priority;
+ s16 data[16];
+};
+
+extern struct Task gTasks[];
+
+void ResetTasks(void);
+u8 CreateTask(TaskFunc func, u8 priority);
+void DestroyTask(u8 taskId);
+void RunTasks(void);
+void TaskDummy(u8 taskId);
+void SetTaskFuncWithFollowupFunc(u8 taskId, TaskFunc func, TaskFunc followupFunc);
+void SwitchTaskToFollowupFunc(u8 taskId);
+bool8 FuncIsActiveTask(TaskFunc func);
+u8 FindTaskIdByFunc(TaskFunc func);
+u8 GetTaskCount(void);
+void SetWordTaskArg(u8 taskId, u8 dataElem, u32 value);
+u32 GetWordTaskArg(u8 taskId, u8 dataElem);
+
+#endif // GUARD_TASK_H
diff --git a/include/text.h b/include/text.h
new file mode 100644
index 000000000..289c7d2b5
--- /dev/null
+++ b/include/text.h
@@ -0,0 +1,255 @@
+#ifndef GUARD_TEXT_H
+#define GUARD_TEXT_H
+
+#define CHAR_SPACE 0x00
+#define CHAR_0 0xA1
+#define CHAR_QUESTION_MARK 0xAC
+#define CHAR_PERIOD 0xAD
+#define CHAR_HYPHEN 0xAE
+#define CHAR_ELLIPSIS 0xB0
+#define CHAR_MALE 0xB5
+#define CHAR_FEMALE 0xB6
+#define CHAR_CURRENCY 0xB7
+#define CHAR_COMMA 0xB8
+#define CHAR_MULT_SIGN 0xB9
+#define CHAR_SLASH 0xBA
+#define CHAR_A 0xBB
+#define CHAR_B 0xBC
+#define CHAR_C 0xBD
+#define CHAR_D 0xBE
+#define CHAR_E 0xBF
+#define CHAR_F 0xC0
+#define CHAR_G 0xC1
+#define CHAR_H 0xC2
+#define CHAR_I 0xC3
+#define CHAR_J 0xC4
+#define CHAR_K 0xC5
+#define CHAR_L 0xC6
+#define CHAR_M 0xC7
+#define CHAR_N 0xC8
+#define CHAR_O 0xC9
+#define CHAR_P 0xCA
+#define CHAR_Q 0xCB
+#define CHAR_R 0xCC
+#define CHAR_S 0xCD
+#define CHAR_T 0xCE
+#define CHAR_U 0xCF
+#define CHAR_V 0xD0
+#define CHAR_W 0xD1
+#define CHAR_X 0xD2
+#define CHAR_Y 0xD3
+#define CHAR_Z 0xD4
+#define CHAR_a 0xD5
+#define CHAR_b 0xD6
+#define CHAR_c 0xD7
+#define CHAR_d 0xD8
+#define CHAR_e 0xD9
+#define CHAR_f 0xDA
+#define CHAR_g 0xDB
+#define CHAR_h 0xDC
+#define CHAR_i 0xDD
+#define CHAR_j 0xDE
+#define CHAR_k 0xDF
+#define CHAR_l 0xE0
+#define CHAR_m 0xE1
+#define CHAR_n 0xE2
+#define CHAR_o 0xE3
+#define CHAR_p 0xE4
+#define CHAR_q 0xE5
+#define CHAR_r 0xE6
+#define CHAR_s 0xE7
+#define CHAR_t 0xE8
+#define CHAR_u 0xE9
+#define CHAR_v 0xEA
+#define CHAR_w 0xEB
+#define CHAR_x 0xEC
+#define CHAR_y 0xED
+#define CHAR_z 0xEE
+#define CHAR_SPECIAL_F7 0xF7
+#define CHAR_SPECIAL_F9 0xF9
+#define CHAR_COLON 0xF0
+#define CHAR_PROMPT_SCROLL 0xFA // waits for button press and scrolls dialog
+#define CHAR_PROMPT_CLEAR 0xFB // waits for button press and clears dialog
+#define EXT_CTRL_CODE_BEGIN 0xFC // extended control code
+#define PLACEHOLDER_BEGIN 0xFD // string placeholder
+#define CHAR_NEWLINE 0xFE
+#define EOS 0xFF // end of string
+
+#define TEXT_COLOR_TRANSPARENT 0x0
+#define TEXT_COLOR_WHITE 0x1
+#define TEXT_COLOR_DARK_GREY 0x2
+
+// battle placeholders are located in battle_message.h
+
+#define EXT_CTRL_CODE_JPN 0x15
+#define EXT_CTRL_CODE_ENG 0x16
+
+#define NUM_TEXT_PRINTERS 32
+
+#define TEXT_SPEED_FF 0xFF
+
+struct TextPrinterSubStruct
+{
+ u8 font_type:4; // 0x14
+ u8 font_type_upper:1;
+ u8 font_type_5:3;
+ u8 field_1:5;
+ u8 field_1_upmid:2;
+ u8 field_1_top:1;
+ u8 frames_visible_counter;
+ u8 field_3;
+ u8 field_4; // 0x18
+ u8 field_5;
+ u8 field_6;
+ u8 active;
+};
+
+struct TextSubPrinter // TODO: Better name
+{
+ const u8* current_text_offset;
+ u8 windowId;
+ u8 fontId;
+ u8 x;
+ u8 y;
+ u8 currentX; // 0x8
+ u8 currentY;
+ u8 letterSpacing;
+ u8 lineSpacing;
+ u8 fontColor_l:4; // 0xC
+ u8 fontColor_h:4;
+ u8 bgColor:4;
+ u8 shadowColor:4;
+};
+
+struct TextPrinter
+{
+ struct TextSubPrinter subPrinter;
+
+ void (*callback)(struct TextSubPrinter *, u16); // 0x10
+
+ union {
+ struct TextPrinterSubStruct sub;
+
+ u8 sub_fields[8];
+ } sub_union;
+
+ u8 state; // 0x1C
+ u8 text_speed;
+ u8 delayCounter;
+ u8 scrollDistance;
+ u8 minLetterSpacing; // 0x20
+ u8 japanese;
+};
+
+struct FontInfo
+{
+ u16 (*fontFunction)(struct TextPrinter *x);
+ u8 maxLetterWidth;
+ u8 maxLetterHeight;
+ u8 letterSpacing;
+ u8 lineSpacing;
+ u8 fontColor_l:4;
+ u8 fontColor_h:4;
+ u8 bgColor:4;
+ u8 shadowColor:4;
+};
+
+extern const struct FontInfo *gFonts;
+
+struct GlyphWidthFunc
+{
+ u32 font_id;
+ u32 (*func)(u16 glyphId, bool32 isJapanese);
+};
+
+struct KeypadIcon
+{
+ u16 tile_offset;
+ u8 width;
+ u8 height;
+};
+
+typedef struct {
+ u8 flag_0:1;
+ u8 flag_1:1;
+ u8 flag_2:1;
+ u8 flag_3:1;
+} TextFlags;
+
+extern TextFlags gTextFlags;
+
+struct __attribute__((packed)) TextColor
+{
+ u8 fgColor;
+ u8 bgColor;
+ u8 shadowColor;
+};
+
+extern u8 gStringVar1[];
+extern u8 gStringVar2[];
+extern u8 gStringVar3[];
+extern u8 gStringVar4[];
+
+u8 gUnknown_03002F84;
+u8 gUnknown_03002F90[0x20];
+u8 gUnknown_03002FB0[0x20];
+u8 gUnknown_03002FD0[0x20];
+u8 gUnknown_03002FF0[0x20];
+u8 gGlyphDimensions[0x2];
+
+void SetFontsPointer(const struct FontInfo *fonts);
+void DeactivateAllTextPrinters(void);
+u16 PrintTextOnWindow(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextSubPrinter *, u16));
+bool16 AddTextPrinter(struct TextSubPrinter *textSubPrinter, u8 speed, void (*callback)(struct TextSubPrinter *, u16));
+void RunTextPrinters(void);
+bool16 IsTextPrinterActive(u8 id);
+u32 RenderFont(struct TextPrinter *textPrinter);
+void GenerateFontHalfRowLookupTable(u8 fgColor, u8 bgColor, u8 shadowColor);
+void SaveTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor);
+void RestoreTextColors(u8 *fgColor, u8 *bgColor, u8 *shadowColor);
+void DecompressGlyphTile(const u16 *src, u16 *dest);
+u8 GetLastTextColor(u8 colorType);
+void CopyGlyphToWindow(struct TextPrinter *x);
+void ClearTextSpan(struct TextPrinter *textPrinter, u32 width);
+
+u16 Font0Func(struct TextPrinter *textPrinter);
+u16 Font1Func(struct TextPrinter *textPrinter);
+u16 Font2Func(struct TextPrinter *textPrinter);
+u16 Font3Func(struct TextPrinter *textPrinter);
+u16 Font4Func(struct TextPrinter *textPrinter);
+u16 Font5Func(struct TextPrinter *textPrinter);
+u16 Font7Func(struct TextPrinter *textPrinter);
+u16 Font8Func(struct TextPrinter *textPrinter);
+
+void TextPrinterInitDownArrowCounters(struct TextPrinter *textPrinter);
+void TextPrinterDrawDownArrow(struct TextPrinter *textPrinter);
+void TextPrinterClearDownArrow(struct TextPrinter *textPrinter);
+bool8 TextPrinterWaitAutoMode(struct TextPrinter *textPrinter);
+bool16 TextPrinterWaitWithDownArrow(struct TextPrinter *textPrinter);
+bool16 TextPrinterWait(struct TextPrinter *textPrinter);
+void DrawDownArrow(u8 windowId, u16 x, u16 y, u8 bgColor, bool8 drawArrow, u8 *counter, u8 *yCoordIndex);
+u16 RenderText(struct TextPrinter *textPrinter);
+u32 GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 letterSpacing);
+u32 (*GetFontWidthFunc(u8 glyphId))(u16, bool32);
+u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing);
+u8 RenderTextFont9(u8 *pixels, u8 fontId, u8 *str);
+u8 DrawKeypadIcon(u8 windowId, u8 keypadIconId, u16 x, u16 y);
+u8 GetKeypadIconTileOffset(u8 keypadIconId);
+u8 GetKeypadIconWidth(u8 keypadIconId);
+u8 GetKeypadIconHeight(u8 keypadIconId);
+void SetDefaultFontsPointer(void);
+u8 GetFontAttribute(u8 fontId, u8 attributeId);
+u8 GetMenuCursorDimensionByFont(u8 fontId, u8 whichDimension);
+void DecompressGlyphFont0(u16 glyphId, bool32 isJapanese);
+u32 GetGlyphWidthFont0(u16 glyphId, bool32 isJapanese);
+void DecompressGlyphFont7(u16 glyphId, bool32 isJapanese);
+u32 GetGlyphWidthFont7(u16 glyphId, bool32 isJapanese);
+void DecompressGlyphFont8(u16 glyphId, bool32 isJapanese);
+u32 GetGlyphWidthFont8(u16 glyphId, bool32 isJapanese);
+void DecompressGlyphFont2(u16 glyphId, bool32 isJapanese);
+u32 GetGlyphWidthFont2(u16 glyphId, bool32 isJapanese);
+void DecompressGlyphFont1(u16 glyphId, bool32 isJapanese);
+u32 GetGlyphWidthFont1(u16 glyphId, bool32 isJapanese);
+void DecompressGlyphFont9(u16 glyphId);
+
+#endif // GUARD_TEXT_H
diff --git a/include/text_window.h b/include/text_window.h
new file mode 100644
index 000000000..da3fb301e
--- /dev/null
+++ b/include/text_window.h
@@ -0,0 +1,22 @@
+#ifndef GUARD_TEXT_WINDOW_H
+#define GUARD_TEXT_WINDOW_H
+
+struct TilesPal
+{
+ u32* tiles;
+ u16* pal;
+};
+
+const struct TilesPal* sub_8098758(u8 id);
+void copy_textbox_border_tile_patterns_to_vram(u8 windowId, u16 destOffset, u8 palOffset);
+void sub_809882C(u8 windowId, u16 destOffset, u8 palOffset);
+void sub_80987D4(u8 windowId, u8 frameId, u16 destOffset, u8 palOffset);
+void box_border_load_tiles_and_pal(u8 windowId, u16 destOffset, u8 palOffset);
+void sub_8098858(u8 windowId, u16 tileNum, u8 palNum);
+void sub_80989E0(u8 windowId, u16 tileNum, u8 palNum);
+void rbox_fill_rectangle(u8 windowId);
+const u16* stdpal_get(u8 id);
+const u16* GetOverworldTextboxPalettePtr(void);
+void sub_8098C6C(u8 bg, u16 destOffset, u8 palOffset);
+
+#endif // GUARD_TEXT_WINDOW_H
diff --git a/include/tilesets.h b/include/tilesets.h
new file mode 100644
index 000000000..70609c046
--- /dev/null
+++ b/include/tilesets.h
@@ -0,0 +1,13 @@
+#ifndef GUARD_tilesets_H
+#define GUARD_tilesets_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+
+extern struct Tileset *gTilesetPointer_SecretBase;
+extern struct Tileset *gTilesetPointer_SecretBaseRedCave;
+
+#endif //GUARD_tilesets_H
diff --git a/include/trainer_classes.h b/include/trainer_classes.h
new file mode 100644
index 000000000..e5e26b359
--- /dev/null
+++ b/include/trainer_classes.h
@@ -0,0 +1,74 @@
+#ifndef GUARD_TRAINER_CLASSES_H
+#define GUARD_TRAINER_CLASSES_H
+
+enum
+{
+ CLASS_PKMN_TRAINER0, // 0
+ CLASS_PKMN_TRAINER1, // 1
+ CLASS_HIKER, // 2
+ CLASS_TEAM_AQUA, // 3
+ CLASS_PKMN_BREEDER, // 4
+ CLASS_COOLTRAINER, // 5
+ CLASS_BIRDKEEPER, // 6
+ CLASS_COLLECTOR, // 7
+ CLASS_SWIMMER_MALE, // 8
+ CLASS_TEAM_MAGMA, // 9
+ CLASS_EXPERT, // 0xA
+ CLASS_AQUA_ADMIN, // 0xB
+ CLASS_BLACK_BELT, // 0xC
+ CLASS_AQUA_LEADER, // 0xD
+ CLASS_HEX_MANIAC, // 0xE
+ CLASS_AROMA_LADY, // 0xF
+ CLASS_RUIN_MANIAC, // 0x10
+ CLASS_INTERVIEWER, // 0x11
+ CLASS_TUBER_FEMALE, // 0x12
+ CLASS_TUBER_MALE, // 0x13
+ CLASS_LADY, // 0x14
+ CLASS_BEAUTY, // 0x15
+ CLASS_RICH_BOY, // 0x16
+ CLASS_POKEMANIAC, // 0x17
+ CLASS_GUITARIST, // 0x18
+ CLASS_KINDLER, // 0x19
+ CLASS_CAMPER, // 0x1A
+ CLASS_PICKNICKER, // 0x1B
+ CLASS_BUG_MANIAC, // 0x1C
+ CLASS_PSYCHIC, // 0x1D
+ CLASS_GENTLEMAN, // 0x1E
+ CLASS_ELITE_FOUR, // 0x1F
+ CLASS_LEADER, // 0x20
+ CLASS_SCHOOL_KID, // 0x21
+ CLASS_SCHOOL_SR_JR, // 0x22
+ CLASS_WINSTRATE, // 0x23
+ CLASS_POKE_FAN, // 0x24
+ CLASS_YOUNGSTER, // 0x25
+ CLASS_CHAMPION, // 0x26
+ CLASS_FISHERMAN, // 0x27
+ CLASS_TRIATHLETE, // 0x28
+ CLASS_DRAGON_TAMER, // 0x29
+ CLASS_NINJA_BOY, // 0x2A
+ CLASS_BATTLE_GIRL, // 0x2B
+ CLASS_PARASOL_LADY, // 0x2C
+ CLASS_SWIMMER_FEMALE, // 0x2D
+ CLASS_TWINS, // 0x2E
+ CLASS_SAILOR, // 0x2F
+ CLASS_COOLTRAINER_2, // 0x30
+ CLASS_MAGMA_ADMIN, // 0x31
+ CLASS_PKMN_TRAINER_RIVAL, // 0x32
+ CLASS_BUG_CATCHER, // 0x33
+ CLASS_PKMN_RANGER, // 0x34
+ CLASS_MAGMA_LEADER, // 0x35
+ CLASS_LASS, // 0x36
+ CLASS_YOUNG_COUPLE, // 0x37
+ CLASS_OLD_COUPLE, // 0x38
+ CLASS_SIS_AND_BRO, // 0x39
+ CLASS_SALON_MAIDEN, // 0x3A
+ CLASS_DOME_ACE, // 0x3B
+ CLASS_PALACE_MAVEN, // 0x3C
+ CLASS_ARENA_TYCOON, // 0x3D
+ CLASS_FACTORY_HEAD, // 0x3E
+ CLASS_PIKE_QUEEN, // 0x3F
+ CLASS_PYRAMID_KING, // 0x40
+ CLASS_PKMN_TRAINER2, // 0x41
+};
+
+#endif // GUARD_TRAINER_CLASSES_H
diff --git a/include/trainer_front_sprites.h b/include/trainer_front_sprites.h
new file mode 100644
index 000000000..3259bec88
--- /dev/null
+++ b/include/trainer_front_sprites.h
@@ -0,0 +1,101 @@
+#ifndef GUARD_TRAINER_FRONT_SPRITES_H
+#define GUARD_TRAINER_FRONT_SPRITES_H
+
+enum
+{
+ TRAINER_FRONT_PIC_HIKER,
+ TRAINER_FRONT_PIC_AQUA_GRUNT_M,
+ TRAINER_FRONT_PIC_PKMN_BREEDER_F,
+ TRAINER_FRONT_PIC_COOLTRAINER_M,
+ TRAINER_FRONT_PIC_BIRD_KEEPER,
+ TRAINER_FRONT_PIC_COLLECTOR,
+ TRAINER_FRONT_PIC_AQUA_GRUNT_F,
+ TRAINER_FRONT_PIC_SWIMMER_M,
+ TRAINER_FRONT_PIC_MAGMA_GRUNT_M,
+ TRAINER_FRONT_PIC_EXPERT_M,
+ TRAINER_FRONT_PIC_AQUA_ADMIN_M,
+ TRAINER_FRONT_PIC_BLACK_BELT,
+ TRAINER_FRONT_PIC_AQUA_ADMIN_F,
+ TRAINER_FRONT_PIC_AQUA_LEADER,
+ TRAINER_FRONT_PIC_HEX_MANIAC,
+ TRAINER_FRONT_PIC_AROMA_LADY,
+ TRAINER_FRONT_PIC_RUIN_MANIAC,
+ TRAINER_FRONT_PIC_INTERVIEWER,
+ TRAINER_FRONT_PIC_TUBER_F,
+ TRAINER_FRONT_PIC_TUBER_M,
+ TRAINER_FRONT_PIC_COOLTRAINER_F,
+ TRAINER_FRONT_PIC_LADY,
+ TRAINER_FRONT_PIC_BEAUTY,
+ TRAINER_FRONT_PIC_RICH_BOY,
+ TRAINER_FRONT_PIC_EXPERT_F,
+ TRAINER_FRONT_PIC_POKE_MANIAC,
+ TRAINER_FRONT_PIC_MAGMA_GRUNT_F,
+ TRAINER_FRONT_PIC_GUITARIST,
+ TRAINER_FRONT_PIC_KINDLER,
+ TRAINER_FRONT_PIC_CAMPER,
+ TRAINER_FRONT_PIC_PICNICKER,
+ TRAINER_FRONT_PIC_BUG_MANIAC,
+ TRAINER_FRONT_PIC_PKMN_BREEDER_M,
+ TRAINER_FRONT_PIC_PSYCHIC_M,
+ TRAINER_FRONT_PIC_PSYCHIC_F,
+ TRAINER_FRONT_PIC_GENTLEMAN,
+ TRAINER_FRONT_PIC_SIDNEY,
+ TRAINER_FRONT_PIC_PHOEBE,
+ TRAINER_FRONT_PIC_GLACIA,
+ TRAINER_FRONT_PIC_DRAKE,
+ TRAINER_FRONT_PIC_ROXANNE,
+ TRAINER_FRONT_PIC_BRAWLY,
+ TRAINER_FRONT_PIC_WATTSON,
+ TRAINER_FRONT_PIC_FLANNERY,
+ TRAINER_FRONT_PIC_NORMAN,
+ TRAINER_FRONT_PIC_WINONA,
+ TRAINER_FRONT_PIC_TATE_LIZA,
+ TRAINER_FRONT_PIC_JUAN,
+ TRAINER_FRONT_PIC_SCHOOL_KID_M,
+ TRAINER_FRONT_PIC_SCHOOL_KID_F,
+ TRAINER_FRONT_PIC_SR_JR,
+ TRAINER_FRONT_PIC_POKÉFAN_M,
+ TRAINER_FRONT_PIC_POKÉFAN_F,
+ TRAINER_FRONT_PIC_YOUNGSTER,
+ TRAINER_FRONT_PIC_WALLACE,
+ TRAINER_FRONT_PIC_FISHERMAN,
+ TRAINER_FRONT_PIC_TRIATHLETE_BIKER_M,
+ TRAINER_FRONT_PIC_TRIATHLETE_BIKER_F,
+ TRAINER_FRONT_PIC_TRIATHLETE_JOGGER_M,
+ TRAINER_FRONT_PIC_TRIATHLETE_JOGGER_F,
+ TRAINER_FRONT_PIC_TRIATHLETE_SWIMMER_M,
+ TRAINER_FRONT_PIC_TRIATHLETE_SWIMMER_F,
+ TRAINER_FRONT_PIC_DRAGON_TAMER,
+ TRAINER_FRONT_PIC_NINJA_BOY,
+ TRAINER_FRONT_PIC_BATTLE_GIRL,
+ TRAINER_FRONT_PIC_PARASOL_LADY,
+ TRAINER_FRONT_PIC_SWIMMER_F,
+ TRAINER_FRONT_PIC_TWINS,
+ TRAINER_FRONT_PIC_SAILOR,
+ TRAINER_FRONT_PIC_MAGMA_ADMIN_M,
+ TRAINER_FRONT_PIC_WALLY,
+ TRAINER_FRONT_PIC_BRENDAN_E,
+ TRAINER_FRONT_PIC_MAY_E,
+ TRAINER_FRONT_PIC_BUG_CATCHER,
+ TRAINER_FRONT_PIC_PKMN_RANGER_M,
+ TRAINER_FRONT_PIC_PKMN_RANGER_F,
+ TRAINER_FRONT_PIC_MAGMA_LEADER,
+ TRAINER_FRONT_PIC_LASS,
+ TRAINER_FRONT_PIC_YOUNG_COUPLE,
+ TRAINER_FRONT_PIC_OLD_COUPLE,
+ TRAINER_FRONT_PIC_SIS_AND_BRO,
+ TRAINER_FRONT_PIC_STEVEN,
+ TRAINER_FRONT_PIC_ANABEL,
+ TRAINER_FRONT_PIC_TUCKER,
+ TRAINER_FRONT_PIC_SPENSER,
+ TRAINER_FRONT_PIC_GRETA,
+ TRAINER_FRONT_PIC_NOLAND,
+ TRAINER_FRONT_PIC_LUCY,
+ TRAINER_FRONT_PIC_BRANDON,
+ TRAINER_FRONT_PIC_RED,
+ TRAINER_FRONT_PIC_LEAF,
+ TRAINER_FRONT_PIC_BRENDAN_RS,
+ TRAINER_FRONT_PIC_MAY_RS
+};
+
+#endif // GUARD_TRAINER_FRONT_SPRITES_H
diff --git a/include/trainer_ids.h b/include/trainer_ids.h
new file mode 100644
index 000000000..65c80187f
--- /dev/null
+++ b/include/trainer_ids.h
@@ -0,0 +1,7 @@
+#ifndef GUARD_TRAINER_IDS_H
+#define GUARD_TRAINER_IDS_H
+
+#define NO_OF_TRAINERS 854
+#define TRAINER_ID_STEVEN 804
+
+#endif // GUARD_TRAINER_IDS_H
diff --git a/include/trainer_see.h b/include/trainer_see.h
new file mode 100644
index 000000000..ab035d9f8
--- /dev/null
+++ b/include/trainer_see.h
@@ -0,0 +1,8 @@
+#ifndef GUARD_TRAINER_SEE_H
+#define GUARD_TRAINER_SEE_H
+
+void sub_80B4578(struct MapObject *);
+u8 sub_80B47BC(void);
+void sub_8155D78(struct MapObject *);
+
+#endif //GUARD_TRAINER_SEE_H
diff --git a/include/trig.h b/include/trig.h
new file mode 100644
index 000000000..a2f98a3e6
--- /dev/null
+++ b/include/trig.h
@@ -0,0 +1,11 @@
+#ifndef GUARD_TRIG_H
+#define GUARD_TRIG_H
+
+extern const s16 gSineTable[];
+
+s16 Sin(s16 index, s16 amplitude);
+s16 Cos(s16 index, s16 amplitude);
+s16 Sin2(u16 angle);
+s16 Cos2(u16 angle);
+
+#endif // GUARD_TRIG_H
diff --git a/include/unk_text_util.h b/include/unk_text_util.h
new file mode 100644
index 000000000..72243a90e
--- /dev/null
+++ b/include/unk_text_util.h
@@ -0,0 +1,9 @@
+#ifndef GUARD_UNK_TEXT_UTIL_H
+#define GUARD_UNK_TEXT_UTIL_H
+
+void UnkTextUtil_Reset(void);
+void UnkTextUtil_SetPtrI(u8 idx, const u8 *ptr);
+u8 *UnkTextUtil_StringExpandPlaceholders(u8 *dest, const u8 *src);
+const u8 *UnkTextUtil_GetPtrI(u8 idx);
+
+#endif //GUARD_UNK_TEXT_UTIL_H
diff --git a/include/unknown_task.h b/include/unknown_task.h
new file mode 100644
index 000000000..9c6968c30
--- /dev/null
+++ b/include/unknown_task.h
@@ -0,0 +1,22 @@
+#ifndef GUARD_unknown_task_H
+#define GUARD_unknown_task_H
+
+// Exported type declarations
+struct UnknownTaskStruct
+{
+ volatile void *dest;
+ u32 control;
+ u8 unk8;
+ u8 unk9;
+};
+
+extern struct UnknownTaskStruct gUnknown_0831AC70;
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+void remove_some_task(void);
+void sub_80BA038(struct UnknownTaskStruct arg0);
+void sub_80BA0A8(void);
+
+#endif // GUARD_unknown_task_H
diff --git a/include/util.h b/include/util.h
new file mode 100644
index 000000000..63887b13f
--- /dev/null
+++ b/include/util.h
@@ -0,0 +1,17 @@
+#ifndef GUARD_UTIL_H
+#define GUARD_UTIL_H
+
+#include "sprite.h"
+
+extern const u8 gMiscBlank_Gfx[]; // unused in Emerald
+extern const u32 gBitTable[];
+
+u8 CreateInvisibleSpriteWithCallback(void (*)(struct Sprite *));
+void StoreWordInTwoHalfwords(u16 *, u32);
+void LoadWordFromTwoHalfwords(u16 *, u32 *);
+int CountTrailingZeroBits(u32 value);
+u16 CalcCRC16(u8 *data, s32 length);
+u16 CalcCRC16WithTable(u8 *data, u32 length);
+u32 CalcByteArraySum(const u8* data, u32 length);
+
+#endif // GUARD_UTIL_H
diff --git a/include/wild_encounter.h b/include/wild_encounter.h
new file mode 100644
index 000000000..55bbaa7dd
--- /dev/null
+++ b/include/wild_encounter.h
@@ -0,0 +1,44 @@
+#ifndef GUARD_WILD_ENCOUNTER_H
+#define GUARD_WILD_ENCOUNTER_H
+
+#define LAND_WILD_COUNT 12
+#define WATER_WILD_COUNT 5
+#define ROCK_WILD_COUNT 5
+#define FISH_WILD_COUNT 10
+
+struct WildPokemon
+{
+ u8 minLevel;
+ u8 maxLevel;
+ u16 species;
+};
+
+struct WildPokemonInfo
+{
+ u8 encounterRate;
+ const struct WildPokemon *wildPokemon;
+};
+
+struct WildPokemonHeader
+{
+ u8 mapGroup;
+ u8 mapNum;
+ const struct WildPokemonInfo *landMonsInfo;
+ const struct WildPokemonInfo *waterMonsInfo;
+ const struct WildPokemonInfo *rockSmashMonsInfo;
+ const struct WildPokemonInfo *fishingMonsInfo;
+};
+
+extern const struct WildPokemonHeader gWildMonHeaders[];
+
+void DisableWildEncounters(bool8 disabled);
+bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavior);
+void ScrSpecial_RockSmashWildEncounter(void);
+bool8 SweetScentWildEncounter(void);
+bool8 DoesCurrentMapHaveFishingMons(void);
+void FishingWildEncounter(u8 rod);
+u16 GetLocalWildMon(bool8 *isWaterMon);
+u16 GetLocalWaterMon(void);
+bool8 UpdateRepelCounter(void);
+
+#endif // GUARD_WILD_ENCOUNTER_H
diff --git a/include/window.h b/include/window.h
new file mode 100644
index 000000000..b630cd316
--- /dev/null
+++ b/include/window.h
@@ -0,0 +1,72 @@
+#ifndef GUARD_WINDOW_H
+#define GUARD_WINDOW_H
+
+enum
+{
+ WINDOW_PRIORITY,
+ WINDOW_TILEMAP_LEFT,
+ WINDOW_TILEMAP_TOP,
+ WINDOW_WIDTH,
+ WINDOW_HEIGHT,
+ WINDOW_PALETTE_NUM,
+ WINDOW_BASE_BLOCK,
+ WINDOW_TILE_DATA
+};
+
+struct WindowTemplate
+{
+ u8 priority;
+ u8 tilemapLeft;
+ u8 tilemapTop;
+ u8 width;
+ u8 height;
+ u8 paletteNum;
+ u16 baseBlock;
+};
+
+#define DUMMY_WIN_TEMPLATE \
+{ \
+ 0xFF, \
+ 0, \
+ 0, \
+ 0, \
+ 0, \
+ 0, \
+ 0, \
+}
+
+struct Window
+{
+ struct WindowTemplate window;
+ u8 *tileData;
+};
+
+bool16 InitWindows(const struct WindowTemplate *templates);
+u16 AddWindow(const struct WindowTemplate *template);
+int AddWindowWithoutTileMap(const struct WindowTemplate *template);
+void RemoveWindow(u8 windowId);
+void FreeAllWindowBuffers(void);
+void CopyWindowToVram(u8 windowId, u8 mode);
+void CopyWindowRectToVram(u32 windowId, u32 mode, u32 x, u32 y, u32 w, u32 h);
+void PutWindowTilemap(u8 windowId);
+void PutWindowRectTilemapOverridePalette(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 palette);
+void ClearWindowTilemap(u8 windowId);
+void PutWindowRectTilemap(u8 windowId, u8 x, u8 y, u8 width, u8 height);
+void BlitBitmapToWindow(u8 windowId, u8 *pixels, u16 x, u16 y, u16 width, u16 height);
+void BlitBitmapRectToWindow(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight);
+void FillWindowPixelRect(u8 windowId, u8 fillValue, u16 x, u16 y, u16 width, u16 height);
+void CopyToWindowPixelBuffer(u8 windowId, const u8 *src, u16 size, u16 tileOffset);
+void FillWindowPixelBuffer(u8 windowId, u8 fillValue);
+void ScrollWindow(u8 windowId, u8 direction, u8 distance, u8 fillValue);
+void CallWindowFunction(u8 windowId, void ( *func)(u8, u8, u8, u8, u8, u8));
+bool8 SetWindowAttribute(u8 windowId, u8 attributeId, u32 value);
+u32 GetWindowAttribute(u8 windowId, u8 attributeId);
+u16 AddWindow8Bit(struct WindowTemplate *template);
+u16 AddWindow8Bit(struct WindowTemplate *template);
+void FillWindowPixelRect8Bit(u8 windowId, u8 fillValue, u16 x, u16 y, u16 width, u16 height);
+void BlitBitmapRectToWindow4BitTo8Bit(u8 windowId, u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight, u8 paletteNum);
+void CopyWindowToVram8Bit(u8 windowId, u8 mode);
+
+extern struct Window gWindows[];
+
+#endif // GUARD_WINDOW_H