summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorgolem galvanize <golemgalvanize@github.com>2018-02-13 22:12:02 -0500
committergolem galvanize <golemgalvanize@github.com>2018-02-13 22:12:02 -0500
commite5b6d15f9163cca8688cd67ca5a0563ce6667601 (patch)
tree5492d50f51f51acca9cf1861c7b5936182649364 /include
parent42cfbcb197bb271e675a4b2b9e70a2647bd65532 (diff)
parent398e775d906ff4f1e5aaad3d8a9eee530c7b122d (diff)
move data to c
Diffstat (limited to 'include')
-rw-r--r--include/agb_flash.h12
-rw-r--r--include/battle.h497
-rw-r--r--include/battle_anim.h22
-rw-r--r--include/battle_frontier_2.h1
-rw-r--r--include/battle_gfx_sfx_util.h36
-rw-r--r--include/battle_main.h10
-rw-r--r--include/battle_message.h8
-rw-r--r--include/battle_script_commands.h45
-rw-r--r--include/battle_scripts.h2
-rw-r--r--include/battle_util.h2
-rw-r--r--include/calculate_base_damage.h6
-rw-r--r--include/constants/battle.h284
-rw-r--r--include/constants/battle_ai.h10
-rw-r--r--include/constants/battle_anim.h2
-rw-r--r--include/constants/battle_script_commands.h97
-rw-r--r--include/constants/battle_string_ids.h (renamed from include/battle_string_ids.h)7
-rw-r--r--include/constants/items.h3
-rw-r--r--include/constants/pokemon.h80
-rw-r--r--include/constants/trainers.h32
-rw-r--r--include/crt0.h11
-rw-r--r--include/data/pokemon/trainer_class_lookups.h64
-rw-r--r--include/decompress.h1
-rw-r--r--include/field_map_obj_helpers.h1
-rw-r--r--include/field_player_avatar.h2
-rw-r--r--include/field_specials.h1
-rw-r--r--include/gba/io_reg.h17
-rw-r--r--include/global.h11
-rw-r--r--include/graphics.h15
-rw-r--r--include/intro.h6
-rw-r--r--include/item.h3
-rw-r--r--include/item_menu.h2
-rw-r--r--include/item_menu_icons.h4
-rw-r--r--include/item_use.h1
-rw-r--r--include/librfu.h143
-rw-r--r--include/link.h165
-rw-r--r--include/link_rfu.h235
-rw-r--r--include/list_menu.h1
-rw-r--r--include/load_save.h3
-rw-r--r--include/m4a.h5
-rw-r--r--include/main.h16
-rw-r--r--include/malloc.h1
-rw-r--r--include/menu.h8
-rw-r--r--include/menu_helpers.h5
-rw-r--r--include/menu_indicators.h9
-rw-r--r--include/overworld.h8
-rw-r--r--include/party_menu.h1
-rw-r--r--include/player_pc.h1
-rw-r--r--include/pokemon.h311
-rw-r--r--include/pokemon_item_effects.h62
-rwxr-xr-xinclude/pokemon_summary_screen.h6
-rw-r--r--include/recorded_battle.h10
-rw-r--r--include/reset_save_heap.h12
-rw-r--r--include/rom_8011DC0.h12
-rw-r--r--include/shop.h1
-rw-r--r--include/strings.h81
-rw-r--r--include/text.h1
-rw-r--r--include/trade.h12
-rw-r--r--include/window.h6
58 files changed, 1610 insertions, 800 deletions
diff --git a/include/agb_flash.h b/include/agb_flash.h
new file mode 100644
index 000000000..27e45e8fa
--- /dev/null
+++ b/include/agb_flash.h
@@ -0,0 +1,12 @@
+#ifndef GUARD_AGB_FLASH_H
+#define GUARD_AGB_FLASH_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+
+u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void));
+
+#endif //GUARD_AGB_FLASH_H
diff --git a/include/battle.h b/include/battle.h
index 81c1d341d..5225b72e3 100644
--- a/include/battle.h
+++ b/include/battle.h
@@ -2,6 +2,7 @@
#define GUARD_BATTLE_H
// should they be included here or included individually by every file?
+#include "constants/battle.h"
#include "battle_util.h"
#include "battle_script_commands.h"
#include "battle_main.h"
@@ -10,215 +11,16 @@
#include "battle_util2.h"
#include "battle_bg.h"
-/*
- * A battler may be in one of four positions on the field. The first bit determines
- * what side the battler is on, either the player's side or the opponent's side.
- * The second bit determines what flank the battler is on, either the left or right.
- * Note that the opponent's flanks are drawn corresponding to their perspective, so
- * their right mon appears on the left, and their left mon appears on the right.
- * The battler ID is usually the same as the position, except in the case of link battles.
- *
- * + ------------------------- +
- * | Opponent's side |
- * | Right Left |
- * | 3 1 |
- * | |
- * | Player's side |
- * | Left Right |
- * | 0 2 |
- * ----------------------------+
- * | |
- * | |
- * +---------------------------+
- */
-
-#define MAX_BATTLERS_COUNT 4
-
-#define B_POSITION_PLAYER_LEFT 0
-#define B_POSITION_OPPONENT_LEFT 1
-#define B_POSITION_PLAYER_RIGHT 2
-#define B_POSITION_OPPONENT_RIGHT 3
-
-// These macros can be used with either battler ID or positions to get the partner or the opposite mon
-#define BATTLE_OPPOSITE(id) ((id) ^ 1)
-#define BATTLE_PARTNER(id) ((id) ^ 2)
-
-#define B_SIDE_PLAYER 0
-#define B_SIDE_OPPONENT 1
-
-#define B_FLANK_LEFT 0
-#define B_FLANK_RIGHT 1
-
-#define BIT_SIDE 1
-#define BIT_FLANK 2
-
#define GET_BATTLER_POSITION(battler) (gBattlerPositions[battler])
#define GET_BATTLER_SIDE(battler) (GetBattlerPosition(battler) & BIT_SIDE)
#define GET_BATTLER_SIDE2(battler) (GET_BATTLER_POSITION(battler) & BIT_SIDE)
-// Battle Type Flags
-
-#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_PIKE 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_KYOGRE 0x20000000
-#define BATTLE_TYPE_RAYQUAZA 0x40000000
-#define BATTLE_TYPE_x80000000 0x80000000
-#define BATTLE_TYPE_FRONTIER (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_DOME | BATTLE_TYPE_PALACE | BATTLE_TYPE_ARENA | BATTLE_TYPE_FACTORY | BATTLE_TYPE_PIKE | 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_PIKE)
-
-extern u32 gBattleTypeFlags;
-
#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 B_OUTCOME_WON 0x1
-#define B_OUTCOME_LOST 0x2
-#define B_OUTCOME_DREW 0x3
-#define B_OUTCOME_RAN 0x4
-#define B_OUTCOME_PLAYER_TELEPORTED 0x5
-#define B_OUTCOME_POKE_FLED 0x6
-#define B_OUTCOME_CAUGHT_POKE 0x7
-#define B_OUTCOME_NO_SAFARI_BALLS 0x8
-#define B_OUTCOME_FORFEITED 0x9
-#define B_OUTCOME_POKE_TELEPORTED 0xA
-#define B_OUTCOME_LINK_BATTLE_RAN 0x80
-
-extern u8 gBattleOutcome;
-
-// Non-volatile status conditions
-// These persist remain outside of battle and after switching out
-#define STATUS1_NONE 0x0
-#define STATUS1_SLEEP 0x7
-#define STATUS1_POISON 0x8
-#define STATUS1_BURN 0x10
-#define STATUS1_FREEZE 0x20
-#define STATUS1_PARALYSIS 0x40
-#define STATUS1_TOXIC_POISON 0x80
-#define STATUS1_TOXIC_COUNTER 0xF00
-#define STATUS1_PSN_ANY (STATUS1_POISON | STATUS1_TOXIC_POISON)
-#define STATUS1_ANY (STATUS1_SLEEP | STATUS1_POISON | STATUS1_BURN | STATUS1_FREEZE | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON)
-
-// Volatile status ailments
-// These are removed after exiting the battle or switching out
-#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 battler
-#define STATUS2_INFATUATED_WITH(battler) (gBitTable[battler] << 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
-
-// Seems like per-battler statuses. Not quite sure how to categorize these
-#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)
-
-extern u32 gStatuses3[MAX_BATTLERS_COUNT];
-
-// Not really sure what a "hitmarker" is.
-
-#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(battler) (gBitTable[battler] << 0x1C)
-#define HITMARKER_UNK(battler) (0x10000000 << battler)
-
-extern u32 gHitMarker;
-
-// Per-side statuses that affect an entire party
-
-#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)
-
-extern u16 gSideStatuses[2];
-
// Battle Actions
// These determine what each battler will do in a turn
#define B_ACTION_USE_MOVE 0
@@ -238,37 +40,9 @@ extern u16 gSideStatuses[2];
#define B_ACTION_NOTHING_FAINTED 13 // when choosing an action
#define B_ACTION_NONE 0xFF
-#define MOVE_RESULT_MISSED (1 << 0)
-#define MOVE_RESULT_SUPER_EFFECTIVE (1 << 1)
-#define MOVE_RESULT_NOT_VERY_EFFECTIVE (1 << 2)
-#define MOVE_RESULT_DOESNT_AFFECT_FOE (1 << 3)
-#define MOVE_RESULT_ONE_HIT_KO (1 << 4)
-#define MOVE_RESULT_FAILED (1 << 5)
-#define MOVE_RESULT_FOE_ENDURED (1 << 6)
-#define MOVE_RESULT_FOE_HUNG_ON (1 << 7)
-#define MOVE_RESULT_NO_EFFECT (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED)
-
#define MAX_TRAINER_ITEMS 4
#define MAX_MON_MOVES 4
-// Battle Weather flags
-
-#define WEATHER_RAIN_TEMPORARY (1 << 0)
-#define WEATHER_RAIN_DOWNPOUR (1 << 1) // unused
-#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)
-
-extern u16 gBattleWeather;
-
#define BATTLE_TERRAIN_GRASS 0
#define BATTLE_TERRAIN_LONG_GRASS 1
#define BATTLE_TERRAIN_SAND 2
@@ -280,8 +54,6 @@ extern u16 gBattleWeather;
#define BATTLE_TERRAIN_BUILDING 8
#define BATTLE_TERRAIN_PLAIN 9
-extern u8 gBattleTerrain;
-
// array entries for battle communication
#define MULTIUSE_STATE 0x0
#define CURSOR_POSITION 0x1
@@ -318,26 +90,7 @@ extern u8 gBattleTerrain;
#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
+#define BATTLE_BUFFER_LINK_SIZE 0x1000
struct TrainerMonNoItemDefaultMoves
{
@@ -346,8 +99,6 @@ struct TrainerMonNoItemDefaultMoves
u16 species;
};
-u8 GetBattlerSide(u8 battler);
-
struct TrainerMonItemDefaultMoves
{
u16 iv;
@@ -441,8 +192,6 @@ struct DisableStruct
/*0x1A*/ u8 unk1A[2];
};
-extern struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT];
-
struct ProtectStruct
{
/* field_0 */
@@ -476,13 +225,11 @@ struct ProtectStruct
/* field_4 */ u32 physicalDmg;
/* field_8 */ u32 specialDmg;
- /* field_C */ u8 physicalBank;
- /* field_D */ u8 specialBank;
+ /* field_C */ u8 physicalBattlerId;
+ /* field_D */ u8 specialBattlerId;
/* field_E */ u16 fieldE;
};
-extern struct ProtectStruct gProtectStructs[MAX_BATTLERS_COUNT];
-
struct SpecialStatus
{
u8 statLowered : 1; // 0x1
@@ -494,35 +241,31 @@ struct SpecialStatus
u8 flag40 : 1;
u8 focusBanded : 1;
u8 field1[3];
- s32 moveturnLostHP;
- s32 moveturnLostHP_physical;
- s32 moveturnLostHP_special;
- u8 moveturnPhysicalBank;
- u8 moveturnSpecialBank;
+ s32 dmg;
+ s32 physicalDmg;
+ s32 specialDmg;
+ u8 physicalBattlerId;
+ u8 specialBattlerId;
u8 field12;
u8 field13;
};
-extern struct SpecialStatus gSpecialStatuses[MAX_BATTLERS_COUNT];
-
struct SideTimer
{
/*0x00*/ u8 reflectTimer;
- /*0x01*/ u8 reflectBank;
+ /*0x01*/ u8 reflectBattlerId;
/*0x02*/ u8 lightscreenTimer;
- /*0x03*/ u8 lightscreenBank;
+ /*0x03*/ u8 lightscreenBattlerId;
/*0x04*/ u8 mistTimer;
- /*0x05*/ u8 mistBank;
+ /*0x05*/ u8 mistBattlerId;
/*0x06*/ u8 safeguardTimer;
- /*0x07*/ u8 safeguardBank;
+ /*0x07*/ u8 safeguardBattlerId;
/*0x08*/ u8 followmeTimer;
/*0x09*/ u8 followmeTarget;
/*0x0A*/ u8 spikesAmount;
/*0x0B*/ u8 fieldB;
};
-extern struct SideTimer gSideTimers[];
-
struct WishFutureKnock
{
u8 futureSightCounter[MAX_BATTLERS_COUNT];
@@ -530,13 +273,11 @@ struct WishFutureKnock
s32 futureSightDmg[MAX_BATTLERS_COUNT];
u16 futureSightMove[MAX_BATTLERS_COUNT];
u8 wishCounter[MAX_BATTLERS_COUNT];
- u8 wishUserID[MAX_BATTLERS_COUNT];
+ u8 wishMonId[MAX_BATTLERS_COUNT];
u8 weatherDuration;
u8 knockedOffPokes[2];
};
-extern struct WishFutureKnock gWishFutureKnock;
-
struct AI_ThinkingStruct
{
u8 aiState;
@@ -600,8 +341,6 @@ struct BattleResources
struct BattleScriptsStack *AI_ScriptsStack;
};
-extern struct BattleResources* gBattleResources;
-
struct BattleResults
{
u8 playerFaintCounter; // 0x0
@@ -625,21 +364,19 @@ struct BattleResults
u16 playerMon2Species; // 0x26
u16 caughtMonSpecies; // 0x28
u8 caughtMonNick[10]; // 0x2A
- u8 filler34[2];
+ u8 filler34[2]; // 0x34
u8 catchAttempts[11]; // 0x36
};
-extern struct BattleResults gBattleResults;
-
struct BattleStruct
{
u8 turnEffectsTracker;
- u8 turnEffectsBank;
+ u8 turnEffectsBattlerId;
u8 filler2;
- u8 turncountersTracker;
+ u8 turnCountersTracker;
u8 wrappedMove[8]; // ask gamefreak why they declared it that way
u8 moveTarget[4];
- u8 expGetterId;
+ u8 expGetterMonId;
u8 field_11;
u8 wildVictorySong;
u8 dynamicMoveType;
@@ -653,13 +390,13 @@ struct BattleStruct
u8 field_45;
u8 field_46;
u8 field_47;
- u8 focusPunchBank;
+ u8 focusPunchBattlerId;
u8 field_49;
u8 moneyMultiplier;
u8 savedTurnActionNumber;
u8 switchInAbilitiesCounter;
u8 faintedActionsState;
- u8 faintedActionsBank;
+ u8 faintedActionsBattlerId;
u8 field_4F;
u16 expValue;
u8 field_52;
@@ -687,7 +424,7 @@ struct BattleStruct
u8 field_8C;
u8 field_8D;
u8 stringMoveType;
- u8 expGetterBank;
+ u8 expGetterBattlerId;
u8 field_90;
u8 field_91;
u8 field_92;
@@ -732,7 +469,7 @@ struct BattleStruct
u8 field_183;
struct BattleEnigmaBerry battleEnigmaBerry;
u8 wishPerishSongState;
- u8 wishPerishSongBank;
+ u8 wishPerishSongBattlerId;
bool8 overworldWeatherDone;
u8 atkCancellerTracker;
u8 field_1A4[96];
@@ -745,8 +482,6 @@ struct BattleStruct
u8 field_2A2;
};
-extern struct BattleStruct* gBattleStruct;
-
#define GET_MOVE_TYPE(move, typeArg) \
{ \
if (gBattleStruct->dynamicMoveType) \
@@ -755,71 +490,8 @@ extern struct BattleStruct* gBattleStruct;
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
+#define IS_MOVE_PHYSICAL(moveType)(moveType < TYPE_MYSTERY)
+#define IS_MOVE_SPECIAL(moveType)(moveType > TYPE_MYSTERY)
#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
@@ -859,8 +531,6 @@ struct BattleScripting
u8 multiplayerId;
};
-extern struct BattleScripting gBattleScripting;
-
enum
{
BACK_PIC_BRENDAN,
@@ -874,7 +544,7 @@ enum
};
// rom_80A5C6C
-u8 GetBattlerSide(u8 bank);
+u8 GetBattlerSide(u8 battler);
u8 GetBattlerPosition(u8 bank);
u8 GetBattlerAtPosition(u8 bank);
@@ -956,18 +626,6 @@ struct BattleSpriteData
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
@@ -982,11 +640,106 @@ struct MonSpritesGfx
void *field_17C;
};
-extern struct BattleSpritesGfx* gMonSpritesGfx;
-extern u8 gBattleOutcome;
-extern u16 gLastUsedItem;
+// all battle variables are declared in battle_main.c
extern u32 gBattleTypeFlags;
-extern struct MonSpritesGfx* gMonSpritesGfxPtr;
-extern u16 gTrainerBattleOpponent_A;
+extern u8 gBattleTerrain;
+extern u32 gUnknown_02022FF4;
+extern u8 *gUnknown_0202305C;
+extern u8 *gUnknown_02023060;
+extern u8 gBattleBufferA[MAX_BATTLERS_COUNT][0x200];
+extern u8 gBattleBufferB[MAX_BATTLERS_COUNT][0x200];
+extern u8 gActiveBattler;
+extern u32 gBattleControllerExecFlags;
+extern u8 gBattlersCount;
+extern u16 gBattlerPartyIndexes[MAX_BATTLERS_COUNT];
+extern u8 gBattlerPositions[MAX_BATTLERS_COUNT];
+extern u8 gActionsByTurnOrder[MAX_BATTLERS_COUNT];
+extern u8 gBattleTurnOrder[MAX_BATTLERS_COUNT];
+extern u8 gCurrentTurnActionNumber;
+extern u8 gCurrentActionFuncId;
+extern struct BattlePokemon gBattleMons[MAX_BATTLERS_COUNT];
+extern u8 gBattlerSpriteIds[MAX_BATTLERS_COUNT];
+extern u8 gCurrMovePos;
+extern u8 gChosenMovePos;
+extern u16 gCurrentMove;
+extern u16 gChosenMove;
+extern u16 gRandomMove;
+extern s32 gBattleMoveDamage;
+extern s32 gHpDealt;
+extern s32 gTakenDmg[MAX_BATTLERS_COUNT];
+extern u16 gLastUsedItem;
+extern u8 gLastUsedAbility;
+extern u8 gBattlerAttacker;
+extern u8 gBattlerTarget;
+extern u8 gBattlerFainted;
+extern u8 gEffectBattler;
+extern u8 gPotentialItemEffectBattler;
+extern u8 gAbsentBattlerFlags;
+extern u8 gCritMultiplier;
+extern u8 gMultiHitCounter;
+extern const u8 *gBattlescriptCurrInstr;
+extern u32 gUnusedBattleMainVar;
+extern u8 gChosenActionByBattler[MAX_BATTLERS_COUNT];
+extern const u8 *gSelectionBattleScripts[MAX_BATTLERS_COUNT];
+extern const u8 *gPalaceSelectionBattleScripts[MAX_BATTLERS_COUNT];
+extern u16 gLastPrintedMoves[MAX_BATTLERS_COUNT];
+extern u16 gLastMoves[MAX_BATTLERS_COUNT];
+extern u16 gLastLandedMoves[MAX_BATTLERS_COUNT];
+extern u16 gLastHitByType[MAX_BATTLERS_COUNT];
+extern u16 gLastResultingMoves[MAX_BATTLERS_COUNT];
+extern u16 gLockedMoves[MAX_BATTLERS_COUNT];
+extern u8 gLastHitBy[MAX_BATTLERS_COUNT];
+extern u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT];
+extern u8 gMoveResultFlags;
+extern u32 gHitMarker;
+extern u8 gTakenDmgByBattler[MAX_BATTLERS_COUNT];
+extern u8 gUnknown_0202428C;
+extern u16 gSideStatuses[2];
+extern struct SideTimer gSideTimers[2];
+extern u32 gStatuses3[MAX_BATTLERS_COUNT];
+extern struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT];
+extern u16 gPauseCounterBattle;
+extern u16 gPaydayMoney;
+extern u16 gRandomTurnNumber;
+extern u8 gBattleCommunication[BATTLE_COMMUNICATION_ENTRIES_COUNT];
+extern u8 gBattleOutcome;
+extern struct ProtectStruct gProtectStructs[MAX_BATTLERS_COUNT];
+extern struct SpecialStatus gSpecialStatuses[MAX_BATTLERS_COUNT];
+extern u16 gBattleWeather;
+extern struct WishFutureKnock gWishFutureKnock;
+extern u16 gIntroSlideFlags;
+extern u8 gSentPokesToOpponent[2];
+extern u16 gDynamicBasePower;
+extern u16 gExpShareExp;
+extern struct BattleEnigmaBerry gEnigmaBerries[MAX_BATTLERS_COUNT];
+extern struct BattleScripting gBattleScripting;
+extern struct BattleStruct *gBattleStruct;
+extern u8 *gLinkBattleSendBuffer;
+extern u8 *gLinkBattleRecvBuffer;
+extern struct BattleResources *gBattleResources;
+extern u8 gActionSelectionCursor[MAX_BATTLERS_COUNT];
+extern u8 gMoveSelectionCursor[MAX_BATTLERS_COUNT];
+extern u8 gBattlerStatusSummaryTaskId[MAX_BATTLERS_COUNT];
+extern u8 gBattlerInMenuId;
+extern bool8 gDoingBattleAnim;
+extern u32 gTransformedPersonalities[MAX_BATTLERS_COUNT];
+extern u8 gPlayerDpadHoldFrames;
+extern struct BattleSpriteData *gBattleSpritesDataPtr;
+extern struct MonSpritesGfx *gMonSpritesGfxPtr;
+extern struct BattleHealthboxInfo *gUnknown_020244D8;
+extern struct BattleHealthboxInfo *gUnknown_020244DC;
+extern u16 gBattleMovePower;
+extern u16 gMoveToLearn;
+extern u8 gBattleMonForms[MAX_BATTLERS_COUNT];
+
+extern void (*gPreBattleCallback1)(void);
+extern void (*gBattleMainFunc)(void);
+extern struct BattleResults gBattleResults;
+extern u8 gLeveledUpInBattle;
+extern void (*gBattlerControllerFuncs[MAX_BATTLERS_COUNT])(void);
+extern u8 gHealthboxSpriteIds[MAX_BATTLERS_COUNT];
+extern u8 gMultiUsePlayerCursor;
+extern u8 gNumberOfMovesToChoose;
+extern u8 gUnknown_03005D7C[MAX_BATTLERS_COUNT];
#endif // GUARD_BATTLE_H
diff --git a/include/battle_anim.h b/include/battle_anim.h
index cc864b024..aa62db46d 100644
--- a/include/battle_anim.h
+++ b/include/battle_anim.h
@@ -56,8 +56,8 @@ void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMo
void DestroyAnimSprite(struct Sprite *sprite);
void DestroyAnimVisualTask(u8 taskId);
void DestroyAnimSoundTask(u8 taskId);
-bool8 IsBattlerSpriteVisible(u8 bank);
-void sub_80A438C(u8 bank, bool8 toBG_2, bool8 setSpriteInvisible);
+bool8 IsBattlerSpriteVisible(u8 battlerId);
+void sub_80A438C(u8 battlerId, bool8 toBG_2, bool8 setSpriteInvisible);
bool8 IsContest(void);
s8 BattleAnimAdjustPanning(s8 pan);
s8 BattleAnimAdjustPanning2(s8 pan);
@@ -76,7 +76,7 @@ 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);
+u8 sub_80A82E4(u8 battlerId);
bool8 AnimateBallThrow(struct Sprite *sprite);
enum
@@ -85,26 +85,26 @@ enum
BANK_Y_POS,
};
-u8 GetBattlerSpriteCoord(u8 bank, u8 attributeId);
+u8 GetBattlerSpriteCoord(u8 battlerId, u8 attributeId);
-bool8 IsBattlerSpritePresent(u8 bank);
+bool8 IsBattlerSpritePresent(u8 battlerId);
void sub_80A6C68(u8 arg0);
-u8 GetAnimBattlerSpriteId(u8 wantedBank);
+u8 GetAnimBattlerSpriteId(u8 wantedBattler);
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 GetBattlerSpriteDefault_Y(u8 bank);
-u8 sub_80A82E4(u8 bank);
-u8 GetSubstituteSpriteDefault_Y(u8 bank);
+u8 GetBattlerSpriteDefault_Y(u8 battlerId);
+u8 sub_80A82E4(u8 battlerId);
+u8 GetSubstituteSpriteDefault_Y(u8 battlerId);
// battle_anim_80A9C70.s
-void LaunchStatusAnimation(u8 bank, u8 statusAnimId);
+void LaunchStatusAnimation(u8 battlerId, 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);
+u8 LaunchBallFadeMonTask(bool8 unFadeLater, u8 battlerId, u32 arg2, u8 ballId);
#endif // GUARD_BATTLE_ANIM_H
diff --git a/include/battle_frontier_2.h b/include/battle_frontier_2.h
index 801c3f3ec..638ff692e 100644
--- a/include/battle_frontier_2.h
+++ b/include/battle_frontier_2.h
@@ -6,5 +6,6 @@ void sub_81A895C(void);
u16 sub_81A89A0(u8);
void sub_81A8AF8(void);
bool8 InBattlePike(void);
+void sub_819FA50(void);
#endif // GUARD_BATTLE_FRONTIER_2_H
diff --git a/include/battle_gfx_sfx_util.h b/include/battle_gfx_sfx_util.h
index 75bc3e003..e1c6325b6 100644
--- a/include/battle_gfx_sfx_util.h
+++ b/include/battle_gfx_sfx_util.h
@@ -8,41 +8,41 @@ 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 TryHandleLaunchBattleTableAnimation(u8 activeBattlerId, u8 attacker, u8 target, u8 tableId, u16 argument);
+void InitAndLaunchSpecialAnimation(u8 activeBattlerId, u8 attacker, u8 target, 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);
+bool8 mplay_80342A4(u8 battlerId);
+void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battlerId);
+void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battlerId);
void nullsub_23(void);
void nullsub_24(u16 species);
-void DecompressTrainerFrontPic(u16 frontPicId, u8 bank);
-void DecompressTrainerBackPic(u16 backPicId, u8 bank);
+void DecompressTrainerFrontPic(u16 frontPicId, u8 battlerId);
+void DecompressTrainerBackPic(u16 backPicId, u8 battlerId);
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);
+bool8 BattleInitAllSprites(u8 *state1, u8 *battlerId);
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 CopyBattleSpriteInvisibility(u8 battlerId);
+void HandleSpeciesGfxDataChange(u8 attacker, u8 target, bool8 notTransform);
+void BattleLoadSubstituteOrMonSpriteGfx(u8 battlerId, bool8 loadMonSprite);
+void LoadBattleMonGfxAndAnimate(u8 battlerId, bool8 loadMonSprite, u8 spriteId);
+void TrySetBehindSubstituteSpriteBit(u8 battlerId, u16 move);
+void ClearBehindSubstituteBit(u8 battlerId);
+void HandleLowHpMusicChange(struct Pokemon *mon, u8 battlerId);
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 SetBattlerShadowSpriteCallback(u8 bank, u16 species);
-void HideBattlerShadowSprite(u8 bank);
+void SetBattlerShadowSpriteCallback(u8 battlerId, u16 species);
+void HideBattlerShadowSprite(u8 battlerId);
void sub_805EF14(void);
-void ClearTemporarySpeciesSpriteData(u8 bank, bool8 dontClearSubstitute);
+void ClearTemporarySpeciesSpriteData(u8 battlerId, bool8 dontClearSubstitute);
void AllocateMonSpritesGfx(void);
void FreeMonSpritesGfx(void);
bool32 ShouldPlayNormalPokeCry(struct Pokemon *mon);
diff --git a/include/battle_main.h b/include/battle_main.h
index 54b5e7da6..d7a522f17 100644
--- a/include/battle_main.h
+++ b/include/battle_main.h
@@ -21,8 +21,8 @@ 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 dp11b_obj_instanciate(u8 battlerId, u8 b, s8 c, s8 d);
+void dp11b_obj_free(u8 battlerId, bool8 b);
void sub_8039E44(struct Sprite *sprite);
void sub_8039E60(struct Sprite *sprite);
void sub_8039E84(struct Sprite *sprite);
@@ -35,12 +35,12 @@ void sub_803B3AC(void); // unused
void sub_803B598(void); // unused
void BattleTurnPassed(void);
u8 IsRunningFromBattleImpossible(void);
-void sub_803BDA0(u8 bank);
+void sub_803BDA0(u8 battlerId);
void SwapTurnOrder(u8 id1, u8 id2);
-u8 GetWhoStrikesFirst(u8 bank1, u8 bank2, bool8 ignoreChosenMoves);
+u8 GetWhoStrikesFirst(u8 battlerId1, u8 battlerId2, bool8 ignoreChosenMoves);
void RunBattleScriptCommands_PopCallbacksStack(void);
void RunBattleScriptCommands(void);
-bool8 TryRunFromBattle(u8 bank);
+bool8 TryRunFromBattle(u8 battlerId);
extern const u8 gStatusConditionString_PoisonJpn[8];
extern const u8 gStatusConditionString_SleepJpn[8];
diff --git a/include/battle_message.h b/include/battle_message.h
index 30ddca469..a68ad1551 100644
--- a/include/battle_message.h
+++ b/include/battle_message.h
@@ -229,6 +229,14 @@ extern const u8* const gPokeblockWasTooXStringTable[];
extern const u8* const gRefereeStringsTable[];
extern const u8* const gStatNamesTable2[];
+extern const u8 gText_BadEgg[];
+extern const u8 gText_StatRose[];
+extern const u8 gText_PkmnsStatChanged2[];
+extern const u8 gText_PkmnGettingPumped[];
+extern const u8 gText_PkmnShroudedInMist[];
+extern const u8 gText_BattleWallyName[];
+extern const u8 gText_PkmnsXPreventsSwitching[];
+
extern const u16 gMissStringIds[];
extern const u16 gTrappingMoves[];
diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h
index 26659ff20..6c84d1f0f 100644
--- a/include/battle_script_commands.h
+++ b/include/battle_script_commands.h
@@ -1,51 +1,6 @@
#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
diff --git a/include/battle_scripts.h b/include/battle_scripts.h
index 2e31a37c5..ffd999660 100644
--- a/include/battle_scripts.h
+++ b/include/battle_scripts.h
@@ -82,7 +82,7 @@ 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_SpikesOnFaintedBattler[];
extern const u8 BattleScript_82DAEE8[];
extern const u8 BattleScript_82DAEFE[];
extern const u8 BattleScript_PerishSongTakesLife[];
diff --git a/include/battle_util.h b/include/battle_util.h
index 56628c11d..d992faa47 100644
--- a/include/battle_util.h
+++ b/include/battle_util.h
@@ -44,7 +44,7 @@
#define BS_GET_PLAYER2 13
#define BS_GET_OPPONENT2 14
-u8 GetBattleBank(u8 caseId);
+u8 GetBattlerForBattleScript(u8 caseId);
void PressurePPLose(u8 bankDef, u8 bankAtk, u16 move);
void PressurePPLoseOnUsingPerishSong(u8 bankAtk);
void PressurePPLoseOnUsingImprision(u8 bankAtk);
diff --git a/include/calculate_base_damage.h b/include/calculate_base_damage.h
deleted file mode 100644
index e9146c188..000000000
--- a/include/calculate_base_damage.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#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/constants/battle.h b/include/constants/battle.h
new file mode 100644
index 000000000..f3d7a8e0e
--- /dev/null
+++ b/include/constants/battle.h
@@ -0,0 +1,284 @@
+#ifndef GUARD_CONSTANTS_BATTLE_H
+#define GUARD_CONSTANTS_BATTLE_H
+
+/*
+ * A battler may be in one of four positions on the field. The first bit determines
+ * what side the battler is on, either the player's side or the opponent's side.
+ * The second bit determines what flank the battler is on, either the left or right.
+ * Note that the opponent's flanks are drawn corresponding to their perspective, so
+ * their right mon appears on the left, and their left mon appears on the right.
+ * The battler ID is usually the same as the position, except in the case of link battles.
+ *
+ * + ------------------------- +
+ * | Opponent's side |
+ * | Right Left |
+ * | 3 1 |
+ * | |
+ * | Player's side |
+ * | Left Right |
+ * | 0 2 |
+ * ----------------------------+
+ * | |
+ * | |
+ * +---------------------------+
+ */
+
+#define MAX_BATTLERS_COUNT 4
+
+#define B_POSITION_PLAYER_LEFT 0
+#define B_POSITION_OPPONENT_LEFT 1
+#define B_POSITION_PLAYER_RIGHT 2
+#define B_POSITION_OPPONENT_RIGHT 3
+
+// These macros can be used with either battler ID or positions to get the partner or the opposite mon
+#define BATTLE_OPPOSITE(id) ((id) ^ 1)
+#define BATTLE_PARTNER(id) ((id) ^ 2)
+
+#define B_SIDE_PLAYER 0
+#define B_SIDE_OPPONENT 1
+
+#define B_FLANK_LEFT 0
+#define B_FLANK_RIGHT 1
+
+#define BIT_SIDE 1
+#define BIT_FLANK 2
+
+// Battle Type Flags
+#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_PIKE 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_KYOGRE 0x20000000
+#define BATTLE_TYPE_RAYQUAZA 0x40000000
+#define BATTLE_TYPE_x80000000 0x80000000
+#define BATTLE_TYPE_FRONTIER (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_DOME | BATTLE_TYPE_PALACE | BATTLE_TYPE_ARENA | BATTLE_TYPE_FACTORY | BATTLE_TYPE_PIKE | 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_PIKE)
+
+// Battle Outcome defines
+#define B_OUTCOME_WON 0x1
+#define B_OUTCOME_LOST 0x2
+#define B_OUTCOME_DREW 0x3
+#define B_OUTCOME_RAN 0x4
+#define B_OUTCOME_PLAYER_TELEPORTED 0x5
+#define B_OUTCOME_MON_FLED 0x6
+#define B_OUTCOME_CAUGHT 0x7
+#define B_OUTCOME_NO_SAFARI_BALLS 0x8
+#define B_OUTCOME_FORFEITED 0x9
+#define B_OUTCOME_MON_TELEPORTED 0xA
+#define B_OUTCOME_LINK_BATTLE_RAN 0x80
+
+// Non-volatile status conditions
+// These persist remain outside of battle and after switching out
+#define STATUS1_NONE 0x0
+#define STATUS1_SLEEP 0x7
+#define STATUS1_POISON 0x8
+#define STATUS1_BURN 0x10
+#define STATUS1_FREEZE 0x20
+#define STATUS1_PARALYSIS 0x40
+#define STATUS1_TOXIC_POISON 0x80
+#define STATUS1_TOXIC_COUNTER 0xF00
+#define STATUS1_PSN_ANY (STATUS1_POISON | STATUS1_TOXIC_POISON)
+#define STATUS1_ANY (STATUS1_SLEEP | STATUS1_POISON | STATUS1_BURN | STATUS1_FREEZE | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON)
+
+// Volatile status ailments
+// These are removed after exiting the battle or switching out
+#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 battler
+#define STATUS2_INFATUATED_WITH(battler) (gBitTable[battler] << 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
+
+// Seems like per-battler statuses. Not quite sure how to categorize these
+#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)
+
+// Not really sure what a "hitmarker" is.
+#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(battler) (gBitTable[battler] << 0x1C)
+#define HITMARKER_UNK(battler) (0x10000000 << battler)
+
+// Per-side statuses that affect an entire party
+#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)
+
+// Flags describing move's result
+#define MOVE_RESULT_MISSED (1 << 0)
+#define MOVE_RESULT_SUPER_EFFECTIVE (1 << 1)
+#define MOVE_RESULT_NOT_VERY_EFFECTIVE (1 << 2)
+#define MOVE_RESULT_DOESNT_AFFECT_FOE (1 << 3)
+#define MOVE_RESULT_ONE_HIT_KO (1 << 4)
+#define MOVE_RESULT_FAILED (1 << 5)
+#define MOVE_RESULT_FOE_ENDURED (1 << 6)
+#define MOVE_RESULT_FOE_HUNG_ON (1 << 7)
+#define MOVE_RESULT_NO_EFFECT (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED)
+
+// Battle Weather flags
+#define WEATHER_RAIN_TEMPORARY (1 << 0)
+#define WEATHER_RAIN_DOWNPOUR (1 << 1) // unused
+#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)
+
+// Move Effects
+#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
+
+#endif // GUARD_CONSTANTS_BATTLE_H
diff --git a/include/constants/battle_ai.h b/include/constants/battle_ai.h
index 9d89d75f0..7d2c70307 100644
--- a/include/constants/battle_ai.h
+++ b/include/constants/battle_ai.h
@@ -1,7 +1,7 @@
-#ifndef GUARD_BATTLE_AI_H
-#define GUARD_BATTLE_AI_H
+#ifndef GUARD_CONSTANTS_BATTLE_AI_H
+#define GUARD_CONSTANTS_BATTLE_AI_H
-// banks enum
+// battlers
#define AI_TARGET 0
#define AI_USER 1
#define AI_TARGET_PARTNER 2
@@ -22,7 +22,7 @@
#define AI_EFFECTIVENESS_x0_25 10
#define AI_EFFECTIVENESS_x0 0
-// ai weather enum
+// ai weather
#define AI_WEATHER_SUN 0
#define AI_WEATHER_RAIN 1
#define AI_WEATHER_SANDSTORM 2
@@ -49,4 +49,4 @@
#define AI_SCRIPT_SAFARI (1 << 30)
#define AI_SCRIPT_FIRST_BATTLE (1 << 31)
-#endif // GUARD_BATTLE_AI_H
+#endif // GUARD_CONSTANTS_BATTLE_AI_H
diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h
index de2fbebb1..270ac55e0 100644
--- a/include/constants/battle_anim.h
+++ b/include/constants/battle_anim.h
@@ -1,7 +1,7 @@
#ifndef GUARD_CONSTANTS_BATTLE_ANIM_H
#define GUARD_CONSTANTS_BATTLE_ANIM_H
-// banks enum used in scripts
+// battlers
#define ANIM_ATTACKER 0
#define ANIM_TARGET 1
#define ANIM_ATK_PARTNER 2
diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h
new file mode 100644
index 000000000..0390f17f4
--- /dev/null
+++ b/include/constants/battle_script_commands.h
@@ -0,0 +1,97 @@
+#ifndef GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H
+#define GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H
+
+// Battle Scripting and BattleCommunication addresses
+#define sPAINSPLIT_HP gBattleScripting
+#define sBIDE_DMG gBattleScripting + 4
+#define sMULTIHIT_STRING gBattleScripting + 8
+#define sDMG_MULTIPLIER gBattleScripting + 0xE
+#define sTWOTURN_STRINGID gBattleScripting + 0xF
+#define sB_ANIM_ARG1 gBattleScripting + 0x10
+#define sB_ANIM_ARG2 gBattleScripting + 0x11
+#define sTRIPLE_KICK_POWER gBattleScripting + 0x12
+#define sMOVEEND_STATE gBattleScripting + 0x14
+#define sBANK_WITH_ABILITY gBattleScripting + 0x15
+#define sMULTIHIT_EFFECT gBattleScripting + 0x16
+#define sBANK gBattleScripting + 0x17
+#define sB_ANIM_TURN gBattleScripting + 0x18
+#define sB_ANIM_TARGETS_HIT gBattleScripting + 0x19
+#define sSTATCHANGER gBattleScripting + 0x1A
+#define sFIELD_1B gBattleScripting + 0x1B
+#define sGIVEEXP_STATE gBattleScripting + 0x1C
+#define sBATTLE_STYLE gBattleScripting + 0x1D
+#define sLVLBOX_STATE gBattleScripting + 0x1E
+#define sLEARNMOVE_STATE gBattleScripting + 0x1F
+#define sFIELD_20 gBattleScripting + 0x20
+#define sRESHOW_MAIN_STATE gBattleScripting + 0x21
+#define sRESHOW_HELPER_STATE gBattleScripting + 0x22
+#define sFIELD_23 gBattleScripting + 0x23
+#define sFIELD_24 gBattleScripting + 0x24
+#define sMULTIPLAYER_ID gBattleScripting + 0x25
+
+#define cEFFECT_CHOOSER gBattleCommunication + 3
+#define cMULTISTRING_CHOOSER gBattleCommunication + 5
+
+// Battle Script defines for getting the wanted battler
+#define BS_TARGET 0
+#define BS_ATTACKER 1
+#define BS_EFFECT_BATTLER 2
+#define BS_FAINTED 3
+#define BS_BANK_0 7
+#define BS_ATTACKER_WITH_PARTNER 4 // for atk98_status_icon_update
+#define BS_ATTACKER_SIDE 8 // for atk1E_jumpifability
+#define BS_NOT_ATTACKER_SIDE 9 // for atk1E_jumpifability
+#define BS_SCRIPTING 10
+#define BS_PLAYER1 11
+#define BS_OPPONENT1 12
+#define BS_PLAYER2 13
+#define BS_OPPONENT2 14
+
+// atk 01, accuracy calc
+#define NO_ACC_CALC 0xFFFE
+#define NO_ACC_CALC_CHECK_LOCK_ON 0xFFFF
+#define ACC_CURR_MOVE 0
+
+// compare operands
+#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
+
+// atk76, various
+#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
+
+// atk80, dmg manipulation
+#define ATK80_DMG_CHANGE_SIGN 0
+#define ATK80_DMG_HALF_BY_TWO_NOT_MORE_THAN_HALF_MAX_HP 1
+#define ATK80_DMG_DOUBLED 2
+
+// atk4F, a flag used for the jumpifcantswitch command
+#define ATK4F_DONT_CHECK_STATUSES 0x80
+
+// statchange defines
+#define STAT_CHANGE_BS_PTR 0x1
+#define STAT_CHANGE_NOT_PROTECT_AFFECTED 0x20
+#define STAT_CHANGE_WORKED 0
+#define STAT_CHANGE_DIDNT_WORK 1
+
+// atk48
+#define ATK48_STAT_NEGATIVE 0x1
+#define ATK48_STAT_BY_TWO 0x2
+#define ATK48_BIT_x4 0x4
+#define ATK48_LOWER_FAIL_CHECK 0x8
+
+#endif // GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H
diff --git a/include/battle_string_ids.h b/include/constants/battle_string_ids.h
index f242284b0..db9ed59bd 100644
--- a/include/battle_string_ids.h
+++ b/include/constants/battle_string_ids.h
@@ -1,5 +1,5 @@
-#ifndef GUARD_BATTLE_STRING_IDS_H
-#define GUARD_BATTLE_STRING_IDS_H
+#ifndef GUARD_CONSTANTS_BATTLE_STRING_IDS_H
+#define GUARD_CONSTANTS_BATTLE_STRING_IDS_H
#define BATTLESTRINGS_COUNT 369
@@ -12,7 +12,6 @@
#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
@@ -384,4 +383,4 @@
#define STRINGID_TRAINER1WINTEXT 379
#define STRINGID_TRAINER2WINTEXT 380
-#endif // GUARD_BATTLE_STRING_IDS_H
+#endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H
diff --git a/include/constants/items.h b/include/constants/items.h
index ca6fdbf64..8717ecbd5 100644
--- a/include/constants/items.h
+++ b/include/constants/items.h
@@ -464,4 +464,7 @@
#define NUM_TECHNICAL_MACHINES 50
#define NUM_HIDDEN_MACHINES 8
+// Check if the item is one that can be used on a Pokemon.
+#define IS_POKEMON_ITEM(item) ((item) >= ITEM_POTION && (item) <= ITEM_0B2)
+
#endif // GUARD_CONSTANTS_ITEMS_H
diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h
new file mode 100644
index 000000000..78c1583b4
--- /dev/null
+++ b/include/constants/pokemon.h
@@ -0,0 +1,80 @@
+#ifndef GUARD_CONSTANTS_POKEMON_H
+#define GUARD_CONSTANTS_POKEMON_H
+
+// Pokemon types
+#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
+
+// Pokemon egg groups
+#define EGG_GROUP_NONE 0
+#define EGG_GROUP_MONSTER 1
+#define EGG_GROUP_WATER_1 2
+#define EGG_GROUP_BUG 3
+#define EGG_GROUP_FLYING 4
+#define EGG_GROUP_FIELD 5
+#define EGG_GROUP_FAIRY 6
+#define EGG_GROUP_GRASS 7
+#define EGG_GROUP_HUMAN_LIKE 8
+#define EGG_GROUP_WATER_3 9
+#define EGG_GROUP_MINERAL 10
+#define EGG_GROUP_AMORPHOUS 11
+#define EGG_GROUP_WATER_2 12
+#define EGG_GROUP_DITTO 13
+#define EGG_GROUP_DRAGON 14
+#define EGG_GROUP_UNDISCOVERED 15
+
+// Pokemon natures
+#define NATURE_HARDY 0
+#define NATURE_LONELY 1
+#define NATURE_BRAVE 2
+#define NATURE_ADAMANT 3
+#define NATURE_NAUGHTY 4
+#define NATURE_BOLD 5
+#define NATURE_DOCILE 6
+#define NATURE_RELAXED 7
+#define NATURE_IMPISH 8
+#define NATURE_LAX 9
+#define NATURE_TIMID 10
+#define NATURE_HASTY 11
+#define NATURE_SERIOUS 12
+#define NATURE_JOLLY 13
+#define NATURE_NAIVE 14
+#define NATURE_MODEST 15
+#define NATURE_MILD 16
+#define NATURE_QUIET 17
+#define NATURE_BASHFUL 18
+#define NATURE_RASH 19
+#define NATURE_CALM 20
+#define NATURE_GENTLE 21
+#define NATURE_SASSY 22
+#define NATURE_CAREFUL 23
+#define NATURE_QUIRKY 24
+
+// Pokemon Stats
+#define STAT_HP 0
+#define STAT_ATK 1
+#define STAT_DEF 2
+#define STAT_SPEED 3
+#define STAT_SPATK 4
+#define STAT_SPDEF 5
+#define STAT_ACC 6 // only in battles
+#define STAT_EVASION 7 // only in battles
+
+#endif // GUARD_CONSTANTS_POKEMON_H
diff --git a/include/constants/trainers.h b/include/constants/trainers.h
index 48d4f081e..a017b6975 100644
--- a/include/constants/trainers.h
+++ b/include/constants/trainers.h
@@ -956,13 +956,13 @@
#define FACILITY_CLASS_HIKER 0x0
#define FACILITY_CLASS_TEAM_AQUA_1 0x1
#define FACILITY_CLASS_PKMN_BREEDER_1 0x2
-#define FACILITY_CLASS_COOLTRAINER_1 0x3
+#define FACILITY_CLASS_COOLTRAINER_M 0x3
#define FACILITY_CLASS_BIRD_KEEPER 0x4
#define FACILITY_CLASS_COLLECTOR 0x5
#define FACILITY_CLASS_TEAM_AQUA_2 0x6
#define FACILITY_CLASS_SWIMMER_M 0x7
#define FACILITY_CLASS_TEAM_MAGMA_1 0x8
-#define FACILITY_CLASS_EXPERT_1 0x9
+#define FACILITY_CLASS_EXPERT_M 0x9
#define FACILITY_CLASS_BLACK_BELT 0xa
#define FACILITY_CLASS_AQUA_LEADER 0xb
#define FACILITY_CLASS_HEX_MANIAC 0xc
@@ -971,7 +971,7 @@
#define FACILITY_CLASS_INTERVIEWER 0xf
#define FACILITY_CLASS_TUBER_1 0x10
#define FACILITY_CLASS_TUBER_2 0x11
-#define FACILITY_CLASS_COOLTRAINER_2 0x12
+#define FACILITY_CLASS_COOLTRAINER_F 0x12
#define FACILITY_CLASS_LADY 0x13
#define FACILITY_CLASS_BEAUTY 0x14
#define FACILITY_CLASS_RICH_BOY 0x15
@@ -983,16 +983,16 @@
#define FACILITY_CLASS_CAMPER 0x1b
#define FACILITY_CLASS_PICNICKER 0x1c
#define FACILITY_CLASS_BUG_MANIAC 0x1d
-#define FACILITY_CLASS_PSYCHIC_1 0x1e
-#define FACILITY_CLASS_PSYCHIC_2 0x1f
+#define FACILITY_CLASS_PSYCHIC_M 0x1e
+#define FACILITY_CLASS_PSYCHIC_F 0x1f
#define FACILITY_CLASS_GENTLEMAN 0x20
#define FACILITY_CLASS_ELITE_FOUR_1 0x21
#define FACILITY_CLASS_ELITE_FOUR_2 0x22
#define FACILITY_CLASS_LEADER_1 0x23
#define FACILITY_CLASS_LEADER_2 0x24
#define FACILITY_CLASS_LEADER_3 0x25
-#define FACILITY_CLASS_SCHOOL_KID_1 0x26
-#define FACILITY_CLASS_SCHOOL_KID_2 0x27
+#define FACILITY_CLASS_SCHOOL_KID_M 0x26
+#define FACILITY_CLASS_SCHOOL_KID_F 0x27
#define FACILITY_CLASS_SR_AND_JR 0x28
#define FACILITY_CLASS_POKEFAN_1 0x29
#define FACILITY_CLASS_POKEFAN_2 0x2a
@@ -1013,28 +1013,28 @@
#define FACILITY_CLASS_TWINS 0x39
#define FACILITY_CLASS_SAILOR 0x3a
#define FACILITY_CLASS_PKMN_TRAINER_1 0x3b
-#define FACILITY_CLASS_PKMN_TRAINER_2 0x3c
+#define FACILITY_CLASS_PKMN_TRAINER_MAY 0x3c
#define FACILITY_CLASS_PKMN_TRAINER_3 0x3d
#define FACILITY_CLASS_PKMN_TRAINER_4 0x3e
-#define FACILITY_CLASS_PKMN_TRAINER_5 0x3f
+#define FACILITY_CLASS_PKMN_TRAINER_BRENDAN 0x3f
#define FACILITY_CLASS_PKMN_TRAINER_6 0x40
#define FACILITY_CLASS_PKMN_TRAINER_7 0x41
#define FACILITY_CLASS_PKMN_BREEDER_2 0x42
#define FACILITY_CLASS_BUG_CATCHER 0x43
-#define FACILITY_CLASS_PKMN_RANGER_1 0x44
-#define FACILITY_CLASS_PKMN_RANGER_2 0x45
+#define FACILITY_CLASS_PKMN_RANGER_M 0x44
+#define FACILITY_CLASS_PKMN_RANGER_F 0x45
#define FACILITY_CLASS_MAGMA_LEADER 0x46
#define FACILITY_CLASS_LASS 0x47
#define FACILITY_CLASS_YOUNG_COUPLE 0x48
#define FACILITY_CLASS_OLD_COUPLE 0x49
#define FACILITY_CLASS_SIS_AND_BRO 0x4a
-#define FACILITY_CLASS_PKMN_TRAINER_8 0x4b
+#define FACILITY_CLASS_PKMN_TRAINER_STEVEN 0x4b
#define FACILITY_CLASS_SALON_MAIDEN 0x4c
#define FACILITY_CLASS_DOME_ACE 0x4d
-#define FACILITY_CLASS_PKMN_TRAINER_9 0x4e
-#define FACILITY_CLASS_PKMN_TRAINER_10 0x4f
-#define FACILITY_CLASS_PKMN_TRAINER_11 0x50
-#define FACILITY_CLASS_PKMN_TRAINER_12 0x51
+#define FACILITY_CLASS_PKMN_TRAINER_RED 0x4e
+#define FACILITY_CLASS_PKMN_TRAINER_LEAF 0x4f
+#define FACILITY_CLASS_PKMN_TRAINER_RS_BRENDAN 0x50
+#define FACILITY_CLASS_PKMN_TRAINER_RS_MAY 0x51
#define TRAINER_CLASS_PKMN_TRAINER_1 0x0
#define TRAINER_CLASS_PKMN_TRAINER_2 0x1
diff --git a/include/crt0.h b/include/crt0.h
new file mode 100644
index 000000000..3121eeaed
--- /dev/null
+++ b/include/crt0.h
@@ -0,0 +1,11 @@
+#ifndef GUARD_CRT0_H
+#define GUARD_CRT0_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+extern u32 IntrMain[];
+
+#endif //GUARD_CRT0_H
diff --git a/include/data/pokemon/trainer_class_lookups.h b/include/data/pokemon/trainer_class_lookups.h
index 2ffe9cd85..ec4dbf0fb 100644
--- a/include/data/pokemon/trainer_class_lookups.h
+++ b/include/data/pokemon/trainer_class_lookups.h
@@ -6,13 +6,13 @@ const u8 gFacilityClassToPicIndex[] =
TRAINER_PIC_HIKER, // FACILITY_CLASS_HIKER
TRAINER_PIC_AQUA_GRUNT_M, // FACILITY_CLASS_TEAM_AQUA_1
TRAINER_PIC_POKEMON_BREEDER_F, // FACILITY_CLASS_PKMN_BREEDER_1
- TRAINER_PIC_COOL_TRAINER_M, // FACILITY_CLASS_COOLTRAINER_1
+ TRAINER_PIC_COOL_TRAINER_M, // FACILITY_CLASS_COOLTRAINER_M
TRAINER_PIC_BIRD_KEEPER, // FACILITY_CLASS_BIRD_KEEPER
TRAINER_PIC_COLLECTOR, // FACILITY_CLASS_COLLECTOR
TRAINER_PIC_AQUA_GRUNT_F, // FACILITY_CLASS_TEAM_AQUA_2
TRAINER_PIC_SWIMMER_M, // FACILITY_CLASS_SWIMMER_M
TRAINER_PIC_MAGMA_GRUNT_M, // FACILITY_CLASS_TEAM_MAGMA_1
- TRAINER_PIC_EXPERT_M, // FACILITY_CLASS_EXPERT_1
+ TRAINER_PIC_EXPERT_M, // FACILITY_CLASS_EXPERT_M
TRAINER_PIC_BLACK_BELT, // FACILITY_CLASS_BLACK_BELT
TRAINER_PIC_AQUA_LEADER_ARCHIE, // FACILITY_CLASS_AQUA_LEADER
TRAINER_PIC_HEX_MANIAC, // FACILITY_CLASS_HEX_MANIAC
@@ -21,7 +21,7 @@ const u8 gFacilityClassToPicIndex[] =
TRAINER_PIC_INTERVIEWER, // FACILITY_CLASS_INTERVIEWER
TRAINER_PIC_TUBER_F, // FACILITY_CLASS_TUBER_1
TRAINER_PIC_TUBER_M, // FACILITY_CLASS_TUBER_2
- TRAINER_PIC_COOL_TRAINER_F, // FACILITY_CLASS_COOLTRAINER_2
+ TRAINER_PIC_COOL_TRAINER_F, // FACILITY_CLASS_COOLTRAINER_F
TRAINER_PIC_LADY, // FACILITY_CLASS_LADY
TRAINER_PIC_BEAUTY, // FACILITY_CLASS_BEAUTY
TRAINER_PIC_RICH_BOY, // FACILITY_CLASS_RICH_BOY
@@ -33,16 +33,16 @@ const u8 gFacilityClassToPicIndex[] =
TRAINER_PIC_CAMPER, // FACILITY_CLASS_CAMPER
TRAINER_PIC_PICNICKER, // FACILITY_CLASS_PICNICKER
TRAINER_PIC_BUG_MANIAC, // FACILITY_CLASS_BUG_MANIAC
- TRAINER_PIC_PSYCHIC_M, // FACILITY_CLASS_PSYCHIC_1
- TRAINER_PIC_PSYCHIC_F, // FACILITY_CLASS_PSYCHIC_2
+ TRAINER_PIC_PSYCHIC_M, // FACILITY_CLASS_PSYCHIC_M
+ TRAINER_PIC_PSYCHIC_F, // FACILITY_CLASS_PSYCHIC_F
TRAINER_PIC_GENTLEMAN, // FACILITY_CLASS_GENTLEMAN
TRAINER_PIC_ELITE_FOUR_SIDNEY, // FACILITY_CLASS_ELITE_FOUR_1
TRAINER_PIC_ELITE_FOUR_PHOEBE, // FACILITY_CLASS_ELITE_FOUR_2
TRAINER_PIC_LEADER_ROXANNE, // FACILITY_CLASS_LEADER_1
TRAINER_PIC_LEADER_BRAWLY, // FACILITY_CLASS_LEADER_2
TRAINER_PIC_LEADER_TATE_AND_LIZA, // FACILITY_CLASS_LEADER_3
- TRAINER_PIC_SCHOOL_KID_M, // FACILITY_CLASS_SCHOOL_KID_1
- TRAINER_PIC_SCHOOL_KID_F, // FACILITY_CLASS_SCHOOL_KID_2
+ TRAINER_PIC_SCHOOL_KID_M, // FACILITY_CLASS_SCHOOL_KID_M
+ TRAINER_PIC_SCHOOL_KID_F, // FACILITY_CLASS_SCHOOL_KID_F
TRAINER_PIC_SR_AND_JR, // FACILITY_CLASS_SR_AND_JR
TRAINER_PIC_WINSTRATE_M, // FACILITY_CLASS_POKEFAN_1
TRAINER_PIC_WINSTRATE_F, // FACILITY_CLASS_POKEFAN_2
@@ -63,28 +63,28 @@ const u8 gFacilityClassToPicIndex[] =
TRAINER_PIC_TWINS, // FACILITY_CLASS_TWINS
TRAINER_PIC_SAILOR, // FACILITY_CLASS_SAILOR
TRAINER_PIC_WALLY, // FACILITY_CLASS_PKMN_TRAINER_1
- TRAINER_PIC_BRENDAN, // FACILITY_CLASS_PKMN_TRAINER_2
+ TRAINER_PIC_BRENDAN, // FACILITY_CLASS_PKMN_TRAINER_MAY
TRAINER_PIC_BRENDAN, // FACILITY_CLASS_PKMN_TRAINER_3
TRAINER_PIC_BRENDAN, // FACILITY_CLASS_PKMN_TRAINER_4
- TRAINER_PIC_MAY, // FACILITY_CLASS_PKMN_TRAINER_5
+ TRAINER_PIC_MAY, // FACILITY_CLASS_PKMN_TRAINER_BRENDAN
TRAINER_PIC_MAY, // FACILITY_CLASS_PKMN_TRAINER_6
TRAINER_PIC_MAY, // FACILITY_CLASS_PKMN_TRAINER_7
TRAINER_PIC_POKEMON_BREEDER_M, // FACILITY_CLASS_PKMN_BREEDER_2
TRAINER_PIC_BUG_CATCHER, // FACILITY_CLASS_BUG_CATCHER
- TRAINER_PIC_POKEMON_RANGER_M, // FACILITY_CLASS_PKMN_RANGER_1
- TRAINER_PIC_POKEMON_RANGER_F, // FACILITY_CLASS_PKMN_RANGER_2
+ TRAINER_PIC_POKEMON_RANGER_M, // FACILITY_CLASS_PKMN_RANGER_M
+ TRAINER_PIC_POKEMON_RANGER_F, // FACILITY_CLASS_PKMN_RANGER_F
TRAINER_PIC_MAGMA_LEADER_MAXIE, // FACILITY_CLASS_MAGMA_LEADER
TRAINER_PIC_LASS, // FACILITY_CLASS_LASS
TRAINER_PIC_YOUNG_COUPLE, // FACILITY_CLASS_YOUNG_COUPLE
TRAINER_PIC_OLD_COUPLE, // FACILITY_CLASS_OLD_COUPLE
TRAINER_PIC_SIS_AND_BRO, // FACILITY_CLASS_SIS_AND_BRO
- TRAINER_PIC_STEVEN, // FACILITY_CLASS_PKMN_TRAINER_8
+ TRAINER_PIC_STEVEN, // FACILITY_CLASS_PKMN_TRAINER_STEVEN
TRAINER_PIC_SALON_MAIDEN_ANABEL, // FACILITY_CLASS_SALON_MAIDEN
TRAINER_PIC_DOME_ACE_TUCKER, // FACILITY_CLASS_DOME_ACE
- TRAINER_PIC_RED, // FACILITY_CLASS_PKMN_TRAINER_9
- TRAINER_PIC_LEAF, // FACILITY_CLASS_PKMN_TRAINER_10
- TRAINER_PIC_RUBY_SAPPHIRE_BRENDAN, // FACILITY_CLASS_PKMN_TRAINER_11
- TRAINER_PIC_RUBY_SAPPHIRE_MAY, // FACILITY_CLASS_PKMN_TRAINER_12
+ TRAINER_PIC_RED, // FACILITY_CLASS_PKMN_TRAINER_RED
+ TRAINER_PIC_LEAF, // FACILITY_CLASS_PKMN_TRAINER_LEAF
+ TRAINER_PIC_RUBY_SAPPHIRE_BRENDAN, // FACILITY_CLASS_PKMN_TRAINER_RS_BRENDAN
+ TRAINER_PIC_RUBY_SAPPHIRE_MAY, // FACILITY_CLASS_PKMN_TRAINER_RS_MAY
};
const u8 gFacilityClassToTrainerClass[] =
@@ -92,13 +92,13 @@ const u8 gFacilityClassToTrainerClass[] =
TRAINER_CLASS_HIKER, // FACILITY_CLASS_HIKER
TRAINER_CLASS_TEAM_AQUA, // FACILITY_CLASS_TEAM_AQUA_1
TRAINER_CLASS_PKMN_BREEDER, // FACILITY_CLASS_PKMN_BREEDER_1
- TRAINER_CLASS_COOLTRAINER_1, // FACILITY_CLASS_COOLTRAINER_1
+ TRAINER_CLASS_COOLTRAINER_1, // FACILITY_CLASS_COOLTRAINER_M
TRAINER_CLASS_BIRD_KEEPER, // FACILITY_CLASS_BIRD_KEEPER
TRAINER_CLASS_COLLECTOR, // FACILITY_CLASS_COLLECTOR
TRAINER_CLASS_TEAM_AQUA, // FACILITY_CLASS_TEAM_AQUA_2
TRAINER_CLASS_SWIMMER_M, // FACILITY_CLASS_SWIMMER_M
TRAINER_CLASS_TEAM_MAGMA, // FACILITY_CLASS_TEAM_MAGMA_1
- TRAINER_CLASS_EXPERT, // FACILITY_CLASS_EXPERT_1
+ TRAINER_CLASS_EXPERT, // FACILITY_CLASS_EXPERT_M
TRAINER_CLASS_BLACK_BELT, // FACILITY_CLASS_BLACK_BELT
TRAINER_CLASS_AQUA_LEADER, // FACILITY_CLASS_AQUA_LEADER
TRAINER_CLASS_HEX_MANIAC, // FACILITY_CLASS_HEX_MANIAC
@@ -107,7 +107,7 @@ const u8 gFacilityClassToTrainerClass[] =
TRAINER_CLASS_INTERVIEWER, // FACILITY_CLASS_INTERVIEWER
TRAINER_CLASS_TUBER_1, // FACILITY_CLASS_TUBER_1
TRAINER_CLASS_TUBER_2, // FACILITY_CLASS_TUBER_2
- TRAINER_CLASS_COOLTRAINER_1, // FACILITY_CLASS_COOLTRAINER_2
+ TRAINER_CLASS_COOLTRAINER_1, // FACILITY_CLASS_COOLTRAINER_F
TRAINER_CLASS_LADY, // FACILITY_CLASS_LADY
TRAINER_CLASS_BEAUTY, // FACILITY_CLASS_BEAUTY
TRAINER_CLASS_RICH_BOY, // FACILITY_CLASS_RICH_BOY
@@ -119,16 +119,16 @@ const u8 gFacilityClassToTrainerClass[] =
TRAINER_CLASS_CAMPER, // FACILITY_CLASS_CAMPER
TRAINER_CLASS_PICNICKER, // FACILITY_CLASS_PICNICKER
TRAINER_CLASS_BUG_MANIAC, // FACILITY_CLASS_BUG_MANIAC
- TRAINER_CLASS_PSYCHIC, // FACILITY_CLASS_PSYCHIC_1
- TRAINER_CLASS_PSYCHIC, // FACILITY_CLASS_PSYCHIC_2
+ TRAINER_CLASS_PSYCHIC, // FACILITY_CLASS_PSYCHIC_M
+ TRAINER_CLASS_PSYCHIC, // FACILITY_CLASS_PSYCHIC_F
TRAINER_CLASS_GENTLEMAN, // FACILITY_CLASS_GENTLEMAN
TRAINER_CLASS_ELITE_FOUR, // FACILITY_CLASS_ELITE_FOUR_1
TRAINER_CLASS_ELITE_FOUR, // FACILITY_CLASS_ELITE_FOUR_2
TRAINER_CLASS_LEADER, // FACILITY_CLASS_LEADER_1
TRAINER_CLASS_LEADER, // FACILITY_CLASS_LEADER_2
TRAINER_CLASS_LEADER, // FACILITY_CLASS_LEADER_3
- TRAINER_CLASS_SCHOOL_KID, // FACILITY_CLASS_SCHOOL_KID_1
- TRAINER_CLASS_SCHOOL_KID, // FACILITY_CLASS_SCHOOL_KID_2
+ TRAINER_CLASS_SCHOOL_KID, // FACILITY_CLASS_SCHOOL_KID_M
+ TRAINER_CLASS_SCHOOL_KID, // FACILITY_CLASS_SCHOOL_KID_F
TRAINER_CLASS_SR_AND_JR, // FACILITY_CLASS_SR_AND_JR
TRAINER_CLASS_POKEFAN, // FACILITY_CLASS_POKEFAN_1
TRAINER_CLASS_POKEFAN, // FACILITY_CLASS_POKEFAN_2
@@ -149,28 +149,28 @@ const u8 gFacilityClassToTrainerClass[] =
TRAINER_CLASS_TWINS, // FACILITY_CLASS_TWINS
TRAINER_CLASS_SAILOR, // FACILITY_CLASS_SAILOR
TRAINER_CLASS_PKMN_TRAINER_3, // FACILITY_CLASS_PKMN_TRAINER_1
- TRAINER_CLASS_PKMN_TRAINER_3, // FACILITY_CLASS_PKMN_TRAINER_2
+ TRAINER_CLASS_PKMN_TRAINER_3, // FACILITY_CLASS_PKMN_TRAINER_MAY
TRAINER_CLASS_PKMN_TRAINER_3, // FACILITY_CLASS_PKMN_TRAINER_3
TRAINER_CLASS_PKMN_TRAINER_3, // FACILITY_CLASS_PKMN_TRAINER_4
- TRAINER_CLASS_PKMN_TRAINER_3, // FACILITY_CLASS_PKMN_TRAINER_5
+ TRAINER_CLASS_PKMN_TRAINER_3, // FACILITY_CLASS_PKMN_TRAINER_BRENDAN
TRAINER_CLASS_PKMN_TRAINER_3, // FACILITY_CLASS_PKMN_TRAINER_6
TRAINER_CLASS_PKMN_TRAINER_3, // FACILITY_CLASS_PKMN_TRAINER_7
TRAINER_CLASS_PKMN_BREEDER, // FACILITY_CLASS_PKMN_BREEDER_2
TRAINER_CLASS_BUG_CATCHER, // FACILITY_CLASS_BUG_CATCHER
- TRAINER_CLASS_PKMN_RANGER, // FACILITY_CLASS_PKMN_RANGER_1
- TRAINER_CLASS_PKMN_RANGER, // FACILITY_CLASS_PKMN_RANGER_2
+ TRAINER_CLASS_PKMN_RANGER, // FACILITY_CLASS_PKMN_RANGER_M
+ TRAINER_CLASS_PKMN_RANGER, // FACILITY_CLASS_PKMN_RANGER_F
TRAINER_CLASS_MAGMA_LEADER, // FACILITY_CLASS_MAGMA_LEADER
TRAINER_CLASS_LASS, // FACILITY_CLASS_LASS
TRAINER_CLASS_YOUNG_COUPLE, // FACILITY_CLASS_YOUNG_COUPLE
TRAINER_CLASS_OLD_COUPLE, // FACILITY_CLASS_OLD_COUPLE
TRAINER_CLASS_SIS_AND_BRO, // FACILITY_CLASS_SIS_AND_BRO
- TRAINER_CLASS_PKMN_TRAINER_3, // FACILITY_CLASS_PKMN_TRAINER_8
+ TRAINER_CLASS_PKMN_TRAINER_3, // FACILITY_CLASS_PKMN_TRAINER_STEVEN
TRAINER_CLASS_SALON_MAIDEN, // FACILITY_CLASS_SALON_MAIDEN
TRAINER_CLASS_DOME_ACE, // FACILITY_CLASS_DOME_ACE
- TRAINER_CLASS_PKMN_TRAINER_3, // FACILITY_CLASS_PKMN_TRAINER_9
- TRAINER_CLASS_PKMN_TRAINER_3, // FACILITY_CLASS_PKMN_TRAINER_10
- TRAINER_CLASS_PKMN_TRAINER_4, // FACILITY_CLASS_PKMN_TRAINER_11
- TRAINER_CLASS_PKMN_TRAINER_4, // FACILITY_CLASS_PKMN_TRAINER_12
+ TRAINER_CLASS_PKMN_TRAINER_3, // FACILITY_CLASS_PKMN_TRAINER_RED
+ TRAINER_CLASS_PKMN_TRAINER_3, // FACILITY_CLASS_PKMN_TRAINER_LEAF
+ TRAINER_CLASS_PKMN_TRAINER_4, // FACILITY_CLASS_PKMN_TRAINER_RS_BRENDAN
+ TRAINER_CLASS_PKMN_TRAINER_4, // FACILITY_CLASS_PKMN_TRAINER_RS_MAY
};
#endif //POKEEMERALD_TRAINER_CLASS_LOOKUPS_H
diff --git a/include/decompress.h b/include/decompress.h
index 34a678cda..b7515250a 100644
--- a/include/decompress.h
+++ b/include/decompress.h
@@ -28,6 +28,7 @@ void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32
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);
+extern u8 gDecompressionBuffer[];
u32 sub_8034974(const u8 *ptr);
#endif // GUARD_DECOMPRESS_H
diff --git a/include/field_map_obj_helpers.h b/include/field_map_obj_helpers.h
index 031c7a8ab..ae96b67d8 100644
--- a/include/field_map_obj_helpers.h
+++ b/include/field_map_obj_helpers.h
@@ -27,5 +27,6 @@ void sub_8098044(u8);
void UnfreezeMapObjects(void);
void FreezeMapObjectsExceptOne(u8 mapObjectId);
void sub_8097B78(u8, u8);
+void FreezeMapObjects(void);
#endif //GUARD_FIELD_MAP_OBJ_HELPERS_H
diff --git a/include/field_player_avatar.h b/include/field_player_avatar.h
index af602245b..5b9a632fa 100644
--- a/include/field_player_avatar.h
+++ b/include/field_player_avatar.h
@@ -31,6 +31,8 @@ u8 CheckForFieldObjectCollision(struct MapObject *a, s16 b, s16 c, u8 d, u8 e);
u8 PlayerGetZCoord(void);
void SetPlayerAvatarTransitionFlags(u16 a);
void sub_808BCE8(void);
+void sub_808B864(void);
+void sub_808BCF4(void);
void sub_808D074(u8);
void GetXYCoordsOneStepInFrontOfPlayer(s16 *xPtr, s16 *yPtr);
diff --git a/include/field_specials.h b/include/field_specials.h
index dd72bdd13..c1f70a399 100644
--- a/include/field_specials.h
+++ b/include/field_specials.h
@@ -4,5 +4,6 @@
u8 GetLeadMonIndex(void);
u8 sub_813B260(void);
u16 get_unknown_box_id(void);
+bool8 InMultiBattleRoom(void);
#endif // GUARD_FIELD_SPECIALS_H
diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h
index 0364c38bc..1847b688f 100644
--- a/include/gba/io_reg.h
+++ b/include/gba/io_reg.h
@@ -623,6 +623,23 @@
#define TIMER_INTR_ENABLE 0x40
#define TIMER_ENABLE 0x80
+// BGCNT
+#define BGCNT_PRIORITY(n) (n) // Values 0 - 3. Lower priority BGs will be drawn on top of higher priority BGs.
+#define BGCNT_CHARBASE(n) ((n) << 2) // Values 0 - 3. Base block for tile pixel data.
+#define BGCNT_MOSAIC 0x0040
+#define BGCNT_16COLOR 0x0000 // 4 bits per pixel
+#define BGCNT_256COLOR 0x0080 // 8 bits per pixel
+#define BGCNT_SCREENBASE(n) ((n) << 8) // Values 0 - 31. Base block for tile map.
+#define BGCNT_WRAP 0x2000 // Only affects affine BGs. Text BGs wrap by default.
+#define BGCNT_TXT256x256 0x0000 // Internal screen size size of text mode BG in pixels.
+#define BGCNT_TXT512x256 0x4000
+#define BGCNT_TXT256x512 0x8000
+#define BGCNT_TXT512x512 0xC000
+#define BGCNT_AFF128x128 0x0000 // Internal screen size size of affine mode BG in pixels.
+#define BGCNT_AFF256x256 0x4000
+#define BGCNT_AFF512x512 0x8000
+#define BGCNT_AFF1024x1024 0xC000
+
// serial
#define SIO_ID 0x0030 // Communication ID
diff --git a/include/global.h b/include/global.h
index 0e5615eb0..4a71a8a87 100644
--- a/include/global.h
+++ b/include/global.h
@@ -11,6 +11,7 @@
// to help in decompiling
#define asm_comment(x) asm volatile("@ -- " x " -- ")
#define asm_unified(x) asm(".syntax unified\n" x "\n.syntax divided")
+#define ASM_DIRECT __attribute__((naked))
// IDE support
#if defined (__APPLE__) || defined (__CYGWIN__)
@@ -87,6 +88,7 @@ enum LanguageId
LANGUAGE_SPANISH = 7,
};
+#define GAME_VERSION (VERSION_EMERALD)
#define GAME_LANGUAGE (LANGUAGE_ENGLISH)
enum
@@ -605,6 +607,11 @@ struct WaldaPhrase
bool8 patternUnlocked;
};
+struct UnkSaveSubstruct_3b98 {
+ u32 trainerId;
+ u8 trainerName[8];
+};
+
struct SaveBlock1
{
/*0x00*/ struct Coords16 pos;
@@ -689,7 +696,9 @@ struct SaveBlock1
/*0x3B14*/ struct RecordMixingGift recordMixingGift;
/*0x3B24*/ u8 seen2[52];
/*0x3B58*/ LilycoveLady lilycoveLady;
- /*0x3B88*/ u8 filler_3B88[0x1E8];
+ /*0x3B88*/ u8 filler_3B88[0x10];
+ /*0x3B98*/ struct UnkSaveSubstruct_3b98 unk_3B98[20];
+ /*0x3C88*/ u8 filler_3C88[0xE8];
/*0x3D70*/ struct WaldaPhrase waldaPhrase;
// sizeof: 0x3D88
};
diff --git a/include/graphics.h b/include/graphics.h
index 4eac25856..6e5de9ef4 100644
--- a/include/graphics.h
+++ b/include/graphics.h
@@ -2713,19 +2713,16 @@ extern const u8 gRaySceneHushBg_Pal[];
extern const u8 gRaySceneHushBg_Gfx[];
extern const u8 gRaySceneHushRing_Gfx[];
-//main menu/birch graphics
-extern const u16 gMainMenuBgPal[];
-extern const u16 gMainMenuTextPal[];
-extern const u16 gUnknown_082FECFC[];
-extern const u16 gUnknown_082FF028[];
-extern const u16 gUnknown_082FF018[];
-extern const u8 gBirchIntroShadowGfx[];
-extern const u8 gUnknown_082FEEF0[];
-
//menu graphics
extern const u16 gFireRedMenuElements1_Pal[16];
extern const u16 gFireRedMenuElements2_Pal[16];
extern const u16 gFireRedMenuElements3_Pal[16];
extern const u8 gFireRedMenuElements_Gfx[];
+//item menu graphics
+extern const u8 gBagScreen_Gfx[];
+extern const u16 gBagScreenFemale_Pal[];
+extern const u16 gBagScreenMale_Pal[];
+extern const u8 gBagMenuHMIcon_Gfx[];
+
#endif //GUARD_GRAPHICS_H
diff --git a/include/intro.h b/include/intro.h
index 53a446418..aae3438fe 100644
--- a/include/intro.h
+++ b/include/intro.h
@@ -1,6 +1,12 @@
#ifndef GUARD_INTRO_H
#define GUARD_INTRO_H
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+void c2_copyright_1(void);
void CB2_InitCopyrightScreenAfterBootup(void);
void CB2_InitCopyrightScreenAfterTitleScreen(void);
void sub_816F2A8(u16, u16, u16, u16);
diff --git a/include/item.h b/include/item.h
index 06eb08046..d81a3de33 100644
--- a/include/item.h
+++ b/include/item.h
@@ -61,5 +61,8 @@ ItemUseFunc ItemId_GetBattleFunc(u16 itemId);
u8 ItemId_GetSecondaryId(u16 itemId);
u16 itemid_get_market_price(u16 itemId);
u16 BagGetItemIdByPocketPosition(u8 pocketId, u16 pocketPos);
+void sub_80D6FB4(struct BagPocket*);
+void sub_80D6F64(struct BagPocket*);
+void sub_80D702C(struct ItemSlot*, s16, u16);
#endif // ITEM_H
diff --git a/include/item_menu.h b/include/item_menu.h
index 0ddd6766b..5c1b26faa 100644
--- a/include/item_menu.h
+++ b/include/item_menu.h
@@ -17,6 +17,8 @@ extern struct BagStruct gUnknown_0203CE58;
// Exported RAM declarations
+extern u16 gSpecialVar_ItemId;
+
// Exported ROM declarations
void sub_81AAC50(void);
void sub_81AAC70(void);
diff --git a/include/item_menu_icons.h b/include/item_menu_icons.h
index c3932390c..56e012421 100644
--- a/include/item_menu_icons.h
+++ b/include/item_menu_icons.h
@@ -8,5 +8,9 @@ u8 sub_80D511C(u8 a0, u8 a1, u8 a2, u8 a3);
u8 CreateBerryTagSprite(u8 id, s16 x, s16 y);
void FreeBerryTagSpritePalette(void);
u8 CreateBerryFlavorCircleSprite(s16 x);
+void sub_80D4FAC(void);
+void RemoveBagItemIconObject(u8);
+void sub_80D4FEC(u8);
+void sub_80D4FC8(u8);
#endif // GUARD_ITEM_MENU_ICONS
diff --git a/include/item_use.h b/include/item_use.h
index ee7939824..6f84a63df 100644
--- a/include/item_use.h
+++ b/include/item_use.h
@@ -50,5 +50,6 @@ void ItemUseOutOfBattle_EnigmaBerry(u8);
void ItemUseInBattle_EnigmaBerry(u8);
void ItemUseOutOfBattle_CannotUse(u8);
u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId);
+void sub_80FDD10(u8);
#endif // GUARD_ITEM_USE_H
diff --git a/include/librfu.h b/include/librfu.h
index dbc8a41a6..aae7df4e9 100644
--- a/include/librfu.h
+++ b/include/librfu.h
@@ -67,6 +67,28 @@ union RfuPacket
struct RfuPacket8 rfuPacket8;
};
+struct __attribute__((packed)) UnkLinkRfuStruct_02022B14
+{
+ u16 unk_00_0:4;
+ u16 unk_00_4:1;
+ u16 unk_00_5:1;
+ u16 unk_00_6:1;
+ u16 unk_00_7:1;
+ u16 unk_01_0:1;
+ u16 unk_01_1:1;
+ u16 unk_01_2:4;
+ u16 unk_01_6:2;
+ u8 playerTrainerId[2];
+ u8 unk_04[4];
+ u16 unk_08_0:10;
+ u16 unk_09_2:6;
+ u8 unk_0a_0:7;
+ u8 unk_0a_7:1;
+ u8 playerGender:1;
+ u8 unk_0b_1:7;
+ u8 unk_0c;
+};
+
struct RfuStruct
{
vs32 unk_0;
@@ -103,6 +125,127 @@ struct RfuIntrStruct
u8 block2[0x30];
};
+struct RfuUnk1
+{
+ u16 unk_0;
+ u8 unk_2;
+ u8 unk_3;
+ u8 fill_4[14];
+ u8 unk_12;
+ u32 unk_14;
+ u32 unk_18;
+ struct RfuIntrStruct unk_1c;
+};
+
+struct RfuUnk2
+{
+ u16 unk_0;
+ u16 unk_2;
+ u8 fill_4[0x16];
+ u8 unk_1a;
+ u8 fill_1b[0x19];
+ u16 unk_34;
+ u16 unk_36;
+ u8 fill_38[0x16];
+ u8 unk_4e;
+ u8 fill_4f[0x12];
+ u8 unk_61;
+ u8 fill_62[6];
+ void *unk_68;
+ void *unk_6c;
+ u8 unk_70[0x70];
+};
+
+struct RfuUnk3
+{
+ u32 unk_0;
+ u32 unk_4;
+ u8 unk_8[0xD4];
+ u32 unk_dc;
+};
+
+struct RfuUnk5Sub {
+ u16 unk_00;
+ u8 unk_02;
+ u16 unk_04;
+ struct UnkLinkRfuStruct_02022B14 unk_06;
+ u8 fill_13[2];
+ u8 unk_15[8];
+};
+
+struct RfuUnk5
+{
+ u8 unk_00;
+ u8 unk_01;
+ u8 unk_02;
+ u8 unk_03;
+ u8 unk_04;
+ u8 unk_05;
+ u8 unk_06;
+ u8 unk_07;
+ u8 unk_08;
+ u8 filler_09[1];
+ u8 unk_0a[4];
+ u8 filler_0e[6];
+ struct RfuUnk5Sub unk_14[4];
+};
+
extern struct RfuStruct *gRfuState;
+extern struct RfuUnk5 *gUnknown_03007890;
+extern u32 *gUnknown_03007894;
+extern struct RfuUnk3* gUnknown_03007898;
+extern struct RfuUnk2* gUnknown_03007880[4];
+extern struct RfuUnk1* gUnknown_03007870[4];
+extern void* sub_82E53F4;
+extern void rfu_STC_clearAPIVariables(void);
+
+struct UnkLinkRfuStruct_02022B14;
+
void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam);
+void rfu_REQ_stopMode(void);
+void rfu_waitREQComplete(void);
+u32 rfu_REQBN_softReset_and_checkID(void);
+void rfu_REQ_sendData(u8);
+void rfu_setMSCCallback(void (*func)(u16));
+void rfu_setREQCallback(void (*func)(u16, u16));
+bool8 rfu_getMasterSlave(void);
+void rfu_REQBN_watchLink(u16 a0, u8 *a1, u8 *a2, u8 *a3);
+bool16 rfu_syncVBlank(void);
+void rfu_REQ_reset(void);
+void rfu_REQ_configSystem(u16, u8, u8);
+void rfu_REQ_configGameData(u8, u16, struct UnkLinkRfuStruct_02022B14 *, u8 *);
+void rfu_REQ_startSearchChild(void);
+void rfu_REQ_pollSearchChild(void);
+void rfu_REQ_endSearchChild(void);
+void rfu_REQ_startSearchParent(void);
+void rfu_REQ_pollSearchParent(void);
+void rfu_REQ_endSearchParent(void);
+void rfu_REQ_startConnectParent(u16);
+void rfu_REQ_pollConnectParent(void);
+void rfu_REQ_endConnectParent(void);
+void rfu_REQ_CHILD_startConnectRecovery(u8);
+void rfu_REQ_CHILD_pollConnectRecovery(void);
+void rfu_REQ_CHILD_endConnectRecovery(void);
+void rfu_REQ_changeMasterSlave(void);
+void rfu_REQ_RFUStatus(void);
+void rfu_getRFUStatus(u8 *status);
+u8 *rfu_getSTWIRecvBuffer(void);
+u8 rfu_NI_CHILD_setSendGameName(u8 a0, u8 a1);
+void rfu_clearSlot(u8 a0, u8 a1);
+void rfu_clearAllSlot(void);
+bool16 rfu_CHILD_getConnectRecoveryStatus(u8 *status);
+bool16 rfu_getConnectParentStatus(u8 *status, u8 *a1);
+bool16 rfu_UNI_PARENT_getDRAC_ACK(u8 *a0);
+void rfu_REQ_disconnect(u8 who);
+void rfu_changeSendTarget(u8 a0, u8 who, u8 a2);
+void rfu_NI_stopReceivingData(u8 who);
+u16 rfu_initializeAPI(u32 *unk0, u16 unk1, IntrFunc *interrupt, bool8 copyInterruptToRam);
+void rfu_setTimerInterrupt(u8 which, IntrFunc *intr);
+void rfu_setRecvBuffer(u8 a0, u8 a1, void *a2, size_t a3);
+bool16 rfu_UNI_setSendData(u8 flag, void *ptr, u8 size);
+void rfu_REQ_recvData(void);
+void rfu_UNI_readySendData(u8 a0);
+void rfu_UNI_clearRecvNewDataFlag(u8 a0);
+void rfu_REQ_PARENT_resumeRetransmitAndChange(void);
+void rfu_NI_setSendData(u8, u8, u8 *, u8);
diff --git a/include/link.h b/include/link.h
index 202e2a4d7..0fa4d39c2 100644
--- a/include/link.h
+++ b/include/link.h
@@ -7,6 +7,9 @@
#define QUEUE_CAPACITY 50
#define BLOCK_BUFFER_SIZE 0x100
+#define LINK_SLAVE 0
+#define LINK_MASTER 8
+
#define LINK_STAT_LOCAL_ID 0x00000003
#define LINK_STAT_PLAYER_COUNT 0x0000001C
#define LINK_STAT_PLAYER_COUNT_SHIFT 2
@@ -16,7 +19,23 @@
#define LINK_STAT_CONN_ESTABLISHED_SHIFT 6
#define LINK_STAT_RECEIVED_NOTHING 0x00000100
#define LINK_STAT_RECEIVED_NOTHING_SHIFT 8
+#define LINK_STAT_UNK_FLAG_9 0x00000200
+#define LINK_STAT_UNK_FLAG_9_SHIFT 9
#define LINK_STAT_ERRORS 0x0007F000
+#define LINK_STAT_ERRORS_SHIFT 12
+
+#define LINK_STAT_ERROR_HARDWARE 0x00001000
+#define LINK_STAT_ERROR_HARDWARE_SHIFT 12
+#define LINK_STAT_ERROR_CHECKSUM 0x00002000
+#define LINK_STAT_ERROR_CHECKSUM_SHIFT 13
+#define LINK_STAT_ERROR_QUEUE_FULL 0x00004000
+#define LINK_STAT_ERROR_QUEUE_FULL_SHIFT 14
+#define LINK_STAT_ERROR_LAG_MASTER 0x00010000
+#define LINK_STAT_ERROR_LAG_MASTER_SHIFT 16
+#define LINK_STAT_ERROR_INVALID_ID 0x00020000
+#define LINK_STAT_ERROR_INVALID_ID_SHIFT 17
+#define LINK_STAT_ERROR_LAG_SLAVE 0x00040000
+#define LINK_STAT_ERROR_LAG_SLAVE_SHIFT 18
#define EXTRACT_PLAYER_COUNT(status) \
(((status) & LINK_STAT_PLAYER_COUNT) >> LINK_STAT_PLAYER_COUNT_SHIFT)
@@ -26,10 +45,41 @@
(((status) >> LINK_STAT_CONN_ESTABLISHED_SHIFT) & 1)
#define EXTRACT_RECEIVED_NOTHING(status) \
(((status) >> LINK_STAT_RECEIVED_NOTHING_SHIFT) & 1)
+#define EXTRACT_LINK_ERRORS(status) \
+(((status) & LINK_STAT_ERRORS) >> LINK_STAT_ERRORS_SHIFT)
+
+#define LINKCMD_SEND_LINK_TYPE 0x2222
+#define LINKCMD_0x2FFE 0x2FFE
+#define LINKCMD_SEND_HELD_KEYS 0x4444
+#define LINKCMD_0x5555 0x5555
+#define LINKCMD_0x5566 0x5566
+#define LINKCMD_0x5FFF 0x5FFF
+#define LINKCMD_0x6666 0x6666
+#define LINKCMD_0x7777 0x7777
+#define LINKCMD_CONT_BLOCK 0x8888
+#define LINKCMD_0xAAAA 0xAAAA
+#define LINKCMD_0xAAAB 0xAAAB
+#define LINKCMD_INIT_BLOCK 0xBBBB
+#define LINKCMD_SEND_HELD_KEYS_2 0xCAFE
+#define LINKCMD_0xCCCC 0xCCCC
+
+struct LinkStatus
+{
+ u32 localId:2;
+ u32 playerCount:3;
+ u32 master:1;
+ u32 connEstablished:1;
+ u32 unused_7:1;
+ u32 receivedNothing:1;
+ u32 unused_9:7;
+ u32 errors:7;
+};
#define MASTER_HANDSHAKE 0x8FFF
#define SLAVE_HANDSHAKE 0xB9A0
+#define SIO_MULTI_CNT ((struct SioMultiCnt *)REG_ADDR_SIOCNT)
+
enum
{
LINK_STATE_START0,
@@ -45,6 +95,9 @@ enum
EXCHANGE_COMPLETE,
EXCHANGE_TIMED_OUT,
EXCHANGE_IN_PROGRESS,
+ EXCHANGE_STAT_4,
+ EXCHANGE_STAT_5,
+ EXCHANGE_STAT_6
};
enum
@@ -75,18 +128,18 @@ struct LinkPlayer
struct LinkPlayerBlock
{
- u8 magic1[16];
+ char magic1[16];
struct LinkPlayer linkPlayer;
- u8 magic2[16];
+ char magic2[16];
};
// circular queues
struct SendQueue
{
- u16 data[CMD_LENGTH][QUEUE_CAPACITY];
- u8 pos;
- u8 count;
+ /* 0x000 */ u16 data[CMD_LENGTH][QUEUE_CAPACITY];
+ /* 0x320 */ u8 pos;
+ /* 0x321 */ u8 count;
};
struct RecvQueue
@@ -98,29 +151,29 @@ struct RecvQueue
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;
+ /* 0x000 */ u8 isMaster; // 0: slave, 8: master
+ /* 0x001 */ u8 state;
+ /* 0x002 */ u8 localId; // local multi-player ID
+ /* 0x003 */ u8 playerCount;
+ /* 0x004 */ u16 tempRecvBuffer[4];
+ /* 0x00c */ bool8 receivedNothing;
+ /* 0x00d */ s8 serialIntrCounter;
+ /* 0x00e */ bool8 handshakeAsMaster;
+ /* 0x00f */ 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
+ /* 0x010 */ bool8 hardwareError; // hardware reported an error
+ /* 0x011 */ bool8 badChecksum; // checksum didn't match between devices
+ /* 0x012 */ u8 queueFull; // send or recv queue out of space
+ /* 0x013 */ u8 lag; // connection is lagging
- u16 checksum;
+ /* 0x014 */ u16 checksum;
- u8 sendCmdIndex;
- u8 recvCmdIndex;
+ /* 0x016 */ u8 sendCmdIndex;
+ /* 0x017 */ u8 recvCmdIndex;
- struct SendQueue sendQueue;
- struct RecvQueue recvQueue;
+ /* 0x018 */ struct SendQueue sendQueue;
+ /* 0x33c */ struct RecvQueue recvQueue;
};
struct BlockRequest
@@ -136,12 +189,12 @@ 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 gBlockRecvBuffer[MAX_RFU_PLAYERS][BLOCK_BUFFER_SIZE / 2];
extern u16 gSendCmd[CMD_LENGTH];
-extern u8 gShouldAdvanceLinkState;
-extern struct LinkPlayer gLinkPlayers[];
+extern struct LinkPlayer gLinkPlayers[5];
extern u16 word_3002910[];
extern bool8 gReceivedRemoteLinkPlayers;
+extern u32 gUnknown_020223C0;
extern bool8 gLinkVSyncDisabled;
extern u32 gLinkStatus;
@@ -152,14 +205,14 @@ bool8 sub_80093CC(void);
void Task_DestroySelf(u8 taskId);
void OpenLink(void);
void CloseLink(void);
-u16 LinkMain2(u16 *);
+u16 LinkMain2(const 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);
+u8 GetLinkPlayerDataExchangeStatusTimed(int lower, int upper);
bool8 IsLinkPlayerDataExchangeComplete(void);
u32 GetLinkPlayerTrainerId(u8);
void ResetLinkPlayers(void);
@@ -167,11 +220,10 @@ void sub_8007E24(void);
void sub_8007E4C(void);
u8 GetMultiplayerId(void);
u8 bitmask_all_link_players_but_self(void);
-bool8 SendBlock(u8, void *, u16);
+bool8 SendBlock(u8, const 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);
@@ -180,23 +232,64 @@ bool8 IsLinkConnectionEstablished(void);
void SetSuppressLinkErrorMessage(bool8);
bool8 HasLinkErrorOccurred(void);
void ResetSerial(void);
-u32 LinkMain1(u8 *, u16 *, u16[CMD_LENGTH][MAX_LINK_PLAYERS]);
+u32 LinkMain1(u8 *shouldAdvanceLinkState, u16 *sendCmd, u16 (*recvCmds)[CMD_LENGTH]);
void LinkVSync(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 CreateWirelessStatusIndicatorSprite(u8, u8);
void sub_800ADF8(void);
void sub_800B488(void);
-void OpenLink(void);
void sub_800A620(void);
void sub_8011BD0(void);
+u8 IsLinkMaster(void);
void sub_800AC34(void);
-u8 sub_800A0C8(s32, s32);
+bool8 HandleLinkConnection(void);
+void SetLinkDebugValues(u32 seed, u32 flags);
+void sub_800A418(void);
+void SetSuppressLinkErrorMessage(bool8 flag);
+void sub_800B524(struct LinkPlayer *linkPlayer);
+u8 GetSioMultiSI(void);
+void sub_800AAF4(void);
+void sub_800AF18(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06);
+void sub_800B348(void);
+void sub_800B3A4(u32 who);
+
+extern u16 gLinkPartnersHeldKeys[6];
+extern u32 gLinkDebugSeed;
+extern struct LinkPlayerBlock gLocalLinkPlayerBlock;
+extern bool8 gLinkErrorOccurred;
+extern u32 gLinkDebugFlags;
+extern bool8 gRemoteLinkPlayersNotReceived[MAX_LINK_PLAYERS];
+extern u8 gBlockReceivedStatus[MAX_LINK_PLAYERS];
+extern u16 gLinkHeldKeys;
+extern u32 gLinkStatus;
+extern u8 gUnknown_030030E4;
+extern u8 gUnknown_030030E8;
+extern u8 gUnknown_030030EC[MAX_LINK_PLAYERS];
+extern u8 gUnknown_030030F0[MAX_LINK_PLAYERS];
+extern u16 gUnknown_030030F4;
+extern u8 gSuppressLinkErrorMessage;
+extern u8 gWirelessCommType;
+extern bool8 gSavedLinkPlayerCount;
+extern u8 gSavedMultiplayerId;
+extern struct LinkTestBGInfo gLinkTestBGInfo;
+extern void (*gLinkCallback)(void);
+extern bool8 gShouldAdvanceLinkState;
+extern u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS];
+extern u8 gBlockRequestType;
+extern u8 gLastSendQueueCount;
+extern u8 gLastRecvQueueCount;
+extern u16 gLinkSavedIme;
+extern u32 gFiller_03003074;
+extern u32 gFiller_03003154;
+extern u32 gFiller_03003158;
+extern u32 gFiller_0300315c;
+extern u32 gFiller_03004138;
+extern u32 gFiller_0300413C;
+extern u32 gFiller_03003080;
#endif // GUARD_LINK_H
diff --git a/include/link_rfu.h b/include/link_rfu.h
new file mode 100644
index 000000000..a6084b138
--- /dev/null
+++ b/include/link_rfu.h
@@ -0,0 +1,235 @@
+#ifndef GUARD_LINK_RFU_H
+#define GUARD_LINK_RFU_H
+
+// Exported type declarations
+
+struct UnkLinkRfuStruct_02022B2C
+{
+ u8 unk_00;
+ u8 unk_01;
+ u16 unk_02;
+ u8 unk_04;
+ u16 unk_06;
+ struct UnkLinkRfuStruct_02022B14 *unk_08;
+ u8 *unk_0c;
+ u8 unk_10;
+ u8 unk_11;
+ u16 unk_12;
+ u16 unk_14;
+};
+
+struct UnkLinkRfuStruct_02022B44
+{
+ u8 fill_00[6];
+ u16 unk_06;
+ u8 fill_08[6];
+ vu8 unk_0e;
+ u8 unk_0f;
+ u8 fill_10[0x54];
+ u16 unk_64;
+ u8 fill_66[0x1d];
+ u8 unk_83;
+ u8 fill_84[0x58];
+};
+
+struct UnkRfuStruct_1 {
+ /* 0x000 */ u8 unk_00;
+ /* 0x001 */ u8 unk_01;
+ /* 0x002 */ vu8 unk_02;
+ /* 0x003 */ vu8 unk_03;
+ /* 0x004 */ u8 unk_04;
+ /* 0x005 */ u8 unk_05;
+ /* 0x006 */ u8 unk_06;
+ /* 0x007 */ u8 unk_07;
+ /* 0x008 */ u8 unk_08;
+ /* 0x009 */ u8 unk_09;
+ /* 0x00a */ u8 unk_0a;
+ /* 0x00b */ u8 unk_0b;
+ /* 0x00c */ u8 unk_0c;
+ /* 0x00d */ u8 unk_0d;
+ /* 0x00e */ u8 unk_0e;
+ /* 0x00f */ u8 unk_0f;
+ /* 0x010 */ u8 unk_10;
+ /* 0x011 */ u8 unk_11;
+ /* 0x012 */ u8 unk_12;
+ // aligned
+ /* 0x014 */ u16 unk_14;
+ /* 0x016 */ u16 unk_16;
+ /* 0x018 */ u16 unk_18;
+ /* 0x01a */ u16 unk_1a;
+ /* 0x01c */ u16 unk_1c;
+ /* 0x01e */ u16 unk_1e;
+ /* 0x020 */ const u16 *unk_20;
+ /* 0x024 */ u8 unk_24;
+ /* 0x026 */ u16 unk_26;
+ /* 0x028 */ u16 unk_28[4];
+ /* 0x030 */ u8 unk_30;
+ // aligned
+ /* 0x032 */ u16 unk_32;
+ /* 0x034 */ u16 unk_34[4];
+ /* 0x03c */ const struct UnkLinkRfuStruct_02022B2C *unk_3c;
+ /* 0x040 */ void (*unk_40)(u8, u8);
+ /* 0x044 */ void (*unk_44)(u16);
+ /* 0x048 */ u8 filler_48[8];
+ /* 0x050 */ u32 unk_50[0x399];
+ /* 0xeb4 */ u8 filler_e64[12];
+};
+
+struct UnkRfuStruct_2_Sub_6c {
+ /* 0x00 */ u16 unk_00;
+ /* 0x02 */ u16 unk_02;
+ /* 0x04 */ const u8 *unk_04;
+ /* 0x08 */ u32 unk_08;
+ /* 0x0c */ u32 unk_0c;
+ /* 0x10 */ u8 unk_10;
+ /* 0x11 */ u8 unk_11;
+ /* 0x12 */ u8 unk_12;
+};
+
+struct UnkRfuStruct_2_Sub_124 {
+ /* 0x000 */ u8 unk_00[32][70];
+ /* 0x8c0 */ vu8 unk_8c0;
+ /* 0x8c1 */ vu8 unk_8c1;
+ /* 0x8c2 */ vu8 unk_8c2;
+ /* 0x8c3 */ vu8 unk_8c3;
+};
+
+struct UnkRfuStruct_2_Sub_9e8 {
+ /* 0x000 */ u8 unk_00[40][14];
+ /* 0x230 */ vu8 unk_230;
+ /* 0x231 */ vu8 unk_231;
+ /* 0x232 */ vu8 unk_232;
+ /* 0x233 */ vu8 unk_233;
+};
+
+struct UnkRfuStruct_2_Sub_c1c {
+ /* 0x00 */ u8 unk_00[2][14];
+ /* 0x1c */ vu8 unk_1c;
+ /* 0x1d */ vu8 unk_1d;
+ /* 0x1e */ vu8 unk_1e;
+};
+
+struct UnkRfuStruct_Sub_Unused {
+ /* 0x000 */ u8 unk_00[2][256];
+ /* 0x200 */ vu8 unk_200;
+ /* 0x201 */ vu8 unk_201;
+ /* 0x202 */ vu8 unk_202;
+ /* 0x203 */ vu8 unk_203;
+};
+
+struct UnkRfuStruct_2 {
+ /* 0x000 */ void (*unk_00)(void);
+ /* 0x004 */ u16 unk_04;
+ /* 0x006 */ u8 filler_06[4];
+ /* 0x00a */ u16 unk_0a;
+ /* 0x00c */ u8 unk_0c;
+ /* 0x00d */ u8 playerCount;
+ /* 0x00e */ u8 unk_0e;
+ /* 0x00f */ u8 unk_0f;
+ /* 0x010 */ u16 unk_10;
+ /* 0x012 */ u16 unk_12;
+ /* 0x014 */ u8 unk_14[4][14];
+ /* 0x04c */ u8 unk_4c[14];
+ /* 0x05a */ u8 unk_5a;
+ /* 0x05b */ u8 unk_5b;
+ /* 0x05c */ u8 unk_5c[5];
+ /* 0x061 */ u8 unk_61[5];
+ /* 0x066 */ u8 unk_66;
+ /* 0x067 */ u8 unk_67;
+ /* 0x068 */ u8 filler_68[4];
+ /* 0x06c */ struct UnkRfuStruct_2_Sub_6c unk_6c;
+ /* 0x080 */ struct UnkRfuStruct_2_Sub_6c unk_80[5];
+ /* 0x0e4 */ u8 unk_e4[5];
+ /* 0x0e9 */ u8 unk_e9[5];
+ /* 0x0ee */ vu8 unk_ee;
+ /* 0x0ef */ u8 unk_ef;
+ /* 0x0f0 */ u8 unk_f0;
+ /* 0x0f1 */ u8 unk_f1;
+ /* 0x0f2 */ u16 unk_f2[6];
+ /* 0x0fe */ u16 unk_fe;
+ /* 0x100 */ u16 unk_100;
+ /* 0x102 */ u8 unk_102;
+ /* 0x103 */ u8 filler_103[0x21];
+ /* 0x124 */ struct UnkRfuStruct_2_Sub_124 unk_124;
+ /* 0x9e8 */ struct UnkRfuStruct_2_Sub_9e8 unk_9e8;
+ /* 0xc1c */ struct UnkRfuStruct_2_Sub_c1c unk_c1c;
+ /* 0xc3c */ vu8 unk_c3c;
+ /* 0xc3d */ u8 unk_c3d;
+ /* 0xc3e */ vu8 unk_c3e;
+ /* 0xc3f */ u8 unk_c3f[70];
+ /* 0xc85 */ u8 unk_c85;
+ /* 0xc86 */ u8 unk_c86;
+ /* 0xc87 */ u8 unk_c87[5][7][2];
+ /* 0xccd */ u8 unk_ccd;
+ /* 0xcce */ u8 unk_cce;
+ /* 0xccf */ u8 unk_ccf;
+ /* 0xcd0 */ vu8 unk_cd0;
+ /* 0xcd1 */ u8 unk_cd1[4];
+ /* 0xcd5 */ u8 unk_cd5[4];
+ /* 0xcd9 */ u8 unk_cd9;
+ /* 0xcda */ u8 unk_cda;
+ /* 0xcdb */ vu8 unk_cdb;
+ /* 0xcdc */ vu8 unk_cdc;
+ /* 0xcdd */ u8 unk_cdd;
+ /* 0xcde */ u8 unk_cde[4];
+ /* 0xce2 */ u8 unk_ce2;
+ /* 0xce2 */ u8 unk_ce3;
+ /* 0xce4 */ u8 unk_ce4;
+ /* 0xce5 */ u8 unk_ce5;
+ /* 0xce5 */ u8 unk_ce6;
+ /* 0xce7 */ u8 unk_ce7;
+ /* 0xce8 */ u8 unk_ce8;
+ /* 0xce9 */ u8 unk_ce9;
+ /* 0xcea */ u8 unk_cea[4];
+ /* 0xcee */ u8 unk_cee[4];
+}; // size = 0xcf4
+
+struct UnkRfuStruct_8010A14 {
+ char unk_00[15];
+ u8 unk_0f;
+ u8 unk_10[4];
+ struct LinkPlayer unk_14[5];
+ u8 fill_a0[0x5c];
+};
+
+// Exported RAM declarations
+
+extern struct UnkRfuStruct_1 gUnknown_03004140;
+extern struct UnkRfuStruct_2 gUnknown_03005000;
+
+// Exported ROM declarations
+u32 sub_800BEC0(void);
+void sub_800E700(void);
+void sub_800EDD4(void);
+void sub_800F6FC(u8 who);
+void sub_800F728(u8 who);
+bool32 sub_800F7E4(void);
+void sub_800F804(void);
+void sub_800F850(void);
+u8 sub_800FCD8(void);
+bool32 sub_800FE84(const u8 *src, size_t size);
+void Rfu_set_zero(void);
+u8 sub_80104F4(void);
+u8 rfu_get_multiplayer_id(void);
+bool8 sub_8010100(u8 a0);
+bool8 sub_8010500(void);
+bool8 Rfu_IsMaster(void);
+void task_add_05_task_del_08FA224_when_no_RfuFunc(void);
+void sub_8010434(void);
+void sub_800E604(void);
+void sub_800E174(void);
+void sub_800E6D0(void);
+bool32 sub_8010EC0(void);
+bool32 sub_8010F1C(void);
+bool32 sub_8011A80(void);
+bool32 sub_800F0B8(void);
+u32 sub_80124D4(void);
+void RfuVSync(void);
+void sub_80111B0(bool32 a0);
+u8 sub_8011A74(void);
+struct UnkLinkRfuStruct_02022B14 *sub_800F7DC(void);
+void sub_8011068(u8 a0);
+void sub_8011170(u32 a0);
+void sub_8011A64(u8 a0, u16 a1);
+
+#endif //GUARD_LINK_RFU_H
diff --git a/include/list_menu.h b/include/list_menu.h
index 8b793c0e4..77d00bf97 100644
--- a/include/list_menu.h
+++ b/include/list_menu.h
@@ -57,5 +57,6 @@ u8 ListMenuInit(struct ListMenuTemplate *template, u16 cursorPage, u16 cursorPos
s32 ListMenuHandleInputGetItemId(u8 listTaskId);
void sub_81AE860(u8 listTaskId, u16 *a1, u16 *a2);
void sub_81AE6C8(u8 listTaskId, u16 *a1, u16 *a2);
+u8 ListMenuGetYCoordForPrintingArrowCursor(u8);
#endif //GUARD_LIST_MENU_H
diff --git a/include/load_save.h b/include/load_save.h
index 1f406bbad..92c99fd90 100644
--- a/include/load_save.h
+++ b/include/load_save.h
@@ -2,6 +2,8 @@
#define GUARD_LOAD_SAVE_H
extern bool32 gFlashMemoryPresent;
+extern struct SaveBlock2 gSaveblock2;
+extern struct PokemonStorage gPokemonStorage;
void ClearSav2(void);
void ClearSav1(void);
@@ -19,6 +21,5 @@ 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
index 8c3380dd8..a1f413cf5 100644
--- a/include/m4a.h
+++ b/include/m4a.h
@@ -17,4 +17,9 @@ void m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed);
void m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed);
void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo);
+extern struct MusicPlayerInfo gMPlayInfo_SE1;
+extern struct MusicPlayerInfo gMPlayInfo_SE2;
+extern struct MusicPlayerInfo gMPlayInfo_SE3;
+extern struct SoundInfo gSoundInfo;
+
#endif //GUARD_M4A_H
diff --git a/include/main.h b/include/main.h
index 40a2580a2..3de34de13 100644
--- a/include/main.h
+++ b/include/main.h
@@ -42,14 +42,19 @@ struct Main
/*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;
+extern u16 gKeyRepeatStartDelay;
+extern bool8 gLinkTransferringData;
+extern struct Main gMain;
+extern u16 gKeyRepeatContinueDelay;
+extern bool8 gSoftResetDisabled;
+extern IntrFunc gIntrTable[];
+extern u8 gLinkVSyncDisabled;
+extern u32 IntrMain_Buffer[];
+extern u8 gPcmDmaCounter;
+
void AgbMain(void);
void SetMainCallback2(MainCallback callback);
void InitKeys(void);
@@ -60,6 +65,7 @@ void SetSerialCallback(IntrCallback callback);
void InitFlashTimer(void);
void DoSoftReset(void);
void ClearPokemonCrySongs(void);
+void RestoreSerialTimer3IntrHandlers(void);
void StartTimer1(void);
void SeedRngAndSetTrainerId(void);
diff --git a/include/malloc.h b/include/malloc.h
index 003ee1f03..6efa8fbef 100644
--- a/include/malloc.h
+++ b/include/malloc.h
@@ -1,6 +1,7 @@
#ifndef GUARD_MALLOC_H
#define GUARD_MALLOC_H
+#define HEAP_SIZE 0x1C000
#define malloc Alloc
#define calloc(ct, sz) AllocZeroed((ct) * (sz))
#define free Free
diff --git a/include/menu.h b/include/menu.h
index 18d391317..c2f15422a 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -17,6 +17,8 @@ struct MenuAction
} func;
};
+extern const u16 gUnknown_0860F074[];
+
void sub_81971D0(void);
void sub_8197200(void);
u16 sub_8197224(void);
@@ -49,6 +51,7 @@ void *decompress_and_copy_tile_data_to_vram(u8 bgId, const void *src, int size,
bool8 free_temp_tile_data_buffers_if_possible(void);
struct WindowTemplate sub_8198A50(u8, u8, u8, u8, u8, u8, u16);
void CreateYesNoMenu(const struct WindowTemplate *windowTemplate, u16 borderFirstTileNum, u8 borderPalette, u8 initialCursorPos);
+void copy_decompressed_tile_data_to_vram_autofree(u8 bgId, const void *src, int size, u16 offset, u8 mode);
s8 ProcessMenuInputNoWrap_(void);
void do_scheduled_bg_tilemap_copies_to_vram(void);
void clear_scheduled_bg_copies_to_vram(void);
@@ -60,5 +63,10 @@ u16 sub_8198AA4(u8, u8, u8, u8, u8, u8, u16);
void *malloc_and_decompress(const void *src, int *sizeOut);
u16 copy_decompressed_tile_data_to_vram(u8 bgId, const void *src, u16 size, u16 offset, u8 mode);
void AddTextPrinterForMessage(bool8 allowSkippingDelayWithButtonPress);
+void AddItemMenuActionTextPrinters (u8, u8, u8, u8, u8, u8, u8, const struct MenuAction*, const u8*);
+void sub_8198DBC(u8, u8, u8, u8, u8, u8, u8, const struct MenuAction*, const u8*);
+u8 sub_8199944(u8, u8, u8, u8, u8);
+u8 sub_8199134(s8, s8);
+void sub_819A2BC(u8, u8);
#endif // GUARD_MENU_H
diff --git a/include/menu_helpers.h b/include/menu_helpers.h
index 048a4aa43..e744c293c 100644
--- a/include/menu_helpers.h
+++ b/include/menu_helpers.h
@@ -32,5 +32,10 @@ void DisplayMessageAndContinueTask(u8 taskId, u8 arg1, u16 arg2, u8 arg3, u8 arg
void CreateYesNoMenuWithCallbacks(u8 taskId, const struct WindowTemplate *template, u8 arg2, u8 arg3, u8 arg4, u16 tileStart, u8 palette, const struct YesNoFuncTable *yesNo);
u8 GetLRKeysState(void);
u8 sub_812210C(void);
+bool8 sub_81221EC(void);
+bool8 sub_81221AC(void);
+bool8 sub_8122148(u16);
+bool8 AdjustQuantityAccordingToDPadInput(s16*, u16);
+bool8 itemid_80BF6D8_mail_related(u16);
#endif //GUARD_MENU_HELPERS_H
diff --git a/include/menu_indicators.h b/include/menu_indicators.h
index 694c01fd9..b82e48725 100644
--- a/include/menu_indicators.h
+++ b/include/menu_indicators.h
@@ -6,8 +6,17 @@
// Exported RAM declarations
// Exported ROM declarations
+
+struct ArrowStruct {
+ u8 unk0[6];
+ u16 unk6[4];
+ u8 unkE;
+};
+
void Task_ScrollIndicatorArrowPairOnMainMenu(u8);
u8 AddScrollIndicatorArrowPairParametrized(u8, u8, u8, u8, s32, u16, u16, u16 *);
void RemoveScrollIndicatorArrowPair(u8);
+u8 AddScrollIndicatorArrowPair(const struct ArrowStruct*, void*);
+void sub_81AF15C(u8, u8, u8);
#endif //GUARD_MENU_INDICATORS_H
diff --git a/include/overworld.h b/include/overworld.h
index 36198e124..db4d96a89 100644
--- a/include/overworld.h
+++ b/include/overworld.h
@@ -25,8 +25,6 @@ struct UCoords32
extern struct LinkPlayerMapObject gLinkPlayerMapObjects[4];
extern MainCallback gFieldCallback;
-void IncrementGameStat(u8 index);
-
void Overworld_SetMapObjTemplateCoords(u8, s16, s16);
void Overworld_SetMapObjTemplateMovementType(u8, u8);
@@ -54,6 +52,7 @@ void Overworld_ChangeMusicToDefault(void);
void Overworld_ChangeMusicTo(u16);
bool32 is_c1_link_related_active(void);
+extern u16 gUnknown_03005DA8;
void CB2_NewGame(void);
void strange_npc_table_clear(void);
@@ -73,7 +72,12 @@ void copy_saved_warp2_bank_and_enter_x_to_warp1(u8 unused);
void mapldr_default(void);
u8 get_map_light_from_warp0(void);
bool8 is_light_level_1_2_3_5_or_6(u8 a1);
+void sub_8086194(void);
+void sub_80861B0(void);
+bool32 sub_80875C8(void);
+bool32 sub_8087634(void);
+bool32 sub_808766C(void);
void IncrementGameStat(u8);
u32 GetGameStat(u8);
diff --git a/include/party_menu.h b/include/party_menu.h
index 1d1661cee..14aacce88 100644
--- a/include/party_menu.h
+++ b/include/party_menu.h
@@ -18,5 +18,6 @@ u8 pokemon_ailments_get_primary(u32 status);
u8 *GetMonNickname(struct Pokemon *mon, u8 *dst);
u8 GetCursorSelectionMonId(void);
bool8 FieldCallback_Teleport(void);
+void sub_81B7F60(void);
#endif // GUARD_PARTY_MENU_H
diff --git a/include/player_pc.h b/include/player_pc.h
index b14d1ede3..cc2e85b2b 100644
--- a/include/player_pc.h
+++ b/include/player_pc.h
@@ -8,5 +8,6 @@
// Exported ROM declarations
void sub_816B060(u8 taskId);
+void sub_816B31C(void);
#endif //GUARD_PLAYER_PC_H
diff --git a/include/pokemon.h b/include/pokemon.h
index ce3074a0b..6df9ce313 100644
--- a/include/pokemon.h
+++ b/include/pokemon.h
@@ -1,6 +1,9 @@
#ifndef GUARD_POKEMON_H
#define GUARD_POKEMON_H
+#include "constants/pokemon.h"
+#include "sprite.h"
+
#define MON_DATA_PERSONALITY 0
#define MON_DATA_OT_ID 1
#define MON_DATA_NICKNAME 2
@@ -107,81 +110,11 @@
#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 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;
@@ -334,6 +267,46 @@ struct UnknownPokemonStruct
u8 friendship;
};
+struct UnknownPokemonSubStruct2
+{
+ u16 species;
+ u16 moves[4];
+ u16 item;
+};
+
+struct UnknownPokemonStruct2
+{
+ u8 field_0_0 : 5;
+ u8 field_0_1 : 2;
+ u8 field_1;
+ u8 field_2;
+ u8 field_3;
+ struct UnknownPokemonSubStruct2 mons[3];
+ u8 field_28[23];
+ u8 language;
+};
+
+struct UnknownPokemonStruct3
+{
+ u8 field_0[48];
+ u16 field_30;
+ u8 field_32[38];
+};
+
+struct Unknown_806F160_Struct
+{
+ u8 field_0_0 : 4;
+ u8 field_0_1 : 4;
+ u8 field_1;
+ u8 magic;
+ u8 field_3_0 : 4;
+ u8 field_3_1 : 4;
+ void *bytes;
+ u8 **byteArrays;
+ struct SpriteTemplate *templates;
+ struct SpriteFrameImage *frameImages;
+};
+
#define BATTLE_STATS_NO 8
struct BattlePokemon
@@ -374,28 +347,6 @@ struct BattlePokemon
/*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;
@@ -514,17 +465,22 @@ extern u8 gPlayerPartyCount;
extern struct Pokemon gPlayerParty[PARTY_SIZE];
extern u8 gEnemyPartyCount;
extern struct Pokemon gEnemyParty[PARTY_SIZE];
+extern struct SpriteTemplate gUnknown_0202499C;
+extern struct PokemonStorage* gPokemonStoragePtr;
+
+extern const u8 gFacilityClassToPicIndex[];
+extern const u8 gFacilityClassToTrainerClass[];
extern const struct BaseStats gBaseStats[];
extern const u8 *const gItemEffectTable[];
extern const struct Evolution gEvolutionTable[][EVOS_PER_MON];
-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
+extern const u8 gUnknown_08329D22[];
+extern const u8 gUnknown_08329D26[];
+extern const u8 gUnknown_08329D2A[];
+extern const u8 gStatStageRatios[][2];
+extern const u16 gUnknown_08329D54[];
+extern const struct SpriteTemplate gUnknown_08329D98[];
void ZeroBoxMonData(struct BoxPokemon *boxMon);
void ZeroMonData(struct Pokemon *mon);
@@ -538,26 +494,45 @@ 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 sub_806819C(struct Pokemon *mon, struct UnknownPokemonStruct *src);
+void sub_8068338(struct Pokemon *mon, struct UnknownPokemonStruct *src, bool8 lvl50);
+void sub_8068528(struct Pokemon *mon, const struct UnknownPokemonStruct2 *src, u8 monId);
+void CreateMonWithEVSpreadPersonalityOTID(struct Pokemon *mon, u16 species, u8 level, u8 nature, u8 fixedIV, u8 evSpread, u32 otId);
+void sub_80686FC(struct Pokemon *mon, struct UnknownPokemonStruct *dest);
+void CreateObedientMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId);
+bool8 sub_80688F8(u8 caseId, u8 battlerId);
+void SetDeoxysStats(void);
+u16 sub_8068B48(void);
+u16 sub_8068BB0(void);
+void CreateObedientEnemyMon(void);
void CalculateMonStats(struct Pokemon *mon);
+void BoxMonToMon(const struct BoxPokemon *src, struct Pokemon *dest);
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);
+u16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove);
void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move);
void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move);
+s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 sideStatus, u16 powerOverride, u8 typeOverride, u8 bankAtk, u8 bankDef);
+u8 CountAliveMonsInBattle(u8 caseId);
+#define BATTLE_ALIVE_EXCEPT_ACTIVE 0
+#define BATTLE_ALIVE_ATK_SIDE 1
+#define BATTLE_ALIVE_DEF_SIDE 2
+
+u8 GetDefaultMoveTarget(u8 battlerId);
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);
+void sub_806A068(u16 species, u8 battlerPosition);
+void sub_806A12C(u16 trainerSpriteId, u8 battlerPosition);
+void sub_806A1C0(u16 arg0, u8 battlerPosition);
// These are full type signatures for GetMonData() and GetBoxMonData(),
// but they are not used since some code erroneously omits the third arg.
@@ -566,93 +541,105 @@ void DecryptBoxMon(struct BoxPokemon *boxMon);
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 SetMonData(struct Pokemon *mon, s32 field, const void *dataArg);
+void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg);
void CopyMon(void *dest, void *src, size_t size);
u8 GiveMonToPlayer(struct Pokemon *mon);
-u8 SendMonToPC(struct Pokemon *mon);
+u8 SendMonToPC(struct Pokemon* mon);
u8 CalculatePlayerPartyCount(void);
u8 CalculateEnemyPartyCount(void);
-
+u8 GetMonsStateToDoubles(void);
+u8 GetMonsStateToDoubles_2(void);
u8 GetAbilityBySpecies(u16 species, bool8 altAbility);
u8 GetMonAbility(struct Pokemon *mon);
void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord);
u8 GetSecretBaseTrainerPicIndex(void);
-u8 GetSecretBaseTrainerNameIndex(void);
+u8 GetSecretBaseTrainerClass(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);
-
+void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex);
+bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex);
+bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex, u8 e);
+bool8 HealStatusConditions(struct Pokemon *mon, u32 battlePartyId, u32 healMask, u8 battlerId);
+u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit);
+u8 *sub_806CF78(u16 itemId);
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 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem);
+u16 HoennPokedexNumToSpecies(u16 hoennNum);
u16 NationalPokedexNumToSpecies(u16 nationalNum);
-u16 NationalToHoennOrder(u16);
-u16 SpeciesToNationalPokedexNum(u16);
-u16 HoennToNationalOrder(u16);
+u16 NationalToHoennOrder(u16 nationalNum);
+u16 SpeciesToNationalPokedexNum(u16 species);
+u16 SpeciesToHoennPokedexNum(u16 species);
+u16 HoennToNationalOrder(u16 hoennNum);
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 GetBattlerMultiplayerId(u16 a1);
+void sub_806D544(u16 species, u32 personality, u8 *dest);
+void DrawSpindaSpots(u16 species, u32 personality, u8 *dest, u8 a4);
+void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies);
+bool8 sub_806D7EC(void);
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);
+s32 GetBattlerMultiplayerId(u16 a1);
+u8 GetTrainerEncounterMusicId(u16 trainerOpponentId);
+u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex);
+void AdjustFriendship(struct Pokemon *mon, u8 event);
+void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies);
+u16 GetMonEVCount(struct Pokemon *mon);
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);
+u32 CanMonLearnTMHM(struct Pokemon *mon, u8 tm);
+u32 CanSpeciesLearnTMHM(u16 species, u8 tm);
+u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves);
u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves);
-u8 GetMonsStateToDoubles_2(void);
-
-#include "sprite.h"
-
-void DoMonFrontSpriteAnimation(struct Sprite* sprite, u16 species, bool8 noCry, u8 arg3);
+u8 GetNumberOfRelearnableMoves(struct Pokemon *mon);
+u16 SpeciesToPokedexNum(u16 species);
+bool32 sub_806E3F8(u16 species);
+void ClearBattleMonForms(void);
+u16 GetBattleBGM(void);
+void PlayBattleBGM(void);
+void PlayMapChosenOrBattleBGM(u16 songId);
+void sub_806E694(u16 songId);
+const u8 *GetMonFrontSpritePal(struct Pokemon *mon);
+const u8 *GetFrontSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 personality);
+const struct CompressedSpritePalette *GetMonSpritePalStruct(struct Pokemon *mon);
+const struct CompressedSpritePalette *GetMonSpritePalStructFromOtIdPersonality(u16 species, u32 otId , u32 personality);
+bool32 IsHMMove2(u16 move);
+bool8 IsMonSpriteNotFlipped(u16 species);
+s8 GetMonFlavorRelation(struct Pokemon *mon, u8 flavor);
+s8 GetFlavorRelationByPersonality(u32 personality, u8 flavor);
+bool8 IsTradedMon(struct Pokemon *mon);
+bool8 IsOtherTrainer(u32 otId, u8 *otName);
+void MonRestorePP(struct Pokemon *mon);
+void BoxMonRestorePP(struct BoxPokemon *boxMon);
+void sub_806E994(void);
+void SetWildMonHeldItem(void);
+bool8 IsMonShiny(struct Pokemon *mon);
+bool8 IsShinyOtIdPersonality(u32 otId, u32 personality);
+const u8 *GetTrainerPartnerName(void);
void BattleAnimateFrontSprite(struct Sprite* sprite, u16 species, bool8 noCry, u8 arg3);
+void DoMonFrontSpriteAnimation(struct Sprite* sprite, u16 species, bool8 noCry, u8 arg3);
+void PokemonSummaryDoMonAnimation(struct Sprite* sprite, u16 species, bool8 oneFrame);
+void sub_806EE98(void);
void BattleAnimateBackSprite(struct Sprite* sprite, u16 species);
+u8 sub_806EF08(u8 arg0);
+u8 sub_806EF84(u8 arg0, u8 arg1);
+u16 sub_806EFF0(u16 arg0);
+u16 FacilityClassToPicIndex(u16 facilityClass);
+u16 PlayerGenderToFrontTrainerPicId(u8 playerGender);
+void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality);
+const u8 *GetTrainerClassNameFromId(u16 trainerId);
+const u8 *GetTrainerNameFromId(u16 trainerId);
+bool8 HasTwoFramesAnimation(u16 species);
+bool8 sub_806F104(void);
+struct Unknown_806F160_Struct *sub_806F2AC(u8 id, u8 arg1);
+void sub_806F47C(u8 id);
+u8 *sub_806F4F8(u8 id, u8 arg1);
#endif // GUARD_POKEMON_H
diff --git a/include/pokemon_item_effects.h b/include/pokemon_item_effects.h
deleted file mode 100644
index 505cc0f25..000000000
--- a/include/pokemon_item_effects.h
+++ /dev/null
@@ -1,62 +0,0 @@
-#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_summary_screen.h b/include/pokemon_summary_screen.h
new file mode 100755
index 000000000..adadcea03
--- /dev/null
+++ b/include/pokemon_summary_screen.h
@@ -0,0 +1,6 @@
+#ifndef GUARD_POKEMON_SUMMARY_SCREEN_H
+#define GUARD_POKEMON_SUMMARY_SCREEN_H
+
+void sub_81C4F98(u8, void(*)(void));
+
+#endif // GUARD_POKEMON_SUMMARY_SCREEN_H
diff --git a/include/recorded_battle.h b/include/recorded_battle.h
index 296245a24..8b1fa258d 100644
--- a/include/recorded_battle.h
+++ b/include/recorded_battle.h
@@ -7,9 +7,9 @@ extern u8 gUnknown_0203C7B4;
void sub_8184DA4(u8 arg0);
void sub_8184E58(void);
-void RecordedBattle_SetBattlerAction(u8 bank, u8 action);
-void RecordedBattle_ClearBattlerAction(u8 bank, u8 bytesToClear);
-u8 RecordedBattle_GetBattlerAction(u8 bank);
+void RecordedBattle_SetBattlerAction(u8 battlerId, u8 action);
+void RecordedBattle_ClearBattlerAction(u8 battlerId, u8 bytesToClear);
+u8 RecordedBattle_GetBattlerAction(u8 battlerId);
u8 sub_81850D0(void);
u8 sub_81850DC(u8 *arg0);
void sub_81851A8(u8 *arg0);
@@ -19,13 +19,13 @@ void PlayRecordedBattle(void (*CB2_After)(void));
u8 sub_8185EA0(void);
u8 sub_8185EAC(void);
void RecordedBattle_SaveParties(void);
-u8 GetActiveBankLinkPlayerGender(void);
+u8 GetActiveBattlerLinkPlayerGender(void);
void sub_8185F84(void);
void sub_8185F90(u16 arg0);
u8 sub_8185FAC(void);
u8 GetBattleStyleInRecordedBattle(void);
u8 GetTextSpeedInRecordedBattle(void);
-void RecordedBattle_CopyBankMoves(void);
+void RecordedBattle_CopyBattlerMoves(void);
void sub_818603C(u8 arg0);
u32 GetAiScriptsInRecordedBattle(void);
void sub_8186444(void);
diff --git a/include/reset_save_heap.h b/include/reset_save_heap.h
new file mode 100644
index 000000000..12fd186ec
--- /dev/null
+++ b/include/reset_save_heap.h
@@ -0,0 +1,12 @@
+#ifndef GUARD_RESET_SAVE_HEAP_H
+#define GUARD_RESET_SAVE_HEAP_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+
+void sub_81700F8(void);
+
+#endif //GUARD_RESET_SAVE_HEAP_H
diff --git a/include/rom_8011DC0.h b/include/rom_8011DC0.h
new file mode 100644
index 000000000..fd8c35f56
--- /dev/null
+++ b/include/rom_8011DC0.h
@@ -0,0 +1,12 @@
+#ifndef GUARD_rom_8011DC0_H
+#define GUARD_rom_8011DC0_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+
+void sub_8018438(void);
+
+#endif //GUARD_rom_8011DC0_H
diff --git a/include/shop.h b/include/shop.h
index d3e86408c..9b14a672e 100644
--- a/include/shop.h
+++ b/include/shop.h
@@ -6,5 +6,6 @@ extern EWRAM_DATA struct ItemSlot gUnknown_02039F80[3];
void CreatePokemartMenu(const u16 *);
void CreateDecorationShop1Menu(const u16 *);
void CreateDecorationShop2Menu(const u16 *);
+void CB2_ExitSellMenu(void);
#endif // GUARD_SHOP_H
diff --git a/include/strings.h b/include/strings.h
index a3d2a2fb7..59ca5719c 100644
--- a/include/strings.h
+++ b/include/strings.h
@@ -101,6 +101,11 @@ extern const u8 gText_NoRegistry[];
extern const u8 gText_OkayToDeleteFromRegistry[];
extern const u8 gText_RegisteredDataDeleted[];
extern const u8 gUnknown_085EA79D[];
+extern const u8 gText_CommErrorEllipsis[];
+extern const u8 gText_MoveCloserToLinkPartner[];
+extern const u8 gText_CommErrorCheckConnections[];
+extern const u8 gText_ABtnTitleScreen[];
+extern const u8 gText_ABtnRegistrationCounter[];
extern const u8 gText_EmptyString2[];
extern const u8 gText_Confirm3[];
extern const u8 gText_Cancel4[];
@@ -134,6 +139,14 @@ extern const u8 gMenuText_Use[];
extern const u8 gMenuText_Toss[];
extern const u8 gMenuText_Give[];
extern const u8 gMenuText_Give2[];
+extern const u8 gMenuText_Register[];
+extern const u8 gMenuText_Check[];
+extern const u8 gMenuText_Walk[];
+extern const u8 gMenuText_Deselect[];
+extern const u8 gMenuText_CheckTag[];
+extern const u8 gMenuText_Confirm[];
+extern const u8 gMenuText_Show[];
+extern const u8 gMenuText_Give2[];
extern const u8 gText_Cancel2[];
@@ -245,6 +258,48 @@ extern const u8 gText_ContinueMenuPlayer[];
extern const u8 gText_ContinueMenuTime[];
extern const u8 gText_ContinueMenuPokedex[];
extern const u8 gText_ContinueMenuBadges[];
+extern const u8 gText_BirchBoy[];
+extern const u8 gText_BirchGirl[];
+extern const u8 gText_DefaultNameStu[];
+extern const u8 gText_DefaultNameMilton[];
+extern const u8 gText_DefaultNameTom[];
+extern const u8 gText_DefaultNameKenny[];
+extern const u8 gText_DefaultNameReid[];
+extern const u8 gText_DefaultNameJude[];
+extern const u8 gText_DefaultNameJaxson[];
+extern const u8 gText_DefaultNameEaston[];
+extern const u8 gText_DefaultNameWalker[];
+extern const u8 gText_DefaultNameTeru[];
+extern const u8 gText_DefaultNameJohnny[];
+extern const u8 gText_DefaultNameBrett[];
+extern const u8 gText_DefaultNameSeth[];
+extern const u8 gText_DefaultNameTerry[];
+extern const u8 gText_DefaultNameCasey[];
+extern const u8 gText_DefaultNameDarren[];
+extern const u8 gText_DefaultNameLandon[];
+extern const u8 gText_DefaultNameCollin[];
+extern const u8 gText_DefaultNameStanley[];
+extern const u8 gText_DefaultNameQuincy[];
+extern const u8 gText_DefaultNameKimmy[];
+extern const u8 gText_DefaultNameTiara[];
+extern const u8 gText_DefaultNameBella[];
+extern const u8 gText_DefaultNameJayla[];
+extern const u8 gText_DefaultNameAllie[];
+extern const u8 gText_DefaultNameLianna[];
+extern const u8 gText_DefaultNameSara[];
+extern const u8 gText_DefaultNameMonica[];
+extern const u8 gText_DefaultNameCamila[];
+extern const u8 gText_DefaultNameAubree[];
+extern const u8 gText_DefaultNameRuthie[];
+extern const u8 gText_DefaultNameHazel[];
+extern const u8 gText_DefaultNameNadine[];
+extern const u8 gText_DefaultNameTanja[];
+extern const u8 gText_DefaultNameYasmin[];
+extern const u8 gText_DefaultNameNicola[];
+extern const u8 gText_DefaultNameLillie[];
+extern const u8 gText_DefaultNameTerra[];
+extern const u8 gText_DefaultNameLucy[];
+extern const u8 gText_DefaultNameHalie[];
// mystery event menu text
extern const u8 gText_EventSafelyLoaded[];
@@ -267,4 +322,30 @@ extern const u8 gText_Var1DotVar2[];
extern const u8 gText_ThreeMarks[];
extern const u8 gText_FirmSlash[];
+//item menu screen text
+extern const u8 gText_CloseBag[];
+extern const u8 gText_ClearTo11Var1Clear5Var2[];
+extern const u8 gText_UnkF908Var1Clear7Var2[];
+extern const u8 gText_xVar1[];
+extern const u8 gText_ReturnToVar1[];
+extern const u8 gText_SelectorArrow2[];
+extern const u8 gText_MoveVar1Where[];
+extern const u8 gText_Var1IsSelected[];
+extern const u8 gText_TossHowManyVar1s[];
+extern const u8 gText_ConfirmTossItems[];
+extern const u8 gText_ThrewAwayVar2Var1s[];
+extern const u8 gText_CantWriteMail[];
+extern const u8 gText_NoPokemon[];
+extern const u8 gText_Var1CantBeHeld[];
+extern const u8 gText_Var1CantBeHeldHere[];
+extern const u8 gText_CantBuyKeyItem[];
+extern const u8 gText_HowManyToSell[];
+extern const u8 gText_ICanPayVar1[];
+extern const u8 gText_TurnedOverVar1ForVar2[];
+extern const u8 gText_DepositHowManyVar1[];
+extern const u8 gText_CantStoreImportantItems[];
+extern const u8 gText_DepositedVar2Var1s[];
+extern const u8 gText_NoRoomForItems[];
+extern const u8 gText_ThreeDashes[];
+
#endif //GUARD_STRINGS_H
diff --git a/include/text.h b/include/text.h
index e073c3762..81c066426 100644
--- a/include/text.h
+++ b/include/text.h
@@ -208,6 +208,7 @@ void DecompressGlyphTile(const u16 *src, u16 *dest);
u8 GetLastTextColor(u8 colorType);
void CopyGlyphToWindow(struct TextPrinter *x);
void ClearTextSpan(struct TextPrinter *textPrinter, u32 width);
+u8 GetMenuCursorDimensionByFont(u8, u8);
u16 Font0Func(struct TextPrinter *textPrinter);
u16 Font1Func(struct TextPrinter *textPrinter);
diff --git a/include/trade.h b/include/trade.h
new file mode 100644
index 000000000..15438ff3f
--- /dev/null
+++ b/include/trade.h
@@ -0,0 +1,12 @@
+#ifndef GUARD_TRADE_H
+#define GUARD_TRADE_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+
+int sub_807A728(void);
+
+#endif //GUARD_TRADE_H
diff --git a/include/window.h b/include/window.h
index 07c642a09..1a6ff3808 100644
--- a/include/window.h
+++ b/include/window.h
@@ -68,5 +68,11 @@ void BlitBitmapRectToWindow4BitTo8Bit(u8 windowId, u8 *pixels, u16 srcX, u16 src
void CopyWindowToVram8Bit(u8 windowId, u8 mode);
extern struct Window gWindows[];
+extern void* gUnknown_03002F70[];
+extern u32 filler_03002F58;
+extern u32 filler_03002F5C;
+extern u32 filler_03002F64;
+
+extern u8 gUnknown_03002F60;
#endif // GUARD_WINDOW_H