summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_controller_link_opponent.c4
-rw-r--r--src/battle_controller_recorded_opponent.c4
-rw-r--r--src/battle_controllers.c7
-rw-r--r--src/battle_main.c2
-rw-r--r--src/battle_message.c14
-rw-r--r--src/berry.c16
-rw-r--r--src/berry_blender.c6
-rwxr-xr-xsrc/berry_crush.c12
-rw-r--r--src/cable_club.c772
-rw-r--r--src/contest_link_80FC4F4.c2
-rw-r--r--src/data/union_room.h472
-rw-r--r--src/dodrio_berry_picking.c12
-rwxr-xr-xsrc/ereader_screen.c12
-rw-r--r--src/event_object_lock.c2
-rw-r--r--src/event_object_movement.c143
-rwxr-xr-xsrc/faraway_island.c2
-rw-r--r--src/field_effect.c4
-rwxr-xr-xsrc/field_effect_helpers.c38
-rw-r--r--src/field_screen_effect.c8
-rw-r--r--src/fieldmap.c4
-rw-r--r--src/fldeff_misc.c2
-rw-r--r--src/graphics.c22
-rwxr-xr-xsrc/item_menu.c2
-rw-r--r--src/librfu_rfu.c4
-rw-r--r--src/link.c346
-rw-r--r--src/link_rfu_2.c2294
-rw-r--r--src/link_rfu_3.c754
-rw-r--r--src/main.c4
-rw-r--r--src/menu.c2
-rwxr-xr-xsrc/mevent2.c6
-rw-r--r--src/mystery_event_menu.c4
-rw-r--r--src/mystery_gift.c17
-rw-r--r--src/new_game.c2
-rw-r--r--src/overworld.c2
-rwxr-xr-xsrc/party_menu.c4
-rw-r--r--src/pokemon.c4
-rwxr-xr-xsrc/pokemon_jump.c16
-rw-r--r--src/record_mixing.c15
-rw-r--r--src/save.c50
-rw-r--r--src/scrcmd.c8
-rw-r--r--src/start_menu.c78
-rw-r--r--src/strings.c10
-rw-r--r--src/trade.c21
-rw-r--r--src/union_room.c3666
-rw-r--r--src/union_room_battle.c473
-rwxr-xr-xsrc/union_room_chat.c2588
-rw-r--r--src/union_room_player_avatar.c493
-rw-r--r--src/wireless_communication_status_screen.c432
48 files changed, 6837 insertions, 6018 deletions
diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c
index 6604fa142..ce22c605f 100644
--- a/src/battle_controller_link_opponent.c
+++ b/src/battle_controller_link_opponent.c
@@ -1267,9 +1267,9 @@ static void LinkOpponentHandleDrawTrainerPic(void)
else
{
xPos = 176;
- if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00)
+ if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM)
{
- trainerPicId = sub_8068B48();
+ trainerPicId = GetUnionRoomTrainerPic();
}
else if ((gLinkPlayers[GetMultiplayerId() ^ BIT_SIDE].version & 0xFF) == VERSION_FIRE_RED
|| (gLinkPlayers[GetMultiplayerId() ^ BIT_SIDE].version & 0xFF) == VERSION_LEAF_GREEN)
diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c
index 7c1bff64a..35383611b 100644
--- a/src/battle_controller_recorded_opponent.c
+++ b/src/battle_controller_recorded_opponent.c
@@ -1229,9 +1229,9 @@ static void RecordedOpponentHandleDrawTrainerPic(void)
else
{
xPos = 176;
- if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00)
+ if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM)
{
- trainerPicId = sub_8068B48();
+ trainerPicId = GetUnionRoomTrainerPic();
}
else
{
diff --git a/src/battle_controllers.c b/src/battle_controllers.c
index b411c12f6..7f78c1ac9 100644
--- a/src/battle_controllers.c
+++ b/src/battle_controllers.c
@@ -6,6 +6,7 @@
#include "battle_message.h"
#include "cable_club.h"
#include "link.h"
+#include "link_rfu.h"
#include "party_menu.h"
#include "pokemon.h"
#include "recorded_battle.h"
@@ -33,10 +34,10 @@ void HandleLinkBattleSetup(void)
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
if (gWirelessCommType)
- sub_800B488();
+ SetWirelessCommType1();
if (!gReceivedRemoteLinkPlayers)
OpenLink();
- CreateTask(task00_08081A90, 0);
+ CreateTask(Task_WaitForLinkPlayerConnection, 0);
CreateTasksForSendRecvLinkBuffers();
}
}
@@ -827,7 +828,7 @@ void sub_8033648(void)
if (gReceivedRemoteLinkPlayers != 0 && (gBattleTypeFlags & BATTLE_TYPE_20))
{
- sub_8011BD0();
+ DestroyTask_RfuIdle();
for (i = 0; i < GetLinkPlayerCount(); i++)
{
if (GetBlockReceivedStatus() & gBitTable[i])
diff --git a/src/battle_main.c b/src/battle_main.c
index e3eea60d0..dd31e12d5 100644
--- a/src/battle_main.c
+++ b/src/battle_main.c
@@ -995,7 +995,7 @@ static void CB2_HandleStartBattle(void)
sub_8036A5C();
SetPlayerBerryDataInBattleStruct();
- if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00)
+ if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM)
{
gLinkPlayers[0].id = 0;
gLinkPlayers[1].id = 1;
diff --git a/src/battle_message.c b/src/battle_message.c
index efa4500c8..693058e2f 100644
--- a/src/battle_message.c
+++ b/src/battle_message.c
@@ -1981,7 +1981,7 @@ void BufferStringBattle(u16 stringID)
}
else
{
- if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00)
+ if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM)
stringPtr = sText_Trainer1WantsToBattle;
else if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
stringPtr = sText_LinkTrainerWantsToBattlePause;
@@ -2049,7 +2049,7 @@ void BufferStringBattle(u16 stringID)
{
if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)))
stringPtr = sText_Trainer1SentOutPkmn;
- else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00)
+ else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM)
stringPtr = sText_Trainer1SentOutPkmn;
else
stringPtr = sText_LinkTrainerSentOutPkmn;
@@ -2110,7 +2110,7 @@ void BufferStringBattle(u16 stringID)
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
stringPtr = sText_LinkTrainerMultiSentOutPkmn;
- else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00)
+ else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM)
stringPtr = sText_Trainer1SentOutPkmn2;
else
stringPtr = sText_LinkTrainerSentOutPkmn2;
@@ -2180,7 +2180,7 @@ void BufferStringBattle(u16 stringID)
break;
}
}
- else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00)
+ else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM)
{
switch (gBattleTextBuff1[0])
{
@@ -2495,8 +2495,8 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst)
case B_TXT_TRAINER1_CLASS: // trainer class name
if (gBattleTypeFlags & BATTLE_TYPE_SECRET_BASE)
toCpy = gTrainerClassNames[GetSecretBaseTrainerClass()];
- else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00)
- toCpy = gTrainerClassNames[sub_8068BB0()];
+ else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM)
+ toCpy = gTrainerClassNames[GetUnionRoomTrainerClass()];
else if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN)
toCpy = gTrainerClassNames[GetFrontierBrainTrainerClass()];
else if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
@@ -2517,7 +2517,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst)
ConvertInternationalString(text, gBattleResources->secretBase->language);
toCpy = text;
}
- else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00)
+ else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM)
{
toCpy = gLinkPlayers[multiplayerId ^ BIT_SIDE].name;
}
diff --git a/src/berry.c b/src/berry.c
index fe4a66af6..98264f37b 100644
--- a/src/berry.c
+++ b/src/berry.c
@@ -997,7 +997,7 @@ struct BerryTree *GetBerryTreeInfo(u8 id)
bool32 ObjectEventInteractionWaterBerryTree(void)
{
- struct BerryTree *tree = GetBerryTreeInfo(ObjectEventGetBerryTreeId(gSelectedObjectEvent));
+ struct BerryTree *tree = GetBerryTreeInfo(GetObjectEventBerryTreeId(gSelectedObjectEvent));
switch (tree->stage)
{
@@ -1022,7 +1022,7 @@ bool32 ObjectEventInteractionWaterBerryTree(void)
bool8 IsPlayerFacingEmptyBerryTreePatch(void)
{
if (GetObjectEventScriptPointerPlayerFacing() == BerryTreeScript
- && GetStageByBerryTreeId(ObjectEventGetBerryTreeId(gSelectedObjectEvent)) == BERRY_STAGE_NO_BERRY)
+ && GetStageByBerryTreeId(GetObjectEventBerryTreeId(gSelectedObjectEvent)) == BERRY_STAGE_NO_BERRY)
return TRUE;
else
return FALSE;
@@ -1260,7 +1260,7 @@ void ObjectEventInteractionGetBerryTreeData(void)
u8 group;
u8 num;
- id = ObjectEventGetBerryTreeId(gSelectedObjectEvent);
+ id = GetObjectEventBerryTreeId(gSelectedObjectEvent);
berry = GetBerryTypeByBerryTreeId(id);
ResetBerryTreeSparkleFlag(id);
localId = gSpecialVar_LastTalked;
@@ -1277,13 +1277,13 @@ void ObjectEventInteractionGetBerryTreeData(void)
void ObjectEventInteractionGetBerryName(void)
{
- u8 berryType = GetBerryTypeByBerryTreeId(ObjectEventGetBerryTreeId(gSelectedObjectEvent));
+ u8 berryType = GetBerryTypeByBerryTreeId(GetObjectEventBerryTreeId(gSelectedObjectEvent));
GetBerryNameByBerryType(berryType, gStringVar1);
}
void ObjectEventInteractionGetBerryCountString(void)
{
- u8 treeId = ObjectEventGetBerryTreeId(gSelectedObjectEvent);
+ u8 treeId = GetObjectEventBerryTreeId(gSelectedObjectEvent);
u8 berry = GetBerryTypeByBerryTreeId(treeId);
u8 count = GetBerryCountByBerryTreeId(treeId);
GetBerryCountStringByBerryType(berry, gStringVar1, count);
@@ -1298,13 +1298,13 @@ void ObjectEventInteractionPlantBerryTree(void)
{
u8 berry = ItemIdToBerryType(gSpecialVar_ItemId);
- PlantBerryTree(ObjectEventGetBerryTreeId(gSelectedObjectEvent), berry, 1, TRUE);
+ PlantBerryTree(GetObjectEventBerryTreeId(gSelectedObjectEvent), berry, 1, TRUE);
ObjectEventInteractionGetBerryTreeData();
}
void ObjectEventInteractionPickBerryTree(void)
{
- u8 id = ObjectEventGetBerryTreeId(gSelectedObjectEvent);
+ u8 id = GetObjectEventBerryTreeId(gSelectedObjectEvent);
u8 berry = GetBerryTypeByBerryTreeId(id);
gSpecialVar_0x8004 = AddBagItem(BerryTypeToItemId(berry), GetBerryCountByBerryTreeId(id));
@@ -1312,7 +1312,7 @@ void ObjectEventInteractionPickBerryTree(void)
void ObjectEventInteractionRemoveBerryTree(void)
{
- RemoveBerryTree(ObjectEventGetBerryTreeId(gSelectedObjectEvent));
+ RemoveBerryTree(GetObjectEventBerryTreeId(gSelectedObjectEvent));
sub_8092EF0(gSpecialVar_LastTalked, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
}
diff --git a/src/berry_blender.c b/src/berry_blender.c
index 4d3b7eb6f..a2a96c089 100644
--- a/src/berry_blender.c
+++ b/src/berry_blender.c
@@ -1246,7 +1246,7 @@ static void sub_8080018(void)
if (++sBerryBlenderData->framesToWait > 20)
{
ClearDialogWindowAndFrameToTransparent(4, TRUE);
- if (GetBlockReceivedStatus() == sub_800A9D8())
+ if (GetBlockReceivedStatus() == GetLinkPlayerCountAsBitFlags())
{
for (i = 0; i < GetLinkPlayerCount(); i++)
{
@@ -1500,7 +1500,7 @@ static void sub_80808D4(void)
switch (sBerryBlenderData->mainState)
{
case 0:
- sub_800B4C0();
+ SetWirelessCommType0();
sub_8080588();
Blender_SetParticipantBerryData(0, gSpecialVar_ItemId);
Blender_CopyBerryData(&sBerryBlenderData->blendedBerries[0], gSpecialVar_ItemId);
@@ -1664,7 +1664,7 @@ static void sub_80808D4(void)
static void sub_8080DF8(void)
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < CMD_LENGTH / 2; i++)
{
gSendCmd[0] = 0;
gSendCmd[2] = 0;
diff --git a/src/berry_crush.c b/src/berry_crush.c
index 48ad7f4e3..90a299a74 100755
--- a/src/berry_crush.c
+++ b/src/berry_crush.c
@@ -832,7 +832,7 @@ u32 sub_8020C0C(MainCallback callback)
return 0;
}
-void sub_8020C70(MainCallback callback)
+void StartBerryCrush(MainCallback callback)
{
u8 playerCount = 0;
u8 multiplayerId;
@@ -842,7 +842,7 @@ void sub_8020C70(MainCallback callback)
SetMainCallback2(callback);
Rfu.unk_10 = 0;
Rfu.unk_12 = 0;
- Rfu.unk_ee = 1;
+ Rfu.errorState = 1;
return;
}
@@ -853,7 +853,7 @@ void sub_8020C70(MainCallback callback)
SetMainCallback2(callback);
Rfu.unk_10 = 0;
Rfu.unk_12 = 0;
- Rfu.unk_ee = 1;
+ Rfu.errorState = 1;
return;
}
@@ -863,7 +863,7 @@ void sub_8020C70(MainCallback callback)
SetMainCallback2(callback);
Rfu.unk_10 = 0;
Rfu.unk_12 = 0;
- Rfu.unk_ee = 1;
+ Rfu.errorState = 1;
return;
}
@@ -3013,10 +3013,10 @@ static u32 sub_8024134(struct BerryCrushGame *r5, u8 *r4)
DrawDialogueFrame(0, 0);
AddTextPrinterParameterized2(0, 1, gText_SavingDontTurnOffPower, 0, 0, 2, 1, 3);
CopyWindowToVram(0, 3);
- CreateTask(sub_8153688, 0);
+ CreateTask(Task_LinkSave, 0);
break;
case 3:
- if (FuncIsActiveTask(sub_8153688))
+ if (FuncIsActiveTask(Task_LinkSave))
return 0;
break;
case 4:
diff --git a/src/cable_club.c b/src/cable_club.c
index b9c948a9c..15e468390 100644
--- a/src/cable_club.c
+++ b/src/cable_club.c
@@ -33,8 +33,9 @@
#include "constants/battle_frontier.h"
#include "constants/cable_club.h"
#include "constants/songs.h"
+#include "constants/trainers.h"
-static const struct WindowTemplate gUnknown_08550594 = {
+static const struct WindowTemplate sWindowTemplate_LinkPlayerCount = {
.bg = 0,
.tilemapLeft = 16,
.tilemapTop = 11,
@@ -43,57 +44,67 @@ static const struct WindowTemplate gUnknown_08550594 = {
.paletteNum = 15,
.baseBlock = 0x0125,
};
-static const u8 *const gTrainerCardColorNames[] = {
+
+static const u8 *const sTrainerCardColorNames[] = {
gText_BronzeCard,
gText_CopperCard,
gText_SilverCard,
gText_GoldCard
};
-static void sub_80B2634(u8 taskId);
-static void sub_80B2688(u8 taskId);
-static void sub_80B270C(u8 taskId);
-static void sub_80B275C(u8 taskId);
-static void sub_80B2804(u8 taskId);
-static void sub_80B28A8(u8 taskId);
-static void sub_80B2918(u8 taskId);
-static void sub_80B2A08(u8 taskId);
-static void sub_80B2C30(u8 taskId);
-static void sub_80B2CB0(u8 taskId);
-static void sub_80B2CEC(u8 taskId);
-static void sub_80B2D2C(u8 taskId);
-static bool8 sub_80B2D6C(u8 taskId);
-static void sub_80B2EE4(u8 taskId);
-static void sub_80B3144(u8 taskId);
-static void sub_80B3194(u8 taskId);
-static void sub_80B31E8(u8 taskId);
-static void sub_80B3220(u8 taskId);
-
-static void sub_80B236C(u8 arg0, u8 arg1)
+static void Task_LinkupStart(u8 taskId);
+static void Task_LinkupAwaitConnection(u8 taskId);
+static void Task_LinkupConfirmWhenReady(u8 taskId);
+static void Task_LinkupAwaitConfirmation(u8 taskId);
+static void Task_LinkupTryConfirmation(u8 taskId);
+static void Task_LinkupConfirm(u8 taskId);
+static void Task_LinkupExchangeDataWithLeader(u8 taskId);
+static void Task_LinkupCheckStatusAfterConfirm(u8 taskId);
+static void Task_LinkupAwaitTrainerCardData(u8 taskId);
+static void Task_StopLinkup(u8 taskId);
+static void Task_LinkupFailed(u8 taskId);
+static void Task_LinkupConnectionError(u8 taskId);
+static bool8 TryLinkTimeout(u8 taskId);
+static void Task_ValidateMixingGameLanguage(u8 taskId);
+static void Task_ReestablishLink(u8 taskId);
+static void Task_ReestablishLinkAwaitConnection(u8 taskId);
+static void Task_ReestablishLinkLeader(u8 taskId);
+static void Task_ReestablishLinkAwaitConfirmation(u8 taskId);
+
+#define tState data[0]
+
+
+#define tMinPlayers data[1]
+#define tMaxPlayers data[2]
+#define tNumPlayers data[3]
+#define tTimer data[4]
+#define tWindowId data[5]
+
+static void CreateLinkupTask(u8 minPlayers, u8 maxPlayers)
{
- if (FindTaskIdByFunc(sub_80B2634) == 0xFF)
+ if (FindTaskIdByFunc(Task_LinkupStart) == 0xFF)
{
u8 taskId1;
- taskId1 = CreateTask(sub_80B2634, 80);
- gTasks[taskId1].data[1] = arg0;
- gTasks[taskId1].data[2] = arg1;
+ taskId1 = CreateTask(Task_LinkupStart, 80);
+ gTasks[taskId1].tMinPlayers = minPlayers;
+ gTasks[taskId1].tMaxPlayers = maxPlayers;
}
}
-static void sub_80B23B0(u16 windowId, u32 value)
+static void PrintNumPlayersInLink(u16 windowId, u32 numPlayers)
{
u8 xPos;
- ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEFT_ALIGN, 1);
+ ConvertIntToDecimalStringN(gStringVar1, numPlayers, STR_CONV_MODE_LEFT_ALIGN, 1);
SetStandardWindowBorderStyle(windowId, 0);
- StringExpandPlaceholders(gStringVar4, gText_XPLink);
+ StringExpandPlaceholders(gStringVar4, gText_NumPlayerLink);
xPos = GetStringCenterAlignXOffset(1, gStringVar4, 88);
AddTextPrinterParameterized(windowId, 1, gStringVar4, xPos, 1, 0xFF, NULL);
CopyWindowToVram(windowId, 3);
}
-static void sub_80B241C(u16 windowId)
+static void ClearLinkPlayerCountWindow(u16 windowId)
{
// Following this call with a copy-to-vram with mode 3 is identical to
// calling ClearStdWindowAndFrame(windowId, TRUE).
@@ -101,68 +112,68 @@ static void sub_80B241C(u16 windowId)
CopyWindowToVram(windowId, 3);
}
-static void sub_80B243C(u8 taskId, u8 arg1)
+static void UpdateLinkPlayerCountDisplay(u8 taskId, u8 numPlayers)
{
s16 *data = gTasks[taskId].data;
- if (arg1 != data[3])
+ if (numPlayers != tNumPlayers)
{
- if (arg1 <= 1)
- sub_80B241C(data[5]);
+ if (numPlayers <= 1)
+ ClearLinkPlayerCountWindow(tWindowId);
else
- sub_80B23B0(data[5], arg1);
- data[3] = arg1;
+ PrintNumPlayersInLink(tWindowId, numPlayers);
+ tNumPlayers = numPlayers;
}
}
-static u32 sub_80B2478(u8 lower, u8 upper)
+static u32 ExchangeDataAndGetLinkupStatus(u8 minPlayers, u8 maxPlayers)
{
int playerCount;
- switch (GetLinkPlayerDataExchangeStatusTimed(lower, upper))
+ switch (GetLinkPlayerDataExchangeStatusTimed(minPlayers, maxPlayers))
{
case EXCHANGE_COMPLETE:
- return 1;
- case EXCHANGE_IN_PROGRESS:
- return 3;
+ return LINKUP_SUCCESS;
+ case EXCHANGE_DIFF_SELECTIONS:
+ return LINKUP_DIFF_SELECTIONS;
case EXCHANGE_PLAYER_NOT_READY:
- return 7;
+ return LINKUP_PLAYER_NOT_READY;
case EXCHANGE_PARTNER_NOT_READY:
- return 9;
- case EXCHANGE_STAT_6:
+ return LINKUP_PARTNER_NOT_READY;
+ case EXCHANGE_WRONG_NUM_PLAYERS:
ConvertIntToDecimalStringN(gStringVar1, GetLinkPlayerCount_2(), STR_CONV_MODE_LEFT_ALIGN, 1);
- return 4;
+ return LINKUP_WRONG_NUM_PLAYERS;
case EXCHANGE_STAT_7:
- return 10;
+ return LINKUP_FAILED_CONTEST_GMODE;
case EXCHANGE_TIMED_OUT:
default:
- return 0;
+ return LINKUP_ONGOING;
}
}
-static bool32 sub_80B24F8(u8 taskId)
+static bool32 CheckLinkErrored(u8 taskId)
{
if (HasLinkErrorOccurred() == TRUE)
{
- gTasks[taskId].func = sub_80B2D2C;
+ gTasks[taskId].func = Task_LinkupConnectionError;
return TRUE;
}
return FALSE;
}
-static bool32 sub_80B252C(u8 taskId)
+static bool32 CheckLinkCanceledBeforeConnection(u8 taskId)
{
if ((gMain.newKeys & B_BUTTON)
&& IsLinkConnectionEstablished() == FALSE)
{
gLinkType = 0;
- gTasks[taskId].func = sub_80B2CEC;
+ gTasks[taskId].func = Task_LinkupFailed;
return TRUE;
}
return FALSE;
}
-static bool32 sub_80B2578(u8 taskId)
+static bool32 CheckLinkCanceled(u8 taskId)
{
if (IsLinkConnectionEstablished())
SetSuppressLinkErrorMessage(TRUE);
@@ -170,7 +181,7 @@ static bool32 sub_80B2578(u8 taskId)
if (gMain.newKeys & B_BUTTON)
{
gLinkType = 0;
- gTasks[taskId].func = sub_80B2CEC;
+ gTasks[taskId].func = Task_LinkupFailed;
return TRUE;
}
return FALSE;
@@ -180,12 +191,13 @@ static bool32 sub_80B25CC(u8 taskId)
{
if (GetSioMultiSI() == 1)
{
- gTasks[taskId].func = sub_80B2D2C;
+ gTasks[taskId].func = Task_LinkupConnectionError;
return TRUE;
}
return FALSE;
}
+// Unused
static void sub_80B2600(u8 taskId)
{
gTasks[taskId].data[0]++;
@@ -196,7 +208,7 @@ static void sub_80B2600(u8 taskId)
}
}
-static void sub_80B2634(u8 taskId)
+static void Task_LinkupStart(u8 taskId)
{
s16 *data = gTasks[taskId].data;
@@ -205,21 +217,21 @@ static void sub_80B2634(u8 taskId)
OpenLinkTimed();
ResetLinkPlayerCount();
ResetLinkPlayers();
- data[5] = AddWindow(&gUnknown_08550594);
+ tWindowId = AddWindow(&sWindowTemplate_LinkPlayerCount);
}
else if (data[0] > 9)
{
- gTasks[taskId].func = sub_80B2688;
+ gTasks[taskId].func = Task_LinkupAwaitConnection;
}
data[0]++;
}
-static void sub_80B2688(u8 taskId)
+static void Task_LinkupAwaitConnection(u8 taskId)
{
u32 playerCount = GetLinkPlayerCount_2();
- if (sub_80B252C(taskId) == TRUE
- || sub_80B2578(taskId) == TRUE
+ if (CheckLinkCanceledBeforeConnection(taskId) == TRUE
+ || CheckLinkCanceled(taskId) == TRUE
|| playerCount < 2)
return;
@@ -229,60 +241,60 @@ static void sub_80B2688(u8 taskId)
{
PlaySE(SE_PIN);
ShowFieldAutoScrollMessage(gText_ConfirmLinkWhenPlayersReady);
- gTasks[taskId].func = sub_80B270C;
+ gTasks[taskId].func = Task_LinkupConfirmWhenReady;
}
else
{
PlaySE(SE_BOO);
ShowFieldAutoScrollMessage(gText_AwaitingLinkup);
- gTasks[taskId].func = sub_80B2918;
+ gTasks[taskId].func = Task_LinkupExchangeDataWithLeader;
}
}
-static void sub_80B270C(u8 taskId)
+static void Task_LinkupConfirmWhenReady(u8 taskId)
{
- if (sub_80B252C(taskId) == TRUE
+ if (CheckLinkCanceledBeforeConnection(taskId) == TRUE
|| sub_80B25CC(taskId) == TRUE
- || sub_80B24F8(taskId) == TRUE)
+ || CheckLinkErrored(taskId) == TRUE)
return;
if (GetFieldMessageBoxMode() == FIELD_MESSAGE_BOX_HIDDEN)
{
- gTasks[taskId].data[3] = 0;
- gTasks[taskId].func = sub_80B275C;
+ gTasks[taskId].tNumPlayers = 0;
+ gTasks[taskId].func = Task_LinkupAwaitConfirmation;
}
}
-static void sub_80B275C(u8 taskId)
+static void Task_LinkupAwaitConfirmation(u8 taskId)
{
s16 *data = gTasks[taskId].data;
s32 linkPlayerCount = GetLinkPlayerCount_2();
- if (sub_80B252C(taskId) == TRUE
+ if (CheckLinkCanceledBeforeConnection(taskId) == TRUE
|| sub_80B25CC(taskId) == TRUE
- || sub_80B24F8(taskId) == TRUE)
+ || CheckLinkErrored(taskId) == TRUE)
return;
- sub_80B243C(taskId, linkPlayerCount);
+ UpdateLinkPlayerCountDisplay(taskId, linkPlayerCount);
if (!(gMain.newKeys & A_BUTTON))
return;
- if (linkPlayerCount < data[1])
+ if (linkPlayerCount < tMinPlayers)
return;
- sub_800AA04(linkPlayerCount);
- sub_80B241C(data[5]);
+ SaveLinkPlayers(linkPlayerCount);
+ ClearLinkPlayerCountWindow(tWindowId);
ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1);
ShowFieldAutoScrollMessage(gText_ConfirmStartLinkWithXPlayers);
- gTasks[taskId].func = sub_80B2804;
+ gTasks[taskId].func = Task_LinkupTryConfirmation;
}
-static void sub_80B2804(u8 taskId)
+static void Task_LinkupTryConfirmation(u8 taskId)
{
- if (sub_80B252C(taskId) == TRUE
+ if (CheckLinkCanceledBeforeConnection(taskId) == TRUE
|| sub_80B25CC(taskId) == TRUE
- || sub_80B24F8(taskId) == TRUE)
+ || CheckLinkErrored(taskId) == TRUE)
return;
if (GetFieldMessageBoxMode() == FIELD_MESSAGE_BOX_HIDDEN)
@@ -290,213 +302,221 @@ static void sub_80B2804(u8 taskId)
if (GetSavedPlayerCount() != GetLinkPlayerCount_2())
{
ShowFieldAutoScrollMessage(gText_ConfirmLinkWhenPlayersReady);
- gTasks[taskId].func = sub_80B270C;
+ gTasks[taskId].func = Task_LinkupConfirmWhenReady;
}
else if (gMain.heldKeys & B_BUTTON)
{
ShowFieldAutoScrollMessage(gText_ConfirmLinkWhenPlayersReady);
- gTasks[taskId].func = sub_80B270C;
+ gTasks[taskId].func = Task_LinkupConfirmWhenReady;
}
else if (gMain.heldKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
CheckShouldAdvanceLinkState();
- gTasks[taskId].func = sub_80B28A8;
+ gTasks[taskId].func = Task_LinkupConfirm;
}
}
}
-static void sub_80B28A8(u8 taskId)
+static void Task_LinkupConfirm(u8 taskId)
{
- u8 local1 = gTasks[taskId].data[1];
- u8 local2 = gTasks[taskId].data[2];
+ u8 minPlayers = gTasks[taskId].tMinPlayers;
+ u8 maxPlayers = gTasks[taskId].tMaxPlayers;
- if (sub_80B24F8(taskId) == TRUE
- || sub_80B2D6C(taskId) == TRUE)
+ if (CheckLinkErrored(taskId) == TRUE
+ || TryLinkTimeout(taskId) == TRUE)
return;
if (GetLinkPlayerCount_2() != GetSavedPlayerCount())
{
- gTasks[taskId].func = sub_80B2D2C;
+ gTasks[taskId].func = Task_LinkupConnectionError;
}
else
{
- gSpecialVar_Result = sub_80B2478(local1, local2);
- if (gSpecialVar_Result != 0)
- gTasks[taskId].func = sub_80B2A08;
+ gSpecialVar_Result = ExchangeDataAndGetLinkupStatus(minPlayers, maxPlayers);
+ if (gSpecialVar_Result != LINKUP_ONGOING)
+ gTasks[taskId].func = Task_LinkupCheckStatusAfterConfirm;
}
}
-static void sub_80B2918(u8 taskId)
+static void Task_LinkupExchangeDataWithLeader(u8 taskId)
{
- u8 local1, local2;
+ u8 minPlayers, maxPlayers;
struct TrainerCard *card;
- local1 = gTasks[taskId].data[1];
- local2 = gTasks[taskId].data[2];
+ minPlayers = gTasks[taskId].tMinPlayers;
+ maxPlayers = gTasks[taskId].tMaxPlayers;
- if (sub_80B252C(taskId) == TRUE
- || sub_80B24F8(taskId) == TRUE)
+ if (CheckLinkCanceledBeforeConnection(taskId) == TRUE
+ || CheckLinkErrored(taskId) == TRUE)
return;
- gSpecialVar_Result = sub_80B2478(local1, local2);
- if (gSpecialVar_Result == 0)
+ gSpecialVar_Result = ExchangeDataAndGetLinkupStatus(minPlayers, maxPlayers);
+ if (gSpecialVar_Result == LINKUP_ONGOING)
return;
- if (gSpecialVar_Result == 3 || gSpecialVar_Result == 4)
+ if (gSpecialVar_Result == LINKUP_DIFF_SELECTIONS
+ || gSpecialVar_Result == LINKUP_WRONG_NUM_PLAYERS)
{
sub_800AC34();
HideFieldMessageBox();
- gTasks[taskId].func = sub_80B2CB0;
+ gTasks[taskId].func = Task_StopLinkup;
}
- else if (gSpecialVar_Result == 7 || gSpecialVar_Result == 9)
+ else if (gSpecialVar_Result == LINKUP_PLAYER_NOT_READY
+ || gSpecialVar_Result == LINKUP_PARTNER_NOT_READY)
{
CloseLink();
HideFieldMessageBox();
- gTasks[taskId].func = sub_80B2CB0;
+ gTasks[taskId].func = Task_StopLinkup;
}
else
{
gFieldLinkPlayerCount = GetLinkPlayerCount_2();
gLocalLinkPlayerId = GetMultiplayerId();
- sub_800AA04(gFieldLinkPlayerCount);
+ SaveLinkPlayers(gFieldLinkPlayerCount);
card = (struct TrainerCard *)gBlockSendBuffer;
TrainerCard_GenerateCardForPlayer(card);
card->monSpecies[0] = GetMonData(&gPlayerParty[gSelectedOrderFromParty[0] - 1], MON_DATA_SPECIES, NULL);
card->monSpecies[1] = GetMonData(&gPlayerParty[gSelectedOrderFromParty[1] - 1], MON_DATA_SPECIES, NULL);
- gTasks[taskId].func = sub_80B2C30;
+ gTasks[taskId].func = Task_LinkupAwaitTrainerCardData;
}
}
-static void sub_80B2A08(u8 taskId)
+static void Task_LinkupCheckStatusAfterConfirm(u8 taskId)
{
struct TrainerCard *card;
- if (sub_80B24F8(taskId) == TRUE)
+ if (CheckLinkErrored(taskId) == TRUE)
return;
- if (gSpecialVar_Result == 4)
+ if (gSpecialVar_Result == LINKUP_WRONG_NUM_PLAYERS)
{
if (!Link_AnyPartnersPlayingRubyOrSapphire())
{
sub_800AC34();
HideFieldMessageBox();
- gTasks[taskId].func = sub_80B2CB0;
+ gTasks[taskId].func = Task_StopLinkup;
}
else
{
CloseLink();
HideFieldMessageBox();
- gTasks[taskId].func = sub_80B2CB0;
+ gTasks[taskId].func = Task_StopLinkup;
}
}
- else if (gSpecialVar_Result == 3)
+ else if (gSpecialVar_Result == LINKUP_DIFF_SELECTIONS)
{
sub_800AC34();
HideFieldMessageBox();
- gTasks[taskId].func = sub_80B2CB0;
+ gTasks[taskId].func = Task_StopLinkup;
}
- else if (gSpecialVar_Result == 7 || gSpecialVar_Result == 9)
+ else if (gSpecialVar_Result == LINKUP_PLAYER_NOT_READY
+ || gSpecialVar_Result == LINKUP_PARTNER_NOT_READY)
{
CloseLink();
HideFieldMessageBox();
- gTasks[taskId].func = sub_80B2CB0;
+ gTasks[taskId].func = Task_StopLinkup;
}
else
{
gFieldLinkPlayerCount = GetLinkPlayerCount_2();
gLocalLinkPlayerId = GetMultiplayerId();
- sub_800AA04(gFieldLinkPlayerCount);
+ SaveLinkPlayers(gFieldLinkPlayerCount);
card = (struct TrainerCard *)gBlockSendBuffer;
TrainerCard_GenerateCardForPlayer(card);
card->monSpecies[0] = GetMonData(&gPlayerParty[gSelectedOrderFromParty[0] - 1], MON_DATA_SPECIES, NULL);
card->monSpecies[1] = GetMonData(&gPlayerParty[gSelectedOrderFromParty[1] - 1], MON_DATA_SPECIES, NULL);
- gTasks[taskId].func = sub_80B2C30;
+ gTasks[taskId].func = Task_LinkupAwaitTrainerCardData;
sub_800A4D8(2);
}
}
-bool32 sub_80B2AF4(u16 *arg0, u16 *arg1)
+bool32 AreBattleTowerLinkSpeciesSame(u16 *speciesList1, u16 *speciesList2)
{
int i;
int j;
- bool32 result = FALSE;
- int k = 0;
+ bool32 haveSameSpecies = FALSE;
+ int numSameSpecies = 0;
gStringVar1[0] = EOS;
gStringVar2[0] = EOS;
- for (i = 0; i < 2; i++)
+ for (i = 0; i < FRONTIER_MULTI_PARTY_SIZE; i++)
{
- for (j = 0; j < 2; j++)
+ for (j = 0; j < FRONTIER_MULTI_PARTY_SIZE; j++)
{
- if (arg0[i] == arg1[j])
+ if (speciesList1[i] == speciesList2[j])
{
- if (k == 0)
+ if (numSameSpecies == 0)
{
- StringCopy(gStringVar1, gSpeciesNames[arg0[i]]);
- result = TRUE;
+ StringCopy(gStringVar1, gSpeciesNames[speciesList1[i]]);
+ haveSameSpecies = TRUE;
}
- if (k == 1)
+ if (numSameSpecies == 1)
{
- StringCopy(gStringVar2, gSpeciesNames[arg0[i]]);
- result = TRUE;
+ StringCopy(gStringVar2, gSpeciesNames[speciesList1[i]]);
+ haveSameSpecies = TRUE;
}
- k++;
+ numSameSpecies++;
}
}
}
- gSpecialVar_0x8005 = k;
+ // var below is read by BattleFrontier_BattleTowerLobby_EventScript_AbortLink
+ gSpecialVar_0x8005 = numSameSpecies;
- return result;
+ return haveSameSpecies;
}
-static void task_map_chg_seq_0807EC34(u16 *a0, u32 taskId)
+static void FinishLinkup(u16 *linkupStatus, u32 taskId)
{
struct TrainerCard *trainerCards = gTrainerCards;
- if (*a0 == 1)
+ if (*linkupStatus == LINKUP_SUCCESS)
{
if (gLinkType == LINKTYPE_BATTLE_TOWER_50 || gLinkType == LINKTYPE_BATTLE_TOWER_OPEN)
{
- if (sub_80B2AF4(trainerCards[0].monSpecies, trainerCards[1].monSpecies))
+ if (AreBattleTowerLinkSpeciesSame(trainerCards[0].monSpecies, trainerCards[1].monSpecies))
{
- *a0 = 11;
+ // Unsuccessful battle tower linkup
+ *linkupStatus = LINKUP_FAILED_BATTLE_TOWER;
sub_800AC34();
- gTasks[taskId].func = sub_80B2CB0;
+ gTasks[taskId].func = Task_StopLinkup;
}
else
{
- sub_80B241C(gTasks[taskId].data[5]);
+ // Successful battle tower linkup
+ ClearLinkPlayerCountWindow(gTasks[taskId].tWindowId);
EnableBothScriptContexts();
DestroyTask(taskId);
}
}
else
{
- sub_80B241C(gTasks[taskId].data[5]);
+ // Successful linkup
+ ClearLinkPlayerCountWindow(gTasks[taskId].tWindowId);
EnableBothScriptContexts();
DestroyTask(taskId);
}
}
else
{
+ // Unsuccessful linkup
sub_800AC34();
- gTasks[taskId].func = sub_80B2CB0;
+ gTasks[taskId].func = Task_StopLinkup;
}
}
-static void sub_80B2C30(u8 taskId)
+static void Task_LinkupAwaitTrainerCardData(u8 taskId)
{
u8 index;
struct TrainerCard *trainerCards;
- if (sub_80B24F8(taskId) == TRUE)
+ if (CheckLinkErrored(taskId) == TRUE)
return;
- if (GetBlockReceivedStatus() != sub_800A9A8())
+ if (GetBlockReceivedStatus() != GetSavedLinkPlayerCountAsBitFlags())
return;
for (index = 0; index < GetLinkPlayerCount(); index++)
@@ -506,74 +526,74 @@ static void sub_80B2C30(u8 taskId)
SetSuppressLinkErrorMessage(FALSE);
ResetBlockReceivedFlags();
- task_map_chg_seq_0807EC34(&gSpecialVar_Result, taskId);
+ FinishLinkup(&gSpecialVar_Result, taskId);
}
-static void sub_80B2CB0(u8 taskId)
+static void Task_StopLinkup(u8 taskId)
{
- if (gReceivedRemoteLinkPlayers == FALSE)
+ if (!gReceivedRemoteLinkPlayers)
{
- sub_80B241C(gTasks[taskId].data[5]);
+ ClearLinkPlayerCountWindow(gTasks[taskId].tWindowId);
EnableBothScriptContexts();
- RemoveWindow(gTasks[taskId].data[5]);
+ RemoveWindow(gTasks[taskId].tWindowId);
DestroyTask(taskId);
}
}
-static void sub_80B2CEC(u8 taskId)
+static void Task_LinkupFailed(u8 taskId)
{
- gSpecialVar_Result = 5;
- sub_80B241C(gTasks[taskId].data[5]);
+ gSpecialVar_Result = LINKUP_FAILED;
+ ClearLinkPlayerCountWindow(gTasks[taskId].tWindowId);
StopFieldMessage();
- RemoveWindow(gTasks[taskId].data[5]);
+ RemoveWindow(gTasks[taskId].tWindowId);
EnableBothScriptContexts();
DestroyTask(taskId);
}
-static void sub_80B2D2C(u8 taskId)
+static void Task_LinkupConnectionError(u8 taskId)
{
- gSpecialVar_Result = 6;
- sub_80B241C(gTasks[taskId].data[5]);
- RemoveWindow(gTasks[taskId].data[5]);
+ gSpecialVar_Result = LINKUP_CONNECTION_ERROR;
+ ClearLinkPlayerCountWindow(gTasks[taskId].tWindowId);
+ RemoveWindow(gTasks[taskId].tWindowId);
HideFieldMessageBox();
EnableBothScriptContexts();
DestroyTask(taskId);
}
-static bool8 sub_80B2D6C(u8 taskId)
+static bool8 TryLinkTimeout(u8 taskId)
{
- gTasks[taskId].data[4]++;
- if (gTasks[taskId].data[4] > 600)
+ gTasks[taskId].tTimer++;
+ if (gTasks[taskId].tTimer > 600)
{
- gTasks[taskId].func = sub_80B2D2C;
+ gTasks[taskId].func = Task_LinkupConnectionError;
return TRUE;
}
return FALSE;
}
-void TryBattleLinkup(u8 arg0)
+void TryBattleLinkup(void)
{
- u8 r3 = 2;
- u8 r2 = 2;
+ u8 minPlayers = 2;
+ u8 maxPlayers = 2;
switch (gSpecialVar_0x8004)
{
case USING_SINGLE_BATTLE:
- r3 = 2;
+ minPlayers = 2;
gLinkType = LINKTYPE_SINGLE_BATTLE;
break;
case USING_DOUBLE_BATTLE:
- r3 = 2;
+ minPlayers = 2;
gLinkType = LINKTYPE_DOUBLE_BATTLE;
break;
case USING_MULTI_BATTLE:
- r3 = 4;
- r2 = 4;
+ minPlayers = 4;
+ maxPlayers = 4;
gLinkType = LINKTYPE_MULTI_BATTLE;
break;
case USING_BATTLE_TOWER:
- r3 = 2;
+ minPlayers = 2;
if (gSaveBlock2Ptr->frontier.lvlMode == FRONTIER_LVL_50)
gLinkType = LINKTYPE_BATTLE_TOWER_50;
else
@@ -582,46 +602,52 @@ void TryBattleLinkup(u8 arg0)
break;
}
- sub_80B236C(r3, r2);
+ CreateLinkupTask(minPlayers, maxPlayers);
}
+#undef tMinPlayers
+#undef tMaxPlayers
+#undef tNumPlayers
+#undef tTimer
+#undef tWindowId
+
void TryTradeLinkup(void)
{
- gLinkType = LINKTYPE_0x1133;
+ gLinkType = LINKTYPE_TRADE_SETUP;
gBattleTypeFlags = 0;
- sub_80B236C(2, 2);
+ CreateLinkupTask(2, 2);
}
void TryRecordMixLinkup(void)
{
- gSpecialVar_Result = 0;
- gLinkType = LINKTYPE_0x3311;
+ gSpecialVar_Result = LINKUP_ONGOING;
+ gLinkType = LINKTYPE_RECORD_MIX_BEFORE;
gBattleTypeFlags = 0;
- sub_80B236C(2, 4);
+ CreateLinkupTask(2, 4);
}
-void sub_80B2EA8(void)
+void ValidateMixingGameLanguage(void)
{
- u32 taskId = FindTaskIdByFunc(sub_80B2EE4);
+ u32 taskId = FindTaskIdByFunc(Task_ValidateMixingGameLanguage);
if (taskId == 0xFF)
{
- taskId = CreateTask(sub_80B2EE4, 80);
- gTasks[taskId].data[0] = 0;
+ taskId = CreateTask(Task_ValidateMixingGameLanguage, 80);
+ gTasks[taskId].tState = 0;
}
}
-static void sub_80B2EE4(u8 taskId)
+static void Task_ValidateMixingGameLanguage(u8 taskId)
{
int playerCount;
int i;
- switch (gTasks[taskId].data[0])
+ switch (gTasks[taskId].tState)
{
case 0:
- if (gSpecialVar_Result == 1)
+ if (gSpecialVar_Result == LINKUP_SUCCESS)
{
- bool32 unk = FALSE;
+ bool32 mixingForeignGames = FALSE;
bool32 isEnglishRSLinked = FALSE;
bool32 isJapaneseEmeraldLinked = FALSE;
@@ -635,7 +661,7 @@ static void sub_80B2EE4(u8 taskId)
{
if (language == LANGUAGE_JAPANESE)
{
- unk = TRUE;
+ mixingForeignGames = TRUE;
break;
}
else
@@ -654,14 +680,14 @@ static void sub_80B2EE4(u8 taskId)
if (isEnglishRSLinked && isJapaneseEmeraldLinked)
{
- unk = TRUE;
+ mixingForeignGames = TRUE;
}
- if (unk)
+ if (mixingForeignGames)
{
- gSpecialVar_Result = 12;
+ gSpecialVar_Result = LINKUP_FOREIGN_GAME;
sub_800AD10();
- gTasks[taskId].data[0] = 1;
+ gTasks[taskId].tState = 1;
return;
}
}
@@ -669,7 +695,7 @@ static void sub_80B2EE4(u8 taskId)
DestroyTask(taskId);
break;
case 1:
- if (gReceivedRemoteLinkPlayers == FALSE)
+ if (!gReceivedRemoteLinkPlayers)
{
EnableBothScriptContexts();
DestroyTask(taskId);
@@ -682,26 +708,26 @@ void TryBerryBlenderLinkup(void)
{
gLinkType = LINKTYPE_BERRY_BLENDER_SETUP;
gBattleTypeFlags = 0;
- sub_80B236C(2, 4);
+ CreateLinkupTask(2, 4);
}
void TryContestGModeLinkup(void)
{
gLinkType = LINKTYPE_CONTEST_GMODE;
gBattleTypeFlags = 0;
- sub_80B236C(4, 4);
+ CreateLinkupTask(4, 4);
}
void TryContestEModeLinkup(void)
{
gLinkType = LINKTYPE_CONTEST_EMODE;
gBattleTypeFlags = 0;
- sub_80B236C(2, 4);
+ CreateLinkupTask(2, 4);
}
-u8 sub_80B3050(void)
+u8 CreateTask_ReestablishCableClubLink(void)
{
- if (FuncIsActiveTask(sub_80B3144) != FALSE)
+ if (FuncIsActiveTask(Task_ReestablishLink) != FALSE)
return 0xFF;
switch (gSpecialVar_0x8004)
@@ -717,26 +743,22 @@ u8 sub_80B3050(void)
break;
case USING_BATTLE_TOWER:
if (gSaveBlock2Ptr->frontier.lvlMode == FRONTIER_LVL_50)
- {
gLinkType = LINKTYPE_BATTLE_TOWER_50;
- }
else
- {
gLinkType = LINKTYPE_BATTLE_TOWER_OPEN;
- }
break;
case USING_TRADE_CENTER:
- gLinkType = LINKTYPE_0x1111;
+ gLinkType = LINKTYPE_TRADE;
break;
case USING_RECORD_CORNER:
- gLinkType = LINKTYPE_0x3322;
+ gLinkType = LINKTYPE_RECORD_MIX_AFTER;
break;
}
- return CreateTask(sub_80B3144, 80);
+ return CreateTask(Task_ReestablishLink, 80);
}
-static void sub_80B3144(u8 taskId)
+static void Task_ReestablishLink(u8 taskId)
{
s16 *data = gTasks[taskId].data;
@@ -744,42 +766,42 @@ static void sub_80B3144(u8 taskId)
{
OpenLink();
ResetLinkPlayers();
- CreateTask(task00_08081A90, 80);
+ CreateTask(Task_WaitForLinkPlayerConnection, 80);
}
else if (data[0] >= 10)
{
- gTasks[taskId].func = sub_80B3194;
+ gTasks[taskId].func = Task_ReestablishLinkAwaitConnection;
}
data[0]++;
}
-static void sub_80B3194(u8 taskId)
+static void Task_ReestablishLinkAwaitConnection(u8 taskId)
{
if (GetLinkPlayerCount_2() >= 2)
{
if (IsLinkMaster() == TRUE)
- gTasks[taskId].func = sub_80B31E8;
+ gTasks[taskId].func = Task_ReestablishLinkLeader;
else
- gTasks[taskId].func = sub_80B3220;
+ gTasks[taskId].func = Task_ReestablishLinkAwaitConfirmation;
}
}
-static void sub_80B31E8(u8 taskId)
+static void Task_ReestablishLinkLeader(u8 taskId)
{
if (GetSavedPlayerCount() == GetLinkPlayerCount_2())
{
CheckShouldAdvanceLinkState();
- gTasks[taskId].func = sub_80B3220;
+ gTasks[taskId].func = Task_ReestablishLinkAwaitConfirmation;
}
}
-static void sub_80B3220(u8 taskId)
+static void Task_ReestablishLinkAwaitConfirmation(u8 taskId)
{
if (gReceivedRemoteLinkPlayers == TRUE
&& IsLinkPlayerDataExchangeComplete() == TRUE)
{
- sub_800AB18();
- sub_8009F18();
+ CheckLinkPlayersMatchSaved();
+ StartSendingKeysToLink();
DestroyTask(taskId);
}
}
@@ -794,50 +816,52 @@ static void SetLinkBattleTypeFlags(int linkService)
{
switch (linkService)
{
- case USING_SINGLE_BATTLE:
- gBattleTypeFlags = BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER;
- break;
- case USING_DOUBLE_BATTLE:
- gBattleTypeFlags = BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER;
- break;
- case USING_MULTI_BATTLE:
- ReducePlayerPartyToSelectedMons();
- gBattleTypeFlags = BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_MULTI;
- break;
- case USING_BATTLE_TOWER:
- gBattleTypeFlags = BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_MULTI;
- break;
+ case USING_SINGLE_BATTLE:
+ gBattleTypeFlags = BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER;
+ break;
+ case USING_DOUBLE_BATTLE:
+ gBattleTypeFlags = BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER;
+ break;
+ case USING_MULTI_BATTLE:
+ ReducePlayerPartyToSelectedMons();
+ gBattleTypeFlags = BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_MULTI;
+ break;
+ case USING_BATTLE_TOWER:
+ gBattleTypeFlags = BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_MULTI;
+ break;
}
}
-static void sub_80B32B4(u8 taskId)
+#define tTimer data[1]
+
+static void Task_StartWiredCableClubBattle(u8 taskId)
{
struct Task* task = &gTasks[taskId];
- switch (task->data[0])
+ switch (task->tState)
{
case 0:
FadeScreen(FADE_TO_BLACK, 0);
gLinkType = LINKTYPE_BATTLE;
ClearLinkCallback_2();
- task->data[0]++;
+ task->tState++;
break;
case 1:
if (!gPaletteFade.active)
- task->data[0]++;
+ task->tState++;
break;
case 2:
- task->data[1]++;
- if (task->data[1] > 20)
- task->data[0]++;
+ task->tTimer++;
+ if (task->tTimer > 20)
+ task->tState++;
break;
case 3:
sub_800AC34();
- task->data[0]++;
+ task->tState++;
break;
case 4:
if (!gReceivedRemoteLinkPlayers)
- task->data[0]++;
+ task->tState++;
break;
case 5:
if (gLinkPlayers[0].trainerId & 1)
@@ -847,37 +871,37 @@ static void sub_80B32B4(u8 taskId)
SetLinkBattleTypeFlags(gSpecialVar_0x8004);
CleanupOverworldWindowsAndTilemaps();
- gTrainerBattleOpponent_A = 0x800;
+ gTrainerBattleOpponent_A = TRAINER_LINK_OPPONENT;
SetMainCallback2(CB2_InitBattle);
- gMain.savedCallback = sub_80B360C;
+ gMain.savedCallback = CB2_ReturnFromCableClubBattle;
DestroyTask(taskId);
break;
}
}
-static void sub_80B33BC(u8 taskId)
+static void Task_StartWirelessCableClubBattle(u8 taskId)
{
int i;
s16* data = gTasks[taskId].data;
- switch (data[0])
+ switch (tState)
{
case 0:
FadeScreen(FADE_TO_BLACK, 0);
gLinkType = LINKTYPE_BATTLE;
ClearLinkCallback_2();
- data[0] = 1;
+ tState = 1;
break;
case 1:
if (!gPaletteFade.active)
- data[0] = 2;
+ tState = 2;
break;
case 2:
SendBlock(0, &gLocalLinkPlayer, sizeof(gLocalLinkPlayer));
- data[0] = 3;
+ tState = 3;
break;
case 3:
- if (GetBlockReceivedStatus() == sub_800A9D8())
+ if (GetBlockReceivedStatus() == GetLinkPlayerCountAsBitFlags())
{
for (i = 0; i < GetLinkPlayerCount(); i++)
{
@@ -886,22 +910,22 @@ static void sub_80B33BC(u8 taskId)
sub_800B524(&gLinkPlayers[i]);
ResetBlockReceivedFlag(i);
}
- data[0] = 4;
+ tState = 4;
}
break;
case 4:
- data[1]++;
- if (data[1] > 20)
- data[0] = 5;
+ tTimer++;
+ if (tTimer > 20)
+ tState = 5;
break;
case 5:
sub_800ADF8();
- data[0] = 6;
+ tState = 6;
break;
case 6:
if (IsLinkTaskFinished())
{
- data[0] = 7;
+ tState = 7;
}
break;
case 7:
@@ -913,59 +937,61 @@ static void sub_80B33BC(u8 taskId)
gLinkPlayers[0].linkType = LINKTYPE_BATTLE;
SetLinkBattleTypeFlags(gSpecialVar_0x8004);
CleanupOverworldWindowsAndTilemaps();
- gTrainerBattleOpponent_A = 0x800;
+ gTrainerBattleOpponent_A = TRAINER_LINK_OPPONENT;
SetMainCallback2(CB2_InitBattle);
- gMain.savedCallback = sub_80B360C;
+ gMain.savedCallback = CB2_ReturnFromCableClubBattle;
DestroyTask(taskId);
break;
}
}
-static void sub_80B3554(void)
+#undef tTimer
+
+static void CB2_ReturnFromUnionRoomBattle(void)
{
u8 playerCount;
int i;
- bool32 r4;
+ bool32 linkedWithFRLG;
switch (gMain.state)
{
- case 0:
- playerCount = GetLinkPlayerCount();
- r4 = FALSE;
- for (i = 0; i < playerCount; i++)
+ case 0:
+ playerCount = GetLinkPlayerCount();
+ linkedWithFRLG = FALSE;
+ for (i = 0; i < playerCount; i++)
+ {
+ u32 version = (u8)gLinkPlayers[i].version;
+ if (version == VERSION_FIRE_RED || version == VERSION_LEAF_GREEN)
{
- u32 version = (u8)gLinkPlayers[i].version;
- if (version == VERSION_FIRE_RED || version == VERSION_LEAF_GREEN)
- {
- r4 = TRUE;
- break;
- }
+ linkedWithFRLG = TRUE;
+ break;
}
+ }
- if (r4)
- {
- gMain.state = 2;
- }
- else
- {
- sub_800AC34();
- gMain.state = 1;
- }
- break;
- case 1:
- if (gReceivedRemoteLinkPlayers == FALSE)
- {
- SetMainCallback2(CB2_ReturnToField);
- }
- break;
- case 2:
+ if (linkedWithFRLG)
+ {
+ gMain.state = 2;
+ }
+ else
+ {
+ sub_800AC34();
+ gMain.state = 1;
+ }
+ break;
+ case 1:
+ if (!gReceivedRemoteLinkPlayers)
+ {
SetMainCallback2(CB2_ReturnToField);
- break;
+ }
+ break;
+ case 2:
+ SetMainCallback2(CB2_ReturnToField);
+ break;
}
RunTasks();
}
-void sub_80B360C(void)
+void CB2_ReturnFromCableClubBattle(void)
{
gBattleTypeFlags &= ~BATTLE_TYPE_20;
Overworld_ResetMapMusic();
@@ -980,26 +1006,22 @@ void sub_80B360C(void)
{
switch (gBattleOutcome)
{
- case B_OUTCOME_WON:
- sub_801B990(0, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);
- break;
- case B_OUTCOME_LOST:
- sub_801B990(1, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);
- break;
+ case B_OUTCOME_WON:
+ RecordIdOfWonderCardSenderByEventType(0, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);
+ break;
+ case B_OUTCOME_LOST:
+ RecordIdOfWonderCardSenderByEventType(1, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);
+ break;
}
}
}
if (InUnionRoom() == TRUE)
- {
- gMain.savedCallback = sub_80B3554;
- }
+ gMain.savedCallback = CB2_ReturnFromUnionRoomBattle;
else
- {
gMain.savedCallback = CB2_ReturnToFieldFromMultiplayer;
- }
- SetMainCallback2(sub_80A0514);
+ SetMainCallback2(CB2_SetUpSaveAfterLinkBattle);
}
void CleanupLinkRoomState(void)
@@ -1020,22 +1042,23 @@ void ExitLinkRoom(void)
QueueExitLinkRoomKey();
}
-static void sub_80B3728(u8 taskId)
+// Note: gSpecialVar_0x8005 contains the id of the seat the player entered
+static void Task_EnterCableClubSeat(u8 taskId)
{
struct Task* task = &gTasks[taskId];
- switch (task->data[0])
+ switch (task->tState)
{
case 0:
ShowFieldMessage(gText_PleaseWaitForLink);
- task->data[0] = 1;
+ task->tState = 1;
break;
case 1:
if (IsFieldMessageBoxHidden())
{
sub_8087288();
SetLocalLinkPlayerId(gSpecialVar_0x8005);
- task->data[0] = 2;
+ task->tState = 2;
}
break;
case 2:
@@ -1045,12 +1068,12 @@ static void sub_80B3728(u8 taskId)
break;
case 1:
HideFieldMessageBox();
- task->data[0] = 0;
+ task->tState = 0;
sub_80872C4();
SwitchTaskToFollowupFunc(taskId);
break;
case 2:
- task->data[0] = 3;
+ task->tState = 3;
break;
}
break;
@@ -1063,35 +1086,35 @@ static void sub_80B3728(u8 taskId)
}
}
-void sub_80B37D4(TaskFunc followupFunc)
+void CreateTask_EnterCableClubSeat(TaskFunc followupFunc)
{
- u8 taskId = CreateTask(sub_80B3728, 80);
- SetTaskFuncWithFollowupFunc(taskId, sub_80B3728, followupFunc);
+ u8 taskId = CreateTask(Task_EnterCableClubSeat, 80);
+ SetTaskFuncWithFollowupFunc(taskId, Task_EnterCableClubSeat, followupFunc);
ScriptContext1_Stop();
}
-static void sub_80B37FC(u8 taskId)
+static void Task_StartWiredTrade(u8 taskId)
{
struct Task *task = &gTasks[taskId];
- switch (task->data[0])
+ switch (task->tState)
{
case 0:
ScriptContext2_Enable();
FadeScreen(FADE_TO_BLACK, 0);
ClearLinkCallback_2();
- task->data[0]++;
+ task->tState++;
break;
case 1:
if (!gPaletteFade.active)
- task->data[0]++;
+ task->tState++;
break;
case 2:
gSelectedTradeMonPositions[TRADE_PLAYER] = 0;
gSelectedTradeMonPositions[TRADE_PARTNER] = 0;
m4aMPlayAllStop();
sub_800AC34();
- task->data[0]++;
+ task->tState++;
break;
case 3:
if (!gReceivedRemoteLinkPlayers)
@@ -1103,55 +1126,51 @@ static void sub_80B37FC(u8 taskId)
}
}
-static void sub_80B3894(u8 taskId)
+static void Task_StartWirelessTrade(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- switch (data[0])
+ switch (tState)
{
case 0:
ScriptContext2_Enable();
FadeScreen(FADE_TO_BLACK, 0);
ClearLinkRfuCallback();
- data[0]++;
+ tState++;
break;
case 1:
if (!gPaletteFade.active)
- data[0]++;
+ tState++;
break;
case 2:
gSelectedTradeMonPositions[TRADE_PLAYER] = 0;
gSelectedTradeMonPositions[TRADE_PARTNER] = 0;
m4aMPlayAllStop();
sub_800ADF8();
- data[0]++;
+ tState++;
break;
case 3:
if (IsLinkTaskFinished())
{
- sub_8013F78();
+ CreateTask_CreateTradeMenu();
DestroyTask(taskId);
}
break;
}
}
-// Note: VAR_0x8005 is set to the ID of the trade seat.
void PlayerEnteredTradeSeat(void)
{
if (gWirelessCommType != 0)
- {
- sub_80B37D4(sub_80B3894);
- }
+ CreateTask_EnterCableClubSeat(Task_StartWirelessTrade);
else
- {
- sub_80B37D4(sub_80B37FC);
- }
+ CreateTask_EnterCableClubSeat(Task_StartWiredTrade);
}
-static void sub_80B3950(void)
+// Unused
+static void CreateTask_StartWiredTrade(void)
{
- CreateTask(sub_80B37FC, 80);
+ CreateTask(Task_StartWiredTrade, 80);
}
void nullsub_37(void)
@@ -1159,25 +1178,20 @@ void nullsub_37(void)
}
-// Note: VAR_0x8005 is set to the ID of the player spot.
void ColosseumPlayerSpotTriggered(void)
{
gLinkType = LINKTYPE_BATTLE;
- if (gWirelessCommType != 0)
- {
- sub_80B37D4(sub_80B33BC);
- }
+ if (gWirelessCommType)
+ CreateTask_EnterCableClubSeat(Task_StartWirelessCableClubBattle);
else
- {
- sub_80B37D4(sub_80B32B4);
- }
+ CreateTask_EnterCableClubSeat(Task_StartWiredCableClubBattle);
}
-// This function is never called.
-static void sub_80B39A4(void)
+// Unused
+static void CreateTask_EnterCableClubSeatNoFollowup(void)
{
- u8 taskId = CreateTask(sub_80B3728, 80);
+ u8 taskId = CreateTask(Task_EnterCableClubSeat, 80);
ScriptContext1_Stop();
}
@@ -1199,16 +1213,18 @@ bool32 GetLinkTrainerCardColor(u8 linkPlayerIndex)
if (numStars == 0)
return FALSE;
- StringCopy(gStringVar2, gTrainerCardColorNames[numStars - 1]);
+ StringCopy(gStringVar2, sTrainerCardColorNames[numStars - 1]);
return TRUE;
}
-void task00_08081A90(u8 taskId)
+#define tTimer data[0]
+
+void Task_WaitForLinkPlayerConnection(u8 taskId)
{
struct Task *task = &gTasks[taskId];
- task->data[0]++;
- if (task->data[0] > 300)
+ task->tTimer++;
+ if (task->tTimer > 300)
{
CloseLink();
SetMainCallback2(CB2_LinkError);
@@ -1217,9 +1233,10 @@ void task00_08081A90(u8 taskId)
if (gReceivedRemoteLinkPlayers)
{
+ // Players connected, destroy task
if (gWirelessCommType == 0)
{
- if (!sub_800AA60())
+ if (!DoesLinkPlayerCountMatchSaved())
{
CloseLink();
SetMainCallback2(CB2_LinkError);
@@ -1233,6 +1250,8 @@ void task00_08081A90(u8 taskId)
}
}
+#undef tTimer
+
static void sub_80B3AAC(u8 taskId)
{
if (!gReceivedRemoteLinkPlayers)
@@ -1242,67 +1261,72 @@ static void sub_80B3AAC(u8 taskId)
}
}
+// Unused
static void sub_80B3AD0(u8 taskId)
{
sub_800AC34();
gTasks[taskId].func = sub_80B3AAC;
}
+#define tTimer data[1]
+
void sub_80B3AF8(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- switch (data[0])
+ switch (tState)
{
- case 0:
- if (gWirelessCommType != 0)
- {
- DestroyTask(taskId);
- }
- else
- {
- OpenLink();
- CreateTask(task00_08081A90, 1);
- data[0]++;
- }
- break;
- case 1:
- if (++data[1] > 11)
- {
- data[1] = 0;
- data[0]++;
- }
- break;
- case 2:
- if (GetLinkPlayerCount_2() >= GetSavedPlayerCount())
+ case 0:
+ if (gWirelessCommType != 0)
+ {
+ DestroyTask(taskId);
+ }
+ else
+ {
+ OpenLink();
+ CreateTask(Task_WaitForLinkPlayerConnection, 1);
+ tState++;
+ }
+ break;
+ case 1:
+ if (++tTimer > 11)
+ {
+ tTimer = 0;
+ tState++;
+ }
+ break;
+ case 2:
+ if (GetLinkPlayerCount_2() >= GetSavedPlayerCount())
+ {
+ if (IsLinkMaster())
{
- if (IsLinkMaster())
- {
- if (++data[1] > 30)
- {
- CheckShouldAdvanceLinkState();
- data[0]++;
- }
- }
- else
+ if (++tTimer > 30)
{
- data[0]++;
+ CheckShouldAdvanceLinkState();
+ tState++;
}
}
- break;
- case 3:
- if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE)
+ else
{
- DestroyTask(taskId);
+ tState++;
}
- break;
+ }
+ break;
+ case 3:
+ if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE)
+ {
+ DestroyTask(taskId);
+ }
+ break;
}
}
+#undef tTimer
+
void TrySetBattleTowerLinkType(void)
{
if (gWirelessCommType == 0)
- {
gLinkType = LINKTYPE_BATTLE_TOWER;
- }
}
+
+#undef tState
diff --git a/src/contest_link_80FC4F4.c b/src/contest_link_80FC4F4.c
index d6cfea638..64591e00b 100644
--- a/src/contest_link_80FC4F4.c
+++ b/src/contest_link_80FC4F4.c
@@ -36,7 +36,7 @@ bool8 sub_80FC530(u8 arg0)
bool8 sub_80FC55C(void)
{
- if (GetBlockReceivedStatus() == sub_800A9D8())
+ if (GetBlockReceivedStatus() == GetLinkPlayerCountAsBitFlags())
{
ResetBlockReceivedFlags();
return TRUE;
diff --git a/src/data/union_room.h b/src/data/union_room.h
index 8cb0bc8aa..704978766 100644
--- a/src/data/union_room.h
+++ b/src/data/union_room.h
@@ -50,27 +50,36 @@ const u8 sText_4PlayerMode[] = _("4-PLAYER\nMODE");
const u8 sText_5PlayerMode[] = _("5-PLAYER\nMODE");
static const u8 *const sPlayersNeededOrModeTexts[][5] = {
+ // 2 players required
{
sText_1PlayerNeeded,
sText_2PlayerMode
- }, {
+ },
+ // 4 players required
+ {
sText_3PlayersNeeded,
sText_2PlayersNeeded,
sText_1PlayerNeeded,
sText_4PlayerMode
- }, {
+ },
+ // 2-5 players required
+ {
sText_1PlayerNeeded,
sText_2PlayerMode,
sText_3PlayerMode,
sText_4PlayerMode,
sText_5PlayerMode
- }, {
+ },
+ // 3-5 players required
+ {
sText_2PlayersNeeded,
sText_1PlayerNeeded,
sText_3PlayerMode,
sText_4PlayerMode,
sText_5PlayerMode
- }, {
+ },
+ // 2-4 players required
+ {
sText_1PlayerNeeded,
sText_2PlayerMode,
sText_3PlayerMode,
@@ -90,15 +99,15 @@ ALIGNED(4) const u8 sText_OtherTrainerUnavailableNow[] = _("The other TRAINER do
ALIGNED(4) const u8 sText_CantTransmitTrainerTooFar[] = _("You can't transmit with a TRAINER\nwho is too far away.\p");
ALIGNED(4) const u8 sText_TrainersNotReadyYet[] = _("The other TRAINER(S) is/are not\nready yet.\p");
-const u8 *const sCantTransmitToTrainerTexts[] = {
- sText_CantTransmitTrainerTooFar,
- sText_TrainersNotReadyYet
+static const u8 *const sCantTransmitToTrainerTexts[] = {
+ [UR_TRADE_PLAYER_NOT_READY - 1] = sText_CantTransmitTrainerTooFar,
+ [UR_TRADE_PARTNER_NOT_READY - 1] = sText_TrainersNotReadyYet
};
ALIGNED(4) const u8 sText_ModeWithTheseMembersWillBeCanceled[] = _("The {STR_VAR_1} MODE with\nthese members will be canceled.{PAUSE 60}");
ALIGNED(4) const u8 sText_MemberNoLongerAvailable[] = _("There is a member who can no\nlonger remain available.\p");
-const u8 *const sPlayerUnavailableTexts[] = {
+static const u8 *const sPlayerUnavailableTexts[] = {
sText_OtherTrainerUnavailableNow,
sText_MemberNoLongerAvailable
};
@@ -111,17 +120,17 @@ ALIGNED(4) const u8 sText_AwaitingOtherMembers[] = _("{STR_VAR_1}!\nAwaiting oth
ALIGNED(4) const u8 sText_QuitBeingMember[] = _("Quit being a member?");
ALIGNED(4) const u8 sText_StoppedBeingMember[] = _("You stopped being a member.\p");
-const u8 *const sPlayerDisconnectedTexts[] = {
- NULL,
- sText_MemberNoLongerAvailable,
- sText_TrainerAppearsUnavailable,
- NULL,
- NULL,
- NULL,
- sText_PlayerRepliedNo,
- NULL,
- NULL,
- sText_StoppedBeingMember
+static const u8 *const sPlayerDisconnectedTexts[] = {
+ [RFU_STATUS_OK] = NULL,
+ [RFU_STATUS_FATAL_ERROR] = sText_MemberNoLongerAvailable,
+ [RFU_STATUS_CONNECTION_ERROR] = sText_TrainerAppearsUnavailable,
+ [RFU_STATUS_CHILD_SEND_COMPLETE] = NULL,
+ [RFU_STATUS_NEW_CHILD_DETECTED] = NULL,
+ [RFU_STATUS_JOIN_GROUP_OK] = NULL,
+ [RFU_STATUS_JOIN_GROUP_NO] = sText_PlayerRepliedNo,
+ [RFU_STATUS_WAIT_ACK_JOIN_GROUP] = NULL,
+ [RFU_STATUS_LEAVE_GROUP_NOTICE] = NULL,
+ [RFU_STATUS_LEAVE_GROUP] = sText_StoppedBeingMember
};
ALIGNED(4) const u8 sText_WirelessLinkEstablished[] = _("The WIRELESS COMMUNICATION\nSYSTEM link has been established.");
@@ -130,16 +139,16 @@ ALIGNED(4) const u8 sText_LinkWithFriendDropped[] = _("The link with your friend
ALIGNED(4) const u8 sText_PlayerRepliedNo2[] = _("{STR_VAR_1} replied, “No…”");
const u8 *const sLinkDroppedTexts[] = {
- NULL,
- sText_LinkWithFriendDropped,
- sText_LinkWithFriendDropped,
- NULL,
- NULL,
- NULL,
- sText_PlayerRepliedNo2,
- NULL,
- NULL,
- NULL
+ [RFU_STATUS_OK] = NULL,
+ [RFU_STATUS_FATAL_ERROR] = sText_LinkWithFriendDropped,
+ [RFU_STATUS_CONNECTION_ERROR] = sText_LinkWithFriendDropped,
+ [RFU_STATUS_CHILD_SEND_COMPLETE] = NULL,
+ [RFU_STATUS_NEW_CHILD_DETECTED] = NULL,
+ [RFU_STATUS_JOIN_GROUP_OK] = NULL,
+ [RFU_STATUS_JOIN_GROUP_NO] = sText_PlayerRepliedNo2,
+ [RFU_STATUS_WAIT_ACK_JOIN_GROUP] = NULL,
+ [RFU_STATUS_LEAVE_GROUP_NOTICE] = NULL,
+ [RFU_STATUS_LEAVE_GROUP] = NULL
};
ALIGNED(4) const u8 sText_DoYouWantXMode[] = _("Do you want the {STR_VAR_2}\nMODE?");
@@ -251,7 +260,7 @@ ALIGNED(4) const u8 sText_WaitForBattleFemale[] = _("A battle? Of course, but I
ALIGNED(4) const u8 sText_WaitForChatFemale[] = _("Did you want to chat?\nOkay, but please wait a moment.");
ALIGNED(4) const u8 sText_ShowTrainerCardFemale[] = _("As my introduction, I'll show you\nmy TRAINER CARD.");
-const u8 *const sText_WaitOrShowCardTexts[GENDER_COUNT][4] = {
+static const u8 *const sText_WaitOrShowCardTexts[GENDER_COUNT][4] = {
{
sText_WaitForBattleMale,
sText_WaitForChatMale,
@@ -274,7 +283,7 @@ ALIGNED(4) const u8 sText_TradeWillBeStarted[] = _("The trade will be started.{P
ALIGNED(4) const u8 sText_BattleWillBeStarted[] = _("The battle will be started.{PAUSE 60}");
ALIGNED(4) const u8 sText_EnteringChat[] = _("Entering the chat…{PAUSE 60}");
-const u8 *const sStartActivityTexts[][GENDER_COUNT][3] = {
+static const u8 *const sStartActivityTexts[][GENDER_COUNT][3] = {
{
{
sText_BattleWillBeStarted,
@@ -325,18 +334,21 @@ const u8 *const sIfYouWantToDoSomethingTexts[GENDER_COUNT] = {
ALIGNED(4) const u8 sText_TrainerBattleBusy[] = _("Whoops! Sorry, but I have to do\nsomething else.\lAnother time, okay?\p");
ALIGNED(4) const u8 sText_NeedTwoMonsOfLevel30OrLower1[] = _("If you want to battle, you need\ntwo POKéMON that are below\lLv. 30.\p");
ALIGNED(4) const u8 sText_NeedTwoMonsOfLevel30OrLower2[] = _("For a battle, you need two\nPOKéMON that are below Lv. 30.\p");
-ALIGNED(4) const u8 sText_DeclineBattleMale[] = _("Oh, all right.\nCome see me anytime, okay?\p");
-ALIGNED(4) const u8 stext_DeclineBattleFemale[] = _("Oh…\nPlease come by anytime.\p");
-static const u8 *const sDeclineBattleTexts[GENDER_COUNT] = {
- sText_DeclineBattleMale,
- stext_DeclineBattleFemale
+ALIGNED(4) const u8 sText_DeclineChatMale[] = _("Oh, all right.\nCome see me anytime, okay?\p");
+ALIGNED(4) const u8 stext_DeclineChatFemale[] = _("Oh…\nPlease come by anytime.\p");
+
+// Response from partner when player declines chat
+static const u8 *const sDeclineChatTexts[GENDER_COUNT] = {
+ sText_DeclineChatMale,
+ stext_DeclineChatFemale
};
ALIGNED(4) const u8 sText_ChatDeclinedMale[] = _("Oh, sorry!\nI just can't right this instant.\lLet's chat another time.\p");
ALIGNED(4) const u8 sText_ChatDeclinedFemale[] = _("Oh, I'm sorry.\nI have too much to do right now.\lLet's chat some other time.\p");
-const u8 *const sChatDeclinedTexts[GENDER_COUNT] = {
+// Response from partner when they decline chat
+static const u8 *const sChatDeclinedTexts[GENDER_COUNT] = {
sText_ChatDeclinedMale,
sText_ChatDeclinedFemale
};
@@ -484,8 +496,8 @@ static const u8 *const sChooseTrainerTexts[NUM_LINK_GROUP_TYPES] =
[LINK_GROUP_BERRY_PICKING] = sText_ChooseLeaderBerryPicking,
[LINK_GROUP_WONDER_CARD] = sText_ChooseTrainerToShareWonderCards,
[LINK_GROUP_WONDER_NEWS] = sText_ChooseTrainerToShareWonderNews,
- [LINK_GROUP_UNK_9] = NULL,
- [LINK_GROUP_UNK_10] = NULL,
+ [LINK_GROUP_UNION_ROOM_RESUME] = NULL,
+ [LINK_GROUP_UNION_ROOM_INIT] = NULL,
[LINK_GROUP_UNK_11] = NULL,
[LINK_GROUP_RECORD_CORNER] = sText_ChooseLeaderRecordCorner,
[LINK_GROUP_BERRY_BLENDER] = sText_ChooseLeaderBerryBlender,
@@ -567,39 +579,39 @@ const u8 *const sGladToMeetYouTexts[GENDER_COUNT] = {
ALIGNED(4) const u8 sText_FinishedCheckingPlayersTrainerCard[] = _("Finished checking {SPECIAL_F7 0x01}'s\nTRAINER CARD.{PAUSE 60}");
-const u8 *const sLinkGroupActivityTexts[] = {
- sText_EmptyString,
- sText_SingleBattle,
- sText_DoubleBattle,
- sText_MultiBattle,
- sText_PokemonTrades,
- sText_Chat,
- sText_WonderCards,
- sText_WonderNews,
- sText_Cards,
- sText_PokemonJump,
- sText_BerryCrush,
- sText_BerryPicking,
- sText_Search,
- sText_EmptyString,
- sText_BattleTowerOpenLv,
- sText_RecordCorner,
- sText_BerryBlender,
- sText_EmptyString,
- sText_EmptyString,
- sText_EmptyString,
- sText_EmptyString,
- sText_WonderCards,
- sText_WonderNews,
- sText_CoolContest,
- sText_BeautyContest,
- sText_CuteContest,
- sText_SmartContest,
- sText_ToughContest,
- sText_BattleTowerLv50
+static const u8 *const sLinkGroupActivityNameTexts[] = {
+ [ACTIVITY_NONE] = sText_EmptyString,
+ [ACTIVITY_BATTLE_SINGLE] = sText_SingleBattle,
+ [ACTIVITY_BATTLE_DOUBLE] = sText_DoubleBattle,
+ [ACTIVITY_BATTLE_MULTI] = sText_MultiBattle,
+ [ACTIVITY_TRADE] = sText_PokemonTrades,
+ [ACTIVITY_CHAT] = sText_Chat,
+ [ACTIVITY_WONDER_CARD] = sText_WonderCards,
+ [ACTIVITY_WONDER_NEWS] = sText_WonderNews,
+ [ACTIVITY_CARD] = sText_Cards,
+ [ACTIVITY_POKEMON_JUMP] = sText_PokemonJump,
+ [ACTIVITY_BERRY_CRUSH] = sText_BerryCrush,
+ [ACTIVITY_BERRY_PICK] = sText_BerryPicking,
+ [ACTIVITY_SEARCH] = sText_Search,
+ [ACTIVITY_SPIN_TRADE] = sText_EmptyString,
+ [ACTIVITY_BATTLE_TOWER_OPEN] = sText_BattleTowerOpenLv,
+ [ACTIVITY_RECORD_CORNER] = sText_RecordCorner,
+ [ACTIVITY_BERRY_BLENDER] = sText_BerryBlender,
+ [ACTIVITY_ACCEPT] = sText_EmptyString,
+ [ACTIVITY_DECLINE] = sText_EmptyString,
+ [ACTIVITY_NPCTALK] = sText_EmptyString,
+ [ACTIVITY_PLYRTALK] = sText_EmptyString,
+ [ACTIVITY_WONDER_CARD2] = sText_WonderCards,
+ [ACTIVITY_WONDER_NEWS2] = sText_WonderNews,
+ [ACTIVITY_CONTEST_COOL] = sText_CoolContest,
+ [ACTIVITY_CONTEST_BEAUTY] = sText_BeautyContest,
+ [ACTIVITY_CONTEST_CUTE] = sText_CuteContest,
+ [ACTIVITY_CONTEST_SMART] = sText_SmartContest,
+ [ACTIVITY_CONTEST_TOUGH] = sText_ToughContest,
+ [ACTIVITY_BATTLE_TOWER] = sText_BattleTowerLv50
};
-const struct WindowTemplate gUnknown_082F00BC = {
+static const struct WindowTemplate sWindowTemplate_BButtonCancel = {
.bg = 0x00,
.tilemapLeft = 0x00,
.tilemapTop = 0x00,
@@ -609,62 +621,69 @@ const struct WindowTemplate gUnknown_082F00BC = {
.baseBlock = 0x0008
};
-const u32 gUnknown_082F00C4[NUM_LINK_GROUP_TYPES] = {
- 0x0201,
- 0x0202,
- 0x0403,
- 0x0204,
- 0x2509,
- 0x250a,
- 0x350b,
- 0x0000,
- 0x0000,
- 0x0000,
- 0x0000,
- 0x0000,
- 0x240f,
- 0x2410,
- 0x0000,
- 0x2417,
- 0x2418,
- 0x2419,
- 0x241a,
- 0x241b,
- 0x021c,
- 0x020e
+// Minimum and maximum number of players for a link group
+// A minimum of 0 means the min and max are equal
+#define LINK_GROUP_CAPACITY(min, max)(((min) << 12) | ((max) << 8))
+#define GROUP_MAX(capacity)(capacity & 0x0F)
+#define GROUP_MIN(capacity)(capacity >> 4)
+#define GROUP_MIN2(capacity)(capacity & 0xF0) // Unnecessary to have both, but needed to match
+
+static const u32 sLinkGroupToActivityAndCapacity[NUM_LINK_GROUP_TYPES] = {
+ [LINK_GROUP_SINGLE_BATTLE] = ACTIVITY_BATTLE_SINGLE | LINK_GROUP_CAPACITY(0, 2),
+ [LINK_GROUP_DOUBLE_BATTLE] = ACTIVITY_BATTLE_DOUBLE | LINK_GROUP_CAPACITY(0, 2),
+ [LINK_GROUP_MULTI_BATTLE] = ACTIVITY_BATTLE_MULTI | LINK_GROUP_CAPACITY(0, 4),
+ [LINK_GROUP_TRADE] = ACTIVITY_TRADE | LINK_GROUP_CAPACITY(0, 2),
+ [LINK_GROUP_POKEMON_JUMP] = ACTIVITY_POKEMON_JUMP | LINK_GROUP_CAPACITY(2, 5),
+ [LINK_GROUP_BERRY_CRUSH] = ACTIVITY_BERRY_CRUSH | LINK_GROUP_CAPACITY(2, 5),
+ [LINK_GROUP_BERRY_PICKING] = ACTIVITY_BERRY_PICK | LINK_GROUP_CAPACITY(3, 5),
+ [LINK_GROUP_WONDER_CARD] = ACTIVITY_NONE | LINK_GROUP_CAPACITY(0, 0),
+ [LINK_GROUP_WONDER_NEWS] = ACTIVITY_NONE | LINK_GROUP_CAPACITY(0, 0),
+ [LINK_GROUP_UNION_ROOM_RESUME] = ACTIVITY_NONE | LINK_GROUP_CAPACITY(0, 0),
+ [LINK_GROUP_UNION_ROOM_INIT] = ACTIVITY_NONE | LINK_GROUP_CAPACITY(0, 0),
+ [LINK_GROUP_UNK_11] = ACTIVITY_NONE | LINK_GROUP_CAPACITY(0, 0),
+ [LINK_GROUP_RECORD_CORNER] = ACTIVITY_RECORD_CORNER | LINK_GROUP_CAPACITY(2, 4),
+ [LINK_GROUP_BERRY_BLENDER] = ACTIVITY_BERRY_BLENDER | LINK_GROUP_CAPACITY(2, 4),
+ [LINK_GROUP_UNK_14] = ACTIVITY_NONE | LINK_GROUP_CAPACITY(0, 0),
+ [LINK_GROUP_COOL_CONTEST] = ACTIVITY_CONTEST_COOL | LINK_GROUP_CAPACITY(2, 4),
+ [LINK_GROUP_BEAUTY_CONTEST] = ACTIVITY_CONTEST_BEAUTY | LINK_GROUP_CAPACITY(2, 4),
+ [LINK_GROUP_CUTE_CONTEST] = ACTIVITY_CONTEST_CUTE | LINK_GROUP_CAPACITY(2, 4),
+ [LINK_GROUP_SMART_CONTEST] = ACTIVITY_CONTEST_SMART | LINK_GROUP_CAPACITY(2, 4),
+ [LINK_GROUP_TOUGH_CONTEST] = ACTIVITY_CONTEST_TOUGH | LINK_GROUP_CAPACITY(2, 4),
+ [LINK_GROUP_BATTLE_TOWER] = ACTIVITY_BATTLE_TOWER | LINK_GROUP_CAPACITY(0, 2),
+ [LINK_GROUP_BATTLE_TOWER_OPEN] = ACTIVITY_BATTLE_TOWER_OPEN | LINK_GROUP_CAPACITY(0, 2)
};
-const struct WindowTemplate gUnknown_082F011C = {
- .bg = 0x00,
- .tilemapLeft = 0x01,
- .tilemapTop = 0x03,
- .width = 0x0d,
- .height = 0x08,
- .paletteNum = 0x0f,
+static const struct WindowTemplate sWindowTemplate_PlayerList = {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 3,
+ .width = 13,
+ .height = 8,
+ .paletteNum = 15,
.baseBlock = 0x0044
};
-const struct WindowTemplate gUnknown_082F0124 = {
- .bg = 0x00,
- .tilemapLeft = 0x01,
- .tilemapTop = 0x03,
- .width = 0x0d,
- .height = 0x0a,
- .paletteNum = 0x0f,
+static const struct WindowTemplate sWindowTemplate_5PlayerList = {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 3,
+ .width = 13,
+ .height = 10,
+ .paletteNum = 15,
.baseBlock = 0x0044
};
-const struct WindowTemplate gUnknown_082F012C = {
- .bg = 0x00,
- .tilemapLeft = 0x10,
- .tilemapTop = 0x03,
- .width = 0x07,
- .height = 0x04,
- .paletteNum = 0x0f,
+static const struct WindowTemplate sWindowTemplate_NumPlayerMode = {
+ .bg = 0,
+ .tilemapLeft = 16,
+ .tilemapTop = 3,
+ .width = 7,
+ .height = 4,
+ .paletteNum = 15,
.baseBlock = 0x00c6
};
-const struct ListMenuItem gUnknown_082F0134[] = {
+static const struct ListMenuItem sPossibleGroupMembersListMenuItems[] = {
{ sText_EmptyString, 0 },
{ sText_EmptyString, 1 },
{ sText_EmptyString, 2 },
@@ -672,11 +691,11 @@ const struct ListMenuItem gUnknown_082F0134[] = {
{ sText_EmptyString, 4 }
};
-const struct ListMenuTemplate gUnknown_082F015C = {
- .items = gUnknown_082F0134,
+static const struct ListMenuTemplate sListMenuTemplate_PossibleGroupMembers = {
+ .items = sPossibleGroupMembersListMenuItems,
.moveCursorFunc = NULL,
- .itemPrintFunc = sub_8013278,
- .totalItems = 5,
+ .itemPrintFunc = ItemPrintFunc_PossibleGroupMembers,
+ .totalItems = ARRAY_COUNT(sPossibleGroupMembersListMenuItems),
.maxShowed = 5,
.windowId = 0,
.header_X = 0,
@@ -732,11 +751,11 @@ const struct ListMenuItem gUnknown_082F0184[] = {
{ sText_EmptyString, 15 }
};
-const struct ListMenuTemplate gUnknown_082F0204 = {
+static const struct ListMenuTemplate sListMenuTemplate_UnionRoomGroups = {
.items = gUnknown_082F0184,
.moveCursorFunc = ListMenuDefaultCursorMoveFunc,
- .itemPrintFunc = sub_8013DF4,
- .totalItems = 16,
+ .itemPrintFunc = ListMenuItemPrintFunc_UnionRoomGroups,
+ .totalItems = ARRAY_COUNT(gUnknown_082F0184),
.maxShowed = 5,
.windowId = 0,
.header_X = 0,
@@ -753,7 +772,7 @@ const struct ListMenuTemplate gUnknown_082F0204 = {
.cursorKind = 0
};
-const struct WindowTemplate gUnknown_082F021C = {
+static const struct WindowTemplate sWindowTemplate_InviteToActivity = {
.bg = 0x00,
.tilemapLeft = 0x14,
.tilemapTop = 0x05,
@@ -770,11 +789,11 @@ const struct ListMenuItem gUnknown_082F0224[] = {
{ sText_Exit, 0x040 }
};
-const struct ListMenuTemplate gUnknown_082F0244 = {
+static const struct ListMenuTemplate sListMenuTemplate_InviteToActivity = {
.items = gUnknown_082F0224,
.moveCursorFunc = ListMenuDefaultCursorMoveFunc,
.itemPrintFunc = NULL,
- .totalItems = 4,
+ .totalItems = ARRAY_COUNT(gUnknown_082F0224),
.maxShowed = 4,
.windowId = 0,
.header_X = 0,
@@ -791,7 +810,7 @@ const struct ListMenuTemplate gUnknown_082F0244 = {
.cursorKind = 0
};
-const struct WindowTemplate gUnknown_082F025C = {
+static const struct WindowTemplate sWindowTemplate_RegisterForTrade = {
.bg = 0x00,
.tilemapLeft = 0x12,
.tilemapTop = 0x07,
@@ -801,17 +820,17 @@ const struct WindowTemplate gUnknown_082F025C = {
.baseBlock = 0x0001
};
-const struct ListMenuItem gUnknown_082F0264[] = {
+static const struct ListMenuItem sRegisterForTradeListMenuItems[] = {
{ gText_Register, 1 },
{ sText_Info, 2 },
{ sText_Exit, 3 }
};
-const struct ListMenuTemplate gUnknown_082F027C = {
- .items = gUnknown_082F0264,
+static const struct ListMenuTemplate sListMenuTemplate_RegisterForTrade = {
+ .items = sRegisterForTradeListMenuItems,
.moveCursorFunc = ListMenuDefaultCursorMoveFunc,
.itemPrintFunc = NULL,
- .totalItems = 3,
+ .totalItems = ARRAY_COUNT(sRegisterForTradeListMenuItems),
.maxShowed = 3,
.windowId = 0,
.header_X = 0,
@@ -838,7 +857,7 @@ const struct WindowTemplate gUnknown_082F0294 = {
.baseBlock = 0x0001
};
-static const struct ListMenuItem sTradingBoardTypes[] = {
+static const struct ListMenuItem sTradingBoardTypes[NUMBER_OF_MON_TYPES] = {
{ gTypeNames[TYPE_NORMAL], TYPE_NORMAL },
{ gTypeNames[TYPE_FIRE], TYPE_FIRE },
{ gTypeNames[TYPE_WATER], TYPE_WATER },
@@ -856,14 +875,14 @@ static const struct ListMenuItem sTradingBoardTypes[] = {
{ gTypeNames[TYPE_DRAGON], TYPE_DRAGON },
{ gTypeNames[TYPE_STEEL], TYPE_STEEL },
{ gTypeNames[TYPE_DARK], TYPE_DARK },
- { sText_Exit, NUMBER_OF_MON_TYPES }
+ { sText_Exit, NUMBER_OF_MON_TYPES }
};
-const struct ListMenuTemplate sMenuTemplate_TradingBoardRequestType = {
+static const struct ListMenuTemplate sMenuTemplate_TradingBoardRequestType = {
.items = sTradingBoardTypes,
.moveCursorFunc = ListMenuDefaultCursorMoveFunc,
.itemPrintFunc = NULL,
- .totalItems = NUMBER_OF_MON_TYPES,
+ .totalItems = ARRAY_COUNT(sTradingBoardTypes),
.maxShowed = 6,
.windowId = 0,
.header_X = 0,
@@ -880,7 +899,7 @@ const struct ListMenuTemplate sMenuTemplate_TradingBoardRequestType = {
.cursorKind = 0
};
-const struct WindowTemplate gUnknown_082F0344 = {
+static const struct WindowTemplate sWindowTemplate_TradingBoard = {
.bg = 0x00,
.tilemapLeft = 0x01,
.tilemapTop = 0x01,
@@ -900,7 +919,7 @@ const struct WindowTemplate gUnknown_082F034C = {
.baseBlock = 0x0039
};
-const struct ListMenuItem gUnknown_082F0354[] = {
+static const struct ListMenuItem sTradeBoardListMenuItems[] = {
{ sText_EmptyString, -3 },
{ sText_EmptyString, 0 },
{ sText_EmptyString, 1 },
@@ -913,11 +932,11 @@ const struct ListMenuItem gUnknown_082F0354[] = {
{ sText_Exit2, 8 }
};
-const struct ListMenuTemplate gUnknown_082F03A4 = {
- .items = gUnknown_082F0354,
+static const struct ListMenuTemplate sTradeBoardListMenuTemplate = {
+ .items = sTradeBoardListMenuItems,
.moveCursorFunc = ListMenuDefaultCursorMoveFunc,
- .itemPrintFunc = sub_8017BE8,
- .totalItems = 10,
+ .itemPrintFunc = TradeBoardListMenuItemPrintFunc,
+ .totalItems = ARRAY_COUNT(sTradeBoardListMenuItems),
.maxShowed = 6,
.windowId = 0,
.header_X = 0,
@@ -944,7 +963,7 @@ const struct WindowTemplate UnrefWindowTemplate_082F03B4 = {
.baseBlock = 0x0039
};
-const struct ListMenuItem gUnknown_082F03C4[] = {
+static const struct ListMenuItem sEmptyListMenuItems[] = {
{ sText_EmptyString, 0 },
{ sText_EmptyString, 1 },
{ sText_EmptyString, 2 },
@@ -963,11 +982,12 @@ const struct ListMenuItem gUnknown_082F03C4[] = {
{ sText_EmptyString, 15 }
};
-const struct ListMenuTemplate UnrefListMenuTemplate_082F0444 = {
- .items = gUnknown_082F03C4,
+// Unused
+static const struct ListMenuTemplate sUnknownListMenuTemplate = {
+ .items = sEmptyListMenuItems,
.moveCursorFunc = ListMenuDefaultCursorMoveFunc,
.itemPrintFunc = nullsub_14,
- .totalItems = 16,
+ .totalItems = ARRAY_COUNT(sEmptyListMenuItems),
.maxShowed = 4,
.windowId = 0,
.header_X = 0,
@@ -984,78 +1004,100 @@ const struct ListMenuTemplate UnrefListMenuTemplate_082F0444 = {
.cursorKind = 0
};
-const struct UnkStruct_Shared gUnknown_082F045C = {0};
-
-ALIGNED(4) const u8 gUnknown_082F0474[] = {0x01, 0xff};
-ALIGNED(4) const u8 gUnknown_082F0478[] = {0x02, 0xff};
-ALIGNED(4) const u8 gUnknown_082F047C[] = {0x03, 0xff};
-ALIGNED(4) const u8 gUnknown_082F0480[] = {0x04, 0xff};
-ALIGNED(4) const u8 gUnknown_082F0484[] = {0x09, 0xff};
-ALIGNED(4) const u8 gUnknown_082F0488[] = {0x0a, 0xff};
-ALIGNED(4) const u8 gUnknown_082F048C[] = {0x0b, 0xff};
-ALIGNED(4) const u8 gUnknown_082F0490[] = {0x15, 0xff};
-ALIGNED(4) const u8 gUnknown_082F0494[] = {0x16, 0xff};
-ALIGNED(4) const u8 gUnknown_082F0498[] = {0x40, 0x41, 0x44, 0x45, 0x48, 0x51, 0x52, 0x53, 0x54, 0xff};
-ALIGNED(4) const u8 gUnknown_082F04A4[] = {0x0c, 0xff};
-ALIGNED(4) const u8 gUnknown_082F04A8[] = {0x01, 0x02, 0x03, 0x04, 0x09, 0x0a, 0x0b, 0x15, 0x16, 0x0d, 0xff};
-ALIGNED(4) const u8 gUnknown_082F04B4[] = {0x0f, 0xff};
-ALIGNED(4) const u8 gUnknown_082F04B8[] = {0x10, 0xff};
-ALIGNED(4) const u8 gUnknown_082F04BC[] = {0x17, 0xff};
-ALIGNED(4) const u8 gUnknown_082F04C0[] = {0x18, 0xff};
-ALIGNED(4) const u8 gUnknown_082F04C4[] = {0x19, 0xff};
-ALIGNED(4) const u8 gUnknown_082F04C8[] = {0x1a, 0xff};
-ALIGNED(4) const u8 gUnknown_082F04CC[] = {0x1b, 0xff};
-ALIGNED(4) const u8 gUnknown_082F04D0[] = {0x1c, 0xff};
-ALIGNED(4) const u8 gUnknown_082F04D4[] = {0x0e, 0xff};
-
-const u8 *const gUnknown_082F04D8[NUM_LINK_GROUP_TYPES] = {
- gUnknown_082F0474,
- gUnknown_082F0478,
- gUnknown_082F047C,
- gUnknown_082F0480,
- gUnknown_082F0484,
- gUnknown_082F0488,
- gUnknown_082F048C,
- gUnknown_082F0490,
- gUnknown_082F0494,
- gUnknown_082F0498,
- gUnknown_082F04A4,
- gUnknown_082F04A8,
- gUnknown_082F04B4,
- gUnknown_082F04B8,
- NULL,
- gUnknown_082F04BC,
- gUnknown_082F04C0,
- gUnknown_082F04C4,
- gUnknown_082F04C8,
- gUnknown_082F04CC,
- gUnknown_082F04D0,
- gUnknown_082F04D4
+const struct WirelessGnameUnamePair sWirelessGnameUnamePair_Dummy = {0};
+
+ALIGNED(4) const u8 sAcceptedActivityIds_SingleBattle[] = {ACTIVITY_BATTLE_SINGLE, 0xff};
+ALIGNED(4) const u8 sAcceptedActivityIds_DoubleBattle[] = {ACTIVITY_BATTLE_DOUBLE, 0xff};
+ALIGNED(4) const u8 sAcceptedActivityIds_MultiBattle[] = {ACTIVITY_BATTLE_MULTI, 0xff};
+ALIGNED(4) const u8 sAcceptedActivityIds_Trade[] = {ACTIVITY_TRADE, 0xff};
+ALIGNED(4) const u8 sAcceptedActivityIds_PokemonJump[] = {ACTIVITY_POKEMON_JUMP, 0xff};
+ALIGNED(4) const u8 sAcceptedActivityIds_BerryCrush[] = {ACTIVITY_BERRY_CRUSH, 0xff};
+ALIGNED(4) const u8 sAcceptedActivityIds_BerryPicking[] = {ACTIVITY_BERRY_PICK, 0xff};
+ALIGNED(4) const u8 sAcceptedActivityIds_WonderCard[] = {ACTIVITY_WONDER_CARD2, 0xff};
+ALIGNED(4) const u8 sAcceptedActivityIds_WonderNews[] = {ACTIVITY_WONDER_NEWS2, 0xff};
+ALIGNED(4) const u8 sAcceptedActivityIds_Resume[] = {
+ IN_UNION_ROOM | ACTIVITY_NONE,
+ IN_UNION_ROOM | ACTIVITY_BATTLE_SINGLE,
+ IN_UNION_ROOM | ACTIVITY_TRADE,
+ IN_UNION_ROOM | ACTIVITY_CHAT,
+ IN_UNION_ROOM | ACTIVITY_CARD,
+ IN_UNION_ROOM | ACTIVITY_ACCEPT,
+ IN_UNION_ROOM | ACTIVITY_DECLINE,
+ IN_UNION_ROOM | ACTIVITY_NPCTALK,
+ IN_UNION_ROOM | ACTIVITY_PLYRTALK,
+ 0xff
+};
+ALIGNED(4) const u8 sAcceptedActivityIds_Init[] = {ACTIVITY_SEARCH, 0xff};
+ALIGNED(4) const u8 sAcceptedActivityIds_Unk11[] = {
+ ACTIVITY_BATTLE_SINGLE,
+ ACTIVITY_BATTLE_DOUBLE,
+ ACTIVITY_BATTLE_MULTI,
+ ACTIVITY_TRADE,
+ ACTIVITY_POKEMON_JUMP,
+ ACTIVITY_BERRY_CRUSH,
+ ACTIVITY_BERRY_PICK,
+ ACTIVITY_WONDER_CARD2,
+ ACTIVITY_WONDER_NEWS2,
+ ACTIVITY_SPIN_TRADE,
+ 0xff
+};
+ALIGNED(4) const u8 sAcceptedActivityIds_RecordCorner[] = {ACTIVITY_RECORD_CORNER, 0xff};
+ALIGNED(4) const u8 sAcceptedActivityIds_BerryBlender[] = {ACTIVITY_BERRY_BLENDER, 0xff};
+ALIGNED(4) const u8 sAcceptedActivityIds_CoolContest[] = {ACTIVITY_CONTEST_COOL, 0xff};
+ALIGNED(4) const u8 sAcceptedActivityIds_BeautyContest[] = {ACTIVITY_CONTEST_BEAUTY, 0xff};
+ALIGNED(4) const u8 sAcceptedActivityIds_CuteContest[] = {ACTIVITY_CONTEST_CUTE, 0xff};
+ALIGNED(4) const u8 sAcceptedActivityIds_SmartContest[] = {ACTIVITY_CONTEST_SMART, 0xff};
+ALIGNED(4) const u8 sAcceptedActivityIds_ToughContest[] = {ACTIVITY_CONTEST_TOUGH, 0xff};
+ALIGNED(4) const u8 sAcceptedActivityIds_BattleTower[] = {ACTIVITY_BATTLE_TOWER, 0xff};
+ALIGNED(4) const u8 sAcceptedActivityIds_BattleTowerOpen[] = {ACTIVITY_BATTLE_TOWER_OPEN, 0xff};
+
+const u8 *const sAcceptedActivityIds[NUM_LINK_GROUP_TYPES] = {
+ [LINK_GROUP_SINGLE_BATTLE] = sAcceptedActivityIds_SingleBattle,
+ [LINK_GROUP_DOUBLE_BATTLE] = sAcceptedActivityIds_DoubleBattle,
+ [LINK_GROUP_MULTI_BATTLE] = sAcceptedActivityIds_MultiBattle,
+ [LINK_GROUP_TRADE] = sAcceptedActivityIds_Trade,
+ [LINK_GROUP_POKEMON_JUMP] = sAcceptedActivityIds_PokemonJump,
+ [LINK_GROUP_BERRY_CRUSH] = sAcceptedActivityIds_BerryCrush,
+ [LINK_GROUP_BERRY_PICKING] = sAcceptedActivityIds_BerryPicking,
+ [LINK_GROUP_WONDER_CARD] = sAcceptedActivityIds_WonderCard,
+ [LINK_GROUP_WONDER_NEWS] = sAcceptedActivityIds_WonderNews,
+ [LINK_GROUP_UNION_ROOM_RESUME] = sAcceptedActivityIds_Resume,
+ [LINK_GROUP_UNION_ROOM_INIT] = sAcceptedActivityIds_Init,
+ [LINK_GROUP_UNK_11] = sAcceptedActivityIds_Unk11,
+ [LINK_GROUP_RECORD_CORNER] = sAcceptedActivityIds_RecordCorner,
+ [LINK_GROUP_BERRY_BLENDER] = sAcceptedActivityIds_BerryBlender,
+ [LINK_GROUP_UNK_14] = NULL,
+ [LINK_GROUP_COOL_CONTEST] = sAcceptedActivityIds_CoolContest,
+ [LINK_GROUP_BEAUTY_CONTEST] = sAcceptedActivityIds_BeautyContest,
+ [LINK_GROUP_CUTE_CONTEST] = sAcceptedActivityIds_CuteContest,
+ [LINK_GROUP_SMART_CONTEST] = sAcceptedActivityIds_SmartContest,
+ [LINK_GROUP_TOUGH_CONTEST] = sAcceptedActivityIds_ToughContest,
+ [LINK_GROUP_BATTLE_TOWER] = sAcceptedActivityIds_BattleTower,
+ [LINK_GROUP_BATTLE_TOWER_OPEN] = sAcceptedActivityIds_BattleTowerOpen
};
-// Link group type to ID for gUnknown_02022C2C
-const u8 gUnknown_082F0530[NUM_LINK_GROUP_TYPES + 2] =
+static const u8 sLinkGroupToURoomActivity[NUM_LINK_GROUP_TYPES + 2] =
{
- 0x01,
- 0x02,
- 0x03,
- 0x04,
- 0x09,
- 0x0a,
- 0x0b,
- 0x15,
- 0x16,
- 0x00,
- 0x00,
- 0x00,
- 0x0f,
- 0x10,
- 0x00,
- 0x17,
- 0x18,
- 0x19,
- 0x1a,
- 0x1b,
- 0x1c,
- 0x0e
+ [LINK_GROUP_SINGLE_BATTLE] = ACTIVITY_BATTLE_SINGLE,
+ [LINK_GROUP_DOUBLE_BATTLE] = ACTIVITY_BATTLE_DOUBLE,
+ [LINK_GROUP_MULTI_BATTLE] = ACTIVITY_BATTLE_MULTI,
+ [LINK_GROUP_TRADE] = ACTIVITY_TRADE,
+ [LINK_GROUP_POKEMON_JUMP] = ACTIVITY_POKEMON_JUMP,
+ [LINK_GROUP_BERRY_CRUSH] = ACTIVITY_BERRY_CRUSH,
+ [LINK_GROUP_BERRY_PICKING] = ACTIVITY_BERRY_PICK,
+ [LINK_GROUP_WONDER_CARD] = ACTIVITY_WONDER_CARD2,
+ [LINK_GROUP_WONDER_NEWS] = ACTIVITY_WONDER_NEWS2,
+ [LINK_GROUP_UNION_ROOM_RESUME] = ACTIVITY_NONE,
+ [LINK_GROUP_UNION_ROOM_INIT] = ACTIVITY_NONE,
+ [LINK_GROUP_UNK_11] = ACTIVITY_NONE,
+ [LINK_GROUP_RECORD_CORNER] = ACTIVITY_RECORD_CORNER,
+ [LINK_GROUP_BERRY_BLENDER] = ACTIVITY_BERRY_BLENDER,
+ [LINK_GROUP_UNK_14] = ACTIVITY_NONE,
+ [LINK_GROUP_COOL_CONTEST] = ACTIVITY_CONTEST_COOL,
+ [LINK_GROUP_BEAUTY_CONTEST] = ACTIVITY_CONTEST_BEAUTY,
+ [LINK_GROUP_CUTE_CONTEST] = ACTIVITY_CONTEST_CUTE,
+ [LINK_GROUP_SMART_CONTEST] = ACTIVITY_CONTEST_SMART,
+ [LINK_GROUP_TOUGH_CONTEST] = ACTIVITY_CONTEST_TOUGH,
+ [LINK_GROUP_BATTLE_TOWER] = ACTIVITY_BATTLE_TOWER,
+ [LINK_GROUP_BATTLE_TOWER_OPEN] = ACTIVITY_BATTLE_TOWER_OPEN
};
diff --git a/src/dodrio_berry_picking.c b/src/dodrio_berry_picking.c
index 262b7d111..3ca7a1cf7 100644
--- a/src/dodrio_berry_picking.c
+++ b/src/dodrio_berry_picking.c
@@ -450,7 +450,7 @@ static void (*const gUnknown_082F7AF4[])(void) =
};
// code
-void sub_802493C(u16 a0, void (*callback)(void))
+void StartDodrioBerryPicking(u16 a0, void (*callback)(void))
{
gUnknown_03000DB0 = FALSE;
@@ -832,9 +832,9 @@ static void sub_8025158(void)
static bool32 sub_8025170(void)
{
- u8 r4 = GetBlockReceivedStatus();
- u8 r0 = sub_800A9D8();
- if (r4 == r0)
+ u8 recvStatus = GetBlockReceivedStatus();
+ u8 playerFlags = GetLinkPlayerCountAsBitFlags();
+ if (recvStatus == playerFlags)
{
ResetBlockReceivedFlags();
return TRUE;
@@ -4483,12 +4483,12 @@ static void sub_802A380(void)
case 2:
if (!IsDma3ManagerBusyWithBgCopy())
{
- CreateTask(sub_8153688, 0);
+ CreateTask(Task_LinkSave, 0);
gUnknown_02022CF8->state++;
}
break;
case 3:
- if (!FuncIsActiveTask(sub_8153688))
+ if (!FuncIsActiveTask(Task_LinkSave))
gUnknown_02022CF8->state++;
break;
default:
diff --git a/src/ereader_screen.c b/src/ereader_screen.c
index 754bbe445..26f7eb679 100755
--- a/src/ereader_screen.c
+++ b/src/ereader_screen.c
@@ -85,10 +85,10 @@ static u8 sub_81D4DE8(struct Unk03006370 *arg0)
return var0;
}
-static void sub_81D4E30(void)
+static void OpenEReaderLink(void)
{
memset(gDecompressionBuffer, 0, 0x2000);
- gLinkType = LINKTYPE_0x5503;
+ gLinkType = LINKTYPE_EREADER;
OpenLink();
SetSuppressLinkErrorMessage(TRUE);
}
@@ -255,7 +255,7 @@ static void sub_81D5084(u8 taskId)
data->unk8 = 1;
break;
case 1:
- sub_81D4E30();
+ OpenEReaderLink();
sub_81D505C(&data->unk0);
data->unk8 = 2;
break;
@@ -285,7 +285,7 @@ static void sub_81D5084(u8 taskId)
case 5:
if (sub_81D5064(&data->unk0, 90))
{
- sub_81D4E30();
+ OpenEReaderLink();
data->unk8 = 6;
}
else if (gMain.newKeys & B_BUTTON)
@@ -319,7 +319,7 @@ static void sub_81D5084(u8 taskId)
else if (sub_81D5064(&data->unk0, 10))
{
CloseLink();
- sub_81D4E30();
+ OpenEReaderLink();
sub_81D505C(&data->unk0);
}
break;
@@ -360,7 +360,7 @@ static void sub_81D5084(u8 taskId)
data->unk8 = 12;
break;
case 12:
- sub_81D4E30();
+ OpenEReaderLink();
AddTextPrinterToWindow1(gJPText_AllowEReaderToLoadCard);
data->unk8 = 13;
break;
diff --git a/src/event_object_lock.c b/src/event_object_lock.c
index b728f7774..67652a99b 100644
--- a/src/event_object_lock.c
+++ b/src/event_object_lock.c
@@ -96,7 +96,7 @@ void ScriptUnfreezeObjectEvents(void)
UnfreezeObjectEvents();
}
-void sub_8098524(void)
+void UnionRoom_UnlockPlayerAndChatPartner(void)
{
u8 playerObjectId;
diff --git a/src/event_object_movement.c b/src/event_object_movement.c
index d6a2fe2ec..ad839e006 100644
--- a/src/event_object_movement.c
+++ b/src/event_object_movement.c
@@ -28,6 +28,7 @@
#include "constants/items.h"
#include "constants/mauville_old_man.h"
#include "constants/trainer_types.h"
+#include "constants/union_room.h"
// this file was known as evobjmv.c in Game Freak's original source
@@ -97,7 +98,7 @@ static void DoRippleFieldEffect(struct ObjectEvent*, struct Sprite*);
static void DoGroundEffects_OnSpawn(struct ObjectEvent*, struct Sprite*);
static void DoGroundEffects_OnBeginStep(struct ObjectEvent*, struct Sprite*);
static void DoGroundEffects_OnFinishStep(struct ObjectEvent*, struct Sprite*);
-static void sub_8097D68(struct Sprite*);
+static void UpdateObjectEventSpritePosition(struct Sprite*);
static void ApplyLevitateMovement(u8);
static bool8 MovementType_Disguise_Callback(struct ObjectEvent *, struct Sprite *);
static bool8 MovementType_Hidden_Callback(struct ObjectEvent *, struct Sprite *);
@@ -129,7 +130,7 @@ static struct ObjectEventTemplate *FindObjectEventTemplateByLocalId(u8 localId,
static void ClearObjectEventMovement(struct ObjectEvent *, struct Sprite *);
static void ObjectEventSetSingleMovement(struct ObjectEvent *, struct Sprite *, u8);
static void oamt_npc_ministep_reset(struct Sprite *, u8, u8);
-static void UpdateObjectEventSpriteSubpriorityAndVisibility(struct Sprite *);
+static void UpdateObjectEventSprite(struct Sprite *);
const u8 gReflectionEffectPaletteMap[] = {1, 1, 6, 7, 8, 9, 6, 7, 8, 9, 11, 11, 0, 0, 0, 0};
@@ -1522,7 +1523,9 @@ u8 AddPseudoObjectEvent(u16 graphicsId, void (*callback)(struct Sprite *), s16 x
return spriteId;
}
-u8 sprite_new(u8 graphicsId, u8 a1, s16 x, s16 y, u8 z, u8 direction)
+// Used to create sprite object events instead of a full object event
+// Used when resources are limiting, e.g. for the audience in contests or group members in Union Room
+u8 CreateObjectSprite(u8 graphicsId, u8 a1, s16 x, s16 y, u8 z, u8 direction)
{
u8 spriteId;
struct Sprite *sprite;
@@ -1531,11 +1534,11 @@ u8 sprite_new(u8 graphicsId, u8 a1, s16 x, s16 y, u8 z, u8 direction)
const struct ObjectEventGraphicsInfo *graphicsInfo;
graphicsInfo = GetObjectEventGraphicsInfo(graphicsId);
- MakeObjectTemplateFromObjectEventGraphicsInfo(graphicsId, UpdateObjectEventSpriteSubpriorityAndVisibility, &spriteTemplate, &subspriteTables);
+ MakeObjectTemplateFromObjectEventGraphicsInfo(graphicsId, UpdateObjectEventSprite, &spriteTemplate, &subspriteTables);
*(u16 *)&spriteTemplate.paletteTag = 0xFFFF;
x += 7;
y += 7;
- sub_80930E0(&x, &y, 8, 16);
+ SetSpritePosToOffsetMapCoords(&x, &y, 8, 16);
spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0);
if (spriteId != MAX_SPRITES)
{
@@ -2363,7 +2366,8 @@ static u8 GetObjectTrainerTypeByObjectEventId(u8 objectEventId)
return gObjectEvents[objectEventId].trainerType;
}
-u8 sub_808F0D4(u8 localId, u8 mapNum, u8 mapGroup)
+// Unused
+u8 GetObjectEventBerryTreeIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
{
u8 objectEventId;
@@ -2374,7 +2378,7 @@ u8 sub_808F0D4(u8 localId, u8 mapNum, u8 mapGroup)
return gObjectEvents[objectEventId].trainerRange_berryTreeId;
}
-u8 ObjectEventGetBerryTreeId(u8 objectEventId)
+u8 GetObjectEventBerryTreeId(u8 objectEventId)
{
return gObjectEvents[objectEventId].trainerRange_berryTreeId;
}
@@ -4864,22 +4868,22 @@ void SetSpritePosToMapCoords(s16 mapX, s16 mapY, s16 *destX, s16 *destY)
s16 dx = -gTotalCameraPixelOffsetX - gFieldCamera.x;
s16 dy = -gTotalCameraPixelOffsetY - gFieldCamera.y;
if (gFieldCamera.x > 0)
- dx += 1 << 4;
+ dx += 16;
if (gFieldCamera.x < 0)
- dx -= 1 << 4;
+ dx -= 16;
if (gFieldCamera.y > 0)
- dy += 1 << 4;
+ dy += 16;
if (gFieldCamera.y < 0)
- dy -= 1 << 4;
+ dy -= 16;
*destX = ((mapX - gSaveBlock1Ptr->pos.x) << 4) + dx;
*destY = ((mapY - gSaveBlock1Ptr->pos.y) << 4) + dy;
}
-void sub_80930E0(s16 *x, s16 *y, s16 dx, s16 dy)
+void SetSpritePosToOffsetMapCoords(s16 *x, s16 *y, s16 dx, s16 dy)
{
SetSpritePosToMapCoords(*x, *y, x, y);
*x += dx;
@@ -8630,51 +8634,56 @@ void UpdateObjectEventSpriteVisibility(struct Sprite *sprite, bool8 invisible)
sprite->invisible = TRUE;
}
-static void UpdateObjectEventSpriteSubpriorityAndVisibility(struct Sprite *sprite)
+#define tInvisible data[2]
+#define tAnimNum data[3]
+#define tAnimState data[4]
+
+static void UpdateObjectEventSprite(struct Sprite *sprite)
{
- sub_8097D68(sprite);
+ UpdateObjectEventSpritePosition(sprite);
SetObjectSubpriorityByZCoord(sprite->data[1], sprite, 1);
- UpdateObjectEventSpriteVisibility(sprite, sprite->data[2]);
+ UpdateObjectEventSpriteVisibility(sprite, sprite->tInvisible);
}
-void sub_8097AF0(void)
+// Unused
+static void DestroyObjectEventSprites(void)
{
int i;
- for(i = 0; i < MAX_SPRITES; i++)
+ for (i = 0; i < MAX_SPRITES; i++)
{
struct Sprite *sprite = &gSprites[i];
- if(sprite->inUse && sprite->callback == UpdateObjectEventSpriteSubpriorityAndVisibility)
+ if(sprite->inUse && sprite->callback == UpdateObjectEventSprite)
DestroySprite(sprite);
}
}
-int sub_8097B2C(u8 var) // this should return a u8, because all that call this shifts to u8, but it wont match because it doesnt shift u8 at the end.
+static int GetObjectEventSpriteId(u8 var) // this should return a u8, because all that call this shifts to u8, but it wont match because it doesnt shift u8 at the end.
{
int i;
- for(i = 0; i < MAX_SPRITES; i++)
+ for (i = 0; i < MAX_SPRITES; i++)
{
struct Sprite *sprite = &gSprites[i];
- if(sprite->inUse && sprite->callback == UpdateObjectEventSpriteSubpriorityAndVisibility && (u8)sprite->data[0] == var)
+ if(sprite->inUse && sprite->callback == UpdateObjectEventSprite && (u8)sprite->data[0] == var)
return i;
}
return MAX_SPRITES;
}
-void sub_8097B78(u8 var1, u8 var2)
+void TurnObjectEventSprite(u8 objectEventId, u8 direction)
{
- u8 spriteId = sub_8097B2C(var1);
+ u8 spriteId = GetObjectEventSpriteId(objectEventId);
- if(spriteId != MAX_SPRITES)
- StartSpriteAnim(&gSprites[spriteId], GetFaceDirectionAnimNum(var2));
+ if (spriteId != MAX_SPRITES)
+ StartSpriteAnim(&gSprites[spriteId], GetFaceDirectionAnimNum(direction));
}
-void sub_8097BB4(u8 var1, u8 graphicsId)
+void SetObjectEventSpriteGraphics(u8 objectEventId, u8 graphicsId)
{
- int spriteId = sub_8097B2C(var1);
+ int spriteId = GetObjectEventSpriteId(objectEventId);
- if(spriteId != MAX_SPRITES)
+ if (spriteId != MAX_SPRITES)
{
struct Sprite *sprite = &gSprites[spriteId];
const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(graphicsId);
@@ -8685,7 +8694,7 @@ void sub_8097BB4(u8 var1, u8 graphicsId)
sprite->oam.paletteNum = graphicsInfo->paletteSlot;
sprite->images = graphicsInfo->images;
- if(graphicsInfo->subspriteTables == NULL)
+ if (graphicsInfo->subspriteTables == NULL)
{
sprite->subspriteTables = NULL;
sprite->subspriteTableNum = 0;
@@ -8700,102 +8709,102 @@ void sub_8097BB4(u8 var1, u8 graphicsId)
}
}
-void sub_8097C44(u8 var, bool32 var2)
+void SetObjectEventSpriteInvisibility(u8 objectEventId, bool32 invisible)
{
- u8 spriteId = sub_8097B2C(var);
+ u8 spriteId = GetObjectEventSpriteId(objectEventId);
- if(spriteId == MAX_SPRITES)
+ if (spriteId == MAX_SPRITES)
return;
- if(var2)
- gSprites[spriteId].data[2] = 1;
+ if (invisible)
+ gSprites[spriteId].tInvisible = TRUE;
else
- gSprites[spriteId].data[2] = 0;
+ gSprites[spriteId].tInvisible = FALSE;
}
-bool32 sub_8097C8C(u8 var)
+bool32 IsObjectEventSpriteInvisible(u8 objectEventId)
{
- u8 spriteId = sub_8097B2C(var);
+ u8 spriteId = GetObjectEventSpriteId(objectEventId);
- if(spriteId == MAX_SPRITES)
+ if (spriteId == MAX_SPRITES)
return FALSE;
- return (gSprites[spriteId].data[2] == TRUE);
+ return (gSprites[spriteId].tInvisible == TRUE);
}
-void sub_8097CC4(u8 var1, u8 var2)
+void SetObjectEventSpriteAnim(u8 objectEventId, u8 animNum)
{
- u8 spriteId = sub_8097B2C(var1);
+ u8 spriteId = GetObjectEventSpriteId(objectEventId);
- if(spriteId != MAX_SPRITES)
+ if (spriteId != MAX_SPRITES)
{
- gSprites[spriteId].data[3] = var2;
- gSprites[spriteId].data[4] = 0;
+ gSprites[spriteId].tAnimNum = animNum;
+ gSprites[spriteId].tAnimState = 0;
}
}
-void sub_8097CF4(struct Sprite *sprite)
+static void MoveUnionRoomObjectUp(struct Sprite *sprite)
{
- switch(sprite->data[4])
+ switch(sprite->tAnimState)
{
case 0:
sprite->pos2.y = 0;
- sprite->data[4]++;
+ sprite->tAnimState++;
case 1:
sprite->pos2.y -= 8;
- if(sprite->pos2.y == -160)
+ if (sprite->pos2.y == -160)
{
sprite->pos2.y = 0;
- sprite->data[2] = 1;
- sprite->data[3] = 0;
- sprite->data[4] = 0;
+ sprite->tInvisible = TRUE;
+ sprite->tAnimNum = 0;
+ sprite->tAnimState = 0;
}
}
}
-void sub_8097D30(struct Sprite *sprite)
+static void MoveUnionRoomObjectDown(struct Sprite *sprite)
{
- switch(sprite->data[4])
+ switch(sprite->tAnimState)
{
case 0:
sprite->pos2.y = -160;
- sprite->data[4]++;
+ sprite->tAnimState++;
case 1:
sprite->pos2.y += 8;
if(sprite->pos2.y == 0)
{
- sprite->data[3] = 0;
- sprite->data[4] = 0;
+ sprite->tAnimNum = 0;
+ sprite->tAnimState = 0;
}
}
}
-static void sub_8097D68(struct Sprite *sprite)
+static void UpdateObjectEventSpritePosition(struct Sprite *sprite)
{
- switch(sprite->data[3])
+ switch(sprite->tAnimNum)
{
- case 1:
- sub_8097D30(sprite);
+ case UNION_ROOM_SPAWN_IN:
+ MoveUnionRoomObjectDown(sprite);
break;
- case 2:
- sub_8097CF4(sprite);
+ case UNION_ROOM_SPAWN_OUT:
+ MoveUnionRoomObjectUp(sprite);
break;
case 0:
break;
default:
- sprite->data[3] = 0;
+ sprite->tAnimNum = 0;
break;
}
}
-bool32 sub_8097D9C(u8 var)
+bool32 IsObjectEventSpriteAnimating(u8 var)
{
- u8 spriteId = sub_8097B2C(var);
+ u8 spriteId = GetObjectEventSpriteId(var);
- if(spriteId == MAX_SPRITES)
+ if (spriteId == MAX_SPRITES)
return FALSE;
- if(gSprites[spriteId].data[3] != FALSE)
+ if (gSprites[spriteId].tAnimNum != 0)
return TRUE;
return FALSE;
diff --git a/src/faraway_island.c b/src/faraway_island.c
index f8e3eac14..2ac9d5c1f 100755
--- a/src/faraway_island.c
+++ b/src/faraway_island.c
@@ -378,7 +378,7 @@ void sub_81D4A90(void)
x = mew->currentCoords.x;
y = mew->currentCoords.y;
- sub_80930E0(&x, &y, 8, 8);
+ SetSpritePosToOffsetMapCoords(&x, &y, 8, 8);
sUnknown_0203CF50 = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[15], x, y, gSprites[mew->spriteId].subpriority - 1);
if (sUnknown_0203CF50 != MAX_SPRITES)
{
diff --git a/src/field_effect.c b/src/field_effect.c
index c4e9fc40a..07579f55d 100644
--- a/src/field_effect.c
+++ b/src/field_effect.c
@@ -2043,7 +2043,7 @@ static bool8 LavaridgeGymB1FWarpExitEffect_4(struct Task *task, struct ObjectEve
u8 FldEff_LavaridgeGymWarp(void)
{
u8 spriteId;
- sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[33], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
gSprites[spriteId].oam.priority = gFieldEffectArguments[3];
gSprites[spriteId].coordOffsetEnabled = 1;
@@ -2136,7 +2136,7 @@ static bool8 LavaridgeGym1FWarpEffect_5(struct Task *task, struct ObjectEvent *o
u8 FldEff_PopOutOfAsh(void)
{
u8 spriteId;
- sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[32], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
gSprites[spriteId].oam.priority = gFieldEffectArguments[3];
gSprites[spriteId].coordOffsetEnabled = 1;
diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c
index 52c30ab0f..e02de959b 100755
--- a/src/field_effect_helpers.c
+++ b/src/field_effect_helpers.c
@@ -274,7 +274,7 @@ u32 FldEff_TallGrass(void)
x = gFieldEffectArguments[0];
y = gFieldEffectArguments[1];
- sub_80930E0(&x, &y, 8, 8);
+ SetSpritePosToOffsetMapCoords(&x, &y, 8, 8);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[4], x, y, 0);
if (spriteId != MAX_SPRITES)
{
@@ -340,7 +340,7 @@ u32 FldEff_JumpTallGrass(void)
u8 spriteId;
struct Sprite *sprite;
- sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12);
+ SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[10], gFieldEffectArguments[0], gFieldEffectArguments[1], 0);
if (spriteId != MAX_SPRITES)
{
@@ -380,7 +380,7 @@ u32 FldEff_LongGrass(void)
x = gFieldEffectArguments[0];
y = gFieldEffectArguments[1];
- sub_80930E0(&x, &y, 8, 8);
+ SetSpritePosToOffsetMapCoords(&x, &y, 8, 8);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[15], x, y, 0);
if (spriteId != MAX_SPRITES)
{
@@ -443,7 +443,7 @@ u32 FldEff_JumpLongGrass(void)
u8 spriteId;
struct Sprite *sprite;
- sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[16], gFieldEffectArguments[0], gFieldEffectArguments[1], 0);
if (spriteId != MAX_SPRITES)
{
@@ -521,7 +521,7 @@ u32 FldEff_SandFootprints(void)
u8 spriteId;
struct Sprite *sprite;
- sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[11], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
if (spriteId != MAX_SPRITES)
{
@@ -539,7 +539,7 @@ u32 FldEff_DeepSandFootprints(void)
u8 spriteId;
struct Sprite *sprite;
- sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[23], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
if (spriteId != MAX_SPRITES)
{
@@ -557,7 +557,7 @@ u32 FldEff_BikeTireTracks(void)
u8 spriteId;
struct Sprite *sprite;
- sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[27], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
if (spriteId != MAX_SPRITES)
{
@@ -649,7 +649,7 @@ u32 FldEff_JumpSmallSplash(void)
u8 spriteId;
struct Sprite *sprite;
- sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12);
+ SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[14], gFieldEffectArguments[0], gFieldEffectArguments[1], 0);
if (spriteId != MAX_SPRITES)
{
@@ -667,7 +667,7 @@ u32 FldEff_JumpBigSplash(void)
u8 spriteId;
struct Sprite *sprite;
- sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[12], gFieldEffectArguments[0], gFieldEffectArguments[1], 0);
if (spriteId != MAX_SPRITES)
{
@@ -805,7 +805,7 @@ u32 FldEff_Unknown19(void)
u8 spriteId;
struct Sprite *sprite;
- sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[17], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
if (spriteId != MAX_SPRITES)
{
@@ -822,7 +822,7 @@ u32 FldEff_Unknown20(void)
u8 spriteId;
struct Sprite *sprite;
- sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[18], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
if (spriteId != MAX_SPRITES)
{
@@ -839,7 +839,7 @@ u32 FldEff_Unknown21(void)
u8 spriteId;
struct Sprite *sprite;
- sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[19], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
if (spriteId != MAX_SPRITES)
{
@@ -856,7 +856,7 @@ u32 FldEff_Unknown22(void)
u8 spriteId;
struct Sprite *sprite;
- sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[20], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
if (spriteId != MAX_SPRITES)
{
@@ -888,7 +888,7 @@ u32 FldEff_Ash(void)
x = gFieldEffectArguments[0];
y = gFieldEffectArguments[1];
- sub_80930E0(&x, &y, 8, 8);
+ SetSpritePosToOffsetMapCoords(&x, &y, 8, 8);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[6], x, y, gFieldEffectArguments[2]);
if (spriteId != MAX_SPRITES)
{
@@ -944,7 +944,7 @@ u32 FldEff_SurfBlob(void)
u8 spriteId;
struct Sprite *sprite;
- sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[7], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x96);
if (spriteId !=MAX_SPRITES)
{
@@ -1106,7 +1106,7 @@ u32 FldEff_Dust(void)
u8 spriteId;
struct Sprite *sprite;
- sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12);
+ SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[9], gFieldEffectArguments[0], gFieldEffectArguments[1], 0);
if (spriteId != MAX_SPRITES)
{
@@ -1182,7 +1182,7 @@ u32 FldEff_Bubbles(void)
u8 spriteId;
struct Sprite *sprite;
- sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 0);
+ SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 0);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[34], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x52);
if (spriteId != MAX_SPRITES)
{
@@ -1210,7 +1210,7 @@ u32 FldEff_BerryTreeGrowthSparkle(void)
u8 spriteId;
struct Sprite *sprite;
- sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 4);
+ SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 4);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[22], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
if (spriteId != MAX_SPRITES)
{
@@ -1330,7 +1330,7 @@ u32 FldEff_Sparkle(void)
gFieldEffectArguments[0] += 7;
gFieldEffectArguments[1] += 7;
- sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[35], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x52);
if (spriteId != MAX_SPRITES)
{
diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c
index 51f719fc9..53057fc31 100644
--- a/src/field_screen_effect.c
+++ b/src/field_screen_effect.c
@@ -162,7 +162,7 @@ static void Task_ReturnToFieldCableLink(u8 taskId)
switch (task->data[0])
{
case 0:
- task->data[1] = sub_80B3050();
+ task->data[1] = CreateTask_ReestablishCableClubLink();
task->data[0]++;
break;
case 1:
@@ -204,7 +204,7 @@ static void Task_ReturnToFieldWirelessLink(u8 taskId)
if (!IsLinkTaskFinished())
{
if (++task->data[1] > 1800)
- sub_8011170(0x6000);
+ GetLinkmanErrorParams(0x6000);
}
else
{
@@ -215,7 +215,7 @@ static void Task_ReturnToFieldWirelessLink(u8 taskId)
case 2:
if (WaitForWeatherFadeIn() == TRUE)
{
- sub_8009F18();
+ StartSendingKeysToLink();
ScriptContext2_Disable();
DestroyTask(taskId);
}
@@ -240,7 +240,7 @@ void Task_ReturnToFieldRecordMixing(u8 taskId)
}
break;
case 2:
- sub_8009F18();
+ StartSendingKeysToLink();
ResetAllMultiplayerState();
ScriptContext2_Disable();
DestroyTask(taskId);
diff --git a/src/fieldmap.c b/src/fieldmap.c
index 25157ebb1..cfc7018bd 100644
--- a/src/fieldmap.c
+++ b/src/fieldmap.c
@@ -924,11 +924,11 @@ void GetCameraCoords(u16 *x, u16 *y)
*y = gSaveBlock1Ptr->pos.y;
}
-void sub_8088B94(int x, int y, int a2)
+void MapGridSetMetatileImpassabilityAt(int x, int y, bool32 impassable)
{
if (x >= 0 && x < gBackupMapLayout.width && y >= 0 && y < gBackupMapLayout.height)
{
- if (a2 != 0)
+ if (impassable)
gBackupMapLayout.map[x + gBackupMapLayout.width * y] |= METATILE_COLLISION_MASK;
else
gBackupMapLayout.map[x + gBackupMapLayout.width * y] &= ~METATILE_COLLISION_MASK;
diff --git a/src/fldeff_misc.c b/src/fldeff_misc.c
index 9574ac563..ab04e47ff 100644
--- a/src/fldeff_misc.c
+++ b/src/fldeff_misc.c
@@ -1008,7 +1008,7 @@ void DoSecretBaseGlitterMatSparkle(void)
s16 y = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y;
u8 spriteId;
- sub_80930E0(&x, &y, 8, 4);
+ SetSpritePosToOffsetMapCoords(&x, &y, 8, 4);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[22], x, y, 0);
if (spriteId != MAX_SPRITES)
diff --git a/src/graphics.c b/src/graphics.c
index 7a3a225c2..8e9c472ce 100644
--- a/src/graphics.c
+++ b/src/graphics.c
@@ -1447,19 +1447,15 @@ const u32 gUnknown_08DD4620[] = INCBIN_U32("graphics/unknown/unknown_DD4620.bin.
const u32 gUnknown_08DD46E0[] = INCBIN_U32("graphics/unknown/unknown_DD46E0.bin.lz");
const u32 gUnknown_08DD47A0[] = INCBIN_U32("graphics/unknown/unknown_DD47A0.bin.lz");
-// link
-
-const u16 gLinkMiscMenu_Pal[] = INCBIN_U16("graphics/link/misc.gbapal");
-const u32 gLinkMiscMenu_Gfx[] = INCBIN_U32("graphics/link/misc.4bpp.lz");
-const u32 gLinkMiscMenu_Tilemap[] = INCBIN_U32("graphics/link/misc.bin.lz");
-
-const u16 gUnknown_08DD4BB0[] = INCBIN_U16("graphics/link/link1.gbapal");
-const u16 gUnknown_08DD4BD0[] = INCBIN_U16("graphics/link/link2.gbapal");
-
-const u32 gUnknown_08DD4BF0[] = INCBIN_U32("graphics/link/link_winedge.4bpp.lz");
-const u32 gUnknown_08DD4C4C[] = INCBIN_U32("graphics/link/link_winedge.bin.lz");
-
-const u32 gUnknown_08DD4CF8[] = INCBIN_U32("graphics/interface/unk_change_case.4bpp.lz");
+// union room chat
+const u16 gUnionRoomChat_Background_Pal[] = INCBIN_U16("graphics/union_room_chat/background.gbapal");
+const u32 gUnionRoomChat_Background_Gfx[] = INCBIN_U32("graphics/union_room_chat/background.4bpp.lz");
+const u32 gUnionRoomChat_Background_Tilemap[] = INCBIN_U32("graphics/union_room_chat/background.bin.lz");
+const u16 gUnionRoomChat_Window_Pal1[] = INCBIN_U16("graphics/union_room_chat/window_1.gbapal");
+const u16 gUnionRoomChat_Window_Pal2[] = INCBIN_U16("graphics/union_room_chat/window_2.gbapal");
+const u32 gUnionRoomChat_Border_Gfx[] = INCBIN_U32("graphics/union_room_chat/border.4bpp.lz");
+const u32 gUnionRoomChat_Border_Tilemap[] = INCBIN_U32("graphics/union_room_chat/border.bin.lz");
+const u32 gUnionRoomChat_RButtonLabels[] = INCBIN_U32("graphics/union_room_chat/r_button_labels.4bpp.lz");
const u16 gTilesetPalettes_General[][16] =
{
diff --git a/src/item_menu.c b/src/item_menu.c
index 43e657328..561019e89 100755
--- a/src/item_menu.c
+++ b/src/item_menu.c
@@ -2359,7 +2359,7 @@ void SetupBagMenu_Textboxes(void)
DeactivateAllTextPrinters();
LoadUserWindowBorderGfx(0, 1, 0xE0);
LoadMessageBoxGfx(0, 10, 0xD0);
- sub_819A2BC(0xC0, 1);
+ ListMenuLoadStdPalAt(0xC0, 1);
LoadPalette(&gUnknown_0860F074, 0xF0, 0x20);
for (i = 0; i < 3; i++)
{
diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c
index 3f5bd8b69..fe1d10834 100644
--- a/src/librfu_rfu.c
+++ b/src/librfu_rfu.c
@@ -488,7 +488,7 @@ static void rfu_CB_configGameData(u8 reqCommand, u16 reqResult)
for (i = 0; i < RFU_GAME_NAME_LENGTH; ++i)
gRfuLinkStatus->my.gname[i] = *gname_uname_p++;
++gname_uname_p;
- for (i = 0; i < RFU_USER_NAME_LENGTH; ++i)
+ for (i = 0; i < PLAYER_NAME_LENGTH + 1; ++i)
gRfuLinkStatus->my.uname[i] = *gname_uname_p++;
}
rfu_STC_REQ_callback(reqCommand, reqResult);
@@ -718,7 +718,7 @@ static void rfu_STC_readParentCandidateList(void)
for (j = 0; j < RFU_GAME_NAME_LENGTH; ++j)
target->gname[j] = *packet_p++;
++packet_p;
- for (j = 0; j < RFU_USER_NAME_LENGTH; ++j)
+ for (j = 0; j < PLAYER_NAME_LENGTH + 1; ++j)
target->uname[j] = *packet_p++;
++gRfuLinkStatus->findParentCount;
}
diff --git a/src/link.c b/src/link.c
index aed1afe30..e04e5e29d 100644
--- a/src/link.c
+++ b/src/link.c
@@ -1,5 +1,3 @@
-
-// Includes
#include "global.h"
#include "m4a.h"
#include "malloc.h"
@@ -30,10 +28,6 @@
#include "constants/rgb.h"
#include "constants/trade.h"
-extern u16 gHeldKeyCodeToSend;
-
-// Static type declarations
-
struct BlockTransfer
{
u16 pos;
@@ -51,15 +45,13 @@ struct LinkTestBGInfo
u32 dummy_C;
};
-// Static RAM declarations
-
static struct BlockTransfer sBlockSend;
static struct BlockTransfer sBlockRecv[MAX_LINK_PLAYERS];
static u32 sBlockSendDelayCounter;
-static u32 gUnknown_03000D54;
-static u8 gUnknown_03000D58;
+static bool32 sDummy1; // Never read
+static bool8 sDummy2; // Never assigned, read in unused function
static u32 sPlayerDataExchangeStatus;
-static u32 gUnknown_03000D60;
+static bool32 sDummy3; // Never read
static u8 sLinkTestLastBlockSendPos;
static u8 sLinkTestLastBlockRecvPos[MAX_LINK_PLAYERS];
static u8 sNumVBlanksWithoutSerialIntr;
@@ -74,15 +66,15 @@ u32 gLinkDebugSeed;
struct LinkPlayerBlock gLocalLinkPlayerBlock;
bool8 gLinkErrorOccurred;
u32 gLinkDebugFlags;
-u32 gFiller_03003074;
+u32 gLinkFiller1;
bool8 gRemoteLinkPlayersNotReceived[MAX_LINK_PLAYERS];
u8 gBlockReceivedStatus[MAX_LINK_PLAYERS];
-u32 gFiller_03003080;
+u32 gLinkFiller2;
u16 gLinkHeldKeys;
u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH];
u32 gLinkStatus;
-bool8 gUnknown_030030E4;
-bool8 gUnknown_030030E8;
+bool8 gLinkDummy1; // Never read
+bool8 gLinkDummy2; // Never read
bool8 gUnknown_030030EC[MAX_LINK_PLAYERS];
bool8 gUnknown_030030F0[MAX_LINK_PLAYERS];
u16 gUnknown_030030F4;
@@ -97,15 +89,13 @@ void (*gLinkCallback)(void);
u8 gShouldAdvanceLinkState;
u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS];
u8 gBlockRequestType;
-u32 gFiller_03003154;
-u32 gFiller_03003158;
-u32 gFiller_0300315c;
+u32 gLinkFiller3;
+u32 gLinkFiller4;
+u32 gLinkFiller5;
u8 gLastSendQueueCount;
struct Link gLink;
u8 gLastRecvQueueCount;
u16 gLinkSavedIme;
-u32 gFiller_03004138;
-u32 gFiller_0300413C;
EWRAM_DATA u8 gLinkTestDebugValuesEnabled = 0;
EWRAM_DATA u8 gUnknown_020223BD = 0;
@@ -124,16 +114,16 @@ EWRAM_DATA struct {
u8 lastSendQueueCount;
u8 unk_06;
} sLinkErrorBuffer = {};
-EWRAM_DATA u16 gUnknown_02022B08 = 0;
-EWRAM_DATA void *gUnknown_02022B0C = NULL;
+static EWRAM_DATA u16 sUnknown_02022B08 = 0;
+static EWRAM_DATA void *sLinkErrorBgTilemapBuffer = NULL;
// Static ROM declarations
static void InitLocalLinkPlayer(void);
-static void sub_80096BC(void);
+static void VBlankCB_LinkError(void);
static void CB2_LinkTest(void);
static void ProcessRecvCmds(u8 unused);
-static void sub_8009F70(void);
+static void LinkCB_SendHeldKeys(void);
static void ResetBlockSend(void);
static bool32 InitBlockSend(const void *src, size_t size);
static void LinkCB_BlockSendBegin(void);
@@ -155,7 +145,7 @@ static void sub_800AE5C(void);
static void CheckErrorStatus(void);
static void CB2_PrintErrorMessage(void);
static bool8 IsSioMultiMaster(void);
-static void sub_800B4A4(void);
+static void SetWirelessCommType0_Internal(void);
static void DisableSerial(void);
static void EnableSerial(void);
static void CheckMasterOrSlave(void);
@@ -172,29 +162,29 @@ static void SendRecvDone(void);
// .rodata
-ALIGNED(4) const u16 gWirelessLinkDisplayPal[] = INCBIN_U16("graphics/interface/wireless_link_display.gbapal");
-const u32 gWirelessLinkDisplayGfx[] = INCBIN_U32("graphics/interface/wireless_link_display.4bpp.lz");
-const u32 gWirelessLinkDisplayTilemap[] = INCBIN_U32("graphics/interface/wireless_link_display.bin.lz");
-const u16 gLinkTestDigitsPal[] = INCBIN_U16("graphics/interface/link_test_digits.gbapal");
-const u16 gLinkTestDigitsGfx[] = INCBIN_U16("graphics/interface/link_test_digits.4bpp");
-const u8 unkstring_82ed160[] = _("{HIGHLIGHT TRANSPARENT}{COLOR WHITE}");
-const u16 g2BlankTilesGfx[] = INCBIN_U16("graphics/interface/blank_1x2.4bpp");
-const struct BlockRequest gUnknown_082ED1A8[] = {
+static const u16 sWirelessLinkDisplayPal[] = INCBIN_U16("graphics/interface/wireless_link_display.gbapal");
+static const u32 sWirelessLinkDisplayGfx[] = INCBIN_U32("graphics/interface/wireless_link_display.4bpp.lz");
+static const u32 sWirelessLinkDisplayTilemap[] = INCBIN_U32("graphics/interface/wireless_link_display.bin.lz");
+static const u16 sLinkTestDigitsPal[] = INCBIN_U16("graphics/interface/link_test_digits.gbapal");
+static const u16 sLinkTestDigitsGfx[] = INCBIN_U16("graphics/interface/link_test_digits.4bpp");
+static const u8 sUnusedTransparentWhite[] = _("{HIGHLIGHT TRANSPARENT}{COLOR WHITE}");
+static const u16 s2BlankTilesGfx[] = INCBIN_U16("graphics/interface/blank_1x2.4bpp");
+static const struct BlockRequest sBlockRequests[] = {
{gBlockSendBuffer, 200},
{gBlockSendBuffer, 200},
{gBlockSendBuffer, 100},
{gBlockSendBuffer, 220},
{gBlockSendBuffer, 40}
};
-const u8 gBGControlRegs[] = {
+static const u8 sBGControlRegs[] = {
REG_OFFSET_BG0CNT,
REG_OFFSET_BG1CNT,
REG_OFFSET_BG2CNT,
REG_OFFSET_BG3CNT
};
-const char gASCIIGameFreakInc[] = "GameFreak inc.";
-const char gASCIITestPrint[] = "TEST PRINT\nP0\nP1\nP2\nP3";
-const struct BgTemplate gUnknown_082ED1FC[] = {
+static const char sASCIIGameFreakInc[] = "GameFreak inc.";
+static const char sASCIITestPrint[] = "TEST PRINT\nP0\nP1\nP2\nP3";
+static const struct BgTemplate sLinkErrorBgTemplates[] = {
{
.bg = 0,
.charBaseIndex = 2,
@@ -207,29 +197,50 @@ const struct BgTemplate gUnknown_082ED1FC[] = {
.priority = 1
}
};
-const struct WindowTemplate gUnknown_082ED204[] = {
- {0x00, 0x00, 0x00, 0x1E, 0x05, 0x0F, 0x0002},
- {0x00, 0x00, 0x06, 0x1E, 0x07, 0x0F, 0x0098},
- {0x00, 0x00, 0x0D, 0x1E, 0x07, 0x0F, 0x016A},
- DUMMY_WIN_TEMPLATE
+static const struct WindowTemplate sLinkErrorWindowTemplates[] = {
+ {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 0,
+ .width = 30,
+ .height = 5,
+ .paletteNum = 15,
+ .baseBlock = 0x002
+ }, {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 6,
+ .width = 30,
+ .height = 7,
+ .paletteNum = 15,
+ .baseBlock = 0x098
+ }, {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 13,
+ .width = 30,
+ .height = 7,
+ .paletteNum = 15,
+ .baseBlock = 0x16A
+ }, DUMMY_WIN_TEMPLATE
};
static const u8 sTextColors[] = { TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY };
-static const u8 sUnused_082ED224[] = {0x00, 0xff, 0xfe, 0xff, 0x00};
+static const u8 sUnused_082ED224[] = {0x00, 0xFF, 0xFE, 0xFF, 0x00};
// .text
bool8 IsWirelessAdapterConnected(void)
{
- sub_800B488();
- sub_800E700();
+ SetWirelessCommType1();
+ InitRFUAPI();
if (rfu_LMAN_REQBN_softReset_and_checkID() == 0x8001)
{
rfu_REQ_stopMode();
rfu_waitREQComplete();
return TRUE;
}
- sub_800B4A4();
+ SetWirelessCommType0_Internal();
CloseLink();
RestoreSerialTimer3IntrHandlers();
return FALSE;
@@ -242,8 +253,8 @@ void Task_DestroySelf(u8 taskId)
static void InitLinkTestBG(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock, u16 a4)
{
- LoadPalette(gLinkTestDigitsPal, paletteNum * 16, 0x20);
- DmaCopy16(3, gLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(charBaseBlock) + (16 * a4), sizeof gLinkTestDigitsGfx);
+ LoadPalette(sLinkTestDigitsPal, paletteNum * 16, 0x20);
+ DmaCopy16(3, sLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(charBaseBlock) + (16 * a4), sizeof sLinkTestDigitsGfx);
gLinkTestBGInfo.screenBaseBlock = screenBaseBlock;
gLinkTestBGInfo.paletteNum = paletteNum;
gLinkTestBGInfo.dummy_8 = a4;
@@ -265,12 +276,12 @@ static void InitLinkTestBG(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charB
void sub_80094EC(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock)
{
- LoadPalette(gLinkTestDigitsPal, paletteNum * 16, 0x20);
- DmaCopy16(3, gLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(charBaseBlock), sizeof gLinkTestDigitsGfx);
+ LoadPalette(sLinkTestDigitsPal, paletteNum * 16, 0x20);
+ DmaCopy16(3, sLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(charBaseBlock), sizeof sLinkTestDigitsGfx);
gLinkTestBGInfo.screenBaseBlock = screenBaseBlock;
gLinkTestBGInfo.paletteNum = paletteNum;
gLinkTestBGInfo.dummy_8 = 0;
- SetGpuReg(gBGControlRegs[bgNum], BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock));
+ SetGpuReg(sBGControlRegs[bgNum], BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock));
}
void LinkTestScreen(void)
@@ -280,9 +291,9 @@ void LinkTestScreen(void)
ResetSpriteData();
FreeAllSpritePalettes();
ResetTasks();
- SetVBlankCallback(sub_80096BC);
+ SetVBlankCallback(VBlankCB_LinkError);
ResetBlockSend();
- gLinkType = LINKTYPE_0x1111;
+ gLinkType = LINKTYPE_TRADE;
OpenLink();
SeedRng(gMain.vblankCounter2);
for (i = 0; i < MAX_LINK_PLAYERS; i++)
@@ -296,7 +307,7 @@ void LinkTestScreen(void)
AnimateSprites();
BuildOamBuffer();
UpdatePaletteFade();
- gUnknown_03000D60 = 0;
+ sDummy3 = FALSE;
InitLocalLinkPlayer();
CreateTask(Task_PrintTestData, 0);
SetMainCallback2(CB2_LinkTest);
@@ -323,7 +334,7 @@ static void InitLocalLinkPlayer(void)
}
}
-static void sub_80096BC(void)
+static void VBlankCB_LinkError(void)
{
LoadOam();
ProcessSpriteCopyRequests();
@@ -334,9 +345,9 @@ static void InitLink(void)
{
int i;
- for (i = 0; i < 8; i++)
+ for (i = 0; i < CMD_LENGTH; i++)
{
- gSendCmd[i] = 0xefff;
+ gSendCmd[i] = 0xEfff;
}
gLinkOpen = TRUE;
EnableSerial();
@@ -365,15 +376,15 @@ void OpenLink(void)
gSuppressLinkErrorMessage = FALSE;
ResetBlockReceivedFlags();
ResetBlockSend();
- gUnknown_03000D54 = 0;
- gUnknown_030030E8 = FALSE;
- gUnknown_030030E4 = FALSE;
+ sDummy1 = FALSE;
+ gLinkDummy2 = FALSE;
+ gLinkDummy1 = FALSE;
gUnknown_030030F4 = 0;
CreateTask(Task_TriggerHandshake, 2);
}
else
{
- sub_800E700();
+ InitRFUAPI();
}
gReceivedRemoteLinkPlayers = 0;
for (i = 0; i < MAX_LINK_PLAYERS; i++)
@@ -389,7 +400,7 @@ void CloseLink(void)
gReceivedRemoteLinkPlayers = FALSE;
if (gWirelessCommType)
{
- sub_800EDD4();
+ LinkRfu_Shutdown();
}
gLinkOpen = FALSE;
DisableSerial();
@@ -482,7 +493,7 @@ u16 LinkMain2(const u16 *heldKeys)
{
return 0;
}
- for (i = 0; i < 8; i++)
+ for (i = 0; i < CMD_LENGTH; i++)
{
gSendCmd[i] = 0;
}
@@ -536,8 +547,8 @@ static void ProcessRecvCmds(u8 unused)
InitLocalLinkPlayer();
block = &gLocalLinkPlayerBlock;
block->linkPlayer = gLocalLinkPlayer;
- memcpy(block->magic1, gASCIIGameFreakInc, sizeof(block->magic1) - 1);
- memcpy(block->magic2, gASCIIGameFreakInc, sizeof(block->magic2) - 1);
+ memcpy(block->magic1, sASCIIGameFreakInc, sizeof(block->magic1) - 1);
+ memcpy(block->magic2, sASCIIGameFreakInc, sizeof(block->magic2) - 1);
InitBlockSend(block, sizeof(*block));
break;
}
@@ -545,10 +556,10 @@ static void ProcessRecvCmds(u8 unused)
gLinkPartnersHeldKeys[i] = gRecvCmds[i][1];
break;
case LINKCMD_0x5555:
- gUnknown_030030E8 = TRUE;
+ gLinkDummy2 = TRUE;
break;
case LINKCMD_0x5566:
- gUnknown_030030E8 = TRUE;
+ gLinkDummy2 = TRUE;
break;
case LINKCMD_INIT_BLOCK:
{
@@ -602,8 +613,8 @@ static void ProcessRecvCmds(u8 unused)
linkPlayer->progressFlags = 0;
}
sub_800B524(linkPlayer);
- if (strcmp(block->magic1, gASCIIGameFreakInc) != 0
- || strcmp(block->magic2, gASCIIGameFreakInc) != 0)
+ if (strcmp(block->magic1, sASCIIGameFreakInc) != 0
+ || strcmp(block->magic2, sASCIIGameFreakInc) != 0)
{
SetMainCallback2(CB2_LinkError);
}
@@ -629,7 +640,7 @@ static void ProcessRecvCmds(u8 unused)
sub_800A418();
break;
case LINKCMD_0xCCCC:
- SendBlock(0, gUnknown_082ED1A8[gRecvCmds[i][1]].address, gUnknown_082ED1A8[gRecvCmds[i][1]].size);
+ SendBlock(0, sBlockRequests[gRecvCmds[i][1]].address, sBlockRequests[gRecvCmds[i][1]].size);
break;
case LINKCMD_SEND_HELD_KEYS_2:
gLinkPartnersHeldKeys[i] = gRecvCmds[i][1];
@@ -705,70 +716,56 @@ static void BuildSendCmd(u16 command)
}
}
-void sub_8009F18(void)
+void StartSendingKeysToLink(void)
{
if (gWirelessCommType)
- {
- sub_800F804();
- }
- gLinkCallback = sub_8009F70;
+ StartSendingKeysToRfu();
+
+ gLinkCallback = LinkCB_SendHeldKeys;
}
bool32 IsSendingKeysToLink(void)
{
if (gWirelessCommType)
- {
return IsSendingKeysToRfu();
- }
- if (gLinkCallback == sub_8009F70)
- {
+
+ if (gLinkCallback == LinkCB_SendHeldKeys)
return TRUE;
- }
+
return FALSE;
}
-static void sub_8009F70(void)
+static void LinkCB_SendHeldKeys(void)
{
if (gReceivedRemoteLinkPlayers == TRUE)
- {
BuildSendCmd(LINKCMD_SEND_HELD_KEYS_2);
- }
}
void ClearLinkCallback(void)
{
if (gWirelessCommType)
- {
ClearLinkRfuCallback();
- }
else
- {
gLinkCallback = NULL;
- }
}
void ClearLinkCallback_2(void)
{
if (gWirelessCommType)
- {
ClearLinkRfuCallback();
- }
else
- {
gLinkCallback = NULL;
- }
}
u8 GetLinkPlayerCount(void)
{
if (gWirelessCommType)
- {
- return sub_80104F4();
- }
+ return Rfu_GetLinkPlayerCount();
+
return EXTRACT_PLAYER_COUNT(gLinkStatus);
}
-static int sub_8009FF8(u32 version1, u32 version2)
+static int AreAnyLinkPlayersUsingVersions(u32 version1, u32 version2)
{
int i;
u8 nPlayers;
@@ -776,22 +773,22 @@ static int sub_8009FF8(u32 version1, u32 version2)
nPlayers = GetLinkPlayerCount();
for (i = 0; i < nPlayers; i++)
{
- if ((gLinkPlayers[i].version & 0xFF) == version1 || (gLinkPlayers[i].version & 0xFF) == version2)
- {
+ if ((gLinkPlayers[i].version & 0xFF) == version1
+ || (gLinkPlayers[i].version & 0xFF) == version2)
return 1;
- }
}
return -1;
}
-u32 sub_800A03C(void)
+u32 LinkDummy_Return2(void)
{
return 2;
}
-bool32 sub_800A040(void)
+// Unused
+static bool32 IsFullLinkGroupWithNoRS(void)
{
- if (GetLinkPlayerCount() != 4 || sub_8009FF8(VERSION_RUBY, VERSION_SAPPHIRE) < 0)
+ if (GetLinkPlayerCount() != MAX_LINK_PLAYERS || AreAnyLinkPlayersUsingVersions(VERSION_RUBY, VERSION_SAPPHIRE) < 0)
{
return FALSE;
}
@@ -800,18 +797,18 @@ bool32 sub_800A040(void)
bool32 Link_AnyPartnersPlayingRubyOrSapphire(void)
{
- if (sub_8009FF8(VERSION_RUBY, VERSION_SAPPHIRE) >= 0)
+ if (AreAnyLinkPlayersUsingVersions(VERSION_RUBY, VERSION_SAPPHIRE) >= 0)
{
return TRUE;
}
return FALSE;
}
-bool32 sub_800A07C(void)
+bool32 Link_AnyPartnersPlayingFRLG_JP(void)
{
int i;
- i = sub_8009FF8(VERSION_FIRE_RED, VERSION_LEAF_GREEN);
+ i = AreAnyLinkPlayersUsingVersions(VERSION_FIRE_RED, VERSION_LEAF_GREEN);
if (i >= 0 && gLinkPlayers[i].language == LANGUAGE_JAPANESE)
{
return TRUE;
@@ -826,23 +823,23 @@ void OpenLinkTimed(void)
OpenLink();
}
-u8 GetLinkPlayerDataExchangeStatusTimed(int lower, int upper)
+u8 GetLinkPlayerDataExchangeStatusTimed(int minPlayers, int maxPlayers)
{
int i;
int count;
u32 index;
- u8 cmpVal;
+ u8 numPlayers;
u32 linkType1;
u32 linkType2;
count = 0;
if (gReceivedRemoteLinkPlayers == TRUE)
{
- cmpVal = GetLinkPlayerCount_2();
- if (lower > cmpVal || cmpVal > upper)
+ numPlayers = GetLinkPlayerCount_2();
+ if (minPlayers > numPlayers || numPlayers > maxPlayers)
{
- sPlayerDataExchangeStatus = EXCHANGE_STAT_6;
- return 6;
+ sPlayerDataExchangeStatus = EXCHANGE_WRONG_NUM_PLAYERS;
+ return sPlayerDataExchangeStatus;
}
else
{
@@ -860,19 +857,19 @@ u8 GetLinkPlayerDataExchangeStatusTimed(int lower, int upper)
}
if (count == GetLinkPlayerCount())
{
- if (gLinkPlayers[0].linkType == 0x1133)
+ if (gLinkPlayers[0].linkType == LINKTYPE_TRADE_SETUP)
{
switch (GetGameProgressForLinkTrade())
{
- case TRADE_PLAYER_NOT_READY:
- sPlayerDataExchangeStatus = EXCHANGE_PLAYER_NOT_READY;
- break;
- case TRADE_PARTNER_NOT_READY:
- sPlayerDataExchangeStatus = EXCHANGE_PARTNER_NOT_READY;
- break;
- case TRADE_BOTH_PLAYERS_READY:
- sPlayerDataExchangeStatus = EXCHANGE_COMPLETE;
- break;
+ case TRADE_PLAYER_NOT_READY:
+ sPlayerDataExchangeStatus = EXCHANGE_PLAYER_NOT_READY;
+ break;
+ case TRADE_PARTNER_NOT_READY:
+ sPlayerDataExchangeStatus = EXCHANGE_PARTNER_NOT_READY;
+ break;
+ case TRADE_BOTH_PLAYERS_READY:
+ sPlayerDataExchangeStatus = EXCHANGE_COMPLETE;
+ break;
}
}
else
@@ -882,11 +879,14 @@ u8 GetLinkPlayerDataExchangeStatusTimed(int lower, int upper)
}
else
{
- sPlayerDataExchangeStatus = EXCHANGE_IN_PROGRESS;
+ sPlayerDataExchangeStatus = EXCHANGE_DIFF_SELECTIONS;
linkType1 = gLinkPlayers[GetMultiplayerId()].linkType;
linkType2 = gLinkPlayers[GetMultiplayerId() ^ 1].linkType;
- if ((linkType1 == 0x2266 && linkType2 == 0x2277) || (linkType1 == 0x2277 && linkType2 == 0x2266))
+ if ((linkType1 == LINKTYPE_BATTLE_TOWER_50 && linkType2 == LINKTYPE_BATTLE_TOWER_OPEN)
+ || (linkType1 == LINKTYPE_BATTLE_TOWER_OPEN && linkType2 == LINKTYPE_BATTLE_TOWER_50))
{
+ // 3 below indicates partner made different level mode selection
+ // See BattleFrontier_BattleTowerLobby_EventScript_AbortLinkDifferentSelections
gSpecialVar_0x8005 = 3;
}
}
@@ -921,7 +921,7 @@ bool8 IsLinkPlayerDataExchangeComplete(void)
else
{
retval = FALSE;
- sPlayerDataExchangeStatus = EXCHANGE_IN_PROGRESS;
+ sPlayerDataExchangeStatus = EXCHANGE_DIFF_SELECTIONS;
}
return retval;
}
@@ -959,7 +959,7 @@ static bool32 InitBlockSend(const void *src, size_t size)
sBlockSend.active = TRUE;
sBlockSend.size = size;
sBlockSend.pos = 0;
- if (size > 0x100)
+ if (size > BLOCK_BUFFER_SIZE)
{
sBlockSend.src = src;
}
@@ -992,7 +992,7 @@ static void LinkCB_BlockSend(void)
src = sBlockSend.src;
gSendCmd[0] = LINKCMD_CONT_BLOCK;
- for (i = 0; i < 7; i++)
+ for (i = 0; i < CMD_LENGTH - 1; i++)
{
gSendCmd[i + 1] = (src[sBlockSend.pos + i * 2 + 1] << 8) | src[sBlockSend.pos + i * 2];
}
@@ -1043,7 +1043,7 @@ u8 GetMultiplayerId(void)
{
if (gWirelessCommType == TRUE)
{
- return rfu_get_multiplayer_id();
+ return Rfu_GetMultiplayerId();
}
return SIO_MULTI_CNT->id;
}
@@ -1060,7 +1060,7 @@ bool8 SendBlock(u8 unused, const void *src, u16 size)
{
if (gWirelessCommType == TRUE)
{
- return sub_800FE84(src, size);
+ return Rfu_InitBlockSend(src, size);
}
return InitBlockSend(src, size);
}
@@ -1093,7 +1093,7 @@ u8 GetBlockReceivedStatus(void)
{
if (gWirelessCommType == TRUE)
{
- return sub_800FCD8();
+ return Rfu_GetBlockReceivedStatus();
}
return (gBlockReceivedStatus[3] << 3) | (gBlockReceivedStatus[2] << 2) | (gBlockReceivedStatus[1] << 1) | (gBlockReceivedStatus[0] << 0);
}
@@ -1102,7 +1102,7 @@ static void SetBlockReceivedFlag(u8 who)
{
if (gWirelessCommType == TRUE)
{
- sub_800F6FC(who);
+ Rfu_SetBlockReceivedFlag(who);
}
else
{
@@ -1118,7 +1118,7 @@ void ResetBlockReceivedFlags(void)
{
for (i = 0; i < MAX_RFU_PLAYERS; i++)
{
- sub_800F728(i);
+ Rfu_ResetBlockReceivedFlag(i);
}
}
else
@@ -1134,7 +1134,7 @@ void ResetBlockReceivedFlag(u8 who)
{
if (gWirelessCommType == TRUE)
{
- sub_800F728(who);
+ Rfu_ResetBlockReceivedFlag(who);
}
else if (gBlockReceivedStatus[who])
{
@@ -1261,7 +1261,7 @@ static void Task_PrintTestData(u8 taskId)
char sp[32];
int i;
- strcpy(sp, gASCIITestPrint);
+ strcpy(sp, sASCIITestPrint);
LinkTest_prntstr(sp, 5, 2);
LinkTest_prnthex(gShouldAdvanceLinkState, 2, 1, 2);
LinkTest_prnthex(gLinkStatus, 15, 1, 8);
@@ -1289,7 +1289,7 @@ void SetLinkDebugValues(u32 seed, u32 flags)
gLinkDebugFlags = flags;
}
-u8 sub_800A9A8(void)
+u8 GetSavedLinkPlayerCountAsBitFlags(void)
{
int i;
u8 flags;
@@ -1302,7 +1302,7 @@ u8 sub_800A9A8(void)
return flags;
}
-u8 sub_800A9D8(void)
+u8 GetLinkPlayerCountAsBitFlags(void)
{
int i;
u8 flags;
@@ -1315,11 +1315,11 @@ u8 sub_800A9D8(void)
return flags;
}
-void sub_800AA04(u8 a0)
+void SaveLinkPlayers(u8 playerCount)
{
int i;
- gSavedLinkPlayerCount = a0;
+ gSavedLinkPlayerCount = playerCount;
gSavedMultiplayerId = GetMultiplayerId();
for (i = 0; i < MAX_RFU_PLAYERS; i++)
{
@@ -1334,17 +1334,17 @@ u8 GetSavedPlayerCount(void)
return gSavedLinkPlayerCount;
}
-u8 sub_800AA54(void)
+// Unused
+static u8 GetSavedMultiplayerId(void)
{
return gSavedMultiplayerId;
}
-bool8 sub_800AA60(void)
+bool8 DoesLinkPlayerCountMatchSaved(void)
{
int i;
- unsigned count;
+ u32 count = 0;
- count = 0;
for (i = 0; i < gSavedLinkPlayerCount; i++)
{
if (gLinkPlayers[i].trainerId == gSavedLinkPlayers[i].trainerId)
@@ -1352,9 +1352,7 @@ bool8 sub_800AA60(void)
if (gLinkType == LINKTYPE_BATTLE_TOWER)
{
if (gLinkType == gLinkPlayers[i].linkType)
- {
count++;
- }
}
else
{
@@ -1372,7 +1370,7 @@ bool8 sub_800AA60(void)
return FALSE;
}
-void sub_800AAF4(void)
+void ClearSavedLinkPlayers(void)
{
int i;
@@ -1383,13 +1381,14 @@ void sub_800AAF4(void)
}
}
-void sub_800AB18(void)
+void CheckLinkPlayersMatchSaved(void)
{
u8 i;
for (i = 0; i < gSavedLinkPlayerCount; i++)
{
- if (gSavedLinkPlayers[i].trainerId != gLinkPlayers[i].trainerId || StringCompare(gSavedLinkPlayers[i].name, gLinkPlayers[i].name) != 0)
+ if (gSavedLinkPlayers[i].trainerId != gLinkPlayers[i].trainerId
+ || StringCompare(gSavedLinkPlayers[i].name, gLinkPlayers[i].name) != 0)
{
gLinkErrorOccurred = TRUE;
CloseLink();
@@ -1418,9 +1417,10 @@ bool8 IsLinkMaster(void)
return EXTRACT_MASTER(gLinkStatus);
}
-u8 sub_800ABE8(void)
+// Unused
+static u8 GetDummy2(void)
{
- return gUnknown_03000D58;
+ return sDummy2;
}
void sub_800ABF4(u16 a0)
@@ -1434,7 +1434,7 @@ void sub_800ABF4(u16 a0)
if (gLinkCallback == NULL)
{
gLinkCallback = sub_800AC80;
- gUnknown_030030E4 = FALSE;
+ gLinkDummy1 = FALSE;
gUnknown_030030F4 = a0;
}
}
@@ -1450,12 +1450,12 @@ void sub_800AC34(void)
{
if (gLinkCallback != NULL)
{
- gUnknown_02022B08++;
+ sUnknown_02022B08++;
}
else
{
gLinkCallback = sub_800AC80;
- gUnknown_030030E4 = FALSE;
+ gLinkDummy1 = FALSE;
gUnknown_030030F4 = 0;
}
}
@@ -1491,7 +1491,7 @@ static void sub_800ACAC(void)
gLinkVSyncDisabled = TRUE;
CloseLink();
gLinkCallback = NULL;
- gUnknown_030030E4 = TRUE;
+ gLinkDummy1 = TRUE;
}
}
@@ -1505,12 +1505,12 @@ void sub_800AD10(void)
{
if (gLinkCallback != NULL)
{
- gUnknown_02022B08++;
+ sUnknown_02022B08++;
}
else
{
gLinkCallback = sub_800AD5C;
- gUnknown_030030E4 = FALSE;
+ gLinkDummy1 = FALSE;
gUnknown_030030F4 = 0;
}
}
@@ -1550,7 +1550,7 @@ static void sub_800AD88(void)
gLinkVSyncDisabled = TRUE;
CloseLink();
gLinkCallback = NULL;
- gUnknown_030030E4 = TRUE;
+ gLinkDummy1 = TRUE;
}
}
@@ -1566,7 +1566,7 @@ void sub_800ADF8(void)
{
gLinkCallback = sub_800AE30;
}
- gUnknown_030030E4 = FALSE;
+ gLinkDummy1 = FALSE;
}
}
@@ -1618,7 +1618,7 @@ static void CheckErrorStatus(void)
}
}
-void sub_800AF18(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06)
+void BufferLinkErrorInfo(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, bool8 unk_06)
{
sLinkErrorBuffer.status = status;
sLinkErrorBuffer.lastSendQueueCount = lastSendQueueCount;
@@ -1647,14 +1647,14 @@ void CB2_LinkError(void)
{
gWirelessCommType = 3;
}
- sub_800E604();
+ ResetLinkRfuGFLayer();
}
- SetVBlankCallback(sub_80096BC);
+ SetVBlankCallback(VBlankCB_LinkError);
ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, gUnknown_082ED1FC, 2);
- gUnknown_02022B0C = tilemapBuffer = malloc(0x800);
+ InitBgsFromTemplates(0, sLinkErrorBgTemplates, ARRAY_COUNT(sLinkErrorBgTemplates));
+ sLinkErrorBgTilemapBuffer = tilemapBuffer = malloc(0x800);
SetBgTilemapBuffer(1, tilemapBuffer);
- if (InitWindows(gUnknown_082ED204))
+ if (InitWindows(sLinkErrorWindowTemplates))
{
DeactivateAllTextPrinters();
ResetTempTileDataBuffers();
@@ -1680,11 +1680,11 @@ void CB2_LinkError(void)
static void sub_800B080(void)
{
- LoadBgTiles(0, g2BlankTilesGfx, 0x20, 0);
- DecompressAndLoadBgGfxUsingHeap(1, gWirelessLinkDisplayGfx, FALSE, 0, 0);
- CopyToBgTilemapBuffer(1, gWirelessLinkDisplayTilemap, 0, 0);
+ LoadBgTiles(0, s2BlankTilesGfx, 0x20, 0);
+ DecompressAndLoadBgGfxUsingHeap(1, sWirelessLinkDisplayGfx, FALSE, 0, 0);
+ CopyToBgTilemapBuffer(1, sWirelessLinkDisplayTilemap, 0, 0);
CopyBgTilemapBufferToVram(1);
- LoadPalette(gWirelessLinkDisplayPal, 0, 0x20);
+ LoadPalette(sWirelessLinkDisplayPal, 0, 0x20);
FillWindowPixelBuffer(0, PIXEL_FILL(0));
FillWindowPixelBuffer(2, PIXEL_FILL(0));
AddTextPrinterParameterized3(0, 3, 2, 6, sTextColors, 0, gText_CommErrorEllipsis);
@@ -1697,7 +1697,7 @@ static void sub_800B080(void)
static void sub_800B138(void)
{
- LoadBgTiles(0, g2BlankTilesGfx, 0x20, 0);
+ LoadBgTiles(0, s2BlankTilesGfx, 0x20, 0);
FillWindowPixelBuffer(1, PIXEL_FILL(0));
FillWindowPixelBuffer(2, PIXEL_FILL(0));
AddTextPrinterParameterized3(1, 3, 2, 0, sTextColors, 0, gText_CommErrorCheckConnections);
@@ -1810,12 +1810,12 @@ void sub_800B348(void)
InitLocalLinkPlayer();
block = &gLocalLinkPlayerBlock;
block->linkPlayer = gLocalLinkPlayer;
- memcpy(block->magic1, gASCIIGameFreakInc, sizeof(block->magic1) - 1);
- memcpy(block->magic2, gASCIIGameFreakInc, sizeof(block->magic2) - 1);
+ memcpy(block->magic1, sASCIIGameFreakInc, sizeof(block->magic1) - 1);
+ memcpy(block->magic2, sASCIIGameFreakInc, sizeof(block->magic2) - 1);
memcpy(gBlockSendBuffer, block, sizeof(*block));
}
-void sub_800B3A4(u32 who)
+void LinkPlayerFromBlock(u32 who)
{
u8 who_ = who;
struct LinkPlayerBlock *block;
@@ -1825,7 +1825,7 @@ void sub_800B3A4(u32 who)
player = &gLinkPlayers[who_];
*player = block->linkPlayer;
sub_800B524(player);
- if (strcmp(block->magic1, gASCIIGameFreakInc) != 0 || strcmp(block->magic2, gASCIIGameFreakInc) != 0)
+ if (strcmp(block->magic1, sASCIIGameFreakInc) != 0 || strcmp(block->magic2, sASCIIGameFreakInc) != 0)
{
SetMainCallback2(CB2_LinkError);
}
@@ -1860,7 +1860,7 @@ bool8 HandleLinkConnection(void)
return FALSE;
}
-void sub_800B488(void)
+void SetWirelessCommType1(void)
{
if (gReceivedRemoteLinkPlayers == 0)
{
@@ -1868,7 +1868,7 @@ void sub_800B488(void)
}
}
-static void sub_800B4A4(void)
+static void SetWirelessCommType0_Internal(void)
{
if (gReceivedRemoteLinkPlayers == 0)
{
@@ -1876,7 +1876,7 @@ static void sub_800B4A4(void)
}
}
-void sub_800B4C0(void)
+void SetWirelessCommType0(void)
{
if (gReceivedRemoteLinkPlayers == 0)
{
diff --git a/src/link_rfu_2.c b/src/link_rfu_2.c
index 3ee193ec6..34e9f719b 100644
--- a/src/link_rfu_2.c
+++ b/src/link_rfu_2.c
@@ -19,34 +19,91 @@
#include "save.h"
#include "mystery_gift.h"
-extern u16 gHeldKeyCodeToSend;
-
-u32 gf_rfu_REQ_api[RFU_API_BUFF_SIZE_RAM / 4];
-struct UnkRfuStruct_2 Rfu;
-
-BSS_DATA u8 gUnknown_03000D78[8];
-BSS_DATA u8 gUnknown_03000D80[16];
-BSS_DATA u16 gUnknown_03000D90[8];
-
-EWRAM_DATA struct GFtgtGname gUnknown_02022B14 = {};
-EWRAM_DATA ALIGNED(2) u8 gUnknown_02022B22[RFU_USER_NAME_LENGTH] = {};
-EWRAM_DATA INIT_PARAM gUnknown_02022B2C = {};
-EWRAM_DATA struct UnkLinkRfuStruct_02022B44 gUnknown_02022B44 = {};
-
-// Static ROM declarations
+struct SioInfo
+{
+ char magic[15]; // PokemonSioInfo
+ u8 playerCount;
+ u8 linkPlayerIdx[RFU_CHILD_MAX];
+ struct LinkPlayer linkPlayers[MAX_RFU_PLAYERS];
+ u8 filler[92];
+};
-// .rodata
+struct RfuDebug
+{
+ u8 filler0[6];
+ u16 unk_06;
+ u8 filler1[6];
+ vu8 unk_0e;
+ u8 unk_0f;
+ u8 filler2[84];
+ u16 unk_64;
+ u8 filler3[29];
+ u8 unk_83;
+ u8 filler4[88];
+};
-const INIT_PARAM gUnknown_082ED608 = {
- 0x04, 0x20, 0x00, 0x00, 0x02,
- (u8 *)&gUnknown_02022B14,
- gUnknown_02022B22,
- 0x01, 0x00, 0x258, 0x12c
+u32 gf_rfu_REQ_api[RFU_API_BUFF_SIZE_RAM / 4];
+struct GFRfuManager Rfu;
+
+static u8 sHeldKeyCount;
+static u8 sResendBlock8[16];
+static u16 sResendBlock16[8];
+
+EWRAM_DATA struct GFtgtGname gHostRFUtgtGnameBuffer = {};
+EWRAM_DATA u8 gHostRFUtgtUnameBuffer[PLAYER_NAME_LENGTH + 1] = {};
+static EWRAM_DATA INIT_PARAM sRfuReqConfig = {};
+static EWRAM_DATA struct RfuDebug sRfuDebug = {};
+
+static void ResetSendDataManager(struct RfuBlockSend *);
+static void sub_800EAB4(void);
+static void sub_800EAFC(void);
+static void sub_800ED34(u16);
+static void sub_800EDBC(u16);
+static void UpdateBackupQueue(void);
+static void Task_ExchangeLinkPlayers(u8);
+static void RfuHandleReceiveCommand(u8);
+static void CallRfuFunc(void);
+static void RfuPrepareSendBuffer(u16);
+static void HandleBlockSend(void);
+static void SendNextBlock(void);
+static void SendLastBlock(void);
+static u8 GetPartnerIndexByNameAndTrainerID(const u8 *, u16);
+static void UpdateChildStatuses(void);
+static s32 sub_80107A0(void);
+static void sub_801084C(u8);
+static void ClearSelectedLinkPlayerIds(u16);
+static void ValidateAndReceivePokemonSioInfo(void *);
+static void sub_8010D0C(u8);
+static void sub_80115EC(s32);
+static void sub_8011BF8(void);
+static void RfuReqDisconnectSlot(u32);
+static void sub_8011E94(u32, u32);
+static void sub_801209C(u8);
+static void Debug_PrintEmpty(void);
+static void Task_Idle(u8);
+
+static const INIT_PARAM sRfuReqConfigTemplate = {
+ .maxMFrame = 4,
+ .MC_TimerCount = 32,
+ .availSlot_flag = 0,
+ .mboot_flag = 0,
+ .serialNo = 2,
+ .gameName = (void *)&gHostRFUtgtGnameBuffer,
+ .userName = gHostRFUtgtUnameBuffer,
+ .fastSearchParent_flag = TRUE,
+ .linkRecovery_enable = FALSE,
+ .linkRecovery_period = 600,
+ .NI_failCounter_limit = 0x12c
};
-const u8 gUnknown_082ED620[] = {
- 0, 3, 2, 1, 0
+
+static const u8 sAvailSlots[] = {
+ [1] = AVAIL_SLOT1,
+ [2] = AVAIL_SLOT2,
+ [3] = AVAIL_SLOT3,
+ [4] = AVAIL_SLOT4
};
-const u32 gUnknown_082ED628[] = {
+
+static const u32 sAllBlocksReceived[] = {
0x000000,
0x000001,
0x000003,
@@ -73,35 +130,43 @@ const u32 gUnknown_082ED628[] = {
0x7fffff,
0xffffff
};
-const u8 gUnknown_082ED68C[] = {
+
+static const u8 sUnknown_082ED68C[] = {
0, 0, 1,
1, 2, 2,
2, 2, 3
};
-const u8 gUnknown_082ED695[] = {
+
+static const u8 sUnknown_082ED695[] = {
0, 1, 1, 2,
1, 2, 2, 3,
1, 2, 2, 3,
2, 3, 3, 4
};
-const u8 gUnknown_082ED6A5[] = {
+
+static const u8 sUnknown_082ED6A5[] = {
0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
};
-const struct {
+
+static const struct {
u8 *buffer;
u32 size;
-} gUnknown_082ED6B8[] = {
+} sUnknown_082ED6B8[] = {
{ gBlockSendBuffer, 200 },
{ gBlockSendBuffer, 200 },
{ gBlockSendBuffer, 100 },
{ gBlockSendBuffer, 220 },
{ gBlockSendBuffer, 40 }
};
-const u16 gUnknown_082ED6E0[] = {
- 0x0002, 0x7f7d, 0x0000, 0xFFFF
+
+static const u16 sAcceptedSerialNos[] = {
+ 0x0002,
+ RFU_SERIAL_7F7D,
+ 0x0000,
+ 0xFFFF
};
-const char sUnref_082ED6E8[][15] = {
+static const char sASCII_RfuCmds[][15] = {
"RFU WAIT",
"RFU BOOT",
"RFU ERROR",
@@ -114,79 +179,83 @@ const char sUnref_082ED6E8[][15] = {
"RFU SEND ERR",
"RFU CP POLL"
};
-const char sUnref_082ED6E9[][16] = {
+
+static const char sASCII_RecoverCmds[][16] = {
" ",
"RECOVER START ",
"DISSCONECT ",
"RECOVER SUUSES",
"RECOVER FAILED"
};
-const TaskFunc gUnknown_082ED7E0[] = {
+
+static const TaskFunc sUnknown_082ED7E0[] = {
sub_801084C,
- sub_8010AAC,
+ Task_ExchangeLinkPlayers,
sub_8010D0C
};
-const char gUnknown_082ED7EC[] = "PokemonSioInfo";
-const char gUnknown_082ED7FC[] = "LINK LOSS DISCONNECT!";
-const char gUnknown_082ED814[] = "LINK LOSS RECOVERY NOW";
-
-ALIGNED(4) const char gUnknown_082ED82C[31] = {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',0x00};
-const char gUnknown_082ED84B[16] = {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',0x00};
-const char gUnknown_082ED85B[9] = {' ',' ',' ',' ',' ',' ',' ',' ',0x00};
-ALIGNED(4) const char gUnknown_082ED864[2] = {' ',0x00};
-const char gUnknown_082ED866[2] = {'*',0x00};
-const char gUnknown_082ED868[8] = "NOWSLOT";
-const char gUnknown_082ED870[12] = " ";
-const char gUnknown_082ED87C[12] = "CLOCK DRIFT";
-const char gUnknown_082ED888[12] = "BUSY SEND ";
-const char gUnknown_082ED894[12] = "CMD REJECT ";
-const char gUnknown_082ED8A0[12] = "CLOCK SLAVE";
-const char gUnknown_082ED8A8[3][8] = {
+
+static const char sASCII_PokemonSioInfo[] = "PokemonSioInfo";
+static const char sASCII_LinkLossDisconnect[] = "LINK LOSS DISCONNECT!";
+static const char sASCII_LinkLossRecoveryNow[] = "LINK LOSS RECOVERY NOW";
+ALIGNED(4) static const char sASCII_30Commas[31] = {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','\0'};
+static const char sASCII_15Commas[16] = {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','\0'};
+static const char sASCII_8Commas[9] = {' ',' ',' ',' ',' ',' ',' ',' ','\0'};
+ALIGNED(4) static const char sASCII_Space[2] = {' ','\0'};
+static const char sASCII_Asterisk[2] = {'*','\0'};
+static const char sASCII_NowSlot[8] = "NOWSLOT";
+
+static const char sASCII_ClockCmds[][12] = {
+ " ",
+ "CLOCK DRIFT",
+ "BUSY SEND ",
+ "CMD REJECT ",
+ "CLOCK SLAVE"
+};
+
+static const char sASCII_ChildParentSearch[3][8] = {
"CHILD ",
"PARENT",
"SEARCH"
};
-// .text
-
-void nullsub_5(const void *unused_0, u8 unused_1, u8 unused_2)
+static void Debug_PrintString(const void *str, u8 x, u8 y)
{
- // debug?
+
}
-void nullsub_13(u16 unused_0, u8 unused_1, u8 unused_2, u8 unused_3)
+static void Debug_PrintNum(u16 num, u8 x, u8 y, u8 numDigits)
{
}
-void sub_800E604(void)
+void ResetLinkRfuGFLayer(void)
{
s32 i;
- u8 unk_ee_bak = Rfu.unk_ee;
+ u8 errorState = Rfu.errorState;
CpuFill16(0, &Rfu, sizeof Rfu);
- Rfu.unk_ee = unk_ee_bak;
- Rfu.unk_0c = 0xFF;
- if (Rfu.unk_ee != 4)
+ Rfu.errorState = errorState;
+ Rfu.parentChild = 0xFF;
+ if (Rfu.errorState != 4)
{
- Rfu.unk_ee = 0;
+ Rfu.errorState = 0;
}
- for (i = 0; i < 5; i++)
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
{
- sub_800FCC4(Rfu.unk_80 + i);
+ ResetSendDataManager(&Rfu.recvBlock[i]);
}
- sub_800FCC4(&Rfu.unk_6c);
- sub_800D6C8(&Rfu.unk_124);
- sub_800D724(&Rfu.unk_9e8);
+ ResetSendDataManager(&Rfu.sendBlock);
+ RfuRecvQueue_Reset(&Rfu.recvQueue);
+ RfuSendQueue_Reset(&Rfu.sendQueue);
CpuFill16(0, gSendCmd, sizeof gSendCmd);
CpuFill16(0, gRecvCmds, sizeof gRecvCmds);
CpuFill16(0, gLinkPlayers, sizeof gLinkPlayers);
}
-void sub_800E6D0(void)
+void InitRFU(void)
{
IntrFunc serialIntr = gIntrTable[1];
IntrFunc timerIntr = gIntrTable[2];
- sub_800E700();
+ InitRFUAPI();
rfu_REQ_stopMode();
rfu_waitREQComplete();
REG_IME = 0;
@@ -195,59 +264,59 @@ void sub_800E6D0(void)
REG_IME = INTR_FLAG_VBLANK;
}
-void sub_800E700(void)
+void InitRFUAPI(void)
{
if (!rfu_initializeAPI((void *)gf_rfu_REQ_api, sizeof gf_rfu_REQ_api, gIntrTable + 1, TRUE))
{
gLinkType = 0;
- sub_800AAF4();
- sub_80111B0(0);
- sub_800E604();
+ ClearSavedLinkPlayers();
+ sub_80111B0(FALSE);
+ ResetLinkRfuGFLayer();
rfu_setTimerInterrupt(3, gIntrTable + 2);
}
}
-void sub_800E748(u8 taskId)
+static void Task_LinkLeaderSearchForChildren(u8 taskId)
{
- sub_8010750();
- switch (Rfu.unk_04)
+ UpdateChildStatuses();
+ switch (Rfu.state)
{
- case 0:
- rfu_LMAN_initializeRFU(&gUnknown_02022B2C);
- Rfu.unk_04 = 1;
- gTasks[taskId].data[1] = 1;
- break;
- case 1:
- break;
- case 2:
- rfu_LMAN_establishConnection(Rfu.unk_0c, 0, 240, (u16 *)gUnknown_082ED6E0);
- Rfu.unk_04 = 3;
- gTasks[taskId].data[1] = 6;
- break;
- case 3:
- break;
- case 4:
- rfu_LMAN_stopManager(FALSE);
- Rfu.unk_04 = 5;
- break;
- case 5:
- break;
- case 18:
- Rfu.unk_cdb = 0;
- rfu_LMAN_setMSCCallback(sub_800EDBC);
- sub_800EAB4();
- sub_800EAFC();
- Rfu.unk_04 = 20;
- gTasks[taskId].data[1] = 8;
- CreateTask(sub_801084C, 5);
- DestroyTask(taskId);
- break;
+ case 0:
+ rfu_LMAN_initializeRFU(&sRfuReqConfig);
+ Rfu.state = 1;
+ gTasks[taskId].data[1] = 1;
+ break;
+ case 1:
+ break;
+ case 2:
+ rfu_LMAN_establishConnection(Rfu.parentChild, 0, 240, (u16 *)sAcceptedSerialNos);
+ Rfu.state = 3;
+ gTasks[taskId].data[1] = 6;
+ break;
+ case 3:
+ break;
+ case 4:
+ rfu_LMAN_stopManager(FALSE);
+ Rfu.state = 5;
+ break;
+ case 5:
+ break;
+ case 18:
+ Rfu.unk_cdb = FALSE;
+ rfu_LMAN_setMSCCallback(sub_800EDBC);
+ sub_800EAB4();
+ sub_800EAFC();
+ Rfu.state = 20;
+ gTasks[taskId].data[1] = 8;
+ CreateTask(sub_801084C, 5);
+ DestroyTask(taskId);
+ break;
}
}
s32 sub_800E87C(u8 idx)
{
- return gUnknown_082ED6A5[idx];
+ return sUnknown_082ED6A5[idx];
}
void sub_800E88C(s32 r2, s32 r5)
@@ -258,287 +327,287 @@ void sub_800E88C(s32 r2, s32 r5)
s32 r6 = 0;
if (r5 == -1)
{
- for (i = 0; i < 4; r2 >>= 1, i++)
+ for (i = 0; i < RFU_CHILD_MAX; r2 >>= 1, i++)
{
if (r2 & 1)
{
- Rfu.unk_cde[i] = r4;
+ Rfu.linkPlayerIdx[i] = r4;
r4++;
}
}
}
else
{
- for (i = 0; i < 4; r1 >>= 1, i++)
+ for (i = 0; i < RFU_CHILD_MAX; r1 >>= 1, i++)
{
if (!(r1 & 1))
{
- Rfu.unk_cde[i] = 0;
+ Rfu.linkPlayerIdx[i] = 0;
}
}
- for (r4 = 4; r4 != 0; r4--)
+ for (r4 = RFU_CHILD_MAX; r4 != 0; r4--)
{
- for (i = 0; i < 4 && Rfu.unk_cde[i] != r4; i++);
- if (i == 4)
+ for (i = 0; i < RFU_CHILD_MAX && Rfu.linkPlayerIdx[i] != r4; i++);
+ if (i == RFU_CHILD_MAX)
{
r6 = r4;
}
}
- for (r5 &= ~r2, i = 0; i < 4; r5 >>= 1, i++)
+ for (r5 &= ~r2, i = 0; i < RFU_CHILD_MAX; r5 >>= 1, i++)
{
if (r5 & 1)
{
- Rfu.unk_cde[i] = r6++;
+ Rfu.linkPlayerIdx[i] = r6++;
}
}
}
}
-void sub_800E94C(u8 taskId)
+static void Task_JoinGroupSearchForParent(u8 taskId)
{
- switch (Rfu.unk_04)
+ switch (Rfu.state)
{
- case 0:
- rfu_LMAN_initializeRFU((INIT_PARAM *)&gUnknown_082ED608);
- Rfu.unk_04 = 1;
- gTasks[taskId].data[1] = 1;
- break;
- case 1:
- break;
- case 6:
- rfu_LMAN_establishConnection(Rfu.unk_0c, 0, 0xf0, (u16 *)gUnknown_082ED6E0);
- Rfu.unk_04 = 7;
- gTasks[taskId].data[1] = 7;
- break;
- case 7:
- break;
- case 9:
- gTasks[taskId].data[1] = 10;
- break;
- case 11:
- switch (sub_80107A0())
- {
- case 5:
- Rfu.unk_04 = 12;
- break;
- case 6:
- case 9:
- rfu_LMAN_requestChangeAgbClockMaster();
- Rfu.unk_ce4 = 2;
- DestroyTask(taskId);
- break;
- }
- break;
- case 12:
+ case 0:
+ rfu_LMAN_initializeRFU((INIT_PARAM *)&sRfuReqConfigTemplate);
+ Rfu.state = 1;
+ gTasks[taskId].data[1] = 1;
+ break;
+ case 1:
+ break;
+ case 6:
+ rfu_LMAN_establishConnection(Rfu.parentChild, 0, 240, (u16 *)sAcceptedSerialNos);
+ Rfu.state = 7;
+ gTasks[taskId].data[1] = 7;
+ break;
+ case 7:
+ break;
+ case 9:
+ gTasks[taskId].data[1] = 10;
+ break;
+ case 11:
+ switch (sub_80107A0())
{
- u8 r5 = 1 << Rfu.unk_c3e;
- rfu_clearSlot(12, Rfu.unk_c3e);
- rfu_setRecvBuffer(16, Rfu.unk_c3e, Rfu.unk_c3f, 70);
- rfu_UNI_setSendData(r5, Rfu.unk_4c, 14);
- gTasks[taskId].data[1] = 8;
+ case RFU_STATUS_JOIN_GROUP_OK:
+ Rfu.state = 12;
+ break;
+ case RFU_STATUS_JOIN_GROUP_NO:
+ case RFU_STATUS_LEAVE_GROUP:
+ rfu_LMAN_requestChangeAgbClockMaster();
+ Rfu.unk_ce4 = 2;
DestroyTask(taskId);
- if (gUnknown_02022B44.unk_0f == 0)
- {
- sub_801227C();
- gUnknown_02022B44.unk_0f++;
- }
- CreateTask(sub_801084C, 5);
break;
}
+ break;
+ case 12:
+ {
+ u8 bmChildSlot = 1 << Rfu.childSlot;
+ rfu_clearSlot(TYPE_NI_SEND | TYPE_NI_RECV, Rfu.childSlot);
+ rfu_setRecvBuffer(TYPE_UNI, Rfu.childSlot, Rfu.unk_c3f, 70);
+ rfu_UNI_setSendData(bmChildSlot, Rfu.unk_4c, sizeof(Rfu.unk_4c));
+ gTasks[taskId].data[1] = 8;
+ DestroyTask(taskId);
+ if (sRfuDebug.unk_0f == 0)
+ {
+ Debug_PrintEmpty();
+ sRfuDebug.unk_0f++;
+ }
+ CreateTask(sub_801084C, 5);
+ break;
+ }
}
}
-void sub_800EAB4(void)
+static void sub_800EAB4(void)
{
u8 i;
- u8 r5 = lman.acceptSlot_flag;
- for (i = 0; i < 4; i++)
+ u8 acceptSlot = lman.acceptSlot_flag;
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if (r5 & 1)
+ if (acceptSlot & 1)
{
- rfu_setRecvBuffer(16, i, Rfu.unk_14[i], 14);
- rfu_clearSlot(3, i);
+ rfu_setRecvBuffer(TYPE_UNI, i, Rfu.unk_14[i], 14);
+ rfu_clearSlot(TYPE_UNI_SEND | TYPE_UNI_RECV, i);
}
- r5 >>= 1;
+ acceptSlot >>= 1;
}
}
-void sub_800EAFC(void)
+static void sub_800EAFC(void)
{
- u8 r5 = lman.acceptSlot_flag;
- rfu_UNI_setSendData(r5, Rfu.unk_c87, 70);
- Rfu.unk_cda = sub_800E87C(r5);
- Rfu.unk_ce2 = r5;
- sub_800E88C(r5, -1);
- Rfu.unk_0c = 1;
+ u8 acceptSlot = lman.acceptSlot_flag;
+ rfu_UNI_setSendData(acceptSlot, Rfu.recvCmds, 70);
+ Rfu.unk_cda = sub_800E87C(acceptSlot);
+ Rfu.unk_ce2 = acceptSlot;
+ sub_800E88C(acceptSlot, -1);
+ Rfu.parentChild = MODE_PARENT;
}
-void sub_800EB44(u8 taskId)
+static void Task_LinkRfu_UnionRoomListen(u8 taskId)
{
- if (sub_800F7DC()->activity == 0x54 && sub_8011A74() == 4)
+ if (GetHostRFUtgtGname()->activity == (ACTIVITY_PLYRTALK | IN_UNION_ROOM) && RfuGetStatus() == RFU_STATUS_NEW_CHILD_DETECTED)
{
rfu_REQ_disconnect(lman.acceptSlot_flag);
rfu_waitREQComplete();
- sub_8011A64(0, 0);
+ RfuSetStatus(RFU_STATUS_OK, 0);
}
- switch (Rfu.unk_04)
+ switch (Rfu.state)
{
- case 0:
- rfu_LMAN_initializeRFU(&gUnknown_02022B2C);
- Rfu.unk_04 = 1;
- gTasks[taskId].data[1] = 1;
- break;
- case 1:
- break;
- case 17:
- rfu_LMAN_establishConnection(2, 0, 240, (u16 *)gUnknown_082ED6E0);
- rfu_LMAN_setMSCCallback(sub_800ED34);
- Rfu.unk_04 = 18;
- break;
- case 18:
- break;
- case 13:
- if (rfu_UNI_setSendData(1 << Rfu.unk_c3e, Rfu.unk_4c, 14) == 0)
+ case 0:
+ rfu_LMAN_initializeRFU(&sRfuReqConfig);
+ Rfu.state = 1;
+ gTasks[taskId].data[1] = 1;
+ break;
+ case 1:
+ break;
+ case 17:
+ rfu_LMAN_establishConnection(2, 0, 240, (u16 *)sAcceptedSerialNos);
+ rfu_LMAN_setMSCCallback(sub_800ED34);
+ Rfu.state = 18;
+ break;
+ case 18:
+ break;
+ case 13:
+ if (rfu_UNI_setSendData(1 << Rfu.childSlot, Rfu.unk_4c, sizeof(Rfu.unk_4c)) == 0)
+ {
+ Rfu.parentChild = MODE_CHILD;
+ DestroyTask(taskId);
+ if (gTasks[taskId].data[7])
{
- Rfu.unk_0c = 0;
- DestroyTask(taskId);
- if (gTasks[taskId].data[7])
- {
- CreateTask(sub_8010D0C, 1);
- }
- else
- {
- CreateTask(sub_801084C, 5);
- }
+ CreateTask(sub_8010D0C, 1);
}
- break;
- case 14:
- rfu_LMAN_stopManager(0);
- Rfu.unk_04 = 15;
- break;
- case 15:
- break;
- case 16:
- Rfu.unk_cdb = 0;
- rfu_LMAN_setMSCCallback(sub_800EDBC);
- sub_8011068(1);
- sub_800EAB4();
- sub_800EAFC();
- Rfu.unk_04 = 20;
- gTasks[taskId].data[1] = 8;
- Rfu.unk_0c = 1;
- CreateTask(sub_801084C, 5);
- Rfu.unk_ce8 = 1;
- DestroyTask(taskId);
- break;
+ else
+ {
+ CreateTask(sub_801084C, 5);
+ }
+ }
+ break;
+ case 14:
+ rfu_LMAN_stopManager(0);
+ Rfu.state = 15;
+ break;
+ case 15:
+ break;
+ case 16:
+ Rfu.unk_cdb = FALSE;
+ rfu_LMAN_setMSCCallback(sub_800EDBC);
+ UpdateGameData_GroupLockedIn(TRUE);
+ sub_800EAB4();
+ sub_800EAFC();
+ Rfu.state = 20;
+ gTasks[taskId].data[1] = 8;
+ Rfu.parentChild = MODE_PARENT;
+ CreateTask(sub_801084C, 5);
+ Rfu.unk_ce8 = TRUE;
+ DestroyTask(taskId);
+ break;
}
}
-void sub_800ED10(void)
+void LinkRfu_CreateConnectionAsParent(void)
{
- rfu_LMAN_establishConnection(1, 0, 240, (u16 *)gUnknown_082ED6E0);
+ rfu_LMAN_establishConnection(MODE_PARENT, 0, 240, (u16 *)sAcceptedSerialNos);
}
-void sub_800ED28(void)
+void LinkRfu_StopManagerBeforeEnteringChat(void)
{
rfu_LMAN_stopManager(FALSE);
}
-void sub_800ED34(u16 unused)
+static void sub_800ED34(u16 unused)
{
s32 i;
- for (i = 0; i < 14; i++)
+ for (i = 0; i < (int)ARRAY_COUNT(Rfu.unk_4c); i++)
{
Rfu.unk_4c[i] = 0;
}
rfu_REQ_recvData();
rfu_waitREQComplete();
- if (gRfuSlotStatusUNI[Rfu.unk_c3e]->recv.newDataFlag)
+ if (gRfuSlotStatusUNI[Rfu.childSlot]->recv.newDataFlag)
{
Rfu.unk_cd0++;
- sub_800D7D8(&Rfu.unk_124, Rfu.unk_c3f);
- gUnknown_02022B44.unk_06++;
- sub_800F048();
- rfu_UNI_readySendData(Rfu.unk_c3e);
- rfu_UNI_clearRecvNewDataFlag(Rfu.unk_c3e);
+ RfuRecvQueue_Enqueue(&Rfu.recvQueue, Rfu.unk_c3f);
+ sRfuDebug.unk_06++;
+ UpdateBackupQueue();
+ rfu_UNI_readySendData(Rfu.childSlot);
+ rfu_UNI_clearRecvNewDataFlag(Rfu.childSlot);
}
- rfu_LMAN_REQ_sendData(1);
+ rfu_LMAN_REQ_sendData(TRUE);
}
-void sub_800EDBC(u16 unused)
+static void sub_800EDBC(u16 unused)
{
- Rfu.unk_cdb = 1;
+ Rfu.unk_cdb = TRUE;
}
-void sub_800EDD4(void)
+void LinkRfu_Shutdown(void)
{
u8 i;
rfu_LMAN_powerDownRFU();
- if (Rfu.unk_0c == 1)
+ if (Rfu.parentChild == MODE_PARENT)
{
- if (FuncIsActiveTask(sub_800E748) == TRUE)
+ if (FuncIsActiveTask(Task_LinkLeaderSearchForChildren) == TRUE)
{
- DestroyTask(Rfu.unk_67);
- sub_800E604();
+ DestroyTask(Rfu.searchTaskId);
+ ResetLinkRfuGFLayer();
}
}
- else if (Rfu.unk_0c == 0)
+ else if (Rfu.parentChild == MODE_CHILD)
{
- if (FuncIsActiveTask(sub_800E94C) == TRUE)
+ if (FuncIsActiveTask(Task_JoinGroupSearchForParent) == TRUE)
{
- DestroyTask(Rfu.unk_67);
- sub_800E604();
+ DestroyTask(Rfu.searchTaskId);
+ ResetLinkRfuGFLayer();
}
}
- else if (Rfu.unk_0c == 2)
+ else if (Rfu.parentChild == 2)
{
- if (FuncIsActiveTask(sub_800EB44) == TRUE)
+ if (FuncIsActiveTask(Task_LinkRfu_UnionRoomListen) == TRUE)
{
- DestroyTask(Rfu.unk_67);
- sub_800E604();
+ DestroyTask(Rfu.searchTaskId);
+ ResetLinkRfuGFLayer();
}
}
- for (i = 0; i < 3; i++)
+ for (i = 0; i < ARRAY_COUNT(sUnknown_082ED7E0); i++)
{
- if (FuncIsActiveTask(gUnknown_082ED7E0[i]) == TRUE)
+ if (FuncIsActiveTask(sUnknown_082ED7E0[i]) == TRUE)
{
- DestroyTask(FindTaskIdByFunc(gUnknown_082ED7E0[i]));
+ DestroyTask(FindTaskIdByFunc(sUnknown_082ED7E0[i]));
}
}
}
-void sub_800EE78(void)
+static void CreateTask_LinkLeaderSearchForChildren(void)
{
- Rfu.unk_67 = CreateTask(sub_800E748, 1);
+ Rfu.searchTaskId = CreateTask(Task_LinkLeaderSearchForChildren, 1);
}
-bool8 sub_800EE94(void)
+static bool8 sub_800EE94(void)
{
- if (Rfu.unk_04 == 7 && Rfu.unk_ccd)
+ if (Rfu.state == 7 && Rfu.parentId)
{
return TRUE;
}
return FALSE;
}
-bool32 sub_800EEBC(void)
+static bool32 IsParentSuccessfullyReconnected(void)
{
- if (Rfu.unk_04 == 7 && !rfu_LMAN_CHILD_connectParent(gRfuLinkStatus->partner[Rfu.unk_c3d].id, 240))
+ if (Rfu.state == 7 && !rfu_LMAN_CHILD_connectParent(gRfuLinkStatus->partner[Rfu.unk_c3d].id, 240))
{
- Rfu.unk_04 = 9;
+ Rfu.state = 9;
return TRUE;
}
return FALSE;
}
-void sub_800EF00(void)
+static void CreateTask_JoinGroupSearchForParent(void)
{
- Rfu.unk_67 = CreateTask(sub_800E94C, 1);
+ Rfu.searchTaskId = CreateTask(Task_JoinGroupSearchForParent, 1);
}
-bool8 sub_800EF1C(void)
+bool8 LmanAcceptSlotFlagIsNotZero(void)
{
if (lman.acceptSlot_flag)
{
@@ -547,17 +616,17 @@ bool8 sub_800EF1C(void)
return FALSE;
}
-void sub_800EF38(void)
+void LinkRfu_StopManagerAndFinalizeSlots(void)
{
- Rfu.unk_04 = 4;
- Rfu.unk_ce7 = lman.acceptSlot_flag;
+ Rfu.state = 4;
+ Rfu.acceptSlot_flag = lman.acceptSlot_flag;
}
-bool32 sub_800EF58(bool32 a0)
+bool32 WaitRfuState(bool32 force)
{
- if (Rfu.unk_04 == 17 || a0)
+ if (Rfu.state == 17 || force)
{
- Rfu.unk_04 = 18;
+ Rfu.state = 18;
return TRUE;
}
return FALSE;
@@ -565,14 +634,14 @@ bool32 sub_800EF58(bool32 a0)
void sub_800EF7C(void)
{
- Rfu.unk_04 = 14;
+ Rfu.state = 14;
}
-void sub_800EF88(u8 a0)
+static void sub_800EF88(u8 a0)
{
u8 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
if (a0 & 1)
{
@@ -583,53 +652,51 @@ void sub_800EF88(u8 a0)
}
}
-void sub_800EFB0(void)
+static void sub_800EFB0(void)
{
s32 i, j;
for (i = 0; i < 5; i++)
{
- struct UnkRfuStruct_2 *ptr = &Rfu;
+ struct GFRfuManager *ptr = &Rfu;
for (j = 0; j < 7; j++)
{
- ptr->unk_c87[i][j][1] = gRecvCmds[i][j] >> 8;
- ptr->unk_c87[i][j][0] = gRecvCmds[i][j];
+ ptr->recvCmds[i][j][1] = gRecvCmds[i][j] >> 8;
+ ptr->recvCmds[i][j][0] = gRecvCmds[i][j];
}
}
CpuFill16(0, gRecvCmds, sizeof gRecvCmds);
}
-void sub_800F014(void)
+static void sub_800F014(void)
{
s32 i;
- for (i = 0; i < 7; i++)
+ for (i = 0; i < CMD_LENGTH - 1; i++)
{
gRecvCmds[0][i] = gSendCmd[i];
}
- for (i = 0; i < 7; i++)
+ for (i = 0; i < CMD_LENGTH - 1; i++)
{
gSendCmd[i] = 0;
}
}
-void sub_800F048(void)
+static void UpdateBackupQueue(void)
{
- if (Rfu.unk_c3c)
+ if (Rfu.linkRecovered)
{
- u8 r2 = sub_800DAC8(&Rfu.unk_c1c, Rfu.unk_4c);
- if (Rfu.unk_c1c.unk_1e == 0)
- {
- Rfu.unk_c3c = 0;
- }
- if (r2)
- {
+ bool8 backupEmpty = RfuBackupQueue_Dequeue(&Rfu.backupQueue, Rfu.unk_4c);
+
+ if (Rfu.backupQueue.count == 0)
+ Rfu.linkRecovered = FALSE;
+
+ if (backupEmpty)
return;
- }
}
- if (Rfu.unk_c3c == 0)
+ if (!Rfu.linkRecovered)
{
- sub_800D9DC(&Rfu.unk_9e8, Rfu.unk_4c);
- sub_800DA68(&Rfu.unk_c1c, Rfu.unk_4c);
+ RfuSendQueue_Dequeue(&Rfu.sendQueue, Rfu.unk_4c);
+ RfuBackupQueue_Enqueue(&Rfu.backupQueue, Rfu.unk_4c);
}
}
@@ -642,9 +709,9 @@ bool32 IsRfuRecvQueueEmpty(void)
{
return FALSE;
}
- for (i = 0; i < 5; i++)
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
{
- for (j = 0; j < 7; j++)
+ for (j = 0; j < CMD_LENGTH - 1; j++)
{
if (gRecvCmds[i][j] != 0)
{
@@ -655,53 +722,53 @@ bool32 IsRfuRecvQueueEmpty(void)
return TRUE;
}
-bool32 sub_800F0F8(void)
+static bool32 sub_800F0F8(void)
{
- if (Rfu.unk_04 < 20)
+ if (Rfu.state < 20)
{
rfu_REQ_recvData();
rfu_waitREQComplete();
- rfu_LMAN_REQ_sendData(0);
+ rfu_LMAN_REQ_sendData(FALSE);
}
else
{
- Rfu.unk_cdb = 0;
+ Rfu.unk_cdb = FALSE;
if ((Rfu.unk_ce2 & gRfuLinkStatus->connSlotFlag) == Rfu.unk_ce2 && (Rfu.unk_ce2 & gRfuLinkStatus->connSlotFlag))
{
if (!Rfu.unk_cdc)
{
if (Rfu.unk_ce3)
{
- sub_8011D6C(Rfu.unk_ce3);
+ RfuReqDisconnectSlot(Rfu.unk_ce3);
Rfu.unk_ce3 = 0;
if (Rfu.unk_ce4 == 1)
{
- sub_8011A64(2, 0x8000);
- sub_8011170(0x8000);
+ RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, 0x8000);
+ GetLinkmanErrorParams(0x8000);
return FALSE;
}
if (!lman.acceptSlot_flag)
{
- sub_800EDD4();
+ LinkRfu_Shutdown();
gReceivedRemoteLinkPlayers = 0;
return FALSE;
}
}
sub_800EFB0();
rfu_UNI_readySendData(Rfu.unk_cda);
- rfu_LMAN_REQ_sendData(1);
+ rfu_LMAN_REQ_sendData(TRUE);
}
else
{
rfu_REQ_PARENT_resumeRetransmitAndChange();
}
- Rfu.unk_0e = 1;
+ Rfu.unk_0e = TRUE;
}
}
return FALSE;
}
-bool32 sub_800F1E0(void)
+static bool32 sub_800F1E0(void)
{
u16 i;
u16 flags;
@@ -709,12 +776,12 @@ bool32 sub_800F1E0(void)
u16 j;
u8 retval;
- if (Rfu.unk_04 >= 20 && Rfu.unk_0e == 1)
+ if (Rfu.state >= 20 && Rfu.unk_0e == TRUE)
{
rfu_waitREQComplete();
- while (Rfu.unk_cdb == 0)
+ while (Rfu.unk_cdb == FALSE)
{
- if (Rfu.unk_ee != 0)
+ if (Rfu.errorState != 0)
{
return FALSE;
}
@@ -723,10 +790,10 @@ bool32 sub_800F1E0(void)
rfu_waitREQComplete();
if ((lman.parentAck_flag & Rfu.unk_ce2) == Rfu.unk_ce2)
{
- Rfu.unk_cdc = 0;
- gUnknown_02022B44.unk_06++;
+ Rfu.unk_cdc = FALSE;
+ sRfuDebug.unk_06++;
flags = lman.acceptSlot_flag;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
if (flags & 1)
{
@@ -735,14 +802,14 @@ bool32 sub_800F1E0(void)
if (Rfu.unk_cee[i] != 0xFF && (Rfu.unk_14[i][0] >> 5) != ((Rfu.unk_cee[i] + 1) & 7))
{
if (++Rfu.unk_cea[i] > 4)
- sub_8011170(0x8100);
+ GetLinkmanErrorParams(0x8100);
}
else
{
Rfu.unk_cee[i] = Rfu.unk_14[i][0] / 32;
Rfu.unk_cea[i] = 0;
Rfu.unk_14[i][0] &= 0x1f;
- r0 = Rfu.unk_cde[i];
+ r0 = Rfu.linkPlayerIdx[i];
for (j = 0; j < 7; j++)
{
gRecvCmds[r0][j] = (Rfu.unk_14[i][(j << 1) + 1] << 8) | Rfu.unk_14[i][(j << 1) + 0];
@@ -756,40 +823,40 @@ bool32 sub_800F1E0(void)
flags >>= 1;
}
sub_800F014();
- sub_800F86C(0);
- sub_8010528();
+ RfuHandleReceiveCommand(0);
+ CallRfuFunc();
if (Rfu.unk_ce5 && !Rfu.unk_cd9)
{
- gUnknown_02022B44.unk_0e = 0;
- rfu_clearSlot(3, Rfu.unk_cda);
- for (i = 0; i < 4; i++)
+ sRfuDebug.unk_0e = FALSE;
+ rfu_clearSlot(TYPE_UNI_SEND | TYPE_UNI_RECV, Rfu.unk_cda);
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
if ((Rfu.unk_ce5 >> i) & 1)
{
- rfu_setRecvBuffer(0x10, i, Rfu.unk_14[i], 14);
+ rfu_setRecvBuffer(TYPE_UNI, i, Rfu.unk_14[i], 14);
}
}
sub_800E88C(Rfu.unk_ce2, Rfu.unk_ce2 | Rfu.unk_ce5);
Rfu.unk_ce9 = Rfu.unk_ce5;
Rfu.unk_ce2 |= Rfu.unk_ce5;
Rfu.unk_ce5 = 0;
- rfu_UNI_setSendData(Rfu.unk_ce2, Rfu.unk_c87, 70);
+ rfu_UNI_setSendData(Rfu.unk_ce2, Rfu.recvCmds, 70);
Rfu.unk_cda = sub_800E87C(Rfu.unk_ce2);
- CreateTask(sub_8010AAC, 0);
+ CreateTask(Task_ExchangeLinkPlayers, 0);
}
}
else
{
- Rfu.unk_cdc = 1;
- Rfu.unk_0e = 0;
+ Rfu.unk_cdc = TRUE;
+ Rfu.unk_0e = FALSE;
}
- Rfu.unk_0e = 0;
+ Rfu.unk_0e = FALSE;
}
retval = Rfu.unk_cdc;
return gRfuLinkStatus->sendSlotUNIFlag ? retval & 1 : FALSE;
}
-void sub_800F498(u16 *a0, u8 *a1)
+static void sub_800F498(u16 *a0, u8 *a1)
{
s32 i;
@@ -810,15 +877,15 @@ void sub_800F498(u16 *a0, u8 *a1)
}
}
-bool32 sub_800F4F0(void)
+static bool32 RfuProcessEnqueuedRecvBlock(void)
{
u8 i;
u8 j;
u8 sp00[MAX_RFU_PLAYERS * (2 * (CMD_LENGTH - 1))];
u8 sp48[2 * (CMD_LENGTH - 1)];
- u8 switchval;
+ u8 status;
- sub_800D934(&Rfu.unk_124, sp00);
+ RfuRecvQueue_Dequeue(&Rfu.recvQueue, sp00);
for (i = 0; i < MAX_RFU_PLAYERS; i++)
{
for (j = 0; j < CMD_LENGTH - 1; j++)
@@ -826,21 +893,21 @@ bool32 sub_800F4F0(void)
gRecvCmds[i][j] = (sp00[i * 14 + (j << 1) + 1] << 8) | sp00[i * 14 + (j << 1) + 0];
}
}
- sub_800F86C(0);
+ RfuHandleReceiveCommand(0);
if (lman.childClockSlave_flag == 0 && Rfu.unk_ce4)
{
rfu_REQ_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag);
rfu_waitREQComplete();
- switchval = sub_8011A74();
- if (switchval != 1 && switchval != 6 && switchval != 9)
- sub_8011A64(2, 0x9000);
+ status = RfuGetStatus();
+ if (status != RFU_STATUS_FATAL_ERROR && status != RFU_STATUS_JOIN_GROUP_NO && status != RFU_STATUS_LEAVE_GROUP)
+ RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, 0x9000);
rfu_clearAllSlot();
gReceivedRemoteLinkPlayers = FALSE;
- Rfu.linkRfuCallback = NULL;
+ Rfu.callback = NULL;
if (Rfu.unk_ce4 == 1)
{
- sub_8011A64(2, 0x9000);
- sub_8011170(0x9000);
+ RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, 0x9000);
+ GetLinkmanErrorParams(0x9000);
}
lman.state = lman.next_state = 0;
Rfu.unk_ce4 = 0;
@@ -848,105 +915,105 @@ bool32 sub_800F4F0(void)
if (Rfu.unk_cd0)
{
Rfu.unk_cd0--;
- sub_8010528();
+ CallRfuFunc();
sub_800F498(gSendCmd, sp48);
- sub_800D888(&Rfu.unk_9e8, sp48);
+ RfuSendQueue_Enqueue(&Rfu.sendQueue, sp48);
for (i = 0; i < CMD_LENGTH - 1; i++)
gSendCmd[i] = 0;
}
return IsRfuRecvQueueEmpty();
}
-void sub_800F638(u8 unused, u32 flags)
+static void HandleSendFailure(u8 unused, u32 flags)
{
s32 i, j;
- const u8 *r10 = Rfu.unk_6c.unk_04;
- for (i = 0; i < Rfu.unk_6c.unk_02; i++)
+ const u8 *r10 = Rfu.sendBlock.payload;
+ for (i = 0; i < Rfu.sendBlock.count; i++)
{
if (!(flags & 1))
{
- gUnknown_03000D90[0] = (~0x76ff) | i;
+ sResendBlock16[0] = RFU_COMMAND_0x8900 | i;
for (j = 0; j < 7; j++)
{
- gUnknown_03000D90[j + 1] = (r10[12 * i + (j << 1) + 1] << 8) | r10[12 * i + (j << 1) + 0];
+ sResendBlock16[j + 1] = (r10[12 * i + (j << 1) + 1] << 8) | r10[12 * i + (j << 1) + 0];
}
for (j = 0; j < 7; j++)
{
- gUnknown_03000D80[2 * j + 1] = gUnknown_03000D90[j] >> 8;
- gUnknown_03000D80[2 * j + 0] = gUnknown_03000D90[j];
+ sResendBlock8[2 * j + 1] = sResendBlock16[j] >> 8;
+ sResendBlock8[2 * j + 0] = sResendBlock16[j];
j++;j--; // Needed to match;
}
- sub_800D888(&Rfu.unk_9e8, gUnknown_03000D80);
- Rfu.unk_6c.unk_0c |= (1 << i);
+ RfuSendQueue_Enqueue(&Rfu.sendQueue, sResendBlock8);
+ Rfu.sendBlock.failedFlags |= (1 << i);
}
flags >>= 1;
}
}
-void sub_800F6FC(u8 a0)
+void Rfu_SetBlockReceivedFlag(u8 linkPlayerId)
{
- if (Rfu.unk_0c == 1 && a0)
- Rfu.unk_61[a0] = 1;
+ if (Rfu.parentChild == MODE_PARENT && linkPlayerId)
+ Rfu.numBlocksReceived[linkPlayerId] = 1;
else
- Rfu.unk_5c[a0] = 1;
+ Rfu.blockReceived[linkPlayerId] = TRUE;
}
-void sub_800F728(u8 a0)
+void Rfu_ResetBlockReceivedFlag(u8 linkPlayerId)
{
- Rfu.unk_5c[a0] = 0;
- Rfu.unk_80[a0].unk_12 = 0;
+ Rfu.blockReceived[linkPlayerId] = FALSE;
+ Rfu.recvBlock[linkPlayerId].receiving = 0;
}
-u8 sub_800F74C(const u8 *a0)
+static u8 sub_800F74C(const u8 *a0)
{
u8 i;
- if (Rfu.unk_0c == 1)
+ if (Rfu.parentChild == MODE_PARENT)
return FALSE;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- Rfu.unk_cde[i] = a0[i];
+ Rfu.linkPlayerIdx[i] = a0[i];
}
- return a0[Rfu.unk_c3e];
+ return a0[Rfu.childSlot];
}
-void rfu_func_080F97B8(void)
+static void RfuFunc_SendKeysToRfu(void)
{
if (gReceivedRemoteLinkPlayers
&& gHeldKeyCodeToSend != LINK_KEY_CODE_NULL
&& gLinkTransferringData != TRUE)
{
- gUnknown_03000D78[0]++;
- gHeldKeyCodeToSend |= (gUnknown_03000D78[0] << 8);
- sub_800FD14(0xbe00);
+ sHeldKeyCount++;
+ gHeldKeyCodeToSend |= (sHeldKeyCount << 8);
+ RfuPrepareSendBuffer(RFU_COMMAND_0xBE00);
}
}
-struct GFtgtGname *sub_800F7DC(void)
+struct GFtgtGname *GetHostRFUtgtGname(void)
{
- return &gUnknown_02022B14;
+ return &gHostRFUtgtGnameBuffer;
}
bool32 IsSendingKeysToRfu(void)
{
- return Rfu.linkRfuCallback == rfu_func_080F97B8;
+ return Rfu.callback == RfuFunc_SendKeysToRfu;
}
-void sub_800F804(void)
+void StartSendingKeysToRfu(void)
{
- Rfu.linkRfuCallback = rfu_func_080F97B8;
+ Rfu.callback = RfuFunc_SendKeysToRfu;
}
void ClearLinkRfuCallback(void)
{
- Rfu.linkRfuCallback = NULL;
+ Rfu.callback = NULL;
}
void sub_800F820(void)
{
- sub_800FD14(0x4400);
+ RfuPrepareSendBuffer(RFU_COMMAND_0x4400);
if (GetMultiplayerId() == 0)
gSendCmd[6] = GetBlenderArrowPosition();
gUnknown_020223C0++;
@@ -954,11 +1021,11 @@ void sub_800F820(void)
void sub_800F850(void)
{
- if (Rfu.linkRfuCallback == NULL)
- Rfu.linkRfuCallback = sub_800F820;
+ if (Rfu.callback == NULL)
+ Rfu.callback = sub_800F820;
}
-void sub_800F86C(u8 unused)
+static void RfuHandleReceiveCommand(u8 unused)
{
u16 i;
u16 j;
@@ -967,58 +1034,58 @@ void sub_800F86C(u8 unused)
{
switch (gRecvCmds[i][0] & 0xff00)
{
- case 0x7800:
- if (Rfu.unk_0c == 0 && gReceivedRemoteLinkPlayers != 0)
+ case RFU_COMMAND_0x7800:
+ if (Rfu.parentChild == MODE_CHILD && gReceivedRemoteLinkPlayers)
return;
// fallthrough
- case 0x7700:
- if (gRfuLinkStatus->parentChild == 0)
+ case RFU_COMMAND_0x7700:
+ if (gRfuLinkStatus->parentChild == MODE_CHILD)
{
Rfu.playerCount = gRecvCmds[i][1];
- Rfu.unk_cce = sub_800F74C((u8 *)(gRecvCmds[i] + 2));
+ Rfu.multiplayerId = sub_800F74C((u8 *)(gRecvCmds[i] + 2));
}
break;
- case 0x8800:
- if (Rfu.unk_80[i].unk_12 == 0)
+ case RFU_COMMAND_0x8800:
+ if (Rfu.recvBlock[i].receiving == 0)
{
- Rfu.unk_80[i].unk_00 = 0;
- Rfu.unk_80[i].unk_02 = gRecvCmds[i][1];
- Rfu.unk_80[i].unk_11 = gRecvCmds[i][2];
- Rfu.unk_80[i].unk_08 = 0;
- Rfu.unk_80[i].unk_12 = 1;
- Rfu.unk_5c[i] = 0;
+ Rfu.recvBlock[i].next = 0;
+ Rfu.recvBlock[i].count = gRecvCmds[i][1];
+ Rfu.recvBlock[i].owner = gRecvCmds[i][2];
+ Rfu.recvBlock[i].receivedFlags = 0;
+ Rfu.recvBlock[i].receiving = 1;
+ Rfu.blockReceived[i] = FALSE;
}
break;
- case 0x8900:
- if (Rfu.unk_80[i].unk_12 == 1)
+ case RFU_COMMAND_0x8900:
+ if (Rfu.recvBlock[i].receiving == 1)
{
- Rfu.unk_80[i].unk_00 = gRecvCmds[i][0] & 0xff;
- Rfu.unk_80[i].unk_08 |= (1 << Rfu.unk_80[i].unk_00);
+ Rfu.recvBlock[i].next = gRecvCmds[i][0] & 0xff;
+ Rfu.recvBlock[i].receivedFlags |= (1 << Rfu.recvBlock[i].next);
for (j = 0; j < 6; j++)
- gBlockRecvBuffer[i][Rfu.unk_80[i].unk_00 * 6 + j] = gRecvCmds[i][j + 1];
- if (Rfu.unk_80[i].unk_08 == gUnknown_082ED628[Rfu.unk_80[i].unk_02])
+ gBlockRecvBuffer[i][Rfu.recvBlock[i].next * 6 + j] = gRecvCmds[i][j + 1];
+ if (Rfu.recvBlock[i].receivedFlags == sAllBlocksReceived[Rfu.recvBlock[i].count])
{
- Rfu.unk_80[i].unk_12 = 2;
- sub_800F6FC(i);
- if (sub_800F7DC()->activity == 0x45 && gReceivedRemoteLinkPlayers != 0 && Rfu.unk_0c == 0)
- sub_8010A70(gBlockRecvBuffer);
+ Rfu.recvBlock[i].receiving = 2;
+ Rfu_SetBlockReceivedFlag(i);
+ if (GetHostRFUtgtGname()->activity == (ACTIVITY_CHAT | IN_UNION_ROOM) && gReceivedRemoteLinkPlayers != 0 && Rfu.parentChild == MODE_CHILD)
+ ValidateAndReceivePokemonSioInfo(gBlockRecvBuffer);
}
}
break;
- case 0xa100:
- sub_800FE84(gUnknown_082ED6B8[gRecvCmds[i][1]].buffer, (u16)gUnknown_082ED6B8[gRecvCmds[i][1]].size);
+ case RFU_COMMAND_0xA100:
+ Rfu_InitBlockSend(sUnknown_082ED6B8[gRecvCmds[i][1]].buffer, (u16)sUnknown_082ED6B8[gRecvCmds[i][1]].size);
break;
- case 0x5f00:
+ case RFU_COMMAND_0x5F00:
Rfu.unk_e4[i] = 1;
break;
- case 0x6600:
+ case RFU_COMMAND_0x6600:
if (Rfu.unk_100 == gRecvCmds[i][1])
Rfu.unk_e9[i] = 1;
break;
- case 0xed00:
- if (Rfu.unk_0c == 0)
+ case RFU_COMMAND_0xED00:
+ if (Rfu.parentChild == MODE_CHILD)
{
- if (gReceivedRemoteLinkPlayers != 0)
+ if (gReceivedRemoteLinkPlayers)
{
if (gRecvCmds[i][1] & gRfuLinkStatus->connSlotFlag)
{
@@ -1027,86 +1094,86 @@ void sub_800F86C(u8 unused)
Rfu.unk_ce4 = gRecvCmds[i][2];
}
Rfu.playerCount = gRecvCmds[i][3];
- sub_80109E8(gRecvCmds[i][1]);
+ ClearSelectedLinkPlayerIds(gRecvCmds[i][1]);
}
}
else
{
- sub_800FD14(0xee00);
+ RfuPrepareSendBuffer(RFU_COMMAND_0xEE00);
gSendCmd[1] = gRecvCmds[i][1];
gSendCmd[2] = gRecvCmds[i][2];
gSendCmd[3] = gRecvCmds[i][3];
}
break;
- case 0xee00:
- if (Rfu.unk_0c == 1)
+ case RFU_COMMAND_0xEE00:
+ if (Rfu.parentChild == MODE_PARENT)
{
Rfu.unk_ce3 |= gRecvCmds[i][1];
Rfu.unk_ce4 = gRecvCmds[i][2];
- sub_80109E8(gRecvCmds[i][1]);
+ ClearSelectedLinkPlayerIds(gRecvCmds[i][1]);
}
break;
- case 0x4400:
- case 0xbe00:
+ case RFU_COMMAND_0x4400:
+ case RFU_COMMAND_0xBE00:
gLinkPartnersHeldKeys[i] = gRecvCmds[i][1];
break;
}
- if (Rfu.unk_0c == 1 && Rfu.unk_61[i])
+ if (Rfu.parentChild == MODE_PARENT && Rfu.numBlocksReceived[i])
{
- if (Rfu.unk_61[i] == 4)
+ if (Rfu.numBlocksReceived[i] == 4)
{
- Rfu.unk_5c[i] = 1;
- Rfu.unk_61[i] = 0;
+ Rfu.blockReceived[i] = TRUE;
+ Rfu.numBlocksReceived[i] = 0;
}
else
- Rfu.unk_61[i]++;
+ Rfu.numBlocksReceived[i]++;
}
}
}
-bool8 sub_800FC60(void)
+static bool8 AreNoPlayersReceiving(void)
{
s32 i;
- for (i = 0; i < 5; i++)
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
{
- if (Rfu.unk_80[i].unk_12)
+ if (Rfu.recvBlock[i].receiving)
return FALSE;
}
return TRUE;
}
-bool8 sub_800FC88(void)
+static bool8 sub_800FC88(void)
{
s32 i;
for (i = 0; i < Rfu.playerCount; i++)
{
- if (Rfu.unk_80[i].unk_12 != 2 || Rfu.unk_5c[i] != 1)
+ if (Rfu.recvBlock[i].receiving != 2 || Rfu.blockReceived[i] != TRUE)
return FALSE;
}
return TRUE;
}
-void sub_800FCC4(struct UnkRfuStruct_2_Sub_6c *data)
+static void ResetSendDataManager(struct RfuBlockSend *data)
{
- data->unk_00 = 0;
- data->unk_02 = 0;
- data->unk_04 = NULL;
- data->unk_08 = 0;
- data->unk_10 = 0;
- data->unk_11 = 0;
- data->unk_12 = 0;
+ data->next = 0;
+ data->count = 0;
+ data->payload = NULL;
+ data->receivedFlags = 0;
+ data->sending = FALSE;
+ data->owner = 0;
+ data->receiving = 0;
}
-u8 sub_800FCD8(void)
+u8 Rfu_GetBlockReceivedStatus(void)
{
u8 flags = 0;
s32 i;
- for (i = 0; i < 5; i++)
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
{
- if (Rfu.unk_80[i].unk_12 == 2 && Rfu.unk_5c[i] == 1)
+ if (Rfu.recvBlock[i].receiving == 2 && Rfu.blockReceived[i] == TRUE)
{
flags |= (1 << i);
}
@@ -1114,7 +1181,7 @@ u8 sub_800FCD8(void)
return flags;
}
-void sub_800FD14(u16 command)
+static void RfuPrepareSendBuffer(u16 command)
{
u8 i;
u8 *buff;
@@ -1123,175 +1190,175 @@ void sub_800FD14(u16 command)
gSendCmd[0] = command;
switch (command)
{
- case 0x8800:
- gSendCmd[1] = Rfu.unk_6c.unk_02;
- gSendCmd[2] = Rfu.unk_6c.unk_11 + 0x80;
+ case RFU_COMMAND_0x8800:
+ gSendCmd[1] = Rfu.sendBlock.count;
+ gSendCmd[2] = Rfu.sendBlock.owner + 0x80;
break;
- case 0xa100:
- if (sub_800FC60())
+ case RFU_COMMAND_0xA100:
+ if (AreNoPlayersReceiving())
gSendCmd[1] = Rfu.unk_5a;
break;
- case 0x7700:
- case 0x7800:
+ case RFU_COMMAND_0x7700:
+ case RFU_COMMAND_0x7800:
tmp = Rfu.unk_ce2 ^ Rfu.unk_ce3;
- Rfu.playerCount = gUnknown_082ED695[tmp] + 1;
+ Rfu.playerCount = sUnknown_082ED695[tmp] + 1;
gSendCmd[1] = Rfu.playerCount;
buff = (u8 *)(gSendCmd + 2);
- for (i = 0; i < 4; i++)
- buff[i] = Rfu.unk_cde[i];
+ for (i = 0; i < RFU_CHILD_MAX; i++)
+ buff[i] = Rfu.linkPlayerIdx[i];
break;
- case 0x6600:
- case 0x5f00:
+ case RFU_COMMAND_0x6600:
+ case RFU_COMMAND_0x5F00:
gSendCmd[1] = Rfu.unk_100;
break;
- case 0x4400:
+ case RFU_COMMAND_0x4400:
gSendCmd[0] = command;
gSendCmd[1] = gMain.heldKeys;
break;
- case 0x2f00:
+ case RFU_COMMAND_0x2F00:
for (i = 0; i < 6; i++)
gSendCmd[1 + i] = Rfu.unk_f2[i];
break;
- case 0xbe00:
+ case RFU_COMMAND_0xBE00:
gSendCmd[1] = gHeldKeyCodeToSend;
break;
- case 0xee00:
+ case RFU_COMMAND_0xEE00:
break;
- case 0xed00:
+ case RFU_COMMAND_0xED00:
break;
}
}
void sub_800FE50(void *a0)
{
- if (gSendCmd[0] == 0 && !sub_8011A80())
+ if (gSendCmd[0] == 0 && !RfuHasErrored())
{
memcpy(Rfu.unk_f2, a0, sizeof(Rfu.unk_f2));
- sub_800FD14(0x2f00);
+ RfuPrepareSendBuffer(RFU_COMMAND_0x2F00);
}
}
-bool32 sub_800FE84(const u8 *src, size_t size)
+bool32 Rfu_InitBlockSend(const u8 *src, size_t size)
{
bool8 r4;
- if (Rfu.linkRfuCallback != NULL)
+ if (Rfu.callback != NULL)
return FALSE;
if (gSendCmd[0] != 0)
return FALSE;
- if (Rfu.unk_6c.unk_10 != 0)
+ if (Rfu.sendBlock.sending)
{
- gUnknown_02022B44.unk_83++;
+ sRfuDebug.unk_83++;
return FALSE;
}
r4 = (size % 12) != 0;
- Rfu.unk_6c.unk_11 = GetMultiplayerId();
- Rfu.unk_6c.unk_10 = 1;
- Rfu.unk_6c.unk_02 = (size / 12) + r4;
- Rfu.unk_6c.unk_00 = 0;
+ Rfu.sendBlock.owner = GetMultiplayerId();
+ Rfu.sendBlock.sending = TRUE;
+ Rfu.sendBlock.count = (size / 12) + r4;
+ Rfu.sendBlock.next = 0;
if (size > 0x100)
- Rfu.unk_6c.unk_04 = src;
+ Rfu.sendBlock.payload = src;
else
{
if (src != gBlockSendBuffer)
memcpy(gBlockSendBuffer, src, size);
- Rfu.unk_6c.unk_04 = gBlockSendBuffer;
+ Rfu.sendBlock.payload = gBlockSendBuffer;
}
- sub_800FD14(0x8800);
- Rfu.linkRfuCallback = rfufunc_80F9F44;
+ RfuPrepareSendBuffer(RFU_COMMAND_0x8800);
+ Rfu.callback = HandleBlockSend;
Rfu.unk_5b = 0;
return TRUE;
}
-void rfufunc_80F9F44(void)
+static void HandleBlockSend(void)
{
if (gSendCmd[0] == 0)
{
- sub_800FD14(0x8800);
- if (Rfu.unk_0c == 1)
+ RfuPrepareSendBuffer(RFU_COMMAND_0x8800);
+ if (Rfu.parentChild == MODE_PARENT)
{
if (++Rfu.unk_5b > 2)
- Rfu.linkRfuCallback = sub_800FFB0;
+ Rfu.callback = SendNextBlock;
}
else
{
- if ((gRecvCmds[GetMultiplayerId()][0] & 0xff00) == 0x8800)
- Rfu.linkRfuCallback = sub_800FFB0;
+ if ((gRecvCmds[GetMultiplayerId()][0] & 0xff00) == RFU_COMMAND_0x8800)
+ Rfu.callback = SendNextBlock;
}
}
}
-void sub_800FFB0(void)
+static void SendNextBlock(void)
{
s32 i;
- const u8 *src = Rfu.unk_6c.unk_04;
- gSendCmd[0] = 0x8900 | Rfu.unk_6c.unk_00;
- for (i = 0; i < 7; i++)
- gSendCmd[i + 1] = (src[(i << 1) + Rfu.unk_6c.unk_00 * 12 + 1] << 8) | src[(i << 1) + Rfu.unk_6c.unk_00 * 12 + 0];
- Rfu.unk_6c.unk_00++;
- if (Rfu.unk_6c.unk_02 <= Rfu.unk_6c.unk_00)
+ const u8 *src = Rfu.sendBlock.payload;
+ gSendCmd[0] = RFU_COMMAND_0x8900 | Rfu.sendBlock.next;
+ for (i = 0; i < CMD_LENGTH - 1; i++)
+ gSendCmd[i + 1] = (src[(i << 1) + Rfu.sendBlock.next * 12 + 1] << 8) | src[(i << 1) + Rfu.sendBlock.next * 12 + 0];
+ Rfu.sendBlock.next++;
+ if (Rfu.sendBlock.count <= Rfu.sendBlock.next)
{
- Rfu.unk_6c.unk_10 = 0;
- Rfu.linkRfuCallback = rfufunc_80FA020;
+ Rfu.sendBlock.sending = FALSE;
+ Rfu.callback = SendLastBlock;
}
}
-void rfufunc_80FA020(void)
+static void SendLastBlock(void)
{
- const u8 *src = Rfu.unk_6c.unk_04;
+ const u8 *src = Rfu.sendBlock.payload;
u8 mpId = GetMultiplayerId();
s32 i;
- if (Rfu.unk_0c == 0)
+ if (Rfu.parentChild == MODE_CHILD)
{
- gSendCmd[0] = (~0x76ff) | (Rfu.unk_6c.unk_02 - 1);
- for (i = 0; i < 7; i++)
- gSendCmd[i + 1] = (src[(i << 1) + (Rfu.unk_6c.unk_02 - 1) * 12 + 1] << 8) | src[(i << 1) + (Rfu.unk_6c.unk_02 - 1) * 12 + 0];
- if ((u8)gRecvCmds[mpId][0] == Rfu.unk_6c.unk_02 - 1)
+ gSendCmd[0] = RFU_COMMAND_0x8900 | (Rfu.sendBlock.count - 1);
+ for (i = 0; i < CMD_LENGTH - 1; i++)
+ gSendCmd[i + 1] = (src[(i << 1) + (Rfu.sendBlock.count - 1) * 12 + 1] << 8) | src[(i << 1) + (Rfu.sendBlock.count - 1) * 12 + 0];
+ if ((u8)gRecvCmds[mpId][0] == Rfu.sendBlock.count - 1)
{
- if (Rfu.unk_80[mpId].unk_08 != gUnknown_082ED628[Rfu.unk_80[mpId].unk_02])
+ if (Rfu.recvBlock[mpId].receivedFlags != sAllBlocksReceived[Rfu.recvBlock[mpId].count])
{
- sub_800F638(mpId, Rfu.unk_80[mpId].unk_08);
- gUnknown_02022B44.unk_64++;
+ HandleSendFailure(mpId, Rfu.recvBlock[mpId].receivedFlags);
+ sRfuDebug.unk_64++;
}
else
- Rfu.linkRfuCallback = NULL;
+ Rfu.callback = NULL;
}
}
else
- Rfu.linkRfuCallback = NULL;
+ Rfu.callback = NULL;
}
-bool8 sub_8010100(u8 a0)
+bool8 sub_8010100(u8 blockRequestType)
{
- Rfu.unk_5a = a0;
- sub_800FD14(0xa100);
+ Rfu.unk_5a = blockRequestType;
+ RfuPrepareSendBuffer(RFU_COMMAND_0xA100);
return TRUE;
}
-void sub_801011C(void)
+static void sub_801011C(void)
{
rfu_clearAllSlot();
rfu_LMAN_powerDownRFU();
gReceivedRemoteLinkPlayers = 0;
- Rfu.unk_ef = 1;
- Rfu.linkRfuCallback = NULL;
+ Rfu.isShuttingDown = TRUE;
+ Rfu.callback = NULL;
}
-void sub_8010148(void)
+static void sub_8010148(void)
{
rfu_REQ_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag);
rfu_waitREQComplete();
sub_801011C();
}
-void sub_8010168(void)
+static void sub_8010168(void)
{
- if (Rfu.unk_0c == 0)
+ if (Rfu.parentChild == MODE_CHILD)
{
rfu_LMAN_requestChangeAgbClockMaster();
Rfu.unk_ce4 = 2;
}
else
- Rfu.linkRfuCallback = sub_8010148;
+ Rfu.callback = sub_8010148;
}
void LinkRfu_FatalError(void)
@@ -1301,7 +1368,7 @@ void LinkRfu_FatalError(void)
Rfu.unk_ce3 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag;
}
-void sub_80101CC(void)
+static void sub_80101CC(void)
{
s32 i;
u8 playerCount = Rfu.playerCount;
@@ -1315,31 +1382,31 @@ void sub_80101CC(void)
if (count == playerCount)
{
gBattleTypeFlags &= ~BATTLE_TYPE_20;
- if (Rfu.unk_0c == 0)
+ if (Rfu.parentChild == MODE_CHILD)
{
- Rfu.unk_ee = 3;
+ Rfu.errorState = 3;
sub_8010168();
}
else
- Rfu.linkRfuCallback = sub_8010168;
+ Rfu.callback = sub_8010168;
}
}
-void sub_801022C(void)
+static void sub_801022C(void)
{
if (gSendCmd[0] == 0 && Rfu.unk_ce8 == 0)
{
- sub_800FD14(0x5f00);
- Rfu.linkRfuCallback = sub_80101CC;
+ RfuPrepareSendBuffer(RFU_COMMAND_0x5F00);
+ Rfu.callback = sub_80101CC;
}
}
-void sub_8010264(u8 taskId)
+static void sub_8010264(u8 taskId)
{
- if (Rfu.linkRfuCallback == NULL)
+ if (Rfu.callback == NULL)
{
Rfu.unk_cd9 = 1;
- Rfu.linkRfuCallback = sub_801022C;
+ Rfu.callback = sub_801022C;
DestroyTask(taskId);
}
}
@@ -1350,18 +1417,17 @@ void task_add_05_task_del_08FA224_when_no_RfuFunc(void)
CreateTask(sub_8010264, 5);
}
-void sub_80102B8(void)
+static void sub_80102B8(void)
{
u8 playerCount;
u8 i;
if (GetMultiplayerId() != 0)
{
- u8 r4 = Rfu.unk_124.unk_8c2;
- if (r4 == 0 && Rfu.unk_fe > 0x3c)
+ if (Rfu.recvQueue.count == 0 && Rfu.unk_fe > 60)
{
- sub_800FD14(0x6600);
- Rfu.unk_fe = r4;
+ RfuPrepareSendBuffer(RFU_COMMAND_0x6600);
+ Rfu.unk_fe = 0;
}
}
playerCount = GetLinkPlayerCount();
@@ -1375,31 +1441,31 @@ void sub_80102B8(void)
for (i = 0; i < MAX_RFU_PLAYERS; i++)
Rfu.unk_e9[i] = 0;
Rfu.unk_100++;
- Rfu.linkRfuCallback = NULL;
+ Rfu.callback = NULL;
}
Rfu.unk_fe++;
}
-void sub_8010358(void)
+static void sub_8010358(void)
{
- if (Rfu.unk_124.unk_8c2 == 0 && gSendCmd[0] == 0)
+ if (Rfu.recvQueue.count == 0 && gSendCmd[0] == 0)
{
- sub_800FD14(0x6600);
- Rfu.linkRfuCallback = sub_80102B8;
+ RfuPrepareSendBuffer(RFU_COMMAND_0x6600);
+ Rfu.callback = sub_80102B8;
}
}
-void sub_8010390(void)
+static void sub_8010390(void)
{
u8 i;
u8 playerCount;
if (GetMultiplayerId() != 0)
{
- if (Rfu.unk_124.unk_8c2 == 0 && gSendCmd[0] == 0)
+ if (Rfu.recvQueue.count == 0 && gSendCmd[0] == 0)
{
- sub_800FD14(0x6600);
- Rfu.linkRfuCallback = sub_80102B8;
+ RfuPrepareSendBuffer(RFU_COMMAND_0x6600);
+ Rfu.callback = sub_80102B8;
}
}
else
@@ -1412,10 +1478,10 @@ void sub_8010390(void)
}
if (i == playerCount)
{
- if (Rfu.unk_124.unk_8c2 == 0 && gSendCmd[0] == 0)
+ if (Rfu.recvQueue.count == 0 && gSendCmd[0] == 0)
{
- sub_800FD14(0x6600);
- Rfu.linkRfuCallback = sub_8010358;
+ RfuPrepareSendBuffer(RFU_COMMAND_0x6600);
+ Rfu.callback = sub_8010358;
}
}
}
@@ -1423,19 +1489,19 @@ void sub_8010390(void)
void sub_8010434(void)
{
- if (Rfu.linkRfuCallback == NULL)
+ if (Rfu.callback == NULL)
{
- Rfu.linkRfuCallback = sub_8010390;
+ Rfu.callback = sub_8010390;
Rfu.unk_fe = 0;
}
}
-bool32 sub_8010454(u32 a0)
+bool32 IsRfuSerialNumberValid(u32 serialNo)
{
s32 i;
- for (i = 0; gUnknown_082ED6E0[i] != a0; i++)
+ for (i = 0; sAcceptedSerialNos[i] != serialNo; i++)
{
- if (gUnknown_082ED6E0[i] == 0xFFFF)
+ if (sAcceptedSerialNos[i] == 0xFFFF)
return FALSE;
}
return TRUE;
@@ -1445,7 +1511,7 @@ u8 sub_801048C(bool32 a0)
{
if (a0 == FALSE)
return rfu_LMAN_setLinkRecovery(0, 0);
- rfu_LMAN_setLinkRecovery(1, 0x258);
+ rfu_LMAN_setLinkRecovery(1, 600);
return 0;
}
@@ -1455,71 +1521,73 @@ void sub_80104B0(void)
rfu_LMAN_stopManager(FALSE);
}
-u8 rfu_get_multiplayer_id(void)
+u8 Rfu_GetMultiplayerId(void)
{
- if (Rfu.unk_0c == 1)
+ if (Rfu.parentChild == MODE_PARENT)
return 0;
- return Rfu.unk_cce;
+ return Rfu.multiplayerId;
}
-u8 sub_80104F4(void)
+u8 Rfu_GetLinkPlayerCount(void)
{
return Rfu.playerCount;
}
bool8 IsLinkRfuTaskFinished(void)
{
- if (Rfu.unk_f1 == 2)
+ if (Rfu.status == RFU_STATUS_CONNECTION_ERROR)
return FALSE;
- return Rfu.linkRfuCallback ? FALSE : TRUE;
+ return Rfu.callback ? FALSE : TRUE;
}
-void sub_8010528(void)
+static void CallRfuFunc(void)
{
- if (Rfu.linkRfuCallback)
- Rfu.linkRfuCallback();
+ if (Rfu.callback)
+ Rfu.callback();
}
-bool8 sub_8010540(void)
+static bool8 CheckForLeavingGroupMembers(void)
{
s32 i;
- bool8 retval = FALSE;
- for (i = 0; i < 4; i++)
+ bool8 memberLeft = FALSE;
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if (Rfu.unk_cd1[i] < 5 || Rfu.unk_cd1[i] > 6)
+ if (Rfu.partnerSendStatuses[i] < RFU_STATUS_JOIN_GROUP_OK
+ || Rfu.partnerSendStatuses[i] > RFU_STATUS_JOIN_GROUP_NO)
{
- if (gRfuSlotStatusNI[i]->recv.state == 0x46 || gRfuSlotStatusNI[i]->recv.state == 0x48)
+ if (gRfuSlotStatusNI[i]->recv.state == SLOT_STATE_RECV_SUCCESS
+ || gRfuSlotStatusNI[i]->recv.state == SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN)
{
- if (Rfu.unk_cd5[i] == 8)
+ if (Rfu.partnerRecvStatuses[i] == RFU_STATUS_LEAVE_GROUP_NOTICE)
{
- Rfu.unk_cd1[i] = 9;
- Rfu.unk_cd5[i] = 10;
- rfu_clearSlot(8, i);
- rfu_NI_setSendData(1 << i, 8, Rfu.unk_cd1 + i, 1);
- retval = TRUE;
+ Rfu.partnerSendStatuses[i] = RFU_STATUS_LEAVE_GROUP;
+ Rfu.partnerRecvStatuses[i] = RFU_STATUS_10;
+ rfu_clearSlot(TYPE_NI_RECV, i);
+ rfu_NI_setSendData(1 << i, 8, &Rfu.partnerSendStatuses[i], 1);
+ memberLeft = TRUE;
}
}
- else if (gRfuSlotStatusNI[Rfu.unk_c3e]->recv.state == 0x47)
- rfu_clearSlot(8, i);
+ else if (gRfuSlotStatusNI[Rfu.childSlot]->recv.state == SLOT_STATE_RECV_FAILED)
+ rfu_clearSlot(TYPE_NI_RECV, i);
{
}
}
}
- return retval;
+ return memberLeft;
}
bool32 sub_80105EC(void)
{
u8 flags = 0;
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if (Rfu.unk_cd5[i] == 11)
+ if (Rfu.partnerRecvStatuses[i] == RFU_STATUS_11)
{
flags |= (1 << i);
- Rfu.unk_cd5[i] = 0;
+ Rfu.partnerRecvStatuses[i] = RFU_STATUS_OK;
}
}
if (flags)
@@ -1527,335 +1595,339 @@ bool32 sub_80105EC(void)
rfu_REQ_disconnect(flags);
rfu_waitREQComplete();
}
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if (Rfu.unk_cd5[i] == 10 || Rfu.unk_cd5[i] == 11)
+ if (Rfu.partnerRecvStatuses[i] == RFU_STATUS_10
+ || Rfu.partnerRecvStatuses[i] == RFU_STATUS_11)
return TRUE;
}
return FALSE;
}
-bool32 sub_801064C(u16 a0, const u8 *a1)
+bool32 HasTrainerLeftPartnersList(u16 trainerId, const u8 *name)
{
- u8 r1 = sub_8011CE4(a1, a0);
- if (r1 == 0xFF)
+ u8 idx = GetPartnerIndexByNameAndTrainerID(name, trainerId);
+ if (idx == 0xFF)
return TRUE;
- if (Rfu.unk_cd1[r1] == 9)
+ if (Rfu.partnerSendStatuses[idx] == RFU_STATUS_LEAVE_GROUP)
return TRUE;
return FALSE;
}
-void sub_8010688(u8 a0, u16 a1, const u8 *a2)
+void SendRfuStatusToPartner(u8 status, u16 trainerId, const u8 *name)
{
- u8 r4 = sub_8011CE4(a2, a1);
- Rfu.unk_cd1[r4] = a0;
- rfu_clearSlot(4, r4);
- rfu_NI_setSendData(1 << r4, 8, Rfu.unk_cd1 + r4, 1);
+ u8 idx = GetPartnerIndexByNameAndTrainerID(name, trainerId);
+ Rfu.partnerSendStatuses[idx] = status;
+ rfu_clearSlot(TYPE_NI_SEND, idx);
+ rfu_NI_setSendData(1 << idx, 8, &Rfu.partnerSendStatuses[idx], 1);
}
-void sub_80106D4(void)
+void SendLeaveGroupNotice(void)
{
- Rfu.unk_c85 = 8;
- rfu_clearSlot(4, Rfu.unk_c3e);
- rfu_NI_setSendData(1 << Rfu.unk_c3e, 8, &Rfu.unk_c85, 1);
+ Rfu.unk_c85 = RFU_STATUS_LEAVE_GROUP_NOTICE;
+ rfu_clearSlot(TYPE_NI_SEND, Rfu.childSlot);
+ rfu_NI_setSendData(1 << Rfu.childSlot, 8, &Rfu.unk_c85, 1);
}
-u32 sub_8010714(u16 a0, const u8 *a1)
+u32 WaitSendRfuStatusToPartner(u16 trainerId, const u8 *name)
{
- u8 r0 = sub_8011CE4(a1, a0);
- if (r0 == 0xFF)
+ u8 idx = GetPartnerIndexByNameAndTrainerID(name, trainerId);
+ if (idx == 0xFF)
return 2;
- if (gRfuSlotStatusNI[r0]->send.state == 0)
+ if (gRfuSlotStatusNI[idx]->send.state == 0)
return 1;
return 0;
}
-void sub_8010750(void)
+static void UpdateChildStatuses(void)
{
s32 i;
- sub_8010540();
- for (i = 0; i < 4; i++)
+ CheckForLeavingGroupMembers();
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if (gRfuSlotStatusNI[i]->send.state == 0x26 || gRfuSlotStatusNI[i]->send.state == 0x27)
+ if (gRfuSlotStatusNI[i]->send.state == SLOT_STATE_SEND_SUCCESS
+ || gRfuSlotStatusNI[i]->send.state == SLOT_STATE_SEND_FAILED)
{
- if (Rfu.unk_cd5[i] == 10)
- Rfu.unk_cd5[i] = 11;
- rfu_clearSlot(4, i);
+ if (Rfu.partnerRecvStatuses[i] == RFU_STATUS_10)
+ Rfu.partnerRecvStatuses[i] = RFU_STATUS_11;
+ rfu_clearSlot(TYPE_NI_SEND, i);
}
}
}
-s32 sub_80107A0(void)
+static s32 sub_80107A0(void)
{
- s32 retval = 0;
+ s32 status = RFU_STATUS_OK;
if (Rfu.unk_c85 == 8)
{
- if (gRfuSlotStatusNI[Rfu.unk_c3e]->send.state == 0x26 || gRfuSlotStatusNI[Rfu.unk_c3e]->send.state == 0x27)
- rfu_clearSlot(4, Rfu.unk_c3e);
+ if (gRfuSlotStatusNI[Rfu.childSlot]->send.state == SLOT_STATE_SEND_SUCCESS
+ || gRfuSlotStatusNI[Rfu.childSlot]->send.state == SLOT_STATE_SEND_FAILED)
+ rfu_clearSlot(TYPE_NI_SEND, Rfu.childSlot);
}
- if (gRfuSlotStatusNI[Rfu.unk_c3e]->recv.state == 0x46 || gRfuSlotStatusNI[Rfu.unk_c3e]->recv.state == 0x48)
+ if (gRfuSlotStatusNI[Rfu.childSlot]->recv.state == SLOT_STATE_RECV_SUCCESS
+ || gRfuSlotStatusNI[Rfu.childSlot]->recv.state == SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN)
{
- rfu_clearSlot(8, Rfu.unk_c3e);
- sub_8011A64(Rfu.unk_c86, 0);
- retval = Rfu.unk_c86;
+ rfu_clearSlot(TYPE_NI_RECV, Rfu.childSlot);
+ RfuSetStatus(Rfu.recvStatus, 0);
+ status = Rfu.recvStatus;
}
- else if (gRfuSlotStatusNI[Rfu.unk_c3e]->recv.state == 0x47)
+ else if (gRfuSlotStatusNI[Rfu.childSlot]->recv.state == SLOT_STATE_RECV_FAILED)
{
- rfu_clearSlot(8, Rfu.unk_c3e);
- retval = 6;
+ rfu_clearSlot(TYPE_NI_RECV, Rfu.childSlot);
+ status = RFU_STATUS_JOIN_GROUP_NO;
}
- return retval;
+ return status;
}
-void sub_801084C(u8 taskId)
+static void sub_801084C(u8 taskId)
{
s32 i;
- if (Rfu.unk_f1 == 1 || Rfu.unk_f1 == 2)
+ if (Rfu.status == RFU_STATUS_FATAL_ERROR || Rfu.status == RFU_STATUS_CONNECTION_ERROR)
{
Rfu.unk_ce8 = 0;
DestroyTask(taskId);
}
switch (gTasks[taskId].data[0])
{
- case 0:
- if (sub_800FC60())
- {
- ResetBlockReceivedFlags();
- sub_800B348();
- gTasks[taskId].data[0]++;
- }
- break;
- case 1:
- if (Rfu.unk_0c == 1)
- {
- if (gReceivedRemoteLinkPlayers)
- sub_800FD14(0x7800);
- else
- sub_800FD14(0x7700);
- gTasks[taskId].data[0] = 101;
- }
+ case 0:
+ if (AreNoPlayersReceiving())
+ {
+ ResetBlockReceivedFlags();
+ sub_800B348();
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 1:
+ if (Rfu.parentChild == MODE_PARENT)
+ {
+ if (gReceivedRemoteLinkPlayers)
+ RfuPrepareSendBuffer(RFU_COMMAND_0x7800);
else
- gTasks[taskId].data[0] = 2;
- break;
- case 101:
- if (gSendCmd[0] == 0)
- gTasks[taskId].data[0] = 2;
- break;
- case 2:
- if (Rfu.playerCount)
- gTasks[taskId].data[0]++;
- break;
- case 3:
- if (Rfu.unk_0c == 1)
+ RfuPrepareSendBuffer(RFU_COMMAND_0x7700);
+ gTasks[taskId].data[0] = 101;
+ }
+ else
+ gTasks[taskId].data[0] = 2;
+ break;
+ case 101:
+ if (gSendCmd[0] == 0)
+ gTasks[taskId].data[0] = 2;
+ break;
+ case 2:
+ if (Rfu.playerCount)
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ if (Rfu.parentChild == MODE_PARENT)
+ {
+ if (AreNoPlayersReceiving())
{
- if (sub_800FC60())
- {
- Rfu.unk_5a = 0;
- sub_800FD14(0xa100);
- gTasks[taskId].data[0]++;
- }
- }
- else
+ Rfu.unk_5a = 0;
+ RfuPrepareSendBuffer(RFU_COMMAND_0xA100);
gTasks[taskId].data[0]++;
- break;
- case 4:
- if (sub_800FC88())
- gTasks[taskId].data[0]++;
- break;
- case 5:
- for (i = 0; i < Rfu.playerCount; i++)
- {
- sub_800B3A4(i);
- sub_800F728(i);
}
+ }
+ else
gTasks[taskId].data[0]++;
- break;
- case 6:
- DestroyTask(taskId);
- gReceivedRemoteLinkPlayers = 1;
- Rfu.unk_ce8 = 0;
- rfu_LMAN_setLinkRecovery(1, 0x258);
- if (Rfu.unk_ce6)
+ break;
+ case 4:
+ if (sub_800FC88())
+ gTasks[taskId].data[0]++;
+ break;
+ case 5:
+ for (i = 0; i < Rfu.playerCount; i++)
+ {
+ LinkPlayerFromBlock(i);
+ Rfu_ResetBlockReceivedFlag(i);
+ }
+ gTasks[taskId].data[0]++;
+ break;
+ case 6:
+ DestroyTask(taskId);
+ gReceivedRemoteLinkPlayers = TRUE;
+ Rfu.unk_ce8 = FALSE;
+ rfu_LMAN_setLinkRecovery(1, 600);
+ if (Rfu.unk_ce6)
+ {
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- for (i = 0; i < 4; i++)
+ if ((Rfu.unk_ce6 >> i) & 1)
{
- if ((Rfu.unk_ce6 >> i) & 1)
- {
- Rfu.unk_ce5 = 1 << i;
- Rfu.unk_ce6 ^= (1 << i);
- }
+ Rfu.unk_ce5 = 1 << i;
+ Rfu.unk_ce6 ^= (1 << i);
}
}
- break;
+ }
+ break;
}
}
-void sub_80109E8(u16 a0)
+static void ClearSelectedLinkPlayerIds(u16 selected)
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if ((a0 >> i) & 1)
- Rfu.unk_cde[i] = 0;
+ if ((selected >> i) & 1)
+ Rfu.linkPlayerIdx[i] = 0;
}
}
-void sub_8010A14(const struct UnkRfuStruct_8010A14 *a0)
+static void ReceiveRfuLinkPlayers(const struct SioInfo *sioInfo)
{
s32 i;
- Rfu.playerCount = a0->unk_0f;
- for (i = 0; i < 4; i++)
- Rfu.unk_cde[i] = a0->unk_10[i];
+ Rfu.playerCount = sioInfo->playerCount;
+ for (i = 0; i < RFU_CHILD_MAX; i++)
+ Rfu.linkPlayerIdx[i] = sioInfo->linkPlayerIdx[i];
for (i = 0; i < MAX_RFU_PLAYERS; i++)
{
- gLinkPlayers[i] = a0->unk_14[i];
+ gLinkPlayers[i] = sioInfo->linkPlayers[i];
sub_800B524(gLinkPlayers + i);
}
}
-void sub_8010A70(void *a0)
+static void ValidateAndReceivePokemonSioInfo(void *recvBuffer)
{
- if (strcmp(gUnknown_082ED7EC, a0) == 0)
+ if (strcmp(sASCII_PokemonSioInfo, recvBuffer) == 0)
{
- sub_8010A14(a0);
- CpuFill16(0, a0, sizeof(struct UnkRfuStruct_8010A14));
+ ReceiveRfuLinkPlayers(recvBuffer);
+ CpuFill16(0, recvBuffer, sizeof(struct SioInfo));
ResetBlockReceivedFlag(0);
}
}
-void sub_8010AAC(u8 taskId)
+static void Task_ExchangeLinkPlayers(u8 taskId)
{
s32 i;
struct LinkPlayerBlock *r2;
- struct UnkRfuStruct_8010A14 *r5;
- u8 r4 = Rfu.unk_cde[gUnknown_082ED68C[Rfu.unk_ce9]];
- if (Rfu.unk_f1 == 1 || Rfu.unk_f1 == 2)
+ struct SioInfo *r5;
+ u8 r4 = Rfu.linkPlayerIdx[sUnknown_082ED68C[Rfu.unk_ce9]];
+ if (Rfu.status == RFU_STATUS_FATAL_ERROR || Rfu.status == RFU_STATUS_CONNECTION_ERROR)
{
Rfu.unk_ce8 = 0;
DestroyTask(taskId);
}
switch (gTasks[taskId].data[0])
{
- case 0:
- if (gSendCmd[0] == 0)
- {
- ResetBlockReceivedFlag(r4);
- sub_800FD14(0x7800);
- gTasks[taskId].data[0]++;
- }
- break;
- case 1:
- if (gSendCmd[0] == 0)
- gTasks[taskId].data[0]++;
- break;
- case 2:
- if ((GetBlockReceivedStatus() >> r4) & 1)
- {
- ResetBlockReceivedFlag(r4);
- r2 = (struct LinkPlayerBlock *)gBlockRecvBuffer[r4];
- gLinkPlayers[r4] = r2->linkPlayer;
- sub_800B524(gLinkPlayers + r4);
- gTasks[taskId].data[0]++;
- }
- break;
- case 3:
- r5 = (struct UnkRfuStruct_8010A14 *)gBlockSendBuffer;
- memcpy(r5->unk_00, gUnknown_082ED7EC, sizeof gUnknown_082ED7EC);
- r5->unk_0f = Rfu.playerCount;
- for (i = 0; i < 4; i++)
- r5->unk_10[i] = Rfu.unk_cde[i];
- memcpy(r5->unk_14, gLinkPlayers, sizeof gLinkPlayers);
+ case 0:
+ if (gSendCmd[0] == 0)
+ {
+ ResetBlockReceivedFlag(r4);
+ RfuPrepareSendBuffer(RFU_COMMAND_0x7800);
gTasks[taskId].data[0]++;
- // fallthrough
- case 4:
- r5 = (struct UnkRfuStruct_8010A14 *)gBlockSendBuffer;
- r5->unk_0f = Rfu.playerCount;
- for (i = 0; i < 4; i++)
- r5->unk_10[i] = Rfu.unk_cde[i];
- memcpy(r5->unk_14, gLinkPlayers, sizeof gLinkPlayers);
- if (SendBlock(0, gBlockSendBuffer, 0xa0))
- gTasks[taskId].data[0]++;
- break;
- case 5:
- if (IsLinkTaskFinished() && GetBlockReceivedStatus() & 1)
+ }
+ break;
+ case 1:
+ if (gSendCmd[0] == 0)
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ if ((GetBlockReceivedStatus() >> r4) & 1)
+ {
+ ResetBlockReceivedFlag(r4);
+ r2 = (struct LinkPlayerBlock *)gBlockRecvBuffer[r4];
+ gLinkPlayers[r4] = r2->linkPlayer;
+ sub_800B524(gLinkPlayers + r4);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 3:
+ r5 = (struct SioInfo *)gBlockSendBuffer;
+ memcpy(r5->magic, sASCII_PokemonSioInfo, sizeof sASCII_PokemonSioInfo);
+ r5->playerCount = Rfu.playerCount;
+ for (i = 0; i < RFU_CHILD_MAX; i++)
+ r5->linkPlayerIdx[i] = Rfu.linkPlayerIdx[i];
+ memcpy(r5->linkPlayers, gLinkPlayers, sizeof gLinkPlayers);
+ gTasks[taskId].data[0]++;
+ // fallthrough
+ case 4:
+ r5 = (struct SioInfo *)gBlockSendBuffer;
+ r5->playerCount = Rfu.playerCount;
+ for (i = 0; i < RFU_CHILD_MAX; i++)
+ r5->linkPlayerIdx[i] = Rfu.linkPlayerIdx[i];
+ memcpy(r5->linkPlayers, gLinkPlayers, sizeof gLinkPlayers);
+ if (SendBlock(0, gBlockSendBuffer, 0xa0))
+ gTasks[taskId].data[0]++;
+ break;
+ case 5:
+ if (IsLinkTaskFinished() && GetBlockReceivedStatus() & 1)
+ {
+ CpuFill16(0, gBlockRecvBuffer, sizeof(struct SioInfo));
+ ResetBlockReceivedFlag(0);
+ Rfu.unk_ce8 = 0;
+ if (Rfu.unk_ce6)
{
- CpuFill16(0, gBlockRecvBuffer, sizeof(struct UnkRfuStruct_8010A14));
- ResetBlockReceivedFlag(0);
- Rfu.unk_ce8 = 0;
- if (Rfu.unk_ce6)
+ for (i = 0; i < 4; i++)
{
- for (i = 0; i < 4; i++)
+ if ((Rfu.unk_ce6 >> i) & 1)
{
- if ((Rfu.unk_ce6 >> i) & 1)
- {
- Rfu.unk_ce5 = 1 << i;
- Rfu.unk_ce6 ^= (1 << i);
- Rfu.unk_ce8 = 1;
- break;
- }
+ Rfu.unk_ce5 = 1 << i;
+ Rfu.unk_ce6 ^= (1 << i);
+ Rfu.unk_ce8 = 1;
+ break;
}
}
- DestroyTask(taskId);
}
- break;
+ DestroyTask(taskId);
+ }
+ break;
}
}
-void sub_8010D0C(u8 taskId)
+static void sub_8010D0C(u8 taskId)
{
- if (Rfu.unk_f1 == 1 || Rfu.unk_f1 == 2)
+ if (Rfu.status == RFU_STATUS_FATAL_ERROR || Rfu.status == RFU_STATUS_CONNECTION_ERROR)
DestroyTask(taskId);
switch (gTasks[taskId].data[0])
{
- case 0:
- if (Rfu.playerCount)
- {
- sub_800B348();
- SendBlock(0, gBlockSendBuffer, sizeof(struct LinkPlayerBlock));
- gTasks[taskId].data[0]++;
- }
- break;
- case 1:
- if (IsLinkTaskFinished())
- gTasks[taskId].data[0]++;
- break;
- case 2:
- if (GetBlockReceivedStatus() & 1)
- {
- sub_8010A14((const struct UnkRfuStruct_8010A14 *)gBlockRecvBuffer);
- ResetBlockReceivedFlag(0);
- gReceivedRemoteLinkPlayers = 1;
- DestroyTask(taskId);
- }
- break;
+ case 0:
+ if (Rfu.playerCount)
+ {
+ sub_800B348();
+ SendBlock(0, gBlockSendBuffer, sizeof(struct LinkPlayerBlock));
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 1:
+ if (IsLinkTaskFinished())
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ if (GetBlockReceivedStatus() & 1)
+ {
+ ReceiveRfuLinkPlayers((const struct SioInfo *)gBlockRecvBuffer);
+ ResetBlockReceivedFlag(0);
+ gReceivedRemoteLinkPlayers = 1;
+ DestroyTask(taskId);
+ }
+ break;
}
}
-void sub_8010DB4(void)
+static void RfuCheckErrorStatus(void)
{
- if (Rfu.unk_ee == 1 && lman.childClockSlave_flag == 0)
+ if (Rfu.errorState == 1 && lman.childClockSlave_flag == 0)
{
if (gMain.callback2 == c2_mystery_gift_e_reader_run || lman.init_param->mboot_flag)
gWirelessCommType = 2;
SetMainCallback2(CB2_LinkError);
gMain.savedCallback = CB2_LinkError;
- sub_800AF18((Rfu.unk_0a << 16) | (Rfu.unk_10 << 8) | Rfu.unk_12, Rfu.unk_124.unk_8c2, Rfu.unk_9e8.unk_232, sub_8011A74() == 2);
- Rfu.unk_ee = 2;
+ BufferLinkErrorInfo((Rfu.linkmanMsg << 16) | (Rfu.unk_10 << 8) | Rfu.unk_12, Rfu.recvQueue.count, Rfu.sendQueue.count, RfuGetStatus() == RFU_STATUS_CONNECTION_ERROR);
+ Rfu.errorState = 2;
CloseLink();
}
- else if (Rfu.unk_9e8.unk_233 == 1 || Rfu.unk_124.unk_8c3 == 1)
+ else if (Rfu.sendQueue.full == TRUE || Rfu.recvQueue.full == TRUE)
{
if (lman.childClockSlave_flag)
rfu_LMAN_requestChangeAgbClockMaster();
- sub_8011A64(1, 0x7000);
- sub_8011170(0x7000);
+ RfuSetStatus(RFU_STATUS_FATAL_ERROR, 0x7000);
+ GetLinkmanErrorParams(0x7000);
}
}
-void rfu_REQ_recvData_then_sendData(void)
+static void rfu_REQ_recvData_then_sendData(void)
{
if (lman.parent_child == 1)
{
@@ -1868,21 +1940,21 @@ void rfu_REQ_recvData_then_sendData(void)
bool32 sub_8010EC0(void)
{
bool32 retval = FALSE;
- Rfu.unk_ccd = 0;
+ Rfu.parentId = 0;
rfu_LMAN_manager_entity(Random2());
- if (Rfu.unk_ef == 0)
+ if (!Rfu.isShuttingDown)
{
- switch (Rfu.unk_0c)
+ switch (Rfu.parentChild)
{
- case 1:
- sub_800F0F8();
- break;
- case 0:
- retval = sub_800F4F0();
- break;
- case 2:
- rfu_REQ_recvData_then_sendData();
- break;
+ case MODE_PARENT:
+ sub_800F0F8();
+ break;
+ case MODE_CHILD:
+ retval = RfuProcessEnqueuedRecvBlock();
+ break;
+ case 2:
+ rfu_REQ_recvData_then_sendData();
+ break;
}
}
return retval;
@@ -1891,42 +1963,42 @@ bool32 sub_8010EC0(void)
bool32 sub_8010F1C(void)
{
bool32 retval = FALSE;
- if (Rfu.unk_ef == 0)
+ if (!Rfu.isShuttingDown)
{
- if (Rfu.unk_0c == 1)
+ if (Rfu.parentChild == MODE_PARENT)
retval = sub_800F1E0();
- sub_8010DB4();
+ RfuCheckErrorStatus();
}
return retval;
}
-void sub_8010F48(void)
+static void CopyPlayerNameToUnameBuffer(void)
{
- StringCopy(gUnknown_02022B22, gSaveBlock2Ptr->playerName);
+ StringCopy(gHostRFUtgtUnameBuffer, gSaveBlock2Ptr->playerName);
}
-void sub_8010F60(void)
+void ClearAndInitHostRFUtgtGname(void)
{
- memset(&gUnknown_02022B14, 0, 0xD);
- sub_800DD94(&gUnknown_02022B14, 0, 0, 0);
+ memset(&gHostRFUtgtGnameBuffer, 0, RFU_GAME_NAME_LENGTH);
+ InitHostRFUtgtGname(&gHostRFUtgtGnameBuffer, ACTIVITY_NONE, FALSE, 0);
}
-void sub_8010F84(u8 a0, u32 a1, u32 a2)
+void SetHostRFUtgtGname(u8 activity, u32 child_sprite_genders, bool32 started)
{
- sub_800DD94(&gUnknown_02022B14, a0, a2, a1);
+ InitHostRFUtgtGname(&gHostRFUtgtGnameBuffer, activity, started, child_sprite_genders);
}
-void sub_8010FA0(bool32 a0, bool32 a1)
+void SetGnameBufferWonderFlags(bool32 hasNews, bool32 hasCard)
{
- gUnknown_02022B14.unk_00.hasNews = a0;
- gUnknown_02022B14.unk_00.hasCard = a1;
+ gHostRFUtgtGnameBuffer.unk_00.hasNews = hasNews;
+ gHostRFUtgtGnameBuffer.unk_00.hasCard = hasCard;
}
-void sub_8010FCC(u32 type, u32 species, u32 level)
+void SetTradeBoardRegisteredMonInfo(u32 type, u32 species, u32 level)
{
- gUnknown_02022B14.type = type;
- gUnknown_02022B14.species = species;
- gUnknown_02022B14.level = level;
+ gHostRFUtgtGnameBuffer.type = type;
+ gHostRFUtgtGnameBuffer.species = species;
+ gHostRFUtgtGnameBuffer.level = level;
}
u8 sub_801100C(s32 a0)
@@ -1939,244 +2011,252 @@ u8 sub_801100C(s32 a0)
void sub_801103C(void)
{
- struct GFtgtGname *r5 = &gUnknown_02022B14;
+ struct GFtgtGname *r5 = &gHostRFUtgtGnameBuffer;
s32 i;
for (i = 1; i < GetLinkPlayerCount(); i++)
r5->child_sprite_gender[i - 1] = sub_801100C(i);
}
-void sub_8011068(u8 a0)
+void UpdateGameData_GroupLockedIn(bool8 started)
{
- gUnknown_02022B14.started = a0;
- rfu_REQ_configGameData(0, 2, (const u8 *)&gUnknown_02022B14, gUnknown_02022B22);
+ gHostRFUtgtGnameBuffer.started = started;
+ rfu_REQ_configGameData(0, 2, (void *)&gHostRFUtgtGnameBuffer, gHostRFUtgtUnameBuffer);
}
-void sub_8011090(u8 a0, u32 a1, u32 a2)
+void UpdateGameData_SetActivity(u8 activity, u32 flags, bool32 started)
{
- if (a0)
- sub_8010F84(a0, a1, a2);
- rfu_REQ_configGameData(0, 2, (const u8 *)&gUnknown_02022B14, gUnknown_02022B22);
+ if (activity != ACTIVITY_NONE)
+ SetHostRFUtgtGname(activity, flags, started);
+ rfu_REQ_configGameData(0, 2, (void *)&gHostRFUtgtGnameBuffer, gHostRFUtgtUnameBuffer);
}
void sub_80110B8(u32 a0)
{
s32 i;
- u32 r5;
- u32 r7;
+ u32 numConnectedChildren;
+ u32 child_sprite_genders;
s32 r8;
- if (sub_800F7DC()->activity == 0x45)
+ if (GetHostRFUtgtGname()->activity == (ACTIVITY_CHAT | IN_UNION_ROOM))
{
- r5 = 0;
- r7 = 0;
+ numConnectedChildren = 0;
+ child_sprite_genders = 0;
r8 = Rfu.unk_ce2 ^ Rfu.unk_ce3;
for (i = 0; i < 4; i++)
{
if ((r8 >> i) & 1)
{
- r7 |= ((0x80 | ((gLinkPlayers[Rfu.unk_cde[i]].gender & 1) << 3) | (gLinkPlayers[Rfu.unk_cde[i]].trainerId & 7)) << (r5 << 3));
- r5++;
- if (r5 == a0 - 1)
+ child_sprite_genders |= ((0x80 | ((gLinkPlayers[Rfu.linkPlayerIdx[i]].gender & 1) << 3) | (gLinkPlayers[Rfu.linkPlayerIdx[i]].trainerId & 7)) << (numConnectedChildren << 3));
+ numConnectedChildren++;
+ if (numConnectedChildren == a0 - 1)
break;
}
}
- sub_8011090(0x45, r7, 0);
+ UpdateGameData_SetActivity((ACTIVITY_CHAT | IN_UNION_ROOM), child_sprite_genders, FALSE);
}
}
-void sub_8011170(u32 a0)
+void GetLinkmanErrorParams(u32 msg)
{
- if (Rfu.unk_ee == 0)
+ if (Rfu.errorState == 0)
{
Rfu.unk_10 = lman.param[0];
Rfu.unk_12 = lman.param[1];
- Rfu.unk_0a = a0;
- Rfu.unk_ee = 1;
+ Rfu.linkmanMsg = msg;
+ Rfu.errorState = 1;
}
}
-void sub_80111A0(void)
+static void ResetErrorState(void)
{
- Rfu.unk_ee = 0;
+ Rfu.errorState = 0;
}
void sub_80111B0(bool32 a0)
{
if (!a0)
- Rfu.unk_ee = 0;
+ Rfu.errorState = 0;
else
- Rfu.unk_ee = 4;
+ Rfu.errorState = 4;
}
-void sub_80111DC(void)
+static void sub_80111DC(void)
{
sub_8011E94(lman.acceptSlot_flag, 1);
- Rfu.linkRfuCallback = NULL;
+ Rfu.callback = NULL;
}
-void sub_80111FC(void)
+static void sub_80111FC(void)
{
- Rfu.linkRfuCallback = sub_80111DC;
+ Rfu.callback = sub_80111DC;
}
-void sub_801120C(u8 a0, u8 unused1)
+static void sub_801120C(u8 msg, u8 paramCount)
{
u8 i;
- u8 r6 = 0;
- switch (a0)
+ u8 disconnectFlag = 0;
+ switch (msg)
{
- case 0x00:
- Rfu.unk_04 = 2;
+ case LMAN_MSG_INITIALIZE_COMPLETED:
+ Rfu.state = 2;
break;
- case 0x10:
+ case LMAN_MSG_NEW_CHILD_CONNECT_DETECTED:
break;
- case 0x11:
+ case LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED:
sub_80115EC(lman.param[0]);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
if ((lman.param[0] >> i) & 1)
{
struct GFtgtGname *structPtr = (void *)gRfuLinkStatus->partner[i].gname;
- if (structPtr->activity == sub_800F7DC()->activity)
+ if (structPtr->activity == GetHostRFUtgtGname()->activity)
{
- Rfu.unk_cd1[i] = 0;
- Rfu.unk_cd5[i] = 0;
- rfu_setRecvBuffer(0x20, i, Rfu.unk_cd5 + i, 1);
+ Rfu.partnerSendStatuses[i] = RFU_STATUS_OK;
+ Rfu.partnerRecvStatuses[i] = RFU_STATUS_OK;
+ rfu_setRecvBuffer(TYPE_NI, i, &Rfu.partnerRecvStatuses[i], 1);
}
else
{
- r6 |= (1 << i);
+ disconnectFlag |= (1 << i);
}
}
}
- if (r6)
+ if (disconnectFlag)
{
- rfu_REQ_disconnect(r6);
+ rfu_REQ_disconnect(disconnectFlag);
rfu_waitREQComplete();
}
break;
- case 0x12:
+ case LMAN_MSG_NEW_CHILD_CONNECT_REJECTED:
break;
- case 0x13:
+ case LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED:
break;
- case 0x14:
- if (Rfu.unk_ce7 != lman.acceptSlot_flag)
+ case LMAN_MSG_END_WAIT_CHILD_NAME:
+ if (Rfu.acceptSlot_flag != lman.acceptSlot_flag)
{
- rfu_REQ_disconnect(Rfu.unk_ce7 ^ lman.acceptSlot_flag);
+ rfu_REQ_disconnect(Rfu.acceptSlot_flag ^ lman.acceptSlot_flag);
rfu_waitREQComplete();
}
- Rfu.unk_04 = 0x11;
+ Rfu.state = 17;
break;
- case 0x31:
- Rfu.unk_f0 = 1;
+ case LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY:
+ Rfu.linkLossRecoveryState = 1;
break;
- case 0x32:
- Rfu.unk_f0 = 3;
+ case LMAN_MSG_LINK_RECOVERY_SUCCESSED:
+ Rfu.linkLossRecoveryState = 3;
break;
- case 0x30:
- case 0x33:
- Rfu.unk_f0 = 4;
+ case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED:
+ case LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED:
+ Rfu.linkLossRecoveryState = 4;
Rfu.unk_ce2 &= ~lman.param[0];
if (gReceivedRemoteLinkPlayers == 1)
{
if (Rfu.unk_ce2 == 0)
- sub_8011170(a0);
+ GetLinkmanErrorParams(msg);
else
sub_80111FC();
}
- sub_8011A64(2, a0);
+ RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg);
break;
case 0x34:
break;
- case 0x42 ... 0x44:
+ case LMAN_MSG_RFU_POWER_DOWN:
+ case LMAN_MSG_MANAGER_STOPPED:
+ case LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET:
break;
- case 0xf3:
- sub_8011A64(1, a0);
- sub_8011170(a0);
- Rfu.unk_ef = 1;
+ case LMAN_MSG_LMAN_API_ERROR_RETURN:
+ RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg);
+ GetLinkmanErrorParams(msg);
+ Rfu.isShuttingDown = TRUE;
break;
- case 0xf0 ... 0xf2:
- case 0xff:
- sub_8011170(a0);
- sub_8011A64(1, a0);
- Rfu.unk_cdb = 1;
+ case LMAN_MSG_REQ_API_ERROR:
+ case LMAN_MSG_WATCH_DOG_TIMER_ERROR:
+ case LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA:
+ case LMAN_MSG_RFU_FATAL_ERROR:
+ GetLinkmanErrorParams(msg);
+ RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg);
+ Rfu.unk_cdb = TRUE;
break;
}
}
-void sub_8011404(u8 a0, u8 unused1)
+void sub_8011404(u8 msg, u8 unused1)
{
- switch (a0)
+ switch (msg)
{
- case 0x00:
- Rfu.unk_04 = 6;
+ case LMAN_MSG_INITIALIZE_COMPLETED:
+ Rfu.state = 6;
break;
- case 0x20:
- Rfu.unk_ccd = lman.param[0];
+ case LMAN_MSG_PARENT_FOUND:
+ Rfu.parentId = lman.param[0];
break;
- case 0x21:
+ case LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED:
break;
- case 0x22:
- Rfu.unk_c3e = lman.param[0];
+ case LMAN_MSG_CONNECT_PARENT_SUCCESSED:
+ Rfu.childSlot = lman.param[0];
break;
- case 0x23:
- sub_8011A64(2, a0);
+ case LMAN_MSG_CONNECT_PARENT_FAILED:
+ RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg);
break;
- case 0x24:
- Rfu.unk_04 = 11;
+ case LMAN_MSG_CHILD_NAME_SEND_COMPLETED:
+ Rfu.state = 11;
Rfu.unk_c85 = 0;
- Rfu.unk_c86 = 0;
- rfu_setRecvBuffer(0x20, Rfu.unk_c3e, &Rfu.unk_c86, 1);
- rfu_setRecvBuffer(0x10, Rfu.unk_c3e, Rfu.unk_c3f, 70);
+ Rfu.recvStatus = RFU_STATUS_OK;
+ rfu_setRecvBuffer(TYPE_NI, Rfu.childSlot, &Rfu.recvStatus, 1);
+ rfu_setRecvBuffer(TYPE_UNI, Rfu.childSlot, Rfu.unk_c3f, 70);
break;
- case 0x25:
- sub_8011A64(2, 0x25);
+ case LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED:
+ RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg);
break;
- case 0x30:
- Rfu.unk_f0 = 2;
- if (Rfu.unk_c86 == 6)
+ case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED:
+ Rfu.linkLossRecoveryState = 2;
+ if (Rfu.recvStatus == RFU_STATUS_JOIN_GROUP_NO)
break;
- case 0x33:
- if (Rfu.unk_f0 != 2)
- Rfu.unk_f0 = 4;
- if (Rfu.unk_c86 != 9)
- sub_8011A64(2, a0);
- nullsub_5(gUnknown_082ED7FC, 5, 5);
+ case LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED:
+ if (Rfu.linkLossRecoveryState != 2)
+ Rfu.linkLossRecoveryState = 4;
+ if (Rfu.recvStatus != RFU_STATUS_LEAVE_GROUP)
+ RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg);
+ Debug_PrintString(sASCII_LinkLossDisconnect, 5, 5);
if (gReceivedRemoteLinkPlayers == 1)
- sub_8011170(a0);
+ GetLinkmanErrorParams(msg);
break;
- case 0x31:
- Rfu.unk_f0 = 1;
- nullsub_5(gUnknown_082ED814, 5, 5);
+ case LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY:
+ Rfu.linkLossRecoveryState = 1;
+ Debug_PrintString(sASCII_LinkLossRecoveryNow, 5, 5);
break;
- case 0x32:
- Rfu.unk_f0 = 3;
- Rfu.unk_c3c = 1;
+ case LMAN_MSG_LINK_RECOVERY_SUCCESSED:
+ Rfu.linkLossRecoveryState = 3;
+ Rfu.linkRecovered = TRUE;
break;
case 0x34:
break;
- case 0x42 ... 0x44:
+ case LMAN_MSG_RFU_POWER_DOWN:
+ case LMAN_MSG_MANAGER_STOPPED:
+ case LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET:
break;
- case 0xF3:
- sub_8011A64(1, a0);
- sub_8011170(a0);
- Rfu.unk_ef = 1;
+ case LMAN_MSG_LMAN_API_ERROR_RETURN:
+ RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg);
+ GetLinkmanErrorParams(msg);
+ Rfu.isShuttingDown = TRUE;
break;
- case 0xF0 ... 0xF2:
- case 0xFF:
- sub_8011A64(1, a0);
- sub_8011170(a0);
- Rfu.unk_cdb = 1;
+ case LMAN_MSG_REQ_API_ERROR:
+ case LMAN_MSG_WATCH_DOG_TIMER_ERROR:
+ case LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA:
+ case LMAN_MSG_RFU_FATAL_ERROR:
+ RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg);
+ GetLinkmanErrorParams(msg);
+ Rfu.unk_cdb = TRUE;
break;
}
}
-void sub_80115EC(s32 a0)
+static void sub_80115EC(s32 a0)
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
if ((a0 >> i) & 1)
{
@@ -2186,17 +2266,17 @@ void sub_80115EC(s32 a0)
}
}
-u8 sub_8011628(s32 a0)
+static u8 GetNewChildrenInUnionRoomChat(s32 a0)
{
u8 ret = 0;
u8 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
if ((a0 >> i) & 1)
{
struct GFtgtGname *structPtr = (void *)gRfuLinkStatus->partner[i].gname;
- if (structPtr->activity == 0x45)
+ if (structPtr->activity == (ACTIVITY_CHAT | IN_UNION_ROOM))
ret |= (1 << i);
}
}
@@ -2204,22 +2284,22 @@ u8 sub_8011628(s32 a0)
return ret;
}
-void sub_8011674(u8 a0, u8 unused1)
+static void sub_8011674(u8 msg, u8 paramCount)
{
u8 r1;
- switch (a0)
+ switch (msg)
{
- case 0x00:
- Rfu.unk_04 = 0x11;
+ case LMAN_MSG_INITIALIZE_COMPLETED:
+ Rfu.state = 17;
break;
- case 0x10:
- sub_8011A64(4, 0);
+ case LMAN_MSG_NEW_CHILD_CONNECT_DETECTED:
+ RfuSetStatus(RFU_STATUS_NEW_CHILD_DETECTED, 0);
break;
- case 0x11:
- if (sub_800F7DC()->activity == 0x45 && Rfu.unk_cd9 == 0)
+ case LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED:
+ if (GetHostRFUtgtGname()->activity == (ACTIVITY_CHAT | IN_UNION_ROOM) && Rfu.unk_cd9 == 0)
{
- u8 idx = sub_8011628(lman.param[0]);
+ u8 idx = GetNewChildrenInUnionRoomChat(lman.param[0]);
if (idx != 0)
{
r1 = 1 << sub_800E87C(idx);
@@ -2227,7 +2307,7 @@ void sub_8011674(u8 a0, u8 unused1)
{
Rfu.unk_ce5 = r1;
Rfu.unk_ce6 |= (r1 ^ idx);
- Rfu.unk_ce8 = 1;
+ Rfu.unk_ce8 = TRUE;
}
else
{
@@ -2240,38 +2320,38 @@ void sub_8011674(u8 a0, u8 unused1)
Rfu.unk_ce4 = 2;
}
}
- else if (sub_800F7DC()->activity == 0x54)
+ else if (GetHostRFUtgtGname()->activity == (ACTIVITY_PLYRTALK | IN_UNION_ROOM))
{
rfu_REQ_disconnect(lman.acceptSlot_flag);
rfu_waitREQComplete();
}
sub_80115EC(lman.param[0]);
break;
- case 0x12:
+ case LMAN_MSG_NEW_CHILD_CONNECT_REJECTED:
break;
- case 0x13:
+ case LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED:
break;
- case 0x14:
- if (sub_800F7DC()->activity != 0x45 && lman.acceptCount > 1)
+ case LMAN_MSG_END_WAIT_CHILD_NAME:
+ if (GetHostRFUtgtGname()->activity != (ACTIVITY_CHAT | IN_UNION_ROOM) && lman.acceptCount > 1)
{
r1 = 1 << sub_800E87C(lman.param[0]);
rfu_REQ_disconnect(lman.acceptSlot_flag ^ r1);
rfu_waitREQComplete();
}
- if (Rfu.unk_04 == 0xF)
- Rfu.unk_04 = 0x10;
+ if (Rfu.state == 15)
+ Rfu.state = 16;
break;
break;
- case 0x20:
- Rfu.unk_ccd = lman.param[0];
+ case LMAN_MSG_PARENT_FOUND:
+ Rfu.parentId = lman.param[0];
break;
- case 0x21:
+ case LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED:
break;
- case 0x22:
- Rfu.unk_c3e = lman.param[0];
+ case LMAN_MSG_CONNECT_PARENT_SUCCESSED:
+ Rfu.childSlot = lman.param[0];
break;
- case 0x23:
- Rfu.unk_04 = 0x12;
+ case LMAN_MSG_CONNECT_PARENT_FAILED:
+ Rfu.state = 18;
if (Rfu.unk_ccf < 2)
{
Rfu.unk_ccf++;
@@ -2279,68 +2359,72 @@ void sub_8011674(u8 a0, u8 unused1)
}
else
{
- sub_8011A64(2, a0);
+ RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg);
}
break;
- case 0x24:
- Rfu.unk_04 = 0xD;
- sub_8011A64(3, 0);
- rfu_setRecvBuffer(0x10, Rfu.unk_c3e, Rfu.unk_c3f, 70);
+ case LMAN_MSG_CHILD_NAME_SEND_COMPLETED:
+ Rfu.state = 13;
+ RfuSetStatus(RFU_STATUS_CHILD_SEND_COMPLETE, 0);
+ rfu_setRecvBuffer(TYPE_UNI, Rfu.childSlot, Rfu.unk_c3f, 70);
break;
- case 0x25:
- sub_8011A64(2, a0);
+ case LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED:
+ RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg);
break;
- case 0x31:
+ case LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY:
if (lman.acceptSlot_flag & lman.param[0])
- Rfu.unk_f0 = 1;
+ Rfu.linkLossRecoveryState = 1;
break;
- case 0x32:
- Rfu.unk_f0 = 3;
- if (gRfuLinkStatus->parentChild == 0)
- Rfu.unk_c3c = 1;
+ case LMAN_MSG_LINK_RECOVERY_SUCCESSED:
+ Rfu.linkLossRecoveryState = 3;
+ if (gRfuLinkStatus->parentChild == MODE_CHILD)
+ Rfu.linkRecovered = TRUE;
break;
- case 0x30:
- Rfu.unk_f0 = 2;
- case 0x33:
- if (Rfu.unk_f0 != 2)
- Rfu.unk_f0 = 4;
- if (Rfu.unk_0c == 1)
+ case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED:
+ Rfu.linkLossRecoveryState = 2;
+ case LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED:
+ if (Rfu.linkLossRecoveryState != 2)
+ Rfu.linkLossRecoveryState = 4;
+ if (Rfu.parentChild == MODE_PARENT)
{
if (gReceivedRemoteLinkPlayers == 1)
{
Rfu.unk_ce2 &= ~(lman.param[0]);
if (Rfu.unk_ce2 == 0)
- sub_8011170(a0);
+ GetLinkmanErrorParams(msg);
else
sub_80111FC();
}
}
else if (Rfu.unk_ce4 != 2 && gReceivedRemoteLinkPlayers == 1)
{
- sub_8011170(a0);
+ GetLinkmanErrorParams(msg);
rfu_LMAN_stopManager(0);
}
- if (gRfuLinkStatus->parentChild == 0xFF && lman.pcswitch_flag == 0 && FuncIsActiveTask(sub_800EB44) == TRUE)
- Rfu.unk_04 = 0x11;
+ if (gRfuLinkStatus->parentChild == MODE_NEUTRAL && lman.pcswitch_flag == 0 && FuncIsActiveTask(Task_LinkRfu_UnionRoomListen) == TRUE)
+ Rfu.state = 17;
- sub_8011A64(2, a0);
+ RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg);
break;
- case 0x40:
+ case LMAN_MSG_LINK_DISCONNECTED_BY_USER:
Rfu.unk_ce3 = 0;
break;
- case 0x42 ... 0x44:
+ case LMAN_MSG_RFU_POWER_DOWN:
+ case LMAN_MSG_MANAGER_STOPPED:
+ case LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET:
break;
- case 0xF3:
- sub_8011A64(1, a0);
- sub_8011170(a0);
- Rfu.unk_ef = 1;
+ case LMAN_MSG_LMAN_API_ERROR_RETURN:
+ RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg);
+ GetLinkmanErrorParams(msg);
+ Rfu.isShuttingDown = TRUE;
break;
- case 0xF0 ... 0xF2:
- case 0xFF:
- sub_8011170(a0);
- sub_8011A64(1, a0);
- Rfu.unk_cdb = 0;
+ case LMAN_MSG_REQ_API_ERROR:
+ case LMAN_MSG_WATCH_DOG_TIMER_ERROR:
+ case LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA:
+ case LMAN_MSG_RFU_FATAL_ERROR:
+ GetLinkmanErrorParams(msg);
+ RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg);
+ Rfu.unk_cdb = FALSE;
break;
}
}
@@ -2350,21 +2434,22 @@ void sub_8011A50(void)
Rfu.unk_ce4 = 2;
}
-void sub_8011A64(u8 a0, u16 a1)
+void RfuSetStatus(u8 status, u16 msg)
{
- Rfu.unk_f1 = a0;
- Rfu.unk_0a = a1;
+ Rfu.status = status;
+ Rfu.linkmanMsg = msg;
}
-u8 sub_8011A74(void)
+u8 RfuGetStatus(void)
{
- return Rfu.unk_f1;
+ return Rfu.status;
}
-bool32 sub_8011A80(void)
+bool32 RfuHasErrored(void)
{
- u32 var = sub_8011A74() - 1;
- if (var < 2)
+ // RFU_STATUS_OK will underflow here intentionally
+ u32 var = RfuGetStatus() - 1;
+ if (var < RFU_STATUS_CONNECTION_ERROR)
return TRUE;
else
return FALSE;
@@ -2377,7 +2462,7 @@ bool32 sub_8011A9C(void)
bool8 Rfu_IsMaster(void)
{
- return Rfu.unk_0c;
+ return Rfu.parentChild;
}
void RfuVSync(void)
@@ -2390,14 +2475,14 @@ void sub_8011AC8(void)
CpuFill32(0, gRecvCmds, sizeof(gRecvCmds));
}
-void sub_8011AE8(void)
+static void sub_8011AE8(void)
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
-void sub_8011AFC(void)
+static void sub_8011AFC(void)
{
s32 i;
@@ -2408,8 +2493,8 @@ void sub_8011AFC(void)
SetVBlankCallback(sub_8011AE8);
if (IsWirelessAdapterConnected())
{
- gLinkType = LINKTYPE_0x1111;
- sub_800B488();
+ gLinkType = LINKTYPE_TRADE;
+ SetWirelessCommType1();
OpenLink();
SeedRng(gMain.vblankCounter2);
for (i = 0; i < 4; i++)
@@ -2420,29 +2505,29 @@ void sub_8011AFC(void)
AnimateSprites();
BuildOamBuffer();
UpdatePaletteFade();
- sub_8011BA4();
+ CreateTask_RfuIdle();
SetMainCallback2(sub_8011BF8);
}
}
-bool32 sub_8011B90(void)
+bool32 IsUnionRoomListenTaskActive(void)
{
- return FuncIsActiveTask(sub_800EB44);
+ return FuncIsActiveTask(Task_LinkRfu_UnionRoomListen);
}
-void sub_8011BA4(void)
+void CreateTask_RfuIdle(void)
{
- if (!FuncIsActiveTask(nullsub_89))
- Rfu.unk_66 = CreateTask(nullsub_89, 0);
+ if (!FuncIsActiveTask(Task_Idle))
+ Rfu.idleTaskId = CreateTask(Task_Idle, 0);
}
-void sub_8011BD0(void)
+void DestroyTask_RfuIdle(void)
{
- if (FuncIsActiveTask(nullsub_89) == TRUE)
- DestroyTask(Rfu.unk_66);
+ if (FuncIsActiveTask(Task_Idle) == TRUE)
+ DestroyTask(Rfu.idleTaskId);
}
-void sub_8011BF8(void)
+static void sub_8011BF8(void)
{
RunTasks();
AnimateSprites();
@@ -2450,77 +2535,77 @@ void sub_8011BF8(void)
UpdatePaletteFade();
}
-void sub_8011C10(u32 a0)
+void InitializeRfuLinkManager_LinkLeader(u32 a0)
{
- Rfu.unk_0c = 1;
- sub_8010F48();
+ Rfu.parentChild = MODE_PARENT;
+ CopyPlayerNameToUnameBuffer();
rfu_LMAN_initializeManager(sub_801120C, NULL);
- gUnknown_02022B2C = gUnknown_082ED608;
- gUnknown_02022B2C.availSlot_flag = gUnknown_082ED620[a0 - 1];
- sub_800EE78();
+ sRfuReqConfig = sRfuReqConfigTemplate;
+ sRfuReqConfig.availSlot_flag = sAvailSlots[a0 - 1];
+ CreateTask_LinkLeaderSearchForChildren();
}
-void sub_8011C5C(void)
+void InitializeRfuLinkManager_JoinGroup(void)
{
- Rfu.unk_0c = 0;
- sub_8010F48();
+ Rfu.parentChild = MODE_CHILD;
+ CopyPlayerNameToUnameBuffer();
rfu_LMAN_initializeManager(sub_8011404, sub_800ED34);
- sub_800EF00();
+ CreateTask_JoinGroupSearchForParent();
}
-void sub_8011C84(void)
+void InitializeRfuLinkManager_EnterUnionRoom(void)
{
- Rfu.unk_0c = 2;
- sub_8010F48();
+ Rfu.parentChild = 2;
+ CopyPlayerNameToUnameBuffer();
rfu_LMAN_initializeManager(sub_8011674, NULL);
- gUnknown_02022B2C = gUnknown_082ED608;
- gUnknown_02022B2C.linkRecovery_enable = 0;
- gUnknown_02022B2C.linkRecovery_period = 0x258;
- Rfu.unk_67 = CreateTask(sub_800EB44, 1);
+ sRfuReqConfig = sRfuReqConfigTemplate;
+ sRfuReqConfig.linkRecovery_enable = 0;
+ sRfuReqConfig.linkRecovery_period = 600;
+ Rfu.searchTaskId = CreateTask(Task_LinkRfu_UnionRoomListen, 1);
}
-u16 ReadU16(const void *ptr)
+static u16 ReadU16(const void *ptr)
{
const u8 *ptr_ = ptr;
return (ptr_[1] << 8) | (ptr_[0]);
}
-u8 sub_8011CE4(const u8 *a0, u16 a1)
+static u8 GetPartnerIndexByNameAndTrainerID(const u8 *name, u16 id)
{
u8 i;
- u8 ret = 0xFF;
+ u8 idx = 0xFF;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
u16 trainerId = ReadU16(gRfuLinkStatus->partner[i].gname + 2);
- if (sub_8010454(gRfuLinkStatus->partner[i].serialNo)
- && !StringCompare(a0, gRfuLinkStatus->partner[i].uname)
- && a1 == trainerId)
+ if (IsRfuSerialNumberValid(gRfuLinkStatus->partner[i].serialNo)
+ && !StringCompare(name, gRfuLinkStatus->partner[i].uname)
+ && id == trainerId)
{
- ret = i;
+ idx = i;
if (gRfuLinkStatus->partner[i].slot != 0xFF)
break;
}
}
- return ret;
+ return idx;
}
-void sub_8011D6C(u32 a0)
+static void RfuReqDisconnectSlot(u32 slot)
{
- rfu_REQ_disconnect(a0);
+ rfu_REQ_disconnect(slot);
rfu_waitREQComplete();
- Rfu.unk_ce2 &= ~(a0);
+ Rfu.unk_ce2 &= ~(slot);
rfu_clearSlot(1, Rfu.unk_cda);
- rfu_UNI_setSendData(Rfu.unk_ce2, Rfu.unk_c87, 70);
+ rfu_UNI_setSendData(Rfu.unk_ce2, Rfu.recvCmds, 70);
Rfu.unk_cda = sub_800E87C(Rfu.unk_ce2);
}
-void sub_8011DC0(const u8 *ptr, u16 a1)
+void RequestDisconnectSlotByTrainerNameAndId(const u8 *name, u16 id)
{
- u8 var = sub_8011CE4(ptr, a1);
+ u8 var = GetPartnerIndexByNameAndTrainerID(name, id);
if (var != 0xFF)
- sub_8011D6C(1 << var);
+ RfuReqDisconnectSlot(1 << var);
}
void sub_8011DE0(u32 a0)
@@ -2530,9 +2615,9 @@ void sub_8011DE0(u32 a0)
s32 i;
u8 var = 0;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if (Rfu.unk_cde[i] == a0 && (Rfu.unk_ce2 >> i) & 1)
+ if (Rfu.linkPlayerIdx[i] == a0 && (Rfu.unk_ce2 >> i) & 1)
var |= 1 << i;
}
if (var)
@@ -2540,20 +2625,20 @@ void sub_8011DE0(u32 a0)
}
}
-void sub_8011E2C(u8 taskId)
+static void sub_8011E2C(u8 taskId)
{
if (gSendCmd[0] == 0 && Rfu.unk_ce8 == 0)
{
- sub_800FD14(0xED00);
+ RfuPrepareSendBuffer(RFU_COMMAND_0xED00);
gSendCmd[1] = gTasks[taskId].data[0];
gSendCmd[2] = gTasks[taskId].data[1];
- Rfu.playerCount -= gUnknown_082ED695[gTasks[taskId].data[0]];
+ Rfu.playerCount -= sUnknown_082ED695[gTasks[taskId].data[0]];
gSendCmd[3] = Rfu.playerCount;
DestroyTask(taskId);
}
}
-void sub_8011E94(u32 a0, u32 a1)
+static void sub_8011E94(u32 a0, u32 a1)
{
u8 taskId = FindTaskIdByFunc(sub_8011E2C);
if (taskId == 0xFF)
@@ -2569,28 +2654,29 @@ void sub_8011E94(u32 a0, u32 a1)
gTasks[taskId].data[1] = a1;
}
-void sub_8011EF4(u8 taskId)
+static void Task_RfuReconnectWithParent(u8 taskId)
{
s16 *data = gTasks[taskId].data;
if (sub_800EE94())
{
- u8 id = sub_8011CE4((u8*)data, ReadU16(&data[8]));
+ u8 id = GetPartnerIndexByNameAndTrainerID((u8*)data, ReadU16(&data[8]));
if (id != 0xFF)
{
if (gRfuLinkStatus->partner[id].slot != 0xFF)
{
Rfu.unk_c3d = id;
- if (sub_800EEBC())
+ if (IsParentSuccessfullyReconnected())
DestroyTask(taskId);
}
- else if (sub_800F7DC()->activity == 0x15 || sub_800F7DC()->activity == 0x16)
+ else if (GetHostRFUtgtGname()->activity == ACTIVITY_WONDER_CARD2
+ || GetHostRFUtgtGname()->activity == ACTIVITY_WONDER_NEWS2)
{
data[15]++;
}
else
{
- sub_8011A64(2, 0x7000);
+ RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, 0x7000);
DestroyTask(taskId);
}
}
@@ -2607,47 +2693,47 @@ void sub_8011EF4(u8 taskId)
if (data[15] > 240)
{
- sub_8011A64(2, 0x7000);
+ RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, 0x7000);
DestroyTask(taskId);
}
}
-void sub_8011FC8(const u8 *src, u16 trainerId)
+void CreateTask_RfuReconnectWithParent(const u8 *name, u16 trainerId)
{
u8 taskId;
s16 *data;
- Rfu.unk_f1 = 0;
- taskId = CreateTask(sub_8011EF4, 3);
+ Rfu.status = RFU_STATUS_OK;
+ taskId = CreateTask(Task_RfuReconnectWithParent, 3);
data = gTasks[taskId].data;
- StringCopy((u8*)(data), src);
+ StringCopy((u8*)(data), name);
data[8] = trainerId;
}
-bool32 sub_801200C(s16 a1, struct GFtgtGname *structPtr)
+static bool32 ShouldRejectPartnerConnectionBasedOnActivity(s16 activity, struct GFtgtGname *partnerGname)
{
- if (sub_800F7DC()->activity == 0x45)
+ if (GetHostRFUtgtGname()->activity == (ACTIVITY_CHAT | IN_UNION_ROOM))
{
- if (structPtr->activity != 0x45)
+ if (partnerGname->activity != (ACTIVITY_CHAT | IN_UNION_ROOM))
return TRUE;
}
- else if (structPtr->activity != 0x40)
+ else if (partnerGname->activity != IN_UNION_ROOM)
{
return TRUE;
}
- else if (a1 == 0x44)
+ else if (activity == (ACTIVITY_TRADE | IN_UNION_ROOM))
{
- struct GFtgtGname *structPtr2 = &Rfu.unk_10A;
- if (structPtr2->species == SPECIES_EGG)
+ struct GFtgtGname *tradeGname = &Rfu.unk_10A;
+ if (tradeGname->species == SPECIES_EGG)
{
- if (structPtr->species == structPtr2->species)
+ if (partnerGname->species == tradeGname->species)
return FALSE;
else
return TRUE;
}
- else if (structPtr->species != structPtr2->species
- || structPtr->level != structPtr2->level
- || structPtr->type != structPtr2->type)
+ else if (partnerGname->species != tradeGname->species
+ || partnerGname->level != tradeGname->level
+ || partnerGname->type != tradeGname->type)
{
return TRUE;
}
@@ -2656,53 +2742,53 @@ bool32 sub_801200C(s16 a1, struct GFtgtGname *structPtr)
return FALSE;
}
-void sub_801209C(u8 taskId)
+static void sub_801209C(u8 taskId)
{
- if (Rfu.unk_f1 == 4)
+ if (Rfu.status == RFU_STATUS_NEW_CHILD_DETECTED)
DestroyTask(taskId);
if (++gTasks[taskId].data[0] > 300)
{
- sub_8011A64(2, 0x7000);
+ RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, 0x7000);
DestroyTask(taskId);
}
- if (Rfu.unk_ccd != 0 && lman.parent_child == 0)
+ if (Rfu.parentId != 0 && lman.parent_child == 0)
{
u16 trainerId = ReadU16(Rfu.unk_10A.unk_00.playerTrainerId);
- u8 id = sub_8011CE4(Rfu.playerName, trainerId);
+ u8 id = GetPartnerIndexByNameAndTrainerID(Rfu.playerName, trainerId);
if (id != 0xFF)
{
- if (!sub_801200C(gTasks[taskId].data[1], (void *)gRfuLinkStatus->partner[id].gname))
+ if (!ShouldRejectPartnerConnectionBasedOnActivity(gTasks[taskId].data[1], (void *)gRfuLinkStatus->partner[id].gname))
{
if (gRfuLinkStatus->partner[id].slot != 0xFF && !rfu_LMAN_CHILD_connectParent(gRfuLinkStatus->partner[id].id, 0x5A))
{
- Rfu.unk_04 = 0xA;
+ Rfu.state = 0xA;
DestroyTask(taskId);
}
}
else
{
- sub_8011A64(2, 0x7000);
+ RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, 0x7000);
DestroyTask(taskId);
}
}
}
}
-void sub_8012188(const u8 *name, struct GFtgtGname *structPtr, u8 a2)
+void sub_8012188(const u8 *name, struct GFtgtGname *structPtr, u8 activity)
{
u8 taskId, taskId2;
Rfu.unk_ccf = 0;
- Rfu.unk_f1 = 0;
+ Rfu.status = RFU_STATUS_OK;
StringCopy(Rfu.playerName, name);
- memcpy(&Rfu.unk_10A, structPtr, 0xD);
+ memcpy(&Rfu.unk_10A, structPtr, RFU_GAME_NAME_LENGTH);
rfu_LMAN_forceChangeSP();
taskId = CreateTask(sub_801209C, 2);
- gTasks[taskId].data[1] = a2;
- taskId2 = FindTaskIdByFunc(sub_800EB44);
- if (a2 == 0x45)
+ gTasks[taskId].data[1] = activity;
+ taskId2 = FindTaskIdByFunc(Task_LinkRfu_UnionRoomListen);
+ if (activity == (ACTIVITY_CHAT | IN_UNION_ROOM))
{
if (taskId2 != 0xFF)
gTasks[taskId2].data[7] = 1;
@@ -2714,9 +2800,9 @@ void sub_8012188(const u8 *name, struct GFtgtGname *structPtr, u8 a2)
}
}
-bool8 sub_8012224(void)
+bool8 IsRfuRecoveringFromLinkLoss(void)
{
- if (Rfu.unk_f0 == 1)
+ if (Rfu.linkLossRecoveryState == 1)
return TRUE;
else
return FALSE;
@@ -2726,61 +2812,61 @@ bool32 sub_8012240(void)
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if ((lman.acceptSlot_flag >> i) & 1 && Rfu.unk_cd1[i] == 0)
+ if ((lman.acceptSlot_flag >> i) & 1 && Rfu.partnerSendStatuses[i] == RFU_STATUS_OK)
return FALSE;
}
return TRUE;
}
-void sub_801227C(void)
+static void Debug_PrintEmpty(void)
{
s32 i;
for (i = 0; i < 20; i++)
- nullsub_5(gUnknown_082ED82C, 0, i);
+ Debug_PrintString(sASCII_30Commas, 0, i);
}
-void sub_801229C(void)
+static void Debug_PrintStatus(void)
{
s32 i, j;
- nullsub_13(GetBlockReceivedStatus(), 0x1C, 0x13, 2);
- nullsub_13(gRfuLinkStatus->connSlotFlag, 0x14, 1, 1);
- nullsub_13(gRfuLinkStatus->linkLossSlotFlag, 0x17, 1, 1);
- if (Rfu.unk_0c == 1)
+ Debug_PrintNum(GetBlockReceivedStatus(), 0x1C, 0x13, 2);
+ Debug_PrintNum(gRfuLinkStatus->connSlotFlag, 0x14, 1, 1);
+ Debug_PrintNum(gRfuLinkStatus->linkLossSlotFlag, 0x17, 1, 1);
+ if (Rfu.parentChild == MODE_PARENT)
{
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
if ((gRfuLinkStatus->getNameFlag >> i) & 1)
{
- nullsub_13(gRfuLinkStatus->partner[i].serialNo, 1, i + 3, 4);
- nullsub_5((void*)gRfuLinkStatus->partner[i].gname, 6, i + 3);
- nullsub_5(gRfuLinkStatus->partner[i].uname, 0x16, i + 3);
+ Debug_PrintNum(gRfuLinkStatus->partner[i].serialNo, 1, i + 3, 4);
+ Debug_PrintString((void*)gRfuLinkStatus->partner[i].gname, 6, i + 3);
+ Debug_PrintString(gRfuLinkStatus->partner[i].uname, 0x16, i + 3);
}
}
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- for (j = 0; j < 14; j++)
+ for (j = 0; j < (int)ARRAY_COUNT(Rfu.unk_14[0]); j++)
{
- nullsub_13(Rfu.unk_14[i][j], j * 2, i + 11, 2);
+ Debug_PrintNum(Rfu.unk_14[i][j], j * 2, i + 11, 2);
}
}
- nullsub_5(gUnknown_082ED868, 1, 0xF);
+ Debug_PrintString(sASCII_NowSlot, 1, 0xF);
}
else if (gRfuLinkStatus->connSlotFlag != 0 && gRfuLinkStatus->getNameFlag != 0)
{
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- nullsub_13(0, 1, i + 3, 4);
- nullsub_5(gUnknown_082ED84B, 6, i + 3);
- nullsub_5(gUnknown_082ED85B, 0x16, i + 3);
+ Debug_PrintNum(0, 1, i + 3, 4);
+ Debug_PrintString(sASCII_15Commas, 6, i + 3);
+ Debug_PrintString(sASCII_8Commas, 0x16, i + 3);
}
- nullsub_13(gRfuLinkStatus->partner[Rfu.unk_c3e].serialNo, 1, 3, 4);
- nullsub_5((void*)gRfuLinkStatus->partner[Rfu.unk_c3e].gname, 6, 3);
- nullsub_5(gRfuLinkStatus->partner[Rfu.unk_c3e].uname, 0x16, 3);
+ Debug_PrintNum(gRfuLinkStatus->partner[Rfu.childSlot].serialNo, 1, 3, 4);
+ Debug_PrintString((void*)gRfuLinkStatus->partner[Rfu.childSlot].gname, 6, 3);
+ Debug_PrintString(gRfuLinkStatus->partner[Rfu.childSlot].uname, 0x16, 3);
}
else
{
@@ -2788,31 +2874,31 @@ void sub_801229C(void)
{
if (gRfuLinkStatus->partner[i].slot != 0xFF)
{
- nullsub_13(gRfuLinkStatus->partner[i].serialNo, 1, i + 3, 4);
- nullsub_13(gRfuLinkStatus->partner[i].id, 6, i + 3, 4);
- nullsub_5(gRfuLinkStatus->partner[i].uname, 0x16, i + 3);
+ Debug_PrintNum(gRfuLinkStatus->partner[i].serialNo, 1, i + 3, 4);
+ Debug_PrintNum(gRfuLinkStatus->partner[i].id, 6, i + 3, 4);
+ Debug_PrintString(gRfuLinkStatus->partner[i].uname, 0x16, i + 3);
}
}
- for (; i < 4; i++)
+ for (; i < RFU_CHILD_MAX; i++)
{
- nullsub_13(0, 1, i + 3, 4);
- nullsub_5(gUnknown_082ED84B, 6, i + 3);
- nullsub_5(gUnknown_082ED85B, 0x16, i + 3);
+ Debug_PrintNum(0, 1, i + 3, 4);
+ Debug_PrintString(sASCII_15Commas, 6, i + 3);
+ Debug_PrintString(sASCII_8Commas, 0x16, i + 3);
}
}
}
-u32 sub_80124C0(void)
+static u32 GetRfuSendQueueLength(void)
{
- return Rfu.unk_9e8.unk_232;
+ return Rfu.sendQueue.count;
}
u32 GetRfuRecvQueueLength(void)
{
- return Rfu.unk_124.unk_8c2;
+ return Rfu.recvQueue.count;
}
-void nullsub_89(u8 taskId)
+static void Task_Idle(u8 taskId)
{
}
diff --git a/src/link_rfu_3.c b/src/link_rfu_3.c
index 535deeca6..c53e1c59e 100644
--- a/src/link_rfu_3.c
+++ b/src/link_rfu_3.c
@@ -7,30 +7,112 @@
#include "text.h"
#include "event_data.h"
+enum {
+ WIRELESS_STATUS_ANIM_3_BARS,
+ WIRELESS_STATUS_ANIM_2_BARS,
+ WIRELESS_STATUS_ANIM_1_BAR,
+ WIRELESS_STATUS_ANIM_SEARCHING,
+ WIRELESS_STATUS_ANIM_ERROR,
+};
+
+#define UNUSED_QUEUE_NUM_SLOTS 2
+#define UNUSED_QUEUE_SLOT_LENGTH 256
+
+struct RfuUnusedQueue
+{
+ u8 slots[UNUSED_QUEUE_NUM_SLOTS][UNUSED_QUEUE_SLOT_LENGTH];
+ vu8 recvSlot;
+ vu8 sendSlot;
+ vu8 count;
+ vu8 full;
+};
+
EWRAM_DATA u8 gWirelessStatusIndicatorSpriteId = 0;
-static u8 gUnknown_03000D74;
+static u8 sUnknown_03000D74;
-const u16 gWirelessLinkIconPalette[] = INCBIN_U16("graphics/interface/wireless_link_icon.gbapal");
-const u32 gWirelessLinkIconPic[] = INCBIN_U32("graphics/interface/wireless_link_icon.4bpp.lz");
+static const u16 sWirelessLinkIconPalette[] = INCBIN_U16("graphics/interface/wireless_link_icon.gbapal");
+static const u32 sWirelessLinkIconPic[] = INCBIN_U32("graphics/interface/wireless_link_icon.4bpp.lz");
-const u8 sWireless_ASCIItoRSETable[] = {
- 0xff, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x37,
+// Most of the below two tables won't make sense with ASCII encoding.
+static const u8 sWireless_ASCIItoRSETable[256] = {
+ EOS,
+ 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x37,
0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
- 0x00, 0xab, 0xb5, 0xb6, 0xb1, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xb2, 0xf1, 0x00, 0xae, 0xad, 0xba,
- 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8,
- 0xa9, 0xaa, 0x00, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
- 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1,
- 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9,
- 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1,
- 0xd2, 0xd3, 0xd4, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6,
- 0x00, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb,
- 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
- 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
- 0xec, 0xed, 0xee, 0x2d, 0x2f, 0x30, 0x31, 0x32,
+ [' '] = CHAR_SPACE,
+ ['!'] = CHAR_EXCL_MARK,
+ 0xb5, 0xb6, 0xb1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xb2, 0xf1, 0x00,
+ ['-'] = CHAR_HYPHEN,
+ ['.'] = CHAR_PERIOD,
+ ['/'] = CHAR_SLASH,
+ ['0'] = CHAR_0,
+ ['1'] = CHAR_1,
+ ['2'] = CHAR_2,
+ ['3'] = CHAR_3,
+ ['4'] = CHAR_4,
+ ['5'] = CHAR_5,
+ ['6'] = CHAR_6,
+ ['7'] = CHAR_7,
+ ['8'] = CHAR_8,
+ ['9'] = CHAR_9,
+ 0x00, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0x00,
+ ['A'] = CHAR_A,
+ ['B'] = CHAR_B,
+ ['C'] = CHAR_C,
+ ['D'] = CHAR_D,
+ ['E'] = CHAR_E,
+ ['F'] = CHAR_F,
+ ['G'] = CHAR_G,
+ ['H'] = CHAR_H,
+ ['I'] = CHAR_I,
+ ['J'] = CHAR_J,
+ ['K'] = CHAR_K,
+ ['L'] = CHAR_L,
+ ['M'] = CHAR_M,
+ ['N'] = CHAR_N,
+ ['O'] = CHAR_O,
+ ['P'] = CHAR_P,
+ ['Q'] = CHAR_Q,
+ ['R'] = CHAR_R,
+ ['S'] = CHAR_S,
+ ['T'] = CHAR_T,
+ ['U'] = CHAR_U,
+ ['V'] = CHAR_V,
+ ['W'] = CHAR_W,
+ ['X'] = CHAR_X,
+ ['Y'] = CHAR_Y,
+ ['Z'] = CHAR_Z,
+ 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0x00,
+ ['a'] = CHAR_a,
+ ['b'] = CHAR_b,
+ ['c'] = CHAR_c,
+ ['d'] = CHAR_d,
+ ['e'] = CHAR_e,
+ ['f'] = CHAR_f,
+ ['g'] = CHAR_g,
+ ['h'] = CHAR_h,
+ ['i'] = CHAR_i,
+ ['j'] = CHAR_j,
+ ['k'] = CHAR_k,
+ ['l'] = CHAR_l,
+ ['m'] = CHAR_m,
+ ['n'] = CHAR_n,
+ ['o'] = CHAR_o,
+ ['p'] = CHAR_p,
+ ['q'] = CHAR_q,
+ ['r'] = CHAR_r,
+ ['s'] = CHAR_s,
+ ['t'] = CHAR_t,
+ ['u'] = CHAR_u,
+ ['v'] = CHAR_v,
+ ['w'] = CHAR_w,
+ ['x'] = CHAR_x,
+ ['y'] = CHAR_y,
+ ['z'] = CHAR_z,
+ 0x2d, 0x2f, 0x30, 0x31, 0x32,
0x33, 0x34, 0x35, 0x36, 0x50, 0x00, 0x01, 0x02,
0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12,
@@ -49,42 +131,107 @@ const u8 sWireless_ASCIItoRSETable[] = {
0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94
};
-const u8 sWireless_RSEtoASCIITable[] = {
- 0x20, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c,
- 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94,
- 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c,
- 0x9d, 0x9e, 0x9f, 0xa0, 0xe0, 0xe1, 0xe2, 0xe3,
- 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
- 0xec, 0xed, 0xee, 0xef, 0xf0, 0x7b, 0xf1, 0x7c,
- 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x07,
- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
- 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
- 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
- 0x84, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
- 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
- 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
- 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
- 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
- 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xa6, 0xdd, 0xa7,
- 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xf2,
- 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa,
- 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x01, 0x02, 0x03,
- 0x04, 0x05, 0x06, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
- 0xaf, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,
- 0x37, 0x38, 0x39, 0x21, 0xdf, 0xa1, 0xb0, 0xa5,
- 0xde, 0x24, 0x2a, 0xa2, 0xa3, 0x22, 0x23, 0x20,
- 0xa4, 0x20, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45,
- 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d,
- 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,
- 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63,
- 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
- 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73,
- 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x20,
- 0x20, 0x2b, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x20,
- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00
+static const u8 sWireless_RSEtoASCIITable[256] = {
+ [CHAR_SPACE] = ' ',
+ 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d,
+ 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
+ 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d,
+ 0x9e, 0x9f, 0xa0, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4,
+ 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec,
+ 0xed, 0xee, 0xef, 0xf0, 0x7b, 0xf1, 0x7c, 0x7d,
+ 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x07, 0x08,
+ 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
+ 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
+ 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x84,
+ 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8,
+ 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0,
+ 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8,
+ 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0,
+ 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
+ 0xd9, 0xda, 0xdb, 0xdc, 0xa6, 0xdd, 0xa7, 0xa8,
+ 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xf2, 0xf3,
+ 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
+ 0xfc, 0xfd, 0xfe, 0xff, 0x01, 0x02, 0x03, 0x04,
+ 0x05, 0x06, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0xaf,
+ [CHAR_0] = '0',
+ [CHAR_1] = '1',
+ [CHAR_2] = '2',
+ [CHAR_3] = '3',
+ [CHAR_4] = '4',
+ [CHAR_5] = '5',
+ [CHAR_6] = '6',
+ [CHAR_7] = '7',
+ [CHAR_8] = '8',
+ [CHAR_9] = '9',
+ [CHAR_EXCL_MARK] = '!',
+ 0xdf, 0xa1, 0xb0, 0xa5, 0xde, 0x24, 0x2a,
+ 0xa2, 0xa3, 0x22, 0x23, 0x20, 0xa4, 0x20,
+ [CHAR_SLASH] = '/',
+ [CHAR_A] = 'A',
+ [CHAR_B] = 'B',
+ [CHAR_C] = 'C',
+ [CHAR_D] = 'D',
+ [CHAR_E] = 'E',
+ [CHAR_F] = 'F',
+ [CHAR_G] = 'G',
+ [CHAR_H] = 'H',
+ [CHAR_I] = 'I',
+ [CHAR_J] = 'J',
+ [CHAR_K] = 'K',
+ [CHAR_L] = 'L',
+ [CHAR_M] = 'M',
+ [CHAR_N] = 'N',
+ [CHAR_O] = 'O',
+ [CHAR_P] = 'P',
+ [CHAR_Q] = 'Q',
+ [CHAR_R] = 'R',
+ [CHAR_S] = 'S',
+ [CHAR_T] = 'T',
+ [CHAR_U] = 'U',
+ [CHAR_V] = 'V',
+ [CHAR_W] = 'W',
+ [CHAR_X] = 'X',
+ [CHAR_Y] = 'Y',
+ [CHAR_Z] = 'Z',
+ [CHAR_a] = 'a',
+ [CHAR_b] = 'b',
+ [CHAR_c] = 'c',
+ [CHAR_d] = 'd',
+ [CHAR_e] = 'e',
+ [CHAR_f] = 'f',
+ [CHAR_g] = 'g',
+ [CHAR_h] = 'h',
+ [CHAR_i] = 'i',
+ [CHAR_j] = 'j',
+ [CHAR_k] = 'k',
+ [CHAR_l] = 'l',
+ [CHAR_m] = 'm',
+ [CHAR_n] = 'n',
+ [CHAR_o] = 'o',
+ [CHAR_p] = 'p',
+ [CHAR_q] = 'q',
+ [CHAR_r] = 'r',
+ [CHAR_s] = 's',
+ [CHAR_t] = 't',
+ [CHAR_u] = 'u',
+ [CHAR_v] = 'v',
+ [CHAR_w] = 'w',
+ [CHAR_x] = 'x',
+ [CHAR_y] = 'y',
+ [CHAR_z] = 'z',
+ 0x20, 0x20, 0x2b, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
+ [CHAR_SPECIAL_F7] = ' ',
+ [CHAR_SPECIAL_F8] = ' ',
+ [CHAR_SPECIAL_F9] = ' ',
+ [CHAR_PROMPT_SCROLL] = ' ',
+ [CHAR_PROMPT_CLEAR] = ' ',
+ [EXT_CTRL_CODE_BEGIN] = ' ',
+ [PLACEHOLDER_BEGIN] = ' ',
+ [CHAR_NEWLINE] = ' ',
+ [EOS] = 0
};
-const struct OamData sWirelessStatusIndicatorOamData =
+static const struct OamData sWirelessStatusIndicatorOamData =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
@@ -98,8 +245,7 @@ const struct OamData sWirelessStatusIndicatorOamData =
.paletteNum = 0,
};
-const union AnimCmd sWirelessStatusIndicatorAnim0[] = {
- // 3 bars
+static const union AnimCmd sWirelessStatusIndicator_3Bars[] = {
ANIMCMD_FRAME( 4, 5),
ANIMCMD_FRAME( 8, 5),
ANIMCMD_FRAME(12, 5),
@@ -109,8 +255,7 @@ const union AnimCmd sWirelessStatusIndicatorAnim0[] = {
ANIMCMD_JUMP(0)
};
-const union AnimCmd sWirelessStatusIndicatorAnim1[] = {
- // 2 bars
+static const union AnimCmd sWirelessStatusIndicator_2Bars[] = {
ANIMCMD_FRAME( 4, 5),
ANIMCMD_FRAME( 8, 5),
ANIMCMD_FRAME(12, 10),
@@ -118,321 +263,299 @@ const union AnimCmd sWirelessStatusIndicatorAnim1[] = {
ANIMCMD_JUMP(0)
};
-const union AnimCmd sWirelessStatusIndicatorAnim2[] = {
- // 1 bar
+static const union AnimCmd sWirelessStatusIndicator_1Bar[] = {
ANIMCMD_FRAME(4, 5),
ANIMCMD_FRAME(8, 5),
ANIMCMD_JUMP(0)
};
-const union AnimCmd sWirelessStatusIndicatorAnim3[] = {
- // searching
+static const union AnimCmd sWirelessStatusIndicator_Searching[] = {
ANIMCMD_FRAME( 4, 10),
ANIMCMD_FRAME(20, 10),
ANIMCMD_JUMP(0)
};
-const union AnimCmd sWirelessStatusIndicatorAnim4[] = {
- // error
+static const union AnimCmd sWirelessStatusIndicator_Error[] = {
ANIMCMD_FRAME(24, 10),
ANIMCMD_FRAME( 4, 10),
ANIMCMD_JUMP(0)
};
-const union AnimCmd *const sWirelessStatusIndicatorAnims[] = {
- sWirelessStatusIndicatorAnim0,
- sWirelessStatusIndicatorAnim1,
- sWirelessStatusIndicatorAnim2,
- sWirelessStatusIndicatorAnim3,
- sWirelessStatusIndicatorAnim4
+static const union AnimCmd *const sWirelessStatusIndicatorAnims[] = {
+ [WIRELESS_STATUS_ANIM_3_BARS] = sWirelessStatusIndicator_3Bars,
+ [WIRELESS_STATUS_ANIM_2_BARS] = sWirelessStatusIndicator_2Bars,
+ [WIRELESS_STATUS_ANIM_1_BAR] = sWirelessStatusIndicator_1Bar,
+ [WIRELESS_STATUS_ANIM_SEARCHING] = sWirelessStatusIndicator_Searching,
+ [WIRELESS_STATUS_ANIM_ERROR] = sWirelessStatusIndicator_Error
};
-const struct CompressedSpriteSheet sWirelessStatusIndicatorSpriteSheet = {
- gWirelessLinkIconPic, 0x0380, 0xD431
+static const struct CompressedSpriteSheet sWirelessStatusIndicatorSpriteSheet = {
+ sWirelessLinkIconPic, 0x0380, 0xD431
};
-const struct SpritePalette sWirelessStatusIndicatorSpritePalette = {
- gWirelessLinkIconPalette, 0xD432
+static const struct SpritePalette sWirelessStatusIndicatorSpritePalette = {
+ sWirelessLinkIconPalette, 0xD432
};
-const struct SpriteTemplate sWirelessStatusIndicatorSpriteTemplate = {
- 0xD431,
- 0xD432,
- &sWirelessStatusIndicatorOamData,
- sWirelessStatusIndicatorAnims,
- NULL,
- gDummySpriteAffineAnimTable,
- SpriteCallbackDummy
+static const struct SpriteTemplate sWirelessStatusIndicatorSpriteTemplate = {
+ .tileTag = 0xD431,
+ .paletteTag = 0xD432,
+ .oam = &sWirelessStatusIndicatorOamData,
+ .anims = sWirelessStatusIndicatorAnims,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
};
-void sub_800D6C8(struct UnkRfuStruct_2_Sub_124 *ptr)
+void RfuRecvQueue_Reset(struct RfuRecvQueue *queue)
{
s32 i;
s32 j;
- for (i = 0; i < 32; i++)
+ for (i = 0; i < RECV_QUEUE_NUM_SLOTS; i++)
{
- for (j = 0; j < 70; j++)
+ for (j = 0; j < RECV_QUEUE_SLOT_LENGTH; j++)
{
- ptr->unk_00[i][j] = 0;
+ queue->slots[i][j] = 0;
}
}
- ptr->unk_8c1 = 0;
- ptr->unk_8c0 = 0;
- ptr->unk_8c2 = 0;
- ptr->unk_8c3 = 0;
+ queue->sendSlot = 0;
+ queue->recvSlot = 0;
+ queue->count = 0;
+ queue->full = FALSE;
}
-void sub_800D724(struct UnkRfuStruct_2_Sub_9e8 *ptr)
+void RfuSendQueue_Reset(struct RfuSendQueue *queue)
{
s32 i;
s32 j;
- for (i = 0; i < 40; i++)
+ for (i = 0; i < SEND_QUEUE_NUM_SLOTS; i++)
{
- for (j = 0; j < 14; j++)
+ for (j = 0; j < SEND_QUEUE_SLOT_LENGTH; j++)
{
- ptr->unk_00[i][j] = 0;
+ queue->slots[i][j] = 0;
}
}
- ptr->unk_231 = 0;
- ptr->unk_230 = 0;
- ptr->unk_232 = 0;
- ptr->unk_233 = 0;
+ queue->sendSlot = 0;
+ queue->recvSlot = 0;
+ queue->count = 0;
+ queue->full = FALSE;
}
-void sub_800D780(struct UnkRfuStruct_Sub_Unused *ptr)
+static void RfuUnusedQueue_Reset(struct RfuUnusedQueue *queue)
{
s32 i;
s32 j;
- for (i = 0; i < 2; i++)
+ for (i = 0; i < UNUSED_QUEUE_NUM_SLOTS; i++)
{
- for (j = 0; j < 256; j++)
+ for (j = 0; j < UNUSED_QUEUE_SLOT_LENGTH; j++)
{
- ptr->unk_00[i][j] = 0;
+ queue->slots[i][j] = 0;
}
}
- ptr->unk_201 = 0;
- ptr->unk_200 = 0;
- ptr->unk_202 = 0;
- ptr->unk_203 = 0;
+ queue->sendSlot = 0;
+ queue->recvSlot = 0;
+ queue->count = 0;
+ queue->full = FALSE;
}
-void sub_800D7D8(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2)
+void RfuRecvQueue_Enqueue(struct RfuRecvQueue *queue, u8 *data)
{
s32 i;
u16 imeBak;
u8 count;
- if (q1->unk_8c2 < 32)
+ if (queue->count < RECV_QUEUE_NUM_SLOTS)
{
imeBak = REG_IME;
REG_IME = 0;
count = 0;
- for (i = 0; i < 70; i += 14)
+ for (i = 0; i < RECV_QUEUE_SLOT_LENGTH; i += RECV_QUEUE_SLOT_LENGTH / MAX_RFU_PLAYERS)
{
- if (q2[i] == 0 && q2[i + 1] == 0)
- {
+ if (data[i] == 0 && data[i + 1] == 0)
count++;
- }
}
- if (count != 5)
+ if (count != MAX_RFU_PLAYERS)
{
- for (i = 0; i < 70; i++)
- {
- q1->unk_00[q1->unk_8c0][i] = q2[i];
- }
- q1->unk_8c0++;
- q1->unk_8c0 %= 32;
- q1->unk_8c2++;
- for (i = 0; i < 70; i++)
- {
- q2[i] = 0;
- }
+ for (i = 0; i < RECV_QUEUE_SLOT_LENGTH; i++)
+ queue->slots[queue->recvSlot][i] = data[i];
+
+ queue->recvSlot++;
+ queue->recvSlot %= RECV_QUEUE_NUM_SLOTS;
+ queue->count++;
+
+ for (i = 0; i < RECV_QUEUE_SLOT_LENGTH; i++)
+ data[i] = 0;
}
REG_IME = imeBak;
}
else
{
- q1->unk_8c3 = 1;
+ queue->full = TRUE;
}
}
-void sub_800D888(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2)
+void RfuSendQueue_Enqueue(struct RfuSendQueue *queue, u8 *data)
{
s32 i;
u16 imeBak;
- if (q1->unk_232 < 40)
+ if (queue->count < SEND_QUEUE_NUM_SLOTS)
{
imeBak = REG_IME;
REG_IME = 0;
- for (i = 0; i < 14; i++)
+ for (i = 0; i < SEND_QUEUE_SLOT_LENGTH; i++)
{
- if (q2[i] != 0)
- {
+ if (data[i] != 0)
break;
- }
}
- if (i != 14)
+ if (i != SEND_QUEUE_SLOT_LENGTH)
{
- for (i = 0; i < 14; i++)
- {
- q1->unk_00[q1->unk_230][i] = q2[i];
- }
- q1->unk_230++;
- q1->unk_230 %= 40;
- q1->unk_232++;
- for (i = 0; i < 14; i++)
+ for (i = 0; i < SEND_QUEUE_SLOT_LENGTH; i++)
{
- q2[i] = 0;
+ queue->slots[queue->recvSlot][i] = data[i];
}
+ queue->recvSlot++;
+ queue->recvSlot %= SEND_QUEUE_NUM_SLOTS;
+ queue->count++;
+
+ for (i = 0; i < SEND_QUEUE_SLOT_LENGTH; i++)
+ data[i] = 0;
}
REG_IME = imeBak;
}
else
{
- q1->unk_233 = 1;
+ queue->full = TRUE;
}
}
-bool8 sub_800D934(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2)
+bool8 RfuRecvQueue_Dequeue(struct RfuRecvQueue *queue, u8 *src)
{
u16 imeBak;
s32 i;
imeBak = REG_IME;
REG_IME = 0;
- if (q1->unk_8c0 == q1->unk_8c1 || q1->unk_8c3 != 0)
+ if (queue->recvSlot == queue->sendSlot || queue->full)
{
- for (i = 0; i < 70; i++)
- {
- q2[i] = 0;
- }
+ for (i = 0; i < RECV_QUEUE_SLOT_LENGTH; i++)
+ src[i] = 0;
+
REG_IME = imeBak;
return FALSE;
}
- for (i = 0; i < 70; i++)
+ for (i = 0; i < RECV_QUEUE_SLOT_LENGTH; i++)
{
- q2[i] = q1->unk_00[q1->unk_8c1][i];
+ src[i] = queue->slots[queue->sendSlot][i];
}
- q1->unk_8c1++;
- q1->unk_8c1 %= 32;
- q1->unk_8c2--;
+ queue->sendSlot++;
+ queue->sendSlot %= RECV_QUEUE_NUM_SLOTS;
+ queue->count--;
REG_IME = imeBak;
return TRUE;
}
-bool8 sub_800D9DC(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2)
+bool8 RfuSendQueue_Dequeue(struct RfuSendQueue *queue, u8 *src)
{
s32 i;
u16 imeBak;
- if (q1->unk_230 == q1->unk_231 || q1->unk_233 != 0)
- {
+ if (queue->recvSlot == queue->sendSlot || queue->full)
return FALSE;
- }
+
imeBak = REG_IME;
REG_IME = 0;
- for (i = 0; i < 14; i++)
- {
- q2[i] = q1->unk_00[q1->unk_231][i];
- }
- q1->unk_231++;
- q1->unk_231 %= 40;
- q1->unk_232--;
+ for (i = 0; i < SEND_QUEUE_SLOT_LENGTH; i++)
+ src[i] = queue->slots[queue->sendSlot][i];
+
+ queue->sendSlot++;
+ queue->sendSlot %= SEND_QUEUE_NUM_SLOTS;
+ queue->count--;
REG_IME = imeBak;
return TRUE;
}
-void sub_800DA68(struct UnkRfuStruct_2_Sub_c1c *q1, const u8 *q2)
+void RfuBackupQueue_Enqueue(struct RfuBackupQueue *queue, const u8 *data)
{
s32 i;
- if (q2[1] == 0)
+ if (data[1] == 0)
{
- sub_800DAC8(q1, NULL);
+ RfuBackupQueue_Dequeue(queue, NULL);
}
else
{
- for (i = 0; i < 14; i++)
- {
- q1->unk_00[q1->unk_1c][i] = q2[i];
- }
- q1->unk_1c++;
- q1->unk_1c %= 2;
- if (q1->unk_1e < 2)
- {
- q1->unk_1e++;
- }
+ for (i = 0; i < BACKUP_QUEUE_SLOT_LENGTH; i++)
+ queue->slots[queue->recvSlot][i] = data[i];
+
+ queue->recvSlot++;
+ queue->recvSlot %= BACKUP_QUEUE_NUM_SLOTS;
+
+ if (queue->count < BACKUP_QUEUE_NUM_SLOTS)
+ queue->count++;
else
- {
- q1->unk_1d = q1->unk_1c;
- }
+ queue->sendSlot = queue->recvSlot;
}
}
-bool8 sub_800DAC8(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2)
+bool8 RfuBackupQueue_Dequeue(struct RfuBackupQueue *queue, u8 *src)
{
s32 i;
- if (q1->unk_1e == 0)
- {
+ if (queue->count == 0)
return FALSE;
- }
- if (q2 != NULL)
+
+ if (src != NULL)
{
- for (i = 0; i < 14; i++)
- {
- q2[i] = q1->unk_00[q1->unk_1d][i];
- }
+ for (i = 0; i < BACKUP_QUEUE_SLOT_LENGTH; i++)
+ src[i] = queue->slots[queue->sendSlot][i];
}
- q1->unk_1d++;
- q1->unk_1d %= 2;
- q1->unk_1e--;
+ queue->sendSlot++;
+ queue->sendSlot %= BACKUP_QUEUE_NUM_SLOTS;
+ queue->count--;
return TRUE;
}
-void sub_800DB18(struct UnkRfuStruct_Sub_Unused *q1, u8 *q2)
+static void RfuUnusedQueue_Enqueue(struct RfuUnusedQueue *queue, u8 *data)
{
s32 i;
- if (q1->unk_202 < 2)
+ if (queue->count < UNUSED_QUEUE_NUM_SLOTS)
{
- for (i = 0; i < 256; i++)
- {
- q1->unk_00[q1->unk_200][i] = q2[i];
- }
- q1->unk_200++;
- q1->unk_200 %= 2;
- q1->unk_202++;
+ for (i = 0; i < UNUSED_QUEUE_SLOT_LENGTH; i++)
+ queue->slots[queue->recvSlot][i] = data[i];
+
+ queue->recvSlot++;
+ queue->recvSlot %= UNUSED_QUEUE_NUM_SLOTS;
+ queue->count++;
}
else
{
- q1->unk_203 = 1;
+ queue->full = TRUE;
}
}
-bool8 sub_800DB84(struct UnkRfuStruct_Sub_Unused *q1, u8 *q2)
+static bool8 RfuUnusedQueue_Dequeue(struct RfuUnusedQueue *queue, u8 *dest)
{
s32 i;
- if (q1->unk_200 == q1->unk_201 || q1->unk_203)
- {
+ if (queue->recvSlot == queue->sendSlot || queue->full)
return FALSE;
- }
- for (i = 0; i < 256; i++)
- {
- q2[i] = q1->unk_00[q1->unk_201][i];
- }
- q1->unk_201++;
- q1->unk_201 %= 2;
- q1->unk_202--;
+
+ for (i = 0; i < UNUSED_QUEUE_SLOT_LENGTH; i++)
+ dest[i] = queue->slots[queue->sendSlot][i];
+
+ queue->sendSlot++;
+ queue->sendSlot %= UNUSED_QUEUE_NUM_SLOTS;
+ queue->count--;
return TRUE;
}
-void sub_800DBF8(u8 *q1, u8 mode)
+// Unused
+static void sub_800DBF8(u8 *q1, u8 mode)
{
s32 i;
u8 rval;
@@ -467,47 +590,47 @@ void sub_800DBF8(u8 *q1, u8 mode)
case 3:
for (i = 0; i < 200; i++)
{
- q1[i] = i + 1 + gUnknown_03000D74;
- r5 += (i + 1 + gUnknown_03000D74) & 0xFF;
+ q1[i] = i + 1 + sUnknown_03000D74;
+ r5 += (i + 1 + sUnknown_03000D74) & 0xFF;
}
*((u16 *)(q1 + i)) = r5;
- gUnknown_03000D74++;
+ sUnknown_03000D74++;
break;
}
}
// File boundary here maybe?
-void PkmnStrToASCII(u8 *q1, const u8 *q2)
+static void PkmnStrToASCII(u8 *asciiStr, const u8 *pkmnStr)
{
s32 i;
- for (i = 0; q2[i] != EOS; i++)
+ for (i = 0; pkmnStr[i] != EOS; i++)
{
- q1[i] = sWireless_RSEtoASCIITable[q2[i]];
+ asciiStr[i] = sWireless_RSEtoASCIITable[pkmnStr[i]];
}
- q1[i] = 0;
+ asciiStr[i] = 0;
}
-void ASCIIToPkmnStr(u8 *q1, const u8 *q2)
+static void ASCIIToPkmnStr(u8 *pkmnStr, const u8 *asciiStr)
{
s32 i;
- for (i = 0; q2[i] != 0; i++)
+ for (i = 0; asciiStr[i] != 0; i++)
{
- q1[i] = sWireless_ASCIItoRSETable[q2[i]];
+ pkmnStr[i] = sWireless_ASCIItoRSETable[asciiStr[i]];
}
- q1[i] = EOS;
+ pkmnStr[i] = EOS;
}
#ifdef NONMATCHING
-u8 sub_800DD1C(u8 maxFlags)
+static u8 GetConnectedChildStrength(u8 maxFlags)
{
u8 flagCount = 0;
u32 flags = gRfuLinkStatus->connSlotFlag;
u8 i;
- if (gRfuLinkStatus->parentChild == 1)
+ if (gRfuLinkStatus->parentChild == MODE_PARENT)
{
for (i = 0; i < 4; flags >>= 1, i++)
{
@@ -530,7 +653,8 @@ u8 sub_800DD1C(u8 maxFlags)
return 0;
}
#else
-NAKED u8 sub_800DD1C(u8 maxFlags)
+NAKED
+static u8 GetConnectedChildStrength(u8 maxFlags)
{
asm_unified("\tpush {r4-r7,lr}\n"
"\tlsls r0, 24\n"
@@ -599,7 +723,7 @@ NAKED u8 sub_800DD1C(u8 maxFlags)
}
#endif
-void sub_800DD94(struct GFtgtGname *data, u8 r9, bool32 r2, s32 r3)
+void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 started, s32 child_sprite_genders)
{
s32 i;
@@ -607,82 +731,91 @@ void sub_800DD94(struct GFtgtGname *data, u8 r9, bool32 r2, s32 r3)
{
data->unk_00.playerTrainerId[i] = gSaveBlock2Ptr->playerTrainerId[i];
}
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- data->child_sprite_gender[i] = r3;
- r3 >>= 8;
+ data->child_sprite_gender[i] = child_sprite_genders;
+ child_sprite_genders >>= 8;
}
data->playerGender = gSaveBlock2Ptr->playerGender;
- data->activity = r9;
- data->started = r2;
+ data->activity = activity;
+ data->started = started;
data->unk_00.language = GAME_LANGUAGE;
data->unk_00.version = GAME_VERSION;
- data->unk_00.hasNews = 0;
- data->unk_00.hasCard = 0;
- data->unk_00.unk_00_6 = 0;
+ data->unk_00.hasNews = FALSE;
+ data->unk_00.hasCard = FALSE;
+ data->unk_00.unknown = FALSE;
data->unk_00.isChampion = FlagGet(FLAG_IS_CHAMPION);
data->unk_00.hasNationalDex = IsNationalPokedexEnabled();
data->unk_00.gameClear = FlagGet(FLAG_SYS_GAME_CLEAR);
}
-bool8 sub_800DE7C(struct GFtgtGname *buff1, u8 *buff2, u8 idx)
+bool8 LinkRfu_GetNameIfCompatible(struct GFtgtGname *buff1, u8 *buff2, u8 idx)
{
bool8 retVal;
- if (lman.parent_child == 1)
+ if (lman.parent_child == MODE_PARENT)
{
retVal = TRUE;
- if (sub_8010454(gRfuLinkStatus->partner[idx].serialNo) && ((gRfuLinkStatus->getNameFlag >> idx) & 1))
+ if (IsRfuSerialNumberValid(gRfuLinkStatus->partner[idx].serialNo) && ((gRfuLinkStatus->getNameFlag >> idx) & 1))
{
- memcpy(buff1, gRfuLinkStatus->partner[idx].gname, 0xD);
+ memcpy(buff1, gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH);
memcpy(buff2, gRfuLinkStatus->partner[idx].uname, PLAYER_NAME_LENGTH + 1);
}
else
{
- memset(buff1, 0, 0xD);
+ memset(buff1, 0, RFU_GAME_NAME_LENGTH);
memset(buff2, 0, PLAYER_NAME_LENGTH + 1);
}
}
else
{
retVal = FALSE;
- if (sub_8010454(gRfuLinkStatus->partner[idx].serialNo))
+ if (IsRfuSerialNumberValid(gRfuLinkStatus->partner[idx].serialNo))
{
- memcpy(buff1, gRfuLinkStatus->partner[idx].gname, 0xD);
+ memcpy(buff1, gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH);
memcpy(buff2, gRfuLinkStatus->partner[idx].uname, PLAYER_NAME_LENGTH + 1);
}
else
{
- memset(buff1, 0, 0xD);
+ memset(buff1, 0, RFU_GAME_NAME_LENGTH);
memset(buff2, 0, PLAYER_NAME_LENGTH + 1);
}
}
return retVal;
}
-bool8 sub_800DF34(struct GFtgtGname *buff1, u8 *buff2, u8 idx)
+bool8 LinkRfu_GetNameIfSerial7F7D(struct GFtgtGname *buff1, u8 *buff2, u8 idx)
{
bool8 retVal = FALSE;
- if (gRfuLinkStatus->partner[idx].serialNo == 0x7F7D)
+ if (gRfuLinkStatus->partner[idx].serialNo == RFU_SERIAL_7F7D)
{
- memcpy(buff1, gRfuLinkStatus->partner[idx].gname, 0xD);
- memcpy(buff2, gRfuLinkStatus->partner[idx].uname, 8);
+ memcpy(buff1, gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH);
+ memcpy(buff2, gRfuLinkStatus->partner[idx].uname, PLAYER_NAME_LENGTH + 1);
retVal = TRUE;
}
else
{
- memset(buff1, 0, 0xD);
- memset(buff2, 0, 8);
+ memset(buff1, 0, RFU_GAME_NAME_LENGTH);
+ memset(buff2, 0, PLAYER_NAME_LENGTH + 1);
}
return retVal;
}
-void sub_800DF90(struct GFtgtGname *buff1, u8 *buff2)
+void LinkRfu3_SetGnameUnameFromStaticBuffers(struct GFtgtGname *buff1, u8 *buff2)
{
- memcpy(buff1, &gUnknown_02022B14, 0xD);
- memcpy(buff2, gUnknown_02022B22, 8);
+ memcpy(buff1, &gHostRFUtgtGnameBuffer, RFU_GAME_NAME_LENGTH);
+ memcpy(buff2, gHostRFUtgtUnameBuffer, PLAYER_NAME_LENGTH + 1);
}
+#define sNextAnimNum data[0]
+#define sSavedAnimNum data[1]
+#define sCurrAnimNum data[2]
+#define sFrameDelay data[3]
+#define sFrameIdx data[4]
+#define sTileStart data[6]
+#define sValidator data[7]
+#define STATUS_INDICATOR_ACTIVE 0x1234 // Used to validate active indicator
+
void CreateWirelessStatusIndicatorSprite(u8 x, u8 y)
{
u8 sprId;
@@ -692,28 +825,28 @@ void CreateWirelessStatusIndicatorSprite(u8 x, u8 y)
x = 0xE7;
y = 0x08;
}
- if (gRfuLinkStatus->parentChild == 1)
+ if (gRfuLinkStatus->parentChild == MODE_PARENT)
{
sprId = CreateSprite(&sWirelessStatusIndicatorSpriteTemplate, x, y, 0);
- gSprites[sprId].data[7] = 0x1234;
- gSprites[sprId].data[6] = GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag);
+ gSprites[sprId].sValidator = STATUS_INDICATOR_ACTIVE;
+ gSprites[sprId].sTileStart = GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag);
gSprites[sprId].invisible = TRUE;
gWirelessStatusIndicatorSpriteId = sprId;
}
else
{
gWirelessStatusIndicatorSpriteId = CreateSprite(&sWirelessStatusIndicatorSpriteTemplate, x, y, 0);
- gSprites[gWirelessStatusIndicatorSpriteId].data[7] = 0x1234;
- gSprites[gWirelessStatusIndicatorSpriteId].data[6] = GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag);
+ gSprites[gWirelessStatusIndicatorSpriteId].sValidator = STATUS_INDICATOR_ACTIVE;
+ gSprites[gWirelessStatusIndicatorSpriteId].sTileStart = GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag);
gSprites[gWirelessStatusIndicatorSpriteId].invisible = TRUE;
}
}
void DestroyWirelessStatusIndicatorSprite(void)
{
- if (gSprites[gWirelessStatusIndicatorSpriteId].data[7] == 0x1234)
+ if (gSprites[gWirelessStatusIndicatorSpriteId].sValidator == STATUS_INDICATOR_ACTIVE)
{
- gSprites[gWirelessStatusIndicatorSpriteId].data[7] = 0;
+ gSprites[gWirelessStatusIndicatorSpriteId].sValidator = 0;
DestroySprite(&gSprites[gWirelessStatusIndicatorSpriteId]);
gMain.oamBuffer[125] = gDummyOamData;
CpuCopy16(&gDummyOamData, (struct OamData *)OAM + 125, sizeof(struct OamData));
@@ -730,11 +863,11 @@ void LoadWirelessStatusIndicatorSpriteGfx(void)
gWirelessStatusIndicatorSpriteId = 0xFF;
}
-u8 sub_800E124(void)
+static u8 GetParentSignalStrength(void)
{
u8 i;
u8 flags = gRfuLinkStatus->connSlotFlag;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
if (flags & 1)
{
@@ -745,104 +878,110 @@ u8 sub_800E124(void)
return 0;
}
-void sub_800E15C(struct Sprite *sprite, s32 signalStrengthAnimNum)
+static void SetWirelessStatusIndicatorAnim(struct Sprite *sprite, s32 animNum)
{
- if (sprite->data[2] != signalStrengthAnimNum)
+ if (sprite->sCurrAnimNum != animNum)
{
- sprite->data[2] = signalStrengthAnimNum;
- sprite->data[3] = 0;
- sprite->data[4] = 0;
+ sprite->sCurrAnimNum = animNum;
+ sprite->sFrameDelay = 0;
+ sprite->sFrameIdx = 0;
}
}
-void sub_800E174(void)
+void UpdateWirelessStatusIndicatorSprite(void)
{
- if (gWirelessStatusIndicatorSpriteId != 0xFF && gSprites[gWirelessStatusIndicatorSpriteId].data[7] == 0x1234)
+ if (gWirelessStatusIndicatorSpriteId != 0xFF && gSprites[gWirelessStatusIndicatorSpriteId].sValidator == STATUS_INDICATOR_ACTIVE)
{
struct Sprite *sprite = &gSprites[gWirelessStatusIndicatorSpriteId];
- u8 signalStrength = 255;
+ u8 signalStrength = RFU_LINK_ICON_LEVEL4_MAX;
u8 i = 0;
- if (gRfuLinkStatus->parentChild == 1)
+ if (gRfuLinkStatus->parentChild == MODE_PARENT)
{
for (i = 0; i < GetLinkPlayerCount() - 1; i++)
{
- if (signalStrength >= sub_800DD1C(i + 1))
+ if (signalStrength >= GetConnectedChildStrength(i + 1))
{
- signalStrength = sub_800DD1C(i + 1);
+ signalStrength = GetConnectedChildStrength(i + 1);
}
}
}
else
{
- signalStrength = sub_800E124();
+ signalStrength = GetParentSignalStrength();
}
- if (sub_8012224() == TRUE)
+ if (IsRfuRecoveringFromLinkLoss() == TRUE)
{
- sprite->data[0] = 4;
+ sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_ERROR;
}
- else if (signalStrength < 25)
+ else if (signalStrength <= RFU_LINK_ICON_LEVEL1_MAX)
{
- sprite->data[0] = 3;
+ sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_SEARCHING;
}
- else if (signalStrength >= 25 && signalStrength < 127)
+ else if (signalStrength >= RFU_LINK_ICON_LEVEL2_MIN && signalStrength <= RFU_LINK_ICON_LEVEL2_MAX)
{
- sprite->data[0] = 2;
+ sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_1_BAR;
}
- else if (signalStrength >= 127 && signalStrength < 229)
+ else if (signalStrength >= RFU_LINK_ICON_LEVEL3_MIN && signalStrength <= RFU_LINK_ICON_LEVEL3_MAX)
{
- sprite->data[0] = 1;
+ sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_2_BARS;
}
- else if (signalStrength >= 229)
+ else if (signalStrength >= RFU_LINK_ICON_LEVEL4_MIN)
{
- sprite->data[0] = 0;
+ sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_3_BARS;
}
- if (sprite->data[0] != sprite->data[1])
+ if (sprite->sNextAnimNum != sprite->sSavedAnimNum)
{
- sub_800E15C(sprite, sprite->data[0]);
- sprite->data[1] = sprite->data[0];
+ SetWirelessStatusIndicatorAnim(sprite, sprite->sNextAnimNum);
+ sprite->sSavedAnimNum = sprite->sNextAnimNum;
}
- if (sprite->anims[sprite->data[2]][sprite->data[4]].frame.duration < sprite->data[3])
+ if (sprite->anims[sprite->sCurrAnimNum][sprite->sFrameIdx].frame.duration < sprite->sFrameDelay)
{
- sprite->data[4]++;
- sprite->data[3] = 0;
- if (sprite->anims[sprite->data[2]][sprite->data[4]].type == -2)
+ sprite->sFrameIdx++;
+ sprite->sFrameDelay = 0;
+ if (sprite->anims[sprite->sCurrAnimNum][sprite->sFrameIdx].type == -2)
{
- sprite->data[4] = 0;
+ sprite->sFrameIdx = 0;
}
}
else
{
- sprite->data[3]++;
+ sprite->sFrameDelay++;
}
gMain.oamBuffer[125] = sWirelessStatusIndicatorOamData;
gMain.oamBuffer[125].x = sprite->pos1.x + sprite->centerToCornerVecX;
gMain.oamBuffer[125].y = sprite->pos1.y + sprite->centerToCornerVecY;
gMain.oamBuffer[125].paletteNum = sprite->oam.paletteNum;
- gMain.oamBuffer[125].tileNum = sprite->data[6] + sprite->anims[sprite->data[2]][sprite->data[4]].frame.imageValue;
+ gMain.oamBuffer[125].tileNum = sprite->sTileStart + sprite->anims[sprite->sCurrAnimNum][sprite->sFrameIdx].frame.imageValue;
CpuCopy16(gMain.oamBuffer + 125, (struct OamData *)OAM + 125, sizeof(struct OamData));
- if (sub_8011A74() == 1)
+ if (RfuGetStatus() == RFU_STATUS_FATAL_ERROR)
{
DestroyWirelessStatusIndicatorSprite();
}
}
}
-void CopyTrainerRecord(struct TrainerNameRecord *dest, u32 trainerId, const u8 *name)
+#undef sNextAnimNum
+#undef sSavedAnimNum
+#undef sCurrAnimNum
+#undef sFrameDelay
+#undef sFrameIdx
+#undef sTileStart
+#undef sValidator
+
+static void CopyTrainerRecord(struct TrainerNameRecord *dest, u32 trainerId, const u8 *name)
{
dest->trainerId = trainerId;
StringCopy(dest->trainerName, name);
}
-bool32 NameIsNotEmpty(const u8 *name)
+static bool32 NameIsNotEmpty(const u8 *name)
{
s32 i;
for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++)
{
if (name[i] != 0)
- {
return TRUE;
- }
}
return FALSE;
}
@@ -856,13 +995,13 @@ void RecordMixTrainerNames(void)
s32 j;
s32 nextSpace;
s32 connectedTrainerRecordIndices[5];
- struct TrainerNameRecord *newRecords = calloc(20, sizeof(struct TrainerNameRecord));
+ struct TrainerNameRecord *newRecords = calloc(ARRAY_COUNT(gSaveBlock1Ptr->trainerNameRecords), sizeof(struct TrainerNameRecord));
// Check if we already have a record saved for connected trainers.
for (i = 0; i < GetLinkPlayerCount(); i++)
{
connectedTrainerRecordIndices[i] = -1;
- for (j = 0; j < 20; j++)
+ for (j = 0; j < (int)ARRAY_COUNT(gSaveBlock1Ptr->trainerNameRecords); j++)
{
if ((u16)gLinkPlayers[i].trainerId == gSaveBlock1Ptr->trainerNameRecords[j].trainerId && StringCompare(gLinkPlayers[i].name, gSaveBlock1Ptr->trainerNameRecords[j].trainerName) == 0)
{
@@ -890,12 +1029,12 @@ void RecordMixTrainerNames(void)
// Copy all non-empty records to the new list, in the order they appear on the old list. If the list is full,
// the last (oldest) records will be dropped.
- for (i = 0; i < 20; i++)
+ for (i = 0; i < (int)ARRAY_COUNT(gSaveBlock1Ptr->trainerNameRecords); i++)
{
if (NameIsNotEmpty(gSaveBlock1Ptr->trainerNameRecords[i].trainerName))
{
CopyTrainerRecord(&newRecords[nextSpace], gSaveBlock1Ptr->trainerNameRecords[i].trainerId, gSaveBlock1Ptr->trainerNameRecords[i].trainerName);
- if (++nextSpace >= 20)
+ if (++nextSpace >= (int)ARRAY_COUNT(gSaveBlock1Ptr->trainerNameRecords))
{
break;
}
@@ -903,25 +1042,22 @@ void RecordMixTrainerNames(void)
}
// Finalize the new list, and clean up.
- memcpy(gSaveBlock1Ptr->trainerNameRecords, newRecords, 20 * sizeof(struct TrainerNameRecord));
+ memcpy(gSaveBlock1Ptr->trainerNameRecords, newRecords, sizeof(gSaveBlock1Ptr->trainerNameRecords));
free(newRecords);
}
}
-bool32 sub_800E540(u16 id, u8 *name)
+bool32 PlayerHasMetTrainerBefore(u16 id, u8 *name)
{
s32 i;
- for (i = 0; i < 20; i++)
+ for (i = 0; i < (int)ARRAY_COUNT(gSaveBlock1Ptr->trainerNameRecords); i++)
{
if (StringCompare(gSaveBlock1Ptr->trainerNameRecords[i].trainerName, name) == 0 && gSaveBlock1Ptr->trainerNameRecords[i].trainerId == id)
- {
return TRUE;
- }
+
if (!NameIsNotEmpty(gSaveBlock1Ptr->trainerNameRecords[i].trainerName))
- {
return FALSE;
- }
}
return FALSE;
}
@@ -930,7 +1066,7 @@ void WipeTrainerNameRecords(void)
{
s32 i;
- for (i = 0; i < 20; i++)
+ for (i = 0; i < (int)ARRAY_COUNT(gSaveBlock1Ptr->trainerNameRecords); i++)
{
gSaveBlock1Ptr->trainerNameRecords[i].trainerId = 0;
CpuFill16(0, gSaveBlock1Ptr->trainerNameRecords[i].trainerName, 8);
diff --git a/src/main.c b/src/main.c
index cf19f39b3..5249d11fa 100644
--- a/src/main.c
+++ b/src/main.c
@@ -113,7 +113,7 @@ void AgbMain()
InitIntrHandlers();
m4aSoundInit();
EnableVCountIntrAtLine150();
- sub_800E6D0();
+ InitRFU();
RtcInit();
CheckForFlashMemory();
InitMainCallbacks();
@@ -367,7 +367,7 @@ static void VBlankIntr(void)
if (!gMain.inBattle || !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_RECORDED)))
Random();
- sub_800E174();
+ UpdateWirelessStatusIndicatorSprite();
INTR_CHECK |= INTR_FLAG_VBLANK;
gMain.intrCheck |= INTR_FLAG_VBLANK;
diff --git a/src/menu.c b/src/menu.c
index 738c904ce..7d5f02b60 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -2107,7 +2107,7 @@ void sub_819A27C(u8 windowId, u16 speciesId, u32 personality, u16 x, u16 y)
BlitBitmapToWindow(windowId, GetMonIconPtr(speciesId, personality, 1), x, y, 32, 32);
}
-void sub_819A2BC(u8 palOffset, u8 palId)
+void ListMenuLoadStdPalAt(u8 palOffset, u8 palId)
{
const u16 *palette;
diff --git a/src/mevent2.c b/src/mevent2.c
index 2991ac27c..7a2edc7f5 100755
--- a/src/mevent2.c
+++ b/src/mevent2.c
@@ -548,12 +548,12 @@ u16 mevent_081445C0(u32 command)
return 0;
}
-void sub_801B940(void)
+void ResetReceivedWonderCardFlag(void)
{
gUnknown_02022C70 = FALSE;
}
-bool32 sub_801B94C(u16 a0)
+bool32 MEventHandleReceivedWonderCard(u16 a0)
{
gUnknown_02022C70 = FALSE;
if (a0 == 0)
@@ -569,7 +569,7 @@ bool32 sub_801B94C(u16 a0)
return TRUE;
}
-void sub_801B990(u32 a0, u32 a1)
+void RecordIdOfWonderCardSenderByEventType(u32 a0, u32 a1)
{
if (gUnknown_02022C70)
{
diff --git a/src/mystery_event_menu.c b/src/mystery_event_menu.c
index 14c00fd96..04902dee8 100644
--- a/src/mystery_event_menu.c
+++ b/src/mystery_event_menu.c
@@ -152,7 +152,7 @@ static void CB2_MysteryEventMenu(void)
if (!IsTextPrinterActive(0))
{
gMain.state++;
- gLinkType = LINKTYPE_0x5501;
+ gLinkType = LINKTYPE_MYSTERY_EVENT;
OpenLink();
}
break;
@@ -206,7 +206,7 @@ static void CB2_MysteryEventMenu(void)
{
if (gReceivedRemoteLinkPlayers != 0)
{
- if (GetLinkPlayerDataExchangeStatusTimed(2, 2) == 3)
+ if (GetLinkPlayerDataExchangeStatusTimed(2, 2) == EXCHANGE_DIFF_SELECTIONS)
{
sub_800AC34();
GetEventLoadMessage(gStringVar4, 1);
diff --git a/src/mystery_gift.c b/src/mystery_gift.c
index 06427d2dd..9672fe0ec 100644
--- a/src/mystery_gift.c
+++ b/src/mystery_gift.c
@@ -30,6 +30,7 @@
#include "link_rfu.h"
#include "mevent_news.h"
#include "mevent_server.h"
+#include "constants/cable_club.h"
void bgid_upload_textbox_1(u8 bgId);
void task_add_00_mystery_gift(void);
@@ -1242,21 +1243,21 @@ void task00_mystery_gift(u8 taskId)
case 0:
if (data->source == 1)
{
- MEvent_CreateTask_CardOrNewsWithFriend(0x15);
+ MEvent_CreateTask_CardOrNewsWithFriend(ACTIVITY_WONDER_CARD2);
}
else if (data->source == 0)
{
- MEvent_CreateTask_CardOrNewsOverWireless(0x15);
+ MEvent_CreateTask_CardOrNewsOverWireless(ACTIVITY_WONDER_CARD2);
}
break;
case 1:
if (data->source == 1)
{
- MEvent_CreateTask_CardOrNewsWithFriend(0x16);
+ MEvent_CreateTask_CardOrNewsWithFriend(ACTIVITY_WONDER_NEWS2);
}
else if (data->source == 0)
{
- MEvent_CreateTask_CardOrNewsOverWireless(0x16);
+ MEvent_CreateTask_CardOrNewsOverWireless(ACTIVITY_WONDER_NEWS2);
}
break;
}
@@ -1269,7 +1270,7 @@ void task00_mystery_gift(u8 taskId)
data->state = 7;
mevent_client_do_init(data->IsCardOrNews);
}
- else if (gSpecialVar_Result == 5)
+ else if (gSpecialVar_Result == LINKUP_FAILED)
{
ClearScreenInBg0(TRUE);
data->state = 3;
@@ -1599,10 +1600,10 @@ void task00_mystery_gift(u8 taskId)
switch (data->IsCardOrNews)
{
case 0:
- MEvent_CreateTask_Leader(21);
+ MEvent_CreateTask_Leader(ACTIVITY_WONDER_CARD2);
break;
case 1:
- MEvent_CreateTask_Leader(22);
+ MEvent_CreateTask_Leader(ACTIVITY_WONDER_NEWS2);
break;
}
data->source = 1;
@@ -1615,7 +1616,7 @@ void task00_mystery_gift(u8 taskId)
ClearScreenInBg0(1);
data->state = 31;
}
- else if (gSpecialVar_Result == 5)
+ else if (gSpecialVar_Result == LINKUP_FAILED)
{
ClearScreenInBg0(1);
data->state = 18;
diff --git a/src/new_game.c b/src/new_game.c
index 290c0c2bb..55a568132 100644
--- a/src/new_game.c
+++ b/src/new_game.c
@@ -197,7 +197,7 @@ void NewGameInitData(void)
WarpToTruck();
ScriptContext2_RunNewScript(EventScript_ResetAllMapFlags);
ResetMiniGamesResults();
- copy_strings_to_sav1();
+ InitUnionRoomChatRegisteredTexts();
InitLilycoveLady();
ResetAllApprenticeData();
ClearRankingHallRecords();
diff --git a/src/overworld.c b/src/overworld.c
index 8937af8f1..ea0d633bc 100644
--- a/src/overworld.c
+++ b/src/overworld.c
@@ -2913,7 +2913,7 @@ bool32 sub_808766C(void)
static u32 GetLinkSendQueueLength(void)
{
if (gWirelessCommType != 0)
- return Rfu.unk_9e8.unk_232;
+ return Rfu.sendQueue.count;
else
return gLink.sendQueue.count;
}
diff --git a/src/party_menu.c b/src/party_menu.c
index c4497e824..e9cbfc2ad 100755
--- a/src/party_menu.c
+++ b/src/party_menu.c
@@ -3527,7 +3527,7 @@ static void CursorCb_Register(u8 taskId)
u16 species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES);
u8 obedience = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_OBEDIENCE);
- switch (CanRegisterMonForTradingBoard(*(struct GFtgtGnameSub *)sub_800F7DC(), species2, species, obedience))
+ switch (CanRegisterMonForTradingBoard(*(struct GFtgtGnameSub *)GetHostRFUtgtGname(), species2, species, obedience))
{
case CANT_REGISTER_MON:
StringExpandPlaceholders(gStringVar4, gText_PkmnCantBeTradedNow);
@@ -3553,7 +3553,7 @@ static void CursorCb_Trade1(u8 taskId)
u16 species2 = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES2);
u16 species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES);
u8 obedience = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_OBEDIENCE);
- u32 stringId = GetUnionRoomTradeMessageId(*(struct GFtgtGnameSub *)sub_800F7DC(), gUnknown_02022C38, species2, gUnionRoomOfferedSpecies, gUnionRoomRequestedMonType, species, obedience);
+ u32 stringId = GetUnionRoomTradeMessageId(*(struct GFtgtGnameSub *)GetHostRFUtgtGname(), gPartnerTgtGnameSub, species2, gUnionRoomOfferedSpecies, gUnionRoomRequestedMonType, species, obedience);
if (stringId != UR_TRADE_MSG_NONE)
{
diff --git a/src/pokemon.c b/src/pokemon.c
index 87ea2551f..a6128572f 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -2725,7 +2725,7 @@ void SetDeoxysStats(void)
}
}
-u16 sub_8068B48(void)
+u16 GetUnionRoomTrainerPic(void)
{
u8 linkId;
u32 arrId;
@@ -2740,7 +2740,7 @@ u16 sub_8068B48(void)
return FacilityClassToPicIndex(gLinkPlayerFacilityClasses[arrId]);
}
-u16 sub_8068BB0(void)
+u16 GetUnionRoomTrainerClass(void)
{
u8 linkId;
u32 arrId;
diff --git a/src/pokemon_jump.c b/src/pokemon_jump.c
index e755b6ca8..33ddee1b5 100755
--- a/src/pokemon_jump.c
+++ b/src/pokemon_jump.c
@@ -216,7 +216,7 @@ static bool32 sub_802C618(void);
static bool32 sub_802C650(void);
static void sub_802C688(int);
static int sub_802C6B0(void);
-static bool32 sub_802C70C(void);
+static bool32 AreLinkQueuesEmpty(void);
static int sub_802C73C(u8 *);
static void sub_802C780(void);
static int sub_802C790(int);
@@ -400,7 +400,7 @@ static const struct PokemonJumpMons gPkmnJumpSpecies[] =
{ .species = SPECIES_BAGON, .unk2 = 1, },
};
-void sub_802A9A8(u16 partyIndex, MainCallback callback)
+void StartPokemonJump(u16 partyIndex, MainCallback callback)
{
u8 taskId;
@@ -876,7 +876,7 @@ static bool32 sub_802B31C(void)
gUnknown_02022CFC->unk8++;
// fall through
case 1:
- if (sub_802C70C())
+ if (AreLinkQueuesEmpty())
return FALSE;
break;
}
@@ -1146,14 +1146,14 @@ static bool32 sub_802B720(void)
}
break;
case 2:
- if (sub_802C70C())
+ if (AreLinkQueuesEmpty())
{
- CreateTask(sub_8153688, 6);
+ CreateTask(Task_LinkSave, 6);
gUnknown_02022CFC->unk8++;
}
break;
case 3:
- if (!FuncIsActiveTask(sub_8153688))
+ if (!FuncIsActiveTask(Task_LinkSave))
{
sub_802DA14();
gUnknown_02022CFC->unk8++;
@@ -2025,9 +2025,9 @@ static int sub_802C6B0(void)
return count;
}
-static bool32 sub_802C70C(void)
+static bool32 AreLinkQueuesEmpty(void)
{
- return !Rfu.unk_124.unk_8c2 && !Rfu.unk_9e8.unk_232;
+ return !Rfu.recvQueue.count && !Rfu.sendQueue.count;
}
static int sub_802C73C(u8 *arg0)
diff --git a/src/record_mixing.c b/src/record_mixing.c
index 3a93d72f8..075bc6aee 100644
--- a/src/record_mixing.c
+++ b/src/record_mixing.c
@@ -169,10 +169,9 @@ static const u8 gUnknown_0858CFBE[3][4] =
#define BUFFER_CHUNK_SIZE 200
-// Note: VAR_0x8005 contains the spotId.
void RecordMixingPlayerSpotTriggered(void)
{
- sub_80B37D4(Task_RecordMixing_Main);
+ CreateTask_EnterCableClubSeat(Task_RecordMixing_Main);
}
// these variables were const in R/S, but had to become changeable because of saveblocks changing RAM position
@@ -232,7 +231,7 @@ static void PrepareExchangePacket(void)
if (Link_AnyPartnersPlayingRubyOrSapphire())
{
- if (sub_800A03C() == 0)
+ if (LinkDummy_Return2() == 0)
PrepareUnknownExchangePacket(&sSentRecord->ruby);
else
PrepareExchangePacketForRubySapphire(&sSentRecord->ruby);
@@ -351,7 +350,7 @@ static void Task_RecordMixing_Main(u8 taskId)
{
tState = 4;
if (gWirelessCommType == 0)
- data[10] = sub_80B3050();
+ data[10] = CreateTask_ReestablishCableClubLink();
PrintTextOnRecordMixing(gText_RecordMixingComplete);
data[8] = 0;
@@ -527,7 +526,7 @@ static void Task_CopyReceiveBuffer(u8 taskId)
u8 status = GetBlockReceivedStatus();
u8 handledPlayers = 0;
- if (status == sub_800A9D8())
+ if (status == GetLinkPlayerCountAsBitFlags())
{
u8 i;
@@ -987,12 +986,12 @@ static void Task_DoRecordMixing(u8 taskId)
case 6:
if (!sub_801048C(FALSE))
{
- CreateTask(sub_8153688, 5);
+ CreateTask(Task_LinkSave, 5);
task->data[0] ++;
}
break;
- case 7: // wait for sub_8153688 to finish.
- if (!FuncIsActiveTask(sub_8153688))
+ case 7: // wait for Task_LinkSave to finish.
+ if (!FuncIsActiveTask(Task_LinkSave))
{
if (gWirelessCommType)
{
diff --git a/src/save.c b/src/save.c
index c19aff4d8..09e1b7aae 100644
--- a/src/save.c
+++ b/src/save.c
@@ -897,74 +897,78 @@ u32 TryWriteSpecialSaveSection(u8 sector, u8* src)
return SAVE_STATUS_OK;
}
-void sub_8153688(u8 taskId)
+#define tState data[0]
+#define tTimer data[1]
+#define tPartialSave data[2]
+
+void Task_LinkSave(u8 taskId)
{
- s16* taskData = gTasks[taskId].data;
+ s16* data = gTasks[taskId].data;
- switch (taskData[0])
+ switch (tState)
{
case 0:
gSoftResetDisabled = TRUE;
- taskData[0] = 1;
+ tState = 1;
break;
case 1:
sub_800ADF8();
- taskData[0] = 2;
+ tState = 2;
break;
case 2:
if (IsLinkTaskFinished())
{
- if (taskData[2] == 0)
+ if (!tPartialSave)
save_serialize_map();
- taskData[0] = 3;
+ tState = 3;
}
break;
case 3:
- if (taskData[2] == 0)
+ if (!tPartialSave)
SetContinueGameWarpStatusToDynamicWarp();
sub_8153380();
- taskData[0] = 4;
+ tState = 4;
break;
case 4:
- if (++taskData[1] == 5)
+ if (++tTimer == 5)
{
- taskData[1] = 0;
- taskData[0] = 5;
+ tTimer = 0;
+ tState = 5;
}
break;
case 5:
if (sub_81533AC())
- taskData[0] = 6;
+ tState = 6;
else
- taskData[0] = 4;
+ tState = 4;
break;
case 6:
sub_81533E0();
- taskData[0] = 7;
+ tState = 7;
break;
case 7:
- if (taskData[2] == 0)
+ if (!tPartialSave)
ClearContinueGameWarpStatus2();
sub_800ADF8();
- taskData[0] = 8;
+ tState = 8;
break;
case 8:
if (IsLinkTaskFinished())
{
sub_8153408();
- taskData[0] = 9;
+ tState = 9;
}
break;
case 9:
sub_800ADF8();
- taskData[0] = 10;
+ tState = 10;
break;
case 10:
if (IsLinkTaskFinished())
- taskData[0]++;
+ tState++;
break;
case 11:
- if (++taskData[1] > 5)
+ if (++tTimer > 5)
{
gSoftResetDisabled = FALSE;
DestroyTask(taskId);
@@ -972,3 +976,7 @@ void sub_8153688(u8 taskId)
break;
}
}
+
+#undef tState
+#undef tTimer
+#undef tPartialSave
diff --git a/src/scrcmd.c b/src/scrcmd.c
index 9e62c45c5..d7c18fb38 100644
--- a/src/scrcmd.c
+++ b/src/scrcmd.c
@@ -1185,22 +1185,22 @@ bool8 ScrCmd_setobjectmovementtype(struct ScriptContext *ctx)
bool8 ScrCmd_createvobject(struct ScriptContext *ctx)
{
u8 graphicsId = ScriptReadByte(ctx);
- u8 v2 = ScriptReadByte(ctx);
+ u8 objectEventId = ScriptReadByte(ctx);
u16 x = VarGet(ScriptReadHalfword(ctx));
u32 y = VarGet(ScriptReadHalfword(ctx));
u8 elevation = ScriptReadByte(ctx);
u8 direction = ScriptReadByte(ctx);
- sprite_new(graphicsId, v2, x, y, elevation, direction);
+ CreateObjectSprite(graphicsId, objectEventId, x, y, elevation, direction);
return FALSE;
}
bool8 ScrCmd_turnvobject(struct ScriptContext *ctx)
{
- u8 v1 = ScriptReadByte(ctx);
+ u8 objectEventId = ScriptReadByte(ctx);
u8 direction = ScriptReadByte(ctx);
- sub_8097B78(v1, direction);
+ TurnObjectEventSprite(objectEventId, direction);
return FALSE;
}
diff --git a/src/start_menu.c b/src/start_menu.c
index 4b6fce57b..88ad364c7 100644
--- a/src/start_menu.c
+++ b/src/start_menu.c
@@ -133,8 +133,8 @@ static u8 BattlePyramidRetireInputCallback(void);
// Task callbacks
static void StartMenuTask(u8 taskId);
static void SaveGameTask(u8 taskId);
-static void sub_80A0550(u8 taskId);
-static void sub_80A08A4(u8 taskId);
+static void Task_SaveAfterLinkBattle(u8 taskId);
+static void Task_WaitForBattleTowerLinkSave(u8 taskId);
static bool8 FieldCB_ReturnToFieldStartMenu(void);
static const struct WindowTemplate sSafariBallsWindowTemplate = {0, 1, 1, 9, 4, 0xF, 8};
@@ -219,8 +219,8 @@ static bool8 SaveSuccesTimer(void);
static bool8 SaveErrorTimer(void);
static void InitBattlePyramidRetire(void);
static void sub_80A03D8(void);
-static bool32 sub_80A03E4(u8 *par1);
-static void sub_80A0540(void);
+static bool32 InitSaveWindowAfterLinkBattle(u8 *par1);
+static void CB2_SaveAfterLinkBattle(void);
static void ShowSaveInfoWindow(void);
static void RemoveSaveInfoWindow(void);
static void HideStartMenuWindow(void);
@@ -525,7 +525,7 @@ void Task_ShowStartMenu(u8 taskId)
{
case 0:
if (InUnionRoom() == TRUE)
- var_800D_set_xB();
+ SetUsingUnionRoomStartMenu();
gMenuCallback = HandleStartMenuInput;
task->data[0]++;
@@ -1159,9 +1159,9 @@ static void sub_80A03D8(void)
TransferPlttBuffer();
}
-static bool32 sub_80A03E4(u8 *par1)
+static bool32 InitSaveWindowAfterLinkBattle(u8 *state)
{
- switch (*par1)
+ switch (*state)
{
case 0:
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0);
@@ -1193,43 +1193,43 @@ static bool32 sub_80A03E4(u8 *par1)
return TRUE;
}
- (*par1)++;
+ (*state)++;
return FALSE;
}
-void sub_80A0514(void)
+void CB2_SetUpSaveAfterLinkBattle(void)
{
- if (sub_80A03E4(&gMain.state))
+ if (InitSaveWindowAfterLinkBattle(&gMain.state))
{
- CreateTask(sub_80A0550, 0x50);
- SetMainCallback2(sub_80A0540);
+ CreateTask(Task_SaveAfterLinkBattle, 0x50);
+ SetMainCallback2(CB2_SaveAfterLinkBattle);
}
}
-static void sub_80A0540(void)
+static void CB2_SaveAfterLinkBattle(void)
{
RunTasks();
UpdatePaletteFade();
}
-static void sub_80A0550(u8 taskId)
+static void Task_SaveAfterLinkBattle(u8 taskId)
{
- s16 *step = gTasks[taskId].data;
+ s16 *state = gTasks[taskId].data;
if (!gPaletteFade.active)
{
- switch (*step)
+ switch (*state)
{
case 0:
FillWindowPixelBuffer(0, PIXEL_FILL(1));
AddTextPrinterParameterized2(0,
1,
gText_SavingDontTurnOffPower,
- 255,
+ TEXT_SPEED_FF,
NULL,
- 2,
- 1,
- 3);
+ TEXT_COLOR_DARK_GREY,
+ TEXT_COLOR_WHITE,
+ TEXT_COLOR_LIGHT_GREY);
DrawTextBorderOuter(0, 8, 14);
PutWindowTilemap(0);
CopyWindowToVram(0, 3);
@@ -1237,37 +1237,37 @@ static void sub_80A0550(u8 taskId)
if (gWirelessCommType != 0 && InUnionRoom())
{
- if (sub_800A07C())
+ if (Link_AnyPartnersPlayingFRLG_JP())
{
- *step = 1;
+ *state = 1;
}
else
{
- *step = 5;
+ *state = 5;
}
}
else
{
gSoftResetDisabled = 1;
- *step = 1;
+ *state = 1;
}
break;
case 1:
SetContinueGameWarpStatusToDynamicWarp();
FullSaveGame();
- *step = 2;
+ *state = 2;
break;
case 2:
if (CheckSaveFile())
{
ClearContinueGameWarpStatus2();
- *step = 3;
+ *state = 3;
gSoftResetDisabled = 0;
}
break;
case 3:
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
- *step = 4;
+ *state = 4;
break;
case 4:
FreeAllWindowBuffers();
@@ -1275,13 +1275,13 @@ static void sub_80A0550(u8 taskId)
DestroyTask(taskId);
break;
case 5:
- CreateTask(sub_8153688, 0x5);
- *step = 6;
+ CreateTask(Task_LinkSave, 5);
+ *state = 6;
break;
case 6:
- if (!FuncIsActiveTask(sub_8153688))
+ if (!FuncIsActiveTask(Task_LinkSave))
{
- *step = 3;
+ *state = 3;
}
break;
}
@@ -1357,22 +1357,26 @@ static void RemoveSaveInfoWindow(void)
RemoveWindow(sSaveInfoWindowId);
}
-static void sub_80A08A4(u8 taskId)
+static void Task_WaitForBattleTowerLinkSave(u8 taskId)
{
- if (!FuncIsActiveTask(sub_8153688))
+ if (!FuncIsActiveTask(Task_LinkSave))
{
DestroyTask(taskId);
EnableBothScriptContexts();
}
}
-void sub_80A08CC(void)
+#define tPartialSave data[2]
+
+void SaveForBattleTowerLink(void)
{
- u8 taskId = CreateTask(sub_8153688, 0x5);
- gTasks[taskId].data[2] = 1;
- gTasks[CreateTask(sub_80A08A4, 0x6)].data[1] = taskId;
+ u8 taskId = CreateTask(Task_LinkSave, 5);
+ gTasks[taskId].tPartialSave = TRUE;
+ gTasks[CreateTask(Task_WaitForBattleTowerLinkSave, 6)].data[1] = taskId;
}
+#undef tPartialSave
+
static void HideStartMenuWindow(void)
{
ClearStdWindowAndFrame(GetStartMenuWindowId(), TRUE);
diff --git a/src/strings.c b/src/strings.c
index 3ca7f693f..f01ab8ec6 100644
--- a/src/strings.c
+++ b/src/strings.c
@@ -1261,10 +1261,10 @@ const u8 gJPText_PlayersXPokemon[] = _("{SPECIAL_F7 0x00}の{SPECIAL_F7 0x01}ひ
const u8 gJPText_PlayersXPokmonDoesNotExist[] = _("{SPECIAL_F7 0x00}の{SPECIAL_F7 0x01}ひきめは いません"); // Unused
const u8 gText_ExitingChat[] = _("Exiting the chat…");
const u8 gText_LeaderLeftEndingChat[] = _("The LEADER, {SPECIAL_F7 0x00}, has\nleft, ending the chat.");
-const u8 gText_RegisteredTextChanged[] = _("The registered text has been changed.\nIs it okay to save the game?");
-const u8 gText_AlreadySavedFile_Unused[] = _("There is already a saved file.\nIs it okay to overwrite it?");
-const u8 gText_SavingDontTurnOff_Unused[] = _("SAVING…\nDON'T TURN OFF THE POWER.");
-const u8 gText_PlayerSavedGame_Unused[] = _("{SPECIAL_F7 0x00} saved the game.");
+const u8 gText_RegisteredTextChangedOKToSave[] = _("The registered text has been changed.\nIs it okay to save the game?");
+const u8 gText_AlreadySavedFile_Chat[] = _("There is already a saved file.\nIs it okay to overwrite it?");
+const u8 gText_SavingDontTurnOff_Chat[] = _("SAVING…\nDON'T TURN OFF THE POWER.");
+const u8 gText_PlayerSavedGame_Chat[] = _("{SPECIAL_F7 0x00} saved the game.");
const u8 gText_IfLeaderLeavesChatEnds[] = _("If the LEADER leaves, the chat\nwill end. Is that okay?");
const u8 gText_Hello[] = _("HELLO");
const u8 gText_Pokemon2[] = _("POKéMON");
@@ -1492,7 +1492,7 @@ const u8 gText_FrameTypeNumber[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}");
const u8 gText_ButtonTypeNormal[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}NORMAL");
const u8 gText_ButtonTypeLR[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}LR");
const u8 gText_ButtonTypeLEqualsA[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}L=A");
-const u8 gText_XPLink[] = _("{STR_VAR_1}P LINK");
+const u8 gText_NumPlayerLink[] = _("{STR_VAR_1}P LINK");
const u8 gText_BronzeCard[] = _("BRONZE");
const u8 gText_CopperCard[] = _("COPPER");
const u8 gText_SilverCard[] = _("SILVER");
diff --git a/src/trade.c b/src/trade.c
index e22180ae9..3a0f07ac6 100644
--- a/src/trade.c
+++ b/src/trade.c
@@ -52,6 +52,7 @@
#include "constants/rgb.h"
#include "constants/species.h"
#include "constants/songs.h"
+#include "constants/union_room.h"
#define Trade_SendData(ptr) (SendBlock(bitmask_all_link_players_but_self(), ptr->linkData, 20))
@@ -234,7 +235,7 @@ static void CB2_SaveAndEndWirelessTrade(void);
static bool8 SendLinkData(const void *linkData, u32 size)
{
- if (gUnknown_02022C2C == 29)
+ if (gPlayerCurrActivity == ACTIVITY_29)
{
rfu_NI_setSendData(lman.acceptSlot_flag, 84, linkData, size);
return TRUE;
@@ -252,7 +253,7 @@ static void sub_80771AC(u8 a0)
static bool32 sub_80771BC(void)
{
- if (gUnknown_02022C2C == 29)
+ if (gPlayerCurrActivity == ACTIVITY_29)
{
if (gRfuSlotStatusNI[sub_800E87C(lman.acceptSlot_flag)]->send.state == 0)
return TRUE;
@@ -288,7 +289,7 @@ static void TradeResetReceivedFlag(u32 who)
static bool32 IsWirelessTrade(void)
{
- if (gWirelessCommType && gUnknown_02022C2C == 29)
+ if (gWirelessCommType && gPlayerCurrActivity == ACTIVITY_29)
return TRUE;
else
return FALSE;
@@ -388,20 +389,20 @@ static void CB2_CreateTradeMenu(void)
if (!gReceivedRemoteLinkPlayers)
{
- gLinkType = LINKTYPE_0x1122;
+ gLinkType = LINKTYPE_TRADE_CONNECTING;
sTradeMenuData->timer = 0;
if (gWirelessCommType)
{
- sub_800B488();
+ SetWirelessCommType1();
OpenLink();
- sub_8011BA4();
+ CreateTask_RfuIdle();
}
else
{
OpenLink();
gMain.state++;
- CreateTask(task00_08081A90, 1);
+ CreateTask(Task_WaitForLinkPlayerConnection, 1);
}
}
else
@@ -437,7 +438,7 @@ static void CB2_CreateTradeMenu(void)
case 4:
if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE)
{
- sub_8011BD0();
+ DestroyTask_RfuIdle();
CalculatePlayerPartyCount();
gMain.state++;
sTradeMenuData->timer = 0;
@@ -2749,7 +2750,7 @@ void CB2_LinkTrade(void)
case 0:
if (!gReceivedRemoteLinkPlayers)
{
- gLinkType = LINKTYPE_0x1144;
+ gLinkType = LINKTYPE_TRADE_DISCONNECTED;
CloseLink();
}
sTradeData = AllocZeroed(sizeof(*sTradeData));
@@ -4596,7 +4597,7 @@ static void CB2_SaveAndEndTrade(void)
IncrementGameStat(GAME_STAT_POKEMON_TRADES);
if (gWirelessCommType)
{
- sub_801B990(2, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);
+ RecordIdOfWonderCardSenderByEventType(2, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);
}
SetContinueGameWarpStatusToDynamicWarp();
sub_8153380();
diff --git a/src/union_room.c b/src/union_room.c
index cd45907f5..1ef8cd4cb 100644
--- a/src/union_room.c
+++ b/src/union_room.c
@@ -41,6 +41,7 @@
#include "trade.h"
#include "trainer_card.h"
#include "union_room.h"
+#include "union_room_battle.h"
#include "union_room_chat.h"
#include "union_room_player_avatar.h"
#include "window.h"
@@ -52,158 +53,293 @@
#include "constants/rgb.h"
#include "constants/songs.h"
#include "constants/species.h"
-#include "constants/union_room.h"
-
-EWRAM_DATA u8 sUnionRoomPlayerName[12] = {};
-EWRAM_DATA u8 gUnknown_02022C2C = 0;
-EWRAM_DATA u8 gUnknown_02022C2D = 0;
-EWRAM_DATA union UnkUnion_Main gUnknown_02022C30 = {};
-EWRAM_DATA u32 gFiller_02022C34 = 0;
-EWRAM_DATA struct GFtgtGnameSub gUnknown_02022C38 = {};
+
+// States for Task_RunUnionRoom
+enum {
+ UR_STATE_INIT,
+ UR_STATE_INIT_OBJECTS,
+ UR_STATE_INIT_LINK,
+ UR_STATE_CHECK_SELECTING_MON,
+ UR_STATE_MAIN,
+ UR_STATE_DO_SOMETHING_PROMPT,
+ UR_STATE_HANDLE_DO_SOMETHING_PROMPT_INPUT,
+ UR_STATE_DO_SOMETHING_PROMPT_2,
+ UR_STATE_PRINT_MSG,
+ UR_STATE_HANDLE_ACTIVITY_REQUEST,
+ UR_STATE_DECLINE_ACTIVITY_REQUEST,
+ UR_STATE_PLAYER_CONTACTED_YOU,
+ UR_STATE_RECV_CONTACT_DATA,
+ UR_STATE_PRINT_START_ACTIVITY_MSG,
+ UR_STATE_START_ACTIVITY_LINK,
+ UR_STATE_START_ACTIVITY_WAIT_FOR_LINK,
+ UR_STATE_START_ACTIVITY_FREE_UROOM,
+ UR_STATE_START_ACTIVITY_FADE,
+ UR_STATE_START_ACTIVITY,
+ UR_STATE_RECV_JOIN_CHAT_REQUEST,
+ UR_STATE_TRY_ACCEPT_CHAT_REQUEST_DELAY,
+ UR_STATE_TRY_ACCEPT_CHAT_REQUEST,
+ UR_STATE_ACCEPT_CHAT_REQUEST,
+ UR_STATE_WAIT_FOR_START_MENU,
+ UR_STATE_INTERACT_WITH_PLAYER,
+ UR_STATE_TRY_COMMUNICATING,
+ UR_STATE_PRINT_AND_EXIT,
+ UR_STATE_SEND_ACTIVITY_REQUEST,
+ UR_STATE_TRAINER_APPEARS_BUSY,
+ UR_STATE_WAIT_FOR_RESPONSE_TO_REQUEST,
+ UR_STATE_CANCEL_ACTIVITY_LINK_ERROR,
+ UR_STATE_SEND_TRADE_REQUST,
+ UR_STATE_REQUEST_DECLINED,
+ UR_STATE_PRINT_CONTACT_MSG,
+ UR_STATE_HANDLE_CONTACT_DATA,
+ UR_STATE_RECV_ACTIVITY_REQUEST,
+ UR_STATE_CANCEL_REQUEST_PRINT_MSG,
+ UR_STATE_CANCEL_REQUEST_RESTART_LINK,
+ UR_STATE_COMMUNICATING_WAIT_FOR_DATA,
+ UR_STATE_WAIT_FOR_CONTACT_DATA,
+ UR_STATE_PRINT_CARD_INFO,
+ UR_STATE_WAIT_FINISH_READING_CARD,
+ UR_STATE_INTERACT_WITH_ATTENDANT,
+ UR_STATE_REGISTER_PROMPT,
+ UR_STATE_CANCEL_REGISTRATION_PROMPT,
+ UR_STATE_CHECK_TRADING_BOARD,
+ UR_STATE_TRADING_BOARD_LOAD,
+ UR_STATE_REGISTER_PROMPT_HANDLE_INPUT,
+ UR_STATE_TRADING_BOARD_HANDLE_INPUT,
+ UR_STATE_TRADE_PROMPT,
+ UR_STATE_TRADE_SELECT_MON,
+ UR_STATE_TRADE_OFFER_MON,
+ UR_STATE_REGISTER_REQUEST_TYPE,
+ UR_STATE_REGISTER_SELECT_MON_FADE,
+ UR_STATE_REGISTER_SELECT_MON,
+ UR_STATE_REGISTER_COMPLETE,
+ UR_STATE_CANCEL_REGISTRATION,
+};
+
+// States for sUnionRoomTrade.state
+enum {
+ URTRADE_STATE_NONE,
+ URTRADE_STATE_REGISTERING,
+ URTRADE_STATE_OFFERING,
+};
+
+// States for Task_TryBecomeLinkLeader
+enum {
+ LL_STATE_INIT,
+ LL_STATE_INIT2 = 3,
+ LL_STATE_GET_AWAITING_PLAYERS_TEXT,
+ LL_STATE_PRINT_AWAITING_PLAYERS,
+ LL_STATE_AWAIT_PLAYERS,
+ LL_STATE_ACCEPT_NEW_MEMBER_PROMPT,
+ LL_STATE_9 = 9,
+ LL_STATE_MEMBER_LEFT,
+ LL_STATE_ACCEPT_NEW_MEMBER_PROMPT_HANDLE_INPUT,
+ LL_STATE_UPDATE_AFTER_JOIN_REQUEST,
+ LL_STATE_ACCEPTED_FINAL_MEMBER,
+ LL_STATE_WAIT_AND_CONFIRM_MEMBERS,
+ LL_STATE_MEMBERS_OK_PROMPT,
+ LL_STATE_MEMBERS_OK_PROMPT_HANDLE_INPUT,
+ LL_STATE_CONFIRMED_MEMBERS,
+ LL_STATE_FINAL_MEMBER_CHECK,
+ LL_STATE_CANCEL_PROMPT,
+ LL_STATE_CANCEL_PROMPT_HANDLE_INPUT,
+ LL_STATE_SHUTDOWN_AND_RETRY,
+ LL_STATE_RETRY,
+ LL_STATE_SHUTDOWN_AND_FAIL,
+ LL_STATE_FAILED,
+ LL_STATE_TRY_START_ACTIVITY = 26,
+ LL_STATE_MEMBER_DISCONNECTED = 29,
+ LL_STATE_CANCEL_WITH_MSG
+};
+
+// States for Task_TryJoinLinkGroup
+enum {
+ LG_STATE_INIT,
+ LG_STATE_CHOOSE_LEADER_MSG,
+ LG_STATE_INIT_WINDOWS,
+ LG_STATE_CHOOSE_LEADER_HANDLE_INPUT,
+ LG_STATE_ASK_JOIN_GROUP = 5,
+ LG_STATE_MAIN,
+ LG_STATE_ASK_LEAVE_GROUP,
+ LG_STATE_ASK_LEAVE_GROUP_HANDLE_INPUT,
+ LG_STATE_WAIT_LEAVE_GROUP,
+ LG_STATE_CANCEL_CHOOSE_LEADER,
+ LG_STATE_CANCELED,
+ LG_STATE_RFU_ERROR,
+ LG_STATE_RFU_ERROR_SHUTDOWN,
+ LG_STATE_DISCONNECTED,
+ LG_STATE_RETRY_CONNECTION,
+ LG_STATE_TRADE_NOT_READY = 18,
+ LG_STATE_TRADE_NOT_READY_RETRY,
+ LG_STATE_READY_START_ACTIVITY,
+ LG_STATE_START_ACTIVITY,
+ LG_STATE_SHUTDOWN = 23,
+};
+
+static EWRAM_DATA u8 sUnionRoomPlayerName[12] = {};
+EWRAM_DATA u8 gPlayerCurrActivity = 0;
+static EWRAM_DATA u8 sPlayerActivityGroupSize = 0;
+static EWRAM_DATA union WirelessLink_Main sWirelessLinkMain = {};
+static EWRAM_DATA u32 sUnused = 0;
+EWRAM_DATA struct GFtgtGnameSub gPartnerTgtGnameSub = {};
EWRAM_DATA u16 gUnionRoomOfferedSpecies = 0;
EWRAM_DATA u8 gUnionRoomRequestedMonType = 0;
static EWRAM_DATA struct UnionRoomTrade sUnionRoomTrade = {};
// IWRAM vars
-static struct UnkStruct_Leader *gUnknown_03000DA0;
-static struct UnkStruct_Group *gUnknown_03000DA4;
-static struct UnkStruct_URoom *gUnknown_03000DA8;
+static struct WirelessLink_Leader *sLeader;
+static struct WirelessLink_Group *sGroup;
+static struct WirelessLink_URoom *sURoom;
// this file's functions
-void sub_80173E0(u8 windowId, u8 arg1, const u8 *str, u8 arg3, u8 arg4, u8 arg5);
-u16 ReadAsU16(const u8 *ptr);
-void sub_8012780(u8 taskId);
-void sub_80134E8(u8 taskId);
-void sub_8013C7C(u8 taskId);
-void sub_8014A40(u8 taskId);
-void sub_8014F48(u8 taskId);
-void sub_80152F4(u8 taskId);
-void sub_80156E0(u8 taskId);
-void sub_80175EC(struct UnkStruct_Main4 *arg0, u8 count);
-void sub_8017580(struct UnkStruct_x20 *arg0, u8 count);
-u8 sub_8016FC0(struct UnkStruct_Main4 *arg0, u32 arg1);
-u8 sub_8016FF0(struct UnkStruct_Main4 *arg0, u32 arg1);
-bool8 PrintOnTextbox(u8 *textState, const u8 *str);
-bool8 sub_801320C(struct UnkStruct_Leader *data, u32 arg1, u32 arg2);
-u8 sub_8013398(struct UnkStruct_Main0 *arg0);
-s8 sub_80170B8(u8 *arg0, bool32 arg1);
-void sub_8018404(u8 *dest, struct UnkStruct_x20 *arg1);
-void sub_8012F64(struct UnkStruct_Leader *data);
-void sub_80149C4(void);
-u8 sub_80132D4(struct UnkStruct_Main0 *arg0);
-void sub_80178A0(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 *arg3, u8 arg4, u8 id);
-u32 sub_80176E4(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1);
-u8 sub_8017734(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1, u8 arg2);
-u8 sub_8013E44(void);
-u32 sub_8013B8C(struct UnkStruct_Group *arg0, s32 id);
-void sub_8013BD8(struct UnkStruct_Group *arg0, s32 id);
-void sub_80173D4(void);
-void sub_80177B8(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 *arg3, u8 arg4, u8 id);
-bool32 sub_8017678(struct UnkStruct_Shared *arg0, struct UnkStruct_Shared *arg1);
-static u32 GetPartyPositionOfRegisteredMon(struct UnionRoomTrade *arg0, u8 multiplayerId);
-static void ResetUnionRoomTrade(struct UnionRoomTrade *arg0);
-void sub_801AC54(void);
-void sub_80149D8(void);
-void MG_DrawTextBorder(u8 windowId);
-s8 mevent_message_print_and_prompt_yes_no(u8 *textState, u8 *arg1, u8 arg2, const u8 *str);
-bool32 sub_8016F1C(struct GFtgtGname *arg0, s16 arg1);
-u8 sub_8016DF0(struct UnkStruct_Main4 *arg0, struct UnkStruct_Main4 *arg1, u32 arg2);
-void sub_8019F2C(void);
-static bool32 RegisterTradeMonAndGetIsEgg(u32 monId, struct UnionRoomTrade *trade);
-static void RegisterTradeMon(u32 monId, struct UnionRoomTrade *arg1);
-void sub_80181CC(void);
-bool32 sub_8017940(void);
-u8 sub_8016B00(void);
-void sub_801A274(struct UnkStruct_URoom *arg0);
-bool32 sub_8017FD8(struct UnkStruct_URoom *arg0);
-void sub_801689C(struct UnkStruct_URoom *arg0);
-u8 sub_80181DC(struct UnkStruct_URoom *arg0);
-bool32 sub_80168DC(struct UnkStruct_URoom *arg0);
-bool32 sub_801704C(void);
-s32 sub_8017CF8(s32 arg1, struct UnkStruct_Main0 *arg0);
-s32 sub_80179D4(struct UnkStruct_Main0 *arg0, u8 arg1, u8 arg2, u32 playerGender);
-void sub_801818C(bool32 arg0);
-s32 sub_8017178(u8 *arg0, u8 *arg1, u8 *arg2, const struct WindowTemplate *winTemplate, const struct ListMenuTemplate *menuTemplate);
-s32 sub_80172A0(u8 *arg0, u8 *arg1, u8 *arg2, u8 *arg3, const struct WindowTemplate *winTemplate, const struct ListMenuTemplate *menuTemplate, struct UnkStruct_Main0 *arg6);
-s32 sub_8017CB0(struct UnkStruct_x20 * arg, s32 arg1);
-bool32 HasAtLeastTwoMonsOfLevel30OrLower(void);
-u32 sub_8017984(s32 arg0);
-void sub_8018220(u8 *unused, struct UnkStruct_URoom *arg1, bool8 arg2);
-void sub_8017D9C(u8 *dst, s32 arg1, u32 playerGender);
-u32 sub_80179AC(struct UnkStruct_x20 *arg0);
-void sub_8017E00(u8 *dst, u8 arg1);
-void sub_80173B0(void);
-s32 sub_8017D04(u32 type, u32 species);
-bool32 sub_8017020(const u8 *src);
-u8 sub_8019BA8(struct UnkStruct_8019BA8 * );
-s32 sub_8017EA0(u8 *dst, u32 gender, u16 *arg2, struct UnkStruct_URoom *arg3);
-void sub_801697C(u8 taskId);
-bool8 sub_8017630(struct UnkStruct_Shared* arg0, const struct UnkStruct_Shared* arg1);
-void sub_8013278(u8 windowId, s32 itemId, u8 y);
-void sub_8013DF4(u8 windowId, s32 itemId, u8 y);
-void sub_8017BE8(u8 windowId, s32 itemId, u8 y);
-void nullsub_14(u8 windowId, s32 itemId, u8 y);
+static void UR_AddTextPrinterParameterized(u8, u8, const u8 *, u8, u8, u8);
+static u16 ReadAsU16(const u8 *);
+static void Task_TryBecomeLinkLeader(u8);
+static void Task_TryJoinLinkGroup(u8);
+static void Task_ListenToWireless(u8);
+static void Task_MEvent_Leader(u8);
+static void Task_CardOrNewsWithFriend(u8);
+static void Task_CardOrNewsOverWireless(u8);
+static void Task_RunUnionRoom(u8);
+static void ClearUnkStruct_x1CArray(struct UnkStruct_Main4 *, u8);
+static void ClearUnkStruct_x20Array(struct UnkStruct_x20 *, u8);
+static u8 CreateTask_ListenForPartnersWithCompatibleSerialNos(struct UnkStruct_Main4 *, u32);
+static u8 CreateTask_ListenForPartnersWithSerial7F7D(struct UnkStruct_Main4 *, u32 );
+static bool8 PrintOnTextbox(u8 *, const u8 *);
+static bool8 Leader_SetStateIfMemberListChanged(struct WirelessLink_Leader *, u32, u32);
+static u8 sub_8013398(struct UnkStruct_Main0 *);
+static s8 UnionRoomHandleYesNo(u8 *, bool32);
+static void IntlConvPartnerUname7(u8 *, struct UnkStruct_x20 *);
+static void Leader_DestroyResources(struct WirelessLink_Leader *);
+static void CreateTask_RunScriptAndFadeToActivity(void);
+static u8 LeaderUpdateGroupMembership(struct UnkStruct_Main0 *);
+static void PrintGroupMemberCandidateOnWindowWithColor(u8, u8, u8, struct UnkStruct_x20 *, u8, u8 );
+static u32 Findx20Inx1CArray(struct UnkStruct_x20 *, struct UnkStruct_x1C *);
+static u8 Appendx1Ctox20(struct UnkStruct_x20 *, struct UnkStruct_x1C *, u8);
+static u8 GetNewLeaderCandidate(void);
+static u32 IsTryingToTradeAcrossVersionTooSoon(struct WirelessLink_Group *, s32);
+static void AskToJoinRfuGroup(struct WirelessLink_Group *, s32);
+static void JoinGroup_EnableScriptContexts(void);
+static void PrintUnionRoomGroupOnWindow(u8, u8, u8, struct UnkStruct_x20 *, u8, u8);
+static bool32 AreUnionRoomPlayerGnamesDifferent(struct WirelessGnameUnamePair *, struct WirelessGnameUnamePair *);
+static u32 GetPartyPositionOfRegisteredMon(struct UnionRoomTrade *, u8);
+static void ResetUnionRoomTrade(struct UnionRoomTrade *);
+static void CreateTask_StartActivity(void);
+static bool32 HasWonderCardOrNewsByLinkGroup(struct GFtgtGname *, s16);
+static u8 CreateTask_SearchForChildOrParent(struct UnkStruct_Main4 *, struct UnkStruct_Main4 *, u32);
+static bool32 RegisterTradeMonAndGetIsEgg(u32, struct UnionRoomTrade *);
+static void RegisterTradeMon(u32, struct UnionRoomTrade *);
+static void UR_EnableScriptContext2AndFreezeObjectEvents(void);
+static bool32 IsPlayerFacingTradingBoard(void);
+static u8 HandlePlayerListUpdate(void);
+static bool32 PollPartnerYesNoResponse(struct WirelessLink_URoom *);
+static void ReceiveUnionRoomActivityPacket(struct WirelessLink_URoom *);
+static u8 GetActivePartnerSpriteGenderParam(struct WirelessLink_URoom *);
+static bool32 UnionRoom_HandleContactFromOtherPlayer(struct WirelessLink_URoom *);
+static bool32 UR_RunTextPrinters_CheckPrinter0Active(void);
+static s32 GetUnionRoomPlayerGender(s32, struct UnkStruct_Main0 *);
+static s32 UnionRoomGetPlayerInteractionResponse(struct UnkStruct_Main0 *, u8, u8, u32);
+static void HandleCancelActivity(bool32);
+static s32 ListMenuHandler_AllItemsAvailable(u8 *, u8 *, u8 *, const struct WindowTemplate *, const struct ListMenuTemplate *);
+static s32 TradeBoardMenuHandler(u8 *, u8 *, u8 *, u8 *, const struct WindowTemplate *, const struct ListMenuTemplate *, struct UnkStruct_Main0 *);
+static s32 GetIndexOfNthTradeBoardOffer(struct UnkStruct_x20 *, s32);
+static bool32 HasAtLeastTwoMonsOfLevel30OrLower(void);
+static u32 GetResponseIdx_InviteToURoomActivity(s32);
+static void ViewURoomPartnerTrainerCard(u8 *, struct WirelessLink_URoom *, bool8);
+static void GetURoomActivityRejectMsg(u8 *, s32, u32);
+static u32 ConvPartnerUnameAndGetWhetherMetAlready(struct UnkStruct_x20 *);
+static void GetURoomActivityStartMsg(u8 *, u8);
+static void UR_ClearBg0(void);
+static s32 IsRequestedTypeOrEggInPlayerParty(u32, u32);
+static bool32 UR_PrintFieldMessage(const u8 *);
+static s32 GetChatLeaderActionRequestMessage(u8 *, u32, u16 *, struct WirelessLink_URoom *);
+static void Task_InitUnionRoom(u8 taskId);
+static bool8 AreGnameUnameDifferent(struct WirelessGnameUnamePair*, const struct WirelessGnameUnamePair*);
+static void ItemPrintFunc_PossibleGroupMembers(u8, s32, u8);
+static void ListMenuItemPrintFunc_UnionRoomGroups(u8, s32, u8);
+static void TradeBoardListMenuItemPrintFunc(u8, s32, u8);
+static void nullsub_14(u8, s32, u8);
#include "data/union_room.h"
// code
-void sub_80124EC(u8 windowId, u8 arg1, u8 stringId)
+static void PrintNumPlayersWaitingForMsg(u8 windowId, u8 capacityCode, u8 stringId)
{
FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
- switch (arg1 << 8)
+ switch (capacityCode << 8)
{
- case 0x200:
- sub_80173E0(windowId, 1, sPlayersNeededOrModeTexts[0][stringId - 1], 0, 1, 0);
+ case LINK_GROUP_CAPACITY(0, 2):
+ UR_AddTextPrinterParameterized(windowId, 1, sPlayersNeededOrModeTexts[0][stringId - 1], 0, 1, UR_COLOR_DKE_WHT_LTE);
break;
- case 0x400:
- sub_80173E0(windowId, 1, sPlayersNeededOrModeTexts[1][stringId - 1], 0, 1, 0);
+ case LINK_GROUP_CAPACITY(0, 4):
+ UR_AddTextPrinterParameterized(windowId, 1, sPlayersNeededOrModeTexts[1][stringId - 1], 0, 1, UR_COLOR_DKE_WHT_LTE);
break;
- case 0x2500:
- sub_80173E0(windowId, 1, sPlayersNeededOrModeTexts[2][stringId - 1], 0, 1, 0);
+ case LINK_GROUP_CAPACITY(2, 5):
+ UR_AddTextPrinterParameterized(windowId, 1, sPlayersNeededOrModeTexts[2][stringId - 1], 0, 1, UR_COLOR_DKE_WHT_LTE);
break;
- case 0x3500:
- sub_80173E0(windowId, 1, sPlayersNeededOrModeTexts[3][stringId - 1], 0, 1, 0);
+ case LINK_GROUP_CAPACITY(3, 5):
+ UR_AddTextPrinterParameterized(windowId, 1, sPlayersNeededOrModeTexts[3][stringId - 1], 0, 1, UR_COLOR_DKE_WHT_LTE);
break;
- case 0x2400:
- sub_80173E0(windowId, 1, sPlayersNeededOrModeTexts[4][stringId - 1], 0, 1, 0);
+ case LINK_GROUP_CAPACITY(2, 4):
+ UR_AddTextPrinterParameterized(windowId, 1, sPlayersNeededOrModeTexts[4][stringId - 1], 0, 1, UR_COLOR_DKE_WHT_LTE);
break;
}
CopyWindowToVram(windowId, 2);
}
-void sub_80125BC(u8 windowId)
+static void PrintPlayerNameAndIdOnWindow(u8 windowId)
{
u8 text[30];
u8 *txtPtr;
- sub_80173E0(windowId, 1, gSaveBlock2Ptr->playerName, 0, 1, 0);
+ UR_AddTextPrinterParameterized(windowId, 1, gSaveBlock2Ptr->playerName, 0, 1, UR_COLOR_DKE_WHT_LTE);
txtPtr = StringCopy(text, sText_ID);
ConvertIntToDecimalStringN(txtPtr, ReadAsU16(gSaveBlock2Ptr->playerTrainerId), STR_CONV_MODE_LEADING_ZEROS, 5);
- sub_80173E0(windowId, 1, text, 0, 0x11, 0);
+ UR_AddTextPrinterParameterized(windowId, 1, text, 0, 0x11, UR_COLOR_DKE_WHT_LTE);
}
-void sub_801262C(u8 *dst, u8 caseId)
+static void StringExpandPlaceholders_AwaitingCommFromAnother(u8 *dst, u8 caseId)
{
switch (caseId)
{
- case 1 ... 4:
- case 9 ... 11:
- case 14 ... 16:
- case 21 ... 28:
+ case ACTIVITY_BATTLE_SINGLE:
+ case ACTIVITY_BATTLE_DOUBLE:
+ case ACTIVITY_BATTLE_MULTI:
+ case ACTIVITY_TRADE:
+ case ACTIVITY_POKEMON_JUMP:
+ case ACTIVITY_BERRY_CRUSH:
+ case ACTIVITY_BERRY_PICK:
+ case ACTIVITY_BATTLE_TOWER:
+ case ACTIVITY_BATTLE_TOWER_OPEN:
+ case ACTIVITY_RECORD_CORNER:
+ case ACTIVITY_BERRY_BLENDER:
+ case ACTIVITY_WONDER_CARD2:
+ case ACTIVITY_WONDER_NEWS2:
+ case ACTIVITY_CONTEST_COOL:
+ case ACTIVITY_CONTEST_BEAUTY:
+ case ACTIVITY_CONTEST_CUTE:
+ case ACTIVITY_CONTEST_SMART:
+ case ACTIVITY_CONTEST_TOUGH:
// UB: argument *dst isn't used, instead it always prints to gStringVar4
StringExpandPlaceholders(gStringVar4, sText_AwaitingCommunication);
break;
}
}
-bool32 sub_80126CC(u32 caseId)
+static bool32 IsActivityWithVariableGroupSize(u32 caseId)
{
switch (caseId)
{
- case 9 ... 11:
- case 15 ... 16:
- case 23 ... 27:
+ case ACTIVITY_POKEMON_JUMP:
+ case ACTIVITY_BERRY_CRUSH:
+ case ACTIVITY_BERRY_PICK:
+ case ACTIVITY_RECORD_CORNER:
+ case ACTIVITY_BERRY_BLENDER:
+ case ACTIVITY_CONTEST_COOL:
+ case ACTIVITY_CONTEST_BEAUTY:
+ case ACTIVITY_CONTEST_CUTE:
+ case ACTIVITY_CONTEST_SMART:
+ case ACTIVITY_CONTEST_TOUGH:
return TRUE;
default:
return FALSE;
@@ -213,331 +349,334 @@ bool32 sub_80126CC(u32 caseId)
void TryBecomeLinkLeader(void)
{
u8 taskId;
- struct UnkStruct_Leader *dataPtr;
+ struct WirelessLink_Leader *data;
- taskId = CreateTask(sub_8012780, 0);
- gUnknown_02022C30.leader = dataPtr = (void*)(gTasks[taskId].data);
- gUnknown_03000DA0 = dataPtr;
+ taskId = CreateTask(Task_TryBecomeLinkLeader, 0);
+ sWirelessLinkMain.leader = data = (void*)(gTasks[taskId].data);
+ sLeader = data;
- dataPtr->state = 0;
- dataPtr->textState = 0;
- gSpecialVar_Result = 0;
+ data->state = LL_STATE_INIT;
+ data->textState = 0;
+ gSpecialVar_Result = LINKUP_ONGOING;
}
-void sub_8012780(u8 taskId)
+static void Task_TryBecomeLinkLeader(u8 taskId)
{
u32 id, val;
- struct UnkStruct_Leader *data = gUnknown_02022C30.leader;
+ struct WirelessLink_Leader *data = sWirelessLinkMain.leader;
switch (data->state)
{
- case 0:
+ case LL_STATE_INIT:
if (gSpecialVar_0x8004 == LINK_GROUP_BATTLE_TOWER && gSaveBlock2Ptr->frontier.lvlMode == FRONTIER_LVL_OPEN)
gSpecialVar_0x8004++;
- gUnknown_02022C2C = gUnknown_082F00C4[gSpecialVar_0x8004];
- gUnknown_02022C2D = gUnknown_082F00C4[gSpecialVar_0x8004] >> 8;
- sub_8010F84(gUnknown_02022C2C, 0, 0);
- sub_800B488();
+ gPlayerCurrActivity = sLinkGroupToActivityAndCapacity[gSpecialVar_0x8004];
+ sPlayerActivityGroupSize = sLinkGroupToActivityAndCapacity[gSpecialVar_0x8004] >> 8;
+ SetHostRFUtgtGname(gPlayerCurrActivity, 0, 0);
+ SetWirelessCommType1();
OpenLink();
- sub_8011C10(gUnknown_02022C2D & 0xF);
- data->state = 3;
- break;
- case 3:
- data->field_4 = AllocZeroed(0x70);
- data->field_0 = AllocZeroed(0xA0);
- data->field_8 = AllocZeroed(0xA0);
- sub_80175EC(data->field_4, 4);
- sub_8017580(data->field_0->arr, 5);
- sub_800DF90(&data->field_0->arr[0].unk.field_0, data->field_0->arr[0].unk.playerName);
- data->field_0->arr[0].field_18 = 0;
- data->field_0->arr[0].field_1A_0 = 1;
- data->field_0->arr[0].field_1A_1 = 0;
+ InitializeRfuLinkManager_LinkLeader(GROUP_MAX(sPlayerActivityGroupSize));
+ data->state = LL_STATE_INIT2;
+ break;
+ case LL_STATE_INIT2:
+ data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
+ data->field_0 = AllocZeroed(5 * sizeof(struct UnkStruct_x20));
+ data->field_8 = AllocZeroed(5 * sizeof(struct UnkStruct_x20));
+ ClearUnkStruct_x1CArray(data->field_4, 4);
+ ClearUnkStruct_x20Array(data->field_0->arr, 5);
+ LinkRfu3_SetGnameUnameFromStaticBuffers(&data->field_0->arr[0].gname_uname.gname, data->field_0->arr[0].gname_uname.playerName);
+ data->field_0->arr[0].timeoutCounter = 0;
+ data->field_0->arr[0].groupScheduledAnim = UNION_ROOM_SPAWN_IN;
+ data->field_0->arr[0].useRedText = FALSE;
data->field_0->arr[0].field_1B = 0;
- data->field_17 = sub_8016FC0(data->field_4, 0xFF);
- data->field_10 = AddWindow(&gUnknown_082F00BC);
- switch (gUnknown_02022C2D & 0xF)
+ data->listenTaskId = CreateTask_ListenForPartnersWithCompatibleSerialNos(data->field_4, 0xFF);
+ data->bButtonCancelWindowId = AddWindow(&sWindowTemplate_BButtonCancel);
+ switch (GROUP_MAX(sPlayerActivityGroupSize))
{
case 2:
case 3:
case 4:
- data->listWindowId = AddWindow(&gUnknown_082F011C);
+ data->listWindowId = AddWindow(&sWindowTemplate_PlayerList);
break;
case 5:
- data->listWindowId = AddWindow(&gUnknown_082F0124);
+ data->listWindowId = AddWindow(&sWindowTemplate_5PlayerList);
break;
}
- data->field_11 = AddWindow(&gUnknown_082F012C);
+ data->nPlayerModeWindowId = AddWindow(&sWindowTemplate_NumPlayerMode);
- FillWindowPixelBuffer(data->field_10, PIXEL_FILL(2));
- sub_80173E0(data->field_10, 0, sText_BButtonCancel, 8, 1, 4);
- PutWindowTilemap(data->field_10);
- CopyWindowToVram(data->field_10, 2);
+ FillWindowPixelBuffer(data->bButtonCancelWindowId, PIXEL_FILL(2));
+ UR_AddTextPrinterParameterized(data->bButtonCancelWindowId, 0, sText_BButtonCancel, 8, 1, 4);
+ PutWindowTilemap(data->bButtonCancelWindowId);
+ CopyWindowToVram(data->bButtonCancelWindowId, 2);
DrawStdWindowFrame(data->listWindowId, FALSE);
- gMultiuseListMenuTemplate = gUnknown_082F015C;
+ gMultiuseListMenuTemplate = sListMenuTemplate_PossibleGroupMembers;
gMultiuseListMenuTemplate.windowId = data->listWindowId;
data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
- DrawStdWindowFrame(data->field_11, FALSE);
- PutWindowTilemap(data->field_11);
- CopyWindowToVram(data->field_11, 2);
+ DrawStdWindowFrame(data->nPlayerModeWindowId, FALSE);
+ PutWindowTilemap(data->nPlayerModeWindowId);
+ CopyWindowToVram(data->nPlayerModeWindowId, 2);
CopyBgTilemapBufferToVram(0);
- data->field_13 = 1;
- data->state = 4;
+ data->playerCount = 1;
+ data->state = LL_STATE_GET_AWAITING_PLAYERS_TEXT;
break;
- case 4:
- StringCopy(gStringVar1, sLinkGroupActivityTexts[gUnknown_02022C2C]);
- if ((gUnknown_02022C2D >> 4) != 0)
+ case LL_STATE_GET_AWAITING_PLAYERS_TEXT:
+ StringCopy(gStringVar1, sLinkGroupActivityNameTexts[gPlayerCurrActivity]);
+ if (GROUP_MIN(sPlayerActivityGroupSize) != 0)
{
- if (data->field_13 > (gUnknown_02022C2D >> 4) - 1 && (gUnknown_02022C2D & 0xF) != 0)
+ if (data->playerCount > GROUP_MIN(sPlayerActivityGroupSize) - 1 && GROUP_MAX(sPlayerActivityGroupSize) != 0)
StringExpandPlaceholders(gStringVar4, sText_AwaitingLinkPressStart);
else
StringExpandPlaceholders(gStringVar4, sText_AwaitingCommunication);
}
else
{
- sub_801262C(gStringVar4, gUnknown_02022C2C);
+ StringExpandPlaceholders_AwaitingCommFromAnother(gStringVar4, gPlayerCurrActivity);
}
- sub_80124EC(data->field_11, gUnknown_02022C2D, data->field_13);
- data->state = 5;
+ PrintNumPlayersWaitingForMsg(data->nPlayerModeWindowId, sPlayerActivityGroupSize, data->playerCount);
+ data->state = LL_STATE_PRINT_AWAITING_PLAYERS;
break;
- case 5:
+ case LL_STATE_PRINT_AWAITING_PLAYERS:
if (PrintOnTextbox(&data->textState, gStringVar4))
- data->state = 6;
+ data->state = LL_STATE_AWAIT_PLAYERS;
break;
- case 6:
- sub_801320C(data, 7, 10);
+ case LL_STATE_AWAIT_PLAYERS:
+ Leader_SetStateIfMemberListChanged(data, LL_STATE_ACCEPT_NEW_MEMBER_PROMPT, LL_STATE_MEMBER_LEFT);
if (gMain.newKeys & B_BUTTON)
{
- if (data->field_13 == 1)
- data->state = 23;
- else if ((gUnknown_02022C2D & 0xF0) != 0)
- data->state = 30;
+ if (data->playerCount == 1)
+ data->state = LL_STATE_SHUTDOWN_AND_FAIL;
+ else if (GROUP_MIN2(sPlayerActivityGroupSize) != 0)
+ data->state = LL_STATE_CANCEL_WITH_MSG;
else
- data->state = 19;
+ data->state = LL_STATE_CANCEL_PROMPT;
}
- if ((gUnknown_02022C2D >> 4) != 0
- && data->field_13 > (gUnknown_02022C2D >> 4) - 1
- && (gUnknown_02022C2D & 0xF) != 0
+ if (GROUP_MIN(sPlayerActivityGroupSize) != 0
+ && data->playerCount > GROUP_MIN(sPlayerActivityGroupSize) - 1
+ && GROUP_MAX(sPlayerActivityGroupSize) != 0
&& sub_8012240()
&& gMain.newKeys & START_BUTTON)
{
- data->state = 15;
- sub_800EF38();
+ data->state = LL_STATE_MEMBERS_OK_PROMPT;
+ LinkRfu_StopManagerAndFinalizeSlots();
}
- if (data->state == 6 && sub_80105EC())
+ if (data->state == LL_STATE_AWAIT_PLAYERS && sub_80105EC())
{
- data->state = 9;
+ data->state = LL_STATE_9;
}
break;
- case 9:
+ case LL_STATE_9:
if (!sub_80105EC())
{
- data->state = 6;
- data->field_13 = sub_8013398(data->field_0);
+ data->state = LL_STATE_AWAIT_PLAYERS;
+ data->playerCount = sub_8013398(data->field_0);
}
break;
- case 10:
- id = ((gUnknown_02022C2C & 0xF) == 2) ? 1 : 0;
+ case LL_STATE_MEMBER_LEFT:
+ // BUG: sPlayerActivityGroupSize was meant below, not gPlayerCurrActivity
+ // This will be false for all but ACTIVITY_BATTLE_DOUBLE and ACTIVITY_DECLINE
+ // All this changes is which of two texts gets printed
+ id = (GROUP_MAX(gPlayerCurrActivity) == 2) ? 1 : 0;
if (PrintOnTextbox(&data->textState, sPlayerUnavailableTexts[id]))
{
- data->field_13 = sub_8013398(data->field_0);
+ data->playerCount = sub_8013398(data->field_0);
RedrawListMenu(data->listTaskId);
- data->state = 4;
+ data->state = LL_STATE_GET_AWAITING_PLAYERS_TEXT;
}
break;
- case 29:
- id = ((gUnknown_02022C2D & 0xF) == 2) ? 0 : 1;
+ case LL_STATE_MEMBER_DISCONNECTED:
+ id = (GROUP_MAX(sPlayerActivityGroupSize) == 2) ? 0 : 1;
if (PrintOnTextbox(&data->textState, sPlayerUnavailableTexts[id]))
{
- data->state = 21;
+ data->state = LL_STATE_SHUTDOWN_AND_RETRY;
}
break;
- case 7:
+ case LL_STATE_ACCEPT_NEW_MEMBER_PROMPT:
if (PrintOnTextbox(&data->textState, gStringVar4))
{
- data->state = 11;
+ data->state = LL_STATE_ACCEPT_NEW_MEMBER_PROMPT_HANDLE_INPUT;
}
break;
- case 11:
- switch (sub_80170B8(&data->textState, sub_801064C(ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName)))
+ case LL_STATE_ACCEPT_NEW_MEMBER_PROMPT_HANDLE_INPUT:
+ switch (UnionRoomHandleYesNo(&data->textState, HasTrainerLeftPartnersList(ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.playerName)))
{
- case 0:
+ case 0: // YES
LoadWirelessStatusIndicatorSpriteGfx();
CreateWirelessStatusIndicatorSprite(0, 0);
- data->field_19 = 5;
- sub_8010688(5, ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
- data->state = 12;
+ data->joinRequestAnswer = RFU_STATUS_JOIN_GROUP_OK;
+ SendRfuStatusToPartner(data->joinRequestAnswer, ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.playerName);
+ data->state = LL_STATE_UPDATE_AFTER_JOIN_REQUEST;
break;
- case 1:
+ case 1: // NO
case -1:
- data->field_19 = 6;
- sub_8010688(6, ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
- data->state = 12;
+ data->joinRequestAnswer = RFU_STATUS_JOIN_GROUP_NO;
+ SendRfuStatusToPartner(data->joinRequestAnswer, ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.playerName);
+ data->state = LL_STATE_UPDATE_AFTER_JOIN_REQUEST;
break;
case -3:
- data->state = 9;
+ data->state = LL_STATE_9;
break;
}
break;
- case 12:
- val = sub_8010714(ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
- if (val == 1)
+ case LL_STATE_UPDATE_AFTER_JOIN_REQUEST:
+ val = WaitSendRfuStatusToPartner(ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.playerName);
+ if (val == 1) // Send complete
{
- if (data->field_19 == 5)
+ if (data->joinRequestAnswer == RFU_STATUS_JOIN_GROUP_OK)
{
- data->field_0->arr[data->field_13].field_1B = 0;
+ data->field_0->arr[data->playerCount].field_1B = 0;
RedrawListMenu(data->listTaskId);
- data->field_13++;
- if (data->field_13 == (gUnknown_02022C2D & 0xF))
+ data->playerCount++;
+ if (data->playerCount == GROUP_MAX(sPlayerActivityGroupSize))
{
- if ((gUnknown_02022C2D & 0xF0) != 0 || data->field_13 == 4)
+ if (GROUP_MIN2(sPlayerActivityGroupSize) != 0 || data->playerCount == 4)
{
- data->state = 15;
+ data->state = LL_STATE_MEMBERS_OK_PROMPT;
}
else
{
- sub_8018404(gStringVar1, &data->field_0->arr[data->field_13 - 1]);
+ IntlConvPartnerUname7(gStringVar1, &data->field_0->arr[data->playerCount - 1]);
StringExpandPlaceholders(gStringVar4, sText_AnOKWasSentToPlayer);
- data->state = 13;
+ data->state = LL_STATE_ACCEPTED_FINAL_MEMBER;
}
- sub_800EF38();
- sub_80124EC(data->field_11, gUnknown_02022C2D, data->field_13);
+ LinkRfu_StopManagerAndFinalizeSlots();
+ PrintNumPlayersWaitingForMsg(data->nPlayerModeWindowId, sPlayerActivityGroupSize, data->playerCount);
}
else
{
- data->state = 4;
+ data->state = LL_STATE_GET_AWAITING_PLAYERS_TEXT;
}
}
- else
+ else // Member disconnected
{
- sub_8011DC0(data->field_0->arr[data->field_13].unk.playerName, ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId));
- data->field_0->arr[data->field_13].field_1A_0 = 0;
+ RequestDisconnectSlotByTrainerNameAndId(data->field_0->arr[data->playerCount].gname_uname.playerName, ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId));
+ data->field_0->arr[data->playerCount].groupScheduledAnim = UNION_ROOM_SPAWN_NONE;
sub_8013398(data->field_0);
RedrawListMenu(data->listTaskId);
- data->state = 4;
+ data->state = LL_STATE_GET_AWAITING_PLAYERS_TEXT;
}
- data->field_19 = 0;
+ data->joinRequestAnswer = 0;
}
else if (val == 2)
{
- sub_8011A64(0, 0);
- data->state = 4;
+ RfuSetStatus(RFU_STATUS_OK, 0);
+ data->state = LL_STATE_GET_AWAITING_PLAYERS_TEXT;
}
break;
- case 13:
+ case LL_STATE_ACCEPTED_FINAL_MEMBER:
if (PrintOnTextbox(&data->textState, gStringVar4))
- data->state = 14;
+ data->state = LL_STATE_WAIT_AND_CONFIRM_MEMBERS;
break;
- case 14:
- if (++data->field_E > 120)
- data->state = 17;
+ case LL_STATE_WAIT_AND_CONFIRM_MEMBERS:
+ if (++data->delayTimerAfterOk > 120)
+ data->state = LL_STATE_CONFIRMED_MEMBERS;
break;
- case 15:
+ case LL_STATE_MEMBERS_OK_PROMPT:
if (PrintOnTextbox(&data->textState, sText_AreTheseMembersOK))
- data->state = 16;
+ data->state = LL_STATE_MEMBERS_OK_PROMPT_HANDLE_INPUT;
break;
- case 16:
- switch (sub_80170B8(&data->textState, FALSE))
+ case LL_STATE_MEMBERS_OK_PROMPT_HANDLE_INPUT:
+ switch (UnionRoomHandleYesNo(&data->textState, FALSE))
{
- case 0:
- data->state = 17;
+ case 0: // YES
+ data->state = LL_STATE_CONFIRMED_MEMBERS;
break;
- case 1:
+ case 1: // NO
case -1:
- if ((gUnknown_02022C2D & 0xF0) != 0)
- data->state = 30;
+ if (GROUP_MIN2(sPlayerActivityGroupSize) != 0)
+ data->state = LL_STATE_CANCEL_WITH_MSG;
else
- data->state = 19;
+ data->state = LL_STATE_CANCEL_PROMPT;
break;
}
break;
- case 19:
+ case LL_STATE_CANCEL_PROMPT:
if (PrintOnTextbox(&data->textState, sText_CancelModeWithTheseMembers))
- data->state = 20;
+ data->state = LL_STATE_CANCEL_PROMPT_HANDLE_INPUT;
break;
- case 20:
- switch (sub_80170B8(&data->textState, FALSE))
+ case LL_STATE_CANCEL_PROMPT_HANDLE_INPUT:
+ switch (UnionRoomHandleYesNo(&data->textState, FALSE))
{
- case 0:
- data->state = 23;
+ case 0: // YES
+ data->state = LL_STATE_SHUTDOWN_AND_FAIL;
break;
- case 1:
+ case 1: // NO
case -1:
- if ((gUnknown_02022C2D & 0xF0) != 0)
- data->state = 15;
- else if (data->field_13 == (gUnknown_02022C2D & 0xF))
- data->state = 15;
+ if (GROUP_MIN2(sPlayerActivityGroupSize) != 0)
+ data->state = LL_STATE_MEMBERS_OK_PROMPT;
+ else if (data->playerCount == GROUP_MAX(sPlayerActivityGroupSize))
+ data->state = LL_STATE_MEMBERS_OK_PROMPT;
else
- data->state = 4;
+ data->state = LL_STATE_GET_AWAITING_PLAYERS_TEXT;
break;
}
break;
- case 17:
- if (!sub_801320C(data, 7, 29))
- data->state = 18;
+ case LL_STATE_CONFIRMED_MEMBERS:
+ if (!Leader_SetStateIfMemberListChanged(data, LL_STATE_ACCEPT_NEW_MEMBER_PROMPT, LL_STATE_MEMBER_DISCONNECTED))
+ data->state = LL_STATE_FINAL_MEMBER_CHECK;
break;
- case 18:
- if (sub_800EF1C())
+ case LL_STATE_FINAL_MEMBER_CHECK:
+ if (LmanAcceptSlotFlagIsNotZero())
{
- if (sub_800EF58(FALSE))
+ if (WaitRfuState(FALSE))
{
- data->state = 26;
+ data->state = LL_STATE_TRY_START_ACTIVITY;
}
else
{
- if (++data->field_1A > 300)
+ if (++data->memberConfirmTimeout > 300)
{
- data->state = 29;
+ data->state = LL_STATE_MEMBER_DISCONNECTED;
data->textState = 0;
}
}
}
else
{
- data->state = 29;
+ data->state = LL_STATE_MEMBER_DISCONNECTED;
data->textState = 0;
}
break;
- case 30:
+ case LL_STATE_CANCEL_WITH_MSG:
if (PrintOnTextbox(&data->textState, sText_ModeWithTheseMembersWillBeCanceled))
- data->state = 23;
+ data->state = LL_STATE_SHUTDOWN_AND_FAIL;
break;
- case 21:
- case 23:
+ case LL_STATE_SHUTDOWN_AND_RETRY:
+ case LL_STATE_SHUTDOWN_AND_FAIL:
DestroyWirelessStatusIndicatorSprite();
- sub_800EDD4();
- sub_8012F64(data);
- data->state++;
+ LinkRfu_Shutdown();
+ Leader_DestroyResources(data);
+ data->state++; // LL_STATE_RETRY or LL_STATE_FAILED
break;
- case 24:
+ case LL_STATE_FAILED:
EnableBothScriptContexts();
DestroyTask(taskId);
- gSpecialVar_Result = 5;
+ gSpecialVar_Result = LINKUP_FAILED;
break;
- case 22:
+ case LL_STATE_RETRY:
EnableBothScriptContexts();
DestroyTask(taskId);
- gSpecialVar_Result = 8;
+ gSpecialVar_Result = LINKUP_RETRY_ROLE_ASSIGN;
break;
- case 26:
- if (sub_8011A80())
+ case LL_STATE_TRY_START_ACTIVITY:
+ if (RfuHasErrored())
{
- data->state = 29;
+ data->state = LL_STATE_MEMBER_DISCONNECTED;
}
else
{
if (gReceivedRemoteLinkPlayers != 0)
{
- if (sub_80126CC(gUnknown_02022C2C))
+ if (IsActivityWithVariableGroupSize(gPlayerCurrActivity))
sub_801103C();
- sub_8011068(1);
- sub_80149C4();
- sub_8012F64(data);
+ UpdateGameData_GroupLockedIn(TRUE);
+ CreateTask_RunScriptAndFadeToActivity();
+ Leader_DestroyResources(data);
DestroyTask(taskId);
}
}
@@ -545,319 +684,319 @@ void sub_8012780(u8 taskId)
}
}
-void sub_8012F64(struct UnkStruct_Leader *data)
+static void Leader_DestroyResources(struct WirelessLink_Leader *data)
{
- ClearWindowTilemap(data->field_11);
- ClearStdWindowAndFrame(data->field_11, FALSE);
+ ClearWindowTilemap(data->nPlayerModeWindowId);
+ ClearStdWindowAndFrame(data->nPlayerModeWindowId, FALSE);
DestroyListMenuTask(data->listTaskId, 0, 0);
- ClearWindowTilemap(data->field_10);
+ ClearWindowTilemap(data->bButtonCancelWindowId);
ClearStdWindowAndFrame(data->listWindowId, FALSE);
CopyBgTilemapBufferToVram(0);
- RemoveWindow(data->field_11);
+ RemoveWindow(data->nPlayerModeWindowId);
RemoveWindow(data->listWindowId);
- RemoveWindow(data->field_10);
- DestroyTask(data->field_17);
+ RemoveWindow(data->bButtonCancelWindowId);
+ DestroyTask(data->listenTaskId);
Free(data->field_8);
Free(data->field_0);
Free(data->field_4);
}
-void sub_8012FC4(u8 *dst, u8 caseId)
+static void Leader_GetAcceptNewMemberPrompt(u8 *dst, u8 caseId)
{
switch (caseId)
{
- case 1:
- case 2:
- case 4:
- case 14:
- case 28:
+ case ACTIVITY_BATTLE_SINGLE:
+ case ACTIVITY_BATTLE_DOUBLE:
+ case ACTIVITY_TRADE:
+ case ACTIVITY_BATTLE_TOWER_OPEN:
+ case ACTIVITY_BATTLE_TOWER:
StringExpandPlaceholders(dst, sText_PlayerContactedYouForXAccept);
break;
- case 21:
- case 22:
+ case ACTIVITY_WONDER_CARD2:
+ case ACTIVITY_WONDER_NEWS2:
StringExpandPlaceholders(dst, sText_PlayerContactedYouShareX);
break;
- case 3:
- case 9:
- case 10:
- case 11:
- case 15:
- case 16:
- case 23:
- case 24:
- case 25:
- case 26:
- case 27:
+ case ACTIVITY_BATTLE_MULTI:
+ case ACTIVITY_POKEMON_JUMP:
+ case ACTIVITY_BERRY_CRUSH:
+ case ACTIVITY_BERRY_PICK:
+ case ACTIVITY_RECORD_CORNER:
+ case ACTIVITY_BERRY_BLENDER:
+ case ACTIVITY_CONTEST_COOL:
+ case ACTIVITY_CONTEST_BEAUTY:
+ case ACTIVITY_CONTEST_CUTE:
+ case ACTIVITY_CONTEST_SMART:
+ case ACTIVITY_CONTEST_TOUGH:
StringExpandPlaceholders(dst, sText_PlayerContactedYouAddToMembers);
break;
}
}
-void sub_8013078(u8 *dst, u8 caseId)
+static void GetYouDeclinedTheOfferMessage(u8 *dst, u8 caseId)
{
switch (caseId)
{
- case 65:
- case 68:
+ case ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM:
+ case ACTIVITY_TRADE | IN_UNION_ROOM:
StringExpandPlaceholders(dst, sText_OfferDeclined1);
break;
- case 69:
- case 72:
+ case ACTIVITY_CHAT | IN_UNION_ROOM:
+ case ACTIVITY_CARD | IN_UNION_ROOM:
StringExpandPlaceholders(dst, sText_OfferDeclined2);
break;
}
}
-void sub_80130B4(u8 *dst, u8 caseId)
+static void GetYouAskedToJoinGroupPleaseWaitMessage(u8 *dst, u8 caseId)
{
switch (caseId)
{
- case 1:
- case 2:
- case 4:
- case 14:
- case 21:
- case 22:
- case 28:
+ case ACTIVITY_BATTLE_SINGLE:
+ case ACTIVITY_BATTLE_DOUBLE:
+ case ACTIVITY_TRADE:
+ case ACTIVITY_BATTLE_TOWER:
+ case ACTIVITY_BATTLE_TOWER_OPEN:
+ case ACTIVITY_WONDER_CARD2:
+ case ACTIVITY_WONDER_NEWS2:
StringExpandPlaceholders(dst, sText_AwaitingPlayersResponse);
break;
- case 3:
- case 9:
- case 10:
- case 11:
- case 15:
- case 16:
- case 23:
- case 24:
- case 25:
- case 26:
- case 27:
+ case ACTIVITY_BATTLE_MULTI:
+ case ACTIVITY_POKEMON_JUMP:
+ case ACTIVITY_BERRY_CRUSH:
+ case ACTIVITY_BERRY_PICK:
+ case ACTIVITY_RECORD_CORNER:
+ case ACTIVITY_BERRY_BLENDER:
+ case ACTIVITY_CONTEST_COOL:
+ case ACTIVITY_CONTEST_BEAUTY:
+ case ACTIVITY_CONTEST_CUTE:
+ case ACTIVITY_CONTEST_SMART:
+ case ACTIVITY_CONTEST_TOUGH:
StringExpandPlaceholders(dst, sText_PlayerHasBeenAskedToRegisterYouPleaseWait);
break;
}
}
-void sub_8013160(u8 *dst, u8 caseId)
+static void GetGroupLeaderSentAnOKMessage(u8 *dst, u8 caseId)
{
switch (caseId)
{
- case 1:
- case 2:
- case 4:
- case 14:
- case 21:
- case 22:
- case 28:
+ case ACTIVITY_BATTLE_SINGLE:
+ case ACTIVITY_BATTLE_DOUBLE:
+ case ACTIVITY_TRADE:
+ case ACTIVITY_BATTLE_TOWER:
+ case ACTIVITY_BATTLE_TOWER_OPEN:
+ case ACTIVITY_WONDER_CARD2:
+ case ACTIVITY_WONDER_NEWS2:
StringExpandPlaceholders(dst, sText_PlayerSentBackOK);
break;
- case 3:
- case 9:
- case 10:
- case 11:
- case 15:
- case 16:
- case 23:
- case 24:
- case 25:
- case 26:
- case 27:
+ case ACTIVITY_BATTLE_MULTI:
+ case ACTIVITY_POKEMON_JUMP:
+ case ACTIVITY_BERRY_CRUSH:
+ case ACTIVITY_BERRY_PICK:
+ case ACTIVITY_RECORD_CORNER:
+ case ACTIVITY_BERRY_BLENDER:
+ case ACTIVITY_CONTEST_COOL:
+ case ACTIVITY_CONTEST_BEAUTY:
+ case ACTIVITY_CONTEST_CUTE:
+ case ACTIVITY_CONTEST_SMART:
+ case ACTIVITY_CONTEST_TOUGH:
StringExpandPlaceholders(dst, sText_PlayerOKdRegistration);
break;
}
}
-bool8 sub_801320C(struct UnkStruct_Leader *data, u32 arg1, u32 arg2)
+static bool8 Leader_SetStateIfMemberListChanged(struct WirelessLink_Leader *data, u32 joinedState, u32 droppedState)
{
- switch (sub_80132D4(data->field_0))
+ switch (LeaderUpdateGroupMembership(data->field_0))
{
- case 1:
+ case UNION_ROOM_SPAWN_IN:
PlaySE(SE_PC_LOGIN);
RedrawListMenu(data->listTaskId);
- sub_8018404(gStringVar2, &data->field_0->arr[data->field_13]);
- sub_8012FC4(gStringVar4, gUnknown_02022C2C);
- data->state = arg1;
+ IntlConvPartnerUname7(gStringVar2, &data->field_0->arr[data->playerCount]);
+ Leader_GetAcceptNewMemberPrompt(gStringVar4, gPlayerCurrActivity);
+ data->state = joinedState;
break;
- case 2:
- sub_8011A64(0, 0);
+ case UNION_ROOM_SPAWN_OUT:
+ RfuSetStatus(RFU_STATUS_OK, 0);
RedrawListMenu(data->listTaskId);
- data->state = arg2;
+ data->state = droppedState;
return TRUE;
}
return FALSE;
}
-void sub_8013278(u8 arg0, s32 id, u8 arg2)
+static void ItemPrintFunc_PossibleGroupMembers(u8 windowId, s32 id, u8 y)
{
- struct UnkStruct_Leader *data = gUnknown_02022C30.leader;
- u8 var = 0;
+ struct WirelessLink_Leader *data = sWirelessLinkMain.leader;
+ u8 colorIdx = UR_COLOR_DKE_WHT_LTE;
- switch (data->field_0->arr[id].field_1A_0)
+ switch (data->field_0->arr[id].groupScheduledAnim)
{
- case 1:
+ case UNION_ROOM_SPAWN_IN:
if (data->field_0->arr[id].field_1B != 0)
- var = 2;
+ colorIdx = UR_COLOR_GRN_WHT_LTG;
break;
- case 2:
- var = 1;
+ case UNION_ROOM_SPAWN_OUT:
+ colorIdx = UR_COLOR_RED_WHT_LTR;
break;
}
- sub_80178A0(arg0, 0, arg2, &data->field_0->arr[id], var, id);
+ PrintGroupMemberCandidateOnWindowWithColor(windowId, 0, y, &data->field_0->arr[id], colorIdx, id);
}
-u8 sub_80132D4(struct UnkStruct_Main0 *arg0)
+static u8 LeaderUpdateGroupMembership(struct UnkStruct_Main0 *arg0)
{
- struct UnkStruct_Leader *data = gUnknown_02022C30.leader;
- u8 ret = 0;
+ struct WirelessLink_Leader *data = sWirelessLinkMain.leader;
+ u8 ret = UNION_ROOM_SPAWN_NONE;
u8 i;
s32 id;
- for (i = 1; i < 5; i++)
+ for (i = 1; i < MAX_RFU_PLAYERS; i++)
{
- u16 var = data->field_0->arr[i].field_1A_0;
- if (var == 1)
+ u16 var = data->field_0->arr[i].groupScheduledAnim;
+ if (var == UNION_ROOM_SPAWN_IN)
{
- id = sub_80176E4(&data->field_0->arr[i], data->field_4->arr);
+ id = Findx20Inx1CArray(&data->field_0->arr[i], data->field_4->arr);
if (id != 0xFF)
{
- data->field_0->arr[i].unk = data->field_4->arr[id].unk0;
- data->field_0->arr[i].field_18 = var;
+ data->field_0->arr[i].gname_uname = data->field_4->arr[id].gname_uname;
+ data->field_0->arr[i].timeoutCounter = 1;
}
else
{
- data->field_0->arr[i].field_1A_0 = 2;
- ret = 2;
+ data->field_0->arr[i].groupScheduledAnim = UNION_ROOM_SPAWN_OUT;
+ ret = UNION_ROOM_SPAWN_OUT;
}
}
}
- for (id = 0; id < 4; id++)
- sub_8017734(data->field_0->arr, &data->field_4->arr[id], 5);
+ for (id = 0; id < RFU_CHILD_MAX; id++)
+ Appendx1Ctox20(data->field_0->arr, &data->field_4->arr[id], MAX_RFU_PLAYERS);
- if (ret != 2)
+ if (ret != UNION_ROOM_SPAWN_OUT)
{
- for (id = 0; id < 5; id++)
+ for (id = 0; id < MAX_RFU_PLAYERS; id++)
{
if (data->field_0->arr[id].field_1B != 0)
- ret = 1;
+ ret = UNION_ROOM_SPAWN_IN;
}
}
return ret;
}
-u8 sub_8013398(struct UnkStruct_Main0 *arg0)
+static u8 sub_8013398(struct UnkStruct_Main0 *arg0)
{
- struct UnkStruct_Leader *data = gUnknown_02022C30.leader;
+ struct WirelessLink_Leader *data = sWirelessLinkMain.leader;
u8 copiedCount;
s32 i;
- u8 ret;
+ u8 playerCount;
- for (i = 0; i < 5; i++)
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
data->field_8->arr[i] = data->field_0->arr[i];
copiedCount = 0;
- for (i = 0; i < 5; i++)
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
{
- if (data->field_8->arr[i].field_1A_0 == 1)
+ if (data->field_8->arr[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN)
{
data->field_0->arr[copiedCount] = data->field_8->arr[i];
copiedCount++;
}
}
- ret = copiedCount;
- for (; copiedCount < 5; copiedCount++)
+ playerCount = copiedCount;
+ for (; copiedCount < MAX_RFU_PLAYERS; copiedCount++)
{
- data->field_0->arr[copiedCount].unk = gUnknown_082F045C;
- data->field_0->arr[copiedCount].field_18 = 0;
- data->field_0->arr[copiedCount].field_1A_0 = 0;
- data->field_0->arr[copiedCount].field_1A_1 = 0;
+ data->field_0->arr[copiedCount].gname_uname = sWirelessGnameUnamePair_Dummy;
+ data->field_0->arr[copiedCount].timeoutCounter = 0;
+ data->field_0->arr[copiedCount].groupScheduledAnim = UNION_ROOM_SPAWN_NONE;
+ data->field_0->arr[copiedCount].useRedText = FALSE;
data->field_0->arr[copiedCount].field_1B = 0;
}
- for (i = 0; i < 5; i++)
+ for (i = 0; i < MAX_RFU_PLAYERS; i++)
{
- if (data->field_0->arr[i].field_1A_0 != 1)
+ if (data->field_0->arr[i].groupScheduledAnim != UNION_ROOM_SPAWN_IN)
continue;
- if (data->field_0->arr[i].field_1B != 0x40)
+ if (data->field_0->arr[i].field_1B != 64)
continue;
- ret = i;
+ playerCount = i;
break;
}
- return ret;
+ return playerCount;
}
void TryJoinLinkGroup(void)
{
u8 taskId;
- struct UnkStruct_Group *dataPtr;
+ struct WirelessLink_Group *data;
- taskId = CreateTask(sub_80134E8, 0);
- gUnknown_02022C30.group = dataPtr = (void*)(gTasks[taskId].data);
- gUnknown_03000DA4 = dataPtr;
+ taskId = CreateTask(Task_TryJoinLinkGroup, 0);
+ sWirelessLinkMain.group = data = (void*)(gTasks[taskId].data);
+ sGroup = data;
- dataPtr->state = 0;
- dataPtr->textState = 0;
- gSpecialVar_Result = 0;
+ data->state = LG_STATE_INIT;
+ data->textState = 0;
+ gSpecialVar_Result = LINKUP_ONGOING;
}
-void sub_80134E8(u8 taskId)
+static void Task_TryJoinLinkGroup(u8 taskId)
{
s32 id;
- struct UnkStruct_Group *data = gUnknown_02022C30.group;
+ struct WirelessLink_Group *data = sWirelessLinkMain.group;
switch (data->state)
{
- case 0:
+ case LG_STATE_INIT:
if (gSpecialVar_0x8004 == LINK_GROUP_BATTLE_TOWER && gSaveBlock2Ptr->frontier.lvlMode == FRONTIER_LVL_OPEN)
gSpecialVar_0x8004++;
- gUnknown_02022C2C = gUnknown_082F0530[gSpecialVar_0x8004];
- sub_8010F84(gUnknown_02022C2C, 0, 0);
- sub_800B488();
+ gPlayerCurrActivity = sLinkGroupToURoomActivity[gSpecialVar_0x8004];
+ SetHostRFUtgtGname(gPlayerCurrActivity, 0, 0);
+ SetWirelessCommType1();
OpenLink();
- sub_8011C5C();
- data->field_4 = AllocZeroed(0x70);
- data->field_0 = AllocZeroed(0x200);
- data->state = 1;
+ InitializeRfuLinkManager_JoinGroup();
+ data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
+ data->field_0 = AllocZeroed(16 * sizeof(struct UnkStruct_x20));
+ data->state = LG_STATE_CHOOSE_LEADER_MSG;
break;
- case 1:
+ case LG_STATE_CHOOSE_LEADER_MSG:
if (PrintOnTextbox(&data->textState, sChooseTrainerTexts[gSpecialVar_0x8004]))
- data->state = 2;
+ data->state = LG_STATE_INIT_WINDOWS;
break;
- case 2:
- sub_80175EC(data->field_4, 4);
- sub_8017580(data->field_0->arr, 16);
- data->field_11 = sub_8016FC0(data->field_4, gSpecialVar_0x8004);
- data->field_C = AddWindow(&gUnknown_082F00BC);
+ case LG_STATE_INIT_WINDOWS:
+ ClearUnkStruct_x1CArray(data->field_4, 4);
+ ClearUnkStruct_x20Array(data->field_0->arr, 16);
+ data->listenTaskId = CreateTask_ListenForPartnersWithCompatibleSerialNos(data->field_4, gSpecialVar_0x8004);
+ data->bButtonCancelWindowId = AddWindow(&sWindowTemplate_BButtonCancel);
data->listWindowId = AddWindow(&gUnknown_082F0174);
- data->field_D = AddWindow(&gUnknown_082F017C);
+ data->playerNameAndIdWindowId = AddWindow(&gUnknown_082F017C);
- FillWindowPixelBuffer(data->field_C, PIXEL_FILL(2));
- sub_80173E0(data->field_C, 0, sText_ChooseJoinCancel, 8, 1, 4);
- PutWindowTilemap(data->field_C);
- CopyWindowToVram(data->field_C, 2);
+ FillWindowPixelBuffer(data->bButtonCancelWindowId, PIXEL_FILL(2));
+ UR_AddTextPrinterParameterized(data->bButtonCancelWindowId, 0, sText_ChooseJoinCancel, 8, 1, 4);
+ PutWindowTilemap(data->bButtonCancelWindowId);
+ CopyWindowToVram(data->bButtonCancelWindowId, 2);
DrawStdWindowFrame(data->listWindowId, FALSE);
- gMultiuseListMenuTemplate = gUnknown_082F0204;
+ gMultiuseListMenuTemplate = sListMenuTemplate_UnionRoomGroups;
gMultiuseListMenuTemplate.windowId = data->listWindowId;
data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
- DrawStdWindowFrame(data->field_D, FALSE);
- PutWindowTilemap(data->field_D);
- sub_80125BC(data->field_D);
- CopyWindowToVram(data->field_D, 2);
+ DrawStdWindowFrame(data->playerNameAndIdWindowId, FALSE);
+ PutWindowTilemap(data->playerNameAndIdWindowId);
+ PrintPlayerNameAndIdOnWindow(data->playerNameAndIdWindowId);
+ CopyWindowToVram(data->playerNameAndIdWindowId, 2);
CopyBgTilemapBufferToVram(0);
- data->field_F = 0;
- data->state = 3;
+ data->leaderId = 0;
+ data->state = LG_STATE_CHOOSE_LEADER_HANDLE_INPUT;
break;
- case 3:
- id = sub_8013E44();
+ case LG_STATE_CHOOSE_LEADER_HANDLE_INPUT:
+ id = GetNewLeaderCandidate();
switch (id)
{
case 1:
@@ -869,22 +1008,22 @@ void sub_80134E8(u8 taskId)
if (gMain.newKeys & A_BUTTON && id != -1)
{
// this unused variable along with the assignment is needed to match
- u32 unusedVar;
- unusedVar = data->field_0->arr[id].unk.field_0.activity;
+ u32 activity = data->field_0->arr[id].gname_uname.gname.activity;
- if (data->field_0->arr[id].field_1A_0 == 1 && !data->field_0->arr[id].unk.field_0.started)
+ if (data->field_0->arr[id].groupScheduledAnim == UNION_ROOM_SPAWN_IN && !data->field_0->arr[id].gname_uname.gname.started)
{
- u32 var = sub_8013B8C(data, id);
- if (var == 0)
+ u32 readyStatus = IsTryingToTradeAcrossVersionTooSoon(data, id);
+ if (readyStatus == UR_TRADE_READY)
{
- sub_8013BD8(data, id);
- data->state = 5;
+ // Trading is allowed, or not trading at all
+ AskToJoinRfuGroup(data, id);
+ data->state = LG_STATE_ASK_JOIN_GROUP;
PlaySE(SE_PN_ON);
}
else
{
- StringCopy(gStringVar4, sCantTransmitToTrainerTexts[var - 1]);
- data->state = 18;
+ StringCopy(gStringVar4, sCantTransmitToTrainerTexts[readyStatus - 1]);
+ data->state = LG_STATE_TRADE_NOT_READY;
PlaySE(SE_PN_ON);
}
}
@@ -895,7 +1034,7 @@ void sub_80134E8(u8 taskId)
}
else if (gMain.newKeys & B_BUTTON)
{
- data->state = 10;
+ data->state = LG_STATE_CANCEL_CHOOSE_LEADER;
}
break;
default:
@@ -903,273 +1042,292 @@ void sub_80134E8(u8 taskId)
break;
}
break;
- case 5:
- sub_80130B4(gStringVar4, gUnknown_02022C2C);
+ case LG_STATE_ASK_JOIN_GROUP:
+ GetYouAskedToJoinGroupPleaseWaitMessage(gStringVar4, gPlayerCurrActivity);
if (PrintOnTextbox(&data->textState, gStringVar4))
{
- sub_8018404(gStringVar1, &data->field_0->arr[data->field_F]);
- data->state = 6;
+ IntlConvPartnerUname7(gStringVar1, &data->field_0->arr[data->leaderId]);
+ data->state = LG_STATE_MAIN;
}
break;
- case 6:
- if (gReceivedRemoteLinkPlayers != 0)
+ case LG_STATE_MAIN:
+ if (gReceivedRemoteLinkPlayers)
{
- gUnknown_02022C2C = data->field_0->arr[data->field_F].unk.field_0.activity;
- sub_8011A64(0, 0);
- switch (gUnknown_02022C2C)
+ gPlayerCurrActivity = data->field_0->arr[data->leaderId].gname_uname.gname.activity;
+ RfuSetStatus(RFU_STATUS_OK, 0);
+ switch (gPlayerCurrActivity)
{
- case 1 ... 5:
- case 9 ... 11:
- case 13 ... 16:
- case 21 ... 28:
- data->state = 20;
+ case ACTIVITY_BATTLE_SINGLE:
+ case ACTIVITY_BATTLE_DOUBLE:
+ case ACTIVITY_BATTLE_MULTI:
+ case ACTIVITY_TRADE:
+ case ACTIVITY_CHAT:
+ case ACTIVITY_POKEMON_JUMP:
+ case ACTIVITY_BERRY_CRUSH:
+ case ACTIVITY_BERRY_PICK:
+ case ACTIVITY_SPIN_TRADE:
+ case ACTIVITY_BATTLE_TOWER:
+ case ACTIVITY_BATTLE_TOWER_OPEN:
+ case ACTIVITY_RECORD_CORNER:
+ case ACTIVITY_BERRY_BLENDER:
+ case ACTIVITY_WONDER_CARD2:
+ case ACTIVITY_WONDER_NEWS2:
+ case ACTIVITY_CONTEST_COOL:
+ case ACTIVITY_CONTEST_BEAUTY:
+ case ACTIVITY_CONTEST_CUTE:
+ case ACTIVITY_CONTEST_SMART:
+ case ACTIVITY_CONTEST_TOUGH:
+ data->state = LG_STATE_READY_START_ACTIVITY;
return;
}
}
- switch (sub_8011A74())
+ switch (RfuGetStatus())
{
- case 1:
- data->state = 12;
+ case RFU_STATUS_FATAL_ERROR:
+ data->state = LG_STATE_RFU_ERROR;
break;
- case 2:
- case 6:
- case 9:
- data->state = 14;
+ case RFU_STATUS_CONNECTION_ERROR:
+ case RFU_STATUS_JOIN_GROUP_NO:
+ case RFU_STATUS_LEAVE_GROUP:
+ data->state = LG_STATE_DISCONNECTED;
break;
- case 5:
- sub_8013160(gStringVar4, gUnknown_02022C2C);
+ case RFU_STATUS_JOIN_GROUP_OK:
+ GetGroupLeaderSentAnOKMessage(gStringVar4, gPlayerCurrActivity);
if (PrintOnTextbox(&data->textState, gStringVar4))
{
- if (gUnknown_02022C2C == 28 || gUnknown_02022C2C == 14)
+ if (gPlayerCurrActivity == ACTIVITY_BATTLE_TOWER || gPlayerCurrActivity == ACTIVITY_BATTLE_TOWER_OPEN)
{
- sub_8011A64(12, 0);
+ RfuSetStatus(RFU_STATUS_ACK_JOIN_GROUP, 0);
}
else
{
- sub_8011A64(7, 0);
- StringCopy(gStringVar1, sLinkGroupActivityTexts[gUnknown_02022C2C]);
+ RfuSetStatus(RFU_STATUS_WAIT_ACK_JOIN_GROUP, 0);
+ StringCopy(gStringVar1, sLinkGroupActivityNameTexts[gPlayerCurrActivity]);
StringExpandPlaceholders(gStringVar4, sText_AwaitingOtherMembers);
}
}
break;
- case 7:
- if (data->field_15 > 0xF0)
+ case RFU_STATUS_WAIT_ACK_JOIN_GROUP:
+ if (data->delayBeforePrint > 240)
{
if (PrintOnTextbox(&data->textState, gStringVar4))
{
- sub_8011A64(12, 0);
- data->field_15 = 0;
+ RfuSetStatus(RFU_STATUS_ACK_JOIN_GROUP, 0);
+ data->delayBeforePrint = 0;
}
}
else
{
- switch (gUnknown_02022C2C)
+ switch (gPlayerCurrActivity)
{
- case 1:
- case 2:
- case 4:
- case 14:
- case 28:
+ case ACTIVITY_BATTLE_SINGLE:
+ case ACTIVITY_BATTLE_DOUBLE:
+ case ACTIVITY_TRADE:
+ case ACTIVITY_BATTLE_TOWER:
+ case ACTIVITY_BATTLE_TOWER_OPEN:
break;
default:
- data->field_15++;
+ data->delayBeforePrint++;
break;
}
}
break;
}
- if (!sub_8011A74() && gMain.newKeys & B_BUTTON)
- data->state = 7;
+ if (RfuGetStatus() == RFU_STATUS_OK && gMain.newKeys & B_BUTTON)
+ data->state = LG_STATE_ASK_LEAVE_GROUP;
break;
- case 7:
+ case LG_STATE_ASK_LEAVE_GROUP:
if (PrintOnTextbox(&data->textState, sText_QuitBeingMember))
- data->state = 8;
+ data->state = LG_STATE_ASK_LEAVE_GROUP_HANDLE_INPUT;
break;
- case 8:
- switch (sub_80170B8(&data->textState, sub_8011A74()))
+ case LG_STATE_ASK_LEAVE_GROUP_HANDLE_INPUT:
+ switch (UnionRoomHandleYesNo(&data->textState, RfuGetStatus()))
{
- case 0:
- sub_80106D4();
- data->state = 9;
+ case 0: // YES
+ SendLeaveGroupNotice();
+ data->state = LG_STATE_WAIT_LEAVE_GROUP;
RedrawListMenu(data->listTaskId);
break;
- case 1:
+ case 1: // NO
case -1:
- data->state = 5;
+ data->state = LG_STATE_ASK_JOIN_GROUP;
RedrawListMenu(data->listTaskId);
break;
case -3:
- data->state = 6;
+ data->state = LG_STATE_MAIN;
RedrawListMenu(data->listTaskId);
break;
}
break;
- case 9:
- if (sub_8011A74())
- data->state = 6;
+ case LG_STATE_WAIT_LEAVE_GROUP:
+ if (RfuGetStatus())
+ data->state = LG_STATE_MAIN;
break;
- case 10:
- case 12:
- case 14:
- case 18:
- case 20:
- ClearWindowTilemap(data->field_D);
- ClearStdWindowAndFrame(data->field_D, FALSE);
+ case LG_STATE_CANCEL_CHOOSE_LEADER: // next: LG_STATE_CANCELED
+ case LG_STATE_RFU_ERROR: // next: LG_STATE_RFU_ERROR_SHUTDOWN
+ case LG_STATE_DISCONNECTED: // next: LG_STATE_RETRY_CONNECTION
+ case LG_STATE_TRADE_NOT_READY: // next: LG_STATE_TRADE_NOT_READY_RETRY
+ case LG_STATE_READY_START_ACTIVITY: // next: LG_STATE_START_ACTIVITY
+ ClearWindowTilemap(data->playerNameAndIdWindowId);
+ ClearStdWindowAndFrame(data->playerNameAndIdWindowId, FALSE);
DestroyListMenuTask(data->listTaskId, 0, 0);
- ClearWindowTilemap(data->field_C);
+ ClearWindowTilemap(data->bButtonCancelWindowId);
ClearStdWindowAndFrame(data->listWindowId, FALSE);
CopyBgTilemapBufferToVram(0);
- RemoveWindow(data->field_D);
+ RemoveWindow(data->playerNameAndIdWindowId);
RemoveWindow(data->listWindowId);
- RemoveWindow(data->field_C);
- DestroyTask(data->field_11);
+ RemoveWindow(data->bButtonCancelWindowId);
+ DestroyTask(data->listenTaskId);
Free(data->field_0);
Free(data->field_4);
data->state++;
break;
- case 13:
+ case LG_STATE_RFU_ERROR_SHUTDOWN:
DestroyWirelessStatusIndicatorSprite();
- if (PrintOnTextbox(&data->textState, sPlayerDisconnectedTexts[sub_8011A74()]))
+ if (PrintOnTextbox(&data->textState, sPlayerDisconnectedTexts[RfuGetStatus()]))
{
- gSpecialVar_Result = 6;
- data->state = 23;
+ gSpecialVar_Result = LINKUP_CONNECTION_ERROR;
+ data->state = LG_STATE_SHUTDOWN;
}
break;
- case 11:
+ case LG_STATE_CANCELED:
DestroyWirelessStatusIndicatorSprite();
- gSpecialVar_Result = 5;
- data->state = 23;
+ gSpecialVar_Result = LINKUP_FAILED;
+ data->state = LG_STATE_SHUTDOWN;
break;
- case 15:
+ case LG_STATE_RETRY_CONNECTION:
+ // Failure from disconnection
+ // Happens if player or required member(s) leave group
+ // or if player is rejected from joining group
DestroyWirelessStatusIndicatorSprite();
- if (PrintOnTextbox(&data->textState, sPlayerDisconnectedTexts[sub_8011A74()]))
+ if (PrintOnTextbox(&data->textState, sPlayerDisconnectedTexts[RfuGetStatus()]))
{
- gSpecialVar_Result = 8;
- data->state = 23;
+ gSpecialVar_Result = LINKUP_RETRY_ROLE_ASSIGN;
+ data->state = LG_STATE_SHUTDOWN;
}
break;
- case 19:
+ case LG_STATE_TRADE_NOT_READY_RETRY:
if (PrintOnTextbox(&data->textState, gStringVar4))
{
- gSpecialVar_Result = 8;
- data->state = 23;
+ gSpecialVar_Result = LINKUP_RETRY_ROLE_ASSIGN;
+ data->state = LG_STATE_SHUTDOWN;
}
break;
- case 23:
+ case LG_STATE_SHUTDOWN:
DestroyTask(taskId);
- sub_80173D4();
- sub_800EDD4();
+ JoinGroup_EnableScriptContexts();
+ LinkRfu_Shutdown();
break;
- case 21:
- sub_80149C4();
+ case LG_STATE_START_ACTIVITY:
+ CreateTask_RunScriptAndFadeToActivity();
DestroyTask(taskId);
break;
}
}
-u32 sub_8013B8C(struct UnkStruct_Group *arg0, s32 id)
+static u32 IsTryingToTradeAcrossVersionTooSoon(struct WirelessLink_Group *data, s32 id)
{
- struct UnkStruct_x20 *structPtr = &arg0->field_0->arr[id];
+ struct UnkStruct_x20 *structPtr = &data->field_0->arr[id];
- if (gUnknown_02022C2C == 4 && structPtr->unk.field_0.unk_00.version != VERSION_EMERALD)
+ if (gPlayerCurrActivity == ACTIVITY_TRADE && structPtr->gname_uname.gname.unk_00.version != VERSION_EMERALD)
{
if (!(gSaveBlock2Ptr->specialSaveWarpFlags & CHAMPION_SAVEWARP))
- return 1;
- else if (structPtr->unk.field_0.unk_00.isChampion)
- return 0;
+ return UR_TRADE_PLAYER_NOT_READY;
+ else if (structPtr->gname_uname.gname.unk_00.isChampion)
+ return UR_TRADE_READY;
}
else
{
- return 0;
+ return UR_TRADE_READY;
}
- return 2;
+ return UR_TRADE_PARTNER_NOT_READY;
}
-void sub_8013BD8(struct UnkStruct_Group *data, s32 id)
+static void AskToJoinRfuGroup(struct WirelessLink_Group *data, s32 id)
{
- data->field_F = id;
+ data->leaderId = id;
LoadWirelessStatusIndicatorSpriteGfx();
CreateWirelessStatusIndicatorSprite(0, 0);
RedrawListMenu(data->listTaskId);
- sub_8018404(gStringVar1, &data->field_0->arr[data->field_F]);
- sub_8011090(gUnknown_082F0530[gSpecialVar_0x8004], 0, 1);
- sub_8011FC8(data->field_0->arr[data->field_F].unk.playerName, ReadAsU16(data->field_0->arr[data->field_F].unk.field_0.unk_00.playerTrainerId));
+ IntlConvPartnerUname7(gStringVar1, &data->field_0->arr[data->leaderId]);
+ UpdateGameData_SetActivity(sLinkGroupToURoomActivity[gSpecialVar_0x8004], 0, TRUE);
+ CreateTask_RfuReconnectWithParent(data->field_0->arr[data->leaderId].gname_uname.playerName, ReadAsU16(data->field_0->arr[data->leaderId].gname_uname.gname.unk_00.playerTrainerId));
}
-u8 sub_8013C40(void)
+u8 CreateTask_ListenToWireless(void)
{
u8 taskId;
- struct UnkStruct_Group *dataPtr;
+ struct WirelessLink_Group *data;
- taskId = CreateTask(sub_8013C7C, 0);
- gUnknown_02022C30.group = dataPtr = (void*)(gTasks[taskId].data);
+ taskId = CreateTask(Task_ListenToWireless, 0);
+ sWirelessLinkMain.group = data = (void*)(gTasks[taskId].data);
- dataPtr->state = 0;
- dataPtr->textState = 0;
+ data->state = 0;
+ data->textState = 0;
- gUnknown_03000DA4 = dataPtr;
+ sGroup = data;
return taskId;
}
-void sub_8013C7C(u8 taskId)
+static void Task_ListenToWireless(u8 taskId)
{
- struct UnkStruct_Group *data = gUnknown_02022C30.group;
+ struct WirelessLink_Group *data = sWirelessLinkMain.group;
switch (data->state)
{
case 0:
- sub_8010F84(0, 0, 0);
- sub_800B488();
+ SetHostRFUtgtGname(0, 0, 0);
+ SetWirelessCommType1();
OpenLink();
- sub_8011C5C();
+ InitializeRfuLinkManager_JoinGroup();
sub_80111B0(TRUE);
- data->field_4 = AllocZeroed(0x70);
- data->field_0 = AllocZeroed(0x200);
+ data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
+ data->field_0 = AllocZeroed(16 * sizeof(struct UnkStruct_x20));
data->state = 2;
break;
case 2:
- sub_80175EC(data->field_4, 4);
- sub_8017580(data->field_0->arr, 16);
- data->field_11 = sub_8016FC0(data->field_4, 0xFF);
- data->field_F = 0;
+ ClearUnkStruct_x1CArray(data->field_4, 4);
+ ClearUnkStruct_x20Array(data->field_0->arr, 16);
+ data->listenTaskId = CreateTask_ListenForPartnersWithCompatibleSerialNos(data->field_4, 0xFF);
+ data->leaderId = 0;
data->state = 3;
break;
case 3:
- if (sub_8013E44() == 1)
+ if (GetNewLeaderCandidate() == 1)
PlaySE(SE_PC_LOGIN);
if (gTasks[taskId].data[15] == 0xFF)
data->state = 10;
break;
case 10:
- DestroyTask(data->field_11);
+ DestroyTask(data->listenTaskId);
Free(data->field_0);
Free(data->field_4);
- sub_800EDD4();
+ LinkRfu_Shutdown();
data->state++;
break;
case 11:
- sub_800EDD4();
+ LinkRfu_Shutdown();
DestroyTask(taskId);
break;
}
}
-bool32 sub_8013D88(u32 arg0, u32 id)
+static bool32 IsPartnerActivityAcceptable(u32 activity, u32 linkGroup)
{
- if (id == 0xFF)
+ if (linkGroup == 0xFF)
return TRUE;
- if (id <= ARRAY_COUNT(gUnknown_082F04D8)) // UB: <= may access data outside the array
+ if (linkGroup <= ARRAY_COUNT(sAcceptedActivityIds)) // UB: <= may access data outside the array
{
- const u8 *bytes = gUnknown_082F04D8[id];
+ const u8 *bytes = sAcceptedActivityIds[linkGroup];
while ((*(bytes) != 0xFF))
{
- if ((*bytes) == arg0)
+ if ((*bytes) == activity)
return TRUE;
bytes++;
}
@@ -1178,49 +1336,49 @@ bool32 sub_8013D88(u32 arg0, u32 id)
return FALSE;
}
-u8 sub_8013DBC(struct UnkStruct_Group *data, u32 id)
+static u8 URoomGroupListGetTextColor(struct WirelessLink_Group *data, u32 id)
{
- if (data->field_0->arr[id].field_1A_0 == 1)
+ if (data->field_0->arr[id].groupScheduledAnim == UNION_ROOM_SPAWN_IN)
{
- if (data->field_0->arr[id].unk.field_0.started)
- return 3;
- else if (data->field_0->arr[id].field_1A_1 != 0)
- return 1;
+ if (data->field_0->arr[id].gname_uname.gname.started)
+ return UR_COLOR_WHT_WHT_LTE;
+ else if (data->field_0->arr[id].useRedText)
+ return UR_COLOR_RED_WHT_LTR;
else if (data->field_0->arr[id].field_1B != 0)
- return 2;
+ return UR_COLOR_GRN_WHT_LTG;
}
- return 0;
+ return UR_COLOR_DKE_WHT_LTE;
}
-void sub_8013DF4(u8 arg0, s32 id, u8 arg2)
+static void ListMenuItemPrintFunc_UnionRoomGroups(u8 windowId, s32 id, u8 y)
{
- struct UnkStruct_Group *data = gUnknown_02022C30.group;
- u8 var = sub_8013DBC(data, id);
+ struct WirelessLink_Group *data = sWirelessLinkMain.group;
+ u8 colorId = URoomGroupListGetTextColor(data, id);
- sub_80177B8(arg0, 8, arg2, &data->field_0->arr[id], var, id);
+ PrintUnionRoomGroupOnWindow(windowId, 8, y, &data->field_0->arr[id], colorId, id);
}
-u8 sub_8013E44(void)
+static u8 GetNewLeaderCandidate(void)
{
- struct UnkStruct_Group *data = gUnknown_02022C30.group;
+ struct WirelessLink_Group *data = sWirelessLinkMain.group;
u8 ret = 0;
u8 i;
s32 id;
for (i = 0; i < 16; i++)
{
- if (data->field_0->arr[i].field_1A_0 != 0)
+ if (data->field_0->arr[i].groupScheduledAnim != UNION_ROOM_SPAWN_NONE)
{
- id = sub_80176E4(&data->field_0->arr[i], data->field_4->arr);
+ id = Findx20Inx1CArray(&data->field_0->arr[i], data->field_4->arr);
if (id != 0xFF)
{
- if (data->field_0->arr[i].field_1A_0 == 1)
+ if (data->field_0->arr[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN)
{
- if (sub_8017678(&data->field_0->arr[i].unk, &data->field_4->arr[id].unk0))
+ if (AreUnionRoomPlayerGnamesDifferent(&data->field_0->arr[i].gname_uname, &data->field_4->arr[id].gname_uname))
{
- data->field_0->arr[i].unk = data->field_4->arr[id].unk0;
- data->field_0->arr[i].field_1B = 0x40;
+ data->field_0->arr[i].gname_uname = data->field_4->arr[id].gname_uname;
+ data->field_0->arr[i].field_1B = 64;
ret = 1;
}
else
@@ -1235,21 +1393,21 @@ u8 sub_8013E44(void)
}
else
{
- data->field_0->arr[i].field_1A_0 = 1;
- data->field_0->arr[i].field_1B = 0x40;
+ data->field_0->arr[i].groupScheduledAnim = UNION_ROOM_SPAWN_IN;
+ data->field_0->arr[i].field_1B = 64;
ret = 1;
}
- data->field_0->arr[i].field_18 = 0;
+ data->field_0->arr[i].timeoutCounter = 0;
}
else
{
- if (data->field_0->arr[i].field_1A_0 != 2)
+ if (data->field_0->arr[i].groupScheduledAnim != UNION_ROOM_SPAWN_OUT)
{
- data->field_0->arr[i].field_18++;
- if (data->field_0->arr[i].field_18 >= 300)
+ data->field_0->arr[i].timeoutCounter++;
+ if (data->field_0->arr[i].timeoutCounter >= 300)
{
- data->field_0->arr[i].field_1A_0 = 2;
+ data->field_0->arr[i].groupScheduledAnim = UNION_ROOM_SPAWN_OUT;
ret = 2;
}
}
@@ -1257,9 +1415,9 @@ u8 sub_8013E44(void)
}
}
- for (id = 0; id < 4; id++)
+ for (id = 0; id < RFU_CHILD_MAX; id++)
{
- if (sub_8017734(data->field_0->arr, &data->field_4->arr[id], 16) != 0xFF)
+ if (Appendx1Ctox20(data->field_0->arr, &data->field_4->arr[id], 16) != 0xFF)
ret = 1;
}
@@ -1272,14 +1430,14 @@ static void Task_CreateTradeMenu(u8 taskId)
DestroyTask(taskId);
}
-u8 sub_8013F78(void)
+u8 CreateTask_CreateTradeMenu(void)
{
u8 taskId = CreateTask(Task_CreateTradeMenu, 0);
return taskId;
}
-void sub_8013F90(u8 taskId)
+static void Task_StartUnionRoomTrade(u8 taskId)
{
u32 monId = GetPartyPositionOfRegisteredMon(&sUnionRoomTrade, GetMultiplayerId());
@@ -1319,7 +1477,7 @@ void sub_8013F90(u8 taskId)
}
}
-void sub_80140E0(u8 taskId)
+static void Task_ExchangeCards(u8 taskId)
{
switch (gTasks[taskId].data[0])
{
@@ -1329,7 +1487,7 @@ void sub_80140E0(u8 taskId)
gTasks[taskId].data[0]++;
break;
case 1:
- if (GetBlockReceivedStatus() == sub_800A9D8())
+ if (GetBlockReceivedStatus() == GetLinkPlayerCountAsBitFlags())
{
s32 i;
u16 *recvBuff;
@@ -1343,11 +1501,11 @@ void sub_80140E0(u8 taskId)
if (GetLinkPlayerCount() == 2)
{
recvBuff = gBlockRecvBuffer[GetMultiplayerId() ^ 1];
- sub_801B94C(recvBuff[48]);
+ MEventHandleReceivedWonderCard(recvBuff[48]);
}
else
{
- sub_801B940();
+ ResetReceivedWonderCardFlag();
}
ResetBlockReceivedFlags();
@@ -1357,16 +1515,16 @@ void sub_80140E0(u8 taskId)
}
}
-void sub_80141A4(void)
+static void CB2_ShowCard(void)
{
switch (gMain.state)
{
case 0:
- CreateTask(sub_80140E0, 5);
+ CreateTask(Task_ExchangeCards, 5);
gMain.state++;
break;
case 1:
- if (!FuncIsActiveTask(sub_80140E0))
+ if (!FuncIsActiveTask(Task_ExchangeCards))
ShowTrainerCardInLink(GetMultiplayerId() ^ 1, CB2_ReturnToField);
break;
}
@@ -1377,7 +1535,7 @@ void sub_80141A4(void)
BuildOamBuffer();
}
-void sub_8014210(u16 battleFlags)
+void StartUnionRoomBattle(u16 battleFlags)
{
HealPlayerParty();
SavePlayerParty();
@@ -1385,12 +1543,12 @@ void sub_8014210(u16 battleFlags)
gLinkPlayers[0].linkType = LINKTYPE_BATTLE;
gLinkPlayers[GetMultiplayerId()].id = GetMultiplayerId();
gLinkPlayers[GetMultiplayerId() ^ 1].id = GetMultiplayerId() ^ 1;
- gMain.savedCallback = sub_80B360C;
+ gMain.savedCallback = CB2_ReturnFromCableClubBattle;
gBattleTypeFlags = battleFlags;
PlayBattleBGM();
}
-static void sub_8014290(u16 linkService, u16 x, u16 y)
+static void WarpForWirelessMinigame(u16 linkService, u16 x, u16 y)
{
VarSet(VAR_CABLE_CLUB_STATE, linkService);
SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y);
@@ -1398,7 +1556,7 @@ static void sub_8014290(u16 linkService, u16 x, u16 y)
WarpIntoMap();
}
-void sub_8014304(s8 mapGroup, s8 mapNum, s32 x, s32 y, u16 linkService)
+static void WarpForCableClubActivity(s8 mapGroup, s8 mapNum, s32 x, s32 y, u16 linkService)
{
gSpecialVar_0x8004 = linkService;
VarSet(VAR_CABLE_CLUB_STATE, linkService);
@@ -1409,16 +1567,16 @@ void sub_8014304(s8 mapGroup, s8 mapNum, s32 x, s32 y, u16 linkService)
WarpIntoMap();
}
-void sub_8014384(void)
+static void CB2_TransitionToCableClub(void)
{
switch (gMain.state)
{
case 0:
- CreateTask(sub_80140E0, 5);
+ CreateTask(Task_ExchangeCards, 5);
gMain.state++;
break;
case 1:
- if (!FuncIsActiveTask(sub_80140E0))
+ if (!FuncIsActiveTask(Task_ExchangeCards))
SetMainCallback2(CB2_ReturnToFieldCableClub);
break;
}
@@ -1429,120 +1587,125 @@ void sub_8014384(void)
BuildOamBuffer();
}
-void sub_80143E4(void *arg0, bool32 arg1)
+static void CreateTrainerCardInBuffer(void *dest, bool32 setWonderCard)
{
- u16 *argAsU16Ptr = arg0;
+ u16 *argAsU16Ptr = dest;
TrainerCard_GenerateCardForPlayer((struct TrainerCard *)argAsU16Ptr);
- if (arg1)
+ if (setWonderCard)
argAsU16Ptr[48] = GetWonderCardFlagID();
else
argAsU16Ptr[48] = 0;
}
-void sub_801440C(u8 taskId)
+static void Task_StartActivity(u8 taskId)
{
- sub_801B940();
- switch (gUnknown_02022C2C)
+ ResetReceivedWonderCardFlag();
+ switch (gPlayerCurrActivity)
{
- case 1 ... 4:
- case 9 ... 11:
- case 13:
- case 15:
+ case ACTIVITY_BATTLE_SINGLE:
+ case ACTIVITY_BATTLE_DOUBLE:
+ case ACTIVITY_BATTLE_MULTI:
+ case ACTIVITY_TRADE:
+ case ACTIVITY_POKEMON_JUMP:
+ case ACTIVITY_BERRY_CRUSH:
+ case ACTIVITY_BERRY_PICK:
+ case ACTIVITY_SPIN_TRADE:
+ case ACTIVITY_RECORD_CORNER:
RecordMixTrainerNames();
break;
}
- switch (gUnknown_02022C2C)
+ switch (gPlayerCurrActivity)
{
- case 65:
- case 81:
+ case ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM:
+ case ACTIVITY_ACCEPT | IN_UNION_ROOM:
CleanupOverworldWindowsAndTilemaps();
- gMain.savedCallback = sub_801AC54;
+ gMain.savedCallback = CB2_UnionRoomBattle;
InitChooseHalfPartyForBattle(3);
break;
- case 1:
+ case ACTIVITY_BATTLE_SINGLE:
CleanupOverworldWindowsAndTilemaps();
- sub_80143E4(gBlockSendBuffer, TRUE);
+ CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE);
HealPlayerParty();
SavePlayerParty();
LoadPlayerBag();
- sub_8014304(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_SINGLE_BATTLE);
- SetMainCallback2(sub_8014384);
+ WarpForCableClubActivity(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_SINGLE_BATTLE);
+ SetMainCallback2(CB2_TransitionToCableClub);
break;
- case 2:
+ case ACTIVITY_BATTLE_DOUBLE:
CleanupOverworldWindowsAndTilemaps();
HealPlayerParty();
SavePlayerParty();
LoadPlayerBag();
- sub_80143E4(gBlockSendBuffer, TRUE);
- sub_8014304(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_DOUBLE_BATTLE);
- SetMainCallback2(sub_8014384);
+ CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE);
+ WarpForCableClubActivity(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_DOUBLE_BATTLE);
+ SetMainCallback2(CB2_TransitionToCableClub);
break;
- case 3:
+ case ACTIVITY_BATTLE_MULTI:
CleanupOverworldWindowsAndTilemaps();
HealPlayerParty();
SavePlayerParty();
LoadPlayerBag();
- sub_80143E4(gBlockSendBuffer, TRUE);
- sub_8014304(MAP_GROUP(BATTLE_COLOSSEUM_4P), MAP_NUM(BATTLE_COLOSSEUM_4P), 5, 8, USING_MULTI_BATTLE);
- SetMainCallback2(sub_8014384);
+ CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE);
+ WarpForCableClubActivity(MAP_GROUP(BATTLE_COLOSSEUM_4P), MAP_NUM(BATTLE_COLOSSEUM_4P), 5, 8, USING_MULTI_BATTLE);
+ SetMainCallback2(CB2_TransitionToCableClub);
break;
- case 4:
- sub_80143E4(gBlockSendBuffer, TRUE);
+ case ACTIVITY_TRADE:
+ CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE);
CleanupOverworldWindowsAndTilemaps();
- sub_8014304(MAP_GROUP(TRADE_CENTER), MAP_NUM(TRADE_CENTER), 5, 8, USING_TRADE_CENTER);
- SetMainCallback2(sub_8014384);
+ WarpForCableClubActivity(MAP_GROUP(TRADE_CENTER), MAP_NUM(TRADE_CENTER), 5, 8, USING_TRADE_CENTER);
+ SetMainCallback2(CB2_TransitionToCableClub);
break;
- case 15:
- sub_80143E4(gBlockSendBuffer, TRUE);
+ case ACTIVITY_RECORD_CORNER:
+ CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE);
CleanupOverworldWindowsAndTilemaps();
- sub_8014304(MAP_GROUP(RECORD_CORNER), MAP_NUM(RECORD_CORNER), 8, 9, USING_RECORD_CORNER);
- SetMainCallback2(sub_8014384);
+ WarpForCableClubActivity(MAP_GROUP(RECORD_CORNER), MAP_NUM(RECORD_CORNER), 8, 9, USING_RECORD_CORNER);
+ SetMainCallback2(CB2_TransitionToCableClub);
break;
- case 68:
+ case ACTIVITY_TRADE | IN_UNION_ROOM:
CleanupOverworldWindowsAndTilemaps();
- CreateTask(sub_8013F90, 0);
+ CreateTask(Task_StartUnionRoomTrade, 0);
break;
- case 5:
- case 69:
+ case ACTIVITY_CHAT:
+ case ACTIVITY_CHAT | IN_UNION_ROOM:
if (GetMultiplayerId() == 0)
{
- sub_800ED10();
+ LinkRfu_CreateConnectionAsParent();
}
else
{
- sub_800ED28();
- sub_8010F84(69, 0, 1);
+ LinkRfu_StopManagerBeforeEnteringChat();
+ SetHostRFUtgtGname(69, 0, 1);
}
- sub_801DD98();
+ EnterUnionRoomChat();
break;
- case 8:
- case 72:
- sub_80143E4(gBlockSendBuffer, FALSE);
- SetMainCallback2(sub_80141A4);
+ case ACTIVITY_CARD:
+ case ACTIVITY_CARD | IN_UNION_ROOM:
+ CreateTrainerCardInBuffer(gBlockSendBuffer, FALSE);
+ SetMainCallback2(CB2_ShowCard);
break;
- case 9:
- sub_8014290(USING_MINIGAME, 5, 1);
- sub_802A9A8(GetCursorSelectionMonId(), CB2_LoadMap);
+ case ACTIVITY_POKEMON_JUMP:
+ WarpForWirelessMinigame(USING_MINIGAME, 5, 1);
+ StartPokemonJump(GetCursorSelectionMonId(), CB2_LoadMap);
break;
- case 10:
- sub_8014290(USING_BERRY_CRUSH, 9, 1);
- sub_8020C70(CB2_LoadMap);
+ case ACTIVITY_BERRY_CRUSH:
+ WarpForWirelessMinigame(USING_BERRY_CRUSH, 9, 1);
+ StartBerryCrush(CB2_LoadMap);
break;
- case 11:
- sub_8014290(USING_MINIGAME, 5, 1);
- sub_802493C(GetCursorSelectionMonId(), CB2_LoadMap);
+ case ACTIVITY_BERRY_PICK:
+ WarpForWirelessMinigame(USING_MINIGAME, 5, 1);
+ StartDodrioBerryPicking(GetCursorSelectionMonId(), CB2_LoadMap);
break;
}
DestroyTask(taskId);
- gSpecialVar_Result = 1;
- if (gUnknown_02022C2C != 68)
+ gSpecialVar_Result = LINKUP_SUCCESS;
+ if (gPlayerCurrActivity != (ACTIVITY_TRADE | IN_UNION_ROOM))
ScriptContext2_Disable();
}
-void sub_8014790(u8 taskId)
+static void Task_RunScriptAndFadeToActivity(u8 taskId)
{
s16 *data = gTasks[taskId].data;
u16 *sendBuff = (u16*)(gBlockSendBuffer);
@@ -1550,11 +1713,11 @@ void sub_8014790(u8 taskId)
switch (data[0])
{
case 0:
- gSpecialVar_Result = 1;
- switch (gUnknown_02022C2C)
+ gSpecialVar_Result = LINKUP_SUCCESS;
+ switch (gPlayerCurrActivity)
{
- case 14:
- case 28:
+ case ACTIVITY_BATTLE_TOWER:
+ case ACTIVITY_BATTLE_TOWER_OPEN:
gLinkPlayers[0].linkType = LINKTYPE_BATTLE;
gLinkPlayers[0].id = 0;
gLinkPlayers[1].id = 2;
@@ -1565,8 +1728,12 @@ void sub_8014790(u8 taskId)
RecordMixTrainerNames();
ResetBlockReceivedFlags();
break;
- case 16:
- case 23 ... 27:
+ case ACTIVITY_BERRY_BLENDER:
+ case ACTIVITY_CONTEST_COOL:
+ case ACTIVITY_CONTEST_BEAUTY:
+ case ACTIVITY_CONTEST_CUTE:
+ case ACTIVITY_CONTEST_SMART:
+ case ACTIVITY_CONTEST_TOUGH:
RecordMixTrainerNames();
DestroyTask(taskId);
default:
@@ -1585,7 +1752,7 @@ void sub_8014790(u8 taskId)
case 2:
if (!gPaletteFade.active)
{
- if (gUnknown_02022C2C == 29)
+ if (gPlayerCurrActivity == ACTIVITY_29)
{
DestroyTask(taskId);
SetMainCallback2(CB2_StartCreateTradeMenu);
@@ -1601,7 +1768,7 @@ void sub_8014790(u8 taskId)
if (IsLinkTaskFinished())
{
DestroyTask(taskId);
- sub_80149D8();
+ CreateTask_StartActivity();
}
break;
case 4:
@@ -1612,9 +1779,9 @@ void sub_8014790(u8 taskId)
if (GetBlockReceivedStatus() == 3)
{
ResetBlockReceivedFlags();
- if (sub_80B2AF4(gBlockRecvBuffer[0], gBlockRecvBuffer[1]))
+ if (AreBattleTowerLinkSpeciesSame(gBlockRecvBuffer[0], gBlockRecvBuffer[1]))
{
- gSpecialVar_Result = 11;
+ gSpecialVar_Result = LINKUP_FAILED_BATTLE_TOWER;
data[0] = 7;
}
else
@@ -1642,78 +1809,78 @@ void sub_8014790(u8 taskId)
}
}
-void sub_80149C4(void)
+static void CreateTask_RunScriptAndFadeToActivity(void)
{
- CreateTask(sub_8014790, 0);
+ CreateTask(Task_RunScriptAndFadeToActivity, 0);
}
-void sub_80149D8(void)
+static void CreateTask_StartActivity(void)
{
- u8 taskId = CreateTask(sub_801440C, 0);
+ u8 taskId = CreateTask(Task_StartActivity, 0);
gTasks[taskId].data[0] = 0;
}
-void MEvent_CreateTask_Leader(u32 arg0)
+void MEvent_CreateTask_Leader(u32 activity)
{
u8 taskId;
- struct UnkStruct_Leader *dataPtr;
+ struct WirelessLink_Leader *data;
- taskId = CreateTask(sub_8014A40, 0);
- gUnknown_02022C30.leader = dataPtr = (void*)(gTasks[taskId].data);
+ taskId = CreateTask(Task_MEvent_Leader, 0);
+ sWirelessLinkMain.leader = data = (void*)(gTasks[taskId].data);
- dataPtr->state = 0;
- dataPtr->textState = 0;
- dataPtr->field_18 = arg0;
- gSpecialVar_Result = 0;
+ data->state = 0;
+ data->textState = 0;
+ data->activity = activity;
+ gSpecialVar_Result = LINKUP_ONGOING;
}
-void sub_8014A40(u8 taskId)
+static void Task_MEvent_Leader(u8 taskId)
{
- struct UnkStruct_Leader *data = gUnknown_02022C30.leader;
+ struct WirelessLink_Leader *data = sWirelessLinkMain.leader;
struct WindowTemplate winTemplate;
s32 val;
switch (data->state)
{
case 0:
- gUnknown_02022C2C = data->field_18;
- gUnknown_02022C2D = 2;
- sub_8010F84(data->field_18, 0, 0);
- sub_8010FA0(FALSE, FALSE);
- sub_800B488();
+ gPlayerCurrActivity = data->activity;
+ sPlayerActivityGroupSize = 2;
+ SetHostRFUtgtGname(data->activity, 0, 0);
+ SetGnameBufferWonderFlags(FALSE, FALSE);
+ SetWirelessCommType1();
OpenLink();
- sub_8011C10(2);
+ InitializeRfuLinkManager_LinkLeader(2);
data->state = 1;
break;
case 1:
- data->field_4 = AllocZeroed(0x70);
- data->field_0 = AllocZeroed(0xA0);
- data->field_8 = AllocZeroed(0xA0);
- sub_80175EC(data->field_4, 4);
- sub_8017580(data->field_0->arr, 5);
- sub_800DF90(&data->field_0->arr[0].unk.field_0, data->field_0->arr[0].unk.playerName);
- data->field_0->arr[0].field_18 = 0;
- data->field_0->arr[0].field_1A_0 = 1;
- data->field_0->arr[0].field_1A_1 = 0;
+ data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
+ data->field_0 = AllocZeroed(5 * sizeof(struct UnkStruct_x20));
+ data->field_8 = AllocZeroed(5 * sizeof(struct UnkStruct_x20));
+ ClearUnkStruct_x1CArray(data->field_4, 4);
+ ClearUnkStruct_x20Array(data->field_0->arr, 5);
+ LinkRfu3_SetGnameUnameFromStaticBuffers(&data->field_0->arr[0].gname_uname.gname, data->field_0->arr[0].gname_uname.playerName);
+ data->field_0->arr[0].timeoutCounter = 0;
+ data->field_0->arr[0].groupScheduledAnim = UNION_ROOM_SPAWN_IN;
+ data->field_0->arr[0].useRedText = FALSE;
data->field_0->arr[0].field_1B = 0;
- data->field_17 = sub_8016FC0(data->field_4, 0xFF);
+ data->listenTaskId = CreateTask_ListenForPartnersWithCompatibleSerialNos(data->field_4, 0xFF);
- winTemplate = gUnknown_082F011C;
+ winTemplate = sWindowTemplate_PlayerList;
winTemplate.baseBlock = GetMysteryGiftBaseBlock();
winTemplate.paletteNum = 0xC;
data->listWindowId = AddWindow(&winTemplate);
MG_DrawTextBorder(data->listWindowId);
- gMultiuseListMenuTemplate = gUnknown_082F015C;
+ gMultiuseListMenuTemplate = sListMenuTemplate_PossibleGroupMembers;
gMultiuseListMenuTemplate.windowId = data->listWindowId;
data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
CopyBgTilemapBufferToVram(0);
- data->field_13 = 1;
+ data->playerCount = 1;
data->state = 2;
break;
case 2:
- StringCopy(gStringVar1, sLinkGroupActivityTexts[gUnknown_02022C2C]);
- sub_801262C(gStringVar4, gUnknown_02022C2C);
+ StringCopy(gStringVar1, sLinkGroupActivityNameTexts[gPlayerCurrActivity]);
+ StringExpandPlaceholders_AwaitingCommFromAnother(gStringVar4, gPlayerCurrActivity);
data->state = 3;
break;
case 3:
@@ -1721,7 +1888,7 @@ void sub_8014A40(u8 taskId)
data->state = 4;
break;
case 4:
- sub_801320C(data, 5, 6);
+ Leader_SetStateIfMemberListChanged(data, 5, 6);
if (gMain.newKeys & B_BUTTON)
{
data->state = 13;
@@ -1731,7 +1898,7 @@ void sub_8014A40(u8 taskId)
case 6:
if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, sText_LinkWithFriendDropped))
{
- data->field_13 = sub_8013398(data->field_0);
+ data->playerCount = sub_8013398(data->field_0);
RedrawListMenu(data->listTaskId);
data->state = 2;
}
@@ -1745,48 +1912,48 @@ void sub_8014A40(u8 taskId)
case 0:
LoadWirelessStatusIndicatorSpriteGfx();
CreateWirelessStatusIndicatorSprite(0, 0);
- data->field_0->arr[data->field_13].field_1B = 0;
+ data->field_0->arr[data->playerCount].field_1B = 0;
RedrawListMenu(data->listTaskId);
- data->field_19 = 5;
- sub_8010688(5, ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ data->joinRequestAnswer = RFU_STATUS_JOIN_GROUP_OK;
+ SendRfuStatusToPartner(data->joinRequestAnswer, ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.playerName);
data->state = 8;
break;
case 1:
case -1:
- data->field_19 = 6;
- sub_8010688(6, ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
+ data->joinRequestAnswer = RFU_STATUS_JOIN_GROUP_NO;
+ SendRfuStatusToPartner(data->joinRequestAnswer, ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.playerName);
data->state = 8;
break;
}
break;
case 8:
- val = sub_8010714(ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName);
- if (val == 1)
+ val = WaitSendRfuStatusToPartner(ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.playerName);
+ if (val == 1) // Send complete
{
- if (data->field_19 == 5)
+ if (data->joinRequestAnswer == RFU_STATUS_JOIN_GROUP_OK)
{
- data->field_0->arr[data->field_13].field_1B = 0;
+ data->field_0->arr[data->playerCount].field_1B = 0;
RedrawListMenu(data->listTaskId);
- data->field_13++;
- sub_8018404(gStringVar1, &data->field_0->arr[data->field_13 - 1]);
+ data->playerCount++;
+ IntlConvPartnerUname7(gStringVar1, &data->field_0->arr[data->playerCount - 1]);
StringExpandPlaceholders(gStringVar4, sText_AnOKWasSentToPlayer);
data->state = 9;
- sub_800EF38();
+ LinkRfu_StopManagerAndFinalizeSlots();
}
else
{
- sub_8011DC0(data->field_0->arr[data->field_13].unk.playerName, ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId));
- data->field_0->arr[data->field_13].field_1A_0 = 0;
+ RequestDisconnectSlotByTrainerNameAndId(data->field_0->arr[data->playerCount].gname_uname.playerName, ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId));
+ data->field_0->arr[data->playerCount].groupScheduledAnim = UNION_ROOM_SPAWN_NONE;
sub_8013398(data->field_0);
RedrawListMenu(data->listTaskId);
data->state = 2;
}
- data->field_19 = 0;
+ data->joinRequestAnswer = 0;
}
- else if (val == 2)
+ else if (val == 2) // Member disconnected
{
- sub_8011A64(0, 0);
+ RfuSetStatus(RFU_STATUS_OK, 0);
data->state = 2;
}
break;
@@ -1795,17 +1962,17 @@ void sub_8014A40(u8 taskId)
data->state = 10;
break;
case 10:
- if (++data->field_E > 120)
+ if (++data->delayTimerAfterOk > 120)
data->state = 11;
break;
case 11:
- if (!sub_801320C(data, 5, 6))
+ if (!Leader_SetStateIfMemberListChanged(data, 5, 6))
data->state = 12;
break;
case 12:
- if (sub_800EF1C())
+ if (LmanAcceptSlotFlagIsNotZero())
{
- sub_800EF58(FALSE);
+ WaitRfuState(FALSE);
data->state = 15;
}
else
@@ -1815,11 +1982,11 @@ void sub_8014A40(u8 taskId)
break;
case 13:
DestroyWirelessStatusIndicatorSprite();
- sub_800EDD4();
+ LinkRfu_Shutdown();
DestroyListMenuTask(data->listTaskId, 0, 0);
CopyBgTilemapBufferToVram(0);
RemoveWindow(data->listWindowId);
- DestroyTask(data->field_17);
+ DestroyTask(data->listenTaskId);
Free(data->field_8);
Free(data->field_0);
Free(data->field_4);
@@ -1829,17 +1996,17 @@ void sub_8014A40(u8 taskId)
if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, sText_PleaseStartOver))
{
DestroyTask(taskId);
- gSpecialVar_Result = 5;
+ gSpecialVar_Result = LINKUP_FAILED;
}
break;
case 15:
- if (sub_8011A74() == 1 || sub_8011A74() == 2)
+ if (RfuGetStatus() == RFU_STATUS_FATAL_ERROR || RfuGetStatus() == RFU_STATUS_CONNECTION_ERROR)
{
data->state = 13;
}
else if (gReceivedRemoteLinkPlayers != 0)
{
- sub_8011068(1);
+ UpdateGameData_GroupLockedIn(TRUE);
data->state++;
}
break;
@@ -1847,7 +2014,7 @@ void sub_8014A40(u8 taskId)
DestroyListMenuTask(data->listTaskId, 0, 0);
CopyBgTilemapBufferToVram(0);
RemoveWindow(data->listWindowId);
- DestroyTask(data->field_17);
+ DestroyTask(data->listenTaskId);
Free(data->field_8);
Free(data->field_0);
Free(data->field_4);
@@ -1861,36 +2028,36 @@ void sub_8014A40(u8 taskId)
}
}
-void MEvent_CreateTask_CardOrNewsWithFriend(u32 arg0)
+void MEvent_CreateTask_CardOrNewsWithFriend(u32 activity)
{
u8 taskId;
- struct UnkStruct_Group *dataPtr;
+ struct WirelessLink_Group *data;
- taskId = CreateTask(sub_8014F48, 0);
- gUnknown_02022C30.group = dataPtr = (void*)(gTasks[taskId].data);
- gUnknown_03000DA4 = dataPtr;
+ taskId = CreateTask(Task_CardOrNewsWithFriend, 0);
+ sWirelessLinkMain.group = data = (void*)(gTasks[taskId].data);
+ sGroup = data;
- dataPtr->state = 0;
- dataPtr->textState = 0;
- dataPtr->field_12 = arg0 - 21;
- gSpecialVar_Result = 0;
+ data->state = 0;
+ data->textState = 0;
+ data->isWonderNews = activity - ACTIVITY_WONDER_CARD2;
+ gSpecialVar_Result = LINKUP_ONGOING;
}
-void sub_8014F48(u8 taskId)
+static void Task_CardOrNewsWithFriend(u8 taskId)
{
s32 id;
struct WindowTemplate winTemplate1, winTemplate2;
- struct UnkStruct_Group *data = gUnknown_02022C30.group;
+ struct WirelessLink_Group *data = sWirelessLinkMain.group;
switch (data->state)
{
case 0:
- sub_8010F84(data->field_12 + 21, 0, 0);
- sub_800B488();
+ SetHostRFUtgtGname(data->isWonderNews + ACTIVITY_WONDER_CARD2, 0, 0);
+ SetWirelessCommType1();
OpenLink();
- sub_8011C5C();
- data->field_4 = AllocZeroed(0x70);
- data->field_0 = AllocZeroed(0x200);
+ InitializeRfuLinkManager_JoinGroup();
+ data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
+ data->field_0 = AllocZeroed(16 * sizeof(struct UnkStruct_x20));
data->state = 1;
break;
case 1:
@@ -1898,9 +2065,9 @@ void sub_8014F48(u8 taskId)
data->state = 2;
break;
case 2:
- sub_80175EC(data->field_4, 4);
- sub_8017580(data->field_0->arr, 16);
- data->field_11 = sub_8016FC0(data->field_4, data->field_12 + 7);
+ ClearUnkStruct_x1CArray(data->field_4, 4);
+ ClearUnkStruct_x20Array(data->field_0->arr, 16);
+ data->listenTaskId = CreateTask_ListenForPartnersWithCompatibleSerialNos(data->field_4, data->isWonderNews + LINK_GROUP_WONDER_CARD);
winTemplate1 = gUnknown_082F0174;
winTemplate1.baseBlock = GetMysteryGiftBaseBlock();
@@ -1909,25 +2076,25 @@ void sub_8014F48(u8 taskId)
winTemplate2 = gUnknown_082F017C;
winTemplate2.paletteNum = 0xC;
- data->field_D = AddWindow(&winTemplate2);
+ data->playerNameAndIdWindowId = AddWindow(&winTemplate2);
MG_DrawTextBorder(data->listWindowId);
- gMultiuseListMenuTemplate = gUnknown_082F0204;
+ gMultiuseListMenuTemplate = sListMenuTemplate_UnionRoomGroups;
gMultiuseListMenuTemplate.windowId = data->listWindowId;
data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
- MG_DrawTextBorder(data->field_D);
- FillWindowPixelBuffer(data->field_D, PIXEL_FILL(1));
- PutWindowTilemap(data->field_D);
- sub_80125BC(data->field_D);
- CopyWindowToVram(data->field_D, 2);
+ MG_DrawTextBorder(data->playerNameAndIdWindowId);
+ FillWindowPixelBuffer(data->playerNameAndIdWindowId, PIXEL_FILL(1));
+ PutWindowTilemap(data->playerNameAndIdWindowId);
+ PrintPlayerNameAndIdOnWindow(data->playerNameAndIdWindowId);
+ CopyWindowToVram(data->playerNameAndIdWindowId, 2);
CopyBgTilemapBufferToVram(0);
- data->field_F = 0;
+ data->leaderId = 0;
data->state = 3;
break;
case 3:
- id = sub_8013E44();
+ id = GetNewLeaderCandidate();
switch (id)
{
case 1:
@@ -1941,16 +2108,16 @@ void sub_8014F48(u8 taskId)
{
// this unused variable along with the assignment is needed to match
u32 unusedVar;
- unusedVar = data->field_0->arr[id].unk.field_0.activity;
+ unusedVar = data->field_0->arr[id].gname_uname.gname.activity;
- if (data->field_0->arr[id].field_1A_0 == 1 && !data->field_0->arr[id].unk.field_0.started)
+ if (data->field_0->arr[id].groupScheduledAnim == UNION_ROOM_SPAWN_IN && !data->field_0->arr[id].gname_uname.gname.started)
{
- data->field_F = id;
+ data->leaderId = id;
LoadWirelessStatusIndicatorSpriteGfx();
CreateWirelessStatusIndicatorSprite(0, 0);
RedrawListMenu(data->listTaskId);
- sub_8018404(gStringVar1, &data->field_0->arr[data->field_F]);
- sub_8011FC8(data->field_0->arr[data->field_F].unk.playerName, ReadAsU16(data->field_0->arr[data->field_F].unk.field_0.unk_00.playerTrainerId));
+ IntlConvPartnerUname7(gStringVar1, &data->field_0->arr[data->leaderId]);
+ CreateTask_RfuReconnectWithParent(data->field_0->arr[data->leaderId].gname_uname.playerName, ReadAsU16(data->field_0->arr[data->leaderId].gname_uname.gname.unk_00.playerTrainerId));
PlaySE(SE_PN_ON);
data->state = 4;
}
@@ -1968,26 +2135,26 @@ void sub_8014F48(u8 taskId)
break;
case 4:
AddTextPrinterToWindow1(sText_AwaitingPlayersResponse);
- sub_8018404(gStringVar1, &data->field_0->arr[data->field_F]);
+ IntlConvPartnerUname7(gStringVar1, &data->field_0->arr[data->leaderId]);
data->state = 5;
break;
case 5:
- if (gReceivedRemoteLinkPlayers != 0)
+ if (gReceivedRemoteLinkPlayers)
{
- gUnknown_02022C2C = data->field_0->arr[data->field_F].unk.field_0.activity;
+ gPlayerCurrActivity = data->field_0->arr[data->leaderId].gname_uname.gname.activity;
data->state = 10;
}
- switch (sub_8011A74())
+ switch (RfuGetStatus())
{
- case 1:
- case 2:
- case 6:
+ case RFU_STATUS_FATAL_ERROR:
+ case RFU_STATUS_CONNECTION_ERROR:
+ case RFU_STATUS_JOIN_GROUP_NO:
data->state = 8;
break;
- case 5:
+ case RFU_STATUS_JOIN_GROUP_OK:
AddTextPrinterToWindow1(sText_PlayerSentBackOK);
- sub_8011A64(0, 0);
+ RfuSetStatus(RFU_STATUS_OK, 0);
break;
}
break;
@@ -1996,28 +2163,28 @@ void sub_8014F48(u8 taskId)
case 10:
DestroyListMenuTask(data->listTaskId, 0, 0);
CopyBgTilemapBufferToVram(0);
- RemoveWindow(data->field_D);
+ RemoveWindow(data->playerNameAndIdWindowId);
RemoveWindow(data->listWindowId);
- DestroyTask(data->field_11);
+ DestroyTask(data->listenTaskId);
Free(data->field_0);
Free(data->field_4);
data->state++;
break;
case 9:
- if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, sLinkDroppedTexts[sub_8011A74()]))
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, sLinkDroppedTexts[RfuGetStatus()]))
{
DestroyWirelessStatusIndicatorSprite();
DestroyTask(taskId);
- sub_800EDD4();
- gSpecialVar_Result = 5;
+ LinkRfu_Shutdown();
+ gSpecialVar_Result = LINKUP_FAILED;
}
break;
case 7:
DestroyWirelessStatusIndicatorSprite();
AddTextPrinterToWindow1(sText_PleaseStartOver);
DestroyTask(taskId);
- sub_800EDD4();
- gSpecialVar_Result = 5;
+ LinkRfu_Shutdown();
+ gSpecialVar_Result = LINKUP_FAILED;
break;
case 11:
data->state++;
@@ -2030,36 +2197,36 @@ void sub_8014F48(u8 taskId)
}
}
-void MEvent_CreateTask_CardOrNewsOverWireless(u32 arg0)
+void MEvent_CreateTask_CardOrNewsOverWireless(u32 activity)
{
u8 taskId;
- struct UnkStruct_Group *dataPtr;
+ struct WirelessLink_Group *data;
- taskId = CreateTask(sub_80152F4, 0);
- gUnknown_02022C30.group = dataPtr = (void*)(gTasks[taskId].data);
- gUnknown_03000DA4 = dataPtr;
+ taskId = CreateTask(Task_CardOrNewsOverWireless, 0);
+ sWirelessLinkMain.group = data = (void*)(gTasks[taskId].data);
+ sGroup = data;
- dataPtr->state = 0;
- dataPtr->textState = 0;
- dataPtr->field_12 = arg0 - 21;
- gSpecialVar_Result = 0;
+ data->state = 0;
+ data->textState = 0;
+ data->isWonderNews = activity - ACTIVITY_WONDER_CARD2;
+ gSpecialVar_Result = LINKUP_ONGOING;
}
-void sub_80152F4(u8 taskId)
+static void Task_CardOrNewsOverWireless(u8 taskId)
{
s32 id;
struct WindowTemplate winTemplate;
- struct UnkStruct_Group *data = gUnknown_02022C30.group;
+ struct WirelessLink_Group *data = sWirelessLinkMain.group;
switch (data->state)
{
case 0:
- sub_8010F84(0, 0, 0);
- sub_800B488();
+ SetHostRFUtgtGname(0, 0, 0);
+ SetWirelessCommType1();
OpenLink();
- sub_8011C5C();
- data->field_4 = AllocZeroed(0x70);
- data->field_0 = AllocZeroed(0x200);
+ InitializeRfuLinkManager_JoinGroup();
+ data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
+ data->field_0 = AllocZeroed(16 * sizeof(struct UnkStruct_x20));
data->state = 1;
break;
case 1:
@@ -2067,9 +2234,9 @@ void sub_80152F4(u8 taskId)
data->state = 2;
break;
case 2:
- sub_80175EC(data->field_4, 4);
- sub_8017580(data->field_0->arr, 16);
- data->field_11 = sub_8016FF0(data->field_4, data->field_12 + 7);
+ ClearUnkStruct_x1CArray(data->field_4, 4);
+ ClearUnkStruct_x20Array(data->field_0->arr, 16);
+ data->listenTaskId = CreateTask_ListenForPartnersWithSerial7F7D(data->field_4, data->isWonderNews + LINK_GROUP_WONDER_CARD);
if (data->field_13 != 0)
{
@@ -2078,18 +2245,18 @@ void sub_80152F4(u8 taskId)
data->listWindowId = AddWindow(&winTemplate);
MG_DrawTextBorder(data->listWindowId);
- gMultiuseListMenuTemplate = gUnknown_082F0204;
+ gMultiuseListMenuTemplate = sListMenuTemplate_UnionRoomGroups;
gMultiuseListMenuTemplate.windowId = data->listWindowId;
data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
CopyBgTilemapBufferToVram(0);
}
- data->field_F = 0;
+ data->leaderId = 0;
data->state = 3;
break;
case 3:
- id = sub_8013E44();
+ id = GetNewLeaderCandidate();
switch (id)
{
case 1:
@@ -2101,17 +2268,17 @@ void sub_80152F4(u8 taskId)
case 0:
if (data->field_13 != 0)
id = ListMenu_ProcessInput(data->listTaskId);
- if (data->field_14 > 120)
+ if (data->refreshTimer > 120)
{
- if (data->field_0->arr[0].field_1A_0 == 1 && !data->field_0->arr[0].unk.field_0.started)
+ if (data->field_0->arr[0].groupScheduledAnim == UNION_ROOM_SPAWN_IN && !data->field_0->arr[0].gname_uname.gname.started)
{
- if (sub_8016F1C(&data->field_0->arr[0].unk.field_0, data->field_12 + 7))
+ if (HasWonderCardOrNewsByLinkGroup(&data->field_0->arr[0].gname_uname.gname, data->isWonderNews + LINK_GROUP_WONDER_CARD))
{
- data->field_F = 0;
- data->field_14 = 0;
+ data->leaderId = 0;
+ data->refreshTimer = 0;
LoadWirelessStatusIndicatorSpriteGfx();
CreateWirelessStatusIndicatorSprite(0, 0);
- sub_8011FC8(data->field_0->arr[0].unk.playerName, ReadAsU16(data->field_0->arr[0].unk.field_0.unk_00.playerTrainerId));
+ CreateTask_RfuReconnectWithParent(data->field_0->arr[0].gname_uname.playerName, ReadAsU16(data->field_0->arr[0].gname_uname.gname.unk_00.playerTrainerId));
PlaySE(SE_PN_ON);
data->state = 4;
}
@@ -2125,34 +2292,34 @@ void sub_80152F4(u8 taskId)
else if (gMain.newKeys & B_BUTTON)
{
data->state = 6;
- data->field_14 = 0;
+ data->refreshTimer = 0;
}
- data->field_14++;
+ data->refreshTimer++;
break;
}
break;
case 4:
AddTextPrinterToWindow1(sText_AwaitingResponseFromWirelessSystem);
- sub_8018404(gStringVar1, &data->field_0->arr[data->field_F]);
+ IntlConvPartnerUname7(gStringVar1, &data->field_0->arr[data->leaderId]);
data->state = 5;
break;
case 5:
- if (gReceivedRemoteLinkPlayers != 0)
+ if (gReceivedRemoteLinkPlayers)
{
- gUnknown_02022C2C = data->field_0->arr[data->field_F].unk.field_0.activity;
+ gPlayerCurrActivity = data->field_0->arr[data->leaderId].gname_uname.gname.activity;
data->state = 12;
}
- switch (sub_8011A74())
+ switch (RfuGetStatus())
{
- case 1:
- case 2:
- case 6:
+ case RFU_STATUS_FATAL_ERROR:
+ case RFU_STATUS_CONNECTION_ERROR:
+ case RFU_STATUS_JOIN_GROUP_NO:
data->state = 8;
break;
- case 5:
+ case RFU_STATUS_JOIN_GROUP_OK:
AddTextPrinterToWindow1(sText_WirelessLinkEstablished);
- sub_8011A64(0, 0);
+ RfuSetStatus(RFU_STATUS_OK, 0);
break;
}
break;
@@ -2166,7 +2333,7 @@ void sub_80152F4(u8 taskId)
CopyBgTilemapBufferToVram(0);
RemoveWindow(data->listWindowId);
}
- DestroyTask(data->field_11);
+ DestroyTask(data->listenTaskId);
Free(data->field_0);
Free(data->field_4);
data->state++;
@@ -2176,8 +2343,8 @@ void sub_80152F4(u8 taskId)
{
DestroyWirelessStatusIndicatorSprite();
DestroyTask(taskId);
- sub_800EDD4();
- gSpecialVar_Result = 5;
+ LinkRfu_Shutdown();
+ gSpecialVar_Result = LINKUP_FAILED;
}
break;
case 7:
@@ -2185,17 +2352,17 @@ void sub_80152F4(u8 taskId)
{
DestroyWirelessStatusIndicatorSprite();
DestroyTask(taskId);
- sub_800EDD4();
- gSpecialVar_Result = 5;
+ LinkRfu_Shutdown();
+ gSpecialVar_Result = LINKUP_FAILED;
}
break;
case 11:
- if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, sNoWonderSharedTexts[data->field_12]))
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, sNoWonderSharedTexts[data->isWonderNews]))
{
DestroyWirelessStatusIndicatorSprite();
DestroyTask(taskId);
- sub_800EDD4();
- gSpecialVar_Result = 5;
+ LinkRfu_Shutdown();
+ gSpecialVar_Result = LINKUP_FAILED;
}
break;
case 13:
@@ -2209,172 +2376,172 @@ void sub_80152F4(u8 taskId)
}
}
-void UnionRoomSpecial(void)
+void RunUnionRoom(void)
{
- struct UnkStruct_URoom *dataPtr;
+ struct WirelessLink_URoom *uroom;
- sub_8010F60();
- CreateTask(sub_80156E0, 10);
+ ClearAndInitHostRFUtgtGname();
+ CreateTask(Task_RunUnionRoom, 10);
// dumb line needed to match
- gUnknown_02022C30.uRoom = gUnknown_02022C30.uRoom;
+ sWirelessLinkMain.uRoom = sWirelessLinkMain.uRoom;
- dataPtr = AllocZeroed(sizeof(*gUnknown_02022C30.uRoom));
- gUnknown_02022C30.uRoom = dataPtr;
- gUnknown_03000DA8 = dataPtr;
+ uroom = AllocZeroed(sizeof(*sWirelessLinkMain.uRoom));
+ sWirelessLinkMain.uRoom = uroom;
+ sURoom = uroom;
- dataPtr->state = 0;
- dataPtr->textState = 0;
- dataPtr->field_10 = 0;
- dataPtr->field_12 = 0;
+ uroom->state = UR_STATE_INIT;
+ uroom->textState = 0;
+ uroom->unknown = 0;
+ uroom->field_12 = 0;
gSpecialVar_Result = 0;
- sub_819A2BC(0xD0, 1);
+ ListMenuLoadStdPalAt(0xD0, 1);
}
-u16 ReadAsU16(const u8 *ptr)
+static u16 ReadAsU16(const u8 *ptr)
{
return (ptr[1] << 8) | (ptr[0]);
}
-void sub_8015664(u32 nextState, const u8 *src)
+static void ScheduleFieldMessageWithFollowupState(u32 nextState, const u8 *src)
{
- struct UnkStruct_URoom *data = gUnknown_02022C30.uRoom;
+ struct WirelessLink_URoom *uroom = sWirelessLinkMain.uRoom;
- data->state = 8;
- data->stateAfterPrint = nextState;
+ uroom->state = UR_STATE_PRINT_MSG;
+ uroom->stateAfterPrint = nextState;
if (src != gStringVar4)
StringExpandPlaceholders(gStringVar4, src);
}
-void sub_801568C(const u8 *src)
+static void ScheduleFieldMessageAndExit(const u8 *src)
{
- struct UnkStruct_URoom *data = gUnknown_02022C30.uRoom;
+ struct WirelessLink_URoom *uroom = sWirelessLinkMain.uRoom;
- data->state = 26;
+ uroom->state = UR_STATE_PRINT_AND_EXIT;
if (src != gStringVar4)
StringExpandPlaceholders(gStringVar4, src);
}
-void sub_80156B0(struct UnkStruct_URoom *data)
+static void sub_80156B0(struct WirelessLink_URoom *uroom)
{
- memcpy(&gDecompressionBuffer[0x3F00], data->field_0, 0x100);
+ memcpy(&gDecompressionBuffer[0x3F00], uroom->field_0, 0x100);
}
-void sub_80156C8(struct UnkStruct_URoom *data)
+static void sub_80156C8(struct WirelessLink_URoom *uroom)
{
- memcpy(data->field_0, &gDecompressionBuffer[0x3F00], 0x100);
+ memcpy(uroom->field_0, &gDecompressionBuffer[0x3F00], 0x100);
}
-void sub_80156E0(u8 taskId)
+static void Task_RunUnionRoom(u8 taskId)
{
u32 id = 0;
- s32 var5 = 0;
- s32 playerGender = 0;
- struct UnkStruct_URoom *data = gUnknown_02022C30.uRoom;
+ s32 input = 0;
+ s32 playerGender = MALE;
+ struct WirelessLink_URoom *uroom = sWirelessLinkMain.uRoom;
s16 *taskData = gTasks[taskId].data;
- switch (data->state)
+ switch (uroom->state)
{
- case 0:
- data->field_4 = AllocZeroed(0x70);
- data->field_C = AllocZeroed(0x70);
- data->field_0 = AllocZeroed(0x100);
- data->field_8 = AllocZeroed(0x20);
- sub_8017580(data->field_0->arr, 8);
- gUnknown_02022C2C = 0x40;
- data->field_20 = sub_8016DF0(data->field_C, data->field_4, 9);
- sub_8019BA8(data->field_A0);
- sub_8019F2C();
- data->state = 1;
- break;
- case 1:
- sub_8019E70(data->spriteIds, taskData[0]);
+ case UR_STATE_INIT:
+ uroom->field_4 = AllocZeroed(RFU_CHILD_MAX * sizeof(struct UnkStruct_x1C));
+ uroom->field_C = AllocZeroed(RFU_CHILD_MAX * sizeof(struct UnkStruct_x1C));
+ uroom->field_0 = AllocZeroed(8 * sizeof(struct UnkStruct_x20));
+ uroom->field_8 = AllocZeroed(sizeof(struct UnkStruct_x20));
+ ClearUnkStruct_x20Array(uroom->field_0->arr, ARRAY_COUNT(uroom->field_0->arr));
+ gPlayerCurrActivity = IN_UNION_ROOM;
+ uroom->searchTaskId = CreateTask_SearchForChildOrParent(uroom->field_C, uroom->field_4, LINK_GROUP_UNION_ROOM_RESUME);
+ InitUnionRoomPlayerObjects(uroom->objects);
+ SetTilesAroundUnionRoomPlayersPassable();
+ uroom->state = UR_STATE_INIT_OBJECTS;
+ break;
+ case UR_STATE_INIT_OBJECTS:
+ CreateGroupMemberSpritesInvisible(uroom->spriteIds, taskData[0]);
if (++taskData[0] == 8)
- data->state = 2;
+ uroom->state = UR_STATE_INIT_LINK;
break;
- case 2:
- sub_8010F84(0x40, 0, 0);
- sub_8010FCC(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel);
- sub_800B488();
+ case UR_STATE_INIT_LINK:
+ SetHostRFUtgtGname(IN_UNION_ROOM, 0, 0);
+ SetTradeBoardRegisteredMonInfo(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel);
+ SetWirelessCommType1();
OpenLink();
- sub_8011C84();
- sub_8017580(&data->field_8->arr[0], 1);
- sub_80175EC(data->field_4, 4);
- sub_80175EC(data->field_C, 4);
+ InitializeRfuLinkManager_EnterUnionRoom();
+ ClearUnkStruct_x20Array(&uroom->field_8->arr[0], 1);
+ ClearUnkStruct_x1CArray(uroom->field_4, 4);
+ ClearUnkStruct_x1CArray(uroom->field_C, 4);
gSpecialVar_Result = 0;
- data->state = 3;
+ uroom->state = UR_STATE_CHECK_SELECTING_MON;
break;
- case 3:
+ case UR_STATE_CHECK_SELECTING_MON:
if ((GetPartyMenuType() == PARTY_MENU_TYPE_UNION_ROOM_REGISTER
- || GetPartyMenuType() == PARTY_MENU_TYPE_UNION_ROOM_TRADE)
- && sUnionRoomTrade.field_0 != 0)
+ || GetPartyMenuType() == PARTY_MENU_TYPE_UNION_ROOM_TRADE)
+ && sUnionRoomTrade.state != URTRADE_STATE_NONE)
{
id = GetCursorSelectionMonId();
- switch (sUnionRoomTrade.field_0)
+ switch (sUnionRoomTrade.state)
{
- case 1:
- sub_8011090(0x54, 0, 1);
+ case URTRADE_STATE_REGISTERING:
+ UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);
if (id >= PARTY_SIZE)
{
ResetUnionRoomTrade(&sUnionRoomTrade);
- sub_8010FCC(0, 0, 0);
- sub_801568C(sText_RegistrationCanceled);
+ SetTradeBoardRegisteredMonInfo(TYPE_NORMAL, SPECIES_NONE, 0);
+ ScheduleFieldMessageAndExit(sText_RegistrationCanceled);
}
else if (!RegisterTradeMonAndGetIsEgg(GetCursorSelectionMonId(), &sUnionRoomTrade))
{
- sub_8015664(0x34, sText_ChooseRequestedMonType);
+ ScheduleFieldMessageWithFollowupState(UR_STATE_REGISTER_REQUEST_TYPE, sText_ChooseRequestedMonType);
}
else
{
- data->state = 55;
+ uroom->state = UR_STATE_REGISTER_COMPLETE;
}
break;
- case 2:
- sub_80156C8(data);
- taskData[1] = sUnionRoomTrade.field_8;
+ case URTRADE_STATE_OFFERING:
+ sub_80156C8(uroom);
+ taskData[1] = sUnionRoomTrade.offerPlayerId;
if (id >= PARTY_SIZE)
{
- sub_801568C(sText_TradeCanceled);
+ ScheduleFieldMessageAndExit(sText_TradeCanceled);
}
else
{
- sub_8011090(0x54, 0, 1);
- gUnknown_02022C2C = 0x44;
+ UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);
+ gPlayerCurrActivity = ACTIVITY_TRADE | IN_UNION_ROOM;
RegisterTradeMon(GetCursorSelectionMonId(), &sUnionRoomTrade);
- data->state = 51;
+ uroom->state = UR_STATE_TRADE_OFFER_MON;
}
break;
}
- sUnionRoomTrade.field_0 = 0;
+ sUnionRoomTrade.state = URTRADE_STATE_NONE;
}
else
{
- data->state = 4;
+ uroom->state = UR_STATE_MAIN;
}
break;
- case 4:
+ case UR_STATE_MAIN:
if (gSpecialVar_Result != 0)
{
- if (gSpecialVar_Result == 9)
+ if (gSpecialVar_Result == UR_INTERACT_ATTENDANT)
{
- sub_8011090(0x54, 0, 1);
+ UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);
PlaySE(SE_PC_LOGIN);
StringCopy(gStringVar1, gSaveBlock2Ptr->playerName);
- data->state = 42;
+ uroom->state = UR_STATE_INTERACT_WITH_ATTENDANT;
gSpecialVar_Result = 0;
}
- else if (gSpecialVar_Result == 11)
+ else if (gSpecialVar_Result == UR_INTERACT_START_MENU)
{
- sub_8011090(0x54, 0, 1);
- data->state = 23;
+ UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);
+ uroom->state = UR_STATE_WAIT_FOR_START_MENU;
gSpecialVar_Result = 0;
}
- else
+ else // UR_INTERACT_PLAYER_# (1-8)
{
taskData[0] = 0;
taskData[1] = gSpecialVar_Result - 1;
- data->state = 24;
+ uroom->state = UR_STATE_INTERACT_WITH_PLAYER;
gSpecialVar_Result = 0;
}
}
@@ -2382,676 +2549,688 @@ void sub_80156E0(u8 taskId)
{
if (gMain.newKeys & A_BUTTON)
{
- if (sub_801A2A8(data->field_0, &taskData[0], &taskData[1], data->spriteIds))
+ if (TryInteractWithUnionRoomMember(uroom->field_0, &taskData[0], &taskData[1], uroom->spriteIds))
{
PlaySE(SE_SELECT);
- sub_80181CC();
- data->state = 24;
+ UR_EnableScriptContext2AndFreezeObjectEvents();
+ uroom->state = UR_STATE_INTERACT_WITH_PLAYER;
break;
}
- else if (sub_8017940())
+ else if (IsPlayerFacingTradingBoard())
{
- sub_8011090(0x54, 0, 1);
+ UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);
PlaySE(SE_PC_LOGIN);
- sub_80181CC();
+ UR_EnableScriptContext2AndFreezeObjectEvents();
StringCopy(gStringVar1, gSaveBlock2Ptr->playerName);
- data->state = 45;
+ uroom->state = UR_STATE_CHECK_TRADING_BOARD;
break;
}
}
- switch (sub_8016B00())
+ switch (HandlePlayerListUpdate())
{
case 1:
PlaySE(SE_PC_LOGIN);
case 2:
- sub_801A274(data);
+ ScheduleUnionRoomPlayerRefresh(uroom);
break;
case 4:
- data->state = 11;
- sub_80181CC();
- sub_8010FCC(0, 0, 0);
- sub_8011090(0x53, sub_80181DC(data), 0);
+ uroom->state = UR_STATE_PLAYER_CONTACTED_YOU;
+ UR_EnableScriptContext2AndFreezeObjectEvents();
+ SetTradeBoardRegisteredMonInfo(TYPE_NORMAL, SPECIES_NONE, 0);
+ UpdateGameData_SetActivity(ACTIVITY_NPCTALK | IN_UNION_ROOM, GetActivePartnerSpriteGenderParam(uroom), FALSE);
break;
}
- sub_801A284(data);
+ HandleUnionRoomPlayerRefresh(uroom);
}
break;
- case 23:
+ case UR_STATE_WAIT_FOR_START_MENU:
if (!FuncIsActiveTask(Task_ShowStartMenu))
{
- sub_8011090(0x40, 0, 0);
- data->state = 4;
+ UpdateGameData_SetActivity(ACTIVITY_NONE | IN_UNION_ROOM, 0, FALSE);
+ uroom->state = UR_STATE_MAIN;
}
break;
- case 24:
- sub_801704C();
- playerGender = sub_8017CF8(taskData[1], data->field_0);
- sub_8011090(0x54, 0, 1);
- switch (sub_80179D4(data->field_0, taskData[0], taskData[1], playerGender))
+ case UR_STATE_INTERACT_WITH_PLAYER:
+ UR_RunTextPrinters_CheckPrinter0Active();
+ playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->field_0);
+ UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);
+ switch (UnionRoomGetPlayerInteractionResponse(uroom->field_0, taskData[0], taskData[1], playerGender))
{
- case 0:
- data->state = 26;
+ case 0: // Player is or was just doing an activity
+ uroom->state = UR_STATE_PRINT_AND_EXIT;
break;
- case 1:
- sub_8012188(data->field_0->arr[taskData[1]].unk.playerName, &data->field_0->arr[taskData[1]].unk.field_0, gUnknown_02022C2C);
- data->field_12 = id; // Should be just 0, but won't match any other way.
- data->state = 25;
+ case 1: // Link communicating
+ sub_8012188(uroom->field_0->arr[taskData[1]].gname_uname.playerName, &uroom->field_0->arr[taskData[1]].gname_uname.gname, gPlayerCurrActivity);
+ uroom->field_12 = id; // Should be just 0, but won't match any other way.
+ uroom->state = UR_STATE_TRY_COMMUNICATING;
break;
- case 2:
- sub_8015664(0x13, gStringVar4);
+ case 2: // Ask to join chat
+ ScheduleFieldMessageWithFollowupState(UR_STATE_RECV_JOIN_CHAT_REQUEST, gStringVar4);
break;
}
break;
- case 25:
- sub_801704C();
- switch (sub_8011A74())
+ case UR_STATE_TRY_COMMUNICATING:
+ UR_RunTextPrinters_CheckPrinter0Active();
+ switch (RfuGetStatus())
{
- case 4:
- sub_801818C(TRUE);
- data->state = 4;
+ case RFU_STATUS_NEW_CHILD_DETECTED:
+ HandleCancelActivity(TRUE);
+ uroom->state = UR_STATE_MAIN;
break;
- case 1:
- case 2:
- if (sub_8011B90() == TRUE)
- sub_801568C(sText_TrainerAppearsBusy);
+ case RFU_STATUS_FATAL_ERROR:
+ case RFU_STATUS_CONNECTION_ERROR:
+ if (IsUnionRoomListenTaskActive() == TRUE)
+ ScheduleFieldMessageAndExit(sText_TrainerAppearsBusy);
else
- sub_8015664(30, sText_TrainerAppearsBusy);
+ ScheduleFieldMessageWithFollowupState(UR_STATE_CANCEL_ACTIVITY_LINK_ERROR, sText_TrainerAppearsBusy);
- gUnknown_02022C2C = 0x40;
+ gPlayerCurrActivity = IN_UNION_ROOM;
break;
}
- if (gReceivedRemoteLinkPlayers != 0)
+ if (gReceivedRemoteLinkPlayers)
{
- sub_80143E4(gBlockSendBuffer, TRUE);
- CreateTask(sub_80140E0, 5);
- data->state = 38;
+ CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE);
+ CreateTask(Task_ExchangeCards, 5);
+ uroom->state = UR_STATE_COMMUNICATING_WAIT_FOR_DATA;
}
break;
- case 38:
- if (!FuncIsActiveTask(sub_80140E0))
+ case UR_STATE_COMMUNICATING_WAIT_FOR_DATA:
+ if (!FuncIsActiveTask(Task_ExchangeCards))
{
- if (gUnknown_02022C2C == 0x44)
- sub_8015664(31, sText_AwaitingPlayersResponseAboutTrade);
+ if (gPlayerCurrActivity == (ACTIVITY_TRADE | IN_UNION_ROOM))
+ ScheduleFieldMessageWithFollowupState(UR_STATE_SEND_TRADE_REQUST, sText_AwaitingPlayersResponseAboutTrade);
else
- data->state = 5;
+ uroom->state = UR_STATE_DO_SOMETHING_PROMPT;
}
break;
- case 30:
- if (gReceivedRemoteLinkPlayers == 0)
+ case UR_STATE_CANCEL_ACTIVITY_LINK_ERROR:
+ if (!gReceivedRemoteLinkPlayers)
{
- sub_801818C(FALSE);
- sub_801A3D0(taskData[0], taskData[1], data->field_0);
- data->state = 2;
+ HandleCancelActivity(FALSE);
+ UpdateUnionRoomMemberFacing(taskData[0], taskData[1], uroom->field_0);
+ uroom->state = UR_STATE_INIT_LINK;
}
break;
- case 5:
- id = sub_80179AC(&data->field_0->arr[taskData[1]]);
- playerGender = sub_8017CF8(taskData[1], data->field_0);
- sub_8015664(6, sHiDoSomethingTexts[id][playerGender]);
+ case UR_STATE_DO_SOMETHING_PROMPT:
+ id = ConvPartnerUnameAndGetWhetherMetAlready(&uroom->field_0->arr[taskData[1]]);
+ playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->field_0);
+ ScheduleFieldMessageWithFollowupState(UR_STATE_HANDLE_DO_SOMETHING_PROMPT_INPUT, sHiDoSomethingTexts[id][playerGender]);
break;
- case 6:
- var5 = sub_8017178(&data->textState, &data->field_1B, &data->field_1C, &gUnknown_082F021C, &gUnknown_082F0244);
- if (var5 != -1)
+ case UR_STATE_HANDLE_DO_SOMETHING_PROMPT_INPUT:
+ input = ListMenuHandler_AllItemsAvailable(&uroom->textState,
+ &uroom->topListMenuWindowId,
+ &uroom->topListMenuId,
+ &sWindowTemplate_InviteToActivity,
+ &sListMenuTemplate_InviteToActivity);
+ if (input != -1)
{
- if (gReceivedRemoteLinkPlayers == 0)
+ if (!gReceivedRemoteLinkPlayers)
{
- data->state = 28;
+ uroom->state = UR_STATE_TRAINER_APPEARS_BUSY;
}
else
{
- data->field_98 = 0;
- playerGender = sub_8017CF8(taskData[1], data->field_0);
- if (var5 == -2 || var5 == 0x40)
+ uroom->partnerYesNoResponse = 0;
+ playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->field_0);
+ if (input == -2 || input == IN_UNION_ROOM)
{
- data->field_4C[0] = 0x40;
- sub_800FE50(data->field_4C);
+ uroom->playerSendBuffer[0] = IN_UNION_ROOM;
+ sub_800FE50(uroom->playerSendBuffer);
StringCopy(gStringVar4, sIfYouWantToDoSomethingTexts[gLinkPlayers[0].gender]);
- data->state = 32;
+ uroom->state = UR_STATE_REQUEST_DECLINED;
}
else
{
- gUnknown_02022C2C = var5;
- gUnknown_02022C2D = (u32)(var5) >> 8;
- if (gUnknown_02022C2C == 0x41 && !HasAtLeastTwoMonsOfLevel30OrLower())
+ gPlayerCurrActivity = input;
+ sPlayerActivityGroupSize = (u32)(input) >> 8;
+ if (gPlayerCurrActivity == (ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM) && !HasAtLeastTwoMonsOfLevel30OrLower())
{
- sub_8015664(5, sText_NeedTwoMonsOfLevel30OrLower1);
+ ScheduleFieldMessageWithFollowupState(UR_STATE_DO_SOMETHING_PROMPT, sText_NeedTwoMonsOfLevel30OrLower1);
}
else
{
- data->field_4C[0] = gUnknown_02022C2C | 0x40;
- sub_800FE50(data->field_4C);
- data->state = 27;
+ uroom->playerSendBuffer[0] = gPlayerCurrActivity | IN_UNION_ROOM;
+ sub_800FE50(uroom->playerSendBuffer);
+ uroom->state = UR_STATE_SEND_ACTIVITY_REQUEST;
}
}
}
}
break;
- case 28:
+ case UR_STATE_TRAINER_APPEARS_BUSY:
StringCopy(gStringVar4, sText_TrainerBattleBusy);
- data->state = 36;
+ uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG;
break;
- case 27:
- sub_8017FD8(data);
- playerGender = sub_8017CF8(taskData[1], data->field_0);
- id = sub_8017984(data->field_4C[0] & 0x3F);
- if (PrintOnTextbox(&data->textState, sText_WaitOrShowCardTexts[playerGender][id]))
+ case UR_STATE_SEND_ACTIVITY_REQUEST:
+ PollPartnerYesNoResponse(uroom);
+ playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->field_0);
+ id = GetResponseIdx_InviteToURoomActivity(uroom->playerSendBuffer[0] & 0x3F);
+ if (PrintOnTextbox(&uroom->textState, sText_WaitOrShowCardTexts[playerGender][id]))
{
taskData[3] = 0;
- data->state = 29;
+ uroom->state = UR_STATE_WAIT_FOR_RESPONSE_TO_REQUEST;
}
break;
- case 32:
+ case UR_STATE_REQUEST_DECLINED:
sub_800AC34();
- data->state = 36;
+ uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG;
break;
- case 31:
- data->field_4C[0] = 0x44;
- data->field_4C[1] = sUnionRoomTrade.species;
- data->field_4C[2] = sUnionRoomTrade.level;
- sub_800FE50(data->field_4C);
- data->state = 29;
+ case UR_STATE_SEND_TRADE_REQUST:
+ uroom->playerSendBuffer[0] = ACTIVITY_TRADE | IN_UNION_ROOM;
+ uroom->playerSendBuffer[1] = sUnionRoomTrade.species;
+ uroom->playerSendBuffer[2] = sUnionRoomTrade.level;
+ sub_800FE50(uroom->playerSendBuffer);
+ uroom->state = UR_STATE_WAIT_FOR_RESPONSE_TO_REQUEST;
break;
- case 29:
- if (gReceivedRemoteLinkPlayers == 0)
+ case UR_STATE_WAIT_FOR_RESPONSE_TO_REQUEST:
+ if (!gReceivedRemoteLinkPlayers)
{
- StringCopy(gStringVar4, sText_TrainerBattleBusy);
- data->state = 28;
+ StringCopy(gStringVar4, sText_TrainerBattleBusy); // Redundant, will be copied again in next state
+ uroom->state = UR_STATE_TRAINER_APPEARS_BUSY;
}
else
{
- sub_8017FD8(data);
- if (data->field_98 == 0x51)
+ PollPartnerYesNoResponse(uroom);
+ if (uroom->partnerYesNoResponse == (ACTIVITY_ACCEPT | IN_UNION_ROOM))
{
- if (gUnknown_02022C2C == 8)
+ if (gPlayerCurrActivity == ACTIVITY_CARD)
{
- sub_8018220(gStringVar4, data, FALSE);
- data->state = 40;
+ ViewURoomPartnerTrainerCard(gStringVar4, uroom, FALSE);
+ uroom->state = UR_STATE_PRINT_CARD_INFO;
}
else
{
- data->state = 13;
+ uroom->state = UR_STATE_PRINT_START_ACTIVITY_MSG;
}
}
- else if (data->field_98 == 0x52)
+ else if (uroom->partnerYesNoResponse == (ACTIVITY_DECLINE | IN_UNION_ROOM))
{
- data->state = 32;
- sub_8017D9C(gStringVar4, gUnknown_02022C2C | 0x40, gLinkPlayers[0].gender);
- gUnknown_02022C2C = 0;
+ uroom->state = UR_STATE_REQUEST_DECLINED;
+ GetURoomActivityRejectMsg(gStringVar4, gPlayerCurrActivity | IN_UNION_ROOM, gLinkPlayers[0].gender);
+ gPlayerCurrActivity = ACTIVITY_NONE;
}
}
break;
- case 7:
- id = sub_80179AC(&data->field_0->arr[taskData[1]]);
- playerGender = sub_8017CF8(taskData[1], data->field_0);
- sub_8015664(6, sHiDoSomethingTexts[id][playerGender]);
+ case UR_STATE_DO_SOMETHING_PROMPT_2: // Identical to UR_STATE_DO_SOMETHING_PROMPT
+ id = ConvPartnerUnameAndGetWhetherMetAlready(&uroom->field_0->arr[taskData[1]]);
+ playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->field_0);
+ ScheduleFieldMessageWithFollowupState(UR_STATE_HANDLE_DO_SOMETHING_PROMPT_INPUT, sHiDoSomethingTexts[id][playerGender]);
break;
- case 40:
- if (PrintOnTextbox(&data->textState, gStringVar4))
+ case UR_STATE_PRINT_CARD_INFO:
+ if (PrintOnTextbox(&uroom->textState, gStringVar4))
{
- data->state = 41;
+ uroom->state = UR_STATE_WAIT_FINISH_READING_CARD;
sub_800ADF8();
- data->field_98 = 0;
- data->field_9A[0] = 0;
+ uroom->partnerYesNoResponse = 0;
+ uroom->recvActivityRequest[0] = 0;
}
break;
- case 41:
+ case UR_STATE_WAIT_FINISH_READING_CARD:
if (IsLinkTaskFinished())
{
if (GetMultiplayerId() == 0)
{
StringCopy(gStringVar1, gLinkPlayers[GetMultiplayerId() ^ 1].name);
- id = sub_800E540(gLinkPlayers[1].trainerId, gLinkPlayers[1].name);
+ id = PlayerHasMetTrainerBefore(gLinkPlayers[1].trainerId, gLinkPlayers[1].name);
StringExpandPlaceholders(gStringVar4, sAwaitingResponseTexts[id]);
- data->state = 33;
+ uroom->state = UR_STATE_PRINT_CONTACT_MSG;
}
else
{
- data->state = 7;
+ uroom->state = UR_STATE_DO_SOMETHING_PROMPT_2;
}
}
break;
- case 19:
- switch (sub_80170B8(&data->textState, FALSE))
+ case UR_STATE_RECV_JOIN_CHAT_REQUEST:
+ switch (UnionRoomHandleYesNo(&uroom->textState, FALSE))
{
- case 0:
+ case 0: // YES
CopyBgTilemapBufferToVram(0);
- gUnknown_02022C2C = 0x45;
- sub_8011090(0x45, 0, 1);
- sub_8012188(data->field_0->arr[taskData[1]].unk.playerName, &data->field_0->arr[taskData[1]].unk.field_0, gUnknown_02022C2C);
- data->field_12 = taskData[1];
- data->state = 20;
+ gPlayerCurrActivity = ACTIVITY_CHAT | IN_UNION_ROOM;
+ UpdateGameData_SetActivity(ACTIVITY_CHAT | IN_UNION_ROOM, 0, TRUE);
+ sub_8012188(uroom->field_0->arr[taskData[1]].gname_uname.playerName, &uroom->field_0->arr[taskData[1]].gname_uname.gname, gPlayerCurrActivity);
+ uroom->field_12 = taskData[1];
+ uroom->state = UR_STATE_TRY_ACCEPT_CHAT_REQUEST_DELAY;
taskData[3] = 0;
break;
- case 1:
+ case 1: // NO
case -1:
- playerGender = sub_8017CF8(taskData[1], data->field_0);
- sub_801568C(sDeclineBattleTexts[playerGender]);
+ playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->field_0);
+ ScheduleFieldMessageAndExit(sDeclineChatTexts[playerGender]);
break;
}
break;
- case 20:
+ case UR_STATE_TRY_ACCEPT_CHAT_REQUEST_DELAY:
if (++taskData[2] > 60)
{
- data->state = 21;
+ uroom->state = UR_STATE_TRY_ACCEPT_CHAT_REQUEST;
taskData[2] = 0;
}
break;
- case 21:
- switch (sub_8011A74())
+ case UR_STATE_TRY_ACCEPT_CHAT_REQUEST:
+ switch (RfuGetStatus())
{
- case 4:
- sub_801818C(TRUE);
- data->state = 4;
+ case RFU_STATUS_NEW_CHILD_DETECTED:
+ HandleCancelActivity(TRUE);
+ uroom->state = UR_STATE_MAIN;
break;
- case 1:
- case 2:
- playerGender = sub_8017CF8(taskData[1], data->field_0);
- sub_8011090(0x54, 0, 1);
- if (sub_8011B90() == TRUE)
- sub_801568C(sChatDeclinedTexts[playerGender]);
+ case RFU_STATUS_FATAL_ERROR:
+ case RFU_STATUS_CONNECTION_ERROR:
+ playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->field_0);
+ UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);
+ if (IsUnionRoomListenTaskActive() == TRUE)
+ ScheduleFieldMessageAndExit(sChatDeclinedTexts[playerGender]);
else
- sub_8015664(30, sChatDeclinedTexts[playerGender]);
+ ScheduleFieldMessageWithFollowupState(UR_STATE_CANCEL_ACTIVITY_LINK_ERROR, sChatDeclinedTexts[playerGender]);
break;
- case 3:
- data->state = 22;
+ case RFU_STATUS_CHILD_SEND_COMPLETE:
+ uroom->state = UR_STATE_ACCEPT_CHAT_REQUEST;
break;
}
taskData[3]++;
break;
- case 22:
- if (sub_8011A80())
+ case UR_STATE_ACCEPT_CHAT_REQUEST:
+ if (RfuHasErrored())
{
- playerGender = sub_8017CF8(taskData[1], data->field_0);
- sub_8011090(0x54, 0, 1);
- if (sub_8011B90() == TRUE)
- sub_801568C(sChatDeclinedTexts[playerGender]);
+ playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->field_0);
+ UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE);
+ if (IsUnionRoomListenTaskActive() == TRUE)
+ ScheduleFieldMessageAndExit(sChatDeclinedTexts[playerGender]);
else
- sub_8015664(30, sChatDeclinedTexts[playerGender]);
+ ScheduleFieldMessageWithFollowupState(UR_STATE_CANCEL_ACTIVITY_LINK_ERROR, sChatDeclinedTexts[playerGender]);
}
- if (gReceivedRemoteLinkPlayers != 0)
- data->state = 16;
+ if (gReceivedRemoteLinkPlayers)
+ uroom->state = UR_STATE_START_ACTIVITY_FREE_UROOM;
break;
- case 11:
+ case UR_STATE_PLAYER_CONTACTED_YOU:
PlaySE(SE_PINPON);
sub_800EF7C();
- data->state = 12;
- data->field_9A[0] = 0;
+ uroom->state = UR_STATE_RECV_CONTACT_DATA;
+ uroom->recvActivityRequest[0] = 0;
break;
- case 12:
- if (sub_8011A80())
+ case UR_STATE_RECV_CONTACT_DATA:
+ if (RfuHasErrored())
{
- sub_801818C(FALSE);
- data->state = 2;
+ HandleCancelActivity(FALSE);
+ uroom->state = UR_STATE_INIT_LINK;
}
- else if (gReceivedRemoteLinkPlayers != 0)
+ else if (gReceivedRemoteLinkPlayers)
{
- sub_80143E4(gBlockSendBuffer, TRUE);
- CreateTask(sub_80140E0, 5);
- data->state = 39;
+ CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE);
+ CreateTask(Task_ExchangeCards, 5);
+ uroom->state = UR_STATE_WAIT_FOR_CONTACT_DATA;
}
break;
- case 39:
- sub_801689C(data);
- if (!FuncIsActiveTask(sub_80140E0))
+ case UR_STATE_WAIT_FOR_CONTACT_DATA:
+ ReceiveUnionRoomActivityPacket(uroom);
+ if (!FuncIsActiveTask(Task_ExchangeCards))
{
- data->state = 33;
+ uroom->state = UR_STATE_PRINT_CONTACT_MSG;
StringCopy(gStringVar1, gLinkPlayers[1].name);
- id = sub_800E540(gLinkPlayers[1].trainerId, gLinkPlayers[1].name);
+ id = PlayerHasMetTrainerBefore(gLinkPlayers[1].trainerId, gLinkPlayers[1].name);
StringExpandPlaceholders(gStringVar4, sPlayerContactedYouTexts[id]);
}
break;
- case 33:
- sub_801689C(data);
- if (PrintOnTextbox(&data->textState, gStringVar4))
- data->state = 34;
+ case UR_STATE_PRINT_CONTACT_MSG:
+ ReceiveUnionRoomActivityPacket(uroom);
+ if (PrintOnTextbox(&uroom->textState, gStringVar4))
+ uroom->state = UR_STATE_HANDLE_CONTACT_DATA;
break;
- case 34:
- sub_801689C(data);
- if (sub_80168DC(data) && gMain.newKeys & B_BUTTON)
+ case UR_STATE_HANDLE_CONTACT_DATA:
+ ReceiveUnionRoomActivityPacket(uroom);
+ if (UnionRoom_HandleContactFromOtherPlayer(uroom) && gMain.newKeys & B_BUTTON)
{
sub_8011DE0(1);
StringCopy(gStringVar4, sText_ChatEnded);
- data->state = 36;
+ uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG;
}
break;
- case 35:
- sub_8015664(9, gStringVar4);
+ case UR_STATE_RECV_ACTIVITY_REQUEST:
+ ScheduleFieldMessageWithFollowupState(UR_STATE_HANDLE_ACTIVITY_REQUEST, gStringVar4);
break;
- case 9:
- switch (sub_80170B8(&data->textState, FALSE))
+ case UR_STATE_HANDLE_ACTIVITY_REQUEST:
+ switch (UnionRoomHandleYesNo(&uroom->textState, FALSE))
{
- case 0:
- data->field_4C[0] = 0x51;
- if (gUnknown_02022C2C == 0x45)
- sub_8011090(gUnknown_02022C2C | 0x40, sub_801100C(1), 0);
+ case 0: // ACCEPT
+ uroom->playerSendBuffer[0] = ACTIVITY_ACCEPT | IN_UNION_ROOM;
+ if (gPlayerCurrActivity == (ACTIVITY_CHAT | IN_UNION_ROOM))
+ UpdateGameData_SetActivity(gPlayerCurrActivity | IN_UNION_ROOM, sub_801100C(1), FALSE);
else
- sub_8011090(gUnknown_02022C2C | 0x40, sub_801100C(1), 1);
+ UpdateGameData_SetActivity(gPlayerCurrActivity | IN_UNION_ROOM, sub_801100C(1), TRUE);
- data->field_8->arr[0].field_1B = 0;
+ uroom->field_8->arr[0].field_1B = 0;
taskData[3] = 0;
- if (gUnknown_02022C2C == 0x41)
+ if (gPlayerCurrActivity == (ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM))
{
if (!HasAtLeastTwoMonsOfLevel30OrLower())
{
- data->field_4C[0] = 0x52;
- sub_800FE50(data->field_4C);
- data->state = 10;
+ uroom->playerSendBuffer[0] = ACTIVITY_DECLINE | IN_UNION_ROOM;
+ sub_800FE50(uroom->playerSendBuffer);
+ uroom->state = UR_STATE_DECLINE_ACTIVITY_REQUEST;
StringCopy(gStringVar4, sText_NeedTwoMonsOfLevel30OrLower2);
}
else
{
- sub_800FE50(data->field_4C);
- data->state = 13;
+ sub_800FE50(uroom->playerSendBuffer);
+ uroom->state = UR_STATE_PRINT_START_ACTIVITY_MSG;
}
}
- else if (gUnknown_02022C2C == 0x48)
+ else if (gPlayerCurrActivity == (ACTIVITY_CARD | IN_UNION_ROOM))
{
- sub_800FE50(data->field_4C);
- sub_8018220(gStringVar4, data, 1);
- data->state = 40;
+ sub_800FE50(uroom->playerSendBuffer);
+ ViewURoomPartnerTrainerCard(gStringVar4, uroom, TRUE);
+ uroom->state = UR_STATE_PRINT_CARD_INFO;
}
else
{
- sub_800FE50(data->field_4C);
- data->state = 13;
+ sub_800FE50(uroom->playerSendBuffer);
+ uroom->state = UR_STATE_PRINT_START_ACTIVITY_MSG;
}
break;
- case 1:
+ case 1: // DECLINE
case -1:
- data->field_4C[0] = 0x52;
- sub_800FE50(data->field_4C);
- data->state = 10;
- sub_8013078(gStringVar4, gUnknown_02022C2C);
+ uroom->playerSendBuffer[0] = ACTIVITY_DECLINE | IN_UNION_ROOM;
+ sub_800FE50(uroom->playerSendBuffer);
+ uroom->state = UR_STATE_DECLINE_ACTIVITY_REQUEST;
+ GetYouDeclinedTheOfferMessage(gStringVar4, gPlayerCurrActivity);
break;
}
break;
- case 10:
+ case UR_STATE_DECLINE_ACTIVITY_REQUEST:
sub_800AC34();
- data->state = 36;
+ uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG;
break;
- case 36:
- if (gReceivedRemoteLinkPlayers == 0)
+ case UR_STATE_CANCEL_REQUEST_PRINT_MSG:
+ if (!gReceivedRemoteLinkPlayers)
{
- gUnknown_02022C2C = 0x40;
- sub_8015664(0x25, gStringVar4);
- memset(data->field_4C, 0, sizeof(data->field_4C));
- data->field_9A[0] = 0;
- data->field_98 = 0;
+ gPlayerCurrActivity = IN_UNION_ROOM;
+ ScheduleFieldMessageWithFollowupState(UR_STATE_CANCEL_REQUEST_RESTART_LINK, gStringVar4);
+ memset(uroom->playerSendBuffer, 0, sizeof(uroom->playerSendBuffer));
+ uroom->recvActivityRequest[0] = 0;
+ uroom->partnerYesNoResponse = 0;
}
break;
- case 37:
- data->state = 2;
- sub_801818C(FALSE);
+ case UR_STATE_CANCEL_REQUEST_RESTART_LINK:
+ uroom->state = UR_STATE_INIT_LINK;
+ HandleCancelActivity(FALSE);
break;
- case 13:
- sub_8017E00(gStringVar4, gUnknown_02022C2C | 0x40);
- sub_8015664(14, gStringVar4);
+ case UR_STATE_PRINT_START_ACTIVITY_MSG:
+ GetURoomActivityStartMsg(gStringVar4, gPlayerCurrActivity | IN_UNION_ROOM);
+ ScheduleFieldMessageWithFollowupState(UR_STATE_START_ACTIVITY_LINK, gStringVar4);
break;
- case 14:
+ case UR_STATE_START_ACTIVITY_LINK:
sub_800ADF8();
- data->state = 15;
+ uroom->state = UR_STATE_START_ACTIVITY_WAIT_FOR_LINK;
break;
- case 15:
+ case UR_STATE_START_ACTIVITY_WAIT_FOR_LINK:
if (IsLinkTaskFinished())
- data->state = 16;
- break;
- case 16:
- Free(data->field_8);
- Free(data->field_0);
- Free(data->field_C);
- Free(data->field_4);
- DestroyTask(data->field_20);
- sub_8019F04(data->spriteIds);
- data->state = 17;
- break;
- case 17:
+ uroom->state = UR_STATE_START_ACTIVITY_FREE_UROOM;
+ break;
+ case UR_STATE_START_ACTIVITY_FREE_UROOM:
+ Free(uroom->field_8);
+ Free(uroom->field_0);
+ Free(uroom->field_C);
+ Free(uroom->field_4);
+ DestroyTask(uroom->searchTaskId);
+ DestroyGroupMemberSprites(uroom->spriteIds);
+ uroom->state = UR_STATE_START_ACTIVITY_FADE;
+ break;
+ case UR_STATE_START_ACTIVITY_FADE:
BeginNormalPaletteFade(-1, 0, 0, 0x10, RGB_BLACK);
- data->state = 18;
+ uroom->state = UR_STATE_START_ACTIVITY;
break;
- case 18:
+ case UR_STATE_START_ACTIVITY:
if (!UpdatePaletteFade())
{
- sub_8019E3C();
+ DestroyUnionRoomPlayerObjects();
DestroyTask(taskId);
- Free(gUnknown_02022C30.uRoom);
- sub_80149D8();
+ Free(sWirelessLinkMain.uRoom);
+ CreateTask_StartActivity();
}
break;
- case 42:
- if (sub_800F7DC()->species == SPECIES_NONE)
+ case UR_STATE_INTERACT_WITH_ATTENDANT:
+ if (GetHostRFUtgtGname()->species == SPECIES_NONE)
{
- data->state = 43;
+ uroom->state = UR_STATE_REGISTER_PROMPT;
}
else
{
- if (sub_800F7DC()->species == SPECIES_EGG)
+ if (GetHostRFUtgtGname()->species == SPECIES_EGG)
{
StringCopy(gStringVar4, sText_CancelRegistrationOfEgg);
}
else
{
- StringCopy(gStringVar1, gSpeciesNames[sub_800F7DC()->species]);
- ConvertIntToDecimalStringN(gStringVar2, sub_800F7DC()->level, STR_CONV_MODE_LEFT_ALIGN, 3);
+ StringCopy(gStringVar1, gSpeciesNames[GetHostRFUtgtGname()->species]);
+ ConvertIntToDecimalStringN(gStringVar2, GetHostRFUtgtGname()->level, STR_CONV_MODE_LEFT_ALIGN, 3);
StringExpandPlaceholders(gStringVar4, sText_CancelRegistrationOfMon);
}
- sub_8015664(44, gStringVar4);
+ ScheduleFieldMessageWithFollowupState(UR_STATE_CANCEL_REGISTRATION_PROMPT, gStringVar4);
}
break;
- case 43:
- if (PrintOnTextbox(&data->textState, sText_RegisterMonAtTradingBoard))
- data->state = 47;
+ case UR_STATE_REGISTER_PROMPT:
+ if (PrintOnTextbox(&uroom->textState, sText_RegisterMonAtTradingBoard))
+ uroom->state = UR_STATE_REGISTER_PROMPT_HANDLE_INPUT;
break;
- case 47:
- var5 = sub_8017178(&data->textState, &data->field_1D, &data->field_1E, &gUnknown_082F025C, &gUnknown_082F027C);
- if (var5 != -1)
+ case UR_STATE_REGISTER_PROMPT_HANDLE_INPUT:
+ input = ListMenuHandler_AllItemsAvailable(&uroom->textState,
+ &uroom->tradeBoardSelectWindowId,
+ &uroom->tradeBoardDetailsWindowId,
+ &sWindowTemplate_RegisterForTrade,
+ &sListMenuTemplate_RegisterForTrade);
+ if (input != -1)
{
- if (var5 == -2 || var5 == 3)
+ if (input == -2 || input == 3)
{
- data->state = 4;
- sub_801818C(TRUE);
+ uroom->state = UR_STATE_MAIN;
+ HandleCancelActivity(TRUE);
}
else
{
- switch (var5)
+ switch (input)
{
case 1: // REGISTER
- sub_8015664(53, sText_WhichMonWillYouOffer);
+ ScheduleFieldMessageWithFollowupState(UR_STATE_REGISTER_SELECT_MON_FADE, sText_WhichMonWillYouOffer);
break;
case 2: // INFO
- sub_8015664(47, sText_TradingBoardInfo);
+ ScheduleFieldMessageWithFollowupState(UR_STATE_REGISTER_PROMPT_HANDLE_INPUT, sText_TradingBoardInfo);
break;
}
}
}
break;
- case 53:
+ case UR_STATE_REGISTER_SELECT_MON_FADE:
BeginNormalPaletteFade(-1, 0, 0, 0x10, RGB_BLACK);
- data->state = 54;
+ uroom->state = UR_STATE_REGISTER_SELECT_MON;
break;
- case 54:
+ case UR_STATE_REGISTER_SELECT_MON:
if (!gPaletteFade.active)
{
- sUnionRoomTrade.field_0 = 1;
+ sUnionRoomTrade.state = URTRADE_STATE_REGISTERING;
gFieldCallback = FieldCB_ContinueScriptUnionRoom;
ChooseMonForTradingBoard(PARTY_MENU_TYPE_UNION_ROOM_REGISTER, CB2_ReturnToField);
}
break;
- case 52:
- var5 = sub_8017178(&data->textState, &data->field_1D, &data->field_1E, &gUnknown_082F0294, &sMenuTemplate_TradingBoardRequestType);
- if (var5 != -1)
+ case UR_STATE_REGISTER_REQUEST_TYPE:
+ input = ListMenuHandler_AllItemsAvailable(&uroom->textState,
+ &uroom->tradeBoardSelectWindowId,
+ &uroom->tradeBoardDetailsWindowId,
+ &gUnknown_082F0294,
+ &sMenuTemplate_TradingBoardRequestType);
+ if (input != -1)
{
- switch (var5)
+ switch (input)
{
case -2:
- case 18:
+ case NUMBER_OF_MON_TYPES: // Exit
ResetUnionRoomTrade(&sUnionRoomTrade);
- sub_8010FCC(0, 0, 0);
- sub_801568C(sText_RegistrationCanceled);
+ SetTradeBoardRegisteredMonInfo(TYPE_NORMAL, SPECIES_NONE, 0);
+ ScheduleFieldMessageAndExit(sText_RegistrationCanceled);
break;
default:
- sUnionRoomTrade.type = var5;
- data->state = 55;
+ sUnionRoomTrade.type = input;
+ uroom->state = UR_STATE_REGISTER_COMPLETE;
break;
}
}
break;
- case 55:
- sub_8010FCC(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel);
- sub_801568C(sText_RegistraionCompleted);
+ case UR_STATE_REGISTER_COMPLETE:
+ SetTradeBoardRegisteredMonInfo(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel);
+ ScheduleFieldMessageAndExit(sText_RegistraionCompleted);
break;
- case 44:
- switch (sub_80170B8(&data->textState, FALSE))
+ case UR_STATE_CANCEL_REGISTRATION_PROMPT:
+ switch (UnionRoomHandleYesNo(&uroom->textState, FALSE))
{
- case 0:
- data->state = 56;
+ case 0: // YES
+ uroom->state = UR_STATE_CANCEL_REGISTRATION;
break;
- case 1:
+ case 1: // NO
case -1:
- sub_801818C(TRUE);
- data->state = 4;
+ HandleCancelActivity(TRUE);
+ uroom->state = UR_STATE_MAIN;
break;
}
break;
- case 56:
- if (PrintOnTextbox(&data->textState, sText_RegistrationCanceled2))
+ case UR_STATE_CANCEL_REGISTRATION:
+ if (PrintOnTextbox(&uroom->textState, sText_RegistrationCanceled2))
{
- sub_8010FCC(0, 0, 0);
+ SetTradeBoardRegisteredMonInfo(TYPE_NORMAL, SPECIES_NONE, 0);
ResetUnionRoomTrade(&sUnionRoomTrade);
- sub_801818C(TRUE);
- data->state = 4;
+ HandleCancelActivity(TRUE);
+ uroom->state = UR_STATE_MAIN;
}
break;
- case 45:
- if (PrintOnTextbox(&data->textState, sText_XCheckedTradingBoard))
- data->state = 46;
+ case UR_STATE_CHECK_TRADING_BOARD:
+ if (PrintOnTextbox(&uroom->textState, sText_XCheckedTradingBoard))
+ uroom->state = UR_STATE_TRADING_BOARD_LOAD;
break;
- case 46:
- sub_80173B0();
- data->state = 48;
+ case UR_STATE_TRADING_BOARD_LOAD:
+ UR_ClearBg0();
+ uroom->state = UR_STATE_TRADING_BOARD_HANDLE_INPUT;
break;
- case 48:
- var5 = sub_80172A0(&data->textState, &data->field_1D, &data->field_4A, &data->field_1E, &gUnknown_082F034C, &gUnknown_082F03A4, data->field_0);
- if (var5 != -1)
+ case UR_STATE_TRADING_BOARD_HANDLE_INPUT:
+ input = TradeBoardMenuHandler(&uroom->textState, &uroom->tradeBoardSelectWindowId, &uroom->tradeBoardListMenuId, &uroom->tradeBoardDetailsWindowId, &gUnknown_082F034C, &sTradeBoardListMenuTemplate, uroom->field_0);
+ if (input != -1)
{
- switch (var5)
+ switch (input)
{
case -2:
- case 8:
- sub_801818C(TRUE);
- data->state = 4;
+ case 8: // EXIT
+ HandleCancelActivity(TRUE);
+ uroom->state = UR_STATE_MAIN;
break;
default:
- sub_80173B0();
- switch (sub_8017D04(data->field_0->arr[var5].unk.field_0.type, data->field_0->arr[var5].unk.field_0.species))
+ UR_ClearBg0();
+ switch (IsRequestedTypeOrEggInPlayerParty(uroom->field_0->arr[input].gname_uname.gname.type, uroom->field_0->arr[input].gname_uname.gname.species))
{
- case 0:
- sub_8018404(gStringVar1, &data->field_0->arr[var5]);
- sub_8015664(49, sText_AskTrainerToMakeTrade);
- taskData[1] = var5;
+ case UR_TRADE_MATCH:
+ IntlConvPartnerUname7(gStringVar1, &uroom->field_0->arr[input]);
+ ScheduleFieldMessageWithFollowupState(UR_STATE_TRADE_PROMPT, sText_AskTrainerToMakeTrade);
+ taskData[1] = input;
break;
- case 1:
- sub_8018404(gStringVar1, &data->field_0->arr[var5]);
- StringCopy(gStringVar2, gTypeNames[data->field_0->arr[var5].unk.field_0.type]);
- sub_8015664(46, sText_DontHaveTypeTrainerWants);
+ case UR_TRADE_NOTYPE:
+ IntlConvPartnerUname7(gStringVar1, &uroom->field_0->arr[input]);
+ StringCopy(gStringVar2, gTypeNames[uroom->field_0->arr[input].gname_uname.gname.type]);
+ ScheduleFieldMessageWithFollowupState(UR_STATE_TRADING_BOARD_LOAD, sText_DontHaveTypeTrainerWants);
break;
- case 2:
- sub_8018404(gStringVar1, &data->field_0->arr[var5]);
- StringCopy(gStringVar2, gTypeNames[data->field_0->arr[var5].unk.field_0.type]);
- sub_8015664(46, sText_DontHaveEggTrainerWants);
+ case UR_TRADE_NOEGG:
+ IntlConvPartnerUname7(gStringVar1, &uroom->field_0->arr[input]);
+ StringCopy(gStringVar2, gTypeNames[uroom->field_0->arr[input].gname_uname.gname.type]);
+ ScheduleFieldMessageWithFollowupState(UR_STATE_TRADING_BOARD_LOAD, sText_DontHaveEggTrainerWants);
break;
}
break;
}
}
break;
- case 49:
- switch (sub_80170B8(&data->textState, FALSE))
+ case UR_STATE_TRADE_PROMPT:
+ switch (UnionRoomHandleYesNo(&uroom->textState, FALSE))
{
- case 0:
- data->state = 50;
+ case 0: // YES
+ uroom->state = UR_STATE_TRADE_SELECT_MON;
break;
- case -1:
+ case -1: // NO
case 1:
- sub_801818C(TRUE);
- data->state = 4;
+ HandleCancelActivity(TRUE);
+ uroom->state = UR_STATE_MAIN;
break;
}
break;
- case 50:
- if (PrintOnTextbox(&data->textState, sText_WhichMonWillYouOffer))
+ case UR_STATE_TRADE_SELECT_MON:
+ if (PrintOnTextbox(&uroom->textState, sText_WhichMonWillYouOffer))
{
- sUnionRoomTrade.field_0 = 2;
- memcpy(&gUnknown_02022C38, &data->field_0->arr[taskData[1]].unk.field_0.unk_00, sizeof(gUnknown_02022C38));
- gUnionRoomRequestedMonType = data->field_0->arr[taskData[1]].unk.field_0.type;
- gUnionRoomOfferedSpecies = data->field_0->arr[taskData[1]].unk.field_0.species;
+ sUnionRoomTrade.state = URTRADE_STATE_OFFERING;
+ memcpy(&gPartnerTgtGnameSub, &uroom->field_0->arr[taskData[1]].gname_uname.gname.unk_00, sizeof(gPartnerTgtGnameSub));
+ gUnionRoomRequestedMonType = uroom->field_0->arr[taskData[1]].gname_uname.gname.type;
+ gUnionRoomOfferedSpecies = uroom->field_0->arr[taskData[1]].gname_uname.gname.species;
gFieldCallback = FieldCB_ContinueScriptUnionRoom;
ChooseMonForTradingBoard(PARTY_MENU_TYPE_UNION_ROOM_TRADE, CB2_ReturnToField);
- sub_80156B0(data);
- sUnionRoomTrade.field_8 = taskData[1];
+ sub_80156B0(uroom);
+ sUnionRoomTrade.offerPlayerId = taskData[1];
}
break;
- case 51:
- gUnknown_02022C2C = 0x44;
- sub_8012188(data->field_0->arr[taskData[1]].unk.playerName, &data->field_0->arr[taskData[1]].unk.field_0, 0x44);
- sub_8018404(gStringVar1, &data->field_0->arr[taskData[1]]);
- sub_8017020(sCommunicatingWaitTexts[2]);
- data->state = 25;
+ case UR_STATE_TRADE_OFFER_MON:
+ gPlayerCurrActivity = ACTIVITY_TRADE | IN_UNION_ROOM;
+ sub_8012188(uroom->field_0->arr[taskData[1]].gname_uname.playerName, &uroom->field_0->arr[taskData[1]].gname_uname.gname, gPlayerCurrActivity);
+ IntlConvPartnerUname7(gStringVar1, &uroom->field_0->arr[taskData[1]]);
+ UR_PrintFieldMessage(sCommunicatingWaitTexts[2]);
+ uroom->state = UR_STATE_TRY_COMMUNICATING;
break;
- case 26:
- if (PrintOnTextbox(&data->textState, gStringVar4))
+ case UR_STATE_PRINT_AND_EXIT:
+ if (PrintOnTextbox(&uroom->textState, gStringVar4))
{
- sub_801818C(TRUE);
- sub_801A3D0(taskData[0], taskData[1], data->field_0);
- data->state = 4;
+ HandleCancelActivity(TRUE);
+ UpdateUnionRoomMemberFacing(taskData[0], taskData[1], uroom->field_0);
+ uroom->state = UR_STATE_MAIN;
}
break;
- case 8:
- if (PrintOnTextbox(&data->textState, gStringVar4))
- data->state = data->stateAfterPrint;
+ case UR_STATE_PRINT_MSG:
+ if (PrintOnTextbox(&uroom->textState, gStringVar4))
+ uroom->state = uroom->stateAfterPrint;
break;
}
}
-void var_800D_set_xB(void)
+void SetUsingUnionRoomStartMenu(void)
{
if (InUnionRoom() == TRUE)
- gSpecialVar_Result = 11;
+ gSpecialVar_Result = UR_INTERACT_START_MENU;
}
-void sub_801689C(struct UnkStruct_URoom *arg0)
+static void ReceiveUnionRoomActivityPacket(struct WirelessLink_URoom *data)
{
if (gRecvCmds[1][1] != 0 && (gRecvCmds[1][0] & 0xFF00) == 0x2F00)
{
- arg0->field_9A[0] = gRecvCmds[1][1];
- if (gRecvCmds[1][1] == 0x44)
+ data->recvActivityRequest[0] = gRecvCmds[1][1];
+ if (gRecvCmds[1][1] == (ACTIVITY_TRADE | IN_UNION_ROOM))
{
- arg0->field_9A[1] = gRecvCmds[1][2];
- arg0->field_9A[2] = gRecvCmds[1][3];
+ data->recvActivityRequest[1] = gRecvCmds[1][2];
+ data->recvActivityRequest[2] = gRecvCmds[1][3];
}
}
}
-bool32 sub_80168DC(struct UnkStruct_URoom *arg0)
+static bool32 UnionRoom_HandleContactFromOtherPlayer(struct WirelessLink_URoom *uroom)
{
- if (arg0->field_9A[0] != 0)
+ if (uroom->recvActivityRequest[0] != 0)
{
- s32 var = sub_8017EA0(gStringVar4, gLinkPlayers[1].gender, &arg0->field_9A[0], arg0);
- if (var == 0)
+ s32 id = GetChatLeaderActionRequestMessage(gStringVar4, gLinkPlayers[1].gender, &uroom->recvActivityRequest[0], uroom);
+ if (id == 0) // Error
{
return TRUE;
}
- else if (var == 1)
+ else if (id == 1) // Recieve activity request
{
- arg0->state = 35;
- gUnknown_02022C2C = arg0->field_9A[0];
+ uroom->state = UR_STATE_RECV_ACTIVITY_REQUEST;
+ gPlayerCurrActivity = uroom->recvActivityRequest[0];
return FALSE;
}
- else if (var == 2)
+ else if (id == 2) // No activity
{
- arg0->state = 36;
+ uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG;
sub_800AC34();
return FALSE;
}
@@ -3062,53 +3241,53 @@ bool32 sub_80168DC(struct UnkStruct_URoom *arg0)
void InitUnionRoom(void)
{
- struct UnkStruct_URoom *ptr;
+ struct WirelessLink_URoom *data;
sUnionRoomPlayerName[0] = EOS;
- CreateTask(sub_801697C, 0);
- gUnknown_02022C30.uRoom = gUnknown_02022C30.uRoom; // Needed to match.
- gUnknown_02022C30.uRoom = ptr = AllocZeroed(sizeof(struct UnkStruct_URoom));
- gUnknown_03000DA8 = gUnknown_02022C30.uRoom;
- ptr->state = 0;
- ptr->textState = 0;
- ptr->field_10 = 0;
- ptr->field_12 = 0;
+ CreateTask(Task_InitUnionRoom, 0);
+ sWirelessLinkMain.uRoom = sWirelessLinkMain.uRoom; // Needed to match.
+ sWirelessLinkMain.uRoom = data = AllocZeroed(sizeof(struct WirelessLink_URoom));
+ sURoom = sWirelessLinkMain.uRoom;
+ data->state = 0;
+ data->textState = 0;
+ data->unknown = 0;
+ data->field_12 = 0;
sUnionRoomPlayerName[0] = EOS;
}
-void sub_801697C(u8 taskId)
+static void Task_InitUnionRoom(u8 taskId)
{
s32 i;
u8 text[32];
- struct UnkStruct_URoom *structPtr = gUnknown_02022C30.uRoom;
+ struct WirelessLink_URoom *data = sWirelessLinkMain.uRoom;
- switch (structPtr->state)
+ switch (data->state)
{
case 0:
- structPtr->state = 1;
+ data->state = 1;
break;
case 1:
- sub_8010F84(0xC, 0, 0);
- sub_800B488();
+ SetHostRFUtgtGname(ACTIVITY_SEARCH, 0, 0);
+ SetWirelessCommType1();
OpenLink();
- sub_8011C84();
- sub_80111B0(1);
- structPtr->state = 2;
+ InitializeRfuLinkManager_EnterUnionRoom();
+ sub_80111B0(TRUE);
+ data->state = 2;
break;
case 2:
- structPtr->field_4 = AllocZeroed(0x70);
- sub_80175EC(structPtr->field_4, 4);
- structPtr->field_C = AllocZeroed(0x70);
- sub_80175EC(structPtr->field_C, 4);
- structPtr->field_0 = AllocZeroed(0x100);
- sub_8017580(structPtr->field_0->arr, 8);
- structPtr->field_8 = AllocZeroed(0x20);
- sub_8017580(&structPtr->field_8->arr[0], 1);
- structPtr->field_20 = sub_8016DF0(structPtr->field_C, structPtr->field_4, 10);
- structPtr->state = 3;
+ data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
+ ClearUnkStruct_x1CArray(data->field_4, 4);
+ data->field_C = AllocZeroed(4 * sizeof(struct UnkStruct_x1C));
+ ClearUnkStruct_x1CArray(data->field_C, 4);
+ data->field_0 = AllocZeroed(8 * sizeof(struct UnkStruct_x20));
+ ClearUnkStruct_x20Array(data->field_0->arr, 8);
+ data->field_8 = AllocZeroed(sizeof(struct UnkStruct_x20));
+ ClearUnkStruct_x20Array(&data->field_8->arr[0], 1);
+ data->searchTaskId = CreateTask_SearchForChildOrParent(data->field_C, data->field_4, 10);
+ data->state = 3;
break;
case 3:
- switch (sub_8016B00())
+ switch (HandlePlayerListUpdate())
{
case 1:
case 2:
@@ -3116,10 +3295,10 @@ void sub_801697C(u8 taskId)
{
for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++)
{
- if (structPtr->field_0->arr[i].field_1A_0 == 1)
+ if (data->field_0->arr[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN)
{
- sub_8018404(text, &structPtr->field_0->arr[i]);
- if (sub_800E540(ReadAsU16(structPtr->field_0->arr[i].unk.field_0.unk_00.playerTrainerId), text))
+ IntlConvPartnerUname7(text, &data->field_0->arr[i]);
+ if (PlayerHasMetTrainerBefore(ReadAsU16(data->field_0->arr[i].gname_uname.gname.unk_00.playerTrainerId), text))
{
StringCopy(sUnionRoomPlayerName, text);
break;
@@ -3133,13 +3312,13 @@ void sub_801697C(u8 taskId)
}
break;
case 4:
- free(structPtr->field_8);
- free(structPtr->field_0);
- free(structPtr->field_C);
- free(structPtr->field_4);
- DestroyTask(structPtr->field_20);
- free(gUnknown_02022C30.uRoom);
- sub_800EDD4();
+ free(data->field_8);
+ free(data->field_0);
+ free(data->field_C);
+ free(data->field_4);
+ DestroyTask(data->searchTaskId);
+ free(sWirelessLinkMain.uRoom);
+ LinkRfu_Shutdown();
DestroyTask(taskId);
break;
}
@@ -3159,176 +3338,168 @@ bool16 BufferUnionRoomPlayerName(void)
}
}
-u8 sub_8016B00(void)
+static u8 HandlePlayerListUpdate(void)
{
s32 i;
u8 j;
- struct UnkStruct_URoom *structPtr = gUnknown_02022C30.uRoom;
+ struct WirelessLink_URoom *data = sWirelessLinkMain.uRoom;
s32 r7 = 0;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if (sub_8017630(&structPtr->field_C->arr[i].unk0, &gUnknown_082F045C) == TRUE)
+ if (AreGnameUnameDifferent(&data->field_C->arr[i].gname_uname, &sWirelessGnameUnamePair_Dummy) == TRUE)
{
- structPtr->field_8->arr[0].unk = structPtr->field_C->arr[i].unk0;
- structPtr->field_8->arr[0].field_18 = 0;
- structPtr->field_8->arr[0].field_1A_0 = 1;
- structPtr->field_8->arr[0].field_1B = 1;
+ data->field_8->arr[0].gname_uname = data->field_C->arr[i].gname_uname;
+ data->field_8->arr[0].timeoutCounter = 0;
+ data->field_8->arr[0].groupScheduledAnim = UNION_ROOM_SPAWN_IN;
+ data->field_8->arr[0].field_1B = 1;
return 4;
}
}
- for (j = 0; j < 8; j++)
+ for (j = 0; j < ARRAY_COUNT(data->field_0->arr); j++)
{
- if (structPtr->field_0->arr[j].field_1A_0 != 0)
+ if (data->field_0->arr[j].groupScheduledAnim != UNION_ROOM_SPAWN_NONE)
{
- i = sub_80176E4(&structPtr->field_0->arr[j], &structPtr->field_4->arr[0]);
+ i = Findx20Inx1CArray(&data->field_0->arr[j], &data->field_4->arr[0]);
if (i != 0xFF)
{
- if (structPtr->field_0->arr[j].field_1A_0 == 1)
+ if (data->field_0->arr[j].groupScheduledAnim == UNION_ROOM_SPAWN_IN)
{
- if (sub_8017678(&structPtr->field_0->arr[j].unk, &structPtr->field_4->arr[i].unk0))
+ if (AreUnionRoomPlayerGnamesDifferent(&data->field_0->arr[j].gname_uname, &data->field_4->arr[i].gname_uname))
{
- structPtr->field_0->arr[j].unk = structPtr->field_4->arr[i].unk0;
- structPtr->field_0->arr[j].field_1B = 0x40;
+ data->field_0->arr[j].gname_uname = data->field_4->arr[i].gname_uname;
+ data->field_0->arr[j].field_1B = 64;
r7 = 1;
}
- else if (structPtr->field_0->arr[j].field_1B != 0)
+ else if (data->field_0->arr[j].field_1B != 0)
{
- structPtr->field_0->arr[j].field_1B--;
- if (structPtr->field_0->arr[j].field_1B == 0)
+ data->field_0->arr[j].field_1B--;
+ if (data->field_0->arr[j].field_1B == 0)
r7 = 2;
}
}
else
{
- structPtr->field_0->arr[j].field_1A_0 = 1;
- structPtr->field_0->arr[j].field_1B = 0;
+ data->field_0->arr[j].groupScheduledAnim = UNION_ROOM_SPAWN_IN;
+ data->field_0->arr[j].field_1B = 0;
r7 = 2;
}
- structPtr->field_0->arr[j].field_18 = 0;
+ data->field_0->arr[j].timeoutCounter = 0;
}
- else if (structPtr->field_0->arr[j].field_1A_0 != 2)
+ else if (data->field_0->arr[j].groupScheduledAnim != UNION_ROOM_SPAWN_OUT)
{
- structPtr->field_0->arr[j].field_18++;
- if (structPtr->field_0->arr[j].field_18 >= 600)
+ data->field_0->arr[j].timeoutCounter++;
+ if (data->field_0->arr[j].timeoutCounter >= 600)
{
- structPtr->field_0->arr[j].field_1A_0 = 2;
+ data->field_0->arr[j].groupScheduledAnim = UNION_ROOM_SPAWN_OUT;
r7 = 2;
}
}
- else if (structPtr->field_0->arr[j].field_1A_0 == 2)
+ else if (data->field_0->arr[j].groupScheduledAnim == UNION_ROOM_SPAWN_OUT)
{
- structPtr->field_0->arr[j].field_18++;
- if (structPtr->field_0->arr[j].field_18 >= 900)
+ data->field_0->arr[j].timeoutCounter++;
+ if (data->field_0->arr[j].timeoutCounter >= 900)
{
- sub_8017580(&structPtr->field_0->arr[j], 1);
+ ClearUnkStruct_x20Array(&data->field_0->arr[j], 1);
}
}
}
}
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if (sub_8017734(&structPtr->field_0->arr[0], &structPtr->field_4->arr[i], 8) != 0xFF)
+ if (Appendx1Ctox20(&data->field_0->arr[0], &data->field_4->arr[i], MAX_UNION_ROOM_PLAYERS) != 0xFF)
r7 = 1;
}
return r7;
}
-void sub_8016CA0(u8 taskId)
+static void Task_SearchForChildOrParent(u8 taskId)
{
s32 i, j;
- struct UnkStruct_Shared sp0;
+ struct WirelessGnameUnamePair gname_uname;
struct UnkStruct_Main4 **ptr = (void*) gTasks[taskId].data;
- bool8 r4;
+ bool8 isParent;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- r4 = sub_800DE7C(&sp0.field_0, sp0.playerName, i);
- if (!sub_8013D88(sp0.field_0.activity, gTasks[taskId].data[4]))
+ isParent = LinkRfu_GetNameIfCompatible(&gname_uname.gname, gname_uname.playerName, i);
+ if (!IsPartnerActivityAcceptable(gname_uname.gname.activity, gTasks[taskId].data[4]))
{
- sp0 = gUnknown_082F045C;
+ gname_uname = sWirelessGnameUnamePair_Dummy;
}
- if (sp0.field_0.unk_00.language == 1)
+ if (gname_uname.gname.unk_00.language == LANGUAGE_JAPANESE)
{
- sp0 = gUnknown_082F045C;
+ gname_uname = sWirelessGnameUnamePair_Dummy;
}
- if (!r4)
+ if (!isParent)
{
for (j = 0; j < i; j++)
{
- if (!sub_8017630(&ptr[1]->arr[j].unk0, &sp0))
+ if (!AreGnameUnameDifferent(&ptr[1]->arr[j].gname_uname, &gname_uname))
{
- sp0 = gUnknown_082F045C;
+ gname_uname = sWirelessGnameUnamePair_Dummy;
}
}
- ptr[1]->arr[i].unk0 = sp0;
- ptr[1]->arr[i].unk18 = sub_8017630(&ptr[1]->arr[i].unk0, &gUnknown_082F045C);
+ ptr[1]->arr[i].gname_uname = gname_uname;
+ ptr[1]->arr[i].active = AreGnameUnameDifferent(&ptr[1]->arr[i].gname_uname, &sWirelessGnameUnamePair_Dummy);
}
else
{
- ptr[0]->arr[i].unk0 = sp0;
- ptr[0]->arr[i].unk18 = sub_8017630(&ptr[0]->arr[i].unk0, &gUnknown_082F045C);
+ ptr[0]->arr[i].gname_uname = gname_uname;
+ ptr[0]->arr[i].active = AreGnameUnameDifferent(&ptr[0]->arr[i].gname_uname, &sWirelessGnameUnamePair_Dummy);
}
}
}
-u8 sub_8016DF0(struct UnkStruct_Main4 * a0, struct UnkStruct_Main4 * a1, u32 a2)
+static u8 CreateTask_SearchForChildOrParent(struct UnkStruct_Main4 * main4_parent, struct UnkStruct_Main4 * main4_child, u32 linkGroup)
{
- u8 taskId = CreateTask(sub_8016CA0, 0);
+ u8 taskId = CreateTask(Task_SearchForChildOrParent, 0);
struct UnkStruct_Main4 ** data = (void *)gTasks[taskId].data;
- data[0] = a0;
- data[1] = a1;
- gTasks[taskId].data[4] = a2;
+ data[0] = main4_parent;
+ data[1] = main4_child;
+ gTasks[taskId].data[4] = linkGroup;
return taskId;
}
-void sub_8016E24(u8 taskId)
+static void Task_ListenForPartnersWithCompatibleSerialNos(u8 taskId)
{
s32 i, j;
struct UnkStruct_Main4 **ptr = (void*) gTasks[taskId].data;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- sub_800DE7C(&ptr[0]->arr[i].unk0.field_0, ptr[0]->arr[i].unk0.playerName, i);
- if (!sub_8013D88(ptr[0]->arr[i].unk0.field_0.activity, gTasks[taskId].data[2]))
+ LinkRfu_GetNameIfCompatible(&ptr[0]->arr[i].gname_uname.gname, ptr[0]->arr[i].gname_uname.playerName, i);
+ if (!IsPartnerActivityAcceptable(ptr[0]->arr[i].gname_uname.gname.activity, gTasks[taskId].data[2]))
{
- ptr[0]->arr[i].unk0 = gUnknown_082F045C;
+ ptr[0]->arr[i].gname_uname = sWirelessGnameUnamePair_Dummy;
}
for (j = 0; j < i; j++)
{
- if (!sub_8017630(&ptr[0]->arr[j].unk0, &ptr[0]->arr[i].unk0))
+ if (!AreGnameUnameDifferent(&ptr[0]->arr[j].gname_uname, &ptr[0]->arr[i].gname_uname))
{
- ptr[0]->arr[i].unk0 = gUnknown_082F045C;
+ ptr[0]->arr[i].gname_uname = sWirelessGnameUnamePair_Dummy;
}
}
- ptr[0]->arr[i].unk18 = sub_8017630(&ptr[0]->arr[i].unk0, &gUnknown_082F045C);
+ ptr[0]->arr[i].active = AreGnameUnameDifferent(&ptr[0]->arr[i].gname_uname, &sWirelessGnameUnamePair_Dummy);
}
}
-bool32 sub_8016F1C(struct GFtgtGname *arg0, s16 arg1)
+static bool32 HasWonderCardOrNewsByLinkGroup(struct GFtgtGname *gname, s16 linkGroup)
{
- if (arg1 == 7)
+ if (linkGroup == LINK_GROUP_WONDER_CARD)
{
- if (!arg0->unk_00.hasCard)
- {
+ if (!gname->unk_00.hasCard)
return FALSE;
- }
else
- {
return TRUE;
- }
}
- else if (arg1 == 8)
+ else if (linkGroup == LINK_GROUP_WONDER_NEWS)
{
- if (!arg0->unk_00.hasNews)
- {
+ if (!gname->unk_00.hasNews)
return FALSE;
- }
else
- {
return TRUE;
- }
}
else
{
@@ -3336,40 +3507,40 @@ bool32 sub_8016F1C(struct GFtgtGname *arg0, s16 arg1)
}
}
-void sub_8016F44(u8 taskId)
+static void Task_ListenForPartnersWithSerial7F7D(u8 taskId)
{
s32 i;
struct UnkStruct_Main4 **ptr = (void*) gTasks[taskId].data;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if (sub_800DF34(&ptr[0]->arr[i].unk0.field_0, ptr[0]->arr[i].unk0.playerName, i))
+ if (LinkRfu_GetNameIfSerial7F7D(&ptr[0]->arr[i].gname_uname.gname, ptr[0]->arr[i].gname_uname.playerName, i))
{
- sub_8016F1C(&ptr[0]->arr[i].unk0.field_0, gTasks[taskId].data[2]);
+ HasWonderCardOrNewsByLinkGroup(&ptr[0]->arr[i].gname_uname.gname, gTasks[taskId].data[2]);
}
- ptr[0]->arr[i].unk18 = sub_8017630(&ptr[0]->arr[i].unk0, &gUnknown_082F045C);
+ ptr[0]->arr[i].active = AreGnameUnameDifferent(&ptr[0]->arr[i].gname_uname, &sWirelessGnameUnamePair_Dummy);
}
}
-u8 sub_8016FC0(struct UnkStruct_Main4 * a0, u32 a1)
+static u8 CreateTask_ListenForPartnersWithCompatibleSerialNos(struct UnkStruct_Main4 * main4, u32 linkGroup)
{
- u8 taskId = CreateTask(sub_8016E24, 0);
+ u8 taskId = CreateTask(Task_ListenForPartnersWithCompatibleSerialNos, 0);
struct UnkStruct_Main4 **ptr = (void*) gTasks[taskId].data;
- ptr[0] = a0;
- gTasks[taskId].data[2] = a1;
+ ptr[0] = main4;
+ gTasks[taskId].data[2] = linkGroup;
return taskId;
}
-u8 sub_8016FF0(struct UnkStruct_Main4 * a0, u32 a1)
+static u8 CreateTask_ListenForPartnersWithSerial7F7D(struct UnkStruct_Main4 * main4, u32 linkGroup)
{
- u8 taskId = CreateTask(sub_8016F44, 0);
+ u8 taskId = CreateTask(Task_ListenForPartnersWithSerial7F7D, 0);
struct UnkStruct_Main4 **ptr = (void*) gTasks[taskId].data;
- ptr[0] = a0;
- gTasks[taskId].data[2] = a1;
+ ptr[0] = main4;
+ gTasks[taskId].data[2] = linkGroup;
return taskId;
}
-bool32 sub_8017020(const u8 *src)
+static bool32 UR_PrintFieldMessage(const u8 *src)
{
LoadMessageBoxAndBorderGfx();
DrawDialogueFrame(0, 1);
@@ -3378,19 +3549,15 @@ bool32 sub_8017020(const u8 *src)
return FALSE;
}
-bool32 sub_801704C(void)
+static bool32 UR_RunTextPrinters_CheckPrinter0Active(void)
{
if (!RunTextPrintersAndIsPrinter0Active())
- {
return TRUE;
- }
else
- {
return FALSE;
- }
}
-bool8 PrintOnTextbox(u8 *textState, const u8 *str)
+static bool8 PrintOnTextbox(u8 *textState, const u8 *str)
{
switch (*textState)
{
@@ -3412,96 +3579,96 @@ bool8 PrintOnTextbox(u8 *textState, const u8 *str)
return FALSE;
}
-s8 sub_80170B8(u8 *arg0, bool32 arg1)
+static s8 UnionRoomHandleYesNo(u8 *state, bool32 noDraw)
{
- s8 r1;
+ s8 input;
- switch (*arg0)
+ switch (*state)
{
case 0:
- if (arg1)
+ if (noDraw)
{
return -3;
}
DisplayYesNoMenuDefaultYes();
- (*arg0)++;
+ (*state)++;
break;
case 1:
- if (arg1)
+ if (noDraw)
{
sub_8198C78();
- *arg0 = 0;
+ *state = 0;
return -3;
}
- r1 = Menu_ProcessInputNoWrapClearOnChoose();
- if (r1 == -1 || r1 == 0 || r1 == 1)
+ input = Menu_ProcessInputNoWrapClearOnChoose();
+ if (input == -1 || input == 0 || input == 1)
{
- *arg0 = 0;
- return r1;
+ *state = 0;
+ return input;
}
break;
}
return -2;
}
-u8 sub_8017118(const struct WindowTemplate * template)
+static u8 CreateTradeBoardWindow(const struct WindowTemplate * template)
{
u8 windowId = AddWindow(template);
DrawStdWindowFrame(windowId, FALSE);
- FillWindowPixelBuffer(windowId, 0xFF);
- sub_80173E0(windowId, 1, sText_NameWantedOfferLv, 8, 1, 6);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(15));
+ UR_AddTextPrinterParameterized(windowId, 1, sText_NameWantedOfferLv, 8, 1, 6);
CopyWindowToVram(windowId, 2);
PutWindowTilemap(windowId);
return windowId;
}
-void sub_8017168(u8 windowId)
+static void DeleteTradeBoardWindow(u8 windowId)
{
RemoveWindow(windowId);
}
-s32 sub_8017178(u8 *arg0, u8 *arg1, u8 *arg2, const struct WindowTemplate *winTemplate, const struct ListMenuTemplate *menuTemplate)
+static s32 ListMenuHandler_AllItemsAvailable(u8 *state, u8 *windowId, u8 *listMenuId, const struct WindowTemplate *winTemplate, const struct ListMenuTemplate *menuTemplate)
{
- s32 r1, r8;
+ s32 maxWidth, input;
struct WindowTemplate winTemplateCopy;
- switch (*arg0)
+ switch (*state)
{
case 0:
winTemplateCopy = *winTemplate;
- r1 = Intl_GetListMenuWidth(menuTemplate);
- if (winTemplateCopy.width > r1)
+ maxWidth = Intl_GetListMenuWidth(menuTemplate);
+ if (winTemplateCopy.width > maxWidth)
{
- winTemplateCopy.width = r1;
+ winTemplateCopy.width = maxWidth;
}
if (winTemplateCopy.tilemapLeft + winTemplateCopy.width > 29)
{
winTemplateCopy.tilemapLeft = max(29 - winTemplateCopy.width, 0);
}
- *arg1 = AddWindow(&winTemplateCopy);
- DrawStdWindowFrame(*arg1, FALSE);
+ *windowId = AddWindow(&winTemplateCopy);
+ DrawStdWindowFrame(*windowId, FALSE);
gMultiuseListMenuTemplate = *menuTemplate;
- gMultiuseListMenuTemplate.windowId = *arg1;
- *arg2 = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
- CopyWindowToVram(*arg1, TRUE);
- (*arg0)++;
+ gMultiuseListMenuTemplate.windowId = *windowId;
+ *listMenuId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0);
+ CopyWindowToVram(*windowId, TRUE);
+ (*state)++;
break;
case 1:
- r8 = ListMenu_ProcessInput(*arg2);
- if (({gMain.newKeys & A_BUTTON;}))
+ input = ListMenu_ProcessInput(*listMenuId);
+ if (JOY_NEW(A_BUTTON))
{
- DestroyListMenuTask(*arg2, NULL, NULL);
- ClearStdWindowAndFrame(*arg1, TRUE);
- RemoveWindow(*arg1);
- *arg0 = 0;
- return r8;
+ DestroyListMenuTask(*listMenuId, NULL, NULL);
+ ClearStdWindowAndFrame(*windowId, TRUE);
+ RemoveWindow(*windowId);
+ *state = 0;
+ return input;
}
- else if (({gMain.newKeys & B_BUTTON;}))
+ else if (JOY_NEW(B_BUTTON))
{
- DestroyListMenuTask(*arg2, NULL, NULL);
- ClearStdWindowAndFrame(*arg1, TRUE);
- RemoveWindow(*arg1);
- *arg0 = 0;
+ DestroyListMenuTask(*listMenuId, NULL, NULL);
+ ClearStdWindowAndFrame(*windowId, TRUE);
+ RemoveWindow(*windowId);
+ *state = 0;
return -2;
}
break;
@@ -3510,49 +3677,48 @@ s32 sub_8017178(u8 *arg0, u8 *arg1, u8 *arg2, const struct WindowTemplate *winTe
return -1;
}
-s32 sub_80172A0(u8 *arg0, u8 *arg1, u8 *arg2, u8 *arg3, const struct WindowTemplate *winTemplate, const struct ListMenuTemplate *menuTemplate, struct UnkStruct_Main0 *arg6)
+static s32 TradeBoardMenuHandler(u8 *state, u8 *windowId, u8 *listMenuId, u8 *tradeBoardWindowId, const struct WindowTemplate *winTemplate, const struct ListMenuTemplate *menuTemplate, struct UnkStruct_Main0 *traders)
{
s32 input;
- s32 r4;
+ s32 idx;
- switch (*arg0)
+ switch (*state)
{
case 0:
- *arg3 = sub_8017118(&gUnknown_082F0344);
- *arg1 = AddWindow(winTemplate);
- DrawStdWindowFrame(*arg1, FALSE);
+ *tradeBoardWindowId = CreateTradeBoardWindow(&sWindowTemplate_TradingBoard);
+ *windowId = AddWindow(winTemplate);
+ DrawStdWindowFrame(*windowId, FALSE);
gMultiuseListMenuTemplate = *menuTemplate;
- gMultiuseListMenuTemplate.windowId = *arg1;
- *arg2 = ListMenuInit(&gMultiuseListMenuTemplate, 0, 1);
- (*arg0)++;
+ gMultiuseListMenuTemplate.windowId = *windowId;
+ *listMenuId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 1);
+ (*state)++;
break;
case 1:
- CopyWindowToVram(*arg1, TRUE);
- (*arg0)++;
+ CopyWindowToVram(*windowId, TRUE);
+ (*state)++;
break;
case 2:
- // Register swap r1 <---> r2
- input = ListMenu_ProcessInput(*arg2);
- if (({gMain.newKeys & (A_BUTTON | B_BUTTON);}))
+ input = ListMenu_ProcessInput(*listMenuId);
+ if (JOY_NEW(A_BUTTON | B_BUTTON))
{
- if (input == 8 || ({gMain.newKeys & B_BUTTON;}))
+ if (input == 8 || JOY_NEW(B_BUTTON))
{
- DestroyListMenuTask(*arg2, NULL, NULL);
- RemoveWindow(*arg1);
- sub_8017168(*arg3);
- *arg0 = 0;
+ DestroyListMenuTask(*listMenuId, NULL, NULL);
+ RemoveWindow(*windowId);
+ DeleteTradeBoardWindow(*tradeBoardWindowId);
+ *state = 0;
return -2;
}
else
{
- r4 = sub_8017CB0(arg6->arr, input);
- if (r4 >= 0)
+ idx = GetIndexOfNthTradeBoardOffer(traders->arr, input);
+ if (idx >= 0)
{
- DestroyListMenuTask(*arg2, NULL, NULL);
- RemoveWindow(*arg1);
- sub_8017168(*arg3);
- *arg0 = 0;
- return r4;
+ DestroyListMenuTask(*listMenuId, NULL, NULL);
+ RemoveWindow(*windowId);
+ DeleteTradeBoardWindow(*tradeBoardWindowId);
+ *state = 0;
+ return idx;
}
else
{
@@ -3565,127 +3731,128 @@ s32 sub_80172A0(u8 *arg0, u8 *arg1, u8 *arg2, u8 *arg3, const struct WindowTempl
return -1;
}
-void sub_80173B0(void)
+
+static void UR_ClearBg0(void)
{
FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 0);
CopyBgTilemapBufferToVram(0);
}
-void sub_80173D4(void)
+static void JoinGroup_EnableScriptContexts(void)
{
EnableBothScriptContexts();
}
-void sub_80173E0(u8 windowId, u8 arg1, const u8 *str, u8 arg3, u8 arg4, u8 arg5)
+static void UR_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx)
{
- struct TextPrinterTemplate sp0;
+ struct TextPrinterTemplate printerTemplate;
- sp0.currentChar = str;
- sp0.windowId = windowId;
- sp0.fontId = arg1;
- sp0.x = arg3;
- sp0.y = arg4;
- sp0.currentX = arg3;
- sp0.currentY = arg4;
- sp0.unk = 0;
+ printerTemplate.currentChar = str;
+ printerTemplate.windowId = windowId;
+ printerTemplate.fontId = fontId;
+ printerTemplate.x = x;
+ printerTemplate.y = y;
+ printerTemplate.currentX = x;
+ printerTemplate.currentY = y;
+ printerTemplate.unk = 0;
gTextFlags.useAlternateDownArrow = FALSE;
- switch (arg5)
+ switch (colorIdx)
{
- case 0:
- sp0.letterSpacing = 0;
- sp0.lineSpacing = 0;
- sp0.fgColor = 2;
- sp0.bgColor = 1;
- sp0.shadowColor = 3;
- break;
- case 1:
- sp0.letterSpacing = 0;
- sp0.lineSpacing = 0;
- sp0.fgColor = 4;
- sp0.bgColor = 1;
- sp0.shadowColor = 5;
- break;
- case 2:
- sp0.letterSpacing = 0;
- sp0.lineSpacing = 0;
- sp0.fgColor = 6;
- sp0.bgColor = 1;
- sp0.shadowColor = 7;
- break;
- case 3:
- sp0.letterSpacing = 0;
- sp0.lineSpacing = 0;
- sp0.fgColor = 1;
- sp0.bgColor = 1;
- sp0.shadowColor = 3;
- break;
- case 4:
- sp0.letterSpacing = 0;
- sp0.lineSpacing = 0;
- sp0.fgColor = 1;
- sp0.bgColor = 2;
- sp0.shadowColor = 3;
- break;
- case 5:
- sp0.letterSpacing = 0;
- sp0.lineSpacing = 0;
- sp0.fgColor = 7;
- sp0.bgColor = 15;
- sp0.shadowColor = 9;
- break;
- case 6:
- sp0.letterSpacing = 0;
- sp0.lineSpacing = 0;
- sp0.fgColor = 14;
- sp0.bgColor = 15;
- sp0.shadowColor = 9;
+ case UR_COLOR_DKE_WHT_LTE:
+ printerTemplate.letterSpacing = 0;
+ printerTemplate.lineSpacing = 0;
+ printerTemplate.fgColor = TEXT_COLOR_DARK_GREY;
+ printerTemplate.bgColor = TEXT_COLOR_WHITE;
+ printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GREY;
+ break;
+ case UR_COLOR_RED_WHT_LTR:
+ printerTemplate.letterSpacing = 0;
+ printerTemplate.lineSpacing = 0;
+ printerTemplate.fgColor = TEXT_COLOR_RED;
+ printerTemplate.bgColor = TEXT_COLOR_WHITE;
+ printerTemplate.shadowColor = TEXT_COLOR_LIGHT_RED;
+ break;
+ case UR_COLOR_GRN_WHT_LTG:
+ printerTemplate.letterSpacing = 0;
+ printerTemplate.lineSpacing = 0;
+ printerTemplate.fgColor = TEXT_COLOR_GREEN;
+ printerTemplate.bgColor = TEXT_COLOR_WHITE;
+ printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GREEN;
+ break;
+ case UR_COLOR_WHT_WHT_LTE:
+ printerTemplate.letterSpacing = 0;
+ printerTemplate.lineSpacing = 0;
+ printerTemplate.fgColor = TEXT_COLOR_WHITE;
+ printerTemplate.bgColor = TEXT_COLOR_WHITE;
+ printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GREY;
+ break;
+ case UR_COLOR_WHT_DKE_LTE:
+ printerTemplate.letterSpacing = 0;
+ printerTemplate.lineSpacing = 0;
+ printerTemplate.fgColor = TEXT_COLOR_WHITE;
+ printerTemplate.bgColor = TEXT_COLOR_DARK_GREY;
+ printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GREY;
+ break;
+ case UR_COLOR_GRN_DN6_LTB:
+ printerTemplate.letterSpacing = 0;
+ printerTemplate.lineSpacing = 0;
+ printerTemplate.fgColor = TEXT_COLOR_LIGHT_GREEN;
+ printerTemplate.bgColor = TEXT_DYNAMIC_COLOR_6;
+ printerTemplate.shadowColor = TEXT_COLOR_LIGHT_BLUE;
+ break;
+ case UR_COLOR_DN5_DN6_LTB:
+ printerTemplate.letterSpacing = 0;
+ printerTemplate.lineSpacing = 0;
+ printerTemplate.fgColor = TEXT_DYNAMIC_COLOR_5;
+ printerTemplate.bgColor = TEXT_DYNAMIC_COLOR_6;
+ printerTemplate.shadowColor = TEXT_COLOR_LIGHT_BLUE;
break;
}
- AddTextPrinter(&sp0, 0xFF, NULL);
+ AddTextPrinter(&printerTemplate, 0xFF, NULL);
}
-void sub_8017580(struct UnkStruct_x20 *arg0, u8 count)
+static void ClearUnkStruct_x20Array(struct UnkStruct_x20 *arr, u8 count)
{
s32 i;
for (i = 0; i < count; i++)
{
- arg0[i].unk = gUnknown_082F045C;
- arg0[i].field_18 = 0xFF;
- arg0[i].field_1A_0 = 0;
- arg0[i].field_1A_1 = 0;
- arg0[i].field_1B = 0;
+ arr[i].gname_uname = sWirelessGnameUnamePair_Dummy;
+ arr[i].timeoutCounter = 255;
+ arr[i].groupScheduledAnim = UNION_ROOM_SPAWN_NONE;
+ arr[i].useRedText = FALSE;
+ arr[i].field_1B = 0;
}
}
-void sub_80175EC(struct UnkStruct_Main4 *arg0, u8 count)
+static void ClearUnkStruct_x1CArray(struct UnkStruct_Main4 *main4, u8 count)
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- arg0->arr[i].unk0 = gUnknown_082F045C;
- arg0->arr[i].unk18 = 0;
+ main4->arr[i].gname_uname = sWirelessGnameUnamePair_Dummy;
+ main4->arr[i].active = FALSE;
}
}
-bool8 sub_8017630(struct UnkStruct_Shared* arg0, const struct UnkStruct_Shared* arg1)
+static bool8 AreGnameUnameDifferent(struct WirelessGnameUnamePair* pair1, const struct WirelessGnameUnamePair* pair2)
{
s32 i;
for (i = 0; i < 2; i++)
{
- if (arg0->field_0.unk_00.playerTrainerId[i] != arg1->field_0.unk_00.playerTrainerId[i])
+ if (pair1->gname.unk_00.playerTrainerId[i] != pair2->gname.unk_00.playerTrainerId[i])
{
return TRUE;
}
}
- for (i = 0; i < 8; i++)
+ for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++)
{
- if (arg0->playerName[i] != arg1->playerName[i])
+ if (pair1->playerName[i] != pair2->playerName[i])
{
return TRUE;
}
@@ -3694,34 +3861,34 @@ bool8 sub_8017630(struct UnkStruct_Shared* arg0, const struct UnkStruct_Shared*
return FALSE;
}
-bool32 sub_8017678(struct UnkStruct_Shared *arg0, struct UnkStruct_Shared *arg1)
+static bool32 AreUnionRoomPlayerGnamesDifferent(struct WirelessGnameUnamePair *pair1, struct WirelessGnameUnamePair *pair2)
{
s32 i;
- if (arg0->field_0.activity != arg1->field_0.activity)
+ if (pair1->gname.activity != pair2->gname.activity)
{
return TRUE;
}
- if (arg0->field_0.started != arg1->field_0.started)
+ if (pair1->gname.started != pair2->gname.started)
{
return TRUE;
}
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if (arg0->field_0.child_sprite_gender[i] != arg1->field_0.child_sprite_gender[i])
+ if (pair1->gname.child_sprite_gender[i] != pair2->gname.child_sprite_gender[i])
{
return TRUE;
}
}
- if (arg0->field_0.species != arg1->field_0.species)
+ if (pair1->gname.species != pair2->gname.species)
{
return TRUE;
}
- if (arg0->field_0.type != arg1->field_0.type)
+ if (pair1->gname.type != pair2->gname.type)
{
return TRUE;
}
@@ -3729,38 +3896,38 @@ bool32 sub_8017678(struct UnkStruct_Shared *arg0, struct UnkStruct_Shared *arg1)
return FALSE;
}
-u32 sub_80176E4(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1)
+static u32 Findx20Inx1CArray(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1)
{
u8 result = 0xFF;
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if (arg1[i].unk18 && !sub_8017630(&arg0->unk, &arg1[i].unk0))
+ if (arg1[i].active && !AreGnameUnameDifferent(&arg0->gname_uname, &arg1[i].gname_uname))
{
result = i;
- arg1[i].unk18 = FALSE;
+ arg1[i].active = FALSE;
}
}
return result;
}
-u8 sub_8017734(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1, u8 arg2)
+static u8 Appendx1Ctox20(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1, u8 max)
{
s32 i;
- if (arg1->unk18)
+ if (arg1->active)
{
- for (i = 0; i < arg2; i++)
+ for (i = 0; i < max; i++)
{
- if (arg0[i].field_1A_0 == 0)
+ if (arg0[i].groupScheduledAnim == UNION_ROOM_SPAWN_NONE)
{
- arg0[i].unk = arg1->unk0;
- arg0[i].field_18 = 0;
- arg0[i].field_1A_0 = 1;
+ arg0[i].gname_uname = arg1->gname_uname;
+ arg0[i].timeoutCounter = 0;
+ arg0[i].groupScheduledAnim = UNION_ROOM_SPAWN_IN;
arg0[i].field_1B = 64;
- arg1->unk18 = FALSE;
+ arg1->active = FALSE;
return i;
}
}
@@ -3769,126 +3936,123 @@ u8 sub_8017734(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1, u8 arg2)
return 0xFF;
}
-void sub_80177B8(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 *arg3, u8 arg4, u8 id)
+static void PrintUnionRoomGroupOnWindow(u8 windowId, u8 x, u8 y, struct UnkStruct_x20 *group, u8 colorIdx, u8 id)
{
- u8 r2;
- u8 sp0[6];
+ u8 activity;
+ u8 trainerId[6];
ConvertIntToDecimalStringN(gStringVar4, id + 1, STR_CONV_MODE_LEADING_ZEROS, 2);
StringAppend(gStringVar4, sText_Colon);
- sub_80173E0(arg0, 1, gStringVar4, arg1, arg2, 0);
- arg1 += 18;
- r2 = arg3->unk.field_0.activity;
- if (arg3->field_1A_0 == 1 && !(r2 & 0x40))
+ UR_AddTextPrinterParameterized(windowId, 1, gStringVar4, x, y, 0);
+ x += 18;
+ activity = group->gname_uname.gname.activity;
+ if (group->groupScheduledAnim == UNION_ROOM_SPAWN_IN && !(activity & IN_UNION_ROOM))
{
- sub_8018404(gStringVar4, arg3);
- sub_80173E0(arg0, 1, gStringVar4, arg1, arg2, arg4);
- ConvertIntToDecimalStringN(sp0, arg3->unk.field_0.unk_00.playerTrainerId[0] | (arg3->unk.field_0.unk_00.playerTrainerId[1] << 8), STR_CONV_MODE_LEADING_ZEROS, 5);
+ IntlConvPartnerUname7(gStringVar4, group);
+ UR_AddTextPrinterParameterized(windowId, 1, gStringVar4, x, y, colorIdx);
+ ConvertIntToDecimalStringN(trainerId, group->gname_uname.gname.unk_00.playerTrainerId[0] | (group->gname_uname.gname.unk_00.playerTrainerId[1] << 8), STR_CONV_MODE_LEADING_ZEROS, 5);
StringCopy(gStringVar4, sText_ID);
- StringAppend(gStringVar4, sp0);
- sub_80173E0(arg0, 1, gStringVar4, GetStringRightAlignXOffset(1, gStringVar4, 0x88), arg2, arg4);
+ StringAppend(gStringVar4, trainerId);
+ UR_AddTextPrinterParameterized(windowId, 1, gStringVar4, GetStringRightAlignXOffset(1, gStringVar4, 0x88), y, colorIdx);
}
}
-void sub_80178A0(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 *arg3, u8 arg4, u8 id)
+static void PrintGroupMemberCandidateOnWindowWithColor(u8 windowId, u8 x, u8 y, struct UnkStruct_x20 *group, u8 colorIdx, u8 id)
{
- u8 sp0[6];
+ u8 trainerId[6];
- if (arg3->field_1A_0 == 1)
+ if (group->groupScheduledAnim == UNION_ROOM_SPAWN_IN)
{
- sub_8018404(gStringVar4, arg3);
- sub_80173E0(arg0, 1, gStringVar4, arg1, arg2, arg4);
- ConvertIntToDecimalStringN(sp0, arg3->unk.field_0.unk_00.playerTrainerId[0] | (arg3->unk.field_0.unk_00.playerTrainerId[1] << 8), STR_CONV_MODE_LEADING_ZEROS, 5);
+ IntlConvPartnerUname7(gStringVar4, group);
+ UR_AddTextPrinterParameterized(windowId, 1, gStringVar4, x, y, colorIdx);
+ ConvertIntToDecimalStringN(trainerId, group->gname_uname.gname.unk_00.playerTrainerId[0] | (group->gname_uname.gname.unk_00.playerTrainerId[1] << 8), STR_CONV_MODE_LEADING_ZEROS, 5);
StringCopy(gStringVar4, sText_ID);
- StringAppend(gStringVar4, sp0);
- sub_80173E0(arg0, 1, gStringVar4, GetStringRightAlignXOffset(1, gStringVar4, 0x68), arg2, arg4);
+ StringAppend(gStringVar4, trainerId);
+ UR_AddTextPrinterParameterized(windowId, 1, gStringVar4, GetStringRightAlignXOffset(1, gStringVar4, 0x68), y, colorIdx);
}
}
-bool32 sub_8017940(void)
+static bool32 IsPlayerFacingTradingBoard(void)
{
s16 x, y;
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
- if (x != 9)
- {
+
+ if (x != 2 + 7)
return FALSE;
- }
- if (y != 8)
- {
+
+ if (y != 1 + 7)
return FALSE;
- }
- if (gPlayerAvatar.tileTransitionState == 2 || gPlayerAvatar.tileTransitionState == 0)
- {
+
+ if (gPlayerAvatar.tileTransitionState == T_TILE_CENTER || gPlayerAvatar.tileTransitionState == T_NOT_MOVING)
return TRUE;
- }
return FALSE;
}
-u32 sub_8017984(s32 arg0)
+static u32 GetResponseIdx_InviteToURoomActivity(s32 activity)
{
- switch (arg0)
+ switch (activity)
{
- case 5:
+ case ACTIVITY_CHAT:
return 1;
- case 4:
+ case ACTIVITY_TRADE:
return 2;
- case 8:
+ case ACTIVITY_CARD:
return 3;
- case 3:
+ case ACTIVITY_BATTLE_MULTI:
default:
return 0;
}
}
-u32 sub_80179AC(struct UnkStruct_x20 *arg0)
+static u32 ConvPartnerUnameAndGetWhetherMetAlready(struct UnkStruct_x20 *arg0)
{
- u8 sp0[30];
- sub_8018404(sp0, arg0);
- return sub_800E540(ReadAsU16(arg0->unk.field_0.unk_00.playerTrainerId), sp0);
+ u8 name[30];
+ IntlConvPartnerUname7(name, arg0);
+ return PlayerHasMetTrainerBefore(ReadAsU16(arg0->gname_uname.gname.unk_00.playerTrainerId), name);
}
-s32 sub_80179D4(struct UnkStruct_Main0 *arg0, u8 arg1, u8 arg2, u32 playerGender)
+static s32 UnionRoomGetPlayerInteractionResponse(struct UnkStruct_Main0 *main0, bool8 overrideGender, u8 playerIdx, u32 playerGender)
{
- bool32 r2;
+ bool32 metBefore;
- struct UnkStruct_x20 * r5 = &arg0->arr[arg2];
+ struct UnkStruct_x20 * r5 = &main0->arr[playerIdx];
- if (!r5->unk.field_0.started && arg1 == 0)
+ if (!r5->gname_uname.gname.started && !overrideGender)
{
- sub_8018404(gStringVar1, r5);
- r2 = sub_800E540(ReadAsU16(r5->unk.field_0.unk_00.playerTrainerId), gStringVar1);
- if (r5->unk.field_0.activity == 0x45)
+ IntlConvPartnerUname7(gStringVar1, r5);
+ metBefore = PlayerHasMetTrainerBefore(ReadAsU16(r5->gname_uname.gname.unk_00.playerTrainerId), gStringVar1);
+ if (r5->gname_uname.gname.activity == (ACTIVITY_CHAT | IN_UNION_ROOM))
{
- StringExpandPlaceholders(gStringVar4, sJoinChatTexts[r2][playerGender]);
+ StringExpandPlaceholders(gStringVar4, sJoinChatTexts[metBefore][playerGender]);
return 2;
}
else
{
- sub_8017020(sCommunicatingWaitTexts[r2]);
+ UR_PrintFieldMessage(sCommunicatingWaitTexts[metBefore]);
return 1;
}
}
else
{
- sub_8018404(gStringVar1, r5);
- if (arg1 != 0)
+ IntlConvPartnerUname7(gStringVar1, r5);
+ if (overrideGender)
{
- playerGender = (r5->unk.field_0.unk_00.playerTrainerId[arg1 + 1] >> 3) & 1;
+ playerGender = (r5->gname_uname.gname.unk_00.playerTrainerId[overrideGender + 1] >> 3) & 1;
}
- switch (r5->unk.field_0.activity & 0x3F)
+ switch (r5->gname_uname.gname.activity & 0x3F)
{
- case 1:
- StringExpandPlaceholders(gStringVar4, sBattleReactionTexts[playerGender][Random() % 4]);
+ case ACTIVITY_BATTLE_SINGLE:
+ StringExpandPlaceholders(gStringVar4, sBattleReactionTexts[playerGender][Random() % ARRAY_COUNT(sBattleReactionTexts[0])]);
break;
- case 4:
+ case ACTIVITY_TRADE:
StringExpandPlaceholders(gStringVar4, sTradeReactionTexts[playerGender][Random() % 2]);
break;
- case 5:
- StringExpandPlaceholders(gStringVar4, sChatReactionTexts[playerGender][Random() % 4]);
+ case ACTIVITY_CHAT:
+ StringExpandPlaceholders(gStringVar4, sChatReactionTexts[playerGender][Random() % ARRAY_COUNT(sChatReactionTexts[0])]);
break;
- case 8:
- StringExpandPlaceholders(gStringVar4, sTrainerCardReactionTexts[playerGender][Random() % 2]);
+ case ACTIVITY_CARD:
+ StringExpandPlaceholders(gStringVar4, sTrainerCardReactionTexts[playerGender][Random() % ARRAY_COUNT(sTrainerCardReactionTexts[0])]);
break;
default:
StringExpandPlaceholders(gStringVar4, sText_TrainerAppearsBusy);
@@ -3903,73 +4067,73 @@ void nullsub_14(u8 windowId, s32 itemId, u8 y)
}
-void sub_8017B3C(u8 arg0, u8 arg1, struct GFtgtGname * arg2, const u8 * str, u8 arg4)
+static void TradeBoardPrintItemInfo(u8 windowId, u8 y, struct GFtgtGname * gname, const u8 * uname, u8 colorIdx)
{
- u8 sp8[4];
- u16 r8 = arg2->species;
- u8 r7 = arg2->type;
- u8 r9 = arg2->level;
+ u8 levelStr[4];
+ u16 species = gname->species;
+ u8 type = gname->type;
+ u8 level = gname->level;
- sub_80173E0(arg0, 1, str, 8, arg1, arg4);
- if (r8 == SPECIES_EGG)
+ UR_AddTextPrinterParameterized(windowId, 1, uname, 8, y, colorIdx);
+ if (species == SPECIES_EGG)
{
- sub_80173E0(arg0, 1, sText_EggTrade, 0x44, arg1, arg4);
+ UR_AddTextPrinterParameterized(windowId, 1, sText_EggTrade, 0x44, y, colorIdx);
}
else
{
- blit_move_info_icon(arg0, r7 + 1, 0x44, arg1);
- sub_80173E0(arg0, 1, gSpeciesNames[r8], 0x76, arg1, arg4);
- ConvertIntToDecimalStringN(sp8, r9, STR_CONV_MODE_RIGHT_ALIGN, 3);
- sub_80173E0(arg0, 1, sp8, 0xC6, arg1, arg4);
+ blit_move_info_icon(windowId, type + 1, 0x44, y);
+ UR_AddTextPrinterParameterized(windowId, 1, gSpeciesNames[species], 0x76, y, colorIdx);
+ ConvertIntToDecimalStringN(levelStr, level, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ UR_AddTextPrinterParameterized(windowId, 1, levelStr, 0xC6, y, colorIdx);
}
}
-void sub_8017BE8(u8 windowId, s32 itemId, u8 y)
+static void TradeBoardListMenuItemPrintFunc(u8 windowId, s32 itemId, u8 y)
{
- struct UnkStruct_Leader *leader = gUnknown_02022C30.leader;
+ struct WirelessLink_Leader *data = sWirelessLinkMain.leader;
struct GFtgtGname *rfu;
s32 i, j;
- u8 sp4[11];
+ u8 playerName[11];
- if (itemId == -3 && y == gUnknown_082F03A4.upText_Y)
+ if (itemId == -3 && y == sTradeBoardListMenuTemplate.upText_Y)
{
- rfu = sub_800F7DC();
+ rfu = GetHostRFUtgtGname();
if (rfu->species != SPECIES_NONE)
{
- sub_8017B3C(windowId, y, rfu, gSaveBlock2Ptr->playerName, 5);
+ TradeBoardPrintItemInfo(windowId, y, rfu, gSaveBlock2Ptr->playerName, 5);
}
}
else
{
j = 0;
- for (i = 0; i < 8; i++)
+ for (i = 0; i < (int)ARRAY_COUNT(data->field_0->arr); i++)
{
- if (leader->field_0->arr[i].field_1A_0 == 1 && leader->field_0->arr[i].unk.field_0.species != SPECIES_NONE)
+ if (data->field_0->arr[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN && data->field_0->arr[i].gname_uname.gname.species != SPECIES_NONE)
{
j++;
}
if (j == itemId + 1)
{
- sub_8018404(sp4, &leader->field_0->arr[i]);
- sub_8017B3C(windowId, y, &leader->field_0->arr[i].unk.field_0, sp4, 6);
+ IntlConvPartnerUname7(playerName, &data->field_0->arr[i]);
+ TradeBoardPrintItemInfo(windowId, y, &data->field_0->arr[i].gname_uname.gname, playerName, 6);
break;
}
}
}
}
-s32 sub_8017CB0(struct UnkStruct_x20 * arg, s32 arg1)
+static s32 GetIndexOfNthTradeBoardOffer(struct UnkStruct_x20 * arg, s32 n)
{
s32 i;
s32 j = 0;
for (i = 0; i < 8; i++)
{
- if (arg[i].field_1A_0 == 1 && arg[i].unk.field_0.species != SPECIES_NONE)
+ if (arg[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN && arg[i].gname_uname.gname.species != SPECIES_NONE)
{
j++;
}
- if (j == arg1 + 1)
+ if (j == n + 1)
{
return i;
}
@@ -3978,12 +4142,12 @@ s32 sub_8017CB0(struct UnkStruct_x20 * arg, s32 arg1)
return -1;
}
-s32 sub_8017CF8(s32 arg1, struct UnkStruct_Main0 *arg0)
+static s32 GetUnionRoomPlayerGender(s32 playerIdx, struct UnkStruct_Main0 *main0)
{
- return arg0->arr[arg1].unk.field_0.playerGender;
+ return main0->arr[playerIdx].gname_uname.gname.playerGender;
}
-s32 sub_8017D04(u32 type, u32 species)
+static s32 IsRequestedTypeOrEggInPlayerParty(u32 type, u32 species)
{
s32 i;
@@ -3994,10 +4158,10 @@ s32 sub_8017D04(u32 type, u32 species)
species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
if (species == SPECIES_EGG)
{
- return 0;
+ return UR_TRADE_MATCH;
}
}
- return 2;
+ return UR_TRADE_NOEGG;
}
else
{
@@ -4006,77 +4170,77 @@ s32 sub_8017D04(u32 type, u32 species)
species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
if (gBaseStats[species].type1 == type || gBaseStats[species].type2 == type)
{
- return 0;
+ return UR_TRADE_MATCH;
}
}
- return 1;
+ return UR_TRADE_NOTYPE;
}
}
-void sub_8017D9C(u8 *dst, s32 arg1, u32 playerGender)
+static void GetURoomActivityRejectMsg(u8 *dst, s32 acitivty, u32 playerGender)
{
- switch (arg1)
+ switch (acitivty)
{
- case 0x41:
+ case ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM:
StringExpandPlaceholders(dst, sBattleDeclinedTexts[playerGender]);
break;
- case 0x45:
+ case ACTIVITY_CHAT | IN_UNION_ROOM:
StringExpandPlaceholders(dst, sChatDeclinedTexts[playerGender]);
break;
- case 0x44:
+ case ACTIVITY_TRADE | IN_UNION_ROOM:
StringExpandPlaceholders(dst, sText_TradeOfferRejected);
break;
- case 0x48:
+ case ACTIVITY_CARD | IN_UNION_ROOM:
StringExpandPlaceholders(dst, sShowTrainerCardDeclinedTexts[playerGender]);
break;
}
}
-void sub_8017E00(u8 *dst, u8 arg1)
+static void GetURoomActivityStartMsg(u8 *dst, u8 acitivty)
{
u8 mpId = GetMultiplayerId();
u8 gender = gLinkPlayers[mpId ^ 1].gender;
- switch (arg1)
+ switch (acitivty)
{
- case 0x41:
+ case ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM:
StringCopy(dst, sStartActivityTexts[mpId][gender][0]);
break;
- case 0x44:
+ case ACTIVITY_TRADE | IN_UNION_ROOM:
StringCopy(dst, sStartActivityTexts[mpId][gender][2]);
break;
- case 0x45:
+ case ACTIVITY_CHAT | IN_UNION_ROOM:
StringCopy(dst, sStartActivityTexts[mpId][gender][1]);
break;
}
}
-s32 sub_8017EA0(u8 *dst, u32 gender, u16 *arg2, struct UnkStruct_URoom *arg3)
+static s32 GetChatLeaderActionRequestMessage(u8 *dst, u32 gender, u16 *activityData, struct WirelessLink_URoom *uroom)
{
s32 result = 0;
u16 species = SPECIES_NONE;
s32 i;
- switch (arg2[0])
+ switch (activityData[0])
{
- case 0x41:
+ case ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM:
StringExpandPlaceholders(dst, sText_BattleChallenge);
result = 1;
break;
- case 0x45:
+ case ACTIVITY_CHAT | IN_UNION_ROOM:
StringExpandPlaceholders(dst, sText_ChatInvitation);
result = 1;
break;
- case 0x44:
- ConvertIntToDecimalStringN(arg3->field_58 + 0x00, sUnionRoomTrade.playerLevel, STR_CONV_MODE_LEFT_ALIGN, 3);
- StringCopy(arg3->field_58 + 0x10, gSpeciesNames[sUnionRoomTrade.playerSpecies]);
- for (i = 0; i < 4; i++)
+ case ACTIVITY_TRADE | IN_UNION_ROOM:
+ ConvertIntToDecimalStringN(uroom->activityRequestStrbufs[0], sUnionRoomTrade.playerLevel, STR_CONV_MODE_LEFT_ALIGN, 3);
+ StringCopy(uroom->activityRequestStrbufs[1], gSpeciesNames[sUnionRoomTrade.playerSpecies]);
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
if (gRfuLinkStatus->partner[i].serialNo == 2)
{
- ConvertIntToDecimalStringN(arg3->field_58 + 0x20, arg2[2], STR_CONV_MODE_LEFT_ALIGN, 3);
- StringCopy(arg3->field_58 + 0x30, gSpeciesNames[arg2[1]]);
- species = arg2[1];
+ ConvertIntToDecimalStringN(uroom->activityRequestStrbufs[2], activityData[2], STR_CONV_MODE_LEFT_ALIGN, 3);
+ StringCopy(uroom->activityRequestStrbufs[3], gSpeciesNames[activityData[1]]);
+ species = activityData[1];
break;
}
}
@@ -4086,19 +4250,19 @@ s32 sub_8017EA0(u8 *dst, u32 gender, u16 *arg2, struct UnkStruct_URoom *arg3)
}
else
{
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(i, arg3->field_58 + 0x10 * i);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(i, uroom->activityRequestStrbufs[i]);
}
DynamicPlaceholderTextUtil_ExpandPlaceholders(dst, sText_OfferToTradeMon);
}
result = 1;
break;
- case 0x48:
+ case ACTIVITY_CARD | IN_UNION_ROOM:
StringExpandPlaceholders(dst, sText_ShowTrainerCard);
result = 1;
break;
- case 0x40:
+ case ACTIVITY_NONE | IN_UNION_ROOM:
StringExpandPlaceholders(dst, sText_ChatDropped);
result = 2;
break;
@@ -4107,18 +4271,18 @@ s32 sub_8017EA0(u8 *dst, u32 gender, u16 *arg2, struct UnkStruct_URoom *arg3)
return result;
}
-bool32 sub_8017FD8(struct UnkStruct_URoom *arg0)
+static bool32 PollPartnerYesNoResponse(struct WirelessLink_URoom *data)
{
if (gRecvCmds[0][1] != 0)
{
- if (gRecvCmds[0][1] == 0x51)
+ if (gRecvCmds[0][1] == (ACTIVITY_ACCEPT | IN_UNION_ROOM))
{
- arg0->field_98 = 0x51;
+ data->partnerYesNoResponse = ACTIVITY_ACCEPT | IN_UNION_ROOM;
return TRUE;
}
- else if (gRecvCmds[0][1] == 0x52)
+ else if (gRecvCmds[0][1] == (ACTIVITY_DECLINE | IN_UNION_ROOM))
{
- arg0->field_98 = 0x52;
+ data->partnerYesNoResponse = ACTIVITY_DECLINE | IN_UNION_ROOM;
return TRUE;
}
}
@@ -4132,7 +4296,7 @@ bool32 InUnionRoom(void)
? TRUE : FALSE;
}
-bool32 HasAtLeastTwoMonsOfLevel30OrLower(void)
+static bool32 HasAtLeastTwoMonsOfLevel30OrLower(void)
{
s32 i;
s32 count = 0;
@@ -4152,16 +4316,16 @@ bool32 HasAtLeastTwoMonsOfLevel30OrLower(void)
return FALSE;
}
-static void ResetUnionRoomTrade(struct UnionRoomTrade *arg0)
+static void ResetUnionRoomTrade(struct UnionRoomTrade *uroomTrade)
{
- arg0->field_0 = 0;
- arg0->type = 0;
- arg0->playerPersonality = 0;
- arg0->playerSpecies = 0;
- arg0->playerLevel = 0;
- arg0->species = 0;
- arg0->level = 0;
- arg0->personality = 0;
+ uroomTrade->state = URTRADE_STATE_NONE;
+ uroomTrade->type = 0;
+ uroomTrade->playerPersonality = 0;
+ uroomTrade->playerSpecies = 0;
+ uroomTrade->playerLevel = 0;
+ uroomTrade->species = 0;
+ uroomTrade->level = 0;
+ uroomTrade->personality = 0;
}
void Script_ResetUnionRoomTrade(void)
@@ -4228,36 +4392,36 @@ static u32 GetPartyPositionOfRegisteredMon(struct UnionRoomTrade *trade, u8 mult
return response;
}
-void sub_801818C(bool32 arg0)
+static void HandleCancelActivity(bool32 setData)
{
- sub_80173B0();
+ UR_ClearBg0();
ScriptContext2_Disable();
- sub_8098524();
- gUnknown_02022C2C = 0;
- if (arg0)
+ UnionRoom_UnlockPlayerAndChatPartner();
+ gPlayerCurrActivity = ACTIVITY_NONE;
+ if (setData)
{
- sub_8010FCC(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel);
- sub_8011090(0x40, 0, 0);
+ SetTradeBoardRegisteredMonInfo(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel);
+ UpdateGameData_SetActivity(ACTIVITY_NONE | IN_UNION_ROOM, 0, FALSE);
}
}
-void sub_80181CC(void)
+static void UR_EnableScriptContext2AndFreezeObjectEvents(void)
{
ScriptContext2_Enable();
ScriptFreezeObjectEvents();
}
-u8 sub_80181DC(struct UnkStruct_URoom *arg0)
+static u8 GetActivePartnerSpriteGenderParam(struct WirelessLink_URoom *data)
{
u8 retVal = 0x80;
u8 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < RFU_CHILD_MAX; i++)
{
- if (arg0->field_C->arr[i].unk18)
+ if (data->field_C->arr[i].active)
{
- retVal |= arg0->field_C->arr[i].unk0.field_0.playerGender << 3;
- retVal |= arg0->field_C->arr[i].unk0.field_0.unk_00.playerTrainerId[0] & 7;
+ retVal |= data->field_C->arr[i].gname_uname.gname.playerGender << 3;
+ retVal |= data->field_C->arr[i].gname_uname.gname.unk_00.playerTrainerId[0] & 7;
break;
}
}
@@ -4265,7 +4429,7 @@ u8 sub_80181DC(struct UnkStruct_URoom *arg0)
return retVal;
}
-void sub_8018220(u8 *unused, struct UnkStruct_URoom *arg1, bool8 arg2)
+static void ViewURoomPartnerTrainerCard(u8 *unused, struct WirelessLink_URoom *data, bool8 isParent)
{
struct TrainerCard *trainerCard = &gTrainerCards[GetMultiplayerId() ^ 1];
s32 i;
@@ -4273,67 +4437,67 @@ void sub_8018220(u8 *unused, struct UnkStruct_URoom *arg1, bool8 arg2)
DynamicPlaceholderTextUtil_Reset();
- StringCopy(arg1->field_C0[0], gTrainerClassNames[sub_8068BB0()]);
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, arg1->field_C0[0]);
+ StringCopy(data->trainerCardStrBuffer[0], gTrainerClassNames[GetUnionRoomTrainerClass()]);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, data->trainerCardStrBuffer[0]);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, trainerCard->playerName);
- StringCopy(arg1->field_174, sCardColorTexts[trainerCard->stars]);
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, arg1->field_174);
+ StringCopy(data->trainerCardColorStrBuffer, sCardColorTexts[trainerCard->stars]);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, data->trainerCardColorStrBuffer);
- ConvertIntToDecimalStringN(arg1->field_C0[2], trainerCard->caughtMonsCount, STR_CONV_MODE_LEFT_ALIGN, 3);
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, arg1->field_C0[2]);
+ ConvertIntToDecimalStringN(data->trainerCardStrBuffer[2], trainerCard->caughtMonsCount, STR_CONV_MODE_LEFT_ALIGN, 3);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, data->trainerCardStrBuffer[2]);
- ConvertIntToDecimalStringN(arg1->field_C0[3], trainerCard->playTimeHours, STR_CONV_MODE_LEFT_ALIGN, 3);
- ConvertIntToDecimalStringN(arg1->field_C0[4], trainerCard->playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2);
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, arg1->field_C0[3]);
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(5, arg1->field_C0[4]);
+ ConvertIntToDecimalStringN(data->trainerCardStrBuffer[3], trainerCard->playTimeHours, STR_CONV_MODE_LEFT_ALIGN, 3);
+ ConvertIntToDecimalStringN(data->trainerCardStrBuffer[4], trainerCard->playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, data->trainerCardStrBuffer[3]);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(5, data->trainerCardStrBuffer[4]);
- DynamicPlaceholderTextUtil_ExpandPlaceholders(arg1->field_1A4, sText_TrainerCardInfoPage1);
- StringCopy(gStringVar4, arg1->field_1A4);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(data->trainerCardMsgStrBuffer, sText_TrainerCardInfoPage1);
+ StringCopy(gStringVar4, data->trainerCardMsgStrBuffer);
n = trainerCard->linkBattleWins;
if (n > 9999)
{
n = 9999;
}
- ConvertIntToDecimalStringN(arg1->field_C0[0], n, STR_CONV_MODE_LEFT_ALIGN, 4);
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, arg1->field_C0[0]);
+ ConvertIntToDecimalStringN(data->trainerCardStrBuffer[0], n, STR_CONV_MODE_LEFT_ALIGN, 4);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, data->trainerCardStrBuffer[0]);
n = trainerCard->linkBattleLosses;
if (n > 9999)
{
n = 9999;
}
- ConvertIntToDecimalStringN(arg1->field_C0[1], n, STR_CONV_MODE_LEFT_ALIGN, 4);
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, arg1->field_C0[1]);
+ ConvertIntToDecimalStringN(data->trainerCardStrBuffer[1], n, STR_CONV_MODE_LEFT_ALIGN, 4);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, data->trainerCardStrBuffer[1]);
- ConvertIntToDecimalStringN(arg1->field_C0[2], trainerCard->pokemonTrades, STR_CONV_MODE_LEFT_ALIGN, 5);
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, arg1->field_C0[2]);
+ ConvertIntToDecimalStringN(data->trainerCardStrBuffer[2], trainerCard->pokemonTrades, STR_CONV_MODE_LEFT_ALIGN, 5);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, data->trainerCardStrBuffer[2]);
for (i = 0; i < TRAINER_CARD_PROFILE_LENGTH; i++)
{
- CopyEasyChatWord(arg1->field_C0[i + 3], trainerCard->easyChatProfile[i]);
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(i + 4, arg1->field_C0[i + 3]);
+ CopyEasyChatWord(data->trainerCardStrBuffer[i + 3], trainerCard->easyChatProfile[i]);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(i + 4, data->trainerCardStrBuffer[i + 3]);
}
- DynamicPlaceholderTextUtil_ExpandPlaceholders(arg1->field_1A4, sText_TrainerCardInfoPage2);
- StringAppend(gStringVar4, arg1->field_1A4);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(data->trainerCardMsgStrBuffer, sText_TrainerCardInfoPage2);
+ StringAppend(gStringVar4, data->trainerCardMsgStrBuffer);
- if (arg2 == TRUE)
+ if (isParent == TRUE)
{
- DynamicPlaceholderTextUtil_ExpandPlaceholders(arg1->field_1A4, sText_FinishedCheckingPlayersTrainerCard);
- StringAppend(gStringVar4, arg1->field_1A4);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(data->trainerCardMsgStrBuffer, sText_FinishedCheckingPlayersTrainerCard);
+ StringAppend(gStringVar4, data->trainerCardMsgStrBuffer);
}
- else if (arg2 == FALSE)
+ else if (isParent == FALSE)
{
- DynamicPlaceholderTextUtil_ExpandPlaceholders(arg1->field_1A4, sGladToMeetYouTexts[trainerCard->gender]);
- StringAppend(gStringVar4, arg1->field_1A4);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(data->trainerCardMsgStrBuffer, sGladToMeetYouTexts[trainerCard->gender]);
+ StringAppend(gStringVar4, data->trainerCardMsgStrBuffer);
}
}
-void sub_8018404(u8 *dest, struct UnkStruct_x20 *arg1)
+static void IntlConvPartnerUname7(u8 *dest, struct UnkStruct_x20 *arg1)
{
- StringCopy7(dest, arg1->unk.playerName);
- ConvertInternationalString(dest, arg1->unk.field_0.unk_00.language);
+ StringCopy7(dest, arg1->gname_uname.playerName);
+ ConvertInternationalString(dest, arg1->gname_uname.gname.unk_00.language);
}
diff --git a/src/union_room_battle.c b/src/union_room_battle.c
index d2c3a5cd0..4b2aa0bb1 100644
--- a/src/union_room_battle.c
+++ b/src/union_room_battle.c
@@ -11,134 +11,24 @@
#include "window.h"
#include "text_window.h"
#include "scanline_effect.h"
-#include "m4a.h"
-#include "dynamic_placeholder_text_util.h"
#include "overworld.h"
#include "strings.h"
-#include "string_util.h"
-#include "international_string_util.h"
-#include "sound.h"
-#include "constants/songs.h"
#include "party_menu.h"
#include "battle_setup.h"
#include "link.h"
#include "union_room.h"
#include "union_room_battle.h"
+#include "constants/rgb.h"
+#include "constants/trainers.h"
-struct UnkStruct_3000DAC
+struct UnionRoomBattle
{
- /*0x00*/ u32 unk00[4];
- /*0x10*/ u32 unk10[4];
- /*0x20*/ u32 unk20[16];
- /*0x60*/ u8 taskId;
- /*0x61*/ u8 unk61;
- /*0x62*/ u8 filler_62[10];
+ s16 textState;
};
-struct UnkStruct_2022C6C
-{
- s16 a0;
-};
-
-static struct UnkStruct_3000DAC * gUnknown_03000DAC;
-
-EWRAM_DATA struct UnkStruct_2022C6C * gUnknown_02022C6C = NULL;
-
-void sub_801A43C(void);
-void sub_801A6C0(u8 taskId);
-static void sub_801A8B0(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 mode);
-bool32 sub_801AA30(u32 * a0, u32 * a1, u32 * a2, u8 taskId);
-
-const u16 gWirelessInfoScreenPal[] = INCBIN_U16("graphics/interface/wireless_info_screen.gbapal");
-const u32 gWirelessInfoScreenGfx[] = INCBIN_U32("graphics/interface/wireless_info_screen.4bpp.lz");
-const u32 gWirelessInfoScreenTilemap[] = INCBIN_U32("graphics/interface/wireless_info_screen.bin.lz");
-
-const struct BgTemplate gUnknown_082F0D34[] = {
- {
- .bg = 0,
- .charBaseIndex = 2,
- .mapBaseIndex = 0x1F,
- .priority = 0
- }, {
- .bg = 1,
- .charBaseIndex = 0,
- .mapBaseIndex = 0x08,
- .priority = 1
- }
-};
-
-const struct WindowTemplate gUnknown_082F0D3C[] = {
- {
- .bg = 0x00,
- .tilemapLeft = 0x03,
- .tilemapTop = 0x00,
- .width = 0x18,
- .height = 0x03,
- .paletteNum = 0x0f,
- .baseBlock = 0x0001
- }, {
- .bg = 0x00,
- .tilemapLeft = 0x03,
- .tilemapTop = 0x04,
- .width = 0x15,
- .height = 0x0f,
- .paletteNum = 0x0f,
- .baseBlock = 0x0049
- }, {
- .bg = 0x00,
- .tilemapLeft = 0x18,
- .tilemapTop = 0x04,
- .width = 0x03,
- .height = 0x0f,
- .paletteNum = 0x0f,
- .baseBlock = 0x0184
- },
- { 0xFF }
-};
+static EWRAM_DATA struct UnionRoomBattle * sBattle = NULL;
-const u8 *const gUnknown_082F0D5C[] = {
- gText_WirelessCommStatus,
- gText_PeopleTrading,
- gText_PeopleBattling,
- gText_PeopleInUnionRoom,
- gText_PeopleCommunicating
-};
-
-const u8 gUnknown_082F0D70[][3] = {
- {0x01, 0x01, 0x02},
- {0x02, 0x01, 0x02},
- {0x03, 0x01, 0x04},
- {0x04, 0x00, 0x02},
- {0x06, 0x03, 0x02},
- {0x07, 0x03, 0x02},
- {0x09, 0x03, 0x00},
- {0x0a, 0x03, 0x00},
- {0x0b, 0x03, 0x00},
- {0x0c, 0xff, 0x00},
- {0x0d, 0x00, 0x00},
- {0x10, 0x03, 0x00},
- {0x0f, 0x03, 0x00},
- {0x40, 0x02, 0x01},
- {0x41, 0x02, 0x02},
- {0x44, 0x02, 0x02},
- {0x45, 0x02, 0x00},
- {0x48, 0x02, 0x02},
- {0x54, 0x02, 0x01},
- {0x53, 0x02, 0x02},
- {0x51, 0x02, 0x01},
- {0x52, 0x02, 0x01},
- {0x15, 0x03, 0x02},
- {0x16, 0x03, 0x02},
- {0x17, 0x03, 0x00},
- {0x18, 0x03, 0x00},
- {0x19, 0x03, 0x00},
- {0x1a, 0x03, 0x00},
- {0x1b, 0x03, 0x00},
- {0x1c, 0x01, 0x02},
- {0x0e, 0x01, 0x02}
-};
-
-const struct BgTemplate gUnknown_082F0DD0[] = {
+static const struct BgTemplate sBgTemplates[] = {
{
.bg = 0,
.charBaseIndex = 3,
@@ -146,7 +36,7 @@ const struct BgTemplate gUnknown_082F0DD0[] = {
}
};
-const struct WindowTemplate gUnknown_082F0DD4[] = {
+static const struct WindowTemplate sWindowTemplates[] = {
{
.bg = 0,
.tilemapLeft = 3,
@@ -156,301 +46,15 @@ const struct WindowTemplate gUnknown_082F0DD4[] = {
.paletteNum = 0xE,
.baseBlock = 0x014
},
- { 0xFF }
+ DUMMY_WIN_TEMPLATE
};
-const u8 gUnknown_082F0DE4[] = { 1, 2, 3 };
-
-void sub_801A3F4(void)
-{
- if (!IsDma3ManagerBusyWithBgCopy())
- {
- RunTasks();
- RunTextPrinters();
- AnimateSprites();
- BuildOamBuffer();
- UpdatePaletteFade();
- }
-}
-
-void sub_801A418(void)
-{
- LoadOam();
- ProcessSpriteCopyRequests();
- TransferPlttBuffer();
-}
-
-void sub_801A42C(void)
-{
- SetMainCallback2(sub_801A43C);
-}
-
-void sub_801A43C(void)
-{
- SetGpuReg(REG_OFFSET_DISPCNT, 0x0000);
- gUnknown_03000DAC = AllocZeroed(sizeof(struct UnkStruct_3000DAC));
- SetVBlankCallback(NULL);
- ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, gUnknown_082F0D34, ARRAY_COUNT(gUnknown_082F0D34));
- SetBgTilemapBuffer(1, Alloc(0x800));
- SetBgTilemapBuffer(0, Alloc(0x800));
- DecompressAndLoadBgGfxUsingHeap(1, gWirelessInfoScreenGfx, 0, 0, 0);
- CopyToBgTilemapBuffer(1, gWirelessInfoScreenTilemap, 0, 0);
- InitWindows(gUnknown_082F0D3C);
- DeactivateAllTextPrinters();
- ResetPaletteFade();
- ResetSpriteData();
- ResetTasks();
- ScanlineEffect_Stop();
- m4aSoundVSyncOn();
- SetVBlankCallback(sub_801A418);
- gUnknown_03000DAC->taskId = CreateTask(sub_801A6C0, 0);
- gUnknown_03000DAC->unk61 = sub_8013C40();
- gUnknown_03000DAC->unk10[3] = 1;
- ChangeBgX(0, 0, 0);
- ChangeBgY(0, 0, 0);
- ChangeBgX(1, 0, 0);
- ChangeBgY(1, 0, 0);
- LoadPalette(gWirelessInfoScreenPal, 0x00, 0x20);
- Menu_LoadStdPalAt(0xF0);
- DynamicPlaceholderTextUtil_Reset();
- FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 0x0F);
- CopyBgTilemapBufferToVram(1);
- SetMainCallback2(sub_801A3F4);
- RunTasks();
- RunTextPrinters();
- AnimateSprites();
- BuildOamBuffer();
- UpdatePaletteFade();
-}
-
-void sub_801A584(void)
-{
- s32 i;
- FreeAllWindowBuffers();
- for (i = 0; i < 2; i++)
- {
- Free(GetBgTilemapBuffer(i));
- }
- Free(gUnknown_03000DAC);
- SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
-}
-
-void sub_801A5BC(s16 * a0, s16 * a1)
-{
- if (++(*a0) > 5)
- {
- if (++(*a1) == 14)
- {
- *a1 = 0;
- }
- *a0 = 0;
- }
- LoadPalette(gWirelessInfoScreenPal + 16 * (*a1 + 2), 0, 0x10);
-}
+static const u8 sTextColors[] = { TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY };
-void sub_801A600(void)
+static void CB2_SetUpPartiesAndStartBattle(void)
{
s32 i;
- FillWindowPixelBuffer(0, 0);
- FillWindowPixelBuffer(1, 0);
- FillWindowPixelBuffer(2, 0);
- sub_801A8B0(0, 1, gUnknown_082F0D5C[0], GetStringCenterAlignXOffset(1, gUnknown_082F0D5C[0], 0xC0), 6, 3);
- for (i = 0; i < 3; i++)
- {
- sub_801A8B0(1, 1, gUnknown_082F0D5C[i + 1], 0, 30 * i + 8, 1);
- }
- sub_801A8B0(1, 1, gUnknown_082F0D5C[i + 1], 0, 30 * i + 8, 2);
- PutWindowTilemap(0);
- CopyWindowToVram(0, 2);
- PutWindowTilemap(1);
- CopyWindowToVram(1, 2);
-}
-
-void sub_801A6C0(u8 taskId)
-{
- s32 i;
- switch (gTasks[taskId].data[0])
- {
- case 0:
- sub_801A600();
- gTasks[taskId].data[0]++;
- break;
- case 1:
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
- ShowBg(1);
- CopyBgTilemapBufferToVram(0);
- ShowBg(0);
- gTasks[taskId].data[0]++;
- break;
- case 2:
- if (!gPaletteFade.active)
- {
- gTasks[taskId].data[0]++;
- }
- break;
- case 3:
- if (sub_801AA30(gUnknown_03000DAC->unk00, gUnknown_03000DAC->unk10, gUnknown_03000DAC->unk20, gUnknown_03000DAC->unk61))
- {
- FillWindowPixelBuffer(2, 0);
- for (i = 0; i < 4; i++)
- {
- ConvertIntToDecimalStringN(gStringVar4, gUnknown_03000DAC->unk00[i], STR_CONV_MODE_RIGHT_ALIGN, 2);
- if (i != 3)
- {
- sub_801A8B0(2, 1, gStringVar4, 12, 30 * i + 8, 1);
- }
- else
- {
- sub_801A8B0(2, 1, gStringVar4, 12, 98, 2);
- }
- }
- PutWindowTilemap(2);
- CopyWindowToVram(2, 3);
- }
- if (({gMain.newKeys & A_BUTTON;}) || ({gMain.newKeys & B_BUTTON;}))
- {
- PlaySE(SE_SELECT);
- gTasks[gUnknown_03000DAC->unk61].data[15] = 0xFF;
- gTasks[taskId].data[0]++;
- }
- sub_801A5BC(&gTasks[taskId].data[7], &gTasks[taskId].data[8]);
- break;
- case 4:
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
- gTasks[taskId].data[0]++;
- break;
- case 5:
- if (!gPaletteFade.active)
- {
- SetMainCallback2(sub_801A584);
- DestroyTask(taskId);
- }
- break;
- }
-}
-
-static void sub_801A8B0(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 mode)
-{
- u8 color[3];
-
- switch (mode)
- {
- case 0:
- color[0] = 0;
- color[1] = 2;
- color[2] = 3;
- break;
- case 1:
- color[0] = 0;
- color[1] = 1;
- color[2] = 3;
- break;
- case 2:
- color[0] = 0;
- color[1] = 4;
- color[2] = 5;
- break;
- case 3:
- color[0] = 0;
- color[1] = 7;
- color[2] = 6;
- break;
- case 4:
- color[0] = 0;
- color[1] = 1;
- color[2] = 2;
- break;
- }
-
- AddTextPrinterParameterized4(windowId, fontId, x, y, 0, 0, color, -1, str);
-}
-
-u32 sub_801A960(struct UnkStruct_x20 * a0, u32 * a1)
-{
- s32 i, j, r2;
- u32 result = a0->unk.field_0.activity;
-
- for (i = 0; i < (unsigned)ARRAY_COUNT(gUnknown_082F0D70); i++)
- {
- if (result != gUnknown_082F0D70[i][0])
- {
- continue;
- }
- if (a0->field_1A_0 != 1)
- {
- continue;
- }
- if (gUnknown_082F0D70[i][2] == 0)
- {
- r2 = 0;
- for (j = 0; j < 4; j++)
- {
- if (a0->unk.field_0.child_sprite_gender[j] != 0)
- {
- r2++;
- }
- }
- r2++;
- a1[gUnknown_082F0D70[i][1]] += r2;
- }
- else
- {
- a1[gUnknown_082F0D70[i][1]] += gUnknown_082F0D70[i][2];
- }
- }
- return result;
-}
-
-bool32 sub_801AA08(u32 * a0, u32 * a1)
-{
- s32 i;
- for (i = 0; i < 4; i++)
- {
- if (a0[i] != a1[i])
- {
- return TRUE;
- }
- }
- return FALSE;
-}
-
-bool32 sub_801AA30(u32 * a0, u32 * a1, u32 * a2, u8 taskId)
-{
- bool32 r8 = FALSE;
- u32 sp0[4] = {0, 0, 0, 0};
- struct UnkStruct_x20 ** data = (void *)gTasks[taskId].data;
- s32 i;
-
- for (i = 0; i < 16; i++)
- {
- u32 r1 = sub_801A960(&(*data)[i], sp0);
- if (r1 != a2[i])
- {
- a2[i] = r1;
- r8 = TRUE;
- }
- }
- if (sub_801AA08(sp0, a1) == 0)
- {
- if (r8 != TRUE)
- {
- return FALSE;
- }
- }
- else
- {
- memcpy(a0, sp0, sizeof(sp0));
- memcpy(a1, sp0, sizeof(sp0));
- a0[3] = a0[0] + a0[1] + a0[2] + a0[3];
- }
- return TRUE;
-}
-
-void sub_801AAD4(void)
-{
- s32 i;
- sub_8014210(10);
+ StartUnionRoomBattle(BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER);
for (i = 0; i < UNION_ROOM_PARTY_SIZE; i++)
{
gEnemyParty[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1];
@@ -465,25 +69,25 @@ void sub_801AAD4(void)
}
IncrementGameStat(GAME_STAT_NUM_UNION_ROOM_BATTLES);
CalculatePlayerPartyCount();
- gTrainerBattleOpponent_A = 0xC00;
+ gTrainerBattleOpponent_A = TRAINER_UNION_ROOM;
SetMainCallback2(CB2_InitBattle);
}
-void sub_801AB68(u8 windowId, const u8 * str, u8 x, u8 y, s32 speed)
+static void AddTextPrinterForUnionRoomBattle(u8 windowId, const u8 * str, u8 x, u8 y, s32 speed)
{
s32 letterSpacing = 0;
s32 lineSpacing = 1;
- FillWindowPixelBuffer(windowId, (gUnknown_082F0DE4[0] << 4) | gUnknown_082F0DE4[0]);
- AddTextPrinterParameterized4(windowId, 1, x, y, letterSpacing, lineSpacing, gUnknown_082F0DE4, speed, str);
+ FillWindowPixelBuffer(windowId, (sTextColors[0] << 4) | sTextColors[0]);
+ AddTextPrinterParameterized4(windowId, 1, x, y, letterSpacing, lineSpacing, sTextColors, speed, str);
}
-bool32 sub_801ABDC(s16 * state, const u8 * str, s32 speed)
+static bool32 PrintUnionRoomBattleMessage(s16 * state, const u8 * str, s32 speed)
{
switch (*state)
{
case 0:
DrawTextBorderOuter(0, 0x001, 0xD);
- sub_801AB68(0, str, 0, 1, speed);
+ AddTextPrinterForUnionRoomBattle(0, str, 0, 1, speed);
PutWindowTilemap(0);
CopyWindowToVram(0, 3);
(*state)++;
@@ -499,49 +103,47 @@ bool32 sub_801ABDC(s16 * state, const u8 * str, s32 speed)
return FALSE;
}
-void sub_801AC40(void)
+static void VBlankCB_UnionRoomBattle(void)
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
-void sub_801AC54(void)
+void CB2_UnionRoomBattle(void)
{
switch (gMain.state)
{
case 0:
SetGpuReg(REG_OFFSET_DISPCNT, 0x0000);
- gUnknown_02022C6C = AllocZeroed(4);
+ sBattle = AllocZeroed(sizeof(struct UnionRoomBattle));
ResetSpriteData();
FreeAllSpritePalettes();
ResetTasks();
ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, gUnknown_082F0DD0, 1);
+ InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));
ResetTempTileDataBuffers();
- if (!InitWindows(gUnknown_082F0DD4))
- {
+ if (!InitWindows(sWindowTemplates))
return;
- }
DeactivateAllTextPrinters();
ClearWindowTilemap(0);
- FillWindowPixelBuffer(0, 0x00);
- FillWindowPixelBuffer(0, 0x11);
+ FillWindowPixelBuffer(0, PIXEL_FILL(0));
+ FillWindowPixelBuffer(0, PIXEL_FILL(1));
FillBgTilemapBufferRect(0, 0, 0, 0, 30, 20, 0xF);
LoadUserWindowBorderGfx(0, 1, 0xD0);
LoadUserWindowBorderGfx_(0, 1, 0xD0);
sub_819789C();
- SetVBlankCallback(sub_801AC40);
+ SetVBlankCallback(VBlankCB_UnionRoomBattle);
gMain.state++;
break;
case 1:
- if (sub_801ABDC(&gUnknown_02022C6C->a0, gText_CommStandbyAwaitingOtherPlayer, 0))
+ if (PrintUnionRoomBattleMessage(&sBattle->textState, gText_CommStandbyAwaitingOtherPlayer, 0))
{
gMain.state++;
}
break;
case 2:
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
ShowBg(0);
gMain.state++;
break;
@@ -551,11 +153,11 @@ void sub_801AC54(void)
memset(gBlockSendBuffer, 0, 0x20);
if (gSelectedOrderFromParty[0] == -gSelectedOrderFromParty[1])
{
- gBlockSendBuffer[0] = 0x52;
+ gBlockSendBuffer[0] = ACTIVITY_DECLINE | IN_UNION_ROOM;
}
else
{
- gBlockSendBuffer[0] = 0x51;
+ gBlockSendBuffer[0] = ACTIVITY_ACCEPT | IN_UNION_ROOM;
}
SendBlock(0, gBlockSendBuffer, 0x20);
gMain.state++;
@@ -564,15 +166,16 @@ void sub_801AC54(void)
case 4:
if (GetBlockReceivedStatus() == 3)
{
- if (gBlockRecvBuffer[0][0] == 0x51 && gBlockRecvBuffer[1][0] == 0x51)
+ if (gBlockRecvBuffer[0][0] == (ACTIVITY_ACCEPT | IN_UNION_ROOM)
+ && gBlockRecvBuffer[1][0] == (ACTIVITY_ACCEPT | IN_UNION_ROOM))
{
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
gMain.state = 50;
}
else
{
sub_800AC34();
- if (gBlockRecvBuffer[GetMultiplayerId()][0] == 0x52)
+ if (gBlockRecvBuffer[GetMultiplayerId()][0] == (ACTIVITY_DECLINE | IN_UNION_ROOM))
{
gMain.state = 6;
}
@@ -594,29 +197,29 @@ void sub_801AC54(void)
case 51:
if (IsLinkTaskFinished())
{
- SetMainCallback2(sub_801AAD4);
+ SetMainCallback2(CB2_SetUpPartiesAndStartBattle);
}
break;
case 6:
- if (gReceivedRemoteLinkPlayers == 0)
+ if (!gReceivedRemoteLinkPlayers)
{
gMain.state++;
}
break;
case 7:
- if (sub_801ABDC(&gUnknown_02022C6C->a0, gText_RefusedBattle, 1))
+ if (PrintUnionRoomBattleMessage(&sBattle->textState, gText_RefusedBattle, 1))
{
SetMainCallback2(CB2_ReturnToField);
}
break;
case 8:
- if (gReceivedRemoteLinkPlayers == 0)
+ if (!gReceivedRemoteLinkPlayers)
{
gMain.state++;
}
break;
case 9:
- if (sub_801ABDC(&gUnknown_02022C6C->a0, gText_BattleWasRefused, 1))
+ if (PrintUnionRoomBattleMessage(&sBattle->textState, gText_BattleWasRefused, 1))
{
SetMainCallback2(CB2_ReturnToField);
}
diff --git a/src/union_room_chat.c b/src/union_room_chat.c
index 16d05d0ef..fefb285a8 100755
--- a/src/union_room_chat.c
+++ b/src/union_room_chat.c
@@ -27,256 +27,446 @@
#include "constants/rgb.h"
#include "constants/songs.h"
+enum
+{
+ UNION_ROOM_KB_PAGE_UPPER,
+ UNION_ROOM_KB_PAGE_LOWER,
+ UNION_ROOM_KB_PAGE_EMOJI,
+ UNION_ROOM_KB_PAGE_REGISTER,
+ UNION_ROOM_KB_PAGE_COUNT,
+};
+
+#define MAX_MESSAGE_LENGTH 15
+
+enum {
+ CHAT_MESSAGE_NONE,
+ CHAT_MESSAGE_CHAT,
+ CHAT_MESSAGE_JOIN,
+ CHAT_MESSAGE_LEAVE,
+ CHAT_MESSAGE_DROP,
+ CHAT_MESSAGE_DISBAND,
+};
+
+enum {
+ STDMESSAGE_QUIT_CHATTING,
+ STDMESSAGE_REGISTER_WHERE,
+ STDMESSAGE_REGISTER_HERE,
+ STDMESSAGE_INPUT_TEXT,
+ STDMESSAGE_EXITING_CHAT,
+ STDMESSAGE_LEADER_LEFT,
+ STDMESSAGE_ASK_SAVE,
+ STDMESSAGE_ASK_OVERWRITE,
+ STDMESSAGE_SAVING_NO_OFF,
+ STDMESSAGE_SAVED_THE_GAME,
+ STDMESSAGE_WARN_LEADER_LEAVE,
+};
+
+enum {
+ CHAT_FUNC_JOIN,
+ CHAT_FUNC_HANDLE_INPUT,
+ CHAT_FUNC_SWITCH,
+ CHAT_FUNC_ASK_QUIT,
+ CHAT_FUNC_SEND,
+ CHAT_FUNC_REGISTER,
+ CHAT_FUNC_EXIT,
+ CHAT_FUNC_DROP,
+ CHAT_FUNC_DISBANDED,
+ CHAT_FUNC_SAVE_AND_EXIT,
+};
+
+enum {
+ CHATDISPLAY_FUNC_LOAD_GFX,
+ CHATDISPLAY_FUNC_MOVE_KB_CURSOR,
+ CHATDISPLAY_FUNC_CURSOR_BLINK,
+ CHATDISPLAY_FUNC_SHOW_KB_SWAP_MENU,
+ CHATDISPLAY_FUNC_HIDE_KB_SWAP_MENU,
+ CHATDISPLAY_FUNC_SWITCH_PAGES,
+ CHATDISPLAY_FUNC_ASK_QUIT_CHATTING,
+ CHATDISPLAY_FUNC_DESTROY_YESNO,
+ CHATDISPLAY_FUNC_UPDATE_MSG,
+ CHATDISPLAY_FUNC_ASK_REGISTER_TEXT,
+ CHATDISPLAY_FUNC_CANCEL_REGISTER,
+ CHATDISPLAY_FUNC_RETURN_TO_KB,
+ CHATDISPLAY_FUNC_SCROLL_CHAT,
+ CHATDISPLAY_FUNC_PRINT_INPUT_TEXT,
+ CHATDISPLAY_FUNC_ASK_SAVE,
+ CHATDISPLAY_FUNC_ASK_OVERWRITE_SAVE,
+ CHATDISPLAY_FUNC_PRINT_SAVING,
+ CHATDISPLAY_FUNC_PRINT_SAVED_GAME,
+ CHATDISPLAY_FUNC_PRINT_EXITING_CHAT,
+ CHATDISPLAY_FUNC_PRINT_LEADER_LEFT,
+ CHATDISPLAY_FUNC_ASK_CONFIRM_LEADER_LEAVE,
+};
+
+enum {
+ CHAT_EXIT_NONE,
+ CHAT_EXIT_ONLY_LEADER,
+ CHAT_EXIT_DROPPED,
+ CHAT_EXIT_DISBANDED,
+};
+
struct UnionRoomChat
{
- u8 filler0[0x4];
- u16 unk4;
- u16 unk6;
- u8 filler8[0x2];
- u16 unkA;
- u8 fillerC[0x1];
- u8 unkD;
- u8 unkE;
- u8 unkF;
+ u32 filler1;
+ u16 funcId;
+ u16 funcState;
+ u16 filler2;
+ u16 exitDelayTimer;
+ u8 filler3;
+ u8 linkPlayerCount;
+ u8 handleInputTask;
+ u8 receiveMessagesTask;
u8 currentPage;
- u8 unk11;
+ u8 currentCol;
u8 currentRow;
- u8 unk13;
- u8 unk14;
- u8 unk15;
- u8 unk16;
- u8 unk17;
- u8 unk18;
- u8 unk19;
- u8 unk1A[0x1F];
- u8 unk39[0x40];
- u8 unk79[0x40];
- u8 unkB9[UNION_ROOM_KB_ROW_COUNT][21];
- u8 filler18B[0x5];
- u8 unk190[0x28];
- u16 unk1B8;
+ u8 multiplayerId;
+ u8 lastBufferCursorPos;
+ u8 bufferCursorPos;
+ u8 receivedPlayerIndex;
+ u8 exitType;
+ bool8 changedRegisteredTexts;
+ u8 afterSaveTimer;
+ u8 messageEntryBuffer[2 * MAX_MESSAGE_LENGTH + 1];
+ u8 receivedMessage[64];
+ u8 hostName[64];
+ u8 registeredTexts[UNION_ROOM_KB_ROW_COUNT][21];
+ u8 filler4[5];
+ u8 sendMessageBuffer[40];
+ u16 tryQuitAgainTimer;
};
-struct UnionRoomChat2_Unk0
+struct UnionRoomChatDisplay_Subtask
{
- bool32 (* unk0)(u8 *);
- u8 unk4;
- u8 unk5;
+ bool32 (* callback)(u8 *);
+ bool8 active;
+ u8 state;
};
-struct UnionRoomChat2
-{
- struct UnionRoomChat2_Unk0 unk0[3];
- u16 unk18;
- u16 unk1A;
- u16 unk1C;
- u16 unk1E;
- s16 unk20;
- u8 unk22[0x106];
- u8 unk128[BG_SCREEN_SIZE];
- u8 unk928[BG_SCREEN_SIZE];
- u8 unk1128[BG_SCREEN_SIZE];
- u8 unk1928[BG_SCREEN_SIZE];
+struct UnionRoomChatDisplay
+{
+ struct UnionRoomChatDisplay_Subtask subtasks[3];
+ u16 yesNoMenuWindowId;
+ u16 currLine;
+ u16 scrollCount;
+ u16 messageWindowId;
+ s16 bg1hofs;
+ u8 expandedPlaceholdersBuffer[0x106];
+ u8 bg0Buffer[BG_SCREEN_SIZE];
+ u8 bg1Buffer[BG_SCREEN_SIZE];
+ u8 bg3Buffer[BG_SCREEN_SIZE];
+ u8 bg2Buffer[BG_SCREEN_SIZE];
u8 unk2128[0x20];
u8 unk2148[0x20];
};
-struct UnionRoomChat3
+struct UnionRoomChatSprites
{
- struct Sprite *unk0;
- struct Sprite *unk4;
- struct Sprite *unk8;
- struct Sprite *unkC;
- struct Sprite *unk10;
- u16 unk14;
+ struct Sprite *keyboardCursor;
+ struct Sprite *textEntryArrow;
+ struct Sprite *textEntryCursor;
+ struct Sprite *rButtonIcon;
+ struct Sprite *rButtonLabel;
+ u16 cursorBlinkTimer;
};
-struct Unk82F2C98
+struct SubtaskInfo
{
- u16 unk0;
- bool32 (* unk4)(u8 *);
+ u16 idx;
+ bool32 (* callback)(u8 *);
};
-struct Unk82F2D40
+struct MessageWindowInfo
{
- const u8 *unk0;
- u8 unk4;
- u8 unk5;
- u8 unk6;
- u8 unk7;
- u8 unk8;
- u8 unk9;
- u8 unkA;
+ const u8 *text;
+ u8 boxType;
+ u8 x;
+ u8 y;
+ u8 letterSpacing;
+ u8 lineSpacing;
+ bool8 hasPlaceholders;
+ bool8 useWiderBox;
};
-static void sub_801DDD0(struct UnionRoomChat *);
-static void c2_081284E0(void);
-static void sub_801DF20(void);
-static void sub_801DF38(void);
-static void sub_801DF54(u8 taskId);
-static void sub_801DFAC(void);
-static void sub_801E030(void);
-static void sub_801E120(void);
-static void sub_801E240(void);
-static void sub_801E460(void);
-static void sub_801E5C4(void);
-static void sub_801E668(void);
-static void sub_801E764(void);
-static void sub_801E838(void);
-static void sub_801E978(void);
-static void sub_801EBD4(u16);
-static bool32 sub_801EBE4(void);
-static void sub_801EC94(void);
-static void sub_801ED68(void);
-static void sub_801ED94(void);
-static bool32 sub_801EDC4(void);
-static void sub_801EDE0(void);
-static void sub_801EE10(void);
-static void sub_801EE2C(void);
-static u8 *sub_801EE84(void);
-static u8 *sub_801EEA8(void);
-static void sub_801EF1C(u8 *);
-static void sub_801EF24(u8 *);
-static void sub_801EF4C(u8 *);
-static void sub_801EF7C(u8 *);
-static void sub_801EFA8(u8 *);
-static void sub_801EFD0(u8 *);
-static u8 *sub_801F114(void);
-static void sub_801F2B4(u8 taskId);
-static bool8 sub_801F4D0(void);
-static bool32 sub_801F534(void);
-static void sub_801F544(void);
-static void sub_801F5B8(void);
-static void sub_801F5EC(u16, u8);
-static bool8 sub_801F644(u8);
-static s8 sub_801FF08(void);
-static bool32 sub_8020890(void);
-static void sub_8020770(void);
-static void sub_801F574(struct UnionRoomChat2 *);
-static void sub_801F580(void);
-static void sub_80208D0(void);
-static bool32 sub_801FDD8(u8 *);
-static void sub_8020480(void);
-static void sub_8020538(void);
-static void sub_8020584(void);
-static void sub_80205B4(void);
-static void sub_8020604(void);
+static void InitUnionRoomChat(struct UnionRoomChat *);
+static void CB2_LoadInterface(void);
+static void VBlankCB_UnionRoomChatMain(void);
+static void CB2_UnionRoomChatMain(void);
+static void Task_HandlePlayerInput(u8 taskId);
+static void Chat_Join(void);
+static void Chat_HandleInput(void);
+static void Chat_Switch(void);
+static void Chat_AskQuitChatting(void);
+static void Chat_Exit(void);
+static void Chat_Drop(void);
+static void Chat_Disbanded(void);
+static void Chat_SendMessage(void);
+static void Chat_Register(void);
+static void Chat_SaveAndExit(void);
+static void SetChatFunction(u16);
+static bool32 HandleDPadInput(void);
+static void AppendTextToMessage(void);
+static void DeleteLastMessageCharacter(void);
+static void SwitchCaseOfLastMessageCharacter(void);
+static bool32 ChatMessageIsNotEmpty(void);
+static void RegisterTextAtRow(void);
+static void ResetMessageEntryBuffer(void);
+static void SaveRegisteredTexts(void);
+static u8 *GetEndOfMessagePtr(void);
+static u8 *GetLastCharOfMessagePtr(void);
+static void PrepareSendBuffer_Null(u8 *);
+static void PrepareSendBuffer_Join(u8 *);
+static void PrepareSendBuffer_Chat(u8 *);
+static void PrepareSendBuffer_Leave(u8 *);
+static void PrepareSendBuffer_Drop(u8 *);
+static void PrepareSendBuffer_Disband(u8 *);
+static u8 *GetLimitedMessageStartPtr(void);
+static void Task_ReceiveChatMessage(u8 taskId);
+static bool8 TryAllocDisplay(void);
+static bool32 IsDisplaySubtask0Active(void);
+static void FreeDisplay(void);
+static void RunDisplaySubtasks(void);
+static void StartDisplaySubtask(u16, u8);
+static bool8 IsDisplaySubtaskActive(u8);
+static s8 ProcessMenuInput(void);
+static bool32 TryAllocSprites(void);
+static void InitScanlineEffect(void);
+static void InitDisplay(struct UnionRoomChatDisplay *);
+static void ResetDisplaySubtasks(void);
+static void FreeSprites(void);
+static void ResetGpuBgState(void);
+static void SetBgTilemapBuffers(void);
+static void ClearBg0(void);
+static void LoadChatWindowBorderGfx(void);
+static void LoadChatWindowGfx(void);
static void sub_8020680(void);
-static void sub_80206A4(void);
-static void sub_80206D0(void);
-static void sub_8020740(void);
-static void sub_80206E8(void);
-static void sub_80208E8(void);
-static void sub_8020A68(void);
-static void sub_8020B20(void);
-static void sub_80203B0(void);
-static void sub_802040C(void);
-static void sub_802091C(bool32);
+static void LoadChatMessagesWindow(void);
+static void LoadKeyboardWindow(void);
+static void LoadKeyboardSwapWindow(void);
+static void LoadTextEntryWindow(void);
+static void CreateKeyboardCursorSprite(void);
+static void CreateTextEntrySprites(void);
+static void CreateRButtonSprites(void);
+static void ShowKeyboardSwapMenu(void);
+static void HideKeyboardSwapMenu(void);
+static void SetKeyboardCursorInvisibility(bool32);
static bool32 sub_8020320(void);
-static void sub_80201A4(void);
+static void PrintCurrentKeyboardPage(void);
static bool32 sub_8020368(void);
-static void sub_802093C(void);
-static void sub_8020B80(void);
-static void sub_801FF18(int, u16);
-static void sub_801FDDC(u8, u8, u8);
-static void sub_8020094(void);
-static void sub_801FEBC(void);
-static void sub_80200C8(void);
-static void sub_801FEE4(void);
-static void sub_80200EC(u16, u16, u8);
-static void sub_8020118(u16, u8 *, u8, u8, u8);
-static void sub_80209AC(int);
-static void sub_8020420(u16, u8 *, u8);
-static void sub_80209E0(void);
-static bool32 sub_8020A1C(void);
+static void MoveKeyboardCursor(void);
+static void UpdateRButtonLabel(void);
+static void AddStdMessageWindow(int, u16);
+static void AddYesNoMenuAt(u8, u8, u8);
+static void HideStdMessageWindow(void);
+static void HideYesNoMenuWindow(void);
+static void DestroyStdMessageWindow(void);
+static void DestroyYesNoMenuWindow(void);
+static void FillTextEntryWindow(u16, u16, u8);
+static void DrawTextEntryMessage(u16, u8 *, u8, u8, u8);
+static void SetRegisteredTextPalette(bool32);
+static void PrintChatMessage(u16, u8 *, u8);
+static void StartKeyboardCursorAnim(void);
+static bool32 TryKeyboardCursorReopen(void);
static void sub_80207C0(s16);
static void sub_8020818(s16);
-static bool32 sub_801F658(u8 *state);
-static bool32 sub_801F6F8(u8 *state);
-static bool32 sub_801F730(u8 *state);
-static bool32 sub_801F768(u8 *state);
-static bool32 sub_801F7D4(u8 *state);
-static bool32 sub_801F7E0(u8 *state);
-static bool32 sub_801F82C(u8 *state);
-static bool32 sub_801F870(u8 *state);
-static bool32 sub_801F8DC(u8 *state);
-static bool32 sub_801F984(u8 *state);
-static bool32 sub_801FA2C(u8 *state);
-static bool32 sub_801FA68(u8 *state);
-static bool32 sub_801FB44(u8 *state);
-static bool32 sub_801FB70(u8 *state);
-static bool32 sub_801FBB4(u8 *state);
-static bool32 sub_801FBF8(u8 *state);
-static bool32 sub_801FC4C(u8 *state);
-static bool32 sub_801FC9C(u8 *state);
-static bool32 sub_801FCEC(u8 *state);
-static bool32 sub_801FD30(u8 *state);
-static bool32 sub_801FD88(u8 *state);
-static void sub_8020ABC(struct Sprite *sprite);
-static void sub_8020AF4(struct Sprite *sprite);
-
-EWRAM_DATA struct UnionRoomChat *gUnknown_02022C84 = NULL;
-EWRAM_DATA struct UnionRoomChat2 *gUnknown_02022C88 = NULL;
-EWRAM_DATA struct UnionRoomChat3 *gUnknown_02022C8C = NULL;
-
-void (*const gUnknown_082F2A7C[])(void) =
- {
- sub_801DFAC,
- sub_801E030,
- sub_801E120,
- sub_801E240,
- sub_801E764,
- sub_801E838,
- sub_801E460,
- sub_801E5C4,
- sub_801E668,
- sub_801E978,
- };
-
-static const u8 sKeyboardPageMaxRow[] =
-{
- [UNION_ROOM_KB_PAGE_UPPER] = 9,
- [UNION_ROOM_KB_PAGE_LOWER] = 9,
- [UNION_ROOM_KB_PAGE_EMOJI] = 9,
- 9
+static bool32 Display_Dummy(u8 *);
+static bool32 Display_LoadGfx(u8 *state);
+static bool32 Display_ShowKeyboardSwapMenu(u8 *state);
+static bool32 Display_HideKeyboardSwapMenu(u8 *state);
+static bool32 Display_SwitchPages(u8 *state);
+static bool32 Display_MoveKeyboardCursor(u8 *state);
+static bool32 Display_AskQuitChatting(u8 *state);
+static bool32 Display_DestroyYesNoDialog(u8 *state);
+static bool32 Display_UpdateMessageBuffer(u8 *state);
+static bool32 Display_AskRegisterText(u8 *state);
+static bool32 Display_CancelRegister(u8 *state);
+static bool32 Display_ReturnToKeyboard(u8 *state);
+static bool32 Display_ScrollChat(u8 *state);
+static bool32 Display_AnimateKeyboardCursor(u8 *state);
+static bool32 Display_PrintInputText(u8 *state);
+static bool32 Display_PrintExitingChat(u8 *state);
+static bool32 Display_PrintLeaderLeft(u8 *state);
+static bool32 Display_AskSave(u8 *state);
+static bool32 Display_AskOverwriteSave(u8 *state);
+static bool32 Display_PrintSavingDontTurnOff(u8 *state);
+static bool32 Display_PrintSavedTheGame(u8 *state);
+static bool32 Display_AskConfirmLeaderLeave(u8 *state);
+static void SpriteCB_TextEntryCursor(struct Sprite *sprite);
+static void SpriteCB_TextEntryArrow(struct Sprite *sprite);
+
+static EWRAM_DATA struct UnionRoomChat *sChat = NULL;
+static EWRAM_DATA struct UnionRoomChatDisplay *sDisplay = NULL;
+static EWRAM_DATA struct UnionRoomChatSprites *sSprites = NULL;
+
+static void (*const sChatMainFunctions[])(void) = {
+ [CHAT_FUNC_JOIN] = Chat_Join,
+ [CHAT_FUNC_HANDLE_INPUT] = Chat_HandleInput,
+ [CHAT_FUNC_SWITCH] = Chat_Switch,
+ [CHAT_FUNC_ASK_QUIT] = Chat_AskQuitChatting,
+ [CHAT_FUNC_SEND] = Chat_SendMessage,
+ [CHAT_FUNC_REGISTER] = Chat_Register,
+ [CHAT_FUNC_EXIT] = Chat_Exit,
+ [CHAT_FUNC_DROP] = Chat_Drop,
+ [CHAT_FUNC_DISBANDED] = Chat_Disbanded,
+ [CHAT_FUNC_SAVE_AND_EXIT] = Chat_SaveAndExit
+};
+
+static const u8 sKeyboardPageMaxRow[UNION_ROOM_KB_PAGE_COUNT] =
+{
+ [UNION_ROOM_KB_PAGE_UPPER] = 9,
+ [UNION_ROOM_KB_PAGE_LOWER] = 9,
+ [UNION_ROOM_KB_PAGE_EMOJI] = 9,
+ [UNION_ROOM_KB_PAGE_REGISTER] = 9
};
-static const u8 gUnknown_082F2AA8[] = {
- CHAR_SPACE, 0x16, 0x17, 0x68, 0x19, 0x1A, 0x1B, 0x1C,
- 0x1D, 0x1E, CHAR_SPACE, 0x20, 0x21, 0x22, 0x23, 0x24,
- 0x25, 0x26, 0x27, 0x28, 0x29, 0x15, 0x01, 0x02,
- CHAR_SPACE, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, CHAR_SPACE,
- 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12,
- 0x13, 0x14, 0x2A, 0x2B, 0x2C, 0x2D, CHAR_SPACE, CHAR_SPACE,
- CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, 0x35, 0x36, CHAR_SPACE,
- CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE,
- CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE,
- CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE,
- CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, 0x53, 0x54, 0x55, 0x56, CHAR_SPACE,
- CHAR_SPACE, CHAR_SPACE, 0x6F, 0x5B, 0x5C, 0x5D, CHAR_SPACE, CHAR_SPACE,
- CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE,
- 0x03, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, 0x5A,
- CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE,
- CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE,
- CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, 0x84, 0x85, 0x86, CHAR_SPACE,
- CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE,
- CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE,
- CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE,
- 0xA0, CHAR_0, CHAR_1, CHAR_2, CHAR_3, CHAR_4, CHAR_5, CHAR_6,
- CHAR_7, CHAR_8, CHAR_9, CHAR_EXCL_MARK, CHAR_QUESTION_MARK, CHAR_PERIOD, CHAR_HYPHEN, 0xAF,
- CHAR_ELLIPSIS, CHAR_DBL_QUOT_LEFT, CHAR_DBL_QUOT_RIGHT, CHAR_SGL_QUOT_LEFT, CHAR_SGL_QUOT_RIGHT, CHAR_MALE, CHAR_FEMALE, CHAR_CURRENCY,
- CHAR_COMMA, CHAR_MULT_SIGN, CHAR_SLASH, CHAR_a, CHAR_b, CHAR_c, CHAR_d, CHAR_e,
- CHAR_f, CHAR_g, CHAR_h, CHAR_i, CHAR_j, CHAR_k, CHAR_l, CHAR_m,
- CHAR_n, CHAR_o, CHAR_p, CHAR_q, CHAR_r, CHAR_s, CHAR_t, CHAR_u,
- CHAR_v, CHAR_w, CHAR_x, CHAR_y, CHAR_z, CHAR_A, CHAR_B, CHAR_C,
- CHAR_D, CHAR_E, CHAR_F, CHAR_G, CHAR_H, CHAR_I, CHAR_J, CHAR_K,
- CHAR_L, CHAR_M, CHAR_N, CHAR_O, CHAR_P, CHAR_Q, CHAR_R, CHAR_S,
- CHAR_T, CHAR_U, CHAR_V, CHAR_W, CHAR_X, CHAR_Y, CHAR_Z, 0xEF,
- CHAR_COLON, 0xF4, 0xF5, 0xF6, 0xF1, 0xF2, 0xF3, CHAR_SPACE,
- CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE
+static const u8 sCaseToggleTable[256] = {
+ [CHAR_A] = CHAR_a,
+ [CHAR_B] = CHAR_b,
+ [CHAR_C] = CHAR_c,
+ [CHAR_D] = CHAR_d,
+ [CHAR_E] = CHAR_e,
+ [CHAR_F] = CHAR_f,
+ [CHAR_G] = CHAR_g,
+ [CHAR_H] = CHAR_h,
+ [CHAR_I] = CHAR_i,
+ [CHAR_J] = CHAR_j,
+ [CHAR_K] = CHAR_k,
+ [CHAR_L] = CHAR_l,
+ [CHAR_M] = CHAR_m,
+ [CHAR_N] = CHAR_n,
+ [CHAR_O] = CHAR_o,
+ [CHAR_P] = CHAR_p,
+ [CHAR_Q] = CHAR_q,
+ [CHAR_R] = CHAR_r,
+ [CHAR_S] = CHAR_s,
+ [CHAR_T] = CHAR_t,
+ [CHAR_U] = CHAR_u,
+ [CHAR_V] = CHAR_v,
+ [CHAR_W] = CHAR_w,
+ [CHAR_X] = CHAR_x,
+ [CHAR_Y] = CHAR_y,
+ [CHAR_Z] = CHAR_z,
+ [CHAR_a] = CHAR_A,
+ [CHAR_b] = CHAR_B,
+ [CHAR_c] = CHAR_C,
+ [CHAR_d] = CHAR_D,
+ [CHAR_e] = CHAR_E,
+ [CHAR_f] = CHAR_F,
+ [CHAR_g] = CHAR_G,
+ [CHAR_h] = CHAR_H,
+ [CHAR_i] = CHAR_I,
+ [CHAR_j] = CHAR_J,
+ [CHAR_k] = CHAR_K,
+ [CHAR_l] = CHAR_L,
+ [CHAR_m] = CHAR_M,
+ [CHAR_n] = CHAR_N,
+ [CHAR_o] = CHAR_O,
+ [CHAR_p] = CHAR_P,
+ [CHAR_q] = CHAR_Q,
+ [CHAR_r] = CHAR_R,
+ [CHAR_s] = CHAR_S,
+ [CHAR_t] = CHAR_T,
+ [CHAR_u] = CHAR_U,
+ [CHAR_v] = CHAR_V,
+ [CHAR_w] = CHAR_W,
+ [CHAR_x] = CHAR_X,
+ [CHAR_y] = CHAR_Y,
+ [CHAR_z] = CHAR_Z,
+ [CHAR_A_GRAVE] = CHAR_a_GRAVE,
+ [CHAR_A_ACUTE] = CHAR_a_ACUTE,
+ [CHAR_A_CIRCUMFLEX] = CHAR_a_CIRCUMFLEX,
+ [CHAR_A_DIAERESIS] = CHAR_a_DIAERESIS,
+ [CHAR_C_CEDILLA] = CHAR_c_CEDILLA,
+ [CHAR_E_GRAVE] = CHAR_e_GRAVE,
+ [CHAR_E_ACUTE] = CHAR_e_ACUTE,
+ [CHAR_E_CIRCUMFLEX] = CHAR_e_CIRCUMFLEX,
+ [CHAR_E_DIAERESIS] = CHAR_e_DIAERESIS,
+ [CHAR_I_GRAVE] = CHAR_i_GRAVE,
+ [CHAR_I_ACUTE] = CHAR_i_ACUTE,
+ [CHAR_I_CIRCUMFLEX] = CHAR_i_CIRCUMFLEX,
+ [CHAR_I_DIAERESIS] = CHAR_i_DIAERESIS,
+ [CHAR_O_GRAVE] = CHAR_o_GRAVE,
+ [CHAR_O_ACUTE] = CHAR_o_ACUTE,
+ [CHAR_O_CIRCUMFLEX] = CHAR_o_CIRCUMFLEX,
+ [CHAR_O_DIAERESIS] = CHAR_o_DIAERESIS,
+ [CHAR_OE] = CHAR_oe,
+ [CHAR_U_GRAVE] = CHAR_u_GRAVE,
+ [CHAR_U_ACUTE] = CHAR_u_ACUTE,
+ [CHAR_U_CIRCUMFLEX] = CHAR_u_CIRCUMFLEX,
+ [CHAR_U_DIAERESIS] = CHAR_u_DIAERESIS,
+ [CHAR_N_TILDE] = CHAR_n_TILDE,
+ [CHAR_ESZETT] = CHAR_ESZETT,
+ [CHAR_a_GRAVE] = CHAR_A_GRAVE,
+ [CHAR_a_ACUTE] = CHAR_A_ACUTE,
+ [CHAR_a_CIRCUMFLEX] = CHAR_A_CIRCUMFLEX,
+ [CHAR_a_DIAERESIS] = CHAR_A_DIAERESIS,
+ [CHAR_c_CEDILLA] = CHAR_C_CEDILLA,
+ [CHAR_e_GRAVE] = CHAR_E_GRAVE,
+ [CHAR_e_ACUTE] = CHAR_E_ACUTE,
+ [CHAR_e_CIRCUMFLEX] = CHAR_E_CIRCUMFLEX,
+ [CHAR_e_DIAERESIS] = CHAR_E_DIAERESIS,
+ [CHAR_i_GRAVE] = CHAR_I_GRAVE,
+ [CHAR_i_ACUTE] = CHAR_I_ACUTE,
+ [CHAR_i_CIRCUMFLEX] = CHAR_I_CIRCUMFLEX,
+ [CHAR_i_DIAERESIS] = CHAR_I_DIAERESIS,
+ [CHAR_o_GRAVE] = CHAR_O_GRAVE,
+ [CHAR_o_ACUTE] = CHAR_O_ACUTE,
+ [CHAR_o_CIRCUMFLEX] = CHAR_O_CIRCUMFLEX,
+ [CHAR_o_DIAERESIS] = CHAR_O_DIAERESIS,
+ [CHAR_oe] = CHAR_OE,
+ [CHAR_u_GRAVE] = CHAR_U_GRAVE,
+ [CHAR_u_ACUTE] = CHAR_U_ACUTE,
+ [CHAR_u_CIRCUMFLEX] = CHAR_U_CIRCUMFLEX,
+ [CHAR_u_DIAERESIS] = CHAR_U_DIAERESIS,
+ [CHAR_n_TILDE] = CHAR_N_TILDE,
+ [CHAR_0] = CHAR_0,
+ [CHAR_1] = CHAR_1,
+ [CHAR_2] = CHAR_2,
+ [CHAR_3] = CHAR_3,
+ [CHAR_4] = CHAR_4,
+ [CHAR_5] = CHAR_5,
+ [CHAR_6] = CHAR_6,
+ [CHAR_7] = CHAR_7,
+ [CHAR_8] = CHAR_8,
+ [CHAR_9] = CHAR_9,
+ [CHAR_PK] = CHAR_PK,
+ [CHAR_MN] = CHAR_MN,
+ [CHAR_PO] = CHAR_PO,
+ [CHAR_KE] = CHAR_KE,
+ [CHAR_SUPER_E] = CHAR_SUPER_E,
+ [CHAR_SUPER_ER] = CHAR_SUPER_ER,
+ [CHAR_SUPER_RE] = CHAR_SUPER_RE,
+ [CHAR_PERIOD] = CHAR_PERIOD,
+ [CHAR_COMMA] = CHAR_COMMA,
+ [CHAR_COLON] = CHAR_COLON,
+ [CHAR_SEMICOLON] = CHAR_SEMICOLON,
+ [CHAR_EXCL_MARK] = CHAR_EXCL_MARK,
+ [CHAR_QUESTION_MARK] = CHAR_QUESTION_MARK,
+ [CHAR_HYPHEN] = CHAR_HYPHEN,
+ [CHAR_SLASH] = CHAR_SLASH,
+ [CHAR_ELLIPSIS] = CHAR_ELLIPSIS,
+ [CHAR_LEFT_PAREN] = CHAR_LEFT_PAREN,
+ [CHAR_RIGHT_PAREN] = CHAR_RIGHT_PAREN,
+ [CHAR_AMPERSAND] = CHAR_AMPERSAND,
+ [CHAR_DBL_QUOT_LEFT] = CHAR_DBL_QUOT_LEFT,
+ [CHAR_DBL_QUOT_RIGHT] = CHAR_DBL_QUOT_RIGHT,
+ [CHAR_SGL_QUOT_LEFT] = CHAR_SGL_QUOT_LEFT,
+ [CHAR_SGL_QUOT_RIGHT] = CHAR_SGL_QUOT_RIGHT,
+ [CHAR_MASCULINE_ORDINAL] = CHAR_MASCULINE_ORDINAL,
+ [CHAR_FEMININE_ORDINAL] = CHAR_FEMININE_ORDINAL,
+ [CHAR_BULLET] = CHAR_BULLET,
+ [CHAR_EQUALS] = CHAR_EQUALS,
+ [CHAR_MULT_SIGN] = CHAR_MULT_SIGN,
+ [CHAR_PERCENT] = CHAR_PERCENT,
+ [CHAR_LESS_THAN] = CHAR_LESS_THAN,
+ [CHAR_GREATER_THAN] = CHAR_GREATER_THAN,
+ [CHAR_MALE] = CHAR_MALE,
+ [CHAR_FEMALE] = CHAR_FEMALE,
+ [CHAR_CURRENCY] = CHAR_CURRENCY,
+ [CHAR_BLACK_TRIANGLE] = CHAR_BLACK_TRIANGLE,
};
-static const u8 *const sUnionRoomKeyboardText[UNION_ROOM_KB_PAGE_COUNT][UNION_ROOM_KB_ROW_COUNT] =
+// Excludes UNION_ROOM_KB_PAGE_REGISTER, the text for which is chosen by the player
+static const u8 *const sUnionRoomKeyboardText[UNION_ROOM_KB_PAGE_COUNT - 1][UNION_ROOM_KB_ROW_COUNT] =
{
[UNION_ROOM_KB_PAGE_UPPER] =
{
@@ -319,10 +509,10 @@ static const u8 *const sUnionRoomKeyboardText[UNION_ROOM_KB_PAGE_COUNT][UNION_RO
}
};
-const u16 gUnknown_082F2C20[] = INCBIN_U16("graphics/interface/unk_palette1.gbapal");
-const u16 gUnknown_082F2C40[] = INCBIN_U16("graphics/interface/unk_palette2.gbapal");
+static const u16 sUnk_Palette1[] = INCBIN_U16("graphics/union_room_chat/unk_palette1.gbapal");
+static const u16 sUnk_Palette2[] = INCBIN_U16("graphics/union_room_chat/unk_palette2.gbapal");
-const struct BgTemplate gUnknown_082F2C60[] = {
+static const struct BgTemplate sBgTemplates[] = {
{
.bg = 0,
.charBaseIndex = 0,
@@ -358,7 +548,7 @@ const struct BgTemplate gUnknown_082F2C60[] = {
}
};
-const struct WindowTemplate gUnknown_082F2C70[] = {
+static const struct WindowTemplate sWinTemplates[] = {
{
.bg = 0x03,
.tilemapLeft = 0x08,
@@ -391,242 +581,341 @@ const struct WindowTemplate gUnknown_082F2C70[] = {
.height = 0x09,
.paletteNum = 0x0e,
.baseBlock = 0x0013,
- }, { 0xFF }
+ }, DUMMY_WIN_TEMPLATE
};
-const struct Unk82F2C98 gUnknown_082F2C98[] = {
- {0x00000000, sub_801F658},
- {0x00000003, sub_801F6F8},
- {0x00000004, sub_801F730},
- {0x00000005, sub_801F768},
- {0x00000001, sub_801F7D4},
- {0x00000006, sub_801F7E0},
- {0x00000007, sub_801F82C},
- {0x00000008, sub_801F870},
- {0x00000009, sub_801F8DC},
- {0x0000000a, sub_801F984},
- {0x0000000b, sub_801FA2C},
- {0x0000000c, sub_801FA68},
- {0x00000002, sub_801FB44},
- {0x0000000d, sub_801FB70},
- {0x00000012, sub_801FBB4},
- {0x00000013, sub_801FBF8},
- {0x0000000e, sub_801FC4C},
- {0x0000000f, sub_801FC9C},
- {0x00000010, sub_801FCEC},
- {0x00000011, sub_801FD30},
- {0x00000014, sub_801FD88}
+static const struct SubtaskInfo sDisplaySubtasks[] = {
+ {CHATDISPLAY_FUNC_LOAD_GFX, Display_LoadGfx},
+ {CHATDISPLAY_FUNC_SHOW_KB_SWAP_MENU, Display_ShowKeyboardSwapMenu},
+ {CHATDISPLAY_FUNC_HIDE_KB_SWAP_MENU, Display_HideKeyboardSwapMenu},
+ {CHATDISPLAY_FUNC_SWITCH_PAGES, Display_SwitchPages},
+ {CHATDISPLAY_FUNC_MOVE_KB_CURSOR, Display_MoveKeyboardCursor},
+ {CHATDISPLAY_FUNC_ASK_QUIT_CHATTING, Display_AskQuitChatting},
+ {CHATDISPLAY_FUNC_DESTROY_YESNO, Display_DestroyYesNoDialog},
+ {CHATDISPLAY_FUNC_UPDATE_MSG, Display_UpdateMessageBuffer},
+ {CHATDISPLAY_FUNC_ASK_REGISTER_TEXT, Display_AskRegisterText},
+ {CHATDISPLAY_FUNC_CANCEL_REGISTER, Display_CancelRegister},
+ {CHATDISPLAY_FUNC_RETURN_TO_KB, Display_ReturnToKeyboard},
+ {CHATDISPLAY_FUNC_SCROLL_CHAT, Display_ScrollChat},
+ {CHATDISPLAY_FUNC_CURSOR_BLINK, Display_AnimateKeyboardCursor},
+ {CHATDISPLAY_FUNC_PRINT_INPUT_TEXT, Display_PrintInputText},
+ {CHATDISPLAY_FUNC_PRINT_EXITING_CHAT, Display_PrintExitingChat},
+ {CHATDISPLAY_FUNC_PRINT_LEADER_LEFT, Display_PrintLeaderLeft},
+ {CHATDISPLAY_FUNC_ASK_SAVE, Display_AskSave},
+ {CHATDISPLAY_FUNC_ASK_OVERWRITE_SAVE, Display_AskOverwriteSave},
+ {CHATDISPLAY_FUNC_PRINT_SAVING, Display_PrintSavingDontTurnOff},
+ {CHATDISPLAY_FUNC_PRINT_SAVED_GAME, Display_PrintSavedTheGame},
+ {CHATDISPLAY_FUNC_ASK_CONFIRM_LEADER_LEAVE, Display_AskConfirmLeaderLeave}
};
-const struct Unk82F2D40 gUnknown_082F2D40[] = {
- {gText_QuitChatting, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00},
- {gText_RegisterTextWhere, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00},
- {gText_RegisterTextHere, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00},
- {gText_InputText, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00},
- {gText_ExitingChat, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00},
- {gText_LeaderLeftEndingChat, 0x02, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00},
- {gText_RegisteredTextChanged, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01},
- {gText_AlreadySavedFile_Unused, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01},
- {gText_SavingDontTurnOff_Unused, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01},
- {gText_PlayerSavedGame_Unused, 0x02, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01},
- {gText_IfLeaderLeavesChatEnds, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01}
+static const struct MessageWindowInfo sDisplayStdMessages[] = {
+ [STDMESSAGE_QUIT_CHATTING] = {
+ .text = gText_QuitChatting,
+ .boxType = 1,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .hasPlaceholders = FALSE,
+ .useWiderBox = FALSE
+ },
+ [STDMESSAGE_REGISTER_WHERE] = {
+ .text = gText_RegisterTextWhere,
+ .boxType = 1,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .hasPlaceholders = FALSE,
+ .useWiderBox = FALSE
+ },
+ [STDMESSAGE_REGISTER_HERE] = {
+ .text = gText_RegisterTextHere,
+ .boxType = 1,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .hasPlaceholders = FALSE,
+ .useWiderBox = FALSE
+ },
+ [STDMESSAGE_INPUT_TEXT] = {
+ .text = gText_InputText,
+ .boxType = 1,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .hasPlaceholders = FALSE,
+ .useWiderBox = FALSE
+ },
+ [STDMESSAGE_EXITING_CHAT] = {
+ .text = gText_ExitingChat,
+ .boxType = 2,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .hasPlaceholders = FALSE,
+ .useWiderBox = FALSE
+ },
+ [STDMESSAGE_LEADER_LEFT] = {
+ .text = gText_LeaderLeftEndingChat,
+ .boxType = 2,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .hasPlaceholders = TRUE,
+ .useWiderBox = FALSE
+ },
+ [STDMESSAGE_ASK_SAVE] = {
+ .text = gText_RegisteredTextChangedOKToSave,
+ .boxType = 2,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .hasPlaceholders = FALSE,
+ .useWiderBox = TRUE
+ },
+ [STDMESSAGE_ASK_OVERWRITE] = {
+ .text = gText_AlreadySavedFile_Chat,
+ .boxType = 2,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .hasPlaceholders = FALSE,
+ .useWiderBox = TRUE
+ },
+ [STDMESSAGE_SAVING_NO_OFF] = {
+ .text = gText_SavingDontTurnOff_Chat,
+ .boxType = 2,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .hasPlaceholders = FALSE,
+ .useWiderBox = TRUE
+ },
+ [STDMESSAGE_SAVED_THE_GAME] = {
+ .text = gText_PlayerSavedGame_Chat,
+ .boxType = 2,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .hasPlaceholders = TRUE,
+ .useWiderBox = TRUE
+ },
+ [STDMESSAGE_WARN_LEADER_LEAVE] = {
+ .text = gText_IfLeaderLeavesChatEnds,
+ .boxType = 2,
+ .x = 0,
+ .y = 1,
+ .letterSpacing = 0,
+ .lineSpacing = 0,
+ .hasPlaceholders = FALSE,
+ .useWiderBox = TRUE
+ }
};
-const u8 gText_Ellipsis[] = _("…");
+static const u8 sText_Ellipsis[] = _("…");
-const struct MenuAction gUnknown_082F2DC8[] = {
- {gText_Upper, NULL},
- {gText_Lower, NULL},
- {gText_Symbols, NULL},
- {gText_Register2, NULL},
- {gText_Exit2, NULL},
+static const struct MenuAction sKeyboardPageTitleTexts[UNION_ROOM_KB_PAGE_COUNT + 1] = {
+ [UNION_ROOM_KB_PAGE_UPPER] = {gText_Upper, NULL},
+ [UNION_ROOM_KB_PAGE_LOWER] = {gText_Lower, NULL},
+ [UNION_ROOM_KB_PAGE_EMOJI] = {gText_Symbols, NULL},
+ [UNION_ROOM_KB_PAGE_REGISTER] = {gText_Register2, NULL},
+ [UNION_ROOM_KB_PAGE_COUNT] = {gText_Exit2, NULL},
};
-const u16 gUnknown_082F2DF0[] = INCBIN_U16("graphics/interface/unk_palette3.gbapal");
-const u32 gUnknown_082F2E10[] = INCBIN_U32("graphics/interface/unk_cursor.4bpp.lz");
-const u32 gUnknown_082F3094[] = INCBIN_U32("graphics/interface/unk_dash.4bpp.lz");
-const u32 gUnknown_082F30B4[] = INCBIN_U32("graphics/interface/unk_cursor_arrow.4bpp.lz");
-const u32 gUnknown_082F30E0[] = INCBIN_U32("graphics/interface/unk_rbutton.4bpp.lz");
-
-const struct CompressedSpriteSheet gUnknown_082F3134[] = {
- {gUnknown_082F2E10, 0x1000, 0x0000},
- {gUnknown_082F30B4, 0x0040, 0x0001},
- {gUnknown_082F3094, 0x0040, 0x0002},
- {gUnknown_082F30E0, 0x0080, 0x0003},
- {gUnknown_08DD4CF8, 0x0400, 0x0004}
+static const u16 sUnionRoomChatInterfacePal[] = INCBIN_U16("graphics/union_room_chat/interface.gbapal");
+static const u32 sKeyboardCursorTiles[] = INCBIN_U32("graphics/union_room_chat/keyboard_cursor.4bpp.lz");
+static const u32 sTextEntryCursorTiles[] = INCBIN_U32("graphics/union_room_chat/text_entry_cursor.4bpp.lz");
+static const u32 sTextEntryArrowTiles[] = INCBIN_U32("graphics/union_room_chat/text_entry_arrow.4bpp.lz");
+static const u32 sRButtonGfxTiles[] = INCBIN_U32("graphics/union_room_chat/r_button.4bpp.lz");
+
+static const struct CompressedSpriteSheet sSpriteSheets[] = {
+ {sKeyboardCursorTiles, 0x1000, 0},
+ {sTextEntryArrowTiles, 0x0040, 1},
+ {sTextEntryCursorTiles, 0x0040, 2},
+ {sRButtonGfxTiles, 0x0080, 3},
+ {gUnionRoomChat_RButtonLabels, 0x0400, 4}
};
-const struct SpritePalette gUnknown_082F315C = {
- gUnknown_082F2DF0, 0x0000
+static const struct SpritePalette sSpritePalette = {
+ sUnionRoomChatInterfacePal, 0
};
-const struct OamData gUnknown_082F3164 = {
+static const struct OamData sOam_KeyboardCursor = {
.shape = SPRITE_SHAPE(64x32),
.size = SPRITE_SIZE(64x32),
.priority = 1
};
-const union AnimCmd gUnknown_082F316C[] = {
+static const union AnimCmd sAnim_KeyboardCursor_Open[] = {
ANIMCMD_FRAME(0x00, 30),
ANIMCMD_END
};
-const union AnimCmd gUnknown_082F3174[] = {
+static const union AnimCmd sAnim_KeyboardCursor_Closed[] = {
ANIMCMD_FRAME(0x20, 30),
ANIMCMD_END
};
-const union AnimCmd gUnknown_082F317C[] = {
+static const union AnimCmd sAnim_KeyboardCursorWide_Open[] = {
ANIMCMD_FRAME(0x40, 30),
ANIMCMD_END
};
-const union AnimCmd gUnknown_082F3184[] = {
+static const union AnimCmd sAnim_KeyboardCursorWide_Closed[] = {
ANIMCMD_FRAME(0x60, 30),
ANIMCMD_END
};
-const union AnimCmd *const gUnknown_082F318C[] = {
- gUnknown_082F316C,
- gUnknown_082F3174,
- gUnknown_082F317C,
- gUnknown_082F3184
+static const union AnimCmd *const sAnims_KeyboardCursor[] = {
+ sAnim_KeyboardCursor_Open,
+ sAnim_KeyboardCursor_Closed,
+ sAnim_KeyboardCursorWide_Open,
+ sAnim_KeyboardCursorWide_Closed
};
-const struct SpriteTemplate gUnknown_082F319C = {
+static const struct SpriteTemplate sSpriteTemplate_KeyboardCursor = {
.tileTag = 0x0000,
.paletteTag = 0x0000,
- .oam = &gUnknown_082F3164,
- .anims = gUnknown_082F318C,
+ .oam = &sOam_KeyboardCursor,
+ .anims = sAnims_KeyboardCursor,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
-const struct OamData gUnknown_082F31B4 = {
+static const struct OamData sOam_TextEntrySprite = {
.shape = SPRITE_SHAPE(8x16),
.size = SPRITE_SIZE(8x16),
.priority = 2
};
-const struct SpriteTemplate gUnknown_082F31BC = {
+static const struct SpriteTemplate sSpriteTemplate_TextEntryCursor = {
.tileTag = 0x0002,
.paletteTag = 0x0000,
- .oam = &gUnknown_082F31B4,
+ .oam = &sOam_TextEntrySprite,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_8020ABC
+ .callback = SpriteCB_TextEntryCursor
};
-const struct SpriteTemplate gUnknown_082F31D4 = {
+static const struct SpriteTemplate sSpriteTemplate_TextEntryArrow = {
.tileTag = 0x0001,
.paletteTag = 0x0000,
- .oam = &gUnknown_082F31B4,
+ .oam = &sOam_TextEntrySprite,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_8020AF4
+ .callback = SpriteCB_TextEntryArrow
};
-const struct OamData gUnknown_082F31EC = {
+static const struct OamData sOam_RButtonIcon = {
.shape = SPRITE_SHAPE(16x16),
.size = SPRITE_SIZE(16x16),
.priority = 2
};
-const struct OamData gUnknown_082F31F4 = {
+static const struct OamData sOam_RButtonLabel = {
.shape = SPRITE_SHAPE(32x16),
.size = SPRITE_SIZE(32x16),
.priority = 2
};
-const union AnimCmd gUnknown_082F31FC[] = {
+static const union AnimCmd sAnim_ToggleCaseIcon[] = {
ANIMCMD_FRAME(0x00, 2),
ANIMCMD_END
};
-const union AnimCmd gUnknown_082F3204[] = {
+static const union AnimCmd sAnim_ToggleCaseIcon_Duplicate1[] = {
ANIMCMD_FRAME(0x08, 2),
ANIMCMD_END
};
-const union AnimCmd gUnknown_082F320C[] = {
+static const union AnimCmd sAnim_ToggleCaseIcon_Duplicate2[] = {
ANIMCMD_FRAME(0x10, 2),
ANIMCMD_END
};
-const union AnimCmd gUnknown_082F3214[] = {
+static const union AnimCmd sAnim_RegisterIcon[] = {
ANIMCMD_FRAME(0x18, 2),
ANIMCMD_END
};
-const union AnimCmd *const gUnknown_082F321C[] = {
- gUnknown_082F31FC,
- gUnknown_082F3204,
- gUnknown_082F320C,
- gUnknown_082F3214
+static const union AnimCmd *const sAnims_RButtonLabels[] = {
+ sAnim_ToggleCaseIcon,
+ sAnim_ToggleCaseIcon_Duplicate1,
+ sAnim_ToggleCaseIcon_Duplicate2,
+ sAnim_RegisterIcon
};
-const struct SpriteTemplate gUnknown_082F322C = {
+static const struct SpriteTemplate sSpriteTemplate_RButtonIcon = {
.tileTag = 0x0003,
.paletteTag = 0x0000,
- .oam = &gUnknown_082F31EC,
+ .oam = &sOam_RButtonIcon,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
-const struct SpriteTemplate gUnknown_082F3244 = {
+static const struct SpriteTemplate sSpriteTemplate_RButtonLabels = {
.tileTag = 0x0004,
.paletteTag = 0x0000,
- .oam = &gUnknown_082F31F4,
- .anims = gUnknown_082F321C,
+ .oam = &sOam_RButtonLabel,
+ .anims = sAnims_RButtonLabels,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
-void sub_801DD98(void)
+void EnterUnionRoomChat(void)
{
- gUnknown_02022C84 = Alloc(sizeof(*gUnknown_02022C84));
- sub_801DDD0(gUnknown_02022C84);
+ sChat = Alloc(sizeof(struct UnionRoomChat));
+ InitUnionRoomChat(sChat);
gKeyRepeatStartDelay = 20;
SetVBlankCallback(NULL);
- SetMainCallback2(c2_081284E0);
+ SetMainCallback2(CB2_LoadInterface);
}
-static void sub_801DDD0(struct UnionRoomChat *unionRoomChat)
+static void InitUnionRoomChat(struct UnionRoomChat *chat)
{
int i;
- unionRoomChat->unk4 = 0;
- unionRoomChat->unk6 = 0;
- unionRoomChat->currentPage = 0;
- unionRoomChat->unk11 = 0;
- unionRoomChat->currentRow = 0;
- unionRoomChat->unk14 = 0;
- unionRoomChat->unk15 = 0;
- unionRoomChat->unk16 = 0;
- unionRoomChat->unk1A[0] = EOS;
- unionRoomChat->unkD = GetLinkPlayerCount();
- unionRoomChat->unk13 = GetMultiplayerId();
- unionRoomChat->unk17 = 0;
- unionRoomChat->unk18 = 0;
- sub_801EF1C(unionRoomChat->unk190);
+ chat->funcId = 0;
+ chat->funcState = 0;
+ chat->currentPage = 0;
+ chat->currentCol = 0;
+ chat->currentRow = 0;
+ chat->lastBufferCursorPos = 0;
+ chat->bufferCursorPos = 0;
+ chat->receivedPlayerIndex = 0;
+ chat->messageEntryBuffer[0] = EOS;
+ chat->linkPlayerCount = GetLinkPlayerCount();
+ chat->multiplayerId = GetMultiplayerId();
+ chat->exitType = 0;
+ chat->changedRegisteredTexts = FALSE;
+ PrepareSendBuffer_Null(chat->sendMessageBuffer);
for (i = 0; i < UNION_ROOM_KB_ROW_COUNT; i++)
- StringCopy(unionRoomChat->unkB9[i], gSaveBlock1Ptr->unk3C88[i]);
+ StringCopy(chat->registeredTexts[i], gSaveBlock1Ptr->registeredTexts[i]);
}
-void sub_801DE30(void)
+static void FreeUnionRoomChat(void)
{
- DestroyTask(gUnknown_02022C84->unkE);
- DestroyTask(gUnknown_02022C84->unkF);
- Free(gUnknown_02022C84);
+ DestroyTask(sChat->handleInputTask);
+ DestroyTask(sChat->receiveMessagesTask);
+ Free(sChat);
}
-static void c2_081284E0(void)
+static void CB2_LoadInterface(void)
{
switch (gMain.state)
{
@@ -634,16 +923,16 @@ static void c2_081284E0(void)
ResetTasks();
ResetSpriteData();
FreeAllSpritePalettes();
- sub_801F4D0();
+ TryAllocDisplay();
gMain.state++;
break;
case 1:
- sub_801F5B8();
- if (!sub_801F534())
+ RunDisplaySubtasks();
+ if (!IsDisplaySubtask0Active())
{
BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK);
BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
- SetVBlankCallback(sub_801DF20);
+ SetVBlankCallback(VBlankCB_UnionRoomChatMain);
gMain.state++;
}
break;
@@ -651,9 +940,9 @@ static void c2_081284E0(void)
UpdatePaletteFade();
if (!gPaletteFade.active)
{
- SetMainCallback2(sub_801DF38);
- gUnknown_02022C84->unkE = CreateTask(sub_801DF54, 8);
- gUnknown_02022C84->unkF = CreateTask(sub_801F2B4, 7);
+ SetMainCallback2(CB2_UnionRoomChatMain);
+ sChat->handleInputTask = CreateTask(Task_HandlePlayerInput, 8);
+ sChat->receiveMessagesTask = CreateTask(Task_ReceiveChatMessage, 7);
LoadWirelessStatusIndicatorSpriteGfx();
CreateWirelessStatusIndicatorSprite(232, 150);
}
@@ -661,7 +950,7 @@ static void c2_081284E0(void)
}
}
-static void sub_801DF20(void)
+static void VBlankCB_UnionRoomChatMain(void)
{
TransferPlttBuffer();
LoadOam();
@@ -669,146 +958,146 @@ static void sub_801DF20(void)
ScanlineEffect_InitHBlankDmaTransfer();
}
-static void sub_801DF38(void)
+static void CB2_UnionRoomChatMain(void)
{
RunTasks();
- sub_801F5B8();
+ RunDisplaySubtasks();
AnimateSprites();
BuildOamBuffer();
UpdatePaletteFade();
}
-static void sub_801DF54(u8 taskId)
+static void Task_HandlePlayerInput(u8 taskId)
{
- switch (gUnknown_02022C84->unk17)
+ switch (sChat->exitType)
{
- case 1:
- sub_801EBD4(6);
- gUnknown_02022C84->unk17 = 0;
+ case CHAT_EXIT_ONLY_LEADER:
+ SetChatFunction(CHAT_FUNC_EXIT);
+ sChat->exitType = CHAT_EXIT_NONE;
break;
- case 2:
- sub_801EBD4(7);
- gUnknown_02022C84->unk17 = 0;
+ case CHAT_EXIT_DROPPED:
+ SetChatFunction(CHAT_FUNC_DROP);
+ sChat->exitType = CHAT_EXIT_NONE;
break;
- case 3:
- sub_801EBD4(8);
- gUnknown_02022C84->unk17 = 0;
+ case CHAT_EXIT_DISBANDED:
+ SetChatFunction(CHAT_FUNC_DISBANDED);
+ sChat->exitType = CHAT_EXIT_NONE;
break;
}
- gUnknown_082F2A7C[gUnknown_02022C84->unk4]();
+ sChatMainFunctions[sChat->funcId]();
}
-static void sub_801DFAC(void)
+static void Chat_Join(void)
{
- switch (gUnknown_02022C84->unk6)
+ switch (sChat->funcState)
{
case 0:
- sub_801EF24(gUnknown_02022C84->unk190);
- gUnknown_02022C84->unk6++;
+ PrepareSendBuffer_Join(sChat->sendMessageBuffer);
+ sChat->funcState++;
// fall through
case 1:
if (IsLinkTaskFinished() && !sub_8011A9C())
{
- if (SendBlock(0, gUnknown_02022C84->unk190, sizeof(gUnknown_02022C84->unk190)))
- gUnknown_02022C84->unk6++;
+ if (SendBlock(0, sChat->sendMessageBuffer, sizeof(sChat->sendMessageBuffer)))
+ sChat->funcState++;
}
break;
case 2:
if (IsLinkTaskFinished())
- sub_801EBD4(1);
+ SetChatFunction(CHAT_FUNC_HANDLE_INPUT);
break;
}
}
-static void sub_801E030(void)
+static void Chat_HandleInput(void)
{
- bool8 var0, var1;
+ bool8 updateMsgActive, cursorBlinkActive;
- switch (gUnknown_02022C84->unk6)
+ switch (sChat->funcState)
{
case 0:
if (gMain.newKeys & START_BUTTON)
{
- if (gUnknown_02022C84->unk15)
- sub_801EBD4(4);
+ if (sChat->bufferCursorPos)
+ SetChatFunction(CHAT_FUNC_SEND);
}
else if (gMain.newKeys & SELECT_BUTTON)
{
- sub_801EBD4(2);
+ SetChatFunction(CHAT_FUNC_SWITCH);
}
else if (gMain.newAndRepeatedKeys & B_BUTTON)
{
- if (gUnknown_02022C84->unk15)
+ if (sChat->bufferCursorPos)
{
- sub_801ED68();
- sub_801F5EC(8, 0);
- gUnknown_02022C84->unk6 = 1;
+ DeleteLastMessageCharacter();
+ StartDisplaySubtask(CHATDISPLAY_FUNC_UPDATE_MSG, 0);
+ sChat->funcState = 1;
}
else
{
- sub_801EBD4(3);
+ SetChatFunction(CHAT_FUNC_ASK_QUIT);
}
}
else if (gMain.newKeys & A_BUTTON)
{
- sub_801EC94();
- sub_801F5EC(8, 0);
- sub_801F5EC(2, 1);
- gUnknown_02022C84->unk6 = 1;
+ AppendTextToMessage();
+ StartDisplaySubtask(CHATDISPLAY_FUNC_UPDATE_MSG, 0);
+ StartDisplaySubtask(CHATDISPLAY_FUNC_CURSOR_BLINK, 1);
+ sChat->funcState = 1;
}
else if (gMain.newKeys & R_BUTTON)
{
- if (gUnknown_02022C84->currentPage != UNION_ROOM_KB_PAGE_COUNT)
+ if (sChat->currentPage != UNION_ROOM_KB_PAGE_REGISTER)
{
- sub_801ED94();
- sub_801F5EC(8, 0);
- gUnknown_02022C84->unk6 = 1;
+ SwitchCaseOfLastMessageCharacter();
+ StartDisplaySubtask(CHATDISPLAY_FUNC_UPDATE_MSG, 0);
+ sChat->funcState = 1;
}
else
{
- sub_801EBD4(5);
+ SetChatFunction(5);
}
}
- else if (sub_801EBE4())
+ else if (HandleDPadInput())
{
- sub_801F5EC(1, 0);
- gUnknown_02022C84->unk6 = 1;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_MOVE_KB_CURSOR, 0);
+ sChat->funcState = 1;
}
break;
case 1:
- var0 = sub_801F644(0);
- var1 = sub_801F644(1);
- if (!var0 && !var1)
- gUnknown_02022C84->unk6 = 0;
+ updateMsgActive = IsDisplaySubtaskActive(0);
+ cursorBlinkActive = IsDisplaySubtaskActive(1);
+ if (!updateMsgActive && !cursorBlinkActive)
+ sChat->funcState = 0;
break;
}
}
-static void sub_801E120(void)
+static void Chat_Switch(void)
{
s16 input;
- int var0;
+ bool32 shouldSwitchPages;
- switch (gUnknown_02022C84->unk6)
+ switch (sChat->funcState)
{
case 0:
- sub_801F5EC(3, 0);
- gUnknown_02022C84->unk6++;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_SHOW_KB_SWAP_MENU, 0);
+ sChat->funcState++;
break;
case 1:
- if (!sub_801F644(0))
- gUnknown_02022C84->unk6++;
+ if (!IsDisplaySubtaskActive(0))
+ sChat->funcState++;
break;
case 2:
input = Menu_ProcessInput();
switch (input)
{
default:
- sub_801F5EC(4, 0);
- var0 = 1;
- if (gUnknown_02022C84->currentPage == input || input > UNION_ROOM_KB_PAGE_COUNT)
- var0 = 0;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_HIDE_KB_SWAP_MENU, 0);
+ shouldSwitchPages = TRUE;
+ if (sChat->currentPage == input || input > UNION_ROOM_KB_PAGE_REGISTER)
+ shouldSwitchPages = FALSE;
break;
case MENU_NOTHING_CHOSEN:
if (gMain.newKeys & SELECT_BUTTON)
@@ -818,538 +1107,532 @@ static void sub_801E120(void)
}
return;
case MENU_B_PRESSED:
- sub_801F5EC(4, 0);
- gUnknown_02022C84->unk6 = 3;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_HIDE_KB_SWAP_MENU, 0);
+ sChat->funcState = 3;
return;
}
- if (!var0)
+ if (!shouldSwitchPages)
{
- gUnknown_02022C84->unk6 = 3;
+ sChat->funcState = 3;
return;
}
- gUnknown_02022C84->unk11 = 0;
- gUnknown_02022C84->currentRow = 0;
- sub_801F5EC(5, 1);
- gUnknown_02022C84->currentPage = input;
- gUnknown_02022C84->unk6 = 4;
+ sChat->currentCol = 0;
+ sChat->currentRow = 0;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_SWITCH_PAGES, 1);
+ sChat->currentPage = input;
+ sChat->funcState = 4;
break;
case 3:
- if (!sub_801F644(0))
- sub_801EBD4(1);
+ if (!IsDisplaySubtaskActive(0))
+ SetChatFunction(CHAT_FUNC_HANDLE_INPUT);
break;
case 4:
- if (!sub_801F644(0) && !sub_801F644(1))
- sub_801EBD4(1);
+ if (!IsDisplaySubtaskActive(0) && !IsDisplaySubtaskActive(1))
+ SetChatFunction(CHAT_FUNC_HANDLE_INPUT);
break;
}
}
-static void sub_801E240(void)
+static void Chat_AskQuitChatting(void)
{
s8 input;
- switch (gUnknown_02022C84->unk6)
+ switch (sChat->funcState)
{
case 0:
- sub_801F5EC(6, 0);
- gUnknown_02022C84->unk6 = 1;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_ASK_QUIT_CHATTING, 0);
+ sChat->funcState = 1;
break;
case 1:
- if (!sub_801F644(0))
- gUnknown_02022C84->unk6 = 2;
+ if (!IsDisplaySubtaskActive(0))
+ sChat->funcState = 2;
break;
case 2:
- input = sub_801FF08();
+ input = ProcessMenuInput();
switch (input)
{
case -1:
case 1:
- sub_801F5EC(7, 0);
- gUnknown_02022C84->unk6 = 3;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_DESTROY_YESNO, 0);
+ sChat->funcState = 3;
break;
case 0:
- if (gUnknown_02022C84->unk13 == 0)
+ if (sChat->multiplayerId == 0)
{
- sub_801EFD0(gUnknown_02022C84->unk190);
- sub_801F5EC(7, 0);
- gUnknown_02022C84->unk6 = 9;
+ PrepareSendBuffer_Disband(sChat->sendMessageBuffer);
+ StartDisplaySubtask(CHATDISPLAY_FUNC_DESTROY_YESNO, 0);
+ sChat->funcState = 9;
}
else
{
- sub_801EF7C(gUnknown_02022C84->unk190);
- gUnknown_02022C84->unk6 = 4;
+ PrepareSendBuffer_Leave(sChat->sendMessageBuffer);
+ sChat->funcState = 4;
}
break;
}
break;
case 3:
- if (!sub_801F644(0))
- sub_801EBD4(1);
+ if (!IsDisplaySubtaskActive(0))
+ SetChatFunction(CHAT_FUNC_HANDLE_INPUT);
break;
case 9:
- if (!sub_801F644(0))
+ if (!IsDisplaySubtaskActive(0))
{
- sub_801F5EC(20, 0);
- gUnknown_02022C84->unk6 = 10;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_ASK_CONFIRM_LEADER_LEAVE, 0);
+ sChat->funcState = 10;
}
break;
case 10:
- if (!sub_801F644(0))
- gUnknown_02022C84->unk6 = 8;
+ if (!IsDisplaySubtaskActive(0))
+ sChat->funcState = 8;
break;
case 8:
- input = sub_801FF08();
+ input = ProcessMenuInput();
switch (input)
{
case -1:
case 1:
- sub_801F5EC(7, 0);
- gUnknown_02022C84->unk6 = 3;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_DESTROY_YESNO, 0);
+ sChat->funcState = 3;
break;
case 0:
sub_80104B0();
- sub_801EFD0(gUnknown_02022C84->unk190);
- gUnknown_02022C84->unk6 = 4;
- gUnknown_02022C84->unk1B8 = 0;
+ PrepareSendBuffer_Disband(sChat->sendMessageBuffer);
+ sChat->funcState = 4;
+ sChat->tryQuitAgainTimer = 0;
break;
}
break;
case 4:
- if (IsLinkTaskFinished() && !sub_8011A9C() && SendBlock(0, gUnknown_02022C84->unk190, sizeof(gUnknown_02022C84->unk190)))
+ if (IsLinkTaskFinished() && !sub_8011A9C() && SendBlock(0, sChat->sendMessageBuffer, sizeof(sChat->sendMessageBuffer)))
{
- if (!gUnknown_02022C84->unk13)
- gUnknown_02022C84->unk6 = 6;
+ if (!sChat->multiplayerId)
+ sChat->funcState = 6;
else
- gUnknown_02022C84->unk6 = 5;
+ sChat->funcState = 5;
}
if (!gReceivedRemoteLinkPlayers)
- sub_801EBD4(9);
+ SetChatFunction(CHAT_FUNC_SAVE_AND_EXIT);
break;
case 5:
if (!gReceivedRemoteLinkPlayers)
{
- sub_801EBD4(9);
+ SetChatFunction(CHAT_FUNC_SAVE_AND_EXIT);
}
- else if (++gUnknown_02022C84->unk1B8 > 300)
+ else if (++sChat->tryQuitAgainTimer > 300)
{
- gUnknown_02022C84->unk1B8 = 0;
- gUnknown_02022C84->unk6 = 4;
+ sChat->tryQuitAgainTimer = 0;
+ sChat->funcState = 4;
}
break;
}
}
-static void sub_801E460(void)
+static void Chat_Exit(void)
{
- switch (gUnknown_02022C84->unk6)
+ switch (sChat->funcState)
{
case 0:
- if (!FuncIsActiveTask(sub_801F2B4))
+ if (!FuncIsActiveTask(Task_ReceiveChatMessage))
{
- sub_801F5EC(7, 0);
- gUnknown_02022C84->unk6++;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_DESTROY_YESNO, 0);
+ sChat->funcState++;
}
break;
case 1:
- if (!sub_801F644(0))
+ if (!IsDisplaySubtaskActive(0))
{
- sub_801F5EC(18, 0);
- gUnknown_02022C84->unk6++;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_PRINT_EXITING_CHAT, 0);
+ sChat->funcState++;
}
break;
case 2:
- if (!sub_801F644(0))
+ if (!IsDisplaySubtaskActive(0))
{
- sub_801EFA8(gUnknown_02022C84->unk190);
- gUnknown_02022C84->unk6++;
+ PrepareSendBuffer_Drop(sChat->sendMessageBuffer);
+ sChat->funcState++;
}
break;
case 3:
- if (IsLinkTaskFinished() && !sub_8011A9C() && SendBlock(0, gUnknown_02022C84->unk190, sizeof(gUnknown_02022C84->unk190)))
- gUnknown_02022C84->unk6++;
+ if (IsLinkTaskFinished() && !sub_8011A9C() && SendBlock(0, sChat->sendMessageBuffer, sizeof(sChat->sendMessageBuffer)))
+ sChat->funcState++;
break;
case 4:
if ((GetBlockReceivedStatus() & 1) && !sub_8011A9C())
- gUnknown_02022C84->unk6++;
+ sChat->funcState++;
break;
case 5:
if (IsLinkTaskFinished() && !sub_8011A9C())
{
sub_800AC34();
- gUnknown_02022C84->unkA = 0;
- gUnknown_02022C84->unk6++;
+ sChat->exitDelayTimer = 0;
+ sChat->funcState++;
}
break;
case 6:
- if (gUnknown_02022C84->unkA < 150)
- gUnknown_02022C84->unkA++;
+ if (sChat->exitDelayTimer < 150)
+ sChat->exitDelayTimer++;
if (!gReceivedRemoteLinkPlayers)
- gUnknown_02022C84->unk6++;
+ sChat->funcState++;
break;
case 7:
- if (gUnknown_02022C84->unkA >= 150)
- sub_801EBD4(9);
+ if (sChat->exitDelayTimer >= 150)
+ SetChatFunction(CHAT_FUNC_SAVE_AND_EXIT);
else
- gUnknown_02022C84->unkA++;
+ sChat->exitDelayTimer++;
break;
}
}
-static void sub_801E5C4(void)
+static void Chat_Drop(void)
{
- switch (gUnknown_02022C84->unk6)
+ switch (sChat->funcState)
{
case 0:
- if (!FuncIsActiveTask(sub_801F2B4))
+ if (!FuncIsActiveTask(Task_ReceiveChatMessage))
{
- sub_801F5EC(7, 0);
- gUnknown_02022C84->unk6++;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_DESTROY_YESNO, 0);
+ sChat->funcState++;
}
break;
case 1:
- if (!sub_801F644(0) && IsLinkTaskFinished() && !sub_8011A9C())
+ if (!IsDisplaySubtaskActive(0) && IsLinkTaskFinished() && !sub_8011A9C())
{
sub_800AC34();
- gUnknown_02022C84->unkA = 0;
- gUnknown_02022C84->unk6++;
+ sChat->exitDelayTimer = 0;
+ sChat->funcState++;
}
break;
case 2:
- if (gUnknown_02022C84->unkA < 150)
- gUnknown_02022C84->unkA++;
+ if (sChat->exitDelayTimer < 150)
+ sChat->exitDelayTimer++;
if (!gReceivedRemoteLinkPlayers)
- gUnknown_02022C84->unk6++;
+ sChat->funcState++;
break;
case 3:
- if (gUnknown_02022C84->unkA >= 150)
- sub_801EBD4(9);
+ if (sChat->exitDelayTimer >= 150)
+ SetChatFunction(CHAT_FUNC_SAVE_AND_EXIT);
else
- gUnknown_02022C84->unkA++;
+ sChat->exitDelayTimer++;
break;
}
}
-static void sub_801E668(void)
+static void Chat_Disbanded(void)
{
- switch (gUnknown_02022C84->unk6)
+ switch (sChat->funcState)
{
case 0:
- if (!FuncIsActiveTask(sub_801F2B4))
+ if (!FuncIsActiveTask(Task_ReceiveChatMessage))
{
- if (gUnknown_02022C84->unk13)
- sub_801F5EC(7, 0);
+ if (sChat->multiplayerId)
+ StartDisplaySubtask(CHATDISPLAY_FUNC_DESTROY_YESNO, 0);
- gUnknown_02022C84->unk6++;
+ sChat->funcState++;
}
break;
case 1:
- if (!sub_801F644(0))
+ if (!IsDisplaySubtaskActive(0))
{
- if (gUnknown_02022C84->unk13)
- sub_801F5EC(19, 0);
+ if (sChat->multiplayerId)
+ StartDisplaySubtask(CHATDISPLAY_FUNC_PRINT_LEADER_LEFT, 0);
- gUnknown_02022C84->unk6++;
+ sChat->funcState++;
}
break;
case 2:
- if (sub_801F644(0) != TRUE && IsLinkTaskFinished() && !sub_8011A9C())
+ if (IsDisplaySubtaskActive(0) != TRUE && IsLinkTaskFinished() && !sub_8011A9C())
{
sub_800AC34();
- gUnknown_02022C84->unkA = 0;
- gUnknown_02022C84->unk6++;
+ sChat->exitDelayTimer = 0;
+ sChat->funcState++;
}
break;
case 3:
- if (gUnknown_02022C84->unkA < 150)
- gUnknown_02022C84->unkA++;
+ if (sChat->exitDelayTimer < 150)
+ sChat->exitDelayTimer++;
if (!gReceivedRemoteLinkPlayers)
- gUnknown_02022C84->unk6++;
+ sChat->funcState++;
break;
case 4:
- if (gUnknown_02022C84->unkA >= 150)
- sub_801EBD4(9);
+ if (sChat->exitDelayTimer >= 150)
+ SetChatFunction(CHAT_FUNC_SAVE_AND_EXIT);
else
- gUnknown_02022C84->unkA++;
+ sChat->exitDelayTimer++;
break;
}
}
-static void sub_801E764(void)
+static void Chat_SendMessage(void)
{
- switch (gUnknown_02022C84->unk6)
+ switch (sChat->funcState)
{
case 0:
if (!gReceivedRemoteLinkPlayers)
{
- sub_801EBD4(1);
+ SetChatFunction(CHAT_FUNC_HANDLE_INPUT);
break;
}
- sub_801EF4C(gUnknown_02022C84->unk190);
- gUnknown_02022C84->unk6++;
+ PrepareSendBuffer_Chat(sChat->sendMessageBuffer);
+ sChat->funcState++;
// fall through
case 1:
- if (IsLinkTaskFinished() == TRUE && !sub_8011A9C() && SendBlock(0, gUnknown_02022C84->unk190, sizeof(gUnknown_02022C84->unk190)))
- gUnknown_02022C84->unk6++;
+ if (IsLinkTaskFinished() == TRUE && !sub_8011A9C() && SendBlock(0, sChat->sendMessageBuffer, sizeof(sChat->sendMessageBuffer)))
+ sChat->funcState++;
break;
case 2:
- sub_801EE10();
- sub_801F5EC(8, 0);
- gUnknown_02022C84->unk6++;
+ ResetMessageEntryBuffer();
+ StartDisplaySubtask(CHATDISPLAY_FUNC_UPDATE_MSG, 0);
+ sChat->funcState++;
break;
case 3:
- if (!sub_801F644(0))
- gUnknown_02022C84->unk6++;
+ if (!IsDisplaySubtaskActive(0))
+ sChat->funcState++;
break;
case 4:
if (IsLinkTaskFinished())
- sub_801EBD4(1);
+ SetChatFunction(CHAT_FUNC_HANDLE_INPUT);
break;
}
}
-static void sub_801E838(void)
+static void Chat_Register(void)
{
- switch (gUnknown_02022C84->unk6)
+ switch (sChat->funcState)
{
case 0:
- if (sub_801EDC4())
+ if (ChatMessageIsNotEmpty())
{
- sub_801F5EC(9, 0);
- gUnknown_02022C84->unk6 = 2;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_ASK_REGISTER_TEXT, 0);
+ sChat->funcState = 2;
}
else
{
- sub_801F5EC(13, 0);
- gUnknown_02022C84->unk6 = 5;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_PRINT_INPUT_TEXT, 0);
+ sChat->funcState = 5;
}
break;
case 1:
if (gMain.newKeys & A_BUTTON)
{
- sub_801EDE0();
- sub_801F5EC(11, 0);
- gUnknown_02022C84->unk6 = 3;
+ RegisterTextAtRow();
+ StartDisplaySubtask(CHATDISPLAY_FUNC_RETURN_TO_KB, 0);
+ sChat->funcState = 3;
}
else if (gMain.newKeys & B_BUTTON)
{
- sub_801F5EC(10, 0);
- gUnknown_02022C84->unk6 = 4;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_CANCEL_REGISTER, 0);
+ sChat->funcState = 4;
}
- else if (sub_801EBE4())
+ else if (HandleDPadInput())
{
- sub_801F5EC(1, 0);
- gUnknown_02022C84->unk6 = 2;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_MOVE_KB_CURSOR, 0);
+ sChat->funcState = 2;
}
break;
case 2:
- if (!sub_801F644(0))
- gUnknown_02022C84->unk6 = 1;
+ if (!IsDisplaySubtaskActive(0))
+ sChat->funcState = 1;
break;
case 3:
- if (!sub_801F644(0))
+ if (!IsDisplaySubtaskActive(0))
{
- sub_801F5EC(10, 0);
- gUnknown_02022C84->unk6 = 4;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_CANCEL_REGISTER, 0);
+ sChat->funcState = 4;
}
break;
case 4:
- if (!sub_801F644(0))
- sub_801EBD4(1);
+ if (!IsDisplaySubtaskActive(0))
+ SetChatFunction(CHAT_FUNC_HANDLE_INPUT);
break;
case 5:
- if (!sub_801F644(0))
- gUnknown_02022C84->unk6 = 6;
+ if (!IsDisplaySubtaskActive(0))
+ sChat->funcState = 6;
break;
case 6:
if (gMain.newKeys & (A_BUTTON | B_BUTTON))
{
- sub_801F5EC(7, 0);
- gUnknown_02022C84->unk6 = 4;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_DESTROY_YESNO, 0);
+ sChat->funcState = 4;
}
break;
}
}
-static void sub_801E978(void)
+static void Chat_SaveAndExit(void)
{
s8 input;
- switch (gUnknown_02022C84->unk6)
+ switch (sChat->funcState)
{
case 0:
- if (!gUnknown_02022C84->unk18)
+ if (!sChat->changedRegisteredTexts)
{
- gUnknown_02022C84->unk6 = 12;
+ sChat->funcState = 12;
}
else
{
- sub_801F5EC(7, 0);
- gUnknown_02022C84->unk6 = 1;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_DESTROY_YESNO, 0);
+ sChat->funcState = 1;
}
break;
case 1:
- if (!sub_801F644(0))
+ if (!IsDisplaySubtaskActive(0))
{
- sub_801F5EC(14, 0);
- gUnknown_02022C84->unk6 = 2;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_ASK_SAVE, 0);
+ sChat->funcState = 2;
}
break;
case 2:
- input = sub_801FF08();
+ input = ProcessMenuInput();
switch (input)
{
case -1:
case 1:
- gUnknown_02022C84->unk6 = 12;
+ sChat->funcState = 12;
break;
case 0:
- sub_801F5EC(7, 0);
- gUnknown_02022C84->unk6 = 3;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_DESTROY_YESNO, 0);
+ sChat->funcState = 3;
break;
}
break;
case 3:
- if (!sub_801F644(0))
+ if (!IsDisplaySubtaskActive(0))
{
- sub_801F5EC(15, 0);
- gUnknown_02022C84->unk6 = 4;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_ASK_OVERWRITE_SAVE, 0);
+ sChat->funcState = 4;
}
break;
case 4:
- if (!sub_801F644(0))
- gUnknown_02022C84->unk6 = 5;
+ if (!IsDisplaySubtaskActive(0))
+ sChat->funcState = 5;
break;
case 5:
- input = sub_801FF08();
+ input = ProcessMenuInput();
switch (input)
{
case -1:
case 1:
- gUnknown_02022C84->unk6 = 12;
+ sChat->funcState = 12;
break;
case 0:
- sub_801F5EC(7, 0);
- gUnknown_02022C84->unk6 = 6;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_DESTROY_YESNO, 0);
+ sChat->funcState = 6;
break;
}
break;
case 6:
- if (!sub_801F644(0))
+ if (!IsDisplaySubtaskActive(0))
{
- sub_801F5EC(16, 0);
- sub_801EE2C();
- gUnknown_02022C84->unk6 = 7;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_PRINT_SAVING, 0);
+ SaveRegisteredTexts();
+ sChat->funcState = 7;
}
break;
case 7:
- if (!sub_801F644(0))
+ if (!IsDisplaySubtaskActive(0))
{
SetContinueGameWarpStatusToDynamicWarp();
TrySavingData(SAVE_NORMAL);
- gUnknown_02022C84->unk6 = 8;
+ sChat->funcState = 8;
}
break;
case 8:
- sub_801F5EC(17, 0);
- gUnknown_02022C84->unk6 = 9;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_PRINT_SAVED_GAME, 0);
+ sChat->funcState = 9;
break;
case 9:
- if (!sub_801F644(0))
+ if (!IsDisplaySubtaskActive(0))
{
PlaySE(SE_SAVE);
ClearContinueGameWarpStatus2();
- gUnknown_02022C84->unk6 = 10;
+ sChat->funcState = 10;
}
break;
case 10:
- gUnknown_02022C84->unk19 = 0;
- gUnknown_02022C84->unk6 = 11;
+ sChat->afterSaveTimer = 0;
+ sChat->funcState = 11;
break;
case 11:
- gUnknown_02022C84->unk19++;
- if (gUnknown_02022C84->unk19 > 120)
- gUnknown_02022C84->unk6 = 12;
+ sChat->afterSaveTimer++;
+ if (sChat->afterSaveTimer > 120)
+ sChat->funcState = 12;
break;
case 12:
BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK);
- gUnknown_02022C84->unk6 = 13;
+ sChat->funcState = 13;
break;
case 13:
if (!gPaletteFade.active)
{
- sub_801F544();
- sub_801DE30();
+ FreeDisplay();
+ FreeUnionRoomChat();
SetMainCallback2(CB2_ReturnToField);
}
break;
}
}
-static void sub_801EBD4(u16 arg0)
+static void SetChatFunction(u16 funcId)
{
- gUnknown_02022C84->unk4 = arg0;
- gUnknown_02022C84->unk6 = 0;
+ sChat->funcId = funcId;
+ sChat->funcState = 0;
}
-static bool32 sub_801EBE4(void)
+static bool32 HandleDPadInput(void)
{
- if (!(gMain.newAndRepeatedKeys & DPAD_UP))
+ do
{
+ if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ if (sChat->currentRow > 0)
+ sChat->currentRow--;
+ else
+ sChat->currentRow = sKeyboardPageMaxRow[sChat->currentPage];
+ break;
+ }
if (gMain.newAndRepeatedKeys & DPAD_DOWN)
{
- if (gUnknown_02022C84->currentRow < sKeyboardPageMaxRow[gUnknown_02022C84->currentPage])
- gUnknown_02022C84->currentRow++;
+ if (sChat->currentRow < sKeyboardPageMaxRow[sChat->currentPage])
+ sChat->currentRow++;
else
- gUnknown_02022C84->currentRow = 0;
-
- return TRUE;
+ sChat->currentRow = 0;
+ break;
}
-
- if (gUnknown_02022C84->currentPage != UNION_ROOM_KB_PAGE_COUNT)
+ if (sChat->currentPage != UNION_ROOM_KB_PAGE_REGISTER)
{
if (gMain.newAndRepeatedKeys & DPAD_LEFT)
{
- if (gUnknown_02022C84->unk11)
- gUnknown_02022C84->unk11--;
+ if (sChat->currentCol > 0)
+ sChat->currentCol--;
else
- gUnknown_02022C84->unk11 = 4;
+ sChat->currentCol = 4;
+ break;
}
else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
{
- if (gUnknown_02022C84->unk11 > 3)
- gUnknown_02022C84->unk11 = 0;
+ if (sChat->currentCol < 4)
+ sChat->currentCol++;
else
- gUnknown_02022C84->unk11++;
+ sChat->currentCol = 0;
+ break;
}
- else
- {
- return FALSE;
- }
-
- return TRUE;
}
-
return FALSE;
- }
- else
- {
- if (gUnknown_02022C84->currentRow)
- gUnknown_02022C84->currentRow--;
- else
- gUnknown_02022C84->currentRow = sKeyboardPageMaxRow[gUnknown_02022C84->currentPage];
+ } while (0);
- return TRUE;
- }
+ return TRUE;
}
-static void sub_801EC94(void)
+static void AppendTextToMessage(void)
{
int i;
const u8 *charsStr;
@@ -1357,10 +1640,11 @@ static void sub_801EC94(void)
u8 *str;
u8 buffer[21];
- if (gUnknown_02022C84->currentPage != UNION_ROOM_KB_PAGE_COUNT)
+ if (sChat->currentPage != UNION_ROOM_KB_PAGE_REGISTER)
{
- charsStr = sUnionRoomKeyboardText[gUnknown_02022C84->currentPage][gUnknown_02022C84->currentRow];
- for (i = 0; i < gUnknown_02022C84->unk11; i++)
+ // Going to append a single character
+ charsStr = sUnionRoomKeyboardText[sChat->currentPage][sChat->currentRow];
+ for (i = 0; i < sChat->currentCol; i++)
{
if (*charsStr == CHAR_SPECIAL_F9)
charsStr++;
@@ -1371,19 +1655,20 @@ static void sub_801EC94(void)
}
else
{
- u8 *tempStr = StringCopy(buffer, gUnknown_02022C84->unkB9[gUnknown_02022C84->currentRow]);
+ // Going to append registered text string
+ u8 *tempStr = StringCopy(buffer, sChat->registeredTexts[sChat->currentRow]);
tempStr[0] = CHAR_SPACE;
tempStr[1] = EOS;
charsStr = buffer;
strLength = StringLength_Multibyte(buffer);
}
- gUnknown_02022C84->unk14 = gUnknown_02022C84->unk15;
+ sChat->lastBufferCursorPos = sChat->bufferCursorPos;
if (!charsStr)
return;
- str = sub_801EE84();
- while (--strLength != -1 && gUnknown_02022C84->unk15 < 15)
+ str = GetEndOfMessagePtr();
+ while (--strLength != -1 && sChat->bufferCursorPos < MAX_MESSAGE_LENGTH)
{
if (*charsStr == CHAR_SPECIAL_F9)
{
@@ -1396,103 +1681,103 @@ static void sub_801EC94(void)
charsStr++;
str++;
- gUnknown_02022C84->unk15++;
+ sChat->bufferCursorPos++;
}
*str = EOS;
}
-static void sub_801ED68(void)
+static void DeleteLastMessageCharacter(void)
{
- gUnknown_02022C84->unk14 = gUnknown_02022C84->unk15;
- if (gUnknown_02022C84->unk15)
+ sChat->lastBufferCursorPos = sChat->bufferCursorPos;
+ if (sChat->bufferCursorPos)
{
- u8 *str = sub_801EEA8();
+ u8 *str = GetLastCharOfMessagePtr();
*str = EOS;
- gUnknown_02022C84->unk15--;
+ sChat->bufferCursorPos--;
}
}
-static void sub_801ED94(void)
+static void SwitchCaseOfLastMessageCharacter(void)
{
u8 *str;
u8 character;
- gUnknown_02022C84->unk14 = gUnknown_02022C84->unk15 - 1;
- str = sub_801EEA8();
+ sChat->lastBufferCursorPos = sChat->bufferCursorPos - 1;
+ str = GetLastCharOfMessagePtr();
if (*str != CHAR_SPECIAL_F9)
{
- character = gUnknown_082F2AA8[*str];
+ character = sCaseToggleTable[*str];
if (character)
*str = character;
}
}
-static bool32 sub_801EDC4(void)
+static bool32 ChatMessageIsNotEmpty(void)
{
- if (gUnknown_02022C84->unk15)
+ if (sChat->bufferCursorPos)
return TRUE;
else
return FALSE;
}
-static void sub_801EDE0(void)
+static void RegisterTextAtRow(void)
{
- u8 *src = sub_801F114();
- StringCopy(gUnknown_02022C84->unkB9[gUnknown_02022C84->currentRow], src);
- gUnknown_02022C84->unk18 = 1;
+ u8 *src = GetLimitedMessageStartPtr();
+ StringCopy(sChat->registeredTexts[sChat->currentRow], src);
+ sChat->changedRegisteredTexts = TRUE;
}
-static void sub_801EE10(void)
+static void ResetMessageEntryBuffer(void)
{
- gUnknown_02022C84->unk1A[0] = EOS;
- gUnknown_02022C84->unk14 = 15;
- gUnknown_02022C84->unk15 = 0;
+ sChat->messageEntryBuffer[0] = EOS;
+ sChat->lastBufferCursorPos = 15;
+ sChat->bufferCursorPos = 0;
}
-static void sub_801EE2C(void)
+static void SaveRegisteredTexts(void)
{
int i;
for (i = 0; i < UNION_ROOM_KB_ROW_COUNT; i++)
- StringCopy(gSaveBlock1Ptr->unk3C88[i], gUnknown_02022C84->unkB9[i]);
+ StringCopy(gSaveBlock1Ptr->registeredTexts[i], sChat->registeredTexts[i]);
}
-static u8 *sub_801EE6C(int arg0)
+static u8 *GetRegisteredTextByRow(int row)
{
- return gUnknown_02022C84->unkB9[arg0];
+ return sChat->registeredTexts[row];
}
-static u8 *sub_801EE84(void)
+static u8 *GetEndOfMessagePtr(void)
{
- u8 *str = gUnknown_02022C84->unk1A;
+ u8 *str = sChat->messageEntryBuffer;
while (*str != EOS)
str++;
return str;
}
-static u8 *sub_801EEA8(void)
+static u8 *GetLastCharOfMessagePtr(void)
{
- u8 *str = gUnknown_02022C84->unk1A;
- u8 *str2 = str;
- while (*str != EOS)
+ u8 *currChar = sChat->messageEntryBuffer;
+ u8 *lastChar = currChar;
+ while (*currChar != EOS)
{
- str2 = str;
- if (*str == CHAR_SPECIAL_F9)
- str++;
- str++;
+ lastChar = currChar;
+ if (*currChar == CHAR_SPECIAL_F9)
+ currChar++;
+ currChar++;
}
- return str2;
+ return lastChar;
}
-static u16 sub_801EED8(void)
+static u16 GetNumOverflowCharsInMessage(void)
{
u8 *str;
u32 i, numChars, strLength;
- strLength = StringLength_Multibyte(gUnknown_02022C84->unk1A);
- str = gUnknown_02022C84->unk1A;
+ strLength = StringLength_Multibyte(sChat->messageEntryBuffer);
+ str = sChat->messageEntryBuffer;
numChars = 0;
if (strLength > 10)
{
@@ -1510,83 +1795,83 @@ static u16 sub_801EED8(void)
return numChars;
}
-static void sub_801EF1C(u8 *arg0)
+static void PrepareSendBuffer_Null(u8 *buffer)
{
- arg0[0] = CHAR_SPACE;
+ buffer[0] = CHAT_MESSAGE_NONE;
}
-static void sub_801EF24(u8 *arg0)
+static void PrepareSendBuffer_Join(u8 *buffer)
{
- arg0[0] = 2;
- StringCopy(&arg0[1], gSaveBlock2Ptr->playerName);
- arg0[1 + (PLAYER_NAME_LENGTH + 1)] = gUnknown_02022C84->unk13;
+ buffer[0] = CHAT_MESSAGE_JOIN;
+ StringCopy(&buffer[1], gSaveBlock2Ptr->playerName);
+ buffer[1 + (PLAYER_NAME_LENGTH + 1)] = sChat->multiplayerId;
}
-static void sub_801EF4C(u8 *arg0)
+static void PrepareSendBuffer_Chat(u8 *buffer)
{
- arg0[0] = 1;
- StringCopy(&arg0[1], gSaveBlock2Ptr->playerName);
- StringCopy(&arg0[1 + (PLAYER_NAME_LENGTH + 1)], gUnknown_02022C84->unk1A);
+ buffer[0] = CHAT_MESSAGE_CHAT;
+ StringCopy(&buffer[1], gSaveBlock2Ptr->playerName);
+ StringCopy(&buffer[1 + (PLAYER_NAME_LENGTH + 1)], sChat->messageEntryBuffer);
}
-static void sub_801EF7C(u8 *arg0)
+static void PrepareSendBuffer_Leave(u8 *buffer)
{
- arg0[0] = 3;
- StringCopy(&arg0[1], gSaveBlock2Ptr->playerName);
- arg0[1 + (PLAYER_NAME_LENGTH + 1)] = gUnknown_02022C84->unk13;
+ buffer[0] = CHAT_MESSAGE_LEAVE;
+ StringCopy(&buffer[1], gSaveBlock2Ptr->playerName);
+ buffer[1 + (PLAYER_NAME_LENGTH + 1)] = sChat->multiplayerId;
sub_8011A50();
}
-static void sub_801EFA8(u8 *arg0)
+static void PrepareSendBuffer_Drop(u8 *buffer)
{
- arg0[0] = 4;
- StringCopy(&arg0[1], gSaveBlock2Ptr->playerName);
- arg0[1 + (PLAYER_NAME_LENGTH + 1)] = gUnknown_02022C84->unk13;
+ buffer[0] = CHAT_MESSAGE_DROP;
+ StringCopy(&buffer[1], gSaveBlock2Ptr->playerName);
+ buffer[1 + (PLAYER_NAME_LENGTH + 1)] = sChat->multiplayerId;
}
-static void sub_801EFD0(u8 *arg0)
+static void PrepareSendBuffer_Disband(u8 *buffer)
{
- arg0[0] = 5;
- StringCopy(&arg0[1], gSaveBlock2Ptr->playerName);
- arg0[1 + (PLAYER_NAME_LENGTH + 1)] = gUnknown_02022C84->unk13;
+ buffer[0] = CHAT_MESSAGE_DISBAND;
+ StringCopy(&buffer[1], gSaveBlock2Ptr->playerName);
+ buffer[1 + (PLAYER_NAME_LENGTH + 1)] = sChat->multiplayerId;
}
-static bool32 sub_801EFF8(u8 *arg0, u8 *arg1)
+static bool32 ProcessReceivedChatMessage(u8 *dest, u8 *recvMessage)
{
u8 *tempStr;
- u8 var0 = *arg1;
- u8 *str = arg1 + 1;
- arg1 = str;
- arg1 += 8;
+ u8 cmd = *recvMessage;
+ u8 *name = recvMessage + 1;
+ recvMessage = name;
+ recvMessage += PLAYER_NAME_LENGTH + 1;
- switch (var0)
+ switch (cmd)
{
- case 2:
- if (gUnknown_02022C84->unk13 != str[8])
+ case CHAT_MESSAGE_JOIN:
+ if (sChat->multiplayerId != name[PLAYER_NAME_LENGTH + 1])
{
DynamicPlaceholderTextUtil_Reset();
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, str);
- DynamicPlaceholderTextUtil_ExpandPlaceholders(arg0, gText_F700JoinedChat);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, name);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(dest, gText_F700JoinedChat);
return TRUE;
}
break;
- case 1:
- tempStr = StringCopy(arg0, str);
+ case CHAT_MESSAGE_CHAT:
+ tempStr = StringCopy(dest, name);
*(tempStr++) = EXT_CTRL_CODE_BEGIN;
*(tempStr++) = EXT_CTRL_CODE_CLEAR_TO;
*(tempStr++) = 42;
*(tempStr++) = CHAR_COLON;
- StringCopy(tempStr, arg1);
+ StringCopy(tempStr, recvMessage);
return TRUE;
- case 5:
- StringCopy(gUnknown_02022C84->unk79, str);
+ case CHAT_MESSAGE_DISBAND:
+ StringCopy(sChat->hostName, name);
// fall through
- case 3:
- if (gUnknown_02022C84->unk13 != *arg1)
+ case CHAT_MESSAGE_LEAVE:
+ if (sChat->multiplayerId != *recvMessage)
{
DynamicPlaceholderTextUtil_Reset();
- DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, str);
- DynamicPlaceholderTextUtil_ExpandPlaceholders(arg0, gText_F700LeftChat);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, name);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(dest, gText_F700LeftChat);
return TRUE;
}
break;
@@ -1597,47 +1882,47 @@ static bool32 sub_801EFF8(u8 *arg0, u8 *arg1)
static u8 GetCurrentKeyboardPage(void)
{
- return gUnknown_02022C84->currentPage;
+ return sChat->currentPage;
}
-static void sub_801F0BC(u8 *arg0, u8 *arg1)
+static void GetCurrentKeyboardColAndRow(u8 *col, u8 *row)
{
- *arg0 = gUnknown_02022C84->unk11;
- *arg1 = gUnknown_02022C84->currentRow;
+ *col = sChat->currentCol;
+ *row = sChat->currentRow;
}
-static u8 *sub_801F0D0(void)
+static u8 *GetMessageEntryBuffer(void)
{
- return gUnknown_02022C84->unk1A;
+ return sChat->messageEntryBuffer;
}
-static int sub_801F0DC(void)
+static int GetLengthOfMessageEntry(void)
{
- u8 *str = sub_801F0D0();
+ u8 *str = GetMessageEntryBuffer();
return StringLength_Multibyte(str);
}
-static void sub_801F0EC(u32 *arg0, u32 *arg1)
+static void GetBufferSelectionRegion(u32 *x, u32 *width)
{
- int diff = gUnknown_02022C84->unk15 - gUnknown_02022C84->unk14;
+ int diff = sChat->bufferCursorPos - sChat->lastBufferCursorPos;
if (diff < 0)
{
diff *= -1;
- *arg0 = gUnknown_02022C84->unk15;
+ *x = sChat->bufferCursorPos;
}
else
{
- *arg0 = gUnknown_02022C84->unk14;
+ *x = sChat->lastBufferCursorPos;
}
- *arg1 = diff;
+ *width = diff;
}
-static u8 *sub_801F114(void)
+static u8 *GetLimitedMessageStartPtr(void)
{
int i;
- u16 numChars = sub_801EED8();
- u8 *str = gUnknown_02022C84->unk1A;
+ u16 numChars = GetNumOverflowCharsInMessage();
+ u8 *str = sChat->messageEntryBuffer;
for (i = 0; i < numChars; i++)
{
if (*str == CHAR_SPECIAL_F9)
@@ -1649,12 +1934,12 @@ static u8 *sub_801F114(void)
return str;
}
-static u16 sub_801F144(void)
+static u16 GetLimitedMessageStartPos(void)
{
u16 count;
u32 i;
- u16 numChars = sub_801EED8();
- u8 *str = gUnknown_02022C84->unk1A;
+ u16 numChars = GetNumOverflowCharsInMessage();
+ u8 *str = sChat->messageEntryBuffer;
for (count = 0, i = 0; i < numChars; count++, i++)
{
if (*str == CHAR_SPECIAL_F9)
@@ -1666,56 +1951,63 @@ static u16 sub_801F144(void)
return count;
}
-static u8 *sub_801F180(void)
+static u8 *GetLastReceivedMessage(void)
{
- return gUnknown_02022C84->unk39;
+ return sChat->receivedMessage;
}
-static u8 sub_801F18C(void)
+static u8 GetReceivedPlayerIndex(void)
{
- return gUnknown_02022C84->unk16;
+ return sChat->receivedPlayerIndex;
}
-static int sub_801F198(void)
+static int GetTextEntryCursorPosition(void)
{
- return gUnknown_02022C84->unk15;
+ return sChat->bufferCursorPos;
}
-static int sub_801F1A4(void)
+static int GetShouldShowCaseToggleIcon(void)
{
- u8 *str = sub_801EEA8();
+ u8 *str = GetLastCharOfMessagePtr();
u32 character = *str;
- if (character > 0xFF || gUnknown_082F2AA8[character] == character || gUnknown_082F2AA8[character] == 0)
+ if (character > 0xFF || sCaseToggleTable[character] == character || sCaseToggleTable[character] == 0)
return 3;
else
return 0;
}
-static u8 *sub_801F1D0(void)
+static u8 *GetChatHostName(void)
{
- return gUnknown_02022C84->unk79;
+ return sChat->hostName;
}
-void copy_strings_to_sav1(void)
+void InitUnionRoomChatRegisteredTexts(void)
{
- StringCopy(gSaveBlock1Ptr->unk3C88[0], gText_Hello);
- StringCopy(gSaveBlock1Ptr->unk3C88[1], gText_Pokemon2);
- StringCopy(gSaveBlock1Ptr->unk3C88[2], gText_Trade);
- StringCopy(gSaveBlock1Ptr->unk3C88[3], gText_Battle);
- StringCopy(gSaveBlock1Ptr->unk3C88[4], gText_Lets);
- StringCopy(gSaveBlock1Ptr->unk3C88[5], gText_Ok);
- StringCopy(gSaveBlock1Ptr->unk3C88[6], gText_Sorry);
- StringCopy(gSaveBlock1Ptr->unk3C88[7], gText_YaySmileEmoji);
- StringCopy(gSaveBlock1Ptr->unk3C88[8], gText_ThankYou);
- StringCopy(gSaveBlock1Ptr->unk3C88[9], gText_ByeBye);
+ StringCopy(gSaveBlock1Ptr->registeredTexts[0], gText_Hello);
+ StringCopy(gSaveBlock1Ptr->registeredTexts[1], gText_Pokemon2);
+ StringCopy(gSaveBlock1Ptr->registeredTexts[2], gText_Trade);
+ StringCopy(gSaveBlock1Ptr->registeredTexts[3], gText_Battle);
+ StringCopy(gSaveBlock1Ptr->registeredTexts[4], gText_Lets);
+ StringCopy(gSaveBlock1Ptr->registeredTexts[5], gText_Ok);
+ StringCopy(gSaveBlock1Ptr->registeredTexts[6], gText_Sorry);
+ StringCopy(gSaveBlock1Ptr->registeredTexts[7], gText_YaySmileEmoji);
+ StringCopy(gSaveBlock1Ptr->registeredTexts[8], gText_ThankYou);
+ StringCopy(gSaveBlock1Ptr->registeredTexts[9], gText_ByeBye);
}
-static void sub_801F2B4(u8 taskId)
+#define tState data[0]
+#define tI data[1]
+#define tCurrLinkPlayer data[2]
+#define tBlockReceivedStatus data[3]
+#define tLinkPlayerCount data[4]
+#define tNextState data[5]
+
+static void Task_ReceiveChatMessage(u8 taskId)
{
u8 *buffer;
s16 *data = gTasks[taskId].data;
- switch (data[0])
+ switch (tState)
{
case 0:
if (!gReceivedRemoteLinkPlayers)
@@ -1724,115 +2016,122 @@ static void sub_801F2B4(u8 taskId)
return;
}
- data[0] = 1;
+ tState = 1;
// fall through
case 1:
- data[4] = GetLinkPlayerCount();
- if (gUnknown_02022C84->unkD != data[4])
+ tLinkPlayerCount = GetLinkPlayerCount();
+ if (sChat->linkPlayerCount != tLinkPlayerCount)
{
- data[0] = 2;
- gUnknown_02022C84->unkD = data[4];
+ tState = 2;
+ sChat->linkPlayerCount = tLinkPlayerCount;
return;
}
- data[3] = GetBlockReceivedStatus();
- if (!data[3] && sub_8011A9C())
+ tBlockReceivedStatus = GetBlockReceivedStatus();
+ if (!tBlockReceivedStatus && sub_8011A9C())
return;
- data[1] = 0;
- data[0] = 3;
+ tI = 0;
+ tState = 3;
// fall through
case 3:
- for (; data[1] < 5 && ((data[3] >> data[1]) & 1) == 0; data[1]++)
+ for (; tI < 5 && ((tBlockReceivedStatus >> tI) & 1) == 0; tI++)
;
- if (data[1] == 5)
+ if (tI == 5)
{
- data[0] = 1;
+ tState = 1;
return;
}
- data[2] = data[1];
- ResetBlockReceivedFlag(data[2]);
- buffer = (u8 *)gBlockRecvBuffer[data[1]];
+ tCurrLinkPlayer = tI;
+ ResetBlockReceivedFlag(tCurrLinkPlayer);
+ buffer = (u8 *)gBlockRecvBuffer[tI];
switch (buffer[0])
{
default:
- case 1: data[5] = 3; break;
- case 2: data[5] = 3; break;
- case 3: data[5] = 4; break;
- case 4: data[5] = 5; break;
- case 5: data[5] = 6; break;
+ case CHAT_MESSAGE_CHAT: tNextState = 3; break;
+ case CHAT_MESSAGE_JOIN: tNextState = 3; break;
+ case CHAT_MESSAGE_LEAVE: tNextState = 4; break;
+ case CHAT_MESSAGE_DROP: tNextState = 5; break;
+ case CHAT_MESSAGE_DISBAND: tNextState = 6; break;
}
- if (sub_801EFF8(gUnknown_02022C84->unk39, (u8 *)gBlockRecvBuffer[data[1]]))
+ if (ProcessReceivedChatMessage(sChat->receivedMessage, (u8 *)gBlockRecvBuffer[tI]))
{
- gUnknown_02022C84->unk16 = data[1];
- sub_801F5EC(12, 2);
- data[0] = 7;
+ sChat->receivedPlayerIndex = tI;
+ StartDisplaySubtask(CHATDISPLAY_FUNC_SCROLL_CHAT, 2);
+ tState = 7;
}
else
{
- data[0] = data[5];
+ tState = tNextState;
}
- data[1]++;
+ tI++;
break;
case 7:
- if (!sub_801F644(2))
- data[0] = data[5];
+ if (!IsDisplaySubtaskActive(2))
+ tState = tNextState;
break;
case 4:
- if (!gUnknown_02022C84->unk13 && data[2])
+ if (!sChat->multiplayerId && tCurrLinkPlayer)
{
if (GetLinkPlayerCount() == 2)
{
sub_80104B0();
- gUnknown_02022C84->unk17 = 1;
+ sChat->exitType = 1;
DestroyTask(taskId);
return;
}
- sub_8011DE0(data[2]);
+ sub_8011DE0(tCurrLinkPlayer);
}
- data[0] = 3;
+ tState = 3;
break;
case 5:
- if (gUnknown_02022C84->unk13)
- gUnknown_02022C84->unk17 = 2;
+ if (sChat->multiplayerId)
+ sChat->exitType = 2;
DestroyTask(taskId);
break;
case 6:
- gUnknown_02022C84->unk17 = 3;
+ sChat->exitType = 3;
DestroyTask(taskId);
break;
case 2:
if (!sub_8011A9C())
{
- if (!gUnknown_02022C84->unk13)
- sub_80110B8(gUnknown_02022C84->unkD);
+ if (!sChat->multiplayerId)
+ sub_80110B8(sChat->linkPlayerCount);
- data[0] = 1;
+ tState = 1;
}
break;
}
}
-static bool8 sub_801F4D0(void)
+#undef tNextState
+#undef tLinkPlayerCount
+#undef tBlockReceivedStatus
+#undef tCurrLinkPlayer
+#undef tI
+#undef tState
+
+static bool8 TryAllocDisplay(void)
{
- gUnknown_02022C88 = Alloc(sizeof(*gUnknown_02022C88));
- if (gUnknown_02022C88 && sub_8020890())
+ sDisplay = Alloc(sizeof(*sDisplay));
+ if (sDisplay && TryAllocSprites())
{
ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, gUnknown_082F2C60, ARRAY_COUNT(gUnknown_082F2C60));
- InitWindows(gUnknown_082F2C70);
+ InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));
+ InitWindows(sWinTemplates);
ResetTempTileDataBuffers();
- sub_8020770();
- sub_801F574(gUnknown_02022C88);
- sub_801F580();
- sub_801F5EC(0, 0);
+ InitScanlineEffect();
+ InitDisplay(sDisplay);
+ ResetDisplaySubtasks();
+ StartDisplaySubtask(CHATDISPLAY_FUNC_LOAD_GFX, 0);
return TRUE;
}
else
@@ -1841,80 +2140,80 @@ static bool8 sub_801F4D0(void)
}
}
-static bool32 sub_801F534(void)
+static bool32 IsDisplaySubtask0Active(void)
{
- return sub_801F644(0);
+ return IsDisplaySubtaskActive(0);
}
-static void sub_801F544(void)
+static void FreeDisplay(void)
{
- sub_80208D0();
- if (gUnknown_02022C88)
- FREE_AND_SET_NULL(gUnknown_02022C88);
+ FreeSprites();
+ if (sDisplay)
+ FREE_AND_SET_NULL(sDisplay);
FreeAllWindowBuffers();
gScanlineEffect.state = 3;
}
-static void sub_801F574(struct UnionRoomChat2 *arg0)
+static void InitDisplay(struct UnionRoomChatDisplay *display)
{
- arg0->unk18 = 0xFF;
- arg0->unk1E = 0xFF;
- arg0->unk1A = 0;
+ display->yesNoMenuWindowId = 0xFF;
+ display->messageWindowId = 0xFF;
+ display->currLine = 0;
}
-static void sub_801F580(void)
+static void ResetDisplaySubtasks(void)
{
int i;
- if (!gUnknown_02022C88)
+ if (!sDisplay)
return;
- for (i = 0; i < 3; i++)
+ for (i = 0; i < (int)ARRAY_COUNT(sDisplay->subtasks); i++)
{
- gUnknown_02022C88->unk0[i].unk0 = sub_801FDD8;
- gUnknown_02022C88->unk0[i].unk4 = 0;
- gUnknown_02022C88->unk0[i].unk5 = 0;
+ sDisplay->subtasks[i].callback = Display_Dummy;
+ sDisplay->subtasks[i].active = FALSE;
+ sDisplay->subtasks[i].state = 0;
}
}
-static void sub_801F5B8(void)
+static void RunDisplaySubtasks(void)
{
int i;
- if (!gUnknown_02022C88)
+ if (!sDisplay)
return;
- for (i = 0; i < 3; i++)
+ for (i = 0; i < (int)ARRAY_COUNT(sDisplay->subtasks); i++)
{
- gUnknown_02022C88->unk0[i].unk4 =
- gUnknown_02022C88->unk0[i].unk0(&gUnknown_02022C88->unk0[i].unk5);
+ sDisplay->subtasks[i].active =
+ sDisplay->subtasks[i].callback(&sDisplay->subtasks[i].state);
}
}
-static void sub_801F5EC(u16 arg0, u8 arg1)
+static void StartDisplaySubtask(u16 subtaskId, u8 assignId)
{
u32 i;
- gUnknown_02022C88->unk0[arg1].unk0 = sub_801FDD8;
- for (i = 0; i < 21; i++)
+ sDisplay->subtasks[assignId].callback = Display_Dummy;
+ for (i = 0; i < ARRAY_COUNT(sDisplaySubtasks); i++)
{
- if (gUnknown_082F2C98[i].unk0 == arg0)
+ if (sDisplaySubtasks[i].idx == subtaskId)
{
- gUnknown_02022C88->unk0[arg1].unk0 = gUnknown_082F2C98[i].unk4;
- gUnknown_02022C88->unk0[arg1].unk4 = 1;
- gUnknown_02022C88->unk0[arg1].unk5 = 0;
+ sDisplay->subtasks[assignId].callback = sDisplaySubtasks[i].callback;
+ sDisplay->subtasks[assignId].active = TRUE;
+ sDisplay->subtasks[assignId].state = 0;
break;
}
}
}
-static bool8 sub_801F644(u8 arg0)
+static bool8 IsDisplaySubtaskActive(u8 id)
{
- return gUnknown_02022C88->unk0[arg0].unk4;
+ return sDisplay->subtasks[id].active;
}
-bool32 sub_801F658(u8 *state)
+static bool32 Display_LoadGfx(u8 *state)
{
if (FreeTempTileDataBuffersIfPossible() == TRUE)
return TRUE;
@@ -1922,33 +2221,33 @@ bool32 sub_801F658(u8 *state)
switch (*state)
{
case 0:
- sub_8020480();
- sub_8020538();
+ ResetGpuBgState();
+ SetBgTilemapBuffers();
break;
case 1:
- sub_8020584();
+ ClearBg0();
break;
case 2:
- sub_80205B4();
+ LoadChatWindowBorderGfx();
break;
case 3:
- sub_8020604();
+ LoadChatWindowGfx();
break;
case 4:
sub_8020680();
break;
case 5:
- sub_80206A4();
- sub_80206D0();
- sub_8020740();
- sub_80206E8();
+ LoadChatMessagesWindow();
+ LoadKeyboardWindow();
+ LoadKeyboardSwapWindow();
+ LoadTextEntryWindow();
break;
case 6:
if (!IsDma3ManagerBusyWithBgCopy())
{
- sub_80208E8();
- sub_8020A68();
- sub_8020B20();
+ CreateKeyboardCursorSprite();
+ CreateTextEntrySprites();
+ CreateRButtonSprites();
}
break;
default:
@@ -1959,12 +2258,12 @@ bool32 sub_801F658(u8 *state)
return TRUE;
}
-bool32 sub_801F6F8(u8 *state)
+static bool32 Display_ShowKeyboardSwapMenu(u8 *state)
{
switch (*state)
{
case 0:
- sub_80203B0();
+ ShowKeyboardSwapMenu();
CopyWindowToVram(3, 3);
break;
case 1:
@@ -1975,12 +2274,12 @@ bool32 sub_801F6F8(u8 *state)
return TRUE;
}
-bool32 sub_801F730(u8 *state)
+static bool32 Display_HideKeyboardSwapMenu(u8 *state)
{
switch (*state)
{
case 0:
- sub_802040C();
+ HideKeyboardSwapMenu();
CopyWindowToVram(3, 3);
break;
case 1:
@@ -1991,16 +2290,16 @@ bool32 sub_801F730(u8 *state)
return TRUE;
}
-bool32 sub_801F768(u8 *state)
+static bool32 Display_SwitchPages(u8 *state)
{
switch (*state)
{
case 0:
- sub_802091C(TRUE);
+ SetKeyboardCursorInvisibility(TRUE);
if (sub_8020320())
return TRUE;
- sub_80201A4();
+ PrintCurrentKeyboardPage();
CopyWindowToVram(2, 2);
break;
case 1:
@@ -2011,9 +2310,9 @@ bool32 sub_801F768(u8 *state)
if (sub_8020368())
return TRUE;
- sub_802093C();
- sub_802091C(FALSE);
- sub_8020B80();
+ MoveKeyboardCursor();
+ SetKeyboardCursorInvisibility(FALSE);
+ UpdateRButtonLabel();
return FALSE;
}
@@ -2021,20 +2320,20 @@ bool32 sub_801F768(u8 *state)
return TRUE;
}
-bool32 sub_801F7D4(u8 *state)
+static bool32 Display_MoveKeyboardCursor(u8 *state)
{
- sub_802093C();
+ MoveKeyboardCursor();
return FALSE;
}
-bool32 sub_801F7E0(u8 *state)
+static bool32 Display_AskQuitChatting(u8 *state)
{
switch (*state)
{
case 0:
- sub_801FF18(0, 0);
- sub_801FDDC(23, 11, 1);
- CopyWindowToVram(gUnknown_02022C88->unk1E, 3);
+ AddStdMessageWindow(STDMESSAGE_QUIT_CHATTING, 0);
+ AddYesNoMenuAt(23, 11, 1);
+ CopyWindowToVram(sDisplay->messageWindowId, 3);
break;
case 1:
return IsDma3ManagerBusyWithBgCopy();
@@ -2044,21 +2343,21 @@ bool32 sub_801F7E0(u8 *state)
return TRUE;
}
-bool32 sub_801F82C(u8 *state)
+static bool32 Display_DestroyYesNoDialog(u8 *state)
{
switch (*state)
{
case 0:
- sub_8020094();
- sub_801FEBC();
+ HideStdMessageWindow();
+ HideYesNoMenuWindow();
CopyBgTilemapBufferToVram(0);
break;
case 1:
if (IsDma3ManagerBusyWithBgCopy())
return TRUE;
- sub_80200C8();
- sub_801FEE4();
+ DestroyStdMessageWindow();
+ DestroyYesNoMenuWindow();
return FALSE;
}
@@ -2066,24 +2365,24 @@ bool32 sub_801F82C(u8 *state)
return TRUE;
}
-bool32 sub_801F870(u8 *state)
+static bool32 Display_UpdateMessageBuffer(u8 *state)
{
- u32 var0, var1;
+ u32 x, width;
u8 *str;
switch (*state)
{
case 0:
- sub_801F0EC(&var0, &var1);
- sub_80200EC(var0, var1, 0);
- str = sub_801F0D0();
- sub_8020118(0, str, 3, 1, 2);
+ GetBufferSelectionRegion(&x, &width);
+ FillTextEntryWindow(x, width, 0);
+ str = GetMessageEntryBuffer();
+ DrawTextEntryMessage(0, str, 3, 1, 2);
CopyWindowToVram(1, 2);
break;
case 1:
if (!IsDma3ManagerBusyWithBgCopy())
{
- sub_8020B80();
+ UpdateRButtonLabel();
return FALSE;
}
return TRUE;
@@ -2093,27 +2392,27 @@ bool32 sub_801F870(u8 *state)
return TRUE;
}
-bool32 sub_801F8DC(u8 *state)
+static bool32 Display_AskRegisterText(u8 *state)
{
- u16 var0;
+ u16 x;
u8 *str;
u16 length;
switch (*state)
{
case 0:
- var0 = sub_801F144();
- str = sub_801F114();
+ x = GetLimitedMessageStartPos();
+ str = GetLimitedMessageStartPtr();
length = StringLength_Multibyte(str);
- sub_80200EC(var0, length, PIXEL_FILL(6));
- sub_8020118(var0, str, 0, 4, 5);
+ FillTextEntryWindow(x, length, PIXEL_FILL(6));
+ DrawTextEntryMessage(x, str, 0, 4, 5);
CopyWindowToVram(1, 2);
break;
case 1:
if (!IsDma3ManagerBusyWithBgCopy())
{
- sub_801FF18(1, 16);
- CopyWindowToVram(gUnknown_02022C88->unk1E, 3);
+ AddStdMessageWindow(STDMESSAGE_REGISTER_WHERE, 16);
+ CopyWindowToVram(sDisplay->messageWindowId, 3);
}
else
{
@@ -2122,7 +2421,7 @@ bool32 sub_801F8DC(u8 *state)
break;
case 2:
if (!IsDma3ManagerBusyWithBgCopy())
- sub_80209AC(1);
+ SetRegisteredTextPalette(TRUE);
else
return TRUE;
break;
@@ -2134,27 +2433,27 @@ bool32 sub_801F8DC(u8 *state)
return TRUE;
}
-bool32 sub_801F984(u8 *state)
+static bool32 Display_CancelRegister(u8 *state)
{
- u16 var0;
+ u16 x;
u8 *str;
u16 length;
switch (*state)
{
case 0:
- var0 = sub_801F144();
- str = sub_801F114();
+ x = GetLimitedMessageStartPos();
+ str = GetLimitedMessageStartPtr();
length = StringLength_Multibyte(str);
- sub_80200EC(var0, length, PIXEL_FILL(0));
- sub_8020118(var0, str, 3, 1, 2);
+ FillTextEntryWindow(x, length, PIXEL_FILL(0));
+ DrawTextEntryMessage(x, str, 3, 1, 2);
CopyWindowToVram(1, 2);
break;
case 1:
if (!IsDma3ManagerBusyWithBgCopy())
{
- sub_8020094();
- CopyWindowToVram(gUnknown_02022C88->unk1E, 3);
+ HideStdMessageWindow();
+ CopyWindowToVram(sDisplay->messageWindowId, 3);
}
else
{
@@ -2164,8 +2463,8 @@ bool32 sub_801F984(u8 *state)
case 2:
if (!IsDma3ManagerBusyWithBgCopy())
{
- sub_80209AC(0);
- sub_80200C8();
+ SetRegisteredTextPalette(FALSE);
+ DestroyStdMessageWindow();
}
else
{
@@ -2180,12 +2479,12 @@ bool32 sub_801F984(u8 *state)
return TRUE;
}
-bool32 sub_801FA2C(u8 *state)
+static bool32 Display_ReturnToKeyboard(u8 *state)
{
switch (*state)
{
case 0:
- sub_80201A4();
+ PrintCurrentKeyboardPage();
CopyWindowToVram(2, 2);
(*state)++;
break;
@@ -2199,48 +2498,48 @@ bool32 sub_801FA2C(u8 *state)
return TRUE;
}
-bool32 sub_801FA68(u8 *state)
+static bool32 Display_ScrollChat(u8 *state)
{
- u16 var0;
+ u16 row;
u8 *str;
- u8 var1;
+ u8 colorIdx;
switch (*state)
{
case 0:
- var0 = gUnknown_02022C88->unk1A;
- str = sub_801F180();
- var1 = sub_801F18C();
- sub_8020420(var0, str, var1);
+ row = sDisplay->currLine;
+ str = GetLastReceivedMessage();
+ colorIdx = GetReceivedPlayerIndex();
+ PrintChatMessage(row, str, colorIdx);
CopyWindowToVram(0, 2);
break;
case 1:
if (IsDma3ManagerBusyWithBgCopy())
return TRUE;
- if (gUnknown_02022C88->unk1A < 9)
+ if (sDisplay->currLine < 9)
{
- gUnknown_02022C88->unk1A++;
+ sDisplay->currLine++;
*state = 4;
return FALSE;
}
else
{
- gUnknown_02022C88->unk1C = 0;
+ sDisplay->scrollCount = 0;
(*state)++;
}
// fall through
case 2:
ScrollWindow(0, 0, 5, PIXEL_FILL(1));
CopyWindowToVram(0, 2);
- gUnknown_02022C88->unk1C++;
+ sDisplay->scrollCount++;
(*state)++;
// fall through
case 3:
if (IsDma3ManagerBusyWithBgCopy())
return TRUE;
- if (gUnknown_02022C88->unk1C < 3)
+ if (sDisplay->scrollCount < 3)
{
(*state)--;
return TRUE;
@@ -2256,28 +2555,28 @@ bool32 sub_801FA68(u8 *state)
return TRUE;
}
-bool32 sub_801FB44(u8 *state)
+static bool32 Display_AnimateKeyboardCursor(u8 *state)
{
switch (*state)
{
case 0:
- sub_80209E0();
+ StartKeyboardCursorAnim();
(*state)++;
break;
case 1:
- return sub_8020A1C();
+ return TryKeyboardCursorReopen();
}
return TRUE;
}
-bool32 sub_801FB70(u8 *state)
+static bool32 Display_PrintInputText(u8 *state)
{
switch (*state)
{
case 0:
- sub_801FF18(3, 16);
- CopyWindowToVram(gUnknown_02022C88->unk1E, 3);
+ AddStdMessageWindow(STDMESSAGE_INPUT_TEXT, 16);
+ CopyWindowToVram(sDisplay->messageWindowId, 3);
(*state)++;
break;
case 1:
@@ -2287,13 +2586,13 @@ bool32 sub_801FB70(u8 *state)
return TRUE;
}
-bool32 sub_801FBB4(u8 *state)
+static bool32 Display_PrintExitingChat(u8 *state)
{
switch (*state)
{
case 0:
- sub_801FF18(4, 0);
- CopyWindowToVram(gUnknown_02022C88->unk1E, 3);
+ AddStdMessageWindow(STDMESSAGE_EXITING_CHAT, 0);
+ CopyWindowToVram(sDisplay->messageWindowId, 3);
(*state)++;
break;
case 1:
@@ -2303,7 +2602,7 @@ bool32 sub_801FBB4(u8 *state)
return TRUE;
}
-bool32 sub_801FBF8(u8 *state)
+static bool32 Display_PrintLeaderLeft(u8 *state)
{
u8 *str;
@@ -2311,10 +2610,10 @@ bool32 sub_801FBF8(u8 *state)
{
case 0:
DynamicPlaceholderTextUtil_Reset();
- str = sub_801F1D0();
+ str = GetChatHostName();
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, str);
- sub_801FF18(5, 0);
- CopyWindowToVram(gUnknown_02022C88->unk1E, 3);
+ AddStdMessageWindow(STDMESSAGE_LEADER_LEFT, 0);
+ CopyWindowToVram(sDisplay->messageWindowId, 3);
(*state)++;
break;
case 1:
@@ -2324,14 +2623,14 @@ bool32 sub_801FBF8(u8 *state)
return TRUE;
}
-bool32 sub_801FC4C(u8 *state)
+static bool32 Display_AskSave(u8 *state)
{
switch (*state)
{
case 0:
- sub_801FF18(6, 0);
- sub_801FDDC(23, 10, 1);
- CopyWindowToVram(gUnknown_02022C88->unk1E, 3);
+ AddStdMessageWindow(STDMESSAGE_ASK_SAVE, 0);
+ AddYesNoMenuAt(23, 10, 1);
+ CopyWindowToVram(sDisplay->messageWindowId, 3);
(*state)++;
break;
case 1:
@@ -2341,14 +2640,14 @@ bool32 sub_801FC4C(u8 *state)
return TRUE;
}
-bool32 sub_801FC9C(u8 *state)
+static bool32 Display_AskOverwriteSave(u8 *state)
{
switch (*state)
{
case 0:
- sub_801FF18(7, 0);
- sub_801FDDC(23, 10, 1);
- CopyWindowToVram(gUnknown_02022C88->unk1E, 3);
+ AddStdMessageWindow(STDMESSAGE_ASK_OVERWRITE, 0);
+ AddYesNoMenuAt(23, 10, 1);
+ CopyWindowToVram(sDisplay->messageWindowId, 3);
(*state)++;
break;
case 1:
@@ -2358,13 +2657,13 @@ bool32 sub_801FC9C(u8 *state)
return TRUE;
}
-bool32 sub_801FCEC(u8 *state)
+static bool32 Display_PrintSavingDontTurnOff(u8 *state)
{
switch (*state)
{
case 0:
- sub_801FF18(8, 0);
- CopyWindowToVram(gUnknown_02022C88->unk1E, 3);
+ AddStdMessageWindow(STDMESSAGE_SAVING_NO_OFF, 0);
+ CopyWindowToVram(sDisplay->messageWindowId, 3);
(*state)++;
break;
case 1:
@@ -2374,15 +2673,15 @@ bool32 sub_801FCEC(u8 *state)
return TRUE;
}
-bool32 sub_801FD30(u8 *state)
+static bool32 Display_PrintSavedTheGame(u8 *state)
{
switch (*state)
{
case 0:
DynamicPlaceholderTextUtil_Reset();
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName);
- sub_801FF18(9, 0);
- CopyWindowToVram(gUnknown_02022C88->unk1E, 3);
+ AddStdMessageWindow(STDMESSAGE_SAVED_THE_GAME, 0);
+ CopyWindowToVram(sDisplay->messageWindowId, 3);
(*state)++;
break;
case 1:
@@ -2392,14 +2691,14 @@ bool32 sub_801FD30(u8 *state)
return TRUE;
}
-bool32 sub_801FD88(u8 *state)
+static bool32 Display_AskConfirmLeaderLeave(u8 *state)
{
switch (*state)
{
case 0:
- sub_801FF18(10, 0);
- sub_801FDDC(23, 10, 1);
- CopyWindowToVram(gUnknown_02022C88->unk1E, 3);
+ AddStdMessageWindow(STDMESSAGE_WARN_LEADER_LEAVE, 0);
+ AddYesNoMenuAt(23, 10, 1);
+ CopyWindowToVram(sDisplay->messageWindowId, 3);
(*state)++;
break;
case 1:
@@ -2409,12 +2708,12 @@ bool32 sub_801FD88(u8 *state)
return TRUE;
}
-static bool32 sub_801FDD8(u8 *arg0)
+static bool32 Display_Dummy(u8 *state)
{
return FALSE;
}
-static void sub_801FDDC(u8 left, u8 top, u8 initialCursorPos)
+static void AddYesNoMenuAt(u8 left, u8 top, u8 initialCursorPos)
{
struct WindowTemplate template;
template.bg = 0;
@@ -2424,42 +2723,42 @@ static void sub_801FDDC(u8 left, u8 top, u8 initialCursorPos)
template.height = 4;
template.paletteNum = 14;
template.baseBlock = 0x52;
- gUnknown_02022C88->unk18 = AddWindow(&template);
- if (gUnknown_02022C88->unk18 != 0xFF)
+ sDisplay->yesNoMenuWindowId = AddWindow(&template);
+ if (sDisplay->yesNoMenuWindowId != 0xFF)
{
- FillWindowPixelBuffer(gUnknown_02022C88->unk18, PIXEL_FILL(1));
- PutWindowTilemap(gUnknown_02022C88->unk18);
- AddTextPrinterParameterized(gUnknown_02022C88->unk18, 1, gText_Yes, 8, 1, TEXT_SPEED_FF, NULL);
- AddTextPrinterParameterized(gUnknown_02022C88->unk18, 1, gText_No, 8, 17, TEXT_SPEED_FF, NULL);
- DrawTextBorderOuter(gUnknown_02022C88->unk18, 1, 13);
- InitMenuInUpperLeftCornerPlaySoundWhenAPressed(gUnknown_02022C88->unk18, 2, initialCursorPos);
+ FillWindowPixelBuffer(sDisplay->yesNoMenuWindowId, PIXEL_FILL(1));
+ PutWindowTilemap(sDisplay->yesNoMenuWindowId);
+ AddTextPrinterParameterized(sDisplay->yesNoMenuWindowId, 1, gText_Yes, 8, 1, TEXT_SPEED_FF, NULL);
+ AddTextPrinterParameterized(sDisplay->yesNoMenuWindowId, 1, gText_No, 8, 17, TEXT_SPEED_FF, NULL);
+ DrawTextBorderOuter(sDisplay->yesNoMenuWindowId, 1, 13);
+ InitMenuInUpperLeftCornerPlaySoundWhenAPressed(sDisplay->yesNoMenuWindowId, 2, initialCursorPos);
}
}
-static void sub_801FEBC(void)
+static void HideYesNoMenuWindow(void)
{
- if (gUnknown_02022C88->unk18 != 0xFF)
+ if (sDisplay->yesNoMenuWindowId != 0xFF)
{
- ClearStdWindowAndFrameToTransparent(gUnknown_02022C88->unk18, FALSE);
- ClearWindowTilemap(gUnknown_02022C88->unk18);
+ ClearStdWindowAndFrameToTransparent(sDisplay->yesNoMenuWindowId, FALSE);
+ ClearWindowTilemap(sDisplay->yesNoMenuWindowId);
}
}
-static void sub_801FEE4(void)
+static void DestroyYesNoMenuWindow(void)
{
- if (gUnknown_02022C88->unk18 != 0xFF)
+ if (sDisplay->yesNoMenuWindowId != 0xFF)
{
- RemoveWindow(gUnknown_02022C88->unk18);
- gUnknown_02022C88->unk18 = 0xFF;
+ RemoveWindow(sDisplay->yesNoMenuWindowId);
+ sDisplay->yesNoMenuWindowId = 0xFF;
}
}
-static s8 sub_801FF08(void)
+static s8 ProcessMenuInput(void)
{
return Menu_ProcessInput();
}
-static void sub_801FF18(int arg0, u16 arg1)
+static void AddStdMessageWindow(int msgId, u16 bg0vofs)
{
const u8 *str;
int windowId;
@@ -2471,43 +2770,43 @@ static void sub_801FF18(int arg0, u16 arg1)
template.height = 4;
template.paletteNum = 14;
template.baseBlock = 0x6A;
- if (gUnknown_082F2D40[arg0].unkA)
+ if (sDisplayStdMessages[msgId].useWiderBox)
{
template.tilemapLeft -= 7;
template.width += 7;
}
- gUnknown_02022C88->unk1E = AddWindow(&template);
- windowId = gUnknown_02022C88->unk1E;
- if (gUnknown_02022C88->unk1E == 0xFF)
+ sDisplay->messageWindowId = AddWindow(&template);
+ windowId = sDisplay->messageWindowId;
+ if (sDisplay->messageWindowId == 0xFF)
return;
- if (gUnknown_082F2D40[arg0].unk9)
+ if (sDisplayStdMessages[msgId].hasPlaceholders)
{
- DynamicPlaceholderTextUtil_ExpandPlaceholders(gUnknown_02022C88->unk22, gUnknown_082F2D40[arg0].unk0);
- str = gUnknown_02022C88->unk22;
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(sDisplay->expandedPlaceholdersBuffer, sDisplayStdMessages[msgId].text);
+ str = sDisplay->expandedPlaceholdersBuffer;
}
else
{
- str = gUnknown_082F2D40[arg0].unk0;
+ str = sDisplayStdMessages[msgId].text;
}
- ChangeBgY(0, arg1 * 256, 0);
+ ChangeBgY(0, bg0vofs * 256, 0);
FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
PutWindowTilemap(windowId);
- if (gUnknown_082F2D40[arg0].unk4 == 1)
+ if (sDisplayStdMessages[msgId].boxType == 1)
{
DrawTextBorderInner(windowId, 0xA, 2);
AddTextPrinterParameterized5(
windowId,
1,
str,
- gUnknown_082F2D40[arg0].unk5 + 8,
- gUnknown_082F2D40[arg0].unk6 + 8,
+ sDisplayStdMessages[msgId].x + 8,
+ sDisplayStdMessages[msgId].y + 8,
TEXT_SPEED_FF,
NULL,
- gUnknown_082F2D40[arg0].unk7,
- gUnknown_082F2D40[arg0].unk8);
+ sDisplayStdMessages[msgId].letterSpacing,
+ sDisplayStdMessages[msgId].lineSpacing);
}
else
{
@@ -2516,105 +2815,103 @@ static void sub_801FF18(int arg0, u16 arg1)
windowId,
1,
str,
- gUnknown_082F2D40[arg0].unk5,
- gUnknown_082F2D40[arg0].unk6,
+ sDisplayStdMessages[msgId].x,
+ sDisplayStdMessages[msgId].y,
TEXT_SPEED_FF,
NULL,
- gUnknown_082F2D40[arg0].unk7,
- gUnknown_082F2D40[arg0].unk8);
+ sDisplayStdMessages[msgId].letterSpacing,
+ sDisplayStdMessages[msgId].lineSpacing);
}
- gUnknown_02022C88->unk1E = windowId;
+ sDisplay->messageWindowId = windowId;
}
-static void sub_8020094(void)
+static void HideStdMessageWindow(void)
{
- if (gUnknown_02022C88->unk1E != 0xFF)
+ if (sDisplay->messageWindowId != 0xFF)
{
- ClearStdWindowAndFrameToTransparent(gUnknown_02022C88->unk1E, FALSE);
- ClearWindowTilemap(gUnknown_02022C88->unk1E);
+ ClearStdWindowAndFrameToTransparent(sDisplay->messageWindowId, FALSE);
+ ClearWindowTilemap(sDisplay->messageWindowId);
}
ChangeBgY(0, 0, 0);
}
-static void sub_80200C8(void)
+static void DestroyStdMessageWindow(void)
{
- if (gUnknown_02022C88->unk1E != 0xFF)
+ if (sDisplay->messageWindowId != 0xFF)
{
- RemoveWindow(gUnknown_02022C88->unk1E);
- gUnknown_02022C88->unk1E = 0xFF;
+ RemoveWindow(sDisplay->messageWindowId);
+ sDisplay->messageWindowId = 0xFF;
}
}
-static void sub_80200EC(u16 x, u16 width, u8 fillValue)
+static void FillTextEntryWindow(u16 x, u16 width, u8 fillValue)
{
FillWindowPixelRect(1, fillValue, x * 8, 1, width * 8, 14);
}
-static void sub_8020118(u16 x, u8 *str, u8 fillValue, u8 arg3, u8 arg4)
+static void DrawTextEntryMessage(u16 x, u8 *str, u8 bgColor, u8 fgColor, u8 shadowColor)
{
- u8 *str2;
- u8 sp[38];
- if (fillValue)
- sub_80200EC(x, sub_801F198() - x, fillValue);
+ u8 color[3];
+ u8 strBuffer[35];
+ if (bgColor != TEXT_COLOR_TRANSPARENT)
+ FillTextEntryWindow(x, GetTextEntryCursorPosition() - x, bgColor);
- sp[0] = fillValue;
- sp[1] = arg3;
- sp[2] = arg4;
- str2 = &sp[4];
- str2[0] = EXT_CTRL_CODE_BEGIN;
- str2[1] = EXT_CTRL_CODE_MIN_LETTER_SPACING;
- str2[2] = 8;
- StringCopy(&str2[3], str);
- AddTextPrinterParameterized3(1, 2, x * 8, 1, sp, TEXT_SPEED_FF, str2);
+ color[0] = bgColor;
+ color[1] = fgColor;
+ color[2] = shadowColor;
+ strBuffer[0] = EXT_CTRL_CODE_BEGIN;
+ strBuffer[1] = EXT_CTRL_CODE_MIN_LETTER_SPACING;
+ strBuffer[2] = 8;
+ StringCopy(&strBuffer[3], str);
+ AddTextPrinterParameterized3(1, 2, x * 8, 1, color, TEXT_SPEED_FF, strBuffer);
}
-static void sub_80201A4(void)
+static void PrintCurrentKeyboardPage(void)
{
u8 page;
int i;
- int var1;
u16 left;
u16 top;
- u8 sp[52];
- u8 *str;
+ u8 color[3];
+ u8 str[45];
u8 *str2;
FillWindowPixelBuffer(2, PIXEL_FILL(15));
page = GetCurrentKeyboardPage();
- sp[0] = TEXT_COLOR_TRANSPARENT;
- sp[1] = TEXT_DYNAMIC_COLOR_5;
- sp[2] = TEXT_DYNAMIC_COLOR_4;
- if (page != UNION_ROOM_KB_PAGE_COUNT)
+ color[0] = TEXT_COLOR_TRANSPARENT;
+ color[1] = TEXT_DYNAMIC_COLOR_5;
+ color[2] = TEXT_DYNAMIC_COLOR_4;
+ if (page != UNION_ROOM_KB_PAGE_REGISTER)
{
- str = &sp[4];
str[0] = EXT_CTRL_CODE_BEGIN;
str[1] = EXT_CTRL_CODE_MIN_LETTER_SPACING;
- var1 = 8;
- str[2] = var1;
- left = var1;
+ str[2] = 8;
+
if (page == UNION_ROOM_KB_PAGE_EMOJI)
left = 6;
+ else
+ left = 8;
for (i = 0, top = 0; i < UNION_ROOM_KB_ROW_COUNT; i++, top += 12)
{
if (!sUnionRoomKeyboardText[page][i])
return;
- StringCopy(&sp[7], sUnionRoomKeyboardText[page][i]);
- AddTextPrinterParameterized3(2, 0, left, top, sp, TEXT_SPEED_FF, &sp[4]);
+ StringCopy(&str[3], sUnionRoomKeyboardText[page][i]);
+ AddTextPrinterParameterized3(2, 0, left, top, color, TEXT_SPEED_FF, str);
}
}
else
{
left = 4;
- for (i = 0, top = 0; i < 10; i++, top += 12)
+ for (i = 0, top = 0; i < UNION_ROOM_KB_ROW_COUNT; i++, top += 12)
{
- str2 = sub_801EE6C(i);
+ str2 = GetRegisteredTextByRow(i);
if (GetStringWidth(0, str2, 0) <= 40)
{
- AddTextPrinterParameterized3(2, 0, left, top, sp, TEXT_SPEED_FF, str2);
+ AddTextPrinterParameterized3(2, 0, left, top, color, TEXT_SPEED_FF, str2);
}
else
{
@@ -2622,11 +2919,11 @@ static void sub_80201A4(void)
do
{
length--;
- StringCopyN_Multibyte(&sp[4], str2, length);
- } while (GetStringWidth(0, &sp[4], 0) > 35);
+ StringCopyN_Multibyte(str, str2, length);
+ } while (GetStringWidth(0, str, 0) > 35);
- AddTextPrinterParameterized3(2, 0, left, top, sp, TEXT_SPEED_FF, &sp[4]);
- AddTextPrinterParameterized3(2, 0, left + 35, top, sp, TEXT_SPEED_FF, gText_Ellipsis);
+ AddTextPrinterParameterized3(2, 0, left, top, color, TEXT_SPEED_FF, str);
+ AddTextPrinterParameterized3(2, 0, left + 35, top, color, TEXT_SPEED_FF, sText_Ellipsis);
}
}
}
@@ -2634,68 +2931,69 @@ static void sub_80201A4(void)
static bool32 sub_8020320(void)
{
- if (gUnknown_02022C88->unk20 < 56)
+ if (sDisplay->bg1hofs < 56)
{
- gUnknown_02022C88->unk20 += 12;
- if (gUnknown_02022C88->unk20 >= 56)
- gUnknown_02022C88->unk20 = 56;
+ sDisplay->bg1hofs += 12;
+ if (sDisplay->bg1hofs >= 56)
+ sDisplay->bg1hofs = 56;
- if (gUnknown_02022C88->unk20 < 56)
+ if (sDisplay->bg1hofs < 56)
{
- sub_80207C0(gUnknown_02022C88->unk20);
+ sub_80207C0(sDisplay->bg1hofs);
return TRUE;
}
}
- sub_8020818(gUnknown_02022C88->unk20);
+ sub_8020818(sDisplay->bg1hofs);
return FALSE;
}
static bool32 sub_8020368(void)
{
- if (gUnknown_02022C88->unk20 > 0)
+ if (sDisplay->bg1hofs > 0)
{
- gUnknown_02022C88->unk20 -= 12;
- if (gUnknown_02022C88->unk20 <= 0)
- gUnknown_02022C88->unk20 = 0;
+ sDisplay->bg1hofs -= 12;
+ if (sDisplay->bg1hofs <= 0)
+ sDisplay->bg1hofs = 0;
- if (gUnknown_02022C88->unk20 > 0)
+ if (sDisplay->bg1hofs > 0)
{
- sub_80207C0(gUnknown_02022C88->unk20);
+ sub_80207C0(sDisplay->bg1hofs);
return TRUE;
}
}
- sub_8020818(gUnknown_02022C88->unk20);
+ sub_8020818(sDisplay->bg1hofs);
return FALSE;
}
-static void sub_80203B0(void)
+static void ShowKeyboardSwapMenu(void)
{
FillWindowPixelBuffer(3, PIXEL_FILL(1));
DrawTextBorderOuter(3, 1, 13);
- PrintTextArray(3, 2, 8, 1, 14, 5, gUnknown_082F2DC8);
+ PrintTextArray(3, 2, 8, 1, 14, 5, sKeyboardPageTitleTexts);
sub_81983AC(3, 2, 0, 1, 14, 5, GetCurrentKeyboardPage());
PutWindowTilemap(3);
}
-static void sub_802040C(void)
+static void HideKeyboardSwapMenu(void)
{
ClearStdWindowAndFrameToTransparent(3, FALSE);
ClearWindowTilemap(3);
}
-static void sub_8020420(u16 row, u8 *str, u8 arg2)
+static void PrintChatMessage(u16 row, u8 *str, u8 colorIdx)
{
+ // colorIdx: 0 = grey, 1 = red, 2 = green, 3 = blue
u8 color[3];
color[0] = TEXT_COLOR_WHITE;
- color[1] = arg2 * 2 + 2;
- color[2] = arg2 * 2 + 3;
+ color[1] = colorIdx * 2 + 2;
+ color[2] = colorIdx * 2 + 3;
FillWindowPixelRect(0, PIXEL_FILL(1), 0, row * 15, 168, 15);
AddTextPrinterParameterized3(0, 2, 0, row * 15 + 1, color, TEXT_SPEED_FF, str);
}
-static void sub_8020480(void)
+static void ResetGpuBgState(void)
{
ChangeBgX(0, 0, 0);
ChangeBgY(0, 0, 0);
@@ -2720,83 +3018,83 @@ static void sub_8020480(void)
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
}
-static void sub_8020538(void)
+static void SetBgTilemapBuffers(void)
{
- SetBgTilemapBuffer(0, gUnknown_02022C88->unk128);
- SetBgTilemapBuffer(1, gUnknown_02022C88->unk928);
- SetBgTilemapBuffer(3, gUnknown_02022C88->unk1128);
- SetBgTilemapBuffer(2, gUnknown_02022C88->unk1928);
+ SetBgTilemapBuffer(0, sDisplay->bg0Buffer);
+ SetBgTilemapBuffer(1, sDisplay->bg1Buffer);
+ SetBgTilemapBuffer(3, sDisplay->bg3Buffer);
+ SetBgTilemapBuffer(2, sDisplay->bg2Buffer);
}
-static void sub_8020584(void)
+static void ClearBg0(void)
{
RequestDma3Fill(0, (void *)BG_CHAR_ADDR(0), 0x20, 1);
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);
CopyBgTilemapBufferToVram(0);
}
-static void sub_80205B4(void)
+static void LoadChatWindowBorderGfx(void)
{
- LoadPalette(gUnknown_08DD4BD0, 0x70, 0x20);
- LoadPalette(gUnknown_08DD4BB0, 0xC0, 0x20);
- DecompressAndCopyTileDataToVram(1, gUnknown_08DD4BF0, 0, 0, 0);
- CopyToBgTilemapBuffer(1, gUnknown_08DD4C4C, 0, 0);
+ LoadPalette(gUnionRoomChat_Window_Pal2, 0x70, 0x20);
+ LoadPalette(gUnionRoomChat_Window_Pal1, 0xC0, 0x20);
+ DecompressAndCopyTileDataToVram(1, gUnionRoomChat_Border_Gfx, 0, 0, 0);
+ CopyToBgTilemapBuffer(1, gUnionRoomChat_Border_Tilemap, 0, 0);
CopyBgTilemapBufferToVram(1);
}
-static void sub_8020604(void)
+static void LoadChatWindowGfx(void)
{
u8 *ptr;
- LoadPalette(gLinkMiscMenu_Pal, 0, 0x20);
- ptr = DecompressAndCopyTileDataToVram(2, gLinkMiscMenu_Gfx, 0, 0, 0);
+ LoadPalette(gUnionRoomChat_Background_Pal, 0, 0x20);
+ ptr = DecompressAndCopyTileDataToVram(2, gUnionRoomChat_Background_Gfx, 0, 0, 0);
if (ptr)
{
- CpuFastCopy(&ptr[0x220], gUnknown_02022C88->unk2128, 0x20);
- CpuFastCopy(&ptr[0x420], gUnknown_02022C88->unk2148, 0x20);
+ CpuFastCopy(&ptr[0x220], sDisplay->unk2128, 0x20);
+ CpuFastCopy(&ptr[0x420], sDisplay->unk2148, 0x20);
}
- CopyToBgTilemapBuffer(2, gLinkMiscMenu_Tilemap, 0, 0);
+ CopyToBgTilemapBuffer(2, gUnionRoomChat_Background_Tilemap, 0, 0);
CopyBgTilemapBufferToVram(2);
}
static void sub_8020680(void)
{
- LoadPalette(gUnknown_082F2C20, 0x80, 0x20);
+ LoadPalette(sUnk_Palette1, 0x80, 0x20);
RequestDma3Fill(0, (void *)BG_CHAR_ADDR(1) + 0x20, 0x20, 1);
}
-static void sub_80206A4(void)
+static void LoadChatMessagesWindow(void)
{
- LoadPalette(gUnknown_082F2C40, 0xF0, 0x20);
+ LoadPalette(sUnk_Palette2, 0xF0, 0x20);
PutWindowTilemap(0);
FillWindowPixelBuffer(0, PIXEL_FILL(1));
CopyWindowToVram(0, 3);
}
-static void sub_80206D0(void)
+static void LoadKeyboardWindow(void)
{
PutWindowTilemap(2);
- sub_80201A4();
+ PrintCurrentKeyboardPage();
CopyWindowToVram(2, 3);
}
-static void sub_80206E8(void)
+static void LoadTextEntryWindow(void)
{
int i;
- u8 var0[2];
- var0[0] = 0;
- var0[1] = 0xFF;
+ u8 unused[2];
+ unused[0] = 0;
+ unused[1] = 0xFF;
- for (i = 0; i < 15; i++)
- BlitBitmapToWindow(1, gUnknown_02022C88->unk2128, i * 8, 0, 8, 16);
+ for (i = 0; i < MAX_MESSAGE_LENGTH; i++)
+ BlitBitmapToWindow(1, sDisplay->unk2128, i * 8, 0, 8, 16);
FillWindowPixelBuffer(1, PIXEL_FILL(0));
PutWindowTilemap(1);
CopyWindowToVram(1, 3);
}
-static void sub_8020740(void)
+static void LoadKeyboardSwapWindow(void)
{
FillWindowPixelBuffer(3, PIXEL_FILL(1));
LoadUserWindowBorderGfx(3, 1, 0xD0);
@@ -2804,110 +3102,110 @@ static void sub_8020740(void)
LoadPalette(gUnknown_0860F074, 0xE0, 0x20);
}
-static void sub_8020770(void)
+static void InitScanlineEffect(void)
{
struct ScanlineEffectParams params;
params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
params.dmaDest = &REG_BG1HOFS;
params.initState = 1;
params.unused9 = 0;
- gUnknown_02022C88->unk20 = 0;
+ sDisplay->bg1hofs = 0;
CpuFastFill(0, gScanlineEffectRegBuffers, sizeof(gScanlineEffectRegBuffers));
ScanlineEffect_SetParams(params);
}
-static void sub_80207C0(s16 arg0)
+static void sub_80207C0(s16 bg1hofs)
{
- CpuFill16(arg0, gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], 0x120);
- CpuFill16(0, gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer] + 0x90, 0x20);
+ CpuFill16(bg1hofs, gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], 0x120);
+ CpuFill16(0, gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer] + 0x90, 0x20);
}
-static void sub_8020818(s16 arg0)
+static void sub_8020818(s16 bg1hofs)
{
- CpuFill16(arg0, gScanlineEffectRegBuffers[0], 0x120);
- CpuFill16(0, gScanlineEffectRegBuffers[0] + 0x90, 0x20);
- CpuFill16(arg0, gScanlineEffectRegBuffers[0] + 0x3C0, 0x120);
- CpuFill16(0, gScanlineEffectRegBuffers[0] + 0x450, 0x20);
+ CpuFill16(bg1hofs, gScanlineEffectRegBuffers[0], 0x120);
+ CpuFill16(0, gScanlineEffectRegBuffers[0] + 0x90, 0x20);
+ CpuFill16(bg1hofs, gScanlineEffectRegBuffers[0] + 0x3C0, 0x120);
+ CpuFill16(0, gScanlineEffectRegBuffers[0] + 0x450, 0x20);
}
-static bool32 sub_8020890(void)
+static bool32 TryAllocSprites(void)
{
u32 i;
- for (i = 0; i < 5; i++)
- LoadCompressedSpriteSheet(&gUnknown_082F3134[i]);
+ for (i = 0; i < ARRAY_COUNT(sSpriteSheets); i++)
+ LoadCompressedSpriteSheet(&sSpriteSheets[i]);
- LoadSpritePalette(&gUnknown_082F315C);
- gUnknown_02022C8C = Alloc(0x18);
- if (!gUnknown_02022C8C)
+ LoadSpritePalette(&sSpritePalette);
+ sSprites = Alloc(sizeof(struct UnionRoomChatSprites));
+ if (!sSprites)
return FALSE;
return TRUE;
}
-static void sub_80208D0(void)
+static void FreeSprites(void)
{
- if (gUnknown_02022C8C)
- Free(gUnknown_02022C8C);
+ if (sSprites)
+ Free(sSprites);
}
-static void sub_80208E8(void)
+static void CreateKeyboardCursorSprite(void)
{
- u8 spriteId = CreateSprite(&gUnknown_082F319C, 10, 24, 0);
- gUnknown_02022C8C->unk0 = &gSprites[spriteId];
+ u8 spriteId = CreateSprite(&sSpriteTemplate_KeyboardCursor, 10, 24, 0);
+ sSprites->keyboardCursor = &gSprites[spriteId];
}
-static void sub_802091C(bool32 invisible)
+static void SetKeyboardCursorInvisibility(bool32 invisible)
{
- gUnknown_02022C8C->unk0->invisible = invisible;
+ sSprites->keyboardCursor->invisible = invisible;
}
-static void sub_802093C(void)
+static void MoveKeyboardCursor(void)
{
u8 x, y;
u8 page = GetCurrentKeyboardPage();
- sub_801F0BC(&x, &y);
- if (page != UNION_ROOM_KB_PAGE_COUNT)
+ GetCurrentKeyboardColAndRow(&x, &y);
+ if (page != UNION_ROOM_KB_PAGE_REGISTER)
{
- StartSpriteAnim(gUnknown_02022C8C->unk0, 0);
- gUnknown_02022C8C->unk0->pos1.x = x * 8 + 10;
- gUnknown_02022C8C->unk0->pos1.y = y * 12 + 24;
+ StartSpriteAnim(sSprites->keyboardCursor, 0);
+ sSprites->keyboardCursor->pos1.x = x * 8 + 10;
+ sSprites->keyboardCursor->pos1.y = y * 12 + 24;
}
else
{
- StartSpriteAnim(gUnknown_02022C8C->unk0, 2);
- gUnknown_02022C8C->unk0->pos1.x = 24;
- gUnknown_02022C8C->unk0->pos1.y = y * 12 + 24;
+ StartSpriteAnim(sSprites->keyboardCursor, 2);
+ sSprites->keyboardCursor->pos1.x = 24;
+ sSprites->keyboardCursor->pos1.y = y * 12 + 24;
}
}
-static void sub_80209AC(int arg0)
+static void SetRegisteredTextPalette(bool32 registering)
{
- const u16 *palette = &gUnknown_082F2DF0[arg0 * 2 + 1];
+ const u16 *palette = &sUnionRoomChatInterfacePal[registering * 2 + 1];
u8 index = IndexOfSpritePaletteTag(0);
LoadPalette(palette, index * 16 + 0x101, 4);
}
-static void sub_80209E0(void)
+static void StartKeyboardCursorAnim(void)
{
- if (GetCurrentKeyboardPage() != UNION_ROOM_KB_PAGE_COUNT)
- StartSpriteAnim(gUnknown_02022C8C->unk0, 1);
+ if (GetCurrentKeyboardPage() != UNION_ROOM_KB_PAGE_REGISTER)
+ StartSpriteAnim(sSprites->keyboardCursor, 1);
else
- StartSpriteAnim(gUnknown_02022C8C->unk0, 3);
+ StartSpriteAnim(sSprites->keyboardCursor, 3);
- gUnknown_02022C8C->unk14 = 0;
+ sSprites->cursorBlinkTimer = 0;
}
-static bool32 sub_8020A1C(void)
+static bool32 TryKeyboardCursorReopen(void)
{
- if (gUnknown_02022C8C->unk14 > 3)
+ if (sSprites->cursorBlinkTimer > 3)
return FALSE;
- if (++gUnknown_02022C8C->unk14 > 3)
+ if (++sSprites->cursorBlinkTimer > 3)
{
- if (GetCurrentKeyboardPage() != UNION_ROOM_KB_PAGE_COUNT)
- StartSpriteAnim(gUnknown_02022C8C->unk0, 0);
+ if (GetCurrentKeyboardPage() != UNION_ROOM_KB_PAGE_REGISTER)
+ StartSpriteAnim(sSprites->keyboardCursor, 0);
else
- StartSpriteAnim(gUnknown_02022C8C->unk0, 2);
+ StartSpriteAnim(sSprites->keyboardCursor, 2);
return FALSE;
}
@@ -2915,29 +3213,29 @@ static bool32 sub_8020A1C(void)
return TRUE;
}
-static void sub_8020A68(void)
+static void CreateTextEntrySprites(void)
{
- u8 spriteId = CreateSprite(&gUnknown_082F31BC, 76, 152, 2);
- gUnknown_02022C8C->unk8 = &gSprites[spriteId];
- spriteId = CreateSprite(&gUnknown_082F31D4, 64, 152, 1);
- gUnknown_02022C8C->unk4 = &gSprites[spriteId];
+ u8 spriteId = CreateSprite(&sSpriteTemplate_TextEntryCursor, 76, 152, 2);
+ sSprites->textEntryCursor = &gSprites[spriteId];
+ spriteId = CreateSprite(&sSpriteTemplate_TextEntryArrow, 64, 152, 1);
+ sSprites->textEntryArrow = &gSprites[spriteId];
}
-static void sub_8020ABC(struct Sprite *sprite)
+static void SpriteCB_TextEntryCursor(struct Sprite *sprite)
{
- int var0 = sub_801F198();
- if (var0 == 15)
+ int pos = GetTextEntryCursorPosition();
+ if (pos == MAX_MESSAGE_LENGTH)
{
- sprite->invisible = 1;
+ sprite->invisible = TRUE;
}
else
{
- sprite->invisible = 0;
- sprite->pos1.x = var0 * 8 + 76;
+ sprite->invisible = FALSE;
+ sprite->pos1.x = pos * 8 + 76;
}
}
-static void sub_8020AF4(struct Sprite *sprite)
+static void SpriteCB_TextEntryArrow(struct Sprite *sprite)
{
if (++sprite->data[0] > 4)
{
@@ -2947,40 +3245,42 @@ static void sub_8020AF4(struct Sprite *sprite)
}
}
-static void sub_8020B20(void)
+static void CreateRButtonSprites(void)
{
- u8 spriteId = CreateSprite(&gUnknown_082F322C, 8, 152, 3);
- gUnknown_02022C8C->unkC = &gSprites[spriteId];
- spriteId = CreateSprite(&gUnknown_082F3244, 32, 152, 4);
- gUnknown_02022C8C->unk10 = &gSprites[spriteId];
- gUnknown_02022C8C->unk10->invisible = 1;
+ u8 spriteId = CreateSprite(&sSpriteTemplate_RButtonIcon, 8, 152, 3);
+ sSprites->rButtonIcon = &gSprites[spriteId];
+ spriteId = CreateSprite(&sSpriteTemplate_RButtonLabels, 32, 152, 4);
+ sSprites->rButtonLabel = &gSprites[spriteId];
+ sSprites->rButtonLabel->invisible = TRUE;
}
-static void sub_8020B80(void)
+static void UpdateRButtonLabel(void)
{
- if (GetCurrentKeyboardPage() == UNION_ROOM_KB_PAGE_COUNT)
+ if (GetCurrentKeyboardPage() == UNION_ROOM_KB_PAGE_REGISTER)
{
- if (sub_801F0DC() != 0)
+ if (GetLengthOfMessageEntry() != 0)
{
- gUnknown_02022C8C->unk10->invisible = 0;
- StartSpriteAnim(gUnknown_02022C8C->unk10, 3);
+ // REGISTER
+ sSprites->rButtonLabel->invisible = FALSE;
+ StartSpriteAnim(sSprites->rButtonLabel, 3);
}
else
{
- gUnknown_02022C8C->unk10->invisible = 1;
+ sSprites->rButtonLabel->invisible = TRUE;
}
}
else
{
- int anim = sub_801F1A4();
+ int anim = GetShouldShowCaseToggleIcon();
if (anim == 3)
{
- gUnknown_02022C8C->unk10->invisible = 1;
+ sSprites->rButtonLabel->invisible = TRUE;
}
else
{
- gUnknown_02022C8C->unk10->invisible = 0;
- StartSpriteAnim(gUnknown_02022C8C->unk10, anim);
+ // A <--> a (toggle case)
+ sSprites->rButtonLabel->invisible = FALSE;
+ StartSpriteAnim(sSprites->rButtonLabel, anim);
}
}
diff --git a/src/union_room_player_avatar.c b/src/union_room_player_avatar.c
index 8a09306c0..cac789685 100644
--- a/src/union_room_player_avatar.c
+++ b/src/union_room_player_avatar.c
@@ -10,98 +10,124 @@
#include "constants/event_object_movement.h"
#include "constants/flags.h"
-EWRAM_DATA struct UnkStruct_8019BA8 * gUnknown_02022C64 = NULL;
-EWRAM_DATA u32 gUnknown_02022C68 = 0;
-
-static u8 sub_8019DF4(void);
-static u32 sub_8019F8C(u32 playerIdx, u32 arg1);
-static void sub_801A3B0(s32 arg0, s32 arg1, u8 arg2);
-
-ALIGNED(4) const u8 gUnknown_082F072C[][10] = {
- {0x21, 0x2c, 0x1f, 0x23, 0x25, 0x24, 0x41, 0x42},
- {0x22, 0x28, 0x20, 0x2f, 0x2f, 0x0e, 0x14, 0x2d}
+#define UR_SPRITE_START_ID (MAX_SPRITES - MAX_UNION_ROOM_PLAYERS)
+#define UR_PLAYER_SPRITE_ID(playerIdx, facingDir)(5 * playerIdx + facingDir)
+
+static EWRAM_DATA struct UnionRoomObject * sUnionObjWork = NULL;
+static EWRAM_DATA u32 sUnionObjRefreshTimer = 0;
+
+static u8 CreateTask_AnimateUnionRoomPlayers(void);
+static u32 IsUnionRoomPlayerInvisible(u32, u32);
+static void SetUnionRoomObjectFacingDirection(s32, s32, u8);
+
+static const u8 sUnionRoomObjGfxIds[GENDER_COUNT][MAX_UNION_ROOM_PLAYERS + 2] = {
+ [MALE] = {
+ OBJ_EVENT_GFX_MAN_3,
+ OBJ_EVENT_GFX_BLACK_BELT,
+ OBJ_EVENT_GFX_CAMPER,
+ OBJ_EVENT_GFX_YOUNGSTER,
+ OBJ_EVENT_GFX_PSYCHIC_M,
+ OBJ_EVENT_GFX_BUG_CATCHER,
+ OBJ_EVENT_GFX_MAN_4,
+ OBJ_EVENT_GFX_MAN_5
+ },
+ [FEMALE] = {
+ OBJ_EVENT_GFX_WOMAN_5,
+ OBJ_EVENT_GFX_HEX_MANIAC,
+ OBJ_EVENT_GFX_PICNICKER,
+ OBJ_EVENT_GFX_LASS,
+ OBJ_EVENT_GFX_LASS,
+ OBJ_EVENT_GFX_GIRL_3,
+ OBJ_EVENT_GFX_WOMAN_2,
+ OBJ_EVENT_GFX_BEAUTY
+ }
};
-static const s16 gUnknown_082F0740[][2] = {
- {0x4, 0x6},
- {0xd, 0x8},
- {0xa, 0x6},
- {0x1, 0x8},
- {0xd, 0x4},
- {0x7, 0x4},
- {0x1, 0x4},
- {0x7, 0x8}
+static const s16 sUnionRoomPlayerCoords[MAX_UNION_ROOM_PLAYERS][2] = {
+ { 4, 6},
+ {13, 8},
+ {10, 6},
+ { 1, 8},
+ {13, 4},
+ { 7, 4},
+ { 1, 4},
+ { 7, 8}
};
-static const s8 gUnknown_082F0760[][2] = {
- { 0, 0},
- { 1, 0},
- { 0, -1},
- {-1, 0},
- { 0, 1}
+static const s8 sFacingDirectionOffsets[][2] = {
+ [DIR_NONE] = { 0, 0},
+ [DIR_SOUTH] = { 1, 0},
+ [DIR_NORTH] = { 0, -1},
+ [DIR_WEST] = {-1, 0},
+ [DIR_EAST] = { 0, 1}
};
-static const u8 gUnknown_082F076A[] = {
- 0x00, 0x02, 0x01, 0x04, 0x03
+static const u8 sOppositeFacingDirection[] = {
+ [DIR_NONE] = DIR_NONE,
+ [DIR_SOUTH] = DIR_NORTH,
+ [DIR_NORTH] = DIR_SOUTH,
+ [DIR_WEST] = DIR_EAST,
+ [DIR_EAST] = DIR_WEST
};
-static const u8 gUnknown_082F076F[] = {
- 0x01, 0x03, 0x01, 0x04, 0x02
+static const u8 sNextFacingDirection[] = {
+ [DIR_NONE] = DIR_SOUTH,
+ [DIR_SOUTH] = DIR_WEST,
+ [DIR_NORTH] = DIR_SOUTH,
+ [DIR_WEST] = DIR_EAST,
+ [DIR_EAST] = DIR_NORTH
};
-static const u8 gUnknown_082F0774[] = {
- 0x09, 0x08, 0x07, 0x02, 0x06, 0x05, 0x04, 0x03,
- 0xbf, 0x02, 0xc0, 0x02, 0xc1, 0x02, 0xc2, 0x02,
- 0xc3, 0x02, 0xc4, 0x02, 0xc5, 0x02, 0xc6, 0x02
+// Local id 1 is the Nurse/Attendant, 2-9 are link players
+static const u8 sUnionRoomLocalIds[] = { 9, 8, 7, 2, 6, 5, 4, 3 };
+
+static const u16 sUnknown[] = {
+ 0x2BF,
+ 0x2C0,
+ 0x2C1,
+ 0x2C2,
+ 0x2C3,
+ 0x2C4,
+ 0x2C5,
+ 0x2C6
};
-static const u8 gUnknown_082F078C[2] = {
+static const u8 sMovement_UnionPlayerExit[2] = {
MOVEMENT_ACTION_FLY_UP,
MOVEMENT_ACTION_STEP_END
};
-static const u8 gUnknown_082F078E[2] = {
+static const u8 sMovement_UnionPlayerEnter[2] = {
MOVEMENT_ACTION_FLY_DOWN,
MOVEMENT_ACTION_STEP_END
};
-static bool32 is_walking_or_running(void)
+static bool32 IsPlayerStandingStill(void)
{
- if (gPlayerAvatar.tileTransitionState == 2 || gPlayerAvatar.tileTransitionState == 0)
- {
+ if (gPlayerAvatar.tileTransitionState == T_TILE_CENTER || gPlayerAvatar.tileTransitionState == T_NOT_MOVING)
return TRUE;
- }
else
- {
return FALSE;
- }
}
-static u8 sub_8019978(u32 a0, u32 a1)
+static u8 GetUnionRoomPlayerGraphicsId(u32 gender, u32 id)
{
- return gUnknown_082F072C[a0][a1 % 8];
+ return sUnionRoomObjGfxIds[gender][id % MAX_UNION_ROOM_PLAYERS];
}
-static void sub_8019990(u32 a0, u32 a1, s32 * a2, s32 * a3)
+static void GetUnionRoomPlayerFacingCoords(u32 playerIdx, u32 direction, s32 * x, s32 * y)
{
- *a2 = gUnknown_082F0740[a0][0] + gUnknown_082F0760[a1][0] + 7;
- *a3 = gUnknown_082F0740[a0][1] + gUnknown_082F0760[a1][1] + 7;
+ *x = sUnionRoomPlayerCoords[playerIdx][0] + sFacingDirectionOffsets[direction][0] + 7;
+ *y = sUnionRoomPlayerCoords[playerIdx][1] + sFacingDirectionOffsets[direction][1] + 7;
}
-static bool32 sub_80199E0(u32 a0, u32 a1, s32 a2, s32 a3)
+static bool32 IsUnionRoomPlayerFacingTileAt(u32 playerIdx, u32 direction, s32 x, s32 y)
{
- if (gUnknown_082F0740[a0][0] + gUnknown_082F0760[a1][0] + 7 != a2)
- {
- return FALSE;
- }
- else if (gUnknown_082F0740[a0][1] + gUnknown_082F0760[a1][1] + 7 != a3)
- {
- return FALSE;
- }
- else
- {
+ if ((sUnionRoomPlayerCoords[playerIdx][0] + sFacingDirectionOffsets[direction][0] + 7 == x)
+ && (sUnionRoomPlayerCoords[playerIdx][1] + sFacingDirectionOffsets[direction][1] + 7 == y))
return TRUE;
- }
+ else
+ return FALSE;
}
static bool32 IsUnionRoomPlayerHidden(u32 player_idx)
@@ -126,19 +152,19 @@ static void SetUnionRoomPlayerGfx(u32 playerIdx, u32 gfxId)
static void CreateUnionRoomPlayerObjectEvent(u32 playerIdx)
{
- TrySpawnObjectEvent(gUnknown_082F0774[playerIdx], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
+ TrySpawnObjectEvent(sUnionRoomLocalIds[playerIdx], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
}
static void RemoveUnionRoomPlayerObjectEvent(u32 playerIdx)
{
- RemoveObjectEventByLocalIdAndMap(gUnknown_082F0774[playerIdx], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
+ RemoveObjectEventByLocalIdAndMap(sUnionRoomLocalIds[playerIdx], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
}
static bool32 SetUnionRoomPlayerEnterExitMovement(u32 playerIdx, const u8 * movement)
{
u8 objectId;
struct ObjectEvent * object;
- if (TryGetObjectEventIdByLocalIdAndMap(gUnknown_082F0774[playerIdx], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectId))
+ if (TryGetObjectEventIdByLocalIdAndMap(sUnionRoomLocalIds[playerIdx], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectId))
{
return FALSE;
}
@@ -154,11 +180,11 @@ static bool32 SetUnionRoomPlayerEnterExitMovement(u32 playerIdx, const u8 * move
return TRUE;
}
-static bool32 sub_8019B3C(u32 playerIdx)
+static bool32 TryReleaseUnionRoomPlayerObjectEvent(u32 playerIdx)
{
u8 objectId;
struct ObjectEvent * object;
- if (TryGetObjectEventIdByLocalIdAndMap(gUnknown_082F0774[playerIdx], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectId))
+ if (TryGetObjectEventIdByLocalIdAndMap(sUnionRoomLocalIds[playerIdx], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectId))
{
return TRUE;
}
@@ -178,39 +204,39 @@ static bool32 sub_8019B3C(u32 playerIdx)
return TRUE;
}
-u8 sub_8019BA8(struct UnkStruct_8019BA8 * ptr)
+u8 InitUnionRoomPlayerObjects(struct UnionRoomObject * players)
{
s32 i;
- gUnknown_02022C68 = 0;
- gUnknown_02022C64 = ptr;
- for (i = 0; i < 8; i++)
+ sUnionObjRefreshTimer = 0;
+ sUnionObjWork = players;
+ for (i = 0; i < MAX_UNION_ROOM_PLAYERS; i++)
{
- ptr[i].field_0 = 0;
- ptr[i].field_1 = 0;
- ptr[i].field_2 = 0;
- ptr[i].field_3 = 0;
+ players[i].state = 0;
+ players[i].gfxId = 0;
+ players[i].animState = 0;
+ players[i].schedAnim = UNION_ROOM_SPAWN_NONE;
}
- return sub_8019DF4();
+ return CreateTask_AnimateUnionRoomPlayers();
}
-static bool32 sub_8019BDC(s8 * a0, u32 playerIdx, struct UnkStruct_8019BA8 * ptr)
+static bool32 AnimateUnionRoomPlayerDespawn(s8 * state, u32 playerIdx, struct UnionRoomObject * ptr)
{
- switch (*a0)
+ switch (*state)
{
case 0:
- if (SetUnionRoomPlayerEnterExitMovement(playerIdx, gUnknown_082F078C) == TRUE)
+ if (SetUnionRoomPlayerEnterExitMovement(playerIdx, sMovement_UnionPlayerExit) == TRUE)
{
HideUnionRoomPlayer(playerIdx);
- (*a0)++;
+ (*state)++;
}
break;
case 1:
- if (sub_8019B3C(playerIdx))
+ if (TryReleaseUnionRoomPlayerObjectEvent(playerIdx))
{
RemoveUnionRoomPlayerObjectEvent(playerIdx);
HideUnionRoomPlayer(playerIdx);
- *a0 = 0;
+ *state = 0;
return TRUE;
}
break;
@@ -218,42 +244,42 @@ static bool32 sub_8019BDC(s8 * a0, u32 playerIdx, struct UnkStruct_8019BA8 * ptr
return FALSE;
}
-static bool32 sub_8019C38(s8 * a0, u32 playerIdx, struct UnkStruct_8019BA8 * ptr)
+static bool32 AnimateUnionRoomPlayerSpawn(s8 * state, u32 playerIdx, struct UnionRoomObject * ptr)
{
s16 x, y;
- switch (*a0)
+ switch (*state)
{
case 0:
- if (!is_walking_or_running())
+ if (!IsPlayerStandingStill())
{
break;
}
PlayerGetDestCoords(&x, &y);
- if (sub_80199E0(playerIdx, 0, x, y) == 1)
+ if (IsUnionRoomPlayerFacingTileAt(playerIdx, 0, x, y) == TRUE)
{
break;
}
player_get_pos_including_state_based_drift(&x, &y);
- if (sub_80199E0(playerIdx, 0, x, y) == 1)
+ if (IsUnionRoomPlayerFacingTileAt(playerIdx, 0, x, y) == TRUE)
{
break;
}
- SetUnionRoomPlayerGfx(playerIdx, ptr->field_1);
+ SetUnionRoomPlayerGfx(playerIdx, ptr->gfxId);
CreateUnionRoomPlayerObjectEvent(playerIdx);
ShowUnionRoomPlayer(playerIdx);
- (*a0)++;
+ (*state)++;
// fallthrough
case 3: // incorrect?
- if (SetUnionRoomPlayerEnterExitMovement(playerIdx, gUnknown_082F078E) == 1)
+ if (SetUnionRoomPlayerEnterExitMovement(playerIdx, sMovement_UnionPlayerEnter) == TRUE)
{
- (*a0)++;
+ (*state)++;
}
break;
case 2:
- if (sub_8019B3C(playerIdx))
+ if (TryReleaseUnionRoomPlayerObjectEvent(playerIdx))
{
- *a0 = 0;
+ *state = 0;
return TRUE;
}
break;
@@ -261,44 +287,38 @@ static bool32 sub_8019C38(s8 * a0, u32 playerIdx, struct UnkStruct_8019BA8 * ptr
return FALSE;
}
-static bool32 sub_8019CF0(u32 playerIdx, u32 a1, u32 a2)
+static bool32 SpawnGroupLeader(u32 playerIdx, u32 gender, u32 id)
{
- struct UnkStruct_8019BA8 * ptr = &gUnknown_02022C64[playerIdx];
- ptr->field_3 = 1;
- ptr->field_1 = sub_8019978(a1, a2);
- if (ptr->field_0 == 0)
- {
+ struct UnionRoomObject * ptr = &sUnionObjWork[playerIdx];
+ ptr->schedAnim = UNION_ROOM_SPAWN_IN;
+ ptr->gfxId = GetUnionRoomPlayerGraphicsId(gender, id);
+
+ if (ptr->state == 0)
return TRUE;
- }
else
- {
return FALSE;
- }
}
-static bool32 sub_8019D20(u32 playerIdx)
+static bool32 DespawnGroupLeader(u32 playerIdx)
{
- struct UnkStruct_8019BA8 * ptr = &gUnknown_02022C64[playerIdx];
- ptr->field_3 = 2;
- if (ptr->field_0 == 1)
- {
+ struct UnionRoomObject * ptr = &sUnionObjWork[playerIdx];
+ ptr->schedAnim = UNION_ROOM_SPAWN_OUT;
+
+ if (ptr->state == 1)
return TRUE;
- }
else
- {
return FALSE;
- }
}
-static void sub_8019D44(u32 playerIdx, struct UnkStruct_8019BA8 * ptr)
+static void AnimateUnionRoomPlayer(u32 playerIdx, struct UnionRoomObject * ptr)
{
- switch (ptr->field_0)
+ switch (ptr->state)
{
case 0:
- if (ptr->field_3 == 1)
+ if (ptr->schedAnim == UNION_ROOM_SPAWN_IN)
{
- ptr->field_0 = 2;
- ptr->field_2 = 0;
+ ptr->state = 2;
+ ptr->animState = 0;
}
else
{
@@ -306,23 +326,23 @@ static void sub_8019D44(u32 playerIdx, struct UnkStruct_8019BA8 * ptr)
}
// fallthrough
case 2:
- if (!sub_8019F8C(playerIdx, 0) && ptr->field_3 == 2)
+ if (!IsUnionRoomPlayerInvisible(playerIdx, 0) && ptr->schedAnim == UNION_ROOM_SPAWN_OUT)
{
- ptr->field_0 = 0;
- ptr->field_2 = 0;
+ ptr->state = 0;
+ ptr->animState = 0;
RemoveUnionRoomPlayerObjectEvent(playerIdx);
HideUnionRoomPlayer(playerIdx);
}
- else if (sub_8019C38(&ptr->field_2, playerIdx, ptr) == 1)
+ else if (AnimateUnionRoomPlayerSpawn(&ptr->animState, playerIdx, ptr) == TRUE)
{
- ptr->field_0 = 1;
+ ptr->state = 1;
}
break;
case 1:
- if (ptr->field_3 == 2)
+ if (ptr->schedAnim == UNION_ROOM_SPAWN_OUT)
{
- ptr->field_0 = 3;
- ptr->field_2 = 0;
+ ptr->state = 3;
+ ptr->animState = 0;
}
else
{
@@ -330,49 +350,43 @@ static void sub_8019D44(u32 playerIdx, struct UnkStruct_8019BA8 * ptr)
}
// fallthrough
case 3:
- if (sub_8019BDC(&ptr->field_2, playerIdx, ptr) == 1)
+ if (AnimateUnionRoomPlayerDespawn(&ptr->animState, playerIdx, ptr) == 1)
{
- ptr->field_0 = 0;
+ ptr->state = 0;
}
break;
}
- ptr->field_3 = 0;
+ ptr->schedAnim = UNION_ROOM_SPAWN_NONE;
}
-static void sub_8019DD0(u8 taskId)
+static void Task_AnimateUnionRoomPlayers(u8 taskId)
{
s32 i;
- for (i = 0; i < 8; i++)
- {
- sub_8019D44(i, &gUnknown_02022C64[i]);
- }
+ for (i = 0; i < MAX_UNION_ROOM_PLAYERS; i++)
+ AnimateUnionRoomPlayer(i, &sUnionObjWork[i]);
}
-static u8 sub_8019DF4(void)
+static u8 CreateTask_AnimateUnionRoomPlayers(void)
{
- if (FuncIsActiveTask(sub_8019DD0) == 1)
- {
+ if (FuncIsActiveTask(Task_AnimateUnionRoomPlayers) == TRUE)
return NUM_TASKS;
- }
else
- {
- return CreateTask(sub_8019DD0, 5);
- }
+ return CreateTask(Task_AnimateUnionRoomPlayers, 5);
}
-static void sub_8019E20(void)
+static void DestroyTask_AnimateUnionRoomPlayers(void)
{
- u8 taskId = FindTaskIdByFunc(sub_8019DD0);
+ u8 taskId = FindTaskIdByFunc(Task_AnimateUnionRoomPlayers);
if (taskId < NUM_TASKS)
{
DestroyTask(taskId);
}
}
-void sub_8019E3C(void)
+void DestroyUnionRoomPlayerObjects(void)
{
s32 i;
- for (i = 0; i < 8; i++)
+ for (i = 0; i < MAX_UNION_ROOM_PLAYERS; i++)
{
if (!IsUnionRoomPlayerHidden(i))
{
@@ -380,233 +394,232 @@ void sub_8019E3C(void)
HideUnionRoomPlayer(i);
}
}
- gUnknown_02022C64 = NULL;
- sub_8019E20();
+ sUnionObjWork = NULL;
+ DestroyTask_AnimateUnionRoomPlayers();
}
-void sub_8019E70(u8 * sp8, s32 r9)
+void CreateGroupMemberSpritesInvisible(u8 * spriteIds, s32 playerIdx)
{
- s32 r7;
+ s32 direction;
- for (r7 = 0; r7 < 5; r7++)
+ for (direction = DIR_NONE; direction <= DIR_EAST; direction++)
{
- s32 r5 = 5 * r9 + r7;
- sp8[r5] = sprite_new(OBJ_EVENT_GFX_MAN_4, r5 - 0x38, gUnknown_082F0740[r9][0] + gUnknown_082F0760[r7][0], gUnknown_082F0740[r9][1] + gUnknown_082F0760[r7][1], 3, 1);
- sub_8097C44(r5 - 0x38, TRUE);
+ s32 id = UR_PLAYER_SPRITE_ID(playerIdx, direction);
+ spriteIds[id] = CreateObjectSprite(OBJ_EVENT_GFX_MAN_4,
+ id - UR_SPRITE_START_ID,
+ sUnionRoomPlayerCoords[playerIdx][0] + sFacingDirectionOffsets[direction][0],
+ sUnionRoomPlayerCoords[playerIdx][1] + sFacingDirectionOffsets[direction][1],
+ 3, 1);
+ SetObjectEventSpriteInvisibility(id - UR_SPRITE_START_ID, TRUE);
}
}
-void sub_8019F04(u8 * r5)
+void DestroyGroupMemberSprites(u8 * spriteIds)
{
s32 i;
- for (i = 0; i < 40; i++)
- {
- DestroySprite(&gSprites[r5[i]]);
- }
+ for (i = 0; i < UR_PLAYER_SPRITE_ID(MAX_UNION_ROOM_PLAYERS, 0); i++)
+ DestroySprite(&gSprites[spriteIds[i]]);
}
-void sub_8019F2C(void)
+void SetTilesAroundUnionRoomPlayersPassable(void)
{
- s32 i, j, x, y;
- for (i = 0; i < 8; i++)
+ s32 i, direction, x, y;
+ for (i = 0; i < MAX_UNION_ROOM_PLAYERS; i++)
{
- for (j = 0; j < 5; j++)
+ for (direction = DIR_NONE; direction <= DIR_EAST; direction++)
{
- sub_8019990(i, j, &x, &y);
- sub_8088B94(x, y, 0);
+ GetUnionRoomPlayerFacingCoords(i, direction, &x, &y);
+ MapGridSetMetatileImpassabilityAt(x, y, FALSE);
}
}
}
-static u8 sub_8019F64(u32 r1, u32 unused, struct GFtgtGname * r2)
+static u8 GetNewFacingDirectionForUnionRoomPlayer(u32 direction, u32 playerIdx, struct GFtgtGname * gname)
{
- if (r1 != 0)
- {
- return gUnknown_082F076F[r1];
- }
- else if (r2->activity == 0x45)
- {
- return 1;
- }
+ if (direction != DIR_NONE)
+ return sNextFacingDirection[direction];
+ else if (gname->activity == (ACTIVITY_CHAT | IN_UNION_ROOM))
+ return DIR_SOUTH;
else
- {
- return 4;
- }
+ return DIR_EAST;
}
-static u32 sub_8019F8C(u32 a0, u32 a1)
+static bool32 IsUnionRoomPlayerInvisible(u32 playerIdx, u32 direction)
{
- return sub_8097C8C(5 * a0 + a1 - 0x38);
+ return IsObjectEventSpriteInvisible(UR_PLAYER_SPRITE_ID(playerIdx, direction) - UR_SPRITE_START_ID);
}
-static void sub_8019FA4(u32 r5, u32 r6, u8 r8, struct GFtgtGname * r9)
+static void SpawnGroupMember(u32 playerIdx, u32 direction, u8 graphicsId, struct GFtgtGname * gname)
{
s32 x, y;
- s32 r7 = 5 * r5 + r6;
- if (sub_8019F8C(r5, r6) == 1)
+ s32 id = UR_PLAYER_SPRITE_ID(playerIdx, direction);
+ if (IsUnionRoomPlayerInvisible(playerIdx, direction) == TRUE)
{
- sub_8097C44(r7 - 0x38, FALSE);
- sub_8097CC4(r7 - 0x38, 1);
+ SetObjectEventSpriteInvisibility(id - UR_SPRITE_START_ID, FALSE);
+ SetObjectEventSpriteAnim(id - UR_SPRITE_START_ID, UNION_ROOM_SPAWN_IN);
}
- sub_8097BB4(r7 - 0x38, r8);
- sub_801A3B0(r6, r5, sub_8019F64(r6, r5, r9));
- sub_8019990(r5, r6, &x, &y);
- sub_8088B94(x, y, 1);
+ SetObjectEventSpriteGraphics(id - UR_SPRITE_START_ID, graphicsId);
+ SetUnionRoomObjectFacingDirection(direction, playerIdx, GetNewFacingDirectionForUnionRoomPlayer(direction, playerIdx, gname));
+ GetUnionRoomPlayerFacingCoords(playerIdx, direction, &x, &y);
+ MapGridSetMetatileImpassabilityAt(x, y, TRUE);
}
-static void sub_801A02C(u32 a0, u32 a1)
+static void DespawnGroupMember(u32 playerIdx, u32 direction)
{
s32 x, y;
- sub_8097CC4(5 * a0 + a1 - 0x38, 2);
- sub_8019990(a0, a1, &x, &y);
- sub_8088B94(x, y, 0);
+ SetObjectEventSpriteAnim(UR_PLAYER_SPRITE_ID(playerIdx, direction) - UR_SPRITE_START_ID, UNION_ROOM_SPAWN_OUT);
+ GetUnionRoomPlayerFacingCoords(playerIdx, direction, &x, &y);
+ MapGridSetMetatileImpassabilityAt(x, y, FALSE);
}
-static void sub_801A064(u32 r7, struct GFtgtGname * r8)
+static void AssembleGroup(u32 playerIdx, struct GFtgtGname * gname)
{
s16 x, y, x2, y2;
s32 i;
PlayerGetDestCoords(&x, &y);
player_get_pos_including_state_based_drift(&x2, &y2);
- if (sub_8097C8C(5 * r7 - 0x38) == 1)
+ if (IsObjectEventSpriteInvisible(UR_PLAYER_SPRITE_ID(playerIdx, 0) - UR_SPRITE_START_ID) == TRUE)
{
- if (sub_80199E0(r7, 0, x, y) == 1 || sub_80199E0(r7, 0, x2, y2) == 1)
+ if (IsUnionRoomPlayerFacingTileAt(playerIdx, 0, x, y) == TRUE || IsUnionRoomPlayerFacingTileAt(playerIdx, 0, x2, y2) == TRUE)
{
return;
}
- sub_8019FA4(r7, 0, sub_8019978(r8->playerGender, r8->unk_00.playerTrainerId[0]), r8);
+ SpawnGroupMember(playerIdx, 0, GetUnionRoomPlayerGraphicsId(gname->playerGender, gname->unk_00.playerTrainerId[0]), gname);
}
for (i = 1; i < 5; i++)
{
- if (r8->child_sprite_gender[i - 1] == 0)
+ if (gname->child_sprite_gender[i - 1] == 0)
{
- sub_801A02C(r7, i);
+ DespawnGroupMember(playerIdx, i);
}
- else if (sub_80199E0(r7, i, x, y) == 0 && sub_80199E0(r7, i, x2, y2) == 0)
+ else if (IsUnionRoomPlayerFacingTileAt(playerIdx, i, x, y) == FALSE && IsUnionRoomPlayerFacingTileAt(playerIdx, i, x2, y2) == FALSE)
{
- sub_8019FA4(r7, i, sub_8019978((r8->child_sprite_gender[i - 1] >> 3) & 1, r8->child_sprite_gender[i - 1] & 7), r8);
+ SpawnGroupMember(playerIdx, i, GetUnionRoomPlayerGraphicsId((gname->child_sprite_gender[i - 1] >> 3) & 1, gname->child_sprite_gender[i - 1] & 7), gname);
}
}
}
-static void sub_801A16C(u32 r5, struct GFtgtGname * r4)
+static void SpawnGroupLeaderAndMembers(u32 playerIdx, struct GFtgtGname * gname)
{
u32 i;
- switch (r4->activity)
+ switch (gname->activity)
{
- case 0x40:
- case 0x54:
- sub_8019CF0(r5, r4->playerGender, r4->unk_00.playerTrainerId[0]);
+ case ACTIVITY_NONE | IN_UNION_ROOM:
+ case ACTIVITY_PLYRTALK | IN_UNION_ROOM:
+ SpawnGroupLeader(playerIdx, gname->playerGender, gname->unk_00.playerTrainerId[0]);
for (i = 0; i < 5; i++)
{
- sub_801A02C(r5, i);
+ DespawnGroupMember(playerIdx, i);
}
break;
- case 0x41:
- case 0x44:
- case 0x45:
- case 0x48:
- case 0x51:
- case 0x52:
- case 0x53:
- sub_8019D20(r5);
- sub_801A064(r5, r4);
+ case ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM:
+ case ACTIVITY_TRADE | IN_UNION_ROOM:
+ case ACTIVITY_CHAT | IN_UNION_ROOM:
+ case ACTIVITY_CARD | IN_UNION_ROOM:
+ case ACTIVITY_ACCEPT | IN_UNION_ROOM:
+ case ACTIVITY_DECLINE | IN_UNION_ROOM:
+ case ACTIVITY_NPCTALK | IN_UNION_ROOM:
+ DespawnGroupLeader(playerIdx);
+ AssembleGroup(playerIdx, gname);
break;
}
}
-static void sub_801A214(u32 r5, struct GFtgtGname * unused)
+static void DespawnGroupLeaderAndMembers(u32 r5, struct GFtgtGname *gname)
{
s32 i;
- sub_8019D20(r5);
+ DespawnGroupLeader(r5);
for (i = 0; i < 5; i++)
{
- sub_801A02C(r5, i);
+ DespawnGroupMember(r5, i);
}
}
-static void sub_801A234(struct UnkStruct_URoom *r0)
+static void UpdateUnionRoomPlayerSprites(struct WirelessLink_URoom *uroom)
{
s32 i;
struct UnkStruct_x20 * r4;
- gUnknown_02022C68 = 0;
- for (i = 0, r4 = r0->field_0->arr; i < 8; i++)
+ sUnionObjRefreshTimer = 0;
+ for (i = 0, r4 = uroom->field_0->arr; i < MAX_UNION_ROOM_PLAYERS; i++)
{
- if (r4[i].field_1A_0 == 1)
+ if (r4[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN)
{
- sub_801A16C(i, &r4[i].unk.field_0);
+ SpawnGroupLeaderAndMembers(i, &r4[i].gname_uname.gname);
}
- else if (r4[i].field_1A_0 == 2)
+ else if (r4[i].groupScheduledAnim == UNION_ROOM_SPAWN_OUT)
{
- sub_801A214(i, &r4[i].unk.field_0);
+ DespawnGroupLeaderAndMembers(i, &r4[i].gname_uname.gname);
}
}
}
-void sub_801A274(struct UnkStruct_URoom *unused)
+void ScheduleUnionRoomPlayerRefresh(struct WirelessLink_URoom *uroom)
{
- gUnknown_02022C68 = 300;
+ sUnionObjRefreshTimer = 300;
}
-void sub_801A284(struct UnkStruct_URoom *r2)
+void HandleUnionRoomPlayerRefresh(struct WirelessLink_URoom *uroom)
{
- if (++gUnknown_02022C68 > 300)
+ if (++sUnionObjRefreshTimer > 300)
{
- sub_801A234(r2);
+ UpdateUnionRoomPlayerSprites(uroom);
}
}
-bool32 sub_801A2A8(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3)
+bool32 TryInteractWithUnionRoomMember(struct UnkStruct_Main0 *main0, s16 *directionPtr, s16 *playerIdxPtr, u8 *spriteIds)
{
s16 x, y;
- s32 i, j;
+ s32 i, direction;
struct UnkStruct_x20 * r4;
- if (!is_walking_or_running())
+ if (!IsPlayerStandingStill())
{
return FALSE;
}
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
- for (i = 0, r4 = arg0->arr; i < 8; i++)
+ for (i = 0, r4 = main0->arr; i < MAX_UNION_ROOM_PLAYERS; i++)
{
- for (j = 0; j < 5; j++)
+ for (direction = DIR_NONE; direction <= DIR_EAST; direction++)
{
- s32 r3 = 5 * i + j;
- if (x != gUnknown_082F0740[i][0] + gUnknown_082F0760[j][0] + 7)
+ s32 id = UR_PLAYER_SPRITE_ID(i, direction);
+ if (x != sUnionRoomPlayerCoords[i][0] + sFacingDirectionOffsets[direction][0] + 7)
{
continue;
}
- if (y != gUnknown_082F0740[i][1] + gUnknown_082F0760[j][1] + 7)
+ if (y != sUnionRoomPlayerCoords[i][1] + sFacingDirectionOffsets[direction][1] + 7)
{
continue;
}
- if (sub_8097C8C(r3 - 0x38) != 0)
+ if (IsObjectEventSpriteInvisible(id - UR_SPRITE_START_ID))
{
continue;
}
- if (sub_8097D9C(r3 - 0x38) != 0)
+ if (IsObjectEventSpriteAnimating(id - UR_SPRITE_START_ID))
{
continue;
}
- if (r4[i].field_1A_0 != 1)
+ if (r4[i].groupScheduledAnim != UNION_ROOM_SPAWN_IN)
{
continue;
}
- sub_801A3B0(j, i, gUnknown_082F076A[GetPlayerFacingDirection()]);
- *arg1 = j;
- *arg2 = i;
+ // Face player
+ SetUnionRoomObjectFacingDirection(direction, i, sOppositeFacingDirection[GetPlayerFacingDirection()]);
+ *directionPtr = direction;
+ *playerIdxPtr = i;
return TRUE;
}
}
return FALSE;
}
-static void sub_801A3B0(s32 arg0, s32 arg1, u8 arg2)
+static void SetUnionRoomObjectFacingDirection(s32 currDirection, s32 playerIdx, u8 newDirection)
{
- sub_8097B78(5 * arg1 - 0x38 + arg0, arg2);
+ TurnObjectEventSprite(5 * playerIdx - UR_SPRITE_START_ID + currDirection, newDirection);
+ // should be line below, but order is swapped here
+ // TurnObjectEventSprite(UR_PLAYER_SPRITE_ID(playerIdx, currDirection) - UR_SPRITE_START_ID, newDirection);
}
-void sub_801A3D0(u32 arg0, u32 arg1, struct UnkStruct_Main0 *arg2)
+void UpdateUnionRoomMemberFacing(u32 currDirection, u32 playerIdx, struct UnkStruct_Main0 *main0)
{
- return sub_801A3B0(arg0, arg1, sub_8019F64(arg0, arg1, &arg2->arr[arg1].unk.field_0));
+ return SetUnionRoomObjectFacingDirection(currDirection, playerIdx, GetNewFacingDirectionForUnionRoomPlayer(currDirection, playerIdx, &main0->arr[playerIdx].gname_uname.gname));
}
diff --git a/src/wireless_communication_status_screen.c b/src/wireless_communication_status_screen.c
new file mode 100644
index 000000000..87b200f14
--- /dev/null
+++ b/src/wireless_communication_status_screen.c
@@ -0,0 +1,432 @@
+#include "global.h"
+#include "task.h"
+#include "bg.h"
+#include "palette.h"
+#include "gpu_regs.h"
+#include "malloc.h"
+#include "scanline_effect.h"
+#include "m4a.h"
+#include "dynamic_placeholder_text_util.h"
+#include "overworld.h"
+#include "strings.h"
+#include "string_util.h"
+#include "international_string_util.h"
+#include "sound.h"
+#include "menu.h"
+#include "librfu.h"
+#include "link_rfu.h"
+#include "union_room.h"
+#include "constants/songs.h"
+#include "constants/union_room.h"
+
+enum {
+ COLORMODE_NORMAL,
+ COLORMODE_WHITE_LGRAY,
+ COLORMODE_RED,
+ COLORMODE_GREEN,
+ COLORMODE_WHITE_DGRAY,
+};
+
+#define GROUPTYPE_TRADE 0
+#define GROUPTYPE_BATTLE 1
+#define GROUPTYPE_UNION 2
+#define GROUPTYPE_TOTAL 3
+#define GROUPTYPE_NONE -1
+#define NUM_GROUPTYPES 4
+
+struct WirelessCommunicationStatusScreen
+{
+ u32 groupCounts[NUM_GROUPTYPES];
+ u32 prevGroupCounts[NUM_GROUPTYPES];
+ u32 activities[NUM_TASK_DATA];
+ u8 taskId;
+ u8 rfuTaskId;
+ u8 filler[10];
+};
+
+static struct WirelessCommunicationStatusScreen * sStatusScreen;
+
+static void CB2_InitWirelessCommunicationScreen(void);
+static void Task_WirelessCommunicationScreen(u8);
+static void WCSS_AddTextPrinterParameterized(u8, u8, const u8 *, u8, u8, u8);
+static bool32 UpdateCommunicationCounts(u32 *, u32 *, u32 *, u8);
+
+static const u16 sBgTiles_Pal[] = INCBIN_U16("graphics/interface/wireless_info_screen.gbapal");
+static const u32 sBgTiles_Gfx[] = INCBIN_U32("graphics/interface/wireless_info_screen.4bpp.lz");
+static const u32 sBgTiles_Tilemap[] = INCBIN_U32("graphics/interface/wireless_info_screen.bin.lz");
+
+static const struct BgTemplate sBgTemplates[] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 31,
+ .priority = 0
+ }, {
+ .bg = 1,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 8,
+ .priority = 1
+ }
+};
+
+static const struct WindowTemplate sWindowTemplates[] = {
+ {
+ .bg = 0,
+ .tilemapLeft = 3,
+ .tilemapTop = 0,
+ .width = 24,
+ .height = 3,
+ .paletteNum = 15,
+ .baseBlock = 0x0001
+ }, {
+ .bg = 0,
+ .tilemapLeft = 3,
+ .tilemapTop = 4,
+ .width = 21,
+ .height = 15,
+ .paletteNum = 15,
+ .baseBlock = 0x0049
+ }, {
+ .bg = 0,
+ .tilemapLeft = 24,
+ .tilemapTop = 4,
+ .width = 3,
+ .height = 15,
+ .paletteNum = 15,
+ .baseBlock = 0x0184
+ }, DUMMY_WIN_TEMPLATE
+};
+
+static const u8 *const sHeaderTexts[NUM_GROUPTYPES + 1] = {
+ [0] = gText_WirelessCommStatus,
+ [GROUPTYPE_TRADE + 1] = gText_PeopleTrading,
+ [GROUPTYPE_BATTLE + 1] = gText_PeopleBattling,
+ [GROUPTYPE_UNION + 1] = gText_PeopleInUnionRoom,
+ [GROUPTYPE_TOTAL + 1] = gText_PeopleCommunicating
+};
+
+// Activity, group type, number of players
+// 0 players means the number of players can change and should be counted dynamically
+// GROUPTYPE_TOTAL have no unique group and are simply counted in the total of "people communicating"
+// UB: GROUPTYPE_NONE (-1) can potentially be used as an index into a u8[4] in CountPlayersInGroupAndGetActivity
+static const u8 sActivityGroupInfo[][3] = {
+ {ACTIVITY_BATTLE_SINGLE, GROUPTYPE_BATTLE, 2},
+ {ACTIVITY_BATTLE_DOUBLE, GROUPTYPE_BATTLE, 2},
+ {ACTIVITY_BATTLE_MULTI, GROUPTYPE_BATTLE, 4},
+ {ACTIVITY_TRADE, GROUPTYPE_TRADE, 2},
+ {ACTIVITY_WONDER_CARD, GROUPTYPE_TOTAL, 2},
+ {ACTIVITY_WONDER_NEWS, GROUPTYPE_TOTAL, 2},
+ {ACTIVITY_POKEMON_JUMP, GROUPTYPE_TOTAL, 0},
+ {ACTIVITY_BERRY_CRUSH, GROUPTYPE_TOTAL, 0},
+ {ACTIVITY_BERRY_PICK, GROUPTYPE_TOTAL, 0},
+ {ACTIVITY_SEARCH, GROUPTYPE_NONE, 0},
+ {ACTIVITY_SPIN_TRADE, GROUPTYPE_TRADE, 0},
+ {ACTIVITY_BERRY_BLENDER, GROUPTYPE_TOTAL, 0},
+ {ACTIVITY_RECORD_CORNER, GROUPTYPE_TOTAL, 0},
+ {ACTIVITY_NONE | IN_UNION_ROOM, GROUPTYPE_UNION, 1},
+ {ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM, GROUPTYPE_UNION, 2},
+ {ACTIVITY_TRADE | IN_UNION_ROOM, GROUPTYPE_UNION, 2},
+ {ACTIVITY_CHAT | IN_UNION_ROOM, GROUPTYPE_UNION, 0},
+ {ACTIVITY_CARD | IN_UNION_ROOM, GROUPTYPE_UNION, 2},
+ {ACTIVITY_PLYRTALK | IN_UNION_ROOM, GROUPTYPE_UNION, 1},
+ {ACTIVITY_NPCTALK | IN_UNION_ROOM, GROUPTYPE_UNION, 2},
+ {ACTIVITY_ACCEPT | IN_UNION_ROOM, GROUPTYPE_UNION, 1},
+ {ACTIVITY_DECLINE | IN_UNION_ROOM, GROUPTYPE_UNION, 1},
+ {ACTIVITY_WONDER_CARD2, GROUPTYPE_TOTAL, 2},
+ {ACTIVITY_WONDER_NEWS2, GROUPTYPE_TOTAL, 2},
+ {ACTIVITY_CONTEST_COOL, GROUPTYPE_TOTAL, 0},
+ {ACTIVITY_CONTEST_BEAUTY, GROUPTYPE_TOTAL, 0},
+ {ACTIVITY_CONTEST_CUTE, GROUPTYPE_TOTAL, 0},
+ {ACTIVITY_CONTEST_SMART, GROUPTYPE_TOTAL, 0},
+ {ACTIVITY_CONTEST_TOUGH, GROUPTYPE_TOTAL, 0},
+ {ACTIVITY_BATTLE_TOWER, GROUPTYPE_BATTLE, 2},
+ {ACTIVITY_BATTLE_TOWER_OPEN, GROUPTYPE_BATTLE, 2}
+};
+
+static void CB2_RunWirelessCommunicationScreen(void)
+{
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ RunTasks();
+ RunTextPrinters();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+ }
+}
+
+static void VBlankCB_WirelessCommunicationScreen(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void ShowWirelessCommunicationScreen(void)
+{
+ SetMainCallback2(CB2_InitWirelessCommunicationScreen);
+}
+
+static void CB2_InitWirelessCommunicationScreen(void)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ sStatusScreen = AllocZeroed(sizeof(struct WirelessCommunicationStatusScreen));
+ SetVBlankCallback(NULL);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));
+ SetBgTilemapBuffer(1, Alloc(0x800));
+ SetBgTilemapBuffer(0, Alloc(0x800));
+ DecompressAndLoadBgGfxUsingHeap(1, sBgTiles_Gfx, 0, 0, 0);
+ CopyToBgTilemapBuffer(1, sBgTiles_Tilemap, 0, 0);
+ InitWindows(sWindowTemplates);
+ DeactivateAllTextPrinters();
+ ResetPaletteFade();
+ ResetSpriteData();
+ ResetTasks();
+ ScanlineEffect_Stop();
+ m4aSoundVSyncOn();
+ SetVBlankCallback(VBlankCB_WirelessCommunicationScreen);
+ sStatusScreen->taskId = CreateTask(Task_WirelessCommunicationScreen, 0);
+ sStatusScreen->rfuTaskId = CreateTask_ListenToWireless();
+ sStatusScreen->prevGroupCounts[GROUPTYPE_TOTAL] = 1;
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ LoadPalette(sBgTiles_Pal, 0x00, 0x20);
+ Menu_LoadStdPalAt(0xF0);
+ DynamicPlaceholderTextUtil_Reset();
+ FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 0x0F);
+ CopyBgTilemapBufferToVram(1);
+ SetMainCallback2(CB2_RunWirelessCommunicationScreen);
+ RunTasks();
+ RunTextPrinters();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void CB2_ExitWirelessCommunicationStatusScreen(void)
+{
+ s32 i;
+ FreeAllWindowBuffers();
+ for (i = 0; i < (int)ARRAY_COUNT(sBgTemplates); i++)
+ {
+ Free(GetBgTilemapBuffer(i));
+ }
+ Free(sStatusScreen);
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
+}
+
+static void WCSS_CyclePalette(s16 * counter, s16 * palIdx)
+{
+ if (++(*counter) > 5)
+ {
+ if (++(*palIdx) == 14)
+ *palIdx = 0;
+
+ *counter = 0;
+ }
+ LoadPalette(sBgTiles_Pal + 16 * (*palIdx + 2), 0, 0x10);
+}
+
+static void PrintHeaderTexts(void)
+{
+ s32 i;
+ FillWindowPixelBuffer(0, PIXEL_FILL(0));
+ FillWindowPixelBuffer(1, PIXEL_FILL(0));
+ FillWindowPixelBuffer(2, PIXEL_FILL(0));
+ WCSS_AddTextPrinterParameterized(0, 1, sHeaderTexts[0], GetStringCenterAlignXOffset(1, sHeaderTexts[0], 0xC0), 6, COLORMODE_GREEN);
+ for (i = 0; i < (int)ARRAY_COUNT(*sHeaderTexts) - 1; i++)
+ {
+ WCSS_AddTextPrinterParameterized(1, 1, sHeaderTexts[i + 1], 0, 30 * i + 8, COLORMODE_WHITE_LGRAY);
+ }
+ WCSS_AddTextPrinterParameterized(1, 1, sHeaderTexts[i + 1], 0, 30 * i + 8, COLORMODE_RED);
+ PutWindowTilemap(0);
+ CopyWindowToVram(0, 2);
+ PutWindowTilemap(1);
+ CopyWindowToVram(1, 2);
+}
+
+#define tState data[0]
+
+static void Task_WirelessCommunicationScreen(u8 taskId)
+{
+ s32 i;
+ switch (gTasks[taskId].tState)
+ {
+ case 0:
+ PrintHeaderTexts();
+ gTasks[taskId].tState++;
+ break;
+ case 1:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ ShowBg(1);
+ CopyBgTilemapBufferToVram(0);
+ ShowBg(0);
+ gTasks[taskId].tState++;
+ break;
+ case 2:
+ if (!gPaletteFade.active)
+ {
+ gTasks[taskId].tState++;
+ }
+ break;
+ case 3:
+ if (UpdateCommunicationCounts(sStatusScreen->groupCounts, sStatusScreen->prevGroupCounts, sStatusScreen->activities, sStatusScreen->rfuTaskId))
+ {
+ FillWindowPixelBuffer(2, PIXEL_FILL(0));
+ for (i = 0; i < NUM_GROUPTYPES; i++)
+ {
+ ConvertIntToDecimalStringN(gStringVar4, sStatusScreen->groupCounts[i], STR_CONV_MODE_RIGHT_ALIGN, 2);
+ if (i != GROUPTYPE_TOTAL)
+ WCSS_AddTextPrinterParameterized(2, 1, gStringVar4, 12, 30 * i + 8, COLORMODE_WHITE_LGRAY);
+ else
+ WCSS_AddTextPrinterParameterized(2, 1, gStringVar4, 12, 98, COLORMODE_RED);
+ }
+ PutWindowTilemap(2);
+ CopyWindowToVram(2, 3);
+ }
+ if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ gTasks[sStatusScreen->rfuTaskId].data[15] = 0xFF;
+ gTasks[taskId].tState++;
+ }
+ WCSS_CyclePalette(&gTasks[taskId].data[7], &gTasks[taskId].data[8]);
+ break;
+ case 4:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gTasks[taskId].tState++;
+ break;
+ case 5:
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(CB2_ExitWirelessCommunicationStatusScreen);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+#undef tState
+
+static void WCSS_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 mode)
+{
+ u8 color[3];
+
+ switch (mode)
+ {
+ case COLORMODE_NORMAL:
+ color[0] = TEXT_COLOR_TRANSPARENT;
+ color[1] = TEXT_COLOR_DARK_GREY;
+ color[2] = TEXT_COLOR_LIGHT_GREY;
+ break;
+ case COLORMODE_WHITE_LGRAY:
+ color[0] = TEXT_COLOR_TRANSPARENT;
+ color[1] = TEXT_COLOR_WHITE;
+ color[2] = TEXT_COLOR_LIGHT_GREY;
+ break;
+ case COLORMODE_RED:
+ color[0] = TEXT_COLOR_TRANSPARENT;
+ color[1] = TEXT_COLOR_RED;
+ color[2] = TEXT_COLOR_LIGHT_RED;
+ break;
+ case COLORMODE_GREEN:
+ color[0] = TEXT_COLOR_TRANSPARENT;
+ color[1] = TEXT_COLOR_LIGHT_GREEN;
+ color[2] = TEXT_COLOR_GREEN;
+ break;
+ case COLORMODE_WHITE_DGRAY:
+ color[0] = TEXT_COLOR_TRANSPARENT;
+ color[1] = TEXT_COLOR_WHITE;
+ color[2] = TEXT_COLOR_DARK_GREY;
+ break;
+ }
+
+ AddTextPrinterParameterized4(windowId, fontId, x, y, 0, 0, color, -1, str);
+}
+
+static u32 CountPlayersInGroupAndGetActivity(struct UnkStruct_x20 * unk20, u32 * groupCounts)
+{
+ int i, j, k;
+ u32 activity = unk20->gname_uname.gname.activity;
+
+ #define group_activity(i) (sActivityGroupInfo[(i)][0])
+ #define group_type(i) (sActivityGroupInfo[(i)][1])
+ #define group_players(i) (sActivityGroupInfo[(i)][2])
+
+ for (i = 0; i < ARRAY_COUNT(sActivityGroupInfo); i++)
+ {
+ if (activity == group_activity(i) && unk20->groupScheduledAnim == UNION_ROOM_SPAWN_IN)
+ {
+ if (group_players(i) == 0)
+ {
+ k = 0;
+ for (j = 0; j < RFU_CHILD_MAX; j++)
+ {
+ if (unk20->gname_uname.gname.child_sprite_gender[j] != 0) k++;
+ }
+ k++;
+ groupCounts[group_type(i)] += k;
+ }
+ else
+ {
+ groupCounts[group_type(i)] += group_players(i);
+ }
+ }
+ }
+ return activity;
+
+ #undef group_activity
+ #undef group_type
+ #undef group_players
+}
+
+static bool32 HaveCountsChanged(u32 * currCounts, u32 * prevCounts)
+{
+ s32 i;
+ for (i = 0; i < NUM_GROUPTYPES; i++)
+ {
+ if (currCounts[i] != prevCounts[i])
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool32 UpdateCommunicationCounts(u32 * groupCounts, u32 * prevGroupCounts, u32 * activities, u8 taskId)
+{
+ bool32 activitiesChanged = FALSE;
+ u32 groupCountBuffer[NUM_GROUPTYPES] = {0, 0, 0, 0};
+ struct UnkStruct_x20 ** data = (void *)gTasks[taskId].data;
+ s32 i;
+
+ for (i = 0; i < NUM_TASK_DATA; i++)
+ {
+ u32 activity = CountPlayersInGroupAndGetActivity(&(*data)[i], groupCountBuffer);
+ if (activity != activities[i])
+ {
+ activities[i] = activity;
+ activitiesChanged = TRUE;
+ }
+ }
+
+ if (!HaveCountsChanged(groupCountBuffer, prevGroupCounts))
+ {
+ if (activitiesChanged == TRUE)
+ return TRUE;
+ else
+ return FALSE;
+ }
+ else
+ {
+ memcpy(groupCounts, groupCountBuffer, sizeof(groupCountBuffer));
+ memcpy(prevGroupCounts, groupCountBuffer, sizeof(groupCountBuffer));
+
+ groupCounts[GROUPTYPE_TOTAL] = groupCounts[GROUPTYPE_TRADE]
+ + groupCounts[GROUPTYPE_BATTLE]
+ + groupCounts[GROUPTYPE_UNION]
+ + groupCounts[GROUPTYPE_TOTAL];
+ return TRUE;
+ }
+}