summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/battle.h34
-rw-r--r--include/battle_anim.h4
-rw-r--r--include/battle_main.h10
-rw-r--r--include/battle_message.h2
-rw-r--r--include/battle_script_commands.h4
-rw-r--r--include/battle_scripts.h2
-rw-r--r--include/battle_setup.h2
-rw-r--r--include/battle_transition.h90
-rw-r--r--include/battle_transition_frontier.h13
-rw-r--r--include/battle_util.h4
-rw-r--r--include/berry_blender.h10
-rwxr-xr-xinclude/berry_crush.h2
-rw-r--r--include/cable_club.h16
-rw-r--r--include/confetti_util.h33
-rw-r--r--include/config.h8
-rw-r--r--include/constants/battle.h371
-rw-r--r--include/constants/battle_anim.h2
-rw-r--r--include/constants/battle_palace.h10
-rw-r--r--include/constants/battle_script_commands.h2
-rw-r--r--include/constants/cable_club.h16
-rw-r--r--include/constants/coins.h1
-rw-r--r--include/constants/contest.h187
-rw-r--r--include/constants/daycare.h2
-rw-r--r--include/constants/field_effects.h69
-rw-r--r--include/constants/field_specials.h5
-rw-r--r--include/constants/flags.h94
-rw-r--r--include/constants/global.h12
-rw-r--r--include/constants/item.h4
-rw-r--r--include/constants/items.h7
-rwxr-xr-xinclude/constants/layouts.h18
-rwxr-xr-xinclude/constants/map_groups.h118
-rw-r--r--include/constants/map_scripts.h35
-rw-r--r--include/constants/metatile_labels.h50
-rw-r--r--include/constants/opponents.h1
-rw-r--r--include/constants/pokemon.h10
-rw-r--r--include/constants/region_map_sections.h12
-rw-r--r--include/constants/roulette.h7
-rw-r--r--include/constants/slot_machine.h6
-rw-r--r--include/constants/songs.h1075
-rw-r--r--include/constants/trainer_hill.h2
-rw-r--r--include/constants/trainers.h2
-rw-r--r--include/constants/tv.h54
-rw-r--r--include/constants/union_room.h78
-rw-r--r--include/constants/vars.h1
-rw-r--r--include/contest.h451
-rw-r--r--include/contest_link.h23
-rw-r--r--include/contest_link_80F57C4.h12
-rw-r--r--include/contest_link_80FC4F4.h13
-rw-r--r--include/contest_util.h14
-rw-r--r--include/dodrio_berry_picking.h2
-rw-r--r--include/egg_hatch.h2
-rw-r--r--include/event_data.h3
-rw-r--r--include/event_object_lock.h2
-rw-r--r--include/event_object_movement.h38
-rw-r--r--include/event_scripts.h95
-rwxr-xr-xinclude/faraway_island.h2
-rw-r--r--include/field_camera.h2
-rw-r--r--include/field_control_avatar.h2
-rw-r--r--include/field_effect.h10
-rw-r--r--include/field_effect_helpers.h10
-rw-r--r--include/field_message_box.h6
-rw-r--r--include/field_player_avatar.h8
-rw-r--r--include/field_screen_effect.h4
-rw-r--r--include/fieldmap.h22
-rw-r--r--include/fldeff.h21
-rw-r--r--include/fldeff_misc.h22
-rw-r--r--include/gba/io_reg.h10
-rw-r--r--include/gba/m4a_internal.h92
-rw-r--r--include/gba/types.h3
-rw-r--r--include/global.fieldmap.h16
-rw-r--r--include/global.h23
-rw-r--r--include/global.tv.h105
-rw-r--r--include/graphics.h242
-rw-r--r--include/hall_of_fame.h1
-rw-r--r--include/item_menu.h77
-rw-r--r--include/item_menu_icons.h4
-rw-r--r--include/libgcnmultiboot.h2
-rw-r--r--include/link.h151
-rw-r--r--include/link_rfu.h389
-rw-r--r--include/list_menu.h4
-rw-r--r--include/match_call.h2
-rwxr-xr-xinclude/math_util.h18
-rw-r--r--include/menu.h24
-rw-r--r--include/menu_helpers.h4
-rw-r--r--include/menu_specialized.h61
-rwxr-xr-xinclude/mevent.h4
-rw-r--r--include/mevent2.h2
-rw-r--r--include/mystery_gift.h2
-rw-r--r--include/naming_screen.h81
-rw-r--r--include/overworld.h9
-rw-r--r--include/palette.h2
-rw-r--r--include/palette_util.h83
-rw-r--r--include/pokeball.h8
-rw-r--r--include/pokeblock.h18
-rw-r--r--include/pokemon.h6
-rw-r--r--include/pokemon_jump.h2
-rwxr-xr-xinclude/pokemon_summary_screen.h4
-rw-r--r--include/pokenav.h2
-rw-r--r--include/rayquaza_scene.h13
-rw-r--r--include/rom_8011DC0.h4
-rw-r--r--include/rom_81520A8.h33
-rwxr-xr-xinclude/roulette.h30
-rw-r--r--include/roulette_util.h52
-rw-r--r--include/save.h2
-rw-r--r--include/script_pokemon_80F8.h10
-rw-r--r--include/script_pokemon_util.h11
-rw-r--r--include/script_pokemon_util_80F87D8.h9
-rw-r--r--include/shop.h2
-rw-r--r--include/slot_machine.h15
-rw-r--r--include/start_menu.h4
-rw-r--r--include/starter_choose.h1
-rw-r--r--include/strings.h39
-rw-r--r--include/text_window.h2
-rw-r--r--include/trainer_hill.h4
-rw-r--r--include/tv.h14
-rw-r--r--include/union_room.h145
-rw-r--r--include/union_room_battle.h3
-rwxr-xr-xinclude/union_room_chat.h15
-rw-r--r--include/union_room_player_avatar.h18
-rw-r--r--include/unk_transition.h13
120 files changed, 2715 insertions, 2424 deletions
diff --git a/include/battle.h b/include/battle.h
index b377dc23c..5a04c1eec 100644
--- a/include/battle.h
+++ b/include/battle.h
@@ -124,22 +124,22 @@ struct ProtectStruct
u32 flinchImmobility:1;
u32 notFirstStrike:1;
u32 palaceUnableToUseMove:1;
- u32 physicalDmg;
- u32 specialDmg;
+ s32 physicalDmg;
+ s32 specialDmg;
u8 physicalBattlerId;
u8 specialBattlerId;
};
struct SpecialStatus
{
- u8 statLowered:1;
- u8 lightningRodRedirected:1;
- u8 restoredBattlerSprite: 1;
- u8 intimidatedMon:1;
- u8 traced:1;
- u8 ppNotAffectedByPressure:1;
- u8 flag40:1;
- u8 focusBanded:1;
+ u32 statLowered:1;
+ u32 lightningRodRedirected:1;
+ u32 restoredBattlerSprite: 1;
+ u32 intimidatedMon:1;
+ u32 traced:1;
+ u32 ppNotAffectedByPressure:1;
+ u32 flag40:1;
+ u32 focusBanded:1;
s32 dmg;
s32 physicalDmg;
s32 specialDmg;
@@ -254,7 +254,7 @@ struct BattleResults
u16 playerMon2Species; // 0x26
u16 caughtMonSpecies; // 0x28
u8 caughtMonNick[POKEMON_NAME_LENGTH + 1]; // 0x2A
- u8 filler35[1]; // 0x35
+ u8 filler35; // 0x35
u8 catchAttempts[11]; // 0x36
};
@@ -390,7 +390,7 @@ struct BattleStruct
u8 expGetterBattlerId;
u8 unused_5;
u8 field_91; // related to gAbsentBattlerFlags, possibly absent flags turn ago?
- u8 field_92; // battle palace related
+ u8 palaceFlags; // First 4 bits are "is < 50% HP and not asleep" for each battler, last 4 bits are selected moves to pass to AI
u8 field_93; // related to choosing pokemon?
u8 wallyBattleState;
u8 wallyMovesState;
@@ -523,14 +523,14 @@ struct BattleAnimationInfo
u8 field_7;
u8 ballThrowCaseId;
u8 field_9_x1:1;
- u8 field_9_x2:1;
+ u8 wildMonInvisible:1;
u8 field_9_x1C:3;
u8 field_9_x20:1;
u8 field_9_x40:1;
u8 field_9_x80:1;
- u8 field_A;
+ u8 numBallParticles;
u8 field_B;
- s16 field_C;
+ s16 ballSubpx;
u8 field_E;
u8 field_F;
};
@@ -544,8 +544,8 @@ struct BattleHealthboxInfo
u8 statusAnimActive:1; // x10
u8 animFromTableActive:1; // x20
u8 specialAnimActive:1; // x40
- u8 flag_x80:1;
- u8 field_1_x1:1;
+ u8 triedShinyMonAnim:1;
+ u8 finishedShinyMonAnim:1;
u8 field_1_x1E:4;
u8 field_1_x20:1;
u8 field_1_x40:1;
diff --git a/include/battle_anim.h b/include/battle_anim.h
index 18727cc73..096d533e2 100644
--- a/include/battle_anim.h
+++ b/include/battle_anim.h
@@ -207,8 +207,8 @@ void LaunchStatusAnimation(u8 battlerId, u8 statusAnimId);
// battle_anim_ground.c
void AnimTask_HorizontalShake(u8 taskId);
-// battle_anim_special.c
-void sub_8172EF0(u8 battler, struct Pokemon *mon);
+// battle_anim_throw.c
+void TryShinyAnimation(u8 battler, struct Pokemon *mon);
u8 ItemIdToBallId(u16 itemId);
u8 AnimateBallOpenParticles(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballId);
u8 LaunchBallFadeMonTask(bool8 unFadeLater, u8 battlerId, u32 selectedPalettes, u8 ballId);
diff --git a/include/battle_main.h b/include/battle_main.h
index e04db17bb..890e47f39 100644
--- a/include/battle_main.h
+++ b/include/battle_main.h
@@ -57,17 +57,17 @@ u32 sub_80397C4(u32 setId, u32 tableId);
void SpriteCb_WildMon(struct Sprite *sprite);
void SpriteCallbackDummy_2(struct Sprite *sprite);
void SpriteCB_FaintOpponentMon(struct Sprite *sprite);
-void sub_8039AD8(struct Sprite *sprite);
-void sub_8039B2C(struct Sprite *sprite);
-void sub_8039B58(struct Sprite *sprite);
+void SpriteCb_ShowAsMoveTarget(struct Sprite *sprite);
+void SpriteCb_HideAsMoveTarget(struct Sprite *sprite);
+void SpriteCb_OpponentMonFromBall(struct Sprite *sprite);
void sub_8039BB4(struct Sprite *sprite);
void sub_80105DC(struct Sprite *sprite);
void sub_8039C00(struct Sprite *sprite);
void DoBounceEffect(u8 battlerId, u8 b, s8 c, s8 d);
void EndBounceEffect(u8 battlerId, bool8 b);
-void sub_8039E44(struct Sprite *sprite);
+void SpriteCb_PlayerMonFromBall(struct Sprite *sprite);
void sub_8039E60(struct Sprite *sprite);
-void sub_8039E84(struct Sprite *sprite);
+void SpriteCB_TrainerThrowObject(struct Sprite *sprite);
void sub_8039E9C(struct Sprite *sprite);
void nullsub_20(void);
void BeginBattleIntro(void);
diff --git a/include/battle_message.h b/include/battle_message.h
index a3f2636e5..011a1cb0c 100644
--- a/include/battle_message.h
+++ b/include/battle_message.h
@@ -274,7 +274,7 @@ extern const u8 gText_PkmnGettingPumped[];
extern const u8 gText_PkmnShroudedInMist[];
extern const u8 gText_PkmnsXPreventsSwitching[];
extern const u8 gText_TheGreatNewHope[];
-extern const u8 gText_WillChampinshipDreamComeTrue[];
+extern const u8 gText_WillChampionshipDreamComeTrue[];
extern const u8 gText_AFormerChampion[];
extern const u8 gText_ThePreviousChampion[];
extern const u8 gText_TheUnbeatenChampion[];
diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h
index 142ac1f7b..ee3676463 100644
--- a/include/battle_script_commands.h
+++ b/include/battle_script_commands.h
@@ -1,6 +1,8 @@
#ifndef GUARD_BATTLE_SCRIPT_COMMANDS_H
#define GUARD_BATTLE_SCRIPT_COMMANDS_H
+#include "constants/pokemon.h"
+
#define WINDOW_CLEAR 0x1
#define WINDOW_x80 0x80
@@ -16,6 +18,6 @@ void HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags);
bool8 UproarWakeUpCheck(u8 battlerId);
extern void (* const gBattleScriptingCommandsTable[])(void);
-extern const u8 gUnknown_0831C494[][4];
+extern const u8 gBattlePalaceNatureToMoveGroupLikelihood[NUM_NATURES][4];
#endif // GUARD_BATTLE_SCRIPT_COMMANDS_H
diff --git a/include/battle_scripts.h b/include/battle_scripts.h
index 75abaae3c..706d41097 100644
--- a/include/battle_scripts.h
+++ b/include/battle_scripts.h
@@ -205,7 +205,7 @@ extern const u8 BattleScript_BerryStatRaiseEnd2[];
extern const u8 BattleScript_BerryFocusEnergyEnd2[];
extern const u8 BattleScript_ActionSelectionItemsCantBeUsed[];
extern const u8 BattleScript_ArenaTurnBeginning[];
-extern const u8 BattleScript_82DB881[];
+extern const u8 BattleScript_PalacePrintFlavorText[];
extern const u8 BattleScript_ArenaDoJudgment[];
extern const u8 BattleScript_82DAA0B[];
extern const u8 BattleScript_AskIfWantsToForfeitMatch[];
diff --git a/include/battle_setup.h b/include/battle_setup.h
index e88995778..7fa0457a8 100644
--- a/include/battle_setup.h
+++ b/include/battle_setup.h
@@ -28,7 +28,7 @@ void BattleSetup_StartLegendaryBattle(void);
void StartGroudonKyogreBattle(void);
void StartRegiBattle(void);
u8 BattleSetup_GetTerrainId(void);
-u8 sub_80B100C(s32 arg0);
+u8 GetSpecialBattleTransition(s32 arg0);
void ChooseStarter(void);
void ResetTrainerOpponentIds(void);
void SetMapVarsToTrainer(void);
diff --git a/include/battle_transition.h b/include/battle_transition.h
index db06a5638..a33032fb4 100644
--- a/include/battle_transition.h
+++ b/include/battle_transition.h
@@ -7,9 +7,9 @@ void BattleTransition_Start(u8 transitionId);
bool8 IsBattleTransitionDone(void);
bool8 FldEff_Pokeball(void);
void TransitionPhase1_Task_RunFuncs(u8 taskId);
-void sub_8149F58(u16 **a0, u16 **a1);
+void GetBg0TilesDst(u16 **tilemap, u16 **tileset);
-extern const struct SpritePalette gFieldEffectObjectPaletteInfo10;
+extern const struct SpritePalette gSpritePalette_Pokeball;
enum // TRANSITION_MUGSHOT
{
@@ -24,49 +24,49 @@ enum // TRANSITION_MUGSHOT
// credits for the names go to Dyskinesia, Tetrable and Farore
// names are naturally subject to change
-#define B_TRANSITION_BLUR 0
-#define B_TRANSITION_SWIRL 1
-#define B_TRANSITION_SHUFFLE 2
-#define B_TRANSITION_BIG_POKEBALL 3
-#define B_TRANSITION_POKEBALLS_TRAIL 4
-#define B_TRANSITION_CLOCKWISE_BLACKFADE 5
-#define B_TRANSITION_RIPPLE 6
-#define B_TRANSITION_WAVE 7
-#define B_TRANSITION_SLICE 8
-#define B_TRANSITION_WHITEFADE 9
-#define B_TRANSITION_GRID_SQUARES 10
-#define B_TRANSITION_SHARDS 11
-#define B_TRANSITION_SIDNEY 12
-#define B_TRANSITION_PHOEBE 13
-#define B_TRANSITION_GLACIA 14
-#define B_TRANSITION_DRAKE 15
-#define B_TRANSITION_CHAMPION 16
+#define B_TRANSITION_BLUR 0
+#define B_TRANSITION_SWIRL 1
+#define B_TRANSITION_SHUFFLE 2
+#define B_TRANSITION_BIG_POKEBALL 3
+#define B_TRANSITION_POKEBALLS_TRAIL 4
+#define B_TRANSITION_CLOCKWISE_BLACKFADE 5
+#define B_TRANSITION_RIPPLE 6
+#define B_TRANSITION_WAVE 7
+#define B_TRANSITION_SLICE 8
+#define B_TRANSITION_WHITEFADE 9
+#define B_TRANSITION_GRID_SQUARES 10
+#define B_TRANSITION_SHARDS 11
+#define B_TRANSITION_SIDNEY 12
+#define B_TRANSITION_PHOEBE 13
+#define B_TRANSITION_GLACIA 14
+#define B_TRANSITION_DRAKE 15
+#define B_TRANSITION_CHAMPION 16
// added in Emerald
-#define B_TRANSITION_AQUA 17
-#define B_TRANSITION_MAGMA 18
-#define B_TRANSITION_REGICE 19
-#define B_TRANSITION_REGISTEEL 20
-#define B_TRANSITION_REGIROCK 21
-#define B_TRANSITION_KYOGRE 22
-#define B_TRANSITION_GROUDON 23
-#define B_TRANSITION_RAYQUAZA 24
-#define B_TRANSITION_SHRED_SPLIT 25
-#define B_TRANSITION_BLACKHOLE1 26
-#define B_TRANSITION_BLACKHOLE2 27
-#define B_TRANSITION_RECTANGULAR_SPIRAL 28
-#define B_TRANSITION_29 29
-#define B_TRANSITION_30 30
-#define B_TRANSITION_31 31
-#define B_TRANSITION_32 32
-#define B_TRANSITION_33 33
-#define B_TRANSITION_34 34
-#define B_TRANSITION_35 35
-#define B_TRANSITION_36 36
-#define B_TRANSITION_37 37
-#define B_TRANSITION_38 38
-#define B_TRANSITION_39 39
-#define B_TRANSITION_40 40
-#define B_TRANSITION_41 41
-#define B_TRANSITION_COUNT 42
+#define B_TRANSITION_AQUA 17
+#define B_TRANSITION_MAGMA 18
+#define B_TRANSITION_REGICE 19
+#define B_TRANSITION_REGISTEEL 20
+#define B_TRANSITION_REGIROCK 21
+#define B_TRANSITION_KYOGRE 22
+#define B_TRANSITION_GROUDON 23
+#define B_TRANSITION_RAYQUAZA 24
+#define B_TRANSITION_SHRED_SPLIT 25
+#define B_TRANSITION_BLACKHOLE1 26
+#define B_TRANSITION_BLACKHOLE2 27
+#define B_TRANSITION_RECTANGULAR_SPIRAL 28
+#define B_TRANSITION_FRONTIER_LOGO_WIGGLE 29
+#define B_TRANSITION_FRONTIER_LOGO_WAVE 30
+#define B_TRANSITION_FRONTIER_SQUARES 31
+#define B_TRANSITION_FRONTIER_SQUARES_SCROLL 32
+#define B_TRANSITION_FRONTIER_SQUARES_SPIRAL 33
+#define B_TRANSITION_FRONTIER_CIRCLES_MEET 34
+#define B_TRANSITION_FRONTIER_CIRCLES_CROSS 35
+#define B_TRANSITION_FRONTIER_CIRCLES_ASYMMETRIC_SPIRAL 36
+#define B_TRANSITION_FRONTIER_CIRCLES_SYMMETRIC_SPIRAL 37
+#define B_TRANSITION_FRONTIER_CIRCLES_MEET_IN_SEQ 38
+#define B_TRANSITION_FRONTIER_CIRCLES_CROSS_IN_SEQ 39
+#define B_TRANSITION_FRONTIER_CIRCLES_ASYMMETRIC_SPIRAL_IN_SEQ 40
+#define B_TRANSITION_FRONTIER_CIRCLES_SYMMETRIC_SPIRAL_IN_SEQ 41
+#define B_TRANSITION_COUNT 42
#endif // GUARD_BATTLE_TRANSITION_H
diff --git a/include/battle_transition_frontier.h b/include/battle_transition_frontier.h
new file mode 100644
index 000000000..8813fe81e
--- /dev/null
+++ b/include/battle_transition_frontier.h
@@ -0,0 +1,13 @@
+#ifndef GUARD_BATTLE_TRANSITION_FRONTIER_H
+#define GUARD_BATTLE_TRANSITION_FRONTIER_H
+
+void Phase2Task_FrontierCirclesMeet(u8 taskId);
+void Phase2Task_FrontierCirclesCross(u8 taskId);
+void Phase2Task_FrontierCirclesAsymmetricSpiral(u8 taskId);
+void Phase2Task_FrontierCirclesSymmetricSpiral(u8 taskId);
+void Phase2Task_FrontierCirclesMeetInSeq(u8 taskId);
+void Phase2Task_FrontierCirclesCrossInSeq(u8 taskId);
+void Phase2Task_FrontierCirclesAsymmetricSpiralInSeq(u8 taskId);
+void Phase2Task_FrontierCirclesSymmetricSpiralInSeq(u8 taskId);
+
+#endif // GUARD_BATTLE_TRANSITION_FRONTIER_H
diff --git a/include/battle_util.h b/include/battle_util.h
index b77fa10ad..157ba8eb6 100644
--- a/include/battle_util.h
+++ b/include/battle_util.h
@@ -52,8 +52,8 @@ void CancelMultiTurnMoves(u8 battlerId);
bool8 WasUnableToUseMove(u8 battlerId);
void PrepareStringBattle(u16 stringId, u8 battlerId);
void ResetSentPokesToOpponentValue(void);
-void sub_803F9EC(u8 battlerId);
-void sub_803FA70(u8 battlerId);
+void OpponentSwitchInResetSentPokesToOpponentValue(u8 battlerId);
+void UpdateSentPokesToOpponentValue(u8 battlerId);
void BattleScriptPush(const u8* bsPtr);
void BattleScriptPushCursor(void);
void BattleScriptPop(void);
diff --git a/include/berry_blender.h b/include/berry_blender.h
index e8f7bb83d..66d839389 100644
--- a/include/berry_blender.h
+++ b/include/berry_blender.h
@@ -1,6 +1,16 @@
#ifndef GUARD_BERRY_BLENDER_H
#define GUARD_BERRY_BLENDER_H
+// Indices into gSendCmd / gRecvCmds
+#define BLENDER_COMM_INPUT_STATE 0
+#define BLENDER_COMM_RESP 1
+#define BLENDER_COMM_SCORE 2
+#define BLENDER_COMM_STOP_TYPE 2 // re-used
+#define BLENDER_COMM_PLAYER_ID 3
+#define BLENDER_COMM_UNUSED 4
+#define BLENDER_COMM_PROGRESS_BAR 5
+#define BLENDER_COMM_ARROW_POS 6
+
extern u8 gInGameOpponentsNo;
void DoBerryBlending(void);
diff --git a/include/berry_crush.h b/include/berry_crush.h
index 8909ae821..a08f1f699 100755
--- a/include/berry_crush.h
+++ b/include/berry_crush.h
@@ -3,6 +3,6 @@
#include "main.h"
-void sub_8020C70(MainCallback callback);
+void StartBerryCrush(MainCallback callback);
#endif // GUARD_BERRY_CRUSH_H
diff --git a/include/cable_club.h b/include/cable_club.h
index c2849ca3e..7340742ea 100644
--- a/include/cable_club.h
+++ b/include/cable_club.h
@@ -3,18 +3,12 @@
#include "task.h"
-// Exported type declarations
-
-// Exported RAM declarations
-
-// Exported ROM declarations
-
-void sub_80B37D4(TaskFunc taskFunc);
-u8 sub_80B3050(void);
-void sub_80B360C(void);
-bool32 sub_80B2AF4(u16 *arg0, u16 *arg1);
+void CreateTask_EnterCableClubSeat(TaskFunc taskFunc);
+u8 CreateTask_ReestablishCableClubLink(void);
+void CB2_ReturnFromCableClubBattle(void);
+bool32 AreBattleTowerLinkSpeciesSame(u16 *speciesList1, u16 *speciesList2);
void sub_80B3AF8(u8 taskId);
-void task00_08081A90(u8 taskId);
+void Task_WaitForLinkPlayerConnection(u8 taskId);
bool32 GetLinkTrainerCardColor(u8 linkPlayerIndex);
#endif //GUARD_CABLE_CLUB_H
diff --git a/include/confetti_util.h b/include/confetti_util.h
new file mode 100644
index 000000000..ecc05a220
--- /dev/null
+++ b/include/confetti_util.h
@@ -0,0 +1,33 @@
+#ifndef GUARD_CONFETTI_UTIL_H
+#define GUARD_CONFETTI_UTIL_H
+
+struct ConfettiUtil
+{
+ struct OamData oam;
+ s16 x;
+ s16 y;
+ s16 xDelta;
+ s16 yDelta;
+ u16 tileTag;
+ u16 palTag;
+ u16 tileNum;
+ u8 id;
+ u8 filler;
+ u8 animNum;
+ u8 active:1;
+ u8 allowUpdates:1;
+ u8 dummied:1;
+ u8 priority:2;
+ s16 data[8];
+ void (*callback)(struct ConfettiUtil *);
+};
+
+bool32 ConfettiUtil_Init(u8 count);
+bool32 ConfettiUtil_Free(void);
+bool32 ConfettiUtil_Update(void);
+u8 ConfettiUtil_SetCallback(u8 id, void (*func)(struct ConfettiUtil *));
+u8 ConfettiUtil_SetData(u8 id, u8 dataArrayId, s16 dataValue);
+u8 ConfettiUtil_AddNew(const struct OamData *oam, u16 tileTag, u16 palTag, s16 x, s16 y, u8 animNum, u8 priority);
+u8 ConfettiUtil_Remove(u8 id);
+
+#endif // GUARD_CONFETTI_UTIL_H
diff --git a/include/config.h b/include/config.h
index 318ed39d8..4f97a12a3 100644
--- a/include/config.h
+++ b/include/config.h
@@ -26,4 +26,12 @@
#define UNITS_METRIC
#endif
+// Various undefined behavior bugs may or may not prevent compilation with
+// newer compilers. So always fix them when using a modern compiler.
+#if MODERN
+#ifndef UBFIX
+#define UBFIX
+#endif
+#endif
+
#endif // GUARD_CONFIG_H
diff --git a/include/constants/battle.h b/include/constants/battle.h
index 346d5d9ea..fa8f422c4 100644
--- a/include/constants/battle.h
+++ b/include/constants/battle.h
@@ -37,146 +37,156 @@
#define B_SIDE_PLAYER 0
#define B_SIDE_OPPONENT 1
-#define B_FLANK_LEFT 0
+#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_IS_MASTER 0x0004 // In not-link battles, it's always set.
-#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_TRAINER_HILL 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_DOUBLE (1 << 0)
+#define BATTLE_TYPE_LINK (1 << 1)
+#define BATTLE_TYPE_IS_MASTER (1 << 2) // In not-link battles, it's always set.
+#define BATTLE_TYPE_TRAINER (1 << 3)
+#define BATTLE_TYPE_FIRST_BATTLE (1 << 4)
+#define BATTLE_TYPE_20 (1 << 5)
+#define BATTLE_TYPE_MULTI (1 << 6)
+#define BATTLE_TYPE_SAFARI (1 << 7)
+#define BATTLE_TYPE_BATTLE_TOWER (1 << 8)
+#define BATTLE_TYPE_WALLY_TUTORIAL (1 << 9)
+#define BATTLE_TYPE_ROAMER (1 << 10)
+#define BATTLE_TYPE_EREADER_TRAINER (1 << 11)
+#define BATTLE_TYPE_KYOGRE_GROUDON (1 << 12)
+#define BATTLE_TYPE_LEGENDARY (1 << 13)
+#define BATTLE_TYPE_REGI (1 << 14)
+#define BATTLE_TYPE_TWO_OPPONENTS (1 << 15)
+#define BATTLE_TYPE_DOME (1 << 16)
+#define BATTLE_TYPE_PALACE (1 << 17)
+#define BATTLE_TYPE_ARENA (1 << 18)
+#define BATTLE_TYPE_FACTORY (1 << 19)
+#define BATTLE_TYPE_PIKE (1 << 20)
+#define BATTLE_TYPE_PYRAMID (1 << 21)
+#define BATTLE_TYPE_INGAME_PARTNER (1 << 22)
+#define BATTLE_TYPE_x800000 (1 << 23)
+#define BATTLE_TYPE_RECORDED (1 << 24)
+#define BATTLE_TYPE_x2000000 (1 << 25)
+#define BATTLE_TYPE_TRAINER_HILL (1 << 26)
+#define BATTLE_TYPE_SECRET_BASE (1 << 27)
+#define BATTLE_TYPE_GROUDON (1 << 28)
+#define BATTLE_TYPE_KYOGRE (1 << 29)
+#define BATTLE_TYPE_RAYQUAZA (1 << 30)
+#define BATTLE_TYPE_x80000000 (1 << 31)
#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
+#define B_OUTCOME_WON 1
+#define B_OUTCOME_LOST 2
+#define B_OUTCOME_DREW 3
+#define B_OUTCOME_RAN 4
+#define B_OUTCOME_PLAYER_TELEPORTED 5
+#define B_OUTCOME_MON_FLED 6
+#define B_OUTCOME_CAUGHT 7
+#define B_OUTCOME_NO_SAFARI_BALLS 8
+#define B_OUTCOME_FORFEITED 9
+#define B_OUTCOME_MON_TELEPORTED 10
+#define B_OUTCOME_LINK_BATTLE_RAN (1 << 7) // 128
// 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_NONE 0
+#define STATUS1_SLEEP (1 << 0 | 1 << 1 | 1 << 2) // First 3 bits (Number of turns to sleep)
+#define STATUS1_SLEEP_TURN(num) ((num) << 0) // Just for readability (or if rearranging statuses)
+#define STATUS1_POISON (1 << 3)
+#define STATUS1_BURN (1 << 4)
+#define STATUS1_FREEZE (1 << 5)
+#define STATUS1_PARALYSIS (1 << 6)
+#define STATUS1_TOXIC_POISON (1 << 7)
+#define STATUS1_TOXIC_COUNTER (1 << 8 | 1 << 9 | 1 << 10 | 1 << 11)
+#define STATUS1_TOXIC_TURN(num) ((num) << 8)
#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_CONFUSION (1 << 0 | 1 << 1 | 1 << 2)
+#define STATUS2_CONFUSION_TURN(num) ((num) << 0)
+#define STATUS2_FLINCHED (1 << 3)
+#define STATUS2_UPROAR (1 << 4 | 1 << 5 | 1 << 6)
+#define STATUS2_UPROAR_TURN(num) ((num) << 4)
+#define STATUS2_UNUSED (1 << 7)
+#define STATUS2_BIDE (1 << 8 | 1 << 9)
+#define STATUS2_BIDE_TURN(num) (((num) << 8) & STATUS2_BIDE)
+#define STATUS2_LOCK_CONFUSE (1 << 10 | 1 << 11) // e.g. Thrash
+#define STATUS2_LOCK_CONFUSE_TURN(num)((num) << 10)
+#define STATUS2_MULTIPLETURNS (1 << 12)
+#define STATUS2_WRAPPED (1 << 13 | 1 << 14 | 1 << 15)
+#define STATUS2_WRAPPED_TURN(num) ((num) << 13)
+#define STATUS2_INFATUATION (1 << 16 | 1 << 17 | 1 << 18 | 1 << 19) // 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
+#define STATUS2_FOCUS_ENERGY (1 << 20)
+#define STATUS2_TRANSFORMED (1 << 21)
+#define STATUS2_RECHARGE (1 << 22)
+#define STATUS2_RAGE (1 << 23)
+#define STATUS2_SUBSTITUTE (1 << 24)
+#define STATUS2_DESTINY_BOND (1 << 25)
+#define STATUS2_ESCAPE_PREVENTION (1 << 26)
+#define STATUS2_NIGHTMARE (1 << 27)
+#define STATUS2_CURSED (1 << 28)
+#define STATUS2_FORESIGHT (1 << 29)
+#define STATUS2_DEFENSE_CURL (1 << 30)
+#define STATUS2_TORMENT (1 << 31)
// Seems like per-battler statuses. Not quite sure how to categorize these
-#define STATUS3_LEECHSEED_BATTLER 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_LEECHSEED_BATTLER (1 << 0 | 1 << 1) // The battler to receive HP from Leech Seed
+#define STATUS3_LEECHSEED (1 << 2)
+#define STATUS3_ALWAYS_HITS (1 << 3 | 1 << 4)
+#define STATUS3_ALWAYS_HITS_TURN(num) (((num) << 3) & STATUS3_ALWAYS_HITS) // "Always Hits" is set as a 2 turn timer, i.e. next turn is the last turn when it's active
+#define STATUS3_PERISH_SONG (1 << 5)
+#define STATUS3_ON_AIR (1 << 6)
+#define STATUS3_UNDERGROUND (1 << 7)
+#define STATUS3_MINIMIZED (1 << 8)
+#define STATUS3_CHARGED_UP (1 << 9)
+#define STATUS3_ROOTED (1 << 10)
+#define STATUS3_YAWN (1 << 11 | 1 << 12) // Number of turns to sleep
+#define STATUS3_YAWN_TURN(num) (((num) << 11) & STATUS3_YAWN)
+#define STATUS3_IMPRISONED_OTHERS (1 << 13)
+#define STATUS3_GRUDGE (1 << 14)
+#define STATUS3_CANT_SCORE_A_CRIT (1 << 15)
+#define STATUS3_MUDSPORT (1 << 16)
+#define STATUS3_WATERSPORT (1 << 17)
+#define STATUS3_UNDERWATER (1 << 18)
+#define STATUS3_INTIMIDATE_POKES (1 << 19)
+#define STATUS3_TRACE (1 << 20)
#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_SWAP_ATTACKER_TARGET 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_CHARGING 0x08000000
-#define HITMARKER_FAINTED(battler) (gBitTable[battler] << 0x1C)
-#define HITMARKER_UNK(battler) (0x10000000 << battler)
+#define HITMARKER_x10 (1 << 4)
+#define HITMARKER_x20 (1 << 5)
+#define HITMARKER_DESTINYBOND (1 << 6)
+#define HITMARKER_NO_ANIMATIONS (1 << 7)
+#define HITMARKER_IGNORE_SUBSTITUTE (1 << 8)
+#define HITMARKER_NO_ATTACKSTRING (1 << 9)
+#define HITMARKER_ATTACKSTRING_PRINTED (1 << 10)
+#define HITMARKER_NO_PPDEDUCT (1 << 11)
+#define HITMARKER_SWAP_ATTACKER_TARGET (1 << 12)
+#define HITMARKER_IGNORE_SAFEGUARD (1 << 13)
+#define HITMARKER_SYNCHRONISE_EFFECT (1 << 14)
+#define HITMARKER_RUN (1 << 15)
+#define HITMARKER_IGNORE_ON_AIR (1 << 16)
+#define HITMARKER_IGNORE_UNDERGROUND (1 << 17)
+#define HITMARKER_IGNORE_UNDERWATER (1 << 18)
+#define HITMARKER_UNABLE_TO_USE_MOVE (1 << 19)
+#define HITMARKER_x100000 (1 << 20)
+#define HITMARKER_x200000 (1 << 21)
+#define HITMARKER_x400000 (1 << 22)
+#define HITMARKER_x800000 (1 << 23)
+#define HITMARKER_GRUDGE (1 << 24)
+#define HITMARKER_OBEYS (1 << 25)
+#define HITMARKER_x4000000 (1 << 26)
+#define HITMARKER_CHARGING (1 << 27)
+#define HITMARKER_FAINTED(battler) (gBitTable[battler] << 28)
+#define HITMARKER_FAINTED2(battler) ((1 << 28) << battler)
// Per-side statuses that affect an entire party
#define SIDE_STATUS_REFLECT (1 << 0)
@@ -215,71 +225,70 @@
#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 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 MOVE_EFFECT_SLEEP 1
+#define MOVE_EFFECT_POISON 2
+#define MOVE_EFFECT_BURN 3
+#define MOVE_EFFECT_FREEZE 4
+#define MOVE_EFFECT_PARALYSIS 5
+#define MOVE_EFFECT_TOXIC 6
+#define PRIMARY_STATUS_MOVE_EFFECT MOVE_EFFECT_TOXIC // All above move effects apply primary status
+#define MOVE_EFFECT_CONFUSION 7
+#define MOVE_EFFECT_FLINCH 8
+#define MOVE_EFFECT_TRI_ATTACK 9
+#define MOVE_EFFECT_UPROAR 10
+#define MOVE_EFFECT_PAYDAY 11
+#define MOVE_EFFECT_CHARGING 12
+#define MOVE_EFFECT_WRAP 13
+#define MOVE_EFFECT_RECOIL_25 14
+#define MOVE_EFFECT_ATK_PLUS_1 15
+#define MOVE_EFFECT_DEF_PLUS_1 16
+#define MOVE_EFFECT_SPD_PLUS_1 17
+#define MOVE_EFFECT_SP_ATK_PLUS_1 18
+#define MOVE_EFFECT_SP_DEF_PLUS_1 19
+#define MOVE_EFFECT_ACC_PLUS_1 20
+#define MOVE_EFFECT_EVS_PLUS_1 21
+#define MOVE_EFFECT_ATK_MINUS_1 22
+#define MOVE_EFFECT_DEF_MINUS_1 23
+#define MOVE_EFFECT_SPD_MINUS_1 24
+#define MOVE_EFFECT_SP_ATK_MINUS_1 25
+#define MOVE_EFFECT_SP_DEF_MINUS_1 26
+#define MOVE_EFFECT_ACC_MINUS_1 27
+#define MOVE_EFFECT_EVS_MINUS_1 28
+#define MOVE_EFFECT_RECHARGE 29
+#define MOVE_EFFECT_RAGE 30
+#define MOVE_EFFECT_STEAL_ITEM 31
+#define MOVE_EFFECT_PREVENT_ESCAPE 32
+#define MOVE_EFFECT_NIGHTMARE 33
+#define MOVE_EFFECT_ALL_STATS_UP 34
+#define MOVE_EFFECT_RAPIDSPIN 35
+#define MOVE_EFFECT_REMOVE_PARALYSIS 36
+#define MOVE_EFFECT_ATK_DEF_DOWN 37
+#define MOVE_EFFECT_RECOIL_33 38
+#define MOVE_EFFECT_ATK_PLUS_2 39
+#define MOVE_EFFECT_DEF_PLUS_2 40
+#define MOVE_EFFECT_SPD_PLUS_2 41
+#define MOVE_EFFECT_SP_ATK_PLUS_2 42
+#define MOVE_EFFECT_SP_DEF_PLUS_2 43
+#define MOVE_EFFECT_ACC_PLUS_2 44
+#define MOVE_EFFECT_EVS_PLUS_2 45
+#define MOVE_EFFECT_ATK_MINUS_2 46
+#define MOVE_EFFECT_DEF_MINUS_2 47
+#define MOVE_EFFECT_SPD_MINUS_2 48
+#define MOVE_EFFECT_SP_ATK_MINUS_2 49
+#define MOVE_EFFECT_SP_DEF_MINUS_2 50
+#define MOVE_EFFECT_ACC_MINUS_2 51
+#define MOVE_EFFECT_EVS_MINUS_2 52
+#define MOVE_EFFECT_THRASH 53
+#define MOVE_EFFECT_KNOCK_OFF 54
+#define MOVE_EFFECT_NOTHING_37 55
+#define MOVE_EFFECT_NOTHING_38 56
+#define MOVE_EFFECT_NOTHING_39 57
+#define MOVE_EFFECT_NOTHING_3A 58
+#define MOVE_EFFECT_SP_ATK_TWO_DOWN 59
+#define NUM_MOVE_EFFECTS 60
+
+#define MOVE_EFFECT_AFFECTS_USER (1 << 6) // 64
+#define MOVE_EFFECT_CERTAIN (1 << 7) // 128
// Battle terrain defines for gBattleTerrain.
#define BATTLE_TERRAIN_GRASS 0
diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h
index dfdd9f912..ebc422b18 100644
--- a/include/constants/battle_anim.h
+++ b/include/constants/battle_anim.h
@@ -376,7 +376,7 @@
#define B_ANIM_SWITCH_OUT_PLAYER_MON 0x1
#define B_ANIM_SWITCH_OUT_OPPONENT_MON 0x2
#define B_ANIM_BALL_THROW 0x3
-#define B_ANIM_SAFARI_BALL_THROW 0x4
+#define B_ANIM_BALL_THROW_WITH_TRAINER 0x4
#define B_ANIM_SUBSTITUTE_TO_MON 0x5
#define B_ANIM_MON_TO_SUBSTITUTE 0x6
diff --git a/include/constants/battle_palace.h b/include/constants/battle_palace.h
index db9855101..851655089 100644
--- a/include/constants/battle_palace.h
+++ b/include/constants/battle_palace.h
@@ -16,4 +16,14 @@
#define PALACE_DATA_WIN_STREAK 1
#define PALACE_DATA_WIN_STREAK_ACTIVE 2
+// Pokemon in Battle Palace have a move "group" type preference depending on nature
+#define PALACE_MOVE_GROUP_ATTACK 0
+#define PALACE_MOVE_GROUP_DEFENSE 1
+#define PALACE_MOVE_GROUP_SUPPORT 2
+
+// In palace doubles battles pokemon have a target preference depending on nature
+#define PALACE_TARGET_STRONGER 0
+#define PALACE_TARGET_WEAKER 1
+#define PALACE_TARGET_RANDOM 2
+
#endif //GUARD_CONSTANTS_BATTLE_PALACE_H
diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h
index dfcf79128..9372377c4 100644
--- a/include/constants/battle_script_commands.h
+++ b/include/constants/battle_script_commands.h
@@ -66,8 +66,10 @@
#define VARIOUS_SET_MAGIC_COAT_TARGET 1
#define VARIOUS_IS_RUNNING_IMPOSSIBLE 2
#define VARIOUS_GET_MOVE_TARGET 3
+#define VARIOUS_GET_BATTLER_FAINTED 4
#define VARIOUS_RESET_INTIMIDATE_TRACE_BITS 5
#define VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP 6
+#define VARIOUS_PALACE_FLAVOR_TEXT 8
#define VARIOUS_ARENA_JUDGMENT_WINDOW 9
#define VARIOUS_ARENA_OPPONENT_MON_LOST 10
#define VARIOUS_ARENA_PLAYER_MON_LOST 11
diff --git a/include/constants/cable_club.h b/include/constants/cable_club.h
index f2aa4120c..cbdd049db 100644
--- a/include/constants/cable_club.h
+++ b/include/constants/cable_club.h
@@ -12,4 +12,20 @@
#define USING_MINIGAME 8
#define USING_BATTLE_TOWER 9
+// Return states for the group of specials that use CreateLinkupTask
+// A few also used by TryBecomeLinkLeader and TryJoinLinkGroup
+#define LINKUP_ONGOING 0
+#define LINKUP_SUCCESS 1
+#define LINKUP_SOMEONE_NOT_READY 2
+#define LINKUP_DIFF_SELECTIONS 3
+#define LINKUP_WRONG_NUM_PLAYERS 4
+#define LINKUP_FAILED 5
+#define LINKUP_CONNECTION_ERROR 6
+#define LINKUP_PLAYER_NOT_READY 7
+#define LINKUP_RETRY_ROLE_ASSIGN 8
+#define LINKUP_PARTNER_NOT_READY 9
+#define LINKUP_FAILED_CONTEST_GMODE 10
+#define LINKUP_FAILED_BATTLE_TOWER 11
+#define LINKUP_FOREIGN_GAME 12
+
#endif //GUARD_CONSTANTS_CABLE_CLUB_H
diff --git a/include/constants/coins.h b/include/constants/coins.h
index 3ae3bb23f..e65e981d6 100644
--- a/include/constants/coins.h
+++ b/include/constants/coins.h
@@ -2,5 +2,6 @@
#define GUARD_CONSTANTS_COINS_H
#define MAX_COINS 9999
+#define MAX_COIN_DIGITS 4
#endif // GUARD_CONSTANTS_COINS_H
diff --git a/include/constants/contest.h b/include/constants/contest.h
index 186c56e2b..9eb6b26e4 100644
--- a/include/constants/contest.h
+++ b/include/constants/contest.h
@@ -1,9 +1,9 @@
#ifndef GUARD_CONSTANTS_CONTEST_H
#define GUARD_CONSTANTS_CONTEST_H
-#define CONTESTANT_COUNT 4
#define APPLAUSE_METER_SIZE 5
-#define CONTEST_TURN_COUNT 5
+#define CONTEST_NUM_APPEALS 5
+#define CONTEST_LAST_APPEAL (CONTEST_NUM_APPEALS - 1)
#define LINK_CONTEST_FLAG_IS_LINK (1 << 0)
#define LINK_CONTEST_FLAG_IS_WIRELESS (1 << 1)
@@ -22,12 +22,22 @@
#define CONTEST_TYPE_NPC_MASTER (CONTEST_RANK_MASTER + 1)
#define CONTEST_TYPE_LINK (CONTEST_RANK_LINK + 1)
-#define CONTEST_CATEGORY_COOL 0
-#define CONTEST_CATEGORY_BEAUTY 1
-#define CONTEST_CATEGORY_CUTE 2
-#define CONTEST_CATEGORY_SMART 3
-#define CONTEST_CATEGORY_TOUGH 4
-#define CONTEST_CATEGORIES_COUNT 5
+#define CONTEST_WINNER_ARTIST 0 // Winner shown by the artist, painting not necessarily saved
+#define CONTEST_WINNER_HALL_1 1
+#define CONTEST_WINNER_HALL_2 2
+#define CONTEST_WINNER_HALL_3 3
+#define CONTEST_WINNER_HALL_4 4
+#define CONTEST_WINNER_HALL_5 5
+#define CONTEST_WINNER_HALL_6 6
+#define NUM_CONTEST_HALL_WINNERS 6
+#define CONTEST_WINNER_7 7
+#define CONTEST_WINNER_8 8
+#define CONTEST_WINNER_MUSEUM_COOL 9
+#define CONTEST_WINNER_MUSEUM_BEAUTY 10
+#define CONTEST_WINNER_MUSEUM_CUTE 11
+#define CONTEST_WINNER_MUSEUM_SMART 12
+#define CONTEST_WINNER_MUSEUM_TOUGH 13
+// NUM_CONTEST_WINNERS in constants/global.h
#define CANT_ENTER_CONTEST 0
#define CAN_ENTER_CONTEST_EQUAL_RANK 1
@@ -35,4 +45,165 @@
#define CANT_ENTER_CONTEST_EGG 3
#define CANT_ENTER_CONTEST_FAINTED 4
+#define CONTEST_AI_CHECK_BAD_MOVE (1 << 0)
+#define CONTEST_AI_CHECK_COMBO (1 << 1)
+#define CONTEST_AI_CHECK_BORING (1 << 2)
+#define CONTEST_AI_CHECK_EXCITEMENT (1 << 3)
+#define CONTEST_AI_CHECK_ORDER (1 << 4)
+#define CONTEST_AI_CHECK_GOOD_MOVE (1 << 5)
+#define CONTEST_AI_ERRATIC (1 << 6)
+#define CONTEST_AI_DUMMY_1 (1 << 7)
+#define CONTEST_AI_DUMMY_2 (1 << 8)
+#define CONTEST_AI_DUMMY_3 (1 << 9)
+#define CONTEST_AI_DUMMY_4 (1 << 10)
+#define CONTEST_AI_DUMMY_5 (1 << 11)
+#define CONTEST_AI_DUMMY_6 (1 << 12)
+#define CONTEST_AI_DUMMY_7 (1 << 13)
+#define CONTEST_AI_DUMMY_8 (1 << 14)
+#define CONTEST_AI_DUMMY_9 (1 << 15)
+#define CONTEST_AI_DUMMY_10 (1 << 16)
+#define CONTEST_AI_DUMMY_11 (1 << 17)
+#define CONTEST_AI_DUMMY_12 (1 << 18)
+#define CONTEST_AI_DUMMY_13 (1 << 19)
+#define CONTEST_AI_DUMMY_14 (1 << 20)
+#define CONTEST_AI_DUMMY_15 (1 << 21)
+#define CONTEST_AI_DUMMY_16 (1 << 22)
+#define CONTEST_AI_DUMMY_17 (1 << 23)
+#define CONTEST_AI_DUMMY_18 (1 << 24)
+#define CONTEST_AI_DUMMY_19 (1 << 25)
+#define CONTEST_AI_DUMMY_20 (1 << 26)
+#define CONTEST_AI_DUMMY_21 (1 << 27)
+#define CONTEST_AI_DUMMY_22 (1 << 28)
+#define CONTEST_AI_DUMMY_23 (1 << 29)
+#define CONTEST_AI_DUMMY_24 (1 << 30)
+#define CONTEST_AI_DUMMY_25 (1 << 31)
+
+// The below scripts are used by every AI contest opponent
+// It includes every non-dummy script
+#define CONTEST_AI_COMMON (CONTEST_AI_CHECK_BAD_MOVE | CONTEST_AI_CHECK_COMBO | CONTEST_AI_CHECK_BORING | \
+ CONTEST_AI_CHECK_EXCITEMENT | CONTEST_AI_CHECK_ORDER | CONTEST_AI_CHECK_GOOD_MOVE | CONTEST_AI_ERRATIC | \
+ CONTEST_AI_DUMMY_1 | CONTEST_AI_DUMMY_2 | CONTEST_AI_DUMMY_3 | CONTEST_AI_DUMMY_4 | CONTEST_AI_DUMMY_5)
+
+#define CONTEST_EFFECT_HIGHLY_APPEALING 0
+#define CONTEST_EFFECT_USER_MORE_EASILY_STARTLED 1
+#define CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES 2
+#define CONTEST_EFFECT_REPETITION_NOT_BORING 3
+#define CONTEST_EFFECT_AVOID_STARTLE_ONCE 4
+#define CONTEST_EFFECT_AVOID_STARTLE 5
+#define CONTEST_EFFECT_AVOID_STARTLE_SLIGHTLY 6
+#define CONTEST_EFFECT_USER_LESS_EASILY_STARTLED 7
+#define CONTEST_EFFECT_STARTLE_FRONT_MON 8
+#define CONTEST_EFFECT_SLIGHTLY_STARTLE_PREV_MONS 9
+#define CONTEST_EFFECT_STARTLE_PREV_MON 10
+#define CONTEST_EFFECT_STARTLE_PREV_MONS 11
+#define CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON 12
+#define CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS 13
+#define CONTEST_EFFECT_STARTLE_PREV_MON_2 14
+#define CONTEST_EFFECT_STARTLE_PREV_MONS_2 15
+#define CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION 16
+#define CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION 17
+#define CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN 18
+#define CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL 19
+#define CONTEST_EFFECT_STARTLE_MONS_COOL_APPEAL 20
+#define CONTEST_EFFECT_STARTLE_MONS_BEAUTY_APPEAL 21
+#define CONTEST_EFFECT_STARTLE_MONS_CUTE_APPEAL 22
+#define CONTEST_EFFECT_STARTLE_MONS_SMART_APPEAL 23
+#define CONTEST_EFFECT_STARTLE_MONS_TOUGH_APPEAL 24
+#define CONTEST_EFFECT_MAKE_FOLLOWING_MON_NERVOUS 25
+#define CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS 26
+#define CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS 27
+#define CONTEST_EFFECT_BADLY_STARTLES_MONS_IN_GOOD_CONDITION 28
+#define CONTEST_EFFECT_BETTER_IF_FIRST 29
+#define CONTEST_EFFECT_BETTER_IF_LAST 30
+#define CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES 31
+#define CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE 32
+#define CONTEST_EFFECT_BETTER_WHEN_LATER 33
+#define CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING 34
+#define CONTEST_EFFECT_BETTER_IF_SAME_TYPE 35
+#define CONTEST_EFFECT_BETTER_IF_DIFF_TYPE 36
+#define CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL 37
+#define CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS 38
+#define CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION 39
+#define CONTEST_EFFECT_NEXT_APPEAL_EARLIER 40
+#define CONTEST_EFFECT_NEXT_APPEAL_LATER 41
+#define CONTEST_EFFECT_MAKE_SCRAMBLING_TURN_ORDER_EASIER 42
+#define CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER 43
+#define CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST 44
+#define CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS 45
+#define CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED 46
+#define CONTEST_EFFECT_DONT_EXCITE_AUDIENCE 47
+
+// Each of the above effects is grouped into one of these effect type categories
+// Only a few of these get checked by the AI, the rest go unused
+#define CONTEST_EFFECT_TYPE_APPEAL 0
+#define CONTEST_EFFECT_TYPE_AVOID_STARTLE 1
+#define CONTEST_EFFECT_TYPE_STARTLE_MON 2
+#define CONTEST_EFFECT_TYPE_STARTLE_MONS 3
+#define CONTEST_EFFECT_TYPE_WORSEN 4
+#define CONTEST_EFFECT_TYPE_SPECIAL_APPEAL 5
+#define CONTEST_EFFECT_TYPE_TURN_ORDER 6
+
+#define COMBO_STARTER_RAIN_DANCE 1
+#define COMBO_STARTER_RAGE 2
+#define COMBO_STARTER_FOCUS_ENERGY 3
+#define COMBO_STARTER_HYPNOSIS 4
+#define COMBO_STARTER_ENDURE 5
+#define COMBO_STARTER_HORN_ATTACK 6
+#define COMBO_STARTER_SWORDS_DANCE 7
+#define COMBO_STARTER_STOCKPILE 8
+#define COMBO_STARTER_SUNNY_DAY 9
+#define COMBO_STARTER_REST 10
+#define COMBO_STARTER_VICE_GRIP 11
+#define COMBO_STARTER_DEFENSE_CURL 12
+#define COMBO_STARTER_CHARGE 13
+#define COMBO_STARTER_ROCK_THROW 14
+#define COMBO_STARTER_YAWN 15
+#define COMBO_STARTER_SCARY_FACE 16
+#define COMBO_STARTER_POWDER_SNOW 17
+#define COMBO_STARTER_LOCK_ON 18
+#define COMBO_STARTER_SOFT_BOILED 19
+#define COMBO_STARTER_MEAN_LOOK 20
+#define COMBO_STARTER_SCRATCH 21
+#define COMBO_STARTER_GROWTH 22
+#define COMBO_STARTER_HAIL 23
+#define COMBO_STARTER_SANDSTORM 24
+#define COMBO_STARTER_BELLY_DRUM 25
+#define COMBO_STARTER_MIND_READER 26
+#define COMBO_STARTER_DRAGON_BREATH 27
+#define COMBO_STARTER_DRAGON_RAGE 28
+#define COMBO_STARTER_DRAGON_DANCE 29
+#define COMBO_STARTER_SURF 30
+#define COMBO_STARTER_DIVE 31
+#define COMBO_STARTER_STRING_SHOT 32
+#define COMBO_STARTER_LEER 33
+#define COMBO_STARTER_TAUNT 34
+#define COMBO_STARTER_CHARM 35
+#define COMBO_STARTER_HARDEN 36
+#define COMBO_STARTER_SING 37
+#define COMBO_STARTER_EARTHQUAKE 38
+#define COMBO_STARTER_DOUBLE_TEAM 39
+#define COMBO_STARTER_CURSE 40
+#define COMBO_STARTER_SWEET_SCENT 41
+#define COMBO_STARTER_SLUDGE 42
+#define COMBO_STARTER_SLUDGE_BOMB 43
+#define COMBO_STARTER_THUNDER_PUNCH 44
+#define COMBO_STARTER_FIRE_PUNCH 45
+#define COMBO_STARTER_ICE_PUNCH 46
+#define COMBO_STARTER_PECK 47
+#define COMBO_STARTER_METAL_SOUND 48
+#define COMBO_STARTER_MUD_SPORT 49
+#define COMBO_STARTER_WATER_SPORT 50
+#define COMBO_STARTER_BONE_CLUB 51
+#define COMBO_STARTER_BONEMERANG 52
+#define COMBO_STARTER_BONE_RUSH 53
+#define COMBO_STARTER_SAND_ATTACK 54
+#define COMBO_STARTER_MUD_SLAP 55
+#define COMBO_STARTER_FAKE_OUT 56
+#define COMBO_STARTER_PSYCHIC 57
+#define COMBO_STARTER_KINESIS 58
+#define COMBO_STARTER_CONFUSION 59
+#define COMBO_STARTER_POUND 60
+#define COMBO_STARTER_SMOG 61
+#define COMBO_STARTER_CALM_MIND 62
+
#endif // GUARD_CONSTANTS_CONTEST_H
diff --git a/include/constants/daycare.h b/include/constants/daycare.h
index 103f920f2..adb62fab5 100644
--- a/include/constants/daycare.h
+++ b/include/constants/daycare.h
@@ -22,6 +22,6 @@
// Array buffers
#define EGG_MOVES_ARRAY_COUNT 10
-#define EGG_LVL_UP_MOVES_ARRAY_COUNT 50
+#define EGG_LVL_UP_MOVES_ARRAY_COUNT (MAX_LEVEL_UP_MOVES > 50 ? MAX_LEVEL_UP_MOVES : 50)
#endif //GUARD_DAYCARE_CONSTANTS_H
diff --git a/include/constants/field_effects.h b/include/constants/field_effects.h
index 00ca60457..dc1085f7c 100644
--- a/include/constants/field_effects.h
+++ b/include/constants/field_effects.h
@@ -20,10 +20,10 @@
#define FLDEFF_JUMP_SMALL_SPLASH 16
#define FLDEFF_LONG_GRASS 17
#define FLDEFF_JUMP_LONG_GRASS 18
-#define FLDEFF_UNKNOWN_19 19
-#define FLDEFF_UNKNOWN_20 20
-#define FLDEFF_UNKNOWN_21 21
-#define FLDEFF_UNKNOWN_22 22
+#define FLDEFF_UNUSED_GRASS 19
+#define FLDEFF_UNUSED_GRASS_2 20
+#define FLDEFF_UNUSED_SAND 21
+#define FLDEFF_WATER_SURFACING 22
#define FLDEFF_BERRY_TREE_GROWTH_SPARKLE 23
#define FLDEFF_DEEP_SAND_FOOTPRINTS 24
#define FLDEFF_POKECENTER_HEAL 25
@@ -50,8 +50,8 @@
#define FLDEFF_HEART_ICON 46
#define FLDEFF_NOP_47 47
#define FLDEFF_NOP_48 48
-#define FLDEFF_POP_OUT_OF_ASH 49
-#define FLDEFF_LAVARIDGE_GYM_WARP 50
+#define FLDEFF_ASH_PUFF 49
+#define FLDEFF_ASH_LAUNCH 50
#define FLDEFF_SWEET_SCENT 51
#define FLDEFF_SAND_PILLAR 52
#define FLDEFF_BUBBLES 53
@@ -65,8 +65,59 @@
#define FLDEFF_PCTURN_ON 61
#define FLDEFF_HALL_OF_FAME_RECORD 62
#define FLDEFF_USE_TELEPORT 63
-#define FLDEFF_RAYQUAZA 64
-#define FLDEFF_65 65
+#define FLDEFF_RAYQUAZA_SPOTLIGHT 64
+#define FLDEFF_DESTROY_DEOXYS_ROCK 65
#define FLDEFF_MOVE_DEOXYS_ROCK 66
-#endif
+#define FLDEFFOBJ_SHADOW_S 0
+#define FLDEFFOBJ_SHADOW_M 1
+#define FLDEFFOBJ_SHADOW_L 2
+#define FLDEFFOBJ_SHADOW_XL 3
+#define FLDEFFOBJ_TALL_GRASS 4
+#define FLDEFFOBJ_RIPPLE 5
+#define FLDEFFOBJ_ASH 6
+#define FLDEFFOBJ_SURF_BLOB 7
+#define FLDEFFOBJ_ARROW 8
+#define FLDEFFOBJ_GROUND_IMPACT_DUST 9
+#define FLDEFFOBJ_JUMP_TALL_GRASS 10
+#define FLDEFFOBJ_SAND_FOOTPRINTS 11
+#define FLDEFFOBJ_JUMP_BIG_SPLASH 12
+#define FLDEFFOBJ_SPLASH 13
+#define FLDEFFOBJ_JUMP_SMALL_SPLASH 14
+#define FLDEFFOBJ_LONG_GRASS 15
+#define FLDEFFOBJ_JUMP_LONG_GRASS 16
+#define FLDEFFOBJ_UNUSED_GRASS 17
+#define FLDEFFOBJ_UNUSED_GRASS_2 18
+#define FLDEFFOBJ_UNUSED_SAND 19
+#define FLDEFFOBJ_WATER_SURFACING 20
+#define FLDEFFOBJ_REFLECTION_DISTORTION 21
+#define FLDEFFOBJ_SPARKLE 22
+#define FLDEFFOBJ_DEEP_SAND_FOOTPRINTS 23
+#define FLDEFFOBJ_TREE_DISGUISE 24
+#define FLDEFFOBJ_MOUNTAIN_DISGUISE 25
+#define FLDEFFOBJ_BIRD 26
+#define FLDEFFOBJ_BIKE_TIRE_TRACKS 27
+#define FLDEFFOBJ_SAND_DISGUISE 28
+#define FLDEFFOBJ_SAND_PILE 29
+#define FLDEFFOBJ_SHORT_GRASS 30
+#define FLDEFFOBJ_HOT_SPRINGS_WATER 31
+#define FLDEFFOBJ_ASH_PUFF 32
+#define FLDEFFOBJ_ASH_LAUNCH 33
+#define FLDEFFOBJ_BUBBLES 34
+#define FLDEFFOBJ_SMALL_SPARKLE 35
+#define FLDEFFOBJ_RAYQUAZA 36
+
+#define FLDEFF_PAL_TAG_CUT_GRASS 0x1000
+#define FLDEFF_PAL_TAG_SECRET_POWER_TREE 0x1003
+#define FLDEFF_PAL_TAG_GENERAL_0 0x1004
+#define FLDEFF_PAL_TAG_GENERAL_1 0x1005
+#define FLDEFF_PAL_TAG_POKEBALL_GLOW 0x1007
+#define FLDEFF_PAL_TAG_SECRET_POWER_PLANT 0x1008
+#define FLDEFF_PAL_TAG_POKEBALL 0x1009
+#define FLDEFF_PAL_TAG_ASH 0x100D
+#define FLDEFF_PAL_TAG_SAND_PILLAR 0x100E
+#define FLDEFF_PAL_TAG_SMALL_SPARKLE 0x100F
+#define FLDEFF_PAL_TAG_HOF_MONITOR 0x1010
+#define FLDEFF_PAL_TAG_UNKNOWN 0x1011
+
+#endif // GUARD_FIELD_EFFECT_CONSTANTS_H
diff --git a/include/constants/field_specials.h b/include/constants/field_specials.h
index a2dc117e4..a01151378 100644
--- a/include/constants/field_specials.h
+++ b/include/constants/field_specials.h
@@ -75,4 +75,9 @@
#define FANCLUB_MEMBER7 14
#define FANCLUB_MEMBER8 15
+#define FANCOUNTER_DEFEATED_DRAKE 0
+#define FANCOUNTER_BATTLED_AT_BASE 1
+#define FANCOUNTER_FINISHED_CONTEST 2
+#define FANCOUNTER_USED_BATTLE_TOWER 3
+
#endif // GUARD_CONSTANTS_FIELD_SPECIALS_H
diff --git a/include/constants/flags.h b/include/constants/flags.h
index 4dd18880f..a562b0670 100644
--- a/include/constants/flags.h
+++ b/include/constants/flags.h
@@ -275,7 +275,7 @@
#define FLAG_RECEIVED_DURIN_BERRY 0xFB
#define FLAG_RECEIVED_BELUE_BERRY 0xFC
#define FLAG_ENABLE_RIVAL_MATCH_CALL 0xFD
-#define FLFLAG_RECEIVED_CHARCOAL 0xFE
+#define FLAG_RECEIVED_CHARCOAL 0xFE
#define FLAG_LATIOS_OR_LATIAS_ROAMING 0xFF
#define FLAG_RECEIVED_REPEAT_BALL 0x100
#define FLAG_RECEIVED_OLD_ROD 0x101
@@ -538,27 +538,27 @@
// Hidden Items -- sorted by location
#define FLAG_HIDDEN_ITEMS_START 0x1F4
#define FLAG_HIDDEN_ITEM_TRICK_HOUSE_NUGGET (FLAG_HIDDEN_ITEMS_START + 0x01)
-#define FLAG_HIDDEN_ITEM_UNDERWATER_1_CARBOS (FLAG_HIDDEN_ITEMS_START + 0x08)
-#define FLAG_HIDDEN_ITEM_UNDERWATER_1_GREEN_SHARD (FLAG_HIDDEN_ITEMS_START + 0x09)
-#define FLAG_HIDDEN_ITEM_UNDERWATER_1_PEARL (FLAG_HIDDEN_ITEMS_START + 0x0A)
-#define FLAG_HIDDEN_ITEM_UNDERWATER_1_BIG_PEARL (FLAG_HIDDEN_ITEMS_START + 0x0B)
-#define FLAG_HIDDEN_ITEM_UNDERWATER_1_HEART_SCALE_1 (FLAG_HIDDEN_ITEMS_START + 0x0D)
-#define FLAG_HIDDEN_ITEM_UNDERWATER_1_CALCIUM (FLAG_HIDDEN_ITEMS_START + 0x24)
-#define FLAG_HIDDEN_ITEM_UNDERWATER_1_HEART_SCALE_2 (FLAG_HIDDEN_ITEMS_START + 0x26)
-#define FLAG_HIDDEN_ITEM_UNDERWATER_2_HEART_SCALE (FLAG_HIDDEN_ITEMS_START + 0x0E)
-#define FLAG_HIDDEN_ITEM_UNDERWATER_2_ULTRA_BALL (FLAG_HIDDEN_ITEMS_START + 0x0F)
-#define FLAG_HIDDEN_ITEM_UNDERWATER_2_STARDUST (FLAG_HIDDEN_ITEMS_START + 0x10)
-#define FLAG_HIDDEN_ITEM_UNDERWATER_2_PEARL (FLAG_HIDDEN_ITEMS_START + 0x11)
-#define FLAG_HIDDEN_ITEM_UNDERWATER_2_IRON (FLAG_HIDDEN_ITEMS_START + 0x13)
-#define FLAG_HIDDEN_ITEM_UNDERWATER_2_YELLOW_SHARD (FLAG_HIDDEN_ITEMS_START + 0x12)
-#define FLAG_HIDDEN_ITEM_UNDERWATER_2_BIG_PEARL (FLAG_HIDDEN_ITEMS_START + 0x14)
-#define FLAG_HIDDEN_ITEM_UNDERWATER_2_BLUE_SHARD (FLAG_HIDDEN_ITEMS_START + 0x0C)
-#define FLAG_HIDDEN_ITEM_UNDERWATER_3_STAR_PIECE (FLAG_HIDDEN_ITEMS_START + 0x15)
-#define FLAG_HIDDEN_ITEM_UNDERWATER_3_HP_UP (FLAG_HIDDEN_ITEMS_START + 0x16)
-#define FLAG_HIDDEN_ITEM_UNDERWATER_3_HEART_SCALE (FLAG_HIDDEN_ITEMS_START + 0x17)
-#define FLAG_HIDDEN_ITEM_UNDERWATER_3_RED_SHARD (FLAG_HIDDEN_ITEMS_START + 0x18)
-#define FLAG_HIDDEN_ITEM_UNDERWATER_4_PROTEIN (FLAG_HIDDEN_ITEMS_START + 0x19)
-#define FLAG_HIDDEN_ITEM_UNDERWATER_4_PEARL (FLAG_HIDDEN_ITEMS_START + 0x1A)
+#define FLAG_HIDDEN_ITEM_UNDERWATER_124_CARBOS (FLAG_HIDDEN_ITEMS_START + 0x08)
+#define FLAG_HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD (FLAG_HIDDEN_ITEMS_START + 0x09)
+#define FLAG_HIDDEN_ITEM_UNDERWATER_124_PEARL (FLAG_HIDDEN_ITEMS_START + 0x0A)
+#define FLAG_HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL (FLAG_HIDDEN_ITEMS_START + 0x0B)
+#define FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1 (FLAG_HIDDEN_ITEMS_START + 0x0D)
+#define FLAG_HIDDEN_ITEM_UNDERWATER_124_CALCIUM (FLAG_HIDDEN_ITEMS_START + 0x24)
+#define FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2 (FLAG_HIDDEN_ITEMS_START + 0x26)
+#define FLAG_HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE (FLAG_HIDDEN_ITEMS_START + 0x0E)
+#define FLAG_HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL (FLAG_HIDDEN_ITEMS_START + 0x0F)
+#define FLAG_HIDDEN_ITEM_UNDERWATER_126_STARDUST (FLAG_HIDDEN_ITEMS_START + 0x10)
+#define FLAG_HIDDEN_ITEM_UNDERWATER_126_PEARL (FLAG_HIDDEN_ITEMS_START + 0x11)
+#define FLAG_HIDDEN_ITEM_UNDERWATER_126_IRON (FLAG_HIDDEN_ITEMS_START + 0x13)
+#define FLAG_HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD (FLAG_HIDDEN_ITEMS_START + 0x12)
+#define FLAG_HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL (FLAG_HIDDEN_ITEMS_START + 0x14)
+#define FLAG_HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD (FLAG_HIDDEN_ITEMS_START + 0x0C)
+#define FLAG_HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE (FLAG_HIDDEN_ITEMS_START + 0x15)
+#define FLAG_HIDDEN_ITEM_UNDERWATER_127_HP_UP (FLAG_HIDDEN_ITEMS_START + 0x16)
+#define FLAG_HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE (FLAG_HIDDEN_ITEMS_START + 0x17)
+#define FLAG_HIDDEN_ITEM_UNDERWATER_127_RED_SHARD (FLAG_HIDDEN_ITEMS_START + 0x18)
+#define FLAG_HIDDEN_ITEM_UNDERWATER_128_PROTEIN (FLAG_HIDDEN_ITEMS_START + 0x19)
+#define FLAG_HIDDEN_ITEM_UNDERWATER_128_PEARL (FLAG_HIDDEN_ITEMS_START + 0x1A)
#define FLAG_HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET (FLAG_HIDDEN_ITEMS_START + 0x1C)
#define FLAG_HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL (FLAG_HIDDEN_ITEMS_START + 0x00)
#define FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY (FLAG_HIDDEN_ITEMS_START + 0x1F)
@@ -768,7 +768,7 @@
#define FLAG_HIDE_PETALBURG_WOODS_AQUA_GRUNT 0x2D5
#define FLAG_HIDE_PETALBURG_CITY_WALLY 0x2D6
#define FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_INVISIBLE_NINJA_BOY 0x2D7
-#define FLAG_HIDE_PETALBURG_CITY_WALLYS_AUNT 0x2D8
+#define FLAG_HIDE_PETALBURG_CITY_WALLYS_MOM 0x2D8
#define FLAG_UNUSED_0x2D9 0x2D9 // Unused Flag
@@ -866,13 +866,13 @@
#define FLAG_HIDE_AQUA_HIDEOUT_1F_GRUNT_1_BLOCKING_ENTRANCE 0x335
#define FLAG_HIDE_AQUA_HIDEOUT_1F_GRUNT_2_BLOCKING_ENTRANCE 0x336
#define FLAG_HIDE_MOSSDEEP_CITY_TEAM_MAGMA 0x337
-#define FLAG_HIDE_PETALBURG_GYM_WALLYS_UNCLE 0x338
+#define FLAG_HIDE_PETALBURG_GYM_WALLYS_DAD 0x338
#define FLAG_HIDE_LEGEND_MON_CAVE_OF_ORIGIN 0x339 // Unused, leftover from R/S
#define FLAG_HIDE_SOOTOPOLIS_CITY_ARCHIE 0x33A
#define FLAG_HIDE_SOOTOPOLIS_CITY_MAXIE 0x33B
#define FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_ARCHIE 0x33C
#define FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_MAXIE 0x33D
-#define FLAG_HIDE_PETALBURG_CITY_WALLYS_UNCLE 0x33E
+#define FLAG_HIDE_PETALBURG_CITY_WALLYS_DAD 0x33E
#define FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_MAGMA_GRUNTS 0x33F
#define FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER 0x340
#define FLAG_HIDE_GRANITE_CAVE_STEVEN 0x341
@@ -961,10 +961,10 @@
#define FLAG_HIDE_MT_PYRE_SUMMIT_ARCHIE 0x394
#define FLAG_HIDE_MT_PYRE_SUMMIT_TEAM_AQUA 0x395
#define FLAG_HIDE_BATTLE_TOWER_REPORTER 0x396
-#define FLAG_HIDE_ROUTE_110_RIVAL_1 0x397
+#define FLAG_HIDE_ROUTE_110_RIVAL 0x397
#define FLAG_HIDE_CHAMPIONS_ROOM_RIVAL 0x398
#define FLAG_HIDE_CHAMPIONS_ROOM_BIRCH 0x399
-#define FLAG_HIDE_ROUTE_110_RIVAL_2 0x39A
+#define FLAG_HIDE_ROUTE_110_RIVAL_ON_BIKE 0x39A
#define FLAG_HIDE_ROUTE_119_RIVAL_ON_BIKE 0x39B
#define FLAG_HIDE_AQUA_HIDEOUT_GRUNTS 0x39C
#define FLAG_HIDE_LILCOVE_MOTEL_GAME_DESIGNERS 0x39D
@@ -1077,9 +1077,7 @@
#define FLAG_ITEM_ROUTE_120_NUGGET 0x406
#define FLAG_ITEM_ROUTE_120_FULL_HEAL 0x407
#define FLAG_ITEM_ROUTE_123_CALCIUM 0x408
-
-#define FLAG_UNUSED_0x409 0x409 // Unused Flag
-
+#define FLAG_ITEM_ROUTE_123_RARE_CANDY 0x409 // Unused Flag, leftover from R/S. In Emerald this is a hidden item and uses a different flag
#define FLAG_ITEM_ROUTE_127_ZINC 0x40A
#define FLAG_ITEM_ROUTE_127_CARBOS 0x40B
#define FLAG_ITEM_ROUTE_132_RARE_CANDY 0x40C
@@ -1171,37 +1169,27 @@
#define FLAG_ITEM_NEW_MAUVILLE_FULL_HEAL 0x462
#define FLAG_ITEM_NEW_MAUVILLE_PARALYZE_HEAL 0x463
#define FLAG_ITEM_AQUA_HIDEOUT_B1F_MASTER_BALL 0x464
-
-#define FLAG_UNUSED_0x465 0x465 // Unused Flag
-#define FLAG_UNUSED_0x466 0x466 // Unused Flag
-#define FLAG_UNUSED_0x467 0x467 // Unused Flag
+#define FLAG_ITEM_OLD_MAGMA_HIDEOUT_B1F_MASTER_BALL 0x465 // Unused Flag, leftover from the Ruby Magma hideout
+#define FLAG_ITEM_OLD_MAGMA_HIDEOUT_B1F_MAX_ELIXIR 0x466 // Unused Flag, leftover from the Ruby Magma hideout
+#define FLAG_ITEM_OLD_MAGMA_HIDEOUT_B2F_NEST_BALL 0x467 // Unused Flag, leftover from the Ruby Magma hideout
#define FLAG_UNUSED_0x468 0x468 // Unused Flag
-
#define FLAG_ITEM_MT_PYRE_2F_ULTRA_BALL 0x469
#define FLAG_ITEM_MT_PYRE_4F_SEA_INCENSE 0x46A
#define FLAG_ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE 0x46B
#define FLAG_ITEM_AQUA_HIDEOUT_B1F_NUGGET 0x46C
-
-#define FLAG_UNUSED_0x46D 0x46D // Unused Flag
-
+#define FLAG_ITEM_MOSSDEEP_STEVENS_HOUSE_HM08 0x46D // Unused Flag, leftover from R/S. HM08 is given to the player directly in Emerald
#define FLAG_ITEM_ROUTE_119_NUGGET 0x46E
#define FLAG_ITEM_ROUTE_104_POTION 0x46F
-
#define FLAG_UNUSED_0x470 0x470 // Unused Flag
-
#define FLAG_ITEM_ROUTE_103_PP_UP 0x471
-
#define FLAG_UNUSED_0x472 0x472 // Unused Flag
-
#define FLAG_ITEM_ROUTE_108_STAR_PIECE 0x473
#define FLAG_ITEM_ROUTE_109_POTION 0x474
#define FLAG_ITEM_ROUTE_110_ELIXIR 0x475
#define FLAG_ITEM_ROUTE_111_ELIXIR 0x476
#define FLAG_ITEM_ROUTE_113_HYPER_POTION 0x477
#define FLAG_ITEM_ROUTE_115_HEAL_POWDER 0x478
-
#define FLAG_UNUSED_0x479 0x479 // Unused Flag
-
#define FLAG_ITEM_ROUTE_116_POTION 0x47A
#define FLAG_ITEM_ROUTE_119_ELIXIR_2 0x47B
#define FLAG_ITEM_ROUTE_120_REVIVE 0x47C
@@ -1356,7 +1344,7 @@
#define FLAG_SYS_POKEMON_GET (SYSTEM_FLAGS + 0x0) // FLAG_0x860
#define FLAG_SYS_POKEDEX_GET (SYSTEM_FLAGS + 0x1)
#define FLAG_SYS_POKENAV_GET (SYSTEM_FLAGS + 0x2)
-#define FLAG_UNUSED_0x863 (SYSTEM_FLAGS + 0x3)
+#define FLAG_UNUSED_0x863 (SYSTEM_FLAGS + 0x3) // Unused Flag
#define FLAG_SYS_GAME_CLEAR (SYSTEM_FLAGS + 0x4)
#define FLAG_SYS_CHAT_USED (SYSTEM_FLAGS + 0x5)
#define FLAG_SYS_HIPSTER_MEET (SYSTEM_FLAGS + 0x6)
@@ -1373,7 +1361,7 @@
#define NUM_BADGES (1 + FLAG_BADGE08_GET - FLAG_BADGE01_GET)
// Towns and Cities
-#define FLAG_VISITED_LITTLEROOT_TOWN (SYSTEM_FLAGS + 0xF)
+#define FLAG_VISITED_LITTLEROOT_TOWN (SYSTEM_FLAGS + 0xF)
#define FLAG_VISITED_OLDALE_TOWN (SYSTEM_FLAGS + 0x10)
#define FLAG_VISITED_DEWFORD_TOWN (SYSTEM_FLAGS + 0x11)
#define FLAG_VISITED_LAVARIDGE_TOWN (SYSTEM_FLAGS + 0x12)
@@ -1418,9 +1406,9 @@
#define FLAG_SYS_MIX_RECORD (SYSTEM_FLAGS + 0x34)
#define FLAG_SYS_CLOCK_SET (SYSTEM_FLAGS + 0x35)
#define FLAG_SYS_NATIONAL_DEX (SYSTEM_FLAGS + 0x36)
-#define FLAG_SYS_UNUSED_CAVE_SHIP (SYSTEM_FLAGS + 0x37) // Unused Flag?
-#define FLAG_SYS_UNUSED_CAVE_WONDER (SYSTEM_FLAGS + 0x38) // Unused Flag?
-#define FLAG_SYS_UNUSED_CAVE_BATTLE (SYSTEM_FLAGS + 0x39) // Unused Flag?
+#define FLAG_SYS_CAVE_SHIP (SYSTEM_FLAGS + 0x37) // Unused Flag, leftover from R/S debug, presumably used by Emerald's debug too
+#define FLAG_SYS_CAVE_WONDER (SYSTEM_FLAGS + 0x38) // Unused Flag, same as above
+#define FLAG_SYS_CAVE_BATTLE (SYSTEM_FLAGS + 0x39) // Unused Flag, same as above
#define FLAG_SYS_SHOAL_TIDE (SYSTEM_FLAGS + 0x3A)
#define FLAG_SYS_RIBBON_GET (SYSTEM_FLAGS + 0x3B)
@@ -1573,7 +1561,9 @@
#define FLAG_UNUSED_0x91F (SYSTEM_FLAGS + 0xBF) // Unused Flag
// Daily Flags
-#define DAILY_FLAGS_START 0x920
+// These flags are cleared once per day
+// The start and end are byte-aligned because the flags are cleared in byte increments
+#define DAILY_FLAGS_START (FLAG_UNUSED_0x91F + (8 - FLAG_UNUSED_0x91F % 8))
#define FLAG_UNUSED_0x920 (DAILY_FLAGS_START + 0x0) // Unused Flag
#define FLAG_DAILY_CONTEST_LOBBY_RECEIVED_BERRY (DAILY_FLAGS_START + 0x1)
#define FLAG_DAILY_SECRET_BASE (DAILY_FLAGS_START + 0x2)
@@ -1639,7 +1629,9 @@
#define FLAG_UNUSED_0x95D (DAILY_FLAGS_START + 0x3D) // Unused Flag
#define FLAG_UNUSED_0x95E (DAILY_FLAGS_START + 0x3E) // Unused Flag
#define FLAG_UNUSED_0x95F (DAILY_FLAGS_START + 0x3F) // Unused Flag
-#define DAILY_FLAGS_END FLAG_UNUSED_0x95F
+#define DAILY_FLAGS_END (FLAG_UNUSED_0x95F + (7 - FLAG_UNUSED_0x95F % 8))
+
+#define FLAGS_COUNT (DAILY_FLAGS_END + 1)
// Special Flags (Stored in EWRAM (gSpecialFlags), not in the SaveBlock)
#define SPECIAL_FLAGS_START 0x4000
diff --git a/include/constants/global.h b/include/constants/global.h
index c7063d71c..55830ae8b 100644
--- a/include/constants/global.h
+++ b/include/constants/global.h
@@ -34,8 +34,6 @@
#define POKEBLOCKS_COUNT 40
#define OBJECT_EVENTS_COUNT 16
#define BERRY_TREES_COUNT 128
-#define FLAGS_COUNT 300
-#define VARS_COUNT 256
#define MAIL_COUNT 16
#define SECRET_BASES_COUNT 20
#define TV_SHOWS_COUNT 25
@@ -52,6 +50,8 @@
#define APPRENTICE_COUNT 4
#define APPRENTICE_MAX_QUESTIONS 9
#define MAX_REMATCH_ENTRIES 100 // only REMATCH_TABLE_ENTRIES (78) are used
+#define NUM_CONTEST_WINNERS 13
+#define UNION_ROOM_KB_ROW_COUNT 10
#define PYRAMID_BAG_ITEMS_COUNT 10
#define HALL_FACILITIES_COUNT 9 // 7 facilities for single mode + tower double mode + tower multi mode.
@@ -60,6 +60,14 @@
#define MAX_MON_MOVES 4
#define NUM_STATS 6
+#define CONTESTANT_COUNT 4
+#define CONTEST_CATEGORY_COOL 0
+#define CONTEST_CATEGORY_BEAUTY 1
+#define CONTEST_CATEGORY_CUTE 2
+#define CONTEST_CATEGORY_SMART 3
+#define CONTEST_CATEGORY_TOUGH 4
+#define CONTEST_CATEGORIES_COUNT 5
+
// party sizes
#define PARTY_SIZE 6
#define MULTI_PARTY_SIZE PARTY_SIZE / 2
diff --git a/include/constants/item.h b/include/constants/item.h
index a5c34418d..3277f2379 100644
--- a/include/constants/item.h
+++ b/include/constants/item.h
@@ -16,5 +16,9 @@
#define KEYITEMS_POCKET 4
#define POCKETS_COUNT 5
+// The TM/HM pocket is the largest pocket, so the maximum amount of items
+// in a pocket is its count + 1 for the cancel option
+#define MAX_POCKET_ITEMS (BAG_TMHM_COUNT + 1)
+
#endif // GUARD_ITEM_CONSTANTS_H
diff --git a/include/constants/items.h b/include/constants/items.h
index fafcac8b1..9496a4c61 100644
--- a/include/constants/items.h
+++ b/include/constants/items.h
@@ -17,6 +17,8 @@
#define ITEM_LUXURY_BALL 11
#define ITEM_PREMIER_BALL 12
+#define LAST_BALL ITEM_PREMIER_BALL
+
// Pokemon Items
#define ITEM_POTION 13
#define ITEM_ANTIDOTE 14
@@ -495,6 +497,11 @@
#define MAX_PC_ITEM_CAPACITY 999
#define MAX_BERRY_CAPACITY 999
+// Secondary IDs for rods
+#define OLD_ROD 0
+#define GOOD_ROD 1
+#define SUPER_ROD 2
+
// Check if the item is one that can be used on a Pokemon.
#define ITEM_HAS_EFFECT(item) ((item) >= ITEM_POTION && (item) <= ITEM_0B2)
diff --git a/include/constants/layouts.h b/include/constants/layouts.h
index 3e876f499..9d5e877b0 100755
--- a/include/constants/layouts.h
+++ b/include/constants/layouts.h
@@ -1,6 +1,10 @@
#ifndef GUARD_CONSTANTS_LAYOUTS_H
#define GUARD_CONSTANTS_LAYOUTS_H
+//
+// DO NOT MODIFY THIS FILE! It is auto-generated from data/layouts/layouts.json
+//
+
#define LAYOUT_PETALBURG_CITY 1
#define LAYOUT_SLATEPORT_CITY 2
#define LAYOUT_MAUVILLE_CITY 3
@@ -51,9 +55,9 @@
#define LAYOUT_ROUTE132 48
#define LAYOUT_ROUTE133 49
#define LAYOUT_ROUTE134 50
-#define LAYOUT_UNDERWATER2 51
-#define LAYOUT_UNDERWATER3 52
-#define LAYOUT_UNDERWATER4 53
+#define LAYOUT_UNDERWATER_ROUTE126 51
+#define LAYOUT_UNDERWATER_ROUTE127 52
+#define LAYOUT_UNDERWATER_ROUTE128 53
#define LAYOUT_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F 54
#define LAYOUT_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F 55
#define LAYOUT_LITTLEROOT_TOWN_MAYS_HOUSE_1F 56
@@ -274,7 +278,7 @@
#define LAYOUT_ROUTE119_WEATHER_INSTITUTE_1F 271
#define LAYOUT_ROUTE119_WEATHER_INSTITUTE_2F 272
#define LAYOUT_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR 273
-#define LAYOUT_UNDERWATER1 274
+#define LAYOUT_UNDERWATER_ROUTE124 274
#define LAYOUT_MOSSDEEP_CITY_SPACE_CENTER_1F 275
#define LAYOUT_MOSSDEEP_CITY_SPACE_CENTER_2F 276
#define LAYOUT_SS_TIDAL_CORRIDOR 277
@@ -410,9 +414,9 @@
#define LAYOUT_MARINE_CAVE_ENTRANCE 407
#define LAYOUT_TERRA_CAVE_ENTRANCE 408
#define LAYOUT_TERRA_CAVE_END 409
-#define LAYOUT_UNDERWATER6 410
-#define LAYOUT_UNDERWATER7 411
-#define LAYOUT_UNDERWATER5 412
+#define LAYOUT_UNDERWATER_ROUTE105 410
+#define LAYOUT_UNDERWATER_ROUTE125 411
+#define LAYOUT_UNDERWATER_ROUTE129 412
#define LAYOUT_MARINE_CAVE_END 413
#define LAYOUT_TRAINER_HILL_ENTRANCE 414
#define LAYOUT_TRAINER_HILL_1F 415
diff --git a/include/constants/map_groups.h b/include/constants/map_groups.h
index 17fe7ab53..69355635b 100755
--- a/include/constants/map_groups.h
+++ b/include/constants/map_groups.h
@@ -1,64 +1,68 @@
#ifndef GUARD_CONSTANTS_MAP_GROUPS_H
#define GUARD_CONSTANTS_MAP_GROUPS_H
+//
+// DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/map_groups.json
+//
+
// Map Group 0
-#define MAP_PETALBURG_CITY (0 | (0 << 8))
-#define MAP_SLATEPORT_CITY (1 | (0 << 8))
-#define MAP_MAUVILLE_CITY (2 | (0 << 8))
-#define MAP_RUSTBORO_CITY (3 | (0 << 8))
-#define MAP_FORTREE_CITY (4 | (0 << 8))
-#define MAP_LILYCOVE_CITY (5 | (0 << 8))
-#define MAP_MOSSDEEP_CITY (6 | (0 << 8))
-#define MAP_SOOTOPOLIS_CITY (7 | (0 << 8))
-#define MAP_EVER_GRANDE_CITY (8 | (0 << 8))
-#define MAP_LITTLEROOT_TOWN (9 | (0 << 8))
-#define MAP_OLDALE_TOWN (10 | (0 << 8))
-#define MAP_DEWFORD_TOWN (11 | (0 << 8))
-#define MAP_LAVARIDGE_TOWN (12 | (0 << 8))
-#define MAP_FALLARBOR_TOWN (13 | (0 << 8))
-#define MAP_VERDANTURF_TOWN (14 | (0 << 8))
-#define MAP_PACIFIDLOG_TOWN (15 | (0 << 8))
-#define MAP_ROUTE101 (16 | (0 << 8))
-#define MAP_ROUTE102 (17 | (0 << 8))
-#define MAP_ROUTE103 (18 | (0 << 8))
-#define MAP_ROUTE104 (19 | (0 << 8))
-#define MAP_ROUTE105 (20 | (0 << 8))
-#define MAP_ROUTE106 (21 | (0 << 8))
-#define MAP_ROUTE107 (22 | (0 << 8))
-#define MAP_ROUTE108 (23 | (0 << 8))
-#define MAP_ROUTE109 (24 | (0 << 8))
-#define MAP_ROUTE110 (25 | (0 << 8))
-#define MAP_ROUTE111 (26 | (0 << 8))
-#define MAP_ROUTE112 (27 | (0 << 8))
-#define MAP_ROUTE113 (28 | (0 << 8))
-#define MAP_ROUTE114 (29 | (0 << 8))
-#define MAP_ROUTE115 (30 | (0 << 8))
-#define MAP_ROUTE116 (31 | (0 << 8))
-#define MAP_ROUTE117 (32 | (0 << 8))
-#define MAP_ROUTE118 (33 | (0 << 8))
-#define MAP_ROUTE119 (34 | (0 << 8))
-#define MAP_ROUTE120 (35 | (0 << 8))
-#define MAP_ROUTE121 (36 | (0 << 8))
-#define MAP_ROUTE122 (37 | (0 << 8))
-#define MAP_ROUTE123 (38 | (0 << 8))
-#define MAP_ROUTE124 (39 | (0 << 8))
-#define MAP_ROUTE125 (40 | (0 << 8))
-#define MAP_ROUTE126 (41 | (0 << 8))
-#define MAP_ROUTE127 (42 | (0 << 8))
-#define MAP_ROUTE128 (43 | (0 << 8))
-#define MAP_ROUTE129 (44 | (0 << 8))
-#define MAP_ROUTE130 (45 | (0 << 8))
-#define MAP_ROUTE131 (46 | (0 << 8))
-#define MAP_ROUTE132 (47 | (0 << 8))
-#define MAP_ROUTE133 (48 | (0 << 8))
-#define MAP_ROUTE134 (49 | (0 << 8))
-#define MAP_UNDERWATER1 (50 | (0 << 8))
-#define MAP_UNDERWATER2 (51 | (0 << 8))
-#define MAP_UNDERWATER3 (52 | (0 << 8))
-#define MAP_UNDERWATER4 (53 | (0 << 8))
-#define MAP_UNDERWATER5 (54 | (0 << 8))
-#define MAP_UNDERWATER6 (55 | (0 << 8))
-#define MAP_UNDERWATER7 (56 | (0 << 8))
+#define MAP_PETALBURG_CITY (0 | (0 << 8))
+#define MAP_SLATEPORT_CITY (1 | (0 << 8))
+#define MAP_MAUVILLE_CITY (2 | (0 << 8))
+#define MAP_RUSTBORO_CITY (3 | (0 << 8))
+#define MAP_FORTREE_CITY (4 | (0 << 8))
+#define MAP_LILYCOVE_CITY (5 | (0 << 8))
+#define MAP_MOSSDEEP_CITY (6 | (0 << 8))
+#define MAP_SOOTOPOLIS_CITY (7 | (0 << 8))
+#define MAP_EVER_GRANDE_CITY (8 | (0 << 8))
+#define MAP_LITTLEROOT_TOWN (9 | (0 << 8))
+#define MAP_OLDALE_TOWN (10 | (0 << 8))
+#define MAP_DEWFORD_TOWN (11 | (0 << 8))
+#define MAP_LAVARIDGE_TOWN (12 | (0 << 8))
+#define MAP_FALLARBOR_TOWN (13 | (0 << 8))
+#define MAP_VERDANTURF_TOWN (14 | (0 << 8))
+#define MAP_PACIFIDLOG_TOWN (15 | (0 << 8))
+#define MAP_ROUTE101 (16 | (0 << 8))
+#define MAP_ROUTE102 (17 | (0 << 8))
+#define MAP_ROUTE103 (18 | (0 << 8))
+#define MAP_ROUTE104 (19 | (0 << 8))
+#define MAP_ROUTE105 (20 | (0 << 8))
+#define MAP_ROUTE106 (21 | (0 << 8))
+#define MAP_ROUTE107 (22 | (0 << 8))
+#define MAP_ROUTE108 (23 | (0 << 8))
+#define MAP_ROUTE109 (24 | (0 << 8))
+#define MAP_ROUTE110 (25 | (0 << 8))
+#define MAP_ROUTE111 (26 | (0 << 8))
+#define MAP_ROUTE112 (27 | (0 << 8))
+#define MAP_ROUTE113 (28 | (0 << 8))
+#define MAP_ROUTE114 (29 | (0 << 8))
+#define MAP_ROUTE115 (30 | (0 << 8))
+#define MAP_ROUTE116 (31 | (0 << 8))
+#define MAP_ROUTE117 (32 | (0 << 8))
+#define MAP_ROUTE118 (33 | (0 << 8))
+#define MAP_ROUTE119 (34 | (0 << 8))
+#define MAP_ROUTE120 (35 | (0 << 8))
+#define MAP_ROUTE121 (36 | (0 << 8))
+#define MAP_ROUTE122 (37 | (0 << 8))
+#define MAP_ROUTE123 (38 | (0 << 8))
+#define MAP_ROUTE124 (39 | (0 << 8))
+#define MAP_ROUTE125 (40 | (0 << 8))
+#define MAP_ROUTE126 (41 | (0 << 8))
+#define MAP_ROUTE127 (42 | (0 << 8))
+#define MAP_ROUTE128 (43 | (0 << 8))
+#define MAP_ROUTE129 (44 | (0 << 8))
+#define MAP_ROUTE130 (45 | (0 << 8))
+#define MAP_ROUTE131 (46 | (0 << 8))
+#define MAP_ROUTE132 (47 | (0 << 8))
+#define MAP_ROUTE133 (48 | (0 << 8))
+#define MAP_ROUTE134 (49 | (0 << 8))
+#define MAP_UNDERWATER_ROUTE124 (50 | (0 << 8))
+#define MAP_UNDERWATER_ROUTE126 (51 | (0 << 8))
+#define MAP_UNDERWATER_ROUTE127 (52 | (0 << 8))
+#define MAP_UNDERWATER_ROUTE128 (53 | (0 << 8))
+#define MAP_UNDERWATER_ROUTE129 (54 | (0 << 8))
+#define MAP_UNDERWATER_ROUTE105 (55 | (0 << 8))
+#define MAP_UNDERWATER_ROUTE125 (56 | (0 << 8))
// Map Group 1
#define MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F (0 | (1 << 8))
diff --git a/include/constants/map_scripts.h b/include/constants/map_scripts.h
index 26de3ebc6..68d360955 100644
--- a/include/constants/map_scripts.h
+++ b/include/constants/map_scripts.h
@@ -1,6 +1,41 @@
#ifndef GUARD_CONSTANTS_MAP_SCRIPTS_H
#define GUARD_CONSTANTS_MAP_SCRIPTS_H
+/*
+ IDs for special scripts that can be run for a particular map.
+ For the functions that handle when they are run, see these constants' uses in src/script.c
+
+ Below describes when a script of this kind will be called, and what it typically does.
+ They are numbered in the order that they will be called when entering a map (from a warp or camera transition).
+ NOTE: These descriptions are just of what they generally do, not what they always or have to do
+
+ 3. ON_LOAD: Run after the layout is loaded (but not drawn yet).
+ Almost exclusively used to set metatiles on the map before it's first drawn
+
+ 6. ON_FRAME_TABLE: Run every frame after the map has faded in, before player input is processed.
+ This is a table of scripts that each run if their condition is satisfied.
+ Used to trigger an event, such as the player exiting the cable car or the SS Tidal sailor announcing progress
+
+ 2. ON_TRANSITION: Run during the transition to the map
+ Used to set map-specific flags/vars, update object positions/movement types, set weather, etc
+
+ 5. ON_WARP_INTO_MAP_TABLE: Run after the map's objects are loaded.
+ This is a table of scripts that each run if their condition is satisfied.
+ Used to add objects to the scene or update something about the player as they warp in (e.g. their facing dir or visibility)
+ Note that ON_TRANSITION may also handle object visibility, but would do so by modifying a flag or var
+
+ 4. ON_RESUME: Run at the end of map load, and again any time upon returning to field (e.g. exiting the Bag menu, or finishing a battle)
+ Used to hide defeated static pokemon, or maintain some map state (e.g. the Trainer Hill timer, or the cycling road challenge)
+ In some maps this takes the metatile setting job of ON_LOAD
+
+ 1. ON_DIVE_WARP: Run after the player chooses to dive/emerge.
+ Only used once, to determine whether or not the player should emerge in the Sealed Chamber
+
+ x. ON_RETURN_TO_FIELD: Run exlusively upon returning to the field, shortly after ON_RESUME (as opposed to ON_RESUME, which also runs once on entering the map)
+ Used rarely, when something must only happen on reload (e.g. making sure Mew is above the grass after battling it on Faraway Island)
+
+*/
+
#define MAP_SCRIPT_ON_LOAD 1
#define MAP_SCRIPT_ON_FRAME_TABLE 2
#define MAP_SCRIPT_ON_TRANSITION 3
diff --git a/include/constants/metatile_labels.h b/include/constants/metatile_labels.h
index 586107687..f7405f46a 100644
--- a/include/constants/metatile_labels.h
+++ b/include/constants/metatile_labels.h
@@ -289,31 +289,31 @@
#define METATILE_EverGrande_Door_PokemonLeague 0x21D
// gTileset_PokemonCenter
-#define METATILE_PokemonCenter_Elevator1F_Tile0_Frame0 0x280
-#define METATILE_PokemonCenter_Elevator1F_Tile0_Frame1 0x282
-#define METATILE_PokemonCenter_Elevator1F_Tile0_Frame2 0x284
-#define METATILE_PokemonCenter_Elevator1F_Tile1_Frame0 0x281
-#define METATILE_PokemonCenter_Elevator1F_Tile1_Frame1 0x283
-#define METATILE_PokemonCenter_Elevator1F_Tile1_Frame2 0x285
-#define METATILE_PokemonCenter_Elevator1F_Tile2_Frame0 0x288
-#define METATILE_PokemonCenter_Elevator1F_Tile2_Frame1 0x28A
-#define METATILE_PokemonCenter_Elevator1F_Tile2_Frame2 0x28C
-#define METATILE_PokemonCenter_Elevator1F_Tile3_Frame0 0x289
-#define METATILE_PokemonCenter_Elevator1F_Tile3_Frame1 0x28B
-#define METATILE_PokemonCenter_Elevator1F_Tile3_Frame2 0x28D
-#define METATILE_PokemonCenter_Elevator2F_Tile0_Frame0 0x2A0
-#define METATILE_PokemonCenter_Elevator2F_Tile0_Frame1 0x2A2
-#define METATILE_PokemonCenter_Elevator2F_Tile0_Frame2 0x2A4
-#define METATILE_PokemonCenter_Elevator2F_Tile1_Frame0 0x2A1
-#define METATILE_PokemonCenter_Elevator2F_Tile1_Frame1 0x2A3
-#define METATILE_PokemonCenter_Elevator2F_Tile1_Frame2 0x2A5
-#define METATILE_PokemonCenter_Elevator2F_Tile2_Frame0 0x2A8
-#define METATILE_PokemonCenter_Elevator2F_Tile2_Frame1 0x2AA
-#define METATILE_PokemonCenter_Elevator2F_Tile2_Frame2 0x2AC
-#define METATILE_PokemonCenter_Floor_ShadowTop_Alt 0x2DC
-#define METATILE_PokemonCenter_Floor_Plain_Alt 0x2E4
-#define METATILE_PokemonCenter_Floor_ShadowTop 0x21E
-#define METATILE_PokemonCenter_CounterBarrier 0x25D
+#define METATILE_PokemonCenter_Escalator1F_Tile0_Frame0 0x280
+#define METATILE_PokemonCenter_Escalator1F_Tile0_Frame1 0x282
+#define METATILE_PokemonCenter_Escalator1F_Tile0_Frame2 0x284
+#define METATILE_PokemonCenter_Escalator1F_Tile1_Frame0 0x281
+#define METATILE_PokemonCenter_Escalator1F_Tile1_Frame1 0x283
+#define METATILE_PokemonCenter_Escalator1F_Tile1_Frame2 0x285
+#define METATILE_PokemonCenter_Escalator1F_Tile2_Frame0 0x288
+#define METATILE_PokemonCenter_Escalator1F_Tile2_Frame1 0x28A
+#define METATILE_PokemonCenter_Escalator1F_Tile2_Frame2 0x28C
+#define METATILE_PokemonCenter_Escalator1F_Tile3_Frame0 0x289
+#define METATILE_PokemonCenter_Escalator1F_Tile3_Frame1 0x28B
+#define METATILE_PokemonCenter_Escalator1F_Tile3_Frame2 0x28D
+#define METATILE_PokemonCenter_Escalator2F_Tile0_Frame0 0x2A0
+#define METATILE_PokemonCenter_Escalator2F_Tile0_Frame1 0x2A2
+#define METATILE_PokemonCenter_Escalator2F_Tile0_Frame2 0x2A4
+#define METATILE_PokemonCenter_Escalator2F_Tile1_Frame0 0x2A1
+#define METATILE_PokemonCenter_Escalator2F_Tile1_Frame1 0x2A3
+#define METATILE_PokemonCenter_Escalator2F_Tile1_Frame2 0x2A5
+#define METATILE_PokemonCenter_Escalator2F_Tile2_Frame0 0x2A8
+#define METATILE_PokemonCenter_Escalator2F_Tile2_Frame1 0x2AA
+#define METATILE_PokemonCenter_Escalator2F_Tile2_Frame2 0x2AC
+#define METATILE_PokemonCenter_Floor_ShadowTop_Alt 0x2DC
+#define METATILE_PokemonCenter_Floor_Plain_Alt 0x2E4
+#define METATILE_PokemonCenter_Floor_ShadowTop 0x21E
+#define METATILE_PokemonCenter_CounterBarrier 0x25D
// gTileset_InsideOfTruck
#define METATILE_InsideOfTruck_ExitLight_Top 0x208
diff --git a/include/constants/opponents.h b/include/constants/opponents.h
index cd35cf6b7..c9cf9239d 100644
--- a/include/constants/opponents.h
+++ b/include/constants/opponents.h
@@ -859,6 +859,7 @@
// NOTE: Because each Trainer uses a flag to determine when they are defeated, there is only space for 9 additional trainers before trainer flag space overflows
// More space can be made by shifting flags around in constants/flags.h or changing how trainer flags are handled
+// MAX_TRAINERS_COUNT can be increased but will take up additional saveblock space
#define TRAINERS_COUNT 855
#define MAX_TRAINERS_COUNT 864
diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h
index b5c60f64d..52eabe71b 100644
--- a/include/constants/pokemon.h
+++ b/include/constants/pokemon.h
@@ -69,6 +69,7 @@
#define NATURE_SASSY 22
#define NATURE_CAREFUL 23
#define NATURE_QUIRKY 24
+#define NUM_NATURES 25
// Pokemon Stats
#define STAT_HP 0
@@ -80,9 +81,13 @@
#define STAT_ACC 6 // Only in battles.
#define STAT_EVASION 7 // Only in battles.
-#define NUM_EV_STATS NUM_STATS - 1 // excludes HP
+#define NUM_NATURE_STATS NUM_STATS - 1 // excludes HP
#define NUM_BATTLE_STATS NUM_STATS + 2 // includes Accuracy and Evasion
+#define MIN_STAT_STAGE 0
+#define DEFAULT_STAT_STAGE 6
+#define MAX_STAT_STAGE 12
+
// Shiny odds
#define SHINY_ODDS 8 // Actual probability is SHINY_ODDS/65536
@@ -199,6 +204,8 @@
#define LEVEL_UP_MOVE_LV 0xFE00
#define LEVEL_UP_END 0xFFFF
+#define MAX_LEVEL_UP_MOVES 20
+
#define MON_MALE 0x00
#define MON_FEMALE 0xFE
#define MON_GENDERLESS 0xFF
@@ -225,6 +232,7 @@
#define STATUS_PRIMARY_POKERUS 6
#define STATUS_PRIMARY_FAINTED 7
+#define MAX_PER_STAT_EVS 255
#define MAX_TOTAL_EVS 510
#define EV_ITEM_RAISE_LIMIT 100
diff --git a/include/constants/region_map_sections.h b/include/constants/region_map_sections.h
index 5e64048dd..65aa3e1ca 100644
--- a/include/constants/region_map_sections.h
+++ b/include/constants/region_map_sections.h
@@ -52,9 +52,9 @@
#define MAPSEC_ROUTE_133 0x30
#define MAPSEC_ROUTE_134 0x31
#define MAPSEC_UNDERWATER_124 0x32
-#define MAPSEC_UNDERWATER_125 0x33
-#define MAPSEC_UNDERWATER_126 0x34
-#define MAPSEC_UNDERWATER_127 0x35
+#define MAPSEC_UNDERWATER_126 0x33
+#define MAPSEC_UNDERWATER_127 0x34
+#define MAPSEC_UNDERWATER_128 0x35
#define MAPSEC_UNDERWATER_SOOTOPOLIS 0x36
#define MAPSEC_GRANITE_CAVE 0x37
#define MAPSEC_MT_CHIMNEY 0x38
@@ -70,7 +70,7 @@
#define MAPSEC_AQUA_HIDEOUT_OLD 0x42
#define MAPSEC_SHOAL_CAVE 0x43
#define MAPSEC_SEAFLOOR_CAVERN 0x44
-#define MAPSEC_UNDERWATER_128 0x45
+#define MAPSEC_UNDERWATER_SEAFLOOR_CAVERN 0x45
#define MAPSEC_VICTORY_ROAD 0x46
#define MAPSEC_MIRAGE_ISLAND 0x47
#define MAPSEC_CAVE_OF_ORIGIN 0x48
@@ -207,8 +207,8 @@
#define MAPSEC_MARINE_CAVE 0xCB
#define MAPSEC_UNDERWATER_MARINE_CAVE 0xCC
#define MAPSEC_TERRA_CAVE 0xCD
-#define MAPSEC_UNDERWATER_TERRA_CAVE 0xCE
-#define MAPSEC_UNDERWATER_UNK1 0xCF
+#define MAPSEC_UNDERWATER_105 0xCE
+#define MAPSEC_UNDERWATER_125 0xCF
#define MAPSEC_UNDERWATER_129 0xD0
#define MAPSEC_DESERT_UNDERPASS 0xD1
#define MAPSEC_ALTERING_CAVE 0xD2
diff --git a/include/constants/roulette.h b/include/constants/roulette.h
new file mode 100644
index 000000000..2ab17e476
--- /dev/null
+++ b/include/constants/roulette.h
@@ -0,0 +1,7 @@
+#ifndef GUARD_CONSTANTS_ROULETTE_H
+#define GUARD_CONSTANTS_ROULETTE_H
+
+// Flag set in gSpecialVar_0x8004 when playing Roulette on a Game Corner service day
+#define ROULETTE_SPECIAL_RATE (1 << 7)
+
+#endif // GUARD_CONSTANTS_ROULETTE_H
diff --git a/include/constants/slot_machine.h b/include/constants/slot_machine.h
new file mode 100644
index 000000000..81848f208
--- /dev/null
+++ b/include/constants/slot_machine.h
@@ -0,0 +1,6 @@
+#ifndef GUARD_CONSTANTS_SLOT_MACHINE_H
+#define GUARD_CONSTANTS_SLOT_MACHINE_H
+
+#define SLOT_MACHINE_COUNT 12
+
+#endif // GUARD_CONSTANTS_SLOT_MACHINE_H
diff --git a/include/constants/songs.h b/include/constants/songs.h
index b44c9f7a8..a78ee6faf 100644
--- a/include/constants/songs.h
+++ b/include/constants/songs.h
@@ -1,543 +1,548 @@
#ifndef GUARD_CONSTANTS_SONGS_H
#define GUARD_CONSTANTS_SONGS_H
-#define MUS_DUMMY 0
-#define SE_KAIFUKU 1 // Healing Item
-#define SE_PC_LOGIN 2 // PC Logon
-#define SE_PC_OFF 3 // PC Shutdown
-#define SE_PC_ON 4 // PC Startup
-#define SE_SELECT 5 // Cursor Selection
-#define SE_WIN_OPEN 6 // Start Menu
-#define SE_WALL_HIT 7 // Wall Bump
-#define SE_DOOR 8 // Opening Door
-#define SE_KAIDAN 9 // Stairs
-#define SE_DANSA 10 // Ledge
-#define SE_JITENSYA 11 // Bicycle Bell
-#define SE_KOUKA_L 12 // Not Very Effective
-#define SE_KOUKA_M 13 // Normal Effectiveness
-#define SE_KOUKA_H 14 // Super Effective
-#define SE_BOWA2 15 // Pokémon Withdrawal
-#define SE_POKE_DEAD 16 // Pokémon Fainted
-#define SE_NIGERU 17 // Flee from Wild Battle
-#define SE_JIDO_DOA 18 // Pokémon Center Door
-#define SE_NAMINORI 19 // Briney's Ship
-#define SE_BAN 20 // Bang
-#define SE_PIN 21 // Exclamation Bubble
-#define SE_BOO 22 // Contest Jam
-#define SE_BOWA 23 // Giving Poké Ball to Nurse, Poké Ball Wiggle
-#define SE_JYUNI 24 // Places in Contest Appearing
-#define SE_A 25 // Bard A
-#define SE_I 26 // Bard I
-#define SE_U 27 // Bard U
-#define SE_E 28 // Bard E
-#define SE_O 29 // Bard O
-#define SE_N 30 // Bard N
-#define SE_SEIKAI 31 // Success
-#define SE_HAZURE 32 // Failure
-#define SE_EXP 33 // Exp. Bar
-#define SE_JITE_PYOKO 34 // Bunny Hop
-#define SE_MU_PACHI 35
-#define SE_TK_KASYA 36 // Mossdeep Gym/Trick House Switch
-#define SE_FU_ZAKU 37
-#define SE_FU_ZAKU2 38
-#define SE_FU_ZUZUZU 39 // Lavaridge Gym Warp
-#define SE_RU_GASHIN 40 // Sootopolis Gym - Stairs Appear
-#define SE_RU_GASYAN 41 // Sootopolis Gym - Ice Breaking
-#define SE_RU_BARI 42 // Sootopolis Gym - Walking on Ice
-#define SE_RU_HYUU 43 // Falling Down
-#define SE_KI_GASYAN 44
-#define SE_TK_WARPIN 45 // Warp In
-#define SE_TK_WARPOUT 46 // Warp Out
-#define SE_TU_SAA 47 // Repel
-#define SE_HI_TURUN 48 // Moving Obstacle in Fortree Gym
-#define SE_TRACK_MOVE 49 // Moving Truck
-#define SE_TRACK_STOP 50 // Moving Truck Stop
-#define SE_TRACK_HAIKI 51 // Moving Truck Unload
-#define SE_TRACK_DOOR 52 // Moving Truck Door
-#define SE_MOTER 53
-#define SE_CARD 54
-#define SE_SAVE 55 // Save
-#define SE_KON 56 // Poké Ball Bounce 1
-#define SE_KON2 57 // Poké Ball Bounce 2
-#define SE_KON3 58 // Poké Ball Bounce 3
-#define SE_KON4 59 // Poké Ball Bounce 4
-#define SE_SUIKOMU 60 // Poké Ball Trade
-#define SE_NAGERU 61 // Poké Ball Throw
-#define SE_TOY_C 62 // Note C
-#define SE_TOY_D 63 // Note D
-#define SE_TOY_E 64 // Note E
-#define SE_TOY_F 65 // Note F
-#define SE_TOY_G 66 // Note G
-#define SE_TOY_A 67 // Note A
-#define SE_TOY_B 68 // Note B
-#define SE_TOY_C1 69 // Note High C
-#define SE_MIZU 70 // Puddle
-#define SE_HASHI 71 // Boardwalk
-#define SE_DAUGI 72 // Slots Credits
-#define SE_PINPON 73 // Ding-dong!
-#define SE_FUUSEN1 74 // Red Balloon
-#define SE_FUUSEN2 75 // Blue Balloon
-#define SE_FUUSEN3 76 // Yellow Balloon
-#define SE_TOY_KABE 77 // Breakable Door
-#define SE_TOY_DANGO 78 // Mud Ball
-#define SE_DOKU 79 // Overworld Poison Damage
-#define SE_ESUKA 80 // Escalator
-#define SE_T_AME 81 // Rain
-#define SE_T_AME_E 82 // Rain Stop
-#define SE_T_OOAME 83 // Heavy Rain
-#define SE_T_OOAME_E 84 // Heavy Rain Stop
-#define SE_T_KOAME 85 // Light Rain
-#define SE_T_KOAME_E 86 // Light Rain Stop
-#define SE_T_KAMI 87 // Thunder
-#define SE_T_KAMI2 88 // Thunder 2
-#define SE_ELEBETA 89 // Elevator
-#define SE_HINSI 90 // Low Health
-#define SE_EXPMAX 91 // Exp. Max
-#define SE_TAMAKORO 92 // Roulette Ball
-#define SE_TAMAKORO_E 93 // Roulette Ball 2
-#define SE_BASABASA 94
-#define SE_REGI 95 // Cash Register
-#define SE_C_GAJI 96 // Contest Hearts
-#define SE_C_MAKU_U 97 // Contest Curtain rise
-#define SE_C_MAKU_D 98 // Contest Curtain fall
-#define SE_C_PASI 99
-#define SE_C_SYU 100
-#define SE_C_PIKON 101 // Pokémon Appears in Contest
-#define SE_REAPOKE 102 // Shiny Pokémon
-#define SE_OP_BASYU 103 // Opening Movie -> Title Screen whoosh
-#define SE_BT_START 104 // Battle Mugshot whoosh
-#define SE_DENDOU 105 // Audience Cheering
-#define SE_JIHANKI 106 // Vending Machine
-#define SE_TAMA 107 // Orb Used
-#define SE_Z_SCROLL 108 // Pokédex Scrolling
-#define SE_Z_PAGE 109 // Pokédex Page
-#define SE_PN_ON 110 // PokéNav On
-#define SE_PN_OFF 111 // PokéNav Off
-#define SE_Z_SEARCH 112 // Pokédex Search
-#define SE_TAMAGO 113 // Egg hatch
-#define SE_TB_START 114 // Battle - Poké Ball Tray slide in
-#define SE_TB_KON 115 // Battle - Poké Ball Tray ball sound
-#define SE_TB_KARA 116 // Battle - Poké Ball Tray slide out
-#define SE_BIDORO 117
-#define SE_W085 118 // Thunderbolt
-#define SE_W085B 119 // Thunderbolt 2
-#define SE_W231 120 // Harden
-#define SE_W171 121 // Nightmare
-#define SE_W233 122 // Vital Throw
-#define SE_W233B 123 // Vital Throw 2
-#define SE_W145 124 // Bubble
-#define SE_W145B 125 // Bubble 2
-#define SE_W145C 126 // Bubble 3
-#define SE_W240 127 // Rain Dance
-#define SE_W015 128 // Cut
-#define SE_W081 129 // String Shot
-#define SE_W081B 130 // String Shot 2
-#define SE_W088 131 // Rock Throw
-#define SE_W016 132 // Gust
-#define SE_W016B 133 // Gust 2
-#define SE_W003 134 // DoubleSlap
-#define SE_W104 135 // Double Team
-#define SE_W013 136 // Razor Wind
-#define SE_W196 137 // Icy Wind
-#define SE_W086 138 // Thunder Wave
-#define SE_W004 139 // Comet Punch
-#define SE_W025 140 // Mega Kick
-#define SE_W025B 141 // Mega Kick 2
-#define SE_W152 142 // Crabhammer
-#define SE_W026 143 // Jump Kick
-#define SE_W172 144 // Flame Wheel
-#define SE_W172B 145 // Flame Wheel 2
-#define SE_W053 146 // Flamethrower
-#define SE_W007 147 // Fire Punch
-#define SE_W092 148 // Toxic
-#define SE_W221 149 // Sacred Fire
-#define SE_W221B 150 // Sacred Fire 2
-#define SE_W052 151 // Ember
-#define SE_W036 152 // Take Down
-#define SE_W059 153 // Blizzard
-#define SE_W059B 154 // Blizzard 2
-#define SE_W010 155 // Scratch
-#define SE_W011 156 // Vicegrip
-#define SE_W017 157 // Wing Attack
-#define SE_W019 158 // Fly
-#define SE_W028 159 // Sand-Attack
-#define SE_W013B 160 // Razor Wind 2
-#define SE_W044 161 // Bite
-#define SE_W029 162 // Headbutt
-#define SE_W057 163 // Surf
-#define SE_W056 164 // Hydro Pump
-#define SE_W250 165 // Whirlpool
-#define SE_W030 166 // Horn Attack
-#define SE_W039 167 // Tail Whip
-#define SE_W054 168 // Mist
-#define SE_W077 169 // PoisonPowder
-#define SE_W020 170 // Bind
-#define SE_W082 171 // Dragon Rage
-#define SE_W047 172 // Sing
-#define SE_W195 173 // Perish Song
-#define SE_W006 174 // Pay Day
-#define SE_W091 175 // Dig
-#define SE_W146 176 // Dizzy Punch
-#define SE_W120 177 // Self-Destruct
-#define SE_W153 178 // Explosion
-#define SE_W071B 179 // Absorb 2
-#define SE_W071 180 // Absorb
-#define SE_W103 181 // Screech
-#define SE_W062 182 // BubbleBeam
-#define SE_W062B 183 // BubbleBeam 2
-#define SE_W048 184 // Supersonic
-#define SE_W187 185 // Belly Drum
-#define SE_W118 186 // Metronome
-#define SE_W155 187 // Bonemerang
-#define SE_W122 188 // Lick
-#define SE_W060 189 // Psybeam
-#define SE_W185 190 // Faint Attack
-#define SE_W014 191 // Swords Dance
-#define SE_W043 192 // Leer
-#define SE_W207 193 // Swagger
-#define SE_W207B 194 // Swagger 2
-#define SE_W215 195 // Heal Bell
-#define SE_W109 196 // Confuse Ray
-#define SE_W173 197 // Snore
-#define SE_W280 198 // Brick Break
-#define SE_W202 199 // Giga Drain
-#define SE_W060B 200 // Psybeam 2
-#define SE_W076 201 // SolarBeam
-#define SE_W080 202 // Petal Dance
-#define SE_W100 203 // Teleport
-#define SE_W107 204 // Minimize
-#define SE_W166 205 // Sketch
-#define SE_W129 206 // Swift
-#define SE_W115 207 // Reflect
-#define SE_W112 208 // Barrier
-#define SE_W197 209 // Detect
-#define SE_W199 210 // Lock-On
-#define SE_W236 211 // Moonlight
-#define SE_W204 212 // Charm
-#define SE_W268 213 // Charge
-#define SE_W070 214 // Strength
-#define SE_W063 215 // Hyper Beam
-#define SE_W127 216 // Waterfall
-#define SE_W179 217 // Reversal
-#define SE_W151 218 // Acid Armor
-#define SE_W201 219 // Sandstorm
-#define SE_W161 220 // Tri-Attack
-#define SE_W161B 221 // Tri-Attack 2
-#define SE_W227 222 // Encore
-#define SE_W227B 223 // Encore 2
-#define SE_W226 224 // Baton Pass
-#define SE_W208 225 // Milk Drink
-#define SE_W213 226 // Attract
-#define SE_W213B 227 // Attract 2
-#define SE_W234 228 // Morning Sun
-#define SE_W260 229 // Flatter
-#define SE_W328 230 // Sand Tomb
-#define SE_W320 231 // GrassWhistle
-#define SE_W255 232 // Spit Up
-#define SE_W291 233 // Dive
-#define SE_W089 234 // Earthquake
-#define SE_W239 235 // Twister
-#define SE_W230 236 // Sweet Scent
-#define SE_W281 237 // Yawn
-#define SE_W327 238 // Sky Uppercut
-#define SE_W287 239 // Stat Increased
-#define SE_W257 240 // Heat Wave
-#define SE_W253 241 // Uproar
-#define SE_W258 242 // Hail
-#define SE_W322 243 // Cosmic Power
-#define SE_W298 244 // Teeter Dance
-#define SE_W287B 245 // Stat Decreased
-#define SE_W114 246 // Haze
-#define SE_W063B 247 // Hyper Beam 2
-// FRLG SFX below
-#define SE_RG_W_DOOR 248 // Door
-#define SE_RG_CARD1 249 // Trainer Card 1
-#define SE_RG_CARD2 250 // Trainer Card 2
-#define SE_RG_CARD3 251 // Trainer Card 3
-#define SE_RG_BAG1 252 // Bag Scroll
-#define SE_RG_BAG2 253 // Bag Pocket Change
-#define SE_RG_GETTING 254
-#define SE_RG_SHOP 255 // Cash Register
-#define SE_RG_KITEKI 256 // S.S. Anne Horn
-#define SE_RG_HELP_OP 257 // Help Menu Open
-#define SE_RG_HELP_CL 258 // Help Menu Close
-#define SE_RG_HELP_NG 259 // Help Menu Error
-#define SE_RG_DEOMOV 260 // Deoxys Moves
-#define SE_RG_EXCELLENT 261
-#define SE_RG_NAWAMISS 262
-// end FRLG SFX
-#define SE_TOREEYE 263 // Trainer's Eye Call
-#define SE_TOREOFF 264 // Trainer's Eye Hang Up
-#define SE_HANTEI1 265 // Battle Arena Time's Up 1
-#define SE_HANTEI2 266 // Battle Arena Time's Up 2
-#define SE_CURTAIN 267 // Battle Pike Curtain Open
-#define SE_CURTAIN1 268 // Battle Pike Curtain Close
-#define SE_USSOKI 269 // Sudowoodo
+// Original JP names listed on right, along with any additional notes
-#define MUS_TETSUJI 350 // Littleroot Town Test 'TETSUJI'
-#define MUS_FIELD13 351 // GSC - Route 38
-#define MUS_KACHI22 352 // Wild Pokémon Defeated
-#define MUS_KACHI2 353 // Wild Pokémon Defeated with Intro
-#define MUS_KACHI3 354 // Gym Leader Defeated
-#define MUS_KACHI5 355 // Victory! Elite Four
-#define MUS_PCC 356 // Crystal - Pokémon Communication Center
-#define MUS_NIBI 357 // GSC - Viridian/Saffron/Pewter/etc
-#define MUS_SUIKUN 358 // Crystal - Battle! Legendary Beasts
-#define MUS_DOORO1 359 // Route 101
-#define MUS_DOORO_X1 360 // Route 110
-#define MUS_DOORO_X3 361 // Route 120
-#define MUS_MACHI_S2 362 // Petalburg City
-#define MUS_MACHI_S4 363 // Oldale/Lavaridge Town
-#define MUS_GIM 364 // Gym
-#define MUS_NAMINORI 365 // Surfing
-#define MUS_DAN01 366 // Caves and Darkness
-#define MUS_FANFA1 367 // Level Up!
-#define MUS_ME_ASA 368 // Pokémon Healed
-#define MUS_ME_BACHI 369 // Obtained a Badge!
-#define MUS_FANFA4 370 // Obtained an Item!
-#define MUS_FANFA5 371 // Your Pokémon Just Evolved!
-#define MUS_ME_WAZA 372 // Obtained a TM/HM!
-#define MUS_BIJYUTU 373 // Lilycove Museum
-#define MUS_DOORO_X4 374 // Route 122/Intro
-#define MUS_FUNE_KAN 375 // Slateport Museum
-#define MUS_ME_SHINKA 376 // Evolution Intro
-#define MUS_SHINKA 377 // Evolution
-#define MUS_ME_WASURE 378 // Move Deleted/Messed Up Appeal
-#define MUS_SYOUJOEYE 379 // Encounter! Tuber
-#define MUS_BOYEYE 380 // Encounter! Boy
-#define MUS_DAN02 381 // Abandoned Ship/Southern Island
-#define MUS_MACHI_S3 382 // Fortree City/Pacifidlog Town
-#define MUS_ODAMAKI 383 // Professor Birch's Lab
-#define MUS_B_TOWER 384 // Battle Tower (RS)
-#define MUS_SWIMEYE 385 // Encounter! Swimmer
-#define MUS_DAN03 386 // Meteor Falls/Cave of Origin
-#define MUS_ME_KINOMI 387 // Obtained a Berry!
-#define MUS_ME_TAMA 388 // Awakening the Super-Ancient Pokémon
-#define MUS_ME_B_BIG 389 // Slots Jackpot!
-#define MUS_ME_B_SMALL 390 // Slots Victory!
-#define MUS_ME_ZANNEN 391 // Too bad!
-#define MUS_BD_TIME 392 // Roulette!
-#define MUS_TEST1 393 // Contest Test 1
-#define MUS_TEST2 394 // Contest Test 2
-#define MUS_TEST3 395 // Contest Test 3
-#define MUS_TEST4 396 // Contest Test 4
-#define MUS_TEST 397 // Encounter! Gentleman
-#define MUS_GOMACHI0 398 // Verdanturf Town
-#define MUS_GOTOWN 399 // Rustboro/Mauville/Mossdeep City
-#define MUS_POKECEN 400 // Pokémon Center
-#define MUS_NEXTROAD 401 // Route 104
-#define MUS_GRANROAD 402 // Route 119
-#define MUS_CYCLING 403 // Cycling
-#define MUS_FRIENDLY 404 // Pokémart
-#define MUS_MISHIRO 405 // Littleroot Town
-#define MUS_TOZAN 406 // Sky Pillar
-#define MUS_GIRLEYE 407 // Encounter! Girl
-#define MUS_MINAMO 408 // Lilycove City
-#define MUS_ASHROAD 409 // Route 111
-#define MUS_EVENT0 410 // Help me!
-#define MUS_DEEPDEEP 411 // Underwater
-#define MUS_KACHI1 412 // Victory! Trainer
-#define MUS_TITLE3 413 // Title Screen
-#define MUS_DEMO1 414 // Opening Movie
-#define MUS_GIRL_SUP 415 // Encounter! May
-#define MUS_HAGESHII 416 // Encounter! Biker
-#define MUS_KAKKOII 417 // Encounter! Electric Trainer
-#define MUS_KAZANBAI 418 // Route 113
-#define MUS_AQA_0 419 // Encounter! Team Aqua
-#define MUS_TSURETEK 420 // Follow Me!
-#define MUS_BOY_SUP 421 // Encounter! Brendan
-#define MUS_RAINBOW 422 // Ever Grande City
-#define MUS_AYASII 423 // Encounter! Psychic
-#define MUS_KACHI4 424 // Victory! Aqua/Magma Grunt
-#define MUS_ROPEWAY 425 // Cable Car
-#define MUS_CASINO 426 // Game Corner
-#define MUS_HIGHTOWN 427 // Dewford Town
-#define MUS_SAFARI 428 // Safari Zone
-#define MUS_C_ROAD 429 // Victory Road
-#define MUS_AJITO 430 // Aqua/Magma Hideout
-#define MUS_M_BOAT 431 // Sailing
-#define MUS_M_DUNGON 432 // Mt. Pyre (Inside)
-#define MUS_FINECITY 433 // Slateport City
-#define MUS_MACHUPI 434 // Mt. Pyre (Outside)
-#define MUS_P_SCHOOL 435 // Pokémon Trainer's School
-#define MUS_DENDOU 436 // You're the Champion!
-#define MUS_TONEKUSA 437 // Fallarbor Town
-#define MUS_MABOROSI 438 // Sealed Chamber
-#define MUS_CON_FAN 439 // Obtained a Contest Ribbon!
-#define MUS_CONTEST0 440 // Pokémon Contest
-#define MUS_MGM0 441 // Encounter! Team Magma
-#define MUS_T_BATTLE 442 // Opening Battle
-#define MUS_OOAME 443 // The Flood
-#define MUS_HIDERI 444 // The Drought
-#define MUS_RUNECITY 445 // Sootopolis City
-#define MUS_CON_K 446 // Contest/Berry Blending Results
-#define MUS_EIKOU_R 447 // Hall of Fame
-#define MUS_KARAKURI 448 // Trick House
-#define MUS_HUTAGO 449 // Encounter! Kid
-#define MUS_SITENNOU 450 // Encounter! Elite Four
-#define MUS_YAMA_EYE 451 // Encounter! Hiker
-#define MUS_CONLOBBY 452 // Contest Lobby
-#define MUS_INTER_V 453 // Encounter! Gabby and Ty
-#define MUS_DAIGO 454 // Encounter! Wallace
-#define MUS_THANKFOR 455 // Credits
-#define MUS_END 456 // The End
-#define MUS_B_FRONTIER 457 // Battle Frontier
-#define MUS_B_ARENA 458 // Battle Arena
-#define MUS_ME_POINTGET 459 // Obtained Battle Points!
-#define MUS_ME_TORE_EYE 460 // Registered Trainer!
-#define MUS_PYRAMID 461 // Battle Pyramid
-#define MUS_PYRAMID_TOP 462 // Top of the Battle Pyramid
-#define MUS_B_PALACE 463 // Battle Palace
-#define MUS_REKKUU_KOURIN 464 // Rayquaza Enters
-#define MUS_SATTOWER 465 // Battle Tower (Emerald)
-#define MUS_ME_SYMBOLGET 466 // Obtained a Frontier Symbol!
-#define MUS_B_DOME 467 // Battle Dome
-#define MUS_B_TUBE 468 // Battle Pike
-#define MUS_B_FACTORY 469 // Battle Factory
-#define MUS_VS_REKKU 470 // Battle! Legendary Pokémon
-#define MUS_VS_FRONT 471 // Battle! Frontier Brain
-#define MUS_VS_MEW 472 // Battle! Mew
-#define MUS_B_DOME1 473 // Battle Dome Lobby
-#define MUS_BATTLE27 474 // Battle! Wild Pokémon
-#define MUS_BATTLE31 475 // Battle! Team Aqua/Magma
-#define MUS_BATTLE20 476 // Battle! Trainer
-#define MUS_BATTLE32 477 // Battle! Gym Leader
-#define MUS_BATTLE33 478 // Battle! Champion
-#define MUS_BATTLE36 479 // Battle! Regi Trio
-#define MUS_BATTLE34 480 // Battle! Legendary Pokémon (dupe)
-#define MUS_BATTLE35 481 // Battle! Rival
-#define MUS_BATTLE38 482 // Battle! Elite Four
-#define MUS_BATTLE30 483 // Battle! Archie/Maxie
-// FRLG Music Below
-#define MUS_RG_ANNAI 484 // Follow Me!
-#define MUS_RG_SLOT 485 // Game Corner
-#define MUS_RG_AJITO 486 // Rocket Hideout
-#define MUS_RG_GYM 487 // Gym
-#define MUS_RG_PURIN 488 // Jigglypuff's Song
-#define MUS_RG_DEMO 489 // Opening Movie
-#define MUS_RG_TITLE 490 // Title Screen
-#define MUS_RG_GUREN 491 // Cinnabar Island
-#define MUS_RG_SHION 492 // Lavender Town
-#define MUS_RG_KAIHUKU 493 // RBY Pokémon Center Healing
-#define MUS_RG_CYCLING 494 // Cycling
-#define MUS_RG_ROCKET 495 // Encounter! Team Rocket
-#define MUS_RG_SHOUJO 496 // Encounter! Girl
-#define MUS_RG_SHOUNEN 497 // Encounter! Boy
-#define MUS_RG_DENDOU 498 // You're the Champion!
-#define MUS_RG_T_MORI 499 // Viridian Forest
-#define MUS_RG_OTSUKIMI 500 // Mt. Moon
-#define MUS_RG_POKEYASHI 501 // Pokémon Mansion
-#define MUS_RG_ENDING 502 // Credits
-#define MUS_RG_LOAD01 503 // Route 1
-#define MUS_RG_OPENING 504 // Route 24/Intro
-#define MUS_RG_LOAD02 505 // Route 3
-#define MUS_RG_LOAD03 506 // Route 11
-#define MUS_RG_CHAMP_R 507 // Victory Road/Indigo Plateau
-#define MUS_RG_VS_GYM 508 // Battle! Gym Leader/Elite Four
-#define MUS_RG_VS_TORE 509 // Battle! Trainer
-#define MUS_RG_VS_YASEI 510 // Battle! Wild Pokémon
-#define MUS_RG_VS_LAST 511 // Battle! Champion
-#define MUS_RG_MASARA 512 // Pallet Town
-#define MUS_RG_KENKYU 513 // Professor Oak's Lab
-#define MUS_RG_OHKIDO 514 // Professor Oak's Theme
-#define MUS_RG_POKECEN 515 // Pokémon Center
-#define MUS_RG_SANTOAN 516 // S.S. Anne
-#define MUS_RG_NAMINORI 517 // Surfing
-#define MUS_RG_P_TOWER 518 // Pokémon Tower
-#define MUS_RG_SHIRUHU 519 // Silph Co.
-#define MUS_RG_HANADA 520 // Cerulean/Fuschia City
-#define MUS_RG_TAMAMUSI 521 // Celadon City
-#define MUS_RG_WIN_TRE 522 // Victory! Trainer
-#define MUS_RG_WIN_YASEI 523 // Victory! Wild Pokémon
-#define MUS_RG_WIN_GYM 524 // Victory! Gym Leader
-#define MUS_RG_KUCHIBA 525 // Vermillion City
-#define MUS_RG_NIBI 526 // Viridian/Saffron/Pewter City
-#define MUS_RG_RIVAL1 527 // Encounter! Rival
-#define MUS_RG_RIVAL2 528 // Rival's Exit
-#define MUS_RG_FAN2 529 // Fanfare 2
-#define MUS_RG_FAN5 530 // Obtained a Starter!
-#define MUS_RG_FAN6 531 // Pokémon Caught! (Used in Emerald)
-#define MUS_ME_RG_PHOTO 532 // Trainer Photo
-#define MUS_RG_TITLEROG 533 // Game Freak
-#define MUS_RG_GET_YASEI 534 // Pokémon Caught Victory Theme
-#define MUS_RG_SOUSA 535 // Starting Tutorial
-#define MUS_RG_SEKAIKAN 536 // Starting Tutorial 2
-#define MUS_RG_SEIBETU 537 // Starting Tutorial 3
-#define MUS_RG_JUMP 538 // Pokemon Jump Minigame
-#define MUS_RG_UNION 539 // Union Room
-#define MUS_RG_NETWORK 540 // Network Center
-#define MUS_RG_OKURIMONO 541 // Mystery Gift
-#define MUS_RG_KINOMIKUI 542 // Dodrio Berry Picking
-#define MUS_RG_NANADUNGEON 543 // Sevii Caves/Altering Cave (Mt. Moon)
-#define MUS_RG_OSHIE_TV 544 // Follow Me!
-#define MUS_RG_NANASHIMA 545 // Sevii Islands Routes (Lake of Rage)
-#define MUS_RG_NANAISEKI 546 // Sevii Forests (Viridian Forest)
-#define MUS_RG_NANA123 547 // Sevii Islands 1-3 (Viridian/Saffron/Pewter)
-#define MUS_RG_NANA45 548 // Sevii Islands 4-5 (Azalea Town)
-#define MUS_RG_NANA67 549 // Sevii Islands 6-7 (Violet City)
-#define MUS_RG_POKEFUE 550 // Poké Flute
-#define MUS_RG_VS_DEO 551 // Battle! Deoxys
-#define MUS_RG_VS_MYU2 552 // Battle! Mewtwo
-#define MUS_RG_VS_DEN 553 // Battle! Legendary Birds
-#define MUS_RG_EXEYE 554 // Encounter! Gym Leader
-#define MUS_RG_DEOEYE 555 // Encounter! Deoxys
-#define MUS_RG_T_TOWER 556 // Trainer Tower (Gym)
-#define MUS_RG_SLOWMASARA 557 // Pallet Town (Hall of Fame remix)
-#define MUS_RG_TVNOIZE 558 // Teachy TV
-#define PH_TRAP_BLEND 559
-#define PH_TRAP_HELD 560
-#define PH_TRAP_SOLO 561
-#define PH_FACE_BLEND 562
-#define PH_FACE_HELD 563
-#define PH_FACE_SOLO 564
-#define PH_CLOTH_BLEND 565
-#define PH_CLOTH_HELD 566
-#define PH_CLOTH_SOLO 567
-#define PH_DRESS_BLEND 568
-#define PH_DRESS_HELD 569
-#define PH_DRESS_SOLO 570
-#define PH_FLEECE_BLEND 571
-#define PH_FLEECE_HELD 572
-#define PH_FLEECE_SOLO 573
-#define PH_KIT_BLEND 574
-#define PH_KIT_HELD 575
-#define PH_KIT_SOLO 576
-#define PH_PRICE_BLEND 577
-#define PH_PRICE_HELD 578
-#define PH_PRICE_SOLO 579
-#define PH_LOT_BLEND 580
-#define PH_LOT_HELD 581
-#define PH_LOT_SOLO 582
-#define PH_GOAT_BLEND 583
-#define PH_GOAT_HELD 584
-#define PH_GOAT_SOLO 585
-#define PH_THOUGHT_BLEND 586
-#define PH_THOUGHT_HELD 587
-#define PH_THOUGHT_SOLO 588
-#define PH_CHOICE_BLEND 589
-#define PH_CHOICE_HELD 590
-#define PH_CHOICE_SOLO 591
-#define PH_MOUTH_BLEND 592
-#define PH_MOUTH_HELD 593
-#define PH_MOUTH_SOLO 594
-#define PH_FOOT_BLEND 595
-#define PH_FOOT_HELD 596
-#define PH_FOOT_SOLO 597
-#define PH_GOOSE_BLEND 598
-#define PH_GOOSE_HELD 599
-#define PH_GOOSE_SOLO 600
-#define PH_STRUT_BLEND 601
-#define PH_STRUT_HELD 602
-#define PH_STRUT_SOLO 603
-#define PH_CURE_BLEND 604
-#define PH_CURE_HELD 605
-#define PH_CURE_SOLO 606
-#define PH_NURSE_BLEND 607
-#define PH_NURSE_HELD 608
-#define PH_NURSE_SOLO 609
+#define MUS_DUMMY 0 // MUS_DUMMY
+#define SE_USE_ITEM 1 // SE_KAIFUKU
+#define SE_PC_LOGIN 2 // SE_PC_LOGIN
+#define SE_PC_OFF 3 // SE_PC_OFF
+#define SE_PC_ON 4 // SE_PC_ON
+#define SE_SELECT 5 // SE_SELECT
+#define SE_WIN_OPEN 6 // SE_WIN_OPEN
+#define SE_WALL_HIT 7 // SE_WALL_HIT
+#define SE_DOOR 8 // SE_DOOR
+#define SE_EXIT 9 // SE_KAIDAN
+#define SE_LEDGE 10 // SE_DANSA
+#define SE_BIKE_BELL 11 // SE_JITENSYA
+#define SE_NOT_EFFECTIVE 12 // SE_KOUKA_L
+#define SE_EFFECTIVE 13 // SE_KOUKA_M
+#define SE_SUPER_EFFECTIVE 14 // SE_KOUKA_H
+#define SE_BALL_OPEN 15 // SE_BOWA2
+#define SE_FAINT 16 // SE_POKE_DEAD
+#define SE_FLEE 17 // SE_NIGERU
+#define SE_SLIDING_DOOR 18 // SE_JIDO_DOA
+#define SE_SHIP 19 // SE_NAMINORI
+#define SE_BANG 20 // SE_BAN
+#define SE_PIN 21 // SE_PIN (General "good", commonly for "!")
+#define SE_BOO 22 // SE_BOO (General "bad")
+#define SE_BALL 23 // SE_BOWA (Giving Poké Ball to nurse, Poké Ball shake, etc)
+#define SE_CONTEST_PLACE 24 // SE_JYUNI
+#define SE_A 25 // SE_A (Bard sounds)
+#define SE_I 26 // SE_I
+#define SE_U 27 // SE_U
+#define SE_E 28 // SE_E
+#define SE_O 29 // SE_O
+#define SE_N 30 // SE_N
+#define SE_SUCCESS 31 // SE_SEIKAI
+#define SE_FAILURE 32 // SE_HAZURE
+#define SE_EXP 33 // SE_EXP
+#define SE_BIKE_HOP 34 // SE_JITE_PYOKO
+#define SE_SWITCH 35 // SE_MU_PACHI
+#define SE_CLICK 36 // SE_TK_KASYA
+#define SE_FU_ZAKU 37 // SE_FU_ZAKU (Unknown purpose, unused)
+#define SE_CONTEST_CONDITION_LOSE 38 // SE_FU_ZAKU2
+#define SE_LAVARIDGE_FALL_WARP 39 // SE_FU_ZUZUZU
+#define SE_ICE_STAIRS 40 // SE_RU_GASHIN
+#define SE_ICE_BREAK 41 // SE_RU_GASYAN
+#define SE_ICE_CRACK 42 // SE_RU_BARI
+#define SE_FALL 43 // SE_RU_HYUU
+#define SE_UNLOCK 44 // SE_KI_GASYAN
+#define SE_WARP_IN 45 // SE_TK_WARPIN
+#define SE_WARP_OUT 46 // SE_TK_WARPOUT
+#define SE_REPEL 47 // SE_TU_SAA
+#define SE_ROTATING_GATE 48 // SE_HI_TURUN
+#define SE_TRUCK_MOVE 49 // SE_TRACK_MOVE
+#define SE_TRUCK_STOP 50 // SE_TRACK_STOP
+#define SE_TRUCK_UNLOAD 51 // SE_TRACK_HAIKI
+#define SE_TRUCK_DOOR 52 // SE_TRACK_DOOR
+#define SE_BERRY_BLENDER 53 // SE_MOTER
+#define SE_CARD 54 // SE_CARD (Unused, different from the RS card SE)
+#define SE_SAVE 55 // SE_SAVE
+#define SE_BALL_BOUNCE_1 56 // SE_KON
+#define SE_BALL_BOUNCE_2 57 // SE_KON2
+#define SE_BALL_BOUNCE_3 58 // SE_KON3
+#define SE_BALL_BOUNCE_4 59 // SE_KON4
+#define SE_BALL_TRADE 60 // SE_SUIKOMU
+#define SE_BALL_THROW 61 // SE_NAGERU
+#define SE_NOTE_C 62 // SE_TOY_C
+#define SE_NOTE_D 63 // SE_TOY_D
+#define SE_NOTE_E 64 // SE_TOY_E
+#define SE_NOTE_F 65 // SE_TOY_F
+#define SE_NOTE_G 66 // SE_TOY_G
+#define SE_NOTE_A 67 // SE_TOY_A
+#define SE_NOTE_B 68 // SE_TOY_B
+#define SE_NOTE_C_HIGH 69 // SE_TOY_C1
+#define SE_PUDDLE 70 // SE_MIZU
+#define SE_BRIDGE_WALK 71 // SE_HASHI
+#define SE_ITEMFINDER 72 // SE_DAUGI
+#define SE_DING_DONG 73 // SE_PINPON
+#define SE_BALLOON_RED 74 // SE_FUUSEN1
+#define SE_BALLOON_BLUE 75 // SE_FUUSEN2
+#define SE_BALLOON_YELLOW 76 // SE_FUUSEN3
+#define SE_BREAKABLE_DOOR 77 // SE_TOY_KABE
+#define SE_MUD_BALL 78 // SE_TOY_DANGO
+#define SE_FIELD_POISON 79 // SE_DOKU
+#define SE_ESCALATOR 80 // SE_ESUKA
+#define SE_THUNDERSTORM 81 // SE_T_AME
+#define SE_THUNDERSTORM_STOP 82 // SE_T_AME_E
+#define SE_DOWNPOUR 83 // SE_T_OOAME
+#define SE_DOWNPOUR_STOP 84 // SE_T_OOAME_E
+#define SE_RAIN 85 // SE_T_KOAME
+#define SE_RAIN_STOP 86 // SE_T_KOAME_E
+#define SE_THUNDER 87 // SE_T_KAMI
+#define SE_THUNDER2 88 // SE_T_KAMI2
+#define SE_ELEVATOR 89 // SE_ELEBETA
+#define SE_LOW_HEALTH 90 // SE_HINSI
+#define SE_EXP_MAX 91 // SE_EXPMAX
+#define SE_ROULETTE_BALL 92 // SE_TAMAKORO
+#define SE_ROULETTE_BALL2 93 // SE_TAMAKORO_E
+#define SE_TAILLOW_WING_FLAP 94 // SE_BASABASA
+#define SE_SHOP 95 // SE_REGI
+#define SE_CONTEST_HEART 96 // SE_C_GAJI
+#define SE_CONTEST_CURTAIN_RISE 97 // SE_C_MAKU_U
+#define SE_CONTEST_CURTAIN_FALL 98 // SE_C_MAKU_D
+#define SE_CONTEST_ICON_CHANGE 99 // SE_C_PASI
+#define SE_CONTEST_ICON_CLEAR 100 // SE_C_SYU
+#define SE_CONTEST_MONS_TURN 101 // SE_C_PIKON
+#define SE_SHINY 102 // SE_REAPOKE
+#define SE_INTRO_BLAST 103 // SE_OP_BASYU
+#define SE_MUGSHOT 104 // SE_BT_START
+#define SE_APPLAUSE 105 // SE_DENDOU
+#define SE_VEND 106 // SE_JIHANKI
+#define SE_ORB 107 // SE_TAMA
+#define SE_DEX_SCROLL 108 // SE_Z_SCROLL
+#define SE_DEX_PAGE 109 // SE_Z_PAGE
+#define SE_POKENAV_ON 110 // SE_PN_ON
+#define SE_POKENAV_OFF 111 // SE_PN_OFF
+#define SE_DEX_SEARCH 112 // SE_Z_SEARCH
+#define SE_EGG_HATCH 113 // SE_TAMAGO
+#define SE_BALL_TRAY_ENTER 114 // SE_TB_START
+#define SE_BALL_TRAY_BALL 115 // SE_TB_KON
+#define SE_BALL_TRAY_EXIT 116 // SE_TB_KARA
+#define SE_GLASS_FLUTE 117 // SE_BIDORO
+// Move SFX
+#define SE_M_THUNDERBOLT 118 // SE_W085
+#define SE_M_THUNDERBOLT2 119 // SE_W085B
+#define SE_M_HARDEN 120 // SE_W231
+#define SE_M_NIGHTMARE 121 // SE_W171
+#define SE_M_VITAL_THROW 122 // SE_W233
+#define SE_M_VITAL_THROW2 123 // SE_W233B
+#define SE_M_BUBBLE 124 // SE_W145
+#define SE_M_BUBBLE2 125 // SE_W145B
+#define SE_M_BUBBLE3 126 // SE_W145C
+#define SE_M_RAIN_DANCE 127 // SE_W240
+#define SE_M_CUT 128 // SE_W015
+#define SE_M_STRING_SHOT 129 // SE_W081
+#define SE_M_STRING_SHOT2 130 // SE_W081B
+#define SE_M_ROCK_THROW 131 // SE_W088
+#define SE_M_GUST 132 // SE_W016
+#define SE_M_GUST2 133 // SE_W016B
+#define SE_M_DOUBLE_SLAP 134 // SE_W003
+#define SE_M_DOUBLE_TEAM 135 // SE_W104
+#define SE_M_RAZOR_WIND 136 // SE_W013
+#define SE_M_ICY_WIND 137 // SE_W196
+#define SE_M_THUNDER_WAVE 138 // SE_W086
+#define SE_M_COMET_PUNCH 139 // SE_W004
+#define SE_M_MEGA_KICK 140 // SE_W025
+#define SE_M_MEGA_KICK2 141 // SE_W025B
+#define SE_M_CRABHAMMER 142 // SE_W152
+#define SE_M_JUMP_KICK 143 // SE_W026
+#define SE_M_FLAME_WHEEL 144 // SE_W172
+#define SE_M_FLAME_WHEEL2 145 // SE_W172B
+#define SE_M_FLAMETHROWER 146 // SE_W053
+#define SE_M_FIRE_PUNCH 147 // SE_W007
+#define SE_M_TOXIC 148 // SE_W092
+#define SE_M_SACRED_FIRE 149 // SE_W221
+#define SE_M_SACRED_FIRE2 150 // SE_W221B
+#define SE_M_EMBER 151 // SE_W052
+#define SE_M_TAKE_DOWN 152 // SE_W036
+#define SE_M_BLIZZARD 153 // SE_W059
+#define SE_M_BLIZZARD2 154 // SE_W059B
+#define SE_M_SCRATCH 155 // SE_W010
+#define SE_M_VICEGRIP 156 // SE_W011
+#define SE_M_WING_ATTACK 157 // SE_W017
+#define SE_M_FLY 158 // SE_W019
+#define SE_M_SAND_ATTACK 159 // SE_W028
+#define SE_M_RAZOR_WIND2 160 // SE_W013B
+#define SE_M_BITE 161 // SE_W044
+#define SE_M_HEADBUTT 162 // SE_W029
+#define SE_M_SURF 163 // SE_W057
+#define SE_M_HYDRO_PUMP 164 // SE_W056
+#define SE_M_WHIRLPOOL 165 // SE_W250
+#define SE_M_HORN_ATTACK 166 // SE_W030
+#define SE_M_TAIL_WHIP 167 // SE_W039
+#define SE_M_MIST 168 // SE_W054
+#define SE_M_POISON_POWDER 169 // SE_W077
+#define SE_M_BIND 170 // SE_W020
+#define SE_M_DRAGON_RAGE 171 // SE_W082
+#define SE_M_SING 172 // SE_W047
+#define SE_M_PERISH_SONG 173 // SE_W195
+#define SE_M_PAY_DAY 174 // SE_W006
+#define SE_M_DIG 175 // SE_W091
+#define SE_M_DIZZY_PUNCH 176 // SE_W146
+#define SE_M_SELF_DESTRUCT 177 // SE_W120
+#define SE_M_EXPLOSION 178 // SE_W153
+#define SE_M_ABSORB_2 179 // SE_W071B
+#define SE_M_ABSORB 180 // SE_W071
+#define SE_M_SCREECH 181 // SE_W103
+#define SE_M_BUBBLE_BEAM 182 // SE_W062
+#define SE_M_BUBBLE_BEAM2 183 // SE_W062B
+#define SE_M_SUPERSONIC 184 // SE_W048
+#define SE_M_BELLY_DRUM 185 // SE_W187
+#define SE_M_METRONOME 186 // SE_W118
+#define SE_M_BONEMERANG 187 // SE_W155
+#define SE_M_LICK 188 // SE_W122
+#define SE_M_PSYBEAM 189 // SE_W060
+#define SE_M_FAINT_ATTACK 190 // SE_W185
+#define SE_M_SWORDS_DANCE 191 // SE_W014
+#define SE_M_LEER 192 // SE_W043
+#define SE_M_SWAGGER 193 // SE_W207
+#define SE_M_SWAGGER2 194 // SE_W207B
+#define SE_M_HEAL_BELL 195 // SE_W215
+#define SE_M_CONFUSE_RAY 196 // SE_W109
+#define SE_M_SNORE 197 // SE_W173
+#define SE_M_BRICK_BREAK 198 // SE_W280
+#define SE_M_GIGA_DRAIN 199 // SE_W202
+#define SE_M_PSYBEAM2 200 // SE_W060B
+#define SE_M_SOLAR_BEAM 201 // SE_W076
+#define SE_M_PETAL_DANCE 202 // SE_W080
+#define SE_M_TELEPORT 203 // SE_W100
+#define SE_M_MINIMIZE 204 // SE_W107
+#define SE_M_SKETCH 205 // SE_W166
+#define SE_M_SWIFT 206 // SE_W129
+#define SE_M_REFLECT 207 // SE_W115
+#define SE_M_BARRIER 208 // SE_W112
+#define SE_M_DETECT 209 // SE_W197
+#define SE_M_LOCK_ON 210 // SE_W199
+#define SE_M_MOONLIGHT 211 // SE_W236
+#define SE_M_CHARM 212 // SE_W204
+#define SE_M_CHARGE 213 // SE_W268
+#define SE_M_STRENGTH 214 // SE_W070
+#define SE_M_HYPER_BEAM 215 // SE_W063
+#define SE_M_WATERFALL 216 // SE_W127
+#define SE_M_REVERSAL 217 // SE_W179
+#define SE_M_ACID_ARMOR 218 // SE_W151
+#define SE_M_SANDSTORM 219 // SE_W201
+#define SE_M_TRI_ATTACK 220 // SE_W161
+#define SE_M_TRI_ATTACK2 221 // SE_W161B
+#define SE_M_ENCORE 222 // SE_W227
+#define SE_M_ENCORE2 223 // SE_W227B
+#define SE_M_BATON_PASS 224 // SE_W226
+#define SE_M_MILK_DRINK 225 // SE_W208
+#define SE_M_ATTRACT 226 // SE_W213
+#define SE_M_ATTRACT2 227 // SE_W213B
+#define SE_M_MORNING_SUN 228 // SE_W234
+#define SE_M_FLATTER 229 // SE_W260
+#define SE_M_SAND_TOMB 230 // SE_W328
+#define SE_M_GRASSWHISTLE 231 // SE_W320
+#define SE_M_SPIT_UP 232 // SE_W255
+#define SE_M_DIVE 233 // SE_W291
+#define SE_M_EARTHQUAKE 234 // SE_W089
+#define SE_M_TWISTER 235 // SE_W239
+#define SE_M_SWEET_SCENT 236 // SE_W230
+#define SE_M_YAWN 237 // SE_W281
+#define SE_M_SKY_UPPERCUT 238 // SE_W327
+#define SE_M_STAT_INCREASE 239 // SE_W287
+#define SE_M_HEAT_WAVE 240 // SE_W257
+#define SE_M_UPROAR 241 // SE_W253
+#define SE_M_HAIL 242 // SE_W258
+#define SE_M_COSMIC_POWER 243 // SE_W322
+#define SE_M_TEETER_DANCE 244 // SE_W298
+#define SE_M_STAT_DECREASE 245 // SE_W287B
+#define SE_M_HAZE 246 // SE_W114
+#define SE_M_HYPER_BEAM2 247 // SE_W063B
+// FRLG SFX
+#define SE_RG_DOOR 248 // SE_RG_W_DOOR
+#define SE_RG_CARD_FLIP 249 // SE_RG_CARD1
+#define SE_RG_CARD_FLIPPING 250 // SE_RG_CARD2
+#define SE_RG_CARD_OPEN 251 // SE_RG_CARD3
+#define SE_RG_BAG_CURSOR 252 // SE_RG_BAG1
+#define SE_RG_BAG_POCKET 253 // SE_RG_BAG2
+#define SE_RG_BALL_CLICK 254 // SE_RG_GETTING
+#define SE_RG_SHOP 255 // SE_RG_SHOP
+#define SE_RG_SS_ANNE_HORN 256 // SE_RG_KITEKI
+#define SE_RG_HELP_OPEN 257 // SE_RG_HELP_OP
+#define SE_RG_HELP_CLOSE 258 // SE_RG_HELP_CL
+#define SE_RG_HELP_ERROR 259 // SE_RG_HELP_NG
+#define SE_RG_DEOXYS_MOVE 260 // SE_RG_DEOMOV
+#define SE_RG_POKE_JUMP_SUCCESS 261 // SE_RG_EXCELLENT
+#define SE_RG_POKE_JUMP_FAILURE 262 // SE_RG_NAWAMISS
+// New Emerald SFX
+#define SE_POKENAV_CALL 263 // SE_TOREEYE
+#define SE_POKENAV_HANG_UP 264 // SE_TOREOFF
+#define SE_ARENA_TIMEUP1 265 // SE_HANTEI1
+#define SE_ARENA_TIMEUP2 266 // SE_HANTEI2
+#define SE_PIKE_CURTAIN_CLOSE 267 // SE_CURTAIN
+#define SE_PIKE_CURTAIN_OPEN 268 // SE_CURTAIN1
+#define SE_SUDOWOODO_SHAKE 269 // SE_USSOKI
-#define MUS_ROUTE_118 0x7FFF // map is split into 2 music sections. controlled by GetCurrLocationDefaultMusic().
+// Music
+#define MUS_LITTLEROOT_TEST 350 // MUS_TETSUJI
+#define MUS_GSC_ROUTE38 351 // MUS_FIELD13
+#define MUS_CAUGHT 352 // MUS_KACHI22
+#define MUS_VICTORY_WILD 353 // MUS_KACHI2
+#define MUS_VICTORY_GYM_LEADER 354 // MUS_KACHI3
+#define MUS_VICTORY_LEAGUE 355 // MUS_KACHI5
+#define MUS_C_COMM_CENTER 356 // MUS_PCC
+#define MUS_GSC_PEWTER 357 // MUS_NIBI
+#define MUS_C_VS_LEGEND_BEAST 358 // MUS_SUIKUN
+#define MUS_ROUTE101 359 // MUS_DOORO1
+#define MUS_ROUTE110 360 // MUS_DOORO_X1
+#define MUS_ROUTE120 361 // MUS_DOORO_X3
+#define MUS_PETALBURG 362 // MUS_MACHI_S2
+#define MUS_OLDALE 363 // MUS_MACHI_S4
+#define MUS_GYM 364 // MUS_GIM
+#define MUS_SURF 365 // MUS_NAMINORI
+#define MUS_PETALBURG_WOODS 366 // MUS_DAN01
+#define MUS_LEVEL_UP 367 // MUS_FANFA1
+#define MUS_HEAL 368 // MUS_ME_ASA
+#define MUS_OBTAIN_BADGE 369 // MUS_ME_BACHI
+#define MUS_OBTAIN_ITEM 370 // MUS_FANFA4
+#define MUS_EVOLVED 371 // MUS_FANFA5
+#define MUS_OBTAIN_TMHM 372 // MUS_ME_WAZA
+#define MUS_LILYCOVE_MUSEUM 373 // MUS_BIJYUTU
+#define MUS_ROUTE122 374 // MUS_DOORO_X4
+#define MUS_OCEANIC_MUSEUM 375 // MUS_FUNE_KAN
+#define MUS_EVOLUTION_INTRO 376 // MUS_ME_SHINKA
+#define MUS_EVOLUTION 377 // MUS_SHINKA
+#define MUS_MOVE_DELETED 378 // MUS_ME_WASURE
+#define MUS_ENCOUNTER_GIRL 379 // MUS_SYOUJOEYE
+#define MUS_ENCOUNTER_MALE 380 // MUS_BOYEYE
+#define MUS_ABANDONED_SHIP 381 // MUS_DAN02
+#define MUS_FORTREE 382 // MUS_MACHI_S3
+#define MUS_BIRCH_LAB 383 // MUS_ODAMAKI
+#define MUS_B_TOWER_RS 384 // MUS_B_TOWER
+#define MUS_ENCOUNTER_SWIMMER 385 // MUS_SWIMEYE
+#define MUS_CAVE_OF_ORIGIN 386 // MUS_DAN03
+#define MUS_OBTAIN_BERRY 387 // MUS_ME_KINOMI
+#define MUS_AWAKEN_LEGEND 388 // MUS_ME_TAMA
+#define MUS_SLOTS_JACKPOT 389 // MUS_ME_B_BIG
+#define MUS_SLOTS_WIN 390 // MUS_ME_B_SMALL
+#define MUS_TOO_BAD 391 // MUS_ME_ZANNEN
+#define MUS_ROULETTE 392 // MUS_BD_TIME
+#define MUS_LINK_CONTEST_P1 393 // MUS_TEST1
+#define MUS_LINK_CONTEST_P2 394 // MUS_TEST2
+#define MUS_LINK_CONTEST_P3 395 // MUS_TEST3
+#define MUS_LINK_CONTEST_P4 396 // MUS_TEST4
+#define MUS_ENCOUNTER_RICH 397 // MUS_TEST
+#define MUS_VERDANTURF 398 // MUS_GOMACHI0
+#define MUS_RUSTBORO 399 // MUS_GOTOWN
+#define MUS_POKE_CENTER 400 // MUS_POKECEN
+#define MUS_ROUTE104 401 // MUS_NEXTROAD
+#define MUS_ROUTE119 402 // MUS_GRANROAD
+#define MUS_CYCLING 403 // MUS_CYCLING
+#define MUS_POKE_MART 404 // MUS_FRIENDLY
+#define MUS_LITTLEROOT 405 // MUS_MISHIRO
+#define MUS_MT_CHIMNEY 406 // MUS_TOZAN
+#define MUS_ENCOUNTER_FEMALE 407 // MUS_GIRLEYE
+#define MUS_LILYCOVE 408 // MUS_MINAMO
+#define MUS_ROUTE111 409 // MUS_ASHROAD
+#define MUS_HELP 410 // MUS_EVENT0
+#define MUS_UNDERWATER 411 // MUS_DEEPDEEP
+#define MUS_VICTORY_TRAINER 412 // MUS_KACHI1
+#define MUS_TITLE 413 // MUS_TITLE3
+#define MUS_INTRO 414 // MUS_DEMO1
+#define MUS_ENCOUNTER_MAY 415 // MUS_GIRL_SUP
+#define MUS_ENCOUNTER_INTENSE 416 // MUS_HAGESHII
+#define MUS_ENCOUNTER_COOL 417 // MUS_KAKKOII
+#define MUS_ROUTE113 418 // MUS_KAZANBAI
+#define MUS_ENCOUNTER_AQUA 419 // MUS_AQA_0
+#define MUS_FOLLOW_ME 420 // MUS_TSURETEK
+#define MUS_ENCOUNTER_BRENDAN 421 // MUS_BOY_SUP
+#define MUS_EVER_GRANDE 422 // MUS_RAINBOW
+#define MUS_ENCOUNTER_SUSPICIOUS 423 // MUS_AYASII
+#define MUS_VICTORY_AQUA_MAGMA 424 // MUS_KACHI4
+#define MUS_CABLE_CAR 425 // MUS_ROPEWAY
+#define MUS_GAME_CORNER 426 // MUS_CASINO
+#define MUS_DEWFORD 427 // MUS_HIGHTOWN
+#define MUS_SAFARI_ZONE 428 // MUS_SAFARI
+#define MUS_VICTORY_ROAD 429 // MUS_C_ROAD
+#define MUS_AQUA_MAGMA_HIDEOUT 430 // MUS_AJITO
+#define MUS_SAILING 431 // MUS_M_BOAT
+#define MUS_MT_PYRE 432 // MUS_M_DUNGON
+#define MUS_SLATEPORT 433 // MUS_FINECITY
+#define MUS_MT_PYRE_EXTERIOR 434 // MUS_MACHUPI
+#define MUS_SCHOOL 435 // MUS_P_SCHOOL
+#define MUS_HALL_OF_FAME 436 // MUS_DENDOU
+#define MUS_FALLARBOR 437 // MUS_TONEKUSA
+#define MUS_SEALED_CHAMBER 438 // MUS_MABOROSI
+#define MUS_CONTEST_WINNER 439 // MUS_CON_FAN
+#define MUS_CONTEST 440 // MUS_CONTEST0
+#define MUS_ENCOUNTER_MAGMA 441 // MUS_MGM0
+#define MUS_INTRO_BATTLE 442 // MUS_T_BATTLE
+#define MUS_ABNORMAL_WEATHER 443 // MUS_OOAME (Replaces MUS_WEATHER_KYOGRE from R/S)
+#define MUS_WEATHER_GROUDON 444 // MUS_HIDERI (Unused, from R/S)
+#define MUS_SOOTOPOLIS 445 // MUS_RUNECITY
+#define MUS_CONTEST_RESULTS 446 // MUS_CON_K
+#define MUS_HALL_OF_FAME_ROOM 447 // MUS_EIKOU_R
+#define MUS_TRICK_HOUSE 448 // MUS_KARAKURI
+#define MUS_ENCOUNTER_TWINS 449 // MUS_HUTAGO
+#define MUS_ENCOUNTER_ELITE_FOUR 450 // MUS_SITENNOU
+#define MUS_ENCOUNTER_HIKER 451 // MUS_YAMA_EYE
+#define MUS_CONTEST_LOBBY 452 // MUS_CONLOBBY
+#define MUS_ENCOUNTER_INTERVIEWER 453 // MUS_INTER_V
+#define MUS_ENCOUNTER_CHAMPION 454 // MUS_DAIGO
+#define MUS_CREDITS 455 // MUS_THANKFOR
+#define MUS_END 456 // MUS_END
+#define MUS_B_FRONTIER 457 // MUS_B_FRONTIER
+#define MUS_B_ARENA 458 // MUS_B_ARENA
+#define MUS_OBTAIN_B_POINTS 459 // MUS_ME_POINTGET
+#define MUS_REGISTER_MATCH_CALL 460 // MUS_ME_TORE_EYE
+#define MUS_B_PYRAMID 461 // MUS_PYRAMID
+#define MUS_B_PYRAMID_TOP 462 // MUS_PYRAMID_TOP
+#define MUS_B_PALACE 463 // MUS_B_PALACE
+#define MUS_RAYQUAZA_APPEARS 464 // MUS_REKKUU_KOURIN
+#define MUS_B_TOWER 465 // MUS_SATTOWER
+#define MUS_OBTAIN_SYMBOL 466 // MUS_ME_SYMBOLGET
+#define MUS_B_DOME 467 // MUS_B_DOME
+#define MUS_B_PIKE 468 // MUS_B_TUBE
+#define MUS_B_FACTORY 469 // MUS_B_FACTORY
+#define MUS_VS_RAYQUAZA 470 // MUS_VS_REKKU (Identical to MUS_VS_KYOGRE_GROUDON)
+#define MUS_VS_FRONTIER_BRAIN 471 // MUS_VS_FRONT
+#define MUS_VS_MEW 472 // MUS_VS_MEW
+#define MUS_B_DOME_LOBBY 473 // MUS_B_DOME1
+#define MUS_VS_WILD 474 // MUS_BATTLE27
+#define MUS_VS_AQUA_MAGMA 475 // MUS_BATTLE31
+#define MUS_VS_TRAINER 476 // MUS_BATTLE20
+#define MUS_VS_GYM_LEADER 477 // MUS_BATTLE32
+#define MUS_VS_CHAMPION 478 // MUS_BATTLE33
+#define MUS_VS_REGI 479 // MUS_BATTLE36
+#define MUS_VS_KYOGRE_GROUDON 480 // MUS_BATTLE34
+#define MUS_VS_RIVAL 481 // MUS_BATTLE35
+#define MUS_VS_ELITE_FOUR 482 // MUS_BATTLE38
+#define MUS_VS_AQUA_MAGMA_LEADER 483 // MUS_BATTLE30
+// FRLG Music
+#define MUS_RG_FOLLOW_ME 484 // MUS_RG_ANNAI
+#define MUS_RG_GAME_CORNER 485 // MUS_RG_SLOT
+#define MUS_RG_ROCKET_HIDEOUT 486 // MUS_RG_AJITO
+#define MUS_RG_GYM 487 // MUS_RG_GYM
+#define MUS_RG_JIGGLYPUFF 488 // MUS_RG_PURIN
+#define MUS_RG_INTRO_FIGHT 489 // MUS_RG_DEMO
+#define MUS_RG_TITLE 490 // MUS_RG_TITLE
+#define MUS_RG_CINNABAR 491 // MUS_RG_GUREN
+#define MUS_RG_LAVENDER 492 // MUS_RG_SHION
+#define MUS_RG_HEAL 493 // MUS_RG_KAIHUKU
+#define MUS_RG_CYCLING 494 // MUS_RG_CYCLING
+#define MUS_RG_ENCOUNTER_ROCKET 495 // MUS_RG_ROCKET
+#define MUS_RG_ENCOUNTER_GIRL 496 // MUS_RG_SHOUJO
+#define MUS_RG_ENCOUNTER_BOY 497 // MUS_RG_SHOUNEN
+#define MUS_RG_HALL_OF_FAME 498 // MUS_RG_DENDOU
+#define MUS_RG_VIRIDIAN_FOREST 499 // MUS_RG_T_MORI
+#define MUS_RG_MT_MOON 500 // MUS_RG_OTSUKIMI
+#define MUS_RG_POKE_MANSION 501 // MUS_RG_POKEYASHI
+#define MUS_RG_CREDITS 502 // MUS_RG_ENDING
+#define MUS_RG_ROUTE1 503 // MUS_RG_LOAD01
+#define MUS_RG_ROUTE24 504 // MUS_RG_OPENING
+#define MUS_RG_ROUTE3 505 // MUS_RG_LOAD02
+#define MUS_RG_ROUTE11 506 // MUS_RG_LOAD03
+#define MUS_RG_VICTORY_ROAD 507 // MUS_RG_CHAMP_R
+#define MUS_RG_VS_GYM_LEADER 508 // MUS_RG_VS_GYM
+#define MUS_RG_VS_TRAINER 509 // MUS_RG_VS_TORE
+#define MUS_RG_VS_WILD 510 // MUS_RG_VS_YASEI
+#define MUS_RG_VS_CHAMPION 511 // MUS_RG_VS_LAST
+#define MUS_RG_PALLET 512 // MUS_RG_MASARA
+#define MUS_RG_OAK_LAB 513 // MUS_RG_KENKYU
+#define MUS_RG_OAK 514 // MUS_RG_OHKIDO
+#define MUS_RG_POKE_CENTER 515 // MUS_RG_POKECEN
+#define MUS_RG_SS_ANNE 516 // MUS_RG_SANTOAN
+#define MUS_RG_SURF 517 // MUS_RG_NAMINORI
+#define MUS_RG_POKE_TOWER 518 // MUS_RG_P_TOWER
+#define MUS_RG_SILPH 519 // MUS_RG_SHIRUHU
+#define MUS_RG_FUCHSIA 520 // MUS_RG_HANADA
+#define MUS_RG_CELADON 521 // MUS_RG_TAMAMUSI
+#define MUS_RG_VICTORY_TRAINER 522 // MUS_RG_WIN_TRE (Identical to MUS_VICTORY_TRAINER)
+#define MUS_RG_VICTORY_WILD 523 // MUS_RG_WIN_YASEI (Identical to MUS_VICTORY_WILD)
+#define MUS_RG_VICTORY_GYM_LEADER 524 // MUS_RG_WIN_GYM (Identical to MUS_VICTORY_GYM_LEADER)
+#define MUS_RG_VERMILLION 525 // MUS_RG_KUCHIBA
+#define MUS_RG_PEWTER 526 // MUS_RG_NIBI
+#define MUS_RG_ENCOUNTER_RIVAL 527 // MUS_RG_RIVAL1
+#define MUS_RG_RIVAL_EXIT 528 // MUS_RG_RIVAL2
+#define MUS_RG_DEX_RATING 529 // MUS_RG_FAN2
+#define MUS_RG_OBTAIN_KEY_ITEM 530 // MUS_RG_FAN5
+#define MUS_RG_CAUGHT_INTRO 531 // MUS_RG_FAN6
+#define MUS_RG_PHOTO 532 // MUS_ME_RG_PHOTO
+#define MUS_RG_GAME_FREAK 533 // MUS_RG_TITLEROG
+#define MUS_RG_CAUGHT 534 // MUS_RG_GET_YASEI
+#define MUS_RG_NEW_GAME_INSTRUCT 535 // MUS_RG_SOUSA
+#define MUS_RG_NEW_GAME_INTRO 536 // MUS_RG_SEKAIKAN
+#define MUS_RG_NEW_GAME_EXIT 537 // MUS_RG_SEIBETU
+#define MUS_RG_POKE_JUMP 538 // MUS_RG_JUMP
+#define MUS_RG_UNION_ROOM 539 // MUS_RG_UNION
+#define MUS_RG_NET_CENTER 540 // MUS_RG_NETWORK
+#define MUS_RG_MYSTERY_GIFT 541 // MUS_RG_OKURIMONO
+#define MUS_RG_BERRY_PICK 542 // MUS_RG_KINOMIKUI
+#define MUS_RG_SEVII_CAVE 543 // MUS_RG_NANADUNGEON (Identical to MUS_RG_MT_MOON)
+#define MUS_RG_TEACHY_TV_SHOW 544 // MUS_RG_OSHIE_TV (Identical to MUS_RG_FOLLOW_ME)
+#define MUS_RG_SEVII_ROUTE 545 // MUS_RG_NANASHIMA
+#define MUS_RG_SEVII_DUNGEON 546 // MUS_RG_NANAISEKI (Identical to MUS_RG_VIRIDIAN_FOREST)
+#define MUS_RG_SEVII_123 547 // MUS_RG_NANA123 (Identical to MUS_RG_PEWTER)
+#define MUS_RG_SEVII_45 548 // MUS_RG_NANA45
+#define MUS_RG_SEVII_67 549 // MUS_RG_NANA67
+#define MUS_RG_POKE_FLUTE 550 // MUS_RG_POKEFUE
+#define MUS_RG_VS_DEOXYS 551 // MUS_RG_VS_DEO
+#define MUS_RG_VS_MEWTWO 552 // MUS_RG_VS_MYU2
+#define MUS_RG_VS_LEGEND 553 // MUS_RG_VS_DEN
+#define MUS_RG_ENCOUNTER_GYM_LEADER 554 // MUS_RG_EXEYE
+#define MUS_RG_ENCOUNTER_DEOXYS 555 // MUS_RG_DEOEYE
+#define MUS_RG_TRAINER_TOWER 556 // MUS_RG_T_TOWER
+#define MUS_RG_SLOW_PALLET 557 // MUS_RG_SLOWMASARA
+#define MUS_RG_TEACHY_TV_MENU 558 // MUS_RG_TVNOIZE
-#define MUS_NONE 0xFFFF
+#define PH_TRAP_BLEND 559
+#define PH_TRAP_HELD 560
+#define PH_TRAP_SOLO 561
+#define PH_FACE_BLEND 562
+#define PH_FACE_HELD 563
+#define PH_FACE_SOLO 564
+#define PH_CLOTH_BLEND 565
+#define PH_CLOTH_HELD 566
+#define PH_CLOTH_SOLO 567
+#define PH_DRESS_BLEND 568
+#define PH_DRESS_HELD 569
+#define PH_DRESS_SOLO 570
+#define PH_FLEECE_BLEND 571
+#define PH_FLEECE_HELD 572
+#define PH_FLEECE_SOLO 573
+#define PH_KIT_BLEND 574
+#define PH_KIT_HELD 575
+#define PH_KIT_SOLO 576
+#define PH_PRICE_BLEND 577
+#define PH_PRICE_HELD 578
+#define PH_PRICE_SOLO 579
+#define PH_LOT_BLEND 580
+#define PH_LOT_HELD 581
+#define PH_LOT_SOLO 582
+#define PH_GOAT_BLEND 583
+#define PH_GOAT_HELD 584
+#define PH_GOAT_SOLO 585
+#define PH_THOUGHT_BLEND 586
+#define PH_THOUGHT_HELD 587
+#define PH_THOUGHT_SOLO 588
+#define PH_CHOICE_BLEND 589
+#define PH_CHOICE_HELD 590
+#define PH_CHOICE_SOLO 591
+#define PH_MOUTH_BLEND 592
+#define PH_MOUTH_HELD 593
+#define PH_MOUTH_SOLO 594
+#define PH_FOOT_BLEND 595
+#define PH_FOOT_HELD 596
+#define PH_FOOT_SOLO 597
+#define PH_GOOSE_BLEND 598
+#define PH_GOOSE_HELD 599
+#define PH_GOOSE_SOLO 600
+#define PH_STRUT_BLEND 601
+#define PH_STRUT_HELD 602
+#define PH_STRUT_SOLO 603
+#define PH_CURE_BLEND 604
+#define PH_CURE_HELD 605
+#define PH_CURE_SOLO 606
+#define PH_NURSE_BLEND 607
+#define PH_NURSE_HELD 608
+#define PH_NURSE_SOLO 609
+
+#define MUS_ROUTE118 0x7FFF // Map is split into 2 music sections. controlled by GetCurrLocationDefaultMusic().
+
+#define MUS_NONE 0xFFFF
#endif // GUARD_CONSTANTS_SONGS_H
diff --git a/include/constants/trainer_hill.h b/include/constants/trainer_hill.h
index afbcd4ace..27357e99c 100644
--- a/include/constants/trainer_hill.h
+++ b/include/constants/trainer_hill.h
@@ -22,7 +22,7 @@
#define TRAINER_HILL_FUNC_GET_CHALLENGE_STATUS 6
#define TRAINER_HILL_FUNC_GET_CHALLENGE_TIME 7
#define TRAINER_HILL_FUNC_GET_ALL_FLOORS_USED 8
-#define TRAINER_HILL_FUNC_CLEAR_RESULT 9
+#define TRAINER_HILL_FUNC_GET_IN_EREADER_MODE 9
#define TRAINER_HILL_FUNC_IN_CHALLENGE 10
#define TRAINER_HILL_FUNC_POST_BATTLE_TEXT 11
#define TRAINER_HILL_FUNC_SET_ALL_TRAINER_FLAGS 12
diff --git a/include/constants/trainers.h b/include/constants/trainers.h
index 541b131ca..3f22c7cef 100644
--- a/include/constants/trainers.h
+++ b/include/constants/trainers.h
@@ -13,7 +13,7 @@
#define TRAINER_PLAYER 1023
#define TRAINER_SECRET_BASE 1024
#define TRAINER_LINK_OPPONENT 2048
-#define TRAINER_OPPONENT_C00 3072
+#define TRAINER_UNION_ROOM 3072
#define TRAINER_STEVEN_PARTNER 3075
#define TRAINER_PIC_HIKER 0
diff --git a/include/constants/tv.h b/include/constants/tv.h
index 6f686f727..4b5f9115b 100644
--- a/include/constants/tv.h
+++ b/include/constants/tv.h
@@ -133,5 +133,59 @@
#define NUM_SECRET_BASE_FLAGS 32 // by definition, bitfield of 2 u16s
+// TV Show states for Pokemon Contest Live Updates
+#define CONTESTLIVE_STATE_INTRO 0
+#define CONTESTLIVE_STATE_WON_BOTH_ROUNDS 1
+#define CONTESTLIVE_STATE_BETTER_ROUND2 2
+#define CONTESTLIVE_STATE_EQUAL_ROUNDS 3
+#define CONTESTLIVE_STATE_BETTER_ROUND1 4
+#define CONTESTLIVE_STATE_GOT_NERVOUS 5
+#define CONTESTLIVE_STATE_STARTLED_OTHER 6
+#define CONTESTLIVE_STATE_USED_COMBO 7
+#define CONTESTLIVE_STATE_EXCITING_APPEAL 8
+#define CONTESTLIVE_STATE_COOL 9
+#define CONTESTLIVE_STATE_BEAUTIFUL 10
+#define CONTESTLIVE_STATE_CUTE 11
+#define CONTESTLIVE_STATE_SMART 12
+#define CONTESTLIVE_STATE_TOUGH 13
+#define CONTESTLIVE_STATE_VERY_EXCITING_APPEAL 14
+#define CONTESTLIVE_STATE_VERY_COOL 15
+#define CONTESTLIVE_STATE_VERY_BEAUTIFUL 16
+#define CONTESTLIVE_STATE_VERY_CUTE 17
+#define CONTESTLIVE_STATE_VERY_SMART 18
+#define CONTESTLIVE_STATE_VERY_TOUGH 19
+#define CONTESTLIVE_STATE_TOOK_BREAK 20
+#define CONTESTLIVE_STATE_GOT_STARTLED 21
+#define CONTESTLIVE_STATE_USED_MOVE 22
+#define CONTESTLIVE_STATE_TALK_ABOUT_LOSER 23
+#define CONTESTLIVE_STATE_NO_APPEALS 24
+#define CONTESTLIVE_STATE_LAST_BOTH 25
+#define CONTESTLIVE_STATE_NOT_EXCITING_ENOUGH 26
+#define CONTESTLIVE_STATE_LOST_AFTER_ROUND1_WIN 27
+#define CONTESTLIVE_STATE_NO_EXCITING_APPEALS 28
+#define CONTESTLIVE_STATE_LOST_SMALL_MARGIN 29
+#define CONTESTLIVE_STATE_REPEATED_APPEALS 30
+#define CONTESTLIVE_STATE_LOST 31
+#define CONTESTLIVE_STATE_OUTRO 32
+
+// Flags used to comment on winner
+#define CONTESTLIVE_FLAG_EXCITING_APPEAL (1 << 0)
+#define CONTESTLIVE_FLAG_GOT_NERVOUS (1 << 1)
+#define CONTESTLIVE_FLAG_MAXED_EXCITEMENT (1 << 2)
+#define CONTESTLIVE_FLAG_USED_COMBO (1 << 3)
+#define CONTESTLIVE_FLAG_STARTLED_OTHER (1 << 4)
+#define CONTESTLIVE_FLAG_SKIPPED_TURN (1 << 5)
+#define CONTESTLIVE_FLAG_GOT_STARTLED (1 << 6)
+#define CONTESTLIVE_FLAG_MADE_APPEAL (1 << 7)
+
+// Flags used to comment on loser
+#define CONTESTLIVE_FLAG_LOST (1 << 0)
+#define CONTESTLIVE_FLAG_REPEATED_MOVE (1 << 1)
+#define CONTESTLIVE_FLAG_LOST_SMALL_MARGIN (1 << 2)
+#define CONTESTLIVE_FLAG_NO_EXCITEMENT (1 << 3)
+#define CONTESTLIVE_FLAG_BLEW_LEAD (1 << 4)
+#define CONTESTLIVE_FLAG_MISSED_EXCITEMENT (1 << 5)
+#define CONTESTLIVE_FLAG_LAST_BOTH_ROUNDS (1 << 6)
+#define CONTESTLIVE_FLAG_NO_APPEALS (1 << 7)
#endif //GUARD_CONSTANTS_TV_H
diff --git a/include/constants/union_room.h b/include/constants/union_room.h
index 2314f85a0..d867fb340 100644
--- a/include/constants/union_room.h
+++ b/include/constants/union_room.h
@@ -1,6 +1,60 @@
#ifndef GUARD_CONSTANTS_UNION_ROOM_H
#define GUARD_CONSTANTS_UNION_ROOM_H
+#define MAX_UNION_ROOM_PLAYERS 8
+
+#define UNION_ROOM_SPAWN_NONE 0
+#define UNION_ROOM_SPAWN_IN 1
+#define UNION_ROOM_SPAWN_OUT 2
+
+#define ACTIVITY_NONE 0
+#define ACTIVITY_BATTLE_SINGLE 1
+#define ACTIVITY_BATTLE_DOUBLE 2
+#define ACTIVITY_BATTLE_MULTI 3
+#define ACTIVITY_TRADE 4
+#define ACTIVITY_CHAT 5
+#define ACTIVITY_WONDER_CARD 6
+#define ACTIVITY_WONDER_NEWS 7
+#define ACTIVITY_CARD 8
+#define ACTIVITY_POKEMON_JUMP 9
+#define ACTIVITY_BERRY_CRUSH 10
+#define ACTIVITY_BERRY_PICK 11
+#define ACTIVITY_SEARCH 12
+#define ACTIVITY_SPIN_TRADE 13
+#define ACTIVITY_BATTLE_TOWER_OPEN 14
+#define ACTIVITY_RECORD_CORNER 15
+#define ACTIVITY_BERRY_BLENDER 16
+
+// Player response
+#define ACTIVITY_ACCEPT 17
+#define ACTIVITY_DECLINE 18
+
+#define ACTIVITY_NPCTALK 19
+#define ACTIVITY_PLYRTALK 20
+
+// Duplicate IDs?
+#define ACTIVITY_WONDER_CARD2 21
+#define ACTIVITY_WONDER_NEWS2 22
+
+#define ACTIVITY_CONTEST_COOL 23
+#define ACTIVITY_CONTEST_BEAUTY 24
+#define ACTIVITY_CONTEST_CUTE 25
+#define ACTIVITY_CONTEST_SMART 26
+#define ACTIVITY_CONTEST_TOUGH 27
+#define ACTIVITY_BATTLE_TOWER 28
+#define ACTIVITY_29 29
+
+#define IN_UNION_ROOM (1 << 6)
+
+// Used in UR_AddTextPrinterParameterized
+#define UR_COLOR_DKE_WHT_LTE 0
+#define UR_COLOR_RED_WHT_LTR 1
+#define UR_COLOR_GRN_WHT_LTG 2
+#define UR_COLOR_WHT_WHT_LTE 3
+#define UR_COLOR_WHT_DKE_LTE 4
+#define UR_COLOR_GRN_DN6_LTB 5
+#define UR_COLOR_DN5_DN6_LTB 6
+
#define LINK_GROUP_SINGLE_BATTLE 0
#define LINK_GROUP_DOUBLE_BATTLE 1
#define LINK_GROUP_MULTI_BATTLE 2
@@ -10,8 +64,8 @@
#define LINK_GROUP_BERRY_PICKING 6
#define LINK_GROUP_WONDER_CARD 7
#define LINK_GROUP_WONDER_NEWS 8
-#define LINK_GROUP_UNK_9 9
-#define LINK_GROUP_UNK_10 10
+#define LINK_GROUP_UNION_ROOM_RESUME 9
+#define LINK_GROUP_UNION_ROOM_INIT 10
#define LINK_GROUP_UNK_11 11
#define LINK_GROUP_RECORD_CORNER 12
#define LINK_GROUP_BERRY_BLENDER 13
@@ -25,4 +79,24 @@
#define LINK_GROUP_BATTLE_TOWER_OPEN 21
#define NUM_LINK_GROUP_TYPES 22
+#define UR_TRADE_MATCH 0
+#define UR_TRADE_NOTYPE 1
+#define UR_TRADE_NOEGG 2
+
+#define UR_TRADE_READY 0
+#define UR_TRADE_PLAYER_NOT_READY 1
+#define UR_TRADE_PARTNER_NOT_READY 2
+
+#define UR_INTERACT_PLAYER_1 1
+#define UR_INTERACT_PLAYER_2 2
+#define UR_INTERACT_PLAYER_3 3
+#define UR_INTERACT_PLAYER_4 4
+#define UR_INTERACT_PLAYER_5 5
+#define UR_INTERACT_PLAYER_6 6
+#define UR_INTERACT_PLAYER_7 7
+#define UR_INTERACT_PLAYER_8 8
+#define UR_INTERACT_ATTENDANT 9
+#define UR_INTERACT_UNUSED 10
+#define UR_INTERACT_START_MENU 11
+
#endif //GUARD_CONSTANTS_UNION_ROOM_H
diff --git a/include/constants/vars.h b/include/constants/vars.h
index 4a38bde81..625c37aa9 100644
--- a/include/constants/vars.h
+++ b/include/constants/vars.h
@@ -274,6 +274,7 @@
#define VAR_UNUSED_0x40FF 0x40FF // Unused Var
#define VARS_END 0x40FF
+#define VARS_COUNT (VARS_END - VARS_START + 1)
#define SPECIAL_VARS_START 0x8000
// special vars
diff --git a/include/contest.h b/include/contest.h
index 00c3191eb..1dd4340bd 100644
--- a/include/contest.h
+++ b/include/contest.h
@@ -6,135 +6,6 @@
enum
{
- CONTEST_DEBUG_MODE_OFF,
- // Prints the totalPoints value for each contestant.
- CONTEST_DEBUG_MODE_PRINT_POINT_TOTAL,
- // Prints the ContestResourcesField1C::unk_C value as a bitstring for each contestant.
- CONTEST_DEBUG_MODE_PRINT_UNK_C,
- // Prints the ContestResourcesField1C::unk_D value as a bitstring for each contestant.
- CONTEST_DEBUG_MODE_PRINT_UNK_D
-};
-
-enum
-{
- CONTEST_EFFECT_HIGHLY_APPEALING,
- CONTEST_EFFECT_USER_MORE_EASILY_STARTLED,
- CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES,
- CONTEST_EFFECT_REPETITION_NOT_BORING,
- CONTEST_EFFECT_AVOID_STARTLE_ONCE,
- CONTEST_EFFECT_AVOID_STARTLE,
- CONTEST_EFFECT_AVOID_STARTLE_SLIGHTLY,
- CONTEST_EFFECT_USER_LESS_EASILY_STARTLED,
- CONTEST_EFFECT_STARTLE_FRONT_MON,
- CONTEST_EFFECT_SLIGHTLY_STARTLE_PREV_MONS,
- CONTEST_EFFECT_STARTLE_PREV_MON,
- CONTEST_EFFECT_STARTLE_PREV_MONS,
- CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON,
- CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS,
- CONTEST_EFFECT_STARTLE_PREV_MON_2,
- CONTEST_EFFECT_STARTLE_PREV_MONS_2,
- CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION,
- CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION,
- CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN,
- CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL,
- CONTEST_EFFECT_STARTLE_MONS_COOL_APPEAL,
- CONTEST_EFFECT_STARTLE_MONS_BEAUTY_APPEAL,
- CONTEST_EFFECT_STARTLE_MONS_CUTE_APPEAL,
- CONTEST_EFFECT_STARTLE_MONS_SMART_APPEAL,
- CONTEST_EFFECT_STARTLE_MONS_TOUGH_APPEAL,
- CONTEST_EFFECT_MAKE_FOLLOWING_MON_NERVOUS,
- CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS,
- CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS,
- CONTEST_EFFECT_BADLY_STARTLES_MONS_IN_GOOD_CONDITION,
- CONTEST_EFFECT_BETTER_IF_FIRST,
- CONTEST_EFFECT_BETTER_IF_LAST,
- CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES,
- CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE,
- CONTEST_EFFECT_BETTER_WHEN_LATER,
- CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING,
- CONTEST_EFFECT_BETTER_IF_SAME_TYPE,
- CONTEST_EFFECT_BETTER_IF_DIFF_TYPE,
- CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL,
- CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS,
- CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION,
- CONTEST_EFFECT_NEXT_APPEAL_EARLIER,
- CONTEST_EFFECT_NEXT_APPEAL_LATER,
- CONTEST_EFFECT_MAKE_SCRAMBLING_TURN_ORDER_EASIER,
- CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER,
- CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST,
- CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS,
- CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED,
- CONTEST_EFFECT_DONT_EXCITE_AUDIENCE
-};
-
-enum
-{
- COMBO_STARTER_RAIN_DANCE = 1,
- COMBO_STARTER_RAGE,
- COMBO_STARTER_FOCUS_ENERGY,
- COMBO_STARTER_HYPNOSIS,
- COMBO_STARTER_ENDURE,
- COMBO_STARTER_HORN_ATTACK,
- COMBO_STARTER_SWORDS_DANCE,
- COMBO_STARTER_STOCKPILE,
- COMBO_STARTER_SUNNY_DAY,
- COMBO_STARTER_REST,
- COMBO_STARTER_VICE_GRIP,
- COMBO_STARTER_DEFENSE_CURL,
- COMBO_STARTER_CHARGE,
- COMBO_STARTER_ROCK_THROW,
- COMBO_STARTER_YAWN,
- COMBO_STARTER_SCARY_FACE,
- COMBO_STARTER_POWDER_SNOW,
- COMBO_STARTER_LOCK_ON,
- COMBO_STARTER_SOFT_BOILED,
- COMBO_STARTER_MEAN_LOOK,
- COMBO_STARTER_SCRATCH,
- COMBO_STARTER_GROWTH,
- COMBO_STARTER_HAIL,
- COMBO_STARTER_SANDSTORM,
- COMBO_STARTER_BELLY_DRUM,
- COMBO_STARTER_MIND_READER,
- COMBO_STARTER_DRAGON_BREATH,
- COMBO_STARTER_DRAGON_RAGE,
- COMBO_STARTER_DRAGON_DANCE,
- COMBO_STARTER_SURF,
- COMBO_STARTER_DIVE,
- COMBO_STARTER_STRING_SHOT,
- COMBO_STARTER_LEER,
- COMBO_STARTER_TAUNT,
- COMBO_STARTER_CHARM,
- COMBO_STARTER_HARDEN,
- COMBO_STARTER_SING,
- COMBO_STARTER_EARTHQUAKE,
- COMBO_STARTER_DOUBLE_TEAM,
- COMBO_STARTER_CURSE,
- COMBO_STARTER_SWEET_SCENT,
- COMBO_STARTER_SLUDGE,
- COMBO_STARTER_SLUDGE_BOMB,
- COMBO_STARTER_THUNDER_PUNCH,
- COMBO_STARTER_FIRE_PUNCH,
- COMBO_STARTER_ICE_PUNCH,
- COMBO_STARTER_PECK,
- COMBO_STARTER_METAL_SOUND,
- COMBO_STARTER_MUD_SPORT,
- COMBO_STARTER_WATER_SPORT,
- COMBO_STARTER_BONE_CLUB,
- COMBO_STARTER_BONEMERANG,
- COMBO_STARTER_BONE_RUSH,
- COMBO_STARTER_SAND_ATTACK,
- COMBO_STARTER_MUD_SLAP,
- COMBO_STARTER_FAKE_OUT,
- COMBO_STARTER_PSYCHIC,
- COMBO_STARTER_KINESIS,
- COMBO_STARTER_CONFUSION,
- COMBO_STARTER_POUND,
- COMBO_STARTER_SMOG,
- COMBO_STARTER_CALM_MIND
-};
-
-enum
-{
CONTEST_STRING_MORE_CONSCIOUS,
CONTEST_STRING_NO_APPEAL,
CONTEST_STRING_SETTLE_DOWN,
@@ -206,29 +77,38 @@ enum {
CONTEST_FILTER_ONLY_POSTGAME
};
+// Constants for changing in-contest Condition (the stars that appear during appeals)
+enum {
+ CONDITION_NO_CHANGE,
+ CONDITION_GAIN,
+ CONDITION_LOSE,
+};
+
struct ContestPokemon
{
- /*0x00*/ u16 species;
- /*0x02*/ u8 nickname[POKEMON_NAME_LENGTH + 1];
- /*0x0D*/ u8 trainerName[PLAYER_NAME_LENGTH + 1];
- /*0x15*/ u8 trainerGfxId;
- /*0x18*/ u32 aiChecks;
- /*0x1C*/ u8 whichRank:2; // 0x1 0x2
- u8 aiPool_Cool:1; // 0x4
- u8 aiPool_Beauty:1; // 0x8
- u8 aiPool_Cute:1; // 0x10
- u8 aiPool_Smart:1; // 0x20
- u8 aiPool_Tough:1; // 0x40
- /*0x1E*/ u16 moves[MAX_MON_MOVES]; // moves
- /*0x26*/ u8 cool; // cool
- /*0x27*/ u8 beauty; // beauty
- /*0x28*/ u8 cute; // cute
- /*0x29*/ u8 smart; // smart
- /*0x2A*/ u8 tough; // tough
- /*0x2B*/ u8 sheen; // sheen
- /*0x2C*/ u8 unk2C[12];
- /*0x38*/ u32 personality; // personality
- /*0x3C*/ u32 otId; // otId
+ u16 species;
+ u8 nickname[POKEMON_NAME_LENGTH + 1];
+ u8 trainerName[PLAYER_NAME_LENGTH + 1];
+ u8 trainerGfxId;
+ u32 aiFlags;
+ u8 whichRank:2;
+ u8 aiPool_Cool:1;
+ u8 aiPool_Beauty:1;
+ u8 aiPool_Cute:1;
+ u8 aiPool_Smart:1;
+ u8 aiPool_Tough:1;
+ u16 moves[MAX_MON_MOVES];
+ u8 cool;
+ u8 beauty;
+ u8 cute;
+ u8 smart;
+ u8 tough;
+ u8 sheen;
+ u8 highestRank;
+ bool8 gameCleared;
+ u8 unused[10];
+ u32 personality;
+ u32 otId;
};
struct Shared1A004
@@ -239,101 +119,101 @@ struct Shared1A004
u8 savedJunk[0x800];
};
-struct ContestStruct_field_18
+struct ContestMoveAnimData
{
u16 species;
- u16 unk2;
- u8 unk4_0:1;
- u8 unk5;
- u32 unk8;
- u32 unkC;
- u32 unk10;
+ u16 targetSpecies;
+ bool8 hasTargetAnim:1;
+ u8 contestant;
+ u32 personality;
+ u32 otId;
+ u32 targetPersonality;
};
struct Contest
{
- /*0x0*/ u8 playerMoveChoice;
- /*0x1*/ u8 turnNumber;
- /*0x2*/ u8 unused2[CONTESTANT_COUNT];
- /*0x6*/ u16 unk1920A_0:1; // Task active flags?
- u16 unk1920A_1:1;
- u16 unk1920A_2:1;
- u16 unk1920A_3:1;
- u16 unk1920A_4:1;
- u16 isShowingApplauseMeter:1;
- u16 applauseMeterIsMoving:1;
- u16 unk1920A_7:1;
- /*0x7*/ u16 unk1920B_0:1;
- u16 unk1920B_1:1;
- u16 unk1920B_2:1;
- /*0x8*/ u8 mainTaskId;
- /*0x9*/ u8 unk1920D[4];
- /*0xD*/ u8 unk19211;
- /*0xE*/ u8 unk19212;
- /*0xF*/ u8 filler19213;
- /*0x10*/ u8 unk19214;
- /*0x11*/ u8 unk19215;
- /*0x12*/ u8 unk19216; // sprite ID
- /*0x13*/ s8 applauseLevel;
- /*0x19218*/ u8 prevTurnOrder[CONTESTANT_COUNT];
- /*0x1921C*/ u32 unk1921C; // saved RNG value?
- u16 moveHistory[CONTEST_TURN_COUNT][CONTESTANT_COUNT];
- u8 excitementHistory[CONTEST_TURN_COUNT][CONTESTANT_COUNT];
+ u8 playerMoveChoice;
+ u8 appealNumber;
+ u8 unk[CONTESTANT_COUNT]; // never read
+ bool16 unused1:1;
+ bool16 unused2:1;
+ bool16 unused3:1;
+ bool16 unused4:1;
+ bool16 waitForJudgeSpeechBubble:1;
+ bool16 isShowingApplauseMeter:1;
+ bool16 applauseMeterIsMoving:1;
+ bool16 animatingAudience:1;
+ bool16 waitForAudienceBlend:1;
+ bool16 sliderHeartsAnimating:1; // When the slider heart is appearing/disappearing
+ bool16 waitForLink:1;
+ u8 mainTaskId;
+ u8 filler1[4];
+ u8 judgeAttentionTaskId;
+ u8 blendTaskId;
+ u8 filler2;
+ u8 turnNumber;
+ u8 currentContestant;
+ u8 judgeSpeechBubbleSpriteId;
+ s8 applauseLevel;
+ u8 prevTurnOrder[CONTESTANT_COUNT];
+ u32 unusedRng;
+ u16 moveHistory[CONTEST_NUM_APPEALS][CONTESTANT_COUNT];
+ u8 excitementHistory[CONTEST_NUM_APPEALS][CONTESTANT_COUNT];
u8 applauseMeterSpriteId;
- /*0x1925D*/ u8 contestSetupState;
- /*0x1925E*/ u8 unk1925E;
+ u8 contestSetupState;
+ u8 moveAnimTurnCount;
};
struct ContestantStatus
{
- /*0x00*/ s16 appeal1; // move appeal?
- /*0x02*/ s16 appeal2; // final appeal after end of turn, maybe?
- /*0x04*/ s16 pointTotal;
- /*0x06*/ u16 currMove;
- /*0x08*/ u16 prevMove;
- /*0x0A*/ u8 moveCategory;
- /*0x0B*/ u8 ranking:2;
- u8 unkB_2:2;
+ s16 baseAppeal;
+ s16 appeal;
+ s16 pointTotal;
+ u16 currMove;
+ u16 prevMove;
+ u8 moveCategory;
+ u8 ranking:2;
+ u8 unused1:2;
u8 moveRepeatCount:3;
- u8 noMoreTurns:1; // used a one-time move?
- /*0x0C*/ u8 nervous:1;
+ bool8 noMoreTurns:1; // used a one-time move?
+ bool8 nervous:1;
u8 numTurnsSkipped:2;
- /*0x0D*/ s8 condition;
- /*0x0E*/ u8 jam;
- /*0x0F*/ u8 jamReduction;
+ s8 condition;
+ u8 jam;
+ u8 jamReduction;
// Flags set by move effect
- /*0x10*/ u8 resistant:1;
- u8 immune:1;
- u8 moreEasilyStartled:1;
- u8 usedRepeatableMove:1;
+ bool8 resistant:1;
+ bool8 immune:1;
+ bool8 moreEasilyStartled:1;
+ bool8 usedRepeatableMove:1;
u8 conditionMod:2; // 1: just raised condition; 2: appeal greatly improved by condition
u8 turnOrderMod:2; // 1: defined; 2: random
- /*0x11*/ u8 turnOrderModAction:2; // 1: made first; 2: made last; 3: made random
- u8 turnSkipped:1;
- u8 exploded:1;
- u8 overrideCategoryExcitementMod:1;
- u8 appealTripleCondition:1;
+ u8 turnOrderModAction:2; // 1: made first; 2: made last; 3: made random
+ bool8 turnSkipped:1;
+ bool8 exploded:1;
+ bool8 overrideCategoryExcitementMod:1;
+ bool8 appealTripleCondition:1;
- /*0x12*/ u8 jamSafetyCount;
- /*0x13*/ u8 effectStringId; // status action?
- /*0x14*/ u8 effectStringId2;
- /*0x15*/ u8 disappointedRepeat:1;
- u8 unk15_1:1;
- u8 unk15_2:1;
- u8 unk15_3:1;
- u8 hasJudgesAttention:1;
- u8 judgesAttentionWasRemoved:1;
- u8 unk15_6:1;
- /*0x16*/ u8 unk16;
- /*0x17*/ u8 unk17;
- /*0x18*/ u8 unk18;
- /*0x19*/ u8 nextTurnOrder; // turn position
- /*0x1A*/ u8 attentionLevel; // How much the Pokemon "stood out"
- /*0x1B*/ u8 unk1B;
+ u8 jamSafetyCount;
+ u8 effectStringId; // status action?
+ u8 effectStringId2;
+ bool8 repeatedMove:1;
+ bool8 unused2:1;
+ bool8 repeatedPrevMove:1; // never read
+ bool8 completedComboFlag:1;
+ bool8 hasJudgesAttention:1;
+ bool8 judgesAttentionWasRemoved:1;
+ bool8 usedComboMove:1;
+ bool8 completedCombo;
+ u8 comboAppealBonus;
+ u8 repeatJam;
+ u8 nextTurnOrder; // turn position
+ u8 attentionLevel; // How much the Pokemon "stood out"
+ u8 contestantAnimTarget;
};
-struct UnknownContestStruct7
+struct ContestAppealMoveResults
{
u8 turnOrder[CONTESTANT_COUNT];
s16 jam;
@@ -348,97 +228,97 @@ struct ContestAIInfo
/*0x00*/ u8 aiState;
/*0x02*/ u16 nextMove;
/*0x04*/ u8 nextMoveIndex;
- /*0x05*/ u8 unk5[4];
+ /*0x05*/ u8 moveScores[MAX_MON_MOVES];
/*0x09*/ u8 aiAction;
- /*0x0A*/ u8 fillerA[0x6]; // TODO: don't know what's here
- /*0x10*/ u8 currentAICheck;
- /*0x14*/ u32 aiChecks;
+ /*0x0A*/ u8 filler[6];
+ /*0x10*/ u8 currentAIFlag;
+ /*0x14*/ u32 aiFlags;
/*0x18*/ s16 scriptResult;
- /*0x1A*/ s16 scriptArr[3];
+ /*0x1A*/ s16 vars[3];
/*0x20*/ const u8 *stack[8];
/*0x40*/ u8 stackSize;
/*0x41*/ u8 contestantId;
};
-struct UnknownContestStruct5
+struct ContestExcitement
{
- s8 bits_0; // current move excitement?
- u8 excitementFrozen:1;
- u8 excitementFreezer:3;
- s8 unk2;
+ s8 moveExcitement;
+ u8 frozen:1;
+ u8 freezer:3;
+ s8 excitementAppealBonus;
};
-struct UnknownContestStruct4
+struct ContestGraphicsState
{
- u8 unk0; // sprite ID
- u8 unk1; // sprite ID
- u8 unk2_0:1;
- u8 unk2_1:1;
- u8 unk2_2:1;
+ u8 sliderHeartSpriteId;
+ u8 nextTurnSpriteId;
+ bool8 sliderUpdating:1;
+ bool8 boxBlinking:1;
+ bool8 updatingAppealHearts:1;
};
-struct UnknownContestStruct6
+struct ContestFinalStandings
{
- s32 unk0;
- s32 unk4;
- s32 unk8;
- s32 unkC;
+ s32 totalPoints;
+ s32 round1Points;
+ s32 random;
+ s32 contestant;
};
-struct ContestResourcesField1C
+struct ContestTV
{
- u16 unk0[5];
- s16 unkA;
- u8 unkC;
- u8 unkD;
- u8 unkE_1:1;
- u8 unkE_2:1;
+ u16 appeals[CONTEST_NUM_APPEALS];
+ s16 move;
+ u8 winnerFlags;
+ u8 loserFlags;
+ bool8 madeAppeal:1;
+ bool8 madeExcitingAppeal:1;
};
-struct ContestResourcesField20
+struct ContestUnused
{
- u8 filler_00[0x0C];
+ u8 filler[12];
};
struct ContestResources
{
struct Contest *contest;
struct ContestantStatus *status;
- struct UnknownContestStruct7 *field_8;
+ struct ContestAppealMoveResults *appealResults;
struct ContestAIInfo *aiData;
- struct UnknownContestStruct5 *field_10;
- struct UnknownContestStruct4 *field_14;
- struct ContestStruct_field_18 *field_18;
- struct ContestResourcesField1C * field_1c;
- struct ContestResourcesField20 * field_20;
+ struct ContestExcitement *excitement;
+ struct ContestGraphicsState *gfxState;
+ struct ContestMoveAnimData *moveAnim;
+ struct ContestTV *tv;
+ struct ContestUnused * unused;
u8 * contestBgTilemaps[CONTESTANT_COUNT];
- void * field_34;
- void * field_38;
+ void * boxBlinkTiles1;
+ void * boxBlinkTiles2;
void * field_3c;
};
#define eContest (*gContestResources->contest)
#define eContestantStatus (gContestResources->status)
-#define eContestResources8 (*gContestResources->field_8)
+#define eContestAppealResults (*gContestResources->appealResults)
#define eContestAI (*gContestResources->aiData)
-#define eContestResources10 (*gContestResources->field_10)
-#define eContestResources14 (*gContestResources->field_14)
-#define eUnzippedContestAudienceGfx (gHeap + 0x18000)
-#define eUnknownHeap19000 (gHeap + 0x19000)
+#define eContestExcitement (*gContestResources->excitement)
+#define eContestGfxState (gContestResources->gfxState)
+#define eUnzippedContestAudience_Gfx (gHeap + 0x18000)
+#define eContestAudienceFrame2_Gfx (gHeap + 0x19000)
#define eContestDebugMode (gHeap[0x1a000])
#define eUnknownHeap1A004 (*(struct Shared1A004 *)(gHeap + 0x1a004))
extern struct ContestPokemon gContestMons[CONTESTANT_COUNT];
-extern s16 gContestMonConditions[CONTESTANT_COUNT];
-extern s16 gUnknown_02039F08[CONTESTANT_COUNT];
-extern s16 gUnknown_02039F10[CONTESTANT_COUNT];
-extern s16 gUnknown_02039F18[CONTESTANT_COUNT];
+extern s16 gContestMonRound1Points[CONTESTANT_COUNT];
+extern s16 gContestMonTotalPoints[CONTESTANT_COUNT];
+extern s16 gContestMonAppealPointTotals[CONTESTANT_COUNT];
+extern s16 gContestMonRound2Points[CONTESTANT_COUNT];
extern u8 gContestFinalStandings[CONTESTANT_COUNT];
extern u8 gContestMonPartyIndex;
extern u8 gContestPlayerMonIndex;
extern u8 gContestantTurnOrder[CONTESTANT_COUNT];
extern u8 gLinkContestFlags;
-extern u8 gUnknown_02039F2B;
+extern u8 gContestLinkLeaderIndex;
extern u16 gSpecialVar_ContestCategory;
extern u16 gSpecialVar_ContestRank;
extern u8 gNumLinkContestPlayers;
@@ -448,18 +328,17 @@ extern u8 sContestBgCopyFlags;
extern struct ContestWinner gCurContestWinner;
extern u8 gUnknown_02039F5C;
extern u8 gUnknown_02039F5D;
-
extern u32 gContestRngValue;
// contest.c
void ResetLinkContestBoolean(void);
void LoadContestBgAfterMoveAnim(void);
void CB2_StartContest(void);
-void sub_80DA8C8(u8 partyIndex);
-void sub_80DAB8C(u8 contestType, u8 rank);
-void sub_80DACBC(u8 contestType, u8 rank, bool32 isPostgame);
+void CreateContestMonFromParty(u8 partyIndex);
+void SetContestants(u8 contestType, u8 rank);
+void SetLinkAIContestants(u8 contestType, u8 rank, bool32 isPostgame);
u8 GetContestEntryEligibility(struct Pokemon *pkmn);
-void sub_80DB09C(u8 contestCategory);
+void CalculateRound1Points(u8 contestCategory);
bool8 IsSpeciesNotUnown(u16 species);
bool8 Contest_IsMonsTurnDisabled(u8 a);
void SaveLinkContestResults(void);
@@ -469,24 +348,12 @@ void SetContestantEffectStringID2(u8 a, u8 b);
void SetStartledString(u8 contestant, u8 jam);
void MakeContestantNervous(u8 p);
s8 Contest_GetMoveExcitement(u16 move);
-bool8 sub_80DE1E8(u8 a);
+bool8 IsContestantAllowedToCombo(u8 contestant);
void Contest_PrintTextToBg0WindowAt(u32 windowId, u8 *currChar, s32 x, s32 y, s32 fontId);
void ResetContestLinkResults(void);
bool8 sub_80DEDA8(u8 a);
u8 sub_80DEFA8(u8 a, u8 b);
void ClearContestWinnerPicsInContestHall(void);
-void sub_80DFA08(struct ContestPokemon *mon, s32 language);
-
-// contest link
-void sub_81D9DE4(u8 taskId);
-void sub_80FCF40(u8);
-void sub_80FCFD0(u8);
-void sub_80F8714(u8);
-bool32 sub_80FC670(s16 *);
-bool32 sub_80FC4F4(void *, u16);
-bool8 sub_80FC55C(void);
-bool8 sub_80FC530(u8);
-u8 sub_80F86E0(u8 *);
-void sub_80FC9F8(u8 taskId);
+void StripPlayerAndMonNamesForLinkContest(struct ContestPokemon *mon, s32 language);
#endif //GUARD_CONTEST_H
diff --git a/include/contest_link.h b/include/contest_link.h
new file mode 100644
index 000000000..cd2682524
--- /dev/null
+++ b/include/contest_link.h
@@ -0,0 +1,23 @@
+#ifndef GUARD_CONTEST_LINK_H
+#define GUARD_CONTEST_LINK_H
+
+void Task_LinkContest_CommunicateAppealsState(u8);
+void Task_LinkContest_CommunicateFinalStandings(u8);
+void Task_LinkContest_Init(u8);
+void Task_LinkContest_CommunicateMonsRS(u8);
+void Task_LinkContest_CommunicateRngRS(u8);
+void Task_LinkContest_CommunicateLeaderIdsRS(u8);
+void Task_LinkContest_CommunicateCategoryRS(u8);
+void Task_LinkContest_CommunicateMonIdxs(u8);
+void Task_LinkContest_StartCommunicationEm(u8);
+void Task_LinkContest_CommunicateRound1Points(u8);
+void Task_LinkContest_CommunicateTurnOrder(u8);
+void Task_LinkContest_FinalizeConnection(u8);
+void Task_LinkContest_CommunicateMoveSelections(u8);
+bool32 LinkContest_TryLinkStandby(s16 *);
+bool32 LinkContest_SendBlock(void *, u16);
+bool8 LinkContest_GetBlockReceivedFromAllPlayers(void);
+bool8 LinkContest_GetBlockReceived(u8);
+u8 LinkContest_GetLeaderIndex(u8 *);
+
+#endif //GUARD_CONTEST_LINK_H
diff --git a/include/contest_link_80F57C4.h b/include/contest_link_80F57C4.h
deleted file mode 100644
index add3ae62f..000000000
--- a/include/contest_link_80F57C4.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef GUARD_CONTEST_LINK_80F57C4_H
-#define GUARD_CONTEST_LINK_80F57C4_H
-
-void BufferContestantTrainerName(void);
-void BufferContestantMonNickname(void);
-void StartContest(void);
-void BufferContestantMonSpecies(void);
-void sub_80F8484(void);
-void sub_80F84C4(u8);
-void sub_80FC998(u8 taskId);
-
-#endif // GUARD_CONTEST_LINK_80F57C4_H
diff --git a/include/contest_link_80FC4F4.h b/include/contest_link_80FC4F4.h
deleted file mode 100644
index a3f118798..000000000
--- a/include/contest_link_80FC4F4.h
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef GUARD_CONTEST_LINK_80FC4F4_H
-#define GUARD_CONTEST_LINK_80FC4F4_H
-
-void sub_80FCC88(u8);
-void sub_80FCC88(u8);
-void sub_80FCACC(u8);
-void sub_80FC580(u8);
-void sub_80FC6BC(u8);
-void sub_80FC804(u8);
-void sub_80FCE48(u8);
-void sub_80FC894(u8);
-
-#endif //GUARD_CONTEST_LINK_80FC4F4_H
diff --git a/include/contest_util.h b/include/contest_util.h
new file mode 100644
index 000000000..76f9ae522
--- /dev/null
+++ b/include/contest_util.h
@@ -0,0 +1,14 @@
+#ifndef GUARD_CONTEST_UTIL_H
+#define GUARD_CONTEST_UTIL_H
+
+void BufferContestantTrainerName(void);
+void BufferContestantMonNickname(void);
+void StartContest(void);
+void BufferContestantMonSpecies(void);
+void ShowContestResults(void);
+void ContestLinkTransfer(u8);
+void ShowContestWinnerPainting(void);
+u16 GetContestRand(void);
+u8 CountPlayerContestPaintings(void);
+
+#endif // GUARD_CONTEST_UTIL_H
diff --git a/include/dodrio_berry_picking.h b/include/dodrio_berry_picking.h
index 9995decc2..5decbeccb 100644
--- a/include/dodrio_berry_picking.h
+++ b/include/dodrio_berry_picking.h
@@ -1,7 +1,7 @@
#ifndef GUARD_DODRIO_BERRY_PICKING_H
#define GUARD_DODRIO_BERRY_PICKING_H
-void sub_802493C(u16 a0, void (*callback)(void));
+void StartDodrioBerryPicking(u16 a0, void (*callback)(void));
void IsDodrioInParty(void);
void ShowDodrioBerryPickingRecords(void);
diff --git a/include/egg_hatch.h b/include/egg_hatch.h
index 64d07c813..4df2a6a40 100644
--- a/include/egg_hatch.h
+++ b/include/egg_hatch.h
@@ -4,7 +4,7 @@
void ScriptHatchMon(void);
bool8 CheckDaycareMonReceivedMail(void);
void EggHatch(void);
-u8 GetEggStepsToSubtract(void);
+u8 GetEggCyclesToSubtract(void);
u16 CountPartyAliveNonEggMons(void);
#endif // GUARD_EGG_HATCH_H
diff --git a/include/event_data.h b/include/event_data.h
index 53999320f..8b4510e39 100644
--- a/include/event_data.h
+++ b/include/event_data.h
@@ -1,9 +1,6 @@
#ifndef GUARD_EVENT_DATA_H
#define GUARD_EVENT_DATA_H
-#include "constants/flags.h"
-#include "constants/vars.h"
-
void InitEventData(void);
void ClearTempFieldEventData(void);
void ClearDailyFlags(void);
diff --git a/include/event_object_lock.h b/include/event_object_lock.h
index a3b350019..0226eb632 100644
--- a/include/event_object_lock.h
+++ b/include/event_object_lock.h
@@ -8,6 +8,6 @@ void LockSelectedObjectEvent(void);
void sub_8098630(void);
bool8 sub_8098734(void);
void ScriptUnfreezeObjectEvents(void);
-void sub_8098524(void);
+void UnionRoom_UnlockPlayerAndChatPartner(void);
#endif // GUARD_EVENT_OBJECT_LOCK_H
diff --git a/include/event_object_movement.h b/include/event_object_movement.h
index f0caa38aa..9b4d9302f 100644
--- a/include/event_object_movement.h
+++ b/include/event_object_movement.h
@@ -16,11 +16,7 @@ enum SpinnerRunnerFollowPatterns
RUNFOLLOW_SOUTH_EAST_WEST
};
-struct UnkStruct_085094AC
-{
- const union AnimCmd *const *anims;
- u8 animPos[4];
-};
+#define FIGURE_8_LENGTH 72
#define GROUND_EFFECT_FLAG_TALL_GRASS_ON_SPAWN (1 << 0)
#define GROUND_EFFECT_FLAG_TALL_GRASS_ON_MOVE (1 << 1)
@@ -43,6 +39,12 @@ struct UnkStruct_085094AC
#define GROUND_EFFECT_FLAG_HOT_SPRINGS (1 << 18)
#define GROUND_EFFECT_FLAG_SEAWEED (1 << 19)
+struct UnkStruct_085094AC
+{
+ const union AnimCmd *const *anims;
+ u8 animPos[4];
+};
+
struct PairedPalettes
{
u16 tag;
@@ -81,11 +83,11 @@ void sub_808E16C(s16, s16);
void OverrideSecretBaseDecorationSpriteScript(u8 localId, u8 mapNum, u8 mapGroup, u8 decorCat);
void sub_8092FF0(s16, s16, s16 *, s16 *);
u8 GetFaceDirectionAnimNum(u8);
-void sub_80930E0(s16 *, s16 *, s16, s16);
+void SetSpritePosToOffsetMapCoords(s16 *, s16 *, s16, s16);
void ObjectEventClearHeldMovement(struct ObjectEvent *);
void ObjectEventClearHeldMovementIfActive(struct ObjectEvent *);
void TrySpawnObjectEvents(s16, s16);
-u8 sprite_new(u8 graphicsId, u8 a1, s16 x, s16 y, u8 z, u8 direction);
+u8 CreateObjectSprite(u8 graphicsId, u8 a1, s16 x, s16 y, u8 z, u8 direction);
u8 AddPseudoObjectEvent(u16, void (*)(struct Sprite *), s16 x, s16 y, u8 subpriority);
u8 TrySpawnObjectEvent(u8, u8, u8);
u8 SpawnSpecialObjectEventParameterized(u8 graphicsId, u8 movementBehavior, u8 localId, s16 x, s16 y, u8 z);
@@ -98,7 +100,7 @@ void ObjectEventTurnByLocalIdAndMap(u8, u8, u8, u8);
const struct ObjectEventGraphicsInfo *GetObjectEventGraphicsInfo(u8 graphicsId);
void npc_by_local_id_and_map_set_field_1_bit_x20(u8, u8, u8, u8);
void FreeAndReserveObjectSpritePalettes(void);
-void sub_808E82C(u8, u8, u8, s16, s16);
+void SetObjectEventSpritePosByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y);
void sub_808E7E4(u8, u8, u8);
void sub_808E78C(u8, u8, u8, u8);
void sub_808E75C(s16, s16);
@@ -174,13 +176,11 @@ u8 sub_809785C(struct Sprite *);
u8 sub_80978E4(struct Sprite *);
void SetAndStartSpriteAnim(struct Sprite *, u8, u8);
bool8 SpriteAnimEnded(struct Sprite *);
-void sub_8097750(struct Sprite *);
-bool8 sub_8097758(struct Sprite *);
void CreateLevitateMovementTask(struct ObjectEvent *);
void DestroyExtraMovementTask(u8);
void UnfreezeObjectEvents(void);
void FreezeObjectEventsExceptOne(u8 objectEventId);
-void sub_8097B78(u8, u8);
+void TurnObjectEventSprite(u8, u8);
void sub_8098074(u8 var1, u8 var2);
void FreezeObjectEvents(void);
bool8 FreezeObjectEvent(struct ObjectEvent *objectEvent);
@@ -191,10 +191,10 @@ u8 GetLedgeJumpDirection(s16, s16, u8);
void CameraObjectSetFollowedObjectId(u8 objectId);
u16 GetObjectPaletteTag(u8 palSlot);
void UpdateObjectEventSpriteVisibility(struct Sprite *sprite, bool8 invisible);
-s16 sub_809773C(s16 a1);
-s16 sub_8097728(s16 a1);
+s16 GetFigure8XOffset(s16 idx);
+s16 GetFigure8YOffset(s16 idx);
void CameraObjectReset2(void);
-u8 ObjectEventGetBerryTreeId(u8 objectEventId);
+u8 GetObjectEventBerryTreeId(u8 objectEventId);
void sub_8092EF0(u8 mapId, u8 mapNumber, u8 mapGroup);
bool8 IsBerryTreeSparkling(u8, u8, u8);
@@ -414,10 +414,10 @@ u8 MovementType_RunInPlace_Step0(struct ObjectEvent *, struct Sprite *);
u8 MovementType_Invisible_Step0(struct ObjectEvent *, struct Sprite *);
u8 MovementType_Invisible_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementType_Invisible_Step2(struct ObjectEvent *, struct Sprite *);
-void sub_8097C44(u8 var, bool32 var2);
-bool32 sub_8097C8C(u8 var);
-void sub_8097BB4(u8 var1, u8 graphicsId);
-void sub_8097CC4(u8 var1, u8 var2);
-bool32 sub_8097D9C(u8 var);
+void SetObjectEventSpriteInvisibility(u8 var, bool32 var2);
+bool32 IsObjectEventSpriteInvisible(u8 var);
+void SetObjectEventSpriteGraphics(u8 var1, u8 graphicsId);
+void SetObjectEventSpriteAnim(u8 var1, u8 var2);
+bool32 IsObjectEventSpriteAnimating(u8 var);
#endif //GUARD_EVENT_OBJECT_MOVEMENT_H
diff --git a/include/event_scripts.h b/include/event_scripts.h
index d147dd4f1..851559724 100644
--- a/include/event_scripts.h
+++ b/include/event_scripts.h
@@ -294,39 +294,39 @@ extern const u8 gTVSafariFanClubText07[];
extern const u8 gTVSafariFanClubText08[];
extern const u8 gTVSafariFanClubText09[];
extern const u8 gTVSafariFanClubText10[];
-extern const u8 gTVContestLiveUpdatesText00[];
-extern const u8 gTVContestLiveUpdatesText01[];
-extern const u8 gTVContestLiveUpdatesText02[];
-extern const u8 gTVContestLiveUpdatesText03[];
-extern const u8 gTVContestLiveUpdatesText04[];
-extern const u8 gTVContestLiveUpdatesText05[];
-extern const u8 gTVContestLiveUpdatesText06[];
-extern const u8 gTVContestLiveUpdatesText07[];
-extern const u8 gTVContestLiveUpdatesText08[];
-extern const u8 gTVContestLiveUpdatesText09[];
-extern const u8 gTVContestLiveUpdatesText10[];
-extern const u8 gTVContestLiveUpdatesText11[];
-extern const u8 gTVContestLiveUpdatesText12[];
-extern const u8 gTVContestLiveUpdatesText13[];
-extern const u8 gTVContestLiveUpdatesText14[];
-extern const u8 gTVContestLiveUpdatesText15[];
-extern const u8 gTVContestLiveUpdatesText16[];
-extern const u8 gTVContestLiveUpdatesText17[];
-extern const u8 gTVContestLiveUpdatesText18[];
-extern const u8 gTVContestLiveUpdatesText19[];
-extern const u8 gTVContestLiveUpdatesText20[];
-extern const u8 gTVContestLiveUpdatesText21[];
-extern const u8 gTVContestLiveUpdatesText22[];
-extern const u8 gTVContestLiveUpdatesText23[];
-extern const u8 gTVContestLiveUpdatesText24[];
-extern const u8 gTVContestLiveUpdatesText25[];
-extern const u8 gTVContestLiveUpdatesText26[];
-extern const u8 gTVContestLiveUpdatesText27[];
-extern const u8 gTVContestLiveUpdatesText28[];
-extern const u8 gTVContestLiveUpdatesText29[];
-extern const u8 gTVContestLiveUpdatesText30[];
-extern const u8 gTVContestLiveUpdatesText31[];
-extern const u8 gTVContestLiveUpdatesText32[];
+extern const u8 ContestLiveUpdates_Text_Intro[];
+extern const u8 ContestLiveUpdates_Text_WonBothRounds[];
+extern const u8 ContestLiveUpdates_Text_BetterRound2[];
+extern const u8 ContestLiveUpdates_Text_EqualRounds[];
+extern const u8 ContestLiveUpdates_Text_BetterRound1[];
+extern const u8 ContestLiveUpdates_Text_GotNervous[];
+extern const u8 ContestLiveUpdates_Text_StartledFoes[];
+extern const u8 ContestLiveUpdates_Text_UsedCombo[];
+extern const u8 ContestLiveUpdates_Text_ExcitingAppeal[];
+extern const u8 ContestLiveUpdates_Text_WasCool[];
+extern const u8 ContestLiveUpdates_Text_WasBeautiful[];
+extern const u8 ContestLiveUpdates_Text_WasCute[];
+extern const u8 ContestLiveUpdates_Text_WasSmart[];
+extern const u8 ContestLiveUpdates_Text_WasTough[];
+extern const u8 ContestLiveUpdates_Text_VeryExcitingAppeal[];
+extern const u8 ContestLiveUpdates_Text_VeryCool[];
+extern const u8 ContestLiveUpdates_Text_VeryBeautiful[];
+extern const u8 ContestLiveUpdates_Text_VeryCute[];
+extern const u8 ContestLiveUpdates_Text_VerySmart[];
+extern const u8 ContestLiveUpdates_Text_VeryTough[];
+extern const u8 ContestLiveUpdates_Text_TookBreak[];
+extern const u8 ContestLiveUpdates_Text_GotStartled[];
+extern const u8 ContestLiveUpdates_Text_MoveWonderful[];
+extern const u8 ContestLiveUpdates_Text_TalkAboutAnotherMon[];
+extern const u8 ContestLiveUpdates_Text_FailedToAppeal[];
+extern const u8 ContestLiveUpdates_Text_LastInBothRounds[];
+extern const u8 ContestLiveUpdates_Text_NotExcitingEnough[];
+extern const u8 ContestLiveUpdates_Text_LostAfterWinningRound1[];
+extern const u8 ContestLiveUpdates_Text_NeverExciting[];
+extern const u8 ContestLiveUpdates_Text_LostBySmallMargin[];
+extern const u8 ContestLiveUpdates_Text_RepeatedAppeals[];
+extern const u8 ContestLiveUpdates_Text_ValiantEffortButLost[];
+extern const u8 ContestLiveUpdates_Text_Outro[];
extern const u8 gTVPokemonBattleUpdateText00[];
extern const u8 gTVPokemonBattleUpdateText01[];
extern const u8 gTVPokemonBattleUpdateText02[];
@@ -372,10 +372,11 @@ extern const u8 SecretBase_Text_Trainer8Defeated[];
extern const u8 SecretBase_Text_Trainer9Defeated[];
//field effects
-extern const u8 EventScript_FldEffStrength[];
+extern const u8 EventScript_UseStrength[];
extern const u8 EventScript_FailSweetScent[];
-extern const u8 EventScript_FldEffFlash[];
-extern const u8 EventScript_FldEffRockSmash[];
+extern const u8 EventScript_UseFlash[];
+extern const u8 EventScript_UseCut[];
+extern const u8 EventScript_UseRockSmash[];
//player pc
extern const u8 LittlerootTown_BrendansHouse_2F_EventScript_TurnOffPlayerPC[];
@@ -587,4 +588,26 @@ extern u8 BerryTree_EventScript_ItemUsePlantBerry[];
extern u8 BerryTree_EventScript_ItemUseWailmerPail[];
extern u8 BattleFrontier_OutsideEast_EventScript_WaterSudowoodo[];
+// overworld
+extern const u8 EventScript_WhiteOut[];
+extern const u8 EventScript_ResetMrBriney[];
+extern const u8 EventScript_DoLinkRoomExit[];
+extern const u8 CableClub_EventScript_TooBusyToNotice[];
+extern const u8 CableClub_EventScript_ReadTrainerCard[];
+extern const u8 CableClub_EventScript_ReadTrainerCardColored[];
+extern const u8 EventScript_BattleColosseum_4P_PlayerSpot0[];
+extern const u8 EventScript_BattleColosseum_4P_PlayerSpot1[];
+extern const u8 EventScript_BattleColosseum_4P_PlayerSpot2[];
+extern const u8 EventScript_BattleColosseum_4P_PlayerSpot3[];
+extern const u8 EventScript_RecordCenter_Spot0[];
+extern const u8 EventScript_RecordCenter_Spot1[];
+extern const u8 EventScript_RecordCenter_Spot2[];
+extern const u8 EventScript_RecordCenter_Spot3[];
+extern const u8 EventScript_BattleColosseum_2P_PlayerSpot0[];
+extern const u8 EventScript_BattleColosseum_2P_PlayerSpot1[];
+extern const u8 EventScript_TradeCenter_Chair1[];
+extern const u8 EventScript_TradeCenter_Chair0[];
+extern const u8 EventScript_ConfirmLeaveTradeRoom[];
+extern const u8 EventScript_TerminateLink[];
+
#endif // GUARD_EVENT_SCRIPTS_H
diff --git a/include/faraway_island.h b/include/faraway_island.h
index 084b5a277..a5243c6a7 100755
--- a/include/faraway_island.h
+++ b/include/faraway_island.h
@@ -2,7 +2,7 @@
#define GUARD_FARAWAY_ISLAND_H
u32 GetMewMoveDirection(void);
-bool8 sub_81D4A58(struct ObjectEvent*);
+bool8 ShouldMewShakeGrass(struct ObjectEvent*);
void UpdateFarawayIslandStepCounter(void);
bool8 ObjectEventIsFarawayIslandMew(struct ObjectEvent *);
bool8 IsMewPlayingHideAndSeek(void);
diff --git a/include/field_camera.h b/include/field_camera.h
index fecea244e..2bed02b20 100644
--- a/include/field_camera.h
+++ b/include/field_camera.h
@@ -23,7 +23,7 @@ void DrawWholeMapView(void);
void CurrentMapDrawMetatileAt(int x, int y);
void sub_8089C08(s16 *a0, s16 *a1);
void DrawDoorMetatileAt(int x, int y, u16 *arr);
-void move_tilemap_camera_to_upper_left_corner(void);
+void ResetFieldCamera(void);
void sub_8057A58(void);
void ResetCameraUpdateInfo(void);
u32 InitCameraUpdateCallback(u8 a);
diff --git a/include/field_control_avatar.h b/include/field_control_avatar.h
index f722a6063..17e5afb63 100644
--- a/include/field_control_avatar.h
+++ b/include/field_control_avatar.h
@@ -34,7 +34,7 @@ bool8 sub_8068870(u16 a);
bool8 sub_8068894(void);
bool8 sub_8068A64(struct MapPosition *, u16);
u8 sub_8068F18(void);
-bool8 dive_warp(struct MapPosition *position, u16 b);
+bool8 TryDoDiveWarp(struct MapPosition *position, u16 b);
int SetCableClubWarp(void);
u8 TrySetDiveWarp(void);
const u8 *GetInteractedLinkPlayerScript(struct MapPosition *position, u8 metatileBehavior, u8 direction);
diff --git a/include/field_effect.h b/include/field_effect.h
index 59f99ad93..731fb9c59 100644
--- a/include/field_effect.h
+++ b/include/field_effect.h
@@ -16,7 +16,7 @@ void ReturnToFieldFromFlyMapSelect(void);
u8 AddNewGameBirchObject(s16, s16, u8);
void FieldEffectStop(struct Sprite *sprite, u8 id);
u8 CreateTrainerSprite(u8 trainerSpriteID, s16 x, s16 y, u8 subpriority, u8 *buffer);
-void CreateTeleportFieldEffectTask(void);
+void FldEff_TeleportWarpOut(void);
void FieldEffectActiveListRemove(u8 id);
void MultiplyInvertedPaletteRGBComponents(u16, u8, u8, u8);
void FieldEffectActiveListAdd(u8 id);
@@ -39,12 +39,8 @@ void StartEscalatorWarp(u8 metatileBehavior, u8 priority);
void StartLavaridgeGymB1FWarp(u8 priority);
void StartLavaridgeGym1FWarp(u8 priority);
-void sub_80B9C28(s16*, u8);
-void sub_80B9C54(s16*, u8);
-void sub_80B9CDC(s16*, u8);
-
-void SpriteCB_PopOutOfAsh(struct Sprite*);
-void SpriteCB_LavaridgeGymWarp(struct Sprite*);
+void SpriteCB_AshPuff(struct Sprite*);
+void SpriteCB_AshLaunch(struct Sprite*);
void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b);
void FreeResourcesAndDestroySprite(struct Sprite *sprite, u8 spriteId);
diff --git a/include/field_effect_helpers.h b/include/field_effect_helpers.h
index 8257bc110..9b7b6ffd5 100644
--- a/include/field_effect_helpers.h
+++ b/include/field_effect_helpers.h
@@ -8,20 +8,22 @@
// Exported ROM declarations
u8 CreateWarpArrowSprite(void);
u8 sub_8155800(u8 oldSpriteId);
-void sub_81555AC(u8, u8);
+void SetSurfBobState(u8 spriteId, u8 value);
+void SetSurfBobWhileFlyingOutState(u8 spriteId, u8 value);
+void SetSurfBobWhileFishingState(u8 spriteId, u8 value, s16 data1);
bool8 sub_8155DA0(struct ObjectEvent *);
void sub_8155D78(struct ObjectEvent *);
void StartAshFieldEffect(s16, s16, u16, s16);
void SetUpReflection(struct ObjectEvent*, struct Sprite*, u8);
u32 StartFieldEffectForObjectEvent(u8, struct ObjectEvent*);
u8 FindTallGrassFieldEffectSpriteId(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y);
-void sub_8155F80(struct Sprite*);
+void UpdateRayquazaSpotlightEffect(struct Sprite*);
void UpdateShadowFieldEffect(struct Sprite*);
void UpdateTallGrassFieldEffect(struct Sprite*);
void WaitFieldEffectSpriteAnim(struct Sprite*);
void UpdateAshFieldEffect(struct Sprite*);
void UpdateSurfBlobFieldEffect(struct Sprite*);
-void sub_8156194(struct Sprite*);
+void UpdateJumpImpactEffect(struct Sprite*);
void UpdateFootprintsTireTracksFieldEffect(struct Sprite*);
void UpdateSplashFieldEffect(struct Sprite*);
void UpdateLongGrassFieldEffect(struct Sprite*);
@@ -33,7 +35,5 @@ void UpdateBubblesFieldEffect(struct Sprite*);
void UpdateSparkleFieldEffect(struct Sprite*);
void SetSpriteInvisible(u8 spriteId);
void ShowWarpArrowSprite(u8 spriteId, u8 direction, s16 x, s16 y);
-void sub_8155604(u8 spriteId, u8 value, s16 data1);
-void sub_81555D8(u8 spriteId, u8 value);
#endif //GUARD_FIELD_EFFECT_HELPERS_H
diff --git a/include/field_message_box.h b/include/field_message_box.h
index 58f782d9c..34b3324e7 100644
--- a/include/field_message_box.h
+++ b/include/field_message_box.h
@@ -10,13 +10,13 @@ enum
};
bool8 ShowFieldMessage(const u8 *message);
-bool8 sub_8098238(const u8 *message);
-bool8 sub_80982B8(void);
+bool8 ShowPokenavFieldMessage(const u8 *message);
+bool8 ShowFieldMessageFromBuffer(void);
bool8 ShowFieldAutoScrollMessage(const u8 *message);
void HideFieldMessageBox(void);
bool8 IsFieldMessageBoxHidden(void);
u8 GetFieldMessageBoxMode(void);
-void sub_8098374(void);
+void StopFieldMessage(void);
void InitFieldMessageBox(void);
#endif // GUARD_FIELD_MESSAGE_BOX_H
diff --git a/include/field_player_avatar.h b/include/field_player_avatar.h
index bcee339d5..722fe4444 100644
--- a/include/field_player_avatar.h
+++ b/include/field_player_avatar.h
@@ -1,7 +1,7 @@
#ifndef GUARD_FIELD_PLAYER_AVATAR_H
#define GUARD_FIELD_PLAYER_AVATAR_H
-void player_step(u8 a, u16 b, u16 c);
+void PlayerStep(u8 direction, u16 newKeys, u16 heldKeys);
void ClearPlayerAvatarInfo(void);
void SetPlayerAvatarExtraStateTransition(u8, u8);
u8 GetPlayerAvatarGenderByGraphicsId(u8);
@@ -39,7 +39,7 @@ void sub_808BCF4(void);
void sub_808D074(u8);
void GetXYCoordsOneStepInFrontOfPlayer(s16 *xPtr, s16 *yPtr);
u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8, u8);
-void sub_808C114(void);
+void SetPlayerAvatarFieldMove(void);
u8 GetPlayerAvatarGraphicsIdByCurrentState(void);
void SetPlayerAvatarStateMask(u8 a);
u8 GetPlayerAvatarGraphicsIdByStateId(u8 a);
@@ -47,9 +47,9 @@ u8 GetJumpSpecialMovementAction(u32);
bool8 PartyHasMonWithSurf(void);
bool8 IsPlayerFacingSurfableFishableWater(void);
bool8 IsPlayerSurfingNorth(void);
-void sub_808C228(u8 direction);
+void SetPlayerAvatarWatering(u8 direction);
u8 GetPlayerAvatarFlags(void);
-void sub_808B578(void);
+void UpdatePlayerAvatarTransitionState(void);
u8 GetFRLGAvatarGraphicsIdByGender(u8);
u8 GetRSAvatarGraphicsIdByGender(u8);
void PlayerWheelieInPlace(u8 direction);
diff --git a/include/field_screen_effect.h b/include/field_screen_effect.h
index e05e30378..951bf0788 100644
--- a/include/field_screen_effect.h
+++ b/include/field_screen_effect.h
@@ -1,6 +1,8 @@
#ifndef GUARD_FIELD_SCREEN_EFFECT_H
#define GUARD_FIELD_SCREEN_EFFECT_H
+extern const s32 gMaxFlashLevel;
+
void WarpFadeInScreen(void);
void WarpFadeOutScreen(void);
void FadeInFromBlack(void);
@@ -26,7 +28,7 @@ void DoFallWarp(void);
void DoEscalatorWarp(u8 metatileBehavior);
void DoLavaridgeGymB1FWarp(void);
void DoLavaridgeGym1FWarp(void);
-void DoTeleportWarp(void);
+void DoTeleportTileWarp(void);
void DoMossdeepGymWarp(void);
void DoPortholeWarp(void);
void DoCableClubWarp(void);
diff --git a/include/fieldmap.h b/include/fieldmap.h
index dc81d1766..438fb4787 100644
--- a/include/fieldmap.h
+++ b/include/fieldmap.h
@@ -30,26 +30,22 @@ struct MapConnection *sub_8088950(u8 direction, int x, int y);
bool8 sub_80889A8(u8 direction, int x, int y, struct MapConnection *connection);
bool8 sub_8088A0C(int x, int src_width, int dest_width, int offset);
void save_serialize_map(void);
-void sub_8088B3C(u16 x, u16 y);
+void SetCameraFocusCoords(u16 x, u16 y);
void InitMap(void);
void InitMapFromSavedGame(void);
void InitTrainerHillMap(void);
void InitBattlePyramidMap(bool8 setPlayerPosition);
-void copy_map_tileset1_tileset2_to_vram(struct MapLayout const *mapLayout);
-void apply_map_tileset1_tileset2_palette(struct MapLayout const *mapLayout);
-void apply_map_tileset2_palette(struct MapLayout const *mapLayout);
-void copy_map_tileset2_to_vram_2(struct MapLayout const *mapLayout);
-void copy_map_tileset1_to_vram(const struct MapLayout *);
-void copy_map_tileset2_to_vram(const struct MapLayout *);
-struct MapHeader const *const mapconnection_get_mapheader(struct MapConnection *connection);
+void CopyMapTilesetsToVram(struct MapLayout const *mapLayout);
+void LoadMapTilesetPalettes(struct MapLayout const *mapLayout);
+void LoadSecondaryTilesetPalette(struct MapLayout const *mapLayout);
+void CopySecondaryTilesetToVramUsingHeap(struct MapLayout const *mapLayout);
+void CopyPrimaryTilesetToVram(const struct MapLayout *);
+void CopySecondaryTilesetToVram(const struct MapLayout *);
+struct MapHeader const *const GetMapHeaderFromConnection(struct MapConnection *connection);
struct MapConnection *GetConnectionAtCoords(s16 x, s16 y);
-
-void SpriteCB_PokeballGlow(struct Sprite *);
-void SpriteCB_PokecenterMonitor(struct Sprite *);
-void SpriteCB_HallOfFameMonitor(struct Sprite *);
+void MapGridSetMetatileImpassabilityAt(int x, int y, bool32 impassable);
// field_region_map.c
void FieldInitRegionMap(MainCallback callback);
-void sub_8088B94(int x, int y, int a2);
#endif //GUARD_FIELDMAP_H
diff --git a/include/fldeff.h b/include/fldeff.h
index deb54372c..597ce6f47 100644
--- a/include/fldeff.h
+++ b/include/fldeff.h
@@ -9,22 +9,13 @@ bool8 FldEff_CutGrass(void);
void FixLongGrassMetatilesWindowTop(s16 x, s16 y);
void FixLongGrassMetatilesWindowBottom(s16 x, s16 y);
-extern const struct SpritePalette gFieldEffectObjectPaletteInfo6;
+extern const struct SpritePalette gSpritePalette_CutGrass;
extern struct MapPosition gPlayerFacingPosition;
-// groundshake
-bool8 sub_81BE66C(void);
-void sub_81BE6AC(void);
-void sub_81BE6B8(void);
-void sub_81BE72C(void);
-void sub_81BE79C(void);
-void sub_81BE7F4(void);
-void sub_81BE994(void);
-
// escalator
-void sub_80E1558(u8 var);
-void sub_80E1570(void);
-bool8 sub_80E1584(void);
+void StartEscalator(bool8 var);
+void StopEscalator(void);
+bool8 IsEscalatorMoving(void);
// soft-boiled
bool8 SetUpFieldMove_SoftBoiled(void);
@@ -39,7 +30,7 @@ bool8 GetMapPairFadeFromType(u8 a1, u8 a2);
// strength
bool8 SetUpFieldMove_Strength(void);
-bool8 sub_8145E2C(void);
+bool8 FldEff_UseStrength(void);
// sweet scent
bool8 SetUpFieldMove_SweetScent(void);
@@ -55,7 +46,7 @@ bool8 FldEff_UseDig(void);
// rock smash
bool8 CheckObjectGraphicsInFrontOfPlayer(u8 graphicsId);
-u8 oei_task_add(void);
+u8 CreateFieldMoveTask(void);
bool8 SetUpFieldMove_RockSmash(void);
bool8 FldEff_UseRockSmash(void);
diff --git a/include/fldeff_misc.h b/include/fldeff_misc.h
index 6fd15c1ea..4acca7944 100644
--- a/include/fldeff_misc.h
+++ b/include/fldeff_misc.h
@@ -1,10 +1,10 @@
#ifndef GUARD_FLDEFF_MISC_H
#define GUARD_FLDEFF_MISC_H
-void sub_80F9BCC(u16 a0, u16 a1, u8 a2);
-void sub_80F9BF4(u16 a0, u16 a1, u8 a2);
-bool8 sub_80F9C1C(void);
-bool8 sub_80F9C30(void);
+void ComputerScreenOpenEffect(u16 a0, u16 a1, u8 a2);
+void ComputerScreenCloseEffect(u16 a0, u16 a1, u8 a2);
+bool8 IsComputerScreenOpenEffectActive(void);
+bool8 IsComputerScreenCloseEffectActive(void);
bool8 SetUpFieldMove_SecretPower(void);
bool8 FldEff_UseSecretPowerCave(void);
bool8 FldEff_SecretPowerCave(void);
@@ -15,22 +15,22 @@ bool8 FldEff_SecretPowerShrub(void);
bool8 FldEff_SecretBasePCTurnOn(void);
void DoSecretBasePCTurnOffEffect(void);
void PopSecretBaseBalloon(s16 metatileId, s16 x, s16 y);
-bool8 FldEff_NopA6FC(void);
-bool8 FldEff_NopA700(void);
+bool8 FldEff_Nop47(void);
+bool8 FldEff_Nop48(void);
void ShatterSecretBaseBreakableDoor(s16 x, s16 y);
void PlaySecretBaseMusicNoteMatSound(s16 metatileId);
void DoSecretBaseGlitterMatSparkle(void);
bool8 FldEff_SandPillar(void);
void InteractWithShieldOrTVDecoration(void);
-bool8 sub_80FADE4(u16 arg0, u8 arg1);
+bool8 IsLargeBreakableDecoration(u16 arg0, u8 arg1);
void FldEffPoison_Start(void);
bool32 FldEffPoison_IsActive(void);
void DoWateringBerryTreeAnim(void);
-u8 CreateRecordMixingSprite(void);
-void DestroyRecordMixingSprite(void);
+u8 CreateRecordMixingLights(void);
+void DestroyRecordMixingLights(void);
-extern const struct SpritePalette gFieldEffectObjectPaletteInfo7;
-extern const struct SpritePalette gFieldEffectObjectPaletteInfo8;
+extern const struct SpritePalette gSpritePalette_SecretPower_Cave;
+extern const struct SpritePalette gSpritePalette_SecretPower_Plant;
extern const struct SpritePalette gFieldEffectObjectPaletteInfo9;
extern const u16 gTilesetPalettes_SecretBase[][16];
diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h
index 071a89bc5..1daa99e1d 100644
--- a/include/gba/io_reg.h
+++ b/include/gba/io_reg.h
@@ -553,6 +553,7 @@
#define WININ_WIN0_BG_ALL (WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3)
#define WININ_WIN0_OBJ (1 << 4)
#define WININ_WIN0_CLR (1 << 5)
+#define WININ_WIN0_ALL (WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR)
#define WININ_WIN1_BG0 (1 << 8)
#define WININ_WIN1_BG1 (1 << 9)
#define WININ_WIN1_BG2 (1 << 10)
@@ -560,6 +561,7 @@
#define WININ_WIN1_BG_ALL (WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG2 | WININ_WIN1_BG3)
#define WININ_WIN1_OBJ (1 << 12)
#define WININ_WIN1_CLR (1 << 13)
+#define WININ_WIN1_ALL (WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR)
#define WINOUT_WIN01_BG0 (1 << 0)
#define WINOUT_WIN01_BG1 (1 << 1)
@@ -568,6 +570,7 @@
#define WINOUT_WIN01_BG_ALL (WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3)
#define WINOUT_WIN01_OBJ (1 << 4)
#define WINOUT_WIN01_CLR (1 << 5)
+#define WINOUT_WIN01_ALL (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR)
#define WINOUT_WINOBJ_BG0 (1 << 8)
#define WINOUT_WINOBJ_BG1 (1 << 9)
#define WINOUT_WINOBJ_BG2 (1 << 10)
@@ -575,6 +578,7 @@
#define WINOUT_WINOBJ_BG_ALL (WINOUT_WINOBJ_BG0 | WINOUT_WINOBJ_BG1 | WINOUT_WINOBJ_BG2 | WINOUT_WINOBJ_BG3)
#define WINOUT_WINOBJ_OBJ (1 << 12)
#define WINOUT_WINOBJ_CLR (1 << 13)
+#define WINOUT_WINOBJ_ALL (WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR)
#define WIN_RANGE(a, b) (((a) << 8) | (b))
#define WIN_RANGE2(a, b) ((b) | ((a) << 8))
@@ -585,9 +589,10 @@
#define BLDCNT_TGT1_BG1 (1 << 1)
#define BLDCNT_TGT1_BG2 (1 << 2)
#define BLDCNT_TGT1_BG3 (1 << 3)
+#define BLDCNT_TGT1_BG_ALL (BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3)
#define BLDCNT_TGT1_OBJ (1 << 4)
#define BLDCNT_TGT1_BD (1 << 5)
-#define BLDCNT_TGT1_ALL (BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD)
+#define BLDCNT_TGT1_ALL (BLDCNT_TGT1_BG_ALL | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD)
// Bits 6-7 select the special effect
#define BLDCNT_EFFECT_NONE (0 << 6) // no special effect
#define BLDCNT_EFFECT_BLEND (1 << 6) // 1st+2nd targets mixed (controlled by BLDALPHA)
@@ -598,9 +603,10 @@
#define BLDCNT_TGT2_BG1 (1 << 9)
#define BLDCNT_TGT2_BG2 (1 << 10)
#define BLDCNT_TGT2_BG3 (1 << 11)
+#define BLDCNT_TGT2_BG_ALL (BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3)
#define BLDCNT_TGT2_OBJ (1 << 12)
#define BLDCNT_TGT2_BD (1 << 13)
-#define BLDCNT_TGT2_ALL (BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD)
+#define BLDCNT_TGT2_ALL (BLDCNT_TGT2_BG_ALL | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD)
// BLDALPHA
#define BLDALPHA_BLEND(target1, target2) (((target2) << 8) | (target1))
diff --git a/include/gba/m4a_internal.h b/include/gba/m4a_internal.h
index e2836c6f6..bdff1b865 100644
--- a/include/gba/m4a_internal.h
+++ b/include/gba/m4a_internal.h
@@ -140,55 +140,13 @@ struct SoundChannel
struct WaveData *wav;
u32 cp;
struct MusicPlayerTrack *track;
- u32 pp;
- u32 np;
- u32 d4;
+ void *pp;
+ void *np;
+ void *d4;
u16 xpi;
u16 xpc;
};
-#define MAX_DIRECTSOUND_CHANNELS 12
-
-#define PCM_DMA_BUF_SIZE 1584 // size of Direct Sound buffer
-
-struct SoundInfo
-{
- // This field is normally equal to ID_NUMBER but it is set to other
- // values during sensitive operations for locking purposes.
- // This field should be volatile but isn't. This could potentially cause
- // race conditions.
- u32 ident;
-
- vu8 pcmDmaCounter;
-
- // Direct Sound
- u8 reverb;
- u8 maxChans;
- u8 masterVolume;
- u8 freq;
-
- u8 mode;
- u8 c15;
- u8 pcmDmaPeriod; // number of V-blanks per PCM DMA
- u8 maxLines;
- u8 gap[3];
- s32 pcmSamplesPerVBlank;
- s32 pcmFreq;
- s32 divFreq;
- struct CgbChannel *cgbChans;
- u32 func;
- u32 intp;
- void (*CgbSound)(void);
- void (*CgbOscOff)(u8);
- u32 (*MidiKeyToCgbFreq)(u8, u8, u8);
- u32 MPlayJumpTable;
- u32 plynote;
- u32 ExtVolPit;
- u8 gap2[16];
- struct SoundChannel chans[MAX_DIRECTSOUND_CHANNELS];
- s8 pcmBuffer[PCM_DMA_BUF_SIZE * 2];
-};
-
struct SongHeader
{
u8 trackCount;
@@ -312,7 +270,7 @@ struct MusicPlayerInfo
struct MusicPlayerTrack *tracks;
struct ToneData *tone;
u32 ident;
- u32 func;
+ void (*func)();
u32 intp;
};
@@ -334,7 +292,47 @@ struct Song
extern const struct MusicPlayer gMPlayTable[];
extern const struct Song gSongTable[];
+#define MAX_DIRECTSOUND_CHANNELS 12
+
+#define PCM_DMA_BUF_SIZE 1584 // size of Direct Sound buffer
+
+struct SoundInfo
+{
+ // This field is normally equal to ID_NUMBER but it is set to other
+ // values during sensitive operations for locking purposes.
+ // This field should be volatile but isn't. This could potentially cause
+ // race conditions.
+ u32 ident;
+
+ vu8 pcmDmaCounter;
+
+ // Direct Sound
+ u8 reverb;
+ u8 maxChans;
+ u8 masterVolume;
+ u8 freq;
+ u8 mode;
+ u8 c15;
+ u8 pcmDmaPeriod; // number of V-blanks per PCM DMA
+ u8 maxLines;
+ u8 gap[3];
+ s32 pcmSamplesPerVBlank;
+ s32 pcmFreq;
+ s32 divFreq;
+ struct CgbChannel *cgbChans;
+ void (*func)();
+ u32 intp;
+ void (*CgbSound)();
+ void (*CgbOscOff)(u8);
+ u32 (*MidiKeyToCgbFreq)(u8, u8, u8);
+ void (**MPlayJumpTable)();
+ void (*plynote)(u8, struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+ void (*ExtVolPit)(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+ u32 gap2[4];
+ struct SoundChannel chans[MAX_DIRECTSOUND_CHANNELS];
+ s8 pcmBuffer[PCM_DMA_BUF_SIZE * 2];
+};
extern u8 gMPlayMemAccArea[];
@@ -448,7 +446,7 @@ void ply_tune(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
void ply_port(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
void ply_xcmd(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
void ply_endtie(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_note(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_note(u8, struct MusicPlayerInfo *, struct MusicPlayerTrack *);
// extended sound command handler functions
void ply_xxx(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
diff --git a/include/gba/types.h b/include/gba/types.h
index 7163f925f..35d02e263 100644
--- a/include/gba/types.h
+++ b/include/gba/types.h
@@ -27,6 +27,9 @@ typedef double f64;
typedef u8 bool8;
typedef u16 bool16;
typedef u32 bool32;
+typedef vu8 vbool8;
+typedef vu16 vbool16;
+typedef vu32 vbool32;
struct BgCnt
{
diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h
index 59610f9ad..4598e87fa 100644
--- a/include/global.fieldmap.h
+++ b/include/global.fieldmap.h
@@ -247,14 +247,14 @@ enum {
PLAYER_AVATAR_STATE_WATERING,
};
-#define PLAYER_AVATAR_FLAG_ON_FOOT (1 << PLAYER_AVATAR_STATE_NORMAL)
-#define PLAYER_AVATAR_FLAG_MACH_BIKE (1 << PLAYER_AVATAR_STATE_MACH_BIKE)
-#define PLAYER_AVATAR_FLAG_ACRO_BIKE (1 << PLAYER_AVATAR_STATE_ACRO_BIKE)
-#define PLAYER_AVATAR_FLAG_SURFING (1 << PLAYER_AVATAR_STATE_SURFING)
-#define PLAYER_AVATAR_FLAG_UNDERWATER (1 << PLAYER_AVATAR_STATE_UNDERWATER)
-#define PLAYER_AVATAR_FLAG_5 (1 << PLAYER_AVATAR_STATE_FIELD_MOVE)
-#define PLAYER_AVATAR_FLAG_6 (1 << PLAYER_AVATAR_STATE_FISHING)
-#define PLAYER_AVATAR_FLAG_DASH (1 << PLAYER_AVATAR_STATE_WATERING)
+#define PLAYER_AVATAR_FLAG_ON_FOOT (1 << 0)
+#define PLAYER_AVATAR_FLAG_MACH_BIKE (1 << 1)
+#define PLAYER_AVATAR_FLAG_ACRO_BIKE (1 << 2)
+#define PLAYER_AVATAR_FLAG_SURFING (1 << 3)
+#define PLAYER_AVATAR_FLAG_UNDERWATER (1 << 4)
+#define PLAYER_AVATAR_FLAG_5 (1 << 5)
+#define PLAYER_AVATAR_FLAG_FORCED_MOVE (1 << 6)
+#define PLAYER_AVATAR_FLAG_DASH (1 << 7)
enum
{
diff --git a/include/global.h b/include/global.h
index bcf3e6486..08988eac7 100644
--- a/include/global.h
+++ b/include/global.h
@@ -6,6 +6,8 @@
#include "config.h" // we need to define config before gba headers as print stuff needs the functions nulled before defines.
#include "gba/gba.h"
#include "constants/global.h"
+#include "constants/flags.h"
+#include "constants/vars.h"
// Prevent cross-jump optimization.
#define BLOCK_CROSS_JUMP asm("");
@@ -52,7 +54,7 @@
#define Q_4_12(n) ((s16)((n) * 4096))
// Converts a number to Q24.8 fixed-point format
-#define Q_24_8(n) ((s32)((n) * 256))
+#define Q_24_8(n) ((s32)((n) << 8))
// Converts a Q8.8 fixed-point format number to a regular integer
#define Q_8_8_TO_INT(n) ((int)((n) / 256))
@@ -100,6 +102,8 @@
#define TEST_BUTTON(field, button) ({(field) & (button);})
#define JOY_NEW(button) TEST_BUTTON(gMain.newKeys, button)
#define JOY_HELD(button) TEST_BUTTON(gMain.heldKeys, button)
+#define JOY_HELD_RAW(button) TEST_BUTTON(gMain.heldKeysRaw, button)
+#define JOY_REPEAT(button) TEST_BUTTON(gMain.newAndRepeatedKeys, button)
#define S16TOPOSFLOAT(val) \
({ \
@@ -109,6 +113,11 @@
f; \
})
+#define ROUND_BITS_TO_BYTES(numBits)(((numBits) / 8) + (((numBits) % 8) ? 1 : 0))
+
+#define DEX_FLAGS_NO (ROUND_BITS_TO_BYTES(POKEMON_SLOTS_NUMBER))
+#define NUM_FLAG_BYTES (ROUND_BITS_TO_BYTES(FLAGS_COUNT))
+
struct Coords8
{
s8 x;
@@ -153,8 +162,6 @@ struct Time
/*0x04*/ s8 seconds;
};
-#define DEX_FLAGS_NO ((POKEMON_SLOTS_NUMBER / 8) + ((POKEMON_SLOTS_NUMBER % 8) ? 1 : 0))
-
struct Pokedex
{
/*0x00*/ u8 order;
@@ -474,7 +481,7 @@ struct SaveBlock2
/*0x20C*/ struct BerryPickingResults berryPick;
/*0x21C*/ struct RankingHall1P hallRecords1P[HALL_FACILITIES_COUNT][2][3]; // From record mixing.
/*0x57C*/ struct RankingHall2P hallRecords2P[2][3]; // From record mixing.
- /*0x624*/ u16 contestLinkResults[5][4]; // 4 positions for 5 categories.
+ /*0x624*/ u16 contestLinkResults[CONTEST_CATEGORIES_COUNT][CONTESTANT_COUNT];
/*0x64C*/ struct BattleFrontier frontier;
}; // sizeof=0xF2C
@@ -483,7 +490,7 @@ extern struct SaveBlock2 *gSaveBlock2Ptr;
struct SecretBaseParty
{
u32 personality[PARTY_SIZE];
- u16 moves[PARTY_SIZE * 4];
+ u16 moves[PARTY_SIZE * MAX_MON_MOVES];
u16 species[PARTY_SIZE];
u16 heldItems[PARTY_SIZE];
u8 levels[PARTY_SIZE];
@@ -923,7 +930,7 @@ struct SaveBlock1
/*0x9CA*/ u8 trainerRematches[MAX_REMATCH_ENTRIES];
/*0xA30*/ struct ObjectEvent objectEvents[OBJECT_EVENTS_COUNT];
/*0xC70*/ struct ObjectEventTemplate objectEventTemplates[OBJECT_EVENT_TEMPLATES_COUNT];
- /*0x1270*/ u8 flags[FLAGS_COUNT];
+ /*0x1270*/ u8 flags[NUM_FLAG_BYTES];
/*0x139C*/ u16 vars[VARS_COUNT];
/*0x159C*/ u32 gameStats[NUM_GAME_STATS];
/*0x169C*/ struct BerryTree berryTrees[BERRY_TREES_COUNT];
@@ -960,7 +967,7 @@ struct SaveBlock1
/*0x2E20*/ u8 additionalPhrases[8]; // bitfield for 33 additional phrases in easy chat system
/*0x2E28*/ OldMan oldMan;
/*0x2e64*/ struct EasyChatPair easyChatPairs[5]; //Dewford trend [0] and some other stuff
- /*0x2e90*/ struct ContestWinner contestWinners[13]; // 0 - 5 used in contest hall, 6 - 7 unused?, 8 - 12 museum
+ /*0x2e90*/ struct ContestWinner contestWinners[NUM_CONTEST_WINNERS]; // see CONTEST_WINNER_*
/*0x3030*/ struct DayCare daycare;
/*0x3150*/ struct LinkBattleRecords linkBattleRecords;
/*0x31A8*/ u8 giftRibbons[52];
@@ -974,7 +981,7 @@ struct SaveBlock1
/*0x3B24*/ u8 seen2[DEX_FLAGS_NO];
/*0x3B58*/ LilycoveLady lilycoveLady;
/*0x3B98*/ struct TrainerNameRecord trainerNameRecords[20];
- /*0x3C88*/ u8 unk3C88[10][21];
+ /*0x3C88*/ u8 registeredTexts[UNION_ROOM_KB_ROW_COUNT][21];
/*0x3D5A*/ u8 filler3D5A[0xA];
/*0x3D64*/ struct SaveTrainerHill trainerHill;
/*0x3D70*/ struct WaldaPhrase waldaPhrase;
diff --git a/include/global.tv.h b/include/global.tv.h
index 34791d43c..8e1a898b6 100644
--- a/include/global.tv.h
+++ b/include/global.tv.h
@@ -18,6 +18,13 @@ typedef union // size = 0x24
/*0x23*/ u8 trainerIdHi;
} common;
+ // Common init (used for initialization loop)
+ struct {
+ /*0x00*/ u8 kind;
+ /*0x01*/ bool8 active;
+ /*0x02*/ u8 pad02[34];
+ } commonInit;
+
// Local shows
// TVSHOW_FAN_CLUB_LETTER
struct {
@@ -25,7 +32,7 @@ typedef union // size = 0x24
/*0x01*/ bool8 active;
/*0x02*/ u16 species;
/*0x04*/ u16 words[6];
- /*0x10*/ u8 playerName[8];
+ /*0x10*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
/*0x18*/ u8 language;
} fanclubLetter;
@@ -35,7 +42,7 @@ typedef union // size = 0x24
/*0x01*/ bool8 active;
/*0x02*/ u16 var02;
/*0x04*/ u16 words[6];
- /*0x10*/ u8 playerName[8];
+ /*0x10*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
/*0x18*/ u8 language;
} recentHappenings;
@@ -46,11 +53,11 @@ typedef union // size = 0x24
/*0x02*/ u16 species;
/*0x04*/ u8 friendshipHighNybble:4;
/*0x04*/ u8 questionAsked:4;
- /*0x05*/ u8 playerName[8];
+ /*0x05*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
/*0x0D*/ u8 language;
/*0x0E*/ u8 pokemonNameLanguage;
/*0x0F*/ u8 filler_0F[1];
- /*0x10*/ u8 nickname[8];
+ /*0x10*/ u8 nickname[PLAYER_NAME_LENGTH + 1];
/*0x18*/ u16 words18[2];
/*0x1C*/ u16 words[4];
} fanclubOpinions;
@@ -71,7 +78,7 @@ typedef union // size = 0x24
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u16 species;
- /*0x04*/ u8 pokemonName[11];
+ /*0x04*/ u8 pokemonName[POKEMON_NAME_LENGTH + 1];
/*0x0F*/ u8 trainerName[11];
/*0x1A*/ u8 random;
/*0x1B*/ u8 random2;
@@ -86,12 +93,12 @@ typedef union // size = 0x24
/*0x01*/ bool8 active;
/*0x02*/ u16 species;
/*0x04*/ u16 words[2];
- /*0x08*/ u8 pokemonNickname[11];
+ /*0x08*/ u8 pokemonNickname[POKEMON_NAME_LENGTH + 1];
/*0x13*/ u8 contestCategory:3;
/*0x13*/ u8 contestRank:2;
/*0x13*/ u8 contestResult:2;
/*0x14*/ u16 move;
- /*0x16*/ u8 playerName[8];
+ /*0x16*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
/*0x1E*/ u8 language;
/*0x1F*/ u8 pokemonNameLanguage;
} bravoTrainer;
@@ -100,7 +107,7 @@ typedef union // size = 0x24
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
- /*0x02*/ u8 trainerName[8];
+ /*0x02*/ u8 trainerName[PLAYER_NAME_LENGTH + 1];
/*0x0A*/ u16 species;
/*0x0C*/ u8 pokemonName[8];
/*0x14*/ u16 defeatedSpecies;
@@ -117,18 +124,18 @@ typedef union // size = 0x24
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
- /*0x02*/ u16 winningSpecies;
- /*0x04*/ u8 winningTrainerName[8];
- /*0x0C*/ u8 appealFlags2;
- /*0x0D*/ u8 round1Rank;
- /*0x0e*/ u8 round2Rank;
- /*0x0f*/ u8 appealFlags1;
+ /*0x02*/ u16 losingSpecies;
+ /*0x04*/ u8 losingTrainerName[PLAYER_NAME_LENGTH + 1];
+ /*0x0C*/ u8 loserAppealFlag;
+ /*0x0D*/ u8 round1Placing;
+ /*0x0e*/ u8 round2Placing;
+ /*0x0f*/ u8 winnerAppealFlag;
/*0x10*/ u16 move;
- /*0x12*/ u16 species;
- /*0x14*/ u8 playerName[8];
+ /*0x12*/ u16 winningSpecies;
+ /*0x14*/ u8 winningTrainerName[PLAYER_NAME_LENGTH + 1];
/*0x1C*/ u8 category;
- /*0x1D*/ u8 language;
- /*0x1E*/ u8 winningTrainerLanguage;
+ /*0x1D*/ u8 winningTrainerLanguage;
+ /*0x1E*/ u8 losingTrainerLanguage;
} contestLiveUpdates;
// TVSHOW_3_CHEERS_FOR_POKEBLOCKS
@@ -137,9 +144,9 @@ typedef union // size = 0x24
/*0x01*/ bool8 active;
/*0x02*/ u8 sheen;
/*0x03*/ u8 flavor:3;
- /*0x03*/ u8 unk_03_3:2;
- /*0x04*/ u8 worstBlenderName[8];
- /*0x0C*/ u8 playerName[8];
+ /*0x03*/ u8 color:2;
+ /*0x04*/ u8 worstBlenderName[PLAYER_NAME_LENGTH + 1];
+ /*0x0C*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
/*0x14*/ u8 language;
/*0x15*/ u8 worstBlenderLanguage;
} threeCheers;
@@ -149,8 +156,8 @@ typedef union // size = 0x24
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u16 speciesOpponent;
- /*0x04*/ u8 playerName[8];
- /*0x0C*/ u8 linkOpponentName[8];
+ /*0x04*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
+ /*0x0C*/ u8 linkOpponentName[PLAYER_NAME_LENGTH + 1];
/*0x14*/ u16 move;
/*0x16*/ u16 speciesPlayer;
/*0x18*/ u8 battleType;
@@ -162,10 +169,10 @@ typedef union // size = 0x24
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
- /*0x02*/ u8 playerName[8];
+ /*0x02*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
/*0x0a*/ u8 idLo;
/*0x0b*/ u8 idHi;
- /*0x0c*/ u8 idolName[8];
+ /*0x0c*/ u8 idolName[PLAYER_NAME_LENGTH + 1];
/*0x14*/ u16 words[1];
/*0x16*/ u8 score;
/*0x17*/ u8 language;
@@ -176,9 +183,9 @@ typedef union // size = 0x24
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
- /*0x02*/ u8 playerName[8];
+ /*0x02*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
/*0x0a*/ u8 contestCategory;
- /*0x0b*/ u8 nickname[11];
+ /*0x0b*/ u8 nickname[POKEMON_NAME_LENGTH + 1];
/*0x16*/ u8 pokeblockState;
/*0x17*/ u8 language;
/*0x18*/ u8 pokemonNameLanguage;
@@ -191,11 +198,11 @@ typedef union // size = 0x24
/*0x01*/ bool8 active;
/*0x02*/ u8 language;
/*0x03*/ u8 language2;
- /*0x04*/ u8 nickname[11];
+ /*0x04*/ u8 nickname[POKEMON_NAME_LENGTH + 1];
/*0x0F*/ u8 ball;
/*0x10*/ u16 species;
/*0x12*/ u8 nBallsUsed;
- /*0x13*/ u8 playerName[8];
+ /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
} pokemonToday;
// TVSHOW_SMART_SHOPPER
@@ -208,7 +215,7 @@ typedef union // size = 0x24
/*0x06*/ u16 itemIds[3];
/*0x0C*/ u16 itemAmounts[3];
/*0x12*/ u8 shopLocation;
- /*0x13*/ u8 playerName[8];
+ /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
} smartshopperShow;
// TVSHOW_POKEMON_TODAY_FAILED
@@ -222,7 +229,7 @@ typedef union // size = 0x24
/*0x10*/ u8 nBallsUsed;
/*0x11*/ u8 outcome;
/*0x12*/ u8 location;
- /*0x13*/ u8 playerName[8];
+ /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
} pokemonTodayFailed;
// TVSHOW_FISHING_ADVICE
@@ -234,7 +241,7 @@ typedef union // size = 0x24
/*0x04*/ u16 species;
/*0x06*/ u8 language;
/*0x07*/ u8 pad07[12];
- /*0x13*/ u8 playerName[8];
+ /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
} pokemonAngler;
// TVSHOW_WORLD_OF_MASTERS
@@ -248,7 +255,7 @@ typedef union // size = 0x24
/*0x0a*/ u8 location;
/*0x0b*/ u8 language;
/*0x0c*/ u8 pad0c[7];
- /*0x13*/ u8 playerName[8];
+ /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
} worldOfMasters;
// TVSHOW_TODAYS_RIVAL_TRAINER
@@ -264,7 +271,7 @@ typedef union // size = 0x24
/*0x0a*/ u16 mapLayoutId;
/*0x0c*/ u8 language;
/*0x0d*/ u8 filler_0d[6];
- /*0x13*/ u8 playerName[8];
+ /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
} rivalTrainer;
// TVSHOW_TREND_WATCHER
@@ -276,7 +283,7 @@ typedef union // size = 0x24
/*0x08*/ u8 gender;
/*0x09*/ u8 language;
/*0x0a*/ u8 filler_0a[9];
- /*0x13*/ u8 playerName[8];
+ /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
} trendWatcher;
// TVSHOW_TREASURE_INVESTIGATORS
@@ -288,7 +295,7 @@ typedef union // size = 0x24
/*0x05*/ u8 language;
/*0x06*/ u16 mapLayoutId;
/*0x08*/ u8 filler_08[11];
- /*0x13*/ u8 playerName[8];
+ /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
} treasureInvestigators;
// TVSHOW_FIND_THAT_GAMER
@@ -301,7 +308,7 @@ typedef union // size = 0x24
/*0x06*/ u8 filler_06[2];
/*0x08*/ u8 language;
/*0x09*/ u8 filler_09[10];
- /*0x13*/ u8 playerName[8];
+ /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
} findThatGamer;
// TVSHOW_BREAKING_NEWS
@@ -317,7 +324,7 @@ typedef union // size = 0x24
/*0x0c*/ u16 lastUsedMove;
/*0x0e*/ u8 language;
/*0x0f*/ u8 filler_0f[4];
- /*0x13*/ u8 playerName[8];
+ /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
} breakingNews;
// TVSHOW_SECRET_BASE_VISIT
@@ -331,7 +338,7 @@ typedef union // size = 0x24
/*0x0a*/ u16 move;
/*0x0c*/ u8 language;
/*0x0d*/ u8 filler_0d[6];
- /*0x13*/ u8 playerName[8];
+ /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
} secretBaseVisit;
// TVSHOW_LOTTO_WINNER
@@ -342,7 +349,7 @@ typedef union // size = 0x24
/*0x04*/ u8 whichPrize;
/*0x05*/ u8 language;
/*0x06*/ u8 filler_06[13];
- /*0x13*/ u8 playerName[8];
+ /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
} lottoWinner;
// TVSHOW_BATTLE_SEMINAR
@@ -357,7 +364,7 @@ typedef union // size = 0x24
/*0x10*/ u8 nOtherMoves;
/*0x11*/ u8 language;
/*0x12*/ u8 filler_12[1];
- /*0x13*/ u8 playerName[8];
+ /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
} battleSeminar;
// TVSHOW_TRAINER_FAN_CLUB
@@ -368,7 +375,7 @@ typedef union // size = 0x24
/*0x04*/ u16 words[2];
/*0x08*/ u8 language;
/*0x09*/ u8 filler_09[10];
- /*0x13*/ u8 playerName[8];
+ /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
} trainerFanClub;
// TVSHOW_CUTIES
@@ -377,11 +384,11 @@ typedef union // size = 0x24
/*0x01*/ bool8 active;
/*0x02*/ u8 nRibbons;
/*0x03*/ u8 selectedRibbon;
- /*0x04*/ u8 nickname[11];
+ /*0x04*/ u8 nickname[POKEMON_NAME_LENGTH + 1];
/*0x0f*/ u8 language;
/*0x10*/ u8 pokemonNameLanguage;
/*0x11*/ u8 filler_12[2];
- /*0x13*/ u8 playerName[8];
+ /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
} cuties;
// TVSHOW_FRONTIER
@@ -396,7 +403,7 @@ typedef union // size = 0x24
/*0x0c*/ u8 language;
/*0x0d*/ u8 facility;
/*0x0e*/ u8 filler_0e[5];
- /*0x13*/ u8 playerName[8];
+ /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
} frontier;
// TVSHOW_NUMBER_ONE
@@ -407,7 +414,7 @@ typedef union // size = 0x24
/*0x04*/ u8 actionIdx;
/*0x05*/ u8 language;
/*0x06*/ u8 filler_06[13];
- /*0x13*/ u8 playerName[8];
+ /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
} numberOne;
// TVSHOW_SECRET_BASE_SECRETS
@@ -415,11 +422,11 @@ typedef union // size = 0x24
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u16 stepsInBase;
- /*0x04*/ u8 baseOwnersName[8];
+ /*0x04*/ u8 baseOwnersName[PLAYER_NAME_LENGTH + 1];
/*0x0c*/ u32 flags;
/*0x10*/ u16 item;
/*0x12*/ u8 savedState;
- /*0x13*/ u8 playerName[8];
+ /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
/*0x1b*/ u8 language;
/*0x1c*/ u8 baseOwnersNameLanguage;
} secretBaseSecrets;
@@ -432,7 +439,7 @@ typedef union // size = 0x24
/*0x03*/ u8 nPkblkUsed;
/*0x04*/ u8 language;
/*0x05*/ u8 filler_05[14];
- /*0x13*/ u8 playerName[8];
+ /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
} safariFanClub;
// Mass Outbreak
diff --git a/include/graphics.h b/include/graphics.h
index b41a43095..32268d6db 100644
--- a/include/graphics.h
+++ b/include/graphics.h
@@ -3180,11 +3180,12 @@ extern const u32 gDecorIconPalette_RegiceDoll[];
extern const u32 gDecorIcon_RegisteelDoll[];
extern const u32 gDecorIconPalette_RegisteelDoll[];
-extern const u32 gWallclock_Gfx[];
-extern const u16 gWallclockMale_Pal[];
-extern const u16 gWallclockFemale_Pal[];
-extern const u32 gUnknown_08DCC648[];
-extern const u32 gUnknown_08DCC908[];
+extern const u32 gWallClock_Gfx[];
+extern const u16 gWallClockMale_Pal[];
+extern const u16 gWallClockFemale_Pal[];
+extern const u32 gWallClockStart_Tilemap[];
+extern const u32 gWallClockView_Tilemap[];
+
extern const u32 gBerryFixGameboy_Gfx[];
extern const u32 gBerryFixGameboy_Tilemap[];
extern const u16 gBerryFixGameboy_Pal[];
@@ -3309,57 +3310,57 @@ extern const u32 gBerryTag_Gfx[];
extern const u32 gBerryTag_Pal[];
// rayquaza scene gfx
-extern const u32 gRaySceneGroudon_Gfx[];
-extern const u32 gRaySceneGroudon2_Gfx[];
-extern const u32 gRaySceneGroudon3_Gfx[];
-extern const u32 gRaySceneKyogre_Gfx[];
-extern const u32 gRaySceneKyogre2_Gfx[];
-extern const u32 gRaySceneKyogre3_Gfx[];
-extern const u32 gRaySceneGroudon_Pal[];
-extern const u32 gRaySceneKyogre_Pal[];
-extern const u32 gRaySceneSmoke_Gfx[];
-extern const u32 gRaySceneSmoke_Pal[];
-extern const u32 gRaySceneRayquaza_Pal[];
-extern const u32 gRaySceneRayquazaFly1_Gfx[];
-extern const u32 gRaySceneRayquazaTail_Gfx[];
-extern const u32 gRaySceneGroudonLeft_Gfx[];
-extern const u32 gRaySceneGroudonTail_Gfx[];
-extern const u32 gRaySceneKyogreRight_Gfx[];
-extern const u32 gRaySceneRayquazaHover_Gfx[];
-extern const u32 gRaySceneRayquazaFlyIn_Gfx[];
-extern const u32 gRaySceneOvercast_Gfx[];
-extern const u32 gRaySceneOvercast_Tilemap[];
-extern const u32 gRaySceneRayquaza_Gfx[];
-extern const u32 gRaySceneRayquaza_Tilemap[];
-extern const u32 gRaySceneSplash_Gfx[];
-extern const u32 gRaySceneGroudonLeft_Pal[];
-extern const u32 gRaySceneKyogreRight_Pal[];
-extern const u32 gRaySceneRayquazaHover_Pal[];
-extern const u32 gRaySceneSplash_Pal[];
-extern const u32 gRaySceneClouds_Gfx[];
-extern const u32 gRaySceneClouds_Pal[];
-extern const u32 gRaySceneClouds2_Tilemap[];
-extern const u32 gRaySceneClouds1_Tilemap[];
-extern const u32 gRaySceneClouds3_Tilemap[];
-extern const u32 gRaySceneRayquazaLight_Gfx[];
-extern const u32 gRaySceneRayquazaLight_Tilemap[];
-extern const u32 gRaySceneOvercast2_Gfx[];
-extern const u32 gRaySceneOvercast2_Tilemap[];
-extern const u32 gRaySceneOvercast2_Pal[];
-extern const u32 gRaySceneRayquazaChase_Gfx[];
-extern const u32 gRaySceneChaseStreaks_Gfx[];
-extern const u32 gRaySceneChaseBg_Gfx[];
-extern const u32 gRayChaseRayquazaChase2_Tilemap[];
-extern const u32 gRayChaseRayquazaChase_Tilemap[];
-extern const u32 gRaySceneChaseStreaks_Tilemap[];
-extern const u32 gRaySceneChaseBg_Tilemap[];
-extern const u32 gRaySceneChase_Pal[];
-extern const u32 gRaySceneHushRing_Tilemap[];
-extern const u32 gRaySceneHushBg_Tilemap[];
-extern const u32 gRaySceneHushRing_Map[];
-extern const u32 gRaySceneHushBg_Pal[];
-extern const u32 gRaySceneHushBg_Gfx[];
-extern const u32 gRaySceneHushRing_Gfx[];
+extern const u32 gRaySceneDuoFight_Groudon_Gfx[];
+extern const u32 gRaySceneDuoFight_GroudonShoulder_Gfx[];
+extern const u32 gRaySceneDuoFight_GroudonClaw_Gfx[];
+extern const u32 gRaySceneDuoFight_Kyogre_Gfx[];
+extern const u32 gRaySceneDuoFight_KyogrePectoralFin_Gfx[];
+extern const u32 gRaySceneDuoFight_KyogreDorsalFin_Gfx[];
+extern const u32 gRaySceneDuoFight_Groudon_Pal[];
+extern const u32 gRaySceneDuoFight_Kyogre_Pal[];
+extern const u32 gRaySceneDuoFight_Clouds_Gfx[];
+extern const u32 gRaySceneDuoFight_Clouds_Pal[];
+extern const u32 gRaySceneDuoFight_Clouds1_Tilemap[];
+extern const u32 gRaySceneDuoFight_Clouds2_Tilemap[];
+extern const u32 gRaySceneDuoFight_Clouds3_Tilemap[];
+extern const u32 gRaySceneTakesFlight_Smoke_Gfx[];
+extern const u32 gRaySceneTakesFlight_Smoke_Pal[];
+extern const u32 gRaySceneTakesFlight_Rayquaza_Pal[];
+extern const u32 gRaySceneTakesFlight_Bg_Gfx[];
+extern const u32 gRaySceneTakesFlight_Bg_Tilemap[];
+extern const u32 gRaySceneTakesFlight_Rayquaza_Gfx[];
+extern const u32 gRaySceneTakesFlight_Rayquaza_Tilemap[];
+extern const u32 gRaySceneDescends_Rayquaza_Gfx[];
+extern const u32 gRaySceneDescends_RayquazaTail_Gfx[];
+extern const u32 gRaySceneDescends_Light_Gfx[];
+extern const u32 gRaySceneDescends_Light_Tilemap[];
+extern const u32 gRaySceneDescends_Bg_Gfx[];
+extern const u32 gRaySceneDescends_Bg_Tilemap[];
+extern const u32 gRaySceneDescends_Bg_Pal[];
+extern const u32 gRaySceneCharges_Rayquaza_Gfx[];
+extern const u32 gRaySceneCharges_Streaks_Gfx[];
+extern const u32 gRaySceneCharges_Bg_Gfx[];
+extern const u32 gRaySceneCharges_Orbs_Tilemap[];
+extern const u32 gRaySceneCharges_Rayquaza_Tilemap[];
+extern const u32 gRaySceneCharges_Streaks_Tilemap[];
+extern const u32 gRaySceneCharges_Bg_Tilemap[];
+extern const u32 gRaySceneCharges_Bg_Pal[];
+extern const u32 gRaySceneChasesAway_Groudon_Gfx[];
+extern const u32 gRaySceneChasesAway_GroudonTail_Gfx[];
+extern const u32 gRaySceneChasesAway_Kyogre_Gfx[];
+extern const u32 gRaySceneChasesAway_Rayquaza_Gfx[];
+extern const u32 gRaySceneChasesAway_RayquazaTail_Gfx[];
+extern const u32 gRaySceneChasesAway_KyogreSplash_Gfx[];
+extern const u32 gRaySceneChasesAway_Groudon_Pal[];
+extern const u32 gRaySceneChasesAway_Kyogre_Pal[];
+extern const u32 gRaySceneChasesAway_Rayquaza_Pal[];
+extern const u32 gRaySceneChasesAway_KyogreSplash_Pal[];
+extern const u32 gRaySceneChasesAway_Bg_Tilemap[];
+extern const u32 gRaySceneChasesAway_Light_Tilemap[];
+extern const u32 gRaySceneChasesAway_Ring_Tilemap[];
+extern const u32 gRaySceneChasesAway_Bg_Pal[];
+extern const u32 gRaySceneChasesAway_Light_Gfx[];
+extern const u32 gRaySceneChasesAway_Ring_Gfx[];
// Pokeballs
extern const u32 gItemIcon_MasterBall[];
@@ -4069,21 +4070,21 @@ extern const u8 gHealthboxElementsGfxTable[][32];
extern const u16 gNamingScreenMenu_Pal[];
extern const u32 gNamingScreenMenu_Gfx[];
-extern const u32 gUnknown_08DD4544[];
-extern const u8 gUnknown_08DD4620[];
-extern const u8 gUnknown_08DD46E0[];
-extern const u8 gUnknown_08DD47A0[];
+extern const u32 gNamingScreenBackground_Tilemap[];
+extern const u8 gNamingScreenKeyboardUpper_Tilemap[];
+extern const u8 gNamingScreenKeyboardLower_Tilemap[];
+extern const u8 gNamingScreenKeyboardSymbols_Tilemap[];
extern const u8 gNamingScreenRWindow_Gfx[];
-extern const u8 gNamingScreenKeyboardButton_Gfx[];
+extern const u8 gNamingScreenPageButton_Gfx[];
extern const u8 gNamingScreenROptions_Gfx[];
extern const u8 gNamingScreenCursor_Gfx[];
-extern const u8 gNamingScreenRightPointingTriangleTiles[];
-extern const u8 gNamingScreenUnderscoreTiles[];
+extern const u8 gNamingScreenInputArrow_Gfx[];
+extern const u8 gNamingScreenUnderscore_Gfx[];
extern const u32 gUnknown_08D9BA44[];
-extern const u32 gContestConfetti_Gfx[];
-extern const u32 gContestConfetti_Pal[];
+extern const u32 gConfetti_Gfx[];
+extern const u32 gConfetti_Pal[];
extern const u32 gUnknown_08C093F0[];
extern const u32 gSubstituteDollTilemap[];
@@ -4786,10 +4787,10 @@ extern const u32 gOldContestGfx[];
extern const u32 gOldContestPalette[];
extern const u32 gUnknown_08C17170[];
extern const u32 gUnknown_08C17980[];
-extern const u32 gTiles_8C19450[];
+extern const u32 gContestSliderHeart_Gfx[];
extern const u32 gContestNextTurnGfx[];
extern const u16 gContestPal[];
-extern const u32 gUnknown_08C19168[];
+extern const u32 gContestFaces_Gfx[];
extern const u32 gContestApplauseGfx[];
extern const u32 gContestJudgeGfx[];
extern const u32 gContestJudgeSymbolsGfx[];
@@ -4812,19 +4813,19 @@ extern const u16 gUsePokeblockGraph_Pal[];
extern const u16 gUsePokeblockNatureWin_Pal[];
// Berry blender
-extern const u32 gBerryBlenderArrowTiles[];
-extern const u32 gBerryBlenderStartTiles[];
-extern const u32 gBerryBlenderMarubatsuTiles[];
-extern const u32 gBerryBlenderParticlesTiles[];
-extern const u32 gBerryBlenderCountdownNumbersTiles[];
+extern const u32 gBerryBlenderPlayerArrow_Gfx[];
+extern const u32 gBerryBlenderStart_Gfx[];
+extern const u32 gBerryBlenderScoreSymbols_Gfx[];
+extern const u32 gBerryBlenderParticles_Gfx[];
+extern const u32 gBerryBlenderCountdownNumbers_Gfx[];
extern const u16 gBerryBlenderMiscPalette[];
extern const u16 gBerryBlenderArrowPalette[];
-extern const u32 sBlenderCenterGfx[];
-extern const u32 gUnknown_08D91DB8[];
-extern const u32 gUnknown_08D927EC[];
+extern const u32 gBerryBlenderCenter_Gfx[];
+extern const u32 gBerryBlenderOuter_Gfx[];
+extern const u32 gBerryBlenderOuter_Tilemap[];
// Slot Machine
-extern const u32 gSlotMachineReelTime_Gfx[];
+extern const u32 gSlotMachineDigitalDisplay_Gfx[];
extern const u8 gSlotMachineReelTimeNumber0[];
extern const u8 gSlotMachineReelTimeNumber1[];
extern const u8 gSlotMachineReelTimeNumber2[];
@@ -4832,15 +4833,15 @@ extern const u8 gSlotMachineReelTimeNumber3[];
extern const u8 gSlotMachineReelTimeNumber4[];
extern const u8 gSlotMachineReelTimeNumber5[];
extern const u8 gSlotMachineReelTimeShadow[];
-extern const u8 gUnknown_08DD1A18[];
-extern const u8 gSlotMachineReelTimeLargeBolt0[];
-extern const u8 gSlotMachineReelTimeLargeBolt1[];
+extern const u8 gSlotMachineReelTimeNumberGap_Gfx[];
+extern const u8 gSlotMachineReelTimeBolt0[];
+extern const u8 gSlotMachineReelTimeBolt1[];
extern const u8 gSlotMachineReelTimePikaAura[];
extern const u8 gSlotMachineReelTimeExplosion0[];
extern const u8 gSlotMachineReelTimeExplosion1[];
extern const u8 gSlotMachineReelTimeDuck[];
extern const u8 gSlotMachineReelTimeSmoke[];
-extern const u8 gSlotMachineReelTimeBolt[];
+extern const u8 gSlotMachinePikaPowerBolt[];
extern const u8 gSlotMachineReelSymbol1Tiles[];
extern const u8 gSlotMachineReelSymbol2Tiles[];
extern const u8 gSlotMachineReelSymbol3Tiles[];
@@ -4858,19 +4859,18 @@ extern const u8 gSlotMachineNumber6Tiles[];
extern const u8 gSlotMachineNumber7Tiles[];
extern const u8 gSlotMachineNumber8Tiles[];
extern const u8 gSlotMachineNumber9Tiles[];
-extern const u8 gUnknown_08DD19F8[];
+extern const u8 gSlotMachineReelBackground_Tilemap[];
extern const u32 gSlotMachineMenu_Gfx[];
extern const u16 gSlotMachineMenu_Tilemap[];
-extern const u16 gUnknown_08DCEC70[];
+extern const u16 gSlotMachineInfoBox_Tilemap[];
extern const u16 gSlotMachineMenu_Pal[];
-extern const u16 gUnknown_08DCF230[];
-extern const u16 gUnknown_08DCF170[];
-extern const u16 gUnknown_08DCF1B0[];
-extern const u16 gSlotMachineReelTime_Pal[];
-extern const u16 gUnknown_08DCF1F0[];
-extern const u16 gUnknown_08DCF210[];
-extern const u16 gUnknown_08DCF230[];
-extern const u16 gUnknown_08DCF190[];
+extern const u16 gSlotMachineReelSymbols_Pal[];
+extern const u16 gSlotMachineReelTimeMisc_Pal[];
+extern const u16 gSlotMachineReelTimeMachine_Pal[];
+extern const u16 gSlotMachineMisc_Pal[];
+extern const u16 gSlotMachineReelTimeExplosion_Pal[];
+extern const u16 gSlotMachineDigitalDisplay_Pal[];
+extern const u16 gSlotMachineReelTimePikachu_Pal[];
extern const u32 gBattleAnimBgTilemap_Sandstorm[];
extern const u32 gBattleAnimBgImage_Sandstorm[];
@@ -4894,11 +4894,11 @@ extern const u32 gWallpaperTilemap_Horizontal[];
extern const u16 gWallpaperPalettes_Horizontal[][16];
// Cable Car
-extern const u32 gUnknown_08DBA5B8[];
-extern const u16 gUnknown_08DBA518[];
+extern const u32 gCableCarBg_Gfx[];
+extern const u16 gCableCarBg_Pal[];
extern const u32 gCableCar_Gfx[];
extern const u32 gCableCarDoor_Gfx[];
-extern const u32 gCableCarCord_Gfx[];
+extern const u32 gCableCarCable_Gfx[];
extern const u16 gCableCar_Pal[];
// Trade
@@ -4919,31 +4919,31 @@ extern const u32 gPartyMenuPokeball_Pal[];
extern const u32 gStatusPal_Icons[];
// Roulette
-extern const u32 gRouletteMenuTiles[];
-extern const u32 gRouletteWheelTiles[];
+extern const u32 gRouletteMenu_Gfx[];
+extern const u32 gRouletteWheel_Gfx[];
extern const u32 gRouletteCenter_Gfx[];
-extern const u32 gRouletteHeadersTiles[];
-extern const u32 gRouletteCreditTiles[];
-extern const u32 gRouletteNumbersTiles[];
-extern const u32 gRouletteMultiplierTiles[];
+extern const u32 gRouletteHeaders_Gfx[];
+extern const u32 gRouletteCredit_Gfx[];
+extern const u32 gRouletteNumbers_Gfx[];
+extern const u32 gRouletteMultiplier_Gfx[];
-// Contest Link
-extern const u32 gUnknown_08C19588[];
+// Contest util
+extern const u32 gContestResults_Gfx[];
extern const u32 gUnknown_08C19EEC[];
extern const u32 gUnknown_08C1A000[];
extern const u32 gUnknown_08C1A12C[];
-extern const u32 gUnknown_08C1A2B4[];
-extern const u16 gUnknown_08DC6498[];
-extern const u16 gUnknown_08DC63F8[];
-extern const u16 gUnknown_08DC6420[];
-extern const u16 gUnknown_08DC6448[];
-extern const u16 gUnknown_08DC6470[];
-extern const u16 gUnknown_08DC64AC[];
-extern const u16 gUnknown_08DC64C0[];
-extern const u16 gUnknown_08DC64D4[];
-extern const u16 gUnknown_08DC64E8[];
-extern const u16 gUnknown_08DC64FC[];
-extern const u16 gUnknown_08DC6510[];
+extern const u32 gContestResults_Pal[];
+extern const u16 gLinkContestResults_Tilemap[];
+extern const u16 gNormalContestResults_Tilemap[];
+extern const u16 gSuperContestResults_Tilemap[];
+extern const u16 gHyperContestResults_Tilemap[];
+extern const u16 gMasterContestResults_Tilemap[];
+extern const u16 gCoolContestResults_Tilemap[];
+extern const u16 gBeautyContestResults_Tilemap[];
+extern const u16 gCuteContestResults_Tilemap[];
+extern const u16 gSmartContestResults_Tilemap[];
+extern const u16 gToughContestResults_Tilemap[];
+extern const u16 gContestResults_Tilemap[];
// Trainer Card.
extern const u16 gHoennTrainerCard0Star_Pal[];
@@ -4986,14 +4986,14 @@ extern const u16 gEasyChatRightWindow_Pal[];
extern const u32 gUsePokeblockCondition_Gfx[];
// Union Room Chat
-extern const u16 gUnknown_08DD4BB0[];
-extern const u16 gUnknown_08DD4BD0[];
-extern const u32 gUnknown_08DD4BF0[];
-extern const u32 gUnknown_08DD4C4C[];
-extern const u32 gUnknown_08DD4CF8[];
-extern const u16 gLinkMiscMenu_Pal[];
-extern const u32 gLinkMiscMenu_Gfx[];
-extern const u32 gLinkMiscMenu_Tilemap[];
+extern const u16 gUnionRoomChat_Background_Pal[];
+extern const u32 gUnionRoomChat_Background_Gfx[];
+extern const u32 gUnionRoomChat_Background_Tilemap[];
+extern const u16 gUnionRoomChat_Window_Pal1[];
+extern const u16 gUnionRoomChat_Window_Pal2[];
+extern const u32 gUnionRoomChat_Border_Gfx[];
+extern const u32 gUnionRoomChat_Border_Tilemap[];
+extern const u32 gUnionRoomChat_RButtonLabels[];
// Use Pokeblock
extern const u8 gPokenavConditionCancel_Gfx[];
diff --git a/include/hall_of_fame.h b/include/hall_of_fame.h
index a83fad2fc..f1f456713 100644
--- a/include/hall_of_fame.h
+++ b/include/hall_of_fame.h
@@ -4,7 +4,6 @@
void CB2_DoHallOfFameScreen(void);
void CB2_DoHallOfFameScreenDontSaveData(void);
void CB2_DoHallOfFamePC(void);
-void DoConfettiEffect(void);
// hof_pc.c
void ReturnFromHallOfFamePC(void);
diff --git a/include/item_menu.h b/include/item_menu.h
index 089bff6cf..a99272b0c 100644
--- a/include/item_menu.h
+++ b/include/item_menu.h
@@ -4,19 +4,35 @@
#include "item.h"
#include "menu_helpers.h"
-#define RETURN_LOCATION_FIELD 0
-#define RETURN_LOCATION_BATTLE 1
-#define RETURN_LOCATION_POKEMON_LIST 2
-#define RETURN_LOCATION_SHOP 3
-#define RETURN_LOCATION_FIELD_2 4
-#define RETURN_LOCATION_FIELD_3 5
-#define RETURN_LOCATION_PC 6
-#define RETURN_LOCATION_FIELD_4 7
-#define RETURN_LOCATION_FIELD_5 8
-#define RETURN_LOCATION_FIELD_6 9
-#define RETURN_LOCATION_BATTLE_2 10
-#define RETURN_LOCATION_PC_2 11
-#define RETURN_LOCATION_UNCHANGED 12
+#define ITEMMENULOCATION_FIELD 0
+#define ITEMMENULOCATION_BATTLE 1
+#define ITEMMENULOCATION_PARTY 2
+#define ITEMMENULOCATION_SHOP 3
+#define ITEMMENULOCATION_BERRY_TREE 4
+#define ITEMMENULOCATION_BERRY_BLENDER_CRUSH 5
+#define ITEMMENULOCATION_ITEMPC 6
+#define ITEMMENULOCATION_FAVOR_LADY 7
+#define ITEMMENULOCATION_QUIZ_LADY 8
+#define ITEMMENULOCATION_APPRENTICE 9
+#define ITEMMENULOCATION_WALLY 10
+#define ITEMMENULOCATION_PCBOX 11
+#define ITEMMENULOCATION_LAST 12
+
+#define ITEMMENUACTION_USE 0
+#define ITEMMENUACTION_TOSS 1
+#define ITEMMENUACTION_REGISTER 2
+#define ITEMMENUACTION_GIVE 3
+#define ITEMMENUACTION_CANCEL 4
+#define ITEMMENUACTION_BATTLE_USE 5
+#define ITEMMENUACTION_CHECK 6
+#define ITEMMENUACTION_WALK 7
+#define ITEMMENUACTION_DESELECT 8
+#define ITEMMENUACTION_CHECK_TAG 9
+#define ITEMMENUACTION_CONFIRM 10
+#define ITEMMENUACTION_SHOW 11
+#define ITEMMENUACTION_GIVE_2 12
+#define ITEMMENUACTION_CONFIRM_2 13
+#define ITEMMENUACTION_DUMMY 14
// Exported type declarations
struct BagStruct
@@ -33,29 +49,24 @@ extern struct BagStruct gBagPositionStruct;
struct BagMenuStruct
{
- void (*mainCallback2)(void);
+ void (*exitCallback)(void);
u8 tilemapBuffer[0x800];
u8 spriteId[12];
- u8 windowPointers[7];
- u8 unk817;
- u8 unk818;
- u8 unk819;
- u8 unk81A;
- u8 unk81B:4;
- u8 unk81B_1:2;
- u8 unk81B_3:1;
+ u8 windowPointers[10];
+ u8 itemOriginalLocation;
+ u8 pocketSwitchDisabled:4;
+ u8 itemIconSlot:2;
+ u8 inhibitItemDescriptionPrint:1;
u8 hideCloseBagText:1;
u8 filler3[2];
- u8 unk81E;
- u8 unk81F;
- const u8* unk820;
- u8 unk824;
- u8 unk825;
- u8 filler[2];
- u8 unk828;
+ u8 pocketScrollArrowsTask;
+ u8 pocketSwitchArrowsTask;
+ const u8* contextMenuItemsPtr;
+ u8 contextMenuItemsBuffer[4];
+ u8 contextMenuNumItems;
u8 numItemStacks[POCKETS_COUNT];
u8 numShownItems[6];
- s16 unk834;
+ s16 graphicsLoadState;
u8 filler4[0xE];
u8 pocketNameBuffer[32][32];
u8 filler2[4];
@@ -68,11 +79,11 @@ extern struct BagMenuStruct *gBagMenu;
extern u16 gSpecialVar_ItemId;
// Exported ROM declarations
-void sub_81AAC14(void);
+void CB2_GoToItemDepositMenu(void);
void FavorLadyOpenBagMenu(void);
void QuizLadyOpenBagMenu(void);
void ApprenticeOpenBagMenu(void);
-void sub_81AABB0(void);
+void CB2_BagMenuFromBattle(void);
void SetInitialScrollAndCursorPositions(u8 pocketId);
void CB2_ReturnToBagMenuPocket(void);
void CB2_BagMenuFromStartMenu(void);
@@ -82,7 +93,7 @@ void CB2_GoToSellMenu(void);
void GoToBagMenu(u8 bagMenuType, u8 pocketId, void ( *postExitMenuMainCallback2)());
void DoWallyTutorialBagMenu(void);
void ResetBagScrollPositions(void);
-void ChooseBerrySetCallback(void (*callback)(void));
+void ChooseBerryForMachine(void (*exitCallback)(void));
void CB2_ChooseBerry(void);
void Task_FadeAndCloseBagMenu(u8 taskId);
void BagMenu_YesNo(u8, u8, const struct YesNoFuncTable*);
diff --git a/include/item_menu_icons.h b/include/item_menu_icons.h
index 50f0d5544..e061149fc 100644
--- a/include/item_menu_icons.h
+++ b/include/item_menu_icons.h
@@ -10,7 +10,7 @@ extern const struct CompressedSpritePalette gBerryCheckCirclePaletteTable;
void RemoveBagSprite(u8 id);
void AddBagVisualSprite(u8 bagPocketId);
void SetBagVisualPocketId(u8 bagPocketId, bool8 isSwitchingPockets);
-void ShakeBagVisual(void);
+void ShakeBagSprite(void);
void AddSwitchPocketRotatingBallSprite(s16 rotationDirection);
void AddBagItemIconSprite(u16 itemId, u8 id);
void RemoveBagItemIconSprite(u8 id);
@@ -19,7 +19,7 @@ void sub_80D4FC8(u8 arg0);
void sub_80D4FEC(u8 arg0);
u8 CreateBerryTagSprite(u8 id, s16 x, s16 y);
void FreeBerryTagSpritePalette(void);
-u8 LoadSpinningBerryPicGfx(u8 berryId, u8 x, u8 y, bool8 startAffine);
+u8 CreateSpinningBerrySprite(u8 berryId, u8 x, u8 y, bool8 startAffine);
u8 CreateBerryFlavorCircleSprite(s16 x);
#define TAG_BAG_GFX 100
diff --git a/include/libgcnmultiboot.h b/include/libgcnmultiboot.h
index 7d347df05..4a6262d8f 100644
--- a/include/libgcnmultiboot.h
+++ b/include/libgcnmultiboot.h
@@ -1,4 +1,4 @@
-#ifndef GUARD_LIBGCMMULTIBOOT_H
+#ifndef GUARD_LIBGCNMULTIBOOT_H
#define GUARD_LIBGCNMULTIBOOT_H
struct GcmbStruct
diff --git a/include/link.h b/include/link.h
index f41161d23..086bf787b 100644
--- a/include/link.h
+++ b/include/link.h
@@ -48,52 +48,60 @@
#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_READY_TO_TRADE 0xAABB
-#define LINKCMD_READY_FINISH_TRADE 0xABCD
-#define LINKCMD_INIT_BLOCK 0xBBBB
-#define LINKCMD_READY_CANCEL_TRADE 0xBBCC
-#define LINKCMD_SEND_HELD_KEYS_2 0xCAFE
-#define LINKCMD_0xCCCC 0xCCCC
-#define LINKCMD_START_TRADE 0xCCDD
-#define LINKCMD_CONFIRM_FINISH_TRADE 0xDCBA
-#define LINKCMD_SET_MONS_TO_TRADE 0xDDDD
-#define LINKCMD_0xDDEE 0xDDEE
-#define LINKCMD_REQUEST_CANCEL 0xEEAA
-#define LINKCMD_CANCEL_TRADE 0xEEBB
-#define LINKCMD_0xEECC 0xEECC
-
-#define LINKTYPE_0x1111 0x1111 // trade
-#define LINKTYPE_0x1122 0x1122 // trade
-#define LINKTYPE_0x1133 0x1133 // trade
-#define LINKTYPE_0x1144 0x1144 // trade
-#define LINKTYPE_BATTLE 0x2211
-#define LINKTYPE_0x2222 0x2222 // unused battle?
-#define LINKTYPE_SINGLE_BATTLE 0x2233
-#define LINKTYPE_DOUBLE_BATTLE 0x2244
-#define LINKTYPE_MULTI_BATTLE 0x2255
-#define LINKTYPE_BATTLE_TOWER_50 0x2266
-#define LINKTYPE_BATTLE_TOWER_OPEN 0x2277
-#define LINKTYPE_BATTLE_TOWER 0x2288
-#define LINKTYPE_0x3311 0x3311
-#define LINKTYPE_0x3322 0x3322
-#define LINKTYPE_BERRY_BLENDER_SETUP 0x4411
-#define LINKTYPE_BERRY_BLENDER 0x4422
-#define LINKTYPE_0x5501 0x5501 // mystery event
-#define LINKTYPE_0x5502 0x5502 // unused?
-#define LINKTYPE_0x5503 0x5503 // eReader
-#define LINKTYPE_CONTEST_GMODE 0x6601
-#define LINKTYPE_CONTEST_EMODE 0x6602
+#define LINKCMD_BLENDER_STOP 0x1111
+#define LINKCMD_SEND_LINK_TYPE 0x2222
+#define LINKCMD_BLENDER_SCORE_MISS 0x2345
+#define LINKCMD_READY_EXIT_STANDBY 0x2FFE
+#define LINKCMD_SEND_PACKET 0x2FFF
+#define LINKCMD_BLENDER_SEND_KEYS 0x4444
+#define LINKCMD_BLENDER_SCORE_BEST 0x4523
+#define LINKCMD_BLENDER_SCORE_GOOD 0x5432
+#define LINKCMD_0x5555 0x5555
+#define LINKCMD_0x5566 0x5566
+#define LINKCMD_READY_CLOSE_LINK 0x5FFF
+#define LINKCMD_0x6666 0x6666
+#define LINKCMD_0x7777 0x7777
+#define LINKCMD_BLENDER_PLAY_AGAIN 0x7779
+#define LINKCMD_0x7FFF 0x7FFF
+#define LINKCMD_CONT_BLOCK 0x8888
+#define LINKCMD_BLENDER_NO_BERRIES 0x9999
+#define LINKCMD_BLENDER_NO_PBLOCK_SPACE 0xAAAA
+#define LINKCMD_0xAAAB 0xAAAB
+#define LINKCMD_READY_TO_TRADE 0xAABB
+#define LINKCMD_READY_FINISH_TRADE 0xABCD
+#define LINKCMD_INIT_BLOCK 0xBBBB
+#define LINKCMD_READY_CANCEL_TRADE 0xBBCC
+#define LINKCMD_SEND_HELD_KEYS 0xCAFE
+#define LINKCMD_SEND_BLOCK_REQ 0xCCCC
+#define LINKCMD_START_TRADE 0xCCDD
+#define LINKCMD_CONFIRM_FINISH_TRADE 0xDCBA
+#define LINKCMD_SET_MONS_TO_TRADE 0xDDDD
+#define LINKCMD_0xDDEE 0xDDEE
+#define LINKCMD_REQUEST_CANCEL 0xEEAA
+#define LINKCMD_CANCEL_TRADE 0xEEBB
+#define LINKCMD_0xEECC 0xEECC
+
+#define LINKTYPE_TRADE 0x1111
+#define LINKTYPE_TRADE_CONNECTING 0x1122
+#define LINKTYPE_TRADE_SETUP 0x1133
+#define LINKTYPE_TRADE_DISCONNECTED 0x1144
+#define LINKTYPE_BATTLE 0x2211
+#define LINKTYPE_0x2222 0x2222 // unused battle?
+#define LINKTYPE_SINGLE_BATTLE 0x2233
+#define LINKTYPE_DOUBLE_BATTLE 0x2244
+#define LINKTYPE_MULTI_BATTLE 0x2255
+#define LINKTYPE_BATTLE_TOWER_50 0x2266
+#define LINKTYPE_BATTLE_TOWER_OPEN 0x2277
+#define LINKTYPE_BATTLE_TOWER 0x2288
+#define LINKTYPE_RECORD_MIX_BEFORE 0x3311
+#define LINKTYPE_RECORD_MIX_AFTER 0x3322
+#define LINKTYPE_BERRY_BLENDER_SETUP 0x4411
+#define LINKTYPE_BERRY_BLENDER 0x4422
+#define LINKTYPE_MYSTERY_EVENT 0x5501
+#define LINKTYPE_0x5502 0x5502 // unused?
+#define LINKTYPE_EREADER 0x5503
+#define LINKTYPE_CONTEST_GMODE 0x6601
+#define LINKTYPE_CONTEST_EMODE 0x6602
struct LinkStatus
{
@@ -126,10 +134,10 @@ enum
EXCHANGE_NOT_STARTED,
EXCHANGE_COMPLETE,
EXCHANGE_TIMED_OUT,
- EXCHANGE_IN_PROGRESS,
+ EXCHANGE_DIFF_SELECTIONS,
EXCHANGE_PLAYER_NOT_READY,
EXCHANGE_PARTNER_NOT_READY,
- EXCHANGE_STAT_6,
+ EXCHANGE_WRONG_NUM_PLAYERS,
EXCHANGE_STAT_7
};
@@ -230,7 +238,7 @@ extern u16 gSendCmd[CMD_LENGTH];
extern struct LinkPlayer gLinkPlayers[5];
extern u16 word_3002910[];
extern bool8 gReceivedRemoteLinkPlayers;
-extern u32 gUnknown_020223C0;
+extern u32 gBerryBlenderKeySendAttempts;
extern bool8 gLinkVSyncDisabled;
extern u32 gLinkStatus;
@@ -273,26 +281,25 @@ bool32 InUnionRoom(void);
void LoadWirelessStatusIndicatorSpriteGfx(void);
bool8 IsLinkTaskFinished(void);
void CreateWirelessStatusIndicatorSprite(u8, u8);
-void sub_800ADF8(void);
-void sub_800B488(void);
+void SetLinkStandbyCallback(void);
+void SetWirelessCommType1(void);
void CheckShouldAdvanceLinkState(void);
-void sub_8011BD0(void);
u8 IsLinkMaster(void);
-void sub_800AC34(void);
+void SetCloseLinkCallback(void);
bool8 HandleLinkConnection(void);
void SetLinkDebugValues(u32 seed, u32 flags);
-void sub_800A418(void);
+void SetBerryBlenderLinkCallback(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 ClearSavedLinkPlayers(void);
+void BufferLinkErrorInfo(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06);
void sub_800B348(void);
-void sub_800B3A4(u32 who);
-bool32 sub_800A07C(void);
+void LinkPlayerFromBlock(u32 who);
+bool32 Link_AnyPartnersPlayingFRLG_JP(void);
void ResetLinkPlayerCount(void);
-void sub_800AA04(u8 a0);
-void sub_800B4C0(void);
+void SaveLinkPlayers(u8 a0);
+void SetWirelessCommType0(void);
bool32 sub_800B504(void);
extern u16 gLinkPartnersHeldKeys[6];
@@ -306,9 +313,9 @@ 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 bool8 gReadyToExitStandby[MAX_LINK_PLAYERS];
+extern bool8 gReadyToCloseLink[MAX_LINK_PLAYERS];
+extern u16 gReadyCloseLinkType;
extern u8 gSuppressLinkErrorMessage;
extern u8 gWirelessCommType;
extern bool8 gSavedLinkPlayerCount;
@@ -331,19 +338,19 @@ extern u32 gFiller_03003080;
extern struct LinkPlayer gLocalLinkPlayer;
bool32 Link_AnyPartnersPlayingRubyOrSapphire(void);
-bool32 sub_800A03C(void);
+bool32 LinkDummy_Return2(void);
void SetLocalLinkPlayerId(u8);
u8 GetSavedPlayerCount(void);
void sub_8009FAC(void);
-bool8 sub_800A4D8(u8 a0);
-u8 sub_800A9D8(void);
+bool8 SendBlockRequest(u8 type);
+u8 GetLinkPlayerCountAsBitFlags(void);
u8 sub_800A0C8(s32, s32);
-u8 sub_800A9A8(void);
-void sub_800AD10(void);
-void sub_800AB18(void);
-void sub_8009F18(void);
-bool8 sub_800AA60(void);
-void sub_800ABF4(u16 a0);
+u8 GetSavedLinkPlayerCountAsBitFlags(void);
+void SetCloseLinkCallbackHandleJP(void);
+void CheckLinkPlayersMatchSaved(void);
+void StartSendingKeysToLink(void);
+bool8 DoesLinkPlayerCountMatchSaved(void);
+void SetCloseLinkCallbackAndType(u16 type);
bool32 IsSendingKeysToLink(void);
u32 GetLinkRecvQueueLength(void);
diff --git a/include/link_rfu.h b/include/link_rfu.h
index 2d74e686a..9476da6b7 100644
--- a/include/link_rfu.h
+++ b/include/link_rfu.h
@@ -5,7 +5,45 @@
#include "link.h"
#include "AgbRfu_LinkManager.h"
-// Exported type declarations
+#define RFUCMD_SEND_PACKET 0x2F00
+#define RFUCMD_BLENDER_SEND_KEYS 0x4400
+#define RFUCMD_READY_CLOSE_LINK 0x5F00
+#define RFUCMD_READY_EXIT_STANDBY 0x6600
+#define RFUCMD_0x7700 0x7700
+#define RFUCMD_0x7800 0x7800
+#define RFUCMD_0x8800 0x8800
+#define RFUCMD_0x8900 0x8900
+#define RFUCMD_SEND_BLOCK_REQ 0xA100
+#define RFUCMD_SEND_HELD_KEYS 0xBE00
+#define RFUCMD_0xED00 0xED00
+#define RFUCMD_0xEE00 0xEE00
+
+#define RFU_SERIAL_7F7D 0x7F7D
+
+#define RECV_QUEUE_NUM_SLOTS 32
+#define RECV_QUEUE_SLOT_LENGTH (14 * MAX_RFU_PLAYERS)
+
+#define SEND_QUEUE_NUM_SLOTS 40
+#define SEND_QUEUE_SLOT_LENGTH 14
+
+#define BACKUP_QUEUE_NUM_SLOTS 2
+#define BACKUP_QUEUE_SLOT_LENGTH 14
+
+#define RFU_PACKET_SIZE 6
+
+#define RFU_STATUS_OK 0
+#define RFU_STATUS_FATAL_ERROR 1
+#define RFU_STATUS_CONNECTION_ERROR 2
+#define RFU_STATUS_CHILD_SEND_COMPLETE 3
+#define RFU_STATUS_NEW_CHILD_DETECTED 4
+#define RFU_STATUS_JOIN_GROUP_OK 5
+#define RFU_STATUS_JOIN_GROUP_NO 6
+#define RFU_STATUS_WAIT_ACK_JOIN_GROUP 7
+#define RFU_STATUS_LEAVE_GROUP_NOTICE 8
+#define RFU_STATUS_LEAVE_GROUP 9
+#define RFU_STATUS_10 10
+#define RFU_STATUS_11 11
+#define RFU_STATUS_ACK_JOIN_GROUP 12
// RfuTgtData.gname is read as these structs.
struct GFtgtGnameSub
@@ -13,12 +51,11 @@ struct GFtgtGnameSub
u16 language:4;
u16 hasNews:1;
u16 hasCard:1;
- u16 unk_00_6:1;
+ u16 unknown:1; // Never read
u16 isChampion:1;
u16 hasNationalDex:1;
u16 gameClear:1;
u16 version:4;
- u16 unk_01_6:2;
u8 playerTrainerId[2];
};
@@ -38,306 +75,212 @@ struct __attribute__((packed, aligned(2))) GFtgtGname
u8 padding;
}; // size: RFU_GNAME_SIZE
-struct UnkLinkRfuStruct_02022B2C
+struct RfuBlockSend
{
- u8 unk_00;
- u8 unk_01;
- u16 unk_02;
- u8 unk_04;
- u16 unk_06;
- struct GFtgtGname *unk_08;
- u8 *unk_0c;
- u8 unk_10;
- u8 unk_11;
- u16 unk_12;
- u16 unk_14;
+ /* 0x00 */ u16 next;
+ /* 0x02 */ u16 count;
+ /* 0x04 */ const u8 *payload;
+ /* 0x08 */ u32 receivedFlags;
+ /* 0x0c */ u32 failedFlags;
+ /* 0x10 */ bool8 sending;
+ /* 0x11 */ u8 owner;
+ /* 0x12 */ u8 receiving;
};
-struct UnkLinkRfuStruct_02022B44
+struct RfuRecvQueue
{
- 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];
+ /* 0x000 */ u8 slots[RECV_QUEUE_NUM_SLOTS][RECV_QUEUE_SLOT_LENGTH];
+ /* 0x8c0 */ vu8 recvSlot;
+ /* 0x8c1 */ vu8 sendSlot;
+ /* 0x8c2 */ vu8 count;
+ /* 0x8c3 */ vu8 full;
};
-struct UnkRfuStruct_2_Sub_6c
+struct RfuSendQueue
{
- /* 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;
+ /* 0x000 */ u8 slots[SEND_QUEUE_NUM_SLOTS][SEND_QUEUE_SLOT_LENGTH];
+ /* 0x230 */ vu8 recvSlot;
+ /* 0x231 */ vu8 sendSlot;
+ /* 0x232 */ vu8 count;
+ /* 0x233 */ vu8 full;
};
-struct UnkRfuStruct_2_Sub_124
+struct RfuBackupQueue
{
- /* 0x000 */ u8 unk_00[32][70];
- /* 0x8c0 */ vu8 unk_8c0;
- /* 0x8c1 */ vu8 unk_8c1;
- /* 0x8c2 */ vu8 unk_8c2;
- /* 0x8c3 */ vu8 unk_8c3;
+ /* 0x00 */ u8 slots[BACKUP_QUEUE_NUM_SLOTS][BACKUP_QUEUE_SLOT_LENGTH];
+ /* 0x1c */ vu8 recvSlot;
+ /* 0x1d */ vu8 sendSlot;
+ /* 0x1e */ vu8 count;
};
-struct UnkRfuStruct_2_Sub_9e8
+struct GFRfuManager
{
- /* 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 (*linkRfuCallback)(void);
- /* 0x004 */ u16 unk_04;
+ /* 0x000 */ void (*callback)(void);
+ /* 0x004 */ u16 state;
/* 0x006 */ u8 filler_06[4];
- /* 0x00a */ u16 unk_0a;
- /* 0x00c */ u8 unk_0c;
+ /* 0x00a */ u16 linkmanMsg;
+ /* 0x00c */ u8 parentChild;
/* 0x00d */ u8 playerCount;
- /* 0x00e */ u8 unk_0e;
+ /* 0x00e */ bool8 unk_0e;
/* 0x00f */ u8 unk_0f;
/* 0x010 */ u16 unk_10;
/* 0x012 */ u16 unk_12;
- /* 0x014 */ u8 unk_14[4][14];
+ /* 0x014 */ u8 unk_14[RFU_CHILD_MAX][14];
/* 0x04c */ u8 unk_4c[14];
- /* 0x05a */ u8 unk_5a;
+ /* 0x05a */ u8 blockRequestType;
/* 0x05b */ u8 unk_5b;
- /* 0x05c */ u8 unk_5c[5];
- /* 0x061 */ u8 unk_61[5];
- /* 0x066 */ u8 unk_66;
- /* 0x067 */ u8 unk_67;
+ /* 0x05c */ bool8 blockReceived[MAX_RFU_PLAYERS];
+ /* 0x061 */ bool8 numBlocksReceived[MAX_RFU_PLAYERS];
+ /* 0x066 */ u8 idleTaskId;
+ /* 0x067 */ u8 searchTaskId;
/* 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;
+ /* 0x06c */ struct RfuBlockSend sendBlock;
+ /* 0x080 */ struct RfuBlockSend recvBlock[MAX_RFU_PLAYERS];
+ /* 0x0e4 */ bool8 readyCloseLink[MAX_RFU_PLAYERS];
+ /* 0x0e9 */ bool8 readyExitStandby[MAX_RFU_PLAYERS];
+ /* 0x0ee */ vu8 errorState;
+ /* 0x0ef */ bool8 isShuttingDown;
+ /* 0x0f0 */ u8 linkLossRecoveryState;
+ /* 0x0f1 */ u8 status;
+ /* 0x0f2 */ u16 packet[RFU_PACKET_SIZE];
+ /* 0x0fe */ u16 resendExitStandbyTimer;
/* 0x100 */ u16 unk_100;
/* 0x102 */ u8 unk_102;
/* 0x103 */ u8 filler_103[0x10A - 0x103];
/* 0x10A */ struct GFtgtGname unk_10A;
u8 filler_;
u8 playerName[PLAYER_NAME_LENGTH + 1];
- /* 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;
+ /* 0x124 */ struct RfuRecvQueue recvQueue;
+ /* 0x9e8 */ struct RfuSendQueue sendQueue;
+ /* 0xc1c */ struct RfuBackupQueue backupQueue;
+ /* 0xc3c */ vu8 linkRecovered;
/* 0xc3d */ u8 unk_c3d;
- /* 0xc3e */ vu8 unk_c3e;
+ /* 0xc3e */ vu8 childSlot;
/* 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;
+ /* 0xc86 */ u8 recvStatus;
+ /* 0xc87 */ u8 recvCmds[5][7][2];
+ /* 0xccd */ u8 parentId;
+ /* 0xcce */ u8 multiplayerId;
/* 0xccf */ u8 unk_ccf;
/* 0xcd0 */ vu8 unk_cd0;
- /* 0xcd1 */ u8 unk_cd1[4];
- /* 0xcd5 */ u8 unk_cd5[4];
+ /* 0xcd1 */ u8 partnerSendStatuses[RFU_CHILD_MAX];
+ /* 0xcd5 */ u8 partnerRecvStatuses[RFU_CHILD_MAX];
/* 0xcd9 */ u8 unk_cd9;
/* 0xcda */ u8 unk_cda;
- /* 0xcdb */ vu8 unk_cdb;
- /* 0xcdc */ vu8 unk_cdc;
+ /* 0xcdb */ vbool8 unk_cdb;
+ /* 0xcdc */ vbool8 unk_cdc;
/* 0xcdd */ u8 unk_cdd;
- /* 0xcde */ u8 unk_cde[4];
+ /* 0xcde */ u8 linkPlayerIdx[RFU_CHILD_MAX];
/* 0xce2 */ u8 unk_ce2;
/* 0xce2 */ u8 unk_ce3;
/* 0xce4 */ u8 unk_ce4;
/* 0xce5 */ u8 unk_ce5;
/* 0xce5 */ u8 unk_ce6;
- /* 0xce7 */ u8 unk_ce7;
+ /* 0xce7 */ u8 acceptSlot_flag;
/* 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 GFtgtGname gUnknown_02022B14;
-extern u8 gUnknown_02022B22[];
-extern struct UnkRfuStruct_2 Rfu;
+extern struct GFtgtGname gHostRFUtgtGnameBuffer;
+extern u8 gHostRFUtgtUnameBuffer[];
+extern struct GFRfuManager Rfu;
extern u8 gWirelessStatusIndicatorSpriteId;
// Exported ROM declarations
void WipeTrainerNameRecords(void);
-void sub_800E700(void);
-void sub_800EDD4(void);
-void sub_800F6FC(u8 who);
-void sub_800F728(u8 who);
+void InitRFUAPI(void);
+void LinkRfu_Shutdown(void);
+void Rfu_SetBlockReceivedFlag(u8 who);
+void Rfu_ResetBlockReceivedFlag(u8 who);
bool32 IsSendingKeysToRfu(void);
-void sub_800F804(void);
-void sub_800F850(void);
-u8 sub_800FCD8(void);
-bool32 sub_800FE84(const u8 *src, size_t size);
+void StartSendingKeysToRfu(void);
+void Rfu_SetBerryBlenderLinkCallback(void);
+u8 Rfu_GetBlockReceivedStatus(void);
+bool32 Rfu_InitBlockSend(const u8 *src, size_t size);
void ClearLinkRfuCallback(void);
-u8 sub_80104F4(void);
-u8 rfu_get_multiplayer_id(void);
-bool8 sub_8010100(u8 a0);
+u8 Rfu_GetLinkPlayerCount(void);
+u8 Rfu_GetMultiplayerId(void);
+bool8 Rfu_SendBlockRequest(u8 type);
bool8 IsLinkRfuTaskFinished(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);
+void Rfu_SetCloseLinkCallback(void);
+void Rfu_SetLinkStandbyCallback(void);
+void ResetLinkRfuGFLayer(void);
+void UpdateWirelessStatusIndicatorSprite(void);
+void InitRFU(void);
bool32 sub_8010EC0(void);
bool32 sub_8010F1C(void);
-bool32 sub_8011A80(void);
+bool32 RfuHasErrored(void);
bool32 IsRfuRecvQueueEmpty(void);
u32 GetRfuRecvQueueLength(void);
void RfuVSync(void);
void sub_80111B0(bool32 a0);
-u8 sub_8011A74(void);
-struct GFtgtGname *sub_800F7DC(void);
-void sub_8011068(u8 a0);
-void sub_8011170(u32 a0);
-void sub_8011A64(u8 a0, u16 a1);
+u8 RfuGetStatus(void);
+struct GFtgtGname *GetHostRFUtgtGname(void);
+void UpdateGameData_GroupLockedIn(u8 a0);
+void GetLinkmanErrorParams(u32 a0);
+void RfuSetStatus(u8 a0, u16 a1);
u8 sub_801048C(bool32 a0);
-void sub_800DF90(struct GFtgtGname *buff1, u8 *buff2);
-void sub_8010F84(u8 a0, u32 a1, u32 a2);
-void sub_8011C10(u32 a0);
+void LinkRfu3_SetGnameUnameFromStaticBuffers(struct GFtgtGname *buff1, u8 *buff2);
+void SetHostRFUtgtGname(u8 activity, u32 child_sprite_genders, bool32 started);
+void InitializeRfuLinkManager_LinkLeader(u32 a0);
bool32 sub_8012240(void);
-void sub_800EF38(void);
+void LinkRfu_StopManagerAndFinalizeSlots(void);
bool32 sub_80105EC(void);
-bool32 sub_801064C(u16 a0, const u8 *a1);
-void sub_8010688(u8 a0, u16 a1, const u8 *a2);
-u32 sub_8010714(u16 a0, const u8 *a1);
-void sub_8011DC0(const u8 *a0, u16 a1);
-bool8 sub_800EF1C(void);
-bool32 sub_800EF58(bool32 a0);
-void DestroyWirelessStatusIndicatorSprite(void);
+bool32 HasTrainerLeftPartnersList(u16 trainerId, const u8 *name);
+void SendRfuStatusToPartner(u8 status, u16 trainerId, const u8 *name);
+u32 WaitSendRfuStatusToPartner(u16 trainerId, const u8 *name);
+void RequestDisconnectSlotByTrainerNameAndId(const u8 *a0, u16 a1);
+bool8 LmanAcceptSlotFlagIsNotZero(void);
+bool32 WaitRfuState(bool32 a0);
void sub_801103C(void);
-void sub_8011C5C(void);
-void sub_80106D4(void);
+void InitializeRfuLinkManager_JoinGroup(void);
+void SendLeaveGroupNotice(void);
void RecordMixTrainerNames(void);
-void sub_800ED10(void);
-void sub_800ED28(void);
-void sub_8011090(u8 a0, u32 a1, u32 a2);
-void sub_8011FC8(const u8 *src, u16 trainerId);
-void sub_8010FA0(bool32 a0, bool32 a1);
-void sub_8010F60(void);
-void sub_8010FCC(u32 a0, u32 a1, u32 a2);
-void sub_8011C84(void);
+void LinkRfu_CreateConnectionAsParent(void);
+void LinkRfu_StopManagerBeforeEnteringChat(void);
+void UpdateGameData_SetActivity(u8 activity, u32 flags, bool32 started);
+void CreateTask_RfuReconnectWithParent(const u8 *src, u16 trainerId);
+void SetGnameBufferWonderFlags(bool32 a0, bool32 a1);
+void ClearAndInitHostRFUtgtGname(void);
+void SetTradeBoardRegisteredMonInfo(u32 type, u32 species, u32 level);
+void InitializeRfuLinkManager_EnterUnionRoom(void);
void sub_8012188(const u8 *name, struct GFtgtGname *structPtr, u8 a2);
-bool32 sub_8011B90(void);
-void sub_800FE50(void *a0);
-bool32 sub_800E540(u16 id, u8 *name);
+bool32 IsUnionRoomListenTaskActive(void);
+void Rfu_SendPacket(void *data);
+bool32 PlayerHasMetTrainerBefore(u16 id, u8 *name);
void sub_8011DE0(u32 arg0);
u8 sub_801100C(s32 a0);
void sub_800EF7C(void);
-bool8 sub_800DE7C(struct GFtgtGname *buff1, u8 *buff2, u8 idx);
-bool8 sub_800DF34(struct GFtgtGname *buff1, u8 *buff2, u8 idx);
+bool8 LinkRfu_GetNameIfCompatible(struct GFtgtGname *buff1, u8 *buff2, u8 idx);
+bool8 LinkRfu_GetNameIfSerial7F7D(struct GFtgtGname *buff1, u8 *buff2, u8 idx);
s32 sub_800E87C(u8 idx);
-void sub_8011BA4(void);
-void sub_8010198(void);
+void CreateTask_RfuIdle(void);
+void DestroyTask_RfuIdle(void);
void sub_8011AC8(void);
void LinkRfu_FatalError(void);
bool32 sub_8011A9C(void);
void sub_80104B0(void);
void sub_8011A50(void);
void sub_80110B8(u32 a0);
-bool8 sub_800DAC8(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2);
-void sub_800EAB4(void);
-void sub_800EAFC(void);
-void sub_800ED34(u16 unused);
-void sub_800EDBC(u16 unused);
-void sub_800F048(void);
-void sub_800F86C(u8 unused);
-void sub_800FCC4(struct UnkRfuStruct_2_Sub_6c *data);
-void sub_800FD14(u16 command);
-void rfufunc_80F9F44(void);
-void sub_800FFB0(void);
-void rfufunc_80FA020(void);
-bool32 sub_8010454(u32 a0);
-void sub_8010528(void);
-void sub_8010750(void);
-s32 sub_80107A0(void);
-void sub_801084C(u8 taskId);
-void sub_80109E8(u16 a0);
-void sub_8010A70(void *a0);
-void sub_8010AAC(u8 taskId);
-void sub_8010D0C(u8 taskId);
-void sub_80115EC(s32 a0);
-u8 sub_8011CE4(const u8 *a0, u16 a1);
-void sub_8011D6C(u32 a0);
-void sub_8011E94(u32 a0, u32 a1);
-bool8 sub_8012224(void);
-void sub_801227C(void);
-void sub_801209C(u8 taskId);
-void sub_8011BF8(void);
-void sub_8011BA4(void);
-void sub_800D6C8(struct UnkRfuStruct_2_Sub_124 *ptr);
-void sub_800D724(struct UnkRfuStruct_2_Sub_9e8 *ptr);
-void sub_800D780(struct UnkRfuStruct_Sub_Unused *ptr);
-void sub_800D7D8(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2);
-void sub_800D888(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2);
-bool8 sub_800D934(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2);
-bool8 sub_800D9DC(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2);
-void sub_800DA68(struct UnkRfuStruct_2_Sub_c1c *q1, const u8 *q2);
-bool8 sub_800DAC8(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2);
-void sub_800DB18(struct UnkRfuStruct_Sub_Unused *q1, u8 *q2);
-bool8 sub_800DB84(struct UnkRfuStruct_Sub_Unused *q1, u8 *q2);
-void sub_800DBF8(u8 *q1, u8 mode);
-void PkmnStrToASCII(u8 *q1, const u8 *q2);
-void ASCIIToPkmnStr(u8 *q1, const u8 *q2);
-u8 sub_800DD1C(u8 maxFlags);
-void sub_800DD94(struct GFtgtGname *data, u8 r9, bool32 r2, s32 r3);
-bool8 sub_800DE7C(struct GFtgtGname *buff1, u8 *buff2, u8 idx);
-bool8 sub_800DF34(struct GFtgtGname *buff1, u8 *buff2, u8 idx);
-void sub_800DF90(struct GFtgtGname *buff1, u8 *buff2);
+bool32 IsRfuSerialNumberValid(u32 serialNo);
+bool8 IsRfuRecoveringFromLinkLoss(void);
+void RfuRecvQueue_Reset(struct RfuRecvQueue *queue);
+void RfuSendQueue_Reset(struct RfuSendQueue *queue);
+void RfuRecvQueue_Enqueue(struct RfuRecvQueue *queue, u8 *data);
+void RfuSendQueue_Enqueue(struct RfuSendQueue *queue, u8 *data);
+bool8 RfuRecvQueue_Dequeue(struct RfuRecvQueue *queue, u8 *dest);
+bool8 RfuSendQueue_Dequeue(struct RfuSendQueue *queue, u8 *dest);
+void RfuBackupQueue_Enqueue(struct RfuBackupQueue *queue, const u8 *q2);
+bool8 RfuBackupQueue_Dequeue(struct RfuBackupQueue *queue, u8 *q2);
+void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 started, s32 child_sprite_genders);
void CreateWirelessStatusIndicatorSprite(u8 x, u8 y);
void DestroyWirelessStatusIndicatorSprite(void);
void LoadWirelessStatusIndicatorSpriteGfx(void);
-u8 sub_800E124(void);
-void sub_800E15C(struct Sprite *sprite, s32 signalStrengthAnimNum);
-void sub_800E174(void);
-void CopyTrainerRecord(struct TrainerNameRecord *dest, u32 trainerId, const u8 *name);
-bool32 NameIsNotEmpty(const u8 *name);
-void RecordMixTrainerNames(void);
-bool32 sub_800E540(u16 id, u8 *name);
-void WipeTrainerNameRecords(void);
#endif //GUARD_LINK_RFU_H
diff --git a/include/list_menu.h b/include/list_menu.h
index 0a54a069a..4697ba5aa 100644
--- a/include/list_menu.h
+++ b/include/list_menu.h
@@ -24,7 +24,7 @@ struct ListMenu;
struct ListMenuItem
{
const u8 *name;
- s32 id;
+ u32 id;
};
struct ListMenuTemplate
@@ -98,7 +98,7 @@ struct CursorStruct
extern struct ScrollArrowsTemplate gTempScrollArrowTemplate;
extern struct ListMenuTemplate gMultiuseListMenuTemplate;
-s32 DoMysteryGiftListMenu(const struct WindowTemplate *windowTemplate, const struct ListMenuTemplate *listMenuTemplate, u8 arg2, u16 tileNum, u16 palNum);
+u32 DoMysteryGiftListMenu(const struct WindowTemplate *windowTemplate, const struct ListMenuTemplate *listMenuTemplate, u8 arg2, u16 tileNum, u16 palNum);
u8 ListMenuInit(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 selectedRow);
u8 ListMenuInitInRect(struct ListMenuTemplate *listMenuTemplate, struct ListMenuWindowRect *arg1, u16 scrollOffset, u16 selectedRow);
s32 ListMenu_ProcessInput(u8 listTaskId);
diff --git a/include/match_call.h b/include/match_call.h
index 8214e03b7..bc5f374bd 100644
--- a/include/match_call.h
+++ b/include/match_call.h
@@ -14,7 +14,7 @@ s32 GetRematchIdxByTrainerIdx(s32 trainerIdx);
void InitMatchCallCounters(void);
bool32 TryStartMatchCall(void);
bool32 IsMatchCallTaskActive(void);
-void StartMatchCallFromScript(u8 *message);
+void StartMatchCallFromScript(const u8 *message);
void BufferPokedexRatingForMatchCall(u8 *destStr);
bool32 SelectMatchCallMessage(int, u8 *);
void sub_8197184(u32 windowId, u32 destOffset, u32 paletteId);
diff --git a/include/math_util.h b/include/math_util.h
index 6b0d42460..04013fc03 100755
--- a/include/math_util.h
+++ b/include/math_util.h
@@ -1,14 +1,14 @@
#ifndef GUARD_MATH_UTIL_H
#define GUARD_MATH_UTIL_H
-s16 sub_8151534(s16 x, s16 y);
-s16 sub_8151550(u8 s, s16 x, s16 y);
-s32 sub_8151574(s32 x, s32 y);
-s16 sub_81515B0(s16 x, s16 y);
-s16 sub_81515D4(u8 s, s16 x, s16 y);
-s32 sub_81515FC(s32 x, s32 y);
-s16 sub_8151624(s16 y);
-s16 sub_815163C(u8 s, s16 y);
-s32 sub_815165C(s32 y);
+s16 MathUtil_Mul16(s16 x, s16 y);
+s16 MathUtil_Mul16Shift(u8 s, s16 x, s16 y);
+s32 MathUtil_Mul32(s32 x, s32 y);
+s16 MathUtil_Div16(s16 x, s16 y);
+s16 MathUtil_Div16Shift(u8 s, s16 x, s16 y);
+s32 MathUtil_Div32(s32 x, s32 y);
+s16 MathUtil_Inv16(s16 y);
+s16 MathUtil_Inv16Shift(u8 s, s16 y);
+s32 MathUtil_Inv32(s32 y);
#endif // GUARD_MATH_UTIL_H
diff --git a/include/menu.h b/include/menu.h
index d4a038920..1bd800742 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -8,6 +8,12 @@
#define MENU_NOTHING_CHOSEN -2
#define MENU_B_PRESSED -1
+#define MENU_CURSOR_DELTA_NONE 0
+#define MENU_CURSOR_DELTA_UP -1
+#define MENU_CURSOR_DELTA_DOWN 1
+#define MENU_CURSOR_DELTA_LEFT -1
+#define MENU_CURSOR_DELTA_RIGHT 1
+
enum
{
SAVE_MENU_NAME,
@@ -30,7 +36,7 @@ extern const u16 gUnknown_0860F074[];
void FreeAllOverworldWindowBuffers(void);
void InitStandardTextBoxWindows(void);
-void sub_8197200(void);
+void InitTextBoxGfxAndPrinters(void);
u16 RunTextPrintersAndIsPrinter0Active(void);
void LoadMessageBoxAndBorderGfx(void);
void DrawDialogueFrame(u8 windowId, bool8 copyToVram);
@@ -49,23 +55,23 @@ void AddTextPrinterParameterized3(u8 windowId, u8 fontId, u8 left, u8 top, const
void ClearStdWindowAndFrameToTransparent(u8 windowId, bool8 copyToVram);
void SetWindowTemplateFields(struct WindowTemplate* template, u8 priority, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 palNum, u16 baseBlock);
void DrawStdFrameWithCustomTileAndPalette(u8 windowId, bool8 copyToVram, u16 tileStart, u8 palette);
-void schedule_bg_copy_tilemap_to_vram(u8 bgNum);
+void ScheduleBgCopyTilemapToVram(u8 bgNum);
void PrintMenuTable(u8 windowId, u8 itemCount, const struct MenuAction *strs);
u8 InitMenuInUpperLeftCornerPlaySoundWhenAPressed(u8 windowId, u8 numItems, u8 initialCursorPos);
u8 Menu_GetCursorPos(void);
s8 Menu_ProcessInput(void);
s8 Menu_ProcessInputNoWrap(void);
void blit_move_info_icon(u8 winId, u8 a2, u16 x, u16 y);
-void reset_temp_tile_data_buffers(void);
-void *decompress_and_copy_tile_data_to_vram(u8 bgId, const void *src, u32 size, u16 offset, u8 mode);
-bool8 free_temp_tile_data_buffers_if_possible(void);
+void ResetTempTileDataBuffers(void);
+void *DecompressAndCopyTileDataToVram(u8 bgId, const void *src, u32 size, u16 offset, u8 mode);
+bool8 FreeTempTileDataBuffersIfPossible(void);
struct WindowTemplate CreateWindowTemplate(u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock);
void CreateYesNoMenu(const struct WindowTemplate *windowTemplate, u16 borderFirstTileNum, u8 borderPalette, u8 initialCursorPos);
void DecompressAndLoadBgGfxUsingHeap(u8 bgId, const void *src, u32 size, u16 offset, u8 mode);
s8 Menu_ProcessInputNoWrapClearOnChoose(void);
s8 ProcessMenuInput_other(void);
-void do_scheduled_bg_tilemap_copies_to_vram(void);
-void clear_scheduled_bg_copies_to_vram(void);
+void DoScheduledBgTilemapCopiesToVram(void);
+void ClearScheduledBgCopiesToVram(void);
void AddTextPrinterParameterized4(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, const u8 *color, s8 speed, const u8 *str);
void DrawDialogFrameWithCustomTileAndPalette(u8 windowId, bool8 copyToVram, u16 a2, u8 a3);
void sub_81995E4(u8 windowId, u8 optionsNo, const struct MenuAction *actions, const u8 *actionIds);
@@ -77,9 +83,9 @@ void AddTextPrinterForMessage(bool8 allowSkippingDelayWithButtonPress);
void AddItemMenuActionTextPrinters(u8 windowId, u8 fontId, u8 left, u8 top, u8 letterSpacing, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, const u8 *a8);
void sub_8198DBC(u8 windowId, u8 fontId, u8 left, u8 top, u8 a4, u8 itemCount, u8 itemCount2, const struct MenuAction *strs, const u8 *a8);
u8 sub_8199944(u8 windowId, u8 optionWidth, u8 columns, u8 rows, u8 initialCursorPos);
-u8 sub_8199134(s8, s8);
+u8 ChangeListMenuCursorPosition(s8 deltaX, s8 deltaY);
u8 GetStartMenuWindowId(void);
-void sub_819A2BC(u8, u8);
+void ListMenuLoadStdPalAt(u8, u8);
u8 Menu_MoveCursor(s8 cursorDelta);
u8 Menu_MoveCursorNoWrapAround(s8 cursorDelta);
void DrawStdWindowFrame(u8 windowId, bool8 CopyToVram);
diff --git a/include/menu_helpers.h b/include/menu_helpers.h
index 442f4a063..4557ebbb1 100644
--- a/include/menu_helpers.h
+++ b/include/menu_helpers.h
@@ -30,8 +30,8 @@ u8 GetLRKeysPressed(void);
u8 GetLRKeysPressedAndHeld(void);
bool8 sub_8122148(u16 itemId);
bool8 itemid_80BF6D8_mail_related(u16 itemId);
-bool8 sub_81221AC(void);
-bool8 sub_81221EC(void);
+bool8 MenuHelpers_LinkSomething(void);
+bool8 MenuHelpers_CallLinkSomething(void);
void sub_812220C(struct ItemSlot *slots, u8 count, u8 *arg2, u8 *usedSlotsCount, u8 maxUsedSlotsCount);
void sub_812225C(u16 *scrollOffset, u16 *cursorPos, u8 maxShownItems, u8 numItems);
void sub_8122298(u16 *arg0, u16 *arg1, u8 arg2, u8 arg3, u8 arg4);
diff --git a/include/menu_specialized.h b/include/menu_specialized.h
index 14a246468..242e1c6b2 100644
--- a/include/menu_specialized.h
+++ b/include/menu_specialized.h
@@ -5,6 +5,15 @@
#include "player_pc.h"
#include "list_menu.h"
#include "pokemon.h"
+#include "constants/berry.h"
+
+#define TAG_CONDITION_MON 100
+#define TAG_CONDITION_BALL 101
+#define TAG_CONDITION_CANCEL 102
+#define TAG_CONDITION_BALL_PLACEHOLDER 103
+#define TAG_CONDITION_SPARKLE 104
+
+#define MAX_CONDITION_SPARKLES 10
struct UnknownSubStruct_81D1ED4
{
@@ -12,12 +21,12 @@ struct UnknownSubStruct_81D1ED4
u16 unk2;
};
-struct UnknownStruct_81D1ED4
+struct ConditionGraph
{
- /*0x000*/ u8 unk0[4][5];
- /*0x014*/ struct UnknownSubStruct_81D1ED4 unk14[4][5];
- /*0x064*/ struct UnknownSubStruct_81D1ED4 unk64[10][5];
- /*0x12C*/ struct UnknownSubStruct_81D1ED4 unk12C[5];
+ /*0x000*/ u8 unk0[4][FLAVOR_COUNT];
+ /*0x014*/ struct UnknownSubStruct_81D1ED4 unk14[4][FLAVOR_COUNT];
+ /*0x064*/ struct UnknownSubStruct_81D1ED4 unk64[10][FLAVOR_COUNT];
+ /*0x12C*/ struct UnknownSubStruct_81D1ED4 unk12C[FLAVOR_COUNT];
/*0x140*/ u16 unk140[66][2];
/*0x248*/ u16 unk248[66][2];
/*0x350*/ u16 unk350;
@@ -32,35 +41,35 @@ u8 sub_81D1DC0(struct PlayerPCItemPageStruct *page);
void sub_81D1E90(struct PlayerPCItemPageStruct *page);
void sub_81D1EC0(void);
void sub_81D1D04(u8 a0);
-void sub_81D1ED4(struct UnknownStruct_81D1ED4 *a0);
-void sub_81D2108(struct UnknownStruct_81D1ED4 *arg0);
+void sub_81D1ED4(struct ConditionGraph *graph);
+void sub_81D2108(struct ConditionGraph *graph);
void sub_81D21DC(u8 bg);
-void sub_81D20AC(struct UnknownStruct_81D1ED4 *arg0);
-void sub_81D2230(struct UnknownStruct_81D1ED4 *arg0);
-bool8 sub_81D20BC(struct UnknownStruct_81D1ED4 *arg0);
-bool32 sub_81D2074(struct UnknownStruct_81D1ED4 *a0);
+void sub_81D20AC(struct ConditionGraph *graph);
+void sub_81D2230(struct ConditionGraph *graph);
+bool8 sub_81D20BC(struct ConditionGraph *graph);
+bool32 TransitionConditionGraph(struct ConditionGraph *graph);
void sub_81D2754(u8 *arg0, struct UnknownSubStruct_81D1ED4 *arg1);
-void sub_81D1F84(struct UnknownStruct_81D1ED4 *arg0, struct UnknownSubStruct_81D1ED4 *arg1, struct UnknownSubStruct_81D1ED4 *arg2);
+void sub_81D1F84(struct ConditionGraph *graph, struct UnknownSubStruct_81D1ED4 *arg1, struct UnknownSubStruct_81D1ED4 *arg2);
void MoveRelearnerPrintText(u8 *str);
bool16 MoveRelearnerRunTextPrinters(void);
void MoveRelearnerCreateYesNoMenu(void);
u8 LoadMoveRelearnerMovesList(const struct ListMenuItem *items, u16 numChoices);
void InitMoveRelearnerWindows(bool8 useContextWindow);
s32 GetBoxOrPartyMonData(u16 boxId, u16 monId, s32 request, u8 *dst);
-void sub_81D2ED4(u8 *dst, u8 *nameDst, u16 boxId, u16 monId, u16 arg5, u16 arg6, bool8 arg7);
-void sub_81D2F78(struct UnknownStruct_81D1ED4 *arg0, u8 *sheen, u16 boxId, u16 monId, u16 arg5, u16 id, u16 arg7, bool8 arg8);
-void sub_81D3094(void *tilesDst, void *palDst, u16 boxId, u16 monId, u16 arg5, u16 arg6, bool8 arg7);
-bool8 sub_81D312C(s16 *var);
-bool8 sub_81D3150(s16 *var);
-bool8 sub_81D3178(struct UnknownStruct_81D1ED4 *arg0, s16 *arg1);
-bool8 sub_81D31A4(struct UnknownStruct_81D1ED4 *arg0, s16 *arg1);
-void sub_81D31D0(struct SpriteSheet *sheet, struct SpriteTemplate *template, struct SpritePalette *pal);
-void sub_81D321C(struct SpriteSheet *sheets, struct SpriteTemplate * template, struct SpritePalette *pals);
-void sub_81D32B0(struct SpriteSheet *sheet, struct SpritePalette *pal);
-void sub_81D3464(struct Sprite **sprites);
-void sub_81D3480(struct Sprite **sprites, u8 arg1, u8 arg2);
-void sub_81D3520(struct Sprite **sprites);
-void sub_81D354C(struct Sprite **sprites);
+void GetConditionMenuMonNameAndLocString(u8 *locationDst, u8 *nameDst, u16 boxId, u16 monId, u16 partyId, u16 numMons, bool8 excludesCancel);
+void GetConditionMenuMonConditions(struct ConditionGraph *graph, u8 *sheen, u16 boxId, u16 monId, u16 partyId, u16 id, u16 numMons, bool8 excludesCancel);
+void GetConditionMenuMonGfx(void *tilesDst, void *palDst, u16 boxId, u16 monId, u16 partyId, u16 numMons, bool8 excludesCancel);
+bool8 MoveConditionMonOnscreen(s16 *x);
+bool8 MoveConditionMonOffscreen(s16 *x);
+bool8 TryUpdateConditionMonTransitionOn(struct ConditionGraph *graph, s16 *x);
+bool8 TryUpdateConditionMonTransitionOff(struct ConditionGraph *graph, s16 *x);
+void LoadConditionMonPicTemplate(struct SpriteSheet *sheet, struct SpriteTemplate *template, struct SpritePalette *pal);
+void LoadConditionSelectionIcons(struct SpriteSheet *sheets, struct SpriteTemplate * template, struct SpritePalette *pals);
+void LoadConditionSparkle(struct SpriteSheet *sheet, struct SpritePalette *pal);
+void ResetConditionSparkleSprites(struct Sprite **sprites);
+void CreateConditionSparkleSprites(struct Sprite **sprites, u8 monSpriteId, u8 count);
+void DestroyConditionSparkleSprites(struct Sprite **sprites);
+void FreeConditionSparkles(struct Sprite **sprites);
void DrawLevelUpWindowPg1(u16 windowId, u16 *statsBefore, u16 *statsAfter, u8 bgClr, u8 fgClr, u8 shadowClr);
void DrawLevelUpWindowPg2(u16 windowId, u16 *currStats, u8 bgClr, u8 fgClr, u8 shadowClr);
void GetMonLevelUpWindowStats(struct Pokemon *mon, u16 *currStats);
diff --git a/include/mevent.h b/include/mevent.h
index a34ca355c..8c0ebbad7 100755
--- a/include/mevent.h
+++ b/include/mevent.h
@@ -57,7 +57,7 @@ u32 sub_801B708(const u16 *a0, const struct MEventStruct_Unk1442CC *a1, const vo
bool32 MEventStruct_Unk1442CC_CompareField_unk_16(const struct MEventStruct_Unk1442CC *a0, const u16 *a1);
u16 MEventStruct_Unk1442CC_GetValueNFrom_unk_20(const struct MEventStruct_Unk1442CC *a0, u32 command);
u16 mevent_081445C0(u32 command);
-void sub_801B940(void);
-bool32 sub_801B94C(u16 a0);
+void ResetReceivedWonderCardFlag(void);
+bool32 MEventHandleReceivedWonderCard(u16 a0);
#endif //GUARD_MEVENT_H
diff --git a/include/mevent2.h b/include/mevent2.h
index 80b1fd51b..316a9e6de 100644
--- a/include/mevent2.h
+++ b/include/mevent2.h
@@ -1,6 +1,6 @@
#ifndef GUARD_MEVENT2_H
#define GUARD_MEVENT2_H
-void sub_801B990(u32, u32);
+void RecordIdOfWonderCardSenderByEventType(u32, u32);
#endif //GUARD_MEVENT2_H
diff --git a/include/mystery_gift.h b/include/mystery_gift.h
index 243895a67..fb0414ee0 100644
--- a/include/mystery_gift.h
+++ b/include/mystery_gift.h
@@ -12,5 +12,7 @@ bool32 MG_PrintTextOnWindow1AndWaitButton(u8 *textState, const u8 *str);
void AddTextPrinterToWindow1(const u8 *src);
void c2_ereader(void);
void c2_mystery_gift(void);
+void MG_DrawTextBorder(u8 windowId);
+s8 mevent_message_print_and_prompt_yes_no(u8 *textState, u16 *windowId, bool8 yesNoBoxPlacement, const u8 *str);
#endif //GUARD_MYSTERY_GIFT_H
diff --git a/include/naming_screen.h b/include/naming_screen.h
index 7d32abcd3..93527640e 100644
--- a/include/naming_screen.h
+++ b/include/naming_screen.h
@@ -3,91 +3,14 @@
#include "main.h"
-#define KBEVENT_NONE 0
-#define KBEVENT_PRESSED_A 5
-#define KBEVENT_PRESSED_B 6
-#define KBEVENT_PRESSED_SELECT 8
-#define KBEVENT_PRESSED_START 9
-
-#define KBROW_COUNT 4
-
-enum
-{
- KBPAGE_LETTERS_LOWER,
- KBPAGE_LETTERS_UPPER,
- KBPAGE_SYMBOLS,
- KBPAGE_COUNT,
-};
-
-enum
-{
+enum {
NAMING_SCREEN_PLAYER,
NAMING_SCREEN_BOX,
NAMING_SCREEN_CAUGHT_MON,
- NAMING_SCREEN_3,
+ NAMING_SCREEN_NICKNAME,
NAMING_SCREEN_WALDA,
};
-struct NamingScreenTemplate
-{
- u8 copyExistingString;
- u8 maxChars;
- u8 iconFunction;
- u8 addGenderIcon;
- u8 initialPage;
- u8 unused;
- const u8 *title;
-};
-
-struct NamingScreenData {
- /*0x0*/ u8 tilemapBuffer1[0x800];
- /*0x800*/ u8 tilemapBuffer2[0x800];
- /*0x800*/ u8 tilemapBuffer3[0x800];
- /*0x1800*/ u8 textBuffer[0x10];
- /*0x1810*/ u8 tileBuffer[0x600];
- /*0x1E10*/ u8 state;
- /*0x1E11*/ u8 windows[5];
- /*0x1E16*/ u16 inputCharBaseXPos;
- /*0x1E18*/ u16 bg1vOffset;
- /*0x1E1A*/ u16 bg2vOffset;
- /*0x1E1C*/ u16 bg1Priority;
- /*0x1E1E*/ u16 bg2Priority;
- /*0x1E20*/ u8 bgToReveal;
- /*0x1E21*/ u8 bgToHide;
- /*0x1E22*/ u8 currentPage;
- /*0x1E23*/ u8 cursorSpriteId;
- /*0x1E24*/ u8 selectBtnFrameSpriteId;
- /*0x1E25*/ u8 keyRepeatStartDelayCopy;
- /*0x1E28*/ const struct NamingScreenTemplate *template;
- /*0x1E2C*/ u8 templateNum;
- /*0x1E30*/ u8 *destBuffer;
- /*0x1E34*/ u16 monSpecies;
- /*0x1E36*/ u16 monGender;
- /*0x1E38*/ u32 monPersonality;
- /*0x1E3C*/ MainCallback returnCallback;
-};
-
-
-enum
-{
- MAIN_STATE_BEGIN_FADE_IN,
- MAIN_STATE_WAIT_FADE_IN,
- MAIN_STATE_HANDLE_INPUT,
- MAIN_STATE_MOVE_TO_OK_BUTTON,
- MAIN_STATE_START_PAGE_SWAP,
- MAIN_STATE_WAIT_PAGE_SWAP,
- MAIN_STATE_6,
- MAIN_STATE_UPDATE_SENT_TO_PC_MESSAGE,
- MAIN_STATE_BEGIN_FADE_OUT,
-};
-
-enum
-{
- INPUT_STATE_DISABLED,
- INPUT_STATE_ENABLED,
- INPUT_STATE_2,
-};
-
void DoNamingScreen(u8 templateNum, u8 *destBuffer, u16 monSpecies, u16 monGender, u32 monPersonality, MainCallback returnCallback);
#endif // GUARD_NAMING_SCREEN_H
diff --git a/include/overworld.h b/include/overworld.h
index 78a5b4ad0..a2eac7e29 100644
--- a/include/overworld.h
+++ b/include/overworld.h
@@ -24,6 +24,8 @@
#define MOVEMENT_MODE_FROZEN 1
#define MOVEMENT_MODE_SCRIPTED 2
+#define SKIP_OBJECT_EVENT_LOAD 1
+
struct InitialPlayerAvatarState
{
u8 transitionFlags;
@@ -99,8 +101,7 @@ void SetDefaultFlashLevel(void);
void Overworld_SetFlashLevel(s32 flashLevel);
u8 Overworld_GetFlashLevel(void);
void SetCurrentMapLayout(u16 mapLayoutId);
-void sub_8085540(u8 var);
-u8 sub_808554C(void);
+void SetObjectEventLoadFlag(u8 var);
u16 GetLocationMusic(struct WarpData *warp);
u16 GetCurrLocationDefaultMusic(void);
u16 GetWarpDestinationMusic(void);
@@ -135,11 +136,9 @@ void SetUnusedCallback(void *a0);
void CB2_NewGame(void);
void CB2_WhiteOut(void);
void CB2_LoadMap(void);
-void sub_8086024(void);
+void CB2_ReturnToFieldContestHall(void);
void CB2_ReturnToFieldCableClub(void);
void CB2_ReturnToField(void);
-void CB2_ReturnToFieldLocal(void);
-void CB2_ReturnToFieldLink(void);
void CB2_ReturnToFieldFromMultiplayer(void);
void CB2_ReturnToFieldWithOpenMenu(void);
void CB2_ReturnToFieldContinueScript(void);
diff --git a/include/palette.h b/include/palette.h
index 8d16270aa..f874bcd74 100644
--- a/include/palette.h
+++ b/include/palette.h
@@ -70,7 +70,7 @@ void BeginFastPaletteFade(u8);
void BeginHardwarePaletteFade(u8, u8, u8, u8, u8);
void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color);
void BlendPalettesUnfaded(u32, u8, u16);
-void sub_80A2C44(u32 a1, s8 a2, u8 a3, u8 a4, u16 a5, u8 a6, u8 a7);
+void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id);
void TintPalette_GrayScale(u16 *palette, u16 count);
void TintPalette_GrayScale2(u16 *palette, u16 count);
void TintPalette_SepiaTone(u16 *palette, u16 count);
diff --git a/include/palette_util.h b/include/palette_util.h
new file mode 100644
index 000000000..46468c0a6
--- /dev/null
+++ b/include/palette_util.h
@@ -0,0 +1,83 @@
+#ifndef GUARD_PALETTE_UTIL_H
+#define GUARD_PALETTE_UTIL_H
+
+struct PulseBlendSettings
+{
+ u16 blendColor;
+ u16 paletteOffset;
+ u8 numColors;
+ u8 delay;
+ u8 numFadeCycles;
+ s8 maxBlendCoeff:4;
+ s8 fadeType:2;
+ s8 restorePaletteOnUnload:1;
+ s8 unk7_7:1;
+};
+
+struct PulseBlendPalette
+{
+ u8 paletteSelector;
+ u8 blendCoeff:4;
+ u8 fadeDirection:1;
+ s8 unk1_5:1;
+ s8 available:1;
+ u32 inUse:1;
+ u8 delayCounter;
+ u8 fadeCycleCounter;
+ struct PulseBlendSettings pulseBlendSettings;
+};
+
+struct PulseBlend
+{
+ u16 usedPulseBlendPalettes;
+ struct PulseBlendPalette pulseBlendPalettes[16];
+};
+
+
+#define FLASHUTIL_USE_EXISTING_COLOR (1 << 15)
+
+struct RouletteFlashSettings
+{
+ u16 color;
+ u16 paletteOffset;
+ u8 numColors;
+ u8 delay;
+ s8 unk6; // Set but never used
+ s8 numFadeCycles:5;
+ s8 unk7_5:2; // Set but never used
+ s8 colorDeltaDir:1;
+};
+
+struct RouletteFlashPalette
+{
+ u8 state:7;
+ bool8 available:1;
+ u8 delayCounter;
+ s8 fadeCycleCounter;
+ s8 colorDelta;
+ struct RouletteFlashSettings settings;
+};
+
+struct RouletteFlashUtil
+{
+ u8 enabled;
+ u8 unused;
+ u16 flags;
+ struct RouletteFlashPalette palettes[16];
+};
+
+int InitPulseBlendPaletteSettings(struct PulseBlend *, const struct PulseBlendSettings *);
+void InitPulseBlend(struct PulseBlend *);
+void MarkUsedPulseBlendPalettes(struct PulseBlend *, u16, u8);
+void UnloadUsedPulseBlendPalettes(struct PulseBlend *, u16, u8);
+void UnmarkUsedPulseBlendPalettes(struct PulseBlend *, u16, u8);
+void UpdatePulseBlend(struct PulseBlend *);
+void ClearTilemapRect(u16 *dest, u16 src, u8 left, u8 top, u8 width, u8 height);
+void SetTilemapRect(u16 *dest, u16 *src, u8 left, u8 top, u8 width, u8 height);
+void RouletteFlash_Run(struct RouletteFlashUtil *r0);
+void RouletteFlash_Reset(struct RouletteFlashUtil *r0);
+u8 RouletteFlash_Add(struct RouletteFlashUtil *r0, u8 r1, const struct RouletteFlashSettings *r2);
+void RouletteFlash_Stop(struct RouletteFlashUtil *r0, u16 r1);
+void RouletteFlash_Enable(struct RouletteFlashUtil *r0, u16 r1);
+
+#endif // GUARD_PALETTE_UTIL_H
diff --git a/include/pokeball.h b/include/pokeball.h
index 12b9b1eff..1cdb08f94 100644
--- a/include/pokeball.h
+++ b/include/pokeball.h
@@ -18,6 +18,14 @@ enum
POKEBALL_COUNT
};
+enum {
+ BALL_AFFINE_ANIM_0,
+ BALL_ROTATE_RIGHT,
+ BALL_ROTATE_LEFT,
+ BALL_AFFINE_ANIM_3,
+ BALL_AFFINE_ANIM_4
+};
+
extern const struct SpriteTemplate gBallSpriteTemplates[];
#define POKEBALL_PLAYER_SENDOUT 0xFF
diff --git a/include/pokeblock.h b/include/pokeblock.h
index 6dd07b689..c82e99d8f 100644
--- a/include/pokeblock.h
+++ b/include/pokeblock.h
@@ -1,17 +1,29 @@
#ifndef GUARD_POKEBLOCK_H
#define GUARD_POKEBLOCK_H
+#include "constants/berry.h"
+#include "constants/pokemon.h"
+
#define GFX_TAG_POKEBLOCK 14818
#define GFX_TAG_POKEBLOCK_CASE 14800
enum
{
- PBLOCK_CLR_BLACK,
+ PBLOCK_CLR_NONE,
PBLOCK_CLR_RED,
PBLOCK_CLR_BLUE,
PBLOCK_CLR_PINK,
PBLOCK_CLR_GREEN,
- PBLOCK_CLR_YELLOW
+ PBLOCK_CLR_YELLOW,
+ PBLOCK_CLR_PURPLE,
+ PBLOCK_CLR_INDIGO,
+ PBLOCK_CLR_BROWN,
+ PBLOCK_CLR_LITE_BLUE,
+ PBLOCK_CLR_OLIVE,
+ PBLOCK_CLR_GRAY,
+ PBLOCK_CLR_BLACK,
+ PBLOCK_CLR_WHITE,
+ PBLOCK_CLR_GOLD,
};
enum
@@ -43,7 +55,7 @@ void ChooseMonToGivePokeblock(struct Pokeblock *pokeblock, void (*callback)(void
void CB2_PreparePokeblockFeedScene(void);
// pokeblock
-extern const s8 gPokeblockFlavorCompatibilityTable[];
+extern const s8 gPokeblockFlavorCompatibilityTable[NUM_NATURES * FLAVOR_COUNT];
extern const u8 *const gPokeblockNames[];
extern const struct CompressedSpriteSheet gPokeblockCase_SpriteSheet;
extern const struct CompressedSpritePalette gPokeblockCase_SpritePal;
diff --git a/include/pokemon.h b/include/pokemon.h
index 7ac65d36b..d75ec94f3 100644
--- a/include/pokemon.h
+++ b/include/pokemon.h
@@ -254,7 +254,7 @@ extern const u16 *const gLevelUpLearnsets[];
extern const u8 gPPUpGetMask[];
extern const u8 gPPUpSetMask[];
extern const u8 gPPUpAddMask[];
-extern const u8 gStatStageRatios[][2];
+extern const u8 gStatStageRatios[MAX_STAT_STAGE + 1][2];
extern const u16 gLinkPlayerFacilityClasses[];
extern const struct SpriteTemplate gUnknown_08329D98[];
extern const s8 gNatureStatTable[][5];
@@ -279,8 +279,8 @@ void sub_80686FC(struct Pokemon *mon, struct BattleTowerPokemon *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);
+u16 GetUnionRoomTrainerPic(void);
+u16 GetUnionRoomTrainerClass(void);
void CreateObedientEnemyMon(void);
void CalculateMonStats(struct Pokemon *mon);
void BoxMonToMon(const struct BoxPokemon *src, struct Pokemon *dest);
diff --git a/include/pokemon_jump.h b/include/pokemon_jump.h
index 9cf65212f..91733b385 100644
--- a/include/pokemon_jump.h
+++ b/include/pokemon_jump.h
@@ -3,7 +3,7 @@
#include "main.h"
-void sub_802A9A8(u16 monId, MainCallback callback);
+void StartPokemonJump(u16 monId, MainCallback callback);
bool32 IsSpeciesAllowedInPokemonJump(u16 species);
void IsPokemonJumpSpeciesInParty(void);
void ResetPokeJumpResults(void);
diff --git a/include/pokemon_summary_screen.h b/include/pokemon_summary_screen.h
index 1c7510db6..6413dcdec 100755
--- a/include/pokemon_summary_screen.h
+++ b/include/pokemon_summary_screen.h
@@ -9,10 +9,10 @@ extern const u8 *const gMoveDescriptionPointers[];
extern const u8 *const gNatureNamePointers[];
void ShowPokemonSummaryScreen(u8 mode, void *mons, u8 monIndex, u8 maxMonIndex, void (*callback)(void));
-void ShowSelectMovePokemonSummaryScreen(struct Pokemon *, u8, u8, MainCallback, u16);
+void ShowSelectMovePokemonSummaryScreen(struct Pokemon *mons, u8 monIndex, u8 maxMonIndex, void (*callback)(void), u16 newMove);
void ShowPokemonSummaryScreenSet40EF(u8 mode, struct BoxPokemon *mons, u8 monIndex, u8 maxMonIndex, void (*callback)(void));
u8 GetMoveSlotToReplace(void);
-void SummaryScreen_SetUnknownTaskId(u8 a0);
+void SummaryScreen_SetUnknownTaskId(u8 taskId);
void SummaryScreen_DestroyUnknownTask(void);
// The Pokemon Summary Screen can operate in different modes. Certain features,
diff --git a/include/pokenav.h b/include/pokenav.h
index 3eafe9af2..ac916f3ba 100644
--- a/include/pokenav.h
+++ b/include/pokenav.h
@@ -391,7 +391,7 @@ u32 sub_81CD070(void);
void sub_81CD1C0(void);
bool32 sub_81CD3C4(void);
bool32 sub_81CDD5C(void);
-struct UnknownStruct_81D1ED4 *sub_81CDC70(void);
+struct ConditionGraph *sub_81CDC70(void);
u16 sub_81CDC60(void);
u16 sub_81CDC50(void);
u8 sub_81CDDB0(void);
diff --git a/include/rayquaza_scene.h b/include/rayquaza_scene.h
index fe66b3df0..5aa21981e 100644
--- a/include/rayquaza_scene.h
+++ b/include/rayquaza_scene.h
@@ -1,17 +1,6 @@
#ifndef GUARD_RAYQUAZA_SCENE_H
#define GUARD_RAYQUAZA_SCENE_H
-void DoRayquazaScene(u8 animId, bool8 onlyOneAnim, void (*callback)(void));
-
-enum
-{
- RAY_ANIM_DUO_FIGHT_PRE,
- RAY_ANIM_DUO_FIGHT,
- RAY_ANIM_TAKES_FLIGHT,
- RAY_ANIM_DESCENDS,
- RAY_ANIM_CHARGES,
- RAY_ANIM_CHACES_AWAY,
- RAY_ANIM_END
-};
+void DoRayquazaScene(u8 animId, bool8 endEarly, void (*callback)(void));
#endif // GUARD_RAYQUAZA_SCENE_H
diff --git a/include/rom_8011DC0.h b/include/rom_8011DC0.h
deleted file mode 100644
index ee7397320..000000000
--- a/include/rom_8011DC0.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#ifndef GUARD_rom_8011DC0_H
-#define GUARD_rom_8011DC0_H
-
-#endif //GUARD_rom_8011DC0_H
diff --git a/include/rom_81520A8.h b/include/rom_81520A8.h
deleted file mode 100644
index 2be12200f..000000000
--- a/include/rom_81520A8.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef GUARD_ROM_81520A8_H
-#define GUARD_ROM_81520A8_H
-
-struct UnkStruct_81520A8
-{
- struct OamData oam;
- s16 x;
- s16 y;
- s16 xDelta;
- s16 yDelta;
- u16 tileTag;
- u16 palTag;
- u16 tileNum;
- u8 id;
- u8 filler17; // Unused.
- u8 unk18;
- u8 unk19_0:1;
- u8 unk19_1:1;
- u8 unk19_2:1;
- u8 priority:2;
- s16 data[8];
- void (*callback)(struct UnkStruct_81520A8 *);
-};
-
-bool32 sub_81521C0(u8 count);
-bool32 sub_8152254(void);
-bool32 sub_81522D4(void);
-u8 sub_8152438(u8 id, void (*func)(struct UnkStruct_81520A8 *));
-u8 sub_8152474(u8 id, u8 dataArrayId, s16 dataValue);
-u8 sub_81524C4(const struct OamData *oam, u16 tileTag, u16 palTag, s16 x, s16 y, u8 arg5, u8 priority);
-u8 sub_81525D0(u8 id);
-
-#endif // GUARD_ROM_81520A8_H
diff --git a/include/roulette.h b/include/roulette.h
index 71100d0d3..c753f671c 100755
--- a/include/roulette.h
+++ b/include/roulette.h
@@ -1,34 +1,6 @@
#ifndef GUARD_ROULETTE_H
#define GUARD_ROULETTE_H
-struct UnkStruct1
-{
- u16 var00;
- u16 var02;
- u8 var04;
- u8 var05;
- u8 var06;
- s8 var07_0:5;
- s8 var07_5:2;
- s8 var07_7:1;
-};
-
-struct UnkStruct3
-{
- u8 var00_0:7;
- u8 var00_7:1;
- u8 var01;
- s8 var02;
- s8 var03;
- struct UnkStruct1 var04;
-};
-
-struct UnkStruct0
-{
- u8 var00;
- u8 var01;
- u16 var02; //flag for each UnkStruct3
- struct UnkStruct3 var04[0x10];
-};
+void PlayRoulette(void);
#endif // GUARD_ROULETTE_H
diff --git a/include/roulette_util.h b/include/roulette_util.h
deleted file mode 100644
index 76752fe74..000000000
--- a/include/roulette_util.h
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef GUARD_ROULETTE_UTIL_H
-#define GUARD_ROULETTE_UTIL_H
-
-#include "roulette.h"
-
-struct PulseBlendSettings
-{
- u16 blendColor;
- u16 paletteOffset;
- u8 numColors;
- u8 delay;
- u8 numFadeCycles;
- s8 maxBlendCoeff:4;
- s8 fadeType:2;
- s8 restorePaletteOnUnload:1;
- s8 unk7_7:1;
-};
-
-struct PulseBlendPalette
-{
- u8 paletteSelector;
- u8 blendCoeff:4;
- u8 fadeDirection:1;
- s8 unk1_5:1;
- s8 available:1;
- u32 inUse:1;
- u8 delayCounter;
- u8 fadeCycleCounter;
- struct PulseBlendSettings pulseBlendSettings;
-};
-
-struct PulseBlend
-{
- u16 usedPulseBlendPalettes;
- struct PulseBlendPalette pulseBlendPalettes[16];
-};
-
-int InitPulseBlendPaletteSettings(struct PulseBlend *, const struct PulseBlendSettings *);
-void InitPulseBlend(struct PulseBlend *);
-void MarkUsedPulseBlendPalettes(struct PulseBlend *, u16, u8);
-void UnloadUsedPulseBlendPalettes(struct PulseBlend *, u16, u8);
-void UnmarkUsedPulseBlendPalettes(struct PulseBlend *, u16, u8);
-void UpdatePulseBlend(struct PulseBlend *);
-void sub_8152008(u16 *dest, u16 src, u8 left, u8 top, u8 width, u8 height);
-void sub_8152058(u16 *dest, u16 *src, u8 left, u8 top, u8 width, u8 height);
-void task_tutorial_controls_fadein(struct UnkStruct0 *r0);
-void sub_8151678(struct UnkStruct0 *r0);
-u8 sub_815168C(struct UnkStruct0 *r0, u8 r1, const struct UnkStruct1 *r2);
-void sub_8151A9C(struct UnkStruct0 *r0, u16 r1);
-void sub_8151A48(struct UnkStruct0 *r0, u16 r1);
-
-#endif // GUARD_ROULETTE_UTIL_H
diff --git a/include/save.h b/include/save.h
index 225b2b62c..18b57502b 100644
--- a/include/save.h
+++ b/include/save.h
@@ -102,7 +102,7 @@ u8 Save_LoadGameData(u8 saveType);
u16 sub_815355C(void);
u32 TryReadSpecialSaveSection(u8 sector, u8* dst);
u32 TryWriteSpecialSaveSection(u8 sector, u8* src);
-void sub_8153688(u8 taskId);
+void Task_LinkSave(u8 taskId);
// save_failed_screen.c
void DoSaveFailedScreen(u8 saveType);
diff --git a/include/script_pokemon_80F8.h b/include/script_pokemon_80F8.h
deleted file mode 100644
index 8dd7ed0c0..000000000
--- a/include/script_pokemon_80F8.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef GUARD_SCRIPTPOKE80F8_H
-#define GUARD_SCRIPTPOKE80F8_H
-
-void ShowContestWinner(void);
-u8 ScriptGiveMon(u16, u8, u16, u32, u32, u8);
-u8 ScriptGiveEgg(u16);
-void CreateScriptedWildMon(u16, u8, u16);
-void ScriptSetMonMoveSlot(u8, u16, u8);
-
-#endif
diff --git a/include/script_pokemon_util.h b/include/script_pokemon_util.h
new file mode 100644
index 000000000..120c28a63
--- /dev/null
+++ b/include/script_pokemon_util.h
@@ -0,0 +1,11 @@
+#ifndef GUARD_SCRIPT_POKEMON_UTIL
+#define GUARD_SCRIPT_POKEMON_UTIL
+
+u8 ScriptGiveMon(u16, u8, u16, u32, u32, u8);
+u8 ScriptGiveEgg(u16);
+void CreateScriptedWildMon(u16, u8, u16);
+void ScriptSetMonMoveSlot(u8, u16, u8);
+void ReducePlayerPartyToSelectedMons(void);
+void HealPlayerParty(void);
+
+#endif // GUARD_SCRIPT_POKEMON_UTIL
diff --git a/include/script_pokemon_util_80F87D8.h b/include/script_pokemon_util_80F87D8.h
deleted file mode 100644
index 7c246b745..000000000
--- a/include/script_pokemon_util_80F87D8.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef GUARD_SCRIPT_POKEMON_UTIL_80F87D8_H
-#define GUARD_SCRIPT_POKEMON_UTIL_80F87D8_H
-
-u16 GetContestRand(void);
-void ReducePlayerPartyToSelectedMons(void);
-void HealPlayerParty(void);
-u8 CountPlayerContestPaintings(void);
-
-#endif // GUARD_SCRIPT_POKEMON_UTIL_80F87D8_H
diff --git a/include/shop.h b/include/shop.h
index 164d6f3c2..c338103b4 100644
--- a/include/shop.h
+++ b/include/shop.h
@@ -41,7 +41,7 @@ struct ShopData
/*0x200B*/ u8 scrollIndicatorsTaskId;
/*0x200C*/ u8 iconSlot;
/*0x200D*/ u8 itemSpriteIds[2];
- /*0x2010*/ s16 viewportObjects[16][5];
+ /*0x2010*/ s16 viewportObjects[OBJECT_EVENTS_COUNT][5];
};
void CreatePokemartMenu(const u16 *);
diff --git a/include/slot_machine.h b/include/slot_machine.h
index 1b22e165f..88bbbd91b 100644
--- a/include/slot_machine.h
+++ b/include/slot_machine.h
@@ -1,21 +1,6 @@
#ifndef GUARD_SLOT_MACHINE_H
#define GUARD_SLOT_MACHINE_H
-#define NUM_REELS 3
-#define REEL_NUM_TAGS 21
-#define REEL_TAG_HEIGHT 24
-#define SLOT_MACHINE_COUNT 12
-
-// Lucky Flags
-#define LUCKY_BIAS_REPLAY (1 << 0)
-#define LUCKY_BIAS_CHERRY (1 << 1)
-#define LUCKY_BIAS_LOTAD (1 << 2)
-#define LUCKY_BIAS_AZURILL (1 << 3)
-#define LUCKY_BIAS_POWER (1 << 4)
-#define LUCKY_BIAS_REELTIME (1 << 5)
-#define LUCKY_BIAS_MIXED_777 (1 << 6)
-#define LUCKY_BIAS_777 (1 << 7)
-
void PlaySlotMachine(u8, void (callback)(void));
#endif // GUARD_SLOT_MACHINE_H
diff --git a/include/start_menu.h b/include/start_menu.h
index df2a290a2..1ddd82066 100644
--- a/include/start_menu.h
+++ b/include/start_menu.h
@@ -8,8 +8,8 @@ void Task_ShowStartMenu(u8 taskId);
void ShowStartMenu(void);
void ShowBattlePyramidStartMenu(void);
void SaveGame(void);
-void sub_80A0514(void);
-void sub_80A08CC(void);
+void CB2_SetUpSaveAfterLinkBattle(void);
+void SaveForBattleTowerLink(void);
void HideStartMenu(void);
void AppendToList(u8* list, u8* pos, u8 newEntry);
diff --git a/include/starter_choose.h b/include/starter_choose.h
index 535e272b7..7a4f6e967 100644
--- a/include/starter_choose.h
+++ b/include/starter_choose.h
@@ -5,6 +5,7 @@ extern const u16 gBirchBagGrassPal[2][16];
extern const u32 gBirchBagTilemap[];
extern const u32 gBirchGrassTilemap[];
extern const u32 gBirchHelpGfx[];
+extern const u32 gPokeballSelection_Gfx[];
u16 GetStarterPokemon(u16 chosenStarterId);
void CB2_ChooseStarter(void);
diff --git a/include/strings.h b/include/strings.h
index 5720598ad..7018f9e0d 100644
--- a/include/strings.h
+++ b/include/strings.h
@@ -84,10 +84,29 @@ extern const u8 gText_SoSo[];
extern const u8 gText_Bad[];
extern const u8 gText_TheWorst[];
+extern const u8 Roulette_Text_ControlsInstruction[];
+extern const u8 Roulette_Text_KeepPlaying[];
+extern const u8 Roulette_Text_Jackpot[];
+extern const u8 Roulette_Text_ItsAHit[];
+extern const u8 Roulette_Text_NothingDoing[];
+extern const u8 Roulette_Text_YouveWonXCoins[];
+extern const u8 Roulette_Text_BoardWillBeCleared[];
+extern const u8 Roulette_Text_CoinCaseIsFull[];
+extern const u8 Roulette_Text_NoCoinsLeft[];
+extern const u8 Roulette_Text_PlayMinimumWagerIsX[];
+extern const u8 Roulette_Text_SpecialRateTable[];
+extern const u8 Roulette_Text_NotEnoughCoins[];
+
extern const u8 gText_Slots[];
extern const u8 gText_Roulette[];
extern const u8 gText_Jackpot[];
+extern const u8 gText_YouDontHaveThreeCoins[];
+extern const u8 gText_QuitTheGame[];
+extern const u8 gText_YouveGot9999Coins[];
+extern const u8 gText_YouveRunOutOfCoins[];
+extern const u8 gText_ReelTimeHelp[];
+
extern const u8 gText_First[];
extern const u8 gText_Second[];
extern const u8 gText_Third[];
@@ -374,6 +393,9 @@ extern const u8 gText_DefaultNameTerra[];
extern const u8 gText_DefaultNameLucy[];
extern const u8 gText_DefaultNameHalie[];
+extern const u8 gText_BirchInTrouble[];
+extern const u8 gText_ConfirmStarterChoice[];
+
// mystery event menu text
extern const u8 gText_EventSafelyLoaded[];
extern const u8 gText_LoadErrorEndingSession[];
@@ -962,7 +984,7 @@ extern const u8 gText_TwoDashes[];
extern const u8 *const gReturnToXStringsTable2[];
-extern const u8 gText_XPLink[];
+extern const u8 gText_NumPlayerLink[];
extern const u8 gText_ConfirmLinkWhenPlayersReady[];
extern const u8 gText_ConfirmStartLinkWithXPlayers[];
extern const u8 gText_AwaitingLinkup[];
@@ -2494,7 +2516,7 @@ extern const u8 gText_CommunicationStandby[];
extern const u8 gText_AnnouncingResults[];
extern const u8 gText_PreliminaryResults[];
extern const u8 gText_Round2Results[];
-extern const u8 gText_Var1sVar2Won[];
+extern const u8 gText_ContestantsMonWon[];
// Trainer Card
extern const u8 gText_LinkCableBattles[];
@@ -2815,10 +2837,10 @@ extern const u8 gText_RegisterTextHere[];
extern const u8 gText_InputText[];
extern const u8 gText_ExitingChat[];
extern const u8 gText_LeaderLeftEndingChat[];
-extern const u8 gText_RegisteredTextChanged[];
-extern const u8 gText_AlreadySavedFile_Unused[];
-extern const u8 gText_SavingDontTurnOff_Unused[];
-extern const u8 gText_PlayerSavedGame_Unused[];
+extern const u8 gText_RegisteredTextChangedOKToSave[];
+extern const u8 gText_AlreadySavedFile_Chat[];
+extern const u8 gText_SavingDontTurnOff_Chat[];
+extern const u8 gText_PlayerSavedGame_Chat[];
extern const u8 gText_IfLeaderLeavesChatEnds[];
extern const u8 gText_Upper[];
extern const u8 gText_Lower[];
@@ -2961,4 +2983,9 @@ extern const u8 gText_Smartness[];
extern const u8 gText_Cuteness[];
extern const u8 gText_Beauty3[];
+// Berry Blender
+extern const u8 gText_SavingDontTurnOff2[];
+extern const u8 gText_BlenderMaxSpeedRecord[];
+extern const u8 gText_234Players[];
+
#endif // GUARD_STRINGS_H
diff --git a/include/text_window.h b/include/text_window.h
index 501597aa2..7bdcacd17 100644
--- a/include/text_window.h
+++ b/include/text_window.h
@@ -20,7 +20,7 @@ void LoadUserWindowBorderGfx_(u8 windowId, u16 destOffset, u8 palOffset);
void DrawTextBorderOuter(u8 windowId, u16 tileNum, u8 palNum);
void DrawTextBorderInner(u8 windowId, u16 tileNum, u8 palNum);
void rbox_fill_rectangle(u8 windowId);
-const u16 *stdpal_get(u8 id);
+const u16 *GetTextWindowPalette(u8 id);
const u16 *GetOverworldTextboxPalettePtr(void);
void sub_8098C6C(u8 bg, u16 destOffset, u8 palOffset);
diff --git a/include/trainer_hill.h b/include/trainer_hill.h
index c849bcced..3f0644248 100644
--- a/include/trainer_hill.h
+++ b/include/trainer_hill.h
@@ -75,7 +75,7 @@ void FillHillTrainerParty(void);
void FillHillTrainersParties(void);
u8 GetTrainerEncounterMusicIdInTrainerHill(u16 trainerId);
u8 GetNumFloorsInTrainerHillChallenge(void);
-void sub_81D64C0(void);
-bool32 sub_81D6534(void);
+void TryLoadTrainerHillEReaderPalette(void);
+bool32 OnTrainerHillEReaderChallengeFloor(void);
#endif // GUARD_TRAINER_HILL_H
diff --git a/include/tv.h b/include/tv.h
index 8e9233c2b..4dc14143c 100644
--- a/include/tv.h
+++ b/include/tv.h
@@ -30,12 +30,12 @@ void AlertTVThatPlayerPlayedSlotMachine(u16 nCoinsSpent);
void AlertTVThatPlayerPlayedRoulette(u16 nCoinsSpent);
void AlertTVOfNewCoinTotal(u16 nCoinsPaidOut);
void TryPutSecretBaseSecretsOnAir(void);
-void sub_80EDB44(void);
+void TryPutTodaysRivalTrainerOnAir(void);
void sub_80EDC60(const u16 *words);
void sub_80EDA80(void);
void ReceivePokeNewsData(void *src, u32 size, u8 masterIdx);
void sub_80F0BB8(void);
-void sub_80ED950(bool8 flag);
+void RecordFishingAttemptForTV(bool8 caughtFish);
void IncrementDailySlotsUses(void);
void IncrementDailyRouletteUses(void);
void IncrementDailyWildBattles(void);
@@ -59,11 +59,11 @@ void SaveRecordedItemPurchasesForTVShow(void);
bool8 ShouldAirFrontierTVShow(void);
void sub_80EE8C8(u16 winStreak, u8 facilityAndMode);
void BravoTrainerPokemonProfile_BeforeInterview2(u8 contestStandingPlace);
-void ContestLiveUpdates_BeforeInterview_1(u8 a0);
-void ContestLiveUpdates_BeforeInterview_2(u8 a0);
-void ContestLiveUpdates_BeforeInterview_3(u8 a0);
-void ContestLiveUpdates_BeforeInterview_4(u16 a0);
-void ContestLiveUpdates_BeforeInterview_5(u8 a0, u8 a1);
+void ContestLiveUpdates_Init(u8 round1Placing);
+void ContestLiveUpdates_SetRound2Placing(u8 round2Placing);
+void ContestLiveUpdates_SetWinnerAppealFlag(u8 flag);
+void ContestLiveUpdates_SetWinnerMoveUsed(u16 move);
+void ContestLiveUpdates_SetLoserData(u8 flag, u8 loser);
void ResetGabbyAndTy(void);
#endif //GUARD_TV_H
diff --git a/include/union_room.h b/include/union_room.h
index 4c4cb5a62..563a048d3 100644
--- a/include/union_room.h
+++ b/include/union_room.h
@@ -2,71 +2,70 @@
#define GUARD_UNION_ROOM_H
#include "link_rfu.h"
+#include "link.h"
+#include "constants/union_room.h"
// Exported type declarations
-struct UnkStruct_Shared
+struct WirelessGnameUnamePair
{
- struct GFtgtGname field_0;
+ struct GFtgtGname gname;
u8 ALIGNED(4) playerName[PLAYER_NAME_LENGTH + 1];
};
struct UnkStruct_x1C
{
- struct UnkStruct_Shared unk0;
- u8 unk18:1;
+ struct WirelessGnameUnamePair gname_uname;
+ u8 active:1;
};
struct UnkStruct_x20
{
- struct UnkStruct_Shared unk;
- u16 field_18;
- u8 field_1A_0:2;
- u8 field_1A_1:1;
+ struct WirelessGnameUnamePair gname_uname;
+ u16 timeoutCounter;
+ u8 groupScheduledAnim:2;
+ bool8 useRedText:1; // Never set
u8 field_1B;
- u8 field_1D;
- u8 field_1E;
- u8 field_1F;
+ u8 filler[3];
};
struct UnkStruct_Main0
{
- struct UnkStruct_x20 arr[8];
+ struct UnkStruct_x20 arr[MAX_UNION_ROOM_PLAYERS];
};
struct UnkStruct_Main4
{
- struct UnkStruct_x1C arr[5];
+ struct UnkStruct_x1C arr[MAX_RFU_PLAYERS];
};
struct UnkStruct_Main8
{
- struct UnkStruct_x20 arr[5];
+ struct UnkStruct_x20 arr[MAX_RFU_PLAYERS];
};
-struct UnkStruct_Leader
+struct WirelessLink_Leader
{
struct UnkStruct_Main0 *field_0;
struct UnkStruct_Main4 *field_4;
struct UnkStruct_Main8 *field_8;
u8 state;
u8 textState;
- u8 field_E;
+ u8 delayTimerAfterOk;
u8 listWindowId;
- u8 field_10;
- u8 field_11;
+ u8 bButtonCancelWindowId;
+ u8 nPlayerModeWindowId;
u8 listTaskId;
- u8 field_13;
- u8 field_14;
- u8 field_15;
+ u8 playerCount;
+ u16 field_14;
u8 field_16;
- u8 field_17;
- u8 field_18;
- u8 field_19;
- u16 field_1A;
+ u8 listenTaskId;
+ u8 activity;
+ u8 joinRequestAnswer;
+ u16 memberConfirmTimeout;
};
-struct UnkStruct_Group
+struct WirelessLink_Group
{
struct UnkStruct_Main0 *field_0;
struct UnkStruct_Main4 *field_4;
@@ -74,98 +73,96 @@ struct UnkStruct_Group
u8 textState;
u8 field_A;
u8 listWindowId;
- u8 field_C;
- u8 field_D;
+ u8 bButtonCancelWindowId;
+ u8 playerNameAndIdWindowId;
u8 listTaskId;
- u8 field_F;
+ u8 leaderId;
u8 field_10;
- u8 field_11;
- u8 field_12;
+ u8 listenTaskId;
+ u8 isWonderNews;
u8 field_13;
- u8 field_14;
- u8 field_15;
+ u8 refreshTimer;
+ u8 delayBeforePrint;
};
-struct UnkStruct_8019BA8
+struct UnionRoomObject
{
- u8 field_0;
- u8 field_1;
- s8 field_2;
- u8 field_3;
+ u8 state;
+ u8 gfxId;
+ s8 animState;
+ u8 schedAnim;
};
-struct UnkStruct_URoom
+struct WirelessLink_URoom
{
struct UnkStruct_Main0 *field_0;
struct UnkStruct_Main4 *field_4;
struct UnkStruct_Main0 *field_8;
struct UnkStruct_Main4 *field_C;
- u16 field_10;
+ u16 unknown; // Never read
u16 field_12;
u8 state;
u8 stateAfterPrint;
u8 textState;
- u8 field_17;
- u8 field_18;
- u8 field_19;
- u8 field_1A;
- u8 field_1B;
- u8 field_1C;
- u8 field_1D;
- u8 field_1E;
- u8 field_1F;
- u8 field_20;
+ u8 filler[4];
+ u8 topListMenuWindowId;
+ u8 topListMenuId;
+ u8 tradeBoardSelectWindowId;
+ u8 tradeBoardDetailsWindowId;
+ u8 unused1;
+ u8 searchTaskId;
u8 spriteIds[40];
- u8 field_49;
- u8 field_4A;
- u16 field_4C[6];
- u8 field_58[0x98 - 0x58];
- u16 field_98;
- u16 field_9A[3];
- struct UnkStruct_8019BA8 field_A0[8];
- u8 field_C0[12][15];
- u8 field_174[48];
- u8 field_1A4[200];
+ u8 unused2;
+ u8 tradeBoardListMenuId;
+ u16 playerSendBuffer[6];
+ u8 activityRequestStrbufs[4][16];
+ u16 partnerYesNoResponse;
+ u16 recvActivityRequest[3];
+ struct UnionRoomObject objects[MAX_UNION_ROOM_PLAYERS];
+ u8 trainerCardStrBuffer[12][15];
+ u8 trainerCardColorStrBuffer[48];
+ u8 trainerCardMsgStrBuffer[200];
};
-union UnkUnion_Main
+union WirelessLink_Main
{
- struct UnkStruct_Leader *leader;
- struct UnkStruct_Group *group;
- struct UnkStruct_URoom *uRoom;
+ struct WirelessLink_Leader *leader;
+ struct WirelessLink_Group *group;
+ struct WirelessLink_URoom *uRoom;
};
struct UnionRoomTrade
{
- u16 field_0;
+ u16 state;
u16 type;
u32 playerPersonality;
- u8 field_8;
- u8 field_9;
+ u8 offerPlayerId;
+ u8 filler1;
u16 playerSpecies;
u16 playerLevel;
u16 species;
u16 level;
- u16 field_12;
+ u16 filler2;
u32 personality;
};
// Exported RAM declarations
-extern u8 gUnknown_02022C2C;
-extern union UnkUnion_Main gUnknown_02022C30;
-extern struct GFtgtGnameSub gUnknown_02022C38;
+extern u8 gPlayerCurrActivity;
+extern union WirelessLink_Main gUnknown_02022C30;
+extern struct GFtgtGnameSub gPartnerTgtGnameSub;
extern u16 gUnionRoomOfferedSpecies;
extern u8 gUnionRoomRequestedMonType;
// Exported ROM declarations
-u8 sub_8013F78(void);
-void nullsub_89(u8 taskId);
-void var_800D_set_xB(void);
+u8 CreateTask_CreateTradeMenu(void);
+void SetUsingUnionRoomStartMenu(void);
void MEvent_CreateTask_CardOrNewsWithFriend(u32 arg0);
void MEvent_CreateTask_CardOrNewsOverWireless(u32 arg0);
void MEvent_CreateTask_Leader(u32 arg0);
+u8 CreateTask_ListenToWireless(void);
+void StartUnionRoomBattle(u16 battleFlags);
#endif //GUARD_UNION_ROOM_H
diff --git a/include/union_room_battle.h b/include/union_room_battle.h
index 2f5086008..ffccf197f 100644
--- a/include/union_room_battle.h
+++ b/include/union_room_battle.h
@@ -1,7 +1,6 @@
#ifndef GUARD_UNION_ROOM_BATTLE_H
#define GUARD_UNION_ROOM_BATTLE_H
-u8 sub_8013C40(void);
-void sub_8014210(u16 battleFlags);
+void CB2_UnionRoomBattle(void);
#endif //GUARD_UNION_ROOM_BATTLE_H
diff --git a/include/union_room_chat.h b/include/union_room_chat.h
index e7ca9d46e..dbd45c543 100755
--- a/include/union_room_chat.h
+++ b/include/union_room_chat.h
@@ -1,18 +1,7 @@
#ifndef GUARD_UNION_ROOM_CHAT_H
#define GUARD_UNION_ROOM_CHAT_H
-enum
-{
- UNION_ROOM_KB_PAGE_UPPER,
- UNION_ROOM_KB_PAGE_LOWER,
- UNION_ROOM_KB_PAGE_EMOJI,
- UNION_ROOM_KB_PAGE_COUNT
-};
-
-#define UNION_ROOM_KB_ROW_COUNT 10
-
-
-void sub_801DD98(void);
-void copy_strings_to_sav1(void);
+void EnterUnionRoomChat(void);
+void InitUnionRoomChatRegisteredTexts(void);
#endif // GUARD_UNION_ROOM_CHAT_H
diff --git a/include/union_room_player_avatar.h b/include/union_room_player_avatar.h
index 9870d0981..c7add758a 100644
--- a/include/union_room_player_avatar.h
+++ b/include/union_room_player_avatar.h
@@ -1,14 +1,14 @@
#ifndef GUARD_UNION_ROOM_PLAYER_AVATAR_H
#define GUARD_UNION_ROOM_PLAYER_AVATAR_H
-u8 sub_8019BA8(struct UnkStruct_8019BA8 * ptr);
-void sub_8019E3C(void);
-void sub_8019E70(u8 *arg0, s32 arg1);
-void sub_8019F04(u8 *spriteIds);
-void sub_8019F2C(void);
-void sub_801A274(struct UnkStruct_URoom *arg0);
-void sub_801A284(struct UnkStruct_URoom *arg0);
-bool32 sub_801A2A8(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3);
-void sub_801A3D0(u32 arg0, u32 arg1, struct UnkStruct_Main0 *arg2);
+u8 InitUnionRoomPlayerObjects(struct UnionRoomObject *players);
+void DestroyUnionRoomPlayerObjects(void);
+void CreateGroupMemberSpritesInvisible(u8 *spriteIds, s32 playerIdx);
+void DestroyGroupMemberSprites(u8 *spriteIds);
+void SetTilesAroundUnionRoomPlayersPassable(void);
+void ScheduleUnionRoomPlayerRefresh(struct WirelessLink_URoom *uroom);
+void HandleUnionRoomPlayerRefresh(struct WirelessLink_URoom *uroom);
+bool32 TryInteractWithUnionRoomMember(struct UnkStruct_Main0 *main0, s16 *directionPtr, s16 *playerIdxPtr, u8 *spriteIds);
+void UpdateUnionRoomMemberFacing(u32 currDirection, u32 playerIdx, struct UnkStruct_Main0 *main0);
#endif //GUARD_UNION_ROOM_PLAYER_AVATAR_H
diff --git a/include/unk_transition.h b/include/unk_transition.h
deleted file mode 100644
index a9caac419..000000000
--- a/include/unk_transition.h
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef GUARD_UNK_TRANSITION_H
-#define GUARD_UNK_TRANSITION_H
-
-void Phase2Task_34(u8 taskId);
-void Phase2Task_35(u8 taskId);
-void Phase2Task_36(u8 taskId);
-void Phase2Task_37(u8 taskId);
-void Phase2Task_38(u8 taskId);
-void Phase2Task_39(u8 taskId);
-void Phase2Task_40(u8 taskId);
-void Phase2Task_41(u8 taskId);
-
-#endif // GUARD_UNK_TRANSITION_H