summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/abilities.h81
-rw-r--r--include/battle.h24
-rw-r--r--include/gba/gba.h1
-rw-r--r--include/gba/io_reg.h3
-rw-r--r--include/gba/macro.h2
-rw-r--r--include/gba/multiboot.h55
-rw-r--r--include/gba/syscall.h16
-rw-r--r--include/gba/types.h21
-rw-r--r--include/global.h93
-rw-r--r--include/main.h63
-rw-r--r--include/multiboot.h21
-rw-r--r--include/pokemon.h311
-rw-r--r--include/rng.h18
-rw-r--r--include/siirtc.h54
-rw-r--r--include/species.h445
-rw-r--r--include/string_util.h42
-rw-r--r--include/text.h14
17 files changed, 1264 insertions, 0 deletions
diff --git a/include/abilities.h b/include/abilities.h
new file mode 100644
index 000000000..4c47025f8
--- /dev/null
+++ b/include/abilities.h
@@ -0,0 +1,81 @@
+enum
+{
+ ABILITY_NONE,
+ ABILITY_STENCH,
+ ABILITY_DRIZZLE,
+ ABILITY_SPEED_BOOST,
+ ABILITY_BATTLE_ARMOR,
+ ABILITY_STURDY,
+ ABILITY_DAMP,
+ ABILITY_LIMBER,
+ ABILITY_SAND_VEIL,
+ ABILITY_STATIC,
+ ABILITY_VOLT_ABSORB,
+ ABILITY_WATER_ABSORB,
+ ABILITY_OBLIVIOUS,
+ ABILITY_CLOUD_NINE,
+ ABILITY_COMPOUND_EYES,
+ ABILITY_INSOMNIA,
+ ABILITY_COLOR_CHANGE,
+ ABILITY_IMMUNITY,
+ ABILITY_FLASH_FIRE,
+ ABILITY_SHIELD_DUST,
+ ABILITY_OWN_TEMPO,
+ ABILITY_SUCTION_CUPS,
+ ABILITY_INTIMIDATE,
+ ABILITY_SHADOW_TAG,
+ ABILITY_ROUGH_SKIN,
+ ABILITY_WONDER_GUARD,
+ ABILITY_LEVITATE,
+ ABILITY_EFFECT_SPORE,
+ ABILITY_SYNCHRONIZE,
+ ABILITY_CLEAR_BODY,
+ ABILITY_NATURAL_CURE,
+ ABILITY_LIGHTNING_ROD,
+ ABILITY_SERENE_GRACE,
+ ABILITY_SWIFT_SWIM,
+ ABILITY_CHLOROPHYLL,
+ ABILITY_ILLUMINATE,
+ ABILITY_TRACE,
+ ABILITY_HUGE_POWER,
+ ABILITY_POISON_POINT,
+ ABILITY_INNER_FOCUS,
+ ABILITY_MAGMA_ARMOR,
+ ABILITY_WATER_VEIL,
+ ABILITY_MAGNET_PULL,
+ ABILITY_SOUNDPROOF,
+ ABILITY_RAIN_DISH,
+ ABILITY_SAND_STREAM,
+ ABILITY_PRESSURE,
+ ABILITY_THICK_FAT,
+ ABILITY_EARLY_BIRD,
+ ABILITY_FLAME_BODY,
+ ABILITY_RUN_AWAY,
+ ABILITY_KEEN_EYE,
+ ABILITY_HYPER_CUTTER,
+ ABILITY_PICKUP,
+ ABILITY_TRUANT,
+ ABILITY_HUSTLE,
+ ABILITY_CUTE_CHARM,
+ ABILITY_PLUS,
+ ABILITY_MINUS,
+ ABILITY_FORECAST,
+ ABILITY_STICKY_HOLD,
+ ABILITY_SHED_SKIN,
+ ABILITY_GUTS,
+ ABILITY_MARVEL_SCALE,
+ ABILITY_LIQUID_OOZE,
+ ABILITY_OVERGROW,
+ ABILITY_BLAZE,
+ ABILITY_TORRENT,
+ ABILITY_SWARM,
+ ABILITY_ROCK_HEAD,
+ ABILITY_DROUGHT,
+ ABILITY_ARENA_TRAP,
+ ABILITY_VITAL_SPIRIT,
+ ABILITY_WHITE_SMOKE,
+ ABILITY_PURE_POWER,
+ ABILITY_SHELL_ARMOR,
+ ABILITY_CACOPHONY,
+ ABILITY_AIR_LOCK
+}; \ No newline at end of file
diff --git a/include/battle.h b/include/battle.h
new file mode 100644
index 000000000..fa42a7b53
--- /dev/null
+++ b/include/battle.h
@@ -0,0 +1,24 @@
+#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_40 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 AI_ACTION_UNK1 0x0001
+#define AI_ACTION_UNK2 0x0002
+#define AI_ACTION_UNK3 0x0004
+#define AI_ACTION_UNK4 0x0008
+#define AI_ACTION_UNK5 0x0010
+#define AI_ACTION_UNK6 0x0020
+#define AI_ACTION_UNK7 0x0040
+#define AI_ACTION_UNK8 0x0080 \ No newline at end of file
diff --git a/include/gba/gba.h b/include/gba/gba.h
index 26342cf88..42ae3cdde 100644
--- a/include/gba/gba.h
+++ b/include/gba/gba.h
@@ -4,6 +4,7 @@
#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"
diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h
index 0be92fa60..5234e5b6c 100644
--- a/include/gba/io_reg.h
+++ b/include/gba/io_reg.h
@@ -577,6 +577,8 @@
#define TIMER_ENABLE 0x80
// serial
+#define SIO_ID 0x0030 // Communication ID
+
#define SIO_8BIT_MODE 0x0000 // Normal 8-bit communication mode
#define SIO_32BIT_MODE 0x1000 // Normal 32-bit communication mode
#define SIO_MULTI_MODE 0x2000 // Multi-player communication mode
@@ -589,6 +591,7 @@
#define SIO_MULTI_SI 0x0004 // Multi-player communication SI terminal
#define SIO_MULTI_SD 0x0008 // SD terminal
+#define SIO_MULTI_BUSY 0x0080
#define SIO_ERROR 0x0040 // Detect error
#define SIO_START 0x0080 // Start transfer
diff --git a/include/gba/macro.h b/include/gba/macro.h
index 62d3e73fa..230fb4383 100644
--- a/include/gba/macro.h
+++ b/include/gba/macro.h
@@ -25,6 +25,8 @@
CPU_FAST_SET_SRC_FIXED | ((size)/(32/8) & 0x1FFFFF)); \
}
+#define CpuFastFill16(value, dest, size) CpuFastFill(((value) << 16) | (value), (dest), (size))
+
#define CpuFastCopy(src, dest, size) CpuFastSet(src, dest, ((size)/(32/8) & 0x1FFFFF))
#define DmaSet(dmaNum, src, dest, control) \
diff --git a/include/gba/multiboot.h b/include/gba/multiboot.h
new file mode 100644
index 000000000..e88b43a19
--- /dev/null
+++ b/include/gba/multiboot.h
@@ -0,0 +1,55 @@
+#ifndef GUARD_GBA_MULTIBOOT_H
+#define GUARD_GBA_MULTIBOOT_H
+
+#define MULTIBOOT_NCHILD 3 // Maximum number of slaves
+#define MULTIBOOT_HEADER_SIZE 0xc0 // Header size
+#define MULTIBOOT_SEND_SIZE_MIN 0x100 // Minimum transmission size
+#define MULTIBOOT_SEND_SIZE_MAX 0x40000 // Maximum transmission size
+
+struct MultiBootParam
+{
+ u32 system_work[5];
+ u8 handshake_data;
+ u8 padding;
+ u16 handshake_timeout;
+ u8 probe_count;
+ u8 client_data[MULTIBOOT_NCHILD];
+ u8 palette_data;
+ u8 response_bit;
+ u8 client_bit;
+ u8 reserved1;
+ u8 *boot_srcp;
+ u8 *boot_endp;
+ u8 *masterp;
+ u8 *reserved2[MULTIBOOT_NCHILD];
+ u32 system_work2[4];
+ u8 sendflag;
+ u8 probe_target_bit;
+ u8 check_wait;
+ u8 server_type;
+};
+
+#define MULTIBOOT_ERROR_04 0x04
+#define MULTIBOOT_ERROR_08 0x08
+#define MULTIBOOT_ERROR_0c 0x0c
+#define MULTIBOOT_ERROR_40 0x40
+#define MULTIBOOT_ERROR_44 0x44
+#define MULTIBOOT_ERROR_48 0x48
+#define MULTIBOOT_ERROR_4c 0x4c
+#define MULTIBOOT_ERROR_80 0x80
+#define MULTIBOOT_ERROR_84 0x84
+#define MULTIBOOT_ERROR_88 0x88
+#define MULTIBOOT_ERROR_8c 0x8c
+#define MULTIBOOT_ERROR_NO_PROBE_TARGET 0x50
+#define MULTIBOOT_ERROR_NO_DLREADY 0x60
+#define MULTIBOOT_ERROR_BOOT_FAILURE 0x70
+#define MULTIBOOT_ERROR_HANDSHAKE_FAILURE 0x71
+
+#define MULTIBOOT_CONNECTION_CHECK_WAIT 15
+
+#define MULTIBOOT_SERVER_TYPE_NORMAL 0
+#define MULTIBOOT_SERVER_TYPE_QUICK 1
+
+#define MULTIBOOT_HANDSHAKE_TIMEOUT 400
+
+#endif // GUARD_GBA_MULTIBOOT_H
diff --git a/include/gba/syscall.h b/include/gba/syscall.h
index 3f41abba1..deddec5ba 100644
--- a/include/gba/syscall.h
+++ b/include/gba/syscall.h
@@ -17,6 +17,10 @@ void RegisterRamReset(u32 resetFlags);
void VBlankIntrWait(void);
+u16 Sqrt(u32 num);
+
+u16 ArcTan2(s16 x, s16 y);
+
#define CPU_SET_SRC_FIXED 0x01000000
#define CPU_SET_16BIT 0x00000000
#define CPU_SET_32BIT 0x04000000
@@ -27,6 +31,18 @@ void CpuSet(const void *src, void *dest, u32 control);
void CpuFastSet(const void *src, void *dest, u32 control);
+void BgAffineSet(struct BgAffineSrcData *src, struct BgAffineDstData *dest, s32 count);
+
void ObjAffineSet(struct ObjAffineSrcData *src, void *dest, s32 count, s32 offset);
+void LZ77UnCompWram(const void *src, void *dest);
+
+void LZ77UnCompVram(const void *src, void *dest);
+
+void RLUnCompWram(const void *src, void *dest);
+
+void RLUnCompVram(const void *src, void *dest);
+
+int MultiBoot(struct MultiBootParam *mp);
+
#endif // GUARD_GBA_SYSCALL_H
diff --git a/include/gba/types.h b/include/gba/types.h
index be7390d5a..fd8a20a4c 100644
--- a/include/gba/types.h
+++ b/include/gba/types.h
@@ -74,6 +74,27 @@ struct OamData
#define ST_OAM_H_RECTANGLE 1
#define ST_OAM_V_RECTANGLE 2
+struct BgAffineSrcData
+{
+ s32 texX;
+ s32 texY;
+ s16 scrX;
+ s16 scrY;
+ s16 sx;
+ s16 sy;
+ u16 alpha;
+};
+
+struct BgAffineDstData
+{
+ s16 pa;
+ s16 pb;
+ s16 pc;
+ s16 pd;
+ s32 dx;
+ s32 dy;
+};
+
struct ObjAffineSrcData
{
s16 xScale;
diff --git a/include/global.h b/include/global.h
index 0047fcbdb..b7038025b 100644
--- a/include/global.h
+++ b/include/global.h
@@ -3,4 +3,97 @@
#include "gba/gba.h"
+// Prevent cross-jump optimization.
+#define BLOCK_CROSS_JUMP asm("");
+
+// to help in decompiling
+#define asm_comment(x) asm volatile("@ -- " x " -- ")
+
+#define ARRAY_COUNT(array) (sizeof(array) / sizeof((array)[0]))
+
+#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,
+};
+
+enum LanguageId {
+ LANGUAGE_JAPANESE = 1,
+ LANGUAGE_ENGLISH = 2,
+ LANGUAGE_GERMAN = 5,
+};
+
+#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 SaveBlock2
+{
+ /*0x00*/ u8 playerName[8];
+ /*0x08*/ u8 playerGender; // MALE, FEMALE
+ /*0x09*/ u8 specialSaveWarp;
+ /*0x0A*/ u8 playerTrainerId[4];
+ /*0x0E*/ u16 playTimeHours;
+ /*0x10*/ u8 playTimeMinutes;
+ /*0x11*/ u8 playTimeSeconds;
+ /*0x12*/ u8 playTimeVBlanks;
+ /*0x13*/ u8 optionsButtonMode; // OPTIONS_BUTTON_MODE_[NORMAL/LR/L_EQUALS_A]
+ /*0x14*/ 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
+};
+
+extern struct SaveBlock2 *gSaveBlock2Ptr;
+
#endif // GUARD_GLOBAL_H
diff --git a/include/main.h b/include/main.h
new file mode 100644
index 000000000..e5460b3bf
--- /dev/null
+++ b/include/main.h
@@ -0,0 +1,63 @@
+#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;
+};
+
+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/multiboot.h b/include/multiboot.h
new file mode 100644
index 000000000..950c853d0
--- /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, u8 *srcp, int length, u8 palette_color, s8 palette_speed);
+int MultiBootCheckComplete(struct MultiBootParam *mp);
+
+#endif // GUARD_MULTIBOOT_H
diff --git a/include/pokemon.h b/include/pokemon.h
new file mode 100644
index 000000000..b3381a4b0
--- /dev/null
+++ b/include/pokemon.h
@@ -0,0 +1,311 @@
+#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_SPD_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_SPD_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_SPD 61
+#define MON_DATA_SPATK 62
+#define MON_DATA_SPDEF 63
+#define MON_DATA_64 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_KNOWN_MOVES 80
+#define MON_DATA_RIBBON_COUNT 81
+#define MON_DATA_RIBBONS 82
+#define MON_DATA_83 83
+#define MON_DATA_ATK2 84
+#define MON_DATA_DEF2 85
+#define MON_DATA_SPD2 86
+#define MON_DATA_SPATK2 87
+#define MON_DATA_SPDEF2 88
+
+#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
+
+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:5; // unused in Ruby/Sapphire, but the high bit must be set for Mew/Deoxys to obey in FR/LG/Emerald
+};
+
+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 pokerus;
+ u16 hp;
+ u16 maxHP;
+ u16 attack;
+ u16 defense;
+ u16 speed;
+ u16 spAttack;
+ u16 spDefense;
+};
+
+extern struct Pokemon gPlayerParty[6];
+extern struct Pokemon gEnemyParty[6];
+
+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;
+};
+
+struct BattleMove
+{
+ u8 effect;
+ u8 power;
+ u8 type;
+ u8 accuracy;
+ u8 pp;
+ u8 secondaryEffectChance;
+ u8 target;
+ u8 priority;
+ u32 flags;
+};
+
+// 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 GetMonData();
+
+u8 pokemon_species_get_gender_info(u16 species, u32 personality); \ No newline at end of file
diff --git a/include/rng.h b/include/rng.h
new file mode 100644
index 000000000..ae98e575f
--- /dev/null
+++ b/include/rng.h
@@ -0,0 +1,18 @@
+#ifndef GUARD_RNG_H
+#define GUARD_RNG_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_RNG_H
diff --git a/include/siirtc.h b/include/siirtc.h
new file mode 100644
index 000000000..5864f95b8
--- /dev/null
+++ b/include/siirtc.h
@@ -0,0 +1,54 @@
+#ifndef GUARD_RTC_H
+#define GUARD_RTC_H
+
+#include "gba/gba.h"
+
+#define SIIRTCINFO_INTFE 0x01 // frequency interrupt enable
+#define SIIRTCINFO_INTME 0x02 // per-minute interrupt enable
+#define SIIRTCINFO_INTAE 0x04 // alarm interrupt enable
+#define SIIRTCINFO_24HOUR 0x40 // 0: 12-hour mode, 1: 24-hour mode
+#define SIIRTCINFO_POWER 0x80 // power on or power failure occurred
+
+enum
+{
+ MONTH_JAN = 1,
+ MONTH_FEB,
+ MONTH_MAR,
+ MONTH_APR,
+ MONTH_MAY,
+ MONTH_JUN,
+ MONTH_JUL,
+ MONTH_AUG,
+ MONTH_SEP,
+ MONTH_OCT,
+ MONTH_NOV,
+ MONTH_DEC
+};
+
+struct SiiRtcInfo
+{
+ u8 year;
+ u8 month;
+ u8 day;
+ u8 dayOfWeek;
+ u8 hour;
+ u8 minute;
+ u8 second;
+ u8 status;
+ u8 alarmHour;
+ u8 alarmMinute;
+};
+
+void SiiRtcUnprotect();
+void SiiRtcProtect();
+u8 SiiRtcProbe();
+bool8 SiiRtcReset();
+bool8 SiiRtcGetStatus(struct SiiRtcInfo *rtc);
+bool8 SiiRtcSetStatus(struct SiiRtcInfo *rtc);
+bool8 SiiRtcGetDateTime(struct SiiRtcInfo *rtc);
+bool8 SiiRtcSetDateTime(struct SiiRtcInfo *rtc);
+bool8 SiiRtcGetTime(struct SiiRtcInfo *rtc);
+bool8 SiiRtcSetTime(struct SiiRtcInfo *rtc);
+bool8 SiiRtcSetAlarm(struct SiiRtcInfo *rtc);
+
+#endif // GUARD_RTC_H
diff --git a/include/species.h b/include/species.h
new file mode 100644
index 000000000..5cce48ad6
--- /dev/null
+++ b/include/species.h
@@ -0,0 +1,445 @@
+enum {
+ SPECIES_NONE, // 0x000
+ SPECIES_BULBASAUR, // 0x001
+ SPECIES_IVYSAUR, // 0x002
+ SPECIES_VENUSAUR, // 0x003
+ SPECIES_CHARMANDER, // 0x004
+ SPECIES_CHARMELEON, // 0x005
+ SPECIES_CHARIZARD, // 0x006
+ SPECIES_SQUIRTLE, // 0x007
+ SPECIES_WARTORTLE, // 0x008
+ SPECIES_BLASTOISE, // 0x009
+ SPECIES_CATERPIE, // 0x00a
+ SPECIES_METAPOD, // 0x00b
+ SPECIES_BUTTERFREE, // 0x00c
+ SPECIES_WEEDLE, // 0x00d
+ SPECIES_KAKUNA, // 0x00e
+ SPECIES_BEEDRILL, // 0x00f
+ SPECIES_PIDGEY, // 0x010
+ SPECIES_PIDGEOTTO, // 0x011
+ SPECIES_PIDGEOT, // 0x012
+ SPECIES_RATTATA, // 0x013
+ SPECIES_RATICATE, // 0x014
+ SPECIES_SPEAROW, // 0x015
+ SPECIES_FEAROW, // 0x016
+ SPECIES_EKANS, // 0x017
+ SPECIES_ARBOK, // 0x018
+ SPECIES_PIKACHU, // 0x019
+ SPECIES_RAICHU, // 0x01a
+ SPECIES_SANDSHREW, // 0x01b
+ SPECIES_SANDSLASH, // 0x01c
+ SPECIES_NIDORAN_F, // 0x01d
+ SPECIES_NIDORINA, // 0x01e
+ SPECIES_NIDOQUEEN, // 0x01f
+ SPECIES_NIDORAN_M, // 0x020
+ SPECIES_NIDORINO, // 0x021
+ SPECIES_NIDOKING, // 0x022
+ SPECIES_CLEFAIRY, // 0x023
+ SPECIES_CLEFABLE, // 0x024
+ SPECIES_VULPIX, // 0x025
+ SPECIES_NINETALES, // 0x026
+ SPECIES_JIGGLYPUFF, // 0x027
+ SPECIES_WIGGLYTUFF, // 0x028
+ SPECIES_ZUBAT, // 0x029
+ SPECIES_GOLBAT, // 0x02a
+ SPECIES_ODDISH, // 0x02b
+ SPECIES_GLOOM, // 0x02c
+ SPECIES_VILEPLUME, // 0x02d
+ SPECIES_PARAS, // 0x02e
+ SPECIES_PARASECT, // 0x02f
+ SPECIES_VENONAT, // 0x030
+ SPECIES_VENOMOTH, // 0x031
+ SPECIES_DIGLETT, // 0x032
+ SPECIES_DUGTRIO, // 0x033
+ SPECIES_MEOWTH, // 0x034
+ SPECIES_PERSIAN, // 0x035
+ SPECIES_PSYDUCK, // 0x036
+ SPECIES_GOLDUCK, // 0x037
+ SPECIES_MANKEY, // 0x038
+ SPECIES_PRIMEAPE, // 0x039
+ SPECIES_GROWLITHE, // 0x03a
+ SPECIES_ARCANINE, // 0x03b
+ SPECIES_POLIWAG, // 0x03c
+ SPECIES_POLIWHIRL, // 0x03d
+ SPECIES_POLIWRATH, // 0x03e
+ SPECIES_ABRA, // 0x03f
+ SPECIES_KADABRA, // 0x040
+ SPECIES_ALAKAZAM, // 0x041
+ SPECIES_MACHOP, // 0x042
+ SPECIES_MACHOKE, // 0x043
+ SPECIES_MACHAMP, // 0x044
+ SPECIES_BELLSPROUT, // 0x045
+ SPECIES_WEEPINBELL, // 0x046
+ SPECIES_VICTREEBEL, // 0x047
+ SPECIES_TENTACOOL, // 0x048
+ SPECIES_TENTACRUEL, // 0x049
+ SPECIES_GEODUDE, // 0x04a
+ SPECIES_GRAVELER, // 0x04b
+ SPECIES_GOLEM, // 0x04c
+ SPECIES_PONYTA, // 0x04d
+ SPECIES_RAPIDASH, // 0x04e
+ SPECIES_SLOWPOKE, // 0x04f
+ SPECIES_SLOWBRO, // 0x050
+ SPECIES_MAGNEMITE, // 0x051
+ SPECIES_MAGNETON, // 0x052
+ SPECIES_FARFETCHD, // 0x053
+ SPECIES_DODUO, // 0x054
+ SPECIES_DODRIO, // 0x055
+ SPECIES_SEEL, // 0x056
+ SPECIES_DEWGONG, // 0x057
+ SPECIES_GRIMER, // 0x058
+ SPECIES_MUK, // 0x059
+ SPECIES_SHELLDER, // 0x05a
+ SPECIES_CLOYSTER, // 0x05b
+ SPECIES_GASTLY, // 0x05c
+ SPECIES_HAUNTER, // 0x05d
+ SPECIES_GENGAR, // 0x05e
+ SPECIES_ONIX, // 0x05f
+ SPECIES_DROWZEE, // 0x060
+ SPECIES_HYPNO, // 0x061
+ SPECIES_KRABBY, // 0x062
+ SPECIES_KINGLER, // 0x063
+ SPECIES_VOLTORB, // 0x064
+ SPECIES_ELECTRODE, // 0x065
+ SPECIES_EXEGGCUTE, // 0x066
+ SPECIES_EXEGGUTOR, // 0x067
+ SPECIES_CUBONE, // 0x068
+ SPECIES_MAROWAK, // 0x069
+ SPECIES_HITMONLEE, // 0x06a
+ SPECIES_HITMONCHAN, // 0x06b
+ SPECIES_LICKITUNG, // 0x06c
+ SPECIES_KOFFING, // 0x06d
+ SPECIES_WEEZING, // 0x06e
+ SPECIES_RHYHORN, // 0x06f
+ SPECIES_RHYDON, // 0x070
+ SPECIES_CHANSEY, // 0x071
+ SPECIES_TANGELA, // 0x072
+ SPECIES_KANGASKHAN, // 0x073
+ SPECIES_HORSEA, // 0x074
+ SPECIES_SEADRA, // 0x075
+ SPECIES_GOLDEEN, // 0x076
+ SPECIES_SEAKING, // 0x077
+ SPECIES_STARYU, // 0x078
+ SPECIES_STARMIE, // 0x079
+ SPECIES_MR_MIME, // 0x07a
+ SPECIES_SCYTHER, // 0x07b
+ SPECIES_JYNX, // 0x07c
+ SPECIES_ELECTABUZZ, // 0x07d
+ SPECIES_MAGMAR, // 0x07e
+ SPECIES_PINSIR, // 0x07f
+ SPECIES_TAUROS, // 0x080
+ SPECIES_MAGIKARP, // 0x081
+ SPECIES_GYARADOS, // 0x082
+ SPECIES_LAPRAS, // 0x083
+ SPECIES_DITTO, // 0x084
+ SPECIES_EEVEE, // 0x085
+ SPECIES_VAPOREON, // 0x086
+ SPECIES_JOLTEON, // 0x087
+ SPECIES_FLAREON, // 0x088
+ SPECIES_PORYGON, // 0x089
+ SPECIES_OMANYTE, // 0x08a
+ SPECIES_OMASTAR, // 0x08b
+ SPECIES_KABUTO, // 0x08c
+ SPECIES_KABUTOPS, // 0x08d
+ SPECIES_AERODACTYL, // 0x08e
+ SPECIES_SNORLAX, // 0x08f
+ SPECIES_ARTICUNO, // 0x090
+ SPECIES_ZAPDOS, // 0x091
+ SPECIES_MOLTRES, // 0x092
+ SPECIES_DRATINI, // 0x093
+ SPECIES_DRAGONAIR, // 0x094
+ SPECIES_DRAGONITE, // 0x095
+ SPECIES_MEWTWO, // 0x096
+ SPECIES_MEW, // 0x097
+ SPECIES_CHIKORITA, // 0x098
+ SPECIES_BAYLEEF, // 0x099
+ SPECIES_MEGANIUM, // 0x09a
+ SPECIES_CYNDAQUIL, // 0x09b
+ SPECIES_QUILAVA, // 0x09c
+ SPECIES_TYPHLOSION, // 0x09d
+ SPECIES_TOTODILE, // 0x09e
+ SPECIES_CROCONAW, // 0x09f
+ SPECIES_FERALIGATR, // 0x0a0
+ SPECIES_SENTRET, // 0x0a1
+ SPECIES_FURRET, // 0x0a2
+ SPECIES_HOOTHOOT, // 0x0a3
+ SPECIES_NOCTOWL, // 0x0a4
+ SPECIES_LEDYBA, // 0x0a5
+ SPECIES_LEDIAN, // 0x0a6
+ SPECIES_SPINARAK, // 0x0a7
+ SPECIES_ARIADOS, // 0x0a8
+ SPECIES_CROBAT, // 0x0a9
+ SPECIES_CHINCHOU, // 0x0aa
+ SPECIES_LANTURN, // 0x0ab
+ SPECIES_PICHU, // 0x0ac
+ SPECIES_CLEFFA, // 0x0ad
+ SPECIES_IGGLYBUFF, // 0x0ae
+ SPECIES_TOGEPI, // 0x0af
+ SPECIES_TOGETIC, // 0x0b0
+ SPECIES_NATU, // 0x0b1
+ SPECIES_XATU, // 0x0b2
+ SPECIES_MAREEP, // 0x0b3
+ SPECIES_FLAAFFY, // 0x0b4
+ SPECIES_AMPHAROS, // 0x0b5
+ SPECIES_BELLOSSOM, // 0x0b6
+ SPECIES_MARILL, // 0x0b7
+ SPECIES_AZUMARILL, // 0x0b8
+ SPECIES_SUDOWOODO, // 0x0b9
+ SPECIES_POLITOED, // 0x0ba
+ SPECIES_HOPPIP, // 0x0bb
+ SPECIES_SKIPLOOM, // 0x0bc
+ SPECIES_JUMPLUFF, // 0x0bd
+ SPECIES_AIPOM, // 0x0be
+ SPECIES_SUNKERN, // 0x0bf
+ SPECIES_SUNFLORA, // 0x0c0
+ SPECIES_YANMA, // 0x0c1
+ SPECIES_WOOPER, // 0x0c2
+ SPECIES_QUAGSIRE, // 0x0c3
+ SPECIES_ESPEON, // 0x0c4
+ SPECIES_UMBREON, // 0x0c5
+ SPECIES_MURKROW, // 0x0c6
+ SPECIES_SLOWKING, // 0x0c7
+ SPECIES_MISDREAVUS, // 0x0c8
+ SPECIES_UNOWN, // 0x0c9
+ SPECIES_WOBBUFFET, // 0x0ca
+ SPECIES_GIRAFARIG, // 0x0cb
+ SPECIES_PINECO, // 0x0cc
+ SPECIES_FORRETRESS, // 0x0cd
+ SPECIES_DUNSPARCE, // 0x0ce
+ SPECIES_GLIGAR, // 0x0cf
+ SPECIES_STEELIX, // 0x0d0
+ SPECIES_SNUBBULL, // 0x0d1
+ SPECIES_GRANBULL, // 0x0d2
+ SPECIES_QWILFISH, // 0x0d3
+ SPECIES_SCIZOR, // 0x0d4
+ SPECIES_SHUCKLE, // 0x0d5
+ SPECIES_HERACROSS, // 0x0d6
+ SPECIES_SNEASEL, // 0x0d7
+ SPECIES_TEDDIURSA, // 0x0d8
+ SPECIES_URSARING, // 0x0d9
+ SPECIES_SLUGMA, // 0x0da
+ SPECIES_MAGCARGO, // 0x0db
+ SPECIES_SWINUB, // 0x0dc
+ SPECIES_PILOSWINE, // 0x0dd
+ SPECIES_CORSOLA, // 0x0de
+ SPECIES_REMORAID, // 0x0df
+ SPECIES_OCTILLERY, // 0x0e0
+ SPECIES_DELIBIRD, // 0x0e1
+ SPECIES_MANTINE, // 0x0e2
+ SPECIES_SKARMORY, // 0x0e3
+ SPECIES_HOUNDOUR, // 0x0e4
+ SPECIES_HOUNDOOM, // 0x0e5
+ SPECIES_KINGDRA, // 0x0e6
+ SPECIES_PHANPY, // 0x0e7
+ SPECIES_DONPHAN, // 0x0e8
+ SPECIES_PORYGON2, // 0x0e9
+ SPECIES_STANTLER, // 0x0ea
+ SPECIES_SMEARGLE, // 0x0eb
+ SPECIES_TYROGUE, // 0x0ec
+ SPECIES_HITMONTOP, // 0x0ed
+ SPECIES_SMOOCHUM, // 0x0ee
+ SPECIES_ELEKID, // 0x0ef
+ SPECIES_MAGBY, // 0x0f0
+ SPECIES_MILTANK, // 0x0f1
+ SPECIES_BLISSEY, // 0x0f2
+ SPECIES_RAIKOU, // 0x0f3
+ SPECIES_ENTEI, // 0x0f4
+ SPECIES_SUICUNE, // 0x0f5
+ SPECIES_LARVITAR, // 0x0f6
+ SPECIES_PUPITAR, // 0x0f7
+ SPECIES_TYRANITAR, // 0x0f8
+ SPECIES_LUGIA, // 0x0f9
+ SPECIES_HO_OH, // 0x0fa
+ SPECIES_CELEBI, // 0x0fb
+
+ SPECIES_OLD_UNOWN_B,
+ SPECIES_OLD_UNOWN_C,
+ SPECIES_OLD_UNOWN_D,
+ SPECIES_OLD_UNOWN_E,
+ SPECIES_OLD_UNOWN_F,
+ SPECIES_OLD_UNOWN_G,
+ SPECIES_OLD_UNOWN_H,
+ SPECIES_OLD_UNOWN_I,
+ SPECIES_OLD_UNOWN_J,
+ SPECIES_OLD_UNOWN_K,
+ SPECIES_OLD_UNOWN_L,
+ SPECIES_OLD_UNOWN_M,
+ SPECIES_OLD_UNOWN_N,
+ SPECIES_OLD_UNOWN_O,
+ SPECIES_OLD_UNOWN_P,
+ SPECIES_OLD_UNOWN_Q,
+ SPECIES_OLD_UNOWN_R,
+ SPECIES_OLD_UNOWN_S,
+ SPECIES_OLD_UNOWN_T,
+ SPECIES_OLD_UNOWN_U,
+ SPECIES_OLD_UNOWN_V,
+ SPECIES_OLD_UNOWN_W,
+ SPECIES_OLD_UNOWN_X,
+ SPECIES_OLD_UNOWN_Y,
+ SPECIES_OLD_UNOWN_Z,
+
+ SPECIES_TREECKO, // 0x115
+ SPECIES_GROVYLE, // 0x116
+ SPECIES_SCEPTILE, // 0x117
+ SPECIES_TORCHIC, // 0x118
+ SPECIES_COMBUSKEN, // 0x119
+ SPECIES_BLAZIKEN, // 0x11a
+ SPECIES_MUDKIP, // 0x11b
+ SPECIES_MARSHTOMP, // 0x11c
+ SPECIES_SWAMPERT, // 0x11d
+ SPECIES_POOCHYENA, // 0x11e
+ SPECIES_MIGHTYENA, // 0x11f
+ SPECIES_ZIGZAGOON, // 0x120
+ SPECIES_LINOONE, // 0x121
+ SPECIES_WURMPLE, // 0x122
+ SPECIES_SILCOON, // 0x123
+ SPECIES_BEAUTIFLY, // 0x124
+ SPECIES_CASCOON, // 0x125
+ SPECIES_DUSTOX, // 0x126
+ SPECIES_LOTAD, // 0x127
+ SPECIES_LOMBRE, // 0x128
+ SPECIES_LUDICOLO, // 0x129
+ SPECIES_SEEDOT, // 0x12a
+ SPECIES_NUZLEAF, // 0x12b
+ SPECIES_SHIFTRY, // 0x12c
+ SPECIES_NINCADA, // 0x12d
+ SPECIES_NINJASK, // 0x12e
+ SPECIES_SHEDINJA, // 0x12f
+ SPECIES_TAILLOW, // 0x130
+ SPECIES_SWELLOW, // 0x131
+ SPECIES_SHROOMISH, // 0x132
+ SPECIES_BRELOOM, // 0x133
+ SPECIES_SPINDA, // 0x134
+ SPECIES_WINGULL, // 0x135
+ SPECIES_PELIPPER, // 0x136
+ SPECIES_SURSKIT, // 0x137
+ SPECIES_MASQUERAIN, // 0x138
+ SPECIES_WAILMER, // 0x139
+ SPECIES_WAILORD, // 0x13a
+ SPECIES_SKITTY, // 0x13b
+ SPECIES_DELCATTY, // 0x13c
+ SPECIES_KECLEON, // 0x13d
+ SPECIES_BALTOY, // 0x13e
+ SPECIES_CLAYDOL, // 0x13f
+ SPECIES_NOSEPASS, // 0x140
+ SPECIES_TORKOAL, // 0x141
+ SPECIES_SABLEYE, // 0x142
+ SPECIES_BARBOACH, // 0x143
+ SPECIES_WHISCASH, // 0x144
+ SPECIES_LUVDISC, // 0x145
+ SPECIES_CORPHISH, // 0x146
+ SPECIES_CRAWDAUNT, // 0x147
+ SPECIES_FEEBAS, // 0x148
+ SPECIES_MILOTIC, // 0x149
+ SPECIES_CARVANHA, // 0x14a
+ SPECIES_SHARPEDO, // 0x14b
+ SPECIES_TRAPINCH, // 0x14c
+ SPECIES_VIBRAVA, // 0x14d
+ SPECIES_FLYGON, // 0x14e
+ SPECIES_MAKUHITA, // 0x14f
+ SPECIES_HARIYAMA, // 0x150
+ SPECIES_ELECTRIKE, // 0x151
+ SPECIES_MANECTRIC, // 0x152
+ SPECIES_NUMEL, // 0x153
+ SPECIES_CAMERUPT, // 0x154
+ SPECIES_SPHEAL, // 0x155
+ SPECIES_SEALEO, // 0x156
+ SPECIES_WALREIN, // 0x157
+ SPECIES_CACNEA, // 0x158
+ SPECIES_CACTURNE, // 0x159
+ SPECIES_SNORUNT, // 0x15a
+ SPECIES_GLALIE, // 0x15b
+ SPECIES_LUNATONE, // 0x15c
+ SPECIES_SOLROCK, // 0x15d
+ SPECIES_AZURILL, // 0x15e
+ SPECIES_SPOINK, // 0x15f
+ SPECIES_GRUMPIG, // 0x160
+ SPECIES_PLUSLE, // 0x161
+ SPECIES_MINUN, // 0x162
+ SPECIES_MAWILE, // 0x163
+ SPECIES_MEDITITE, // 0x164
+ SPECIES_MEDICHAM, // 0x165
+ SPECIES_SWABLU, // 0x166
+ SPECIES_ALTARIA, // 0x167
+ SPECIES_WYNAUT, // 0x168
+ SPECIES_DUSKULL, // 0x169
+ SPECIES_DUSCLOPS, // 0x16a
+ SPECIES_ROSELIA, // 0x16b
+ SPECIES_SLAKOTH, // 0x16c
+ SPECIES_VIGOROTH, // 0x16d
+ SPECIES_SLAKING, // 0x16e
+ SPECIES_GULPIN, // 0x16f
+ SPECIES_SWALOT, // 0x170
+ SPECIES_TROPIUS, // 0x171
+ SPECIES_WHISMUR, // 0x172
+ SPECIES_LOUDRED, // 0x173
+ SPECIES_EXPLOUD, // 0x174
+ SPECIES_CLAMPERL, // 0x175
+ SPECIES_HUNTAIL, // 0x176
+ SPECIES_GOREBYSS, // 0x177
+ SPECIES_ABSOL, // 0x178
+ SPECIES_SHUPPET, // 0x179
+ SPECIES_BANETTE, // 0x17a
+ SPECIES_SEVIPER, // 0x17b
+ SPECIES_ZANGOOSE, // 0x17c
+ SPECIES_RELICANTH, // 0x17d
+ SPECIES_ARON, // 0x17e
+ SPECIES_LAIRON, // 0x17f
+ SPECIES_AGGRON, // 0x180
+ SPECIES_CASTFORM, // 0x181
+ SPECIES_VOLBEAT, // 0x182
+ SPECIES_ILLUMISE, // 0x183
+ SPECIES_LILEEP, // 0x184
+ SPECIES_CRADILY, // 0x185
+ SPECIES_ANORITH, // 0x186
+ SPECIES_ARMALDO, // 0x187
+ SPECIES_RALTS, // 0x188
+ SPECIES_KIRLIA, // 0x189
+ SPECIES_GARDEVOIR, // 0x18a
+ SPECIES_BAGON, // 0x18b
+ SPECIES_SHELGON, // 0x18c
+ SPECIES_SALAMENCE, // 0x18d
+ SPECIES_BELDUM, // 0x18e
+ SPECIES_METANG, // 0x18f
+ SPECIES_METAGROSS, // 0x190
+ SPECIES_REGIROCK, // 0x191
+ SPECIES_REGICE, // 0x192
+ SPECIES_REGISTEEL, // 0x193
+ SPECIES_KYOGRE, // 0x194
+ SPECIES_GROUDON, // 0x195
+ SPECIES_RAYQUAZA, // 0x196
+ SPECIES_LATIAS, // 0x197
+ SPECIES_LATIOS, // 0x198
+ SPECIES_JIRACHI, // 0x199
+ SPECIES_DEOXYS, // 0x19a
+ SPECIES_CHIMECHO, // 0x19b
+ SPECIES_EGG, // 0x19c
+
+ SPECIES_UNOWN_B,
+ SPECIES_UNOWN_C,
+ SPECIES_UNOWN_D,
+ SPECIES_UNOWN_E,
+ SPECIES_UNOWN_F,
+ SPECIES_UNOWN_G,
+ SPECIES_UNOWN_H,
+ SPECIES_UNOWN_I,
+ SPECIES_UNOWN_J,
+ SPECIES_UNOWN_K,
+ SPECIES_UNOWN_L,
+ SPECIES_UNOWN_M,
+ SPECIES_UNOWN_N,
+ SPECIES_UNOWN_O,
+ SPECIES_UNOWN_P,
+ SPECIES_UNOWN_Q,
+ SPECIES_UNOWN_R,
+ SPECIES_UNOWN_S,
+ SPECIES_UNOWN_T,
+ SPECIES_UNOWN_U,
+ SPECIES_UNOWN_V,
+ SPECIES_UNOWN_W,
+ SPECIES_UNOWN_X,
+ SPECIES_UNOWN_Y,
+ SPECIES_UNOWN_Z,
+ SPECIES_UNOWN_EMARK,
+ SPECIES_UNOWN_QMARK,
+}; \ No newline at end of file
diff --git a/include/string_util.h b/include/string_util.h
new file mode 100644
index 000000000..382f52251
--- /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 sub_8009228(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/text.h b/include/text.h
new file mode 100644
index 000000000..98d8406b5
--- /dev/null
+++ b/include/text.h
@@ -0,0 +1,14 @@
+#ifndef GUARD_TEXT_H
+#define GUARD_TEXT_H
+
+#define CHAR_SPACE 0x00
+#define CHAR_QUESTION_MARK 0xAC
+#define CHAR_HYPHEN 0xAE
+#define CHAR_CURRENCY 0xB7
+#define CHAR_COLON 0xF0
+#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
+
+#endif // GUARD_TEXT_H