summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_controllers.c2
-rw-r--r--src/berry_blender.c8
-rw-r--r--src/cable_club.c31
-rw-r--r--src/field_screen_effect.c4
-rw-r--r--src/link.c10
-rw-r--r--src/link_rfu.c4
-rw-r--r--src/mystery_event_menu.c2
-rw-r--r--src/overworld.c407
-rwxr-xr-xsrc/party_menu.c2
-rw-r--r--src/record_mixing.c50
-rw-r--r--src/rom_8011DC0.c2
-rw-r--r--src/save.c4
-rwxr-xr-xsrc/script_pokemon_util_80F87D8.c21
-rw-r--r--src/start_menu.c4
-rw-r--r--src/trade.c8
15 files changed, 303 insertions, 256 deletions
diff --git a/src/battle_controllers.c b/src/battle_controllers.c
index 70a53f332..29272c19a 100644
--- a/src/battle_controllers.c
+++ b/src/battle_controllers.c
@@ -767,7 +767,7 @@ static void Task_HandleSendLinkBuffersData(u8 taskId)
{
if (IsLinkMaster())
{
- sub_800A620();
+ CheckShouldAdvanceLinkState();
gTasks[taskId].data[11]++;
}
else
diff --git a/src/berry_blender.c b/src/berry_blender.c
index f2e3c7d14..cfcd81f73 100644
--- a/src/berry_blender.c
+++ b/src/berry_blender.c
@@ -146,8 +146,8 @@ extern void sub_81AABF0(void (*callback)(void));
extern void sub_800B4C0(void);
extern void ClearLinkCallback(void);
extern void sub_8009F8C(void);
-extern void sub_8153430(void);
-extern bool8 sub_8153474(void);
+extern void FullSaveGame(void);
+extern bool8 CheckSaveFile(void);
extern void sub_80EECEC(void);
// this file's functions
@@ -2600,7 +2600,7 @@ static bool8 LinkPlayAgainHandleSaving(void)
}
break;
case 2:
- sub_8153430();
+ FullSaveGame();
sBerryBlenderData->field_1A0++;
sBerryBlenderData->framesToWait = 0;
break;
@@ -2614,7 +2614,7 @@ static bool8 LinkPlayAgainHandleSaving(void)
case 4:
if (IsLinkTaskFinished())
{
- if (sub_8153474())
+ if (CheckSaveFile())
{
sBerryBlenderData->field_1A0 = 5;
}
diff --git a/src/cable_club.c b/src/cable_club.c
index c76de7a6a..05c19c9ae 100644
--- a/src/cable_club.c
+++ b/src/cable_club.c
@@ -282,7 +282,7 @@ static void sub_80B2804(u8 taskId)
if (GetFieldMessageBoxMode() == FIELD_MESSAGE_BOX_HIDDEN)
{
- if (sub_800AA48() != GetLinkPlayerCount_2())
+ if (GetSavedPlayerCount() != GetLinkPlayerCount_2())
{
ShowFieldAutoScrollMessage(gText_ConfirmLinkWhenPlayersReady);
gTasks[taskId].func = sub_80B270C;
@@ -295,7 +295,7 @@ static void sub_80B2804(u8 taskId)
else if (gMain.heldKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
- sub_800A620();
+ CheckShouldAdvanceLinkState();
gTasks[taskId].func = sub_80B28A8;
}
}
@@ -310,7 +310,7 @@ static void sub_80B28A8(u8 taskId)
|| sub_80B2D6C(taskId) == TRUE)
return;
- if (GetLinkPlayerCount_2() != sub_800AA48())
+ if (GetLinkPlayerCount_2() != GetSavedPlayerCount())
{
gTasks[taskId].func = sub_80B2D2C;
}
@@ -764,9 +764,9 @@ static void sub_80B3194(u8 taskId)
static void sub_80B31E8(u8 taskId)
{
- if (sub_800AA48() == GetLinkPlayerCount_2())
+ if (GetSavedPlayerCount() == GetLinkPlayerCount_2())
{
- sub_800A620();
+ CheckShouldAdvanceLinkState();
gTasks[taskId].func = sub_80B3220;
}
}
@@ -999,7 +999,7 @@ void sub_80B360C(void)
SetMainCallback2(sub_80A0514);
}
-void sub_80B36EC(void)
+void EventScript_CleanupLinkRoomState(void)
{
if (gSpecialVar_0x8004 == 1 || gSpecialVar_0x8004 == 2 || gSpecialVar_0x8004 == 5 || gSpecialVar_0x8004 == 9)
{
@@ -1009,11 +1009,13 @@ void sub_80B36EC(void)
SetWarpDestinationToDynamicWarp(0x7F);
}
-void sub_80B371C(void)
+void EventScript_ExitLinkRoom(void)
{
- sub_80872B0();
+ QueueExitLinkRoomKey();
}
+// I can't find anything that would set data[0] to a value before this
+// stask starts. Is it a bug?
static void sub_80B3728(u8 taskId)
{
struct Task* task = &gTasks[taskId];
@@ -1028,7 +1030,7 @@ static void sub_80B3728(u8 taskId)
if (IsFieldMessageBoxHidden())
{
sub_8087288();
- sub_8009628(gSpecialVar_0x8005);
+ SetLocalLinkPlayerId(gSpecialVar_0x8005);
task->data[0] = 2;
}
break;
@@ -1130,7 +1132,8 @@ static void sub_80B3894(u8 taskId)
}
}
-void sub_80B3924(void)
+// Note: VAR_0x8005 is set to the ID of the trade seat.
+void EventScript_PlayerEnteredTradeSeat(void)
{
if (gWirelessCommType != 0)
{
@@ -1152,7 +1155,8 @@ void nullsub_37(void)
}
-void sub_80B3968(void)
+// Note: VAR_0x8005 is set to the ID of the player spot.
+void EventScript_ColosseumPlayerSpotTriggered(void)
{
gLinkType = 0x2211;
@@ -1166,6 +1170,7 @@ void sub_80B3968(void)
}
}
+// This function is never called.
static void sub_80B39A4(void)
{
u8 taskId = CreateTask(sub_80B3728, 80);
@@ -1265,13 +1270,13 @@ void sub_80B3AF8(u8 taskId)
}
break;
case 2:
- if (GetLinkPlayerCount_2() >= sub_800AA48())
+ if (GetLinkPlayerCount_2() >= GetSavedPlayerCount())
{
if (IsLinkMaster())
{
if (++data[1] > 30)
{
- sub_800A620();
+ CheckShouldAdvanceLinkState();
data[0]++;
}
}
diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c
index ee9b49732..b8427c7de 100644
--- a/src/field_screen_effect.c
+++ b/src/field_screen_effect.c
@@ -621,7 +621,7 @@ void sub_80AF948(void)
CreateTask(sub_80AF8E0, 10);
}
-static void sub_80AF96C(u8 taskId)
+static void Task_ReturnToWorldFromLinkRoom(u8 taskId)
{
s16 *data = gTasks[taskId].data;
@@ -654,7 +654,7 @@ static void sub_80AF96C(u8 taskId)
void sub_80AF9F8(void)
{
- CreateTask(sub_80AF96C, 10);
+ CreateTask(Task_ReturnToWorldFromLinkRoom, 10);
}
static void sub_80AFA0C(u8 taskId)
diff --git a/src/link.c b/src/link.c
index 1550d8783..72ac3e878 100644
--- a/src/link.c
+++ b/src/link.c
@@ -302,9 +302,9 @@ void LinkTestScreen(void)
SetMainCallback2(CB2_LinkTest);
}
-void sub_8009628(u8 a0)
+void SetLocalLinkPlayerId(u8 playerId)
{
- gLocalLinkPlayer.id = a0;
+ gLocalLinkPlayer.id = playerId;
}
static void InitLocalLinkPlayer(void)
@@ -1142,7 +1142,7 @@ void ResetBlockReceivedFlag(u8 who)
}
}
-void sub_800A620(void)
+void CheckShouldAdvanceLinkState(void)
{
if ((gLinkStatus & LINK_STAT_MASTER) && EXTRACT_PLAYER_COUNT(gLinkStatus) > 1)
{
@@ -1327,7 +1327,9 @@ void sub_800AA04(u8 a0)
}
}
-u8 sub_800AA48(void)
+// The number of players when trading began. This is frequently compared against the
+// current number of connected players to check if anyone dropped out.
+u8 GetSavedPlayerCount(void)
{
return gSavedLinkPlayerCount;
}
diff --git a/src/link_rfu.c b/src/link_rfu.c
index 859d741b1..f13d15337 100644
--- a/src/link_rfu.c
+++ b/src/link_rfu.c
@@ -3788,10 +3788,10 @@ bool32 sub_8010454(u32 a0)
u8 sub_801048C(bool32 a0)
{
- if (a0 == 0)
+ if (a0 == FALSE)
return sub_800D550(0, 0);
sub_800D550(1, 0x258);
- return FALSE;
+ return 0;
}
void sub_80104B0(void)
diff --git a/src/mystery_event_menu.c b/src/mystery_event_menu.c
index 0de4675d9..2058bb81f 100644
--- a/src/mystery_event_menu.c
+++ b/src/mystery_event_menu.c
@@ -179,7 +179,7 @@ static void CB2_MysteryEventMenu(void)
if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
- sub_800A620();
+ CheckShouldAdvanceLinkState();
SetWindowBorderStyle(1, 1, 1, 0xD);
PrintMysteryMenuText(1, gText_LoadingEvent, 1, 2, 0);
PutWindowTilemap(1);
diff --git a/src/overworld.c b/src/overworld.c
index ca588a072..671d3412f 100644
--- a/src/overworld.c
+++ b/src/overworld.c
@@ -66,48 +66,47 @@
#include "constants/species.h"
#include "constants/weather.h"
-// These two are a hack to stop user input until link stuff can be
-// resolved.
-#define LINK_KEY_CODE_HANDLE_RECV_QUEUE 0x1B
-#define LINK_KEY_CODE_HANDLE_SEND_QUEUE 0x1C
-#define LINK_KEY_CODE_UNK_7 0x1D
-#define LINK_KEY_CODE_UNK_8 0x1E
-
#define PLAYER_TRADING_STATE_IDLE 0x80
#define PLAYER_TRADING_STATE_BUSY 0x81
#define PLAYER_TRADING_STATE_UNK_2 0x82
-#define PLAYER_TRADING_STATE_UNK_3 0x83
-
-#define EVENT_SCRIPT_NONE 0
-#define EVENT_SCRIPT_ID_9 9
-#define EVENT_SCRIPT_ID_10 10
+#define PLAYER_TRADING_STATE_EXITING_ROOM 0x83
+
+#define FACING_NONE 0
+#define FACING_UP 1
+#define FACING_DOWN 2
+#define FACING_LEFT 3
+#define FACING_RIGHT 4
+#define FACING_FORCED_UP 7
+#define FACING_FORCED_DOWN 8
+#define FACING_FORCED_LEFT 9
+#define FACING_FORCED_RIGHT 10
// event scripts
-extern const u8 EventScript_WhiteOut[];
-extern const u8 EventScript_271862[];
-extern const u8 EventScript_277513[];
-extern const u8 EventScript_TradeRoom_TooBusyToNotice[];
-extern const u8 EventScript_TradeRoom_ReadTrainerCard_NoColor[];
-extern const u8 EventScript_TradeRoom_ReadTrainerCard_Normal[];
-extern const u8 gUnknown_08277388[];
-extern const u8 gUnknown_082773A3[];
-extern const u8 gUnknown_082773BE[];
-extern const u8 gUnknown_082773D9[];
-extern const u8 gUnknown_0827741D[];
-extern const u8 gUnknown_08277432[];
-extern const u8 gUnknown_08277447[];
-extern const u8 gUnknown_0827745C[];
-extern const u8 gUnknown_08277374[];
-extern const u8 gUnknown_0827737E[];
-extern const u8 gUnknown_082773FF[];
-extern const u8 gUnknown_082773F5[];
+extern const u8 gEventScript_WhiteOut[];
+extern const u8 gEventScript_ResetMrBriney[];
+extern const u8 gEventScript_DoLinkRoomExit[];
+extern const u8 gEventScript_TradeRoom_TooBusyToNotice[];
+extern const u8 gEventScript_TradeRoom_ReadTrainerCard_NoColor[];
+extern const u8 gEventScript_TradeRoom_ReadTrainerCard_Normal[];
+extern const u8 gEventScript_DoubleBattleColosseum_PlayerSpot0[];
+extern const u8 gEventScript_DoubleBattleColosseum_PlayerSpot1[];
+extern const u8 gEventScript_DoubleBattleColosseum_PlayerSpot2[];
+extern const u8 gEventScript_DoubleBattleColosseum_PlayerSpot3[];
+extern const u8 gEventScript_RecordCenter_Spot0[];
+extern const u8 gEventScript_RecordCenter_Spot1[];
+extern const u8 gEventScript_RecordCenter_Spot2[];
+extern const u8 gEventScript_RecordCenter_Spot3[];
+extern const u8 gEventScript_SingleBattleColosseum_PlayerSpot0[];
+extern const u8 gEventScript_SingleBattleColosseum_PlayerSpot1[];
+extern const u8 gEventScript_TradeCenter_Chair1[];
+extern const u8 gEventScript_TradeCenter_Chair0[];
extern const u8 gEventScript_ConfirmLeaveTradeRoom[];
-extern const u8 gUnknown_08277509[];
+extern const u8 gEventScript_TerminateLink[];
extern const struct MapLayout *const gMapLayouts[];
extern const struct MapHeader *const *const gMapGroups[];
extern const int gMaxFlashLevel;
-extern const u16 gUnknown_82EC7C4[];
+extern const u16 gOverworldBackgroundLayerFlags[];
static void Overworld_ResetStateAfterWhiteOut(void);
static void c2_80567AC(void);
@@ -123,7 +122,7 @@ static bool32 map_loading_iteration_2_link(u8 *state);
static void mli4_mapscripts_and_other(void);
static void InitOverworldGraphicsRegisters(void);
static u8 GetSpriteForLinkedPlayer(u8);
-static u16 sub_80871C0(u32 a1);
+static u16 KeyInterCB_SendNothing(u32 a1);
static void sub_80867C8(void);
static void sub_80867D8(void);
static void sub_8086AE4(void);
@@ -140,7 +139,7 @@ static void ClearAllPlayerKeys(void);
static void ResetAllTradingStates(void);
static void UpdateHeldKeyCode(u16);
static void UpdateAllLinkPlayers(u16*, s32);
-static u8 npc_something3(u8 a1, u8 a2);
+static u8 FlipVerticalAndClearForced(u8 a1, u8 a2);
static u8 LinkPlayerDetectCollision(u8 selfEventObjId, u8 a2, s16 x, s16 y);
static void CreateLinkPlayerSprite(u8 linkPlayerId, u8 gameVersion);
static void GetLinkPlayerCoords(u8 linkPlayerId, u16 *x, u16 *y);
@@ -148,7 +147,7 @@ static u8 GetLinkPlayerFacingDirection(u8 linkPlayerId);
static u8 GetLinkPlayerElevation(u8 linkPlayerId);
static s32 sub_80878E4(u8 linkPlayerId);
static u8 GetLinkPlayerIdAt(s16 x, s16 y);
-static void RunPlayerEventScript(u8 linkPlayerId, u8 a2);
+static void SetPlayerFacingDirection(u8 linkPlayerId, u8 a2);
static void ZeroEventObject(struct EventObject *eventObj);
static void SpawnLinkPlayerEventObject(u8 linkPlayerId, s16 x, s16 y, u8 a4);
static void InitLinkPlayerEventObjectPos(struct EventObject *eventObj, s16 x, s16 y);
@@ -159,7 +158,7 @@ static void sub_8087584(void);
static u32 GetLinkSendQueueLength(void);
static void ZeroLinkPlayerEventObject(struct LinkPlayerEventObject *linkPlayerEventObj);
static const u8 *TryInteractWithPlayer(struct TradeRoomPlayer *a1);
-static u16 GetTypeForTileEventScript(const u8 *script);
+static u16 GetDirectionForEventScript(const u8 *script);
static void sub_8087510(void);
static void InitLinkRoomStartMenuScript(void);
static void sub_8087530(const u8 *script);
@@ -176,7 +175,7 @@ static u16 KeyInterCB_DeferToSendQueue(u32);
static void ResetPlayerHeldKeys(u16 *a1);
static u16 KeyInterCB_SelfIdle(u32 a1);
static u16 KeyInterCB_DeferToEventScript(u32 a1);
-static u16 sub_8087068(u16 a1);
+static u16 GetDirectionForDpadKey(u16 a1);
static void CB1_UpdateLinkState(void);
static void SetKeyInterceptCallback(u16 (*func)(u32));
static void SetFieldVBlankCallback(void);
@@ -187,7 +186,7 @@ static u8 GetAdjustedInitialDirection(struct InitialPlayerAvatarState *playerStr
static u16 GetCenterScreenMetatileBehavior(void);
// IWRAM bss vars
-IWRAM_DATA static void *sUnknown_03000E0C;
+IWRAM_DATA static void *sUnusedCallback;
IWRAM_DATA static u8 sPlayerTradingStates[4];
// This callback is called with a player's key code. It then returns an
// adjusted key code, effectively intercepting the input before anything
@@ -338,49 +337,53 @@ static const struct ScanlineEffectParams sFlashEffectParams =
0,
};
-static u8 sub_80879D8(struct LinkPlayerEventObject *, struct EventObject *, u8);
-static u8 sub_80879F8(struct LinkPlayerEventObject *, struct EventObject *, u8);
-static u8 sub_80879FC(struct LinkPlayerEventObject *, struct EventObject *, u8);
+static u8 MovementEventModeCB_Normal(struct LinkPlayerEventObject *, struct EventObject *, u8);
+static u8 MovementEventModeCB_Ignored(struct LinkPlayerEventObject *, struct EventObject *, u8);
+static u8 MovementEventModeCB_Normal_2(struct LinkPlayerEventObject *, struct EventObject *, u8);
-static u8 (*const gLinkPlayerEventModes[])(struct LinkPlayerEventObject *, struct EventObject *, u8) =
+static u8 (*const gLinkPlayerMovementModes[])(struct LinkPlayerEventObject *, struct EventObject *, u8) =
{
- sub_80879D8,
- sub_80879F8,
- sub_80879FC,
+ MovementEventModeCB_Normal, // MOVEMENT_MODE_FREE
+ MovementEventModeCB_Ignored, // MOVEMENT_MODE_FROZEN
+ MovementEventModeCB_Normal_2, // MOVEMENT_MODE_SCRIPTED
};
-static u8 sub_8087A1C(struct LinkPlayerEventObject *, struct EventObject *, u8);
-static u8 sub_8087A20(struct LinkPlayerEventObject *, struct EventObject *, u8);
-static u8 sub_8087A88(struct LinkPlayerEventObject *, struct EventObject *, u8);
-
-static u8 (*const gUnknown_08339DD4[])(struct LinkPlayerEventObject *, struct EventObject *, u8) =
-{
- sub_8087A1C,
- sub_8087A20,
- sub_8087A20,
- sub_8087A20,
- sub_8087A20,
- sub_8087A1C,
- sub_8087A1C,
- sub_8087A88,
- sub_8087A88,
- sub_8087A88,
- sub_8087A88,
+static u8 FacingHandler_DoNothing(struct LinkPlayerEventObject *, struct EventObject *, u8);
+static u8 FacingHandler_DpadMovement(struct LinkPlayerEventObject *, struct EventObject *, u8);
+static u8 FacingHandler_ForcedFacingChange(struct LinkPlayerEventObject *, struct EventObject *, u8);
+
+// These handlers return TRUE if the movement was scripted and successful, and FALSE otherwise.
+static bool8 (*const gLinkPlayerFacingHandlers[])(struct LinkPlayerEventObject *, struct EventObject *, u8) =
+{
+ FacingHandler_DoNothing,
+ FacingHandler_DpadMovement,
+ FacingHandler_DpadMovement,
+ FacingHandler_DpadMovement,
+ FacingHandler_DpadMovement,
+ FacingHandler_DoNothing,
+ FacingHandler_DoNothing,
+ FacingHandler_ForcedFacingChange,
+ FacingHandler_ForcedFacingChange,
+ FacingHandler_ForcedFacingChange,
+ FacingHandler_ForcedFacingChange,
};
-static void sub_8087AA0(struct LinkPlayerEventObject *, struct EventObject *);
-static void sub_8087AA8(struct LinkPlayerEventObject *, struct EventObject *);
+static void MovementStatusHandler_EnterFreeMode(struct LinkPlayerEventObject *, struct EventObject *);
+static void MovementStatusHandler_TryAdvanceScript(struct LinkPlayerEventObject *, struct EventObject *);
-static void (*const gUnknown_08339E00[])(struct LinkPlayerEventObject *, struct EventObject *) =
+// These handlers are run after an attempted movement.
+static void (*const gMovementStatusHandler[])(struct LinkPlayerEventObject *, struct EventObject *) =
{
- sub_8087AA0,
- sub_8087AA8,
+ // FALSE:
+ MovementStatusHandler_EnterFreeMode,
+ // TRUE:
+ MovementStatusHandler_TryAdvanceScript,
};
// code
void DoWhiteOut(void)
{
- ScriptContext2_RunNewScript(EventScript_WhiteOut);
+ ScriptContext2_RunNewScript(gEventScript_WhiteOut);
SetMoney(&gSaveBlock1Ptr->money, GetMoney(&gSaveBlock1Ptr->money) / 2);
HealPlayerParty();
Overworld_ResetStateAfterWhiteOut();
@@ -406,7 +409,7 @@ void Overworld_ResetStateAfterTeleport(void)
FlagClear(FLAG_SYS_SAFARI_MODE);
FlagClear(FLAG_SYS_USE_STRENGTH);
FlagClear(FLAG_SYS_USE_FLASH);
- ScriptContext2_RunNewScript(EventScript_271862);
+ ScriptContext2_RunNewScript(gEventScript_ResetMrBriney);
}
void Overworld_ResetStateAfterDigEscRope(void)
@@ -1495,9 +1498,10 @@ void SetMainCallback1(MainCallback cb)
gMain.callback1 = cb;
}
-void sub_8085E94(void *a0)
+// This function is never called.
+void SetUnusedCallback(void *func)
{
- sUnknown_03000E0C = a0;
+ sUnusedCallback = func;
}
static bool8 map_post_load_hook_exec(void)
@@ -2102,7 +2106,7 @@ static void InitOverworldGraphicsRegisters(void)
SetGpuReg(REG_OFFSET_WIN0V, 0xFF);
SetGpuReg(REG_OFFSET_WIN1H, 0xFFFF);
SetGpuReg(REG_OFFSET_WIN1V, 0xFFFF);
- SetGpuReg(REG_OFFSET_BLDCNT, gUnknown_82EC7C4[1] | gUnknown_82EC7C4[2] | gUnknown_82EC7C4[3]
+ SetGpuReg(REG_OFFSET_BLDCNT, gOverworldBackgroundLayerFlags[1] | gOverworldBackgroundLayerFlags[2] | gOverworldBackgroundLayerFlags[3]
| BLDCNT_TGT2_OBJ | BLDCNT_EFFECT_BLEND);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(13, 7));
InitOverworldBgs();
@@ -2249,6 +2253,9 @@ static void CB1_UpdateLinkState(void)
// UpdateHeldKeyCode performs a sanity check on its input; if
// sPlayerKeyInterceptCallback echoes back the argument, which is selfId, then
// it'll use LINK_KEY_CODE_EMPTY instead.
+ //
+ // Note 2: There are some key intercept callbacks that treat the key as a player
+ // ID. It's so hacky.
UpdateHeldKeyCode(sPlayerKeyInterceptCallback(selfId));
ClearAllPlayerKeys();
}
@@ -2311,7 +2318,7 @@ static bool32 AreAnyPlayersInState(u16 tradingState)
return FALSE;
}
-static void HandleLinkPlayerKeyInput(u32 playerId, u16 key, struct TradeRoomPlayer *trainer, u16 *eventScriptType)
+static void HandleLinkPlayerKeyInput(u32 playerId, u16 key, struct TradeRoomPlayer *trainer, u16 *forceFacing)
{
const u8 *script;
@@ -2320,7 +2327,7 @@ static void HandleLinkPlayerKeyInput(u32 playerId, u16 key, struct TradeRoomPlay
script = TryGetTileEventScript(trainer);
if (script)
{
- *eventScriptType = GetTypeForTileEventScript(script);
+ *forceFacing = GetDirectionForEventScript(script);
sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_BUSY;
if (trainer->isSelf)
{
@@ -2329,7 +2336,7 @@ static void HandleLinkPlayerKeyInput(u32 playerId, u16 key, struct TradeRoomPlay
}
return;
}
- if (AreAnyPlayersInState(PLAYER_TRADING_STATE_UNK_3) == TRUE)
+ if (AreAnyPlayersInState(PLAYER_TRADING_STATE_EXITING_ROOM) == TRUE)
{
sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_BUSY;
if (trainer->isSelf)
@@ -2403,8 +2410,8 @@ static void HandleLinkPlayerKeyInput(u32 playerId, u16 key, struct TradeRoomPlay
switch (key)
{
- case LINK_KEY_CODE_UNK_3:
- sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_UNK_3;
+ case LINK_KEY_CODE_EXIT_ROOM:
+ sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_EXITING_ROOM;
break;
case LINK_KEY_CODE_UNK_2:
sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_UNK_2;
@@ -2429,12 +2436,12 @@ static void UpdateAllLinkPlayers(u16 *keys, s32 selfId)
for (i = 0; i < 4; i++)
{
u8 key = keys[i];
- u16 eventScriptType = EVENT_SCRIPT_NONE;
+ u16 setFacing = FACING_NONE;
LoadTradeRoomPlayer(i, selfId, &trainer);
- HandleLinkPlayerKeyInput(i, key, &trainer, &eventScriptType);
+ HandleLinkPlayerKeyInput(i, key, &trainer, &setFacing);
if (sPlayerTradingStates[i] == PLAYER_TRADING_STATE_IDLE)
- eventScriptType = sub_8087068(key);
- RunPlayerEventScript(i, eventScriptType);
+ setFacing = GetDirectionForDpadKey(key);
+ SetPlayerFacingDirection(i, setFacing);
}
}
@@ -2483,20 +2490,20 @@ static u16 KeyInterCB_ReadButtons(u32 key)
return LINK_KEY_CODE_EMPTY;
}
-static u16 sub_8087068(u16 a1)
+static u16 GetDirectionForDpadKey(u16 a1)
{
switch (a1)
{
case LINK_KEY_CODE_DPAD_RIGHT:
- return 4;
+ return FACING_RIGHT;
case LINK_KEY_CODE_DPAD_LEFT:
- return 3;
+ return FACING_LEFT;
case LINK_KEY_CODE_DPAD_UP:
- return 1;
+ return FACING_UP;
case LINK_KEY_CODE_DPAD_DOWN:
- return 2;
+ return FACING_DOWN;
default:
- return 0;
+ return FACING_NONE;
}
}
@@ -2577,19 +2584,19 @@ static u16 KeyInterCB_DeferToSendQueue(u32 key)
return retVal;
}
-static u16 sub_8087164(u32 key)
+static u16 KeyInterCB_DoNothingAndKeepAlive(u32 key)
{
CheckRfuKeepAliveTimer();
return LINK_KEY_CODE_EMPTY;
}
-static u16 sub_8087170(u32 linkPlayerId)
+static u16 sub_8087170(u32 keyOrPlayerId)
{
- if (sPlayerTradingStates[linkPlayerId] == PLAYER_TRADING_STATE_UNK_2)
+ if (sPlayerTradingStates[keyOrPlayerId] == PLAYER_TRADING_STATE_UNK_2)
{
if (gMain.newKeys & B_BUTTON)
{
- SetKeyInterceptCallback(sub_8087164);
+ SetKeyInterceptCallback(KeyInterCB_DoNothingAndKeepAlive);
return LINK_KEY_CODE_UNK_7;
}
else
@@ -2610,41 +2617,45 @@ static u16 sub_80871AC(u32 a1)
return LINK_KEY_CODE_UNK_2;
}
-static u16 sub_80871C0(u32 a1)
+static u16 KeyInterCB_SendNothing(u32 key)
{
return LINK_KEY_CODE_EMPTY;
}
-static u16 sub_80871C4(u32 a1)
+static u16 KeyInterCB_WaitForPlayersToExit(u32 keyOrPlayerId)
{
- if (sPlayerTradingStates[a1] != PLAYER_TRADING_STATE_UNK_3)
+ // keyOrPlayerId could be any keycode. This callback does no sanity checking
+ // on the size of the key. It's assuming that it is being called from
+ // CB1_UpdateLinkState.
+ if (sPlayerTradingStates[keyOrPlayerId] != PLAYER_TRADING_STATE_EXITING_ROOM)
CheckRfuKeepAliveTimer();
- if (AreAllPlayersInState(PLAYER_TRADING_STATE_UNK_3) == TRUE)
+ if (AreAllPlayersInState(PLAYER_TRADING_STATE_EXITING_ROOM) == TRUE)
{
- ScriptContext1_SetupScript(EventScript_277513);
- SetKeyInterceptCallback(sub_80871C0);
+ ScriptContext1_SetupScript(gEventScript_DoLinkRoomExit);
+ SetKeyInterceptCallback(KeyInterCB_SendNothing);
}
return LINK_KEY_CODE_EMPTY;
}
-static u16 sub_80871FC(u32 a1)
+static u16 KeyInterCB_SendExitRoomKey(u32 key)
{
- SetKeyInterceptCallback(sub_80871C4);
- return 23;
+ SetKeyInterceptCallback(KeyInterCB_WaitForPlayersToExit);
+ return LINK_KEY_CODE_EXIT_ROOM;
}
-static u16 sub_8087210(u32 a1)
+// Duplicate function.
+static u16 KeyInterCB_SendNothing_2(u32 key)
{
return LINK_KEY_CODE_EMPTY;
}
u32 sub_8087214(void)
{
- if (AreAnyPlayersInState(PLAYER_TRADING_STATE_UNK_3) == TRUE)
+ if (AreAnyPlayersInState(PLAYER_TRADING_STATE_EXITING_ROOM) == TRUE)
return 2;
if (sPlayerKeyInterceptCallback == sub_8087170 && sPlayerTradingStates[gLinkSelfPlayerId] != PLAYER_TRADING_STATE_UNK_2)
return 0;
- if (sPlayerKeyInterceptCallback == sub_8087164 && sPlayerTradingStates[gLinkSelfPlayerId] == PLAYER_TRADING_STATE_BUSY)
+ if (sPlayerKeyInterceptCallback == KeyInterCB_DoNothingAndKeepAlive && sPlayerTradingStates[gLinkSelfPlayerId] == PLAYER_TRADING_STATE_BUSY)
return 2;
if (AreAllPlayersInState(PLAYER_TRADING_STATE_UNK_2) != FALSE)
return 1;
@@ -2653,7 +2664,7 @@ u32 sub_8087214(void)
bool32 sub_808727C(void)
{
- return AreAnyPlayersInState(PLAYER_TRADING_STATE_UNK_3);
+ return AreAnyPlayersInState(PLAYER_TRADING_STATE_EXITING_ROOM);
}
u16 sub_8087288(void)
@@ -2668,15 +2679,17 @@ u16 sub_808729C(void)
return 0;
}
-u16 sub_80872B0(void)
+// The exit room key will be sent at the next opportunity.
+// The return value is meaningless.
+u16 QueueExitLinkRoomKey(void)
{
- SetKeyInterceptCallback(sub_80871FC);
+ SetKeyInterceptCallback(KeyInterCB_SendExitRoomKey);
return 0;
}
u16 sub_80872C4(void)
{
- SetKeyInterceptCallback(sub_8087210);
+ SetKeyInterceptCallback(KeyInterCB_SendNothing_2);
return 0;
}
@@ -2686,7 +2699,7 @@ static void LoadTradeRoomPlayer(s32 linkPlayerId, s32 myPlayerId, struct TradeRo
trainer->playerId = linkPlayerId;
trainer->isSelf = (linkPlayerId == myPlayerId) ? 1 : 0;
- trainer->c = gLinkPlayerEventObjects[linkPlayerId].mode;
+ trainer->c = gLinkPlayerEventObjects[linkPlayerId].movementMode;
trainer->facing = GetLinkPlayerFacingDirection(linkPlayerId);
GetLinkPlayerCoords(linkPlayerId, &x, &y);
trainer->pos.x = x;
@@ -2698,7 +2711,7 @@ static void LoadTradeRoomPlayer(s32 linkPlayerId, s32 myPlayerId, struct TradeRo
static bool32 sub_8087340(struct TradeRoomPlayer *player)
{
u8 v1 = player->c;
- if (v1 == 2 || v1 == 0)
+ if (v1 == MOVEMENT_MODE_SCRIPTED || v1 == MOVEMENT_MODE_FREE)
return TRUE;
else
return FALSE;
@@ -2708,7 +2721,7 @@ static bool32 sub_8087340(struct TradeRoomPlayer *player)
static bool32 sub_8087340_2(struct TradeRoomPlayer *player)
{
u8 v1 = player->c;
- if (v1 == 2 || v1 == 0)
+ if (v1 == MOVEMENT_MODE_SCRIPTED || v1 == MOVEMENT_MODE_FREE)
return TRUE;
else
return FALSE;
@@ -2716,14 +2729,14 @@ static bool32 sub_8087340_2(struct TradeRoomPlayer *player)
static u8 *TryGetTileEventScript(struct TradeRoomPlayer *player)
{
- if (player->c != 2)
- return 0;
+ if (player->c != MOVEMENT_MODE_SCRIPTED)
+ return FACING_NONE;
return GetCoordEventScriptAtMapPosition(&player->pos);
}
static bool32 PlayerIsAtSouthExit(struct TradeRoomPlayer *player)
{
- if (player->c != 2 && player->c != 0)
+ if (player->c != MOVEMENT_MODE_SCRIPTED && player->c != MOVEMENT_MODE_FREE)
return FALSE;
else if (!MetatileBehavior_IsSouthArrowWarp(player->field_C))
return FALSE;
@@ -2738,8 +2751,8 @@ static const u8 *TryInteractWithPlayer(struct TradeRoomPlayer *player)
struct MapPosition otherPlayerPos;
u8 linkPlayerId;
- if (player->c && player->c != 2)
- return 0;
+ if (player->c != MOVEMENT_MODE_FREE && player->c != MOVEMENT_MODE_SCRIPTED)
+ return FACING_NONE;
otherPlayerPos = player->pos;
otherPlayerPos.x += gDirectionToVectors[player->facing].x;
@@ -2750,46 +2763,48 @@ static const u8 *TryInteractWithPlayer(struct TradeRoomPlayer *player)
if (linkPlayerId != 4)
{
if (!player->isSelf)
- return EventScript_TradeRoom_TooBusyToNotice;
+ return gEventScript_TradeRoom_TooBusyToNotice;
else if (sPlayerTradingStates[linkPlayerId] != PLAYER_TRADING_STATE_IDLE)
- return EventScript_TradeRoom_TooBusyToNotice;
+ return gEventScript_TradeRoom_TooBusyToNotice;
else if (!GetLinkTrainerCardColor(linkPlayerId))
- return EventScript_TradeRoom_ReadTrainerCard_NoColor;
+ return gEventScript_TradeRoom_ReadTrainerCard_NoColor;
else
- return EventScript_TradeRoom_ReadTrainerCard_Normal;
+ return gEventScript_TradeRoom_ReadTrainerCard_Normal;
}
return GetInteractedLinkPlayerScript(&otherPlayerPos, player->field_C, player->facing);
}
-static u16 GetTypeForTileEventScript(const u8 *script)
-{
- if (script == gUnknown_08277388)
- return 10;
- else if (script == gUnknown_082773A3)
- return 9;
- else if (script == gUnknown_082773BE)
- return 10;
- else if (script == gUnknown_082773D9)
- return 9;
- else if (script == gUnknown_0827741D)
- return 10;
- else if (script == gUnknown_08277432)
- return 9;
- else if (script == gUnknown_08277447)
- return 10;
- else if (script == gUnknown_0827745C)
- return 9;
- else if (script == gUnknown_08277374)
- return 10;
- else if (script == gUnknown_0827737E)
- return 9;
- else if (script == gUnknown_082773F5)
- return 10;
- else if (script == gUnknown_082773FF)
- return 9;
+// This returns which direction to force the player to look when one of
+// these event scripts runs.
+static u16 GetDirectionForEventScript(const u8 *script)
+{
+ if (script == gEventScript_DoubleBattleColosseum_PlayerSpot0)
+ return FACING_FORCED_RIGHT;
+ else if (script == gEventScript_DoubleBattleColosseum_PlayerSpot1)
+ return FACING_FORCED_LEFT;
+ else if (script == gEventScript_DoubleBattleColosseum_PlayerSpot2)
+ return FACING_FORCED_RIGHT;
+ else if (script == gEventScript_DoubleBattleColosseum_PlayerSpot3)
+ return FACING_FORCED_LEFT;
+ else if (script == gEventScript_RecordCenter_Spot0)
+ return FACING_FORCED_RIGHT;
+ else if (script == gEventScript_RecordCenter_Spot1)
+ return FACING_FORCED_LEFT;
+ else if (script == gEventScript_RecordCenter_Spot2)
+ return FACING_FORCED_RIGHT;
+ else if (script == gEventScript_RecordCenter_Spot3)
+ return FACING_FORCED_LEFT;
+ else if (script == gEventScript_SingleBattleColosseum_PlayerSpot0)
+ return FACING_FORCED_RIGHT;
+ else if (script == gEventScript_SingleBattleColosseum_PlayerSpot1)
+ return FACING_FORCED_LEFT;
+ else if (script == gEventScript_TradeCenter_Chair0)
+ return FACING_FORCED_RIGHT;
+ else if (script == gEventScript_TradeCenter_Chair1)
+ return FACING_FORCED_LEFT;
else
- return 0;
+ return FACING_NONE;
}
static void sub_8087510(void)
@@ -2827,7 +2842,7 @@ static void InitMenuBasedScript(const u8 *script)
static void sub_8087584(void)
{
- ScriptContext1_SetupScript(gUnknown_08277509);
+ ScriptContext1_SetupScript(gEventScript_TerminateLink);
ScriptContext2_Enable();
}
@@ -2927,7 +2942,7 @@ static void SpawnLinkPlayerEventObject(u8 linkPlayerId, s16 x, s16 y, u8 a4)
linkPlayerEventObj->active = 1;
linkPlayerEventObj->linkPlayerId = linkPlayerId;
linkPlayerEventObj->eventObjId = eventObjId;
- linkPlayerEventObj->mode = 0;
+ linkPlayerEventObj->movementMode = MOVEMENT_MODE_FREE;
eventObj->active = 1;
eventObj->singleMovementActive = a4;
@@ -3012,7 +3027,7 @@ static u8 GetLinkPlayerIdAt(s16 x, s16 y)
for (i = 0; i < 4; i++)
{
if (gLinkPlayerEventObjects[i].active
- && (gLinkPlayerEventObjects[i].mode == 0 || gLinkPlayerEventObjects[i].mode == 2))
+ && (gLinkPlayerEventObjects[i].movementMode == 0 || gLinkPlayerEventObjects[i].movementMode == 2))
{
struct EventObject *eventObj = &gEventObjects[gLinkPlayerEventObjects[i].eventObjId];
if (eventObj->currentCoords.x == x && eventObj->currentCoords.y == y)
@@ -3022,7 +3037,7 @@ static u8 GetLinkPlayerIdAt(s16 x, s16 y)
return 4;
}
-static void RunPlayerEventScript(u8 linkPlayerId, u8 eventScriptType)
+static void SetPlayerFacingDirection(u8 linkPlayerId, u8 facing)
{
struct LinkPlayerEventObject *linkPlayerEventObj = &gLinkPlayerEventObjects[linkPlayerId];
u8 eventObjId = linkPlayerEventObj->eventObjId;
@@ -3030,94 +3045,108 @@ static void RunPlayerEventScript(u8 linkPlayerId, u8 eventScriptType)
if (linkPlayerEventObj->active)
{
- if (eventScriptType > 10)
+ if (facing > FACING_FORCED_RIGHT)
eventObj->triggerGroundEffectsOnMove = 1;
- else
- gUnknown_08339E00[gLinkPlayerEventModes[linkPlayerEventObj->mode](linkPlayerEventObj, eventObj, eventScriptType)](linkPlayerEventObj, eventObj);
+ else {
+ // This is a hack to split this code onto two separate lines, without declaring a local variable.
+ // C++ style inline variables would be nice here.
+ #define TEMP gLinkPlayerMovementModes[linkPlayerEventObj->movementMode](linkPlayerEventObj, eventObj, facing)
+
+ gMovementStatusHandler[TEMP](linkPlayerEventObj, eventObj);
+
+ // Clean up the hack.
+ #undef TEMP
+ }
}
}
-static u8 sub_80879D8(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3)
+
+static u8 MovementEventModeCB_Normal(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3)
{
- return gUnknown_08339DD4[a3](linkPlayerEventObj, eventObj, a3);
+ return gLinkPlayerFacingHandlers[a3](linkPlayerEventObj, eventObj, a3);
}
-static u8 sub_80879F8(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3)
+static u8 MovementEventModeCB_Ignored(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3)
{
- return 1;
+ return FACING_UP;
}
-static u8 sub_80879FC(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3)
+// Duplicate Function
+static u8 MovementEventModeCB_Normal_2(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3)
{
- return gUnknown_08339DD4[a3](linkPlayerEventObj, eventObj, a3);
+ return gLinkPlayerFacingHandlers[a3](linkPlayerEventObj, eventObj, a3);
}
-static u8 sub_8087A1C(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3)
+static bool8 FacingHandler_DoNothing(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3)
{
- return 0;
+ return FALSE;
}
-static u8 sub_8087A20(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3)
+static bool8 FacingHandler_DpadMovement(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3)
{
s16 x, y;
- eventObj->range.as_byte = npc_something3(a3, eventObj->range.as_byte);
+ eventObj->range.as_byte = FlipVerticalAndClearForced(a3, eventObj->range.as_byte);
EventObjectMoveDestCoords(eventObj, eventObj->range.as_byte, &x, &y);
if (LinkPlayerDetectCollision(linkPlayerEventObj->eventObjId, eventObj->range.as_byte, x, y))
{
- return 0;
+ return FALSE;
}
else
{
eventObj->directionSequenceIndex = 16;
ShiftEventObjectCoords(eventObj, x, y);
EventObjectUpdateZCoord(eventObj);
- return 1;
+ return TRUE;
}
}
-static u8 sub_8087A88(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3)
+static bool8 FacingHandler_ForcedFacingChange(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3)
{
- eventObj->range.as_byte = npc_something3(a3, eventObj->range.as_byte);
- return 0;
+ eventObj->range.as_byte = FlipVerticalAndClearForced(a3, eventObj->range.as_byte);
+ return FALSE;
}
-static void sub_8087AA0(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj)
+// This is called every time a free movement happens. Most of the time it's a No-Op.
+static void MovementStatusHandler_EnterFreeMode(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj)
{
- linkPlayerEventObj->mode = 0;
+ linkPlayerEventObj->movementMode = MOVEMENT_MODE_FREE;
}
-static void sub_8087AA8(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj)
+static void MovementStatusHandler_TryAdvanceScript(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj)
{
eventObj->directionSequenceIndex--;
- linkPlayerEventObj->mode = 1;
+ linkPlayerEventObj->movementMode = MOVEMENT_MODE_FROZEN;
MoveCoords(eventObj->range.as_byte, &eventObj->initialCoords.x, &eventObj->initialCoords.y);
if (!eventObj->directionSequenceIndex)
{
ShiftStillEventObjectCoords(eventObj);
- linkPlayerEventObj->mode = 2;
+ linkPlayerEventObj->movementMode = MOVEMENT_MODE_SCRIPTED;
}
}
-static u8 npc_something3(u8 a1, u8 a2)
+// Flip Up/Down facing codes. If newFacing doesn't specify a direction, default
+// to oldFacing. Note that this clears also the "FORCED" part of the facing code,
+// even for Left/Right codes.
+static u8 FlipVerticalAndClearForced(u8 newFacing, u8 oldFacing)
{
- switch (a1 - 1)
+ switch (newFacing - 1)
{
- case 0:
- case 6:
- return 2;
- case 1:
- case 7:
- return 1;
- case 2:
- case 8:
- return 3;
- case 3:
- case 9:
- return 4;
+ case (FACING_UP - 1):
+ case (FACING_FORCED_UP - 1):
+ return FACING_DOWN;
+ case (FACING_DOWN - 1):
+ case (FACING_FORCED_DOWN - 1):
+ return FACING_UP;
+ case (FACING_LEFT - 1):
+ case (FACING_FORCED_LEFT - 1):
+ return FACING_LEFT;
+ case (FACING_RIGHT - 1):
+ case (FACING_FORCED_RIGHT - 1):
+ return FACING_RIGHT;
}
- return a2;
+ return oldFacing;
}
static u8 LinkPlayerDetectCollision(u8 selfEventObjId, u8 a2, s16 x, s16 y)
@@ -3177,7 +3206,7 @@ static void SpriteCB_LinkPlayer(struct Sprite *sprite)
SetObjectSubpriorityByZCoord(eventObj->previousElevation, sprite, 1);
sprite->oam.priority = ZCoordToPriority(eventObj->previousElevation);
- if (!linkPlayerEventObj->mode)
+ if (!linkPlayerEventObj->movementMode != MOVEMENT_MODE_FREE)
StartSpriteAnim(sprite, GetFaceDirectionAnimNum(eventObj->range.as_byte));
else
StartSpriteAnimIfDifferent(sprite, GetMoveDirectionAnimNum(eventObj->range.as_byte));
diff --git a/src/party_menu.c b/src/party_menu.c
index 15b5d24d8..7cf2303d4 100755
--- a/src/party_menu.c
+++ b/src/party_menu.c
@@ -6513,7 +6513,7 @@ static void sub_81B8474(u8 taskId)
gTasks[taskId].func = sub_81B8104;
}
-void sub_81B8518(u8 unused)
+void InitChooseHalfPartyForBattle(u8 unused)
{
sub_81B8558();
InitPartyMenu(4, 0, 0, 0, 0, sub_81B1370, gMain.savedCallback);
diff --git a/src/record_mixing.c b/src/record_mixing.c
index 189033685..4c0ada830 100644
--- a/src/record_mixing.c
+++ b/src/record_mixing.c
@@ -106,7 +106,7 @@ static EWRAM_DATA union PlayerRecords *sSentRecord = NULL;
// Static ROM declarations
static void Task_RecordMixing_Main(u8 taskId);
-static void sub_80E7324(u8 taskId);
+static void Task_MixingRecordsRecv(u8 taskId);
static void Task_SendPacket(u8 taskId);
static void Task_CopyReceiveBuffer(u8 taskId);
static void Task_SendPacket_SwitchToReceive(u8 taskId);
@@ -120,7 +120,7 @@ static void ReceiveLilycoveLadyData(LilycoveLady *, size_t, u8);
static void sub_80E7B2C(const u8 *);
static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *, size_t, u8, TVShow *);
static void ReceiveGiftItem(u16 *item, u8 which);
-static void sub_80E7FF8(u8 taskId);
+static void Task_DoRecordMixing(u8 taskId);
static void sub_80E8110(struct Apprentice *arg0, struct Apprentice *arg1);
static void ReceiveApprenticeData(struct Apprentice *arg0, size_t arg1, u32 arg2);
static void ReceiveRankingHallRecords(struct PlayerHallRecords *hallRecords, size_t arg1, u32 arg2);
@@ -170,7 +170,8 @@ static const u8 gUnknown_0858CFBE[3][4] =
#define BUFFER_CHUNK_SIZE 200
-void sub_80E6BE8(void)
+// Note: VAR_0x8005 contains the spotId.
+void EventScript_RecordMixingPlayerSpotTriggered(void)
{
sub_80B37D4(Task_RecordMixing_Main);
}
@@ -313,6 +314,7 @@ static void Task_RecordMixing_SoundEffect(u8 taskId)
#define tState data[0]
#define tSndEffTaskId data[15]
+// Note: Currently, special var 8005 contains the player's spot id.
static void Task_RecordMixing_Main(u8 taskId)
{
s16 *data = gTasks[taskId].data;
@@ -322,16 +324,16 @@ static void Task_RecordMixing_Main(u8 taskId)
case 0: // init
sSentRecord = malloc(sizeof(union PlayerRecords));
sReceivedRecords = malloc(sizeof(union PlayerRecords) * 4);
- sub_8009628(gSpecialVar_0x8005);
+ SetLocalLinkPlayerId(gSpecialVar_0x8005);
VarSet(VAR_TEMP_0, 1);
gUnknown_03001130 = FALSE;
PrepareExchangePacket();
CreateRecordMixingSprite();
tState = 1;
- data[10] = CreateTask(sub_80E7324, 80);
+ data[10] = CreateTask(Task_MixingRecordsRecv, 80);
tSndEffTaskId = CreateTask(Task_RecordMixing_SoundEffect, 81);
break;
- case 1: // wait for sub_80E7324
+ case 1: // wait for Task_MixingRecordsRecv
if (!gTasks[data[10]].isActive)
{
tState = 2;
@@ -341,11 +343,11 @@ static void Task_RecordMixing_Main(u8 taskId)
}
break;
case 2:
- data[10] = CreateTask(sub_80E7FF8, 10);
+ data[10] = CreateTask(Task_DoRecordMixing, 10);
tState = 3;
PlaySE(SE_W226);
break;
- case 3: // wait for sub_80E7FF8
+ case 3: // wait for Task_DoRecordMixing
if (!gTasks[data[10]].isActive)
{
tState = 4;
@@ -381,7 +383,7 @@ static void Task_RecordMixing_Main(u8 taskId)
#undef tState
#undef tSndEffTaskId
-static void sub_80E7324(u8 taskId)
+static void Task_MixingRecordsRecv(u8 taskId)
{
struct Task *task = &gTasks[taskId];
@@ -405,7 +407,7 @@ static void sub_80E7324(u8 taskId)
u8 players = GetLinkPlayerCount_2();
if (IsLinkMaster() == TRUE)
{
- if (players == sub_800AA48())
+ if (players == GetSavedPlayerCount())
{
PlaySE(SE_PIN);
task->data[0] = 201;
@@ -420,14 +422,15 @@ static void sub_80E7324(u8 taskId)
}
break;
case 201:
- if (sub_800AA48() == GetLinkPlayerCount_2() && ++task->data[12] > (GetLinkPlayerCount_2() * 30))
+ // We're the link master. Delay for 30 frames per connected player.
+ if (GetSavedPlayerCount() == GetLinkPlayerCount_2() && ++task->data[12] > (GetLinkPlayerCount_2() * 30))
{
- sub_800A620();
+ CheckShouldAdvanceLinkState();
task->data[0] = 1;
}
break;
case 301:
- if (sub_800AA48() == GetLinkPlayerCount_2())
+ if (GetSavedPlayerCount() == GetLinkPlayerCount_2())
task->data[0] = 1;
break;
case 400: // wait 20 frames
@@ -470,6 +473,7 @@ static void sub_80E7324(u8 taskId)
StorePtrInTaskData(sReceivedRecords, (u16 *)&gTasks[subTaskId].data[5]);
sRecordStructSize = sizeof(struct PlayerRecordsEmerald);
}
+ // Note: This task is destroyed by Task_CopyReceiveBuffer when it's done.
}
break;
case 5: // wait 60 frames
@@ -938,7 +942,7 @@ static void ReceiveGiftItem(u16 *item, u8 which)
}
}
-static void sub_80E7FF8(u8 taskId)
+static void Task_DoRecordMixing(u8 taskId)
{
struct Task *task = &gTasks[taskId];
@@ -953,20 +957,22 @@ static void sub_80E7FF8(u8 taskId)
else
task->data[0] = 6;
break;
+
+ // Mixing Ruby/Sapphire records.
case 2:
SetContinueGameWarpStatusToDynamicWarp();
- sub_8153430();
+ FullSaveGame();
task->data[0] ++;
break;
case 3:
- if (sub_8153474())
+ if (CheckSaveFile())
{
ClearContinueGameWarpStatus2();
task->data[0] = 4;
task->data[1] = 0;
}
break;
- case 4:
+ case 4: // Wait 10 frames
if (++task->data[1] > 10)
{
sub_800AC34();
@@ -974,22 +980,24 @@ static void sub_80E7FF8(u8 taskId)
}
break;
case 5:
- if (gReceivedRemoteLinkPlayers == 0)
+ if (gReceivedRemoteLinkPlayers == FALSE)
DestroyTask(taskId);
break;
+
+ // Mixing Emerald/FireRed/LeafGreen records.
case 6:
- if (!sub_801048C(0))
+ if (!sub_801048C(FALSE))
{
CreateTask(sub_8153688, 5);
task->data[0] ++;
}
break;
- case 7:
+ case 7: // wait for sub_8153688 to finish.
if (!FuncIsActiveTask(sub_8153688))
{
if (gWirelessCommType)
{
- sub_801048C(1);
+ sub_801048C(TRUE);
task->data[0] = 8;
}
else
diff --git a/src/rom_8011DC0.c b/src/rom_8011DC0.c
index 57fb2c898..8f95e6719 100644
--- a/src/rom_8011DC0.c
+++ b/src/rom_8011DC0.c
@@ -1697,7 +1697,7 @@ void sub_801440C(u8 taskId)
case 81:
CleanupOverworldWindowsAndTilemaps();
gMain.savedCallback = sub_801AC54;
- sub_81B8518(3);
+ InitChooseHalfPartyForBattle(3);
break;
case 1:
CleanupOverworldWindowsAndTilemaps();
diff --git a/src/save.c b/src/save.c
index a22e20f0b..d07e59766 100644
--- a/src/save.c
+++ b/src/save.c
@@ -768,7 +768,7 @@ u8 sub_8153408(void) // trade.s save
return 0;
}
-u8 sub_8153430(void)
+u8 FullSaveGame(void)
{
if (gFlashMemoryPresent != TRUE)
return 1;
@@ -780,7 +780,7 @@ u8 sub_8153430(void)
return 0;
}
-bool8 sub_8153474(void)
+bool8 CheckSaveFile(void)
{
u8 retVal = FALSE;
u16 val = ++gUnknown_03006208;
diff --git a/src/script_pokemon_util_80F87D8.c b/src/script_pokemon_util_80F87D8.c
index cade00b50..f971d8487 100755
--- a/src/script_pokemon_util_80F87D8.c
+++ b/src/script_pokemon_util_80F87D8.c
@@ -29,6 +29,7 @@
#include "constants/items.h"
#include "constants/species.h"
#include "constants/vars.h"
+#include "constants/battle_frontier.h"
extern const u16 gEventObjectPalette8[];
extern const u16 gEventObjectPalette17[];
@@ -40,7 +41,7 @@ static const u8 gUnknown_0858D8EC[] = { 3, 4, 5, 14 };
static void sub_80F8EE8(u8 taskId);
static void sub_80F9088(u8 taskId);
-static void sub_80F9460(void);
+static void CB2_ReturnFromChooseHalfParty(void);
static void sub_80F94B8(void);
void SetContestTrainerGfxIds(void)
@@ -640,22 +641,24 @@ void ScriptSetMonMoveSlot(u8 monIndex, u16 move, u8 slot)
SetMonMoveSlot(&gPlayerParty[monIndex], move, slot);
}
-void sub_80F9438(void)
+// Note: When control returns to the event script, gSpecialVar_Result be
+// TRUE if the party selection was successful.
+void EventScript_ChooseHalfPartyForBattle(void)
{
- gMain.savedCallback = sub_80F9460;
- VarSet(VAR_FRONTIER_FACILITY, 9); // this isn't a valid frontier facility id (??)
- sub_81B8518(0);
+ gMain.savedCallback = CB2_ReturnFromChooseHalfParty;
+ VarSet(VAR_FRONTIER_FACILITY, FRONTIER_FACILITY_DOUBLE_COLOSSEUM);
+ InitChooseHalfPartyForBattle(0);
}
-static void sub_80F9460(void)
+static void CB2_ReturnFromChooseHalfParty(void)
{
switch (gSelectedOrderFromParty[0])
{
case 0:
- gSpecialVar_Result = 0;
+ gSpecialVar_Result = FALSE;
break;
default:
- gSpecialVar_Result = 1;
+ gSpecialVar_Result = TRUE;
break;
}
@@ -665,7 +668,7 @@ static void sub_80F9460(void)
void sub_80F9490(void)
{
gMain.savedCallback = sub_80F94B8;
- sub_81B8518(gSpecialVar_0x8004 + 1);
+ InitChooseHalfPartyForBattle(gSpecialVar_0x8004 + 1);
}
static void sub_80F94B8(void)
diff --git a/src/start_menu.c b/src/start_menu.c
index 4b41933ae..dfe3b08be 100644
--- a/src/start_menu.c
+++ b/src/start_menu.c
@@ -1265,11 +1265,11 @@ static void sub_80A0550(u8 taskId)
break;
case 1:
SetContinueGameWarpStatusToDynamicWarp();
- sub_8153430();
+ FullSaveGame();
*step = 2;
break;
case 2:
- if (sub_8153474())
+ if (CheckSaveFile())
{
ClearContinueGameWarpStatus2();
*step = 3;
diff --git a/src/trade.c b/src/trade.c
index 2cd7cf2d9..db5e6a1a3 100644
--- a/src/trade.c
+++ b/src/trade.c
@@ -1507,13 +1507,13 @@ static void sub_80773D0(void)
}
break;
case 3:
- if (GetLinkPlayerCount_2() >= sub_800AA48())
+ if (GetLinkPlayerCount_2() >= GetSavedPlayerCount())
{
if (IsLinkMaster())
{
if (++gUnknown_0203229C->unk_A8 > 30)
{
- sub_800A620();
+ CheckShouldAdvanceLinkState();
gMain.state++;
}
}
@@ -4099,11 +4099,11 @@ void sub_807AE50(void)
case 3:
if (IsLinkMaster())
{
- if (GetLinkPlayerCount_2() >= sub_800AA48())
+ if (GetLinkPlayerCount_2() >= GetSavedPlayerCount())
{
if (++gUnknown_020322A0->timer > 30)
{
- sub_800A620();
+ CheckShouldAdvanceLinkState();
gMain.state++;
}
}