From 4fe507e4539f2c349a7297c31f66893bbf775ff5 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sat, 30 May 2020 04:09:21 -0400 Subject: Document union_room.c --- include/berry_crush.h | 2 +- include/cable_club.h | 2 +- include/constants/union_room.h | 60 +- include/dodrio_berry_picking.h | 2 +- include/event_object_lock.h | 2 +- include/link.h | 2 +- include/link_rfu.h | 62 +- include/menu.h | 2 +- include/mevent.h | 4 +- include/mystery_gift.h | 2 + include/pokemon_jump.h | 2 +- include/union_room.h | 85 +- include/union_room_battle.h | 3 +- include/union_room_chat.h | 2 +- include/union_room_player_avatar.h | 12 +- src/battle_controllers.c | 2 +- src/berry_crush.c | 2 +- src/cable_club.c | 8 +- src/data/union_room.h | 284 ++-- src/dodrio_berry_picking.c | 2 +- src/event_object_lock.c | 2 +- src/item_menu.c | 2 +- src/link.c | 6 +- src/link_rfu_2.c | 136 +- src/link_rfu_3.c | 10 +- src/menu.c | 2 +- src/mevent2.c | 4 +- src/party_menu.c | 4 +- src/pokemon_jump.c | 2 +- src/trade.c | 9 +- src/union_room.c | 2640 ++++++++++++++++++------------------ src/union_room_battle.c | 34 +- src/union_room_chat.c | 2 +- src/union_room_player_avatar.c | 96 +- 34 files changed, 1819 insertions(+), 1672 deletions(-) diff --git a/include/berry_crush.h b/include/berry_crush.h index 8909ae821..a08f1f699 100755 --- a/include/berry_crush.h +++ b/include/berry_crush.h @@ -3,6 +3,6 @@ #include "main.h" -void sub_8020C70(MainCallback callback); +void StartBerryCrush(MainCallback callback); #endif // GUARD_BERRY_CRUSH_H diff --git a/include/cable_club.h b/include/cable_club.h index c2849ca3e..72e344009 100644 --- a/include/cable_club.h +++ b/include/cable_club.h @@ -11,7 +11,7 @@ void sub_80B37D4(TaskFunc taskFunc); u8 sub_80B3050(void); -void sub_80B360C(void); +void CB2_ReturnFromCableClubBattle(void); bool32 sub_80B2AF4(u16 *arg0, u16 *arg1); void sub_80B3AF8(u8 taskId); void task00_08081A90(u8 taskId); diff --git a/include/constants/union_room.h b/include/constants/union_room.h index 2314f85a0..9243ea15d 100644 --- a/include/constants/union_room.h +++ b/include/constants/union_room.h @@ -1,6 +1,58 @@ #ifndef GUARD_CONSTANTS_UNION_ROOM_H #define GUARD_CONSTANTS_UNION_ROOM_H +#define UNION_ROOM_SPAWN_NONE 0 +#define UNION_ROOM_SPAWN_IN 1 +#define UNION_ROOM_SPAWN_OUT 2 + +#define ACTIVITY_NONE 0 +#define ACTIVITY_BATTLE_SINGLE 1 +#define ACTIVITY_BATTLE_DOUBLE 2 +#define ACTIVITY_BATTLE_MULTI 3 +#define ACTIVITY_TRADE 4 +#define ACTIVITY_CHAT 5 +#define ACTIVITY_WONDER_CARD 6 +#define ACTIVITY_WONDER_NEWS 7 +#define ACTIVITY_CARD 8 +#define ACTIVITY_POKEMON_JUMP 9 +#define ACTIVITY_BERRY_CRUSH 10 +#define ACTIVITY_BERRY_PICK 11 +#define ACTIVITY_SEARCH 12 +#define ACTIVITY_SPIN_TRADE 13 +#define ACTIVITY_BATTLE_TOWER_OPEN 14 +#define ACTIVITY_RECORD_CORNER 15 +#define ACTIVITY_BERRY_BLENDER 16 + +// Player response +#define ACTIVITY_ACCEPT 17 +#define ACTIVITY_DECLINE 18 + +#define ACTIVITY_NPCTALK 19 +#define ACTIVITY_PLYRTALK 20 + +// Duplicate IDs? +#define ACTIVITY_WONDER_CARD2 21 +#define ACTIVITY_WONDER_NEWS2 22 + +#define ACTIVITY_CONTEST_COOL 23 +#define ACTIVITY_CONTEST_BEAUTY 24 +#define ACTIVITY_CONTEST_CUTE 25 +#define ACTIVITY_CONTEST_SMART 26 +#define ACTIVITY_CONTEST_TOUGH 27 +#define ACTIVITY_BATTLE_TOWER 28 +#define ACTIVITY_29 29 + +#define IN_UNION_ROOM 0x40 + +// Used in UR_AddTextPrinterParameterized +#define UR_COLOR_DKE_WHT_LTE 0 +#define UR_COLOR_RED_WHT_LTR 1 +#define UR_COLOR_GRN_WHT_LTG 2 +#define UR_COLOR_WHT_WHT_LTE 3 +#define UR_COLOR_WHT_DKE_LTE 4 +#define UR_COLOR_GRN_DN6_LTB 5 +#define UR_COLOR_DN5_DN6_LTB 6 + #define LINK_GROUP_SINGLE_BATTLE 0 #define LINK_GROUP_DOUBLE_BATTLE 1 #define LINK_GROUP_MULTI_BATTLE 2 @@ -10,8 +62,8 @@ #define LINK_GROUP_BERRY_PICKING 6 #define LINK_GROUP_WONDER_CARD 7 #define LINK_GROUP_WONDER_NEWS 8 -#define LINK_GROUP_UNK_9 9 -#define LINK_GROUP_UNK_10 10 +#define LINK_GROUP_UNION_ROOM_RESUME 9 +#define LINK_GROUP_UNION_ROOM_INIT 10 #define LINK_GROUP_UNK_11 11 #define LINK_GROUP_RECORD_CORNER 12 #define LINK_GROUP_BERRY_BLENDER 13 @@ -25,4 +77,8 @@ #define LINK_GROUP_BATTLE_TOWER_OPEN 21 #define NUM_LINK_GROUP_TYPES 22 +#define UR_TRADE_MATCH 0 +#define UR_TRADE_NOTYPE 1 +#define UR_TRADE_NOEGG 2 + #endif //GUARD_CONSTANTS_UNION_ROOM_H diff --git a/include/dodrio_berry_picking.h b/include/dodrio_berry_picking.h index 9995decc2..5decbeccb 100644 --- a/include/dodrio_berry_picking.h +++ b/include/dodrio_berry_picking.h @@ -1,7 +1,7 @@ #ifndef GUARD_DODRIO_BERRY_PICKING_H #define GUARD_DODRIO_BERRY_PICKING_H -void sub_802493C(u16 a0, void (*callback)(void)); +void StartDodrioBerryPicking(u16 a0, void (*callback)(void)); void IsDodrioInParty(void); void ShowDodrioBerryPickingRecords(void); diff --git a/include/event_object_lock.h b/include/event_object_lock.h index a3b350019..0226eb632 100644 --- a/include/event_object_lock.h +++ b/include/event_object_lock.h @@ -8,6 +8,6 @@ void LockSelectedObjectEvent(void); void sub_8098630(void); bool8 sub_8098734(void); void ScriptUnfreezeObjectEvents(void); -void sub_8098524(void); +void UnionRoom_UnlockPlayerAndChatPartner(void); #endif // GUARD_EVENT_OBJECT_LOCK_H diff --git a/include/link.h b/include/link.h index f41161d23..2818b3a7c 100644 --- a/include/link.h +++ b/include/link.h @@ -274,7 +274,7 @@ void LoadWirelessStatusIndicatorSpriteGfx(void); bool8 IsLinkTaskFinished(void); void CreateWirelessStatusIndicatorSprite(u8, u8); void sub_800ADF8(void); -void sub_800B488(void); +void SetWirelessCommType1(void); void CheckShouldAdvanceLinkState(void); void sub_8011BD0(void); u8 IsLinkMaster(void); diff --git a/include/link_rfu.h b/include/link_rfu.h index 2d74e686a..901b5deae 100644 --- a/include/link_rfu.h +++ b/include/link_rfu.h @@ -204,7 +204,7 @@ extern u8 gWirelessStatusIndicatorSpriteId; // Exported ROM declarations void WipeTrainerNameRecords(void); void sub_800E700(void); -void sub_800EDD4(void); +void LinkRfu_Shutdown(void); void sub_800F6FC(u8 who); void sub_800F728(u8 who); bool32 IsSendingKeysToRfu(void); @@ -225,51 +225,51 @@ void sub_800E174(void); void sub_800E6D0(void); bool32 sub_8010EC0(void); bool32 sub_8010F1C(void); -bool32 sub_8011A80(void); +bool32 RfuIsErrorStatus1or2(void); bool32 IsRfuRecvQueueEmpty(void); u32 GetRfuRecvQueueLength(void); void RfuVSync(void); void sub_80111B0(bool32 a0); -u8 sub_8011A74(void); -struct GFtgtGname *sub_800F7DC(void); -void sub_8011068(u8 a0); +u8 RfuGetErrorStatus(void); +struct GFtgtGname *GetHostRFUtgtGname(void); +void UpdateGameData_GroupLockedIn(u8 a0); void sub_8011170(u32 a0); -void sub_8011A64(u8 a0, u16 a1); +void RfuSetErrorStatus(u8 a0, u16 a1); u8 sub_801048C(bool32 a0); -void sub_800DF90(struct GFtgtGname *buff1, u8 *buff2); -void sub_8010F84(u8 a0, u32 a1, u32 a2); -void sub_8011C10(u32 a0); +void LinkRfu3_SetGnameUnameFromStaticBuffers(struct GFtgtGname *buff1, u8 *buff2); +void SetHostRFUtgtGname(u8 a0, u32 a1, u32 a2); +void InitializeRfuLinkManager_LinkLeader(u32 a0); bool32 sub_8012240(void); -void sub_800EF38(void); +void LinkRfu_StopManagerAndFinalizeSlots(void); bool32 sub_80105EC(void); -bool32 sub_801064C(u16 a0, const u8 *a1); -void sub_8010688(u8 a0, u16 a1, const u8 *a2); -u32 sub_8010714(u16 a0, const u8 *a1); -void sub_8011DC0(const u8 *a0, u16 a1); -bool8 sub_800EF1C(void); -bool32 sub_800EF58(bool32 a0); +bool32 TrainerIdAndNameStillInPartnersList(u16 a0, const u8 *a1); +void SendByteToPartnerByIdAndName(u8 a0, u16 a1, const u8 *a2); +u32 WaitSendByteToPartnerByIdAndName(u16 a0, const u8 *a1); +void RequestDisconnectSlotByTrainerNameAndId(const u8 *a0, u16 a1); +bool8 LmanAcceptSlotFlagIsNotZero(void); +bool32 WaitRfuState(bool32 a0); void DestroyWirelessStatusIndicatorSprite(void); void sub_801103C(void); -void sub_8011C5C(void); -void sub_80106D4(void); +void InitializeRfuLinkManager_JoinGroup(void); +void LinkRfuNIsend8(void); void RecordMixTrainerNames(void); -void sub_800ED10(void); -void sub_800ED28(void); -void sub_8011090(u8 a0, u32 a1, u32 a2); -void sub_8011FC8(const u8 *src, u16 trainerId); -void sub_8010FA0(bool32 a0, bool32 a1); -void sub_8010F60(void); +void LinkRfu_CreateConnectionAsParent(void); +void LinkRfu_StopManagerBeforeEnteringChat(void); +void UpdateGameDataWithActivitySpriteGendersFlag(u8 a0, u32 a1, u32 a2); +void CreateTask_RfuReconnectWithParent(const u8 *src, u16 trainerId); +void SetGnameBufferWonderFlags(bool32 a0, bool32 a1); +void ClearAndInitHostRFUtgtGname(void); void sub_8010FCC(u32 a0, u32 a1, u32 a2); -void sub_8011C84(void); +void InitializeRfuLinkManager_EnterUnionRoom(void); void sub_8012188(const u8 *name, struct GFtgtGname *structPtr, u8 a2); -bool32 sub_8011B90(void); +bool32 IsUnionRoomListenTaskActive(void); void sub_800FE50(void *a0); -bool32 sub_800E540(u16 id, u8 *name); +bool32 PlayerHasMetTrainerBefore(u16 id, u8 *name); void sub_8011DE0(u32 arg0); u8 sub_801100C(s32 a0); void sub_800EF7C(void); -bool8 sub_800DE7C(struct GFtgtGname *buff1, u8 *buff2, u8 idx); -bool8 sub_800DF34(struct GFtgtGname *buff1, u8 *buff2, u8 idx); +bool8 LinkRfu_GetNameIfCompatible(struct GFtgtGname *buff1, u8 *buff2, u8 idx); +bool8 LinkRfu_GetNameIfSerial7F7D(struct GFtgtGname *buff1, u8 *buff2, u8 idx); s32 sub_800E87C(u8 idx); void sub_8011BA4(void); void sub_8010198(void); @@ -325,9 +325,6 @@ void PkmnStrToASCII(u8 *q1, const u8 *q2); void ASCIIToPkmnStr(u8 *q1, const u8 *q2); u8 sub_800DD1C(u8 maxFlags); void sub_800DD94(struct GFtgtGname *data, u8 r9, bool32 r2, s32 r3); -bool8 sub_800DE7C(struct GFtgtGname *buff1, u8 *buff2, u8 idx); -bool8 sub_800DF34(struct GFtgtGname *buff1, u8 *buff2, u8 idx); -void sub_800DF90(struct GFtgtGname *buff1, u8 *buff2); void CreateWirelessStatusIndicatorSprite(u8 x, u8 y); void DestroyWirelessStatusIndicatorSprite(void); void LoadWirelessStatusIndicatorSpriteGfx(void); @@ -337,7 +334,6 @@ void sub_800E174(void); void CopyTrainerRecord(struct TrainerNameRecord *dest, u32 trainerId, const u8 *name); bool32 NameIsNotEmpty(const u8 *name); void RecordMixTrainerNames(void); -bool32 sub_800E540(u16 id, u8 *name); void WipeTrainerNameRecords(void); #endif //GUARD_LINK_RFU_H diff --git a/include/menu.h b/include/menu.h index d4a038920..4a19f55b0 100644 --- a/include/menu.h +++ b/include/menu.h @@ -79,7 +79,7 @@ void sub_8198DBC(u8 windowId, u8 fontId, u8 left, u8 top, u8 a4, u8 itemCount, u u8 sub_8199944(u8 windowId, u8 optionWidth, u8 columns, u8 rows, u8 initialCursorPos); u8 sub_8199134(s8, s8); u8 GetStartMenuWindowId(void); -void sub_819A2BC(u8, u8); +void ListMenuLoadStdPalAt(u8, u8); u8 Menu_MoveCursor(s8 cursorDelta); u8 Menu_MoveCursorNoWrapAround(s8 cursorDelta); void DrawStdWindowFrame(u8 windowId, bool8 CopyToVram); diff --git a/include/mevent.h b/include/mevent.h index a34ca355c..8c0ebbad7 100755 --- a/include/mevent.h +++ b/include/mevent.h @@ -57,7 +57,7 @@ u32 sub_801B708(const u16 *a0, const struct MEventStruct_Unk1442CC *a1, const vo bool32 MEventStruct_Unk1442CC_CompareField_unk_16(const struct MEventStruct_Unk1442CC *a0, const u16 *a1); u16 MEventStruct_Unk1442CC_GetValueNFrom_unk_20(const struct MEventStruct_Unk1442CC *a0, u32 command); u16 mevent_081445C0(u32 command); -void sub_801B940(void); -bool32 sub_801B94C(u16 a0); +void ResetReceivedWonderCardFlag(void); +bool32 MEventHandleReceivedWonderCard(u16 a0); #endif //GUARD_MEVENT_H diff --git a/include/mystery_gift.h b/include/mystery_gift.h index 243895a67..fb0414ee0 100644 --- a/include/mystery_gift.h +++ b/include/mystery_gift.h @@ -12,5 +12,7 @@ bool32 MG_PrintTextOnWindow1AndWaitButton(u8 *textState, const u8 *str); void AddTextPrinterToWindow1(const u8 *src); void c2_ereader(void); void c2_mystery_gift(void); +void MG_DrawTextBorder(u8 windowId); +s8 mevent_message_print_and_prompt_yes_no(u8 *textState, u16 *windowId, bool8 yesNoBoxPlacement, const u8 *str); #endif //GUARD_MYSTERY_GIFT_H diff --git a/include/pokemon_jump.h b/include/pokemon_jump.h index 9cf65212f..91733b385 100644 --- a/include/pokemon_jump.h +++ b/include/pokemon_jump.h @@ -3,7 +3,7 @@ #include "main.h" -void sub_802A9A8(u16 monId, MainCallback callback); +void StartPokemonJump(u16 monId, MainCallback callback); bool32 IsSpeciesAllowedInPokemonJump(u16 species); void IsPokemonJumpSpeciesInParty(void); void ResetPokeJumpResults(void); diff --git a/include/union_room.h b/include/union_room.h index 4c4cb5a62..0f0075344 100644 --- a/include/union_room.h +++ b/include/union_room.h @@ -5,23 +5,23 @@ // Exported type declarations -struct UnkStruct_Shared +struct WirelessGnameUnamePair { - struct GFtgtGname field_0; + struct GFtgtGname gname; u8 ALIGNED(4) playerName[PLAYER_NAME_LENGTH + 1]; }; -struct UnkStruct_x1C +struct UnkStruct_x1C // WirelessLink_Member? { - struct UnkStruct_Shared unk0; - u8 unk18:1; + struct WirelessGnameUnamePair gname_uname; + u8 active:1; }; -struct UnkStruct_x20 +struct UnkStruct_x20 // WirelessLink_Member? { - struct UnkStruct_Shared unk; + struct WirelessGnameUnamePair gname_uname; u16 field_18; - u8 field_1A_0:2; + u8 groupScheduledAnim:2; u8 field_1A_1:1; u8 field_1B; u8 field_1D; @@ -44,29 +44,28 @@ struct UnkStruct_Main8 struct UnkStruct_x20 arr[5]; }; -struct UnkStruct_Leader +struct WirelessLink_Leader { struct UnkStruct_Main0 *field_0; struct UnkStruct_Main4 *field_4; struct UnkStruct_Main8 *field_8; u8 state; u8 textState; - u8 field_E; + u8 delayTimerAfterOk; u8 listWindowId; - u8 field_10; - u8 field_11; + u8 bButtonCancelWindowId; + u8 nPlayerModeWindowId; u8 listTaskId; - u8 field_13; - u8 field_14; - u8 field_15; + u8 playerCount; + u16 field_14; u8 field_16; - u8 field_17; - u8 field_18; + u8 listenTaskId; + u8 activity; u8 field_19; u16 field_1A; }; -struct UnkStruct_Group +struct WirelessLink_Group { struct UnkStruct_Main0 *field_0; struct UnkStruct_Main4 *field_4; @@ -74,16 +73,16 @@ struct UnkStruct_Group u8 textState; u8 field_A; u8 listWindowId; - u8 field_C; - u8 field_D; + u8 bButtonCancelWindowId; + u8 playerNameAndIdWindowId; u8 listTaskId; - u8 field_F; + u8 leaderId; u8 field_10; - u8 field_11; - u8 field_12; + u8 listenTaskId; + u8 isWonderNews; u8 field_13; - u8 field_14; - u8 field_15; + u8 refreshTimer; + u8 delayBeforePrint; }; struct UnkStruct_8019BA8 @@ -94,7 +93,7 @@ struct UnkStruct_8019BA8 u8 field_3; }; -struct UnkStruct_URoom +struct WirelessLink_URoom { struct UnkStruct_Main0 *field_0; struct UnkStruct_Main4 *field_4; @@ -109,30 +108,30 @@ struct UnkStruct_URoom u8 field_18; u8 field_19; u8 field_1A; - u8 field_1B; - u8 field_1C; - u8 field_1D; - u8 field_1E; + u8 topListMenuWindowId; + u8 topListMenuId; + u8 tradeBoardSelectWindowId; + u8 tradeBoardDetailsWindowId; u8 field_1F; u8 field_20; u8 spriteIds[40]; u8 field_49; u8 field_4A; - u16 field_4C[6]; - u8 field_58[0x98 - 0x58]; - u16 field_98; - u16 field_9A[3]; + u16 playerSendBuffer[6]; + u8 activityRequestStrbufs[4][16]; + u16 partnerYesNoResponse; + u16 recvActivityRequest[3]; struct UnkStruct_8019BA8 field_A0[8]; u8 field_C0[12][15]; u8 field_174[48]; u8 field_1A4[200]; }; -union UnkUnion_Main +union WirelessLink_Main { - struct UnkStruct_Leader *leader; - struct UnkStruct_Group *group; - struct UnkStruct_URoom *uRoom; + struct WirelessLink_Leader *leader; + struct WirelessLink_Group *group; + struct WirelessLink_URoom *uRoom; }; struct UnionRoomTrade @@ -152,20 +151,22 @@ struct UnionRoomTrade // Exported RAM declarations -extern u8 gUnknown_02022C2C; -extern union UnkUnion_Main gUnknown_02022C30; -extern struct GFtgtGnameSub gUnknown_02022C38; +extern u8 gPlayerCurrActivity; +extern union WirelessLink_Main gUnknown_02022C30; +extern struct GFtgtGnameSub gPartnerTgtGnameSub; extern u16 gUnionRoomOfferedSpecies; extern u8 gUnionRoomRequestedMonType; // Exported ROM declarations -u8 sub_8013F78(void); +u8 CreateTask_ReturnFromLinkTrade(void); void nullsub_89(u8 taskId); void var_800D_set_xB(void); void MEvent_CreateTask_CardOrNewsWithFriend(u32 arg0); void MEvent_CreateTask_CardOrNewsOverWireless(u32 arg0); void MEvent_CreateTask_Leader(u32 arg0); +u8 CreateTask_ListenToWireless(void); +void StartUnionRoomBattle(u16 battleFlags); #endif //GUARD_UNION_ROOM_H diff --git a/include/union_room_battle.h b/include/union_room_battle.h index 2f5086008..ffccf197f 100644 --- a/include/union_room_battle.h +++ b/include/union_room_battle.h @@ -1,7 +1,6 @@ #ifndef GUARD_UNION_ROOM_BATTLE_H #define GUARD_UNION_ROOM_BATTLE_H -u8 sub_8013C40(void); -void sub_8014210(u16 battleFlags); +void CB2_UnionRoomBattle(void); #endif //GUARD_UNION_ROOM_BATTLE_H diff --git a/include/union_room_chat.h b/include/union_room_chat.h index e7ca9d46e..3dd22743a 100755 --- a/include/union_room_chat.h +++ b/include/union_room_chat.h @@ -12,7 +12,7 @@ enum #define UNION_ROOM_KB_ROW_COUNT 10 -void sub_801DD98(void); +void EnterUnionRoomChat(void); void copy_strings_to_sav1(void); #endif // GUARD_UNION_ROOM_CHAT_H diff --git a/include/union_room_player_avatar.h b/include/union_room_player_avatar.h index 9870d0981..698fc1693 100644 --- a/include/union_room_player_avatar.h +++ b/include/union_room_player_avatar.h @@ -3,12 +3,12 @@ u8 sub_8019BA8(struct UnkStruct_8019BA8 * ptr); void sub_8019E3C(void); -void sub_8019E70(u8 *arg0, s32 arg1); -void sub_8019F04(u8 *spriteIds); +void CreateGroupMemberObjectsInvisible(u8 *arg0, s32 arg1); +void DestroyGroupMemberObjects(u8 *spriteIds); void sub_8019F2C(void); -void sub_801A274(struct UnkStruct_URoom *arg0); -void sub_801A284(struct UnkStruct_URoom *arg0); -bool32 sub_801A2A8(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3); -void sub_801A3D0(u32 arg0, u32 arg1, struct UnkStruct_Main0 *arg2); +void ScheduleUnionRoomPlayerRefresh(struct WirelessLink_URoom *arg0); +void HandleUnionRoomPlayerRefresh(struct WirelessLink_URoom *arg0); +bool32 RfuUnionTool_GetGroupAndMemberInFrontOfPlayer(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3); +void UpdateUnionGroupMemberFacing(u32 arg0, u32 arg1, struct UnkStruct_Main0 *arg2); #endif //GUARD_UNION_ROOM_PLAYER_AVATAR_H diff --git a/src/battle_controllers.c b/src/battle_controllers.c index b411c12f6..43bd9fce6 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -33,7 +33,7 @@ void HandleLinkBattleSetup(void) if (gBattleTypeFlags & BATTLE_TYPE_LINK) { if (gWirelessCommType) - sub_800B488(); + SetWirelessCommType1(); if (!gReceivedRemoteLinkPlayers) OpenLink(); CreateTask(task00_08081A90, 0); diff --git a/src/berry_crush.c b/src/berry_crush.c index 383d273c4..3ff3156e6 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; diff --git a/src/cable_club.c b/src/cable_club.c index c2ac72883..2a53c64b2 100644 --- a/src/cable_club.c +++ b/src/cable_club.c @@ -849,7 +849,7 @@ static void sub_80B32B4(u8 taskId) CleanupOverworldWindowsAndTilemaps(); gTrainerBattleOpponent_A = 0x800; SetMainCallback2(CB2_InitBattle); - gMain.savedCallback = sub_80B360C; + gMain.savedCallback = CB2_ReturnFromCableClubBattle; DestroyTask(taskId); break; } @@ -915,7 +915,7 @@ static void sub_80B33BC(u8 taskId) CleanupOverworldWindowsAndTilemaps(); gTrainerBattleOpponent_A = 0x800; SetMainCallback2(CB2_InitBattle); - gMain.savedCallback = sub_80B360C; + gMain.savedCallback = CB2_ReturnFromCableClubBattle; DestroyTask(taskId); break; } @@ -965,7 +965,7 @@ static void sub_80B3554(void) RunTasks(); } -void sub_80B360C(void) +void CB2_ReturnFromCableClubBattle(void) { gBattleTypeFlags &= ~BATTLE_TYPE_20; Overworld_ResetMapMusic(); @@ -1129,7 +1129,7 @@ static void sub_80B3894(u8 taskId) case 3: if (IsLinkTaskFinished()) { - sub_8013F78(); + CreateTask_ReturnFromLinkTrade(); DestroyTask(taskId); } break; diff --git a/src/data/union_room.h b/src/data/union_room.h index 8cb0bc8aa..043300912 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, @@ -484,8 +493,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, @@ -599,7 +608,7 @@ const u8 *const sLinkGroupActivityTexts[] = { sText_BattleTowerLv50 }; -const struct WindowTemplate gUnknown_082F00BC = { +static const struct WindowTemplate sWindowTemplate_BButtonCancel = { .bg = 0x00, .tilemapLeft = 0x00, .tilemapTop = 0x00, @@ -609,29 +618,33 @@ 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)) + +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 = { @@ -654,7 +667,7 @@ const struct WindowTemplate gUnknown_082F0124 = { .baseBlock = 0x0044 }; -const struct WindowTemplate gUnknown_082F012C = { +static const struct WindowTemplate sWindowTemplate_NumPlayerMode = { .bg = 0x00, .tilemapLeft = 0x10, .tilemapTop = 0x03, @@ -672,11 +685,11 @@ const struct ListMenuItem gUnknown_082F0134[] = { { sText_EmptyString, 4 } }; -const struct ListMenuTemplate gUnknown_082F015C = { +static const struct ListMenuTemplate sListMenuTemplate_PossibleGroupMembers = { .items = gUnknown_082F0134, .moveCursorFunc = NULL, - .itemPrintFunc = sub_8013278, - .totalItems = 5, + .itemPrintFunc = ItemPrintFunc_PossibleGroupMembers, + .totalItems = ARRAY_COUNT(gUnknown_082F0134), .maxShowed = 5, .windowId = 0, .header_X = 0, @@ -732,11 +745,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 +766,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 +783,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, @@ -811,7 +824,7 @@ const struct ListMenuTemplate gUnknown_082F027C = { .items = gUnknown_082F0264, .moveCursorFunc = ListMenuDefaultCursorMoveFunc, .itemPrintFunc = NULL, - .totalItems = 3, + .totalItems = ARRAY_COUNT(gUnknown_082F0264), .maxShowed = 3, .windowId = 0, .header_X = 0, @@ -838,7 +851,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 +869,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 = { .items = sTradingBoardTypes, .moveCursorFunc = ListMenuDefaultCursorMoveFunc, .itemPrintFunc = NULL, - .totalItems = NUMBER_OF_MON_TYPES, + .totalItems = ARRAY_COUNT(sTradingBoardTypes), .maxShowed = 6, .windowId = 0, .header_X = 0, @@ -900,7 +913,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 +926,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 +957,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 +976,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 +998,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 936c1828f..1eaedfd64 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; 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/item_menu.c b/src/item_menu.c index fe381516c..274b92147 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -2290,7 +2290,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/link.c b/src/link.c index 34c9ee7ef..abd9715dd 100644 --- a/src/link.c +++ b/src/link.c @@ -221,7 +221,7 @@ static const u8 sUnused_082ED224[] = {0x00, 0xff, 0xfe, 0xff, 0x00}; bool8 IsWirelessAdapterConnected(void) { - sub_800B488(); + SetWirelessCommType1(); sub_800E700(); if (rfu_LMAN_REQBN_softReset_and_checkID() == 0x8001) { @@ -389,7 +389,7 @@ void CloseLink(void) gReceivedRemoteLinkPlayers = FALSE; if (gWirelessCommType) { - sub_800EDD4(); + LinkRfu_Shutdown(); } gLinkOpen = FALSE; DisableSerial(); @@ -1860,7 +1860,7 @@ bool8 HandleLinkConnection(void) return FALSE; } -void sub_800B488(void) +void SetWirelessCommType1(void) { if (gReceivedRemoteLinkPlayers == 0) { diff --git a/src/link_rfu_2.c b/src/link_rfu_2.c index 3ee193ec6..e13e0d4e1 100644 --- a/src/link_rfu_2.c +++ b/src/link_rfu_2.c @@ -375,11 +375,11 @@ void sub_800EAFC(void) void sub_800EB44(u8 taskId) { - if (sub_800F7DC()->activity == 0x54 && sub_8011A74() == 4) + if (GetHostRFUtgtGname()->activity == 0x54 && RfuGetErrorStatus() == 4) { rfu_REQ_disconnect(lman.acceptSlot_flag); rfu_waitREQComplete(); - sub_8011A64(0, 0); + RfuSetErrorStatus(0, 0); } switch (Rfu.unk_04) { @@ -421,7 +421,7 @@ void sub_800EB44(u8 taskId) case 16: Rfu.unk_cdb = 0; rfu_LMAN_setMSCCallback(sub_800EDBC); - sub_8011068(1); + UpdateGameData_GroupLockedIn(TRUE); sub_800EAB4(); sub_800EAFC(); Rfu.unk_04 = 20; @@ -434,12 +434,12 @@ void sub_800EB44(u8 taskId) } } -void sub_800ED10(void) +void LinkRfu_CreateConnectionAsParent(void) { rfu_LMAN_establishConnection(1, 0, 240, (u16 *)gUnknown_082ED6E0); } -void sub_800ED28(void) +void LinkRfu_StopManagerBeforeEnteringChat(void) { rfu_LMAN_stopManager(FALSE); } @@ -471,7 +471,7 @@ void sub_800EDBC(u16 unused) Rfu.unk_cdb = 1; } -void sub_800EDD4(void) +void LinkRfu_Shutdown(void) { u8 i; @@ -538,7 +538,7 @@ void sub_800EF00(void) Rfu.unk_67 = CreateTask(sub_800E94C, 1); } -bool8 sub_800EF1C(void) +bool8 LmanAcceptSlotFlagIsNotZero(void) { if (lman.acceptSlot_flag) { @@ -547,13 +547,13 @@ bool8 sub_800EF1C(void) return FALSE; } -void sub_800EF38(void) +void LinkRfu_StopManagerAndFinalizeSlots(void) { Rfu.unk_04 = 4; Rfu.unk_ce7 = lman.acceptSlot_flag; } -bool32 sub_800EF58(bool32 a0) +bool32 WaitRfuState(bool32 a0) { if (Rfu.unk_04 == 17 || a0) { @@ -676,13 +676,13 @@ bool32 sub_800F0F8(void) Rfu.unk_ce3 = 0; if (Rfu.unk_ce4 == 1) { - sub_8011A64(2, 0x8000); + RfuSetErrorStatus(2, 0x8000); sub_8011170(0x8000); return FALSE; } if (!lman.acceptSlot_flag) { - sub_800EDD4(); + LinkRfu_Shutdown(); gReceivedRemoteLinkPlayers = 0; return FALSE; } @@ -831,15 +831,15 @@ bool32 sub_800F4F0(void) { rfu_REQ_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag); rfu_waitREQComplete(); - switchval = sub_8011A74(); + switchval = RfuGetErrorStatus(); if (switchval != 1 && switchval != 6 && switchval != 9) - sub_8011A64(2, 0x9000); + RfuSetErrorStatus(2, 0x9000); rfu_clearAllSlot(); gReceivedRemoteLinkPlayers = FALSE; Rfu.linkRfuCallback = NULL; if (Rfu.unk_ce4 == 1) { - sub_8011A64(2, 0x9000); + RfuSetErrorStatus(2, 0x9000); sub_8011170(0x9000); } lman.state = lman.next_state = 0; @@ -924,7 +924,7 @@ void rfu_func_080F97B8(void) } } -struct GFtgtGname *sub_800F7DC(void) +struct GFtgtGname *GetHostRFUtgtGname(void) { return &gUnknown_02022B14; } @@ -1000,7 +1000,7 @@ void sub_800F86C(u8 unused) { Rfu.unk_80[i].unk_12 = 2; sub_800F6FC(i); - if (sub_800F7DC()->activity == 0x45 && gReceivedRemoteLinkPlayers != 0 && Rfu.unk_0c == 0) + if (GetHostRFUtgtGname()->activity == 0x45 && gReceivedRemoteLinkPlayers != 0 && Rfu.unk_0c == 0) sub_8010A70(gBlockRecvBuffer); } } @@ -1164,7 +1164,7 @@ void sub_800FD14(u16 command) void sub_800FE50(void *a0) { - if (gSendCmd[0] == 0 && !sub_8011A80()) + if (gSendCmd[0] == 0 && !RfuIsErrorStatus1or2()) { memcpy(Rfu.unk_f2, a0, sizeof(Rfu.unk_f2)); sub_800FD14(0x2f00); @@ -1535,7 +1535,7 @@ bool32 sub_80105EC(void) return FALSE; } -bool32 sub_801064C(u16 a0, const u8 *a1) +bool32 TrainerIdAndNameStillInPartnersList(u16 a0, const u8 *a1) { u8 r1 = sub_8011CE4(a1, a0); if (r1 == 0xFF) @@ -1545,7 +1545,7 @@ bool32 sub_801064C(u16 a0, const u8 *a1) return FALSE; } -void sub_8010688(u8 a0, u16 a1, const u8 *a2) +void SendByteToPartnerByIdAndName(u8 a0, u16 a1, const u8 *a2) { u8 r4 = sub_8011CE4(a2, a1); Rfu.unk_cd1[r4] = a0; @@ -1553,14 +1553,14 @@ void sub_8010688(u8 a0, u16 a1, const u8 *a2) rfu_NI_setSendData(1 << r4, 8, Rfu.unk_cd1 + r4, 1); } -void sub_80106D4(void) +void LinkRfuNIsend8(void) { Rfu.unk_c85 = 8; rfu_clearSlot(4, Rfu.unk_c3e); rfu_NI_setSendData(1 << Rfu.unk_c3e, 8, &Rfu.unk_c85, 1); } -u32 sub_8010714(u16 a0, const u8 *a1) +u32 WaitSendByteToPartnerByIdAndName(u16 a0, const u8 *a1) { u8 r0 = sub_8011CE4(a1, a0); if (r0 == 0xFF) @@ -1597,7 +1597,7 @@ s32 sub_80107A0(void) if (gRfuSlotStatusNI[Rfu.unk_c3e]->recv.state == 0x46 || gRfuSlotStatusNI[Rfu.unk_c3e]->recv.state == 0x48) { rfu_clearSlot(8, Rfu.unk_c3e); - sub_8011A64(Rfu.unk_c86, 0); + RfuSetErrorStatus(Rfu.unk_c86, 0); retval = Rfu.unk_c86; } else if (gRfuSlotStatusNI[Rfu.unk_c3e]->recv.state == 0x47) @@ -1842,7 +1842,7 @@ void sub_8010DB4(void) 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); + sub_800AF18((Rfu.unk_0a << 16) | (Rfu.unk_10 << 8) | Rfu.unk_12, Rfu.unk_124.unk_8c2, Rfu.unk_9e8.unk_232, RfuGetErrorStatus() == 2); Rfu.unk_ee = 2; CloseLink(); } @@ -1850,7 +1850,7 @@ void sub_8010DB4(void) { if (lman.childClockSlave_flag) rfu_LMAN_requestChangeAgbClockMaster(); - sub_8011A64(1, 0x7000); + RfuSetErrorStatus(1, 0x7000); sub_8011170(0x7000); } } @@ -1905,18 +1905,18 @@ void sub_8010F48(void) StringCopy(gUnknown_02022B22, gSaveBlock2Ptr->playerName); } -void sub_8010F60(void) +void ClearAndInitHostRFUtgtGname(void) { memset(&gUnknown_02022B14, 0, 0xD); sub_800DD94(&gUnknown_02022B14, 0, 0, 0); } -void sub_8010F84(u8 a0, u32 a1, u32 a2) +void SetHostRFUtgtGname(u8 a0, u32 a1, u32 a2) { sub_800DD94(&gUnknown_02022B14, a0, a2, a1); } -void sub_8010FA0(bool32 a0, bool32 a1) +void SetGnameBufferWonderFlags(bool32 a0, bool32 a1) { gUnknown_02022B14.unk_00.hasNews = a0; gUnknown_02022B14.unk_00.hasCard = a1; @@ -1946,16 +1946,16 @@ void sub_801103C(void) r5->child_sprite_gender[i - 1] = sub_801100C(i); } -void sub_8011068(u8 a0) +void UpdateGameData_GroupLockedIn(u8 a0) { gUnknown_02022B14.started = a0; rfu_REQ_configGameData(0, 2, (const u8 *)&gUnknown_02022B14, gUnknown_02022B22); } -void sub_8011090(u8 a0, u32 a1, u32 a2) +void UpdateGameDataWithActivitySpriteGendersFlag(u8 a0, u32 a1, u32 a2) { if (a0) - sub_8010F84(a0, a1, a2); + SetHostRFUtgtGname(a0, a1, a2); rfu_REQ_configGameData(0, 2, (const u8 *)&gUnknown_02022B14, gUnknown_02022B22); } @@ -1966,7 +1966,7 @@ void sub_80110B8(u32 a0) u32 r7; s32 r8; - if (sub_800F7DC()->activity == 0x45) + if (GetHostRFUtgtGname()->activity == 0x45) { r5 = 0; r7 = 0; @@ -1981,7 +1981,7 @@ void sub_80110B8(u32 a0) break; } } - sub_8011090(0x45, r7, 0); + UpdateGameDataWithActivitySpriteGendersFlag(0x45, r7, 0); } } @@ -2038,7 +2038,7 @@ void sub_801120C(u8 a0, u8 unused1) 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; @@ -2085,21 +2085,21 @@ void sub_801120C(u8 a0, u8 unused1) else sub_80111FC(); } - sub_8011A64(2, a0); + RfuSetErrorStatus(2, a0); break; case 0x34: break; case 0x42 ... 0x44: break; case 0xf3: - sub_8011A64(1, a0); + RfuSetErrorStatus(1, a0); sub_8011170(a0); Rfu.unk_ef = 1; break; case 0xf0 ... 0xf2: case 0xff: sub_8011170(a0); - sub_8011A64(1, a0); + RfuSetErrorStatus(1, a0); Rfu.unk_cdb = 1; break; } @@ -2121,7 +2121,7 @@ void sub_8011404(u8 a0, u8 unused1) Rfu.unk_c3e = lman.param[0]; break; case 0x23: - sub_8011A64(2, a0); + RfuSetErrorStatus(2, a0); break; case 0x24: Rfu.unk_04 = 11; @@ -2131,7 +2131,7 @@ void sub_8011404(u8 a0, u8 unused1) rfu_setRecvBuffer(0x10, Rfu.unk_c3e, Rfu.unk_c3f, 70); break; case 0x25: - sub_8011A64(2, 0x25); + RfuSetErrorStatus(2, 0x25); break; case 0x30: Rfu.unk_f0 = 2; @@ -2141,7 +2141,7 @@ void sub_8011404(u8 a0, u8 unused1) if (Rfu.unk_f0 != 2) Rfu.unk_f0 = 4; if (Rfu.unk_c86 != 9) - sub_8011A64(2, a0); + RfuSetErrorStatus(2, a0); nullsub_5(gUnknown_082ED7FC, 5, 5); if (gReceivedRemoteLinkPlayers == 1) sub_8011170(a0); @@ -2159,13 +2159,13 @@ void sub_8011404(u8 a0, u8 unused1) case 0x42 ... 0x44: break; case 0xF3: - sub_8011A64(1, a0); + RfuSetErrorStatus(1, a0); sub_8011170(a0); Rfu.unk_ef = 1; break; case 0xF0 ... 0xF2: case 0xFF: - sub_8011A64(1, a0); + RfuSetErrorStatus(1, a0); sub_8011170(a0); Rfu.unk_cdb = 1; break; @@ -2214,10 +2214,10 @@ void sub_8011674(u8 a0, u8 unused1) Rfu.unk_04 = 0x11; break; case 0x10: - sub_8011A64(4, 0); + RfuSetErrorStatus(4, 0); break; case 0x11: - if (sub_800F7DC()->activity == 0x45 && Rfu.unk_cd9 == 0) + if (GetHostRFUtgtGname()->activity == 0x45 && Rfu.unk_cd9 == 0) { u8 idx = sub_8011628(lman.param[0]); if (idx != 0) @@ -2240,7 +2240,7 @@ void sub_8011674(u8 a0, u8 unused1) Rfu.unk_ce4 = 2; } } - else if (sub_800F7DC()->activity == 0x54) + else if (GetHostRFUtgtGname()->activity == 0x54) { rfu_REQ_disconnect(lman.acceptSlot_flag); rfu_waitREQComplete(); @@ -2252,7 +2252,7 @@ void sub_8011674(u8 a0, u8 unused1) case 0x13: break; case 0x14: - if (sub_800F7DC()->activity != 0x45 && lman.acceptCount > 1) + if (GetHostRFUtgtGname()->activity != 0x45 && lman.acceptCount > 1) { r1 = 1 << sub_800E87C(lman.param[0]); rfu_REQ_disconnect(lman.acceptSlot_flag ^ r1); @@ -2279,16 +2279,16 @@ void sub_8011674(u8 a0, u8 unused1) } else { - sub_8011A64(2, a0); + RfuSetErrorStatus(2, a0); } break; case 0x24: Rfu.unk_04 = 0xD; - sub_8011A64(3, 0); + RfuSetErrorStatus(3, 0); rfu_setRecvBuffer(0x10, Rfu.unk_c3e, Rfu.unk_c3f, 70); break; case 0x25: - sub_8011A64(2, a0); + RfuSetErrorStatus(2, a0); break; case 0x31: if (lman.acceptSlot_flag & lman.param[0]) @@ -2324,7 +2324,7 @@ void sub_8011674(u8 a0, u8 unused1) if (gRfuLinkStatus->parentChild == 0xFF && lman.pcswitch_flag == 0 && FuncIsActiveTask(sub_800EB44) == TRUE) Rfu.unk_04 = 0x11; - sub_8011A64(2, a0); + RfuSetErrorStatus(2, a0); break; case 0x40: Rfu.unk_ce3 = 0; @@ -2332,14 +2332,14 @@ void sub_8011674(u8 a0, u8 unused1) case 0x42 ... 0x44: break; case 0xF3: - sub_8011A64(1, a0); + RfuSetErrorStatus(1, a0); sub_8011170(a0); Rfu.unk_ef = 1; break; case 0xF0 ... 0xF2: case 0xFF: sub_8011170(a0); - sub_8011A64(1, a0); + RfuSetErrorStatus(1, a0); Rfu.unk_cdb = 0; break; } @@ -2350,20 +2350,20 @@ void sub_8011A50(void) Rfu.unk_ce4 = 2; } -void sub_8011A64(u8 a0, u16 a1) +void RfuSetErrorStatus(u8 a0, u16 a1) { Rfu.unk_f1 = a0; Rfu.unk_0a = a1; } -u8 sub_8011A74(void) +u8 RfuGetErrorStatus(void) { return Rfu.unk_f1; } -bool32 sub_8011A80(void) +bool32 RfuIsErrorStatus1or2(void) { - u32 var = sub_8011A74() - 1; + u32 var = RfuGetErrorStatus() - 1; if (var < 2) return TRUE; else @@ -2409,7 +2409,7 @@ void sub_8011AFC(void) if (IsWirelessAdapterConnected()) { gLinkType = LINKTYPE_0x1111; - sub_800B488(); + SetWirelessCommType1(); OpenLink(); SeedRng(gMain.vblankCounter2); for (i = 0; i < 4; i++) @@ -2425,7 +2425,7 @@ void sub_8011AFC(void) } } -bool32 sub_8011B90(void) +bool32 IsUnionRoomListenTaskActive(void) { return FuncIsActiveTask(sub_800EB44); } @@ -2450,7 +2450,7 @@ void sub_8011BF8(void) UpdatePaletteFade(); } -void sub_8011C10(u32 a0) +void InitializeRfuLinkManager_LinkLeader(u32 a0) { Rfu.unk_0c = 1; sub_8010F48(); @@ -2460,7 +2460,7 @@ void sub_8011C10(u32 a0) sub_800EE78(); } -void sub_8011C5C(void) +void InitializeRfuLinkManager_JoinGroup(void) { Rfu.unk_0c = 0; sub_8010F48(); @@ -2468,7 +2468,7 @@ void sub_8011C5C(void) sub_800EF00(); } -void sub_8011C84(void) +void InitializeRfuLinkManager_EnterUnionRoom(void) { Rfu.unk_0c = 2; sub_8010F48(); @@ -2516,7 +2516,7 @@ void sub_8011D6C(u32 a0) Rfu.unk_cda = sub_800E87C(Rfu.unk_ce2); } -void sub_8011DC0(const u8 *ptr, u16 a1) +void RequestDisconnectSlotByTrainerNameAndId(const u8 *ptr, u16 a1) { u8 var = sub_8011CE4(ptr, a1); if (var != 0xFF) @@ -2584,13 +2584,13 @@ void sub_8011EF4(u8 taskId) if (sub_800EEBC()) DestroyTask(taskId); } - else if (sub_800F7DC()->activity == 0x15 || sub_800F7DC()->activity == 0x16) + else if (GetHostRFUtgtGname()->activity == 0x15 || GetHostRFUtgtGname()->activity == 0x16) { data[15]++; } else { - sub_8011A64(2, 0x7000); + RfuSetErrorStatus(2, 0x7000); DestroyTask(taskId); } } @@ -2607,12 +2607,12 @@ void sub_8011EF4(u8 taskId) if (data[15] > 240) { - sub_8011A64(2, 0x7000); + RfuSetErrorStatus(2, 0x7000); DestroyTask(taskId); } } -void sub_8011FC8(const u8 *src, u16 trainerId) +void CreateTask_RfuReconnectWithParent(const u8 *src, u16 trainerId) { u8 taskId; s16 *data; @@ -2626,7 +2626,7 @@ void sub_8011FC8(const u8 *src, u16 trainerId) bool32 sub_801200C(s16 a1, struct GFtgtGname *structPtr) { - if (sub_800F7DC()->activity == 0x45) + if (GetHostRFUtgtGname()->activity == 0x45) { if (structPtr->activity != 0x45) return TRUE; @@ -2663,7 +2663,7 @@ void sub_801209C(u8 taskId) if (++gTasks[taskId].data[0] > 300) { - sub_8011A64(2, 0x7000); + RfuSetErrorStatus(2, 0x7000); DestroyTask(taskId); } @@ -2683,7 +2683,7 @@ void sub_801209C(u8 taskId) } else { - sub_8011A64(2, 0x7000); + RfuSetErrorStatus(2, 0x7000); DestroyTask(taskId); } } diff --git a/src/link_rfu_3.c b/src/link_rfu_3.c index 535deeca6..b7d3e808c 100644 --- a/src/link_rfu_3.c +++ b/src/link_rfu_3.c @@ -625,7 +625,7 @@ void sub_800DD94(struct GFtgtGname *data, u8 r9, bool32 r2, s32 r3) 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; @@ -660,7 +660,7 @@ bool8 sub_800DE7C(struct GFtgtGname *buff1, u8 *buff2, u8 idx) 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) @@ -677,7 +677,7 @@ bool8 sub_800DF34(struct GFtgtGname *buff1, u8 *buff2, u8 idx) 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); @@ -820,7 +820,7 @@ void sub_800E174(void) gMain.oamBuffer[125].paletteNum = sprite->oam.paletteNum; gMain.oamBuffer[125].tileNum = sprite->data[6] + sprite->anims[sprite->data[2]][sprite->data[4]].frame.imageValue; CpuCopy16(gMain.oamBuffer + 125, (struct OamData *)OAM + 125, sizeof(struct OamData)); - if (sub_8011A74() == 1) + if (RfuGetErrorStatus() == 1) { DestroyWirelessStatusIndicatorSprite(); } @@ -908,7 +908,7 @@ void RecordMixTrainerNames(void) } } -bool32 sub_800E540(u16 id, u8 *name) +bool32 PlayerHasMetTrainerBefore(u16 id, u8 *name) { s32 i; diff --git a/src/menu.c b/src/menu.c index 62387c323..8bd85727e 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..3e524ce35 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) diff --git a/src/party_menu.c b/src/party_menu.c index 4ed7ab1b2..a4d588cbc 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_jump.c b/src/pokemon_jump.c index f2f416c35..da8695247 100755 --- a/src/pokemon_jump.c +++ b/src/pokemon_jump.c @@ -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; diff --git a/src/trade.c b/src/trade.c index e22180ae9..c9fd7b1ed 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; @@ -393,7 +394,7 @@ static void CB2_CreateTradeMenu(void) if (gWirelessCommType) { - sub_800B488(); + SetWirelessCommType1(); OpenLink(); sub_8011BA4(); } diff --git a/src/union_room.c b/src/union_room.c index cd45907f5..28e1139dd 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" @@ -54,156 +55,171 @@ #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 = {}; +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 void UR_AddTextPrinterParameterized(u8 windowId, u8 arg1, const u8 *str, u8 arg3, u8 arg4, u8 arg5); +static u16 ReadAsU16(const u8 *ptr); +static void Task_TryBecomeLinkLeader(u8 taskId); +static void Task_TryJoinLinkGroup(u8 taskId); +static void Task_ListenToWireless(u8 taskId); +static void Task_MEvent_Leader(u8 taskId); +static void Task_CardOrNewsWithFriend(u8 taskId); +static void Task_CardOrNewsOverWireless(u8 taskId); +static void Task_RunUnionRoom(u8 taskId); +static void ClearUnkStruct_x1CArray(struct UnkStruct_Main4 *arg0, u8 count); +static void ClearUnkStruct_x20Array(struct UnkStruct_x20 *arg0, u8 count); +static u8 CreateTask_ListenForPartnersWithCompatibleSerialNos(struct UnkStruct_Main4 *arg0, u32 arg1); +static u8 CreateTask_ListenForPartnersWithSerial7F7D(struct UnkStruct_Main4 *arg0, u32 arg1); +static bool8 PrintOnTextbox(u8 *textState, const u8 *str); +static bool8 Leader_SetStateIfMemberListChanged(struct WirelessLink_Leader *data, u32 arg1, u32 arg2); +static u8 sub_8013398(struct UnkStruct_Main0 *arg0); +static s8 UnionRoomHandleYesNo(u8 *arg0, bool32 arg1); +static void IntlConvPartnerUname7(u8 *dest, struct UnkStruct_x20 *arg1); +static void Leader_DestroyResources(struct WirelessLink_Leader *data); +static void CreateTask_RunScriptAndFadeToActivity(void); +static u8 LeaderUpdateGroupMembership(struct UnkStruct_Main0 *arg0); +static void PrintGroupMemberCandidateOnWindowWithColor(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 *arg3, u8 arg4, u8 id); +static u32 Findx20Inx1CArray(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1); +static u8 Appendx1Ctox20(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1, u8 arg2); +static u8 GetNewLeaderCandidate(void); +static u32 IsTryingToTradeAcrossVersionTooSoon(struct WirelessLink_Group *data, s32 id); +static void AskToJoinRfuGroup(struct WirelessLink_Group *data, s32 id); +static void JoinGroup_EnableScriptContexts(void); +static void PrintUnionRoomGroupOnWindow(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 *arg3, u8 arg4, u8 id); +static bool32 AreUnionRoomPlayerGnamesDifferent(struct WirelessGnameUnamePair *arg0, struct WirelessGnameUnamePair *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 void CreateTask_StartActivity(void); +static bool32 GetGnameWonderFlagByLinkGroup(struct GFtgtGname *arg0, s16 arg1); +static u8 CreateTask_SearchForChildOrParent(struct UnkStruct_Main4 *arg0, struct UnkStruct_Main4 *arg1, u32 arg2); 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_EnableScriptContext2AndFreezeObjectEvents(void); +static bool32 PlayerIsTalkingToUnionRoomAide(void); +static u8 HandlePlayerListUpdate(void); +static bool32 PollPartnerYesNoResponse(struct WirelessLink_URoom *data); +static void ReceiveUnionRoomActivityPacket(struct WirelessLink_URoom *data); +static u8 GetActivePartnerSpriteGenderParam(struct WirelessLink_URoom *data); +static bool32 UnionRoom_HandleContactFromOtherPlayer(struct WirelessLink_URoom *data); +static bool32 UR_RunTextPrinters_CheckPrinter0Active(void); +static s32 GetUnionRoomPlayerGender(s32 arg1, struct UnkStruct_Main0 *arg0); +static s32 UnionRoomGetPlayerInteractionResponse(struct UnkStruct_Main0 *arg0, u8 arg1, u8 arg2, u32 playerGender); +static void HandleCancelTrade(bool32 arg0); +static s32 ListMenuHandler_AllItemsAvailable(u8 *arg0, u8 *arg1, u8 *arg2, const struct WindowTemplate *winTemplate, const struct ListMenuTemplate *menuTemplate); +static s32 TradeBoardMenuHandler(u8 *arg0, u8 *arg1, u8 *arg2, u8 *arg3, const struct WindowTemplate *winTemplate, const struct ListMenuTemplate *menuTemplate, struct UnkStruct_Main0 *arg6); +static s32 GetIndexOfNthTradeBoardOffer(struct UnkStruct_x20 * arg, s32 arg1); +static bool32 HasAtLeastTwoMonsOfLevel30OrLower(void); +static u32 GetResponseIdx_InviteToURoomActivity(s32 arg0); +static void ViewURoomPartnerTrainerCard(u8 *unused, struct WirelessLink_URoom *data, bool8 arg2); +static void GetURoomActivityRejectMsg(u8 *dst, s32 arg1, u32 playerGender); +static u32 ConvPartnerUnameAndGetWhetherMetAlready(struct UnkStruct_x20 *arg0); +static void GetURoomActivityStartMsg(u8 *dst, u8 arg1); +static void UR_ClearBg0(void); +static s32 IsRequestedTypeOrEggInPlayerParty(u32 type, u32 species); +static bool32 UR_PrintFieldMessage(const u8 *src); +static s32 GetChatLeaderActionRequestMessage(u8 *dst, u32 gender, u16 *arg2, struct WirelessLink_URoom *data); +static void Task_InitUnionRoom(u8 taskId); +static bool8 AreGnameUnameDifferent(struct WirelessGnameUnamePair* arg0, const struct WirelessGnameUnamePair* arg1); +static void ItemPrintFunc_PossibleGroupMembers(u8 windowId, s32 itemId, u8 y); +static void ListMenuItemPrintFunc_UnionRoomGroups(u8 windowId, s32 itemId, u8 y); +static void TradeBoardListMenuItemPrintFunc(u8 windowId, s32 itemId, u8 y); +static void nullsub_14(u8 windowId, s32 itemId, u8 y); #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,49 +229,49 @@ 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; + data->state = 0; + data->textState = 0; gSpecialVar_Result = 0; } -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: 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); + InitializeRfuLinkManager_LinkLeader(sPlayerActivityGroupSize & 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_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].field_18 = 0; - data->field_0->arr[0].field_1A_0 = 1; + data->field_0->arr[0].groupScheduledAnim = UNION_ROOM_SPAWN_IN; data->field_0->arr[0].field_1A_1 = 0; 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 (sPlayerActivityGroupSize & 0xF) { case 2: case 3: @@ -266,41 +282,41 @@ void sub_8012780(u8 taskId) data->listWindowId = AddWindow(&gUnknown_082F0124); 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->playerCount = 1; data->state = 4; break; case 4: - StringCopy(gStringVar1, sLinkGroupActivityTexts[gUnknown_02022C2C]); - if ((gUnknown_02022C2D >> 4) != 0) + StringCopy(gStringVar1, sLinkGroupActivityTexts[gPlayerCurrActivity]); + if ((sPlayerActivityGroupSize >> 4) != 0) { - if (data->field_13 > (gUnknown_02022C2D >> 4) - 1 && (gUnknown_02022C2D & 0xF) != 0) + if (data->playerCount > (sPlayerActivityGroupSize >> 4) - 1 && (sPlayerActivityGroupSize & 0xF) != 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); + PrintNumPlayersWaitingForMsg(data->nPlayerModeWindowId, sPlayerActivityGroupSize, data->playerCount); data->state = 5; break; case 5: @@ -308,24 +324,24 @@ void sub_8012780(u8 taskId) data->state = 6; break; case 6: - sub_801320C(data, 7, 10); + Leader_SetStateIfMemberListChanged(data, 7, 10); if (gMain.newKeys & B_BUTTON) { - if (data->field_13 == 1) + if (data->playerCount == 1) data->state = 23; - else if ((gUnknown_02022C2D & 0xF0) != 0) + else if ((sPlayerActivityGroupSize & 0xF0) != 0) data->state = 30; else data->state = 19; } - if ((gUnknown_02022C2D >> 4) != 0 - && data->field_13 > (gUnknown_02022C2D >> 4) - 1 - && (gUnknown_02022C2D & 0xF) != 0 + if ((sPlayerActivityGroupSize >> 4) != 0 + && data->playerCount > (sPlayerActivityGroupSize >> 4) - 1 + && (sPlayerActivityGroupSize & 0xF) != 0 && sub_8012240() && gMain.newKeys & START_BUTTON) { data->state = 15; - sub_800EF38(); + LinkRfu_StopManagerAndFinalizeSlots(); } if (data->state == 6 && sub_80105EC()) { @@ -336,20 +352,21 @@ void sub_8012780(u8 taskId) if (!sub_80105EC()) { data->state = 6; - data->field_13 = sub_8013398(data->field_0); + data->playerCount = sub_8013398(data->field_0); } break; case 10: - id = ((gUnknown_02022C2C & 0xF) == 2) ? 1 : 0; + id = ((gPlayerCurrActivity & 0xF) == 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; } break; case 29: - id = ((gUnknown_02022C2D & 0xF) == 2) ? 0 : 1; + // Other player canceled. + id = ((sPlayerActivityGroupSize & 0xF) == 2) ? 0 : 1; if (PrintOnTextbox(&data->textState, sPlayerUnavailableTexts[id])) { data->state = 21; @@ -362,19 +379,19 @@ void sub_8012780(u8 taskId) } 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))) + switch (UnionRoomHandleYesNo(&data->textState, TrainerIdAndNameStillInPartnersList(ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.playerName))) { case 0: 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); + SendByteToPartnerByIdAndName(5, ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.playerName); data->state = 12; 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); + SendByteToPartnerByIdAndName(6, ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.playerName); data->state = 12; break; case -3: @@ -383,29 +400,29 @@ void sub_8012780(u8 taskId) } 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); + val = WaitSendByteToPartnerByIdAndName(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) { if (data->field_19 == 5) { - 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 == (sPlayerActivityGroupSize & 0xF)) { - if ((gUnknown_02022C2D & 0xF0) != 0 || data->field_13 == 4) + if ((sPlayerActivityGroupSize & 0xF0) != 0 || data->playerCount == 4) { data->state = 15; } 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; } - sub_800EF38(); - sub_80124EC(data->field_11, gUnknown_02022C2D, data->field_13); + LinkRfu_StopManagerAndFinalizeSlots(); + PrintNumPlayersWaitingForMsg(data->nPlayerModeWindowId, sPlayerActivityGroupSize, data->playerCount); } else { @@ -414,8 +431,8 @@ void sub_8012780(u8 taskId) } 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 = 4; @@ -425,7 +442,7 @@ void sub_8012780(u8 taskId) } else if (val == 2) { - sub_8011A64(0, 0); + RfuSetErrorStatus(0, 0); data->state = 4; } break; @@ -434,7 +451,7 @@ void sub_8012780(u8 taskId) data->state = 14; break; case 14: - if (++data->field_E > 120) + if (++data->delayTimerAfterOk > 120) data->state = 17; break; case 15: @@ -442,14 +459,14 @@ void sub_8012780(u8 taskId) data->state = 16; break; case 16: - switch (sub_80170B8(&data->textState, FALSE)) + switch (UnionRoomHandleYesNo(&data->textState, FALSE)) { case 0: data->state = 17; break; case 1: case -1: - if ((gUnknown_02022C2D & 0xF0) != 0) + if ((sPlayerActivityGroupSize & 0xF0) != 0) data->state = 30; else data->state = 19; @@ -461,16 +478,16 @@ void sub_8012780(u8 taskId) data->state = 20; break; case 20: - switch (sub_80170B8(&data->textState, FALSE)) + switch (UnionRoomHandleYesNo(&data->textState, FALSE)) { case 0: data->state = 23; break; case 1: case -1: - if ((gUnknown_02022C2D & 0xF0) != 0) + if ((sPlayerActivityGroupSize & 0xF0) != 0) data->state = 15; - else if (data->field_13 == (gUnknown_02022C2D & 0xF)) + else if (data->playerCount == (sPlayerActivityGroupSize & 0xF)) data->state = 15; else data->state = 4; @@ -478,13 +495,13 @@ void sub_8012780(u8 taskId) } break; case 17: - if (!sub_801320C(data, 7, 29)) + if (!Leader_SetStateIfMemberListChanged(data, 7, 29)) data->state = 18; break; case 18: - if (sub_800EF1C()) + if (LmanAcceptSlotFlagIsNotZero()) { - if (sub_800EF58(FALSE)) + if (WaitRfuState(FALSE)) { data->state = 26; } @@ -510,8 +527,8 @@ void sub_8012780(u8 taskId) case 21: case 23: DestroyWirelessStatusIndicatorSprite(); - sub_800EDD4(); - sub_8012F64(data); + LinkRfu_Shutdown(); + Leader_DestroyResources(data); data->state++; break; case 24: @@ -525,7 +542,7 @@ void sub_8012780(u8 taskId) gSpecialVar_Result = 8; break; case 26: - if (sub_8011A80()) + if (RfuIsErrorStatus1or2()) { data->state = 29; } @@ -533,11 +550,11 @@ void sub_8012780(u8 taskId) { 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,212 +562,212 @@ 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 state1, u32 state2) { - 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 = state1; break; - case 2: - sub_8011A64(0, 0); + case UNION_ROOM_SPAWN_OUT: + RfuSetErrorStatus(0, 0); RedrawListMenu(data->listTaskId); - data->state = arg2; + data->state = state2; 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; + struct WirelessLink_Leader *data = sWirelessLinkMain.leader; u8 var = 0; - 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; break; - case 2: + case UNION_ROOM_SPAWN_OUT: var = 1; break; } - sub_80178A0(arg0, 0, arg2, &data->field_0->arr[id], var, id); + PrintGroupMemberCandidateOnWindowWithColor(windowId, 0, y, &data->field_0->arr[id], var, 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++) { - 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].field_18 = 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], 5); - if (ret != 2) + if (ret != UNION_ROOM_SPAWN_OUT) { for (id = 0; id < 5; 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; @@ -761,7 +778,7 @@ u8 sub_8013398(struct UnkStruct_Main0 *arg0) copiedCount = 0; for (i = 0; i < 5; 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++; @@ -771,16 +788,16 @@ u8 sub_8013398(struct UnkStruct_Main0 *arg0) ret = copiedCount; for (; copiedCount < 5; copiedCount++) { - data->field_0->arr[copiedCount].unk = gUnknown_082F045C; + data->field_0->arr[copiedCount].gname_uname = sWirelessGnameUnamePair_Dummy; data->field_0->arr[copiedCount].field_18 = 0; - data->field_0->arr[copiedCount].field_1A_0 = 0; + data->field_0->arr[copiedCount].groupScheduledAnim = UNION_ROOM_SPAWN_NONE; data->field_0->arr[copiedCount].field_1A_1 = 0; data->field_0->arr[copiedCount].field_1B = 0; } for (i = 0; i < 5; 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) continue; @@ -795,34 +812,34 @@ u8 sub_8013398(struct UnkStruct_Main0 *arg0) 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; + data->state = 0; + data->textState = 0; gSpecialVar_Result = 0; } -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: 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); + 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: @@ -830,34 +847,34 @@ void sub_80134E8(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, gSpecialVar_0x8004); - data->field_C = AddWindow(&gUnknown_082F00BC); + 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->leaderId = 0; data->state = 3; break; case 3: - id = sub_8013E44(); + id = GetNewLeaderCandidate(); switch (id) { case 1: @@ -870,14 +887,14 @@ void sub_80134E8(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) { - u32 var = sub_8013B8C(data, id); + u32 var = IsTryingToTradeAcrossVersionTooSoon(data, id); if (var == 0) { - sub_8013BD8(data, id); + AskToJoinRfuGroup(data, id); data->state = 5; PlaySE(SE_PN_ON); } @@ -904,30 +921,46 @@ void sub_80134E8(u8 taskId) } break; case 5: - sub_80130B4(gStringVar4, gUnknown_02022C2C); + GetYouAskedToJoinGroupPleaseWaitMessage(gStringVar4, gPlayerCurrActivity); if (PrintOnTextbox(&data->textState, gStringVar4)) { - sub_8018404(gStringVar1, &data->field_0->arr[data->field_F]); + IntlConvPartnerUname7(gStringVar1, &data->field_0->arr[data->leaderId]); data->state = 6; } break; case 6: - if (gReceivedRemoteLinkPlayers != 0) + 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; + RfuSetErrorStatus(0, 0); + switch (gPlayerCurrActivity) { - case 1 ... 5: - case 9 ... 11: - case 13 ... 16: - case 21 ... 28: + 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 = 20; return; } } - switch (sub_8011A74()) + switch (RfuGetErrorStatus()) { case 1: data->state = 12; @@ -938,49 +971,49 @@ void sub_80134E8(u8 taskId) data->state = 14; break; case 5: - sub_8013160(gStringVar4, gUnknown_02022C2C); + 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); + RfuSetErrorStatus(12, 0); } else { - sub_8011A64(7, 0); - StringCopy(gStringVar1, sLinkGroupActivityTexts[gUnknown_02022C2C]); + RfuSetErrorStatus(7, 0); + StringCopy(gStringVar1, sLinkGroupActivityTexts[gPlayerCurrActivity]); StringExpandPlaceholders(gStringVar4, sText_AwaitingOtherMembers); } } break; case 7: - if (data->field_15 > 0xF0) + if (data->delayBeforePrint > 240) { if (PrintOnTextbox(&data->textState, gStringVar4)) { - sub_8011A64(12, 0); - data->field_15 = 0; + RfuSetErrorStatus(12, 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) + if (!RfuGetErrorStatus() && gMain.newKeys & B_BUTTON) data->state = 7; break; case 7: @@ -988,10 +1021,10 @@ void sub_80134E8(u8 taskId) data->state = 8; break; case 8: - switch (sub_80170B8(&data->textState, sub_8011A74())) + switch (UnionRoomHandleYesNo(&data->textState, RfuGetErrorStatus())) { case 0: - sub_80106D4(); + LinkRfuNIsend8(); data->state = 9; RedrawListMenu(data->listTaskId); break; @@ -1007,7 +1040,7 @@ void sub_80134E8(u8 taskId) } break; case 9: - if (sub_8011A74()) + if (RfuGetErrorStatus()) data->state = 6; break; case 10: @@ -1015,23 +1048,23 @@ void sub_80134E8(u8 taskId) case 14: case 18: case 20: - ClearWindowTilemap(data->field_D); - ClearStdWindowAndFrame(data->field_D, FALSE); + 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: DestroyWirelessStatusIndicatorSprite(); - if (PrintOnTextbox(&data->textState, sPlayerDisconnectedTexts[sub_8011A74()])) + if (PrintOnTextbox(&data->textState, sPlayerDisconnectedTexts[RfuGetErrorStatus()])) { gSpecialVar_Result = 6; data->state = 23; @@ -1044,7 +1077,7 @@ void sub_80134E8(u8 taskId) break; case 15: DestroyWirelessStatusIndicatorSprite(); - if (PrintOnTextbox(&data->textState, sPlayerDisconnectedTexts[sub_8011A74()])) + if (PrintOnTextbox(&data->textState, sPlayerDisconnectedTexts[RfuGetErrorStatus()])) { gSpecialVar_Result = 8; data->state = 23; @@ -1059,25 +1092,25 @@ void sub_80134E8(u8 taskId) break; case 23: DestroyTask(taskId); - sub_80173D4(); - sub_800EDD4(); + JoinGroup_EnableScriptContexts(); + LinkRfu_Shutdown(); break; case 21: - sub_80149C4(); + 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) + else if (structPtr->gname_uname.gname.unk_00.isChampion) return 0; } else @@ -1088,88 +1121,88 @@ u32 sub_8013B8C(struct UnkStruct_Group *arg0, s32 id) return 2; } -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]); + UpdateGameDataWithActivitySpriteGendersFlag(sLinkGroupToURoomActivity[gSpecialVar_0x8004], 0, 1); + 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 group) { - if (id == 0xFF) + if (group == 0xFF) return TRUE; - if (id <= ARRAY_COUNT(gUnknown_082F04D8)) // UB: <= may access data outside the array + if (group <= ARRAY_COUNT(sAcceptedActivityIds)) // UB: <= may access data outside the array { - const u8 *bytes = gUnknown_082F04D8[id]; + const u8 *bytes = sAcceptedActivityIds[group]; while ((*(bytes) != 0xFF)) { - if ((*bytes) == arg0) + if ((*bytes) == activity) return TRUE; bytes++; } @@ -1178,49 +1211,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; + if (data->field_0->arr[id].gname_uname.gname.started) + return UR_COLOR_WHT_WHT_LTE; else if (data->field_0->arr[id].field_1A_1 != 0) - return 1; + 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,8 +1268,8 @@ 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; } @@ -1244,12 +1277,12 @@ u8 sub_8013E44(void) } 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].field_1A_0 = 2; + data->field_0->arr[i].groupScheduledAnim = UNION_ROOM_SPAWN_OUT; ret = 2; } } @@ -1257,29 +1290,29 @@ 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; } return ret; } -static void Task_CreateTradeMenu(u8 taskId) +static void Task_ReturnFromLinkTrade(u8 taskId) { CB2_StartCreateTradeMenu(); DestroyTask(taskId); } -u8 sub_8013F78(void) +u8 CreateTask_ReturnFromLinkTrade(void) { - u8 taskId = CreateTask(Task_CreateTradeMenu, 0); + u8 taskId = CreateTask(Task_ReturnFromLinkTrade, 0); return taskId; } -void sub_8013F90(u8 taskId) +static void Task_StartUnionRoomTrade(u8 taskId) { u32 monId = GetPartyPositionOfRegisteredMon(&sUnionRoomTrade, GetMultiplayerId()); @@ -1319,7 +1352,7 @@ void sub_8013F90(u8 taskId) } } -void sub_80140E0(u8 taskId) +static void Task_ExchangeCards(u8 taskId) { switch (gTasks[taskId].data[0]) { @@ -1343,11 +1376,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 +1390,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 +1410,7 @@ void sub_80141A4(void) BuildOamBuffer(); } -void sub_8014210(u16 battleFlags) +void StartUnionRoomBattle(u16 battleFlags) { HealPlayerParty(); SavePlayerParty(); @@ -1385,11 +1418,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(); } +// TODO: pokefirered bad name static void sub_8014290(u16 linkService, u16 x, u16 y) { VarSet(VAR_CABLE_CLUB_STATE, linkService); @@ -1398,7 +1432,8 @@ static void sub_8014290(u16 linkService, u16 x, u16 y) WarpIntoMap(); } -void sub_8014304(s8 mapGroup, s8 mapNum, s32 x, s32 y, u16 linkService) +// TODO: pokefirered bad name +static void sub_8014304(s8 mapGroup, s8 mapNum, s32 x, s32 y, u16 linkService) { gSpecialVar_0x8004 = linkService; VarSet(VAR_CABLE_CLUB_STATE, linkService); @@ -1409,16 +1444,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 +1464,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); + SetMainCallback2(CB2_TransitionToCableClub); break; - case 2: + case ACTIVITY_BATTLE_DOUBLE: CleanupOverworldWindowsAndTilemaps(); HealPlayerParty(); SavePlayerParty(); LoadPlayerBag(); - sub_80143E4(gBlockSendBuffer, TRUE); + CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE); sub_8014304(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_DOUBLE_BATTLE); - SetMainCallback2(sub_8014384); + SetMainCallback2(CB2_TransitionToCableClub); break; - case 3: + case ACTIVITY_BATTLE_MULTI: CleanupOverworldWindowsAndTilemaps(); HealPlayerParty(); SavePlayerParty(); LoadPlayerBag(); - sub_80143E4(gBlockSendBuffer, TRUE); + CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE); sub_8014304(MAP_GROUP(BATTLE_COLOSSEUM_4P), MAP_NUM(BATTLE_COLOSSEUM_4P), 5, 8, USING_MULTI_BATTLE); - SetMainCallback2(sub_8014384); + 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); + 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); + 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: + case ACTIVITY_POKEMON_JUMP: sub_8014290(USING_MINIGAME, 5, 1); - sub_802A9A8(GetCursorSelectionMonId(), CB2_LoadMap); + StartPokemonJump(GetCursorSelectionMonId(), CB2_LoadMap); break; - case 10: + case ACTIVITY_BERRY_CRUSH: sub_8014290(USING_BERRY_CRUSH, 9, 1); - sub_8020C70(CB2_LoadMap); + StartBerryCrush(CB2_LoadMap); break; - case 11: + case ACTIVITY_BERRY_PICK: sub_8014290(USING_MINIGAME, 5, 1); - sub_802493C(GetCursorSelectionMonId(), CB2_LoadMap); + StartDodrioBerryPicking(GetCursorSelectionMonId(), CB2_LoadMap); break; } DestroyTask(taskId); gSpecialVar_Result = 1; - if (gUnknown_02022C2C != 68) + 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); @@ -1551,10 +1591,10 @@ void sub_8014790(u8 taskId) { case 0: gSpecialVar_Result = 1; - switch (gUnknown_02022C2C) + 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 +1605,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 +1629,7 @@ void sub_8014790(u8 taskId) case 2: if (!gPaletteFade.active) { - if (gUnknown_02022C2C == 29) + if (gPlayerCurrActivity == 29) { DestroyTask(taskId); SetMainCallback2(CB2_StartCreateTradeMenu); @@ -1601,7 +1645,7 @@ void sub_8014790(u8 taskId) if (IsLinkTaskFinished()) { DestroyTask(taskId); - sub_80149D8(); + CreateTask_StartActivity(); } break; case 4: @@ -1642,78 +1686,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; + data->state = 0; + data->textState = 0; + data->activity = activity; gSpecialVar_Result = 0; } -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_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].field_18 = 0; - data->field_0->arr[0].field_1A_0 = 1; + data->field_0->arr[0].groupScheduledAnim = UNION_ROOM_SPAWN_IN; data->field_0->arr[0].field_1A_1 = 0; 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.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, sLinkGroupActivityTexts[gPlayerCurrActivity]); + StringExpandPlaceholders_AwaitingCommFromAnother(gStringVar4, gPlayerCurrActivity); data->state = 3; break; case 3: @@ -1721,7 +1765,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 +1775,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,38 +1789,38 @@ 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); + SendByteToPartnerByIdAndName(5, 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); + SendByteToPartnerByIdAndName(6, 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); + val = WaitSendByteToPartnerByIdAndName(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) { if (data->field_19 == 5) { - 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; @@ -1786,7 +1830,7 @@ void sub_8014A40(u8 taskId) } else if (val == 2) { - sub_8011A64(0, 0); + RfuSetErrorStatus(0, 0); data->state = 2; } break; @@ -1795,17 +1839,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 +1859,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); @@ -1833,13 +1877,13 @@ void sub_8014A40(u8 taskId) } break; case 15: - if (sub_8011A74() == 1 || sub_8011A74() == 2) + if (RfuGetErrorStatus() == 1 || RfuGetErrorStatus() == 2) { data->state = 13; } else if (gReceivedRemoteLinkPlayers != 0) { - sub_8011068(1); + UpdateGameData_GroupLockedIn(TRUE); data->state++; } break; @@ -1847,7 +1891,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 +1905,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; + data->state = 0; + data->textState = 0; + data->isWonderNews = activity - ACTIVITY_WONDER_CARD2; gSpecialVar_Result = 0; } -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 +1942,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 +1953,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 +1985,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,17 +2012,17 @@ 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 (RfuGetErrorStatus()) { case 1: case 2: @@ -1987,7 +2031,7 @@ void sub_8014F48(u8 taskId) break; case 5: AddTextPrinterToWindow1(sText_PlayerSentBackOK); - sub_8011A64(0, 0); + RfuSetErrorStatus(0, 0); break; } break; @@ -1996,19 +2040,19 @@ 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[RfuGetErrorStatus()])) { DestroyWirelessStatusIndicatorSprite(); DestroyTask(taskId); - sub_800EDD4(); + LinkRfu_Shutdown(); gSpecialVar_Result = 5; } break; @@ -2016,7 +2060,7 @@ void sub_8014F48(u8 taskId) DestroyWirelessStatusIndicatorSprite(); AddTextPrinterToWindow1(sText_PleaseStartOver); DestroyTask(taskId); - sub_800EDD4(); + LinkRfu_Shutdown(); gSpecialVar_Result = 5; break; case 11: @@ -2030,36 +2074,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; + data->state = 0; + data->textState = 0; + data->isWonderNews = activity - ACTIVITY_WONDER_CARD2; gSpecialVar_Result = 0; } -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 +2111,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 +2122,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 +2145,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 (GetGnameWonderFlagByLinkGroup(&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,25 +2169,25 @@ 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 (RfuGetErrorStatus()) { case 1: case 2: @@ -2152,7 +2196,7 @@ void sub_80152F4(u8 taskId) break; case 5: AddTextPrinterToWindow1(sText_WirelessLinkEstablished); - sub_8011A64(0, 0); + RfuSetErrorStatus(0, 0); break; } break; @@ -2166,7 +2210,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,7 +2220,7 @@ void sub_80152F4(u8 taskId) { DestroyWirelessStatusIndicatorSprite(); DestroyTask(taskId); - sub_800EDD4(); + LinkRfu_Shutdown(); gSpecialVar_Result = 5; } break; @@ -2185,16 +2229,16 @@ void sub_80152F4(u8 taskId) { DestroyWirelessStatusIndicatorSprite(); DestroyTask(taskId); - sub_800EDD4(); + LinkRfu_Shutdown(); gSpecialVar_Result = 5; } 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(); + LinkRfu_Shutdown(); gSpecialVar_Result = 5; } break; @@ -2211,35 +2255,35 @@ void sub_80152F4(u8 taskId) void UnionRoomSpecial(void) { - struct UnkStruct_URoom *dataPtr; + struct WirelessLink_URoom *data; - 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; + data = AllocZeroed(sizeof(*sWirelessLinkMain.uRoom)); + sWirelessLinkMain.uRoom = data; + sURoom = data; - dataPtr->state = 0; - dataPtr->textState = 0; - dataPtr->field_10 = 0; - dataPtr->field_12 = 0; + data->state = 0; + data->textState = 0; + data->field_10 = 0; + data->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 *data = sWirelessLinkMain.uRoom; data->state = 8; data->stateAfterPrint = nextState; @@ -2247,83 +2291,83 @@ void sub_8015664(u32 nextState, const u8 *src) 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 *data = sWirelessLinkMain.uRoom; data->state = 26; if (src != gStringVar4) StringExpandPlaceholders(gStringVar4, src); } -void sub_80156B0(struct UnkStruct_URoom *data) +static void sub_80156B0(struct WirelessLink_URoom *data) { memcpy(&gDecompressionBuffer[0x3F00], data->field_0, 0x100); } -void sub_80156C8(struct UnkStruct_URoom *data) +static void sub_80156C8(struct WirelessLink_URoom *data) { memcpy(data->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 playerGender = MALE; + struct WirelessLink_URoom *data = sWirelessLinkMain.uRoom; s16 *taskData = gTasks[taskId].data; switch (data->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); + data->field_4 = AllocZeroed(RFU_CHILD_MAX * sizeof(struct UnkStruct_x1C)); + data->field_C = AllocZeroed(RFU_CHILD_MAX * sizeof(struct UnkStruct_x1C)); + data->field_0 = AllocZeroed(8 * sizeof(struct UnkStruct_x20)); + data->field_8 = AllocZeroed(sizeof(struct UnkStruct_x20)); + ClearUnkStruct_x20Array(data->field_0->arr, 8); + gPlayerCurrActivity = IN_UNION_ROOM; + data->field_20 = CreateTask_SearchForChildOrParent(data->field_C, data->field_4, LINK_GROUP_UNION_ROOM_RESUME); sub_8019BA8(data->field_A0); sub_8019F2C(); data->state = 1; break; case 1: - sub_8019E70(data->spriteIds, taskData[0]); + CreateGroupMemberObjectsInvisible(data->spriteIds, taskData[0]); if (++taskData[0] == 8) data->state = 2; break; case 2: - sub_8010F84(0x40, 0, 0); + SetHostRFUtgtGname(IN_UNION_ROOM, 0, 0); sub_8010FCC(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel); - sub_800B488(); + 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(&data->field_8->arr[0], 1); + ClearUnkStruct_x1CArray(data->field_4, 4); + ClearUnkStruct_x1CArray(data->field_C, 4); gSpecialVar_Result = 0; data->state = 3; break; case 3: if ((GetPartyMenuType() == PARTY_MENU_TYPE_UNION_ROOM_REGISTER - || GetPartyMenuType() == PARTY_MENU_TYPE_UNION_ROOM_TRADE) + || GetPartyMenuType() == PARTY_MENU_TYPE_UNION_ROOM_TRADE) && sUnionRoomTrade.field_0 != 0) { id = GetCursorSelectionMonId(); switch (sUnionRoomTrade.field_0) { case 1: - sub_8011090(0x54, 0, 1); + UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE); if (id >= PARTY_SIZE) { ResetUnionRoomTrade(&sUnionRoomTrade); sub_8010FCC(0, 0, 0); - sub_801568C(sText_RegistrationCanceled); + ScheduleFieldMessageAndExit(sText_RegistrationCanceled); } else if (!RegisterTradeMonAndGetIsEgg(GetCursorSelectionMonId(), &sUnionRoomTrade)) { - sub_8015664(0x34, sText_ChooseRequestedMonType); + ScheduleFieldMessageWithFollowupState(52, sText_ChooseRequestedMonType); } else { @@ -2335,12 +2379,12 @@ void sub_80156E0(u8 taskId) taskData[1] = sUnionRoomTrade.field_8; if (id >= PARTY_SIZE) { - sub_801568C(sText_TradeCanceled); + ScheduleFieldMessageAndExit(sText_TradeCanceled); } else { - sub_8011090(0x54, 0, 1); - gUnknown_02022C2C = 0x44; + UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE); + gPlayerCurrActivity = ACTIVITY_TRADE | IN_UNION_ROOM; RegisterTradeMon(GetCursorSelectionMonId(), &sUnionRoomTrade); data->state = 51; } @@ -2358,7 +2402,7 @@ void sub_80156E0(u8 taskId) { if (gSpecialVar_Result == 9) { - sub_8011090(0x54, 0, 1); + UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, 1); PlaySE(SE_PC_LOGIN); StringCopy(gStringVar1, gSaveBlock2Ptr->playerName); data->state = 42; @@ -2366,7 +2410,7 @@ void sub_80156E0(u8 taskId) } else if (gSpecialVar_Result == 11) { - sub_8011090(0x54, 0, 1); + UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, 1); data->state = 23; gSpecialVar_Result = 0; } @@ -2382,146 +2426,146 @@ void sub_80156E0(u8 taskId) { if (gMain.newKeys & A_BUTTON) { - if (sub_801A2A8(data->field_0, &taskData[0], &taskData[1], data->spriteIds)) + if (RfuUnionTool_GetGroupAndMemberInFrontOfPlayer(data->field_0, &taskData[0], &taskData[1], data->spriteIds)) { PlaySE(SE_SELECT); - sub_80181CC(); + UR_EnableScriptContext2AndFreezeObjectEvents(); data->state = 24; break; } - else if (sub_8017940()) + else if (PlayerIsTalkingToUnionRoomAide()) { - sub_8011090(0x54, 0, 1); + UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, 1); PlaySE(SE_PC_LOGIN); - sub_80181CC(); + UR_EnableScriptContext2AndFreezeObjectEvents(); StringCopy(gStringVar1, gSaveBlock2Ptr->playerName); data->state = 45; break; } } - switch (sub_8016B00()) + switch (HandlePlayerListUpdate()) { case 1: PlaySE(SE_PC_LOGIN); case 2: - sub_801A274(data); + ScheduleUnionRoomPlayerRefresh(data); break; case 4: data->state = 11; - sub_80181CC(); + UR_EnableScriptContext2AndFreezeObjectEvents(); sub_8010FCC(0, 0, 0); - sub_8011090(0x53, sub_80181DC(data), 0); + UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_NPCTALK | IN_UNION_ROOM, GetActivePartnerSpriteGenderParam(data), 0); break; } - sub_801A284(data); + HandleUnionRoomPlayerRefresh(data); } break; case 23: if (!FuncIsActiveTask(Task_ShowStartMenu)) { - sub_8011090(0x40, 0, 0); + UpdateGameDataWithActivitySpriteGendersFlag(IN_UNION_ROOM, 0, FALSE); data->state = 4; } 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)) + UR_RunTextPrinters_CheckPrinter0Active(); + playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0); + UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, 1); + switch (UnionRoomGetPlayerInteractionResponse(data->field_0, taskData[0], taskData[1], playerGender)) { case 0: data->state = 26; break; case 1: - sub_8012188(data->field_0->arr[taskData[1]].unk.playerName, &data->field_0->arr[taskData[1]].unk.field_0, gUnknown_02022C2C); + sub_8012188(data->field_0->arr[taskData[1]].gname_uname.playerName, &data->field_0->arr[taskData[1]].gname_uname.gname, gPlayerCurrActivity); data->field_12 = id; // Should be just 0, but won't match any other way. data->state = 25; break; case 2: - sub_8015664(0x13, gStringVar4); + ScheduleFieldMessageWithFollowupState(19, gStringVar4); break; } break; case 25: - sub_801704C(); - switch (sub_8011A74()) + UR_RunTextPrinters_CheckPrinter0Active(); + switch (RfuGetErrorStatus()) { case 4: - sub_801818C(TRUE); + HandleCancelTrade(TRUE); data->state = 4; break; case 1: case 2: - if (sub_8011B90() == TRUE) - sub_801568C(sText_TrainerAppearsBusy); + if (IsUnionRoomListenTaskActive() == TRUE) + ScheduleFieldMessageAndExit(sText_TrainerAppearsBusy); else - sub_8015664(30, sText_TrainerAppearsBusy); + ScheduleFieldMessageWithFollowupState(30, sText_TrainerAppearsBusy); - gUnknown_02022C2C = 0x40; + gPlayerCurrActivity = IN_UNION_ROOM; break; } - if (gReceivedRemoteLinkPlayers != 0) + if (gReceivedRemoteLinkPlayers) { - sub_80143E4(gBlockSendBuffer, TRUE); - CreateTask(sub_80140E0, 5); + CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE); + CreateTask(Task_ExchangeCards, 5); data->state = 38; } break; case 38: - if (!FuncIsActiveTask(sub_80140E0)) + if (!FuncIsActiveTask(Task_ExchangeCards)) { - if (gUnknown_02022C2C == 0x44) - sub_8015664(31, sText_AwaitingPlayersResponseAboutTrade); + if (gPlayerCurrActivity == (ACTIVITY_TRADE | IN_UNION_ROOM)) + ScheduleFieldMessageWithFollowupState(31, sText_AwaitingPlayersResponseAboutTrade); else data->state = 5; } break; case 30: - if (gReceivedRemoteLinkPlayers == 0) + if (!gReceivedRemoteLinkPlayers) { - sub_801818C(FALSE); - sub_801A3D0(taskData[0], taskData[1], data->field_0); + HandleCancelTrade(FALSE); + UpdateUnionGroupMemberFacing(taskData[0], taskData[1], data->field_0); data->state = 2; } 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]); + id = ConvPartnerUnameAndGetWhetherMetAlready(&data->field_0->arr[taskData[1]]); + playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0); + ScheduleFieldMessageWithFollowupState(6, sHiDoSomethingTexts[id][playerGender]); break; case 6: - var5 = sub_8017178(&data->textState, &data->field_1B, &data->field_1C, &gUnknown_082F021C, &gUnknown_082F0244); + var5 = ListMenuHandler_AllItemsAvailable(&data->textState, &data->topListMenuWindowId, &data->topListMenuId, &sWindowTemplate_InviteToActivity, &sListMenuTemplate_InviteToActivity); if (var5 != -1) { - if (gReceivedRemoteLinkPlayers == 0) + if (!gReceivedRemoteLinkPlayers) { data->state = 28; } else { - data->field_98 = 0; - playerGender = sub_8017CF8(taskData[1], data->field_0); - if (var5 == -2 || var5 == 0x40) + data->partnerYesNoResponse = 0; + playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0); + if (var5 == -2 || var5 == IN_UNION_ROOM) { - data->field_4C[0] = 0x40; - sub_800FE50(data->field_4C); + data->playerSendBuffer[0] = IN_UNION_ROOM; + sub_800FE50(data->playerSendBuffer); StringCopy(gStringVar4, sIfYouWantToDoSomethingTexts[gLinkPlayers[0].gender]); data->state = 32; } else { - gUnknown_02022C2C = var5; - gUnknown_02022C2D = (u32)(var5) >> 8; - if (gUnknown_02022C2C == 0x41 && !HasAtLeastTwoMonsOfLevel30OrLower()) + gPlayerCurrActivity = var5; + sPlayerActivityGroupSize = (u32)(var5) >> 8; + if (gPlayerCurrActivity == (ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM) && !HasAtLeastTwoMonsOfLevel30OrLower()) { - sub_8015664(5, sText_NeedTwoMonsOfLevel30OrLower1); + ScheduleFieldMessageWithFollowupState(5, sText_NeedTwoMonsOfLevel30OrLower1); } else { - data->field_4C[0] = gUnknown_02022C2C | 0x40; - sub_800FE50(data->field_4C); + data->playerSendBuffer[0] = gPlayerCurrActivity | 0x40; + sub_800FE50(data->playerSendBuffer); data->state = 27; } } @@ -2533,9 +2577,9 @@ void sub_80156E0(u8 taskId) data->state = 36; break; case 27: - sub_8017FD8(data); - playerGender = sub_8017CF8(taskData[1], data->field_0); - id = sub_8017984(data->field_4C[0] & 0x3F); + PollPartnerYesNoResponse(data); + playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0); + id = GetResponseIdx_InviteToURoomActivity(data->playerSendBuffer[0] & 0x3F); if (PrintOnTextbox(&data->textState, sText_WaitOrShowCardTexts[playerGender][id])) { taskData[3] = 0; @@ -2547,26 +2591,26 @@ void sub_80156E0(u8 taskId) data->state = 36; 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->playerSendBuffer[0] = ACTIVITY_TRADE | IN_UNION_ROOM; + data->playerSendBuffer[1] = sUnionRoomTrade.species; + data->playerSendBuffer[2] = sUnionRoomTrade.level; + sub_800FE50(data->playerSendBuffer); data->state = 29; break; case 29: - if (gReceivedRemoteLinkPlayers == 0) + if (!gReceivedRemoteLinkPlayers) { StringCopy(gStringVar4, sText_TrainerBattleBusy); data->state = 28; } else { - sub_8017FD8(data); - if (data->field_98 == 0x51) + PollPartnerYesNoResponse(data); + if (data->partnerYesNoResponse == (ACTIVITY_ACCEPT | IN_UNION_ROOM)) { - if (gUnknown_02022C2C == 8) + if (gPlayerCurrActivity == ACTIVITY_CARD) { - sub_8018220(gStringVar4, data, FALSE); + ViewURoomPartnerTrainerCard(gStringVar4, data, FALSE); data->state = 40; } else @@ -2574,27 +2618,27 @@ void sub_80156E0(u8 taskId) data->state = 13; } } - else if (data->field_98 == 0x52) + else if (data->partnerYesNoResponse == (ACTIVITY_DECLINE | IN_UNION_ROOM)) { data->state = 32; - sub_8017D9C(gStringVar4, gUnknown_02022C2C | 0x40, gLinkPlayers[0].gender); - gUnknown_02022C2C = 0; + 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]); + id = ConvPartnerUnameAndGetWhetherMetAlready(&data->field_0->arr[taskData[1]]); + playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0); + ScheduleFieldMessageWithFollowupState(6, sHiDoSomethingTexts[id][playerGender]); break; case 40: if (PrintOnTextbox(&data->textState, gStringVar4)) { data->state = 41; sub_800ADF8(); - data->field_98 = 0; - data->field_9A[0] = 0; + data->partnerYesNoResponse = 0; + data->recvActivityRequest[0] = 0; } break; case 41: @@ -2603,7 +2647,7 @@ void sub_80156E0(u8 taskId) 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; } @@ -2614,21 +2658,21 @@ void sub_80156E0(u8 taskId) } break; case 19: - switch (sub_80170B8(&data->textState, FALSE)) + switch (UnionRoomHandleYesNo(&data->textState, FALSE)) { case 0: 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); + gPlayerCurrActivity = ACTIVITY_CHAT | IN_UNION_ROOM; + UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_CHAT | IN_UNION_ROOM, 0, 1); + sub_8012188(data->field_0->arr[taskData[1]].gname_uname.playerName, &data->field_0->arr[taskData[1]].gname_uname.gname, gPlayerCurrActivity); data->field_12 = taskData[1]; data->state = 20; taskData[3] = 0; break; case 1: case -1: - playerGender = sub_8017CF8(taskData[1], data->field_0); - sub_801568C(sDeclineBattleTexts[playerGender]); + playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0); + ScheduleFieldMessageAndExit(sDeclineBattleTexts[playerGender]); break; } break; @@ -2640,20 +2684,20 @@ void sub_80156E0(u8 taskId) } break; case 21: - switch (sub_8011A74()) + switch (RfuGetErrorStatus()) { case 4: - sub_801818C(TRUE); + HandleCancelTrade(TRUE); data->state = 4; 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]); + playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0); + UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, 1); + if (IsUnionRoomListenTaskActive() == TRUE) + ScheduleFieldMessageAndExit(sChatDeclinedTexts[playerGender]); else - sub_8015664(30, sChatDeclinedTexts[playerGender]); + ScheduleFieldMessageWithFollowupState(30, sChatDeclinedTexts[playerGender]); break; case 3: data->state = 22; @@ -2662,55 +2706,55 @@ void sub_80156E0(u8 taskId) taskData[3]++; break; case 22: - if (sub_8011A80()) + if (RfuIsErrorStatus1or2()) { - 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], data->field_0); + UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, 1); + if (IsUnionRoomListenTaskActive() == TRUE) + ScheduleFieldMessageAndExit(sChatDeclinedTexts[playerGender]); else - sub_8015664(30, sChatDeclinedTexts[playerGender]); + ScheduleFieldMessageWithFollowupState(30, sChatDeclinedTexts[playerGender]); } - if (gReceivedRemoteLinkPlayers != 0) + if (gReceivedRemoteLinkPlayers) data->state = 16; break; case 11: PlaySE(SE_PINPON); sub_800EF7C(); data->state = 12; - data->field_9A[0] = 0; + data->recvActivityRequest[0] = 0; break; case 12: - if (sub_8011A80()) + if (RfuIsErrorStatus1or2()) { - sub_801818C(FALSE); + HandleCancelTrade(FALSE); data->state = 2; } - else if (gReceivedRemoteLinkPlayers != 0) + else if (gReceivedRemoteLinkPlayers) { - sub_80143E4(gBlockSendBuffer, TRUE); - CreateTask(sub_80140E0, 5); + CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE); + CreateTask(Task_ExchangeCards, 5); data->state = 39; } break; case 39: - sub_801689C(data); - if (!FuncIsActiveTask(sub_80140E0)) + ReceiveUnionRoomActivityPacket(data); + if (!FuncIsActiveTask(Task_ExchangeCards)) { data->state = 33; 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); + ReceiveUnionRoomActivityPacket(data); if (PrintOnTextbox(&data->textState, gStringVar4)) data->state = 34; break; case 34: - sub_801689C(data); - if (sub_80168DC(data) && gMain.newKeys & B_BUTTON) + ReceiveUnionRoomActivityPacket(data); + if (UnionRoom_HandleContactFromOtherPlayer(data) && gMain.newKeys & B_BUTTON) { sub_8011DE0(1); StringCopy(gStringVar4, sText_ChatEnded); @@ -2718,53 +2762,53 @@ void sub_80156E0(u8 taskId) } break; case 35: - sub_8015664(9, gStringVar4); + ScheduleFieldMessageWithFollowupState(9, gStringVar4); break; case 9: - switch (sub_80170B8(&data->textState, FALSE)) + switch (UnionRoomHandleYesNo(&data->textState, FALSE)) { case 0: - data->field_4C[0] = 0x51; - if (gUnknown_02022C2C == 0x45) - sub_8011090(gUnknown_02022C2C | 0x40, sub_801100C(1), 0); + data->playerSendBuffer[0] = ACTIVITY_ACCEPT | IN_UNION_ROOM; + if (gPlayerCurrActivity == (ACTIVITY_CHAT | IN_UNION_ROOM)) + UpdateGameDataWithActivitySpriteGendersFlag(gPlayerCurrActivity | 0x40, sub_801100C(1), 0); else - sub_8011090(gUnknown_02022C2C | 0x40, sub_801100C(1), 1); + UpdateGameDataWithActivitySpriteGendersFlag(gPlayerCurrActivity | 0x40, sub_801100C(1), 1); data->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->playerSendBuffer[0] = ACTIVITY_DECLINE | IN_UNION_ROOM; + sub_800FE50(data->playerSendBuffer); data->state = 10; StringCopy(gStringVar4, sText_NeedTwoMonsOfLevel30OrLower2); } else { - sub_800FE50(data->field_4C); + sub_800FE50(data->playerSendBuffer); data->state = 13; } } - else if (gUnknown_02022C2C == 0x48) + else if (gPlayerCurrActivity == (ACTIVITY_CARD | IN_UNION_ROOM)) { - sub_800FE50(data->field_4C); - sub_8018220(gStringVar4, data, 1); + sub_800FE50(data->playerSendBuffer); + ViewURoomPartnerTrainerCard(gStringVar4, data, TRUE); data->state = 40; } else { - sub_800FE50(data->field_4C); + sub_800FE50(data->playerSendBuffer); data->state = 13; } break; case 1: case -1: - data->field_4C[0] = 0x52; - sub_800FE50(data->field_4C); + data->playerSendBuffer[0] = ACTIVITY_DECLINE | IN_UNION_ROOM; + sub_800FE50(data->playerSendBuffer); data->state = 10; - sub_8013078(gStringVar4, gUnknown_02022C2C); + GetYouDeclinedTheOfferMessage(gStringVar4, gPlayerCurrActivity); break; } break; @@ -2773,22 +2817,22 @@ void sub_80156E0(u8 taskId) data->state = 36; break; case 36: - if (gReceivedRemoteLinkPlayers == 0) + 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(37, gStringVar4); + memset(data->playerSendBuffer, 0, sizeof(data->playerSendBuffer)); + data->recvActivityRequest[0] = 0; + data->partnerYesNoResponse = 0; } break; case 37: data->state = 2; - sub_801818C(FALSE); + HandleCancelTrade(FALSE); break; case 13: - sub_8017E00(gStringVar4, gUnknown_02022C2C | 0x40); - sub_8015664(14, gStringVar4); + GetURoomActivityStartMsg(gStringVar4, gPlayerCurrActivity | IN_UNION_ROOM); + ScheduleFieldMessageWithFollowupState(14, gStringVar4); break; case 14: sub_800ADF8(); @@ -2804,7 +2848,7 @@ void sub_80156E0(u8 taskId) Free(data->field_C); Free(data->field_4); DestroyTask(data->field_20); - sub_8019F04(data->spriteIds); + DestroyGroupMemberObjects(data->spriteIds); data->state = 17; break; case 17: @@ -2816,28 +2860,28 @@ void sub_80156E0(u8 taskId) { sub_8019E3C(); DestroyTask(taskId); - Free(gUnknown_02022C30.uRoom); - sub_80149D8(); + Free(sWirelessLinkMain.uRoom); + CreateTask_StartActivity(); } break; case 42: - if (sub_800F7DC()->species == SPECIES_NONE) + if (GetHostRFUtgtGname()->species == SPECIES_NONE) { data->state = 43; } 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(44, gStringVar4); } break; case 43: @@ -2845,23 +2889,23 @@ void sub_80156E0(u8 taskId) data->state = 47; break; case 47: - var5 = sub_8017178(&data->textState, &data->field_1D, &data->field_1E, &gUnknown_082F025C, &gUnknown_082F027C); + var5 = ListMenuHandler_AllItemsAvailable(&data->textState, &data->tradeBoardSelectWindowId, &data->tradeBoardDetailsWindowId, &gUnknown_082F025C, &gUnknown_082F027C); if (var5 != -1) { if (var5 == -2 || var5 == 3) { data->state = 4; - sub_801818C(TRUE); + HandleCancelTrade(TRUE); } else { switch (var5) { case 1: // REGISTER - sub_8015664(53, sText_WhichMonWillYouOffer); + ScheduleFieldMessageWithFollowupState(53, sText_WhichMonWillYouOffer); break; case 2: // INFO - sub_8015664(47, sText_TradingBoardInfo); + ScheduleFieldMessageWithFollowupState(47, sText_TradingBoardInfo); break; } } @@ -2880,7 +2924,7 @@ void sub_80156E0(u8 taskId) } break; case 52: - var5 = sub_8017178(&data->textState, &data->field_1D, &data->field_1E, &gUnknown_082F0294, &sMenuTemplate_TradingBoardRequestType); + var5 = ListMenuHandler_AllItemsAvailable(&data->textState, &data->tradeBoardSelectWindowId, &data->tradeBoardDetailsWindowId, &gUnknown_082F0294, &sMenuTemplate_TradingBoardRequestType); if (var5 != -1) { switch (var5) @@ -2889,7 +2933,7 @@ void sub_80156E0(u8 taskId) case 18: ResetUnionRoomTrade(&sUnionRoomTrade); sub_8010FCC(0, 0, 0); - sub_801568C(sText_RegistrationCanceled); + ScheduleFieldMessageAndExit(sText_RegistrationCanceled); break; default: sUnionRoomTrade.type = var5; @@ -2900,17 +2944,17 @@ void sub_80156E0(u8 taskId) break; case 55: sub_8010FCC(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel); - sub_801568C(sText_RegistraionCompleted); + ScheduleFieldMessageAndExit(sText_RegistraionCompleted); break; case 44: - switch (sub_80170B8(&data->textState, FALSE)) + switch (UnionRoomHandleYesNo(&data->textState, FALSE)) { case 0: data->state = 56; break; case 1: case -1: - sub_801818C(TRUE); + HandleCancelTrade(TRUE); data->state = 4; break; } @@ -2920,7 +2964,7 @@ void sub_80156E0(u8 taskId) { sub_8010FCC(0, 0, 0); ResetUnionRoomTrade(&sUnionRoomTrade); - sub_801818C(TRUE); + HandleCancelTrade(TRUE); data->state = 4; } break; @@ -2929,38 +2973,38 @@ void sub_80156E0(u8 taskId) data->state = 46; break; case 46: - sub_80173B0(); + UR_ClearBg0(); data->state = 48; break; case 48: - var5 = sub_80172A0(&data->textState, &data->field_1D, &data->field_4A, &data->field_1E, &gUnknown_082F034C, &gUnknown_082F03A4, data->field_0); + var5 = TradeBoardMenuHandler(&data->textState, &data->tradeBoardSelectWindowId, &data->field_4A, &data->tradeBoardDetailsWindowId, &gUnknown_082F034C, &sTradeBoardListMenuTemplate, data->field_0); if (var5 != -1) { switch (var5) { case -2: case 8: - sub_801818C(TRUE); + HandleCancelTrade(TRUE); data->state = 4; 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(data->field_0->arr[var5].gname_uname.gname.type, data->field_0->arr[var5].gname_uname.gname.species)) { - case 0: - sub_8018404(gStringVar1, &data->field_0->arr[var5]); - sub_8015664(49, sText_AskTrainerToMakeTrade); + case UR_TRADE_MATCH: + IntlConvPartnerUname7(gStringVar1, &data->field_0->arr[var5]); + ScheduleFieldMessageWithFollowupState(49, sText_AskTrainerToMakeTrade); taskData[1] = var5; 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, &data->field_0->arr[var5]); + StringCopy(gStringVar2, gTypeNames[data->field_0->arr[var5].gname_uname.gname.type]); + ScheduleFieldMessageWithFollowupState(46, 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, &data->field_0->arr[var5]); + StringCopy(gStringVar2, gTypeNames[data->field_0->arr[var5].gname_uname.gname.type]); + ScheduleFieldMessageWithFollowupState(46, sText_DontHaveEggTrainerWants); break; } break; @@ -2968,14 +3012,14 @@ void sub_80156E0(u8 taskId) } break; case 49: - switch (sub_80170B8(&data->textState, FALSE)) + switch (UnionRoomHandleYesNo(&data->textState, FALSE)) { case 0: data->state = 50; break; case -1: case 1: - sub_801818C(TRUE); + HandleCancelTrade(TRUE); data->state = 4; break; } @@ -2984,9 +3028,9 @@ void sub_80156E0(u8 taskId) if (PrintOnTextbox(&data->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; + memcpy(&gPartnerTgtGnameSub, &data->field_0->arr[taskData[1]].gname_uname.gname.unk_00, sizeof(gPartnerTgtGnameSub)); + gUnionRoomRequestedMonType = data->field_0->arr[taskData[1]].gname_uname.gname.type; + gUnionRoomOfferedSpecies = data->field_0->arr[taskData[1]].gname_uname.gname.species; gFieldCallback = FieldCB_ContinueScriptUnionRoom; ChooseMonForTradingBoard(PARTY_MENU_TYPE_UNION_ROOM_TRADE, CB2_ReturnToField); sub_80156B0(data); @@ -2994,17 +3038,17 @@ void sub_80156E0(u8 taskId) } 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]); + gPlayerCurrActivity = ACTIVITY_TRADE | IN_UNION_ROOM; + sub_8012188(data->field_0->arr[taskData[1]].gname_uname.playerName, &data->field_0->arr[taskData[1]].gname_uname.gname, 0x44); + IntlConvPartnerUname7(gStringVar1, &data->field_0->arr[taskData[1]]); + UR_PrintFieldMessage(sCommunicatingWaitTexts[2]); data->state = 25; break; case 26: if (PrintOnTextbox(&data->textState, gStringVar4)) { - sub_801818C(TRUE); - sub_801A3D0(taskData[0], taskData[1], data->field_0); + HandleCancelTrade(TRUE); + UpdateUnionGroupMemberFacing(taskData[0], taskData[1], data->field_0); data->state = 4; } break; @@ -3021,37 +3065,37 @@ void var_800D_set_xB(void) gSpecialVar_Result = 11; } -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 *data) { - if (arg0->field_9A[0] != 0) + if (data->recvActivityRequest[0] != 0) { - s32 var = sub_8017EA0(gStringVar4, gLinkPlayers[1].gender, &arg0->field_9A[0], arg0); + s32 var = GetChatLeaderActionRequestMessage(gStringVar4, gLinkPlayers[1].gender, &data->recvActivityRequest[0], data); if (var == 0) { return TRUE; } else if (var == 1) { - arg0->state = 35; - gUnknown_02022C2C = arg0->field_9A[0]; + data->state = 35; + gPlayerCurrActivity = data->recvActivityRequest[0]; return FALSE; } else if (var == 2) { - arg0->state = 36; + data->state = 36; sub_800AC34(); return FALSE; } @@ -3062,53 +3106,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->field_10 = 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->field_20 = 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 +3160,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 +3177,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->field_20); + free(sWirelessLinkMain.uRoom); + LinkRfu_Shutdown(); DestroyTask(taskId); break; } @@ -3159,158 +3203,158 @@ 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].field_18 = 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++) { - 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 = 0x40; 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].field_18 = 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].field_18++; + if (data->field_0->arr[j].field_18 >= 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].field_18++; + if (data->field_0->arr[j].field_18 >= 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], 8) != 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 GetGnameWonderFlagByLinkGroup(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; } @@ -3319,9 +3363,9 @@ bool32 sub_8016F1C(struct GFtgtGname *arg0, s16 arg1) 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; } @@ -3336,40 +3380,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]); + GetGnameWonderFlagByLinkGroup(&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 +3422,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,31 +3452,31 @@ 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; - 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) { - *arg0 = 0; + *state = 0; return r1; } break; @@ -3444,64 +3484,64 @@ s8 sub_80170B8(u8 *arg0, bool32 arg1) 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); + input = ListMenu_ProcessInput(*listMenuId); if (({gMain.newKeys & 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;})) { - 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 +3550,49 @@ 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(&gUnknown_082F0344); + *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); + input = ListMenu_ProcessInput(*listMenuId); if (({gMain.newKeys & (A_BUTTON | B_BUTTON);})) { if (input == 8 || ({gMain.newKeys & 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 +3605,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].field_18 = 0xFF; + arr[i].groupScheduledAnim = UNION_ROOM_SPAWN_NONE; + arr[i].field_1A_1 = 0; + 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 +3735,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 +3770,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 arg2) { s32 i; - if (arg1->unk18) + if (arg1->active) { for (i = 0; i < arg2; i++) { - if (arg0[i].field_1A_0 == 0) + if (arg0[i].groupScheduledAnim == UNION_ROOM_SPAWN_NONE) { - arg0[i].unk = arg1->unk0; + arg0[i].gname_uname = arg1->gname_uname; arg0[i].field_18 = 0; - arg0[i].field_1A_0 = 1; + arg0[i].groupScheduledAnim = UNION_ROOM_SPAWN_IN; arg0[i].field_1B = 64; - arg1->unk18 = FALSE; + arg1->active = FALSE; return i; } } @@ -3769,126 +3810,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 PlayerIsTalkingToUnionRoomAide(void) { s16 x, y; GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + if (x != 9) - { return FALSE; - } + if (y != 8) - { return FALSE; - } + if (gPlayerAvatar.tileTransitionState == 2 || gPlayerAvatar.tileTransitionState == 0) - { 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,40 +3941,40 @@ 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 @@ -3944,32 +3982,32 @@ void sub_8017BE8(u8 windowId, s32 itemId, u8 y) j = 0; for (i = 0; i < 8; 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 +4016,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 +4032,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 +4044,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 +4124,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 IN_UNION_ROOM: StringExpandPlaceholders(dst, sText_ChatDropped); result = 2; break; @@ -4107,18 +4145,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 +4170,7 @@ bool32 InUnionRoom(void) ? TRUE : FALSE; } -bool32 HasAtLeastTwoMonsOfLevel30OrLower(void) +static bool32 HasAtLeastTwoMonsOfLevel30OrLower(void) { s32 i; s32 count = 0; @@ -4152,16 +4190,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->field_0 = 0; + 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 +4266,36 @@ static u32 GetPartyPositionOfRegisteredMon(struct UnionRoomTrade *trade, u8 mult return response; } -void sub_801818C(bool32 arg0) +static void HandleCancelTrade(bool32 unlockObjs) { - sub_80173B0(); + UR_ClearBg0(); ScriptContext2_Disable(); - sub_8098524(); - gUnknown_02022C2C = 0; - if (arg0) + UnionRoom_UnlockPlayerAndChatPartner(); + gPlayerCurrActivity = 0; + if (unlockObjs) { sub_8010FCC(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel); - sub_8011090(0x40, 0, 0); + UpdateGameDataWithActivitySpriteGendersFlag(IN_UNION_ROOM, 0, 0); } } -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 +4303,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 +4311,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->field_C0[0], gTrainerClassNames[sub_8068BB0()]); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, data->field_C0[0]); DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, trainerCard->playerName); - StringCopy(arg1->field_174, sCardColorTexts[trainerCard->stars]); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, arg1->field_174); + StringCopy(data->field_174, sCardColorTexts[trainerCard->stars]); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, data->field_174); - ConvertIntToDecimalStringN(arg1->field_C0[2], trainerCard->caughtMonsCount, STR_CONV_MODE_LEFT_ALIGN, 3); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, arg1->field_C0[2]); + ConvertIntToDecimalStringN(data->field_C0[2], trainerCard->caughtMonsCount, STR_CONV_MODE_LEFT_ALIGN, 3); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, data->field_C0[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->field_C0[3], trainerCard->playTimeHours, STR_CONV_MODE_LEFT_ALIGN, 3); + ConvertIntToDecimalStringN(data->field_C0[4], trainerCard->playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, data->field_C0[3]); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(5, data->field_C0[4]); - DynamicPlaceholderTextUtil_ExpandPlaceholders(arg1->field_1A4, sText_TrainerCardInfoPage1); - StringCopy(gStringVar4, arg1->field_1A4); + DynamicPlaceholderTextUtil_ExpandPlaceholders(data->field_1A4, sText_TrainerCardInfoPage1); + StringCopy(gStringVar4, data->field_1A4); 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->field_C0[0], n, STR_CONV_MODE_LEFT_ALIGN, 4); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, data->field_C0[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->field_C0[1], n, STR_CONV_MODE_LEFT_ALIGN, 4); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, data->field_C0[1]); - ConvertIntToDecimalStringN(arg1->field_C0[2], trainerCard->pokemonTrades, STR_CONV_MODE_LEFT_ALIGN, 5); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, arg1->field_C0[2]); + ConvertIntToDecimalStringN(data->field_C0[2], trainerCard->pokemonTrades, STR_CONV_MODE_LEFT_ALIGN, 5); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, data->field_C0[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->field_C0[i + 3], trainerCard->easyChatProfile[i]); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(i + 4, data->field_C0[i + 3]); } - DynamicPlaceholderTextUtil_ExpandPlaceholders(arg1->field_1A4, sText_TrainerCardInfoPage2); - StringAppend(gStringVar4, arg1->field_1A4); + DynamicPlaceholderTextUtil_ExpandPlaceholders(data->field_1A4, sText_TrainerCardInfoPage2); + StringAppend(gStringVar4, data->field_1A4); - if (arg2 == TRUE) + if (isParent == TRUE) { - DynamicPlaceholderTextUtil_ExpandPlaceholders(arg1->field_1A4, sText_FinishedCheckingPlayersTrainerCard); - StringAppend(gStringVar4, arg1->field_1A4); + DynamicPlaceholderTextUtil_ExpandPlaceholders(data->field_1A4, sText_FinishedCheckingPlayersTrainerCard); + StringAppend(gStringVar4, data->field_1A4); } - else if (arg2 == FALSE) + else if (isParent == FALSE) { - DynamicPlaceholderTextUtil_ExpandPlaceholders(arg1->field_1A4, sGladToMeetYouTexts[trainerCard->gender]); - StringAppend(gStringVar4, arg1->field_1A4); + DynamicPlaceholderTextUtil_ExpandPlaceholders(data->field_1A4, sGladToMeetYouTexts[trainerCard->gender]); + StringAppend(gStringVar4, data->field_1A4); } } -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 18dd7c320..e73f9bd24 100644 --- a/src/union_room_battle.c +++ b/src/union_room_battle.c @@ -35,14 +35,14 @@ struct UnkStruct_3000DAC /*0x62*/ u8 filler_62[10]; }; -struct UnkStruct_2022C6C +struct UnionRoomBattleWork { - s16 a0; + s16 textState; }; static struct UnkStruct_3000DAC * gUnknown_03000DAC; -EWRAM_DATA struct UnkStruct_2022C6C * gUnknown_02022C6C = NULL; +EWRAM_DATA struct UnionRoomBattleWork * sWork = NULL; void sub_801A43C(void); void sub_801A6C0(u8 taskId); @@ -53,7 +53,7 @@ const u16 gWirelessInfoScreenPal[] = INCBIN_U16("graphics/interface/wireless_inf 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[] = { +static const struct BgTemplate sBgTemplates[] = { { .bg = 0, .charBaseIndex = 2, @@ -67,7 +67,7 @@ const struct BgTemplate gUnknown_082F0D34[] = { } }; -const struct WindowTemplate gUnknown_082F0D3C[] = { +const struct WindowTemplate sWindowTemplates[] = { { .bg = 0x00, .tilemapLeft = 0x03, @@ -191,12 +191,12 @@ void sub_801A43C(void) gUnknown_03000DAC = AllocZeroed(sizeof(struct UnkStruct_3000DAC)); SetVBlankCallback(NULL); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, gUnknown_082F0D34, ARRAY_COUNT(gUnknown_082F0D34)); + InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); SetBgTilemapBuffer(1, Alloc(0x800)); SetBgTilemapBuffer(0, Alloc(0x800)); DecompressAndLoadBgGfxUsingHeap(1, gWirelessInfoScreenGfx, 0, 0, 0); CopyToBgTilemapBuffer(1, gWirelessInfoScreenTilemap, 0, 0); - InitWindows(gUnknown_082F0D3C); + InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); ResetPaletteFade(); ResetSpriteData(); @@ -205,7 +205,7 @@ void sub_801A43C(void) m4aSoundVSyncOn(); SetVBlankCallback(sub_801A418); gUnknown_03000DAC->taskId = CreateTask(sub_801A6C0, 0); - gUnknown_03000DAC->unk61 = sub_8013C40(); + gUnknown_03000DAC->unk61 = CreateTask_ListenToWireless(); gUnknown_03000DAC->unk10[3] = 1; ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); @@ -369,7 +369,7 @@ static void sub_801A8B0(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 m u32 sub_801A960(struct UnkStruct_x20 * a0, u32 * a1) { s32 i, j, r2; - u32 result = a0->unk.field_0.activity; + u32 result = a0->gname_uname.gname.activity; for (i = 0; i < (unsigned)ARRAY_COUNT(gUnknown_082F0D70); i++) { @@ -377,7 +377,7 @@ u32 sub_801A960(struct UnkStruct_x20 * a0, u32 * a1) { continue; } - if (a0->field_1A_0 != 1) + if (a0->groupScheduledAnim != 1) { continue; } @@ -386,7 +386,7 @@ u32 sub_801A960(struct UnkStruct_x20 * a0, u32 * a1) r2 = 0; for (j = 0; j < 4; j++) { - if (a0->unk.field_0.child_sprite_gender[j] != 0) + if (a0->gname_uname.gname.child_sprite_gender[j] != 0) { r2++; } @@ -450,7 +450,7 @@ bool32 sub_801AA30(u32 * a0, u32 * a1, u32 * a2, u8 taskId) void sub_801AAD4(void) { s32 i; - sub_8014210(10); + StartUnionRoomBattle(10); for (i = 0; i < UNION_ROOM_PARTY_SIZE; i++) { gEnemyParty[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1]; @@ -506,13 +506,13 @@ void sub_801AC40(void) TransferPlttBuffer(); } -void sub_801AC54(void) +void CB2_UnionRoomBattle(void) { switch (gMain.state) { case 0: SetGpuReg(REG_OFFSET_DISPCNT, 0x0000); - gUnknown_02022C6C = AllocZeroed(4); + sWork = AllocZeroed(4); ResetSpriteData(); FreeAllSpritePalettes(); ResetTasks(); @@ -535,7 +535,7 @@ void sub_801AC54(void) gMain.state++; break; case 1: - if (sub_801ABDC(&gUnknown_02022C6C->a0, gText_CommStandbyAwaitingOtherPlayer, 0)) + if (sub_801ABDC(&sWork->textState, gText_CommStandbyAwaitingOtherPlayer, 0)) { gMain.state++; } @@ -604,7 +604,7 @@ void sub_801AC54(void) } break; case 7: - if (sub_801ABDC(&gUnknown_02022C6C->a0, gText_RefusedBattle, 1)) + if (sub_801ABDC(&sWork->textState, gText_RefusedBattle, 1)) { SetMainCallback2(CB2_ReturnToField); } @@ -616,7 +616,7 @@ void sub_801AC54(void) } break; case 9: - if (sub_801ABDC(&gUnknown_02022C6C->a0, gText_BattleWasRefused, 1)) + if (sub_801ABDC(&sWork->textState, gText_BattleWasRefused, 1)) { SetMainCallback2(CB2_ReturnToField); } diff --git a/src/union_room_chat.c b/src/union_room_chat.c index f212c69a7..e50d7f100 100755 --- a/src/union_room_chat.c +++ b/src/union_room_chat.c @@ -588,7 +588,7 @@ const struct SpriteTemplate gUnknown_082F3244 = { .callback = SpriteCallbackDummy }; -void sub_801DD98(void) +void EnterUnionRoomChat(void) { gUnknown_02022C84 = Alloc(sizeof(*gUnknown_02022C84)); sub_801DDD0(gUnknown_02022C84); diff --git a/src/union_room_player_avatar.c b/src/union_room_player_avatar.c index 8a09306c0..36f3fb653 100644 --- a/src/union_room_player_avatar.c +++ b/src/union_room_player_avatar.c @@ -17,28 +17,46 @@ 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} +static const u8 sUnionRoomObjGfxIds[GENDER_COUNT][10] = { + [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 sUnionPartnerCoords[][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[] = { @@ -79,22 +97,22 @@ static bool32 is_walking_or_running(void) static u8 sub_8019978(u32 a0, u32 a1) { - return gUnknown_082F072C[a0][a1 % 8]; + return sUnionRoomObjGfxIds[a0][a1 % 8]; } static void sub_8019990(u32 a0, u32 a1, s32 * a2, s32 * a3) { - *a2 = gUnknown_082F0740[a0][0] + gUnknown_082F0760[a1][0] + 7; - *a3 = gUnknown_082F0740[a0][1] + gUnknown_082F0760[a1][1] + 7; + *a2 = sUnionPartnerCoords[a0][0] + sFacingDirectionOffsets[a1][0] + 7; + *a3 = sUnionPartnerCoords[a0][1] + sFacingDirectionOffsets[a1][1] + 7; } static bool32 sub_80199E0(u32 a0, u32 a1, s32 a2, s32 a3) { - if (gUnknown_082F0740[a0][0] + gUnknown_082F0760[a1][0] + 7 != a2) + if (sUnionPartnerCoords[a0][0] + sFacingDirectionOffsets[a1][0] + 7 != a2) { return FALSE; } - else if (gUnknown_082F0740[a0][1] + gUnknown_082F0760[a1][1] + 7 != a3) + else if (sUnionPartnerCoords[a0][1] + sFacingDirectionOffsets[a1][1] + 7 != a3) { return FALSE; } @@ -384,19 +402,19 @@ void sub_8019E3C(void) sub_8019E20(); } -void sub_8019E70(u8 * sp8, s32 r9) +void CreateGroupMemberObjectsInvisible(u8 * sp8, s32 r9) { s32 r7; for (r7 = 0; r7 < 5; r7++) { 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); + sp8[r5] = sprite_new(OBJ_EVENT_GFX_MAN_4, r5 - 0x38, sUnionPartnerCoords[r9][0] + sFacingDirectionOffsets[r7][0], sUnionPartnerCoords[r9][1] + sFacingDirectionOffsets[r7][1], 3, 1); sub_8097C44(r5 - 0x38, TRUE); } } -void sub_8019F04(u8 * r5) +void DestroyGroupMemberObjects(u8 * r5) { s32 i; for (i = 0; i < 40; i++) @@ -526,30 +544,30 @@ static void sub_801A214(u32 r5, struct GFtgtGname * unused) } } -static void sub_801A234(struct UnkStruct_URoom *r0) +static void sub_801A234(struct WirelessLink_URoom *r0) { s32 i; struct UnkStruct_x20 * r4; gUnknown_02022C68 = 0; for (i = 0, r4 = r0->field_0->arr; i < 8; i++) { - if (r4[i].field_1A_0 == 1) + if (r4[i].groupScheduledAnim == 1) { - sub_801A16C(i, &r4[i].unk.field_0); + sub_801A16C(i, &r4[i].gname_uname.gname); } - else if (r4[i].field_1A_0 == 2) + else if (r4[i].groupScheduledAnim == 2) { - sub_801A214(i, &r4[i].unk.field_0); + sub_801A214(i, &r4[i].gname_uname.gname); } } } -void sub_801A274(struct UnkStruct_URoom *unused) +void ScheduleUnionRoomPlayerRefresh(struct WirelessLink_URoom *unused) { gUnknown_02022C68 = 300; } -void sub_801A284(struct UnkStruct_URoom *r2) +void HandleUnionRoomPlayerRefresh(struct WirelessLink_URoom *r2) { if (++gUnknown_02022C68 > 300) { @@ -557,7 +575,7 @@ void sub_801A284(struct UnkStruct_URoom *r2) } } -bool32 sub_801A2A8(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3) +bool32 RfuUnionTool_GetGroupAndMemberInFrontOfPlayer(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3) { s16 x, y; s32 i, j; @@ -572,11 +590,11 @@ bool32 sub_801A2A8(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3) for (j = 0; j < 5; j++) { s32 r3 = 5 * i + j; - if (x != gUnknown_082F0740[i][0] + gUnknown_082F0760[j][0] + 7) + if (x != sUnionPartnerCoords[i][0] + sFacingDirectionOffsets[j][0] + 7) { continue; } - if (y != gUnknown_082F0740[i][1] + gUnknown_082F0760[j][1] + 7) + if (y != sUnionPartnerCoords[i][1] + sFacingDirectionOffsets[j][1] + 7) { continue; } @@ -588,7 +606,7 @@ bool32 sub_801A2A8(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3) { continue; } - if (r4[i].field_1A_0 != 1) + if (r4[i].groupScheduledAnim != 1) { continue; } @@ -606,7 +624,7 @@ static void sub_801A3B0(s32 arg0, s32 arg1, u8 arg2) sub_8097B78(5 * arg1 - 0x38 + arg0, arg2); } -void sub_801A3D0(u32 arg0, u32 arg1, struct UnkStruct_Main0 *arg2) +void UpdateUnionGroupMemberFacing(u32 arg0, u32 arg1, struct UnkStruct_Main0 *arg2) { - return sub_801A3B0(arg0, arg1, sub_8019F64(arg0, arg1, &arg2->arr[arg1].unk.field_0)); + return sub_801A3B0(arg0, arg1, sub_8019F64(arg0, arg1, &arg2->arr[arg1].gname_uname.gname)); } -- cgit v1.2.3 From f53e2491bfe41cea6e912bef1692c2961927ef23 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Mon, 1 Jun 2020 10:23:12 -0400 Subject: Document union_room_player_avatar.c --- include/constants/union_room.h | 2 + include/event_object_movement.h | 18 +- include/fieldmap.h | 2 +- include/union_room.h | 15 +- include/union_room_player_avatar.h | 18 +- src/berry.c | 16 +- src/event_object_movement.c | 143 ++++++------ src/faraway_island.c | 2 +- src/field_effect.c | 4 +- src/field_effect_helpers.c | 38 ++-- src/fieldmap.c | 4 +- src/fldeff_misc.c | 2 +- src/scrcmd.c | 8 +- src/union_room.c | 47 ++-- src/union_room_player_avatar.c | 430 ++++++++++++++++++------------------- 15 files changed, 373 insertions(+), 376 deletions(-) diff --git a/include/constants/union_room.h b/include/constants/union_room.h index 9243ea15d..7b1d1a1be 100644 --- a/include/constants/union_room.h +++ b/include/constants/union_room.h @@ -1,6 +1,8 @@ #ifndef GUARD_CONSTANTS_UNION_ROOM_H #define GUARD_CONSTANTS_UNION_ROOM_H +#define MAX_UNION_ROOM_PLAYERS 8 + #define UNION_ROOM_SPAWN_NONE 0 #define UNION_ROOM_SPAWN_IN 1 #define UNION_ROOM_SPAWN_OUT 2 diff --git a/include/event_object_movement.h b/include/event_object_movement.h index f0caa38aa..6ccd4759e 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -81,11 +81,11 @@ void sub_808E16C(s16, s16); void OverrideSecretBaseDecorationSpriteScript(u8 localId, u8 mapNum, u8 mapGroup, u8 decorCat); void sub_8092FF0(s16, s16, s16 *, s16 *); u8 GetFaceDirectionAnimNum(u8); -void sub_80930E0(s16 *, s16 *, s16, s16); +void SetSpritePosToOffsetMapCoords(s16 *, s16 *, s16, s16); void ObjectEventClearHeldMovement(struct ObjectEvent *); void ObjectEventClearHeldMovementIfActive(struct ObjectEvent *); void TrySpawnObjectEvents(s16, s16); -u8 sprite_new(u8 graphicsId, u8 a1, s16 x, s16 y, u8 z, u8 direction); +u8 CreateObjectSprite(u8 graphicsId, u8 a1, s16 x, s16 y, u8 z, u8 direction); u8 AddPseudoObjectEvent(u16, void (*)(struct Sprite *), s16 x, s16 y, u8 subpriority); u8 TrySpawnObjectEvent(u8, u8, u8); u8 SpawnSpecialObjectEventParameterized(u8 graphicsId, u8 movementBehavior, u8 localId, s16 x, s16 y, u8 z); @@ -180,7 +180,7 @@ void CreateLevitateMovementTask(struct ObjectEvent *); void DestroyExtraMovementTask(u8); void UnfreezeObjectEvents(void); void FreezeObjectEventsExceptOne(u8 objectEventId); -void sub_8097B78(u8, u8); +void TurnObjectEventSprite(u8, u8); void sub_8098074(u8 var1, u8 var2); void FreezeObjectEvents(void); bool8 FreezeObjectEvent(struct ObjectEvent *objectEvent); @@ -194,7 +194,7 @@ void UpdateObjectEventSpriteVisibility(struct Sprite *sprite, bool8 invisible); s16 sub_809773C(s16 a1); s16 sub_8097728(s16 a1); void CameraObjectReset2(void); -u8 ObjectEventGetBerryTreeId(u8 objectEventId); +u8 GetObjectEventBerryTreeId(u8 objectEventId); void sub_8092EF0(u8 mapId, u8 mapNumber, u8 mapGroup); bool8 IsBerryTreeSparkling(u8, u8, u8); @@ -414,10 +414,10 @@ u8 MovementType_RunInPlace_Step0(struct ObjectEvent *, struct Sprite *); u8 MovementType_Invisible_Step0(struct ObjectEvent *, struct Sprite *); u8 MovementType_Invisible_Step1(struct ObjectEvent *, struct Sprite *); u8 MovementType_Invisible_Step2(struct ObjectEvent *, struct Sprite *); -void sub_8097C44(u8 var, bool32 var2); -bool32 sub_8097C8C(u8 var); -void sub_8097BB4(u8 var1, u8 graphicsId); -void sub_8097CC4(u8 var1, u8 var2); -bool32 sub_8097D9C(u8 var); +void SetObjectEventSpriteInvisibility(u8 var, bool32 var2); +bool32 IsObjectEventSpriteInvisible(u8 var); +void SetObjectEventSpriteGraphics(u8 var1, u8 graphicsId); +void SetObjectEventSpriteAnim(u8 var1, u8 var2); +bool32 IsObjectEventSpriteAnimating(u8 var); #endif //GUARD_EVENT_OBJECT_MOVEMENT_H diff --git a/include/fieldmap.h b/include/fieldmap.h index dc81d1766..aff458eb1 100644 --- a/include/fieldmap.h +++ b/include/fieldmap.h @@ -43,6 +43,7 @@ void copy_map_tileset1_to_vram(const struct MapLayout *); void copy_map_tileset2_to_vram(const struct MapLayout *); struct MapHeader const *const mapconnection_get_mapheader(struct MapConnection *connection); struct MapConnection *GetConnectionAtCoords(s16 x, s16 y); +void MapGridSetMetatileImpassabilityAt(int x, int y, bool32 impassable); void SpriteCB_PokeballGlow(struct Sprite *); void SpriteCB_PokecenterMonitor(struct Sprite *); @@ -50,6 +51,5 @@ void SpriteCB_HallOfFameMonitor(struct Sprite *); // field_region_map.c void FieldInitRegionMap(MainCallback callback); -void sub_8088B94(int x, int y, int a2); #endif //GUARD_FIELDMAP_H diff --git a/include/union_room.h b/include/union_room.h index 0f0075344..4cdb17662 100644 --- a/include/union_room.h +++ b/include/union_room.h @@ -2,6 +2,7 @@ #define GUARD_UNION_ROOM_H #include "link_rfu.h" +#include "constants/union_room.h" // Exported type declarations @@ -31,7 +32,7 @@ struct UnkStruct_x20 // WirelessLink_Member? struct UnkStruct_Main0 { - struct UnkStruct_x20 arr[8]; + struct UnkStruct_x20 arr[MAX_UNION_ROOM_PLAYERS]; }; struct UnkStruct_Main4 @@ -85,12 +86,12 @@ struct WirelessLink_Group u8 delayBeforePrint; }; -struct UnkStruct_8019BA8 +struct UnionRoomObject { - u8 field_0; - u8 field_1; - s8 field_2; - u8 field_3; + u8 state; + u8 gfxId; + s8 animState; + u8 schedAnim; }; struct WirelessLink_URoom @@ -121,7 +122,7 @@ struct WirelessLink_URoom u8 activityRequestStrbufs[4][16]; u16 partnerYesNoResponse; u16 recvActivityRequest[3]; - struct UnkStruct_8019BA8 field_A0[8]; + struct UnionRoomObject objects[MAX_UNION_ROOM_PLAYERS]; u8 field_C0[12][15]; u8 field_174[48]; u8 field_1A4[200]; diff --git a/include/union_room_player_avatar.h b/include/union_room_player_avatar.h index 698fc1693..072126949 100644 --- a/include/union_room_player_avatar.h +++ b/include/union_room_player_avatar.h @@ -1,14 +1,14 @@ #ifndef GUARD_UNION_ROOM_PLAYER_AVATAR_H #define GUARD_UNION_ROOM_PLAYER_AVATAR_H -u8 sub_8019BA8(struct UnkStruct_8019BA8 * ptr); -void sub_8019E3C(void); -void CreateGroupMemberObjectsInvisible(u8 *arg0, s32 arg1); -void DestroyGroupMemberObjects(u8 *spriteIds); -void sub_8019F2C(void); -void ScheduleUnionRoomPlayerRefresh(struct WirelessLink_URoom *arg0); -void HandleUnionRoomPlayerRefresh(struct WirelessLink_URoom *arg0); -bool32 RfuUnionTool_GetGroupAndMemberInFrontOfPlayer(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3); -void UpdateUnionGroupMemberFacing(u32 arg0, u32 arg1, struct UnkStruct_Main0 *arg2); +u8 InitUnionRoomPlayerObjects(struct UnionRoomObject *players); +void DestroyUnionRoomPlayerObjects(void); +void CreateGroupMemberSpritesInvisible(u8 *spriteIds, s32 playerIdx); +void DestroyGroupMemberSprites(u8 *spriteIds); +void SetTilesAroundUnionRoomPlayersPassable(void); +void ScheduleUnionRoomPlayerRefresh(struct WirelessLink_URoom *uroom); +void HandleUnionRoomPlayerRefresh(struct WirelessLink_URoom *uroom); +bool32 TrySetUnionRoomMemberFacePlayer(struct UnkStruct_Main0 *main0, s16 *directionPtr, s16 *playerIdxPtr, u8 *spriteIds); +void UpdateUnionRoomMemberFacing(u32 currDirection, u32 playerIdx, struct UnkStruct_Main0 *main0); #endif //GUARD_UNION_ROOM_PLAYER_AVATAR_H diff --git a/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/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/fieldmap.c b/src/fieldmap.c index 21bbaa8f8..753f4451f 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -917,11 +917,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/scrcmd.c b/src/scrcmd.c index ad01791a9..d7d52b349 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/union_room.c b/src/union_room.c index 28e1139dd..9687502b4 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -53,7 +53,6 @@ #include "constants/rgb.h" #include "constants/songs.h" #include "constants/species.h" -#include "constants/union_room.h" static EWRAM_DATA u8 sUnionRoomPlayerName[12] = {}; EWRAM_DATA u8 gPlayerCurrActivity = 0; @@ -104,7 +103,7 @@ static bool32 AreUnionRoomPlayerGnamesDifferent(struct WirelessGnameUnamePair *a static u32 GetPartyPositionOfRegisteredMon(struct UnionRoomTrade *arg0, u8 multiplayerId); static void ResetUnionRoomTrade(struct UnionRoomTrade *arg0); static void CreateTask_StartActivity(void); -static bool32 GetGnameWonderFlagByLinkGroup(struct GFtgtGname *arg0, s16 arg1); +static bool32 HasWonderCardOrNewsByLinkGroup(struct GFtgtGname *arg0, s16 arg1); static u8 CreateTask_SearchForChildOrParent(struct UnkStruct_Main4 *arg0, struct UnkStruct_Main4 *arg1, u32 arg2); static bool32 RegisterTradeMonAndGetIsEgg(u32 monId, struct UnionRoomTrade *trade); static void RegisterTradeMon(u32 monId, struct UnionRoomTrade *arg1); @@ -1191,14 +1190,14 @@ static void Task_ListenToWireless(u8 taskId) } } -static bool32 IsPartnerActivityAcceptable(u32 activity, u32 group) +static bool32 IsPartnerActivityAcceptable(u32 activity, u32 linkGroup) { - if (group == 0xFF) + if (linkGroup == 0xFF) return TRUE; - if (group <= ARRAY_COUNT(sAcceptedActivityIds)) // UB: <= may access data outside the array + if (linkGroup <= ARRAY_COUNT(sAcceptedActivityIds)) // UB: <= may access data outside the array { - const u8 *bytes = sAcceptedActivityIds[group]; + const u8 *bytes = sAcceptedActivityIds[linkGroup]; while ((*(bytes) != 0xFF)) { @@ -2149,7 +2148,7 @@ static void Task_CardOrNewsOverWireless(u8 taskId) { if (data->field_0->arr[0].groupScheduledAnim == UNION_ROOM_SPAWN_IN && !data->field_0->arr[0].gname_uname.gname.started) { - if (GetGnameWonderFlagByLinkGroup(&data->field_0->arr[0].gname_uname.gname, data->isWonderNews + LINK_GROUP_WONDER_CARD)) + if (HasWonderCardOrNewsByLinkGroup(&data->field_0->arr[0].gname_uname.gname, data->isWonderNews + LINK_GROUP_WONDER_CARD)) { data->leaderId = 0; data->refreshTimer = 0; @@ -2325,15 +2324,15 @@ static void Task_RunUnionRoom(u8 taskId) data->field_C = AllocZeroed(RFU_CHILD_MAX * sizeof(struct UnkStruct_x1C)); data->field_0 = AllocZeroed(8 * sizeof(struct UnkStruct_x20)); data->field_8 = AllocZeroed(sizeof(struct UnkStruct_x20)); - ClearUnkStruct_x20Array(data->field_0->arr, 8); + ClearUnkStruct_x20Array(data->field_0->arr, ARRAY_COUNT(data->field_0->arr)); gPlayerCurrActivity = IN_UNION_ROOM; data->field_20 = CreateTask_SearchForChildOrParent(data->field_C, data->field_4, LINK_GROUP_UNION_ROOM_RESUME); - sub_8019BA8(data->field_A0); - sub_8019F2C(); + InitUnionRoomPlayerObjects(data->objects); + SetTilesAroundUnionRoomPlayersPassable(); data->state = 1; break; case 1: - CreateGroupMemberObjectsInvisible(data->spriteIds, taskData[0]); + CreateGroupMemberSpritesInvisible(data->spriteIds, taskData[0]); if (++taskData[0] == 8) data->state = 2; break; @@ -2426,7 +2425,7 @@ static void Task_RunUnionRoom(u8 taskId) { if (gMain.newKeys & A_BUTTON) { - if (RfuUnionTool_GetGroupAndMemberInFrontOfPlayer(data->field_0, &taskData[0], &taskData[1], data->spriteIds)) + if (TrySetUnionRoomMemberFacePlayer(data->field_0, &taskData[0], &taskData[1], data->spriteIds)) { PlaySE(SE_SELECT); UR_EnableScriptContext2AndFreezeObjectEvents(); @@ -2526,7 +2525,7 @@ static void Task_RunUnionRoom(u8 taskId) if (!gReceivedRemoteLinkPlayers) { HandleCancelTrade(FALSE); - UpdateUnionGroupMemberFacing(taskData[0], taskData[1], data->field_0); + UpdateUnionRoomMemberFacing(taskData[0], taskData[1], data->field_0); data->state = 2; } break; @@ -2848,7 +2847,7 @@ static void Task_RunUnionRoom(u8 taskId) Free(data->field_C); Free(data->field_4); DestroyTask(data->field_20); - DestroyGroupMemberObjects(data->spriteIds); + DestroyGroupMemberSprites(data->spriteIds); data->state = 17; break; case 17: @@ -2858,7 +2857,7 @@ static void Task_RunUnionRoom(u8 taskId) case 18: if (!UpdatePaletteFade()) { - sub_8019E3C(); + DestroyUnionRoomPlayerObjects(); DestroyTask(taskId); Free(sWirelessLinkMain.uRoom); CreateTask_StartActivity(); @@ -3048,7 +3047,7 @@ static void Task_RunUnionRoom(u8 taskId) if (PrintOnTextbox(&data->textState, gStringVar4)) { HandleCancelTrade(TRUE); - UpdateUnionGroupMemberFacing(taskData[0], taskData[1], data->field_0); + UpdateUnionRoomMemberFacing(taskData[0], taskData[1], data->field_0); data->state = 4; } break; @@ -3221,7 +3220,7 @@ static u8 HandlePlayerListUpdate(void) return 4; } } - for (j = 0; j < 8; j++) + for (j = 0; j < ARRAY_COUNT(data->field_0->arr); j++) { if (data->field_0->arr[j].groupScheduledAnim != UNION_ROOM_SPAWN_NONE) { @@ -3350,29 +3349,21 @@ static void Task_ListenForPartnersWithCompatibleSerialNos(u8 taskId) } } -static bool32 GetGnameWonderFlagByLinkGroup(struct GFtgtGname *gname, s16 linkGroup) +static bool32 HasWonderCardOrNewsByLinkGroup(struct GFtgtGname *gname, s16 linkGroup) { if (linkGroup == LINK_GROUP_WONDER_CARD) { if (!gname->unk_00.hasCard) - { return FALSE; - } else - { return TRUE; - } } else if (linkGroup == LINK_GROUP_WONDER_NEWS) { if (!gname->unk_00.hasNews) - { return FALSE; - } else - { return TRUE; - } } else { @@ -3389,7 +3380,7 @@ static void Task_ListenForPartnersWithSerial7F7D(u8 taskId) { if (LinkRfu_GetNameIfSerial7F7D(&ptr[0]->arr[i].gname_uname.gname, ptr[0]->arr[i].gname_uname.playerName, i)) { - GetGnameWonderFlagByLinkGroup(&ptr[0]->arr[i].gname_uname.gname, gTasks[taskId].data[2]); + HasWonderCardOrNewsByLinkGroup(&ptr[0]->arr[i].gname_uname.gname, gTasks[taskId].data[2]); } ptr[0]->arr[i].active = AreGnameUnameDifferent(&ptr[0]->arr[i].gname_uname, &sWirelessGnameUnamePair_Dummy); } @@ -3980,7 +3971,7 @@ static void TradeBoardListMenuItemPrintFunc(u8 windowId, s32 itemId, u8 y) else { j = 0; - for (i = 0; i < 8; i++) + for (i = 0; i < (int)ARRAY_COUNT(data->field_0->arr); i++) { if (data->field_0->arr[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN && data->field_0->arr[i].gname_uname.gname.species != SPECIES_NONE) { diff --git a/src/union_room_player_avatar.c b/src/union_room_player_avatar.c index 36f3fb653..0e62a2740 100644 --- a/src/union_room_player_avatar.c +++ b/src/union_room_player_avatar.c @@ -10,14 +10,17 @@ #include "constants/event_object_movement.h" #include "constants/flags.h" -EWRAM_DATA struct UnkStruct_8019BA8 * gUnknown_02022C64 = NULL; -EWRAM_DATA u32 gUnknown_02022C68 = 0; +#define UR_SPRITE_START_ID (MAX_SPRITES - MAX_UNION_ROOM_PLAYERS) +#define UR_PLAYER_SPRITE_ID(playerIdx, facingDir)(5 * playerIdx + facingDir) -static u8 sub_8019DF4(void); -static u32 sub_8019F8C(u32 playerIdx, u32 arg1); -static void sub_801A3B0(s32 arg0, s32 arg1, u8 arg2); +static EWRAM_DATA struct UnionRoomObject * sUnionObjWork = NULL; +static EWRAM_DATA u32 sUnionObjRefreshTimer = 0; -static const u8 sUnionRoomObjGfxIds[GENDER_COUNT][10] = { +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, @@ -40,7 +43,7 @@ static const u8 sUnionRoomObjGfxIds[GENDER_COUNT][10] = { } }; -static const s16 sUnionPartnerCoords[][2] = { +static const s16 sUnionRoomPlayerCoords[MAX_UNION_ROOM_PLAYERS][2] = { { 4, 6}, {13, 8}, {10, 6}, @@ -59,26 +62,42 @@ static const s8 sFacingDirectionOffsets[][2] = { [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/Aide +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 }; @@ -86,40 +105,29 @@ static const u8 gUnknown_082F078E[2] = { static bool32 is_walking_or_running(void) { if (gPlayerAvatar.tileTransitionState == 2 || gPlayerAvatar.tileTransitionState == 0) - { return TRUE; - } else - { return FALSE; - } } -static u8 sub_8019978(u32 a0, u32 a1) +static u8 GetUnionRoomPlayerGraphicsId(u32 gender, u32 id) { - return sUnionRoomObjGfxIds[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 = sUnionPartnerCoords[a0][0] + sFacingDirectionOffsets[a1][0] + 7; - *a3 = sUnionPartnerCoords[a0][1] + sFacingDirectionOffsets[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 (sUnionPartnerCoords[a0][0] + sFacingDirectionOffsets[a1][0] + 7 != a2) - { - return FALSE; - } - else if (sUnionPartnerCoords[a0][1] + sFacingDirectionOffsets[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) @@ -144,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; } @@ -172,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; } @@ -196,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; @@ -236,11 +244,11 @@ 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()) @@ -248,30 +256,30 @@ static bool32 sub_8019C38(s8 * a0, u32 playerIdx, struct UnkStruct_8019BA8 * ptr 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; @@ -279,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 { @@ -324,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 { @@ -348,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)) { @@ -398,233 +394,231 @@ void sub_8019E3C(void) HideUnionRoomPlayer(i); } } - gUnknown_02022C64 = NULL; - sub_8019E20(); + sUnionObjWork = NULL; + DestroyTask_AnimateUnionRoomPlayers(); } -void CreateGroupMemberObjectsInvisible(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, sUnionPartnerCoords[r9][0] + sFacingDirectionOffsets[r7][0], sUnionPartnerCoords[r9][1] + sFacingDirectionOffsets[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 DestroyGroupMemberObjects(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 WirelessLink_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].groupScheduledAnim == 1) + if (r4[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN) { - sub_801A16C(i, &r4[i].gname_uname.gname); + SpawnGroupLeaderAndMembers(i, &r4[i].gname_uname.gname); } - else if (r4[i].groupScheduledAnim == 2) + else if (r4[i].groupScheduledAnim == UNION_ROOM_SPAWN_OUT) { - sub_801A214(i, &r4[i].gname_uname.gname); + DespawnGroupLeaderAndMembers(i, &r4[i].gname_uname.gname); } } } -void ScheduleUnionRoomPlayerRefresh(struct WirelessLink_URoom *unused) +void ScheduleUnionRoomPlayerRefresh(struct WirelessLink_URoom *uroom) { - gUnknown_02022C68 = 300; + sUnionObjRefreshTimer = 300; } -void HandleUnionRoomPlayerRefresh(struct WirelessLink_URoom *r2) +void HandleUnionRoomPlayerRefresh(struct WirelessLink_URoom *uroom) { - if (++gUnknown_02022C68 > 300) + if (++sUnionObjRefreshTimer > 300) { - sub_801A234(r2); + UpdateUnionRoomPlayerSprites(uroom); } } -bool32 RfuUnionTool_GetGroupAndMemberInFrontOfPlayer(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3) +bool32 TrySetUnionRoomMemberFacePlayer(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()) { 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 != sUnionPartnerCoords[i][0] + sFacingDirectionOffsets[j][0] + 7) + s32 id = UR_PLAYER_SPRITE_ID(i, direction); + if (x != sUnionRoomPlayerCoords[i][0] + sFacingDirectionOffsets[direction][0] + 7) { continue; } - if (y != sUnionPartnerCoords[i][1] + sFacingDirectionOffsets[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].groupScheduledAnim != 1) + if (r4[i].groupScheduledAnim != UNION_ROOM_SPAWN_IN) { continue; } - sub_801A3B0(j, i, gUnknown_082F076A[GetPlayerFacingDirection()]); - *arg1 = j; - *arg2 = i; + 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 UpdateUnionGroupMemberFacing(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].gname_uname.gname)); + return SetUnionRoomObjectFacingDirection(currDirection, playerIdx, GetNewFacingDirectionForUnionRoomPlayer(currDirection, playerIdx, &main0->arr[playerIdx].gname_uname.gname)); } -- cgit v1.2.3 From 7632404ba5c8ad3c1a282d080f1c65d84b485798 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Mon, 1 Jun 2020 14:05:29 -0400 Subject: Document union_room_chat.c --- gflib/text.h | 266 ++- graphics/interface/unk_change_case.png | Bin 247 -> 0 bytes graphics/interface/unk_cursor.png | Bin 307 -> 0 bytes graphics/interface/unk_cursor_arrow.png | Bin 157 -> 0 bytes graphics/interface/unk_dash.png | Bin 146 -> 0 bytes graphics/interface/unk_palette1.pal | 19 - graphics/interface/unk_palette2.pal | 19 - graphics/interface/unk_palette3.pal | 19 - graphics/interface/unk_rbutton.png | Bin 188 -> 0 bytes graphics/link/link1.pal | 19 - graphics/link/link2.pal | 19 - graphics/link/link_winedge.bin | Bin 1280 -> 0 bytes graphics/link/link_winedge.png | Bin 189 -> 0 bytes graphics/link/misc.bin | Bin 1280 -> 0 bytes graphics/link/misc.png | Bin 513 -> 0 bytes graphics/union_room_chat/background.bin | Bin 0 -> 1280 bytes graphics/union_room_chat/background.png | Bin 0 -> 513 bytes graphics/union_room_chat/border.bin | Bin 0 -> 1280 bytes graphics/union_room_chat/border.png | Bin 0 -> 189 bytes graphics/union_room_chat/interface.pal | 19 + graphics/union_room_chat/keyboard_cursor.png | Bin 0 -> 307 bytes graphics/union_room_chat/r_button.png | Bin 0 -> 188 bytes graphics/union_room_chat/r_button_labels.png | Bin 0 -> 247 bytes graphics/union_room_chat/text_entry_arrow.png | Bin 0 -> 157 bytes graphics/union_room_chat/text_entry_cursor.png | Bin 0 -> 146 bytes graphics/union_room_chat/unk_palette1.pal | 19 + graphics/union_room_chat/unk_palette2.pal | 19 + graphics/union_room_chat/window_1.pal | 19 + graphics/union_room_chat/window_2.pal | 19 + include/constants/global.h | 1 + include/global.h | 2 +- include/graphics.h | 16 +- include/strings.h | 8 +- include/union_room_chat.h | 13 +- src/graphics.c | 22 +- src/new_game.c | 2 +- src/strings.c | 8 +- src/union_room_chat.c | 2586 +++++++++++++----------- 38 files changed, 1744 insertions(+), 1370 deletions(-) delete mode 100644 graphics/interface/unk_change_case.png delete mode 100644 graphics/interface/unk_cursor.png delete mode 100644 graphics/interface/unk_cursor_arrow.png delete mode 100644 graphics/interface/unk_dash.png delete mode 100644 graphics/interface/unk_palette1.pal delete mode 100644 graphics/interface/unk_palette2.pal delete mode 100644 graphics/interface/unk_palette3.pal delete mode 100644 graphics/interface/unk_rbutton.png delete mode 100644 graphics/link/link1.pal delete mode 100644 graphics/link/link2.pal delete mode 100644 graphics/link/link_winedge.bin delete mode 100644 graphics/link/link_winedge.png delete mode 100644 graphics/link/misc.bin delete mode 100644 graphics/link/misc.png create mode 100644 graphics/union_room_chat/background.bin create mode 100644 graphics/union_room_chat/background.png create mode 100644 graphics/union_room_chat/border.bin create mode 100644 graphics/union_room_chat/border.png create mode 100644 graphics/union_room_chat/interface.pal create mode 100644 graphics/union_room_chat/keyboard_cursor.png create mode 100644 graphics/union_room_chat/r_button.png create mode 100644 graphics/union_room_chat/r_button_labels.png create mode 100644 graphics/union_room_chat/text_entry_arrow.png create mode 100644 graphics/union_room_chat/text_entry_cursor.png create mode 100644 graphics/union_room_chat/unk_palette1.pal create mode 100644 graphics/union_room_chat/unk_palette2.pal create mode 100644 graphics/union_room_chat/window_1.pal create mode 100644 graphics/union_room_chat/window_2.pal diff --git a/gflib/text.h b/gflib/text.h index 4819eb37b..5b317600e 100644 --- a/gflib/text.h +++ b/gflib/text.h @@ -1,95 +1,183 @@ #ifndef GUARD_TEXT_H #define GUARD_TEXT_H -#define CHAR_SPACE 0x00 -#define CHAR_PLUS 0x2E -#define CHAR_0 0xA1 -#define CHAR_1 0xA2 -#define CHAR_2 0xA3 -#define CHAR_3 0xA4 -#define CHAR_4 0xA5 -#define CHAR_5 0xA6 -#define CHAR_6 0xA7 -#define CHAR_7 0xA8 -#define CHAR_8 0xA9 -#define CHAR_9 0xAA -#define CHAR_EXCL_MARK 0xAB -#define CHAR_QUESTION_MARK 0xAC -#define CHAR_PERIOD 0xAD -#define CHAR_HYPHEN 0xAE -#define CHAR_ELLIPSIS 0xB0 -#define CHAR_DBL_QUOT_LEFT 0xB1 -#define CHAR_DBL_QUOT_RIGHT 0xB2 -#define CHAR_SGL_QUOT_LEFT 0xB3 -#define CHAR_SGL_QUOT_RIGHT 0xB4 -#define CHAR_MALE 0xB5 -#define CHAR_FEMALE 0xB6 -#define CHAR_CURRENCY 0xB7 -#define CHAR_COMMA 0xB8 -#define CHAR_MULT_SIGN 0xB9 -#define CHAR_SLASH 0xBA -#define CHAR_A 0xBB -#define CHAR_B 0xBC -#define CHAR_C 0xBD -#define CHAR_D 0xBE -#define CHAR_E 0xBF -#define CHAR_F 0xC0 -#define CHAR_G 0xC1 -#define CHAR_H 0xC2 -#define CHAR_I 0xC3 -#define CHAR_J 0xC4 -#define CHAR_K 0xC5 -#define CHAR_L 0xC6 -#define CHAR_M 0xC7 -#define CHAR_N 0xC8 -#define CHAR_O 0xC9 -#define CHAR_P 0xCA -#define CHAR_Q 0xCB -#define CHAR_R 0xCC -#define CHAR_S 0xCD -#define CHAR_T 0xCE -#define CHAR_U 0xCF -#define CHAR_V 0xD0 -#define CHAR_W 0xD1 -#define CHAR_X 0xD2 -#define CHAR_Y 0xD3 -#define CHAR_Z 0xD4 -#define CHAR_a 0xD5 -#define CHAR_b 0xD6 -#define CHAR_c 0xD7 -#define CHAR_d 0xD8 -#define CHAR_e 0xD9 -#define CHAR_f 0xDA -#define CHAR_g 0xDB -#define CHAR_h 0xDC -#define CHAR_i 0xDD -#define CHAR_j 0xDE -#define CHAR_k 0xDF -#define CHAR_l 0xE0 -#define CHAR_m 0xE1 -#define CHAR_n 0xE2 -#define CHAR_o 0xE3 -#define CHAR_p 0xE4 -#define CHAR_q 0xE5 -#define CHAR_r 0xE6 -#define CHAR_s 0xE7 -#define CHAR_t 0xE8 -#define CHAR_u 0xE9 -#define CHAR_v 0xEA -#define CHAR_w 0xEB -#define CHAR_x 0xEC -#define CHAR_y 0xED -#define CHAR_z 0xEE -#define CHAR_SPECIAL_F7 0xF7 -#define CHAR_SPECIAL_F8 0xF8 -#define CHAR_SPECIAL_F9 0xF9 -#define CHAR_COLON 0xF0 -#define CHAR_PROMPT_SCROLL 0xFA // waits for button press and scrolls dialog -#define CHAR_PROMPT_CLEAR 0xFB // waits for button press and clears dialog -#define EXT_CTRL_CODE_BEGIN 0xFC // extended control code -#define PLACEHOLDER_BEGIN 0xFD // string placeholder -#define CHAR_NEWLINE 0xFE -#define EOS 0xFF // end of string +#define CHAR_SPACE 0x00 +#define CHAR_A_GRAVE 0x01 +#define CHAR_A_ACUTE 0x02 +#define CHAR_A_CIRCUMFLEX 0x03 +#define CHAR_C_CEDILLA 0x04 +#define CHAR_E_GRAVE 0x05 +#define CHAR_E_ACUTE 0x06 +#define CHAR_E_CIRCUMFLEX 0x07 +#define CHAR_E_DIAERESIS 0x08 +#define CHAR_I_GRAVE 0x09 +//#define CHAR_I_ACUTE 0x0A // Is 0x5A instead +#define CHAR_I_CIRCUMFLEX 0x0B +#define CHAR_I_DIAERESIS 0x0C +#define CHAR_O_GRAVE 0x0D +#define CHAR_O_ACUTE 0x0E +#define CHAR_O_CIRCUMFLEX 0x0F +#define CHAR_OE 0x10 +#define CHAR_U_GRAVE 0x11 +#define CHAR_U_ACUTE 0x12 +#define CHAR_U_CIRCUMFLEX 0x13 +#define CHAR_N_TILDE 0x14 +#define CHAR_ESZETT 0x15 +#define CHAR_a_GRAVE 0x16 +#define CHAR_a_ACUTE 0x17 +//#define CHAR_a_CIRCUMFLEX 0x18 // Is 0x68 instead +#define CHAR_c_CEDILLA 0x19 +#define CHAR_e_GRAVE 0x1A +#define CHAR_e_ACUTE 0x1B +#define CHAR_e_CIRCUMFLEX 0x1C +#define CHAR_e_DIAERESIS 0x1D +#define CHAR_i_GRAVE 0x1E +//#define CHAR_i_ACUTE 0x1F // Is 0x6F instead +#define CHAR_i_CIRCUMFLEX 0x20 +#define CHAR_i_DIAERESIS 0x21 +#define CHAR_o_GRAVE 0x22 +#define CHAR_o_ACUTE 0x23 +#define CHAR_o_CIRCUMFLEX 0x24 +#define CHAR_oe 0x25 +#define CHAR_u_GRAVE 0x26 +#define CHAR_u_ACUTE 0x27 +#define CHAR_u_CIRCUMFLEX 0x28 +#define CHAR_n_TILDE 0x29 +#define CHAR_MASCULINE_ORDINAL 0x2A +#define CHAR_FEMININE_ORDINAL 0x2B +#define CHAR_SUPER_ER 0x2C +#define CHAR_AMPERSAND 0x2D +#define CHAR_PLUS 0x2E +// +#define CHAR_LV 0x34 +#define CHAR_EQUALS 0x35 +#define CHAR_SEMICOLON 0x36 +// +#define CHAR_INV_QUESTION_MARK 0x51 +#define CHAR_INV_EXCL_MARK 0x52 +#define CHAR_PK 0x53 +#define CHAR_MN 0x54 +#define CHAR_PO 0x55 +#define CHAR_KE 0x56 +#define CHAR_BLOCK_1 0x57 // Each of these 3 +#define CHAR_BLOCK_2 0x58 // chars contains 1/3 +#define CHAR_BLOCK_3 0x59 // of the word BLOCK +#define CHAR_I_ACUTE 0x5A +#define CHAR_PERCENT 0x5B +#define CHAR_LEFT_PAREN 0x5C +#define CHAR_RIGHT_PAREN 0x5D +// +#define CHAR_a_CIRCUMFLEX 0x68 +// +#define CHAR_i_ACUTE 0x6F +// +#define CHAR_UNK_SPACER 0x77 +// +#define CHAR_UP_ARROW 0x79 +#define CHAR_DOWN_ARROW 0x7A +#define CHAR_LEFT_ARROW 0x7B +#define CHAR_RIGHT_ARROW 0x7C +// +#define CHAR_SUPER_E 0x84 +#define CHAR_LESS_THAN 0x85 +#define CHAR_GREATER_THAN 0x86 +// +#define CHAR_SUPER_RE 0xA0 +#define CHAR_0 0xA1 +#define CHAR_1 0xA2 +#define CHAR_2 0xA3 +#define CHAR_3 0xA4 +#define CHAR_4 0xA5 +#define CHAR_5 0xA6 +#define CHAR_6 0xA7 +#define CHAR_7 0xA8 +#define CHAR_8 0xA9 +#define CHAR_9 0xAA +#define CHAR_EXCL_MARK 0xAB +#define CHAR_QUESTION_MARK 0xAC +#define CHAR_PERIOD 0xAD +#define CHAR_HYPHEN 0xAE +#define CHAR_BULLET 0xAF +#define CHAR_ELLIPSIS 0xB0 +#define CHAR_DBL_QUOT_LEFT 0xB1 +#define CHAR_DBL_QUOT_RIGHT 0xB2 +#define CHAR_SGL_QUOT_LEFT 0xB3 +#define CHAR_SGL_QUOT_RIGHT 0xB4 +#define CHAR_MALE 0xB5 +#define CHAR_FEMALE 0xB6 +#define CHAR_CURRENCY 0xB7 +#define CHAR_COMMA 0xB8 +#define CHAR_MULT_SIGN 0xB9 +#define CHAR_SLASH 0xBA +#define CHAR_A 0xBB +#define CHAR_B 0xBC +#define CHAR_C 0xBD +#define CHAR_D 0xBE +#define CHAR_E 0xBF +#define CHAR_F 0xC0 +#define CHAR_G 0xC1 +#define CHAR_H 0xC2 +#define CHAR_I 0xC3 +#define CHAR_J 0xC4 +#define CHAR_K 0xC5 +#define CHAR_L 0xC6 +#define CHAR_M 0xC7 +#define CHAR_N 0xC8 +#define CHAR_O 0xC9 +#define CHAR_P 0xCA +#define CHAR_Q 0xCB +#define CHAR_R 0xCC +#define CHAR_S 0xCD +#define CHAR_T 0xCE +#define CHAR_U 0xCF +#define CHAR_V 0xD0 +#define CHAR_W 0xD1 +#define CHAR_X 0xD2 +#define CHAR_Y 0xD3 +#define CHAR_Z 0xD4 +#define CHAR_a 0xD5 +#define CHAR_b 0xD6 +#define CHAR_c 0xD7 +#define CHAR_d 0xD8 +#define CHAR_e 0xD9 +#define CHAR_f 0xDA +#define CHAR_g 0xDB +#define CHAR_h 0xDC +#define CHAR_i 0xDD +#define CHAR_j 0xDE +#define CHAR_k 0xDF +#define CHAR_l 0xE0 +#define CHAR_m 0xE1 +#define CHAR_n 0xE2 +#define CHAR_o 0xE3 +#define CHAR_p 0xE4 +#define CHAR_q 0xE5 +#define CHAR_r 0xE6 +#define CHAR_s 0xE7 +#define CHAR_t 0xE8 +#define CHAR_u 0xE9 +#define CHAR_v 0xEA +#define CHAR_w 0xEB +#define CHAR_x 0xEC +#define CHAR_y 0xED +#define CHAR_z 0xEE +#define CHAR_BLACK_TRIANGLE 0xEF +#define CHAR_COLON 0xF0 +#define CHAR_A_DIAERESIS 0xF1 +#define CHAR_O_DIAERESIS 0xF2 +#define CHAR_U_DIAERESIS 0xF3 +#define CHAR_a_DIAERESIS 0xF4 +#define CHAR_o_DIAERESIS 0xF5 +#define CHAR_u_DIAERESIS 0xF6 +#define CHAR_SPECIAL_F7 0xF7 +#define CHAR_SPECIAL_F8 0xF8 +#define CHAR_SPECIAL_F9 0xF9 +#define CHAR_PROMPT_SCROLL 0xFA // waits for button press and scrolls dialog +#define CHAR_PROMPT_CLEAR 0xFB // waits for button press and clears dialog +#define EXT_CTRL_CODE_BEGIN 0xFC // extended control code +#define PLACEHOLDER_BEGIN 0xFD // string placeholder +#define CHAR_NEWLINE 0xFE +#define EOS 0xFF // end of string // Special F9 chars #define CHAR_UP_ARROW_2 0x00 diff --git a/graphics/interface/unk_change_case.png b/graphics/interface/unk_change_case.png deleted file mode 100644 index 185c4abf5..000000000 Binary files a/graphics/interface/unk_change_case.png and /dev/null differ diff --git a/graphics/interface/unk_cursor.png b/graphics/interface/unk_cursor.png deleted file mode 100644 index fac4e0a93..000000000 Binary files a/graphics/interface/unk_cursor.png and /dev/null differ diff --git a/graphics/interface/unk_cursor_arrow.png b/graphics/interface/unk_cursor_arrow.png deleted file mode 100644 index 574758cdf..000000000 Binary files a/graphics/interface/unk_cursor_arrow.png and /dev/null differ diff --git a/graphics/interface/unk_dash.png b/graphics/interface/unk_dash.png deleted file mode 100644 index 34c3709cf..000000000 Binary files a/graphics/interface/unk_dash.png and /dev/null differ diff --git a/graphics/interface/unk_palette1.pal b/graphics/interface/unk_palette1.pal deleted file mode 100644 index 12bc76261..000000000 --- a/graphics/interface/unk_palette1.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -0 0 0 -0 0 0 -255 255 255 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/interface/unk_palette2.pal b/graphics/interface/unk_palette2.pal deleted file mode 100644 index d2a55fec6..000000000 --- a/graphics/interface/unk_palette2.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -0 0 0 -246 246 255 -0 0 0 -205 205 230 -49 213 0 -222 230 213 -0 0 255 -205 213 222 -255 0 0 -222 213 197 -255 189 0 -230 230 222 -197 197 197 -41 32 32 -0 0 0 -57 57 57 diff --git a/graphics/interface/unk_palette3.pal b/graphics/interface/unk_palette3.pal deleted file mode 100644 index 071f73b42..000000000 --- a/graphics/interface/unk_palette3.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -156 197 98 -255 49 49 -156 49 49 -49 98 255 -0 0 98 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -230 230 255 -213 213 255 -172 172 172 -115 115 115 -255 255 255 -65 65 65 diff --git a/graphics/interface/unk_rbutton.png b/graphics/interface/unk_rbutton.png deleted file mode 100644 index 168a293f3..000000000 Binary files a/graphics/interface/unk_rbutton.png and /dev/null differ diff --git a/graphics/link/link1.pal b/graphics/link/link1.pal deleted file mode 100644 index a86815b0e..000000000 --- a/graphics/link/link1.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -0 0 0 -0 0 0 -213 205 205 -255 255 255 -255 255 255 -41 41 41 -255 156 82 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/link/link2.pal b/graphics/link/link2.pal deleted file mode 100644 index a8c95a3c0..000000000 --- a/graphics/link/link2.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -156 197 98 -41 131 222 -0 82 172 -197 255 106 -172 230 49 -246 246 213 -255 49 49 -255 148 148 -131 164 213 -238 238 90 -65 65 65 -115 115 115 -172 172 172 -230 230 255 -0 0 0 -255 255 255 diff --git a/graphics/link/link_winedge.bin b/graphics/link/link_winedge.bin deleted file mode 100644 index f3e264d05..000000000 Binary files a/graphics/link/link_winedge.bin and /dev/null differ diff --git a/graphics/link/link_winedge.png b/graphics/link/link_winedge.png deleted file mode 100644 index 86ddacc03..000000000 Binary files a/graphics/link/link_winedge.png and /dev/null differ diff --git a/graphics/link/misc.bin b/graphics/link/misc.bin deleted file mode 100644 index e91b50c8d..000000000 Binary files a/graphics/link/misc.bin and /dev/null differ diff --git a/graphics/link/misc.png b/graphics/link/misc.png deleted file mode 100644 index ae6ba4d02..000000000 Binary files a/graphics/link/misc.png and /dev/null differ diff --git a/graphics/union_room_chat/background.bin b/graphics/union_room_chat/background.bin new file mode 100644 index 000000000..e91b50c8d Binary files /dev/null and b/graphics/union_room_chat/background.bin differ diff --git a/graphics/union_room_chat/background.png b/graphics/union_room_chat/background.png new file mode 100644 index 000000000..ae6ba4d02 Binary files /dev/null and b/graphics/union_room_chat/background.png differ diff --git a/graphics/union_room_chat/border.bin b/graphics/union_room_chat/border.bin new file mode 100644 index 000000000..f3e264d05 Binary files /dev/null and b/graphics/union_room_chat/border.bin differ diff --git a/graphics/union_room_chat/border.png b/graphics/union_room_chat/border.png new file mode 100644 index 000000000..86ddacc03 Binary files /dev/null and b/graphics/union_room_chat/border.png differ diff --git a/graphics/union_room_chat/interface.pal b/graphics/union_room_chat/interface.pal new file mode 100644 index 000000000..071f73b42 --- /dev/null +++ b/graphics/union_room_chat/interface.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +156 197 98 +255 49 49 +156 49 49 +49 98 255 +0 0 98 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +230 230 255 +213 213 255 +172 172 172 +115 115 115 +255 255 255 +65 65 65 diff --git a/graphics/union_room_chat/keyboard_cursor.png b/graphics/union_room_chat/keyboard_cursor.png new file mode 100644 index 000000000..fac4e0a93 Binary files /dev/null and b/graphics/union_room_chat/keyboard_cursor.png differ diff --git a/graphics/union_room_chat/r_button.png b/graphics/union_room_chat/r_button.png new file mode 100644 index 000000000..168a293f3 Binary files /dev/null and b/graphics/union_room_chat/r_button.png differ diff --git a/graphics/union_room_chat/r_button_labels.png b/graphics/union_room_chat/r_button_labels.png new file mode 100644 index 000000000..185c4abf5 Binary files /dev/null and b/graphics/union_room_chat/r_button_labels.png differ diff --git a/graphics/union_room_chat/text_entry_arrow.png b/graphics/union_room_chat/text_entry_arrow.png new file mode 100644 index 000000000..574758cdf Binary files /dev/null and b/graphics/union_room_chat/text_entry_arrow.png differ diff --git a/graphics/union_room_chat/text_entry_cursor.png b/graphics/union_room_chat/text_entry_cursor.png new file mode 100644 index 000000000..34c3709cf Binary files /dev/null and b/graphics/union_room_chat/text_entry_cursor.png differ diff --git a/graphics/union_room_chat/unk_palette1.pal b/graphics/union_room_chat/unk_palette1.pal new file mode 100644 index 000000000..12bc76261 --- /dev/null +++ b/graphics/union_room_chat/unk_palette1.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +0 0 0 +255 255 255 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/union_room_chat/unk_palette2.pal b/graphics/union_room_chat/unk_palette2.pal new file mode 100644 index 000000000..d2a55fec6 --- /dev/null +++ b/graphics/union_room_chat/unk_palette2.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +246 246 255 +0 0 0 +205 205 230 +49 213 0 +222 230 213 +0 0 255 +205 213 222 +255 0 0 +222 213 197 +255 189 0 +230 230 222 +197 197 197 +41 32 32 +0 0 0 +57 57 57 diff --git a/graphics/union_room_chat/window_1.pal b/graphics/union_room_chat/window_1.pal new file mode 100644 index 000000000..a86815b0e --- /dev/null +++ b/graphics/union_room_chat/window_1.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +0 0 0 +213 205 205 +255 255 255 +255 255 255 +41 41 41 +255 156 82 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/union_room_chat/window_2.pal b/graphics/union_room_chat/window_2.pal new file mode 100644 index 000000000..a8c95a3c0 --- /dev/null +++ b/graphics/union_room_chat/window_2.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +156 197 98 +41 131 222 +0 82 172 +197 255 106 +172 230 49 +246 246 213 +255 49 49 +255 148 148 +131 164 213 +238 238 90 +65 65 65 +115 115 115 +172 172 172 +230 230 255 +0 0 0 +255 255 255 diff --git a/include/constants/global.h b/include/constants/global.h index c7063d71c..b86e29a29 100644 --- a/include/constants/global.h +++ b/include/constants/global.h @@ -52,6 +52,7 @@ #define APPRENTICE_COUNT 4 #define APPRENTICE_MAX_QUESTIONS 9 #define MAX_REMATCH_ENTRIES 100 // only REMATCH_TABLE_ENTRIES (78) are used +#define UNION_ROOM_KB_ROW_COUNT 10 #define PYRAMID_BAG_ITEMS_COUNT 10 #define HALL_FACILITIES_COUNT 9 // 7 facilities for single mode + tower double mode + tower multi mode. diff --git a/include/global.h b/include/global.h index 2b03ebbe1..cc1faa9f2 100644 --- a/include/global.h +++ b/include/global.h @@ -974,7 +974,7 @@ struct SaveBlock1 /*0x3B24*/ u8 seen2[DEX_FLAGS_NO]; /*0x3B58*/ LilycoveLady lilycoveLady; /*0x3B98*/ struct TrainerNameRecord trainerNameRecords[20]; - /*0x3C88*/ u8 unk3C88[10][21]; + /*0x3C88*/ u8 registeredTexts[UNION_ROOM_KB_ROW_COUNT][21]; /*0x3D5A*/ u8 filler3D5A[0xA]; /*0x3D64*/ struct SaveTrainerHill trainerHill; /*0x3D70*/ struct WaldaPhrase waldaPhrase; diff --git a/include/graphics.h b/include/graphics.h index b41a43095..6811b7620 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4986,14 +4986,14 @@ extern const u16 gEasyChatRightWindow_Pal[]; extern const u32 gUsePokeblockCondition_Gfx[]; // Union Room Chat -extern const u16 gUnknown_08DD4BB0[]; -extern const u16 gUnknown_08DD4BD0[]; -extern const u32 gUnknown_08DD4BF0[]; -extern const u32 gUnknown_08DD4C4C[]; -extern const u32 gUnknown_08DD4CF8[]; -extern const u16 gLinkMiscMenu_Pal[]; -extern const u32 gLinkMiscMenu_Gfx[]; -extern const u32 gLinkMiscMenu_Tilemap[]; +extern const u16 gUnionRoomChat_Background_Pal[]; +extern const u32 gUnionRoomChat_Background_Gfx[]; +extern const u32 gUnionRoomChat_Background_Tilemap[]; +extern const u16 gUnionRoomChat_Window_Pal1[]; +extern const u16 gUnionRoomChat_Window_Pal2[]; +extern const u32 gUnionRoomChat_Border_Gfx[]; +extern const u32 gUnionRoomChat_Border_Tilemap[]; +extern const u32 gUnionRoomChat_RButtonLabels[]; // Use Pokeblock extern const u8 gPokenavConditionCancel_Gfx[]; diff --git a/include/strings.h b/include/strings.h index 5720598ad..dc3653163 100644 --- a/include/strings.h +++ b/include/strings.h @@ -2815,10 +2815,10 @@ extern const u8 gText_RegisterTextHere[]; extern const u8 gText_InputText[]; extern const u8 gText_ExitingChat[]; extern const u8 gText_LeaderLeftEndingChat[]; -extern const u8 gText_RegisteredTextChanged[]; -extern const u8 gText_AlreadySavedFile_Unused[]; -extern const u8 gText_SavingDontTurnOff_Unused[]; -extern const u8 gText_PlayerSavedGame_Unused[]; +extern const u8 gText_RegisteredTextChangedOKToSave[]; +extern const u8 gText_AlreadySavedFile_Chat[]; +extern const u8 gText_SavingDontTurnOff_Chat[]; +extern const u8 gText_PlayerSavedGame_Chat[]; extern const u8 gText_IfLeaderLeavesChatEnds[]; extern const u8 gText_Upper[]; extern const u8 gText_Lower[]; diff --git a/include/union_room_chat.h b/include/union_room_chat.h index 3dd22743a..dbd45c543 100755 --- a/include/union_room_chat.h +++ b/include/union_room_chat.h @@ -1,18 +1,7 @@ #ifndef GUARD_UNION_ROOM_CHAT_H #define GUARD_UNION_ROOM_CHAT_H -enum -{ - UNION_ROOM_KB_PAGE_UPPER, - UNION_ROOM_KB_PAGE_LOWER, - UNION_ROOM_KB_PAGE_EMOJI, - UNION_ROOM_KB_PAGE_COUNT -}; - -#define UNION_ROOM_KB_ROW_COUNT 10 - - void EnterUnionRoomChat(void); -void copy_strings_to_sav1(void); +void InitUnionRoomChatRegisteredTexts(void); #endif // GUARD_UNION_ROOM_CHAT_H 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/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/strings.c b/src/strings.c index 3ca7f693f..3ba01b0f0 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"); diff --git a/src/union_room_chat.c b/src/union_room_chat.c index e50d7f100..3ff5d7f2c 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,198 +581,297 @@ 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 @@ -590,43 +879,43 @@ const struct SpriteTemplate gUnknown_082F3244 = { 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); reset_temp_tile_data_buffers(); - 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 (free_temp_tile_data_buffers_if_possible() == 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); - decompress_and_copy_tile_data_to_vram(1, gUnknown_08DD4BF0, 0, 0, 0); - CopyToBgTilemapBuffer(1, gUnknown_08DD4C4C, 0, 0); + LoadPalette(gUnionRoomChat_Window_Pal2, 0x70, 0x20); + LoadPalette(gUnionRoomChat_Window_Pal1, 0xC0, 0x20); + decompress_and_copy_tile_data_to_vram(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 = decompress_and_copy_tile_data_to_vram(2, gLinkMiscMenu_Gfx, 0, 0, 0); + LoadPalette(gUnionRoomChat_Background_Pal, 0, 0x20); + ptr = decompress_and_copy_tile_data_to_vram(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 = ®_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); } } -- cgit v1.2.3 From 18a00da8200d05f150436807e6b6a87301e59d31 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Tue, 2 Jun 2020 18:51:26 -0400 Subject: Split wireless_communication_status_screen.c out --- ld_script.txt | 2 + src/union_room_battle.c | 392 --------------------------- src/wireless_communication_status_screen.c | 412 +++++++++++++++++++++++++++++ sym_bss.txt | 1 + sym_ewram.txt | 1 + 5 files changed, 416 insertions(+), 392 deletions(-) create mode 100644 src/wireless_communication_status_screen.c diff --git a/ld_script.txt b/ld_script.txt index 74d9f6ae6..62010b953 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -65,6 +65,7 @@ SECTIONS { src/union_room.o(.text); src/mystery_gift.o(.text); src/union_room_player_avatar.o(.text); + src/wireless_communication_status_screen.o(.text); src/union_room_battle.o(.text); src/mevent2.o(.text); src/mevent_801BAAC.o(.text); @@ -450,6 +451,7 @@ SECTIONS { src/union_room.o(.rodata); src/mystery_gift.o(.rodata); src/union_room_player_avatar.o(.rodata); + src/wireless_communication_status_screen.o(.rodata); src/union_room_battle.o(.rodata); src/mevent2.o(.rodata); src/mevent_801BAAC.o(.rodata); diff --git a/src/union_room_battle.c b/src/union_room_battle.c index e73f9bd24..dcc13b1cb 100644 --- a/src/union_room_battle.c +++ b/src/union_room_battle.c @@ -25,119 +25,13 @@ #include "union_room.h" #include "union_room_battle.h" -struct UnkStruct_3000DAC -{ - /*0x00*/ u32 unk00[4]; - /*0x10*/ u32 unk10[4]; - /*0x20*/ u32 unk20[16]; - /*0x60*/ u8 taskId; - /*0x61*/ u8 unk61; - /*0x62*/ u8 filler_62[10]; -}; - struct UnionRoomBattleWork { s16 textState; }; -static struct UnkStruct_3000DAC * gUnknown_03000DAC; - EWRAM_DATA struct UnionRoomBattleWork * sWork = 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"); - -static const struct BgTemplate sBgTemplates[] = { - { - .bg = 0, - .charBaseIndex = 2, - .mapBaseIndex = 0x1F, - .priority = 0 - }, { - .bg = 1, - .charBaseIndex = 0, - .mapBaseIndex = 0x08, - .priority = 1 - } -}; - -const struct WindowTemplate sWindowTemplates[] = { - { - .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 } -}; - -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[] = { { .bg = 0, @@ -161,292 +55,6 @@ const struct WindowTemplate gUnknown_082F0DD4[] = { 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, sBgTemplates, ARRAY_COUNT(sBgTemplates)); - SetBgTilemapBuffer(1, Alloc(0x800)); - SetBgTilemapBuffer(0, Alloc(0x800)); - DecompressAndLoadBgGfxUsingHeap(1, gWirelessInfoScreenGfx, 0, 0, 0); - CopyToBgTilemapBuffer(1, gWirelessInfoScreenTilemap, 0, 0); - InitWindows(sWindowTemplates); - DeactivateAllTextPrinters(); - ResetPaletteFade(); - ResetSpriteData(); - ResetTasks(); - ScanlineEffect_Stop(); - m4aSoundVSyncOn(); - SetVBlankCallback(sub_801A418); - gUnknown_03000DAC->taskId = CreateTask(sub_801A6C0, 0); - gUnknown_03000DAC->unk61 = CreateTask_ListenToWireless(); - 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); -} - -void sub_801A600(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->gname_uname.gname.activity; - - for (i = 0; i < (unsigned)ARRAY_COUNT(gUnknown_082F0D70); i++) - { - if (result != gUnknown_082F0D70[i][0]) - { - continue; - } - if (a0->groupScheduledAnim != 1) - { - continue; - } - if (gUnknown_082F0D70[i][2] == 0) - { - r2 = 0; - for (j = 0; j < 4; j++) - { - if (a0->gname_uname.gname.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; diff --git a/src/wireless_communication_status_screen.c b/src/wireless_communication_status_screen.c new file mode 100644 index 000000000..4931e96da --- /dev/null +++ b/src/wireless_communication_status_screen.c @@ -0,0 +1,412 @@ +#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" + +struct UnkStruct_3000DAC +{ + /*0x00*/ u32 unk00[4]; + /*0x10*/ u32 unk10[4]; + /*0x20*/ u32 unk20[16]; + /*0x60*/ u8 taskId; + /*0x61*/ u8 unk61; + /*0x62*/ u8 filler_62[10]; +}; + +static struct UnkStruct_3000DAC * gUnknown_03000DAC; + +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"); + +static const struct BgTemplate sBgTemplates[] = { + { + .bg = 0, + .charBaseIndex = 2, + .mapBaseIndex = 0x1F, + .priority = 0 + }, { + .bg = 1, + .charBaseIndex = 0, + .mapBaseIndex = 0x08, + .priority = 1 + } +}; + +const struct WindowTemplate sWindowTemplates[] = { + { + .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 } +}; + +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} +}; + +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, sBgTemplates, ARRAY_COUNT(sBgTemplates)); + SetBgTilemapBuffer(1, Alloc(0x800)); + SetBgTilemapBuffer(0, Alloc(0x800)); + DecompressAndLoadBgGfxUsingHeap(1, gWirelessInfoScreenGfx, 0, 0, 0); + CopyToBgTilemapBuffer(1, gWirelessInfoScreenTilemap, 0, 0); + InitWindows(sWindowTemplates); + DeactivateAllTextPrinters(); + ResetPaletteFade(); + ResetSpriteData(); + ResetTasks(); + ScanlineEffect_Stop(); + m4aSoundVSyncOn(); + SetVBlankCallback(sub_801A418); + gUnknown_03000DAC->taskId = CreateTask(sub_801A6C0, 0); + gUnknown_03000DAC->unk61 = CreateTask_ListenToWireless(); + 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); +} + +void sub_801A600(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->gname_uname.gname.activity; + + for (i = 0; i < (unsigned)ARRAY_COUNT(gUnknown_082F0D70); i++) + { + if (result != gUnknown_082F0D70[i][0]) + { + continue; + } + if (a0->groupScheduledAnim != 1) + { + continue; + } + if (gUnknown_082F0D70[i][2] == 0) + { + r2 = 0; + for (j = 0; j < 4; j++) + { + if (a0->gname_uname.gname.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; +} diff --git a/sym_bss.txt b/sym_bss.txt index aad8c8f14..3166aee45 100644 --- a/sym_bss.txt +++ b/sym_bss.txt @@ -10,6 +10,7 @@ .include "src/link_rfu_3.o" .include "src/link_rfu_2.o" .include "src/union_room.o" + .include "src/wireless_communication_status_screen.o" .include "src/union_room_battle.o" .include "src/dodrio_berry_picking.o" .include "src/rtc.o" diff --git a/sym_ewram.txt b/sym_ewram.txt index d00f7953c..a00b72468 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -11,6 +11,7 @@ .include "src/union_room.o" .include "src/mystery_gift.o" .include "src/union_room_player_avatar.o" + .include "src/wireless_communication_status_screen.o" .include "src/union_room_battle.o" .include "src/mevent2.o" .include "src/mevent_801BAAC.o" -- cgit v1.2.3 From bc6bd36813166011248e6b1acb23e939a354fb49 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Tue, 2 Jun 2020 19:05:59 -0400 Subject: Document union_room_battle.c --- src/union_room_battle.c | 81 +++++++++++++++++++++++-------------------------- 1 file changed, 38 insertions(+), 43 deletions(-) diff --git a/src/union_room_battle.c b/src/union_room_battle.c index dcc13b1cb..bb8d536ae 100644 --- a/src/union_room_battle.c +++ b/src/union_room_battle.c @@ -1,4 +1,5 @@ #include "global.h" +#include "defines.h" #include "battle.h" #include "task.h" #include "text.h" @@ -11,28 +12,23 @@ #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/trainers.h" -struct UnionRoomBattleWork +struct UnionRoomBattle { s16 textState; }; -EWRAM_DATA struct UnionRoomBattleWork * sWork = NULL; +static EWRAM_DATA struct UnionRoomBattle * sBattle = NULL; -const struct BgTemplate gUnknown_082F0DD0[] = { +static const struct BgTemplate sBgTemplates[] = { { .bg = 0, .charBaseIndex = 3, @@ -40,7 +36,7 @@ const struct BgTemplate gUnknown_082F0DD0[] = { } }; -const struct WindowTemplate gUnknown_082F0DD4[] = { +static const struct WindowTemplate sWindowTemplates[] = { { .bg = 0, .tilemapLeft = 3, @@ -50,15 +46,15 @@ const struct WindowTemplate gUnknown_082F0DD4[] = { .paletteNum = 0xE, .baseBlock = 0x014 }, - { 0xFF } + DUMMY_WIN_TEMPLATE }; -const u8 gUnknown_082F0DE4[] = { 1, 2, 3 }; +static const u8 sTextColors[] = { TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY }; -void sub_801AAD4(void) +static void CB2_SetUpPartiesAndStartBattle(void) { s32 i; - StartUnionRoomBattle(10); + StartUnionRoomBattle(BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER); for (i = 0; i < UNION_ROOM_PARTY_SIZE; i++) { gEnemyParty[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1]; @@ -73,25 +69,25 @@ void sub_801AAD4(void) } IncrementGameStat(GAME_STAT_NUM_UNION_ROOM_BATTLES); CalculatePlayerPartyCount(); - gTrainerBattleOpponent_A = 0xC00; + gTrainerBattleOpponent_A = TRAINER_OPPONENT_C00; 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)++; @@ -107,7 +103,7 @@ bool32 sub_801ABDC(s16 * state, const u8 * str, s32 speed) return FALSE; } -void sub_801AC40(void) +static void VBlankCB_UnionRoomBattle(void) { LoadOam(); ProcessSpriteCopyRequests(); @@ -120,67 +116,66 @@ void CB2_UnionRoomBattle(void) { case 0: SetGpuReg(REG_OFFSET_DISPCNT, 0x0000); - sWork = AllocZeroed(4); + sBattle = AllocZeroed(sizeof(struct UnionRoomBattle)); ResetSpriteData(); FreeAllSpritePalettes(); ResetTasks(); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, gUnknown_082F0DD0, 1); + InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); reset_temp_tile_data_buffers(); - 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(&sWork->textState, 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; case 3: if (!UpdatePaletteFade()) { - memset(gBlockSendBuffer, 0, 0x20); + memset(gBlockSendBuffer, 0, sizeof(gBlockSendBuffer)); 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); + SendBlock(0, gBlockSendBuffer, sizeof(gBlockSendBuffer)); gMain.state++; } break; 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; } @@ -202,29 +197,29 @@ void CB2_UnionRoomBattle(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(&sWork->textState, 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(&sWork->textState, gText_BattleWasRefused, 1)) + if (PrintUnionRoomBattleMessage(&sBattle->textState, gText_BattleWasRefused, 1)) { SetMainCallback2(CB2_ReturnToField); } -- cgit v1.2.3 From fd77eb1eb92de63c4a8d714798eeb73cb6071aa2 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Wed, 3 Jun 2020 14:07:40 -0400 Subject: Document wireless_communication_status_screen.c --- data/scripts/cable_club.inc | 2 +- data/specials.inc | 2 +- src/wireless_communication_status_screen.c | 418 +++++++++++++++-------------- 3 files changed, 221 insertions(+), 201 deletions(-) diff --git a/data/scripts/cable_club.inc b/data/scripts/cable_club.inc index 6d5702f74..f206fdd98 100644 --- a/data/scripts/cable_club.inc +++ b/data/scripts/cable_club.inc @@ -1310,7 +1310,7 @@ EventScript_WirelessBoxResults:: @ 8277B8A compare VAR_RESULT, FALSE goto_if_eq CableClub_EventScript_AdapterNotConnected fadescreen FADE_TO_BLACK - special sub_801A42C + special ShowWirelessCommunicationScreen waitstate msgbox CableClub_Text_ParticipantsStepUpToCounter, MSGBOX_DEFAULT releaseall diff --git a/data/specials.inc b/data/specials.inc index 97cc3c782..3cbffb365 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -427,7 +427,7 @@ gSpecials:: @ 81DBA64 def_special TryBecomeLinkLeader def_special TryJoinLinkGroup def_special UnionRoomSpecial - def_special sub_801A42C + def_special ShowWirelessCommunicationScreen def_special InitUnionRoom def_special BufferUnionRoomPlayerName def_special sub_801DC20 diff --git a/src/wireless_communication_status_screen.c b/src/wireless_communication_status_screen.c index 4931e96da..87b200f14 100644 --- a/src/wireless_communication_status_screen.c +++ b/src/wireless_communication_status_screen.c @@ -19,113 +19,131 @@ #include "constants/songs.h" #include "constants/union_room.h" -struct UnkStruct_3000DAC +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 { - /*0x00*/ u32 unk00[4]; - /*0x10*/ u32 unk10[4]; - /*0x20*/ u32 unk20[16]; - /*0x60*/ u8 taskId; - /*0x61*/ u8 unk61; - /*0x62*/ u8 filler_62[10]; + u32 groupCounts[NUM_GROUPTYPES]; + u32 prevGroupCounts[NUM_GROUPTYPES]; + u32 activities[NUM_TASK_DATA]; + u8 taskId; + u8 rfuTaskId; + u8 filler[10]; }; -static struct UnkStruct_3000DAC * gUnknown_03000DAC; +static struct WirelessCommunicationStatusScreen * sStatusScreen; -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); +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); -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"); +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 = 0x1F, + .mapBaseIndex = 31, .priority = 0 }, { .bg = 1, .charBaseIndex = 0, - .mapBaseIndex = 0x08, + .mapBaseIndex = 8, .priority = 1 } }; -const struct WindowTemplate sWindowTemplates[] = { +static const struct WindowTemplate sWindowTemplates[] = { { - .bg = 0x00, - .tilemapLeft = 0x03, - .tilemapTop = 0x00, - .width = 0x18, - .height = 0x03, - .paletteNum = 0x0f, + .bg = 0, + .tilemapLeft = 3, + .tilemapTop = 0, + .width = 24, + .height = 3, + .paletteNum = 15, .baseBlock = 0x0001 }, { - .bg = 0x00, - .tilemapLeft = 0x03, - .tilemapTop = 0x04, - .width = 0x15, - .height = 0x0f, - .paletteNum = 0x0f, + .bg = 0, + .tilemapLeft = 3, + .tilemapTop = 4, + .width = 21, + .height = 15, + .paletteNum = 15, .baseBlock = 0x0049 }, { - .bg = 0x00, - .tilemapLeft = 0x18, - .tilemapTop = 0x04, - .width = 0x03, - .height = 0x0f, - .paletteNum = 0x0f, + .bg = 0, + .tilemapLeft = 24, + .tilemapTop = 4, + .width = 3, + .height = 15, + .paletteNum = 15, .baseBlock = 0x0184 - }, - { 0xFF } + }, DUMMY_WIN_TEMPLATE }; -const u8 *const gUnknown_082F0D5C[] = { - gText_WirelessCommStatus, - gText_PeopleTrading, - gText_PeopleBattling, - gText_PeopleInUnionRoom, - gText_PeopleCommunicating +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 }; -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} +// 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} }; -void sub_801A3F4(void) +static void CB2_RunWirelessCommunicationScreen(void) { if (!IsDma3ManagerBusyWithBgCopy()) { @@ -137,29 +155,29 @@ void sub_801A3F4(void) } } -void sub_801A418(void) +static void VBlankCB_WirelessCommunicationScreen(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } -void sub_801A42C(void) +void ShowWirelessCommunicationScreen(void) { - SetMainCallback2(sub_801A43C); + SetMainCallback2(CB2_InitWirelessCommunicationScreen); } -void sub_801A43C(void) +static void CB2_InitWirelessCommunicationScreen(void) { - SetGpuReg(REG_OFFSET_DISPCNT, 0x0000); - gUnknown_03000DAC = AllocZeroed(sizeof(struct UnkStruct_3000DAC)); + 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, gWirelessInfoScreenGfx, 0, 0, 0); - CopyToBgTilemapBuffer(1, gWirelessInfoScreenTilemap, 0, 0); + DecompressAndLoadBgGfxUsingHeap(1, sBgTiles_Gfx, 0, 0, 0); + CopyToBgTilemapBuffer(1, sBgTiles_Tilemap, 0, 0); InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); ResetPaletteFade(); @@ -167,20 +185,20 @@ void sub_801A43C(void) ResetTasks(); ScanlineEffect_Stop(); m4aSoundVSyncOn(); - SetVBlankCallback(sub_801A418); - gUnknown_03000DAC->taskId = CreateTask(sub_801A6C0, 0); - gUnknown_03000DAC->unk61 = CreateTask_ListenToWireless(); - gUnknown_03000DAC->unk10[3] = 1; + 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(gWirelessInfoScreenPal, 0x00, 0x20); + LoadPalette(sBgTiles_Pal, 0x00, 0x20); Menu_LoadStdPalAt(0xF0); DynamicPlaceholderTextUtil_Reset(); FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 0x0F); CopyBgTilemapBufferToVram(1); - SetMainCallback2(sub_801A3F4); + SetMainCallback2(CB2_RunWirelessCommunicationScreen); RunTasks(); RunTextPrinters(); AnimateSprites(); @@ -188,225 +206,227 @@ void sub_801A43C(void) UpdatePaletteFade(); } -void sub_801A584(void) +static void CB2_ExitWirelessCommunicationStatusScreen(void) { s32 i; FreeAllWindowBuffers(); - for (i = 0; i < 2; i++) + for (i = 0; i < (int)ARRAY_COUNT(sBgTemplates); i++) { Free(GetBgTilemapBuffer(i)); } - Free(gUnknown_03000DAC); + Free(sStatusScreen); SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } -void sub_801A5BC(s16 * a0, s16 * a1) +static void WCSS_CyclePalette(s16 * counter, s16 * palIdx) { - if (++(*a0) > 5) + if (++(*counter) > 5) { - if (++(*a1) == 14) - { - *a1 = 0; - } - *a0 = 0; + if (++(*palIdx) == 14) + *palIdx = 0; + + *counter = 0; } - LoadPalette(gWirelessInfoScreenPal + 16 * (*a1 + 2), 0, 0x10); + LoadPalette(sBgTiles_Pal + 16 * (*palIdx + 2), 0, 0x10); } -void sub_801A600(void) +static void PrintHeaderTexts(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++) + 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++) { - sub_801A8B0(1, 1, gUnknown_082F0D5C[i + 1], 0, 30 * i + 8, 1); + WCSS_AddTextPrinterParameterized(1, 1, sHeaderTexts[i + 1], 0, 30 * i + 8, COLORMODE_WHITE_LGRAY); } - sub_801A8B0(1, 1, gUnknown_082F0D5C[i + 1], 0, 30 * i + 8, 2); + WCSS_AddTextPrinterParameterized(1, 1, sHeaderTexts[i + 1], 0, 30 * i + 8, COLORMODE_RED); PutWindowTilemap(0); CopyWindowToVram(0, 2); PutWindowTilemap(1); CopyWindowToVram(1, 2); } -void sub_801A6C0(u8 taskId) +#define tState data[0] + +static void Task_WirelessCommunicationScreen(u8 taskId) { s32 i; - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: - sub_801A600(); - gTasks[taskId].data[0]++; + PrintHeaderTexts(); + gTasks[taskId].tState++; break; case 1: BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); ShowBg(1); CopyBgTilemapBufferToVram(0); ShowBg(0); - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; break; case 2: if (!gPaletteFade.active) { - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; } break; case 3: - if (sub_801AA30(gUnknown_03000DAC->unk00, gUnknown_03000DAC->unk10, gUnknown_03000DAC->unk20, gUnknown_03000DAC->unk61)) + if (UpdateCommunicationCounts(sStatusScreen->groupCounts, sStatusScreen->prevGroupCounts, sStatusScreen->activities, sStatusScreen->rfuTaskId)) { - FillWindowPixelBuffer(2, 0); - for (i = 0; i < 4; i++) + FillWindowPixelBuffer(2, PIXEL_FILL(0)); + for (i = 0; i < NUM_GROUPTYPES; 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); - } + 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 - { - sub_801A8B0(2, 1, gStringVar4, 12, 98, 2); - } + WCSS_AddTextPrinterParameterized(2, 1, gStringVar4, 12, 98, COLORMODE_RED); } PutWindowTilemap(2); CopyWindowToVram(2, 3); } - if (({gMain.newKeys & A_BUTTON;}) || ({gMain.newKeys & B_BUTTON;})) + if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); - gTasks[gUnknown_03000DAC->unk61].data[15] = 0xFF; - gTasks[taskId].data[0]++; + gTasks[sStatusScreen->rfuTaskId].data[15] = 0xFF; + gTasks[taskId].tState++; } - sub_801A5BC(&gTasks[taskId].data[7], &gTasks[taskId].data[8]); + WCSS_CyclePalette(&gTasks[taskId].data[7], &gTasks[taskId].data[8]); break; case 4: BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; break; case 5: if (!gPaletteFade.active) { - SetMainCallback2(sub_801A584); + SetMainCallback2(CB2_ExitWirelessCommunicationStatusScreen); DestroyTask(taskId); } break; } } -static void sub_801A8B0(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 mode) +#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 0: - color[0] = 0; - color[1] = 2; - color[2] = 3; + case COLORMODE_NORMAL: + color[0] = TEXT_COLOR_TRANSPARENT; + color[1] = TEXT_COLOR_DARK_GREY; + color[2] = TEXT_COLOR_LIGHT_GREY; break; - case 1: - color[0] = 0; - color[1] = 1; - color[2] = 3; + case COLORMODE_WHITE_LGRAY: + color[0] = TEXT_COLOR_TRANSPARENT; + color[1] = TEXT_COLOR_WHITE; + color[2] = TEXT_COLOR_LIGHT_GREY; break; - case 2: - color[0] = 0; - color[1] = 4; - color[2] = 5; + case COLORMODE_RED: + color[0] = TEXT_COLOR_TRANSPARENT; + color[1] = TEXT_COLOR_RED; + color[2] = TEXT_COLOR_LIGHT_RED; break; - case 3: - color[0] = 0; - color[1] = 7; - color[2] = 6; + case COLORMODE_GREEN: + color[0] = TEXT_COLOR_TRANSPARENT; + color[1] = TEXT_COLOR_LIGHT_GREEN; + color[2] = TEXT_COLOR_GREEN; break; - case 4: - color[0] = 0; - color[1] = 1; - color[2] = 2; + 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); } -u32 sub_801A960(struct UnkStruct_x20 * a0, u32 * a1) +static u32 CountPlayersInGroupAndGetActivity(struct UnkStruct_x20 * unk20, u32 * groupCounts) { - s32 i, j, r2; - u32 result = a0->gname_uname.gname.activity; + int i, j, k; + u32 activity = unk20->gname_uname.gname.activity; - for (i = 0; i < (unsigned)ARRAY_COUNT(gUnknown_082F0D70); i++) + #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 (result != gUnknown_082F0D70[i][0]) - { - continue; - } - if (a0->groupScheduledAnim != 1) - { - continue; - } - if (gUnknown_082F0D70[i][2] == 0) + if (activity == group_activity(i) && unk20->groupScheduledAnim == UNION_ROOM_SPAWN_IN) { - r2 = 0; - for (j = 0; j < 4; j++) + if (group_players(i) == 0) { - if (a0->gname_uname.gname.child_sprite_gender[j] != 0) + k = 0; + for (j = 0; j < RFU_CHILD_MAX; j++) { - r2++; + 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); } - r2++; - a1[gUnknown_082F0D70[i][1]] += r2; - } - else - { - a1[gUnknown_082F0D70[i][1]] += gUnknown_082F0D70[i][2]; } } - return result; + return activity; + + #undef group_activity + #undef group_type + #undef group_players } -bool32 sub_801AA08(u32 * a0, u32 * a1) +static bool32 HaveCountsChanged(u32 * currCounts, u32 * prevCounts) { s32 i; - for (i = 0; i < 4; i++) + for (i = 0; i < NUM_GROUPTYPES; i++) { - if (a0[i] != a1[i]) - { + if (currCounts[i] != prevCounts[i]) return TRUE; - } } return FALSE; } -bool32 sub_801AA30(u32 * a0, u32 * a1, u32 * a2, u8 taskId) +static bool32 UpdateCommunicationCounts(u32 * groupCounts, u32 * prevGroupCounts, u32 * activities, u8 taskId) { - bool32 r8 = FALSE; - u32 sp0[4] = {0, 0, 0, 0}; + 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 < 16; i++) + for (i = 0; i < NUM_TASK_DATA; i++) { - u32 r1 = sub_801A960(&(*data)[i], sp0); - if (r1 != a2[i]) + u32 activity = CountPlayersInGroupAndGetActivity(&(*data)[i], groupCountBuffer); + if (activity != activities[i]) { - a2[i] = r1; - r8 = TRUE; + activities[i] = activity; + activitiesChanged = TRUE; } } - if (sub_801AA08(sp0, a1) == 0) + + if (!HaveCountsChanged(groupCountBuffer, prevGroupCounts)) { - if (r8 != TRUE) - { + if (activitiesChanged == TRUE) + return TRUE; + else return FALSE; - } } else { - memcpy(a0, sp0, sizeof(sp0)); - memcpy(a1, sp0, sizeof(sp0)); - a0[3] = a0[0] + a0[1] + a0[2] + a0[3]; + 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; } - return TRUE; } -- cgit v1.2.3 From 9190af73b7ebe690be7204c023d4c14d0241af29 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Wed, 3 Jun 2020 15:28:29 -0400 Subject: Label union room battle trainer --- include/constants/trainers.h | 2 +- include/pokemon.h | 4 ++-- src/battle_controller_link_opponent.c | 4 ++-- src/battle_controller_recorded_opponent.c | 4 ++-- src/battle_main.c | 2 +- src/battle_message.c | 14 +++++++------- src/pokemon.c | 4 ++-- src/union_room.c | 2 +- src/union_room_battle.c | 10 +++++----- 9 files changed, 23 insertions(+), 23 deletions(-) diff --git a/include/constants/trainers.h b/include/constants/trainers.h index 541b131ca..3f22c7cef 100644 --- a/include/constants/trainers.h +++ b/include/constants/trainers.h @@ -13,7 +13,7 @@ #define TRAINER_PLAYER 1023 #define TRAINER_SECRET_BASE 1024 #define TRAINER_LINK_OPPONENT 2048 -#define TRAINER_OPPONENT_C00 3072 +#define TRAINER_UNION_ROOM 3072 #define TRAINER_STEVEN_PARTNER 3075 #define TRAINER_PIC_HIKER 0 diff --git a/include/pokemon.h b/include/pokemon.h index 7ac65d36b..69ef7a142 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -279,8 +279,8 @@ void sub_80686FC(struct Pokemon *mon, struct BattleTowerPokemon *dest); void CreateObedientMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId); bool8 sub_80688F8(u8 caseId, u8 battlerId); void SetDeoxysStats(void); -u16 sub_8068B48(void); -u16 sub_8068BB0(void); +u16 GetUnionRoomTrainerPic(void); +u16 GetUnionRoomTrainerClass(void); void CreateObedientEnemyMon(void); void CalculateMonStats(struct Pokemon *mon); void BoxMonToMon(const struct BoxPokemon *src, struct Pokemon *dest); diff --git a/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_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/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/union_room.c b/src/union_room.c index 9687502b4..a13f57c79 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -4302,7 +4302,7 @@ static void ViewURoomPartnerTrainerCard(u8 *unused, struct WirelessLink_URoom *d DynamicPlaceholderTextUtil_Reset(); - StringCopy(data->field_C0[0], gTrainerClassNames[sub_8068BB0()]); + StringCopy(data->field_C0[0], gTrainerClassNames[GetUnionRoomTrainerClass()]); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, data->field_C0[0]); DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, trainerCard->playerName); diff --git a/src/union_room_battle.c b/src/union_room_battle.c index bb8d536ae..773f77b11 100644 --- a/src/union_room_battle.c +++ b/src/union_room_battle.c @@ -1,5 +1,4 @@ #include "global.h" -#include "defines.h" #include "battle.h" #include "task.h" #include "text.h" @@ -19,6 +18,7 @@ #include "link.h" #include "union_room.h" #include "union_room_battle.h" +#include "constants/rgb.h" #include "constants/trainers.h" struct UnionRoomBattle @@ -69,7 +69,7 @@ static void CB2_SetUpPartiesAndStartBattle(void) } IncrementGameStat(GAME_STAT_NUM_UNION_ROOM_BATTLES); CalculatePlayerPartyCount(); - gTrainerBattleOpponent_A = TRAINER_OPPONENT_C00; + gTrainerBattleOpponent_A = TRAINER_UNION_ROOM; SetMainCallback2(CB2_InitBattle); } @@ -150,7 +150,7 @@ void CB2_UnionRoomBattle(void) case 3: if (!UpdatePaletteFade()) { - memset(gBlockSendBuffer, 0, sizeof(gBlockSendBuffer)); + memset(gBlockSendBuffer, 0, 0x20); if (gSelectedOrderFromParty[0] == -gSelectedOrderFromParty[1]) { gBlockSendBuffer[0] = ACTIVITY_DECLINE | IN_UNION_ROOM; @@ -159,7 +159,7 @@ void CB2_UnionRoomBattle(void) { gBlockSendBuffer[0] = ACTIVITY_ACCEPT | IN_UNION_ROOM; } - SendBlock(0, gBlockSendBuffer, sizeof(gBlockSendBuffer)); + SendBlock(0, gBlockSendBuffer, 0x20); gMain.state++; } break; @@ -175,7 +175,7 @@ void CB2_UnionRoomBattle(void) else { sub_800AC34(); - if (gBlockRecvBuffer[GetMultiplayerId()][0] == (ACTIVITY_DECLINE | IN_UNION_ROOM))) + if (gBlockRecvBuffer[GetMultiplayerId()][0] == (ACTIVITY_DECLINE | IN_UNION_ROOM)) { gMain.state = 6; } -- cgit v1.2.3 From 3f97763181c486cf537ac187036b086e1f222cfc Mon Sep 17 00:00:00 2001 From: GriffinR Date: Wed, 3 Jun 2020 18:00:53 -0400 Subject: Document cable_club.c --- .../BattleFrontier_BattleTowerLobby/scripts.inc | 18 +- data/maps/LilycoveCity_ContestLobby/scripts.inc | 10 +- data/scripts/berry_blender.inc | 10 +- data/scripts/cable_club.inc | 32 +- data/specials.inc | 4 +- include/cable_club.h | 8 +- include/constants/cable_club.h | 18 + include/field_message_box.h | 2 +- include/link.h | 20 +- include/mevent2.h | 2 +- include/save.h | 2 +- include/start_menu.h | 4 +- include/strings.h | 2 +- include/union_room.h | 2 +- src/battle_controllers.c | 2 +- src/berry_crush.c | 4 +- src/cable_club.c | 752 +++++++++++---------- src/dodrio_berry_picking.c | 4 +- src/ereader_screen.c | 12 +- src/field_message_box.c | 2 +- src/field_screen_effect.c | 2 +- src/link.c | 43 +- src/link_rfu_2.c | 2 +- src/mevent2.c | 2 +- src/mystery_event_menu.c | 4 +- src/pokemon_jump.c | 4 +- src/record_mixing.c | 11 +- src/save.c | 50 +- src/start_menu.c | 74 +- src/strings.c | 2 +- src/trade.c | 8 +- src/union_room.c | 12 +- 32 files changed, 590 insertions(+), 534 deletions(-) diff --git a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc index 843cacef4..79e000bd3 100644 --- a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc @@ -786,19 +786,19 @@ BattleFrontier_BattleTowerLobby_EventScript_TryCableLink:: @ 823F2C5 setvar VAR_0x8005, 0 special TryBattleLinkup waitstate - compare VAR_RESULT, 1 + compare VAR_RESULT, LINKUP_SUCCESS goto_if_eq BattleFrontier_BattleTowerLobby_EventScript_CableLinkSuccessful - compare VAR_RESULT, 2 + compare VAR_RESULT, LINKUP_SOMEONE_NOT_READY goto_if_eq CableClub_EventScript_AbortLinkSomeoneNotReady - compare VAR_RESULT, 3 + compare VAR_RESULT, LINKUP_DIFF_SELECTIONS goto_if_eq BattleFrontier_BattleTowerLobby_EventScript_AbortLinkDifferentSelections - compare VAR_RESULT, 4 + compare VAR_RESULT, LINKUP_WRONG_NUM_PLAYERS goto_if_eq BattleFrontier_BattleTowerLobby_EventScript_AbortLinkIncorrectNumberOfPlayers - compare VAR_RESULT, 5 + compare VAR_RESULT, LINKUP_FAILED goto_if_eq BattleFrontier_BattleTowerLobby_EventScript_CancelChallenge - compare VAR_RESULT, 6 + compare VAR_RESULT, LINKUP_CONNECTION_ERROR goto_if_eq CableClub_EventScript_AbortLinkConnectionError - compare VAR_RESULT, 11 + compare VAR_RESULT, LINKUP_FAILED_BATTLE_TOWER goto_if_eq BattleFrontier_BattleTowerLobby_EventScript_AbortLink end @@ -853,7 +853,7 @@ BattleFrontier_BattleTowerLobby_EventScript_CableLinkSuccessful:: @ 823F3AF message BattleFrontier_BattleTowerLobby_Text_SaveGameBeforeShowingIn waitmessage tower_save CHALLENGE_STATUS_SAVING - special sub_80A08CC + special SaveForBattleTowerLink waitstate playse SE_SAVE waitse @@ -914,7 +914,7 @@ BattleFrontier_BattleTowerLobby_EventScript_WirelessLinkSuccessful:: @ 823F496 message BattleFrontier_BattleTowerLobby_Text_SaveGameBeforeShowingIn waitmessage tower_save CHALLENGE_STATUS_SAVING - special sub_80A08CC + special SaveForBattleTowerLink waitstate playse SE_SAVE waitse diff --git a/data/maps/LilycoveCity_ContestLobby/scripts.inc b/data/maps/LilycoveCity_ContestLobby/scripts.inc index 12b598346..70d4c106d 100644 --- a/data/maps/LilycoveCity_ContestLobby/scripts.inc +++ b/data/maps/LilycoveCity_ContestLobby/scripts.inc @@ -767,15 +767,15 @@ LilycoveCity_ContestLobby_EventScript_TrySetUpLinkContest:: @ 821AA15 call_if_eq LilycoveCity_ContestLobby_EventScript_TryLinkGMode compare VAR_TEMP_C, 2 goto_if_ge LilycoveCity_ContestLobby_EventScript_CancelLinkContest - compare VAR_RESULT, 4 + compare VAR_RESULT, LINKUP_WRONG_NUM_PLAYERS goto_if_eq LilycoveCity_ContestLobby_EventScript_CancelLinkDifferentChoices - compare VAR_RESULT, 3 + compare VAR_RESULT, LINKUP_DIFF_SELECTIONS goto_if_eq LilycoveCity_ContestLobby_EventScript_CancelLinkDifferentChoices - compare VAR_RESULT, 5 + compare VAR_RESULT, LINKUP_FAILED goto_if_eq LilycoveCity_ContestLobby_EventScript_CancelLinkContest - compare VAR_RESULT, 6 + compare VAR_RESULT, LINKUP_CONNECTION_ERROR goto_if_eq LilycoveCity_ContestLobby_EventScript_CancelLinkError - compare VAR_RESULT, 10 + compare VAR_RESULT, LINKUP_FAILED_CONTEST_GMODE goto_if_eq LilycoveCity_ContestLobby_EventScript_CancelLinkModeDifference message3 LilycoveCity_ContestLobby_Text_Transmitting contestlinktransfer diff --git a/data/scripts/berry_blender.inc b/data/scripts/berry_blender.inc index 975408daf..6501ce129 100644 --- a/data/scripts/berry_blender.inc +++ b/data/scripts/berry_blender.inc @@ -600,15 +600,15 @@ BerryBlender_EventScript_TryDoLinkBlender: @ 82940BB waitmessage special TryBerryBlenderLinkup waitstate - compare VAR_RESULT, 1 + compare VAR_RESULT, LINKUP_SUCCESS goto_if_eq BerryBlender_EventScript_SpawnLinkPartners - compare VAR_RESULT, 2 + compare VAR_RESULT, LINKUP_SOMEONE_NOT_READY goto_if_eq BerryBlender_EventScript_CloseLinkNotReady - compare VAR_RESULT, 3 + compare VAR_RESULT, LINKUP_DIFF_SELECTIONS goto_if_eq BerryBlender_EventScript_CloseLinkDifferentSelections - compare VAR_RESULT, 5 + compare VAR_RESULT, LINKUP_FAILED goto_if_eq BerryBlender_EventScript_CloseLink - compare VAR_RESULT, 6 + compare VAR_RESULT, LINKUP_CONNECTION_ERROR goto_if_eq BerryBlender_EventScript_LinkError end diff --git a/data/scripts/cable_club.inc b/data/scripts/cable_club.inc index f206fdd98..df14800cc 100644 --- a/data/scripts/cable_club.inc +++ b/data/scripts/cable_club.inc @@ -452,21 +452,21 @@ CableClub_EventScript_TradeCenter:: @ 82770B2 waitmessage special TryTradeLinkup waitstate - compare VAR_RESULT, 1 + compare VAR_RESULT, LINKUP_SUCCESS goto_if_eq CableClub_EventScript_EnterTradeCenter - compare VAR_RESULT, 2 + compare VAR_RESULT, LINKUP_SOMEONE_NOT_READY goto_if_eq CableClub_EventScript_AbortLinkSomeoneNotReady - compare VAR_RESULT, 3 + compare VAR_RESULT, LINKUP_DIFF_SELECTIONS goto_if_eq CableClub_EventScript_AbortLinkDifferentSelections - compare VAR_RESULT, 4 + compare VAR_RESULT, LINKUP_WRONG_NUM_PLAYERS goto_if_eq CableClub_EventScript_AbortLinkIncorrectNumberOfParticipants - compare VAR_RESULT, 5 + compare VAR_RESULT, LINKUP_FAILED goto_if_eq CableClub_EventScript_AbortLink - compare VAR_RESULT, 6 + compare VAR_RESULT, LINKUP_CONNECTION_ERROR goto_if_eq CableClub_EventScript_AbortLinkConnectionError - compare VAR_RESULT, 7 + compare VAR_RESULT, LINKUP_PLAYER_NOT_READY goto_if_eq CableClub_EventScript_AbortLinkPlayerNotReady - compare VAR_RESULT, 9 + compare VAR_RESULT, LINKUP_PARTNER_NOT_READY goto_if_eq CableClub_EventScript_AbortLinkOtherTrainerNotReady end @@ -527,21 +527,21 @@ CableClub_EventScript_RecordCorner:: @ 82771DB waitmessage special TryRecordMixLinkup waitstate - special sub_80B2EA8 + special ValidateMixingGameLanguage waitstate - compare VAR_RESULT, 12 + compare VAR_RESULT, LINKUP_FOREIGN_GAME goto_if_eq CableClub_EventScript_AbortLinkForeignGame - compare VAR_RESULT, 1 + compare VAR_RESULT, LINKUP_SUCCESS goto_if_eq CableClub_EventScript_EnterRecordCorner - compare VAR_RESULT, 2 + compare VAR_RESULT, LINKUP_SOMEONE_NOT_READY goto_if_eq CableClub_EventScript_AbortLinkSomeoneNotReady - compare VAR_RESULT, 3 + compare VAR_RESULT, LINKUP_DIFF_SELECTIONS goto_if_eq CableClub_EventScript_AbortLinkDifferentSelections - compare VAR_RESULT, 4 + compare VAR_RESULT, LINKUP_WRONG_NUM_PLAYERS goto_if_eq CableClub_EventScript_AbortLinkIncorrectNumberOfParticipants - compare VAR_RESULT, 5 + compare VAR_RESULT, LINKUP_FAILED goto_if_eq CableClub_EventScript_AbortLink - compare VAR_RESULT, 6 + compare VAR_RESULT, LINKUP_CONNECTION_ERROR goto_if_eq CableClub_EventScript_AbortLinkConnectionError end diff --git a/data/specials.inc b/data/specials.inc index 3cbffb365..5d48e62f9 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -39,7 +39,7 @@ gSpecials:: @ 81DBA64 def_special TryBattleLinkup def_special TryTradeLinkup def_special TryRecordMixLinkup - def_special sub_80B2EA8 + def_special ValidateMixingGameLanguage def_special CloseLink def_special ColosseumPlayerSpotTriggered def_special PlayerEnteredTradeSeat @@ -502,7 +502,7 @@ gSpecials:: @ 81DBA64 def_special CreateAbnormalWeatherEvent def_special GetAbnormalWeatherMapNameAndType def_special GetMartEmployeeObjectEventId - def_special sub_80A08CC + def_special SaveForBattleTowerLink def_special Unused_SetWeatherSunny def_special SetUnlockedPokedexFlags def_special IsTrainerRegistered diff --git a/include/cable_club.h b/include/cable_club.h index 72e344009..515960dfd 100644 --- a/include/cable_club.h +++ b/include/cable_club.h @@ -9,12 +9,12 @@ // Exported ROM declarations -void sub_80B37D4(TaskFunc taskFunc); -u8 sub_80B3050(void); +void CreateTask_EnterCableClubSeat(TaskFunc taskFunc); +u8 CreateTask_ReestablishCableClubLink(void); void CB2_ReturnFromCableClubBattle(void); -bool32 sub_80B2AF4(u16 *arg0, u16 *arg1); +bool32 AreBattleTowerLinkSpeciesSame(u16 *speciesList1, u16 *speciesList2); void sub_80B3AF8(u8 taskId); -void task00_08081A90(u8 taskId); +void Task_WaitForLinkPlayerConnection(u8 taskId); bool32 GetLinkTrainerCardColor(u8 linkPlayerIndex); #endif //GUARD_CABLE_CLUB_H diff --git a/include/constants/cable_club.h b/include/constants/cable_club.h index f2aa4120c..960a27644 100644 --- a/include/constants/cable_club.h +++ b/include/constants/cable_club.h @@ -12,4 +12,22 @@ #define USING_MINIGAME 8 #define USING_BATTLE_TOWER 9 +#define LINKUP_ONGOING 0 +#define LINKUP_SUCCESS 1 +#define LINKUP_SOMEONE_NOT_READY 2 +#define LINKUP_DIFF_SELECTIONS 3 +#define LINKUP_WRONG_NUM_PLAYERS 4 +#define LINKUP_FAILED 5 +#define LINKUP_CONNECTION_ERROR 6 +#define LINKUP_PLAYER_NOT_READY 7 +#define LINKUP_UNK8 8 +#define LINKUP_PARTNER_NOT_READY 9 +#define LINKUP_FAILED_CONTEST_GMODE 10 +#define LINKUP_FAILED_BATTLE_TOWER 11 +#define LINKUP_FOREIGN_GAME 12 + +#define LINK_BATTLE_TOWER_SAME_MON 1 +#define LINK_BATTLE_TOWER_SAME_MONS 2 +#define LINK_BATTLE_TOWER_DIFF_MODE 3 + #endif //GUARD_CONSTANTS_CABLE_CLUB_H diff --git a/include/field_message_box.h b/include/field_message_box.h index 58f782d9c..7bd2a0dca 100644 --- a/include/field_message_box.h +++ b/include/field_message_box.h @@ -16,7 +16,7 @@ bool8 ShowFieldAutoScrollMessage(const u8 *message); void HideFieldMessageBox(void); bool8 IsFieldMessageBoxHidden(void); u8 GetFieldMessageBoxMode(void); -void sub_8098374(void); +void StopFieldMessage(void); void InitFieldMessageBox(void); #endif // GUARD_FIELD_MESSAGE_BOX_H diff --git a/include/link.h b/include/link.h index 2818b3a7c..5e75af088 100644 --- a/include/link.h +++ b/include/link.h @@ -73,10 +73,10 @@ #define LINKCMD_CANCEL_TRADE 0xEEBB #define LINKCMD_0xEECC 0xEECC -#define LINKTYPE_0x1111 0x1111 // trade -#define LINKTYPE_0x1122 0x1122 // trade -#define LINKTYPE_0x1133 0x1133 // trade -#define LINKTYPE_0x1144 0x1144 // trade +#define LINKTYPE_TRADE 0x1111 +#define LINKTYPE_TRADE_CONNECTING 0x1122 +#define LINKTYPE_TRADE_SETUP 0x1133 +#define LINKTYPE_TRADE_DISCONNECTED 0x1144 #define LINKTYPE_BATTLE 0x2211 #define LINKTYPE_0x2222 0x2222 // unused battle? #define LINKTYPE_SINGLE_BATTLE 0x2233 @@ -85,13 +85,13 @@ #define LINKTYPE_BATTLE_TOWER_50 0x2266 #define LINKTYPE_BATTLE_TOWER_OPEN 0x2277 #define LINKTYPE_BATTLE_TOWER 0x2288 -#define LINKTYPE_0x3311 0x3311 -#define LINKTYPE_0x3322 0x3322 +#define LINKTYPE_RECORD_MIX_BEFORE 0x3311 +#define LINKTYPE_RECORD_MIX_AFTER 0x3322 #define LINKTYPE_BERRY_BLENDER_SETUP 0x4411 #define LINKTYPE_BERRY_BLENDER 0x4422 -#define LINKTYPE_0x5501 0x5501 // mystery event +#define LINKTYPE_MYSTERY_EVENT 0x5501 #define LINKTYPE_0x5502 0x5502 // unused? -#define LINKTYPE_0x5503 0x5503 // eReader +#define LINKTYPE_EREADER 0x5503 #define LINKTYPE_CONTEST_GMODE 0x6601 #define LINKTYPE_CONTEST_EMODE 0x6602 @@ -126,10 +126,10 @@ enum EXCHANGE_NOT_STARTED, EXCHANGE_COMPLETE, EXCHANGE_TIMED_OUT, - EXCHANGE_IN_PROGRESS, + EXCHANGE_DIFF_SELECTIONS, EXCHANGE_PLAYER_NOT_READY, EXCHANGE_PARTNER_NOT_READY, - EXCHANGE_STAT_6, + EXCHANGE_WRONG_NUM_PLAYERS, EXCHANGE_STAT_7 }; diff --git a/include/mevent2.h b/include/mevent2.h index 80b1fd51b..316a9e6de 100644 --- a/include/mevent2.h +++ b/include/mevent2.h @@ -1,6 +1,6 @@ #ifndef GUARD_MEVENT2_H #define GUARD_MEVENT2_H -void sub_801B990(u32, u32); +void RecordIdOfWonderCardSenderByEventType(u32, u32); #endif //GUARD_MEVENT2_H diff --git a/include/save.h b/include/save.h index 225b2b62c..18b57502b 100644 --- a/include/save.h +++ b/include/save.h @@ -102,7 +102,7 @@ u8 Save_LoadGameData(u8 saveType); u16 sub_815355C(void); u32 TryReadSpecialSaveSection(u8 sector, u8* dst); u32 TryWriteSpecialSaveSection(u8 sector, u8* src); -void sub_8153688(u8 taskId); +void Task_LinkSave(u8 taskId); // save_failed_screen.c void DoSaveFailedScreen(u8 saveType); diff --git a/include/start_menu.h b/include/start_menu.h index df2a290a2..1ddd82066 100644 --- a/include/start_menu.h +++ b/include/start_menu.h @@ -8,8 +8,8 @@ void Task_ShowStartMenu(u8 taskId); void ShowStartMenu(void); void ShowBattlePyramidStartMenu(void); void SaveGame(void); -void sub_80A0514(void); -void sub_80A08CC(void); +void CB2_SetUpSaveAfterLinkBattle(void); +void SaveForBattleTowerLink(void); void HideStartMenu(void); void AppendToList(u8* list, u8* pos, u8 newEntry); diff --git a/include/strings.h b/include/strings.h index dc3653163..1867f0ca4 100644 --- a/include/strings.h +++ b/include/strings.h @@ -962,7 +962,7 @@ extern const u8 gText_TwoDashes[]; extern const u8 *const gReturnToXStringsTable2[]; -extern const u8 gText_XPLink[]; +extern const u8 gText_NumPlayerLink[]; extern const u8 gText_ConfirmLinkWhenPlayersReady[]; extern const u8 gText_ConfirmStartLinkWithXPlayers[]; extern const u8 gText_AwaitingLinkup[]; diff --git a/include/union_room.h b/include/union_room.h index 4cdb17662..7c48a9506 100644 --- a/include/union_room.h +++ b/include/union_room.h @@ -161,7 +161,7 @@ extern u8 gUnionRoomRequestedMonType; // Exported ROM declarations -u8 CreateTask_ReturnFromLinkTrade(void); +u8 CreateTask_CreateTradeMenu(void); void nullsub_89(u8 taskId); void var_800D_set_xB(void); void MEvent_CreateTask_CardOrNewsWithFriend(u32 arg0); diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 43bd9fce6..a0e9e4416 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -36,7 +36,7 @@ void HandleLinkBattleSetup(void) SetWirelessCommType1(); if (!gReceivedRemoteLinkPlayers) OpenLink(); - CreateTask(task00_08081A90, 0); + CreateTask(Task_WaitForLinkPlayerConnection, 0); CreateTasksForSendRecvLinkBuffers(); } } diff --git a/src/berry_crush.c b/src/berry_crush.c index 3ff3156e6..6bc97fad0 100755 --- a/src/berry_crush.c +++ b/src/berry_crush.c @@ -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 2a53c64b2..ffd7bcd8f 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]); + 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,69 +302,71 @@ 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 { @@ -363,43 +377,44 @@ static void sub_80B2918(u8 taskId) 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 { @@ -410,90 +425,95 @@ static void sub_80B2A08(u8 taskId) 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()) @@ -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]); - sub_8098374(); - RemoveWindow(gTasks[taskId].data[5]); + gSpecialVar_Result = LINKUP_FAILED; + ClearLinkPlayerCountWindow(gTasks[taskId].tWindowId); + StopFieldMessage(); + 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,36 +766,36 @@ 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) @@ -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,7 +871,7 @@ static void sub_80B32B4(u8 taskId) SetLinkBattleTypeFlags(gSpecialVar_0x8004); CleanupOverworldWindowsAndTilemaps(); - gTrainerBattleOpponent_A = 0x800; + gTrainerBattleOpponent_A = TRAINER_LINK_OPPONENT; SetMainCallback2(CB2_InitBattle); gMain.savedCallback = CB2_ReturnFromCableClubBattle; DestroyTask(taskId); @@ -855,26 +879,26 @@ static void sub_80B32B4(u8 taskId) } } -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()) @@ -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,7 +937,7 @@ 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 = CB2_ReturnFromCableClubBattle; DestroyTask(taskId); @@ -921,46 +945,48 @@ static void sub_80B33BC(u8 taskId) } } -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(); } @@ -980,26 +1006,22 @@ void CB2_ReturnFromCableClubBattle(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()) { - CreateTask_ReturnFromLinkTrade(); + 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,6 +1233,7 @@ void task00_08081A90(u8 taskId) if (gReceivedRemoteLinkPlayers) { + // Players connected, destroy task if (gWirelessCommType == 0) { if (!sub_800AA60()) @@ -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/dodrio_berry_picking.c b/src/dodrio_berry_picking.c index 1eaedfd64..ccb1e28eb 100644 --- a/src/dodrio_berry_picking.c +++ b/src/dodrio_berry_picking.c @@ -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/field_message_box.c b/src/field_message_box.c index be76b0c19..da5042221 100755 --- a/src/field_message_box.c +++ b/src/field_message_box.c @@ -148,7 +148,7 @@ void sub_8098358(void) sFieldMessageBoxMode = 0; } -void sub_8098374(void) +void StopFieldMessage(void) { task_del_textbox(); sFieldMessageBoxMode = 0; diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index ea9429ce8..a4d6dd6c9 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: diff --git a/src/link.c b/src/link.c index abd9715dd..6647cda8c 100644 --- a/src/link.c +++ b/src/link.c @@ -282,7 +282,7 @@ void LinkTestScreen(void) ResetTasks(); SetVBlankCallback(sub_80096BC); ResetBlockSend(); - gLinkType = LINKTYPE_0x1111; + gLinkType = LINKTYPE_TRADE; OpenLink(); SeedRng(gMain.vblankCounter2); for (i = 0; i < MAX_LINK_PLAYERS; i++) @@ -826,23 +826,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 +860,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 +882,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 +924,7 @@ bool8 IsLinkPlayerDataExchangeComplete(void) else { retval = FALSE; - sPlayerDataExchangeStatus = EXCHANGE_IN_PROGRESS; + sPlayerDataExchangeStatus = EXCHANGE_DIFF_SELECTIONS; } return retval; } diff --git a/src/link_rfu_2.c b/src/link_rfu_2.c index e13e0d4e1..0d69f9281 100644 --- a/src/link_rfu_2.c +++ b/src/link_rfu_2.c @@ -2408,7 +2408,7 @@ void sub_8011AFC(void) SetVBlankCallback(sub_8011AE8); if (IsWirelessAdapterConnected()) { - gLinkType = LINKTYPE_0x1111; + gLinkType = LINKTYPE_TRADE; SetWirelessCommType1(); OpenLink(); SeedRng(gMain.vblankCounter2); diff --git a/src/mevent2.c b/src/mevent2.c index 3e524ce35..7a2edc7f5 100755 --- a/src/mevent2.c +++ b/src/mevent2.c @@ -569,7 +569,7 @@ bool32 MEventHandleReceivedWonderCard(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/pokemon_jump.c b/src/pokemon_jump.c index da8695247..acfd4d545 100755 --- a/src/pokemon_jump.c +++ b/src/pokemon_jump.c @@ -1148,12 +1148,12 @@ static bool32 sub_802B720(void) case 2: if (sub_802C70C()) { - 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++; diff --git a/src/record_mixing.c b/src/record_mixing.c index 3a93d72f8..274a82e10 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 @@ -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; @@ -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/start_menu.c b/src/start_menu.c index 4b6fce57b..781774f62 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); @@ -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); @@ -1239,35 +1239,35 @@ static void sub_80A0550(u8 taskId) { if (sub_800A07C()) { - *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 3ba01b0f0..f01ab8ec6 100644 --- a/src/strings.c +++ b/src/strings.c @@ -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 c9fd7b1ed..624f6eae9 100644 --- a/src/trade.c +++ b/src/trade.c @@ -389,7 +389,7 @@ static void CB2_CreateTradeMenu(void) if (!gReceivedRemoteLinkPlayers) { - gLinkType = LINKTYPE_0x1122; + gLinkType = LINKTYPE_TRADE_CONNECTING; sTradeMenuData->timer = 0; if (gWirelessCommType) @@ -402,7 +402,7 @@ static void CB2_CreateTradeMenu(void) { OpenLink(); gMain.state++; - CreateTask(task00_08081A90, 1); + CreateTask(Task_WaitForLinkPlayerConnection, 1); } } else @@ -2750,7 +2750,7 @@ void CB2_LinkTrade(void) case 0: if (!gReceivedRemoteLinkPlayers) { - gLinkType = LINKTYPE_0x1144; + gLinkType = LINKTYPE_TRADE_DISCONNECTED; CloseLink(); } sTradeData = AllocZeroed(sizeof(*sTradeData)); @@ -4597,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 a13f57c79..8f49add80 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -1298,15 +1298,15 @@ static u8 GetNewLeaderCandidate(void) return ret; } -static void Task_ReturnFromLinkTrade(u8 taskId) +static void Task_CreateTradeMenu(u8 taskId) { CB2_StartCreateTradeMenu(); DestroyTask(taskId); } -u8 CreateTask_ReturnFromLinkTrade(void) +u8 CreateTask_CreateTradeMenu(void) { - u8 taskId = CreateTask(Task_ReturnFromLinkTrade, 0); + u8 taskId = CreateTask(Task_CreateTradeMenu, 0); return taskId; } @@ -1589,7 +1589,7 @@ static void Task_RunScriptAndFadeToActivity(u8 taskId) switch (data[0]) { case 0: - gSpecialVar_Result = 1; + gSpecialVar_Result = LINKUP_SUCCESS; switch (gPlayerCurrActivity) { case ACTIVITY_BATTLE_TOWER: @@ -1655,9 +1655,9 @@ static void Task_RunScriptAndFadeToActivity(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 -- cgit v1.2.3 From e6f5c4f264520dde185691201df76830c2d2f1cb Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sat, 6 Jun 2020 16:46:19 -0400 Subject: Sync link_rfu_2.c --- include/cable_club.h | 6 - include/constants/cable_club.h | 28 +- include/link.h | 5 +- include/link_rfu.h | 170 ++-- include/union_room.h | 1 - src/battle_controllers.c | 3 +- src/berry_blender.c | 2 +- src/berry_crush.c | 6 +- src/field_screen_effect.c | 2 +- src/librfu_rfu.c | 4 +- src/link.c | 137 +-- src/link_rfu_2.c | 2022 +++++++++++++++++++++------------------- src/link_rfu_3.c | 56 +- src/main.c | 2 +- src/overworld.c | 2 +- src/pokemon_jump.c | 10 +- src/trade.c | 4 +- src/union_room.c | 14 +- 18 files changed, 1266 insertions(+), 1208 deletions(-) diff --git a/include/cable_club.h b/include/cable_club.h index 515960dfd..7340742ea 100644 --- a/include/cable_club.h +++ b/include/cable_club.h @@ -3,12 +3,6 @@ #include "task.h" -// Exported type declarations - -// Exported RAM declarations - -// Exported ROM declarations - void CreateTask_EnterCableClubSeat(TaskFunc taskFunc); u8 CreateTask_ReestablishCableClubLink(void); void CB2_ReturnFromCableClubBattle(void); diff --git a/include/constants/cable_club.h b/include/constants/cable_club.h index 960a27644..3250ce6f8 100644 --- a/include/constants/cable_club.h +++ b/include/constants/cable_club.h @@ -12,22 +12,18 @@ #define USING_MINIGAME 8 #define USING_BATTLE_TOWER 9 -#define LINKUP_ONGOING 0 -#define LINKUP_SUCCESS 1 -#define LINKUP_SOMEONE_NOT_READY 2 -#define LINKUP_DIFF_SELECTIONS 3 -#define LINKUP_WRONG_NUM_PLAYERS 4 -#define LINKUP_FAILED 5 -#define LINKUP_CONNECTION_ERROR 6 -#define LINKUP_PLAYER_NOT_READY 7 -#define LINKUP_UNK8 8 -#define LINKUP_PARTNER_NOT_READY 9 +#define LINKUP_ONGOING 0 +#define LINKUP_SUCCESS 1 +#define LINKUP_SOMEONE_NOT_READY 2 +#define LINKUP_DIFF_SELECTIONS 3 +#define LINKUP_WRONG_NUM_PLAYERS 4 +#define LINKUP_FAILED 5 +#define LINKUP_CONNECTION_ERROR 6 +#define LINKUP_PLAYER_NOT_READY 7 +#define LINKUP_UNK8 8 +#define LINKUP_PARTNER_NOT_READY 9 #define LINKUP_FAILED_CONTEST_GMODE 10 -#define LINKUP_FAILED_BATTLE_TOWER 11 -#define LINKUP_FOREIGN_GAME 12 - -#define LINK_BATTLE_TOWER_SAME_MON 1 -#define LINK_BATTLE_TOWER_SAME_MONS 2 -#define LINK_BATTLE_TOWER_DIFF_MODE 3 +#define LINKUP_FAILED_BATTLE_TOWER 11 +#define LINKUP_FOREIGN_GAME 12 #endif //GUARD_CONSTANTS_CABLE_CLUB_H diff --git a/include/link.h b/include/link.h index 5e75af088..d33b84c79 100644 --- a/include/link.h +++ b/include/link.h @@ -276,7 +276,6 @@ void CreateWirelessStatusIndicatorSprite(u8, u8); void sub_800ADF8(void); void SetWirelessCommType1(void); void CheckShouldAdvanceLinkState(void); -void sub_8011BD0(void); u8 IsLinkMaster(void); void sub_800AC34(void); bool8 HandleLinkConnection(void); @@ -288,11 +287,11 @@ u8 GetSioMultiSI(void); void sub_800AAF4(void); void sub_800AF18(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06); void sub_800B348(void); -void sub_800B3A4(u32 who); +void LinkPlayerFromBlock(u32 who); bool32 sub_800A07C(void); void ResetLinkPlayerCount(void); void sub_800AA04(u8 a0); -void sub_800B4C0(void); +void SetWirelessCommType0(void); bool32 sub_800B504(void); extern u16 gLinkPartnersHeldKeys[6]; diff --git a/include/link_rfu.h b/include/link_rfu.h index 901b5deae..55b1b3712 100644 --- a/include/link_rfu.h +++ b/include/link_rfu.h @@ -5,7 +5,18 @@ #include "link.h" #include "AgbRfu_LinkManager.h" -// Exported type declarations +#define RFU_COMMAND_0x4400 0x4400 +#define RFU_COMMAND_0x8800 0x8800 +#define RFU_COMMAND_0x8900 0x8900 +#define RFU_COMMAND_0xA100 0xA100 +#define RFU_COMMAND_0x7700 0x7700 +#define RFU_COMMAND_0x7800 0x7800 +#define RFU_COMMAND_0x6600 0x6600 +#define RFU_COMMAND_0x5F00 0x5F00 +#define RFU_COMMAND_0x2F00 0x2F00 +#define RFU_COMMAND_0xBE00 0xBE00 +#define RFU_COMMAND_0xEE00 0xEE00 +#define RFU_COMMAND_0xED00 0xED00 // RfuTgtData.gname is read as these structs. struct GFtgtGnameSub @@ -67,34 +78,34 @@ struct UnkLinkRfuStruct_02022B44 u8 fill_84[0x58]; }; -struct UnkRfuStruct_2_Sub_6c +struct RfuBlockSend { - /* 0x00 */ u16 unk_00; - /* 0x02 */ u16 unk_02; - /* 0x04 */ const u8 *unk_04; - /* 0x08 */ u32 unk_08; - /* 0x0c */ u32 unk_0c; - /* 0x10 */ u8 unk_10; - /* 0x11 */ u8 unk_11; - /* 0x12 */ u8 unk_12; + /* 0x00 */ u16 next; + /* 0x02 */ u16 count; + /* 0x04 */ const u8 *payload; + /* 0x08 */ u32 receivedFlags; + /* 0x0c */ u32 failedFlags; + /* 0x10 */ bool8 sending; + /* 0x11 */ u8 owner; + /* 0x12 */ u8 receiving; }; -struct UnkRfuStruct_2_Sub_124 +struct RfuRecvQueue { /* 0x000 */ u8 unk_00[32][70]; /* 0x8c0 */ vu8 unk_8c0; /* 0x8c1 */ vu8 unk_8c1; - /* 0x8c2 */ vu8 unk_8c2; - /* 0x8c3 */ vu8 unk_8c3; + /* 0x8c2 */ vu8 count; + /* 0x8c3 */ vu8 full; }; -struct UnkRfuStruct_2_Sub_9e8 +struct RfuSendQueue { /* 0x000 */ u8 unk_00[40][14]; /* 0x230 */ vu8 unk_230; /* 0x231 */ vu8 unk_231; - /* 0x232 */ vu8 unk_232; - /* 0x233 */ vu8 unk_233; + /* 0x232 */ vu8 count; + /* 0x233 */ vu8 full; }; struct UnkRfuStruct_2_Sub_c1c @@ -102,7 +113,7 @@ struct UnkRfuStruct_2_Sub_c1c /* 0x00 */ u8 unk_00[2][14]; /* 0x1c */ vu8 unk_1c; /* 0x1d */ vu8 unk_1d; - /* 0x1e */ vu8 unk_1e; + /* 0x1e */ vu8 count; }; struct UnkRfuStruct_Sub_Unused @@ -114,13 +125,13 @@ struct UnkRfuStruct_Sub_Unused /* 0x203 */ vu8 unk_203; }; -struct UnkRfuStruct_2 +struct GFRfuManager { - /* 0x000 */ void (*linkRfuCallback)(void); - /* 0x004 */ u16 unk_04; + /* 0x000 */ void (*callback)(void); + /* 0x004 */ u16 state; /* 0x006 */ u8 filler_06[4]; - /* 0x00a */ u16 unk_0a; - /* 0x00c */ u8 unk_0c; + /* 0x00a */ u16 linkmanMsg; + /* 0x00c */ u8 parentChild; /* 0x00d */ u8 playerCount; /* 0x00e */ u8 unk_0e; /* 0x00f */ u8 unk_0f; @@ -130,19 +141,19 @@ struct UnkRfuStruct_2 /* 0x04c */ u8 unk_4c[14]; /* 0x05a */ u8 unk_5a; /* 0x05b */ u8 unk_5b; - /* 0x05c */ u8 unk_5c[5]; - /* 0x061 */ u8 unk_61[5]; - /* 0x066 */ u8 unk_66; - /* 0x067 */ u8 unk_67; + /* 0x05c */ bool8 unk_5c[MAX_RFU_PLAYERS]; + /* 0x061 */ bool8 unk_61[MAX_RFU_PLAYERS]; + /* 0x066 */ u8 idleTaskId; + /* 0x067 */ u8 searchTaskId; /* 0x068 */ u8 filler_68[4]; - /* 0x06c */ struct UnkRfuStruct_2_Sub_6c unk_6c; - /* 0x080 */ struct UnkRfuStruct_2_Sub_6c unk_80[5]; + /* 0x06c */ struct RfuBlockSend unk_6c; + /* 0x080 */ struct RfuBlockSend unk_80[MAX_RFU_PLAYERS]; /* 0x0e4 */ u8 unk_e4[5]; /* 0x0e9 */ u8 unk_e9[5]; - /* 0x0ee */ vu8 unk_ee; - /* 0x0ef */ u8 unk_ef; - /* 0x0f0 */ u8 unk_f0; - /* 0x0f1 */ u8 unk_f1; + /* 0x0ee */ vu8 errorState; + /* 0x0ef */ bool8 isShuttingDown; + /* 0x0f0 */ u8 linkLossRecoveryState; + /* 0x0f1 */ u8 errorStatus; /* 0x0f2 */ u16 unk_f2[6]; /* 0x0fe */ u16 unk_fe; /* 0x100 */ u16 unk_100; @@ -151,18 +162,18 @@ struct UnkRfuStruct_2 /* 0x10A */ struct GFtgtGname unk_10A; u8 filler_; u8 playerName[PLAYER_NAME_LENGTH + 1]; - /* 0x124 */ struct UnkRfuStruct_2_Sub_124 unk_124; - /* 0x9e8 */ struct UnkRfuStruct_2_Sub_9e8 unk_9e8; + /* 0x124 */ struct RfuRecvQueue recvQueue; + /* 0x9e8 */ struct RfuSendQueue sendQueue; /* 0xc1c */ struct UnkRfuStruct_2_Sub_c1c unk_c1c; /* 0xc3c */ vu8 unk_c3c; /* 0xc3d */ u8 unk_c3d; - /* 0xc3e */ vu8 unk_c3e; + /* 0xc3e */ vu8 childSlot; /* 0xc3f */ u8 unk_c3f[70]; /* 0xc85 */ u8 unk_c85; /* 0xc86 */ u8 unk_c86; - /* 0xc87 */ u8 unk_c87[5][7][2]; - /* 0xccd */ u8 unk_ccd; - /* 0xcce */ u8 unk_cce; + /* 0xc87 */ u8 recvCmds[5][7][2]; + /* 0xccd */ u8 parentId; + /* 0xcce */ u8 multiplayerId; /* 0xccf */ u8 unk_ccf; /* 0xcd0 */ vu8 unk_cd0; /* 0xcd1 */ u8 unk_cd1[4]; @@ -172,57 +183,48 @@ struct UnkRfuStruct_2 /* 0xcdb */ vu8 unk_cdb; /* 0xcdc */ vu8 unk_cdc; /* 0xcdd */ u8 unk_cdd; - /* 0xcde */ u8 unk_cde[4]; + /* 0xcde */ u8 linkPlayerIdx[RFU_CHILD_MAX]; /* 0xce2 */ u8 unk_ce2; /* 0xce2 */ u8 unk_ce3; /* 0xce4 */ u8 unk_ce4; /* 0xce5 */ u8 unk_ce5; /* 0xce5 */ u8 unk_ce6; - /* 0xce7 */ u8 unk_ce7; + /* 0xce7 */ u8 acceptSlot_flag; /* 0xce8 */ u8 unk_ce8; /* 0xce9 */ u8 unk_ce9; /* 0xcea */ u8 unk_cea[4]; /* 0xcee */ u8 unk_cee[4]; }; // size = 0xcf4 -struct UnkRfuStruct_8010A14 -{ - char unk_00[15]; - u8 unk_0f; - u8 unk_10[4]; - struct LinkPlayer unk_14[5]; - u8 fill_a0[0x5c]; -}; - // Exported RAM declarations -extern struct GFtgtGname gUnknown_02022B14; -extern u8 gUnknown_02022B22[]; -extern struct UnkRfuStruct_2 Rfu; +extern struct GFtgtGname gHostRFUtgtGnameBuffer; +extern u8 gHostRFUtgtUnameBuffer[]; +extern struct GFRfuManager Rfu; extern u8 gWirelessStatusIndicatorSpriteId; // Exported ROM declarations void WipeTrainerNameRecords(void); void sub_800E700(void); void LinkRfu_Shutdown(void); -void sub_800F6FC(u8 who); -void sub_800F728(u8 who); +void Rfu_SetBlockReceivedFlag(u8 who); +void Rfu_ResetBlockReceivedFlag(u8 who); bool32 IsSendingKeysToRfu(void); -void sub_800F804(void); +void StartSendingKeysToRfu(void); void sub_800F850(void); -u8 sub_800FCD8(void); -bool32 sub_800FE84(const u8 *src, size_t size); +u8 Rfu_GetBlockReceivedStatus(void); +bool32 Rfu_InitBlockSend(const u8 *src, size_t size); void ClearLinkRfuCallback(void); -u8 sub_80104F4(void); -u8 rfu_get_multiplayer_id(void); +u8 Rfu_GetLinkPlayerCount(void); +u8 Rfu_GetMultiplayerId(void); bool8 sub_8010100(u8 a0); bool8 IsLinkRfuTaskFinished(void); bool8 Rfu_IsMaster(void); void task_add_05_task_del_08FA224_when_no_RfuFunc(void); void sub_8010434(void); -void sub_800E604(void); +void ResetLinkRfuGFLayer(void); void sub_800E174(void); -void sub_800E6D0(void); +void InitRFU(void); bool32 sub_8010EC0(void); bool32 sub_8010F1C(void); bool32 RfuIsErrorStatus1or2(void); @@ -233,7 +235,7 @@ void sub_80111B0(bool32 a0); u8 RfuGetErrorStatus(void); struct GFtgtGname *GetHostRFUtgtGname(void); void UpdateGameData_GroupLockedIn(u8 a0); -void sub_8011170(u32 a0); +void GetLinkmanErrorParams(u32 a0); void RfuSetErrorStatus(u8 a0, u16 a1); u8 sub_801048C(bool32 a0); void LinkRfu3_SetGnameUnameFromStaticBuffers(struct GFtgtGname *buff1, u8 *buff2); @@ -259,7 +261,7 @@ void UpdateGameDataWithActivitySpriteGendersFlag(u8 a0, u32 a1, u32 a2); void CreateTask_RfuReconnectWithParent(const u8 *src, u16 trainerId); void SetGnameBufferWonderFlags(bool32 a0, bool32 a1); void ClearAndInitHostRFUtgtGname(void); -void sub_8010FCC(u32 a0, u32 a1, u32 a2); +void SetTradeBoardRegisteredMonInfo(u32 type, u32 species, u32 level); void InitializeRfuLinkManager_EnterUnionRoom(void); void sub_8012188(const u8 *name, struct GFtgtGname *structPtr, u8 a2); bool32 IsUnionRoomListenTaskActive(void); @@ -271,7 +273,8 @@ void sub_800EF7C(void); bool8 LinkRfu_GetNameIfCompatible(struct GFtgtGname *buff1, u8 *buff2, u8 idx); bool8 LinkRfu_GetNameIfSerial7F7D(struct GFtgtGname *buff1, u8 *buff2, u8 idx); s32 sub_800E87C(u8 idx); -void sub_8011BA4(void); +void CreateTask_RfuIdle(void); +void DestroyTask_RfuIdle(void); void sub_8010198(void); void sub_8011AC8(void); void LinkRfu_FatalError(void); @@ -280,42 +283,17 @@ void sub_80104B0(void); void sub_8011A50(void); void sub_80110B8(u32 a0); bool8 sub_800DAC8(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2); -void sub_800EAB4(void); -void sub_800EAFC(void); void sub_800ED34(u16 unused); -void sub_800EDBC(u16 unused); -void sub_800F048(void); -void sub_800F86C(u8 unused); -void sub_800FCC4(struct UnkRfuStruct_2_Sub_6c *data); -void sub_800FD14(u16 command); -void rfufunc_80F9F44(void); -void sub_800FFB0(void); -void rfufunc_80FA020(void); -bool32 sub_8010454(u32 a0); -void sub_8010528(void); -void sub_8010750(void); -s32 sub_80107A0(void); -void sub_801084C(u8 taskId); -void sub_80109E8(u16 a0); -void sub_8010A70(void *a0); -void sub_8010AAC(u8 taskId); -void sub_8010D0C(u8 taskId); -void sub_80115EC(s32 a0); -u8 sub_8011CE4(const u8 *a0, u16 a1); -void sub_8011D6C(u32 a0); -void sub_8011E94(u32 a0, u32 a1); +bool32 RfuSerialNumberIsValid(u32 serialNo); bool8 sub_8012224(void); -void sub_801227C(void); -void sub_801209C(u8 taskId); -void sub_8011BF8(void); void sub_8011BA4(void); -void sub_800D6C8(struct UnkRfuStruct_2_Sub_124 *ptr); -void sub_800D724(struct UnkRfuStruct_2_Sub_9e8 *ptr); +void sub_800D6C8(struct RfuRecvQueue *ptr); +void sub_800D724(struct RfuSendQueue *ptr); void sub_800D780(struct UnkRfuStruct_Sub_Unused *ptr); -void sub_800D7D8(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2); -void sub_800D888(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2); -bool8 sub_800D934(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2); -bool8 sub_800D9DC(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2); +void sub_800D7D8(struct RfuRecvQueue *q1, u8 *q2); +void sub_800D888(struct RfuSendQueue *q1, u8 *q2); +bool8 sub_800D934(struct RfuRecvQueue *q1, u8 *q2); +bool8 sub_800D9DC(struct RfuSendQueue *q1, u8 *q2); void sub_800DA68(struct UnkRfuStruct_2_Sub_c1c *q1, const u8 *q2); bool8 sub_800DAC8(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2); void sub_800DB18(struct UnkRfuStruct_Sub_Unused *q1, u8 *q2); diff --git a/include/union_room.h b/include/union_room.h index 7c48a9506..985a6404f 100644 --- a/include/union_room.h +++ b/include/union_room.h @@ -162,7 +162,6 @@ extern u8 gUnionRoomRequestedMonType; // Exported ROM declarations u8 CreateTask_CreateTradeMenu(void); -void nullsub_89(u8 taskId); void var_800D_set_xB(void); void MEvent_CreateTask_CardOrNewsWithFriend(u32 arg0); void MEvent_CreateTask_CardOrNewsOverWireless(u32 arg0); diff --git a/src/battle_controllers.c b/src/battle_controllers.c index a0e9e4416..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" @@ -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/berry_blender.c b/src/berry_blender.c index 2a122541d..dfa378552 100644 --- a/src/berry_blender.c +++ b/src/berry_blender.c @@ -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); diff --git a/src/berry_crush.c b/src/berry_crush.c index 6bc97fad0..da00f0d14 100755 --- a/src/berry_crush.c +++ b/src/berry_crush.c @@ -842,7 +842,7 @@ void StartBerryCrush(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 StartBerryCrush(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 StartBerryCrush(MainCallback callback) SetMainCallback2(callback); Rfu.unk_10 = 0; Rfu.unk_12 = 0; - Rfu.unk_ee = 1; + Rfu.errorState = 1; return; } diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index a4d6dd6c9..e5815e6ae 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -204,7 +204,7 @@ static void Task_ReturnToFieldWirelessLink(u8 taskId) if (!IsLinkTaskFinished()) { if (++task->data[1] > 1800) - sub_8011170(0x6000); + GetLinkmanErrorParams(0x6000); } else { 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 6647cda8c..3e4cc0c05 100644 --- a/src/link.c +++ b/src/link.c @@ -124,8 +124,8 @@ 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 @@ -155,7 +155,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 +172,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,15 +207,36 @@ 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 @@ -229,7 +250,7 @@ bool8 IsWirelessAdapterConnected(void) rfu_waitREQComplete(); return TRUE; } - sub_800B4A4(); + SetWirelessCommType0_Internal(); CloseLink(); RestoreSerialTimer3IntrHandlers(); return FALSE; @@ -242,8 +263,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 +286,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) @@ -536,8 +557,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; } @@ -602,8 +623,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 +650,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]; @@ -709,7 +730,7 @@ void sub_8009F18(void) { if (gWirelessCommType) { - sub_800F804(); + StartSendingKeysToRfu(); } gLinkCallback = sub_8009F70; } @@ -763,7 +784,7 @@ u8 GetLinkPlayerCount(void) { if (gWirelessCommType) { - return sub_80104F4(); + return Rfu_GetLinkPlayerCount(); } return EXTRACT_PLAYER_COUNT(gLinkStatus); } @@ -1046,7 +1067,7 @@ u8 GetMultiplayerId(void) { if (gWirelessCommType == TRUE) { - return rfu_get_multiplayer_id(); + return Rfu_GetMultiplayerId(); } return SIO_MULTI_CNT->id; } @@ -1063,7 +1084,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); } @@ -1096,7 +1117,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); } @@ -1105,7 +1126,7 @@ static void SetBlockReceivedFlag(u8 who) { if (gWirelessCommType == TRUE) { - sub_800F6FC(who); + Rfu_SetBlockReceivedFlag(who); } else { @@ -1121,7 +1142,7 @@ void ResetBlockReceivedFlags(void) { for (i = 0; i < MAX_RFU_PLAYERS; i++) { - sub_800F728(i); + Rfu_ResetBlockReceivedFlag(i); } } else @@ -1137,7 +1158,7 @@ void ResetBlockReceivedFlag(u8 who) { if (gWirelessCommType == TRUE) { - sub_800F728(who); + Rfu_ResetBlockReceivedFlag(who); } else if (gBlockReceivedStatus[who]) { @@ -1264,7 +1285,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); @@ -1453,7 +1474,7 @@ void sub_800AC34(void) { if (gLinkCallback != NULL) { - gUnknown_02022B08++; + sUnknown_02022B08++; } else { @@ -1508,7 +1529,7 @@ void sub_800AD10(void) { if (gLinkCallback != NULL) { - gUnknown_02022B08++; + sUnknown_02022B08++; } else { @@ -1650,14 +1671,14 @@ void CB2_LinkError(void) { gWirelessCommType = 3; } - sub_800E604(); + ResetLinkRfuGFLayer(); } SetVBlankCallback(sub_80096BC); 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(); reset_temp_tile_data_buffers(); @@ -1683,11 +1704,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); @@ -1700,7 +1721,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); @@ -1813,12 +1834,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; @@ -1828,7 +1849,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); } @@ -1871,7 +1892,7 @@ void SetWirelessCommType1(void) } } -static void sub_800B4A4(void) +static void SetWirelessCommType0_Internal(void) { if (gReceivedRemoteLinkPlayers == 0) { @@ -1879,7 +1900,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 0d69f9281..05b624fe9 100644 --- a/src/link_rfu_2.c +++ b/src/link_rfu_2.c @@ -19,34 +19,76 @@ #include "save.h" #include "mystery_gift.h" -extern u16 gHeldKeyCodeToSend; +struct SioInfo +{ + char magic[15]; // PokemonSioInfo + u8 playerCount; + u8 linkPlayerIdx[RFU_CHILD_MAX]; + struct LinkPlayer linkPlayers[MAX_RFU_PLAYERS]; + u8 filler[92]; +}; u32 gf_rfu_REQ_api[RFU_API_BUFF_SIZE_RAM / 4]; -struct UnkRfuStruct_2 Rfu; +struct GFRfuManager Rfu; BSS_DATA u8 gUnknown_03000D78[8]; -BSS_DATA u8 gUnknown_03000D80[16]; -BSS_DATA u16 gUnknown_03000D90[8]; +BSS_DATA u8 sResendBlock8[16]; +BSS_DATA u16 sResendBlock16[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 GFtgtGname gHostRFUtgtGnameBuffer = {}; +EWRAM_DATA ALIGNED(2) u8 gHostRFUtgtUnameBuffer[PLAYER_NAME_LENGTH + 1] = {}; +EWRAM_DATA INIT_PARAM sRfuReqConfig = {}; EWRAM_DATA struct UnkLinkRfuStruct_02022B44 gUnknown_02022B44 = {}; -// Static ROM declarations - -// .rodata - -const INIT_PARAM gUnknown_082ED608 = { - 0x04, 0x20, 0x00, 0x00, 0x02, - (u8 *)&gUnknown_02022B14, - gUnknown_02022B22, - 0x01, 0x00, 0x258, 0x12c +static void ResetSendDataManager(struct RfuBlockSend *); +static void sub_800EAB4(void); +static void sub_800EAFC(void); +static void sub_800EDBC(u16); +static void sub_800F048(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 sub_8010750(void); +static s32 sub_80107A0(void); +static void sub_801084C(u8); +static void sub_80109E8(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 +115,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, // Pokemon FR/LG/EM + 0x7f7d, + 0x0000, + 0xFFFF }; -const char sUnref_082ED6E8[][15] = { +static const char sASCII_RfuCmds[][15] = { "RFU WAIT", "RFU BOOT", "RFU ERROR", @@ -114,75 +164,79 @@ 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++) { - sub_800FCC4(Rfu.unk_80 + i); + ResetSendDataManager(Rfu.unk_80 + i); } - sub_800FCC4(&Rfu.unk_6c); - sub_800D6C8(&Rfu.unk_124); - sub_800D724(&Rfu.unk_9e8); + ResetSendDataManager(&Rfu.unk_6c); + sub_800D6C8(&Rfu.recvQueue); + sub_800D724(&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]; @@ -201,53 +255,53 @@ void sub_800E700(void) { gLinkType = 0; sub_800AAF4(); - sub_80111B0(0); - sub_800E604(); + 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) + 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 = 0; + 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,185 +312,185 @@ 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: + 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()) + { + case 5: + Rfu.state = 12; 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: - { - 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; + 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 (gUnknown_02022B44.unk_0f == 0) + { + Debug_PrintEmpty(); + gUnknown_02022B44.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 (GetHostRFUtgtGname()->activity == 0x54 && RfuGetErrorStatus() == 4) + if (GetHostRFUtgtGname()->activity == (ACTIVITY_PLYRTALK | IN_UNION_ROOM) && RfuGetErrorStatus() == 4) { rfu_REQ_disconnect(lman.acceptSlot_flag); rfu_waitREQComplete(); RfuSetErrorStatus(0, 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); - UpdateGameData_GroupLockedIn(TRUE); - 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 = 0; + 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 LinkRfu_CreateConnectionAsParent(void) { - rfu_LMAN_establishConnection(1, 0, 240, (u16 *)gUnknown_082ED6E0); + rfu_LMAN_establishConnection(MODE_PARENT, 0, 240, (u16 *)sAcceptedSerialNos); } void LinkRfu_StopManagerBeforeEnteringChat(void) @@ -448,25 +502,25 @@ 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); + sub_800D7D8(&Rfu.recvQueue, Rfu.unk_c3f); gUnknown_02022B44.unk_06++; sub_800F048(); - rfu_UNI_readySendData(Rfu.unk_c3e); - rfu_UNI_clearRecvNewDataFlag(Rfu.unk_c3e); + 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; } @@ -476,66 +530,66 @@ 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 LmanAcceptSlotFlagIsNotZero(void) @@ -549,15 +603,15 @@ bool8 LmanAcceptSlotFlagIsNotZero(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 WaitRfuState(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 +619,14 @@ bool32 WaitRfuState(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,23 +637,23 @@ 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++) @@ -612,12 +666,12 @@ void sub_800F014(void) } } -void sub_800F048(void) +static void sub_800F048(void) { if (Rfu.unk_c3c) { u8 r2 = sub_800DAC8(&Rfu.unk_c1c, Rfu.unk_4c); - if (Rfu.unk_c1c.unk_1e == 0) + if (Rfu.unk_c1c.count == 0) { Rfu.unk_c3c = 0; } @@ -628,7 +682,7 @@ void sub_800F048(void) } if (Rfu.unk_c3c == 0) { - sub_800D9DC(&Rfu.unk_9e8, Rfu.unk_4c); + sub_800D9DC(&Rfu.sendQueue, Rfu.unk_4c); sub_800DA68(&Rfu.unk_c1c, Rfu.unk_4c); } } @@ -655,13 +709,13 @@ 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 { @@ -672,12 +726,12 @@ bool32 sub_800F0F8(void) { if (Rfu.unk_ce3) { - sub_8011D6C(Rfu.unk_ce3); + RfuReqDisconnectSlot(Rfu.unk_ce3); Rfu.unk_ce3 = 0; if (Rfu.unk_ce4 == 1) { RfuSetErrorStatus(2, 0x8000); - sub_8011170(0x8000); + GetLinkmanErrorParams(0x8000); return FALSE; } if (!lman.acceptSlot_flag) @@ -689,7 +743,7 @@ bool32 sub_800F0F8(void) } sub_800EFB0(); rfu_UNI_readySendData(Rfu.unk_cda); - rfu_LMAN_REQ_sendData(1); + rfu_LMAN_REQ_sendData(TRUE); } else { @@ -701,7 +755,7 @@ bool32 sub_800F0F8(void) return FALSE; } -bool32 sub_800F1E0(void) +static bool32 sub_800F1E0(void) { u16 i; u16 flags; @@ -709,12 +763,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 == 1) { rfu_waitREQComplete(); while (Rfu.unk_cdb == 0) { - if (Rfu.unk_ee != 0) + if (Rfu.errorState != 0) { return FALSE; } @@ -726,7 +780,7 @@ bool32 sub_800F1E0(void) Rfu.unk_cdc = 0; gUnknown_02022B44.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 +789,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,26 +810,26 @@ 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++) + 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 @@ -789,7 +843,7 @@ bool32 sub_800F1E0(void) return gRfuLinkStatus->sendSlotUNIFlag ? retval & 1 : FALSE; } -void sub_800F498(u16 *a0, u8 *a1) +static void sub_800F498(u16 *a0, u8 *a1) { s32 i; @@ -810,7 +864,7 @@ void sub_800F498(u16 *a0, u8 *a1) } } -bool32 sub_800F4F0(void) +static bool32 RfuProcessEnqueuedRecvBlock(void) { u8 i; u8 j; @@ -818,7 +872,7 @@ bool32 sub_800F4F0(void) u8 sp48[2 * (CMD_LENGTH - 1)]; u8 switchval; - sub_800D934(&Rfu.unk_124, sp00); + sub_800D934(&Rfu.recvQueue, sp00); for (i = 0; i < MAX_RFU_PLAYERS; i++) { for (j = 0; j < CMD_LENGTH - 1; j++) @@ -826,7 +880,7 @@ 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); @@ -836,11 +890,11 @@ bool32 sub_800F4F0(void) RfuSetErrorStatus(2, 0x9000); rfu_clearAllSlot(); gReceivedRemoteLinkPlayers = FALSE; - Rfu.linkRfuCallback = NULL; + Rfu.callback = NULL; if (Rfu.unk_ce4 == 1) { RfuSetErrorStatus(2, 0x9000); - sub_8011170(0x9000); + GetLinkmanErrorParams(0x9000); } lman.state = lman.next_state = 0; Rfu.unk_ce4 = 0; @@ -848,71 +902,71 @@ bool32 sub_800F4F0(void) if (Rfu.unk_cd0) { Rfu.unk_cd0--; - sub_8010528(); + CallRfuFunc(); sub_800F498(gSendCmd, sp48); - sub_800D888(&Rfu.unk_9e8, sp48); + sub_800D888(&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.unk_6c.payload; + for (i = 0; i < Rfu.unk_6c.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); + sub_800D888(&Rfu.sendQueue, sResendBlock8); + Rfu.unk_6c.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.unk_61[linkPlayerId] = TRUE; else - Rfu.unk_5c[a0] = 1; + Rfu.unk_5c[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.unk_5c[linkPlayerId] = FALSE; + Rfu.unk_80[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 @@ -920,33 +974,33 @@ void rfu_func_080F97B8(void) { gUnknown_03000D78[0]++; gHeldKeyCodeToSend |= (gUnknown_03000D78[0] << 8); - sub_800FD14(0xbe00); + RfuPrepareSendBuffer(RFU_COMMAND_0xBE00); } } 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 +1008,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 +1021,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.unk_80[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_80[i].next = 0; + Rfu.unk_80[i].count = gRecvCmds[i][1]; + Rfu.unk_80[i].owner = gRecvCmds[i][2]; + Rfu.unk_80[i].receivedFlags = 0; + Rfu.unk_80[i].receiving = 1; Rfu.unk_5c[i] = 0; } break; - case 0x8900: - if (Rfu.unk_80[i].unk_12 == 1) + case RFU_COMMAND_0x8900: + if (Rfu.unk_80[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.unk_80[i].next = gRecvCmds[i][0] & 0xff; + Rfu.unk_80[i].receivedFlags |= (1 << Rfu.unk_80[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.unk_80[i].next * 6 + j] = gRecvCmds[i][j + 1]; + if (Rfu.unk_80[i].receivedFlags == sAllBlocksReceived[Rfu.unk_80[i].count]) { - Rfu.unk_80[i].unk_12 = 2; - sub_800F6FC(i); - if (GetHostRFUtgtGname()->activity == 0x45 && gReceivedRemoteLinkPlayers != 0 && Rfu.unk_0c == 0) - sub_8010A70(gBlockRecvBuffer); + Rfu.unk_80[i].receiving = 2; + Rfu_SetBlockReceivedFlag(i); + if (GetHostRFUtgtGname()->activity == 0x45 && 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) { @@ -1032,26 +1086,26 @@ void sub_800F86C(u8 unused) } 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]); } 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.unk_61[i]) { if (Rfu.unk_61[i] == 4) { @@ -1064,49 +1118,49 @@ void sub_800F86C(u8 unused) } } -bool8 sub_800FC60(void) +static bool8 sub_800FC60(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.unk_80[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.unk_80[i].receiving != 2 || Rfu.unk_5c[i] != 1) 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.unk_80[i].receiving == 2 && Rfu.unk_5c[i] == 1) { flags |= (1 << i); } @@ -1114,7 +1168,7 @@ u8 sub_800FCD8(void) return flags; } -void sub_800FD14(u16 command) +static void RfuPrepareSendBuffer(u16 command) { u8 i; u8 *buff; @@ -1123,41 +1177,41 @@ 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.unk_6c.count; + gSendCmd[2] = Rfu.unk_6c.owner + 0x80; break; - case 0xa100: + case RFU_COMMAND_0xA100: if (sub_800FC60()) 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; } } @@ -1167,131 +1221,131 @@ void sub_800FE50(void *a0) if (gSendCmd[0] == 0 && !RfuIsErrorStatus1or2()) { 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.unk_6c.sending) { gUnknown_02022B44.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.unk_6c.owner = GetMultiplayerId(); + Rfu.unk_6c.sending = TRUE; + Rfu.unk_6c.count = (size / 12) + r4; + Rfu.unk_6c.next = 0; if (size > 0x100) - Rfu.unk_6c.unk_04 = src; + Rfu.unk_6c.payload = src; else { if (src != gBlockSendBuffer) memcpy(gBlockSendBuffer, src, size); - Rfu.unk_6c.unk_04 = gBlockSendBuffer; + Rfu.unk_6c.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; + const u8 *src = Rfu.unk_6c.payload; + gSendCmd[0] = RFU_COMMAND_0x8900 | Rfu.unk_6c.next; 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) + gSendCmd[i + 1] = (src[(i << 1) + Rfu.unk_6c.next * 12 + 1] << 8) | src[(i << 1) + Rfu.unk_6c.next * 12 + 0]; + Rfu.unk_6c.next++; + if (Rfu.unk_6c.count <= Rfu.unk_6c.next) { - Rfu.unk_6c.unk_10 = 0; - Rfu.linkRfuCallback = rfufunc_80FA020; + Rfu.unk_6c.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.unk_6c.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); + gSendCmd[0] = RFU_COMMAND_0x8900 | (Rfu.unk_6c.count - 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[i + 1] = (src[(i << 1) + (Rfu.unk_6c.count - 1) * 12 + 1] << 8) | src[(i << 1) + (Rfu.unk_6c.count - 1) * 12 + 0]; + if ((u8)gRecvCmds[mpId][0] == Rfu.unk_6c.count - 1) { - if (Rfu.unk_80[mpId].unk_08 != gUnknown_082ED628[Rfu.unk_80[mpId].unk_02]) + if (Rfu.unk_80[mpId].receivedFlags != sAllBlocksReceived[Rfu.unk_80[mpId].count]) { - sub_800F638(mpId, Rfu.unk_80[mpId].unk_08); + HandleSendFailure(mpId, Rfu.unk_80[mpId].receivedFlags); gUnknown_02022B44.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 +1355,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 +1369,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 +1404,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 +1428,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 +1465,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 +1476,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 RfuSerialNumberIsValid(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 +1498,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,53 +1508,54 @@ 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.errorStatus == 2) 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 sub_8010540(void) { s32 i; bool8 retval = FALSE; - for (i = 0; i < 4; i++) + for (i = 0; i < RFU_CHILD_MAX; i++) { if (Rfu.unk_cd1[i] < 5 || Rfu.unk_cd1[i] > 6) { - 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) { Rfu.unk_cd1[i] = 9; Rfu.unk_cd5[i] = 10; - rfu_clearSlot(8, i); + rfu_clearSlot(TYPE_NI_RECV, i); rfu_NI_setSendData(1 << i, 8, Rfu.unk_cd1 + i, 1); retval = TRUE; } } - else if (gRfuSlotStatusNI[Rfu.unk_c3e]->recv.state == 0x47) - rfu_clearSlot(8, i); + else if (gRfuSlotStatusNI[Rfu.childSlot]->recv.state == 0x47) + rfu_clearSlot(TYPE_NI_RECV, i); { } @@ -1514,7 +1568,7 @@ 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) { @@ -1527,7 +1581,7 @@ 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) return TRUE; @@ -1535,327 +1589,330 @@ bool32 sub_80105EC(void) return FALSE; } -bool32 TrainerIdAndNameStillInPartnersList(u16 a0, const u8 *a1) +bool32 TrainerIdAndNameStillInPartnersList(u16 id, const u8 *name) { - u8 r1 = sub_8011CE4(a1, a0); - if (r1 == 0xFF) + u8 idx = GetPartnerIndexByNameAndTrainerID(name, id); + if (idx == 0xFF) return TRUE; - if (Rfu.unk_cd1[r1] == 9) + if (Rfu.unk_cd1[idx] == 9) return TRUE; return FALSE; } -void SendByteToPartnerByIdAndName(u8 a0, u16 a1, const u8 *a2) +void SendByteToPartnerByIdAndName(u8 value, u16 id, 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, id); + Rfu.unk_cd1[idx] = value; + rfu_clearSlot(TYPE_NI_SEND, idx); + rfu_NI_setSendData(1 << idx, 8, Rfu.unk_cd1 + idx, 1); } void LinkRfuNIsend8(void) { Rfu.unk_c85 = 8; - rfu_clearSlot(4, Rfu.unk_c3e); - rfu_NI_setSendData(1 << Rfu.unk_c3e, 8, &Rfu.unk_c85, 1); + rfu_clearSlot(TYPE_NI_SEND, Rfu.childSlot); + rfu_NI_setSendData(1 << Rfu.childSlot, 8, &Rfu.unk_c85, 1); } -u32 WaitSendByteToPartnerByIdAndName(u16 a0, const u8 *a1) +u32 WaitSendByteToPartnerByIdAndName(u16 id, const u8 *name) { - u8 r0 = sub_8011CE4(a1, a0); - if (r0 == 0xFF) + u8 idx = GetPartnerIndexByNameAndTrainerID(name, id); + 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 sub_8010750(void) { s32 i; sub_8010540(); - for (i = 0; i < 4; i++) + 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); + rfu_clearSlot(TYPE_NI_SEND, i); } } } -s32 sub_80107A0(void) +static s32 sub_80107A0(void) { s32 retval = 0; 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); + rfu_clearSlot(TYPE_NI_RECV, Rfu.childSlot); RfuSetErrorStatus(Rfu.unk_c86, 0); retval = Rfu.unk_c86; } - else if (gRfuSlotStatusNI[Rfu.unk_c3e]->recv.state == 0x47) + else if (gRfuSlotStatusNI[Rfu.childSlot]->recv.state == 0x47) { - rfu_clearSlot(8, Rfu.unk_c3e); + rfu_clearSlot(TYPE_NI_RECV, Rfu.childSlot); retval = 6; } return retval; } -void sub_801084C(u8 taskId) +static void sub_801084C(u8 taskId) { s32 i; - if (Rfu.unk_f1 == 1 || Rfu.unk_f1 == 2) + if (Rfu.errorStatus == 1 || Rfu.errorStatus == 2) { 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 (sub_800FC60()) + { + 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 (sub_800FC60()) { - if (sub_800FC60()) - { - Rfu.unk_5a = 0; - sub_800FD14(0xa100); - gTasks[taskId].data[0]++; - } - } - else - gTasks[taskId].data[0]++; - break; - case 4: - if (sub_800FC88()) + Rfu.unk_5a = 0; + RfuPrepareSendBuffer(RFU_COMMAND_0xA100); 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 sub_80109E8(u16 a0) { 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; + 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.errorStatus == 1 || Rfu.errorStatus == 2) { 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.errorStatus == 1 || Rfu.errorStatus == 2) 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, RfuGetErrorStatus() == 2); - Rfu.unk_ee = 2; + sub_800AF18((Rfu.linkmanMsg << 16) | (Rfu.unk_10 << 8) | Rfu.unk_12, Rfu.recvQueue.count, Rfu.sendQueue.count, RfuGetErrorStatus() == 2); + 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(); RfuSetErrorStatus(1, 0x7000); - sub_8011170(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 +1925,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 +1948,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 ClearAndInitHostRFUtgtGname(void) { - memset(&gUnknown_02022B14, 0, 0xD); - sub_800DD94(&gUnknown_02022B14, 0, 0, 0); + memset(&gHostRFUtgtGnameBuffer, 0, RFU_GAME_NAME_LENGTH); + sub_800DD94(&gHostRFUtgtGnameBuffer, 0, FALSE, 0); } -void SetHostRFUtgtGname(u8 a0, u32 a1, u32 a2) +void SetHostRFUtgtGname(u8 activity, u32 child_sprite_genders, u32 started) { - sub_800DD94(&gUnknown_02022B14, a0, a2, a1); + sub_800DD94(&gHostRFUtgtGnameBuffer, activity, started, child_sprite_genders); } -void SetGnameBufferWonderFlags(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,7 +1996,7 @@ 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++) @@ -1948,92 +2005,92 @@ void sub_801103C(void) void UpdateGameData_GroupLockedIn(u8 a0) { - gUnknown_02022B14.started = a0; - rfu_REQ_configGameData(0, 2, (const u8 *)&gUnknown_02022B14, gUnknown_02022B22); + gHostRFUtgtGnameBuffer.started = a0; + rfu_REQ_configGameData(0, 2, (void *)&gHostRFUtgtGnameBuffer, gHostRFUtgtUnameBuffer); } void UpdateGameDataWithActivitySpriteGendersFlag(u8 a0, u32 a1, u32 a2) { if (a0) SetHostRFUtgtGname(a0, a1, a2); - rfu_REQ_configGameData(0, 2, (const u8 *)&gUnknown_02022B14, gUnknown_02022B22); + 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 (GetHostRFUtgtGname()->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; } } - UpdateGameDataWithActivitySpriteGendersFlag(0x45, r7, 0); + UpdateGameDataWithActivitySpriteGendersFlag((ACTIVITY_CHAT | IN_UNION_ROOM), child_sprite_genders, 0); } } -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) { @@ -2042,141 +2099,149 @@ void sub_801120C(u8 a0, u8 unused1) { Rfu.unk_cd1[i] = 0; Rfu.unk_cd5[i] = 0; - rfu_setRecvBuffer(0x20, i, Rfu.unk_cd5 + i, 1); + rfu_setRecvBuffer(TYPE_NI, i, Rfu.unk_cd5 + 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 = 0x11; 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(); } - RfuSetErrorStatus(2, a0); + RfuSetErrorStatus(2, 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: - RfuSetErrorStatus(1, a0); - sub_8011170(a0); - Rfu.unk_ef = 1; + case LMAN_MSG_LMAN_API_ERROR_RETURN: + RfuSetErrorStatus(1, msg); + GetLinkmanErrorParams(msg); + Rfu.isShuttingDown = TRUE; break; - case 0xf0 ... 0xf2: - case 0xff: - sub_8011170(a0); - RfuSetErrorStatus(1, a0); + 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); + RfuSetErrorStatus(1, msg); Rfu.unk_cdb = 1; 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: - RfuSetErrorStatus(2, a0); + case LMAN_MSG_CONNECT_PARENT_FAILED: + RfuSetErrorStatus(2, 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_setRecvBuffer(TYPE_NI, Rfu.childSlot, &Rfu.unk_c86, 1); + rfu_setRecvBuffer(TYPE_UNI, Rfu.childSlot, Rfu.unk_c3f, 70); break; - case 0x25: - RfuSetErrorStatus(2, 0x25); + case LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED: + RfuSetErrorStatus(2, msg); break; - case 0x30: - Rfu.unk_f0 = 2; + case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED: + Rfu.linkLossRecoveryState = 2; if (Rfu.unk_c86 == 6) break; - case 0x33: - if (Rfu.unk_f0 != 2) - Rfu.unk_f0 = 4; + case LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED: + if (Rfu.linkLossRecoveryState != 2) + Rfu.linkLossRecoveryState = 4; if (Rfu.unk_c86 != 9) - RfuSetErrorStatus(2, a0); - nullsub_5(gUnknown_082ED7FC, 5, 5); + RfuSetErrorStatus(2, 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; + case LMAN_MSG_LINK_RECOVERY_SUCCESSED: + Rfu.linkLossRecoveryState = 3; Rfu.unk_c3c = 1; 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: - RfuSetErrorStatus(1, a0); - sub_8011170(a0); - Rfu.unk_ef = 1; + case LMAN_MSG_LMAN_API_ERROR_RETURN: + RfuSetErrorStatus(1, msg); + GetLinkmanErrorParams(msg); + Rfu.isShuttingDown = TRUE; break; - case 0xF0 ... 0xF2: - case 0xFF: - RfuSetErrorStatus(1, a0); - sub_8011170(a0); + 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: + RfuSetErrorStatus(1, msg); + GetLinkmanErrorParams(msg); Rfu.unk_cdb = 1; 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,7 +2251,7 @@ void sub_80115EC(s32 a0) } } -u8 sub_8011628(s32 a0) +static u8 GetNewChildrenInUnionRoomChat(s32 a0) { u8 ret = 0; u8 i; @@ -2196,7 +2261,7 @@ u8 sub_8011628(s32 a0) 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 +2269,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: + case LMAN_MSG_NEW_CHILD_CONNECT_DETECTED: RfuSetErrorStatus(4, 0); break; - case 0x11: - if (GetHostRFUtgtGname()->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 +2292,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 { @@ -2247,31 +2312,31 @@ void sub_8011674(u8 a0, u8 unused1) } 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 (GetHostRFUtgtGname()->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,67 +2344,71 @@ void sub_8011674(u8 a0, u8 unused1) } else { - RfuSetErrorStatus(2, a0); + RfuSetErrorStatus(2, msg); } break; - case 0x24: - Rfu.unk_04 = 0xD; + case LMAN_MSG_CHILD_NAME_SEND_COMPLETED: + Rfu.state = 13; RfuSetErrorStatus(3, 0); - rfu_setRecvBuffer(0x10, Rfu.unk_c3e, Rfu.unk_c3f, 70); + rfu_setRecvBuffer(TYPE_UNI, Rfu.childSlot, Rfu.unk_c3f, 70); break; - case 0x25: - RfuSetErrorStatus(2, a0); + case LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED: + RfuSetErrorStatus(2, 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) + case LMAN_MSG_LINK_RECOVERY_SUCCESSED: + Rfu.linkLossRecoveryState = 3; + if (gRfuLinkStatus->parentChild == MODE_CHILD) Rfu.unk_c3c = 1; 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; - RfuSetErrorStatus(2, a0); + RfuSetErrorStatus(2, 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: - RfuSetErrorStatus(1, a0); - sub_8011170(a0); - Rfu.unk_ef = 1; + case LMAN_MSG_LMAN_API_ERROR_RETURN: + RfuSetErrorStatus(1, msg); + GetLinkmanErrorParams(msg); + Rfu.isShuttingDown = TRUE; break; - case 0xF0 ... 0xF2: - case 0xFF: - sub_8011170(a0); - RfuSetErrorStatus(1, a0); + 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); + RfuSetErrorStatus(1, msg); Rfu.unk_cdb = 0; break; } @@ -2350,15 +2419,15 @@ void sub_8011A50(void) Rfu.unk_ce4 = 2; } -void RfuSetErrorStatus(u8 a0, u16 a1) +void RfuSetErrorStatus(u8 status, u16 msg) { - Rfu.unk_f1 = a0; - Rfu.unk_0a = a1; + Rfu.errorStatus = status; + Rfu.linkmanMsg = msg; } u8 RfuGetErrorStatus(void) { - return Rfu.unk_f1; + return Rfu.errorStatus; } bool32 RfuIsErrorStatus1or2(void) @@ -2377,7 +2446,7 @@ bool32 sub_8011A9C(void) bool8 Rfu_IsMaster(void) { - return Rfu.unk_0c; + return Rfu.parentChild; } void RfuVSync(void) @@ -2390,14 +2459,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; @@ -2420,29 +2489,29 @@ void sub_8011AFC(void) AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); - sub_8011BA4(); + CreateTask_RfuIdle(); SetMainCallback2(sub_8011BF8); } } 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(); @@ -2452,75 +2521,75 @@ void sub_8011BF8(void) 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 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 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 (RfuSerialNumberIsValid(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 RequestDisconnectSlotByTrainerNameAndId(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 +2599,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 +2609,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,22 +2638,23 @@ 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 (GetHostRFUtgtGname()->activity == 0x15 || GetHostRFUtgtGname()->activity == 0x16) + else if (GetHostRFUtgtGname()->activity == ACTIVITY_WONDER_CARD2 + || GetHostRFUtgtGname()->activity == ACTIVITY_WONDER_NEWS2) { data[15]++; } @@ -2612,42 +2682,42 @@ void sub_8011EF4(u8 taskId) } } -void CreateTask_RfuReconnectWithParent(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.errorStatus = 0; + 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 (GetHostRFUtgtGname()->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,9 +2726,9 @@ 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.errorStatus == 4) DestroyTask(taskId); if (++gTasks[taskId].data[0] > 300) @@ -2667,17 +2737,17 @@ void sub_801209C(u8 taskId) 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); } } @@ -2690,19 +2760,19 @@ void sub_801209C(u8 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.errorStatus = 0; 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; @@ -2716,7 +2786,7 @@ void sub_8012188(const u8 *name, struct GFtgtGname *structPtr, u8 a2) bool8 sub_8012224(void) { - if (Rfu.unk_f0 == 1) + if (Rfu.linkLossRecoveryState == 1) return TRUE; else return FALSE; @@ -2726,7 +2796,7 @@ 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) return FALSE; @@ -2735,52 +2805,52 @@ bool32 sub_8012240(void) 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++) { - 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 +2858,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 b7d3e808c..dc032b403 100644 --- a/src/link_rfu_3.c +++ b/src/link_rfu_3.c @@ -165,7 +165,7 @@ const struct SpriteTemplate sWirelessStatusIndicatorSpriteTemplate = { SpriteCallbackDummy }; -void sub_800D6C8(struct UnkRfuStruct_2_Sub_124 *ptr) +void sub_800D6C8(struct RfuRecvQueue *ptr) { s32 i; s32 j; @@ -179,11 +179,11 @@ void sub_800D6C8(struct UnkRfuStruct_2_Sub_124 *ptr) } ptr->unk_8c1 = 0; ptr->unk_8c0 = 0; - ptr->unk_8c2 = 0; - ptr->unk_8c3 = 0; + ptr->count = 0; + ptr->full = FALSE; } -void sub_800D724(struct UnkRfuStruct_2_Sub_9e8 *ptr) +void sub_800D724(struct RfuSendQueue *ptr) { s32 i; s32 j; @@ -197,8 +197,8 @@ void sub_800D724(struct UnkRfuStruct_2_Sub_9e8 *ptr) } ptr->unk_231 = 0; ptr->unk_230 = 0; - ptr->unk_232 = 0; - ptr->unk_233 = 0; + ptr->count = 0; + ptr->full = FALSE; } void sub_800D780(struct UnkRfuStruct_Sub_Unused *ptr) @@ -219,13 +219,13 @@ void sub_800D780(struct UnkRfuStruct_Sub_Unused *ptr) ptr->unk_203 = 0; } -void sub_800D7D8(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2) +void sub_800D7D8(struct RfuRecvQueue *q1, u8 *q2) { s32 i; u16 imeBak; u8 count; - if (q1->unk_8c2 < 32) + if (q1->count < 32) { imeBak = REG_IME; REG_IME = 0; @@ -245,7 +245,7 @@ void sub_800D7D8(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2) } q1->unk_8c0++; q1->unk_8c0 %= 32; - q1->unk_8c2++; + q1->count++; for (i = 0; i < 70; i++) { q2[i] = 0; @@ -255,16 +255,16 @@ void sub_800D7D8(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2) } else { - q1->unk_8c3 = 1; + q1->full = TRUE; } } -void sub_800D888(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2) +void sub_800D888(struct RfuSendQueue *q1, u8 *q2) { s32 i; u16 imeBak; - if (q1->unk_232 < 40) + if (q1->count < 40) { imeBak = REG_IME; REG_IME = 0; @@ -283,7 +283,7 @@ void sub_800D888(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2) } q1->unk_230++; q1->unk_230 %= 40; - q1->unk_232++; + q1->count++; for (i = 0; i < 14; i++) { q2[i] = 0; @@ -293,18 +293,18 @@ void sub_800D888(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2) } else { - q1->unk_233 = 1; + q1->full = TRUE; } } -bool8 sub_800D934(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2) +bool8 sub_800D934(struct RfuRecvQueue *q1, u8 *q2) { u16 imeBak; s32 i; imeBak = REG_IME; REG_IME = 0; - if (q1->unk_8c0 == q1->unk_8c1 || q1->unk_8c3 != 0) + if (q1->unk_8c0 == q1->unk_8c1 || q1->full) { for (i = 0; i < 70; i++) { @@ -319,17 +319,17 @@ bool8 sub_800D934(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2) } q1->unk_8c1++; q1->unk_8c1 %= 32; - q1->unk_8c2--; + q1->count--; REG_IME = imeBak; return TRUE; } -bool8 sub_800D9DC(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2) +bool8 sub_800D9DC(struct RfuSendQueue *q1, u8 *q2) { s32 i; u16 imeBak; - if (q1->unk_230 == q1->unk_231 || q1->unk_233 != 0) + if (q1->unk_230 == q1->unk_231 || q1->full) { return FALSE; } @@ -341,7 +341,7 @@ bool8 sub_800D9DC(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2) } q1->unk_231++; q1->unk_231 %= 40; - q1->unk_232--; + q1->count--; REG_IME = imeBak; return TRUE; } @@ -362,9 +362,9 @@ void sub_800DA68(struct UnkRfuStruct_2_Sub_c1c *q1, const u8 *q2) } q1->unk_1c++; q1->unk_1c %= 2; - if (q1->unk_1e < 2) + if (q1->count < 2) { - q1->unk_1e++; + q1->count++; } else { @@ -377,7 +377,7 @@ bool8 sub_800DAC8(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2) { s32 i; - if (q1->unk_1e == 0) + if (q1->count == 0) { return FALSE; } @@ -390,7 +390,7 @@ bool8 sub_800DAC8(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2) } q1->unk_1d++; q1->unk_1d %= 2; - q1->unk_1e--; + q1->count--; return TRUE; } @@ -632,7 +632,7 @@ bool8 LinkRfu_GetNameIfCompatible(struct GFtgtGname *buff1, u8 *buff2, u8 idx) if (lman.parent_child == 1) { retVal = TRUE; - if (sub_8010454(gRfuLinkStatus->partner[idx].serialNo) && ((gRfuLinkStatus->getNameFlag >> idx) & 1)) + if (RfuSerialNumberIsValid(gRfuLinkStatus->partner[idx].serialNo) && ((gRfuLinkStatus->getNameFlag >> idx) & 1)) { memcpy(buff1, gRfuLinkStatus->partner[idx].gname, 0xD); memcpy(buff2, gRfuLinkStatus->partner[idx].uname, PLAYER_NAME_LENGTH + 1); @@ -646,7 +646,7 @@ bool8 LinkRfu_GetNameIfCompatible(struct GFtgtGname *buff1, u8 *buff2, u8 idx) else { retVal = FALSE; - if (sub_8010454(gRfuLinkStatus->partner[idx].serialNo)) + if (RfuSerialNumberIsValid(gRfuLinkStatus->partner[idx].serialNo)) { memcpy(buff1, gRfuLinkStatus->partner[idx].gname, 0xD); memcpy(buff2, gRfuLinkStatus->partner[idx].uname, PLAYER_NAME_LENGTH + 1); @@ -679,8 +679,8 @@ bool8 LinkRfu_GetNameIfSerial7F7D(struct GFtgtGname *buff1, u8 *buff2, u8 idx) void LinkRfu3_SetGnameUnameFromStaticBuffers(struct GFtgtGname *buff1, u8 *buff2) { - memcpy(buff1, &gUnknown_02022B14, 0xD); - memcpy(buff2, gUnknown_02022B22, 8); + memcpy(buff1, &gHostRFUtgtGnameBuffer, 0xD); + memcpy(buff2, gHostRFUtgtUnameBuffer, 8); } void CreateWirelessStatusIndicatorSprite(u8 x, u8 y) diff --git a/src/main.c b/src/main.c index cf19f39b3..b95839e82 100644 --- a/src/main.c +++ b/src/main.c @@ -113,7 +113,7 @@ void AgbMain() InitIntrHandlers(); m4aSoundInit(); EnableVCountIntrAtLine150(); - sub_800E6D0(); + InitRFU(); RtcInit(); CheckForFlashMemory(); InitMainCallbacks(); diff --git a/src/overworld.c b/src/overworld.c index 72bc38693..87e394e39 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/pokemon_jump.c b/src/pokemon_jump.c index acfd4d545..738e0089d 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); @@ -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,7 +1146,7 @@ static bool32 sub_802B720(void) } break; case 2: - if (sub_802C70C()) + if (AreLinkQueuesEmpty()) { CreateTask(Task_LinkSave, 6); 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/trade.c b/src/trade.c index 624f6eae9..3a0f07ac6 100644 --- a/src/trade.c +++ b/src/trade.c @@ -396,7 +396,7 @@ static void CB2_CreateTradeMenu(void) { SetWirelessCommType1(); OpenLink(); - sub_8011BA4(); + CreateTask_RfuIdle(); } else { @@ -438,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; diff --git a/src/union_room.c b/src/union_room.c index 8f49add80..ac32e15f2 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -2338,7 +2338,7 @@ static void Task_RunUnionRoom(u8 taskId) break; case 2: SetHostRFUtgtGname(IN_UNION_ROOM, 0, 0); - sub_8010FCC(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel); + SetTradeBoardRegisteredMonInfo(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel); SetWirelessCommType1(); OpenLink(); InitializeRfuLinkManager_EnterUnionRoom(); @@ -2361,7 +2361,7 @@ static void Task_RunUnionRoom(u8 taskId) if (id >= PARTY_SIZE) { ResetUnionRoomTrade(&sUnionRoomTrade); - sub_8010FCC(0, 0, 0); + SetTradeBoardRegisteredMonInfo(TYPE_NORMAL, SPECIES_NONE, 0); ScheduleFieldMessageAndExit(sText_RegistrationCanceled); } else if (!RegisterTradeMonAndGetIsEgg(GetCursorSelectionMonId(), &sUnionRoomTrade)) @@ -2453,7 +2453,7 @@ static void Task_RunUnionRoom(u8 taskId) case 4: data->state = 11; UR_EnableScriptContext2AndFreezeObjectEvents(); - sub_8010FCC(0, 0, 0); + SetTradeBoardRegisteredMonInfo(TYPE_NORMAL, SPECIES_NONE, 0); UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_NPCTALK | IN_UNION_ROOM, GetActivePartnerSpriteGenderParam(data), 0); break; } @@ -2931,7 +2931,7 @@ static void Task_RunUnionRoom(u8 taskId) case -2: case 18: ResetUnionRoomTrade(&sUnionRoomTrade); - sub_8010FCC(0, 0, 0); + SetTradeBoardRegisteredMonInfo(TYPE_NORMAL, SPECIES_NONE, 0); ScheduleFieldMessageAndExit(sText_RegistrationCanceled); break; default: @@ -2942,7 +2942,7 @@ static void Task_RunUnionRoom(u8 taskId) } break; case 55: - sub_8010FCC(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel); + SetTradeBoardRegisteredMonInfo(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel); ScheduleFieldMessageAndExit(sText_RegistraionCompleted); break; case 44: @@ -2961,7 +2961,7 @@ static void Task_RunUnionRoom(u8 taskId) case 56: if (PrintOnTextbox(&data->textState, sText_RegistrationCanceled2)) { - sub_8010FCC(0, 0, 0); + SetTradeBoardRegisteredMonInfo(TYPE_NORMAL, SPECIES_NONE, 0); ResetUnionRoomTrade(&sUnionRoomTrade); HandleCancelTrade(TRUE); data->state = 4; @@ -4265,7 +4265,7 @@ static void HandleCancelTrade(bool32 unlockObjs) gPlayerCurrActivity = 0; if (unlockObjs) { - sub_8010FCC(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel); + SetTradeBoardRegisteredMonInfo(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel); UpdateGameDataWithActivitySpriteGendersFlag(IN_UNION_ROOM, 0, 0); } } -- cgit v1.2.3 From c98342c9730175e57c0cf242292d5ccad61b471d Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sun, 7 Jun 2020 17:37:09 -0400 Subject: Document link_rfu_3.c --- include/link_rfu.h | 77 +++----- src/link_rfu_2.c | 105 +++++----- src/link_rfu_3.c | 553 +++++++++++++++++++++++++++++++++-------------------- src/main.c | 2 +- 4 files changed, 421 insertions(+), 316 deletions(-) diff --git a/include/link_rfu.h b/include/link_rfu.h index 55b1b3712..46ed3c30a 100644 --- a/include/link_rfu.h +++ b/include/link_rfu.h @@ -24,12 +24,11 @@ struct GFtgtGnameSub u16 language:4; u16 hasNews:1; u16 hasCard:1; - u16 unk_00_6:1; + u16 unknown:1; // Never read u16 isChampion:1; u16 hasNationalDex:1; u16 gameClear:1; u16 version:4; - u16 unk_01_6:2; u8 playerTrainerId[2]; }; @@ -92,39 +91,30 @@ struct RfuBlockSend struct RfuRecvQueue { - /* 0x000 */ u8 unk_00[32][70]; - /* 0x8c0 */ vu8 unk_8c0; - /* 0x8c1 */ vu8 unk_8c1; + /* 0x000 */ u8 slots[32][70]; + /* 0x8c0 */ vu8 recvSlot; + /* 0x8c1 */ vu8 sendSlot; /* 0x8c2 */ vu8 count; /* 0x8c3 */ vu8 full; }; struct RfuSendQueue { - /* 0x000 */ u8 unk_00[40][14]; - /* 0x230 */ vu8 unk_230; - /* 0x231 */ vu8 unk_231; + /* 0x000 */ u8 slots[40][14]; + /* 0x230 */ vu8 recvSlot; + /* 0x231 */ vu8 sendSlot; /* 0x232 */ vu8 count; /* 0x233 */ vu8 full; }; -struct UnkRfuStruct_2_Sub_c1c +struct RfuBackupQueue { - /* 0x00 */ u8 unk_00[2][14]; - /* 0x1c */ vu8 unk_1c; - /* 0x1d */ vu8 unk_1d; + /* 0x00 */ u8 slots[2][14]; + /* 0x1c */ vu8 recvSlot; + /* 0x1d */ vu8 sendSlot; /* 0x1e */ vu8 count; }; -struct UnkRfuStruct_Sub_Unused -{ - /* 0x000 */ u8 unk_00[2][256]; - /* 0x200 */ vu8 unk_200; - /* 0x201 */ vu8 unk_201; - /* 0x202 */ vu8 unk_202; - /* 0x203 */ vu8 unk_203; -}; - struct GFRfuManager { /* 0x000 */ void (*callback)(void); @@ -141,8 +131,8 @@ struct GFRfuManager /* 0x04c */ u8 unk_4c[14]; /* 0x05a */ u8 unk_5a; /* 0x05b */ u8 unk_5b; - /* 0x05c */ bool8 unk_5c[MAX_RFU_PLAYERS]; - /* 0x061 */ bool8 unk_61[MAX_RFU_PLAYERS]; + /* 0x05c */ bool8 blockReceived[MAX_RFU_PLAYERS]; + /* 0x061 */ bool8 numBlocksReceived[MAX_RFU_PLAYERS]; /* 0x066 */ u8 idleTaskId; /* 0x067 */ u8 searchTaskId; /* 0x068 */ u8 filler_68[4]; @@ -164,8 +154,8 @@ struct GFRfuManager u8 playerName[PLAYER_NAME_LENGTH + 1]; /* 0x124 */ struct RfuRecvQueue recvQueue; /* 0x9e8 */ struct RfuSendQueue sendQueue; - /* 0xc1c */ struct UnkRfuStruct_2_Sub_c1c unk_c1c; - /* 0xc3c */ vu8 unk_c3c; + /* 0xc1c */ struct RfuBackupQueue backupQueue; + /* 0xc3c */ vu8 linkRecovered; /* 0xc3d */ u8 unk_c3d; /* 0xc3e */ vu8 childSlot; /* 0xc3f */ u8 unk_c3f[70]; @@ -223,7 +213,7 @@ bool8 Rfu_IsMaster(void); void task_add_05_task_del_08FA224_when_no_RfuFunc(void); void sub_8010434(void); void ResetLinkRfuGFLayer(void); -void sub_800E174(void); +void UpdateWirelessStatusIndicatorSprite(void); void InitRFU(void); bool32 sub_8010EC0(void); bool32 sub_8010F1C(void); @@ -250,7 +240,6 @@ u32 WaitSendByteToPartnerByIdAndName(u16 a0, const u8 *a1); void RequestDisconnectSlotByTrainerNameAndId(const u8 *a0, u16 a1); bool8 LmanAcceptSlotFlagIsNotZero(void); bool32 WaitRfuState(bool32 a0); -void DestroyWirelessStatusIndicatorSprite(void); void sub_801103C(void); void InitializeRfuLinkManager_JoinGroup(void); void LinkRfuNIsend8(void); @@ -282,36 +271,24 @@ bool32 sub_8011A9C(void); void sub_80104B0(void); void sub_8011A50(void); void sub_80110B8(u32 a0); -bool8 sub_800DAC8(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2); -void sub_800ED34(u16 unused); -bool32 RfuSerialNumberIsValid(u32 serialNo); -bool8 sub_8012224(void); +bool32 IsRfuSerialNumberValid(u32 serialNo); +bool8 IsRfuRecoveringFromLinkLoss(void); void sub_8011BA4(void); -void sub_800D6C8(struct RfuRecvQueue *ptr); -void sub_800D724(struct RfuSendQueue *ptr); -void sub_800D780(struct UnkRfuStruct_Sub_Unused *ptr); -void sub_800D7D8(struct RfuRecvQueue *q1, u8 *q2); -void sub_800D888(struct RfuSendQueue *q1, u8 *q2); -bool8 sub_800D934(struct RfuRecvQueue *q1, u8 *q2); -bool8 sub_800D9DC(struct RfuSendQueue *q1, u8 *q2); -void sub_800DA68(struct UnkRfuStruct_2_Sub_c1c *q1, const u8 *q2); -bool8 sub_800DAC8(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2); -void sub_800DB18(struct UnkRfuStruct_Sub_Unused *q1, u8 *q2); -bool8 sub_800DB84(struct UnkRfuStruct_Sub_Unused *q1, u8 *q2); +void RfuRecvQueue_Reset(struct RfuRecvQueue *queue); +void RfuSendQueue_Reset(struct RfuSendQueue *queue); +void RfuRecvQueue_Enqueue(struct RfuRecvQueue *queue, u8 *data); +void RfuSendQueue_Enqueue(struct RfuSendQueue *queue, u8 *data); +bool8 RfuRecvQueue_Dequeue(struct RfuRecvQueue *queue, u8 *dest); +bool8 RfuSendQueue_Dequeue(struct RfuSendQueue *queue, u8 *dest); +void RfuBackupQueue_Enqueue(struct RfuBackupQueue *queue, const u8 *q2); +bool8 RfuBackupQueue_Dequeue(struct RfuBackupQueue *queue, u8 *q2); void sub_800DBF8(u8 *q1, u8 mode); -void PkmnStrToASCII(u8 *q1, const u8 *q2); -void ASCIIToPkmnStr(u8 *q1, const u8 *q2); u8 sub_800DD1C(u8 maxFlags); -void sub_800DD94(struct GFtgtGname *data, u8 r9, bool32 r2, s32 r3); +void InitHostRFUtgtGname(struct GFtgtGname *data, u8 r9, bool32 r2, s32 r3); void CreateWirelessStatusIndicatorSprite(u8 x, u8 y); void DestroyWirelessStatusIndicatorSprite(void); void LoadWirelessStatusIndicatorSpriteGfx(void); u8 sub_800E124(void); void sub_800E15C(struct Sprite *sprite, s32 signalStrengthAnimNum); -void sub_800E174(void); -void CopyTrainerRecord(struct TrainerNameRecord *dest, u32 trainerId, const u8 *name); -bool32 NameIsNotEmpty(const u8 *name); -void RecordMixTrainerNames(void); -void WipeTrainerNameRecords(void); #endif //GUARD_LINK_RFU_H diff --git a/src/link_rfu_2.c b/src/link_rfu_2.c index 05b624fe9..6c6f12077 100644 --- a/src/link_rfu_2.c +++ b/src/link_rfu_2.c @@ -43,8 +43,9 @@ EWRAM_DATA struct UnkLinkRfuStruct_02022B44 gUnknown_02022B44 = {}; 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 sub_800F048(void); +static void UpdateBackupQueue(void); static void Task_ExchangeLinkPlayers(u8); static void RfuHandleReceiveCommand(u8); static void CallRfuFunc(void); @@ -56,7 +57,7 @@ static u8 GetPartnerIndexByNameAndTrainerID(const u8 *, u16); static void sub_8010750(void); static s32 sub_80107A0(void); static void sub_801084C(u8); -static void sub_80109E8(u16); +static void ClearSelectedLinkPlayerIds(u16); static void ValidateAndReceivePokemonSioInfo(void *); static void sub_8010D0C(u8); static void sub_80115EC(s32); @@ -229,8 +230,8 @@ void ResetLinkRfuGFLayer(void) ResetSendDataManager(Rfu.unk_80 + i); } ResetSendDataManager(&Rfu.unk_6c); - sub_800D6C8(&Rfu.recvQueue); - sub_800D724(&Rfu.sendQueue); + RfuRecvQueue_Reset(&Rfu.recvQueue); + RfuSendQueue_Reset(&Rfu.sendQueue); CpuFill16(0, gSendCmd, sizeof gSendCmd); CpuFill16(0, gRecvCmds, sizeof gRecvCmds); CpuFill16(0, gLinkPlayers, sizeof gLinkPlayers); @@ -498,7 +499,7 @@ void LinkRfu_StopManagerBeforeEnteringChat(void) rfu_LMAN_stopManager(FALSE); } -void sub_800ED34(u16 unused) +static void sub_800ED34(u16 unused) { s32 i; @@ -511,9 +512,9 @@ void sub_800ED34(u16 unused) if (gRfuSlotStatusUNI[Rfu.childSlot]->recv.newDataFlag) { Rfu.unk_cd0++; - sub_800D7D8(&Rfu.recvQueue, Rfu.unk_c3f); + RfuRecvQueue_Enqueue(&Rfu.recvQueue, Rfu.unk_c3f); gUnknown_02022B44.unk_06++; - sub_800F048(); + UpdateBackupQueue(); rfu_UNI_readySendData(Rfu.childSlot); rfu_UNI_clearRecvNewDataFlag(Rfu.childSlot); } @@ -666,24 +667,22 @@ static void sub_800F014(void) } } -static 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.count == 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.sendQueue, 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); } } @@ -872,7 +871,7 @@ static bool32 RfuProcessEnqueuedRecvBlock(void) u8 sp48[2 * (CMD_LENGTH - 1)]; u8 switchval; - sub_800D934(&Rfu.recvQueue, sp00); + RfuRecvQueue_Dequeue(&Rfu.recvQueue, sp00); for (i = 0; i < MAX_RFU_PLAYERS; i++) { for (j = 0; j < CMD_LENGTH - 1; j++) @@ -904,7 +903,7 @@ static bool32 RfuProcessEnqueuedRecvBlock(void) Rfu.unk_cd0--; CallRfuFunc(); sub_800F498(gSendCmd, sp48); - sub_800D888(&Rfu.sendQueue, sp48); + RfuSendQueue_Enqueue(&Rfu.sendQueue, sp48); for (i = 0; i < CMD_LENGTH - 1; i++) gSendCmd[i] = 0; } @@ -932,7 +931,7 @@ static void HandleSendFailure(u8 unused, u32 flags) j++;j--; // Needed to match; } - sub_800D888(&Rfu.sendQueue, sResendBlock8); + RfuSendQueue_Enqueue(&Rfu.sendQueue, sResendBlock8); Rfu.unk_6c.failedFlags |= (1 << i); } flags >>= 1; @@ -942,14 +941,14 @@ static void HandleSendFailure(u8 unused, u32 flags) void Rfu_SetBlockReceivedFlag(u8 linkPlayerId) { if (Rfu.parentChild == MODE_PARENT && linkPlayerId) - Rfu.unk_61[linkPlayerId] = TRUE; + Rfu.numBlocksReceived[linkPlayerId] = 1; else - Rfu.unk_5c[linkPlayerId] = TRUE; + Rfu.blockReceived[linkPlayerId] = TRUE; } void Rfu_ResetBlockReceivedFlag(u8 linkPlayerId) { - Rfu.unk_5c[linkPlayerId] = FALSE; + Rfu.blockReceived[linkPlayerId] = FALSE; Rfu.unk_80[linkPlayerId].receiving = 0; } @@ -1040,7 +1039,7 @@ static void RfuHandleReceiveCommand(u8 unused) Rfu.unk_80[i].owner = gRecvCmds[i][2]; Rfu.unk_80[i].receivedFlags = 0; Rfu.unk_80[i].receiving = 1; - Rfu.unk_5c[i] = 0; + Rfu.blockReceived[i] = FALSE; } break; case RFU_COMMAND_0x8900: @@ -1081,7 +1080,7 @@ static void RfuHandleReceiveCommand(u8 unused) Rfu.unk_ce4 = gRecvCmds[i][2]; } Rfu.playerCount = gRecvCmds[i][3]; - sub_80109E8(gRecvCmds[i][1]); + ClearSelectedLinkPlayerIds(gRecvCmds[i][1]); } } else @@ -1097,7 +1096,7 @@ static void RfuHandleReceiveCommand(u8 unused) { Rfu.unk_ce3 |= gRecvCmds[i][1]; Rfu.unk_ce4 = gRecvCmds[i][2]; - sub_80109E8(gRecvCmds[i][1]); + ClearSelectedLinkPlayerIds(gRecvCmds[i][1]); } break; case RFU_COMMAND_0x4400: @@ -1105,20 +1104,20 @@ static void RfuHandleReceiveCommand(u8 unused) gLinkPartnersHeldKeys[i] = gRecvCmds[i][1]; break; } - if (Rfu.parentChild == MODE_PARENT && 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]++; } } } -static bool8 sub_800FC60(void) +static bool8 AreNoPlayersReceiving(void) { s32 i; @@ -1136,7 +1135,7 @@ static bool8 sub_800FC88(void) for (i = 0; i < Rfu.playerCount; i++) { - if (Rfu.unk_80[i].receiving != 2 || Rfu.unk_5c[i] != 1) + if (Rfu.unk_80[i].receiving != 2 || Rfu.blockReceived[i] != TRUE) return FALSE; } return TRUE; @@ -1160,7 +1159,7 @@ u8 Rfu_GetBlockReceivedStatus(void) for (i = 0; i < MAX_RFU_PLAYERS; i++) { - if (Rfu.unk_80[i].receiving == 2 && Rfu.unk_5c[i] == 1) + if (Rfu.unk_80[i].receiving == 2 && Rfu.blockReceived[i] == TRUE) { flags |= (1 << i); } @@ -1182,7 +1181,7 @@ static void RfuPrepareSendBuffer(u16 command) gSendCmd[2] = Rfu.unk_6c.owner + 0x80; break; case RFU_COMMAND_0xA100: - if (sub_800FC60()) + if (AreNoPlayersReceiving()) gSendCmd[1] = Rfu.unk_5a; break; case RFU_COMMAND_0x7700: @@ -1483,7 +1482,7 @@ void sub_8010434(void) } } -bool32 RfuSerialNumberIsValid(u32 serialNo) +bool32 IsRfuSerialNumberValid(u32 serialNo) { s32 i; for (i = 0; sAcceptedSerialNos[i] != serialNo; i++) @@ -1554,7 +1553,7 @@ static bool8 sub_8010540(void) } } - else if (gRfuSlotStatusNI[Rfu.childSlot]->recv.state == 0x47) + else if (gRfuSlotStatusNI[Rfu.childSlot]->recv.state == SLOT_STATE_RECV_FAILED) rfu_clearSlot(TYPE_NI_RECV, i); { @@ -1657,7 +1656,7 @@ static s32 sub_80107A0(void) RfuSetErrorStatus(Rfu.unk_c86, 0); retval = Rfu.unk_c86; } - else if (gRfuSlotStatusNI[Rfu.childSlot]->recv.state == 0x47) + else if (gRfuSlotStatusNI[Rfu.childSlot]->recv.state == SLOT_STATE_RECV_FAILED) { rfu_clearSlot(TYPE_NI_RECV, Rfu.childSlot); retval = 6; @@ -1677,7 +1676,7 @@ static void sub_801084C(u8 taskId) switch (gTasks[taskId].data[0]) { case 0: - if (sub_800FC60()) + if (AreNoPlayersReceiving()) { ResetBlockReceivedFlags(); sub_800B348(); @@ -1707,7 +1706,7 @@ static void sub_801084C(u8 taskId) case 3: if (Rfu.parentChild == MODE_PARENT) { - if (sub_800FC60()) + if (AreNoPlayersReceiving()) { Rfu.unk_5a = 0; RfuPrepareSendBuffer(RFU_COMMAND_0xA100); @@ -1749,13 +1748,13 @@ static void sub_801084C(u8 taskId) } } -static void sub_80109E8(u16 a0) +static void ClearSelectedLinkPlayerIds(u16 selected) { s32 i; for (i = 0; i < RFU_CHILD_MAX; i++) { - if ((a0 >> i) & 1) + if ((selected >> i) & 1) Rfu.linkPlayerIdx[i] = 0; } } @@ -1965,12 +1964,12 @@ static void CopyPlayerNameToUnameBuffer(void) void ClearAndInitHostRFUtgtGname(void) { memset(&gHostRFUtgtGnameBuffer, 0, RFU_GAME_NAME_LENGTH); - sub_800DD94(&gHostRFUtgtGnameBuffer, 0, FALSE, 0); + InitHostRFUtgtGname(&gHostRFUtgtGnameBuffer, 0, FALSE, 0); } void SetHostRFUtgtGname(u8 activity, u32 child_sprite_genders, u32 started) { - sub_800DD94(&gHostRFUtgtGnameBuffer, activity, started, child_sprite_genders); + InitHostRFUtgtGname(&gHostRFUtgtGnameBuffer, activity, started, child_sprite_genders); } void SetGnameBufferWonderFlags(bool32 hasNews, bool32 hasCard) @@ -2123,7 +2122,7 @@ static void sub_801120C(u8 msg, u8 paramCount) rfu_REQ_disconnect(Rfu.acceptSlot_flag ^ lman.acceptSlot_flag); rfu_waitREQComplete(); } - Rfu.state = 0x11; + Rfu.state = 17; break; case LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY: Rfu.linkLossRecoveryState = 1; @@ -2213,7 +2212,7 @@ void sub_8011404(u8 msg, u8 unused1) break; case LMAN_MSG_LINK_RECOVERY_SUCCESSED: Rfu.linkLossRecoveryState = 3; - Rfu.unk_c3c = 1; + Rfu.linkRecovered = TRUE; break; case 0x34: break; @@ -2256,7 +2255,7 @@ 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) { @@ -2362,7 +2361,7 @@ static void sub_8011674(u8 msg, u8 paramCount) case LMAN_MSG_LINK_RECOVERY_SUCCESSED: Rfu.linkLossRecoveryState = 3; if (gRfuLinkStatus->parentChild == MODE_CHILD) - Rfu.unk_c3c = 1; + Rfu.linkRecovered = TRUE; break; case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED: Rfu.linkLossRecoveryState = 2; @@ -2562,7 +2561,7 @@ static u8 GetPartnerIndexByNameAndTrainerID(const u8 *name, u16 id) for (i = 0; i < RFU_CHILD_MAX; i++) { u16 trainerId = ReadU16(gRfuLinkStatus->partner[i].gname + 2); - if (RfuSerialNumberIsValid(gRfuLinkStatus->partner[i].serialNo) + if (IsRfuSerialNumberValid(gRfuLinkStatus->partner[i].serialNo) && !StringCompare(name, gRfuLinkStatus->partner[i].uname) && id == trainerId) { @@ -2784,7 +2783,7 @@ void sub_8012188(const u8 *name, struct GFtgtGname *structPtr, u8 activity) } } -bool8 sub_8012224(void) +bool8 IsRfuRecoveringFromLinkLoss(void) { if (Rfu.linkLossRecoveryState == 1) return TRUE; diff --git a/src/link_rfu_3.c b/src/link_rfu_3.c index dc032b403..4946cb9f2 100644 --- a/src/link_rfu_3.c +++ b/src/link_rfu_3.c @@ -7,30 +7,101 @@ #include "text.h" #include "event_data.h" +struct RfuUnusedQueue +{ + u8 slots[2][256]; + 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 +120,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,7 +234,7 @@ const struct OamData sWirelessStatusIndicatorOamData = .paletteNum = 0, }; -const union AnimCmd sWirelessStatusIndicatorAnim0[] = { +static const union AnimCmd sWirelessStatusIndicatorAnim0[] = { // 3 bars ANIMCMD_FRAME( 4, 5), ANIMCMD_FRAME( 8, 5), @@ -109,7 +245,7 @@ const union AnimCmd sWirelessStatusIndicatorAnim0[] = { ANIMCMD_JUMP(0) }; -const union AnimCmd sWirelessStatusIndicatorAnim1[] = { +static const union AnimCmd sWirelessStatusIndicatorAnim1[] = { // 2 bars ANIMCMD_FRAME( 4, 5), ANIMCMD_FRAME( 8, 5), @@ -118,28 +254,28 @@ const union AnimCmd sWirelessStatusIndicatorAnim1[] = { ANIMCMD_JUMP(0) }; -const union AnimCmd sWirelessStatusIndicatorAnim2[] = { +static const union AnimCmd sWirelessStatusIndicatorAnim2[] = { // 1 bar ANIMCMD_FRAME(4, 5), ANIMCMD_FRAME(8, 5), ANIMCMD_JUMP(0) }; -const union AnimCmd sWirelessStatusIndicatorAnim3[] = { +static const union AnimCmd sWirelessStatusIndicatorAnim3[] = { // searching ANIMCMD_FRAME( 4, 10), ANIMCMD_FRAME(20, 10), ANIMCMD_JUMP(0) }; -const union AnimCmd sWirelessStatusIndicatorAnim4[] = { +static const union AnimCmd sWirelessStatusIndicatorAnim4[] = { // error ANIMCMD_FRAME(24, 10), ANIMCMD_FRAME( 4, 10), ANIMCMD_JUMP(0) }; -const union AnimCmd *const sWirelessStatusIndicatorAnims[] = { +static const union AnimCmd *const sWirelessStatusIndicatorAnims[] = { sWirelessStatusIndicatorAnim0, sWirelessStatusIndicatorAnim1, sWirelessStatusIndicatorAnim2, @@ -147,15 +283,15 @@ const union AnimCmd *const sWirelessStatusIndicatorAnims[] = { sWirelessStatusIndicatorAnim4 }; -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 = { +static const struct SpriteTemplate sWirelessStatusIndicatorSpriteTemplate = { 0xD431, 0xD432, &sWirelessStatusIndicatorOamData, @@ -165,7 +301,7 @@ const struct SpriteTemplate sWirelessStatusIndicatorSpriteTemplate = { SpriteCallbackDummy }; -void sub_800D6C8(struct RfuRecvQueue *ptr) +void RfuRecvQueue_Reset(struct RfuRecvQueue *queue) { s32 i; s32 j; @@ -174,16 +310,16 @@ void sub_800D6C8(struct RfuRecvQueue *ptr) { for (j = 0; j < 70; j++) { - ptr->unk_00[i][j] = 0; + queue->slots[i][j] = 0; } } - ptr->unk_8c1 = 0; - ptr->unk_8c0 = 0; - ptr->count = 0; - ptr->full = FALSE; + queue->sendSlot = 0; + queue->recvSlot = 0; + queue->count = 0; + queue->full = FALSE; } -void sub_800D724(struct RfuSendQueue *ptr) +void RfuSendQueue_Reset(struct RfuSendQueue *queue) { s32 i; s32 j; @@ -192,16 +328,16 @@ void sub_800D724(struct RfuSendQueue *ptr) { for (j = 0; j < 14; j++) { - ptr->unk_00[i][j] = 0; + queue->slots[i][j] = 0; } } - ptr->unk_231 = 0; - ptr->unk_230 = 0; - ptr->count = 0; - ptr->full = FALSE; + 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; @@ -210,29 +346,29 @@ void sub_800D780(struct UnkRfuStruct_Sub_Unused *ptr) { for (j = 0; j < 256; 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 RfuRecvQueue *q1, u8 *q2) +void RfuRecvQueue_Enqueue(struct RfuRecvQueue *queue, u8 *data) { s32 i; u16 imeBak; u8 count; - if (q1->count < 32) + if (queue->count < 32) { imeBak = REG_IME; REG_IME = 0; count = 0; for (i = 0; i < 70; i += 14) { - if (q2[i] == 0 && q2[i + 1] == 0) + if (data[i] == 0 && data[i + 1] == 0) { count++; } @@ -241,36 +377,36 @@ void sub_800D7D8(struct RfuRecvQueue *q1, u8 *q2) { for (i = 0; i < 70; i++) { - q1->unk_00[q1->unk_8c0][i] = q2[i]; + queue->slots[queue->recvSlot][i] = data[i]; } - q1->unk_8c0++; - q1->unk_8c0 %= 32; - q1->count++; + queue->recvSlot++; + queue->recvSlot %= 32; + queue->count++; for (i = 0; i < 70; i++) { - q2[i] = 0; + data[i] = 0; } } REG_IME = imeBak; } else { - q1->full = TRUE; + queue->full = TRUE; } } -void sub_800D888(struct RfuSendQueue *q1, u8 *q2) +void RfuSendQueue_Enqueue(struct RfuSendQueue *queue, u8 *data) { s32 i; u16 imeBak; - if (q1->count < 40) + if (queue->count < 40) { imeBak = REG_IME; REG_IME = 0; for (i = 0; i < 14; i++) { - if (q2[i] != 0) + if (data[i] != 0) { break; } @@ -279,156 +415,153 @@ void sub_800D888(struct RfuSendQueue *q1, u8 *q2) { for (i = 0; i < 14; i++) { - q1->unk_00[q1->unk_230][i] = q2[i]; + queue->slots[queue->recvSlot][i] = data[i]; } - q1->unk_230++; - q1->unk_230 %= 40; - q1->count++; + queue->recvSlot++; + queue->recvSlot %= 40; + queue->count++; for (i = 0; i < 14; i++) { - q2[i] = 0; + data[i] = 0; } } REG_IME = imeBak; } else { - q1->full = TRUE; + queue->full = TRUE; } } -bool8 sub_800D934(struct RfuRecvQueue *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->full) + if (queue->recvSlot == queue->sendSlot || queue->full) { for (i = 0; i < 70; i++) { - q2[i] = 0; + src[i] = 0; } REG_IME = imeBak; return FALSE; } for (i = 0; i < 70; 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->count--; + queue->sendSlot++; + queue->sendSlot %= 32; + queue->count--; REG_IME = imeBak; return TRUE; } -bool8 sub_800D9DC(struct RfuSendQueue *q1, u8 *q2) +bool8 RfuSendQueue_Dequeue(struct RfuSendQueue *queue, u8 *src) { s32 i; u16 imeBak; - if (q1->unk_230 == q1->unk_231 || q1->full) - { + 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]; + src[i] = queue->slots[queue->sendSlot][i]; } - q1->unk_231++; - q1->unk_231 %= 40; - q1->count--; + queue->sendSlot++; + queue->sendSlot %= 40; + 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]; + queue->slots[queue->recvSlot][i] = data[i]; } - q1->unk_1c++; - q1->unk_1c %= 2; - if (q1->count < 2) + queue->recvSlot++; + queue->recvSlot %= 2; + if (queue->count < 2) { - q1->count++; + 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->count == 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]; + src[i] = queue->slots[queue->sendSlot][i]; } } - q1->unk_1d++; - q1->unk_1d %= 2; - q1->count--; + queue->sendSlot++; + queue->sendSlot %= 2; + 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 < 2) { for (i = 0; i < 256; i++) { - q1->unk_00[q1->unk_200][i] = q2[i]; + queue->slots[queue->recvSlot][i] = data[i]; } - q1->unk_200++; - q1->unk_200 %= 2; - q1->unk_202++; + queue->recvSlot++; + queue->recvSlot %= 2; + 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]; + dest[i] = queue->slots[queue->sendSlot][i]; } - q1->unk_201++; - q1->unk_201 %= 2; - q1->unk_202--; + queue->sendSlot++; + queue->sendSlot %= 2; + queue->count--; return TRUE; } @@ -467,47 +600,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 +663,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 +733,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,19 +741,19 @@ 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); @@ -629,31 +763,31 @@ 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 (RfuSerialNumberIsValid(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 (RfuSerialNumberIsValid(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); } } @@ -665,22 +799,22 @@ bool8 LinkRfu_GetNameIfSerial7F7D(struct GFtgtGname *buff1, u8 *buff2, u8 idx) bool8 retVal = FALSE; if (gRfuLinkStatus->partner[idx].serialNo == 0x7F7D) { - 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 LinkRfu3_SetGnameUnameFromStaticBuffers(struct GFtgtGname *buff1, u8 *buff2) { - memcpy(buff1, &gHostRFUtgtGnameBuffer, 0xD); - memcpy(buff2, gHostRFUtgtUnameBuffer, 8); + memcpy(buff1, &gHostRFUtgtGnameBuffer, RFU_GAME_NAME_LENGTH); + memcpy(buff2, gHostRFUtgtUnameBuffer, PLAYER_NAME_LENGTH + 1); } void CreateWirelessStatusIndicatorSprite(u8 x, u8 y) @@ -692,7 +826,7 @@ 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; @@ -730,11 +864,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,7 +879,7 @@ u8 sub_800E124(void) return 0; } -void sub_800E15C(struct Sprite *sprite, s32 signalStrengthAnimNum) +static void SetWirelessStatusIndicatorAnim(struct Sprite *sprite, s32 signalStrengthAnimNum) { if (sprite->data[2] != signalStrengthAnimNum) { @@ -755,50 +889,50 @@ void sub_800E15C(struct Sprite *sprite, s32 signalStrengthAnimNum) } } -void sub_800E174(void) +void UpdateWirelessStatusIndicatorSprite(void) { if (gWirelessStatusIndicatorSpriteId != 0xFF && gSprites[gWirelessStatusIndicatorSpriteId].data[7] == 0x1234) { 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; } - else if (signalStrength < 25) + else if (signalStrength <= RFU_LINK_ICON_LEVEL1_MAX) { sprite->data[0] = 3; } - else if (signalStrength >= 25 && signalStrength < 127) + else if (signalStrength >= RFU_LINK_ICON_LEVEL2_MIN && signalStrength <= RFU_LINK_ICON_LEVEL2_MAX) { sprite->data[0] = 2; } - else if (signalStrength >= 127 && signalStrength < 229) + else if (signalStrength >= RFU_LINK_ICON_LEVEL3_MIN && signalStrength <= RFU_LINK_ICON_LEVEL3_MAX) { sprite->data[0] = 1; } - else if (signalStrength >= 229) + else if (signalStrength >= RFU_LINK_ICON_LEVEL4_MIN) { sprite->data[0] = 0; } if (sprite->data[0] != sprite->data[1]) { - sub_800E15C(sprite, sprite->data[0]); + SetWirelessStatusIndicatorAnim(sprite, sprite->data[0]); sprite->data[1] = sprite->data[0]; } if (sprite->anims[sprite->data[2]][sprite->data[4]].frame.duration < sprite->data[3]) @@ -827,22 +961,20 @@ void sub_800E174(void) } } -void CopyTrainerRecord(struct TrainerNameRecord *dest, u32 trainerId, const u8 *name) +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; } @@ -862,7 +994,7 @@ void RecordMixTrainerNames(void) 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 +1022,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,7 +1035,7 @@ 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); } } @@ -912,16 +1044,13 @@ 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 +1059,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 b95839e82..5249d11fa 100644 --- a/src/main.c +++ b/src/main.c @@ -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; -- cgit v1.2.3 From 35867f531bbcfaf360045160734a1ff09ce0f6d8 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Mon, 8 Jun 2020 00:45:06 -0400 Subject: Some link rfu cleanup / link.c documentation --- common_syms/link.txt | 18 ++-- include/gba/types.h | 3 + include/link.h | 20 ++-- include/link_rfu.h | 68 +++++-------- src/berry_blender.c | 4 +- src/cable_club.c | 16 ++-- src/contest_link_80FC4F4.c | 2 +- src/dodrio_berry_picking.c | 6 +- src/field_screen_effect.c | 4 +- src/link.c | 162 ++++++++++++++----------------- src/link_rfu_2.c | 190 ++++++++++++++++++++----------------- src/link_rfu_3.c | 231 +++++++++++++++++++++++---------------------- src/record_mixing.c | 4 +- src/start_menu.c | 2 +- src/union_room.c | 2 +- 15 files changed, 355 insertions(+), 377 deletions(-) diff --git a/common_syms/link.txt b/common_syms/link.txt index a6d096116..09def0aed 100644 --- a/common_syms/link.txt +++ b/common_syms/link.txt @@ -3,15 +3,15 @@ gLinkDebugSeed gLocalLinkPlayerBlock gLinkErrorOccurred gLinkDebugFlags -gFiller_03003074 +gLinkFiller1 gRemoteLinkPlayersNotReceived gBlockReceivedStatus -gFiller_03003080 +gLinkFiller2 gLinkHeldKeys gRecvCmds gLinkStatus -gUnknown_030030E4 -gUnknown_030030E8 +gLinkDummy1 +gLinkDummy2 gUnknown_030030EC gUnknown_030030F0 gUnknown_030030F4 @@ -26,12 +26,12 @@ gLinkCallback gShouldAdvanceLinkState gLinkTestBlockChecksums gBlockRequestType -gFiller_03003154 -gFiller_03003158 -gFiller_0300315c +gLinkFiller3 +gLinkFiller4 +gLinkFiller5 gLastSendQueueCount gLink gLastRecvQueueCount gLinkSavedIme -gFiller_03004138 -gFiller_0300413C +gLinkFiller6 +gLinkFiller7 diff --git a/include/gba/types.h b/include/gba/types.h index 7163f925f..35d02e263 100644 --- a/include/gba/types.h +++ b/include/gba/types.h @@ -27,6 +27,9 @@ typedef double f64; typedef u8 bool8; typedef u16 bool16; typedef u32 bool32; +typedef vu8 vbool8; +typedef vu16 vbool16; +typedef vu32 vbool32; struct BgCnt { diff --git a/include/link.h b/include/link.h index d33b84c79..25e62ff1e 100644 --- a/include/link.h +++ b/include/link.h @@ -284,13 +284,13 @@ void sub_800A418(void); void SetSuppressLinkErrorMessage(bool8 flag); void sub_800B524(struct LinkPlayer *linkPlayer); u8 GetSioMultiSI(void); -void sub_800AAF4(void); -void sub_800AF18(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06); +void ClearSavedLinkPlayers(void); +void BufferLinkErrorInfo(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06); void sub_800B348(void); void LinkPlayerFromBlock(u32 who); -bool32 sub_800A07C(void); +bool32 Link_AnyPartnersPlayingFRLG_JP(void); void ResetLinkPlayerCount(void); -void sub_800AA04(u8 a0); +void SaveLinkPlayers(u8 a0); void SetWirelessCommType0(void); bool32 sub_800B504(void); @@ -330,18 +330,18 @@ extern u32 gFiller_03003080; extern struct LinkPlayer gLocalLinkPlayer; bool32 Link_AnyPartnersPlayingRubyOrSapphire(void); -bool32 sub_800A03C(void); +bool32 LinkDummy_Return2(void); void SetLocalLinkPlayerId(u8); u8 GetSavedPlayerCount(void); void sub_8009FAC(void); bool8 sub_800A4D8(u8 a0); -u8 sub_800A9D8(void); +u8 GetLinkPlayerCountAsBitFlags(void); u8 sub_800A0C8(s32, s32); -u8 sub_800A9A8(void); +u8 GetSavedLinkPlayerCountAsBitFlags(void); void sub_800AD10(void); -void sub_800AB18(void); -void sub_8009F18(void); -bool8 sub_800AA60(void); +void CheckLinkPlayersMatchSaved(void); +void StartSendingKeysToLink(void); +bool8 DoesLinkPlayerCountMatchSaved(void); void sub_800ABF4(u16 a0); bool32 IsSendingKeysToLink(void); u32 GetLinkRecvQueueLength(void); diff --git a/include/link_rfu.h b/include/link_rfu.h index 46ed3c30a..b88d0af83 100644 --- a/include/link_rfu.h +++ b/include/link_rfu.h @@ -18,6 +18,17 @@ #define RFU_COMMAND_0xEE00 0xEE00 #define RFU_COMMAND_0xED00 0xED00 +#define RFU_SERIAL_7F7D 0x7F7D + +#define RECV_QUEUE_NUM_SLOTS 32 +#define RECV_QUEUE_SLOT_LENGTH (14 * MAX_RFU_PLAYERS) + +#define SEND_QUEUE_NUM_SLOTS 40 +#define SEND_QUEUE_SLOT_LENGTH 14 + +#define BACKUP_QUEUE_NUM_SLOTS 2 +#define BACKUP_QUEUE_SLOT_LENGTH 14 + // RfuTgtData.gname is read as these structs. struct GFtgtGnameSub { @@ -48,35 +59,6 @@ struct __attribute__((packed, aligned(2))) GFtgtGname u8 padding; }; // size: RFU_GNAME_SIZE -struct UnkLinkRfuStruct_02022B2C -{ - u8 unk_00; - u8 unk_01; - u16 unk_02; - u8 unk_04; - u16 unk_06; - struct GFtgtGname *unk_08; - u8 *unk_0c; - u8 unk_10; - u8 unk_11; - u16 unk_12; - u16 unk_14; -}; - -struct UnkLinkRfuStruct_02022B44 -{ - u8 fill_00[6]; - u16 unk_06; - u8 fill_08[6]; - vu8 unk_0e; - u8 unk_0f; - u8 fill_10[0x54]; - u16 unk_64; - u8 fill_66[0x1d]; - u8 unk_83; - u8 fill_84[0x58]; -}; - struct RfuBlockSend { /* 0x00 */ u16 next; @@ -91,7 +73,7 @@ struct RfuBlockSend struct RfuRecvQueue { - /* 0x000 */ u8 slots[32][70]; + /* 0x000 */ u8 slots[RECV_QUEUE_NUM_SLOTS][RECV_QUEUE_SLOT_LENGTH]; /* 0x8c0 */ vu8 recvSlot; /* 0x8c1 */ vu8 sendSlot; /* 0x8c2 */ vu8 count; @@ -100,7 +82,7 @@ struct RfuRecvQueue struct RfuSendQueue { - /* 0x000 */ u8 slots[40][14]; + /* 0x000 */ u8 slots[SEND_QUEUE_NUM_SLOTS][SEND_QUEUE_SLOT_LENGTH]; /* 0x230 */ vu8 recvSlot; /* 0x231 */ vu8 sendSlot; /* 0x232 */ vu8 count; @@ -109,7 +91,7 @@ struct RfuSendQueue struct RfuBackupQueue { - /* 0x00 */ u8 slots[2][14]; + /* 0x00 */ u8 slots[BACKUP_QUEUE_NUM_SLOTS][BACKUP_QUEUE_SLOT_LENGTH]; /* 0x1c */ vu8 recvSlot; /* 0x1d */ vu8 sendSlot; /* 0x1e */ vu8 count; @@ -123,11 +105,11 @@ struct GFRfuManager /* 0x00a */ u16 linkmanMsg; /* 0x00c */ u8 parentChild; /* 0x00d */ u8 playerCount; - /* 0x00e */ u8 unk_0e; + /* 0x00e */ bool8 unk_0e; /* 0x00f */ u8 unk_0f; /* 0x010 */ u16 unk_10; /* 0x012 */ u16 unk_12; - /* 0x014 */ u8 unk_14[4][14]; + /* 0x014 */ u8 unk_14[RFU_CHILD_MAX][14]; /* 0x04c */ u8 unk_4c[14]; /* 0x05a */ u8 unk_5a; /* 0x05b */ u8 unk_5b; @@ -136,8 +118,8 @@ struct GFRfuManager /* 0x066 */ u8 idleTaskId; /* 0x067 */ u8 searchTaskId; /* 0x068 */ u8 filler_68[4]; - /* 0x06c */ struct RfuBlockSend unk_6c; - /* 0x080 */ struct RfuBlockSend unk_80[MAX_RFU_PLAYERS]; + /* 0x06c */ struct RfuBlockSend sendBlock; + /* 0x080 */ struct RfuBlockSend recvBlock[MAX_RFU_PLAYERS]; /* 0x0e4 */ u8 unk_e4[5]; /* 0x0e9 */ u8 unk_e9[5]; /* 0x0ee */ vu8 errorState; @@ -170,8 +152,8 @@ struct GFRfuManager /* 0xcd5 */ u8 unk_cd5[4]; /* 0xcd9 */ u8 unk_cd9; /* 0xcda */ u8 unk_cda; - /* 0xcdb */ vu8 unk_cdb; - /* 0xcdc */ vu8 unk_cdc; + /* 0xcdb */ vbool8 unk_cdb; + /* 0xcdc */ vbool8 unk_cdc; /* 0xcdd */ u8 unk_cdd; /* 0xcde */ u8 linkPlayerIdx[RFU_CHILD_MAX]; /* 0xce2 */ u8 unk_ce2; @@ -195,7 +177,7 @@ extern u8 gWirelessStatusIndicatorSpriteId; // Exported ROM declarations void WipeTrainerNameRecords(void); -void sub_800E700(void); +void InitRFUAPI(void); void LinkRfu_Shutdown(void); void Rfu_SetBlockReceivedFlag(u8 who); void Rfu_ResetBlockReceivedFlag(u8 who); @@ -264,7 +246,6 @@ bool8 LinkRfu_GetNameIfSerial7F7D(struct GFtgtGname *buff1, u8 *buff2, u8 idx); s32 sub_800E87C(u8 idx); void CreateTask_RfuIdle(void); void DestroyTask_RfuIdle(void); -void sub_8010198(void); void sub_8011AC8(void); void LinkRfu_FatalError(void); bool32 sub_8011A9C(void); @@ -273,7 +254,6 @@ void sub_8011A50(void); void sub_80110B8(u32 a0); bool32 IsRfuSerialNumberValid(u32 serialNo); bool8 IsRfuRecoveringFromLinkLoss(void); -void sub_8011BA4(void); void RfuRecvQueue_Reset(struct RfuRecvQueue *queue); void RfuSendQueue_Reset(struct RfuSendQueue *queue); void RfuRecvQueue_Enqueue(struct RfuRecvQueue *queue, u8 *data); @@ -282,13 +262,9 @@ bool8 RfuRecvQueue_Dequeue(struct RfuRecvQueue *queue, u8 *dest); bool8 RfuSendQueue_Dequeue(struct RfuSendQueue *queue, u8 *dest); void RfuBackupQueue_Enqueue(struct RfuBackupQueue *queue, const u8 *q2); bool8 RfuBackupQueue_Dequeue(struct RfuBackupQueue *queue, u8 *q2); -void sub_800DBF8(u8 *q1, u8 mode); -u8 sub_800DD1C(u8 maxFlags); -void InitHostRFUtgtGname(struct GFtgtGname *data, u8 r9, bool32 r2, s32 r3); +void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 started, s32 child_sprite_genders); void CreateWirelessStatusIndicatorSprite(u8 x, u8 y); void DestroyWirelessStatusIndicatorSprite(void); void LoadWirelessStatusIndicatorSpriteGfx(void); -u8 sub_800E124(void); -void sub_800E15C(struct Sprite *sprite, s32 signalStrengthAnimNum); #endif //GUARD_LINK_RFU_H diff --git a/src/berry_blender.c b/src/berry_blender.c index dfa378552..f999b750b 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++) { @@ -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/cable_club.c b/src/cable_club.c index ffd7bcd8f..15e468390 100644 --- a/src/cable_club.c +++ b/src/cable_club.c @@ -283,7 +283,7 @@ static void Task_LinkupAwaitConfirmation(u8 taskId) if (linkPlayerCount < tMinPlayers) return; - sub_800AA04(linkPlayerCount); + SaveLinkPlayers(linkPlayerCount); ClearLinkPlayerCountWindow(tWindowId); ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1); ShowFieldAutoScrollMessage(gText_ConfirmStartLinkWithXPlayers); @@ -372,7 +372,7 @@ static void Task_LinkupExchangeDataWithLeader(u8 taskId) { 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); @@ -420,7 +420,7 @@ static void Task_LinkupCheckStatusAfterConfirm(u8 taskId) { 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); @@ -516,7 +516,7 @@ static void Task_LinkupAwaitTrainerCardData(u8 taskId) if (CheckLinkErrored(taskId) == TRUE) return; - if (GetBlockReceivedStatus() != sub_800A9A8()) + if (GetBlockReceivedStatus() != GetSavedLinkPlayerCountAsBitFlags()) return; for (index = 0; index < GetLinkPlayerCount(); index++) @@ -800,8 +800,8 @@ static void Task_ReestablishLinkAwaitConfirmation(u8 taskId) if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE) { - sub_800AB18(); - sub_8009F18(); + CheckLinkPlayersMatchSaved(); + StartSendingKeysToLink(); DestroyTask(taskId); } } @@ -901,7 +901,7 @@ static void Task_StartWirelessCableClubBattle(u8 taskId) tState = 3; break; case 3: - if (GetBlockReceivedStatus() == sub_800A9D8()) + if (GetBlockReceivedStatus() == GetLinkPlayerCountAsBitFlags()) { for (i = 0; i < GetLinkPlayerCount(); i++) { @@ -1236,7 +1236,7 @@ void Task_WaitForLinkPlayerConnection(u8 taskId) // Players connected, destroy task if (gWirelessCommType == 0) { - if (!sub_800AA60()) + if (!DoesLinkPlayerCountMatchSaved()) { CloseLink(); SetMainCallback2(CB2_LinkError); 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/dodrio_berry_picking.c b/src/dodrio_berry_picking.c index ccb1e28eb..cfc5643b4 100644 --- a/src/dodrio_berry_picking.c +++ b/src/dodrio_berry_picking.c @@ -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; diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index e5815e6ae..b1ca8b831 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -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/link.c b/src/link.c index 3e4cc0c05..2f19d7aea 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,15 @@ 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; +u32 gLinkFiller6; +u32 gLinkFiller7; EWRAM_DATA u8 gLinkTestDebugValuesEnabled = 0; EWRAM_DATA u8 gUnknown_020223BD = 0; @@ -130,10 +122,10 @@ 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); @@ -243,7 +235,7 @@ static const u8 sUnused_082ED224[] = {0x00, 0xFF, 0xFE, 0xFF, 0x00}; bool8 IsWirelessAdapterConnected(void) { SetWirelessCommType1(); - sub_800E700(); + InitRFUAPI(); if (rfu_LMAN_REQBN_softReset_and_checkID() == 0x8001) { rfu_REQ_stopMode(); @@ -301,7 +293,7 @@ void LinkTestScreen(void) ResetSpriteData(); FreeAllSpritePalettes(); ResetTasks(); - SetVBlankCallback(sub_80096BC); + SetVBlankCallback(VBlankCB_LinkError); ResetBlockSend(); gLinkType = LINKTYPE_TRADE; OpenLink(); @@ -317,7 +309,7 @@ void LinkTestScreen(void) AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); - gUnknown_03000D60 = 0; + sDummy3 = FALSE; InitLocalLinkPlayer(); CreateTask(Task_PrintTestData, 0); SetMainCallback2(CB2_LinkTest); @@ -344,7 +336,7 @@ static void InitLocalLinkPlayer(void) } } -static void sub_80096BC(void) +static void VBlankCB_LinkError(void) { LoadOam(); ProcessSpriteCopyRequests(); @@ -355,9 +347,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(); @@ -386,15 +378,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++) @@ -503,7 +495,7 @@ u16 LinkMain2(const u16 *heldKeys) { return 0; } - for (i = 0; i < 8; i++) + for (i = 0; i < CMD_LENGTH; i++) { gSendCmd[i] = 0; } @@ -566,10 +558,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: { @@ -726,70 +718,56 @@ static void BuildSendCmd(u16 command) } } -void sub_8009F18(void) +void StartSendingKeysToLink(void) { if (gWirelessCommType) - { StartSendingKeysToRfu(); - } - gLinkCallback = sub_8009F70; + + 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 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; @@ -797,22 +775,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; } @@ -821,18 +799,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; @@ -983,7 +961,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; } @@ -1016,7 +994,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]; } @@ -1313,7 +1291,7 @@ void SetLinkDebugValues(u32 seed, u32 flags) gLinkDebugFlags = flags; } -u8 sub_800A9A8(void) +u8 GetSavedLinkPlayerCountAsBitFlags(void) { int i; u8 flags; @@ -1326,7 +1304,7 @@ u8 sub_800A9A8(void) return flags; } -u8 sub_800A9D8(void) +u8 GetLinkPlayerCountAsBitFlags(void) { int i; u8 flags; @@ -1339,11 +1317,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++) { @@ -1358,17 +1336,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) @@ -1376,9 +1354,7 @@ bool8 sub_800AA60(void) if (gLinkType == LINKTYPE_BATTLE_TOWER) { if (gLinkType == gLinkPlayers[i].linkType) - { count++; - } } else { @@ -1396,7 +1372,7 @@ bool8 sub_800AA60(void) return FALSE; } -void sub_800AAF4(void) +void ClearSavedLinkPlayers(void) { int i; @@ -1407,13 +1383,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(); @@ -1442,9 +1419,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) @@ -1458,7 +1436,7 @@ void sub_800ABF4(u16 a0) if (gLinkCallback == NULL) { gLinkCallback = sub_800AC80; - gUnknown_030030E4 = FALSE; + gLinkDummy1 = FALSE; gUnknown_030030F4 = a0; } } @@ -1479,7 +1457,7 @@ void sub_800AC34(void) else { gLinkCallback = sub_800AC80; - gUnknown_030030E4 = FALSE; + gLinkDummy1 = FALSE; gUnknown_030030F4 = 0; } } @@ -1515,7 +1493,7 @@ static void sub_800ACAC(void) gLinkVSyncDisabled = TRUE; CloseLink(); gLinkCallback = NULL; - gUnknown_030030E4 = TRUE; + gLinkDummy1 = TRUE; } } @@ -1534,7 +1512,7 @@ void sub_800AD10(void) else { gLinkCallback = sub_800AD5C; - gUnknown_030030E4 = FALSE; + gLinkDummy1 = FALSE; gUnknown_030030F4 = 0; } } @@ -1574,7 +1552,7 @@ static void sub_800AD88(void) gLinkVSyncDisabled = TRUE; CloseLink(); gLinkCallback = NULL; - gUnknown_030030E4 = TRUE; + gLinkDummy1 = TRUE; } } @@ -1590,7 +1568,7 @@ void sub_800ADF8(void) { gLinkCallback = sub_800AE30; } - gUnknown_030030E4 = FALSE; + gLinkDummy1 = FALSE; } } @@ -1642,7 +1620,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; @@ -1673,7 +1651,7 @@ void CB2_LinkError(void) } ResetLinkRfuGFLayer(); } - SetVBlankCallback(sub_80096BC); + SetVBlankCallback(VBlankCB_LinkError); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sLinkErrorBgTemplates, ARRAY_COUNT(sLinkErrorBgTemplates)); sLinkErrorBgTilemapBuffer = tilemapBuffer = malloc(0x800); diff --git a/src/link_rfu_2.c b/src/link_rfu_2.c index 6c6f12077..ac1488167 100644 --- a/src/link_rfu_2.c +++ b/src/link_rfu_2.c @@ -28,17 +28,31 @@ struct SioInfo u8 filler[92]; }; +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]; +}; + u32 gf_rfu_REQ_api[RFU_API_BUFF_SIZE_RAM / 4]; struct GFRfuManager Rfu; -BSS_DATA u8 gUnknown_03000D78[8]; -BSS_DATA u8 sResendBlock8[16]; -BSS_DATA u16 sResendBlock16[8]; +static u8 sHeldKeyCount; +static u8 sResendBlock8[16]; +static u16 sResendBlock16[8]; EWRAM_DATA struct GFtgtGname gHostRFUtgtGnameBuffer = {}; -EWRAM_DATA ALIGNED(2) u8 gHostRFUtgtUnameBuffer[PLAYER_NAME_LENGTH + 1] = {}; -EWRAM_DATA INIT_PARAM sRfuReqConfig = {}; -EWRAM_DATA struct UnkLinkRfuStruct_02022B44 gUnknown_02022B44 = {}; +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); @@ -146,8 +160,8 @@ static const struct { }; static const u16 sAcceptedSerialNos[] = { - 0x0002, // Pokemon FR/LG/EM - 0x7f7d, + 0x0002, + RFU_SERIAL_7F7D, 0x0000, 0xFFFF }; @@ -225,11 +239,11 @@ void ResetLinkRfuGFLayer(void) { Rfu.errorState = 0; } - for (i = 0; i < 5; i++) + for (i = 0; i < MAX_RFU_PLAYERS; i++) { - ResetSendDataManager(Rfu.unk_80 + i); + ResetSendDataManager(&Rfu.recvBlock[i]); } - ResetSendDataManager(&Rfu.unk_6c); + ResetSendDataManager(&Rfu.sendBlock); RfuRecvQueue_Reset(&Rfu.recvQueue); RfuSendQueue_Reset(&Rfu.sendQueue); CpuFill16(0, gSendCmd, sizeof gSendCmd); @@ -241,7 +255,7 @@ void InitRFU(void) { IntrFunc serialIntr = gIntrTable[1]; IntrFunc timerIntr = gIntrTable[2]; - sub_800E700(); + InitRFUAPI(); rfu_REQ_stopMode(); rfu_waitREQComplete(); REG_IME = 0; @@ -250,12 +264,12 @@ void InitRFU(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(); + ClearSavedLinkPlayers(); sub_80111B0(FALSE); ResetLinkRfuGFLayer(); rfu_setTimerInterrupt(3, gIntrTable + 2); @@ -288,7 +302,7 @@ static void Task_LinkLeaderSearchForChildren(u8 taskId) case 5: break; case 18: - Rfu.unk_cdb = 0; + Rfu.unk_cdb = FALSE; rfu_LMAN_setMSCCallback(sub_800EDBC); sub_800EAB4(); sub_800EAFC(); @@ -392,10 +406,10 @@ static void Task_JoinGroupSearchForParent(u8 taskId) rfu_UNI_setSendData(bmChildSlot, Rfu.unk_4c, sizeof(Rfu.unk_4c)); gTasks[taskId].data[1] = 8; DestroyTask(taskId); - if (gUnknown_02022B44.unk_0f == 0) + if (sRfuDebug.unk_0f == 0) { Debug_PrintEmpty(); - gUnknown_02022B44.unk_0f++; + sRfuDebug.unk_0f++; } CreateTask(sub_801084C, 5); break; @@ -474,7 +488,7 @@ static void Task_LinkRfu_UnionRoomListen(u8 taskId) case 15: break; case 16: - Rfu.unk_cdb = 0; + Rfu.unk_cdb = FALSE; rfu_LMAN_setMSCCallback(sub_800EDBC); UpdateGameData_GroupLockedIn(TRUE); sub_800EAB4(); @@ -513,7 +527,7 @@ static void sub_800ED34(u16 unused) { Rfu.unk_cd0++; RfuRecvQueue_Enqueue(&Rfu.recvQueue, Rfu.unk_c3f); - gUnknown_02022B44.unk_06++; + sRfuDebug.unk_06++; UpdateBackupQueue(); rfu_UNI_readySendData(Rfu.childSlot); rfu_UNI_clearRecvNewDataFlag(Rfu.childSlot); @@ -523,7 +537,7 @@ static void sub_800ED34(u16 unused) static void sub_800EDBC(u16 unused) { - Rfu.unk_cdb = 1; + Rfu.unk_cdb = TRUE; } void LinkRfu_Shutdown(void) @@ -657,11 +671,11 @@ static void sub_800EFB0(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; } @@ -695,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) { @@ -718,7 +732,7 @@ static bool32 sub_800F0F8(void) } 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) @@ -748,7 +762,7 @@ static bool32 sub_800F0F8(void) { rfu_REQ_PARENT_resumeRetransmitAndChange(); } - Rfu.unk_0e = 1; + Rfu.unk_0e = TRUE; } } return FALSE; @@ -762,10 +776,10 @@ static bool32 sub_800F1E0(void) u16 j; u8 retval; - if (Rfu.state >= 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.errorState != 0) { @@ -776,8 +790,8 @@ static 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 < RFU_CHILD_MAX; i++) { @@ -813,7 +827,7 @@ static bool32 sub_800F1E0(void) CallRfuFunc(); if (Rfu.unk_ce5 && !Rfu.unk_cd9) { - gUnknown_02022B44.unk_0e = 0; + sRfuDebug.unk_0e = FALSE; rfu_clearSlot(TYPE_UNI_SEND | TYPE_UNI_RECV, Rfu.unk_cda); for (i = 0; i < RFU_CHILD_MAX; i++) { @@ -833,10 +847,10 @@ static bool32 sub_800F1E0(void) } 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; @@ -914,8 +928,8 @@ static void HandleSendFailure(u8 unused, u32 flags) { s32 i, j; - const u8 *r10 = Rfu.unk_6c.payload; - for (i = 0; i < Rfu.unk_6c.count; i++) + const u8 *r10 = Rfu.sendBlock.payload; + for (i = 0; i < Rfu.sendBlock.count; i++) { if (!(flags & 1)) { @@ -932,7 +946,7 @@ static void HandleSendFailure(u8 unused, u32 flags) j++;j--; // Needed to match; } RfuSendQueue_Enqueue(&Rfu.sendQueue, sResendBlock8); - Rfu.unk_6c.failedFlags |= (1 << i); + Rfu.sendBlock.failedFlags |= (1 << i); } flags >>= 1; } @@ -949,7 +963,7 @@ void Rfu_SetBlockReceivedFlag(u8 linkPlayerId) void Rfu_ResetBlockReceivedFlag(u8 linkPlayerId) { Rfu.blockReceived[linkPlayerId] = FALSE; - Rfu.unk_80[linkPlayerId].receiving = 0; + Rfu.recvBlock[linkPlayerId].receiving = 0; } static u8 sub_800F74C(const u8 *a0) @@ -971,8 +985,8 @@ static void RfuFunc_SendKeysToRfu(void) && gHeldKeyCodeToSend != LINK_KEY_CODE_NULL && gLinkTransferringData != TRUE) { - gUnknown_03000D78[0]++; - gHeldKeyCodeToSend |= (gUnknown_03000D78[0] << 8); + sHeldKeyCount++; + gHeldKeyCodeToSend |= (sHeldKeyCount << 8); RfuPrepareSendBuffer(RFU_COMMAND_0xBE00); } } @@ -1032,28 +1046,28 @@ static void RfuHandleReceiveCommand(u8 unused) } break; case RFU_COMMAND_0x8800: - if (Rfu.unk_80[i].receiving == 0) + if (Rfu.recvBlock[i].receiving == 0) { - Rfu.unk_80[i].next = 0; - Rfu.unk_80[i].count = gRecvCmds[i][1]; - Rfu.unk_80[i].owner = gRecvCmds[i][2]; - Rfu.unk_80[i].receivedFlags = 0; - Rfu.unk_80[i].receiving = 1; + 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 RFU_COMMAND_0x8900: - if (Rfu.unk_80[i].receiving == 1) + if (Rfu.recvBlock[i].receiving == 1) { - Rfu.unk_80[i].next = gRecvCmds[i][0] & 0xff; - Rfu.unk_80[i].receivedFlags |= (1 << Rfu.unk_80[i].next); + 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].next * 6 + j] = gRecvCmds[i][j + 1]; - if (Rfu.unk_80[i].receivedFlags == sAllBlocksReceived[Rfu.unk_80[i].count]) + 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].receiving = 2; + Rfu.recvBlock[i].receiving = 2; Rfu_SetBlockReceivedFlag(i); - if (GetHostRFUtgtGname()->activity == 0x45 && gReceivedRemoteLinkPlayers != 0 && Rfu.parentChild == MODE_CHILD) + if (GetHostRFUtgtGname()->activity == (ACTIVITY_CHAT | IN_UNION_ROOM) && gReceivedRemoteLinkPlayers != 0 && Rfu.parentChild == MODE_CHILD) ValidateAndReceivePokemonSioInfo(gBlockRecvBuffer); } } @@ -1123,7 +1137,7 @@ static bool8 AreNoPlayersReceiving(void) for (i = 0; i < MAX_RFU_PLAYERS; i++) { - if (Rfu.unk_80[i].receiving) + if (Rfu.recvBlock[i].receiving) return FALSE; } return TRUE; @@ -1135,7 +1149,7 @@ static bool8 sub_800FC88(void) for (i = 0; i < Rfu.playerCount; i++) { - if (Rfu.unk_80[i].receiving != 2 || Rfu.blockReceived[i] != TRUE) + if (Rfu.recvBlock[i].receiving != 2 || Rfu.blockReceived[i] != TRUE) return FALSE; } return TRUE; @@ -1159,7 +1173,7 @@ u8 Rfu_GetBlockReceivedStatus(void) for (i = 0; i < MAX_RFU_PLAYERS; i++) { - if (Rfu.unk_80[i].receiving == 2 && Rfu.blockReceived[i] == TRUE) + if (Rfu.recvBlock[i].receiving == 2 && Rfu.blockReceived[i] == TRUE) { flags |= (1 << i); } @@ -1177,8 +1191,8 @@ static void RfuPrepareSendBuffer(u16 command) switch (command) { case RFU_COMMAND_0x8800: - gSendCmd[1] = Rfu.unk_6c.count; - gSendCmd[2] = Rfu.unk_6c.owner + 0x80; + gSendCmd[1] = Rfu.sendBlock.count; + gSendCmd[2] = Rfu.sendBlock.owner + 0x80; break; case RFU_COMMAND_0xA100: if (AreNoPlayersReceiving()) @@ -1231,23 +1245,23 @@ bool32 Rfu_InitBlockSend(const u8 *src, size_t size) return FALSE; if (gSendCmd[0] != 0) return FALSE; - if (Rfu.unk_6c.sending) + if (Rfu.sendBlock.sending) { - gUnknown_02022B44.unk_83++; + sRfuDebug.unk_83++; return FALSE; } r4 = (size % 12) != 0; - Rfu.unk_6c.owner = GetMultiplayerId(); - Rfu.unk_6c.sending = TRUE; - Rfu.unk_6c.count = (size / 12) + r4; - Rfu.unk_6c.next = 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.payload = src; + Rfu.sendBlock.payload = src; else { if (src != gBlockSendBuffer) memcpy(gBlockSendBuffer, src, size); - Rfu.unk_6c.payload = gBlockSendBuffer; + Rfu.sendBlock.payload = gBlockSendBuffer; } RfuPrepareSendBuffer(RFU_COMMAND_0x8800); Rfu.callback = HandleBlockSend; @@ -1276,34 +1290,34 @@ static void HandleBlockSend(void) static void SendNextBlock(void) { s32 i; - const u8 *src = Rfu.unk_6c.payload; - gSendCmd[0] = RFU_COMMAND_0x8900 | Rfu.unk_6c.next; - for (i = 0; i < 7; i++) - gSendCmd[i + 1] = (src[(i << 1) + Rfu.unk_6c.next * 12 + 1] << 8) | src[(i << 1) + Rfu.unk_6c.next * 12 + 0]; - Rfu.unk_6c.next++; - if (Rfu.unk_6c.count <= Rfu.unk_6c.next) - { - Rfu.unk_6c.sending = FALSE; + 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.sendBlock.sending = FALSE; Rfu.callback = SendLastBlock; } } static void SendLastBlock(void) { - const u8 *src = Rfu.unk_6c.payload; + const u8 *src = Rfu.sendBlock.payload; u8 mpId = GetMultiplayerId(); s32 i; if (Rfu.parentChild == MODE_CHILD) { - gSendCmd[0] = RFU_COMMAND_0x8900 | (Rfu.unk_6c.count - 1); - for (i = 0; i < 7; i++) - gSendCmd[i + 1] = (src[(i << 1) + (Rfu.unk_6c.count - 1) * 12 + 1] << 8) | src[(i << 1) + (Rfu.unk_6c.count - 1) * 12 + 0]; - if ((u8)gRecvCmds[mpId][0] == Rfu.unk_6c.count - 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].receivedFlags != sAllBlocksReceived[Rfu.unk_80[mpId].count]) + if (Rfu.recvBlock[mpId].receivedFlags != sAllBlocksReceived[Rfu.recvBlock[mpId].count]) { - HandleSendFailure(mpId, Rfu.unk_80[mpId].receivedFlags); - gUnknown_02022B44.unk_64++; + HandleSendFailure(mpId, Rfu.recvBlock[mpId].receivedFlags); + sRfuDebug.unk_64++; } else Rfu.callback = NULL; @@ -1898,7 +1912,7 @@ static void RfuCheckErrorStatus(void) gWirelessCommType = 2; SetMainCallback2(CB2_LinkError); gMain.savedCallback = CB2_LinkError; - sub_800AF18((Rfu.linkmanMsg << 16) | (Rfu.unk_10 << 8) | Rfu.unk_12, Rfu.recvQueue.count, Rfu.sendQueue.count, RfuGetErrorStatus() == 2); + BufferLinkErrorInfo((Rfu.linkmanMsg << 16) | (Rfu.unk_10 << 8) | Rfu.unk_12, Rfu.recvQueue.count, Rfu.sendQueue.count, RfuGetErrorStatus() == 2); Rfu.errorState = 2; CloseLink(); } @@ -1964,7 +1978,7 @@ static void CopyPlayerNameToUnameBuffer(void) void ClearAndInitHostRFUtgtGname(void) { memset(&gHostRFUtgtGnameBuffer, 0, RFU_GAME_NAME_LENGTH); - InitHostRFUtgtGname(&gHostRFUtgtGnameBuffer, 0, FALSE, 0); + InitHostRFUtgtGname(&gHostRFUtgtGnameBuffer, ACTIVITY_NONE, FALSE, 0); } void SetHostRFUtgtGname(u8 activity, u32 child_sprite_genders, u32 started) @@ -2160,7 +2174,7 @@ static void sub_801120C(u8 msg, u8 paramCount) case LMAN_MSG_RFU_FATAL_ERROR: GetLinkmanErrorParams(msg); RfuSetErrorStatus(1, msg); - Rfu.unk_cdb = 1; + Rfu.unk_cdb = TRUE; break; } } @@ -2231,7 +2245,7 @@ void sub_8011404(u8 msg, u8 unused1) case LMAN_MSG_RFU_FATAL_ERROR: RfuSetErrorStatus(1, msg); GetLinkmanErrorParams(msg); - Rfu.unk_cdb = 1; + Rfu.unk_cdb = TRUE; break; } } @@ -2304,7 +2318,7 @@ static void sub_8011674(u8 msg, u8 paramCount) Rfu.unk_ce4 = 2; } } - else if (GetHostRFUtgtGname()->activity == 0x54) + else if (GetHostRFUtgtGname()->activity == (ACTIVITY_PLYRTALK | IN_UNION_ROOM)) { rfu_REQ_disconnect(lman.acceptSlot_flag); rfu_waitREQComplete(); @@ -2408,7 +2422,7 @@ static void sub_8011674(u8 msg, u8 paramCount) case LMAN_MSG_RFU_FATAL_ERROR: GetLinkmanErrorParams(msg); RfuSetErrorStatus(1, msg); - Rfu.unk_cdb = 0; + Rfu.unk_cdb = FALSE; break; } } diff --git a/src/link_rfu_3.c b/src/link_rfu_3.c index 4946cb9f2..4393d14ac 100644 --- a/src/link_rfu_3.c +++ b/src/link_rfu_3.c @@ -7,9 +7,20 @@ #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[2][256]; + u8 slots[UNUSED_QUEUE_NUM_SLOTS][UNUSED_QUEUE_SLOT_LENGTH]; vu8 recvSlot; vu8 sendSlot; vu8 count; @@ -234,8 +245,7 @@ static const struct OamData sWirelessStatusIndicatorOamData = .paletteNum = 0, }; -static const union AnimCmd sWirelessStatusIndicatorAnim0[] = { - // 3 bars +static const union AnimCmd sWirelessStatusIndicator_3Bars[] = { ANIMCMD_FRAME( 4, 5), ANIMCMD_FRAME( 8, 5), ANIMCMD_FRAME(12, 5), @@ -245,8 +255,7 @@ static const union AnimCmd sWirelessStatusIndicatorAnim0[] = { ANIMCMD_JUMP(0) }; -static const union AnimCmd sWirelessStatusIndicatorAnim1[] = { - // 2 bars +static const union AnimCmd sWirelessStatusIndicator_2Bars[] = { ANIMCMD_FRAME( 4, 5), ANIMCMD_FRAME( 8, 5), ANIMCMD_FRAME(12, 10), @@ -254,33 +263,30 @@ static const union AnimCmd sWirelessStatusIndicatorAnim1[] = { ANIMCMD_JUMP(0) }; -static const union AnimCmd sWirelessStatusIndicatorAnim2[] = { - // 1 bar +static const union AnimCmd sWirelessStatusIndicator_1Bar[] = { ANIMCMD_FRAME(4, 5), ANIMCMD_FRAME(8, 5), ANIMCMD_JUMP(0) }; -static const union AnimCmd sWirelessStatusIndicatorAnim3[] = { - // searching +static const union AnimCmd sWirelessStatusIndicator_Searching[] = { ANIMCMD_FRAME( 4, 10), ANIMCMD_FRAME(20, 10), ANIMCMD_JUMP(0) }; -static const union AnimCmd sWirelessStatusIndicatorAnim4[] = { - // error +static const union AnimCmd sWirelessStatusIndicator_Error[] = { ANIMCMD_FRAME(24, 10), ANIMCMD_FRAME( 4, 10), ANIMCMD_JUMP(0) }; static const union AnimCmd *const sWirelessStatusIndicatorAnims[] = { - sWirelessStatusIndicatorAnim0, - sWirelessStatusIndicatorAnim1, - sWirelessStatusIndicatorAnim2, - sWirelessStatusIndicatorAnim3, - sWirelessStatusIndicatorAnim4 + [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 }; static const struct CompressedSpriteSheet sWirelessStatusIndicatorSpriteSheet = { @@ -292,13 +298,13 @@ static const struct SpritePalette sWirelessStatusIndicatorSpritePalette = { }; static const struct SpriteTemplate sWirelessStatusIndicatorSpriteTemplate = { - 0xD431, - 0xD432, - &sWirelessStatusIndicatorOamData, - sWirelessStatusIndicatorAnims, - NULL, - gDummySpriteAffineAnimTable, - SpriteCallbackDummy + .tileTag = 0xD431, + .paletteTag = 0xD432, + .oam = &sWirelessStatusIndicatorOamData, + .anims = sWirelessStatusIndicatorAnims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy }; void RfuRecvQueue_Reset(struct RfuRecvQueue *queue) @@ -306,9 +312,9 @@ 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++) { queue->slots[i][j] = 0; } @@ -324,9 +330,9 @@ 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++) { queue->slots[i][j] = 0; } @@ -342,9 +348,9 @@ 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++) { queue->slots[i][j] = 0; } @@ -361,31 +367,27 @@ void RfuRecvQueue_Enqueue(struct RfuRecvQueue *queue, u8 *data) u16 imeBak; u8 count; - if (queue->count < 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 (data[i] == 0 && data[i + 1] == 0) - { count++; - } } - if (count != 5) + if (count != MAX_RFU_PLAYERS) { - for (i = 0; i < 70; i++) - { + for (i = 0; i < RECV_QUEUE_SLOT_LENGTH; i++) queue->slots[queue->recvSlot][i] = data[i]; - } + queue->recvSlot++; - queue->recvSlot %= 32; + queue->recvSlot %= RECV_QUEUE_NUM_SLOTS; queue->count++; - for (i = 0; i < 70; i++) - { + + for (i = 0; i < RECV_QUEUE_SLOT_LENGTH; i++) data[i] = 0; - } } REG_IME = imeBak; } @@ -400,30 +402,27 @@ void RfuSendQueue_Enqueue(struct RfuSendQueue *queue, u8 *data) s32 i; u16 imeBak; - if (queue->count < 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 (data[i] != 0) - { break; - } } - if (i != 14) + if (i != SEND_QUEUE_SLOT_LENGTH) { - for (i = 0; i < 14; i++) + for (i = 0; i < SEND_QUEUE_SLOT_LENGTH; i++) { queue->slots[queue->recvSlot][i] = data[i]; } queue->recvSlot++; - queue->recvSlot %= 40; + queue->recvSlot %= SEND_QUEUE_NUM_SLOTS; queue->count++; - for (i = 0; i < 14; i++) - { + + for (i = 0; i < SEND_QUEUE_SLOT_LENGTH; i++) data[i] = 0; - } } REG_IME = imeBak; } @@ -442,19 +441,18 @@ bool8 RfuRecvQueue_Dequeue(struct RfuRecvQueue *queue, u8 *src) REG_IME = 0; if (queue->recvSlot == queue->sendSlot || queue->full) { - for (i = 0; i < 70; i++) - { + 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++) { src[i] = queue->slots[queue->sendSlot][i]; } queue->sendSlot++; - queue->sendSlot %= 32; + queue->sendSlot %= RECV_QUEUE_NUM_SLOTS; queue->count--; REG_IME = imeBak; return TRUE; @@ -470,12 +468,11 @@ bool8 RfuSendQueue_Dequeue(struct RfuSendQueue *queue, u8 *src) imeBak = REG_IME; REG_IME = 0; - for (i = 0; i < 14; i++) - { + for (i = 0; i < SEND_QUEUE_SLOT_LENGTH; i++) src[i] = queue->slots[queue->sendSlot][i]; - } + queue->sendSlot++; - queue->sendSlot %= 40; + queue->sendSlot %= SEND_QUEUE_NUM_SLOTS; queue->count--; REG_IME = imeBak; return TRUE; @@ -491,20 +488,16 @@ void RfuBackupQueue_Enqueue(struct RfuBackupQueue *queue, const u8 *data) } else { - for (i = 0; i < 14; i++) - { + for (i = 0; i < BACKUP_QUEUE_SLOT_LENGTH; i++) queue->slots[queue->recvSlot][i] = data[i]; - } + queue->recvSlot++; - queue->recvSlot %= 2; - if (queue->count < 2) - { + queue->recvSlot %= BACKUP_QUEUE_NUM_SLOTS; + + if (queue->count < BACKUP_QUEUE_NUM_SLOTS) queue->count++; - } else - { queue->sendSlot = queue->recvSlot; - } } } @@ -517,13 +510,11 @@ bool8 RfuBackupQueue_Dequeue(struct RfuBackupQueue *queue, u8 *src) if (src != NULL) { - for (i = 0; i < 14; i++) - { + for (i = 0; i < BACKUP_QUEUE_SLOT_LENGTH; i++) src[i] = queue->slots[queue->sendSlot][i]; - } } queue->sendSlot++; - queue->sendSlot %= 2; + queue->sendSlot %= BACKUP_QUEUE_NUM_SLOTS; queue->count--; return TRUE; } @@ -532,14 +523,13 @@ static void RfuUnusedQueue_Enqueue(struct RfuUnusedQueue *queue, u8 *data) { s32 i; - if (queue->count < 2) + if (queue->count < UNUSED_QUEUE_NUM_SLOTS) { - for (i = 0; i < 256; i++) - { + for (i = 0; i < UNUSED_QUEUE_SLOT_LENGTH; i++) queue->slots[queue->recvSlot][i] = data[i]; - } + queue->recvSlot++; - queue->recvSlot %= 2; + queue->recvSlot %= UNUSED_QUEUE_NUM_SLOTS; queue->count++; } else @@ -555,17 +545,17 @@ static bool8 RfuUnusedQueue_Dequeue(struct RfuUnusedQueue *queue, u8 *dest) if (queue->recvSlot == queue->sendSlot || queue->full) return FALSE; - for (i = 0; i < 256; i++) - { + for (i = 0; i < UNUSED_QUEUE_SLOT_LENGTH; i++) dest[i] = queue->slots[queue->sendSlot][i]; - } + queue->sendSlot++; - queue->sendSlot %= 2; + 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; @@ -797,7 +787,7 @@ bool8 LinkRfu_GetNameIfCompatible(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, RFU_GAME_NAME_LENGTH); memcpy(buff2, gRfuLinkStatus->partner[idx].uname, PLAYER_NAME_LENGTH + 1); @@ -817,6 +807,15 @@ void LinkRfu3_SetGnameUnameFromStaticBuffers(struct GFtgtGname *buff1, u8 *buff2 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; @@ -829,25 +828,25 @@ void CreateWirelessStatusIndicatorSprite(u8 x, u8 y) 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)); @@ -879,19 +878,19 @@ static u8 GetParentSignalStrength(void) return 0; } -static void SetWirelessStatusIndicatorAnim(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 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 = RFU_LINK_ICON_LEVEL4_MAX; @@ -912,47 +911,47 @@ void UpdateWirelessStatusIndicatorSprite(void) } if (IsRfuRecoveringFromLinkLoss() == TRUE) { - sprite->data[0] = 4; + sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_ERROR; } else if (signalStrength <= RFU_LINK_ICON_LEVEL1_MAX) { - sprite->data[0] = 3; + sprite->sNextAnimNum = WIRELESS_STATUS_ANIM_SEARCHING; } 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 >= 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 >= 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) { - SetWirelessStatusIndicatorAnim(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 (RfuGetErrorStatus() == 1) { @@ -961,6 +960,14 @@ void UpdateWirelessStatusIndicatorSprite(void) } } +#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; @@ -988,7 +995,7 @@ 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++) diff --git a/src/record_mixing.c b/src/record_mixing.c index 274a82e10..075bc6aee 100644 --- a/src/record_mixing.c +++ b/src/record_mixing.c @@ -231,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); @@ -526,7 +526,7 @@ static void Task_CopyReceiveBuffer(u8 taskId) u8 status = GetBlockReceivedStatus(); u8 handledPlayers = 0; - if (status == sub_800A9D8()) + if (status == GetLinkPlayerCountAsBitFlags()) { u8 i; diff --git a/src/start_menu.c b/src/start_menu.c index 781774f62..df45a3f12 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -1237,7 +1237,7 @@ static void Task_SaveAfterLinkBattle(u8 taskId) if (gWirelessCommType != 0 && InUnionRoom()) { - if (sub_800A07C()) + if (Link_AnyPartnersPlayingFRLG_JP()) { *state = 1; } diff --git a/src/union_room.c b/src/union_room.c index ac32e15f2..54d25046a 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -1361,7 +1361,7 @@ static void Task_ExchangeCards(u8 taskId) gTasks[taskId].data[0]++; break; case 1: - if (GetBlockReceivedStatus() == sub_800A9D8()) + if (GetBlockReceivedStatus() == GetLinkPlayerCountAsBitFlags()) { s32 i; u16 *recvBuff; -- cgit v1.2.3 From 2859900ea9aa6f381006976fa94b95e6a4cad0b7 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Mon, 8 Jun 2020 18:16:57 -0400 Subject: Second pass on documenting union room --- .../BattleFrontier_BattleTowerLobby/scripts.inc | 16 +- data/maps/LilycoveCity_ContestLobby/scripts.inc | 12 +- data/maps/UnionRoom/scripts.inc | 22 +- data/scripts/berry_blender.inc | 12 +- data/scripts/cable_club.inc | 62 +- data/specials.inc | 2 +- include/constants/cable_club.h | 4 +- include/constants/union_room.h | 18 +- include/link_rfu.h | 40 +- include/union_room.h | 52 +- include/union_room_player_avatar.h | 2 +- src/data/union_room.h | 192 +-- src/link_rfu_2.c | 197 +-- src/link_rfu_3.c | 2 +- src/mystery_gift.c | 17 +- src/start_menu.c | 2 +- src/union_room.c | 1619 +++++++++++--------- src/union_room_player_avatar.c | 13 +- 18 files changed, 1229 insertions(+), 1055 deletions(-) diff --git a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc index 79e000bd3..14e5afb11 100644 --- a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc @@ -884,26 +884,26 @@ BattleFrontier_BattleTowerLobby_EventScript_ChooseLeader:: @ 823F3F3 BattleFrontier_BattleTowerLobby_EventScript_TryBecomeLeader:: @ 823F430 call CableClub_EventScript_TryBecomeLinkLeader - compare VAR_RESULT, 1 + compare VAR_RESULT, LINKUP_SUCCESS goto_if_eq BattleFrontier_BattleTowerLobby_EventScript_WirelessLinkSuccessful - compare VAR_RESULT, 5 + compare VAR_RESULT, LINKUP_FAILED goto_if_eq BattleFrontier_BattleTowerLobby_EventScript_ChooseLeader - compare VAR_RESULT, 8 + compare VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN goto_if_eq BattleFrontier_BattleTowerLobby_EventScript_TryBecomeLeader - compare VAR_RESULT, 11 + compare VAR_RESULT, LINKUP_FAILED_BATTLE_TOWER goto_if_eq BattleFrontier_BattleTowerLobby_EventScript_AbortLink release return BattleFrontier_BattleTowerLobby_EventScript_TryJoinGroup:: @ 823F463 call CableClub_EventScript_TryJoinLinkGroup - compare VAR_RESULT, 1 + compare VAR_RESULT, LINKUP_SUCCESS goto_if_eq BattleFrontier_BattleTowerLobby_EventScript_WirelessLinkSuccessful - compare VAR_RESULT, 5 + compare VAR_RESULT, LINKUP_FAILED goto_if_eq BattleFrontier_BattleTowerLobby_EventScript_ChooseLeader - compare VAR_RESULT, 8 + compare VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN goto_if_eq BattleFrontier_BattleTowerLobby_EventScript_TryJoinGroup - compare VAR_RESULT, 11 + compare VAR_RESULT, LINKUP_FAILED_BATTLE_TOWER goto_if_eq BattleFrontier_BattleTowerLobby_EventScript_AbortLink release return diff --git a/data/maps/LilycoveCity_ContestLobby/scripts.inc b/data/maps/LilycoveCity_ContestLobby/scripts.inc index 70d4c106d..af123388d 100644 --- a/data/maps/LilycoveCity_ContestLobby/scripts.inc +++ b/data/maps/LilycoveCity_ContestLobby/scripts.inc @@ -889,22 +889,22 @@ LilycoveCity_ContestLobby_EventScript_DecideLinkLeader:: @ 821ABA6 LilycoveCity_ContestLobby_EventScript_TryLeadGroup:: @ 821ABE3 call LilycoveCity_ContestLobby_EventScript_TryBecomeLinkLeader - compare VAR_RESULT, 1 + compare VAR_RESULT, LINKUP_SUCCESS goto_if_eq LilycoveCity_ContestLobby_EventScript_LinkLeaderDecided - compare VAR_RESULT, 5 + compare VAR_RESULT, LINKUP_FAILED goto_if_eq LilycoveCity_ContestLobby_EventScript_DecideLinkLeader - compare VAR_RESULT, 8 + compare VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN goto_if_eq LilycoveCity_ContestLobby_EventScript_TryLeadGroup release end LilycoveCity_ContestLobby_EventScript_TryJoinGroup:: @ 821AC0B call LilycoveCity_ContestLobby_EventScript_TryJoinLinkGroup - compare VAR_RESULT, 1 + compare VAR_RESULT, LINKUP_SUCCESS goto_if_eq LilycoveCity_ContestLobby_EventScript_LinkLeaderDecided - compare VAR_RESULT, 5 + compare VAR_RESULT, LINKUP_FAILED goto_if_eq LilycoveCity_ContestLobby_EventScript_DecideLinkLeader - compare VAR_RESULT, 8 + compare VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN goto_if_eq LilycoveCity_ContestLobby_EventScript_TryJoinGroup release end diff --git a/data/maps/UnionRoom/scripts.inc b/data/maps/UnionRoom/scripts.inc index eac27fb5c..5a478970d 100644 --- a/data/maps/UnionRoom/scripts.inc +++ b/data/maps/UnionRoom/scripts.inc @@ -20,7 +20,7 @@ UnionRoom_OnResume: @ 823D1B1 removeobject 5 removeobject 4 removeobject 3 - special UnionRoomSpecial + special RunUnionRoom end UnionRoom_OnTransition: @ 823D1E5 @@ -29,7 +29,7 @@ UnionRoom_OnTransition: @ 823D1E5 UnionRoom_EventScript_Player1:: @ 823D1E6 lock faceplayer - setvar VAR_RESULT, 1 + setvar VAR_RESULT, UR_INTERACT_PLAYER_1 waitstate release end @@ -37,7 +37,7 @@ UnionRoom_EventScript_Player1:: @ 823D1E6 UnionRoom_EventScript_Player2:: @ 823D1F0 lock faceplayer - setvar VAR_RESULT, 2 + setvar VAR_RESULT, UR_INTERACT_PLAYER_2 waitstate release end @@ -45,7 +45,7 @@ UnionRoom_EventScript_Player2:: @ 823D1F0 UnionRoom_EventScript_Player3:: @ 823D1FA lock faceplayer - setvar VAR_RESULT, 3 + setvar VAR_RESULT, UR_INTERACT_PLAYER_3 waitstate release end @@ -53,7 +53,7 @@ UnionRoom_EventScript_Player3:: @ 823D1FA UnionRoom_EventScript_Player4:: @ 823D204 lock faceplayer - setvar VAR_RESULT, 4 + setvar VAR_RESULT, UR_INTERACT_PLAYER_4 waitstate release end @@ -61,7 +61,7 @@ UnionRoom_EventScript_Player4:: @ 823D204 UnionRoom_EventScript_Player5:: @ 823D20E lock faceplayer - setvar VAR_RESULT, 5 + setvar VAR_RESULT, UR_INTERACT_PLAYER_5 waitstate release end @@ -69,7 +69,7 @@ UnionRoom_EventScript_Player5:: @ 823D20E UnionRoom_EventScript_Player6:: @ 823D218 lock faceplayer - setvar VAR_RESULT, 6 + setvar VAR_RESULT, UR_INTERACT_PLAYER_6 waitstate release end @@ -77,7 +77,7 @@ UnionRoom_EventScript_Player6:: @ 823D218 UnionRoom_EventScript_Player7:: @ 823D222 lock faceplayer - setvar VAR_RESULT, 7 + setvar VAR_RESULT, UR_INTERACT_PLAYER_7 waitstate release end @@ -85,7 +85,7 @@ UnionRoom_EventScript_Player7:: @ 823D222 UnionRoom_EventScript_Player8:: @ 823D22C lock faceplayer - setvar VAR_RESULT, 8 + setvar VAR_RESULT, UR_INTERACT_PLAYER_8 waitstate release end @@ -93,14 +93,14 @@ UnionRoom_EventScript_Player8:: @ 823D22C UnionRoom_EventScript_Attendant:: @ 823D236 lock faceplayer - setvar VAR_RESULT, 9 + setvar VAR_RESULT, UR_INTERACT_ATTENDANT waitstate release end UnionRoom_EventScript_Unused:: @ 823D240 lockall - setvar VAR_RESULT, 10 + setvar VAR_RESULT, UR_INTERACT_UNUSED waitstate releaseall end diff --git a/data/scripts/berry_blender.inc b/data/scripts/berry_blender.inc index 6501ce129..28c3d6de7 100644 --- a/data/scripts/berry_blender.inc +++ b/data/scripts/berry_blender.inc @@ -712,22 +712,22 @@ BerryBlender_EventScript_DecideLinkLeader: @ 82941F8 BerryBlender_EventScript_TryLeadGroup: @ 8294235 call BerryBlender_EventScript_TryBecomeLinkLeader - compare VAR_RESULT, 1 + compare VAR_RESULT, LINKUP_SUCCESS goto_if_eq BerryBlender_EventScript_LinkLeaderDecided - compare VAR_RESULT, 5 + compare VAR_RESULT, LINKUP_FAILED goto_if_eq BerryBlender_EventScript_DecideLinkLeader - compare VAR_RESULT, 8 + compare VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN goto_if_eq BerryBlender_EventScript_TryLeadGroup release end BerryBlender_EventScript_TryJoinGroup: @ 829425D call BerryBlender_EventScript_TryJoinLinkGroup - compare VAR_RESULT, 1 + compare VAR_RESULT, LINKUP_SUCCESS goto_if_eq BerryBlender_EventScript_LinkLeaderDecided - compare VAR_RESULT, 5 + compare VAR_RESULT, LINKUP_FAILED goto_if_eq BerryBlender_EventScript_DecideLinkLeader - compare VAR_RESULT, 8 + compare VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN goto_if_eq BerryBlender_EventScript_TryJoinGroup release end diff --git a/data/scripts/cable_club.inc b/data/scripts/cable_club.inc index df14800cc..66cf74f0a 100644 --- a/data/scripts/cable_club.inc +++ b/data/scripts/cable_club.inc @@ -349,17 +349,17 @@ CableClub_EventScript_TryEnterColosseum:: @ 8276F60 waitmessage special TryBattleLinkup waitstate - compare VAR_RESULT, 1 + compare VAR_RESULT, LINKUP_SUCCESS goto_if_eq CableClub_EventScript_EnterColosseum - compare VAR_RESULT, 2 + compare VAR_RESULT, LINKUP_SOMEONE_NOT_READY goto_if_eq CableClub_EventScript_AbortLinkSomeoneNotReady - compare VAR_RESULT, 3 + compare VAR_RESULT, LINKUP_DIFF_SELECTIONS goto_if_eq CableClub_EventScript_AbortLinkDifferentSelections - compare VAR_RESULT, 4 + compare VAR_RESULT, LINKUP_WRONG_NUM_PLAYERS goto_if_eq CableClub_EventScript_AbortLinkIncorrectNumberOfBattlers - compare VAR_RESULT, 5 + compare VAR_RESULT, LINKUP_FAILED goto_if_eq CableClub_EventScript_AbortLink - compare VAR_RESULT, 6 + compare VAR_RESULT, LINKUP_CONNECTION_ERROR goto_if_eq CableClub_EventScript_AbortLinkConnectionError end @@ -972,7 +972,7 @@ CableClub_EventScript_EnterUnionRoom:: @ 827759F special SetCableClubWarp warpteleport2 MAP_UNION_ROOM, 255, 7, 11 waitstate - special UnionRoomSpecial + special RunUnionRoom waitstate end @@ -1181,22 +1181,22 @@ CableClub_EventScript_ChooseLinkLeaderFrom2:: @ 8277989 CableClub_EventScript_TryLeadGroup2Players:: @ 82779C6 call CableClub_EventScript_TryBecomeLinkLeader - compare VAR_RESULT, 1 + compare VAR_RESULT, LINKUP_SUCCESS goto_if_eq CableClub_EventScript_EnterWirelessLinkRoom - compare VAR_RESULT, 5 + compare VAR_RESULT, LINKUP_FAILED goto_if_eq CableClub_EventScript_ChooseLinkLeaderFrom2 - compare VAR_RESULT, 8 + compare VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN goto_if_eq CableClub_EventScript_TryLeadGroup2Players release return CableClub_EventScript_TryJoinGroup2Players:: @ 82779EE call CableClub_EventScript_TryJoinLinkGroup - compare VAR_RESULT, 1 + compare VAR_RESULT, LINKUP_SUCCESS goto_if_eq CableClub_EventScript_EnterWirelessLinkRoom - compare VAR_RESULT, 5 + compare VAR_RESULT, LINKUP_FAILED goto_if_eq CableClub_EventScript_ChooseLinkLeaderFrom2 - compare VAR_RESULT, 8 + compare VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN goto_if_eq CableClub_EventScript_TryJoinGroup2Players release return @@ -1214,22 +1214,22 @@ CableClub_EventScript_ChooseLinkLeaderFrom4:: @ 8277A16 CableClub_EventScript_TryLeadGroup4Players:: @ 8277A53 call CableClub_EventScript_TryBecomeLinkLeader - compare VAR_RESULT, 1 + compare VAR_RESULT, LINKUP_SUCCESS goto_if_eq CableClub_EventScript_EnterWirelessLinkRoom - compare VAR_RESULT, 5 + compare VAR_RESULT, LINKUP_FAILED goto_if_eq CableClub_EventScript_ChooseLinkLeaderFrom4 - compare VAR_RESULT, 8 + compare VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN goto_if_eq CableClub_EventScript_TryLeadGroup4Players release return CableClub_EventScript_TryJoinGroup4Players:: @ 8277A7B call CableClub_EventScript_TryJoinLinkGroup - compare VAR_RESULT, 1 + compare VAR_RESULT, LINKUP_SUCCESS goto_if_eq CableClub_EventScript_EnterWirelessLinkRoom - compare VAR_RESULT, 5 + compare VAR_RESULT, LINKUP_FAILED goto_if_eq CableClub_EventScript_ChooseLinkLeaderFrom4 - compare VAR_RESULT, 8 + compare VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN goto_if_eq CableClub_EventScript_TryJoinGroup4Players release return @@ -1247,22 +1247,22 @@ CableClub_EventScript_ChooseLinkLeader:: @ 8277AA3 CableClub_EventScript_TryLeadGroupXPlayers:: @ 8277AE0 call CableClub_EventScript_TryBecomeLinkLeader - compare VAR_RESULT, 1 + compare VAR_RESULT, LINKUP_SUCCESS goto_if_eq CableClub_EventScript_EnterWirelessLinkRoom - compare VAR_RESULT, 5 + compare VAR_RESULT, LINKUP_FAILED goto_if_eq CableClub_EventScript_ChooseLinkLeader - compare VAR_RESULT, 8 + compare VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN goto_if_eq CableClub_EventScript_TryLeadGroupXPlayers release return CableClub_EventScript_TryJoinGroupXPlayers:: @ 8277B08 call CableClub_EventScript_TryJoinLinkGroup - compare VAR_RESULT, 1 + compare VAR_RESULT, LINKUP_SUCCESS goto_if_eq CableClub_EventScript_EnterWirelessLinkRoom - compare VAR_RESULT, 5 + compare VAR_RESULT, LINKUP_FAILED goto_if_eq CableClub_EventScript_ChooseLinkLeader - compare VAR_RESULT, 8 + compare VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN goto_if_eq CableClub_EventScript_TryJoinGroupXPlayers release return @@ -1453,22 +1453,22 @@ MossdeepCity_GameCorner_1F_EventScript_ChooseLinkLeader:: @ 8277D81 MossdeepCity_GameCorner_1F_EventScript_TryBecomeLinkLeader:: @ 8277DBE call CableClub_EventScript_TryBecomeLinkLeader - compare VAR_RESULT, 1 + compare VAR_RESULT, LINKUP_SUCCESS goto_if_eq MossdeepCity_GameCorner_1F_EventScript_EnterMinigameRoom - compare VAR_RESULT, 5 + compare VAR_RESULT, LINKUP_FAILED goto_if_eq MossdeepCity_GameCorner_1F_EventScript_ChooseLinkLeader - compare VAR_RESULT, 8 + compare VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN goto_if_eq MossdeepCity_GameCorner_1F_EventScript_TryBecomeLinkLeader release return MossdeepCity_GameCorner_1F_EventScript_TryJoinLinkGroup:: @ 8277DE6 call CableClub_EventScript_TryJoinLinkGroup - compare VAR_RESULT, 1 + compare VAR_RESULT, LINKUP_SUCCESS goto_if_eq MossdeepCity_GameCorner_1F_EventScript_EnterMinigameRoom - compare VAR_RESULT, 5 + compare VAR_RESULT, LINKUP_FAILED goto_if_eq MossdeepCity_GameCorner_1F_EventScript_ChooseLinkLeader - compare VAR_RESULT, 8 + compare VAR_RESULT, LINKUP_RETRY_ROLE_ASSIGN goto_if_eq MossdeepCity_GameCorner_1F_EventScript_TryJoinLinkGroup release return diff --git a/data/specials.inc b/data/specials.inc index 5d48e62f9..d973a6a94 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -426,7 +426,7 @@ gSpecials:: @ 81DBA64 def_special IsWirelessAdapterConnected def_special TryBecomeLinkLeader def_special TryJoinLinkGroup - def_special UnionRoomSpecial + def_special RunUnionRoom def_special ShowWirelessCommunicationScreen def_special InitUnionRoom def_special BufferUnionRoomPlayerName diff --git a/include/constants/cable_club.h b/include/constants/cable_club.h index 3250ce6f8..cbdd049db 100644 --- a/include/constants/cable_club.h +++ b/include/constants/cable_club.h @@ -12,6 +12,8 @@ #define USING_MINIGAME 8 #define USING_BATTLE_TOWER 9 +// Return states for the group of specials that use CreateLinkupTask +// A few also used by TryBecomeLinkLeader and TryJoinLinkGroup #define LINKUP_ONGOING 0 #define LINKUP_SUCCESS 1 #define LINKUP_SOMEONE_NOT_READY 2 @@ -20,7 +22,7 @@ #define LINKUP_FAILED 5 #define LINKUP_CONNECTION_ERROR 6 #define LINKUP_PLAYER_NOT_READY 7 -#define LINKUP_UNK8 8 +#define LINKUP_RETRY_ROLE_ASSIGN 8 #define LINKUP_PARTNER_NOT_READY 9 #define LINKUP_FAILED_CONTEST_GMODE 10 #define LINKUP_FAILED_BATTLE_TOWER 11 diff --git a/include/constants/union_room.h b/include/constants/union_room.h index 7b1d1a1be..d867fb340 100644 --- a/include/constants/union_room.h +++ b/include/constants/union_room.h @@ -44,7 +44,7 @@ #define ACTIVITY_BATTLE_TOWER 28 #define ACTIVITY_29 29 -#define IN_UNION_ROOM 0x40 +#define IN_UNION_ROOM (1 << 6) // Used in UR_AddTextPrinterParameterized #define UR_COLOR_DKE_WHT_LTE 0 @@ -83,4 +83,20 @@ #define UR_TRADE_NOTYPE 1 #define UR_TRADE_NOEGG 2 +#define UR_TRADE_READY 0 +#define UR_TRADE_PLAYER_NOT_READY 1 +#define UR_TRADE_PARTNER_NOT_READY 2 + +#define UR_INTERACT_PLAYER_1 1 +#define UR_INTERACT_PLAYER_2 2 +#define UR_INTERACT_PLAYER_3 3 +#define UR_INTERACT_PLAYER_4 4 +#define UR_INTERACT_PLAYER_5 5 +#define UR_INTERACT_PLAYER_6 6 +#define UR_INTERACT_PLAYER_7 7 +#define UR_INTERACT_PLAYER_8 8 +#define UR_INTERACT_ATTENDANT 9 +#define UR_INTERACT_UNUSED 10 +#define UR_INTERACT_START_MENU 11 + #endif //GUARD_CONSTANTS_UNION_ROOM_H diff --git a/include/link_rfu.h b/include/link_rfu.h index b88d0af83..eede41d60 100644 --- a/include/link_rfu.h +++ b/include/link_rfu.h @@ -29,6 +29,20 @@ #define BACKUP_QUEUE_NUM_SLOTS 2 #define BACKUP_QUEUE_SLOT_LENGTH 14 +#define RFU_STATUS_OK 0 +#define RFU_STATUS_FATAL_ERROR 1 +#define RFU_STATUS_CONNECTION_ERROR 2 +#define RFU_STATUS_CHILD_SEND_COMPLETE 3 +#define RFU_STATUS_NEW_CHILD_DETECTED 4 +#define RFU_STATUS_JOIN_GROUP_OK 5 +#define RFU_STATUS_JOIN_GROUP_NO 6 +#define RFU_STATUS_WAIT_ACK_JOIN_GROUP 7 +#define RFU_STATUS_LEAVE_GROUP_NOTICE 8 +#define RFU_STATUS_LEAVE_GROUP 9 +#define RFU_STATUS_10 10 +#define RFU_STATUS_11 11 +#define RFU_STATUS_ACK_JOIN_GROUP 12 + // RfuTgtData.gname is read as these structs. struct GFtgtGnameSub { @@ -125,7 +139,7 @@ struct GFRfuManager /* 0x0ee */ vu8 errorState; /* 0x0ef */ bool8 isShuttingDown; /* 0x0f0 */ u8 linkLossRecoveryState; - /* 0x0f1 */ u8 errorStatus; + /* 0x0f1 */ u8 status; /* 0x0f2 */ u16 unk_f2[6]; /* 0x0fe */ u16 unk_fe; /* 0x100 */ u16 unk_100; @@ -142,14 +156,14 @@ struct GFRfuManager /* 0xc3e */ vu8 childSlot; /* 0xc3f */ u8 unk_c3f[70]; /* 0xc85 */ u8 unk_c85; - /* 0xc86 */ u8 unk_c86; + /* 0xc86 */ u8 recvStatus; /* 0xc87 */ u8 recvCmds[5][7][2]; /* 0xccd */ u8 parentId; /* 0xcce */ u8 multiplayerId; /* 0xccf */ u8 unk_ccf; /* 0xcd0 */ vu8 unk_cd0; - /* 0xcd1 */ u8 unk_cd1[4]; - /* 0xcd5 */ u8 unk_cd5[4]; + /* 0xcd1 */ u8 partnerSendStatuses[RFU_CHILD_MAX]; + /* 0xcd5 */ u8 partnerRecvStatuses[RFU_CHILD_MAX]; /* 0xcd9 */ u8 unk_cd9; /* 0xcda */ u8 unk_cda; /* 0xcdb */ vbool8 unk_cdb; @@ -199,36 +213,36 @@ void UpdateWirelessStatusIndicatorSprite(void); void InitRFU(void); bool32 sub_8010EC0(void); bool32 sub_8010F1C(void); -bool32 RfuIsErrorStatus1or2(void); +bool32 RfuHasErrored(void); bool32 IsRfuRecvQueueEmpty(void); u32 GetRfuRecvQueueLength(void); void RfuVSync(void); void sub_80111B0(bool32 a0); -u8 RfuGetErrorStatus(void); +u8 RfuGetStatus(void); struct GFtgtGname *GetHostRFUtgtGname(void); void UpdateGameData_GroupLockedIn(u8 a0); void GetLinkmanErrorParams(u32 a0); -void RfuSetErrorStatus(u8 a0, u16 a1); +void RfuSetStatus(u8 a0, u16 a1); u8 sub_801048C(bool32 a0); void LinkRfu3_SetGnameUnameFromStaticBuffers(struct GFtgtGname *buff1, u8 *buff2); -void SetHostRFUtgtGname(u8 a0, u32 a1, u32 a2); +void SetHostRFUtgtGname(u8 activity, u32 child_sprite_genders, bool32 started); void InitializeRfuLinkManager_LinkLeader(u32 a0); bool32 sub_8012240(void); void LinkRfu_StopManagerAndFinalizeSlots(void); bool32 sub_80105EC(void); -bool32 TrainerIdAndNameStillInPartnersList(u16 a0, const u8 *a1); -void SendByteToPartnerByIdAndName(u8 a0, u16 a1, const u8 *a2); -u32 WaitSendByteToPartnerByIdAndName(u16 a0, const u8 *a1); +bool32 HasTrainerLeftPartnersList(u16 trainerId, const u8 *name); +void SendRfuStatusToPartner(u8 status, u16 trainerId, const u8 *name); +u32 WaitSendRfuStatusToPartner(u16 trainerId, const u8 *name); void RequestDisconnectSlotByTrainerNameAndId(const u8 *a0, u16 a1); bool8 LmanAcceptSlotFlagIsNotZero(void); bool32 WaitRfuState(bool32 a0); void sub_801103C(void); void InitializeRfuLinkManager_JoinGroup(void); -void LinkRfuNIsend8(void); +void SendLeaveGroupNotice(void); void RecordMixTrainerNames(void); void LinkRfu_CreateConnectionAsParent(void); void LinkRfu_StopManagerBeforeEnteringChat(void); -void UpdateGameDataWithActivitySpriteGendersFlag(u8 a0, u32 a1, u32 a2); +void UpdateGameData_SetActivity(u8 activity, u32 flags, bool32 started); void CreateTask_RfuReconnectWithParent(const u8 *src, u16 trainerId); void SetGnameBufferWonderFlags(bool32 a0, bool32 a1); void ClearAndInitHostRFUtgtGname(void); diff --git a/include/union_room.h b/include/union_room.h index 985a6404f..563a048d3 100644 --- a/include/union_room.h +++ b/include/union_room.h @@ -2,6 +2,7 @@ #define GUARD_UNION_ROOM_H #include "link_rfu.h" +#include "link.h" #include "constants/union_room.h" // Exported type declarations @@ -12,22 +13,20 @@ struct WirelessGnameUnamePair u8 ALIGNED(4) playerName[PLAYER_NAME_LENGTH + 1]; }; -struct UnkStruct_x1C // WirelessLink_Member? +struct UnkStruct_x1C { struct WirelessGnameUnamePair gname_uname; u8 active:1; }; -struct UnkStruct_x20 // WirelessLink_Member? +struct UnkStruct_x20 { struct WirelessGnameUnamePair gname_uname; - u16 field_18; + u16 timeoutCounter; u8 groupScheduledAnim:2; - u8 field_1A_1:1; + bool8 useRedText:1; // Never set u8 field_1B; - u8 field_1D; - u8 field_1E; - u8 field_1F; + u8 filler[3]; }; struct UnkStruct_Main0 @@ -37,12 +36,12 @@ struct UnkStruct_Main0 struct UnkStruct_Main4 { - struct UnkStruct_x1C arr[5]; + struct UnkStruct_x1C arr[MAX_RFU_PLAYERS]; }; struct UnkStruct_Main8 { - struct UnkStruct_x20 arr[5]; + struct UnkStruct_x20 arr[MAX_RFU_PLAYERS]; }; struct WirelessLink_Leader @@ -62,8 +61,8 @@ struct WirelessLink_Leader u8 field_16; u8 listenTaskId; u8 activity; - u8 field_19; - u16 field_1A; + u8 joinRequestAnswer; + u16 memberConfirmTimeout; }; struct WirelessLink_Group @@ -100,32 +99,29 @@ struct WirelessLink_URoom struct UnkStruct_Main4 *field_4; struct UnkStruct_Main0 *field_8; struct UnkStruct_Main4 *field_C; - u16 field_10; + u16 unknown; // Never read u16 field_12; u8 state; u8 stateAfterPrint; u8 textState; - u8 field_17; - u8 field_18; - u8 field_19; - u8 field_1A; + u8 filler[4]; u8 topListMenuWindowId; u8 topListMenuId; u8 tradeBoardSelectWindowId; u8 tradeBoardDetailsWindowId; - u8 field_1F; - u8 field_20; + u8 unused1; + u8 searchTaskId; u8 spriteIds[40]; - u8 field_49; - u8 field_4A; + u8 unused2; + u8 tradeBoardListMenuId; u16 playerSendBuffer[6]; u8 activityRequestStrbufs[4][16]; u16 partnerYesNoResponse; u16 recvActivityRequest[3]; struct UnionRoomObject objects[MAX_UNION_ROOM_PLAYERS]; - u8 field_C0[12][15]; - u8 field_174[48]; - u8 field_1A4[200]; + u8 trainerCardStrBuffer[12][15]; + u8 trainerCardColorStrBuffer[48]; + u8 trainerCardMsgStrBuffer[200]; }; union WirelessLink_Main @@ -137,16 +133,16 @@ union WirelessLink_Main struct UnionRoomTrade { - u16 field_0; + u16 state; u16 type; u32 playerPersonality; - u8 field_8; - u8 field_9; + u8 offerPlayerId; + u8 filler1; u16 playerSpecies; u16 playerLevel; u16 species; u16 level; - u16 field_12; + u16 filler2; u32 personality; }; @@ -162,7 +158,7 @@ extern u8 gUnionRoomRequestedMonType; // Exported ROM declarations u8 CreateTask_CreateTradeMenu(void); -void var_800D_set_xB(void); +void SetUsingUnionRoomStartMenu(void); void MEvent_CreateTask_CardOrNewsWithFriend(u32 arg0); void MEvent_CreateTask_CardOrNewsOverWireless(u32 arg0); void MEvent_CreateTask_Leader(u32 arg0); diff --git a/include/union_room_player_avatar.h b/include/union_room_player_avatar.h index 072126949..c7add758a 100644 --- a/include/union_room_player_avatar.h +++ b/include/union_room_player_avatar.h @@ -8,7 +8,7 @@ void DestroyGroupMemberSprites(u8 *spriteIds); void SetTilesAroundUnionRoomPlayersPassable(void); void ScheduleUnionRoomPlayerRefresh(struct WirelessLink_URoom *uroom); void HandleUnionRoomPlayerRefresh(struct WirelessLink_URoom *uroom); -bool32 TrySetUnionRoomMemberFacePlayer(struct UnkStruct_Main0 *main0, s16 *directionPtr, s16 *playerIdxPtr, u8 *spriteIds); +bool32 TryInteractWithUnionRoomMember(struct UnkStruct_Main0 *main0, s16 *directionPtr, s16 *playerIdxPtr, u8 *spriteIds); void UpdateUnionRoomMemberFacing(u32 currDirection, u32 playerIdx, struct UnkStruct_Main0 *main0); #endif //GUARD_UNION_ROOM_PLAYER_AVATAR_H diff --git a/src/data/union_room.h b/src/data/union_room.h index 043300912..704978766 100644 --- a/src/data/union_room.h +++ b/src/data/union_room.h @@ -99,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 }; @@ -120,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."); @@ -139,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?"); @@ -260,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, @@ -283,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, @@ -334,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 }; @@ -576,36 +579,36 @@ 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 }; static const struct WindowTemplate sWindowTemplate_BButtonCancel = { @@ -621,6 +624,9 @@ static const struct WindowTemplate sWindowTemplate_BButtonCancel = { // 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), @@ -647,37 +653,37 @@ static const u32 sLinkGroupToActivityAndCapacity[NUM_LINK_GROUP_TYPES] = { [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 }; static const struct WindowTemplate sWindowTemplate_NumPlayerMode = { - .bg = 0x00, - .tilemapLeft = 0x10, - .tilemapTop = 0x03, - .width = 0x07, - .height = 0x04, - .paletteNum = 0x0f, + .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 }, @@ -686,10 +692,10 @@ const struct ListMenuItem gUnknown_082F0134[] = { }; static const struct ListMenuTemplate sListMenuTemplate_PossibleGroupMembers = { - .items = gUnknown_082F0134, + .items = sPossibleGroupMembersListMenuItems, .moveCursorFunc = NULL, .itemPrintFunc = ItemPrintFunc_PossibleGroupMembers, - .totalItems = ARRAY_COUNT(gUnknown_082F0134), + .totalItems = ARRAY_COUNT(sPossibleGroupMembersListMenuItems), .maxShowed = 5, .windowId = 0, .header_X = 0, @@ -804,7 +810,7 @@ static const struct ListMenuTemplate sListMenuTemplate_InviteToActivity = { .cursorKind = 0 }; -const struct WindowTemplate gUnknown_082F025C = { +static const struct WindowTemplate sWindowTemplate_RegisterForTrade = { .bg = 0x00, .tilemapLeft = 0x12, .tilemapTop = 0x07, @@ -814,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 = ARRAY_COUNT(gUnknown_082F0264), + .totalItems = ARRAY_COUNT(sRegisterForTradeListMenuItems), .maxShowed = 3, .windowId = 0, .header_X = 0, @@ -872,7 +878,7 @@ static const struct ListMenuItem sTradingBoardTypes[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, @@ -893,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, diff --git a/src/link_rfu_2.c b/src/link_rfu_2.c index ac1488167..34e9f719b 100644 --- a/src/link_rfu_2.c +++ b/src/link_rfu_2.c @@ -68,7 +68,7 @@ static void HandleBlockSend(void); static void SendNextBlock(void); static void SendLastBlock(void); static u8 GetPartnerIndexByNameAndTrainerID(const u8 *, u16); -static void sub_8010750(void); +static void UpdateChildStatuses(void); static s32 sub_80107A0(void); static void sub_801084C(u8); static void ClearSelectedLinkPlayerIds(u16); @@ -278,7 +278,7 @@ void InitRFUAPI(void) static void Task_LinkLeaderSearchForChildren(u8 taskId) { - sub_8010750(); + UpdateChildStatuses(); switch (Rfu.state) { case 0: @@ -387,11 +387,11 @@ static void Task_JoinGroupSearchForParent(u8 taskId) case 11: switch (sub_80107A0()) { - case 5: + case RFU_STATUS_JOIN_GROUP_OK: Rfu.state = 12; break; - case 6: - case 9: + case RFU_STATUS_JOIN_GROUP_NO: + case RFU_STATUS_LEAVE_GROUP: rfu_LMAN_requestChangeAgbClockMaster(); Rfu.unk_ce4 = 2; DestroyTask(taskId); @@ -444,11 +444,11 @@ static void sub_800EAFC(void) static void Task_LinkRfu_UnionRoomListen(u8 taskId) { - if (GetHostRFUtgtGname()->activity == (ACTIVITY_PLYRTALK | IN_UNION_ROOM) && RfuGetErrorStatus() == 4) + if (GetHostRFUtgtGname()->activity == (ACTIVITY_PLYRTALK | IN_UNION_ROOM) && RfuGetStatus() == RFU_STATUS_NEW_CHILD_DETECTED) { rfu_REQ_disconnect(lman.acceptSlot_flag); rfu_waitREQComplete(); - RfuSetErrorStatus(0, 0); + RfuSetStatus(RFU_STATUS_OK, 0); } switch (Rfu.state) { @@ -743,7 +743,7 @@ static bool32 sub_800F0F8(void) Rfu.unk_ce3 = 0; if (Rfu.unk_ce4 == 1) { - RfuSetErrorStatus(2, 0x8000); + RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, 0x8000); GetLinkmanErrorParams(0x8000); return FALSE; } @@ -883,7 +883,7 @@ static bool32 RfuProcessEnqueuedRecvBlock(void) u8 j; u8 sp00[MAX_RFU_PLAYERS * (2 * (CMD_LENGTH - 1))]; u8 sp48[2 * (CMD_LENGTH - 1)]; - u8 switchval; + u8 status; RfuRecvQueue_Dequeue(&Rfu.recvQueue, sp00); for (i = 0; i < MAX_RFU_PLAYERS; i++) @@ -898,15 +898,15 @@ static bool32 RfuProcessEnqueuedRecvBlock(void) { rfu_REQ_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag); rfu_waitREQComplete(); - switchval = RfuGetErrorStatus(); - if (switchval != 1 && switchval != 6 && switchval != 9) - RfuSetErrorStatus(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.callback = NULL; if (Rfu.unk_ce4 == 1) { - RfuSetErrorStatus(2, 0x9000); + RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, 0x9000); GetLinkmanErrorParams(0x9000); } lman.state = lman.next_state = 0; @@ -1231,7 +1231,7 @@ static void RfuPrepareSendBuffer(u16 command) void sub_800FE50(void *a0) { - if (gSendCmd[0] == 0 && !RfuIsErrorStatus1or2()) + if (gSendCmd[0] == 0 && !RfuHasErrored()) { memcpy(Rfu.unk_f2, a0, sizeof(Rfu.unk_f2)); RfuPrepareSendBuffer(RFU_COMMAND_0x2F00); @@ -1535,7 +1535,7 @@ u8 Rfu_GetLinkPlayerCount(void) bool8 IsLinkRfuTaskFinished(void) { - if (Rfu.errorStatus == 2) + if (Rfu.status == RFU_STATUS_CONNECTION_ERROR) return FALSE; return Rfu.callback ? FALSE : TRUE; } @@ -1546,24 +1546,25 @@ static void CallRfuFunc(void) Rfu.callback(); } -static bool8 sub_8010540(void) +static bool8 CheckForLeavingGroupMembers(void) { s32 i; - bool8 retval = FALSE; + 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 == 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.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.unk_cd1 + i, 1); - retval = TRUE; + rfu_NI_setSendData(1 << i, 8, &Rfu.partnerSendStatuses[i], 1); + memberLeft = TRUE; } } @@ -1574,7 +1575,7 @@ static bool8 sub_8010540(void) } } } - return retval; + return memberLeft; } bool32 sub_80105EC(void) @@ -1583,10 +1584,10 @@ bool32 sub_80105EC(void) s32 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) @@ -1596,40 +1597,41 @@ bool32 sub_80105EC(void) } 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 TrainerIdAndNameStillInPartnersList(u16 id, const u8 *name) +bool32 HasTrainerLeftPartnersList(u16 trainerId, const u8 *name) { - u8 idx = GetPartnerIndexByNameAndTrainerID(name, id); + u8 idx = GetPartnerIndexByNameAndTrainerID(name, trainerId); if (idx == 0xFF) return TRUE; - if (Rfu.unk_cd1[idx] == 9) + if (Rfu.partnerSendStatuses[idx] == RFU_STATUS_LEAVE_GROUP) return TRUE; return FALSE; } -void SendByteToPartnerByIdAndName(u8 value, u16 id, const u8 *name) +void SendRfuStatusToPartner(u8 status, u16 trainerId, const u8 *name) { - u8 idx = GetPartnerIndexByNameAndTrainerID(name, id); - Rfu.unk_cd1[idx] = value; + u8 idx = GetPartnerIndexByNameAndTrainerID(name, trainerId); + Rfu.partnerSendStatuses[idx] = status; rfu_clearSlot(TYPE_NI_SEND, idx); - rfu_NI_setSendData(1 << idx, 8, Rfu.unk_cd1 + idx, 1); + rfu_NI_setSendData(1 << idx, 8, &Rfu.partnerSendStatuses[idx], 1); } -void LinkRfuNIsend8(void) +void SendLeaveGroupNotice(void) { - Rfu.unk_c85 = 8; + 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 WaitSendByteToPartnerByIdAndName(u16 id, const u8 *name) +u32 WaitSendRfuStatusToPartner(u16 trainerId, const u8 *name) { - u8 idx = GetPartnerIndexByNameAndTrainerID(name, id); + u8 idx = GetPartnerIndexByNameAndTrainerID(name, trainerId); if (idx == 0xFF) return 2; if (gRfuSlotStatusNI[idx]->send.state == 0) @@ -1637,18 +1639,18 @@ u32 WaitSendByteToPartnerByIdAndName(u16 id, const u8 *name) return 0; } -static void sub_8010750(void) +static void UpdateChildStatuses(void) { s32 i; - sub_8010540(); + CheckForLeavingGroupMembers(); for (i = 0; i < RFU_CHILD_MAX; i++) { 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; + if (Rfu.partnerRecvStatuses[i] == RFU_STATUS_10) + Rfu.partnerRecvStatuses[i] = RFU_STATUS_11; rfu_clearSlot(TYPE_NI_SEND, i); } } @@ -1656,7 +1658,7 @@ static void sub_8010750(void) static s32 sub_80107A0(void) { - s32 retval = 0; + s32 status = RFU_STATUS_OK; if (Rfu.unk_c85 == 8) { if (gRfuSlotStatusNI[Rfu.childSlot]->send.state == SLOT_STATE_SEND_SUCCESS @@ -1667,22 +1669,22 @@ static s32 sub_80107A0(void) || gRfuSlotStatusNI[Rfu.childSlot]->recv.state == SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN) { rfu_clearSlot(TYPE_NI_RECV, Rfu.childSlot); - RfuSetErrorStatus(Rfu.unk_c86, 0); - retval = Rfu.unk_c86; + RfuSetStatus(Rfu.recvStatus, 0); + status = Rfu.recvStatus; } else if (gRfuSlotStatusNI[Rfu.childSlot]->recv.state == SLOT_STATE_RECV_FAILED) { rfu_clearSlot(TYPE_NI_RECV, Rfu.childSlot); - retval = 6; + status = RFU_STATUS_JOIN_GROUP_NO; } - return retval; + return status; } static void sub_801084C(u8 taskId) { s32 i; - if (Rfu.errorStatus == 1 || Rfu.errorStatus == 2) + if (Rfu.status == RFU_STATUS_FATAL_ERROR || Rfu.status == RFU_STATUS_CONNECTION_ERROR) { Rfu.unk_ce8 = 0; DestroyTask(taskId); @@ -1802,7 +1804,7 @@ static void Task_ExchangeLinkPlayers(u8 taskId) struct LinkPlayerBlock *r2; struct SioInfo *r5; u8 r4 = Rfu.linkPlayerIdx[sUnknown_082ED68C[Rfu.unk_ce9]]; - if (Rfu.errorStatus == 1 || Rfu.errorStatus == 2) + if (Rfu.status == RFU_STATUS_FATAL_ERROR || Rfu.status == RFU_STATUS_CONNECTION_ERROR) { Rfu.unk_ce8 = 0; DestroyTask(taskId); @@ -1876,7 +1878,7 @@ static void Task_ExchangeLinkPlayers(u8 taskId) static void sub_8010D0C(u8 taskId) { - if (Rfu.errorStatus == 1 || Rfu.errorStatus == 2) + if (Rfu.status == RFU_STATUS_FATAL_ERROR || Rfu.status == RFU_STATUS_CONNECTION_ERROR) DestroyTask(taskId); switch (gTasks[taskId].data[0]) { @@ -1912,7 +1914,7 @@ static void RfuCheckErrorStatus(void) gWirelessCommType = 2; SetMainCallback2(CB2_LinkError); gMain.savedCallback = CB2_LinkError; - BufferLinkErrorInfo((Rfu.linkmanMsg << 16) | (Rfu.unk_10 << 8) | Rfu.unk_12, Rfu.recvQueue.count, Rfu.sendQueue.count, RfuGetErrorStatus() == 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(); } @@ -1920,7 +1922,7 @@ static void RfuCheckErrorStatus(void) { if (lman.childClockSlave_flag) rfu_LMAN_requestChangeAgbClockMaster(); - RfuSetErrorStatus(1, 0x7000); + RfuSetStatus(RFU_STATUS_FATAL_ERROR, 0x7000); GetLinkmanErrorParams(0x7000); } } @@ -1981,7 +1983,7 @@ void ClearAndInitHostRFUtgtGname(void) InitHostRFUtgtGname(&gHostRFUtgtGnameBuffer, ACTIVITY_NONE, FALSE, 0); } -void SetHostRFUtgtGname(u8 activity, u32 child_sprite_genders, u32 started) +void SetHostRFUtgtGname(u8 activity, u32 child_sprite_genders, bool32 started) { InitHostRFUtgtGname(&gHostRFUtgtGnameBuffer, activity, started, child_sprite_genders); } @@ -2016,16 +2018,16 @@ void sub_801103C(void) r5->child_sprite_gender[i - 1] = sub_801100C(i); } -void UpdateGameData_GroupLockedIn(u8 a0) +void UpdateGameData_GroupLockedIn(bool8 started) { - gHostRFUtgtGnameBuffer.started = a0; + gHostRFUtgtGnameBuffer.started = started; rfu_REQ_configGameData(0, 2, (void *)&gHostRFUtgtGnameBuffer, gHostRFUtgtUnameBuffer); } -void UpdateGameDataWithActivitySpriteGendersFlag(u8 a0, u32 a1, u32 a2) +void UpdateGameData_SetActivity(u8 activity, u32 flags, bool32 started) { - if (a0) - SetHostRFUtgtGname(a0, a1, a2); + if (activity != ACTIVITY_NONE) + SetHostRFUtgtGname(activity, flags, started); rfu_REQ_configGameData(0, 2, (void *)&gHostRFUtgtGnameBuffer, gHostRFUtgtUnameBuffer); } @@ -2051,7 +2053,7 @@ void sub_80110B8(u32 a0) break; } } - UpdateGameDataWithActivitySpriteGendersFlag((ACTIVITY_CHAT | IN_UNION_ROOM), child_sprite_genders, 0); + UpdateGameData_SetActivity((ACTIVITY_CHAT | IN_UNION_ROOM), child_sprite_genders, FALSE); } } @@ -2110,9 +2112,9 @@ static void sub_801120C(u8 msg, u8 paramCount) struct GFtgtGname *structPtr = (void *)gRfuLinkStatus->partner[i].gname; if (structPtr->activity == GetHostRFUtgtGname()->activity) { - Rfu.unk_cd1[i] = 0; - Rfu.unk_cd5[i] = 0; - rfu_setRecvBuffer(TYPE_NI, 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 { @@ -2155,7 +2157,7 @@ static void sub_801120C(u8 msg, u8 paramCount) else sub_80111FC(); } - RfuSetErrorStatus(2, msg); + RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg); break; case 0x34: break; @@ -2164,7 +2166,7 @@ static void sub_801120C(u8 msg, u8 paramCount) case LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET: break; case LMAN_MSG_LMAN_API_ERROR_RETURN: - RfuSetErrorStatus(1, msg); + RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg); GetLinkmanErrorParams(msg); Rfu.isShuttingDown = TRUE; break; @@ -2173,7 +2175,7 @@ static void sub_801120C(u8 msg, u8 paramCount) case LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA: case LMAN_MSG_RFU_FATAL_ERROR: GetLinkmanErrorParams(msg); - RfuSetErrorStatus(1, msg); + RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg); Rfu.unk_cdb = TRUE; break; } @@ -2195,27 +2197,27 @@ void sub_8011404(u8 msg, u8 unused1) Rfu.childSlot = lman.param[0]; break; case LMAN_MSG_CONNECT_PARENT_FAILED: - RfuSetErrorStatus(2, msg); + RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg); break; case LMAN_MSG_CHILD_NAME_SEND_COMPLETED: Rfu.state = 11; Rfu.unk_c85 = 0; - Rfu.unk_c86 = 0; - rfu_setRecvBuffer(TYPE_NI, Rfu.childSlot, &Rfu.unk_c86, 1); + 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 LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED: - RfuSetErrorStatus(2, msg); + RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg); break; case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED: Rfu.linkLossRecoveryState = 2; - if (Rfu.unk_c86 == 6) + if (Rfu.recvStatus == RFU_STATUS_JOIN_GROUP_NO) break; case LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED: if (Rfu.linkLossRecoveryState != 2) Rfu.linkLossRecoveryState = 4; - if (Rfu.unk_c86 != 9) - RfuSetErrorStatus(2, msg); + if (Rfu.recvStatus != RFU_STATUS_LEAVE_GROUP) + RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg); Debug_PrintString(sASCII_LinkLossDisconnect, 5, 5); if (gReceivedRemoteLinkPlayers == 1) GetLinkmanErrorParams(msg); @@ -2235,7 +2237,7 @@ void sub_8011404(u8 msg, u8 unused1) case LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET: break; case LMAN_MSG_LMAN_API_ERROR_RETURN: - RfuSetErrorStatus(1, msg); + RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg); GetLinkmanErrorParams(msg); Rfu.isShuttingDown = TRUE; break; @@ -2243,7 +2245,7 @@ void sub_8011404(u8 msg, u8 unused1) case LMAN_MSG_WATCH_DOG_TIMER_ERROR: case LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA: case LMAN_MSG_RFU_FATAL_ERROR: - RfuSetErrorStatus(1, msg); + RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg); GetLinkmanErrorParams(msg); Rfu.unk_cdb = TRUE; break; @@ -2292,7 +2294,7 @@ static void sub_8011674(u8 msg, u8 paramCount) Rfu.state = 17; break; case LMAN_MSG_NEW_CHILD_CONNECT_DETECTED: - RfuSetErrorStatus(4, 0); + RfuSetStatus(RFU_STATUS_NEW_CHILD_DETECTED, 0); break; case LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED: if (GetHostRFUtgtGname()->activity == (ACTIVITY_CHAT | IN_UNION_ROOM) && Rfu.unk_cd9 == 0) @@ -2357,16 +2359,16 @@ static void sub_8011674(u8 msg, u8 paramCount) } else { - RfuSetErrorStatus(2, msg); + RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg); } break; case LMAN_MSG_CHILD_NAME_SEND_COMPLETED: Rfu.state = 13; - RfuSetErrorStatus(3, 0); + RfuSetStatus(RFU_STATUS_CHILD_SEND_COMPLETE, 0); rfu_setRecvBuffer(TYPE_UNI, Rfu.childSlot, Rfu.unk_c3f, 70); break; case LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED: - RfuSetErrorStatus(2, msg); + RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg); break; case LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY: if (lman.acceptSlot_flag & lman.param[0]) @@ -2402,7 +2404,7 @@ static void sub_8011674(u8 msg, u8 paramCount) if (gRfuLinkStatus->parentChild == MODE_NEUTRAL && lman.pcswitch_flag == 0 && FuncIsActiveTask(Task_LinkRfu_UnionRoomListen) == TRUE) Rfu.state = 17; - RfuSetErrorStatus(2, msg); + RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, msg); break; case LMAN_MSG_LINK_DISCONNECTED_BY_USER: Rfu.unk_ce3 = 0; @@ -2412,7 +2414,7 @@ static void sub_8011674(u8 msg, u8 paramCount) case LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET: break; case LMAN_MSG_LMAN_API_ERROR_RETURN: - RfuSetErrorStatus(1, msg); + RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg); GetLinkmanErrorParams(msg); Rfu.isShuttingDown = TRUE; break; @@ -2421,7 +2423,7 @@ static void sub_8011674(u8 msg, u8 paramCount) case LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA: case LMAN_MSG_RFU_FATAL_ERROR: GetLinkmanErrorParams(msg); - RfuSetErrorStatus(1, msg); + RfuSetStatus(RFU_STATUS_FATAL_ERROR, msg); Rfu.unk_cdb = FALSE; break; } @@ -2432,21 +2434,22 @@ void sub_8011A50(void) Rfu.unk_ce4 = 2; } -void RfuSetErrorStatus(u8 status, u16 msg) +void RfuSetStatus(u8 status, u16 msg) { - Rfu.errorStatus = status; + Rfu.status = status; Rfu.linkmanMsg = msg; } -u8 RfuGetErrorStatus(void) +u8 RfuGetStatus(void) { - return Rfu.errorStatus; + return Rfu.status; } -bool32 RfuIsErrorStatus1or2(void) +bool32 RfuHasErrored(void) { - u32 var = RfuGetErrorStatus() - 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; @@ -2673,7 +2676,7 @@ static void Task_RfuReconnectWithParent(u8 taskId) } else { - RfuSetErrorStatus(2, 0x7000); + RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, 0x7000); DestroyTask(taskId); } } @@ -2690,7 +2693,7 @@ static void Task_RfuReconnectWithParent(u8 taskId) if (data[15] > 240) { - RfuSetErrorStatus(2, 0x7000); + RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, 0x7000); DestroyTask(taskId); } } @@ -2700,7 +2703,7 @@ void CreateTask_RfuReconnectWithParent(const u8 *name, u16 trainerId) u8 taskId; s16 *data; - Rfu.errorStatus = 0; + Rfu.status = RFU_STATUS_OK; taskId = CreateTask(Task_RfuReconnectWithParent, 3); data = gTasks[taskId].data; StringCopy((u8*)(data), name); @@ -2741,12 +2744,12 @@ static bool32 ShouldRejectPartnerConnectionBasedOnActivity(s16 activity, struct static void sub_801209C(u8 taskId) { - if (Rfu.errorStatus == 4) + if (Rfu.status == RFU_STATUS_NEW_CHILD_DETECTED) DestroyTask(taskId); if (++gTasks[taskId].data[0] > 300) { - RfuSetErrorStatus(2, 0x7000); + RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, 0x7000); DestroyTask(taskId); } @@ -2766,7 +2769,7 @@ static void sub_801209C(u8 taskId) } else { - RfuSetErrorStatus(2, 0x7000); + RfuSetStatus(RFU_STATUS_CONNECTION_ERROR, 0x7000); DestroyTask(taskId); } } @@ -2778,7 +2781,7 @@ void sub_8012188(const u8 *name, struct GFtgtGname *structPtr, u8 activity) u8 taskId, taskId2; Rfu.unk_ccf = 0; - Rfu.errorStatus = 0; + Rfu.status = RFU_STATUS_OK; StringCopy(Rfu.playerName, name); memcpy(&Rfu.unk_10A, structPtr, RFU_GAME_NAME_LENGTH); rfu_LMAN_forceChangeSP(); @@ -2811,7 +2814,7 @@ bool32 sub_8012240(void) 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; } @@ -2846,7 +2849,7 @@ static void Debug_PrintStatus(void) } 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++) { Debug_PrintNum(Rfu.unk_14[i][j], j * 2, i + 11, 2); } diff --git a/src/link_rfu_3.c b/src/link_rfu_3.c index 4393d14ac..c53e1c59e 100644 --- a/src/link_rfu_3.c +++ b/src/link_rfu_3.c @@ -953,7 +953,7 @@ void UpdateWirelessStatusIndicatorSprite(void) gMain.oamBuffer[125].paletteNum = sprite->oam.paletteNum; 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 (RfuGetErrorStatus() == 1) + if (RfuGetStatus() == RFU_STATUS_FATAL_ERROR) { DestroyWirelessStatusIndicatorSprite(); } 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/start_menu.c b/src/start_menu.c index df45a3f12..88ad364c7 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -525,7 +525,7 @@ void Task_ShowStartMenu(u8 taskId) { case 0: if (InUnionRoom() == TRUE) - var_800D_set_xB(); + SetUsingUnionRoomStartMenu(); gMenuCallback = HandleStartMenuInput; task->data[0]++; diff --git a/src/union_room.c b/src/union_room.c index 54d25046a..1ef8cd4cb 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -54,6 +54,127 @@ #include "constants/songs.h" #include "constants/species.h" +// 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; @@ -70,73 +191,73 @@ static struct WirelessLink_Group *sGroup; static struct WirelessLink_URoom *sURoom; // this file's functions -static void UR_AddTextPrinterParameterized(u8 windowId, u8 arg1, const u8 *str, u8 arg3, u8 arg4, u8 arg5); -static u16 ReadAsU16(const u8 *ptr); -static void Task_TryBecomeLinkLeader(u8 taskId); -static void Task_TryJoinLinkGroup(u8 taskId); -static void Task_ListenToWireless(u8 taskId); -static void Task_MEvent_Leader(u8 taskId); -static void Task_CardOrNewsWithFriend(u8 taskId); -static void Task_CardOrNewsOverWireless(u8 taskId); -static void Task_RunUnionRoom(u8 taskId); -static void ClearUnkStruct_x1CArray(struct UnkStruct_Main4 *arg0, u8 count); -static void ClearUnkStruct_x20Array(struct UnkStruct_x20 *arg0, u8 count); -static u8 CreateTask_ListenForPartnersWithCompatibleSerialNos(struct UnkStruct_Main4 *arg0, u32 arg1); -static u8 CreateTask_ListenForPartnersWithSerial7F7D(struct UnkStruct_Main4 *arg0, u32 arg1); -static bool8 PrintOnTextbox(u8 *textState, const u8 *str); -static bool8 Leader_SetStateIfMemberListChanged(struct WirelessLink_Leader *data, u32 arg1, u32 arg2); -static u8 sub_8013398(struct UnkStruct_Main0 *arg0); -static s8 UnionRoomHandleYesNo(u8 *arg0, bool32 arg1); -static void IntlConvPartnerUname7(u8 *dest, struct UnkStruct_x20 *arg1); -static void Leader_DestroyResources(struct WirelessLink_Leader *data); +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 *arg0); -static void PrintGroupMemberCandidateOnWindowWithColor(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 *arg3, u8 arg4, u8 id); -static u32 Findx20Inx1CArray(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1); -static u8 Appendx1Ctox20(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1, u8 arg2); +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 *data, s32 id); -static void AskToJoinRfuGroup(struct WirelessLink_Group *data, s32 id); +static u32 IsTryingToTradeAcrossVersionTooSoon(struct WirelessLink_Group *, s32); +static void AskToJoinRfuGroup(struct WirelessLink_Group *, s32); static void JoinGroup_EnableScriptContexts(void); -static void PrintUnionRoomGroupOnWindow(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 *arg3, u8 arg4, u8 id); -static bool32 AreUnionRoomPlayerGnamesDifferent(struct WirelessGnameUnamePair *arg0, struct WirelessGnameUnamePair *arg1); -static u32 GetPartyPositionOfRegisteredMon(struct UnionRoomTrade *arg0, u8 multiplayerId); -static void ResetUnionRoomTrade(struct UnionRoomTrade *arg0); +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 *arg0, s16 arg1); -static u8 CreateTask_SearchForChildOrParent(struct UnkStruct_Main4 *arg0, struct UnkStruct_Main4 *arg1, u32 arg2); -static bool32 RegisterTradeMonAndGetIsEgg(u32 monId, struct UnionRoomTrade *trade); -static void RegisterTradeMon(u32 monId, struct UnionRoomTrade *arg1); +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 PlayerIsTalkingToUnionRoomAide(void); +static bool32 IsPlayerFacingTradingBoard(void); static u8 HandlePlayerListUpdate(void); -static bool32 PollPartnerYesNoResponse(struct WirelessLink_URoom *data); -static void ReceiveUnionRoomActivityPacket(struct WirelessLink_URoom *data); -static u8 GetActivePartnerSpriteGenderParam(struct WirelessLink_URoom *data); -static bool32 UnionRoom_HandleContactFromOtherPlayer(struct WirelessLink_URoom *data); +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 arg1, struct UnkStruct_Main0 *arg0); -static s32 UnionRoomGetPlayerInteractionResponse(struct UnkStruct_Main0 *arg0, u8 arg1, u8 arg2, u32 playerGender); -static void HandleCancelTrade(bool32 arg0); -static s32 ListMenuHandler_AllItemsAvailable(u8 *arg0, u8 *arg1, u8 *arg2, const struct WindowTemplate *winTemplate, const struct ListMenuTemplate *menuTemplate); -static s32 TradeBoardMenuHandler(u8 *arg0, u8 *arg1, u8 *arg2, u8 *arg3, const struct WindowTemplate *winTemplate, const struct ListMenuTemplate *menuTemplate, struct UnkStruct_Main0 *arg6); -static s32 GetIndexOfNthTradeBoardOffer(struct UnkStruct_x20 * arg, s32 arg1); +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 arg0); -static void ViewURoomPartnerTrainerCard(u8 *unused, struct WirelessLink_URoom *data, bool8 arg2); -static void GetURoomActivityRejectMsg(u8 *dst, s32 arg1, u32 playerGender); -static u32 ConvPartnerUnameAndGetWhetherMetAlready(struct UnkStruct_x20 *arg0); -static void GetURoomActivityStartMsg(u8 *dst, u8 arg1); +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 type, u32 species); -static bool32 UR_PrintFieldMessage(const u8 *src); -static s32 GetChatLeaderActionRequestMessage(u8 *dst, u32 gender, u16 *arg2, struct WirelessLink_URoom *data); +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* arg0, const struct WirelessGnameUnamePair* arg1); -static void ItemPrintFunc_PossibleGroupMembers(u8 windowId, s32 itemId, u8 y); -static void ListMenuItemPrintFunc_UnionRoomGroups(u8 windowId, s32 itemId, u8 y); -static void TradeBoardListMenuItemPrintFunc(u8 windowId, s32 itemId, u8 y); -static void nullsub_14(u8 windowId, s32 itemId, u8 y); +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" @@ -234,9 +355,9 @@ void TryBecomeLinkLeader(void) sWirelessLinkMain.leader = data = (void*)(gTasks[taskId].data); sLeader = data; - data->state = 0; + data->state = LL_STATE_INIT; data->textState = 0; - gSpecialVar_Result = 0; + gSpecialVar_Result = LINKUP_ONGOING; } static void Task_TryBecomeLinkLeader(u8 taskId) @@ -246,7 +367,7 @@ static void Task_TryBecomeLinkLeader(u8 taskId) switch (data->state) { - case 0: + case LL_STATE_INIT: if (gSpecialVar_0x8004 == LINK_GROUP_BATTLE_TOWER && gSaveBlock2Ptr->frontier.lvlMode == FRONTIER_LVL_OPEN) gSpecialVar_0x8004++; gPlayerCurrActivity = sLinkGroupToActivityAndCapacity[gSpecialVar_0x8004]; @@ -254,31 +375,31 @@ static void Task_TryBecomeLinkLeader(u8 taskId) SetHostRFUtgtGname(gPlayerCurrActivity, 0, 0); SetWirelessCommType1(); OpenLink(); - InitializeRfuLinkManager_LinkLeader(sPlayerActivityGroupSize & 0xF); - data->state = 3; + InitializeRfuLinkManager_LinkLeader(GROUP_MAX(sPlayerActivityGroupSize)); + data->state = LL_STATE_INIT2; break; - case 3: + 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].field_18 = 0; + data->field_0->arr[0].timeoutCounter = 0; data->field_0->arr[0].groupScheduledAnim = UNION_ROOM_SPAWN_IN; - data->field_0->arr[0].field_1A_1 = 0; + data->field_0->arr[0].useRedText = FALSE; data->field_0->arr[0].field_1B = 0; data->listenTaskId = CreateTask_ListenForPartnersWithCompatibleSerialNos(data->field_4, 0xFF); data->bButtonCancelWindowId = AddWindow(&sWindowTemplate_BButtonCancel); - switch (sPlayerActivityGroupSize & 0xF) + 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->nPlayerModeWindowId = AddWindow(&sWindowTemplate_NumPlayerMode); @@ -299,13 +420,13 @@ static void Task_TryBecomeLinkLeader(u8 taskId) CopyBgTilemapBufferToVram(0); data->playerCount = 1; - data->state = 4; + data->state = LL_STATE_GET_AWAITING_PLAYERS_TEXT; break; - case 4: - StringCopy(gStringVar1, sLinkGroupActivityTexts[gPlayerCurrActivity]); - if ((sPlayerActivityGroupSize >> 4) != 0) + case LL_STATE_GET_AWAITING_PLAYERS_TEXT: + StringCopy(gStringVar1, sLinkGroupActivityNameTexts[gPlayerCurrActivity]); + if (GROUP_MIN(sPlayerActivityGroupSize) != 0) { - if (data->playerCount > (sPlayerActivityGroupSize >> 4) - 1 && (sPlayerActivityGroupSize & 0xF) != 0) + if (data->playerCount > GROUP_MIN(sPlayerActivityGroupSize) - 1 && GROUP_MAX(sPlayerActivityGroupSize) != 0) StringExpandPlaceholders(gStringVar4, sText_AwaitingLinkPressStart); else StringExpandPlaceholders(gStringVar4, sText_AwaitingCommunication); @@ -316,108 +437,110 @@ static void Task_TryBecomeLinkLeader(u8 taskId) } PrintNumPlayersWaitingForMsg(data->nPlayerModeWindowId, sPlayerActivityGroupSize, data->playerCount); - data->state = 5; + 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: - Leader_SetStateIfMemberListChanged(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->playerCount == 1) - data->state = 23; - else if ((sPlayerActivityGroupSize & 0xF0) != 0) - data->state = 30; + 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 ((sPlayerActivityGroupSize >> 4) != 0 - && data->playerCount > (sPlayerActivityGroupSize >> 4) - 1 - && (sPlayerActivityGroupSize & 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; + 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->state = LL_STATE_AWAIT_PLAYERS; data->playerCount = sub_8013398(data->field_0); } break; - case 10: - id = ((gPlayerCurrActivity & 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->playerCount = sub_8013398(data->field_0); RedrawListMenu(data->listTaskId); - data->state = 4; + data->state = LL_STATE_GET_AWAITING_PLAYERS_TEXT; } break; - case 29: - // Other player canceled. - id = ((sPlayerActivityGroupSize & 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 (UnionRoomHandleYesNo(&data->textState, TrainerIdAndNameStillInPartnersList(ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.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; - SendByteToPartnerByIdAndName(5, ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.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; - SendByteToPartnerByIdAndName(6, ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.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 = WaitSendByteToPartnerByIdAndName(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) + 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->playerCount].field_1B = 0; RedrawListMenu(data->listTaskId); data->playerCount++; - if (data->playerCount == (sPlayerActivityGroupSize & 0xF)) + if (data->playerCount == GROUP_MAX(sPlayerActivityGroupSize)) { - if ((sPlayerActivityGroupSize & 0xF0) != 0 || data->playerCount == 4) + if (GROUP_MIN2(sPlayerActivityGroupSize) != 0 || data->playerCount == 4) { - data->state = 15; + data->state = LL_STATE_MEMBERS_OK_PROMPT; } else { IntlConvPartnerUname7(gStringVar1, &data->field_0->arr[data->playerCount - 1]); StringExpandPlaceholders(gStringVar4, sText_AnOKWasSentToPlayer); - data->state = 13; + data->state = LL_STATE_ACCEPTED_FINAL_MEMBER; } LinkRfu_StopManagerAndFinalizeSlots(); @@ -425,125 +548,125 @@ static void Task_TryBecomeLinkLeader(u8 taskId) } else { - data->state = 4; + data->state = LL_STATE_GET_AWAITING_PLAYERS_TEXT; } } - else + else // Member disconnected { 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) { - RfuSetErrorStatus(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: + case LL_STATE_WAIT_AND_CONFIRM_MEMBERS: if (++data->delayTimerAfterOk > 120) - data->state = 17; + 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: + 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 ((sPlayerActivityGroupSize & 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: + 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 ((sPlayerActivityGroupSize & 0xF0) != 0) - data->state = 15; - else if (data->playerCount == (sPlayerActivityGroupSize & 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 (!Leader_SetStateIfMemberListChanged(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: + case LL_STATE_FINAL_MEMBER_CHECK: if (LmanAcceptSlotFlagIsNotZero()) { 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(); LinkRfu_Shutdown(); Leader_DestroyResources(data); - data->state++; + 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 (RfuIsErrorStatus1or2()) + case LL_STATE_TRY_START_ACTIVITY: + if (RfuHasErrored()) { - data->state = 29; + data->state = LL_STATE_MEMBER_DISCONNECTED; } else { @@ -683,7 +806,7 @@ static void GetGroupLeaderSentAnOKMessage(u8 *dst, u8 caseId) } } -static bool8 Leader_SetStateIfMemberListChanged(struct WirelessLink_Leader *data, u32 state1, u32 state2) +static bool8 Leader_SetStateIfMemberListChanged(struct WirelessLink_Leader *data, u32 joinedState, u32 droppedState) { switch (LeaderUpdateGroupMembership(data->field_0)) { @@ -692,12 +815,12 @@ static bool8 Leader_SetStateIfMemberListChanged(struct WirelessLink_Leader *data RedrawListMenu(data->listTaskId); IntlConvPartnerUname7(gStringVar2, &data->field_0->arr[data->playerCount]); Leader_GetAcceptNewMemberPrompt(gStringVar4, gPlayerCurrActivity); - data->state = state1; + data->state = joinedState; break; case UNION_ROOM_SPAWN_OUT: - RfuSetErrorStatus(0, 0); + RfuSetStatus(RFU_STATUS_OK, 0); RedrawListMenu(data->listTaskId); - data->state = state2; + data->state = droppedState; return TRUE; } @@ -707,20 +830,20 @@ static bool8 Leader_SetStateIfMemberListChanged(struct WirelessLink_Leader *data static void ItemPrintFunc_PossibleGroupMembers(u8 windowId, s32 id, u8 y) { struct WirelessLink_Leader *data = sWirelessLinkMain.leader; - u8 var = 0; + u8 colorIdx = UR_COLOR_DKE_WHT_LTE; switch (data->field_0->arr[id].groupScheduledAnim) { case UNION_ROOM_SPAWN_IN: if (data->field_0->arr[id].field_1B != 0) - var = 2; + colorIdx = UR_COLOR_GRN_WHT_LTG; break; case UNION_ROOM_SPAWN_OUT: - var = 1; + colorIdx = UR_COLOR_RED_WHT_LTR; break; } - PrintGroupMemberCandidateOnWindowWithColor(windowId, 0, y, &data->field_0->arr[id], var, id); + PrintGroupMemberCandidateOnWindowWithColor(windowId, 0, y, &data->field_0->arr[id], colorIdx, id); } static u8 LeaderUpdateGroupMembership(struct UnkStruct_Main0 *arg0) @@ -730,7 +853,7 @@ static u8 LeaderUpdateGroupMembership(struct UnkStruct_Main0 *arg0) 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].groupScheduledAnim; if (var == UNION_ROOM_SPAWN_IN) @@ -739,7 +862,7 @@ static u8 LeaderUpdateGroupMembership(struct UnkStruct_Main0 *arg0) if (id != 0xFF) { data->field_0->arr[i].gname_uname = data->field_4->arr[id].gname_uname; - data->field_0->arr[i].field_18 = 1; + data->field_0->arr[i].timeoutCounter = 1; } else { @@ -750,11 +873,11 @@ static u8 LeaderUpdateGroupMembership(struct UnkStruct_Main0 *arg0) } for (id = 0; id < RFU_CHILD_MAX; id++) - Appendx1Ctox20(data->field_0->arr, &data->field_4->arr[id], 5); + Appendx1Ctox20(data->field_0->arr, &data->field_4->arr[id], MAX_RFU_PLAYERS); 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 = UNION_ROOM_SPAWN_IN; @@ -769,13 +892,13 @@ static u8 sub_8013398(struct UnkStruct_Main0 *arg0) 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].groupScheduledAnim == UNION_ROOM_SPAWN_IN) { @@ -784,28 +907,28 @@ static u8 sub_8013398(struct UnkStruct_Main0 *arg0) } } - ret = copiedCount; - for (; copiedCount < 5; copiedCount++) + playerCount = copiedCount; + for (; copiedCount < MAX_RFU_PLAYERS; copiedCount++) { data->field_0->arr[copiedCount].gname_uname = sWirelessGnameUnamePair_Dummy; - data->field_0->arr[copiedCount].field_18 = 0; + data->field_0->arr[copiedCount].timeoutCounter = 0; data->field_0->arr[copiedCount].groupScheduledAnim = UNION_ROOM_SPAWN_NONE; - data->field_0->arr[copiedCount].field_1A_1 = 0; + 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].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) @@ -817,9 +940,9 @@ void TryJoinLinkGroup(void) sWirelessLinkMain.group = data = (void*)(gTasks[taskId].data); sGroup = data; - data->state = 0; + data->state = LG_STATE_INIT; data->textState = 0; - gSpecialVar_Result = 0; + gSpecialVar_Result = LINKUP_ONGOING; } static void Task_TryJoinLinkGroup(u8 taskId) @@ -829,7 +952,7 @@ static void Task_TryJoinLinkGroup(u8 taskId) switch (data->state) { - case 0: + case LG_STATE_INIT: if (gSpecialVar_0x8004 == LINK_GROUP_BATTLE_TOWER && gSaveBlock2Ptr->frontier.lvlMode == FRONTIER_LVL_OPEN) gSpecialVar_0x8004++; gPlayerCurrActivity = sLinkGroupToURoomActivity[gSpecialVar_0x8004]; @@ -839,13 +962,13 @@ static void Task_TryJoinLinkGroup(u8 taskId) InitializeRfuLinkManager_JoinGroup(); data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C)); data->field_0 = AllocZeroed(16 * sizeof(struct UnkStruct_x20)); - data->state = 1; + 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: + 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); @@ -870,9 +993,9 @@ static void Task_TryJoinLinkGroup(u8 taskId) CopyBgTilemapBufferToVram(0); data->leaderId = 0; - data->state = 3; + data->state = LG_STATE_CHOOSE_LEADER_HANDLE_INPUT; break; - case 3: + case LG_STATE_CHOOSE_LEADER_HANDLE_INPUT: id = GetNewLeaderCandidate(); switch (id) { @@ -885,22 +1008,22 @@ static void Task_TryJoinLinkGroup(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].gname_uname.gname.activity; + u32 activity = data->field_0->arr[id].gname_uname.gname.activity; if (data->field_0->arr[id].groupScheduledAnim == UNION_ROOM_SPAWN_IN && !data->field_0->arr[id].gname_uname.gname.started) { - u32 var = IsTryingToTradeAcrossVersionTooSoon(data, id); - if (var == 0) + u32 readyStatus = IsTryingToTradeAcrossVersionTooSoon(data, id); + if (readyStatus == UR_TRADE_READY) { + // Trading is allowed, or not trading at all AskToJoinRfuGroup(data, id); - data->state = 5; + 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); } } @@ -911,7 +1034,7 @@ static void Task_TryJoinLinkGroup(u8 taskId) } else if (gMain.newKeys & B_BUTTON) { - data->state = 10; + data->state = LG_STATE_CANCEL_CHOOSE_LEADER; } break; default: @@ -919,19 +1042,19 @@ static void Task_TryJoinLinkGroup(u8 taskId) break; } break; - case 5: + case LG_STATE_ASK_JOIN_GROUP: GetYouAskedToJoinGroupPleaseWaitMessage(gStringVar4, gPlayerCurrActivity); if (PrintOnTextbox(&data->textState, gStringVar4)) { IntlConvPartnerUname7(gStringVar1, &data->field_0->arr[data->leaderId]); - data->state = 6; + data->state = LG_STATE_MAIN; } break; - case 6: + case LG_STATE_MAIN: if (gReceivedRemoteLinkPlayers) { gPlayerCurrActivity = data->field_0->arr[data->leaderId].gname_uname.gname.activity; - RfuSetErrorStatus(0, 0); + RfuSetStatus(RFU_STATUS_OK, 0); switch (gPlayerCurrActivity) { case ACTIVITY_BATTLE_SINGLE: @@ -954,43 +1077,43 @@ static void Task_TryJoinLinkGroup(u8 taskId) case ACTIVITY_CONTEST_CUTE: case ACTIVITY_CONTEST_SMART: case ACTIVITY_CONTEST_TOUGH: - data->state = 20; + data->state = LG_STATE_READY_START_ACTIVITY; return; } } - switch (RfuGetErrorStatus()) + 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: + case RFU_STATUS_JOIN_GROUP_OK: GetGroupLeaderSentAnOKMessage(gStringVar4, gPlayerCurrActivity); if (PrintOnTextbox(&data->textState, gStringVar4)) { if (gPlayerCurrActivity == ACTIVITY_BATTLE_TOWER || gPlayerCurrActivity == ACTIVITY_BATTLE_TOWER_OPEN) { - RfuSetErrorStatus(12, 0); + RfuSetStatus(RFU_STATUS_ACK_JOIN_GROUP, 0); } else { - RfuSetErrorStatus(7, 0); - StringCopy(gStringVar1, sLinkGroupActivityTexts[gPlayerCurrActivity]); + RfuSetStatus(RFU_STATUS_WAIT_ACK_JOIN_GROUP, 0); + StringCopy(gStringVar1, sLinkGroupActivityNameTexts[gPlayerCurrActivity]); StringExpandPlaceholders(gStringVar4, sText_AwaitingOtherMembers); } } break; - case 7: + case RFU_STATUS_WAIT_ACK_JOIN_GROUP: if (data->delayBeforePrint > 240) { if (PrintOnTextbox(&data->textState, gStringVar4)) { - RfuSetErrorStatus(12, 0); + RfuSetStatus(RFU_STATUS_ACK_JOIN_GROUP, 0); data->delayBeforePrint = 0; } } @@ -1012,41 +1135,41 @@ static void Task_TryJoinLinkGroup(u8 taskId) break; } - if (!RfuGetErrorStatus() && 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 (UnionRoomHandleYesNo(&data->textState, RfuGetErrorStatus())) + case LG_STATE_ASK_LEAVE_GROUP_HANDLE_INPUT: + switch (UnionRoomHandleYesNo(&data->textState, RfuGetStatus())) { - case 0: - LinkRfuNIsend8(); - 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 (RfuGetErrorStatus()) - 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: + 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); @@ -1061,40 +1184,43 @@ static void Task_TryJoinLinkGroup(u8 taskId) Free(data->field_4); data->state++; break; - case 13: + case LG_STATE_RFU_ERROR_SHUTDOWN: DestroyWirelessStatusIndicatorSprite(); - if (PrintOnTextbox(&data->textState, sPlayerDisconnectedTexts[RfuGetErrorStatus()])) + 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[RfuGetErrorStatus()])) + 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); JoinGroup_EnableScriptContexts(); LinkRfu_Shutdown(); break; - case 21: + case LG_STATE_START_ACTIVITY: CreateTask_RunScriptAndFadeToActivity(); DestroyTask(taskId); break; @@ -1108,16 +1234,16 @@ static u32 IsTryingToTradeAcrossVersionTooSoon(struct WirelessLink_Group *data, if (gPlayerCurrActivity == ACTIVITY_TRADE && structPtr->gname_uname.gname.unk_00.version != VERSION_EMERALD) { if (!(gSaveBlock2Ptr->specialSaveWarpFlags & CHAMPION_SAVEWARP)) - return 1; + return UR_TRADE_PLAYER_NOT_READY; else if (structPtr->gname_uname.gname.unk_00.isChampion) - return 0; + return UR_TRADE_READY; } else { - return 0; + return UR_TRADE_READY; } - return 2; + return UR_TRADE_PARTNER_NOT_READY; } static void AskToJoinRfuGroup(struct WirelessLink_Group *data, s32 id) @@ -1127,7 +1253,7 @@ static void AskToJoinRfuGroup(struct WirelessLink_Group *data, s32 id) CreateWirelessStatusIndicatorSprite(0, 0); RedrawListMenu(data->listTaskId); IntlConvPartnerUname7(gStringVar1, &data->field_0->arr[data->leaderId]); - UpdateGameDataWithActivitySpriteGendersFlag(sLinkGroupToURoomActivity[gSpecialVar_0x8004], 0, 1); + 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)); } @@ -1216,7 +1342,7 @@ static u8 URoomGroupListGetTextColor(struct WirelessLink_Group *data, u32 id) { if (data->field_0->arr[id].gname_uname.gname.started) return UR_COLOR_WHT_WHT_LTE; - else if (data->field_0->arr[id].field_1A_1 != 0) + 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 UR_COLOR_GRN_WHT_LTG; @@ -1272,14 +1398,14 @@ static u8 GetNewLeaderCandidate(void) ret = 1; } - data->field_0->arr[i].field_18 = 0; + data->field_0->arr[i].timeoutCounter = 0; } else { 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].groupScheduledAnim = UNION_ROOM_SPAWN_OUT; ret = 2; @@ -1422,8 +1548,7 @@ void StartUnionRoomBattle(u16 battleFlags) PlayBattleBGM(); } -// TODO: pokefirered bad name -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); @@ -1431,8 +1556,7 @@ static void sub_8014290(u16 linkService, u16 x, u16 y) WarpIntoMap(); } -// TODO: pokefirered bad name -static 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); @@ -1506,7 +1630,7 @@ static void Task_StartActivity(u8 taskId) HealPlayerParty(); SavePlayerParty(); LoadPlayerBag(); - sub_8014304(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_SINGLE_BATTLE); + WarpForCableClubActivity(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_SINGLE_BATTLE); SetMainCallback2(CB2_TransitionToCableClub); break; case ACTIVITY_BATTLE_DOUBLE: @@ -1515,7 +1639,7 @@ static void Task_StartActivity(u8 taskId) SavePlayerParty(); LoadPlayerBag(); CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE); - sub_8014304(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_DOUBLE_BATTLE); + WarpForCableClubActivity(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_DOUBLE_BATTLE); SetMainCallback2(CB2_TransitionToCableClub); break; case ACTIVITY_BATTLE_MULTI: @@ -1524,19 +1648,19 @@ static void Task_StartActivity(u8 taskId) SavePlayerParty(); LoadPlayerBag(); CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE); - sub_8014304(MAP_GROUP(BATTLE_COLOSSEUM_4P), MAP_NUM(BATTLE_COLOSSEUM_4P), 5, 8, USING_MULTI_BATTLE); + WarpForCableClubActivity(MAP_GROUP(BATTLE_COLOSSEUM_4P), MAP_NUM(BATTLE_COLOSSEUM_4P), 5, 8, USING_MULTI_BATTLE); SetMainCallback2(CB2_TransitionToCableClub); break; case ACTIVITY_TRADE: CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE); CleanupOverworldWindowsAndTilemaps(); - sub_8014304(MAP_GROUP(TRADE_CENTER), MAP_NUM(TRADE_CENTER), 5, 8, USING_TRADE_CENTER); + WarpForCableClubActivity(MAP_GROUP(TRADE_CENTER), MAP_NUM(TRADE_CENTER), 5, 8, USING_TRADE_CENTER); SetMainCallback2(CB2_TransitionToCableClub); break; case ACTIVITY_RECORD_CORNER: CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE); CleanupOverworldWindowsAndTilemaps(); - sub_8014304(MAP_GROUP(RECORD_CORNER), MAP_NUM(RECORD_CORNER), 8, 9, USING_RECORD_CORNER); + WarpForCableClubActivity(MAP_GROUP(RECORD_CORNER), MAP_NUM(RECORD_CORNER), 8, 9, USING_RECORD_CORNER); SetMainCallback2(CB2_TransitionToCableClub); break; case ACTIVITY_TRADE | IN_UNION_ROOM: @@ -1562,21 +1686,21 @@ static void Task_StartActivity(u8 taskId) SetMainCallback2(CB2_ShowCard); break; case ACTIVITY_POKEMON_JUMP: - sub_8014290(USING_MINIGAME, 5, 1); + WarpForWirelessMinigame(USING_MINIGAME, 5, 1); StartPokemonJump(GetCursorSelectionMonId(), CB2_LoadMap); break; case ACTIVITY_BERRY_CRUSH: - sub_8014290(USING_BERRY_CRUSH, 9, 1); + WarpForWirelessMinigame(USING_BERRY_CRUSH, 9, 1); StartBerryCrush(CB2_LoadMap); break; case ACTIVITY_BERRY_PICK: - sub_8014290(USING_MINIGAME, 5, 1); + WarpForWirelessMinigame(USING_MINIGAME, 5, 1); StartDodrioBerryPicking(GetCursorSelectionMonId(), CB2_LoadMap); break; } DestroyTask(taskId); - gSpecialVar_Result = 1; + gSpecialVar_Result = LINKUP_SUCCESS; if (gPlayerCurrActivity != (ACTIVITY_TRADE | IN_UNION_ROOM)) ScriptContext2_Disable(); } @@ -1628,7 +1752,7 @@ static void Task_RunScriptAndFadeToActivity(u8 taskId) case 2: if (!gPaletteFade.active) { - if (gPlayerCurrActivity == 29) + if (gPlayerCurrActivity == ACTIVITY_29) { DestroyTask(taskId); SetMainCallback2(CB2_StartCreateTradeMenu); @@ -1707,7 +1831,7 @@ void MEvent_CreateTask_Leader(u32 activity) data->state = 0; data->textState = 0; data->activity = activity; - gSpecialVar_Result = 0; + gSpecialVar_Result = LINKUP_ONGOING; } static void Task_MEvent_Leader(u8 taskId) @@ -1735,13 +1859,13 @@ static void Task_MEvent_Leader(u8 taskId) 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].field_18 = 0; + data->field_0->arr[0].timeoutCounter = 0; data->field_0->arr[0].groupScheduledAnim = UNION_ROOM_SPAWN_IN; - data->field_0->arr[0].field_1A_1 = 0; + data->field_0->arr[0].useRedText = FALSE; data->field_0->arr[0].field_1B = 0; data->listenTaskId = CreateTask_ListenForPartnersWithCompatibleSerialNos(data->field_4, 0xFF); - winTemplate = gUnknown_082F011C; + winTemplate = sWindowTemplate_PlayerList; winTemplate.baseBlock = GetMysteryGiftBaseBlock(); winTemplate.paletteNum = 0xC; data->listWindowId = AddWindow(&winTemplate); @@ -1755,7 +1879,7 @@ static void Task_MEvent_Leader(u8 taskId) data->state = 2; break; case 2: - StringCopy(gStringVar1, sLinkGroupActivityTexts[gPlayerCurrActivity]); + StringCopy(gStringVar1, sLinkGroupActivityNameTexts[gPlayerCurrActivity]); StringExpandPlaceholders_AwaitingCommFromAnother(gStringVar4, gPlayerCurrActivity); data->state = 3; break; @@ -1790,23 +1914,23 @@ static void Task_MEvent_Leader(u8 taskId) CreateWirelessStatusIndicatorSprite(0, 0); data->field_0->arr[data->playerCount].field_1B = 0; RedrawListMenu(data->listTaskId); - data->field_19 = 5; - SendByteToPartnerByIdAndName(5, ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.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; - SendByteToPartnerByIdAndName(6, ReadAsU16(data->field_0->arr[data->playerCount].gname_uname.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].gname_uname.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 = WaitSendByteToPartnerByIdAndName(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) + 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->playerCount].field_1B = 0; RedrawListMenu(data->listTaskId); @@ -1825,11 +1949,11 @@ static void Task_MEvent_Leader(u8 taskId) data->state = 2; } - data->field_19 = 0; + data->joinRequestAnswer = 0; } - else if (val == 2) + else if (val == 2) // Member disconnected { - RfuSetErrorStatus(0, 0); + RfuSetStatus(RFU_STATUS_OK, 0); data->state = 2; } break; @@ -1872,11 +1996,11 @@ static void Task_MEvent_Leader(u8 taskId) if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, sText_PleaseStartOver)) { DestroyTask(taskId); - gSpecialVar_Result = 5; + gSpecialVar_Result = LINKUP_FAILED; } break; case 15: - if (RfuGetErrorStatus() == 1 || RfuGetErrorStatus() == 2) + if (RfuGetStatus() == RFU_STATUS_FATAL_ERROR || RfuGetStatus() == RFU_STATUS_CONNECTION_ERROR) { data->state = 13; } @@ -1916,7 +2040,7 @@ void MEvent_CreateTask_CardOrNewsWithFriend(u32 activity) data->state = 0; data->textState = 0; data->isWonderNews = activity - ACTIVITY_WONDER_CARD2; - gSpecialVar_Result = 0; + gSpecialVar_Result = LINKUP_ONGOING; } static void Task_CardOrNewsWithFriend(u8 taskId) @@ -2021,16 +2145,16 @@ static void Task_CardOrNewsWithFriend(u8 taskId) data->state = 10; } - switch (RfuGetErrorStatus()) + 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); - RfuSetErrorStatus(0, 0); + RfuSetStatus(RFU_STATUS_OK, 0); break; } break; @@ -2047,12 +2171,12 @@ static void Task_CardOrNewsWithFriend(u8 taskId) data->state++; break; case 9: - if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, sLinkDroppedTexts[RfuGetErrorStatus()])) + if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, sLinkDroppedTexts[RfuGetStatus()])) { DestroyWirelessStatusIndicatorSprite(); DestroyTask(taskId); LinkRfu_Shutdown(); - gSpecialVar_Result = 5; + gSpecialVar_Result = LINKUP_FAILED; } break; case 7: @@ -2060,7 +2184,7 @@ static void Task_CardOrNewsWithFriend(u8 taskId) AddTextPrinterToWindow1(sText_PleaseStartOver); DestroyTask(taskId); LinkRfu_Shutdown(); - gSpecialVar_Result = 5; + gSpecialVar_Result = LINKUP_FAILED; break; case 11: data->state++; @@ -2085,7 +2209,7 @@ void MEvent_CreateTask_CardOrNewsOverWireless(u32 activity) data->state = 0; data->textState = 0; data->isWonderNews = activity - ACTIVITY_WONDER_CARD2; - gSpecialVar_Result = 0; + gSpecialVar_Result = LINKUP_ONGOING; } static void Task_CardOrNewsOverWireless(u8 taskId) @@ -2186,16 +2310,16 @@ static void Task_CardOrNewsOverWireless(u8 taskId) data->state = 12; } - switch (RfuGetErrorStatus()) + 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); - RfuSetErrorStatus(0, 0); + RfuSetStatus(RFU_STATUS_OK, 0); break; } break; @@ -2220,7 +2344,7 @@ static void Task_CardOrNewsOverWireless(u8 taskId) DestroyWirelessStatusIndicatorSprite(); DestroyTask(taskId); LinkRfu_Shutdown(); - gSpecialVar_Result = 5; + gSpecialVar_Result = LINKUP_FAILED; } break; case 7: @@ -2229,7 +2353,7 @@ static void Task_CardOrNewsOverWireless(u8 taskId) DestroyWirelessStatusIndicatorSprite(); DestroyTask(taskId); LinkRfu_Shutdown(); - gSpecialVar_Result = 5; + gSpecialVar_Result = LINKUP_FAILED; } break; case 11: @@ -2238,7 +2362,7 @@ static void Task_CardOrNewsOverWireless(u8 taskId) DestroyWirelessStatusIndicatorSprite(); DestroyTask(taskId); LinkRfu_Shutdown(); - gSpecialVar_Result = 5; + gSpecialVar_Result = LINKUP_FAILED; } break; case 13: @@ -2252,9 +2376,9 @@ static void Task_CardOrNewsOverWireless(u8 taskId) } } -void UnionRoomSpecial(void) +void RunUnionRoom(void) { - struct WirelessLink_URoom *data; + struct WirelessLink_URoom *uroom; ClearAndInitHostRFUtgtGname(); CreateTask(Task_RunUnionRoom, 10); @@ -2262,14 +2386,14 @@ void UnionRoomSpecial(void) // dumb line needed to match sWirelessLinkMain.uRoom = sWirelessLinkMain.uRoom; - data = AllocZeroed(sizeof(*sWirelessLinkMain.uRoom)); - sWirelessLinkMain.uRoom = data; - sURoom = data; + uroom = AllocZeroed(sizeof(*sWirelessLinkMain.uRoom)); + sWirelessLinkMain.uRoom = uroom; + sURoom = uroom; - data->state = 0; - data->textState = 0; - data->field_10 = 0; - data->field_12 = 0; + uroom->state = UR_STATE_INIT; + uroom->textState = 0; + uroom->unknown = 0; + uroom->field_12 = 0; gSpecialVar_Result = 0; ListMenuLoadStdPalAt(0xD0, 1); @@ -2282,82 +2406,82 @@ static u16 ReadAsU16(const u8 *ptr) static void ScheduleFieldMessageWithFollowupState(u32 nextState, const u8 *src) { - struct WirelessLink_URoom *data = sWirelessLinkMain.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); } static void ScheduleFieldMessageAndExit(const u8 *src) { - struct WirelessLink_URoom *data = sWirelessLinkMain.uRoom; + struct WirelessLink_URoom *uroom = sWirelessLinkMain.uRoom; - data->state = 26; + uroom->state = UR_STATE_PRINT_AND_EXIT; if (src != gStringVar4) StringExpandPlaceholders(gStringVar4, src); } -static void sub_80156B0(struct WirelessLink_URoom *data) +static void sub_80156B0(struct WirelessLink_URoom *uroom) { - memcpy(&gDecompressionBuffer[0x3F00], data->field_0, 0x100); + memcpy(&gDecompressionBuffer[0x3F00], uroom->field_0, 0x100); } -static void sub_80156C8(struct WirelessLink_URoom *data) +static void sub_80156C8(struct WirelessLink_URoom *uroom) { - memcpy(data->field_0, &gDecompressionBuffer[0x3F00], 0x100); + memcpy(uroom->field_0, &gDecompressionBuffer[0x3F00], 0x100); } static void Task_RunUnionRoom(u8 taskId) { u32 id = 0; - s32 var5 = 0; + s32 input = 0; s32 playerGender = MALE; - struct WirelessLink_URoom *data = sWirelessLinkMain.uRoom; + struct WirelessLink_URoom *uroom = sWirelessLinkMain.uRoom; s16 *taskData = gTasks[taskId].data; - switch (data->state) + switch (uroom->state) { - case 0: - data->field_4 = AllocZeroed(RFU_CHILD_MAX * sizeof(struct UnkStruct_x1C)); - data->field_C = AllocZeroed(RFU_CHILD_MAX * sizeof(struct UnkStruct_x1C)); - data->field_0 = AllocZeroed(8 * sizeof(struct UnkStruct_x20)); - data->field_8 = AllocZeroed(sizeof(struct UnkStruct_x20)); - ClearUnkStruct_x20Array(data->field_0->arr, ARRAY_COUNT(data->field_0->arr)); + 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; - data->field_20 = CreateTask_SearchForChildOrParent(data->field_C, data->field_4, LINK_GROUP_UNION_ROOM_RESUME); - InitUnionRoomPlayerObjects(data->objects); + uroom->searchTaskId = CreateTask_SearchForChildOrParent(uroom->field_C, uroom->field_4, LINK_GROUP_UNION_ROOM_RESUME); + InitUnionRoomPlayerObjects(uroom->objects); SetTilesAroundUnionRoomPlayersPassable(); - data->state = 1; + uroom->state = UR_STATE_INIT_OBJECTS; break; - case 1: - CreateGroupMemberSpritesInvisible(data->spriteIds, taskData[0]); + 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: + case UR_STATE_INIT_LINK: SetHostRFUtgtGname(IN_UNION_ROOM, 0, 0); SetTradeBoardRegisteredMonInfo(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel); SetWirelessCommType1(); OpenLink(); InitializeRfuLinkManager_EnterUnionRoom(); - ClearUnkStruct_x20Array(&data->field_8->arr[0], 1); - ClearUnkStruct_x1CArray(data->field_4, 4); - ClearUnkStruct_x1CArray(data->field_C, 4); + 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) + && sUnionRoomTrade.state != URTRADE_STATE_NONE) { id = GetCursorSelectionMonId(); - switch (sUnionRoomTrade.field_0) + switch (sUnionRoomTrade.state) { - case 1: - UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE); + case URTRADE_STATE_REGISTERING: + UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE); if (id >= PARTY_SIZE) { ResetUnionRoomTrade(&sUnionRoomTrade); @@ -2366,58 +2490,58 @@ static void Task_RunUnionRoom(u8 taskId) } else if (!RegisterTradeMonAndGetIsEgg(GetCursorSelectionMonId(), &sUnionRoomTrade)) { - ScheduleFieldMessageWithFollowupState(52, 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) { ScheduleFieldMessageAndExit(sText_TradeCanceled); } else { - UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE); + 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) { - UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 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) { - UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 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; } } @@ -2425,20 +2549,20 @@ static void Task_RunUnionRoom(u8 taskId) { if (gMain.newKeys & A_BUTTON) { - if (TrySetUnionRoomMemberFacePlayer(data->field_0, &taskData[0], &taskData[1], data->spriteIds)) + if (TryInteractWithUnionRoomMember(uroom->field_0, &taskData[0], &taskData[1], uroom->spriteIds)) { PlaySE(SE_SELECT); UR_EnableScriptContext2AndFreezeObjectEvents(); - data->state = 24; + uroom->state = UR_STATE_INTERACT_WITH_PLAYER; break; } - else if (PlayerIsTalkingToUnionRoomAide()) + else if (IsPlayerFacingTradingBoard()) { - UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, 1); + UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE); PlaySE(SE_PC_LOGIN); UR_EnableScriptContext2AndFreezeObjectEvents(); StringCopy(gStringVar1, gSaveBlock2Ptr->playerName); - data->state = 45; + uroom->state = UR_STATE_CHECK_TRADING_BOARD; break; } } @@ -2448,58 +2572,58 @@ static void Task_RunUnionRoom(u8 taskId) case 1: PlaySE(SE_PC_LOGIN); case 2: - ScheduleUnionRoomPlayerRefresh(data); + ScheduleUnionRoomPlayerRefresh(uroom); break; case 4: - data->state = 11; + uroom->state = UR_STATE_PLAYER_CONTACTED_YOU; UR_EnableScriptContext2AndFreezeObjectEvents(); SetTradeBoardRegisteredMonInfo(TYPE_NORMAL, SPECIES_NONE, 0); - UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_NPCTALK | IN_UNION_ROOM, GetActivePartnerSpriteGenderParam(data), 0); + UpdateGameData_SetActivity(ACTIVITY_NPCTALK | IN_UNION_ROOM, GetActivePartnerSpriteGenderParam(uroom), FALSE); break; } - HandleUnionRoomPlayerRefresh(data); + HandleUnionRoomPlayerRefresh(uroom); } break; - case 23: + case UR_STATE_WAIT_FOR_START_MENU: if (!FuncIsActiveTask(Task_ShowStartMenu)) { - UpdateGameDataWithActivitySpriteGendersFlag(IN_UNION_ROOM, 0, FALSE); - data->state = 4; + UpdateGameData_SetActivity(ACTIVITY_NONE | IN_UNION_ROOM, 0, FALSE); + uroom->state = UR_STATE_MAIN; } break; - case 24: + case UR_STATE_INTERACT_WITH_PLAYER: UR_RunTextPrinters_CheckPrinter0Active(); - playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0); - UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, 1); - switch (UnionRoomGetPlayerInteractionResponse(data->field_0, taskData[0], taskData[1], playerGender)) + 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]].gname_uname.playerName, &data->field_0->arr[taskData[1]].gname_uname.gname, gPlayerCurrActivity); - 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: - ScheduleFieldMessageWithFollowupState(19, gStringVar4); + case 2: // Ask to join chat + ScheduleFieldMessageWithFollowupState(UR_STATE_RECV_JOIN_CHAT_REQUEST, gStringVar4); break; } break; - case 25: + case UR_STATE_TRY_COMMUNICATING: UR_RunTextPrinters_CheckPrinter0Active(); - switch (RfuGetErrorStatus()) + switch (RfuGetStatus()) { - case 4: - HandleCancelTrade(TRUE); - data->state = 4; + case RFU_STATUS_NEW_CHILD_DETECTED: + HandleCancelActivity(TRUE); + uroom->state = UR_STATE_MAIN; break; - case 1: - case 2: + case RFU_STATUS_FATAL_ERROR: + case RFU_STATUS_CONNECTION_ERROR: if (IsUnionRoomListenTaskActive() == TRUE) ScheduleFieldMessageAndExit(sText_TrainerAppearsBusy); else - ScheduleFieldMessageWithFollowupState(30, sText_TrainerAppearsBusy); + ScheduleFieldMessageWithFollowupState(UR_STATE_CANCEL_ACTIVITY_LINK_ERROR, sText_TrainerAppearsBusy); gPlayerCurrActivity = IN_UNION_ROOM; break; @@ -2509,138 +2633,142 @@ static void Task_RunUnionRoom(u8 taskId) { CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE); CreateTask(Task_ExchangeCards, 5); - data->state = 38; + uroom->state = UR_STATE_COMMUNICATING_WAIT_FOR_DATA; } break; - case 38: + case UR_STATE_COMMUNICATING_WAIT_FOR_DATA: if (!FuncIsActiveTask(Task_ExchangeCards)) { if (gPlayerCurrActivity == (ACTIVITY_TRADE | IN_UNION_ROOM)) - ScheduleFieldMessageWithFollowupState(31, sText_AwaitingPlayersResponseAboutTrade); + ScheduleFieldMessageWithFollowupState(UR_STATE_SEND_TRADE_REQUST, sText_AwaitingPlayersResponseAboutTrade); else - data->state = 5; + uroom->state = UR_STATE_DO_SOMETHING_PROMPT; } break; - case 30: + case UR_STATE_CANCEL_ACTIVITY_LINK_ERROR: if (!gReceivedRemoteLinkPlayers) { - HandleCancelTrade(FALSE); - UpdateUnionRoomMemberFacing(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 = ConvPartnerUnameAndGetWhetherMetAlready(&data->field_0->arr[taskData[1]]); - playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0); - ScheduleFieldMessageWithFollowupState(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 = ListMenuHandler_AllItemsAvailable(&data->textState, &data->topListMenuWindowId, &data->topListMenuId, &sWindowTemplate_InviteToActivity, &sListMenuTemplate_InviteToActivity); - 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) { - data->state = 28; + uroom->state = UR_STATE_TRAINER_APPEARS_BUSY; } else { - data->partnerYesNoResponse = 0; - playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0); - if (var5 == -2 || var5 == IN_UNION_ROOM) + uroom->partnerYesNoResponse = 0; + playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->field_0); + if (input == -2 || input == IN_UNION_ROOM) { - data->playerSendBuffer[0] = IN_UNION_ROOM; - sub_800FE50(data->playerSendBuffer); + 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 { - gPlayerCurrActivity = var5; - sPlayerActivityGroupSize = (u32)(var5) >> 8; + gPlayerCurrActivity = input; + sPlayerActivityGroupSize = (u32)(input) >> 8; if (gPlayerCurrActivity == (ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM) && !HasAtLeastTwoMonsOfLevel30OrLower()) { - ScheduleFieldMessageWithFollowupState(5, sText_NeedTwoMonsOfLevel30OrLower1); + ScheduleFieldMessageWithFollowupState(UR_STATE_DO_SOMETHING_PROMPT, sText_NeedTwoMonsOfLevel30OrLower1); } else { - data->playerSendBuffer[0] = gPlayerCurrActivity | 0x40; - sub_800FE50(data->playerSendBuffer); - 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: - PollPartnerYesNoResponse(data); - playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0); - id = GetResponseIdx_InviteToURoomActivity(data->playerSendBuffer[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->playerSendBuffer[0] = ACTIVITY_TRADE | IN_UNION_ROOM; - data->playerSendBuffer[1] = sUnionRoomTrade.species; - data->playerSendBuffer[2] = sUnionRoomTrade.level; - sub_800FE50(data->playerSendBuffer); - 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: + 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 { - PollPartnerYesNoResponse(data); - if (data->partnerYesNoResponse == (ACTIVITY_ACCEPT | IN_UNION_ROOM)) + PollPartnerYesNoResponse(uroom); + if (uroom->partnerYesNoResponse == (ACTIVITY_ACCEPT | IN_UNION_ROOM)) { if (gPlayerCurrActivity == ACTIVITY_CARD) { - ViewURoomPartnerTrainerCard(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->partnerYesNoResponse == (ACTIVITY_DECLINE | IN_UNION_ROOM)) + else if (uroom->partnerYesNoResponse == (ACTIVITY_DECLINE | IN_UNION_ROOM)) { - data->state = 32; + uroom->state = UR_STATE_REQUEST_DECLINED; GetURoomActivityRejectMsg(gStringVar4, gPlayerCurrActivity | IN_UNION_ROOM, gLinkPlayers[0].gender); gPlayerCurrActivity = ACTIVITY_NONE; } } break; - case 7: - id = ConvPartnerUnameAndGetWhetherMetAlready(&data->field_0->arr[taskData[1]]); - playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0); - ScheduleFieldMessageWithFollowupState(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->partnerYesNoResponse = 0; - data->recvActivityRequest[0] = 0; + uroom->partnerYesNoResponse = 0; + uroom->recvActivityRequest[0] = 0; } break; - case 41: + case UR_STATE_WAIT_FINISH_READING_CARD: if (IsLinkTaskFinished()) { if (GetMultiplayerId() == 0) @@ -2648,213 +2776,213 @@ static void Task_RunUnionRoom(u8 taskId) StringCopy(gStringVar1, gLinkPlayers[GetMultiplayerId() ^ 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 (UnionRoomHandleYesNo(&data->textState, FALSE)) + case UR_STATE_RECV_JOIN_CHAT_REQUEST: + switch (UnionRoomHandleYesNo(&uroom->textState, FALSE)) { - case 0: + case 0: // YES CopyBgTilemapBufferToVram(0); gPlayerCurrActivity = ACTIVITY_CHAT | IN_UNION_ROOM; - UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_CHAT | IN_UNION_ROOM, 0, 1); - sub_8012188(data->field_0->arr[taskData[1]].gname_uname.playerName, &data->field_0->arr[taskData[1]].gname_uname.gname, gPlayerCurrActivity); - data->field_12 = taskData[1]; - data->state = 20; + 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 = GetUnionRoomPlayerGender(taskData[1], data->field_0); - ScheduleFieldMessageAndExit(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 (RfuGetErrorStatus()) + case UR_STATE_TRY_ACCEPT_CHAT_REQUEST: + switch (RfuGetStatus()) { - case 4: - HandleCancelTrade(TRUE); - data->state = 4; + case RFU_STATUS_NEW_CHILD_DETECTED: + HandleCancelActivity(TRUE); + uroom->state = UR_STATE_MAIN; break; - case 1: - case 2: - playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0); - UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, 1); + 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 - ScheduleFieldMessageWithFollowupState(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 (RfuIsErrorStatus1or2()) + case UR_STATE_ACCEPT_CHAT_REQUEST: + if (RfuHasErrored()) { - playerGender = GetUnionRoomPlayerGender(taskData[1], data->field_0); - UpdateGameDataWithActivitySpriteGendersFlag(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, 1); + playerGender = GetUnionRoomPlayerGender(taskData[1], uroom->field_0); + UpdateGameData_SetActivity(ACTIVITY_PLYRTALK | IN_UNION_ROOM, 0, TRUE); if (IsUnionRoomListenTaskActive() == TRUE) ScheduleFieldMessageAndExit(sChatDeclinedTexts[playerGender]); else - ScheduleFieldMessageWithFollowupState(30, sChatDeclinedTexts[playerGender]); + ScheduleFieldMessageWithFollowupState(UR_STATE_CANCEL_ACTIVITY_LINK_ERROR, sChatDeclinedTexts[playerGender]); } if (gReceivedRemoteLinkPlayers) - data->state = 16; + 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->recvActivityRequest[0] = 0; + uroom->state = UR_STATE_RECV_CONTACT_DATA; + uroom->recvActivityRequest[0] = 0; break; - case 12: - if (RfuIsErrorStatus1or2()) + case UR_STATE_RECV_CONTACT_DATA: + if (RfuHasErrored()) { - HandleCancelTrade(FALSE); - data->state = 2; + HandleCancelActivity(FALSE); + uroom->state = UR_STATE_INIT_LINK; } else if (gReceivedRemoteLinkPlayers) { CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE); CreateTask(Task_ExchangeCards, 5); - data->state = 39; + uroom->state = UR_STATE_WAIT_FOR_CONTACT_DATA; } break; - case 39: - ReceiveUnionRoomActivityPacket(data); + 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 = PlayerHasMetTrainerBefore(gLinkPlayers[1].trainerId, gLinkPlayers[1].name); StringExpandPlaceholders(gStringVar4, sPlayerContactedYouTexts[id]); } break; - case 33: - ReceiveUnionRoomActivityPacket(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: - ReceiveUnionRoomActivityPacket(data); - if (UnionRoom_HandleContactFromOtherPlayer(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: - ScheduleFieldMessageWithFollowupState(9, gStringVar4); + case UR_STATE_RECV_ACTIVITY_REQUEST: + ScheduleFieldMessageWithFollowupState(UR_STATE_HANDLE_ACTIVITY_REQUEST, gStringVar4); break; - case 9: - switch (UnionRoomHandleYesNo(&data->textState, FALSE)) + case UR_STATE_HANDLE_ACTIVITY_REQUEST: + switch (UnionRoomHandleYesNo(&uroom->textState, FALSE)) { - case 0: - data->playerSendBuffer[0] = ACTIVITY_ACCEPT | IN_UNION_ROOM; + case 0: // ACCEPT + uroom->playerSendBuffer[0] = ACTIVITY_ACCEPT | IN_UNION_ROOM; if (gPlayerCurrActivity == (ACTIVITY_CHAT | IN_UNION_ROOM)) - UpdateGameDataWithActivitySpriteGendersFlag(gPlayerCurrActivity | 0x40, sub_801100C(1), 0); + UpdateGameData_SetActivity(gPlayerCurrActivity | IN_UNION_ROOM, sub_801100C(1), FALSE); else - UpdateGameDataWithActivitySpriteGendersFlag(gPlayerCurrActivity | 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 (gPlayerCurrActivity == (ACTIVITY_BATTLE_SINGLE | IN_UNION_ROOM)) { if (!HasAtLeastTwoMonsOfLevel30OrLower()) { - data->playerSendBuffer[0] = ACTIVITY_DECLINE | IN_UNION_ROOM; - sub_800FE50(data->playerSendBuffer); - 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->playerSendBuffer); - data->state = 13; + sub_800FE50(uroom->playerSendBuffer); + uroom->state = UR_STATE_PRINT_START_ACTIVITY_MSG; } } else if (gPlayerCurrActivity == (ACTIVITY_CARD | IN_UNION_ROOM)) { - sub_800FE50(data->playerSendBuffer); - ViewURoomPartnerTrainerCard(gStringVar4, data, TRUE); - data->state = 40; + sub_800FE50(uroom->playerSendBuffer); + ViewURoomPartnerTrainerCard(gStringVar4, uroom, TRUE); + uroom->state = UR_STATE_PRINT_CARD_INFO; } else { - sub_800FE50(data->playerSendBuffer); - data->state = 13; + sub_800FE50(uroom->playerSendBuffer); + uroom->state = UR_STATE_PRINT_START_ACTIVITY_MSG; } break; - case 1: + case 1: // DECLINE case -1: - data->playerSendBuffer[0] = ACTIVITY_DECLINE | IN_UNION_ROOM; - sub_800FE50(data->playerSendBuffer); - data->state = 10; + 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: + case UR_STATE_CANCEL_REQUEST_PRINT_MSG: if (!gReceivedRemoteLinkPlayers) { gPlayerCurrActivity = IN_UNION_ROOM; - ScheduleFieldMessageWithFollowupState(37, gStringVar4); - memset(data->playerSendBuffer, 0, sizeof(data->playerSendBuffer)); - data->recvActivityRequest[0] = 0; - data->partnerYesNoResponse = 0; + 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; - HandleCancelTrade(FALSE); + case UR_STATE_CANCEL_REQUEST_RESTART_LINK: + uroom->state = UR_STATE_INIT_LINK; + HandleCancelActivity(FALSE); break; - case 13: + case UR_STATE_PRINT_START_ACTIVITY_MSG: GetURoomActivityStartMsg(gStringVar4, gPlayerCurrActivity | IN_UNION_ROOM); - ScheduleFieldMessageWithFollowupState(14, gStringVar4); + 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); - DestroyGroupMemberSprites(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()) { DestroyUnionRoomPlayerObjects(); @@ -2863,10 +2991,10 @@ static void Task_RunUnionRoom(u8 taskId) CreateTask_StartActivity(); } break; - case 42: + case UR_STATE_INTERACT_WITH_ATTENDANT: if (GetHostRFUtgtGname()->species == SPECIES_NONE) { - data->state = 43; + uroom->state = UR_STATE_REGISTER_PROMPT; } else { @@ -2880,188 +3008,196 @@ static void Task_RunUnionRoom(u8 taskId) ConvertIntToDecimalStringN(gStringVar2, GetHostRFUtgtGname()->level, STR_CONV_MODE_LEFT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, sText_CancelRegistrationOfMon); } - ScheduleFieldMessageWithFollowupState(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 = ListMenuHandler_AllItemsAvailable(&data->textState, &data->tradeBoardSelectWindowId, &data->tradeBoardDetailsWindowId, &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; - HandleCancelTrade(TRUE); + uroom->state = UR_STATE_MAIN; + HandleCancelActivity(TRUE); } else { - switch (var5) + switch (input) { case 1: // REGISTER - ScheduleFieldMessageWithFollowupState(53, sText_WhichMonWillYouOffer); + ScheduleFieldMessageWithFollowupState(UR_STATE_REGISTER_SELECT_MON_FADE, sText_WhichMonWillYouOffer); break; case 2: // INFO - ScheduleFieldMessageWithFollowupState(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 = ListMenuHandler_AllItemsAvailable(&data->textState, &data->tradeBoardSelectWindowId, &data->tradeBoardDetailsWindowId, &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); 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: + case UR_STATE_REGISTER_COMPLETE: SetTradeBoardRegisteredMonInfo(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel); ScheduleFieldMessageAndExit(sText_RegistraionCompleted); break; - case 44: - switch (UnionRoomHandleYesNo(&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: - HandleCancelTrade(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)) { SetTradeBoardRegisteredMonInfo(TYPE_NORMAL, SPECIES_NONE, 0); ResetUnionRoomTrade(&sUnionRoomTrade); - HandleCancelTrade(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: + case UR_STATE_TRADING_BOARD_LOAD: UR_ClearBg0(); - data->state = 48; + uroom->state = UR_STATE_TRADING_BOARD_HANDLE_INPUT; break; - case 48: - var5 = TradeBoardMenuHandler(&data->textState, &data->tradeBoardSelectWindowId, &data->field_4A, &data->tradeBoardDetailsWindowId, &gUnknown_082F034C, &sTradeBoardListMenuTemplate, 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: - HandleCancelTrade(TRUE); - data->state = 4; + case 8: // EXIT + HandleCancelActivity(TRUE); + uroom->state = UR_STATE_MAIN; break; default: UR_ClearBg0(); - switch (IsRequestedTypeOrEggInPlayerParty(data->field_0->arr[var5].gname_uname.gname.type, data->field_0->arr[var5].gname_uname.gname.species)) + switch (IsRequestedTypeOrEggInPlayerParty(uroom->field_0->arr[input].gname_uname.gname.type, uroom->field_0->arr[input].gname_uname.gname.species)) { case UR_TRADE_MATCH: - IntlConvPartnerUname7(gStringVar1, &data->field_0->arr[var5]); - ScheduleFieldMessageWithFollowupState(49, sText_AskTrainerToMakeTrade); - taskData[1] = var5; + IntlConvPartnerUname7(gStringVar1, &uroom->field_0->arr[input]); + ScheduleFieldMessageWithFollowupState(UR_STATE_TRADE_PROMPT, sText_AskTrainerToMakeTrade); + taskData[1] = input; break; case UR_TRADE_NOTYPE: - IntlConvPartnerUname7(gStringVar1, &data->field_0->arr[var5]); - StringCopy(gStringVar2, gTypeNames[data->field_0->arr[var5].gname_uname.gname.type]); - ScheduleFieldMessageWithFollowupState(46, sText_DontHaveTypeTrainerWants); + 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 UR_TRADE_NOEGG: - IntlConvPartnerUname7(gStringVar1, &data->field_0->arr[var5]); - StringCopy(gStringVar2, gTypeNames[data->field_0->arr[var5].gname_uname.gname.type]); - ScheduleFieldMessageWithFollowupState(46, sText_DontHaveEggTrainerWants); + 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 (UnionRoomHandleYesNo(&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: - HandleCancelTrade(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(&gPartnerTgtGnameSub, &data->field_0->arr[taskData[1]].gname_uname.gname.unk_00, sizeof(gPartnerTgtGnameSub)); - gUnionRoomRequestedMonType = data->field_0->arr[taskData[1]].gname_uname.gname.type; - gUnionRoomOfferedSpecies = data->field_0->arr[taskData[1]].gname_uname.gname.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: + case UR_STATE_TRADE_OFFER_MON: gPlayerCurrActivity = ACTIVITY_TRADE | IN_UNION_ROOM; - sub_8012188(data->field_0->arr[taskData[1]].gname_uname.playerName, &data->field_0->arr[taskData[1]].gname_uname.gname, 0x44); - IntlConvPartnerUname7(gStringVar1, &data->field_0->arr[taskData[1]]); + 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]); - data->state = 25; + 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)) { - HandleCancelTrade(TRUE); - UpdateUnionRoomMemberFacing(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; } static void ReceiveUnionRoomActivityPacket(struct WirelessLink_URoom *data) @@ -3077,24 +3213,24 @@ static void ReceiveUnionRoomActivityPacket(struct WirelessLink_URoom *data) } } -static bool32 UnionRoom_HandleContactFromOtherPlayer(struct WirelessLink_URoom *data) +static bool32 UnionRoom_HandleContactFromOtherPlayer(struct WirelessLink_URoom *uroom) { - if (data->recvActivityRequest[0] != 0) + if (uroom->recvActivityRequest[0] != 0) { - s32 var = GetChatLeaderActionRequestMessage(gStringVar4, gLinkPlayers[1].gender, &data->recvActivityRequest[0], data); - 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 { - data->state = 35; - gPlayerCurrActivity = data->recvActivityRequest[0]; + uroom->state = UR_STATE_RECV_ACTIVITY_REQUEST; + gPlayerCurrActivity = uroom->recvActivityRequest[0]; return FALSE; } - else if (var == 2) + else if (id == 2) // No activity { - data->state = 36; + uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG; sub_800AC34(); return FALSE; } @@ -3114,7 +3250,7 @@ void InitUnionRoom(void) sURoom = sWirelessLinkMain.uRoom; data->state = 0; data->textState = 0; - data->field_10 = 0; + data->unknown = 0; data->field_12 = 0; sUnionRoomPlayerName[0] = EOS; } @@ -3147,7 +3283,7 @@ static void Task_InitUnionRoom(u8 taskId) ClearUnkStruct_x20Array(data->field_0->arr, 8); data->field_8 = AllocZeroed(sizeof(struct UnkStruct_x20)); ClearUnkStruct_x20Array(&data->field_8->arr[0], 1); - data->field_20 = CreateTask_SearchForChildOrParent(data->field_C, data->field_4, 10); + data->searchTaskId = CreateTask_SearchForChildOrParent(data->field_C, data->field_4, 10); data->state = 3; break; case 3: @@ -3180,7 +3316,7 @@ static void Task_InitUnionRoom(u8 taskId) free(data->field_0); free(data->field_C); free(data->field_4); - DestroyTask(data->field_20); + DestroyTask(data->searchTaskId); free(sWirelessLinkMain.uRoom); LinkRfu_Shutdown(); DestroyTask(taskId); @@ -3214,7 +3350,7 @@ static u8 HandlePlayerListUpdate(void) if (AreGnameUnameDifferent(&data->field_C->arr[i].gname_uname, &sWirelessGnameUnamePair_Dummy) == TRUE) { data->field_8->arr[0].gname_uname = data->field_C->arr[i].gname_uname; - data->field_8->arr[0].field_18 = 0; + 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; @@ -3232,7 +3368,7 @@ static u8 HandlePlayerListUpdate(void) if (AreUnionRoomPlayerGnamesDifferent(&data->field_0->arr[j].gname_uname, &data->field_4->arr[i].gname_uname)) { data->field_0->arr[j].gname_uname = data->field_4->arr[i].gname_uname; - data->field_0->arr[j].field_1B = 0x40; + data->field_0->arr[j].field_1B = 64; r7 = 1; } else if (data->field_0->arr[j].field_1B != 0) @@ -3248,12 +3384,12 @@ static u8 HandlePlayerListUpdate(void) data->field_0->arr[j].field_1B = 0; r7 = 2; } - data->field_0->arr[j].field_18 = 0; + data->field_0->arr[j].timeoutCounter = 0; } else if (data->field_0->arr[j].groupScheduledAnim != UNION_ROOM_SPAWN_OUT) { - data->field_0->arr[j].field_18++; - if (data->field_0->arr[j].field_18 >= 600) + data->field_0->arr[j].timeoutCounter++; + if (data->field_0->arr[j].timeoutCounter >= 600) { data->field_0->arr[j].groupScheduledAnim = UNION_ROOM_SPAWN_OUT; r7 = 2; @@ -3261,8 +3397,8 @@ static u8 HandlePlayerListUpdate(void) } else if (data->field_0->arr[j].groupScheduledAnim == UNION_ROOM_SPAWN_OUT) { - data->field_0->arr[j].field_18++; - if (data->field_0->arr[j].field_18 >= 900) + data->field_0->arr[j].timeoutCounter++; + if (data->field_0->arr[j].timeoutCounter >= 900) { ClearUnkStruct_x20Array(&data->field_0->arr[j], 1); } @@ -3271,7 +3407,7 @@ static u8 HandlePlayerListUpdate(void) } for (i = 0; i < RFU_CHILD_MAX; i++) { - if (Appendx1Ctox20(&data->field_0->arr[0], &data->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; } @@ -3445,7 +3581,7 @@ static bool8 PrintOnTextbox(u8 *textState, const u8 *str) static s8 UnionRoomHandleYesNo(u8 *state, bool32 noDraw) { - s8 r1; + s8 input; switch (*state) { @@ -3464,11 +3600,11 @@ static s8 UnionRoomHandleYesNo(u8 *state, bool32 noDraw) *state = 0; return -3; } - r1 = Menu_ProcessInputNoWrapClearOnChoose(); - if (r1 == -1 || r1 == 0 || r1 == 1) + input = Menu_ProcessInputNoWrapClearOnChoose(); + if (input == -1 || input == 0 || input == 1) { *state = 0; - return r1; + return input; } break; } @@ -3519,7 +3655,7 @@ static s32 ListMenuHandler_AllItemsAvailable(u8 *state, u8 *windowId, u8 *listMe break; case 1: input = ListMenu_ProcessInput(*listMenuId); - if (({gMain.newKeys & A_BUTTON;})) + if (JOY_NEW(A_BUTTON)) { DestroyListMenuTask(*listMenuId, NULL, NULL); ClearStdWindowAndFrame(*windowId, TRUE); @@ -3527,7 +3663,7 @@ static s32 ListMenuHandler_AllItemsAvailable(u8 *state, u8 *windowId, u8 *listMe *state = 0; return input; } - else if (({gMain.newKeys & B_BUTTON;})) + else if (JOY_NEW(B_BUTTON)) { DestroyListMenuTask(*listMenuId, NULL, NULL); ClearStdWindowAndFrame(*windowId, TRUE); @@ -3549,7 +3685,7 @@ static s32 TradeBoardMenuHandler(u8 *state, u8 *windowId, u8 *listMenuId, u8 *tr switch (*state) { case 0: - *tradeBoardWindowId = CreateTradeBoardWindow(&gUnknown_082F0344); + *tradeBoardWindowId = CreateTradeBoardWindow(&sWindowTemplate_TradingBoard); *windowId = AddWindow(winTemplate); DrawStdWindowFrame(*windowId, FALSE); gMultiuseListMenuTemplate = *menuTemplate; @@ -3562,11 +3698,10 @@ static s32 TradeBoardMenuHandler(u8 *state, u8 *windowId, u8 *listMenuId, u8 *tr (*state)++; break; case 2: - // Register swap r1 <---> r2 input = ListMenu_ProcessInput(*listMenuId); - if (({gMain.newKeys & (A_BUTTON | B_BUTTON);})) + if (JOY_NEW(A_BUTTON | B_BUTTON)) { - if (input == 8 || ({gMain.newKeys & B_BUTTON;})) + if (input == 8 || JOY_NEW(B_BUTTON)) { DestroyListMenuTask(*listMenuId, NULL, NULL); RemoveWindow(*windowId); @@ -3685,9 +3820,9 @@ static void ClearUnkStruct_x20Array(struct UnkStruct_x20 *arr, u8 count) for (i = 0; i < count; i++) { arr[i].gname_uname = sWirelessGnameUnamePair_Dummy; - arr[i].field_18 = 0xFF; + arr[i].timeoutCounter = 255; arr[i].groupScheduledAnim = UNION_ROOM_SPAWN_NONE; - arr[i].field_1A_1 = 0; + arr[i].useRedText = FALSE; arr[i].field_1B = 0; } } @@ -3778,18 +3913,18 @@ static u32 Findx20Inx1CArray(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *a return result; } -static u8 Appendx1Ctox20(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->active) { - for (i = 0; i < arg2; i++) + for (i = 0; i < max; i++) { if (arg0[i].groupScheduledAnim == UNION_ROOM_SPAWN_NONE) { arg0[i].gname_uname = arg1->gname_uname; - arg0[i].field_18 = 0; + arg0[i].timeoutCounter = 0; arg0[i].groupScheduledAnim = UNION_ROOM_SPAWN_IN; arg0[i].field_1B = 64; arg1->active = FALSE; @@ -3837,18 +3972,18 @@ static void PrintGroupMemberCandidateOnWindowWithColor(u8 windowId, u8 x, u8 y, } } -static bool32 PlayerIsTalkingToUnionRoomAide(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; @@ -4127,7 +4262,7 @@ static s32 GetChatLeaderActionRequestMessage(u8 *dst, u32 gender, u16 *activityD StringExpandPlaceholders(dst, sText_ShowTrainerCard); result = 1; break; - case IN_UNION_ROOM: + case ACTIVITY_NONE | IN_UNION_ROOM: StringExpandPlaceholders(dst, sText_ChatDropped); result = 2; break; @@ -4183,7 +4318,7 @@ static bool32 HasAtLeastTwoMonsOfLevel30OrLower(void) static void ResetUnionRoomTrade(struct UnionRoomTrade *uroomTrade) { - uroomTrade->field_0 = 0; + uroomTrade->state = URTRADE_STATE_NONE; uroomTrade->type = 0; uroomTrade->playerPersonality = 0; uroomTrade->playerSpecies = 0; @@ -4257,16 +4392,16 @@ static u32 GetPartyPositionOfRegisteredMon(struct UnionRoomTrade *trade, u8 mult return response; } -static void HandleCancelTrade(bool32 unlockObjs) +static void HandleCancelActivity(bool32 setData) { UR_ClearBg0(); ScriptContext2_Disable(); UnionRoom_UnlockPlayerAndChatPartner(); - gPlayerCurrActivity = 0; - if (unlockObjs) + gPlayerCurrActivity = ACTIVITY_NONE; + if (setData) { SetTradeBoardRegisteredMonInfo(sUnionRoomTrade.type, sUnionRoomTrade.playerSpecies, sUnionRoomTrade.playerLevel); - UpdateGameDataWithActivitySpriteGendersFlag(IN_UNION_ROOM, 0, 0); + UpdateGameData_SetActivity(ACTIVITY_NONE | IN_UNION_ROOM, 0, FALSE); } } @@ -4302,62 +4437,62 @@ static void ViewURoomPartnerTrainerCard(u8 *unused, struct WirelessLink_URoom *d DynamicPlaceholderTextUtil_Reset(); - StringCopy(data->field_C0[0], gTrainerClassNames[GetUnionRoomTrainerClass()]); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, data->field_C0[0]); + StringCopy(data->trainerCardStrBuffer[0], gTrainerClassNames[GetUnionRoomTrainerClass()]); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, data->trainerCardStrBuffer[0]); DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, trainerCard->playerName); - StringCopy(data->field_174, sCardColorTexts[trainerCard->stars]); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, data->field_174); + StringCopy(data->trainerCardColorStrBuffer, sCardColorTexts[trainerCard->stars]); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, data->trainerCardColorStrBuffer); - ConvertIntToDecimalStringN(data->field_C0[2], trainerCard->caughtMonsCount, STR_CONV_MODE_LEFT_ALIGN, 3); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, data->field_C0[2]); + ConvertIntToDecimalStringN(data->trainerCardStrBuffer[2], trainerCard->caughtMonsCount, STR_CONV_MODE_LEFT_ALIGN, 3); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, data->trainerCardStrBuffer[2]); - ConvertIntToDecimalStringN(data->field_C0[3], trainerCard->playTimeHours, STR_CONV_MODE_LEFT_ALIGN, 3); - ConvertIntToDecimalStringN(data->field_C0[4], trainerCard->playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, data->field_C0[3]); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(5, data->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(data->field_1A4, sText_TrainerCardInfoPage1); - StringCopy(gStringVar4, data->field_1A4); + DynamicPlaceholderTextUtil_ExpandPlaceholders(data->trainerCardMsgStrBuffer, sText_TrainerCardInfoPage1); + StringCopy(gStringVar4, data->trainerCardMsgStrBuffer); n = trainerCard->linkBattleWins; if (n > 9999) { n = 9999; } - ConvertIntToDecimalStringN(data->field_C0[0], n, STR_CONV_MODE_LEFT_ALIGN, 4); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, data->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(data->field_C0[1], n, STR_CONV_MODE_LEFT_ALIGN, 4); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, data->field_C0[1]); + ConvertIntToDecimalStringN(data->trainerCardStrBuffer[1], n, STR_CONV_MODE_LEFT_ALIGN, 4); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, data->trainerCardStrBuffer[1]); - ConvertIntToDecimalStringN(data->field_C0[2], trainerCard->pokemonTrades, STR_CONV_MODE_LEFT_ALIGN, 5); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, data->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(data->field_C0[i + 3], trainerCard->easyChatProfile[i]); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(i + 4, data->field_C0[i + 3]); + CopyEasyChatWord(data->trainerCardStrBuffer[i + 3], trainerCard->easyChatProfile[i]); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(i + 4, data->trainerCardStrBuffer[i + 3]); } - DynamicPlaceholderTextUtil_ExpandPlaceholders(data->field_1A4, sText_TrainerCardInfoPage2); - StringAppend(gStringVar4, data->field_1A4); + DynamicPlaceholderTextUtil_ExpandPlaceholders(data->trainerCardMsgStrBuffer, sText_TrainerCardInfoPage2); + StringAppend(gStringVar4, data->trainerCardMsgStrBuffer); if (isParent == TRUE) { - DynamicPlaceholderTextUtil_ExpandPlaceholders(data->field_1A4, sText_FinishedCheckingPlayersTrainerCard); - StringAppend(gStringVar4, data->field_1A4); + DynamicPlaceholderTextUtil_ExpandPlaceholders(data->trainerCardMsgStrBuffer, sText_FinishedCheckingPlayersTrainerCard); + StringAppend(gStringVar4, data->trainerCardMsgStrBuffer); } else if (isParent == FALSE) { - DynamicPlaceholderTextUtil_ExpandPlaceholders(data->field_1A4, sGladToMeetYouTexts[trainerCard->gender]); - StringAppend(gStringVar4, data->field_1A4); + DynamicPlaceholderTextUtil_ExpandPlaceholders(data->trainerCardMsgStrBuffer, sGladToMeetYouTexts[trainerCard->gender]); + StringAppend(gStringVar4, data->trainerCardMsgStrBuffer); } } diff --git a/src/union_room_player_avatar.c b/src/union_room_player_avatar.c index 0e62a2740..cac789685 100644 --- a/src/union_room_player_avatar.c +++ b/src/union_room_player_avatar.c @@ -78,7 +78,7 @@ static const u8 sNextFacingDirection[] = { [DIR_EAST] = DIR_NORTH }; -// Local id 1 is the Nurse/Aide +// 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[] = { @@ -102,9 +102,9 @@ static const u8 sMovement_UnionPlayerEnter[2] = { 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; @@ -251,7 +251,7 @@ static bool32 AnimateUnionRoomPlayerSpawn(s8 * state, u32 playerIdx, struct Unio switch (*state) { case 0: - if (!is_walking_or_running()) + if (!IsPlayerStandingStill()) { break; } @@ -567,12 +567,12 @@ void HandleUnionRoomPlayerRefresh(struct WirelessLink_URoom *uroom) } } -bool32 TrySetUnionRoomMemberFacePlayer(struct UnkStruct_Main0 *main0, s16 *directionPtr, s16 *playerIdxPtr, u8 *spriteIds) +bool32 TryInteractWithUnionRoomMember(struct UnkStruct_Main0 *main0, s16 *directionPtr, s16 *playerIdxPtr, u8 *spriteIds) { s16 x, y; s32 i, direction; struct UnkStruct_x20 * r4; - if (!is_walking_or_running()) + if (!IsPlayerStandingStill()) { return FALSE; } @@ -602,6 +602,7 @@ bool32 TrySetUnionRoomMemberFacePlayer(struct UnkStruct_Main0 *main0, s16 *direc { continue; } + // Face player SetUnionRoomObjectFacingDirection(direction, i, sOppositeFacingDirection[GetPlayerFacingDirection()]); *directionPtr = direction; *playerIdxPtr = i; -- cgit v1.2.3 From 4c8fd5af7c6343e4df565b94dd80d96ca1f8102b Mon Sep 17 00:00:00 2001 From: GriffinR Date: Mon, 15 Jun 2020 13:00:24 -0400 Subject: Move Pokemon cries to own directory --- Makefile | 7 +- sound/direct_sound_data.inc | 776 ++++++++++++------------ sound/direct_sound_samples/cries/abra.aif | Bin 0 -> 11660 bytes sound/direct_sound_samples/cries/absol.aif | Bin 0 -> 5256 bytes sound/direct_sound_samples/cries/aerodactyl.aif | Bin 0 -> 12142 bytes sound/direct_sound_samples/cries/aggron.aif | Bin 0 -> 12776 bytes sound/direct_sound_samples/cries/aipom.aif | Bin 0 -> 7058 bytes sound/direct_sound_samples/cries/alakazam.aif | Bin 0 -> 15740 bytes sound/direct_sound_samples/cries/altaria.aif | Bin 0 -> 5564 bytes sound/direct_sound_samples/cries/ampharos.aif | Bin 0 -> 8242 bytes sound/direct_sound_samples/cries/anorith.aif | Bin 0 -> 5862 bytes sound/direct_sound_samples/cries/arbok.aif | Bin 0 -> 9648 bytes sound/direct_sound_samples/cries/arcanine.aif | Bin 0 -> 8602 bytes sound/direct_sound_samples/cries/ariados.aif | Bin 0 -> 6170 bytes sound/direct_sound_samples/cries/armaldo.aif | Bin 0 -> 11380 bytes sound/direct_sound_samples/cries/aron.aif | Bin 0 -> 4600 bytes sound/direct_sound_samples/cries/articuno.aif | Bin 0 -> 11792 bytes sound/direct_sound_samples/cries/azumarill.aif | Bin 0 -> 8452 bytes sound/direct_sound_samples/cries/azurill.aif | Bin 0 -> 5212 bytes sound/direct_sound_samples/cries/bagon.aif | Bin 0 -> 3934 bytes sound/direct_sound_samples/cries/baltoy.aif | Bin 0 -> 6264 bytes sound/direct_sound_samples/cries/banette.aif | Bin 0 -> 6334 bytes sound/direct_sound_samples/cries/barboach.aif | Bin 0 -> 4632 bytes sound/direct_sound_samples/cries/bayleef.aif | Bin 0 -> 4414 bytes sound/direct_sound_samples/cries/beautifly.aif | Bin 0 -> 4128 bytes sound/direct_sound_samples/cries/beedrill.aif | Bin 0 -> 9656 bytes sound/direct_sound_samples/cries/beldum.aif | Bin 0 -> 4828 bytes sound/direct_sound_samples/cries/bellossom.aif | Bin 0 -> 7042 bytes sound/direct_sound_samples/cries/bellsprout.aif | Bin 0 -> 3792 bytes sound/direct_sound_samples/cries/blastoise.aif | Bin 0 -> 9622 bytes sound/direct_sound_samples/cries/blaziken.aif | Bin 0 -> 15690 bytes sound/direct_sound_samples/cries/blissey.aif | Bin 0 -> 8278 bytes sound/direct_sound_samples/cries/breloom.aif | Bin 0 -> 6376 bytes sound/direct_sound_samples/cries/bulbasaur.aif | Bin 0 -> 8266 bytes sound/direct_sound_samples/cries/butterfree.aif | Bin 0 -> 5026 bytes sound/direct_sound_samples/cries/cacnea.aif | Bin 0 -> 4488 bytes sound/direct_sound_samples/cries/cacturne.aif | Bin 0 -> 11310 bytes sound/direct_sound_samples/cries/camerupt.aif | Bin 0 -> 11526 bytes sound/direct_sound_samples/cries/carvanha.aif | Bin 0 -> 5048 bytes sound/direct_sound_samples/cries/cascoon.aif | Bin 0 -> 8126 bytes sound/direct_sound_samples/cries/castform.aif | Bin 0 -> 6302 bytes sound/direct_sound_samples/cries/caterpie.aif | Bin 0 -> 4192 bytes sound/direct_sound_samples/cries/celebi.aif | Bin 0 -> 7230 bytes sound/direct_sound_samples/cries/chansey.aif | Bin 0 -> 7390 bytes sound/direct_sound_samples/cries/charizard.aif | Bin 0 -> 9622 bytes sound/direct_sound_samples/cries/charmander.aif | Bin 0 -> 7216 bytes sound/direct_sound_samples/cries/charmeleon.aif | Bin 0 -> 7248 bytes sound/direct_sound_samples/cries/chikorita.aif | Bin 0 -> 2654 bytes sound/direct_sound_samples/cries/chimecho.aif | Bin 0 -> 5040 bytes sound/direct_sound_samples/cries/chinchou.aif | Bin 0 -> 6346 bytes sound/direct_sound_samples/cries/clamperl.aif | Bin 0 -> 9142 bytes sound/direct_sound_samples/cries/claydol.aif | Bin 0 -> 9668 bytes sound/direct_sound_samples/cries/clefable.aif | Bin 0 -> 5294 bytes sound/direct_sound_samples/cries/clefairy.aif | Bin 0 -> 4234 bytes sound/direct_sound_samples/cries/cleffa.aif | Bin 0 -> 2992 bytes sound/direct_sound_samples/cries/cloyster.aif | Bin 0 -> 10354 bytes sound/direct_sound_samples/cries/combusken.aif | Bin 0 -> 14360 bytes sound/direct_sound_samples/cries/corphish.aif | Bin 0 -> 6010 bytes sound/direct_sound_samples/cries/corsola.aif | Bin 0 -> 6440 bytes sound/direct_sound_samples/cries/cradily.aif | Bin 0 -> 14542 bytes sound/direct_sound_samples/cries/crawdaunt.aif | Bin 0 -> 12316 bytes sound/direct_sound_samples/cries/crobat.aif | Bin 0 -> 11562 bytes sound/direct_sound_samples/cries/croconaw.aif | Bin 0 -> 10096 bytes sound/direct_sound_samples/cries/cubone.aif | Bin 0 -> 7558 bytes sound/direct_sound_samples/cries/cyndaquil.aif | Bin 0 -> 3528 bytes sound/direct_sound_samples/cries/delcatty.aif | Bin 0 -> 10518 bytes sound/direct_sound_samples/cries/delibird.aif | Bin 0 -> 8094 bytes sound/direct_sound_samples/cries/deoxys.aif | Bin 0 -> 10388 bytes sound/direct_sound_samples/cries/dewgong.aif | Bin 0 -> 10546 bytes sound/direct_sound_samples/cries/diglett.aif | Bin 0 -> 9698 bytes sound/direct_sound_samples/cries/ditto.aif | Bin 0 -> 5566 bytes sound/direct_sound_samples/cries/dodrio.aif | Bin 0 -> 9712 bytes sound/direct_sound_samples/cries/doduo.aif | Bin 0 -> 9616 bytes sound/direct_sound_samples/cries/donphan.aif | Bin 0 -> 8554 bytes sound/direct_sound_samples/cries/dragonair.aif | Bin 0 -> 8318 bytes sound/direct_sound_samples/cries/dragonite.aif | Bin 0 -> 9502 bytes sound/direct_sound_samples/cries/dratini.aif | Bin 0 -> 5812 bytes sound/direct_sound_samples/cries/drowzee.aif | Bin 0 -> 14494 bytes sound/direct_sound_samples/cries/dugtrio.aif | Bin 0 -> 9686 bytes sound/direct_sound_samples/cries/dunsparce.aif | Bin 0 -> 7926 bytes sound/direct_sound_samples/cries/dusclops.aif | Bin 0 -> 6858 bytes sound/direct_sound_samples/cries/duskull.aif | Bin 0 -> 5310 bytes sound/direct_sound_samples/cries/dustox.aif | Bin 0 -> 6338 bytes sound/direct_sound_samples/cries/eevee.aif | Bin 0 -> 7104 bytes sound/direct_sound_samples/cries/ekans.aif | Bin 0 -> 9626 bytes sound/direct_sound_samples/cries/electabuzz.aif | Bin 0 -> 15380 bytes sound/direct_sound_samples/cries/electrike.aif | Bin 0 -> 6186 bytes sound/direct_sound_samples/cries/electrode.aif | Bin 0 -> 12564 bytes sound/direct_sound_samples/cries/elekid.aif | Bin 0 -> 5284 bytes sound/direct_sound_samples/cries/entei.aif | Bin 0 -> 10198 bytes sound/direct_sound_samples/cries/espeon.aif | Bin 0 -> 9828 bytes sound/direct_sound_samples/cries/exeggcute.aif | Bin 0 -> 9416 bytes sound/direct_sound_samples/cries/exeggutor.aif | Bin 0 -> 15880 bytes sound/direct_sound_samples/cries/exploud.aif | Bin 0 -> 14086 bytes sound/direct_sound_samples/cries/farfetchd.aif | Bin 0 -> 3766 bytes sound/direct_sound_samples/cries/fearow.aif | Bin 0 -> 8602 bytes sound/direct_sound_samples/cries/feebas.aif | Bin 0 -> 3932 bytes sound/direct_sound_samples/cries/feraligatr.aif | Bin 0 -> 12712 bytes sound/direct_sound_samples/cries/flaaffy.aif | Bin 0 -> 6854 bytes sound/direct_sound_samples/cries/flareon.aif | Bin 0 -> 7748 bytes sound/direct_sound_samples/cries/flygon.aif | Bin 0 -> 12974 bytes sound/direct_sound_samples/cries/forretress.aif | Bin 0 -> 9990 bytes sound/direct_sound_samples/cries/furret.aif | Bin 0 -> 3168 bytes sound/direct_sound_samples/cries/gardevoir.aif | Bin 0 -> 12154 bytes sound/direct_sound_samples/cries/gastly.aif | Bin 0 -> 11620 bytes sound/direct_sound_samples/cries/gengar.aif | Bin 0 -> 7372 bytes sound/direct_sound_samples/cries/geodude.aif | Bin 0 -> 11816 bytes sound/direct_sound_samples/cries/girafarig.aif | Bin 0 -> 7346 bytes sound/direct_sound_samples/cries/glalie.aif | Bin 0 -> 10420 bytes sound/direct_sound_samples/cries/gligar.aif | Bin 0 -> 6068 bytes sound/direct_sound_samples/cries/gloom.aif | Bin 0 -> 6246 bytes sound/direct_sound_samples/cries/golbat.aif | Bin 0 -> 9674 bytes sound/direct_sound_samples/cries/goldeen.aif | Bin 0 -> 4936 bytes sound/direct_sound_samples/cries/golduck.aif | Bin 0 -> 5646 bytes sound/direct_sound_samples/cries/golem.aif | Bin 0 -> 7080 bytes sound/direct_sound_samples/cries/gorebyss.aif | Bin 0 -> 11176 bytes sound/direct_sound_samples/cries/granbull.aif | Bin 0 -> 11782 bytes sound/direct_sound_samples/cries/graveler.aif | Bin 0 -> 13900 bytes sound/direct_sound_samples/cries/grimer.aif | Bin 0 -> 5274 bytes sound/direct_sound_samples/cries/groudon.aif | Bin 0 -> 18438 bytes sound/direct_sound_samples/cries/grovyle.aif | Bin 0 -> 10198 bytes sound/direct_sound_samples/cries/growlithe.aif | Bin 0 -> 6696 bytes sound/direct_sound_samples/cries/grumpig.aif | Bin 0 -> 6318 bytes sound/direct_sound_samples/cries/gulpin.aif | Bin 0 -> 4028 bytes sound/direct_sound_samples/cries/gyarados.aif | Bin 0 -> 10078 bytes sound/direct_sound_samples/cries/hariyama.aif | Bin 0 -> 8348 bytes sound/direct_sound_samples/cries/haunter.aif | Bin 0 -> 11714 bytes sound/direct_sound_samples/cries/heracross.aif | Bin 0 -> 9144 bytes sound/direct_sound_samples/cries/hitmonchan.aif | Bin 0 -> 8906 bytes sound/direct_sound_samples/cries/hitmonlee.aif | Bin 0 -> 9318 bytes sound/direct_sound_samples/cries/hitmontop.aif | Bin 0 -> 6936 bytes sound/direct_sound_samples/cries/ho_oh.aif | Bin 0 -> 11260 bytes sound/direct_sound_samples/cries/hoothoot.aif | Bin 0 -> 5458 bytes sound/direct_sound_samples/cries/hoppip.aif | Bin 0 -> 4226 bytes sound/direct_sound_samples/cries/horsea.aif | Bin 0 -> 4754 bytes sound/direct_sound_samples/cries/houndoom.aif | Bin 0 -> 9820 bytes sound/direct_sound_samples/cries/houndour.aif | Bin 0 -> 6332 bytes sound/direct_sound_samples/cries/huntail.aif | Bin 0 -> 7944 bytes sound/direct_sound_samples/cries/hypno.aif | Bin 0 -> 14450 bytes sound/direct_sound_samples/cries/igglybuff.aif | Bin 0 -> 3518 bytes sound/direct_sound_samples/cries/illumise.aif | Bin 0 -> 8536 bytes sound/direct_sound_samples/cries/ivysaur.aif | Bin 0 -> 8270 bytes sound/direct_sound_samples/cries/jigglypuff.aif | Bin 0 -> 2720 bytes sound/direct_sound_samples/cries/jirachi.aif | Bin 0 -> 6758 bytes sound/direct_sound_samples/cries/jolteon.aif | Bin 0 -> 7904 bytes sound/direct_sound_samples/cries/jumpluff.aif | Bin 0 -> 8106 bytes sound/direct_sound_samples/cries/jynx.aif | Bin 0 -> 23606 bytes sound/direct_sound_samples/cries/kabuto.aif | Bin 0 -> 6170 bytes sound/direct_sound_samples/cries/kabutops.aif | Bin 0 -> 6867 bytes sound/direct_sound_samples/cries/kadabra.aif | Bin 0 -> 13408 bytes sound/direct_sound_samples/cries/kakuna.aif | Bin 0 -> 9104 bytes sound/direct_sound_samples/cries/kangaskhan.aif | Bin 0 -> 9334 bytes sound/direct_sound_samples/cries/kecleon.aif | Bin 0 -> 4202 bytes sound/direct_sound_samples/cries/kingdra.aif | Bin 0 -> 6922 bytes sound/direct_sound_samples/cries/kingler.aif | Bin 0 -> 12132 bytes sound/direct_sound_samples/cries/kirlia.aif | Bin 0 -> 6100 bytes sound/direct_sound_samples/cries/koffing.aif | Bin 0 -> 10154 bytes sound/direct_sound_samples/cries/krabby.aif | Bin 0 -> 12112 bytes sound/direct_sound_samples/cries/kyogre.aif | Bin 0 -> 17782 bytes sound/direct_sound_samples/cries/lairon.aif | Bin 0 -> 10392 bytes sound/direct_sound_samples/cries/lanturn.aif | Bin 0 -> 5282 bytes sound/direct_sound_samples/cries/lapras.aif | Bin 0 -> 7408 bytes sound/direct_sound_samples/cries/larvitar.aif | Bin 0 -> 6350 bytes sound/direct_sound_samples/cries/latias.aif | Bin 0 -> 6098 bytes sound/direct_sound_samples/cries/latios.aif | Bin 0 -> 10958 bytes sound/direct_sound_samples/cries/ledian.aif | Bin 0 -> 4214 bytes sound/direct_sound_samples/cries/ledyba.aif | Bin 0 -> 3506 bytes sound/direct_sound_samples/cries/lickitung.aif | Bin 0 -> 7571 bytes sound/direct_sound_samples/cries/lileep.aif | Bin 0 -> 4838 bytes sound/direct_sound_samples/cries/linoone.aif | Bin 0 -> 15248 bytes sound/direct_sound_samples/cries/lombre.aif | Bin 0 -> 7282 bytes sound/direct_sound_samples/cries/lotad.aif | Bin 0 -> 2232 bytes sound/direct_sound_samples/cries/loudred.aif | Bin 0 -> 6582 bytes sound/direct_sound_samples/cries/ludicolo.aif | Bin 0 -> 8398 bytes sound/direct_sound_samples/cries/lugia.aif | Bin 0 -> 18900 bytes sound/direct_sound_samples/cries/lunatone.aif | Bin 0 -> 11956 bytes sound/direct_sound_samples/cries/luvdisc.aif | Bin 0 -> 2456 bytes sound/direct_sound_samples/cries/machamp.aif | Bin 0 -> 8256 bytes sound/direct_sound_samples/cries/machoke.aif | Bin 0 -> 6782 bytes sound/direct_sound_samples/cries/machop.aif | Bin 0 -> 6696 bytes sound/direct_sound_samples/cries/magby.aif | Bin 0 -> 7218 bytes sound/direct_sound_samples/cries/magcargo.aif | Bin 0 -> 10486 bytes sound/direct_sound_samples/cries/magikarp.aif | Bin 0 -> 9492 bytes sound/direct_sound_samples/cries/magmar.aif | Bin 0 -> 7738 bytes sound/direct_sound_samples/cries/magnemite.aif | Bin 0 -> 9610 bytes sound/direct_sound_samples/cries/magneton.aif | Bin 0 -> 11914 bytes sound/direct_sound_samples/cries/makuhita.aif | Bin 0 -> 3704 bytes sound/direct_sound_samples/cries/manectric.aif | Bin 0 -> 10492 bytes sound/direct_sound_samples/cries/mankey.aif | Bin 0 -> 8178 bytes sound/direct_sound_samples/cries/mantine.aif | Bin 0 -> 7884 bytes sound/direct_sound_samples/cries/mareep.aif | Bin 0 -> 3694 bytes sound/direct_sound_samples/cries/marill.aif | Bin 0 -> 6538 bytes sound/direct_sound_samples/cries/marowak.aif | Bin 0 -> 7216 bytes sound/direct_sound_samples/cries/marshtomp.aif | Bin 0 -> 8498 bytes sound/direct_sound_samples/cries/masquerain.aif | Bin 0 -> 9830 bytes sound/direct_sound_samples/cries/mawile.aif | Bin 0 -> 5756 bytes sound/direct_sound_samples/cries/medicham.aif | Bin 0 -> 8246 bytes sound/direct_sound_samples/cries/meditite.aif | Bin 0 -> 4078 bytes sound/direct_sound_samples/cries/meganium.aif | Bin 0 -> 8100 bytes sound/direct_sound_samples/cries/meowth.aif | Bin 0 -> 4796 bytes sound/direct_sound_samples/cries/metagross.aif | Bin 0 -> 19644 bytes sound/direct_sound_samples/cries/metang.aif | Bin 0 -> 9398 bytes sound/direct_sound_samples/cries/metapod.aif | Bin 0 -> 11622 bytes sound/direct_sound_samples/cries/mew.aif | Bin 0 -> 15146 bytes sound/direct_sound_samples/cries/mewtwo.aif | Bin 0 -> 15144 bytes sound/direct_sound_samples/cries/mightyena.aif | Bin 0 -> 9748 bytes sound/direct_sound_samples/cries/milotic.aif | Bin 0 -> 19542 bytes sound/direct_sound_samples/cries/miltank.aif | Bin 0 -> 7424 bytes sound/direct_sound_samples/cries/minun.aif | Bin 0 -> 8004 bytes sound/direct_sound_samples/cries/misdreavus.aif | Bin 0 -> 5816 bytes sound/direct_sound_samples/cries/moltres.aif | Bin 0 -> 11796 bytes sound/direct_sound_samples/cries/mr_mime.aif | Bin 0 -> 9446 bytes sound/direct_sound_samples/cries/mudkip.aif | Bin 0 -> 3776 bytes sound/direct_sound_samples/cries/muk.aif | Bin 0 -> 7374 bytes sound/direct_sound_samples/cries/murkrow.aif | Bin 0 -> 8370 bytes sound/direct_sound_samples/cries/natu.aif | Bin 0 -> 5294 bytes sound/direct_sound_samples/cries/nidoking.aif | Bin 0 -> 12176 bytes sound/direct_sound_samples/cries/nidoqueen.aif | Bin 0 -> 8424 bytes sound/direct_sound_samples/cries/nidoran_f.aif | Bin 0 -> 4858 bytes sound/direct_sound_samples/cries/nidoran_m.aif | Bin 0 -> 5216 bytes sound/direct_sound_samples/cries/nidorina.aif | Bin 0 -> 6394 bytes sound/direct_sound_samples/cries/nidorino.aif | Bin 0 -> 6042 bytes sound/direct_sound_samples/cries/nincada.aif | Bin 0 -> 3244 bytes sound/direct_sound_samples/cries/ninetales.aif | Bin 0 -> 12174 bytes sound/direct_sound_samples/cries/ninjask.aif | Bin 0 -> 6084 bytes sound/direct_sound_samples/cries/noctowl.aif | Bin 0 -> 10564 bytes sound/direct_sound_samples/cries/nosepass.aif | Bin 0 -> 6696 bytes sound/direct_sound_samples/cries/numel.aif | Bin 0 -> 4664 bytes sound/direct_sound_samples/cries/nuzleaf.aif | Bin 0 -> 5712 bytes sound/direct_sound_samples/cries/octillery.aif | Bin 0 -> 13084 bytes sound/direct_sound_samples/cries/oddish.aif | Bin 0 -> 7298 bytes sound/direct_sound_samples/cries/omanyte.aif | Bin 0 -> 6672 bytes sound/direct_sound_samples/cries/omastar.aif | Bin 0 -> 6666 bytes sound/direct_sound_samples/cries/onix.aif | Bin 0 -> 12340 bytes sound/direct_sound_samples/cries/paras.aif | Bin 0 -> 13924 bytes sound/direct_sound_samples/cries/parasect.aif | Bin 0 -> 15140 bytes sound/direct_sound_samples/cries/pelipper.aif | Bin 0 -> 5894 bytes sound/direct_sound_samples/cries/persian.aif | Bin 0 -> 9412 bytes sound/direct_sound_samples/cries/phanpy.aif | Bin 0 -> 5664 bytes sound/direct_sound_samples/cries/pichu.aif | Bin 0 -> 3684 bytes sound/direct_sound_samples/cries/pidgeot.aif | Bin 0 -> 8590 bytes sound/direct_sound_samples/cries/pidgeotto.aif | Bin 0 -> 7512 bytes sound/direct_sound_samples/cries/pidgey.aif | Bin 0 -> 1984 bytes sound/direct_sound_samples/cries/pikachu.aif | Bin 0 -> 8316 bytes sound/direct_sound_samples/cries/piloswine.aif | Bin 0 -> 6480 bytes sound/direct_sound_samples/cries/pineco.aif | Bin 0 -> 6690 bytes sound/direct_sound_samples/cries/pinsir.aif | Bin 0 -> 6186 bytes sound/direct_sound_samples/cries/plusle.aif | Bin 0 -> 4504 bytes sound/direct_sound_samples/cries/politoed.aif | Bin 0 -> 9114 bytes sound/direct_sound_samples/cries/poliwag.aif | Bin 0 -> 5562 bytes sound/direct_sound_samples/cries/poliwhirl.aif | Bin 0 -> 3354 bytes sound/direct_sound_samples/cries/poliwrath.aif | Bin 0 -> 5582 bytes sound/direct_sound_samples/cries/ponyta.aif | Bin 0 -> 7524 bytes sound/direct_sound_samples/cries/poochyena.aif | Bin 0 -> 4656 bytes sound/direct_sound_samples/cries/porygon.aif | Bin 0 -> 10002 bytes sound/direct_sound_samples/cries/porygon2.aif | Bin 0 -> 7854 bytes sound/direct_sound_samples/cries/primeape.aif | Bin 0 -> 8086 bytes sound/direct_sound_samples/cries/psyduck.aif | Bin 0 -> 6578 bytes sound/direct_sound_samples/cries/pupitar.aif | Bin 0 -> 4234 bytes sound/direct_sound_samples/cries/quagsire.aif | Bin 0 -> 6684 bytes sound/direct_sound_samples/cries/quilava.aif | Bin 0 -> 5962 bytes sound/direct_sound_samples/cries/qwilfish.aif | Bin 0 -> 5808 bytes sound/direct_sound_samples/cries/raichu.aif | Bin 0 -> 11842 bytes sound/direct_sound_samples/cries/raikou.aif | Bin 0 -> 8704 bytes sound/direct_sound_samples/cries/ralts.aif | Bin 0 -> 5066 bytes sound/direct_sound_samples/cries/rapidash.aif | Bin 0 -> 9292 bytes sound/direct_sound_samples/cries/raticate.aif | Bin 0 -> 4770 bytes sound/direct_sound_samples/cries/rattata.aif | Bin 0 -> 3956 bytes sound/direct_sound_samples/cries/rayquaza.aif | Bin 0 -> 14532 bytes sound/direct_sound_samples/cries/regice.aif | Bin 0 -> 15936 bytes sound/direct_sound_samples/cries/regirock.aif | Bin 0 -> 15862 bytes sound/direct_sound_samples/cries/registeel.aif | Bin 0 -> 11476 bytes sound/direct_sound_samples/cries/relicanth.aif | Bin 0 -> 10072 bytes sound/direct_sound_samples/cries/remoraid.aif | Bin 0 -> 5290 bytes sound/direct_sound_samples/cries/rhydon.aif | Bin 0 -> 10186 bytes sound/direct_sound_samples/cries/rhyhorn.aif | Bin 0 -> 9686 bytes sound/direct_sound_samples/cries/roselia.aif | Bin 0 -> 5382 bytes sound/direct_sound_samples/cries/sableye.aif | Bin 0 -> 5826 bytes sound/direct_sound_samples/cries/salamence.aif | Bin 0 -> 12514 bytes sound/direct_sound_samples/cries/sandshrew.aif | Bin 0 -> 4678 bytes sound/direct_sound_samples/cries/sandslash.aif | Bin 0 -> 6784 bytes sound/direct_sound_samples/cries/sceptile.aif | Bin 0 -> 13012 bytes sound/direct_sound_samples/cries/scizor.aif | Bin 0 -> 11462 bytes sound/direct_sound_samples/cries/scyther.aif | Bin 0 -> 6676 bytes sound/direct_sound_samples/cries/seadra.aif | Bin 0 -> 4228 bytes sound/direct_sound_samples/cries/seaking.aif | Bin 0 -> 9654 bytes sound/direct_sound_samples/cries/sealeo.aif | Bin 0 -> 5928 bytes sound/direct_sound_samples/cries/seedot.aif | Bin 0 -> 4106 bytes sound/direct_sound_samples/cries/seel.aif | Bin 0 -> 8954 bytes sound/direct_sound_samples/cries/sentret.aif | Bin 0 -> 2108 bytes sound/direct_sound_samples/cries/seviper.aif | Bin 0 -> 5820 bytes sound/direct_sound_samples/cries/sharpedo.aif | Bin 0 -> 11488 bytes sound/direct_sound_samples/cries/shedinja.aif | Bin 0 -> 3876 bytes sound/direct_sound_samples/cries/shelgon.aif | Bin 0 -> 9992 bytes sound/direct_sound_samples/cries/shellder.aif | Bin 0 -> 7718 bytes sound/direct_sound_samples/cries/shiftry.aif | Bin 0 -> 9860 bytes sound/direct_sound_samples/cries/shroomish.aif | Bin 0 -> 4436 bytes sound/direct_sound_samples/cries/shuckle.aif | Bin 0 -> 5110 bytes sound/direct_sound_samples/cries/shuppet.aif | Bin 0 -> 4144 bytes sound/direct_sound_samples/cries/silcoon.aif | Bin 0 -> 8074 bytes sound/direct_sound_samples/cries/skarmory.aif | Bin 0 -> 11982 bytes sound/direct_sound_samples/cries/skiploom.aif | Bin 0 -> 6516 bytes sound/direct_sound_samples/cries/skitty.aif | Bin 0 -> 3560 bytes sound/direct_sound_samples/cries/slaking.aif | Bin 0 -> 4970 bytes sound/direct_sound_samples/cries/slakoth.aif | Bin 0 -> 4272 bytes sound/direct_sound_samples/cries/slowbro.aif | Bin 0 -> 6720 bytes sound/direct_sound_samples/cries/slowking.aif | Bin 0 -> 11908 bytes sound/direct_sound_samples/cries/slowpoke.aif | Bin 0 -> 3724 bytes sound/direct_sound_samples/cries/slugma.aif | Bin 0 -> 8536 bytes sound/direct_sound_samples/cries/smeargle.aif | Bin 0 -> 5114 bytes sound/direct_sound_samples/cries/smoochum.aif | Bin 0 -> 5860 bytes sound/direct_sound_samples/cries/sneasel.aif | Bin 0 -> 4586 bytes sound/direct_sound_samples/cries/snorlax.aif | Bin 0 -> 2648 bytes sound/direct_sound_samples/cries/snorunt.aif | Bin 0 -> 8500 bytes sound/direct_sound_samples/cries/snubbull.aif | Bin 0 -> 7220 bytes sound/direct_sound_samples/cries/solrock.aif | Bin 0 -> 8080 bytes sound/direct_sound_samples/cries/spearow.aif | Bin 0 -> 8806 bytes sound/direct_sound_samples/cries/spheal.aif | Bin 0 -> 2880 bytes sound/direct_sound_samples/cries/spinarak.aif | Bin 0 -> 6696 bytes sound/direct_sound_samples/cries/spinda.aif | Bin 0 -> 6216 bytes sound/direct_sound_samples/cries/spoink.aif | Bin 0 -> 3648 bytes sound/direct_sound_samples/cries/squirtle.aif | Bin 0 -> 7222 bytes sound/direct_sound_samples/cries/stantler.aif | Bin 0 -> 11208 bytes sound/direct_sound_samples/cries/starmie.aif | Bin 0 -> 10402 bytes sound/direct_sound_samples/cries/staryu.aif | Bin 0 -> 9934 bytes sound/direct_sound_samples/cries/steelix.aif | Bin 0 -> 18988 bytes sound/direct_sound_samples/cries/sudowoodo.aif | Bin 0 -> 8084 bytes sound/direct_sound_samples/cries/suicune.aif | Bin 0 -> 9126 bytes sound/direct_sound_samples/cries/sunflora.aif | Bin 0 -> 7928 bytes sound/direct_sound_samples/cries/sunkern.aif | Bin 0 -> 4056 bytes sound/direct_sound_samples/cries/surskit.aif | Bin 0 -> 5258 bytes sound/direct_sound_samples/cries/swablu.aif | Bin 0 -> 2824 bytes sound/direct_sound_samples/cries/swalot.aif | Bin 0 -> 8676 bytes sound/direct_sound_samples/cries/swampert.aif | Bin 0 -> 11220 bytes sound/direct_sound_samples/cries/swellow.aif | Bin 0 -> 4524 bytes sound/direct_sound_samples/cries/swinub.aif | Bin 0 -> 6328 bytes sound/direct_sound_samples/cries/taillow.aif | Bin 0 -> 3024 bytes sound/direct_sound_samples/cries/tangela.aif | Bin 0 -> 7550 bytes sound/direct_sound_samples/cries/tauros.aif | Bin 0 -> 9150 bytes sound/direct_sound_samples/cries/teddiursa.aif | Bin 0 -> 8266 bytes sound/direct_sound_samples/cries/tentacool.aif | Bin 0 -> 7960 bytes sound/direct_sound_samples/cries/tentacruel.aif | Bin 0 -> 11458 bytes sound/direct_sound_samples/cries/togepi.aif | Bin 0 -> 5460 bytes sound/direct_sound_samples/cries/togetic.aif | Bin 0 -> 3526 bytes sound/direct_sound_samples/cries/torchic.aif | Bin 0 -> 4840 bytes sound/direct_sound_samples/cries/torkoal.aif | Bin 0 -> 4662 bytes sound/direct_sound_samples/cries/totodile.aif | Bin 0 -> 9152 bytes sound/direct_sound_samples/cries/trapinch.aif | Bin 0 -> 5080 bytes sound/direct_sound_samples/cries/treecko.aif | Bin 0 -> 5836 bytes sound/direct_sound_samples/cries/tropius.aif | Bin 0 -> 16318 bytes sound/direct_sound_samples/cries/typhlosion.aif | Bin 0 -> 18944 bytes sound/direct_sound_samples/cries/tyranitar.aif | Bin 0 -> 11656 bytes sound/direct_sound_samples/cries/tyrogue.aif | Bin 0 -> 8072 bytes sound/direct_sound_samples/cries/umbreon.aif | Bin 0 -> 7746 bytes sound/direct_sound_samples/cries/unown.aif | Bin 0 -> 6576 bytes sound/direct_sound_samples/cries/unused_265.aif | Bin 0 -> 4676 bytes sound/direct_sound_samples/cries/unused_268.aif | Bin 0 -> 8828 bytes sound/direct_sound_samples/cries/ursaring.aif | Bin 0 -> 14862 bytes sound/direct_sound_samples/cries/vaporeon.aif | Bin 0 -> 11018 bytes sound/direct_sound_samples/cries/venomoth.aif | Bin 0 -> 8002 bytes sound/direct_sound_samples/cries/venonat.aif | Bin 0 -> 7746 bytes sound/direct_sound_samples/cries/venusaur.aif | Bin 0 -> 9648 bytes sound/direct_sound_samples/cries/vibrava.aif | Bin 0 -> 7002 bytes sound/direct_sound_samples/cries/victreebel.aif | Bin 0 -> 9630 bytes sound/direct_sound_samples/cries/vigoroth.aif | Bin 0 -> 7168 bytes sound/direct_sound_samples/cries/vileplume.aif | Bin 0 -> 12760 bytes sound/direct_sound_samples/cries/volbeat.aif | Bin 0 -> 5772 bytes sound/direct_sound_samples/cries/voltorb.aif | Bin 0 -> 12346 bytes sound/direct_sound_samples/cries/vulpix.aif | Bin 0 -> 11870 bytes sound/direct_sound_samples/cries/wailmer.aif | Bin 0 -> 14134 bytes sound/direct_sound_samples/cries/wailord.aif | Bin 0 -> 20928 bytes sound/direct_sound_samples/cries/walrein.aif | Bin 0 -> 18067 bytes sound/direct_sound_samples/cries/wartortle.aif | Bin 0 -> 8614 bytes sound/direct_sound_samples/cries/weedle.aif | Bin 0 -> 8124 bytes sound/direct_sound_samples/cries/weepinbell.aif | Bin 0 -> 7310 bytes sound/direct_sound_samples/cries/weezing.aif | Bin 0 -> 10806 bytes sound/direct_sound_samples/cries/whiscash.aif | Bin 0 -> 8478 bytes sound/direct_sound_samples/cries/whismur.aif | Bin 0 -> 4092 bytes sound/direct_sound_samples/cries/wigglytuff.aif | Bin 0 -> 3412 bytes sound/direct_sound_samples/cries/wingull.aif | Bin 0 -> 6132 bytes sound/direct_sound_samples/cries/wobbuffet.aif | Bin 0 -> 10276 bytes sound/direct_sound_samples/cries/wooper.aif | Bin 0 -> 3710 bytes sound/direct_sound_samples/cries/wurmple.aif | Bin 0 -> 4412 bytes sound/direct_sound_samples/cries/wynaut.aif | Bin 0 -> 6932 bytes sound/direct_sound_samples/cries/xatu.aif | Bin 0 -> 7392 bytes sound/direct_sound_samples/cries/yanma.aif | Bin 0 -> 8506 bytes sound/direct_sound_samples/cries/zangoose.aif | Bin 0 -> 4778 bytes sound/direct_sound_samples/cries/zapdos.aif | Bin 0 -> 7724 bytes sound/direct_sound_samples/cries/zigzagoon.aif | Bin 0 -> 5786 bytes sound/direct_sound_samples/cries/zubat.aif | Bin 0 -> 9688 bytes sound/direct_sound_samples/cry_abra.aif | Bin 11660 -> 0 bytes sound/direct_sound_samples/cry_absol.aif | Bin 5256 -> 0 bytes sound/direct_sound_samples/cry_aerodactyl.aif | Bin 12142 -> 0 bytes sound/direct_sound_samples/cry_aggron.aif | Bin 12776 -> 0 bytes sound/direct_sound_samples/cry_aipom.aif | Bin 7058 -> 0 bytes sound/direct_sound_samples/cry_alakazam.aif | Bin 15740 -> 0 bytes sound/direct_sound_samples/cry_altaria.aif | Bin 5564 -> 0 bytes sound/direct_sound_samples/cry_ampharos.aif | Bin 8242 -> 0 bytes sound/direct_sound_samples/cry_anorith.aif | Bin 5862 -> 0 bytes sound/direct_sound_samples/cry_arbok.aif | Bin 9648 -> 0 bytes sound/direct_sound_samples/cry_arcanine.aif | Bin 8602 -> 0 bytes sound/direct_sound_samples/cry_ariados.aif | Bin 6170 -> 0 bytes sound/direct_sound_samples/cry_armaldo.aif | Bin 11380 -> 0 bytes sound/direct_sound_samples/cry_aron.aif | Bin 4600 -> 0 bytes sound/direct_sound_samples/cry_articuno.aif | Bin 11792 -> 0 bytes sound/direct_sound_samples/cry_azumarill.aif | Bin 8452 -> 0 bytes sound/direct_sound_samples/cry_azurill.aif | Bin 5212 -> 0 bytes sound/direct_sound_samples/cry_bagon.aif | Bin 3934 -> 0 bytes sound/direct_sound_samples/cry_baltoy.aif | Bin 6264 -> 0 bytes sound/direct_sound_samples/cry_banette.aif | Bin 6334 -> 0 bytes sound/direct_sound_samples/cry_barboach.aif | Bin 4632 -> 0 bytes sound/direct_sound_samples/cry_bayleef.aif | Bin 4414 -> 0 bytes sound/direct_sound_samples/cry_beautifly.aif | Bin 4128 -> 0 bytes sound/direct_sound_samples/cry_beedrill.aif | Bin 9656 -> 0 bytes sound/direct_sound_samples/cry_beldum.aif | Bin 4828 -> 0 bytes sound/direct_sound_samples/cry_bellossom.aif | Bin 7042 -> 0 bytes sound/direct_sound_samples/cry_bellsprout.aif | Bin 3792 -> 0 bytes sound/direct_sound_samples/cry_blastoise.aif | Bin 9622 -> 0 bytes sound/direct_sound_samples/cry_blaziken.aif | Bin 15690 -> 0 bytes sound/direct_sound_samples/cry_blissey.aif | Bin 8278 -> 0 bytes sound/direct_sound_samples/cry_breloom.aif | Bin 6376 -> 0 bytes sound/direct_sound_samples/cry_bulbasaur.aif | Bin 8266 -> 0 bytes sound/direct_sound_samples/cry_butterfree.aif | Bin 5026 -> 0 bytes sound/direct_sound_samples/cry_cacnea.aif | Bin 4488 -> 0 bytes sound/direct_sound_samples/cry_cacturne.aif | Bin 11310 -> 0 bytes sound/direct_sound_samples/cry_camerupt.aif | Bin 11526 -> 0 bytes sound/direct_sound_samples/cry_carvanha.aif | Bin 5048 -> 0 bytes sound/direct_sound_samples/cry_cascoon.aif | Bin 8126 -> 0 bytes sound/direct_sound_samples/cry_castform.aif | Bin 6302 -> 0 bytes sound/direct_sound_samples/cry_caterpie.aif | Bin 4192 -> 0 bytes sound/direct_sound_samples/cry_celebi.aif | Bin 7230 -> 0 bytes sound/direct_sound_samples/cry_chansey.aif | Bin 7390 -> 0 bytes sound/direct_sound_samples/cry_charizard.aif | Bin 9622 -> 0 bytes sound/direct_sound_samples/cry_charmander.aif | Bin 7216 -> 0 bytes sound/direct_sound_samples/cry_charmeleon.aif | Bin 7248 -> 0 bytes sound/direct_sound_samples/cry_chikorita.aif | Bin 2654 -> 0 bytes sound/direct_sound_samples/cry_chimecho.aif | Bin 5040 -> 0 bytes sound/direct_sound_samples/cry_chinchou.aif | Bin 6346 -> 0 bytes sound/direct_sound_samples/cry_clamperl.aif | Bin 9142 -> 0 bytes sound/direct_sound_samples/cry_claydol.aif | Bin 9668 -> 0 bytes sound/direct_sound_samples/cry_clefable.aif | Bin 5294 -> 0 bytes sound/direct_sound_samples/cry_clefairy.aif | Bin 4234 -> 0 bytes sound/direct_sound_samples/cry_cleffa.aif | Bin 2992 -> 0 bytes sound/direct_sound_samples/cry_cloyster.aif | Bin 10354 -> 0 bytes sound/direct_sound_samples/cry_combusken.aif | Bin 14360 -> 0 bytes sound/direct_sound_samples/cry_corphish.aif | Bin 6010 -> 0 bytes sound/direct_sound_samples/cry_corsola.aif | Bin 6440 -> 0 bytes sound/direct_sound_samples/cry_cradily.aif | Bin 14542 -> 0 bytes sound/direct_sound_samples/cry_crawdaunt.aif | Bin 12316 -> 0 bytes sound/direct_sound_samples/cry_crobat.aif | Bin 11562 -> 0 bytes sound/direct_sound_samples/cry_croconaw.aif | Bin 10096 -> 0 bytes sound/direct_sound_samples/cry_cubone.aif | Bin 7558 -> 0 bytes sound/direct_sound_samples/cry_cyndaquil.aif | Bin 3528 -> 0 bytes sound/direct_sound_samples/cry_delcatty.aif | Bin 10518 -> 0 bytes sound/direct_sound_samples/cry_delibird.aif | Bin 8094 -> 0 bytes sound/direct_sound_samples/cry_deoxys.aif | Bin 10388 -> 0 bytes sound/direct_sound_samples/cry_dewgong.aif | Bin 10546 -> 0 bytes sound/direct_sound_samples/cry_diglett.aif | Bin 9698 -> 0 bytes sound/direct_sound_samples/cry_ditto.aif | Bin 5566 -> 0 bytes sound/direct_sound_samples/cry_dodrio.aif | Bin 9712 -> 0 bytes sound/direct_sound_samples/cry_doduo.aif | Bin 9616 -> 0 bytes sound/direct_sound_samples/cry_donphan.aif | Bin 8554 -> 0 bytes sound/direct_sound_samples/cry_dragonair.aif | Bin 8318 -> 0 bytes sound/direct_sound_samples/cry_dragonite.aif | Bin 9502 -> 0 bytes sound/direct_sound_samples/cry_dratini.aif | Bin 5812 -> 0 bytes sound/direct_sound_samples/cry_drowzee.aif | Bin 14494 -> 0 bytes sound/direct_sound_samples/cry_dugtrio.aif | Bin 9686 -> 0 bytes sound/direct_sound_samples/cry_dunsparce.aif | Bin 7926 -> 0 bytes sound/direct_sound_samples/cry_dusclops.aif | Bin 6858 -> 0 bytes sound/direct_sound_samples/cry_duskull.aif | Bin 5310 -> 0 bytes sound/direct_sound_samples/cry_dustox.aif | Bin 6338 -> 0 bytes sound/direct_sound_samples/cry_eevee.aif | Bin 7104 -> 0 bytes sound/direct_sound_samples/cry_ekans.aif | Bin 9626 -> 0 bytes sound/direct_sound_samples/cry_electabuzz.aif | Bin 15380 -> 0 bytes sound/direct_sound_samples/cry_electrike.aif | Bin 6186 -> 0 bytes sound/direct_sound_samples/cry_electrode.aif | Bin 12564 -> 0 bytes sound/direct_sound_samples/cry_elekid.aif | Bin 5284 -> 0 bytes sound/direct_sound_samples/cry_entei.aif | Bin 10198 -> 0 bytes sound/direct_sound_samples/cry_espeon.aif | Bin 9828 -> 0 bytes sound/direct_sound_samples/cry_exeggcute.aif | Bin 9416 -> 0 bytes sound/direct_sound_samples/cry_exeggutor.aif | Bin 15880 -> 0 bytes sound/direct_sound_samples/cry_exploud.aif | Bin 14086 -> 0 bytes sound/direct_sound_samples/cry_farfetchd.aif | Bin 3766 -> 0 bytes sound/direct_sound_samples/cry_fearow.aif | Bin 8602 -> 0 bytes sound/direct_sound_samples/cry_feebas.aif | Bin 3932 -> 0 bytes sound/direct_sound_samples/cry_feraligatr.aif | Bin 12712 -> 0 bytes sound/direct_sound_samples/cry_flaaffy.aif | Bin 6854 -> 0 bytes sound/direct_sound_samples/cry_flareon.aif | Bin 7748 -> 0 bytes sound/direct_sound_samples/cry_flygon.aif | Bin 12974 -> 0 bytes sound/direct_sound_samples/cry_forretress.aif | Bin 9990 -> 0 bytes sound/direct_sound_samples/cry_furret.aif | Bin 3168 -> 0 bytes sound/direct_sound_samples/cry_gardevoir.aif | Bin 12154 -> 0 bytes sound/direct_sound_samples/cry_gastly.aif | Bin 11620 -> 0 bytes sound/direct_sound_samples/cry_gengar.aif | Bin 7372 -> 0 bytes sound/direct_sound_samples/cry_geodude.aif | Bin 11816 -> 0 bytes sound/direct_sound_samples/cry_girafarig.aif | Bin 7346 -> 0 bytes sound/direct_sound_samples/cry_glalie.aif | Bin 10420 -> 0 bytes sound/direct_sound_samples/cry_gligar.aif | Bin 6068 -> 0 bytes sound/direct_sound_samples/cry_gloom.aif | Bin 6246 -> 0 bytes sound/direct_sound_samples/cry_golbat.aif | Bin 9674 -> 0 bytes sound/direct_sound_samples/cry_goldeen.aif | Bin 4936 -> 0 bytes sound/direct_sound_samples/cry_golduck.aif | Bin 5646 -> 0 bytes sound/direct_sound_samples/cry_golem.aif | Bin 7080 -> 0 bytes sound/direct_sound_samples/cry_gorebyss.aif | Bin 11176 -> 0 bytes sound/direct_sound_samples/cry_granbull.aif | Bin 11782 -> 0 bytes sound/direct_sound_samples/cry_graveler.aif | Bin 13900 -> 0 bytes sound/direct_sound_samples/cry_grimer.aif | Bin 5274 -> 0 bytes sound/direct_sound_samples/cry_groudon.aif | Bin 18438 -> 0 bytes sound/direct_sound_samples/cry_grovyle.aif | Bin 10198 -> 0 bytes sound/direct_sound_samples/cry_growlithe.aif | Bin 6696 -> 0 bytes sound/direct_sound_samples/cry_grumpig.aif | Bin 6318 -> 0 bytes sound/direct_sound_samples/cry_gulpin.aif | Bin 4028 -> 0 bytes sound/direct_sound_samples/cry_gyarados.aif | Bin 10078 -> 0 bytes sound/direct_sound_samples/cry_hariyama.aif | Bin 8348 -> 0 bytes sound/direct_sound_samples/cry_haunter.aif | Bin 11714 -> 0 bytes sound/direct_sound_samples/cry_heracross.aif | Bin 9144 -> 0 bytes sound/direct_sound_samples/cry_hitmonchan.aif | Bin 8906 -> 0 bytes sound/direct_sound_samples/cry_hitmonlee.aif | Bin 9318 -> 0 bytes sound/direct_sound_samples/cry_hitmontop.aif | Bin 6936 -> 0 bytes sound/direct_sound_samples/cry_ho_oh.aif | Bin 11260 -> 0 bytes sound/direct_sound_samples/cry_hoothoot.aif | Bin 5458 -> 0 bytes sound/direct_sound_samples/cry_hoppip.aif | Bin 4226 -> 0 bytes sound/direct_sound_samples/cry_horsea.aif | Bin 4754 -> 0 bytes sound/direct_sound_samples/cry_houndoom.aif | Bin 9820 -> 0 bytes sound/direct_sound_samples/cry_houndour.aif | Bin 6332 -> 0 bytes sound/direct_sound_samples/cry_huntail.aif | Bin 7944 -> 0 bytes sound/direct_sound_samples/cry_hypno.aif | Bin 14450 -> 0 bytes sound/direct_sound_samples/cry_igglybuff.aif | Bin 3518 -> 0 bytes sound/direct_sound_samples/cry_illumise.aif | Bin 8536 -> 0 bytes sound/direct_sound_samples/cry_ivysaur.aif | Bin 8270 -> 0 bytes sound/direct_sound_samples/cry_jigglypuff.aif | Bin 2720 -> 0 bytes sound/direct_sound_samples/cry_jirachi.aif | Bin 6758 -> 0 bytes sound/direct_sound_samples/cry_jolteon.aif | Bin 7904 -> 0 bytes sound/direct_sound_samples/cry_jumpluff.aif | Bin 8106 -> 0 bytes sound/direct_sound_samples/cry_jynx.aif | Bin 23606 -> 0 bytes sound/direct_sound_samples/cry_kabuto.aif | Bin 6170 -> 0 bytes sound/direct_sound_samples/cry_kabutops.aif | Bin 6867 -> 0 bytes sound/direct_sound_samples/cry_kadabra.aif | Bin 13408 -> 0 bytes sound/direct_sound_samples/cry_kakuna.aif | Bin 9104 -> 0 bytes sound/direct_sound_samples/cry_kangaskhan.aif | Bin 9334 -> 0 bytes sound/direct_sound_samples/cry_kecleon.aif | Bin 4202 -> 0 bytes sound/direct_sound_samples/cry_kingdra.aif | Bin 6922 -> 0 bytes sound/direct_sound_samples/cry_kingler.aif | Bin 12132 -> 0 bytes sound/direct_sound_samples/cry_kirlia.aif | Bin 6100 -> 0 bytes sound/direct_sound_samples/cry_koffing.aif | Bin 10154 -> 0 bytes sound/direct_sound_samples/cry_krabby.aif | Bin 12112 -> 0 bytes sound/direct_sound_samples/cry_kyogre.aif | Bin 17782 -> 0 bytes sound/direct_sound_samples/cry_lairon.aif | Bin 10392 -> 0 bytes sound/direct_sound_samples/cry_lanturn.aif | Bin 5282 -> 0 bytes sound/direct_sound_samples/cry_lapras.aif | Bin 7408 -> 0 bytes sound/direct_sound_samples/cry_larvitar.aif | Bin 6350 -> 0 bytes sound/direct_sound_samples/cry_latias.aif | Bin 6098 -> 0 bytes sound/direct_sound_samples/cry_latios.aif | Bin 10958 -> 0 bytes sound/direct_sound_samples/cry_ledian.aif | Bin 4214 -> 0 bytes sound/direct_sound_samples/cry_ledyba.aif | Bin 3506 -> 0 bytes sound/direct_sound_samples/cry_lickitung.aif | Bin 7571 -> 0 bytes sound/direct_sound_samples/cry_lileep.aif | Bin 4838 -> 0 bytes sound/direct_sound_samples/cry_linoone.aif | Bin 15248 -> 0 bytes sound/direct_sound_samples/cry_lombre.aif | Bin 7282 -> 0 bytes sound/direct_sound_samples/cry_lotad.aif | Bin 2232 -> 0 bytes sound/direct_sound_samples/cry_loudred.aif | Bin 6582 -> 0 bytes sound/direct_sound_samples/cry_ludicolo.aif | Bin 8398 -> 0 bytes sound/direct_sound_samples/cry_lugia.aif | Bin 18900 -> 0 bytes sound/direct_sound_samples/cry_lunatone.aif | Bin 11956 -> 0 bytes sound/direct_sound_samples/cry_luvdisc.aif | Bin 2456 -> 0 bytes sound/direct_sound_samples/cry_machamp.aif | Bin 8256 -> 0 bytes sound/direct_sound_samples/cry_machoke.aif | Bin 6782 -> 0 bytes sound/direct_sound_samples/cry_machop.aif | Bin 6696 -> 0 bytes sound/direct_sound_samples/cry_magby.aif | Bin 7218 -> 0 bytes sound/direct_sound_samples/cry_magcargo.aif | Bin 10486 -> 0 bytes sound/direct_sound_samples/cry_magikarp.aif | Bin 9492 -> 0 bytes sound/direct_sound_samples/cry_magmar.aif | Bin 7738 -> 0 bytes sound/direct_sound_samples/cry_magnemite.aif | Bin 9610 -> 0 bytes sound/direct_sound_samples/cry_magneton.aif | Bin 11914 -> 0 bytes sound/direct_sound_samples/cry_makuhita.aif | Bin 3704 -> 0 bytes sound/direct_sound_samples/cry_manectric.aif | Bin 10492 -> 0 bytes sound/direct_sound_samples/cry_mankey.aif | Bin 8178 -> 0 bytes sound/direct_sound_samples/cry_mantine.aif | Bin 7884 -> 0 bytes sound/direct_sound_samples/cry_mareep.aif | Bin 3694 -> 0 bytes sound/direct_sound_samples/cry_marill.aif | Bin 6538 -> 0 bytes sound/direct_sound_samples/cry_marowak.aif | Bin 7216 -> 0 bytes sound/direct_sound_samples/cry_marshtomp.aif | Bin 8498 -> 0 bytes sound/direct_sound_samples/cry_masquerain.aif | Bin 9830 -> 0 bytes sound/direct_sound_samples/cry_mawile.aif | Bin 5756 -> 0 bytes sound/direct_sound_samples/cry_medicham.aif | Bin 8246 -> 0 bytes sound/direct_sound_samples/cry_meditite.aif | Bin 4078 -> 0 bytes sound/direct_sound_samples/cry_meganium.aif | Bin 8100 -> 0 bytes sound/direct_sound_samples/cry_meowth.aif | Bin 4796 -> 0 bytes sound/direct_sound_samples/cry_metagross.aif | Bin 19644 -> 0 bytes sound/direct_sound_samples/cry_metang.aif | Bin 9398 -> 0 bytes sound/direct_sound_samples/cry_metapod.aif | Bin 11622 -> 0 bytes sound/direct_sound_samples/cry_mew.aif | Bin 15146 -> 0 bytes sound/direct_sound_samples/cry_mewtwo.aif | Bin 15144 -> 0 bytes sound/direct_sound_samples/cry_mightyena.aif | Bin 9748 -> 0 bytes sound/direct_sound_samples/cry_milotic.aif | Bin 19542 -> 0 bytes sound/direct_sound_samples/cry_miltank.aif | Bin 7424 -> 0 bytes sound/direct_sound_samples/cry_minun.aif | Bin 8004 -> 0 bytes sound/direct_sound_samples/cry_misdreavus.aif | Bin 5816 -> 0 bytes sound/direct_sound_samples/cry_moltres.aif | Bin 11796 -> 0 bytes sound/direct_sound_samples/cry_mr_mime.aif | Bin 9446 -> 0 bytes sound/direct_sound_samples/cry_mudkip.aif | Bin 3776 -> 0 bytes sound/direct_sound_samples/cry_muk.aif | Bin 7374 -> 0 bytes sound/direct_sound_samples/cry_murkrow.aif | Bin 8370 -> 0 bytes sound/direct_sound_samples/cry_natu.aif | Bin 5294 -> 0 bytes sound/direct_sound_samples/cry_nidoking.aif | Bin 12176 -> 0 bytes sound/direct_sound_samples/cry_nidoqueen.aif | Bin 8424 -> 0 bytes sound/direct_sound_samples/cry_nidoran_f.aif | Bin 4858 -> 0 bytes sound/direct_sound_samples/cry_nidoran_m.aif | Bin 5216 -> 0 bytes sound/direct_sound_samples/cry_nidorina.aif | Bin 6394 -> 0 bytes sound/direct_sound_samples/cry_nidorino.aif | Bin 6042 -> 0 bytes sound/direct_sound_samples/cry_nincada.aif | Bin 3244 -> 0 bytes sound/direct_sound_samples/cry_ninetales.aif | Bin 12174 -> 0 bytes sound/direct_sound_samples/cry_ninjask.aif | Bin 6084 -> 0 bytes sound/direct_sound_samples/cry_noctowl.aif | Bin 10564 -> 0 bytes sound/direct_sound_samples/cry_nosepass.aif | Bin 6696 -> 0 bytes sound/direct_sound_samples/cry_numel.aif | Bin 4664 -> 0 bytes sound/direct_sound_samples/cry_nuzleaf.aif | Bin 5712 -> 0 bytes sound/direct_sound_samples/cry_octillery.aif | Bin 13084 -> 0 bytes sound/direct_sound_samples/cry_oddish.aif | Bin 7298 -> 0 bytes sound/direct_sound_samples/cry_omanyte.aif | Bin 6672 -> 0 bytes sound/direct_sound_samples/cry_omastar.aif | Bin 6666 -> 0 bytes sound/direct_sound_samples/cry_onix.aif | Bin 12340 -> 0 bytes sound/direct_sound_samples/cry_paras.aif | Bin 13924 -> 0 bytes sound/direct_sound_samples/cry_parasect.aif | Bin 15140 -> 0 bytes sound/direct_sound_samples/cry_pelipper.aif | Bin 5894 -> 0 bytes sound/direct_sound_samples/cry_persian.aif | Bin 9412 -> 0 bytes sound/direct_sound_samples/cry_phanpy.aif | Bin 5664 -> 0 bytes sound/direct_sound_samples/cry_pichu.aif | Bin 3684 -> 0 bytes sound/direct_sound_samples/cry_pidgeot.aif | Bin 8590 -> 0 bytes sound/direct_sound_samples/cry_pidgeotto.aif | Bin 7512 -> 0 bytes sound/direct_sound_samples/cry_pidgey.aif | Bin 1984 -> 0 bytes sound/direct_sound_samples/cry_pikachu.aif | Bin 8316 -> 0 bytes sound/direct_sound_samples/cry_piloswine.aif | Bin 6480 -> 0 bytes sound/direct_sound_samples/cry_pineco.aif | Bin 6690 -> 0 bytes sound/direct_sound_samples/cry_pinsir.aif | Bin 6186 -> 0 bytes sound/direct_sound_samples/cry_plusle.aif | Bin 4504 -> 0 bytes sound/direct_sound_samples/cry_politoed.aif | Bin 9114 -> 0 bytes sound/direct_sound_samples/cry_poliwag.aif | Bin 5562 -> 0 bytes sound/direct_sound_samples/cry_poliwhirl.aif | Bin 3354 -> 0 bytes sound/direct_sound_samples/cry_poliwrath.aif | Bin 5582 -> 0 bytes sound/direct_sound_samples/cry_ponyta.aif | Bin 7524 -> 0 bytes sound/direct_sound_samples/cry_poochyena.aif | Bin 4656 -> 0 bytes sound/direct_sound_samples/cry_porygon.aif | Bin 10002 -> 0 bytes sound/direct_sound_samples/cry_porygon2.aif | Bin 7854 -> 0 bytes sound/direct_sound_samples/cry_primeape.aif | Bin 8086 -> 0 bytes sound/direct_sound_samples/cry_psyduck.aif | Bin 6578 -> 0 bytes sound/direct_sound_samples/cry_pupitar.aif | Bin 4234 -> 0 bytes sound/direct_sound_samples/cry_quagsire.aif | Bin 6684 -> 0 bytes sound/direct_sound_samples/cry_quilava.aif | Bin 5962 -> 0 bytes sound/direct_sound_samples/cry_qwilfish.aif | Bin 5808 -> 0 bytes sound/direct_sound_samples/cry_raichu.aif | Bin 11842 -> 0 bytes sound/direct_sound_samples/cry_raikou.aif | Bin 8704 -> 0 bytes sound/direct_sound_samples/cry_ralts.aif | Bin 5066 -> 0 bytes sound/direct_sound_samples/cry_rapidash.aif | Bin 9292 -> 0 bytes sound/direct_sound_samples/cry_raticate.aif | Bin 4770 -> 0 bytes sound/direct_sound_samples/cry_rattata.aif | Bin 3956 -> 0 bytes sound/direct_sound_samples/cry_rayquaza.aif | Bin 14532 -> 0 bytes sound/direct_sound_samples/cry_regice.aif | Bin 15936 -> 0 bytes sound/direct_sound_samples/cry_regirock.aif | Bin 15862 -> 0 bytes sound/direct_sound_samples/cry_registeel.aif | Bin 11476 -> 0 bytes sound/direct_sound_samples/cry_relicanth.aif | Bin 10072 -> 0 bytes sound/direct_sound_samples/cry_remoraid.aif | Bin 5290 -> 0 bytes sound/direct_sound_samples/cry_rhydon.aif | Bin 10186 -> 0 bytes sound/direct_sound_samples/cry_rhyhorn.aif | Bin 9686 -> 0 bytes sound/direct_sound_samples/cry_roselia.aif | Bin 5382 -> 0 bytes sound/direct_sound_samples/cry_sableye.aif | Bin 5826 -> 0 bytes sound/direct_sound_samples/cry_salamence.aif | Bin 12514 -> 0 bytes sound/direct_sound_samples/cry_sandshrew.aif | Bin 4678 -> 0 bytes sound/direct_sound_samples/cry_sandslash.aif | Bin 6784 -> 0 bytes sound/direct_sound_samples/cry_sceptile.aif | Bin 13012 -> 0 bytes sound/direct_sound_samples/cry_scizor.aif | Bin 11462 -> 0 bytes sound/direct_sound_samples/cry_scyther.aif | Bin 6676 -> 0 bytes sound/direct_sound_samples/cry_seadra.aif | Bin 4228 -> 0 bytes sound/direct_sound_samples/cry_seaking.aif | Bin 9654 -> 0 bytes sound/direct_sound_samples/cry_sealeo.aif | Bin 5928 -> 0 bytes sound/direct_sound_samples/cry_seedot.aif | Bin 4106 -> 0 bytes sound/direct_sound_samples/cry_seel.aif | Bin 8954 -> 0 bytes sound/direct_sound_samples/cry_sentret.aif | Bin 2108 -> 0 bytes sound/direct_sound_samples/cry_seviper.aif | Bin 5820 -> 0 bytes sound/direct_sound_samples/cry_sharpedo.aif | Bin 11488 -> 0 bytes sound/direct_sound_samples/cry_shedinja.aif | Bin 3876 -> 0 bytes sound/direct_sound_samples/cry_shelgon.aif | Bin 9992 -> 0 bytes sound/direct_sound_samples/cry_shellder.aif | Bin 7718 -> 0 bytes sound/direct_sound_samples/cry_shiftry.aif | Bin 9860 -> 0 bytes sound/direct_sound_samples/cry_shroomish.aif | Bin 4436 -> 0 bytes sound/direct_sound_samples/cry_shuckle.aif | Bin 5110 -> 0 bytes sound/direct_sound_samples/cry_shuppet.aif | Bin 4144 -> 0 bytes sound/direct_sound_samples/cry_silcoon.aif | Bin 8074 -> 0 bytes sound/direct_sound_samples/cry_skarmory.aif | Bin 11982 -> 0 bytes sound/direct_sound_samples/cry_skiploom.aif | Bin 6516 -> 0 bytes sound/direct_sound_samples/cry_skitty.aif | Bin 3560 -> 0 bytes sound/direct_sound_samples/cry_slaking.aif | Bin 4970 -> 0 bytes sound/direct_sound_samples/cry_slakoth.aif | Bin 4272 -> 0 bytes sound/direct_sound_samples/cry_slowbro.aif | Bin 6720 -> 0 bytes sound/direct_sound_samples/cry_slowking.aif | Bin 11908 -> 0 bytes sound/direct_sound_samples/cry_slowpoke.aif | Bin 3724 -> 0 bytes sound/direct_sound_samples/cry_slugma.aif | Bin 8536 -> 0 bytes sound/direct_sound_samples/cry_smeargle.aif | Bin 5114 -> 0 bytes sound/direct_sound_samples/cry_smoochum.aif | Bin 5860 -> 0 bytes sound/direct_sound_samples/cry_sneasel.aif | Bin 4586 -> 0 bytes sound/direct_sound_samples/cry_snorlax.aif | Bin 2648 -> 0 bytes sound/direct_sound_samples/cry_snorunt.aif | Bin 8500 -> 0 bytes sound/direct_sound_samples/cry_snubbull.aif | Bin 7220 -> 0 bytes sound/direct_sound_samples/cry_solrock.aif | Bin 8080 -> 0 bytes sound/direct_sound_samples/cry_spearow.aif | Bin 8806 -> 0 bytes sound/direct_sound_samples/cry_spheal.aif | Bin 2880 -> 0 bytes sound/direct_sound_samples/cry_spinarak.aif | Bin 6696 -> 0 bytes sound/direct_sound_samples/cry_spinda.aif | Bin 6216 -> 0 bytes sound/direct_sound_samples/cry_spoink.aif | Bin 3648 -> 0 bytes sound/direct_sound_samples/cry_squirtle.aif | Bin 7222 -> 0 bytes sound/direct_sound_samples/cry_stantler.aif | Bin 11208 -> 0 bytes sound/direct_sound_samples/cry_starmie.aif | Bin 10402 -> 0 bytes sound/direct_sound_samples/cry_staryu.aif | Bin 9934 -> 0 bytes sound/direct_sound_samples/cry_steelix.aif | Bin 18988 -> 0 bytes sound/direct_sound_samples/cry_sudowoodo.aif | Bin 8084 -> 0 bytes sound/direct_sound_samples/cry_suicune.aif | Bin 9126 -> 0 bytes sound/direct_sound_samples/cry_sunflora.aif | Bin 7928 -> 0 bytes sound/direct_sound_samples/cry_sunkern.aif | Bin 4056 -> 0 bytes sound/direct_sound_samples/cry_surskit.aif | Bin 5258 -> 0 bytes sound/direct_sound_samples/cry_swablu.aif | Bin 2824 -> 0 bytes sound/direct_sound_samples/cry_swalot.aif | Bin 8676 -> 0 bytes sound/direct_sound_samples/cry_swampert.aif | Bin 11220 -> 0 bytes sound/direct_sound_samples/cry_swellow.aif | Bin 4524 -> 0 bytes sound/direct_sound_samples/cry_swinub.aif | Bin 6328 -> 0 bytes sound/direct_sound_samples/cry_taillow.aif | Bin 3024 -> 0 bytes sound/direct_sound_samples/cry_tangela.aif | Bin 7550 -> 0 bytes sound/direct_sound_samples/cry_tauros.aif | Bin 9150 -> 0 bytes sound/direct_sound_samples/cry_teddiursa.aif | Bin 8266 -> 0 bytes sound/direct_sound_samples/cry_tentacool.aif | Bin 7960 -> 0 bytes sound/direct_sound_samples/cry_tentacruel.aif | Bin 11458 -> 0 bytes sound/direct_sound_samples/cry_togepi.aif | Bin 5460 -> 0 bytes sound/direct_sound_samples/cry_togetic.aif | Bin 3526 -> 0 bytes sound/direct_sound_samples/cry_torchic.aif | Bin 4840 -> 0 bytes sound/direct_sound_samples/cry_torkoal.aif | Bin 4662 -> 0 bytes sound/direct_sound_samples/cry_totodile.aif | Bin 9152 -> 0 bytes sound/direct_sound_samples/cry_trapinch.aif | Bin 5080 -> 0 bytes sound/direct_sound_samples/cry_treecko.aif | Bin 5836 -> 0 bytes sound/direct_sound_samples/cry_tropius.aif | Bin 16318 -> 0 bytes sound/direct_sound_samples/cry_typhlosion.aif | Bin 18944 -> 0 bytes sound/direct_sound_samples/cry_tyranitar.aif | Bin 11656 -> 0 bytes sound/direct_sound_samples/cry_tyrogue.aif | Bin 8072 -> 0 bytes sound/direct_sound_samples/cry_umbreon.aif | Bin 7746 -> 0 bytes sound/direct_sound_samples/cry_unown.aif | Bin 6576 -> 0 bytes sound/direct_sound_samples/cry_unused_265.aif | Bin 4676 -> 0 bytes sound/direct_sound_samples/cry_unused_268.aif | Bin 8828 -> 0 bytes sound/direct_sound_samples/cry_ursaring.aif | Bin 14862 -> 0 bytes sound/direct_sound_samples/cry_vaporeon.aif | Bin 11018 -> 0 bytes sound/direct_sound_samples/cry_venomoth.aif | Bin 8002 -> 0 bytes sound/direct_sound_samples/cry_venonat.aif | Bin 7746 -> 0 bytes sound/direct_sound_samples/cry_venusaur.aif | Bin 9648 -> 0 bytes sound/direct_sound_samples/cry_vibrava.aif | Bin 7002 -> 0 bytes sound/direct_sound_samples/cry_victreebel.aif | Bin 9630 -> 0 bytes sound/direct_sound_samples/cry_vigoroth.aif | Bin 7168 -> 0 bytes sound/direct_sound_samples/cry_vileplume.aif | Bin 12760 -> 0 bytes sound/direct_sound_samples/cry_volbeat.aif | Bin 5772 -> 0 bytes sound/direct_sound_samples/cry_voltorb.aif | Bin 12346 -> 0 bytes sound/direct_sound_samples/cry_vulpix.aif | Bin 11870 -> 0 bytes sound/direct_sound_samples/cry_wailmer.aif | Bin 14134 -> 0 bytes sound/direct_sound_samples/cry_wailord.aif | Bin 20928 -> 0 bytes sound/direct_sound_samples/cry_walrein.aif | Bin 18067 -> 0 bytes sound/direct_sound_samples/cry_wartortle.aif | Bin 8614 -> 0 bytes sound/direct_sound_samples/cry_weedle.aif | Bin 8124 -> 0 bytes sound/direct_sound_samples/cry_weepinbell.aif | Bin 7310 -> 0 bytes sound/direct_sound_samples/cry_weezing.aif | Bin 10806 -> 0 bytes sound/direct_sound_samples/cry_whiscash.aif | Bin 8478 -> 0 bytes sound/direct_sound_samples/cry_whismur.aif | Bin 4092 -> 0 bytes sound/direct_sound_samples/cry_wigglytuff.aif | Bin 3412 -> 0 bytes sound/direct_sound_samples/cry_wingull.aif | Bin 6132 -> 0 bytes sound/direct_sound_samples/cry_wobbuffet.aif | Bin 10276 -> 0 bytes sound/direct_sound_samples/cry_wooper.aif | Bin 3710 -> 0 bytes sound/direct_sound_samples/cry_wurmple.aif | Bin 4412 -> 0 bytes sound/direct_sound_samples/cry_wynaut.aif | Bin 6932 -> 0 bytes sound/direct_sound_samples/cry_xatu.aif | Bin 7392 -> 0 bytes sound/direct_sound_samples/cry_yanma.aif | Bin 8506 -> 0 bytes sound/direct_sound_samples/cry_zangoose.aif | Bin 4778 -> 0 bytes sound/direct_sound_samples/cry_zapdos.aif | Bin 7724 -> 0 bytes sound/direct_sound_samples/cry_zigzagoon.aif | Bin 5786 -> 0 bytes sound/direct_sound_samples/cry_zubat.aif | Bin 9688 -> 0 bytes 778 files changed, 393 insertions(+), 390 deletions(-) create mode 100644 sound/direct_sound_samples/cries/abra.aif create mode 100644 sound/direct_sound_samples/cries/absol.aif create mode 100644 sound/direct_sound_samples/cries/aerodactyl.aif create mode 100644 sound/direct_sound_samples/cries/aggron.aif create mode 100644 sound/direct_sound_samples/cries/aipom.aif create mode 100644 sound/direct_sound_samples/cries/alakazam.aif create mode 100644 sound/direct_sound_samples/cries/altaria.aif create mode 100644 sound/direct_sound_samples/cries/ampharos.aif create mode 100644 sound/direct_sound_samples/cries/anorith.aif create mode 100644 sound/direct_sound_samples/cries/arbok.aif create mode 100644 sound/direct_sound_samples/cries/arcanine.aif create mode 100644 sound/direct_sound_samples/cries/ariados.aif create mode 100644 sound/direct_sound_samples/cries/armaldo.aif create mode 100644 sound/direct_sound_samples/cries/aron.aif create mode 100644 sound/direct_sound_samples/cries/articuno.aif create mode 100644 sound/direct_sound_samples/cries/azumarill.aif create mode 100644 sound/direct_sound_samples/cries/azurill.aif create mode 100644 sound/direct_sound_samples/cries/bagon.aif create mode 100644 sound/direct_sound_samples/cries/baltoy.aif create mode 100644 sound/direct_sound_samples/cries/banette.aif create mode 100644 sound/direct_sound_samples/cries/barboach.aif create mode 100644 sound/direct_sound_samples/cries/bayleef.aif create mode 100644 sound/direct_sound_samples/cries/beautifly.aif create mode 100644 sound/direct_sound_samples/cries/beedrill.aif create mode 100644 sound/direct_sound_samples/cries/beldum.aif create mode 100644 sound/direct_sound_samples/cries/bellossom.aif create mode 100644 sound/direct_sound_samples/cries/bellsprout.aif create mode 100644 sound/direct_sound_samples/cries/blastoise.aif create mode 100644 sound/direct_sound_samples/cries/blaziken.aif create mode 100644 sound/direct_sound_samples/cries/blissey.aif create mode 100644 sound/direct_sound_samples/cries/breloom.aif create mode 100644 sound/direct_sound_samples/cries/bulbasaur.aif create mode 100644 sound/direct_sound_samples/cries/butterfree.aif create mode 100644 sound/direct_sound_samples/cries/cacnea.aif create mode 100644 sound/direct_sound_samples/cries/cacturne.aif create mode 100644 sound/direct_sound_samples/cries/camerupt.aif create mode 100644 sound/direct_sound_samples/cries/carvanha.aif create mode 100644 sound/direct_sound_samples/cries/cascoon.aif create mode 100644 sound/direct_sound_samples/cries/castform.aif create mode 100644 sound/direct_sound_samples/cries/caterpie.aif create mode 100644 sound/direct_sound_samples/cries/celebi.aif create mode 100644 sound/direct_sound_samples/cries/chansey.aif create mode 100644 sound/direct_sound_samples/cries/charizard.aif create mode 100644 sound/direct_sound_samples/cries/charmander.aif create mode 100644 sound/direct_sound_samples/cries/charmeleon.aif create mode 100644 sound/direct_sound_samples/cries/chikorita.aif create mode 100644 sound/direct_sound_samples/cries/chimecho.aif create mode 100644 sound/direct_sound_samples/cries/chinchou.aif create mode 100644 sound/direct_sound_samples/cries/clamperl.aif create mode 100644 sound/direct_sound_samples/cries/claydol.aif create mode 100644 sound/direct_sound_samples/cries/clefable.aif create mode 100644 sound/direct_sound_samples/cries/clefairy.aif create mode 100644 sound/direct_sound_samples/cries/cleffa.aif create mode 100644 sound/direct_sound_samples/cries/cloyster.aif create mode 100644 sound/direct_sound_samples/cries/combusken.aif create mode 100644 sound/direct_sound_samples/cries/corphish.aif create mode 100644 sound/direct_sound_samples/cries/corsola.aif create mode 100644 sound/direct_sound_samples/cries/cradily.aif create mode 100644 sound/direct_sound_samples/cries/crawdaunt.aif create mode 100644 sound/direct_sound_samples/cries/crobat.aif create mode 100644 sound/direct_sound_samples/cries/croconaw.aif create mode 100644 sound/direct_sound_samples/cries/cubone.aif create mode 100644 sound/direct_sound_samples/cries/cyndaquil.aif create mode 100644 sound/direct_sound_samples/cries/delcatty.aif create mode 100644 sound/direct_sound_samples/cries/delibird.aif create mode 100644 sound/direct_sound_samples/cries/deoxys.aif create mode 100644 sound/direct_sound_samples/cries/dewgong.aif create mode 100644 sound/direct_sound_samples/cries/diglett.aif create mode 100644 sound/direct_sound_samples/cries/ditto.aif create mode 100644 sound/direct_sound_samples/cries/dodrio.aif create mode 100644 sound/direct_sound_samples/cries/doduo.aif create mode 100644 sound/direct_sound_samples/cries/donphan.aif create mode 100644 sound/direct_sound_samples/cries/dragonair.aif create mode 100644 sound/direct_sound_samples/cries/dragonite.aif create mode 100644 sound/direct_sound_samples/cries/dratini.aif create mode 100644 sound/direct_sound_samples/cries/drowzee.aif create mode 100644 sound/direct_sound_samples/cries/dugtrio.aif create mode 100644 sound/direct_sound_samples/cries/dunsparce.aif create mode 100644 sound/direct_sound_samples/cries/dusclops.aif create mode 100644 sound/direct_sound_samples/cries/duskull.aif create mode 100644 sound/direct_sound_samples/cries/dustox.aif create mode 100644 sound/direct_sound_samples/cries/eevee.aif create mode 100644 sound/direct_sound_samples/cries/ekans.aif create mode 100644 sound/direct_sound_samples/cries/electabuzz.aif create mode 100644 sound/direct_sound_samples/cries/electrike.aif create mode 100644 sound/direct_sound_samples/cries/electrode.aif create mode 100644 sound/direct_sound_samples/cries/elekid.aif create mode 100644 sound/direct_sound_samples/cries/entei.aif create mode 100644 sound/direct_sound_samples/cries/espeon.aif create mode 100644 sound/direct_sound_samples/cries/exeggcute.aif create mode 100644 sound/direct_sound_samples/cries/exeggutor.aif create mode 100644 sound/direct_sound_samples/cries/exploud.aif create mode 100644 sound/direct_sound_samples/cries/farfetchd.aif create mode 100644 sound/direct_sound_samples/cries/fearow.aif create mode 100644 sound/direct_sound_samples/cries/feebas.aif create mode 100644 sound/direct_sound_samples/cries/feraligatr.aif create mode 100644 sound/direct_sound_samples/cries/flaaffy.aif create mode 100644 sound/direct_sound_samples/cries/flareon.aif create mode 100644 sound/direct_sound_samples/cries/flygon.aif create mode 100644 sound/direct_sound_samples/cries/forretress.aif create mode 100644 sound/direct_sound_samples/cries/furret.aif create mode 100644 sound/direct_sound_samples/cries/gardevoir.aif create mode 100644 sound/direct_sound_samples/cries/gastly.aif create mode 100644 sound/direct_sound_samples/cries/gengar.aif create mode 100644 sound/direct_sound_samples/cries/geodude.aif create mode 100644 sound/direct_sound_samples/cries/girafarig.aif create mode 100644 sound/direct_sound_samples/cries/glalie.aif create mode 100644 sound/direct_sound_samples/cries/gligar.aif create mode 100644 sound/direct_sound_samples/cries/gloom.aif create mode 100644 sound/direct_sound_samples/cries/golbat.aif create mode 100644 sound/direct_sound_samples/cries/goldeen.aif create mode 100644 sound/direct_sound_samples/cries/golduck.aif create mode 100644 sound/direct_sound_samples/cries/golem.aif create mode 100644 sound/direct_sound_samples/cries/gorebyss.aif create mode 100644 sound/direct_sound_samples/cries/granbull.aif create mode 100644 sound/direct_sound_samples/cries/graveler.aif create mode 100644 sound/direct_sound_samples/cries/grimer.aif create mode 100644 sound/direct_sound_samples/cries/groudon.aif create mode 100644 sound/direct_sound_samples/cries/grovyle.aif create mode 100644 sound/direct_sound_samples/cries/growlithe.aif create mode 100644 sound/direct_sound_samples/cries/grumpig.aif create mode 100644 sound/direct_sound_samples/cries/gulpin.aif create mode 100644 sound/direct_sound_samples/cries/gyarados.aif create mode 100644 sound/direct_sound_samples/cries/hariyama.aif create mode 100644 sound/direct_sound_samples/cries/haunter.aif create mode 100644 sound/direct_sound_samples/cries/heracross.aif create mode 100644 sound/direct_sound_samples/cries/hitmonchan.aif create mode 100644 sound/direct_sound_samples/cries/hitmonlee.aif create mode 100644 sound/direct_sound_samples/cries/hitmontop.aif create mode 100644 sound/direct_sound_samples/cries/ho_oh.aif create mode 100644 sound/direct_sound_samples/cries/hoothoot.aif create mode 100644 sound/direct_sound_samples/cries/hoppip.aif create mode 100644 sound/direct_sound_samples/cries/horsea.aif create mode 100644 sound/direct_sound_samples/cries/houndoom.aif create mode 100644 sound/direct_sound_samples/cries/houndour.aif create mode 100644 sound/direct_sound_samples/cries/huntail.aif create mode 100644 sound/direct_sound_samples/cries/hypno.aif create mode 100644 sound/direct_sound_samples/cries/igglybuff.aif create mode 100644 sound/direct_sound_samples/cries/illumise.aif create mode 100644 sound/direct_sound_samples/cries/ivysaur.aif create mode 100644 sound/direct_sound_samples/cries/jigglypuff.aif create mode 100644 sound/direct_sound_samples/cries/jirachi.aif create mode 100644 sound/direct_sound_samples/cries/jolteon.aif create mode 100644 sound/direct_sound_samples/cries/jumpluff.aif create mode 100644 sound/direct_sound_samples/cries/jynx.aif create mode 100644 sound/direct_sound_samples/cries/kabuto.aif create mode 100644 sound/direct_sound_samples/cries/kabutops.aif create mode 100644 sound/direct_sound_samples/cries/kadabra.aif create mode 100644 sound/direct_sound_samples/cries/kakuna.aif create mode 100644 sound/direct_sound_samples/cries/kangaskhan.aif create mode 100644 sound/direct_sound_samples/cries/kecleon.aif create mode 100644 sound/direct_sound_samples/cries/kingdra.aif create mode 100644 sound/direct_sound_samples/cries/kingler.aif create mode 100644 sound/direct_sound_samples/cries/kirlia.aif create mode 100644 sound/direct_sound_samples/cries/koffing.aif create mode 100644 sound/direct_sound_samples/cries/krabby.aif create mode 100644 sound/direct_sound_samples/cries/kyogre.aif create mode 100644 sound/direct_sound_samples/cries/lairon.aif create mode 100644 sound/direct_sound_samples/cries/lanturn.aif create mode 100644 sound/direct_sound_samples/cries/lapras.aif create mode 100644 sound/direct_sound_samples/cries/larvitar.aif create mode 100644 sound/direct_sound_samples/cries/latias.aif create mode 100644 sound/direct_sound_samples/cries/latios.aif create mode 100644 sound/direct_sound_samples/cries/ledian.aif create mode 100644 sound/direct_sound_samples/cries/ledyba.aif create mode 100644 sound/direct_sound_samples/cries/lickitung.aif create mode 100644 sound/direct_sound_samples/cries/lileep.aif create mode 100644 sound/direct_sound_samples/cries/linoone.aif create mode 100644 sound/direct_sound_samples/cries/lombre.aif create mode 100644 sound/direct_sound_samples/cries/lotad.aif create mode 100644 sound/direct_sound_samples/cries/loudred.aif create mode 100644 sound/direct_sound_samples/cries/ludicolo.aif create mode 100644 sound/direct_sound_samples/cries/lugia.aif create mode 100644 sound/direct_sound_samples/cries/lunatone.aif create mode 100644 sound/direct_sound_samples/cries/luvdisc.aif create mode 100644 sound/direct_sound_samples/cries/machamp.aif create mode 100644 sound/direct_sound_samples/cries/machoke.aif create mode 100644 sound/direct_sound_samples/cries/machop.aif create mode 100644 sound/direct_sound_samples/cries/magby.aif create mode 100644 sound/direct_sound_samples/cries/magcargo.aif create mode 100644 sound/direct_sound_samples/cries/magikarp.aif create mode 100644 sound/direct_sound_samples/cries/magmar.aif create mode 100644 sound/direct_sound_samples/cries/magnemite.aif create mode 100644 sound/direct_sound_samples/cries/magneton.aif create mode 100644 sound/direct_sound_samples/cries/makuhita.aif create mode 100644 sound/direct_sound_samples/cries/manectric.aif create mode 100644 sound/direct_sound_samples/cries/mankey.aif create mode 100644 sound/direct_sound_samples/cries/mantine.aif create mode 100644 sound/direct_sound_samples/cries/mareep.aif create mode 100644 sound/direct_sound_samples/cries/marill.aif create mode 100644 sound/direct_sound_samples/cries/marowak.aif create mode 100644 sound/direct_sound_samples/cries/marshtomp.aif create mode 100644 sound/direct_sound_samples/cries/masquerain.aif create mode 100644 sound/direct_sound_samples/cries/mawile.aif create mode 100644 sound/direct_sound_samples/cries/medicham.aif create mode 100644 sound/direct_sound_samples/cries/meditite.aif create mode 100644 sound/direct_sound_samples/cries/meganium.aif create mode 100644 sound/direct_sound_samples/cries/meowth.aif create mode 100644 sound/direct_sound_samples/cries/metagross.aif create mode 100644 sound/direct_sound_samples/cries/metang.aif create mode 100644 sound/direct_sound_samples/cries/metapod.aif create mode 100644 sound/direct_sound_samples/cries/mew.aif create mode 100644 sound/direct_sound_samples/cries/mewtwo.aif create mode 100644 sound/direct_sound_samples/cries/mightyena.aif create mode 100644 sound/direct_sound_samples/cries/milotic.aif create mode 100644 sound/direct_sound_samples/cries/miltank.aif create mode 100644 sound/direct_sound_samples/cries/minun.aif create mode 100644 sound/direct_sound_samples/cries/misdreavus.aif create mode 100644 sound/direct_sound_samples/cries/moltres.aif create mode 100644 sound/direct_sound_samples/cries/mr_mime.aif create mode 100644 sound/direct_sound_samples/cries/mudkip.aif create mode 100644 sound/direct_sound_samples/cries/muk.aif create mode 100644 sound/direct_sound_samples/cries/murkrow.aif create mode 100644 sound/direct_sound_samples/cries/natu.aif create mode 100644 sound/direct_sound_samples/cries/nidoking.aif create mode 100644 sound/direct_sound_samples/cries/nidoqueen.aif create mode 100644 sound/direct_sound_samples/cries/nidoran_f.aif create mode 100644 sound/direct_sound_samples/cries/nidoran_m.aif create mode 100644 sound/direct_sound_samples/cries/nidorina.aif create mode 100644 sound/direct_sound_samples/cries/nidorino.aif create mode 100644 sound/direct_sound_samples/cries/nincada.aif create mode 100644 sound/direct_sound_samples/cries/ninetales.aif create mode 100644 sound/direct_sound_samples/cries/ninjask.aif create mode 100644 sound/direct_sound_samples/cries/noctowl.aif create mode 100644 sound/direct_sound_samples/cries/nosepass.aif create mode 100644 sound/direct_sound_samples/cries/numel.aif create mode 100644 sound/direct_sound_samples/cries/nuzleaf.aif create mode 100644 sound/direct_sound_samples/cries/octillery.aif create mode 100644 sound/direct_sound_samples/cries/oddish.aif create mode 100644 sound/direct_sound_samples/cries/omanyte.aif create mode 100644 sound/direct_sound_samples/cries/omastar.aif create mode 100644 sound/direct_sound_samples/cries/onix.aif create mode 100644 sound/direct_sound_samples/cries/paras.aif create mode 100644 sound/direct_sound_samples/cries/parasect.aif create mode 100644 sound/direct_sound_samples/cries/pelipper.aif create mode 100644 sound/direct_sound_samples/cries/persian.aif create mode 100644 sound/direct_sound_samples/cries/phanpy.aif create mode 100644 sound/direct_sound_samples/cries/pichu.aif create mode 100644 sound/direct_sound_samples/cries/pidgeot.aif create mode 100644 sound/direct_sound_samples/cries/pidgeotto.aif create mode 100644 sound/direct_sound_samples/cries/pidgey.aif create mode 100644 sound/direct_sound_samples/cries/pikachu.aif create mode 100644 sound/direct_sound_samples/cries/piloswine.aif create mode 100644 sound/direct_sound_samples/cries/pineco.aif create mode 100644 sound/direct_sound_samples/cries/pinsir.aif create mode 100644 sound/direct_sound_samples/cries/plusle.aif create mode 100644 sound/direct_sound_samples/cries/politoed.aif create mode 100644 sound/direct_sound_samples/cries/poliwag.aif create mode 100644 sound/direct_sound_samples/cries/poliwhirl.aif create mode 100644 sound/direct_sound_samples/cries/poliwrath.aif create mode 100644 sound/direct_sound_samples/cries/ponyta.aif create mode 100644 sound/direct_sound_samples/cries/poochyena.aif create mode 100644 sound/direct_sound_samples/cries/porygon.aif create mode 100644 sound/direct_sound_samples/cries/porygon2.aif create mode 100644 sound/direct_sound_samples/cries/primeape.aif create mode 100644 sound/direct_sound_samples/cries/psyduck.aif create mode 100644 sound/direct_sound_samples/cries/pupitar.aif create mode 100644 sound/direct_sound_samples/cries/quagsire.aif create mode 100644 sound/direct_sound_samples/cries/quilava.aif create mode 100644 sound/direct_sound_samples/cries/qwilfish.aif create mode 100644 sound/direct_sound_samples/cries/raichu.aif create mode 100644 sound/direct_sound_samples/cries/raikou.aif create mode 100644 sound/direct_sound_samples/cries/ralts.aif create mode 100644 sound/direct_sound_samples/cries/rapidash.aif create mode 100644 sound/direct_sound_samples/cries/raticate.aif create mode 100644 sound/direct_sound_samples/cries/rattata.aif create mode 100644 sound/direct_sound_samples/cries/rayquaza.aif create mode 100644 sound/direct_sound_samples/cries/regice.aif create mode 100644 sound/direct_sound_samples/cries/regirock.aif create mode 100644 sound/direct_sound_samples/cries/registeel.aif create mode 100644 sound/direct_sound_samples/cries/relicanth.aif create mode 100644 sound/direct_sound_samples/cries/remoraid.aif create mode 100644 sound/direct_sound_samples/cries/rhydon.aif create mode 100644 sound/direct_sound_samples/cries/rhyhorn.aif create mode 100644 sound/direct_sound_samples/cries/roselia.aif create mode 100644 sound/direct_sound_samples/cries/sableye.aif create mode 100644 sound/direct_sound_samples/cries/salamence.aif create mode 100644 sound/direct_sound_samples/cries/sandshrew.aif create mode 100644 sound/direct_sound_samples/cries/sandslash.aif create mode 100644 sound/direct_sound_samples/cries/sceptile.aif create mode 100644 sound/direct_sound_samples/cries/scizor.aif create mode 100644 sound/direct_sound_samples/cries/scyther.aif create mode 100644 sound/direct_sound_samples/cries/seadra.aif create mode 100644 sound/direct_sound_samples/cries/seaking.aif create mode 100644 sound/direct_sound_samples/cries/sealeo.aif create mode 100644 sound/direct_sound_samples/cries/seedot.aif create mode 100644 sound/direct_sound_samples/cries/seel.aif create mode 100644 sound/direct_sound_samples/cries/sentret.aif create mode 100644 sound/direct_sound_samples/cries/seviper.aif create mode 100644 sound/direct_sound_samples/cries/sharpedo.aif create mode 100644 sound/direct_sound_samples/cries/shedinja.aif create mode 100644 sound/direct_sound_samples/cries/shelgon.aif create mode 100644 sound/direct_sound_samples/cries/shellder.aif create mode 100644 sound/direct_sound_samples/cries/shiftry.aif create mode 100644 sound/direct_sound_samples/cries/shroomish.aif create mode 100644 sound/direct_sound_samples/cries/shuckle.aif create mode 100644 sound/direct_sound_samples/cries/shuppet.aif create mode 100644 sound/direct_sound_samples/cries/silcoon.aif create mode 100644 sound/direct_sound_samples/cries/skarmory.aif create mode 100644 sound/direct_sound_samples/cries/skiploom.aif create mode 100644 sound/direct_sound_samples/cries/skitty.aif create mode 100644 sound/direct_sound_samples/cries/slaking.aif create mode 100644 sound/direct_sound_samples/cries/slakoth.aif create mode 100644 sound/direct_sound_samples/cries/slowbro.aif create mode 100644 sound/direct_sound_samples/cries/slowking.aif create mode 100644 sound/direct_sound_samples/cries/slowpoke.aif create mode 100644 sound/direct_sound_samples/cries/slugma.aif create mode 100644 sound/direct_sound_samples/cries/smeargle.aif create mode 100644 sound/direct_sound_samples/cries/smoochum.aif create mode 100644 sound/direct_sound_samples/cries/sneasel.aif create mode 100644 sound/direct_sound_samples/cries/snorlax.aif create mode 100644 sound/direct_sound_samples/cries/snorunt.aif create mode 100644 sound/direct_sound_samples/cries/snubbull.aif create mode 100644 sound/direct_sound_samples/cries/solrock.aif create mode 100644 sound/direct_sound_samples/cries/spearow.aif create mode 100644 sound/direct_sound_samples/cries/spheal.aif create mode 100644 sound/direct_sound_samples/cries/spinarak.aif create mode 100644 sound/direct_sound_samples/cries/spinda.aif create mode 100644 sound/direct_sound_samples/cries/spoink.aif create mode 100644 sound/direct_sound_samples/cries/squirtle.aif create mode 100644 sound/direct_sound_samples/cries/stantler.aif create mode 100644 sound/direct_sound_samples/cries/starmie.aif create mode 100644 sound/direct_sound_samples/cries/staryu.aif create mode 100644 sound/direct_sound_samples/cries/steelix.aif create mode 100644 sound/direct_sound_samples/cries/sudowoodo.aif create mode 100644 sound/direct_sound_samples/cries/suicune.aif create mode 100644 sound/direct_sound_samples/cries/sunflora.aif create mode 100644 sound/direct_sound_samples/cries/sunkern.aif create mode 100644 sound/direct_sound_samples/cries/surskit.aif create mode 100644 sound/direct_sound_samples/cries/swablu.aif create mode 100644 sound/direct_sound_samples/cries/swalot.aif create mode 100644 sound/direct_sound_samples/cries/swampert.aif create mode 100644 sound/direct_sound_samples/cries/swellow.aif create mode 100644 sound/direct_sound_samples/cries/swinub.aif create mode 100644 sound/direct_sound_samples/cries/taillow.aif create mode 100644 sound/direct_sound_samples/cries/tangela.aif create mode 100644 sound/direct_sound_samples/cries/tauros.aif create mode 100644 sound/direct_sound_samples/cries/teddiursa.aif create mode 100644 sound/direct_sound_samples/cries/tentacool.aif create mode 100644 sound/direct_sound_samples/cries/tentacruel.aif create mode 100644 sound/direct_sound_samples/cries/togepi.aif create mode 100644 sound/direct_sound_samples/cries/togetic.aif create mode 100644 sound/direct_sound_samples/cries/torchic.aif create mode 100644 sound/direct_sound_samples/cries/torkoal.aif create mode 100644 sound/direct_sound_samples/cries/totodile.aif create mode 100644 sound/direct_sound_samples/cries/trapinch.aif create mode 100644 sound/direct_sound_samples/cries/treecko.aif create mode 100644 sound/direct_sound_samples/cries/tropius.aif create mode 100644 sound/direct_sound_samples/cries/typhlosion.aif create mode 100644 sound/direct_sound_samples/cries/tyranitar.aif create mode 100644 sound/direct_sound_samples/cries/tyrogue.aif create mode 100644 sound/direct_sound_samples/cries/umbreon.aif create mode 100644 sound/direct_sound_samples/cries/unown.aif create mode 100644 sound/direct_sound_samples/cries/unused_265.aif create mode 100644 sound/direct_sound_samples/cries/unused_268.aif create mode 100644 sound/direct_sound_samples/cries/ursaring.aif create mode 100644 sound/direct_sound_samples/cries/vaporeon.aif create mode 100644 sound/direct_sound_samples/cries/venomoth.aif create mode 100644 sound/direct_sound_samples/cries/venonat.aif create mode 100644 sound/direct_sound_samples/cries/venusaur.aif create mode 100644 sound/direct_sound_samples/cries/vibrava.aif create mode 100644 sound/direct_sound_samples/cries/victreebel.aif create mode 100644 sound/direct_sound_samples/cries/vigoroth.aif create mode 100644 sound/direct_sound_samples/cries/vileplume.aif create mode 100644 sound/direct_sound_samples/cries/volbeat.aif create mode 100644 sound/direct_sound_samples/cries/voltorb.aif create mode 100644 sound/direct_sound_samples/cries/vulpix.aif create mode 100644 sound/direct_sound_samples/cries/wailmer.aif create mode 100644 sound/direct_sound_samples/cries/wailord.aif create mode 100644 sound/direct_sound_samples/cries/walrein.aif create mode 100644 sound/direct_sound_samples/cries/wartortle.aif create mode 100644 sound/direct_sound_samples/cries/weedle.aif create mode 100644 sound/direct_sound_samples/cries/weepinbell.aif create mode 100644 sound/direct_sound_samples/cries/weezing.aif create mode 100644 sound/direct_sound_samples/cries/whiscash.aif create mode 100644 sound/direct_sound_samples/cries/whismur.aif create mode 100644 sound/direct_sound_samples/cries/wigglytuff.aif create mode 100644 sound/direct_sound_samples/cries/wingull.aif create mode 100644 sound/direct_sound_samples/cries/wobbuffet.aif create mode 100644 sound/direct_sound_samples/cries/wooper.aif create mode 100644 sound/direct_sound_samples/cries/wurmple.aif create mode 100644 sound/direct_sound_samples/cries/wynaut.aif create mode 100644 sound/direct_sound_samples/cries/xatu.aif create mode 100644 sound/direct_sound_samples/cries/yanma.aif create mode 100644 sound/direct_sound_samples/cries/zangoose.aif create mode 100644 sound/direct_sound_samples/cries/zapdos.aif create mode 100644 sound/direct_sound_samples/cries/zigzagoon.aif create mode 100644 sound/direct_sound_samples/cries/zubat.aif delete mode 100644 sound/direct_sound_samples/cry_abra.aif delete mode 100644 sound/direct_sound_samples/cry_absol.aif delete mode 100644 sound/direct_sound_samples/cry_aerodactyl.aif delete mode 100644 sound/direct_sound_samples/cry_aggron.aif delete mode 100644 sound/direct_sound_samples/cry_aipom.aif delete mode 100644 sound/direct_sound_samples/cry_alakazam.aif delete mode 100644 sound/direct_sound_samples/cry_altaria.aif delete mode 100644 sound/direct_sound_samples/cry_ampharos.aif delete mode 100644 sound/direct_sound_samples/cry_anorith.aif delete mode 100644 sound/direct_sound_samples/cry_arbok.aif delete mode 100644 sound/direct_sound_samples/cry_arcanine.aif delete mode 100644 sound/direct_sound_samples/cry_ariados.aif delete mode 100644 sound/direct_sound_samples/cry_armaldo.aif delete mode 100644 sound/direct_sound_samples/cry_aron.aif delete mode 100644 sound/direct_sound_samples/cry_articuno.aif delete mode 100644 sound/direct_sound_samples/cry_azumarill.aif delete mode 100644 sound/direct_sound_samples/cry_azurill.aif delete mode 100644 sound/direct_sound_samples/cry_bagon.aif delete mode 100644 sound/direct_sound_samples/cry_baltoy.aif delete mode 100644 sound/direct_sound_samples/cry_banette.aif delete mode 100644 sound/direct_sound_samples/cry_barboach.aif delete mode 100644 sound/direct_sound_samples/cry_bayleef.aif delete mode 100644 sound/direct_sound_samples/cry_beautifly.aif delete mode 100644 sound/direct_sound_samples/cry_beedrill.aif delete mode 100644 sound/direct_sound_samples/cry_beldum.aif delete mode 100644 sound/direct_sound_samples/cry_bellossom.aif delete mode 100644 sound/direct_sound_samples/cry_bellsprout.aif delete mode 100644 sound/direct_sound_samples/cry_blastoise.aif delete mode 100644 sound/direct_sound_samples/cry_blaziken.aif delete mode 100644 sound/direct_sound_samples/cry_blissey.aif delete mode 100644 sound/direct_sound_samples/cry_breloom.aif delete mode 100644 sound/direct_sound_samples/cry_bulbasaur.aif delete mode 100644 sound/direct_sound_samples/cry_butterfree.aif delete mode 100644 sound/direct_sound_samples/cry_cacnea.aif delete mode 100644 sound/direct_sound_samples/cry_cacturne.aif delete mode 100644 sound/direct_sound_samples/cry_camerupt.aif delete mode 100644 sound/direct_sound_samples/cry_carvanha.aif delete mode 100644 sound/direct_sound_samples/cry_cascoon.aif delete mode 100644 sound/direct_sound_samples/cry_castform.aif delete mode 100644 sound/direct_sound_samples/cry_caterpie.aif delete mode 100644 sound/direct_sound_samples/cry_celebi.aif delete mode 100644 sound/direct_sound_samples/cry_chansey.aif delete mode 100644 sound/direct_sound_samples/cry_charizard.aif delete mode 100644 sound/direct_sound_samples/cry_charmander.aif delete mode 100644 sound/direct_sound_samples/cry_charmeleon.aif delete mode 100644 sound/direct_sound_samples/cry_chikorita.aif delete mode 100644 sound/direct_sound_samples/cry_chimecho.aif delete mode 100644 sound/direct_sound_samples/cry_chinchou.aif delete mode 100644 sound/direct_sound_samples/cry_clamperl.aif delete mode 100644 sound/direct_sound_samples/cry_claydol.aif delete mode 100644 sound/direct_sound_samples/cry_clefable.aif delete mode 100644 sound/direct_sound_samples/cry_clefairy.aif delete mode 100644 sound/direct_sound_samples/cry_cleffa.aif delete mode 100644 sound/direct_sound_samples/cry_cloyster.aif delete mode 100644 sound/direct_sound_samples/cry_combusken.aif delete mode 100644 sound/direct_sound_samples/cry_corphish.aif delete mode 100644 sound/direct_sound_samples/cry_corsola.aif delete mode 100644 sound/direct_sound_samples/cry_cradily.aif delete mode 100644 sound/direct_sound_samples/cry_crawdaunt.aif delete mode 100644 sound/direct_sound_samples/cry_crobat.aif delete mode 100644 sound/direct_sound_samples/cry_croconaw.aif delete mode 100644 sound/direct_sound_samples/cry_cubone.aif delete mode 100644 sound/direct_sound_samples/cry_cyndaquil.aif delete mode 100644 sound/direct_sound_samples/cry_delcatty.aif delete mode 100644 sound/direct_sound_samples/cry_delibird.aif delete mode 100644 sound/direct_sound_samples/cry_deoxys.aif delete mode 100644 sound/direct_sound_samples/cry_dewgong.aif delete mode 100644 sound/direct_sound_samples/cry_diglett.aif delete mode 100644 sound/direct_sound_samples/cry_ditto.aif delete mode 100644 sound/direct_sound_samples/cry_dodrio.aif delete mode 100644 sound/direct_sound_samples/cry_doduo.aif delete mode 100644 sound/direct_sound_samples/cry_donphan.aif delete mode 100644 sound/direct_sound_samples/cry_dragonair.aif delete mode 100644 sound/direct_sound_samples/cry_dragonite.aif delete mode 100644 sound/direct_sound_samples/cry_dratini.aif delete mode 100644 sound/direct_sound_samples/cry_drowzee.aif delete mode 100644 sound/direct_sound_samples/cry_dugtrio.aif delete mode 100644 sound/direct_sound_samples/cry_dunsparce.aif delete mode 100644 sound/direct_sound_samples/cry_dusclops.aif delete mode 100644 sound/direct_sound_samples/cry_duskull.aif delete mode 100644 sound/direct_sound_samples/cry_dustox.aif delete mode 100644 sound/direct_sound_samples/cry_eevee.aif delete mode 100644 sound/direct_sound_samples/cry_ekans.aif delete mode 100644 sound/direct_sound_samples/cry_electabuzz.aif delete mode 100644 sound/direct_sound_samples/cry_electrike.aif delete mode 100644 sound/direct_sound_samples/cry_electrode.aif delete mode 100644 sound/direct_sound_samples/cry_elekid.aif delete mode 100644 sound/direct_sound_samples/cry_entei.aif delete mode 100644 sound/direct_sound_samples/cry_espeon.aif delete mode 100644 sound/direct_sound_samples/cry_exeggcute.aif delete mode 100644 sound/direct_sound_samples/cry_exeggutor.aif delete mode 100644 sound/direct_sound_samples/cry_exploud.aif delete mode 100644 sound/direct_sound_samples/cry_farfetchd.aif delete mode 100644 sound/direct_sound_samples/cry_fearow.aif delete mode 100644 sound/direct_sound_samples/cry_feebas.aif delete mode 100644 sound/direct_sound_samples/cry_feraligatr.aif delete mode 100644 sound/direct_sound_samples/cry_flaaffy.aif delete mode 100644 sound/direct_sound_samples/cry_flareon.aif delete mode 100644 sound/direct_sound_samples/cry_flygon.aif delete mode 100644 sound/direct_sound_samples/cry_forretress.aif delete mode 100644 sound/direct_sound_samples/cry_furret.aif delete mode 100644 sound/direct_sound_samples/cry_gardevoir.aif delete mode 100644 sound/direct_sound_samples/cry_gastly.aif delete mode 100644 sound/direct_sound_samples/cry_gengar.aif delete mode 100644 sound/direct_sound_samples/cry_geodude.aif delete mode 100644 sound/direct_sound_samples/cry_girafarig.aif delete mode 100644 sound/direct_sound_samples/cry_glalie.aif delete mode 100644 sound/direct_sound_samples/cry_gligar.aif delete mode 100644 sound/direct_sound_samples/cry_gloom.aif delete mode 100644 sound/direct_sound_samples/cry_golbat.aif delete mode 100644 sound/direct_sound_samples/cry_goldeen.aif delete mode 100644 sound/direct_sound_samples/cry_golduck.aif delete mode 100644 sound/direct_sound_samples/cry_golem.aif delete mode 100644 sound/direct_sound_samples/cry_gorebyss.aif delete mode 100644 sound/direct_sound_samples/cry_granbull.aif delete mode 100644 sound/direct_sound_samples/cry_graveler.aif delete mode 100644 sound/direct_sound_samples/cry_grimer.aif delete mode 100644 sound/direct_sound_samples/cry_groudon.aif delete mode 100644 sound/direct_sound_samples/cry_grovyle.aif delete mode 100644 sound/direct_sound_samples/cry_growlithe.aif delete mode 100644 sound/direct_sound_samples/cry_grumpig.aif delete mode 100644 sound/direct_sound_samples/cry_gulpin.aif delete mode 100644 sound/direct_sound_samples/cry_gyarados.aif delete mode 100644 sound/direct_sound_samples/cry_hariyama.aif delete mode 100644 sound/direct_sound_samples/cry_haunter.aif delete mode 100644 sound/direct_sound_samples/cry_heracross.aif delete mode 100644 sound/direct_sound_samples/cry_hitmonchan.aif delete mode 100644 sound/direct_sound_samples/cry_hitmonlee.aif delete mode 100644 sound/direct_sound_samples/cry_hitmontop.aif delete mode 100644 sound/direct_sound_samples/cry_ho_oh.aif delete mode 100644 sound/direct_sound_samples/cry_hoothoot.aif delete mode 100644 sound/direct_sound_samples/cry_hoppip.aif delete mode 100644 sound/direct_sound_samples/cry_horsea.aif delete mode 100644 sound/direct_sound_samples/cry_houndoom.aif delete mode 100644 sound/direct_sound_samples/cry_houndour.aif delete mode 100644 sound/direct_sound_samples/cry_huntail.aif delete mode 100644 sound/direct_sound_samples/cry_hypno.aif delete mode 100644 sound/direct_sound_samples/cry_igglybuff.aif delete mode 100644 sound/direct_sound_samples/cry_illumise.aif delete mode 100644 sound/direct_sound_samples/cry_ivysaur.aif delete mode 100644 sound/direct_sound_samples/cry_jigglypuff.aif delete mode 100644 sound/direct_sound_samples/cry_jirachi.aif delete mode 100644 sound/direct_sound_samples/cry_jolteon.aif delete mode 100644 sound/direct_sound_samples/cry_jumpluff.aif delete mode 100644 sound/direct_sound_samples/cry_jynx.aif delete mode 100644 sound/direct_sound_samples/cry_kabuto.aif delete mode 100644 sound/direct_sound_samples/cry_kabutops.aif delete mode 100644 sound/direct_sound_samples/cry_kadabra.aif delete mode 100644 sound/direct_sound_samples/cry_kakuna.aif delete mode 100644 sound/direct_sound_samples/cry_kangaskhan.aif delete mode 100644 sound/direct_sound_samples/cry_kecleon.aif delete mode 100644 sound/direct_sound_samples/cry_kingdra.aif delete mode 100644 sound/direct_sound_samples/cry_kingler.aif delete mode 100644 sound/direct_sound_samples/cry_kirlia.aif delete mode 100644 sound/direct_sound_samples/cry_koffing.aif delete mode 100644 sound/direct_sound_samples/cry_krabby.aif delete mode 100644 sound/direct_sound_samples/cry_kyogre.aif delete mode 100644 sound/direct_sound_samples/cry_lairon.aif delete mode 100644 sound/direct_sound_samples/cry_lanturn.aif delete mode 100644 sound/direct_sound_samples/cry_lapras.aif delete mode 100644 sound/direct_sound_samples/cry_larvitar.aif delete mode 100644 sound/direct_sound_samples/cry_latias.aif delete mode 100644 sound/direct_sound_samples/cry_latios.aif delete mode 100644 sound/direct_sound_samples/cry_ledian.aif delete mode 100644 sound/direct_sound_samples/cry_ledyba.aif delete mode 100644 sound/direct_sound_samples/cry_lickitung.aif delete mode 100644 sound/direct_sound_samples/cry_lileep.aif delete mode 100644 sound/direct_sound_samples/cry_linoone.aif delete mode 100644 sound/direct_sound_samples/cry_lombre.aif delete mode 100644 sound/direct_sound_samples/cry_lotad.aif delete mode 100644 sound/direct_sound_samples/cry_loudred.aif delete mode 100644 sound/direct_sound_samples/cry_ludicolo.aif delete mode 100644 sound/direct_sound_samples/cry_lugia.aif delete mode 100644 sound/direct_sound_samples/cry_lunatone.aif delete mode 100644 sound/direct_sound_samples/cry_luvdisc.aif delete mode 100644 sound/direct_sound_samples/cry_machamp.aif delete mode 100644 sound/direct_sound_samples/cry_machoke.aif delete mode 100644 sound/direct_sound_samples/cry_machop.aif delete mode 100644 sound/direct_sound_samples/cry_magby.aif delete mode 100644 sound/direct_sound_samples/cry_magcargo.aif delete mode 100644 sound/direct_sound_samples/cry_magikarp.aif delete mode 100644 sound/direct_sound_samples/cry_magmar.aif delete mode 100644 sound/direct_sound_samples/cry_magnemite.aif delete mode 100644 sound/direct_sound_samples/cry_magneton.aif delete mode 100644 sound/direct_sound_samples/cry_makuhita.aif delete mode 100644 sound/direct_sound_samples/cry_manectric.aif delete mode 100644 sound/direct_sound_samples/cry_mankey.aif delete mode 100644 sound/direct_sound_samples/cry_mantine.aif delete mode 100644 sound/direct_sound_samples/cry_mareep.aif delete mode 100644 sound/direct_sound_samples/cry_marill.aif delete mode 100644 sound/direct_sound_samples/cry_marowak.aif delete mode 100644 sound/direct_sound_samples/cry_marshtomp.aif delete mode 100644 sound/direct_sound_samples/cry_masquerain.aif delete mode 100644 sound/direct_sound_samples/cry_mawile.aif delete mode 100644 sound/direct_sound_samples/cry_medicham.aif delete mode 100644 sound/direct_sound_samples/cry_meditite.aif delete mode 100644 sound/direct_sound_samples/cry_meganium.aif delete mode 100644 sound/direct_sound_samples/cry_meowth.aif delete mode 100644 sound/direct_sound_samples/cry_metagross.aif delete mode 100644 sound/direct_sound_samples/cry_metang.aif delete mode 100644 sound/direct_sound_samples/cry_metapod.aif delete mode 100644 sound/direct_sound_samples/cry_mew.aif delete mode 100644 sound/direct_sound_samples/cry_mewtwo.aif delete mode 100644 sound/direct_sound_samples/cry_mightyena.aif delete mode 100644 sound/direct_sound_samples/cry_milotic.aif delete mode 100644 sound/direct_sound_samples/cry_miltank.aif delete mode 100644 sound/direct_sound_samples/cry_minun.aif delete mode 100644 sound/direct_sound_samples/cry_misdreavus.aif delete mode 100644 sound/direct_sound_samples/cry_moltres.aif delete mode 100644 sound/direct_sound_samples/cry_mr_mime.aif delete mode 100644 sound/direct_sound_samples/cry_mudkip.aif delete mode 100644 sound/direct_sound_samples/cry_muk.aif delete mode 100644 sound/direct_sound_samples/cry_murkrow.aif delete mode 100644 sound/direct_sound_samples/cry_natu.aif delete mode 100644 sound/direct_sound_samples/cry_nidoking.aif delete mode 100644 sound/direct_sound_samples/cry_nidoqueen.aif delete mode 100644 sound/direct_sound_samples/cry_nidoran_f.aif delete mode 100644 sound/direct_sound_samples/cry_nidoran_m.aif delete mode 100644 sound/direct_sound_samples/cry_nidorina.aif delete mode 100644 sound/direct_sound_samples/cry_nidorino.aif delete mode 100644 sound/direct_sound_samples/cry_nincada.aif delete mode 100644 sound/direct_sound_samples/cry_ninetales.aif delete mode 100644 sound/direct_sound_samples/cry_ninjask.aif delete mode 100644 sound/direct_sound_samples/cry_noctowl.aif delete mode 100644 sound/direct_sound_samples/cry_nosepass.aif delete mode 100644 sound/direct_sound_samples/cry_numel.aif delete mode 100644 sound/direct_sound_samples/cry_nuzleaf.aif delete mode 100644 sound/direct_sound_samples/cry_octillery.aif delete mode 100644 sound/direct_sound_samples/cry_oddish.aif delete mode 100644 sound/direct_sound_samples/cry_omanyte.aif delete mode 100644 sound/direct_sound_samples/cry_omastar.aif delete mode 100644 sound/direct_sound_samples/cry_onix.aif delete mode 100644 sound/direct_sound_samples/cry_paras.aif delete mode 100644 sound/direct_sound_samples/cry_parasect.aif delete mode 100644 sound/direct_sound_samples/cry_pelipper.aif delete mode 100644 sound/direct_sound_samples/cry_persian.aif delete mode 100644 sound/direct_sound_samples/cry_phanpy.aif delete mode 100644 sound/direct_sound_samples/cry_pichu.aif delete mode 100644 sound/direct_sound_samples/cry_pidgeot.aif delete mode 100644 sound/direct_sound_samples/cry_pidgeotto.aif delete mode 100644 sound/direct_sound_samples/cry_pidgey.aif delete mode 100644 sound/direct_sound_samples/cry_pikachu.aif delete mode 100644 sound/direct_sound_samples/cry_piloswine.aif delete mode 100644 sound/direct_sound_samples/cry_pineco.aif delete mode 100644 sound/direct_sound_samples/cry_pinsir.aif delete mode 100644 sound/direct_sound_samples/cry_plusle.aif delete mode 100644 sound/direct_sound_samples/cry_politoed.aif delete mode 100644 sound/direct_sound_samples/cry_poliwag.aif delete mode 100644 sound/direct_sound_samples/cry_poliwhirl.aif delete mode 100644 sound/direct_sound_samples/cry_poliwrath.aif delete mode 100644 sound/direct_sound_samples/cry_ponyta.aif delete mode 100644 sound/direct_sound_samples/cry_poochyena.aif delete mode 100644 sound/direct_sound_samples/cry_porygon.aif delete mode 100644 sound/direct_sound_samples/cry_porygon2.aif delete mode 100644 sound/direct_sound_samples/cry_primeape.aif delete mode 100644 sound/direct_sound_samples/cry_psyduck.aif delete mode 100644 sound/direct_sound_samples/cry_pupitar.aif delete mode 100644 sound/direct_sound_samples/cry_quagsire.aif delete mode 100644 sound/direct_sound_samples/cry_quilava.aif delete mode 100644 sound/direct_sound_samples/cry_qwilfish.aif delete mode 100644 sound/direct_sound_samples/cry_raichu.aif delete mode 100644 sound/direct_sound_samples/cry_raikou.aif delete mode 100644 sound/direct_sound_samples/cry_ralts.aif delete mode 100644 sound/direct_sound_samples/cry_rapidash.aif delete mode 100644 sound/direct_sound_samples/cry_raticate.aif delete mode 100644 sound/direct_sound_samples/cry_rattata.aif delete mode 100644 sound/direct_sound_samples/cry_rayquaza.aif delete mode 100644 sound/direct_sound_samples/cry_regice.aif delete mode 100644 sound/direct_sound_samples/cry_regirock.aif delete mode 100644 sound/direct_sound_samples/cry_registeel.aif delete mode 100644 sound/direct_sound_samples/cry_relicanth.aif delete mode 100644 sound/direct_sound_samples/cry_remoraid.aif delete mode 100644 sound/direct_sound_samples/cry_rhydon.aif delete mode 100644 sound/direct_sound_samples/cry_rhyhorn.aif delete mode 100644 sound/direct_sound_samples/cry_roselia.aif delete mode 100644 sound/direct_sound_samples/cry_sableye.aif delete mode 100644 sound/direct_sound_samples/cry_salamence.aif delete mode 100644 sound/direct_sound_samples/cry_sandshrew.aif delete mode 100644 sound/direct_sound_samples/cry_sandslash.aif delete mode 100644 sound/direct_sound_samples/cry_sceptile.aif delete mode 100644 sound/direct_sound_samples/cry_scizor.aif delete mode 100644 sound/direct_sound_samples/cry_scyther.aif delete mode 100644 sound/direct_sound_samples/cry_seadra.aif delete mode 100644 sound/direct_sound_samples/cry_seaking.aif delete mode 100644 sound/direct_sound_samples/cry_sealeo.aif delete mode 100644 sound/direct_sound_samples/cry_seedot.aif delete mode 100644 sound/direct_sound_samples/cry_seel.aif delete mode 100644 sound/direct_sound_samples/cry_sentret.aif delete mode 100644 sound/direct_sound_samples/cry_seviper.aif delete mode 100644 sound/direct_sound_samples/cry_sharpedo.aif delete mode 100644 sound/direct_sound_samples/cry_shedinja.aif delete mode 100644 sound/direct_sound_samples/cry_shelgon.aif delete mode 100644 sound/direct_sound_samples/cry_shellder.aif delete mode 100644 sound/direct_sound_samples/cry_shiftry.aif delete mode 100644 sound/direct_sound_samples/cry_shroomish.aif delete mode 100644 sound/direct_sound_samples/cry_shuckle.aif delete mode 100644 sound/direct_sound_samples/cry_shuppet.aif delete mode 100644 sound/direct_sound_samples/cry_silcoon.aif delete mode 100644 sound/direct_sound_samples/cry_skarmory.aif delete mode 100644 sound/direct_sound_samples/cry_skiploom.aif delete mode 100644 sound/direct_sound_samples/cry_skitty.aif delete mode 100644 sound/direct_sound_samples/cry_slaking.aif delete mode 100644 sound/direct_sound_samples/cry_slakoth.aif delete mode 100644 sound/direct_sound_samples/cry_slowbro.aif delete mode 100644 sound/direct_sound_samples/cry_slowking.aif delete mode 100644 sound/direct_sound_samples/cry_slowpoke.aif delete mode 100644 sound/direct_sound_samples/cry_slugma.aif delete mode 100644 sound/direct_sound_samples/cry_smeargle.aif delete mode 100644 sound/direct_sound_samples/cry_smoochum.aif delete mode 100644 sound/direct_sound_samples/cry_sneasel.aif delete mode 100644 sound/direct_sound_samples/cry_snorlax.aif delete mode 100644 sound/direct_sound_samples/cry_snorunt.aif delete mode 100644 sound/direct_sound_samples/cry_snubbull.aif delete mode 100644 sound/direct_sound_samples/cry_solrock.aif delete mode 100644 sound/direct_sound_samples/cry_spearow.aif delete mode 100644 sound/direct_sound_samples/cry_spheal.aif delete mode 100644 sound/direct_sound_samples/cry_spinarak.aif delete mode 100644 sound/direct_sound_samples/cry_spinda.aif delete mode 100644 sound/direct_sound_samples/cry_spoink.aif delete mode 100644 sound/direct_sound_samples/cry_squirtle.aif delete mode 100644 sound/direct_sound_samples/cry_stantler.aif delete mode 100644 sound/direct_sound_samples/cry_starmie.aif delete mode 100644 sound/direct_sound_samples/cry_staryu.aif delete mode 100644 sound/direct_sound_samples/cry_steelix.aif delete mode 100644 sound/direct_sound_samples/cry_sudowoodo.aif delete mode 100644 sound/direct_sound_samples/cry_suicune.aif delete mode 100644 sound/direct_sound_samples/cry_sunflora.aif delete mode 100644 sound/direct_sound_samples/cry_sunkern.aif delete mode 100644 sound/direct_sound_samples/cry_surskit.aif delete mode 100644 sound/direct_sound_samples/cry_swablu.aif delete mode 100644 sound/direct_sound_samples/cry_swalot.aif delete mode 100644 sound/direct_sound_samples/cry_swampert.aif delete mode 100644 sound/direct_sound_samples/cry_swellow.aif delete mode 100644 sound/direct_sound_samples/cry_swinub.aif delete mode 100644 sound/direct_sound_samples/cry_taillow.aif delete mode 100644 sound/direct_sound_samples/cry_tangela.aif delete mode 100644 sound/direct_sound_samples/cry_tauros.aif delete mode 100644 sound/direct_sound_samples/cry_teddiursa.aif delete mode 100644 sound/direct_sound_samples/cry_tentacool.aif delete mode 100644 sound/direct_sound_samples/cry_tentacruel.aif delete mode 100644 sound/direct_sound_samples/cry_togepi.aif delete mode 100644 sound/direct_sound_samples/cry_togetic.aif delete mode 100644 sound/direct_sound_samples/cry_torchic.aif delete mode 100644 sound/direct_sound_samples/cry_torkoal.aif delete mode 100644 sound/direct_sound_samples/cry_totodile.aif delete mode 100644 sound/direct_sound_samples/cry_trapinch.aif delete mode 100644 sound/direct_sound_samples/cry_treecko.aif delete mode 100644 sound/direct_sound_samples/cry_tropius.aif delete mode 100644 sound/direct_sound_samples/cry_typhlosion.aif delete mode 100644 sound/direct_sound_samples/cry_tyranitar.aif delete mode 100644 sound/direct_sound_samples/cry_tyrogue.aif delete mode 100644 sound/direct_sound_samples/cry_umbreon.aif delete mode 100644 sound/direct_sound_samples/cry_unown.aif delete mode 100644 sound/direct_sound_samples/cry_unused_265.aif delete mode 100644 sound/direct_sound_samples/cry_unused_268.aif delete mode 100644 sound/direct_sound_samples/cry_ursaring.aif delete mode 100644 sound/direct_sound_samples/cry_vaporeon.aif delete mode 100644 sound/direct_sound_samples/cry_venomoth.aif delete mode 100644 sound/direct_sound_samples/cry_venonat.aif delete mode 100644 sound/direct_sound_samples/cry_venusaur.aif delete mode 100644 sound/direct_sound_samples/cry_vibrava.aif delete mode 100644 sound/direct_sound_samples/cry_victreebel.aif delete mode 100644 sound/direct_sound_samples/cry_vigoroth.aif delete mode 100644 sound/direct_sound_samples/cry_vileplume.aif delete mode 100644 sound/direct_sound_samples/cry_volbeat.aif delete mode 100644 sound/direct_sound_samples/cry_voltorb.aif delete mode 100644 sound/direct_sound_samples/cry_vulpix.aif delete mode 100644 sound/direct_sound_samples/cry_wailmer.aif delete mode 100644 sound/direct_sound_samples/cry_wailord.aif delete mode 100644 sound/direct_sound_samples/cry_walrein.aif delete mode 100644 sound/direct_sound_samples/cry_wartortle.aif delete mode 100644 sound/direct_sound_samples/cry_weedle.aif delete mode 100644 sound/direct_sound_samples/cry_weepinbell.aif delete mode 100644 sound/direct_sound_samples/cry_weezing.aif delete mode 100644 sound/direct_sound_samples/cry_whiscash.aif delete mode 100644 sound/direct_sound_samples/cry_whismur.aif delete mode 100644 sound/direct_sound_samples/cry_wigglytuff.aif delete mode 100644 sound/direct_sound_samples/cry_wingull.aif delete mode 100644 sound/direct_sound_samples/cry_wobbuffet.aif delete mode 100644 sound/direct_sound_samples/cry_wooper.aif delete mode 100644 sound/direct_sound_samples/cry_wurmple.aif delete mode 100644 sound/direct_sound_samples/cry_wynaut.aif delete mode 100644 sound/direct_sound_samples/cry_xatu.aif delete mode 100644 sound/direct_sound_samples/cry_yanma.aif delete mode 100644 sound/direct_sound_samples/cry_zangoose.aif delete mode 100644 sound/direct_sound_samples/cry_zapdos.aif delete mode 100644 sound/direct_sound_samples/cry_zigzagoon.aif delete mode 100644 sound/direct_sound_samples/cry_zubat.aif diff --git a/Makefile b/Makefile index 27d77754c..245c6c6f1 100644 --- a/Makefile +++ b/Makefile @@ -49,6 +49,8 @@ DATA_SRC_SUBDIR = src/data DATA_ASM_SUBDIR = data SONG_SUBDIR = sound/songs MID_SUBDIR = sound/songs/midi +SAMPLE_SUBDIR = sound/direct_sound_samples +CRY_SUBDIR = sound/direct_sound_samples/cries C_BUILDDIR = $(OBJ_DIR)/$(C_SUBDIR) GFLIB_BUILDDIR = $(OBJ_DIR)/$(GFLIB_SUBDIR) @@ -173,7 +175,8 @@ clean-tools: @$(foreach tooldir,$(TOOLDIRS),$(MAKE) clean -C $(tooldir);) mostlyclean: tidy - rm -f sound/direct_sound_samples/*.bin + rm -f $(SAMPLE_SUBDIR)/*.bin + rm -f $(CRY_SUBDIR)/*.bin rm -f $(MID_SUBDIR)/*.s find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' -o -iname '*.latfont' -o -iname '*.hwjpnfont' -o -iname '*.fwjpnfont' \) -exec rm {} + rm -f $(DATA_ASM_SUBDIR)/layouts/layouts.inc $(DATA_ASM_SUBDIR)/layouts/layouts_table.inc @@ -212,7 +215,7 @@ include songs.mk %.gbapal: %.png ; $(GFX) $< $@ %.lz: % ; $(GFX) $< $@ %.rl: % ; $(GFX) $< $@ -sound/direct_sound_samples/cry_%.bin: sound/direct_sound_samples/cry_%.aif ; $(AIF) $< $@ --compress +$(CRY_SUBDIR)/%.bin: $(CRY_SUBDIR)/%.aif ; $(AIF) $< $@ --compress sound/%.bin: sound/%.aif ; $(AIF) $< $@ diff --git a/sound/direct_sound_data.inc b/sound/direct_sound_data.inc index 80f91a01d..4a3a3b6d3 100644 --- a/sound/direct_sound_data.inc +++ b/sound/direct_sound_data.inc @@ -388,1555 +388,1555 @@ DirectSoundWaveData_8745A7C:: .align 2 Cry_Bulbasaur:: - .incbin "sound/direct_sound_samples/cry_bulbasaur.bin" + .incbin "sound/direct_sound_samples/cries/bulbasaur.bin" .align 2 Cry_Ivysaur:: - .incbin "sound/direct_sound_samples/cry_ivysaur.bin" + .incbin "sound/direct_sound_samples/cries/ivysaur.bin" .align 2 Cry_Venusaur:: - .incbin "sound/direct_sound_samples/cry_venusaur.bin" + .incbin "sound/direct_sound_samples/cries/venusaur.bin" .align 2 Cry_Charmander:: - .incbin "sound/direct_sound_samples/cry_charmander.bin" + .incbin "sound/direct_sound_samples/cries/charmander.bin" .align 2 Cry_Charmeleon:: - .incbin "sound/direct_sound_samples/cry_charmeleon.bin" + .incbin "sound/direct_sound_samples/cries/charmeleon.bin" .align 2 Cry_Charizard:: - .incbin "sound/direct_sound_samples/cry_charizard.bin" + .incbin "sound/direct_sound_samples/cries/charizard.bin" .align 2 Cry_Squirtle:: - .incbin "sound/direct_sound_samples/cry_squirtle.bin" + .incbin "sound/direct_sound_samples/cries/squirtle.bin" .align 2 Cry_Wartortle:: - .incbin "sound/direct_sound_samples/cry_wartortle.bin" + .incbin "sound/direct_sound_samples/cries/wartortle.bin" .align 2 Cry_Blastoise:: - .incbin "sound/direct_sound_samples/cry_blastoise.bin" + .incbin "sound/direct_sound_samples/cries/blastoise.bin" .align 2 Cry_Caterpie:: - .incbin "sound/direct_sound_samples/cry_caterpie.bin" + .incbin "sound/direct_sound_samples/cries/caterpie.bin" .align 2 Cry_Metapod:: - .incbin "sound/direct_sound_samples/cry_metapod.bin" + .incbin "sound/direct_sound_samples/cries/metapod.bin" .align 2 Cry_Butterfree:: - .incbin "sound/direct_sound_samples/cry_butterfree.bin" + .incbin "sound/direct_sound_samples/cries/butterfree.bin" .align 2 Cry_Weedle:: - .incbin "sound/direct_sound_samples/cry_weedle.bin" + .incbin "sound/direct_sound_samples/cries/weedle.bin" .align 2 Cry_Kakuna:: - .incbin "sound/direct_sound_samples/cry_kakuna.bin" + .incbin "sound/direct_sound_samples/cries/kakuna.bin" .align 2 Cry_Beedrill:: - .incbin "sound/direct_sound_samples/cry_beedrill.bin" + .incbin "sound/direct_sound_samples/cries/beedrill.bin" .align 2 Cry_Pidgey:: - .incbin "sound/direct_sound_samples/cry_pidgey.bin" + .incbin "sound/direct_sound_samples/cries/pidgey.bin" .align 2 Cry_Pidgeotto:: - .incbin "sound/direct_sound_samples/cry_pidgeotto.bin" + .incbin "sound/direct_sound_samples/cries/pidgeotto.bin" .align 2 Cry_Pidgeot:: - .incbin "sound/direct_sound_samples/cry_pidgeot.bin" + .incbin "sound/direct_sound_samples/cries/pidgeot.bin" .align 2 Cry_Rattata:: - .incbin "sound/direct_sound_samples/cry_rattata.bin" + .incbin "sound/direct_sound_samples/cries/rattata.bin" .align 2 Cry_Raticate:: - .incbin "sound/direct_sound_samples/cry_raticate.bin" + .incbin "sound/direct_sound_samples/cries/raticate.bin" .align 2 Cry_Spearow:: - .incbin "sound/direct_sound_samples/cry_spearow.bin" + .incbin "sound/direct_sound_samples/cries/spearow.bin" .align 2 Cry_Fearow:: - .incbin "sound/direct_sound_samples/cry_fearow.bin" + .incbin "sound/direct_sound_samples/cries/fearow.bin" .align 2 Cry_Ekans:: - .incbin "sound/direct_sound_samples/cry_ekans.bin" + .incbin "sound/direct_sound_samples/cries/ekans.bin" .align 2 Cry_Arbok:: - .incbin "sound/direct_sound_samples/cry_arbok.bin" + .incbin "sound/direct_sound_samples/cries/arbok.bin" .align 2 Cry_Pikachu:: - .incbin "sound/direct_sound_samples/cry_pikachu.bin" + .incbin "sound/direct_sound_samples/cries/pikachu.bin" .align 2 Cry_Raichu:: - .incbin "sound/direct_sound_samples/cry_raichu.bin" + .incbin "sound/direct_sound_samples/cries/raichu.bin" .align 2 Cry_Sandshrew:: - .incbin "sound/direct_sound_samples/cry_sandshrew.bin" + .incbin "sound/direct_sound_samples/cries/sandshrew.bin" .align 2 Cry_Sandslash:: - .incbin "sound/direct_sound_samples/cry_sandslash.bin" + .incbin "sound/direct_sound_samples/cries/sandslash.bin" .align 2 Cry_NidoranF:: - .incbin "sound/direct_sound_samples/cry_nidoran_f.bin" + .incbin "sound/direct_sound_samples/cries/nidoran_f.bin" .align 2 Cry_Nidorina:: - .incbin "sound/direct_sound_samples/cry_nidorina.bin" + .incbin "sound/direct_sound_samples/cries/nidorina.bin" .align 2 Cry_Nidoqueen:: - .incbin "sound/direct_sound_samples/cry_nidoqueen.bin" + .incbin "sound/direct_sound_samples/cries/nidoqueen.bin" .align 2 Cry_NidoranM:: - .incbin "sound/direct_sound_samples/cry_nidoran_m.bin" + .incbin "sound/direct_sound_samples/cries/nidoran_m.bin" .align 2 Cry_Nidorino:: - .incbin "sound/direct_sound_samples/cry_nidorino.bin" + .incbin "sound/direct_sound_samples/cries/nidorino.bin" .align 2 Cry_Nidoking:: - .incbin "sound/direct_sound_samples/cry_nidoking.bin" + .incbin "sound/direct_sound_samples/cries/nidoking.bin" .align 2 Cry_Clefairy:: - .incbin "sound/direct_sound_samples/cry_clefairy.bin" + .incbin "sound/direct_sound_samples/cries/clefairy.bin" .align 2 Cry_Clefable:: - .incbin "sound/direct_sound_samples/cry_clefable.bin" + .incbin "sound/direct_sound_samples/cries/clefable.bin" .align 2 Cry_Vulpix:: - .incbin "sound/direct_sound_samples/cry_vulpix.bin" + .incbin "sound/direct_sound_samples/cries/vulpix.bin" .align 2 Cry_Ninetales:: - .incbin "sound/direct_sound_samples/cry_ninetales.bin" + .incbin "sound/direct_sound_samples/cries/ninetales.bin" .align 2 Cry_Jigglypuff:: - .incbin "sound/direct_sound_samples/cry_jigglypuff.bin" + .incbin "sound/direct_sound_samples/cries/jigglypuff.bin" .align 2 Cry_Wigglytuff:: - .incbin "sound/direct_sound_samples/cry_wigglytuff.bin" + .incbin "sound/direct_sound_samples/cries/wigglytuff.bin" .align 2 Cry_Zubat:: - .incbin "sound/direct_sound_samples/cry_zubat.bin" + .incbin "sound/direct_sound_samples/cries/zubat.bin" .align 2 Cry_Golbat:: - .incbin "sound/direct_sound_samples/cry_golbat.bin" + .incbin "sound/direct_sound_samples/cries/golbat.bin" .align 2 Cry_Oddish:: - .incbin "sound/direct_sound_samples/cry_oddish.bin" + .incbin "sound/direct_sound_samples/cries/oddish.bin" .align 2 Cry_Gloom:: - .incbin "sound/direct_sound_samples/cry_gloom.bin" + .incbin "sound/direct_sound_samples/cries/gloom.bin" .align 2 Cry_Vileplume:: - .incbin "sound/direct_sound_samples/cry_vileplume.bin" + .incbin "sound/direct_sound_samples/cries/vileplume.bin" .align 2 Cry_Paras:: - .incbin "sound/direct_sound_samples/cry_paras.bin" + .incbin "sound/direct_sound_samples/cries/paras.bin" .align 2 Cry_Parasect:: - .incbin "sound/direct_sound_samples/cry_parasect.bin" + .incbin "sound/direct_sound_samples/cries/parasect.bin" .align 2 Cry_Venonat:: - .incbin "sound/direct_sound_samples/cry_venonat.bin" + .incbin "sound/direct_sound_samples/cries/venonat.bin" .align 2 Cry_Venomoth:: - .incbin "sound/direct_sound_samples/cry_venomoth.bin" + .incbin "sound/direct_sound_samples/cries/venomoth.bin" .align 2 Cry_Diglett:: - .incbin "sound/direct_sound_samples/cry_diglett.bin" + .incbin "sound/direct_sound_samples/cries/diglett.bin" .align 2 Cry_Dugtrio:: - .incbin "sound/direct_sound_samples/cry_dugtrio.bin" + .incbin "sound/direct_sound_samples/cries/dugtrio.bin" .align 2 Cry_Meowth:: - .incbin "sound/direct_sound_samples/cry_meowth.bin" + .incbin "sound/direct_sound_samples/cries/meowth.bin" .align 2 Cry_Persian:: - .incbin "sound/direct_sound_samples/cry_persian.bin" + .incbin "sound/direct_sound_samples/cries/persian.bin" .align 2 Cry_Psyduck:: - .incbin "sound/direct_sound_samples/cry_psyduck.bin" + .incbin "sound/direct_sound_samples/cries/psyduck.bin" .align 2 Cry_Golduck:: - .incbin "sound/direct_sound_samples/cry_golduck.bin" + .incbin "sound/direct_sound_samples/cries/golduck.bin" .align 2 Cry_Mankey:: - .incbin "sound/direct_sound_samples/cry_mankey.bin" + .incbin "sound/direct_sound_samples/cries/mankey.bin" .align 2 Cry_Primeape:: - .incbin "sound/direct_sound_samples/cry_primeape.bin" + .incbin "sound/direct_sound_samples/cries/primeape.bin" .align 2 Cry_Growlithe:: - .incbin "sound/direct_sound_samples/cry_growlithe.bin" + .incbin "sound/direct_sound_samples/cries/growlithe.bin" .align 2 Cry_Arcanine:: - .incbin "sound/direct_sound_samples/cry_arcanine.bin" + .incbin "sound/direct_sound_samples/cries/arcanine.bin" .align 2 Cry_Poliwag:: - .incbin "sound/direct_sound_samples/cry_poliwag.bin" + .incbin "sound/direct_sound_samples/cries/poliwag.bin" .align 2 Cry_Poliwhirl:: - .incbin "sound/direct_sound_samples/cry_poliwhirl.bin" + .incbin "sound/direct_sound_samples/cries/poliwhirl.bin" .align 2 Cry_Poliwrath:: - .incbin "sound/direct_sound_samples/cry_poliwrath.bin" + .incbin "sound/direct_sound_samples/cries/poliwrath.bin" .align 2 Cry_Abra:: - .incbin "sound/direct_sound_samples/cry_abra.bin" + .incbin "sound/direct_sound_samples/cries/abra.bin" .align 2 Cry_Kadabra:: - .incbin "sound/direct_sound_samples/cry_kadabra.bin" + .incbin "sound/direct_sound_samples/cries/kadabra.bin" .align 2 Cry_Alakazam:: - .incbin "sound/direct_sound_samples/cry_alakazam.bin" + .incbin "sound/direct_sound_samples/cries/alakazam.bin" .align 2 Cry_Machop:: - .incbin "sound/direct_sound_samples/cry_machop.bin" + .incbin "sound/direct_sound_samples/cries/machop.bin" .align 2 Cry_Machoke:: - .incbin "sound/direct_sound_samples/cry_machoke.bin" + .incbin "sound/direct_sound_samples/cries/machoke.bin" .align 2 Cry_Machamp:: - .incbin "sound/direct_sound_samples/cry_machamp.bin" + .incbin "sound/direct_sound_samples/cries/machamp.bin" .align 2 Cry_Bellsprout:: - .incbin "sound/direct_sound_samples/cry_bellsprout.bin" + .incbin "sound/direct_sound_samples/cries/bellsprout.bin" .align 2 Cry_Weepinbell:: - .incbin "sound/direct_sound_samples/cry_weepinbell.bin" + .incbin "sound/direct_sound_samples/cries/weepinbell.bin" .align 2 Cry_Victreebel:: - .incbin "sound/direct_sound_samples/cry_victreebel.bin" + .incbin "sound/direct_sound_samples/cries/victreebel.bin" .align 2 Cry_Tentacool:: - .incbin "sound/direct_sound_samples/cry_tentacool.bin" + .incbin "sound/direct_sound_samples/cries/tentacool.bin" .align 2 Cry_Tentacruel:: - .incbin "sound/direct_sound_samples/cry_tentacruel.bin" + .incbin "sound/direct_sound_samples/cries/tentacruel.bin" .align 2 Cry_Geodude:: - .incbin "sound/direct_sound_samples/cry_geodude.bin" + .incbin "sound/direct_sound_samples/cries/geodude.bin" .align 2 Cry_Graveler:: - .incbin "sound/direct_sound_samples/cry_graveler.bin" + .incbin "sound/direct_sound_samples/cries/graveler.bin" .align 2 Cry_Golem:: - .incbin "sound/direct_sound_samples/cry_golem.bin" + .incbin "sound/direct_sound_samples/cries/golem.bin" .align 2 Cry_Ponyta:: - .incbin "sound/direct_sound_samples/cry_ponyta.bin" + .incbin "sound/direct_sound_samples/cries/ponyta.bin" .align 2 Cry_Rapidash:: - .incbin "sound/direct_sound_samples/cry_rapidash.bin" + .incbin "sound/direct_sound_samples/cries/rapidash.bin" .align 2 Cry_Slowpoke:: - .incbin "sound/direct_sound_samples/cry_slowpoke.bin" + .incbin "sound/direct_sound_samples/cries/slowpoke.bin" .align 2 Cry_Slowbro:: - .incbin "sound/direct_sound_samples/cry_slowbro.bin" + .incbin "sound/direct_sound_samples/cries/slowbro.bin" .align 2 Cry_Magnemite:: - .incbin "sound/direct_sound_samples/cry_magnemite.bin" + .incbin "sound/direct_sound_samples/cries/magnemite.bin" .align 2 Cry_Magneton:: - .incbin "sound/direct_sound_samples/cry_magneton.bin" + .incbin "sound/direct_sound_samples/cries/magneton.bin" .align 2 Cry_Farfetchd:: - .incbin "sound/direct_sound_samples/cry_farfetchd.bin" + .incbin "sound/direct_sound_samples/cries/farfetchd.bin" .align 2 Cry_Doduo:: - .incbin "sound/direct_sound_samples/cry_doduo.bin" + .incbin "sound/direct_sound_samples/cries/doduo.bin" .align 2 Cry_Dodrio:: - .incbin "sound/direct_sound_samples/cry_dodrio.bin" + .incbin "sound/direct_sound_samples/cries/dodrio.bin" .align 2 Cry_Seel:: - .incbin "sound/direct_sound_samples/cry_seel.bin" + .incbin "sound/direct_sound_samples/cries/seel.bin" .align 2 Cry_Dewgong:: - .incbin "sound/direct_sound_samples/cry_dewgong.bin" + .incbin "sound/direct_sound_samples/cries/dewgong.bin" .align 2 Cry_Grimer:: - .incbin "sound/direct_sound_samples/cry_grimer.bin" + .incbin "sound/direct_sound_samples/cries/grimer.bin" .align 2 Cry_Muk:: - .incbin "sound/direct_sound_samples/cry_muk.bin" + .incbin "sound/direct_sound_samples/cries/muk.bin" .align 2 Cry_Shellder:: - .incbin "sound/direct_sound_samples/cry_shellder.bin" + .incbin "sound/direct_sound_samples/cries/shellder.bin" .align 2 Cry_Cloyster:: - .incbin "sound/direct_sound_samples/cry_cloyster.bin" + .incbin "sound/direct_sound_samples/cries/cloyster.bin" .align 2 Cry_Gastly:: - .incbin "sound/direct_sound_samples/cry_gastly.bin" + .incbin "sound/direct_sound_samples/cries/gastly.bin" .align 2 Cry_Haunter:: - .incbin "sound/direct_sound_samples/cry_haunter.bin" + .incbin "sound/direct_sound_samples/cries/haunter.bin" .align 2 Cry_Gengar:: - .incbin "sound/direct_sound_samples/cry_gengar.bin" + .incbin "sound/direct_sound_samples/cries/gengar.bin" .align 2 Cry_Onix:: - .incbin "sound/direct_sound_samples/cry_onix.bin" + .incbin "sound/direct_sound_samples/cries/onix.bin" .align 2 Cry_Drowzee:: - .incbin "sound/direct_sound_samples/cry_drowzee.bin" + .incbin "sound/direct_sound_samples/cries/drowzee.bin" .align 2 Cry_Hypno:: - .incbin "sound/direct_sound_samples/cry_hypno.bin" + .incbin "sound/direct_sound_samples/cries/hypno.bin" .align 2 Cry_Krabby:: - .incbin "sound/direct_sound_samples/cry_krabby.bin" + .incbin "sound/direct_sound_samples/cries/krabby.bin" .align 2 Cry_Kingler:: - .incbin "sound/direct_sound_samples/cry_kingler.bin" + .incbin "sound/direct_sound_samples/cries/kingler.bin" .align 2 Cry_Voltorb:: - .incbin "sound/direct_sound_samples/cry_voltorb.bin" + .incbin "sound/direct_sound_samples/cries/voltorb.bin" .align 2 Cry_Electrode:: - .incbin "sound/direct_sound_samples/cry_electrode.bin" + .incbin "sound/direct_sound_samples/cries/electrode.bin" .align 2 Cry_Exeggcute:: - .incbin "sound/direct_sound_samples/cry_exeggcute.bin" + .incbin "sound/direct_sound_samples/cries/exeggcute.bin" .align 2 Cry_Exeggutor:: - .incbin "sound/direct_sound_samples/cry_exeggutor.bin" + .incbin "sound/direct_sound_samples/cries/exeggutor.bin" .align 2 Cry_Cubone:: - .incbin "sound/direct_sound_samples/cry_cubone.bin" + .incbin "sound/direct_sound_samples/cries/cubone.bin" .align 2 Cry_Marowak:: - .incbin "sound/direct_sound_samples/cry_marowak.bin" + .incbin "sound/direct_sound_samples/cries/marowak.bin" .align 2 Cry_Hitmonlee:: - .incbin "sound/direct_sound_samples/cry_hitmonlee.bin" + .incbin "sound/direct_sound_samples/cries/hitmonlee.bin" .align 2 Cry_Hitmonchan:: - .incbin "sound/direct_sound_samples/cry_hitmonchan.bin" + .incbin "sound/direct_sound_samples/cries/hitmonchan.bin" .align 2 Cry_Lickitung:: - .incbin "sound/direct_sound_samples/cry_lickitung.bin" + .incbin "sound/direct_sound_samples/cries/lickitung.bin" .align 2 Cry_Koffing:: - .incbin "sound/direct_sound_samples/cry_koffing.bin" + .incbin "sound/direct_sound_samples/cries/koffing.bin" .align 2 Cry_Weezing:: - .incbin "sound/direct_sound_samples/cry_weezing.bin" + .incbin "sound/direct_sound_samples/cries/weezing.bin" .align 2 Cry_Rhyhorn:: - .incbin "sound/direct_sound_samples/cry_rhyhorn.bin" + .incbin "sound/direct_sound_samples/cries/rhyhorn.bin" .align 2 Cry_Rhydon:: - .incbin "sound/direct_sound_samples/cry_rhydon.bin" + .incbin "sound/direct_sound_samples/cries/rhydon.bin" .align 2 Cry_Chansey:: - .incbin "sound/direct_sound_samples/cry_chansey.bin" + .incbin "sound/direct_sound_samples/cries/chansey.bin" .align 2 Cry_Tangela:: - .incbin "sound/direct_sound_samples/cry_tangela.bin" + .incbin "sound/direct_sound_samples/cries/tangela.bin" .align 2 Cry_Kangaskhan:: - .incbin "sound/direct_sound_samples/cry_kangaskhan.bin" + .incbin "sound/direct_sound_samples/cries/kangaskhan.bin" .align 2 Cry_Horsea:: - .incbin "sound/direct_sound_samples/cry_horsea.bin" + .incbin "sound/direct_sound_samples/cries/horsea.bin" .align 2 Cry_Seadra:: - .incbin "sound/direct_sound_samples/cry_seadra.bin" + .incbin "sound/direct_sound_samples/cries/seadra.bin" .align 2 Cry_Goldeen:: - .incbin "sound/direct_sound_samples/cry_goldeen.bin" + .incbin "sound/direct_sound_samples/cries/goldeen.bin" .align 2 Cry_Seaking:: - .incbin "sound/direct_sound_samples/cry_seaking.bin" + .incbin "sound/direct_sound_samples/cries/seaking.bin" .align 2 Cry_Staryu:: - .incbin "sound/direct_sound_samples/cry_staryu.bin" + .incbin "sound/direct_sound_samples/cries/staryu.bin" .align 2 Cry_Starmie:: - .incbin "sound/direct_sound_samples/cry_starmie.bin" + .incbin "sound/direct_sound_samples/cries/starmie.bin" .align 2 Cry_MrMime:: - .incbin "sound/direct_sound_samples/cry_mr_mime.bin" + .incbin "sound/direct_sound_samples/cries/mr_mime.bin" .align 2 Cry_Scyther:: - .incbin "sound/direct_sound_samples/cry_scyther.bin" + .incbin "sound/direct_sound_samples/cries/scyther.bin" .align 2 Cry_Jynx:: - .incbin "sound/direct_sound_samples/cry_jynx.bin" + .incbin "sound/direct_sound_samples/cries/jynx.bin" .align 2 Cry_Electabuzz:: - .incbin "sound/direct_sound_samples/cry_electabuzz.bin" + .incbin "sound/direct_sound_samples/cries/electabuzz.bin" .align 2 Cry_Magmar:: - .incbin "sound/direct_sound_samples/cry_magmar.bin" + .incbin "sound/direct_sound_samples/cries/magmar.bin" .align 2 Cry_Pinsir:: - .incbin "sound/direct_sound_samples/cry_pinsir.bin" + .incbin "sound/direct_sound_samples/cries/pinsir.bin" .align 2 Cry_Tauros:: - .incbin "sound/direct_sound_samples/cry_tauros.bin" + .incbin "sound/direct_sound_samples/cries/tauros.bin" .align 2 Cry_Magikarp:: - .incbin "sound/direct_sound_samples/cry_magikarp.bin" + .incbin "sound/direct_sound_samples/cries/magikarp.bin" .align 2 Cry_Gyarados:: - .incbin "sound/direct_sound_samples/cry_gyarados.bin" + .incbin "sound/direct_sound_samples/cries/gyarados.bin" .align 2 Cry_Lapras:: - .incbin "sound/direct_sound_samples/cry_lapras.bin" + .incbin "sound/direct_sound_samples/cries/lapras.bin" .align 2 Cry_Ditto:: - .incbin "sound/direct_sound_samples/cry_ditto.bin" + .incbin "sound/direct_sound_samples/cries/ditto.bin" .align 2 Cry_Eevee:: - .incbin "sound/direct_sound_samples/cry_eevee.bin" + .incbin "sound/direct_sound_samples/cries/eevee.bin" .align 2 Cry_Vaporeon:: - .incbin "sound/direct_sound_samples/cry_vaporeon.bin" + .incbin "sound/direct_sound_samples/cries/vaporeon.bin" .align 2 Cry_Jolteon:: - .incbin "sound/direct_sound_samples/cry_jolteon.bin" + .incbin "sound/direct_sound_samples/cries/jolteon.bin" .align 2 Cry_Flareon:: - .incbin "sound/direct_sound_samples/cry_flareon.bin" + .incbin "sound/direct_sound_samples/cries/flareon.bin" .align 2 Cry_Porygon:: - .incbin "sound/direct_sound_samples/cry_porygon.bin" + .incbin "sound/direct_sound_samples/cries/porygon.bin" .align 2 Cry_Omanyte:: - .incbin "sound/direct_sound_samples/cry_omanyte.bin" + .incbin "sound/direct_sound_samples/cries/omanyte.bin" .align 2 Cry_Omastar:: - .incbin "sound/direct_sound_samples/cry_omastar.bin" + .incbin "sound/direct_sound_samples/cries/omastar.bin" .align 2 Cry_Kabuto:: - .incbin "sound/direct_sound_samples/cry_kabuto.bin" + .incbin "sound/direct_sound_samples/cries/kabuto.bin" .align 2 Cry_Kabutops:: - .incbin "sound/direct_sound_samples/cry_kabutops.bin" + .incbin "sound/direct_sound_samples/cries/kabutops.bin" .align 2 Cry_Aerodactyl:: - .incbin "sound/direct_sound_samples/cry_aerodactyl.bin" + .incbin "sound/direct_sound_samples/cries/aerodactyl.bin" .align 2 Cry_Snorlax:: - .incbin "sound/direct_sound_samples/cry_snorlax.bin" + .incbin "sound/direct_sound_samples/cries/snorlax.bin" .align 2 Cry_Articuno:: - .incbin "sound/direct_sound_samples/cry_articuno.bin" + .incbin "sound/direct_sound_samples/cries/articuno.bin" .align 2 Cry_Zapdos:: - .incbin "sound/direct_sound_samples/cry_zapdos.bin" + .incbin "sound/direct_sound_samples/cries/zapdos.bin" .align 2 Cry_Moltres:: - .incbin "sound/direct_sound_samples/cry_moltres.bin" + .incbin "sound/direct_sound_samples/cries/moltres.bin" .align 2 Cry_Dratini:: - .incbin "sound/direct_sound_samples/cry_dratini.bin" + .incbin "sound/direct_sound_samples/cries/dratini.bin" .align 2 Cry_Dragonair:: - .incbin "sound/direct_sound_samples/cry_dragonair.bin" + .incbin "sound/direct_sound_samples/cries/dragonair.bin" .align 2 Cry_Dragonite:: - .incbin "sound/direct_sound_samples/cry_dragonite.bin" + .incbin "sound/direct_sound_samples/cries/dragonite.bin" .align 2 Cry_Mewtwo:: - .incbin "sound/direct_sound_samples/cry_mewtwo.bin" + .incbin "sound/direct_sound_samples/cries/mewtwo.bin" .align 2 Cry_Mew:: - .incbin "sound/direct_sound_samples/cry_mew.bin" + .incbin "sound/direct_sound_samples/cries/mew.bin" .align 2 Cry_Chikorita:: - .incbin "sound/direct_sound_samples/cry_chikorita.bin" + .incbin "sound/direct_sound_samples/cries/chikorita.bin" .align 2 Cry_Bayleef:: - .incbin "sound/direct_sound_samples/cry_bayleef.bin" + .incbin "sound/direct_sound_samples/cries/bayleef.bin" .align 2 Cry_Meganium:: - .incbin "sound/direct_sound_samples/cry_meganium.bin" + .incbin "sound/direct_sound_samples/cries/meganium.bin" .align 2 Cry_Cyndaquil:: - .incbin "sound/direct_sound_samples/cry_cyndaquil.bin" + .incbin "sound/direct_sound_samples/cries/cyndaquil.bin" .align 2 Cry_Quilava:: - .incbin "sound/direct_sound_samples/cry_quilava.bin" + .incbin "sound/direct_sound_samples/cries/quilava.bin" .align 2 Cry_Typhlosion:: - .incbin "sound/direct_sound_samples/cry_typhlosion.bin" + .incbin "sound/direct_sound_samples/cries/typhlosion.bin" .align 2 Cry_Totodile:: - .incbin "sound/direct_sound_samples/cry_totodile.bin" + .incbin "sound/direct_sound_samples/cries/totodile.bin" .align 2 Cry_Croconaw:: - .incbin "sound/direct_sound_samples/cry_croconaw.bin" + .incbin "sound/direct_sound_samples/cries/croconaw.bin" .align 2 Cry_Feraligatr:: - .incbin "sound/direct_sound_samples/cry_feraligatr.bin" + .incbin "sound/direct_sound_samples/cries/feraligatr.bin" .align 2 Cry_Sentret:: - .incbin "sound/direct_sound_samples/cry_sentret.bin" + .incbin "sound/direct_sound_samples/cries/sentret.bin" .align 2 Cry_Furret:: - .incbin "sound/direct_sound_samples/cry_furret.bin" + .incbin "sound/direct_sound_samples/cries/furret.bin" .align 2 Cry_Hoothoot:: - .incbin "sound/direct_sound_samples/cry_hoothoot.bin" + .incbin "sound/direct_sound_samples/cries/hoothoot.bin" .align 2 Cry_Noctowl:: - .incbin "sound/direct_sound_samples/cry_noctowl.bin" + .incbin "sound/direct_sound_samples/cries/noctowl.bin" .align 2 Cry_Ledyba:: - .incbin "sound/direct_sound_samples/cry_ledyba.bin" + .incbin "sound/direct_sound_samples/cries/ledyba.bin" .align 2 Cry_Ledian:: - .incbin "sound/direct_sound_samples/cry_ledian.bin" + .incbin "sound/direct_sound_samples/cries/ledian.bin" .align 2 Cry_Spinarak:: - .incbin "sound/direct_sound_samples/cry_spinarak.bin" + .incbin "sound/direct_sound_samples/cries/spinarak.bin" .align 2 Cry_Ariados:: - .incbin "sound/direct_sound_samples/cry_ariados.bin" + .incbin "sound/direct_sound_samples/cries/ariados.bin" .align 2 Cry_Crobat:: - .incbin "sound/direct_sound_samples/cry_crobat.bin" + .incbin "sound/direct_sound_samples/cries/crobat.bin" .align 2 Cry_Chinchou:: - .incbin "sound/direct_sound_samples/cry_chinchou.bin" + .incbin "sound/direct_sound_samples/cries/chinchou.bin" .align 2 Cry_Lanturn:: - .incbin "sound/direct_sound_samples/cry_lanturn.bin" + .incbin "sound/direct_sound_samples/cries/lanturn.bin" .align 2 Cry_Pichu:: - .incbin "sound/direct_sound_samples/cry_pichu.bin" + .incbin "sound/direct_sound_samples/cries/pichu.bin" .align 2 Cry_Cleffa:: - .incbin "sound/direct_sound_samples/cry_cleffa.bin" + .incbin "sound/direct_sound_samples/cries/cleffa.bin" .align 2 Cry_Igglybuff:: - .incbin "sound/direct_sound_samples/cry_igglybuff.bin" + .incbin "sound/direct_sound_samples/cries/igglybuff.bin" .align 2 Cry_Togepi:: - .incbin "sound/direct_sound_samples/cry_togepi.bin" + .incbin "sound/direct_sound_samples/cries/togepi.bin" .align 2 Cry_Togetic:: - .incbin "sound/direct_sound_samples/cry_togetic.bin" + .incbin "sound/direct_sound_samples/cries/togetic.bin" .align 2 Cry_Natu:: - .incbin "sound/direct_sound_samples/cry_natu.bin" + .incbin "sound/direct_sound_samples/cries/natu.bin" .align 2 Cry_Xatu:: - .incbin "sound/direct_sound_samples/cry_xatu.bin" + .incbin "sound/direct_sound_samples/cries/xatu.bin" .align 2 Cry_Mareep:: - .incbin "sound/direct_sound_samples/cry_mareep.bin" + .incbin "sound/direct_sound_samples/cries/mareep.bin" .align 2 Cry_Flaaffy:: - .incbin "sound/direct_sound_samples/cry_flaaffy.bin" + .incbin "sound/direct_sound_samples/cries/flaaffy.bin" .align 2 Cry_Ampharos:: - .incbin "sound/direct_sound_samples/cry_ampharos.bin" + .incbin "sound/direct_sound_samples/cries/ampharos.bin" .align 2 Cry_Bellossom:: - .incbin "sound/direct_sound_samples/cry_bellossom.bin" + .incbin "sound/direct_sound_samples/cries/bellossom.bin" .align 2 Cry_Marill:: - .incbin "sound/direct_sound_samples/cry_marill.bin" + .incbin "sound/direct_sound_samples/cries/marill.bin" .align 2 Cry_Azumarill:: - .incbin "sound/direct_sound_samples/cry_azumarill.bin" + .incbin "sound/direct_sound_samples/cries/azumarill.bin" .align 2 Cry_Sudowoodo:: - .incbin "sound/direct_sound_samples/cry_sudowoodo.bin" + .incbin "sound/direct_sound_samples/cries/sudowoodo.bin" .align 2 Cry_Politoed:: - .incbin "sound/direct_sound_samples/cry_politoed.bin" + .incbin "sound/direct_sound_samples/cries/politoed.bin" .align 2 Cry_Hoppip:: - .incbin "sound/direct_sound_samples/cry_hoppip.bin" + .incbin "sound/direct_sound_samples/cries/hoppip.bin" .align 2 Cry_Skiploom:: - .incbin "sound/direct_sound_samples/cry_skiploom.bin" + .incbin "sound/direct_sound_samples/cries/skiploom.bin" .align 2 Cry_Jumpluff:: - .incbin "sound/direct_sound_samples/cry_jumpluff.bin" + .incbin "sound/direct_sound_samples/cries/jumpluff.bin" .align 2 Cry_Aipom:: - .incbin "sound/direct_sound_samples/cry_aipom.bin" + .incbin "sound/direct_sound_samples/cries/aipom.bin" .align 2 Cry_Sunkern:: - .incbin "sound/direct_sound_samples/cry_sunkern.bin" + .incbin "sound/direct_sound_samples/cries/sunkern.bin" .align 2 Cry_Sunflora:: - .incbin "sound/direct_sound_samples/cry_sunflora.bin" + .incbin "sound/direct_sound_samples/cries/sunflora.bin" .align 2 Cry_Yanma:: - .incbin "sound/direct_sound_samples/cry_yanma.bin" + .incbin "sound/direct_sound_samples/cries/yanma.bin" .align 2 Cry_Wooper:: - .incbin "sound/direct_sound_samples/cry_wooper.bin" + .incbin "sound/direct_sound_samples/cries/wooper.bin" .align 2 Cry_Quagsire:: - .incbin "sound/direct_sound_samples/cry_quagsire.bin" + .incbin "sound/direct_sound_samples/cries/quagsire.bin" .align 2 Cry_Espeon:: - .incbin "sound/direct_sound_samples/cry_espeon.bin" + .incbin "sound/direct_sound_samples/cries/espeon.bin" .align 2 Cry_Umbreon:: - .incbin "sound/direct_sound_samples/cry_umbreon.bin" + .incbin "sound/direct_sound_samples/cries/umbreon.bin" .align 2 Cry_Murkrow:: - .incbin "sound/direct_sound_samples/cry_murkrow.bin" + .incbin "sound/direct_sound_samples/cries/murkrow.bin" .align 2 Cry_Slowking:: - .incbin "sound/direct_sound_samples/cry_slowking.bin" + .incbin "sound/direct_sound_samples/cries/slowking.bin" .align 2 Cry_Misdreavus:: - .incbin "sound/direct_sound_samples/cry_misdreavus.bin" + .incbin "sound/direct_sound_samples/cries/misdreavus.bin" .align 2 Cry_Unown:: - .incbin "sound/direct_sound_samples/cry_unown.bin" + .incbin "sound/direct_sound_samples/cries/unown.bin" .align 2 Cry_Wobbuffet:: - .incbin "sound/direct_sound_samples/cry_wobbuffet.bin" + .incbin "sound/direct_sound_samples/cries/wobbuffet.bin" .align 2 Cry_Girafarig:: - .incbin "sound/direct_sound_samples/cry_girafarig.bin" + .incbin "sound/direct_sound_samples/cries/girafarig.bin" .align 2 Cry_Pineco:: - .incbin "sound/direct_sound_samples/cry_pineco.bin" + .incbin "sound/direct_sound_samples/cries/pineco.bin" .align 2 Cry_Forretress:: - .incbin "sound/direct_sound_samples/cry_forretress.bin" + .incbin "sound/direct_sound_samples/cries/forretress.bin" .align 2 Cry_Dunsparce:: - .incbin "sound/direct_sound_samples/cry_dunsparce.bin" + .incbin "sound/direct_sound_samples/cries/dunsparce.bin" .align 2 Cry_Gligar:: - .incbin "sound/direct_sound_samples/cry_gligar.bin" + .incbin "sound/direct_sound_samples/cries/gligar.bin" .align 2 Cry_Steelix:: - .incbin "sound/direct_sound_samples/cry_steelix.bin" + .incbin "sound/direct_sound_samples/cries/steelix.bin" .align 2 Cry_Snubbull:: - .incbin "sound/direct_sound_samples/cry_snubbull.bin" + .incbin "sound/direct_sound_samples/cries/snubbull.bin" .align 2 Cry_Granbull:: - .incbin "sound/direct_sound_samples/cry_granbull.bin" + .incbin "sound/direct_sound_samples/cries/granbull.bin" .align 2 Cry_Qwilfish:: - .incbin "sound/direct_sound_samples/cry_qwilfish.bin" + .incbin "sound/direct_sound_samples/cries/qwilfish.bin" .align 2 Cry_Scizor:: - .incbin "sound/direct_sound_samples/cry_scizor.bin" + .incbin "sound/direct_sound_samples/cries/scizor.bin" .align 2 Cry_Shuckle:: - .incbin "sound/direct_sound_samples/cry_shuckle.bin" + .incbin "sound/direct_sound_samples/cries/shuckle.bin" .align 2 Cry_Heracross:: - .incbin "sound/direct_sound_samples/cry_heracross.bin" + .incbin "sound/direct_sound_samples/cries/heracross.bin" .align 2 Cry_Sneasel:: - .incbin "sound/direct_sound_samples/cry_sneasel.bin" + .incbin "sound/direct_sound_samples/cries/sneasel.bin" .align 2 Cry_Teddiursa:: - .incbin "sound/direct_sound_samples/cry_teddiursa.bin" + .incbin "sound/direct_sound_samples/cries/teddiursa.bin" .align 2 Cry_Ursaring:: - .incbin "sound/direct_sound_samples/cry_ursaring.bin" + .incbin "sound/direct_sound_samples/cries/ursaring.bin" .align 2 Cry_Slugma:: - .incbin "sound/direct_sound_samples/cry_slugma.bin" + .incbin "sound/direct_sound_samples/cries/slugma.bin" .align 2 Cry_Magcargo:: - .incbin "sound/direct_sound_samples/cry_magcargo.bin" + .incbin "sound/direct_sound_samples/cries/magcargo.bin" .align 2 Cry_Swinub:: - .incbin "sound/direct_sound_samples/cry_swinub.bin" + .incbin "sound/direct_sound_samples/cries/swinub.bin" .align 2 Cry_Piloswine:: - .incbin "sound/direct_sound_samples/cry_piloswine.bin" + .incbin "sound/direct_sound_samples/cries/piloswine.bin" .align 2 Cry_Corsola:: - .incbin "sound/direct_sound_samples/cry_corsola.bin" + .incbin "sound/direct_sound_samples/cries/corsola.bin" .align 2 Cry_Remoraid:: - .incbin "sound/direct_sound_samples/cry_remoraid.bin" + .incbin "sound/direct_sound_samples/cries/remoraid.bin" .align 2 Cry_Octillery:: - .incbin "sound/direct_sound_samples/cry_octillery.bin" + .incbin "sound/direct_sound_samples/cries/octillery.bin" .align 2 Cry_Delibird:: - .incbin "sound/direct_sound_samples/cry_delibird.bin" + .incbin "sound/direct_sound_samples/cries/delibird.bin" .align 2 Cry_Mantine:: - .incbin "sound/direct_sound_samples/cry_mantine.bin" + .incbin "sound/direct_sound_samples/cries/mantine.bin" .align 2 Cry_Skarmory:: - .incbin "sound/direct_sound_samples/cry_skarmory.bin" + .incbin "sound/direct_sound_samples/cries/skarmory.bin" .align 2 Cry_Houndour:: - .incbin "sound/direct_sound_samples/cry_houndour.bin" + .incbin "sound/direct_sound_samples/cries/houndour.bin" .align 2 Cry_Houndoom:: - .incbin "sound/direct_sound_samples/cry_houndoom.bin" + .incbin "sound/direct_sound_samples/cries/houndoom.bin" .align 2 Cry_Kingdra:: - .incbin "sound/direct_sound_samples/cry_kingdra.bin" + .incbin "sound/direct_sound_samples/cries/kingdra.bin" .align 2 Cry_Phanpy:: - .incbin "sound/direct_sound_samples/cry_phanpy.bin" + .incbin "sound/direct_sound_samples/cries/phanpy.bin" .align 2 Cry_Donphan:: - .incbin "sound/direct_sound_samples/cry_donphan.bin" + .incbin "sound/direct_sound_samples/cries/donphan.bin" .align 2 Cry_Porygon2:: - .incbin "sound/direct_sound_samples/cry_porygon2.bin" + .incbin "sound/direct_sound_samples/cries/porygon2.bin" .align 2 Cry_Stantler:: - .incbin "sound/direct_sound_samples/cry_stantler.bin" + .incbin "sound/direct_sound_samples/cries/stantler.bin" .align 2 Cry_Smeargle:: - .incbin "sound/direct_sound_samples/cry_smeargle.bin" + .incbin "sound/direct_sound_samples/cries/smeargle.bin" .align 2 Cry_Tyrogue:: - .incbin "sound/direct_sound_samples/cry_tyrogue.bin" + .incbin "sound/direct_sound_samples/cries/tyrogue.bin" .align 2 Cry_Hitmontop:: - .incbin "sound/direct_sound_samples/cry_hitmontop.bin" + .incbin "sound/direct_sound_samples/cries/hitmontop.bin" .align 2 Cry_Smoochum:: - .incbin "sound/direct_sound_samples/cry_smoochum.bin" + .incbin "sound/direct_sound_samples/cries/smoochum.bin" .align 2 Cry_Elekid:: - .incbin "sound/direct_sound_samples/cry_elekid.bin" + .incbin "sound/direct_sound_samples/cries/elekid.bin" .align 2 Cry_Magby:: - .incbin "sound/direct_sound_samples/cry_magby.bin" + .incbin "sound/direct_sound_samples/cries/magby.bin" .align 2 Cry_Miltank:: - .incbin "sound/direct_sound_samples/cry_miltank.bin" + .incbin "sound/direct_sound_samples/cries/miltank.bin" .align 2 Cry_Blissey:: - .incbin "sound/direct_sound_samples/cry_blissey.bin" + .incbin "sound/direct_sound_samples/cries/blissey.bin" .align 2 Cry_Raikou:: - .incbin "sound/direct_sound_samples/cry_raikou.bin" + .incbin "sound/direct_sound_samples/cries/raikou.bin" .align 2 Cry_Entei:: - .incbin "sound/direct_sound_samples/cry_entei.bin" + .incbin "sound/direct_sound_samples/cries/entei.bin" .align 2 Cry_Suicune:: - .incbin "sound/direct_sound_samples/cry_suicune.bin" + .incbin "sound/direct_sound_samples/cries/suicune.bin" .align 2 Cry_Larvitar:: - .incbin "sound/direct_sound_samples/cry_larvitar.bin" + .incbin "sound/direct_sound_samples/cries/larvitar.bin" .align 2 Cry_Pupitar:: - .incbin "sound/direct_sound_samples/cry_pupitar.bin" + .incbin "sound/direct_sound_samples/cries/pupitar.bin" .align 2 Cry_Tyranitar:: - .incbin "sound/direct_sound_samples/cry_tyranitar.bin" + .incbin "sound/direct_sound_samples/cries/tyranitar.bin" .align 2 Cry_Lugia:: - .incbin "sound/direct_sound_samples/cry_lugia.bin" + .incbin "sound/direct_sound_samples/cries/lugia.bin" .align 2 Cry_HoOh:: - .incbin "sound/direct_sound_samples/cry_ho_oh.bin" + .incbin "sound/direct_sound_samples/cries/ho_oh.bin" .align 2 Cry_Celebi:: - .incbin "sound/direct_sound_samples/cry_celebi.bin" + .incbin "sound/direct_sound_samples/cries/celebi.bin" .align 2 Cry_Kecleon:: - .incbin "sound/direct_sound_samples/cry_kecleon.bin" + .incbin "sound/direct_sound_samples/cries/kecleon.bin" .align 2 Cry_Roselia:: - .incbin "sound/direct_sound_samples/cry_roselia.bin" + .incbin "sound/direct_sound_samples/cries/roselia.bin" .align 2 Cry_Torkoal:: - .incbin "sound/direct_sound_samples/cry_torkoal.bin" + .incbin "sound/direct_sound_samples/cries/torkoal.bin" .align 2 Cry_Electrike:: - .incbin "sound/direct_sound_samples/cry_electrike.bin" + .incbin "sound/direct_sound_samples/cries/electrike.bin" .align 2 Cry_Manectric:: - .incbin "sound/direct_sound_samples/cry_manectric.bin" + .incbin "sound/direct_sound_samples/cries/manectric.bin" .align 2 Cry_Duskull:: - .incbin "sound/direct_sound_samples/cry_duskull.bin" + .incbin "sound/direct_sound_samples/cries/duskull.bin" .align 2 Cry_Latias:: - .incbin "sound/direct_sound_samples/cry_latias.bin" + .incbin "sound/direct_sound_samples/cries/latias.bin" .align 2 Cry_Wynaut:: - .incbin "sound/direct_sound_samples/cry_wynaut.bin" + .incbin "sound/direct_sound_samples/cries/wynaut.bin" .align 2 Cry_Seviper:: - .incbin "sound/direct_sound_samples/cry_seviper.bin" + .incbin "sound/direct_sound_samples/cries/seviper.bin" .align 2 Cry_Sharpedo:: - .incbin "sound/direct_sound_samples/cry_sharpedo.bin" + .incbin "sound/direct_sound_samples/cries/sharpedo.bin" .align 2 Cry_Zangoose:: - .incbin "sound/direct_sound_samples/cry_zangoose.bin" + .incbin "sound/direct_sound_samples/cries/zangoose.bin" .align 2 Cry_Azurill:: - .incbin "sound/direct_sound_samples/cry_azurill.bin" + .incbin "sound/direct_sound_samples/cries/azurill.bin" .align 2 Cry_Swablu:: - .incbin "sound/direct_sound_samples/cry_swablu.bin" + .incbin "sound/direct_sound_samples/cries/swablu.bin" .align 2 Cry_Altaria:: - .incbin "sound/direct_sound_samples/cry_altaria.bin" + .incbin "sound/direct_sound_samples/cries/altaria.bin" .align 2 Cry_Unused265:: - .incbin "sound/direct_sound_samples/cry_unused_265.bin" + .incbin "sound/direct_sound_samples/cries/unused_265.bin" .align 2 Cry_Taillow:: - .incbin "sound/direct_sound_samples/cry_taillow.bin" + .incbin "sound/direct_sound_samples/cries/taillow.bin" .align 2 Cry_Swellow:: - .incbin "sound/direct_sound_samples/cry_swellow.bin" + .incbin "sound/direct_sound_samples/cries/swellow.bin" .align 2 Cry_Unused268:: - .incbin "sound/direct_sound_samples/cry_unused_268.bin" + .incbin "sound/direct_sound_samples/cries/unused_268.bin" .align 2 Cry_Spinda:: - .incbin "sound/direct_sound_samples/cry_spinda.bin" + .incbin "sound/direct_sound_samples/cries/spinda.bin" .align 2 Cry_Torchic:: - .incbin "sound/direct_sound_samples/cry_torchic.bin" + .incbin "sound/direct_sound_samples/cries/torchic.bin" .align 2 Cry_Combusken:: - .incbin "sound/direct_sound_samples/cry_combusken.bin" + .incbin "sound/direct_sound_samples/cries/combusken.bin" .align 2 Cry_Blaziken:: - .incbin "sound/direct_sound_samples/cry_blaziken.bin" + .incbin "sound/direct_sound_samples/cries/blaziken.bin" .align 2 Cry_Treecko:: - .incbin "sound/direct_sound_samples/cry_treecko.bin" + .incbin "sound/direct_sound_samples/cries/treecko.bin" .align 2 Cry_Grovyle:: - .incbin "sound/direct_sound_samples/cry_grovyle.bin" + .incbin "sound/direct_sound_samples/cries/grovyle.bin" .align 2 Cry_Sceptile:: - .incbin "sound/direct_sound_samples/cry_sceptile.bin" + .incbin "sound/direct_sound_samples/cries/sceptile.bin" .align 2 Cry_Mudkip:: - .incbin "sound/direct_sound_samples/cry_mudkip.bin" + .incbin "sound/direct_sound_samples/cries/mudkip.bin" .align 2 Cry_Marshtomp:: - .incbin "sound/direct_sound_samples/cry_marshtomp.bin" + .incbin "sound/direct_sound_samples/cries/marshtomp.bin" .align 2 Cry_Swampert:: - .incbin "sound/direct_sound_samples/cry_swampert.bin" + .incbin "sound/direct_sound_samples/cries/swampert.bin" .align 2 Cry_Pelipper:: - .incbin "sound/direct_sound_samples/cry_pelipper.bin" + .incbin "sound/direct_sound_samples/cries/pelipper.bin" .align 2 Cry_Wingull:: - .incbin "sound/direct_sound_samples/cry_wingull.bin" + .incbin "sound/direct_sound_samples/cries/wingull.bin" .align 2 Cry_Banette:: - .incbin "sound/direct_sound_samples/cry_banette.bin" + .incbin "sound/direct_sound_samples/cries/banette.bin" .align 2 Cry_Shuppet:: - .incbin "sound/direct_sound_samples/cry_shuppet.bin" + .incbin "sound/direct_sound_samples/cries/shuppet.bin" .align 2 Cry_Lotad:: - .incbin "sound/direct_sound_samples/cry_lotad.bin" + .incbin "sound/direct_sound_samples/cries/lotad.bin" .align 2 Cry_Lombre:: - .incbin "sound/direct_sound_samples/cry_lombre.bin" + .incbin "sound/direct_sound_samples/cries/lombre.bin" .align 2 Cry_Ludicolo:: - .incbin "sound/direct_sound_samples/cry_ludicolo.bin" + .incbin "sound/direct_sound_samples/cries/ludicolo.bin" .align 2 Cry_Seedot:: - .incbin "sound/direct_sound_samples/cry_seedot.bin" + .incbin "sound/direct_sound_samples/cries/seedot.bin" .align 2 Cry_Nuzleaf:: - .incbin "sound/direct_sound_samples/cry_nuzleaf.bin" + .incbin "sound/direct_sound_samples/cries/nuzleaf.bin" .align 2 Cry_Shiftry:: - .incbin "sound/direct_sound_samples/cry_shiftry.bin" + .incbin "sound/direct_sound_samples/cries/shiftry.bin" .align 2 Cry_Carvanha:: - .incbin "sound/direct_sound_samples/cry_carvanha.bin" + .incbin "sound/direct_sound_samples/cries/carvanha.bin" .align 2 Cry_Wurmple:: - .incbin "sound/direct_sound_samples/cry_wurmple.bin" + .incbin "sound/direct_sound_samples/cries/wurmple.bin" .align 2 Cry_Silcoon:: - .incbin "sound/direct_sound_samples/cry_silcoon.bin" + .incbin "sound/direct_sound_samples/cries/silcoon.bin" .align 2 Cry_Beautifly:: - .incbin "sound/direct_sound_samples/cry_beautifly.bin" + .incbin "sound/direct_sound_samples/cries/beautifly.bin" .align 2 Cry_Cascoon:: - .incbin "sound/direct_sound_samples/cry_cascoon.bin" + .incbin "sound/direct_sound_samples/cries/cascoon.bin" .align 2 Cry_Dustox:: - .incbin "sound/direct_sound_samples/cry_dustox.bin" + .incbin "sound/direct_sound_samples/cries/dustox.bin" .align 2 Cry_Ralts:: - .incbin "sound/direct_sound_samples/cry_ralts.bin" + .incbin "sound/direct_sound_samples/cries/ralts.bin" .align 2 Cry_Kirlia:: - .incbin "sound/direct_sound_samples/cry_kirlia.bin" + .incbin "sound/direct_sound_samples/cries/kirlia.bin" .align 2 Cry_Gardevoir:: - .incbin "sound/direct_sound_samples/cry_gardevoir.bin" + .incbin "sound/direct_sound_samples/cries/gardevoir.bin" .align 2 Cry_Slakoth:: - .incbin "sound/direct_sound_samples/cry_slakoth.bin" + .incbin "sound/direct_sound_samples/cries/slakoth.bin" .align 2 Cry_Vigoroth:: - .incbin "sound/direct_sound_samples/cry_vigoroth.bin" + .incbin "sound/direct_sound_samples/cries/vigoroth.bin" .align 2 Cry_Slaking:: - .incbin "sound/direct_sound_samples/cry_slaking.bin" + .incbin "sound/direct_sound_samples/cries/slaking.bin" .align 2 Cry_Nincada:: - .incbin "sound/direct_sound_samples/cry_nincada.bin" + .incbin "sound/direct_sound_samples/cries/nincada.bin" .align 2 Cry_Ninjask:: - .incbin "sound/direct_sound_samples/cry_ninjask.bin" + .incbin "sound/direct_sound_samples/cries/ninjask.bin" .align 2 Cry_Shedinja:: - .incbin "sound/direct_sound_samples/cry_shedinja.bin" + .incbin "sound/direct_sound_samples/cries/shedinja.bin" .align 2 Cry_Makuhita:: - .incbin "sound/direct_sound_samples/cry_makuhita.bin" + .incbin "sound/direct_sound_samples/cries/makuhita.bin" .align 2 Cry_Hariyama:: - .incbin "sound/direct_sound_samples/cry_hariyama.bin" + .incbin "sound/direct_sound_samples/cries/hariyama.bin" .align 2 Cry_Nosepass:: - .incbin "sound/direct_sound_samples/cry_nosepass.bin" + .incbin "sound/direct_sound_samples/cries/nosepass.bin" .align 2 Cry_Glalie:: - .incbin "sound/direct_sound_samples/cry_glalie.bin" + .incbin "sound/direct_sound_samples/cries/glalie.bin" .align 2 Cry_Plusle:: - .incbin "sound/direct_sound_samples/cry_plusle.bin" + .incbin "sound/direct_sound_samples/cries/plusle.bin" .align 2 Cry_Minun:: - .incbin "sound/direct_sound_samples/cry_minun.bin" + .incbin "sound/direct_sound_samples/cries/minun.bin" .align 2 Cry_Surskit:: - .incbin "sound/direct_sound_samples/cry_surskit.bin" + .incbin "sound/direct_sound_samples/cries/surskit.bin" .align 2 Cry_Masquerain:: - .incbin "sound/direct_sound_samples/cry_masquerain.bin" + .incbin "sound/direct_sound_samples/cries/masquerain.bin" .align 2 Cry_Skitty:: - .incbin "sound/direct_sound_samples/cry_skitty.bin" + .incbin "sound/direct_sound_samples/cries/skitty.bin" .align 2 Cry_Delcatty:: - .incbin "sound/direct_sound_samples/cry_delcatty.bin" + .incbin "sound/direct_sound_samples/cries/delcatty.bin" .align 2 Cry_Gulpin:: - .incbin "sound/direct_sound_samples/cry_gulpin.bin" + .incbin "sound/direct_sound_samples/cries/gulpin.bin" .align 2 Cry_Swalot:: - .incbin "sound/direct_sound_samples/cry_swalot.bin" + .incbin "sound/direct_sound_samples/cries/swalot.bin" .align 2 Cry_Numel:: - .incbin "sound/direct_sound_samples/cry_numel.bin" + .incbin "sound/direct_sound_samples/cries/numel.bin" .align 2 Cry_Camerupt:: - .incbin "sound/direct_sound_samples/cry_camerupt.bin" + .incbin "sound/direct_sound_samples/cries/camerupt.bin" .align 2 Cry_Barboach:: - .incbin "sound/direct_sound_samples/cry_barboach.bin" + .incbin "sound/direct_sound_samples/cries/barboach.bin" .align 2 Cry_Whiscash:: - .incbin "sound/direct_sound_samples/cry_whiscash.bin" + .incbin "sound/direct_sound_samples/cries/whiscash.bin" .align 2 Cry_Corphish:: - .incbin "sound/direct_sound_samples/cry_corphish.bin" + .incbin "sound/direct_sound_samples/cries/corphish.bin" .align 2 Cry_Crawdaunt:: - .incbin "sound/direct_sound_samples/cry_crawdaunt.bin" + .incbin "sound/direct_sound_samples/cries/crawdaunt.bin" .align 2 Cry_Spoink:: - .incbin "sound/direct_sound_samples/cry_spoink.bin" + .incbin "sound/direct_sound_samples/cries/spoink.bin" .align 2 Cry_Grumpig:: - .incbin "sound/direct_sound_samples/cry_grumpig.bin" + .incbin "sound/direct_sound_samples/cries/grumpig.bin" .align 2 Cry_Trapinch:: - .incbin "sound/direct_sound_samples/cry_trapinch.bin" + .incbin "sound/direct_sound_samples/cries/trapinch.bin" .align 2 Cry_Vibrava:: - .incbin "sound/direct_sound_samples/cry_vibrava.bin" + .incbin "sound/direct_sound_samples/cries/vibrava.bin" .align 2 Cry_Flygon:: - .incbin "sound/direct_sound_samples/cry_flygon.bin" + .incbin "sound/direct_sound_samples/cries/flygon.bin" .align 2 Cry_Cacnea:: - .incbin "sound/direct_sound_samples/cry_cacnea.bin" + .incbin "sound/direct_sound_samples/cries/cacnea.bin" .align 2 Cry_Cacturne:: - .incbin "sound/direct_sound_samples/cry_cacturne.bin" + .incbin "sound/direct_sound_samples/cries/cacturne.bin" .align 2 Cry_Baltoy:: - .incbin "sound/direct_sound_samples/cry_baltoy.bin" + .incbin "sound/direct_sound_samples/cries/baltoy.bin" .align 2 Cry_Claydol:: - .incbin "sound/direct_sound_samples/cry_claydol.bin" + .incbin "sound/direct_sound_samples/cries/claydol.bin" .align 2 Cry_Lunatone:: - .incbin "sound/direct_sound_samples/cry_lunatone.bin" + .incbin "sound/direct_sound_samples/cries/lunatone.bin" .align 2 Cry_Solrock:: - .incbin "sound/direct_sound_samples/cry_solrock.bin" + .incbin "sound/direct_sound_samples/cries/solrock.bin" .align 2 Cry_Feebas:: - .incbin "sound/direct_sound_samples/cry_feebas.bin" + .incbin "sound/direct_sound_samples/cries/feebas.bin" .align 2 Cry_Milotic:: - .incbin "sound/direct_sound_samples/cry_milotic.bin" + .incbin "sound/direct_sound_samples/cries/milotic.bin" .align 2 Cry_Absol:: - .incbin "sound/direct_sound_samples/cry_absol.bin" + .incbin "sound/direct_sound_samples/cries/absol.bin" .align 2 Cry_Meditite:: - .incbin "sound/direct_sound_samples/cry_meditite.bin" + .incbin "sound/direct_sound_samples/cries/meditite.bin" .align 2 Cry_Medicham:: - .incbin "sound/direct_sound_samples/cry_medicham.bin" + .incbin "sound/direct_sound_samples/cries/medicham.bin" .align 2 Cry_Spheal:: - .incbin "sound/direct_sound_samples/cry_spheal.bin" + .incbin "sound/direct_sound_samples/cries/spheal.bin" .align 2 Cry_Sealeo:: - .incbin "sound/direct_sound_samples/cry_sealeo.bin" + .incbin "sound/direct_sound_samples/cries/sealeo.bin" .align 2 Cry_Walrein:: - .incbin "sound/direct_sound_samples/cry_walrein.bin" + .incbin "sound/direct_sound_samples/cries/walrein.bin" .align 2 Cry_Clamperl:: - .incbin "sound/direct_sound_samples/cry_clamperl.bin" + .incbin "sound/direct_sound_samples/cries/clamperl.bin" .align 2 Cry_Huntail:: - .incbin "sound/direct_sound_samples/cry_huntail.bin" + .incbin "sound/direct_sound_samples/cries/huntail.bin" .align 2 Cry_Gorebyss:: - .incbin "sound/direct_sound_samples/cry_gorebyss.bin" + .incbin "sound/direct_sound_samples/cries/gorebyss.bin" .align 2 Cry_Lileep:: - .incbin "sound/direct_sound_samples/cry_lileep.bin" + .incbin "sound/direct_sound_samples/cries/lileep.bin" .align 2 Cry_Cradily:: - .incbin "sound/direct_sound_samples/cry_cradily.bin" + .incbin "sound/direct_sound_samples/cries/cradily.bin" .align 2 Cry_Anorith:: - .incbin "sound/direct_sound_samples/cry_anorith.bin" + .incbin "sound/direct_sound_samples/cries/anorith.bin" .align 2 Cry_Armaldo:: - .incbin "sound/direct_sound_samples/cry_armaldo.bin" + .incbin "sound/direct_sound_samples/cries/armaldo.bin" .align 2 Cry_Beldum:: - .incbin "sound/direct_sound_samples/cry_beldum.bin" + .incbin "sound/direct_sound_samples/cries/beldum.bin" .align 2 Cry_Metang:: - .incbin "sound/direct_sound_samples/cry_metang.bin" + .incbin "sound/direct_sound_samples/cries/metang.bin" .align 2 Cry_Metagross:: - .incbin "sound/direct_sound_samples/cry_metagross.bin" + .incbin "sound/direct_sound_samples/cries/metagross.bin" .align 2 Cry_Bagon:: - .incbin "sound/direct_sound_samples/cry_bagon.bin" + .incbin "sound/direct_sound_samples/cries/bagon.bin" .align 2 Cry_Shelgon:: - .incbin "sound/direct_sound_samples/cry_shelgon.bin" + .incbin "sound/direct_sound_samples/cries/shelgon.bin" .align 2 Cry_Regirock:: - .incbin "sound/direct_sound_samples/cry_regirock.bin" + .incbin "sound/direct_sound_samples/cries/regirock.bin" .align 2 Cry_Regice:: - .incbin "sound/direct_sound_samples/cry_regice.bin" + .incbin "sound/direct_sound_samples/cries/regice.bin" .align 2 Cry_Registeel:: - .incbin "sound/direct_sound_samples/cry_registeel.bin" + .incbin "sound/direct_sound_samples/cries/registeel.bin" .align 2 Cry_Castform:: - .incbin "sound/direct_sound_samples/cry_castform.bin" + .incbin "sound/direct_sound_samples/cries/castform.bin" .align 2 Cry_Volbeat:: - .incbin "sound/direct_sound_samples/cry_volbeat.bin" + .incbin "sound/direct_sound_samples/cries/volbeat.bin" .align 2 Cry_Illumise:: - .incbin "sound/direct_sound_samples/cry_illumise.bin" + .incbin "sound/direct_sound_samples/cries/illumise.bin" .align 2 Cry_Poochyena:: - .incbin "sound/direct_sound_samples/cry_poochyena.bin" + .incbin "sound/direct_sound_samples/cries/poochyena.bin" .align 2 Cry_Mightyena:: - .incbin "sound/direct_sound_samples/cry_mightyena.bin" + .incbin "sound/direct_sound_samples/cries/mightyena.bin" .align 2 Cry_Dusclops:: - .incbin "sound/direct_sound_samples/cry_dusclops.bin" + .incbin "sound/direct_sound_samples/cries/dusclops.bin" .align 2 Cry_Sableye:: - .incbin "sound/direct_sound_samples/cry_sableye.bin" + .incbin "sound/direct_sound_samples/cries/sableye.bin" .align 2 Cry_Mawile:: - .incbin "sound/direct_sound_samples/cry_mawile.bin" + .incbin "sound/direct_sound_samples/cries/mawile.bin" .align 2 Cry_Aron:: - .incbin "sound/direct_sound_samples/cry_aron.bin" + .incbin "sound/direct_sound_samples/cries/aron.bin" .align 2 Cry_Lairon:: - .incbin "sound/direct_sound_samples/cry_lairon.bin" + .incbin "sound/direct_sound_samples/cries/lairon.bin" .align 2 Cry_Aggron:: - .incbin "sound/direct_sound_samples/cry_aggron.bin" + .incbin "sound/direct_sound_samples/cries/aggron.bin" .align 2 Cry_Relicanth:: - .incbin "sound/direct_sound_samples/cry_relicanth.bin" + .incbin "sound/direct_sound_samples/cries/relicanth.bin" .align 2 Cry_Luvdisc:: - .incbin "sound/direct_sound_samples/cry_luvdisc.bin" + .incbin "sound/direct_sound_samples/cries/luvdisc.bin" .align 2 Cry_Groudon:: - .incbin "sound/direct_sound_samples/cry_groudon.bin" + .incbin "sound/direct_sound_samples/cries/groudon.bin" .align 2 Cry_Kyogre:: - .incbin "sound/direct_sound_samples/cry_kyogre.bin" + .incbin "sound/direct_sound_samples/cries/kyogre.bin" .align 2 Cry_Rayquaza:: - .incbin "sound/direct_sound_samples/cry_rayquaza.bin" + .incbin "sound/direct_sound_samples/cries/rayquaza.bin" .align 2 Cry_Salamence:: - .incbin "sound/direct_sound_samples/cry_salamence.bin" + .incbin "sound/direct_sound_samples/cries/salamence.bin" .align 2 Cry_Breloom:: - .incbin "sound/direct_sound_samples/cry_breloom.bin" + .incbin "sound/direct_sound_samples/cries/breloom.bin" .align 2 Cry_Shroomish:: - .incbin "sound/direct_sound_samples/cry_shroomish.bin" + .incbin "sound/direct_sound_samples/cries/shroomish.bin" .align 2 Cry_Linoone:: - .incbin "sound/direct_sound_samples/cry_linoone.bin" + .incbin "sound/direct_sound_samples/cries/linoone.bin" .align 2 Cry_Tropius:: - .incbin "sound/direct_sound_samples/cry_tropius.bin" + .incbin "sound/direct_sound_samples/cries/tropius.bin" .align 2 Cry_Wailmer:: - .incbin "sound/direct_sound_samples/cry_wailmer.bin" + .incbin "sound/direct_sound_samples/cries/wailmer.bin" .align 2 Cry_Zigzagoon:: - .incbin "sound/direct_sound_samples/cry_zigzagoon.bin" + .incbin "sound/direct_sound_samples/cries/zigzagoon.bin" .align 2 Cry_Exploud:: - .incbin "sound/direct_sound_samples/cry_exploud.bin" + .incbin "sound/direct_sound_samples/cries/exploud.bin" .align 2 Cry_Loudred:: - .incbin "sound/direct_sound_samples/cry_loudred.bin" + .incbin "sound/direct_sound_samples/cries/loudred.bin" .align 2 Cry_Wailord:: - .incbin "sound/direct_sound_samples/cry_wailord.bin" + .incbin "sound/direct_sound_samples/cries/wailord.bin" .align 2 Cry_Whismur:: - .incbin "sound/direct_sound_samples/cry_whismur.bin" + .incbin "sound/direct_sound_samples/cries/whismur.bin" .align 2 Cry_Snorunt:: - .incbin "sound/direct_sound_samples/cry_snorunt.bin" + .incbin "sound/direct_sound_samples/cries/snorunt.bin" .align 2 Cry_Latios:: - .incbin "sound/direct_sound_samples/cry_latios.bin" + .incbin "sound/direct_sound_samples/cries/latios.bin" .align 2 Cry_Jirachi:: - .incbin "sound/direct_sound_samples/cry_jirachi.bin" + .incbin "sound/direct_sound_samples/cries/jirachi.bin" .align 2 Cry_Deoxys:: - .incbin "sound/direct_sound_samples/cry_deoxys.bin" + .incbin "sound/direct_sound_samples/cries/deoxys.bin" .align 2 Cry_Chimecho:: - .incbin "sound/direct_sound_samples/cry_chimecho.bin" + .incbin "sound/direct_sound_samples/cries/chimecho.bin" .align 2 DirectSoundWaveData_register_noise:: diff --git a/sound/direct_sound_samples/cries/abra.aif b/sound/direct_sound_samples/cries/abra.aif new file mode 100644 index 000000000..7df4446db Binary files /dev/null and b/sound/direct_sound_samples/cries/abra.aif differ diff --git a/sound/direct_sound_samples/cries/absol.aif b/sound/direct_sound_samples/cries/absol.aif new file mode 100644 index 000000000..884ab22b3 Binary files /dev/null and b/sound/direct_sound_samples/cries/absol.aif differ diff --git a/sound/direct_sound_samples/cries/aerodactyl.aif b/sound/direct_sound_samples/cries/aerodactyl.aif new file mode 100644 index 000000000..c0e40f6d1 Binary files /dev/null and b/sound/direct_sound_samples/cries/aerodactyl.aif differ diff --git a/sound/direct_sound_samples/cries/aggron.aif b/sound/direct_sound_samples/cries/aggron.aif new file mode 100644 index 000000000..b89ea1222 Binary files /dev/null and b/sound/direct_sound_samples/cries/aggron.aif differ diff --git a/sound/direct_sound_samples/cries/aipom.aif b/sound/direct_sound_samples/cries/aipom.aif new file mode 100644 index 000000000..5ca276de2 Binary files /dev/null and b/sound/direct_sound_samples/cries/aipom.aif differ diff --git a/sound/direct_sound_samples/cries/alakazam.aif b/sound/direct_sound_samples/cries/alakazam.aif new file mode 100644 index 000000000..920e2ff94 Binary files /dev/null and b/sound/direct_sound_samples/cries/alakazam.aif differ diff --git a/sound/direct_sound_samples/cries/altaria.aif b/sound/direct_sound_samples/cries/altaria.aif new file mode 100644 index 000000000..3e8e35e8e Binary files /dev/null and b/sound/direct_sound_samples/cries/altaria.aif differ diff --git a/sound/direct_sound_samples/cries/ampharos.aif b/sound/direct_sound_samples/cries/ampharos.aif new file mode 100644 index 000000000..4f6e255a0 Binary files /dev/null and b/sound/direct_sound_samples/cries/ampharos.aif differ diff --git a/sound/direct_sound_samples/cries/anorith.aif b/sound/direct_sound_samples/cries/anorith.aif new file mode 100644 index 000000000..96e87e919 Binary files /dev/null and b/sound/direct_sound_samples/cries/anorith.aif differ diff --git a/sound/direct_sound_samples/cries/arbok.aif b/sound/direct_sound_samples/cries/arbok.aif new file mode 100644 index 000000000..6ccace9f9 Binary files /dev/null and b/sound/direct_sound_samples/cries/arbok.aif differ diff --git a/sound/direct_sound_samples/cries/arcanine.aif b/sound/direct_sound_samples/cries/arcanine.aif new file mode 100644 index 000000000..61d802153 Binary files /dev/null and b/sound/direct_sound_samples/cries/arcanine.aif differ diff --git a/sound/direct_sound_samples/cries/ariados.aif b/sound/direct_sound_samples/cries/ariados.aif new file mode 100644 index 000000000..1748624fb Binary files /dev/null and b/sound/direct_sound_samples/cries/ariados.aif differ diff --git a/sound/direct_sound_samples/cries/armaldo.aif b/sound/direct_sound_samples/cries/armaldo.aif new file mode 100644 index 000000000..756bf0842 Binary files /dev/null and b/sound/direct_sound_samples/cries/armaldo.aif differ diff --git a/sound/direct_sound_samples/cries/aron.aif b/sound/direct_sound_samples/cries/aron.aif new file mode 100644 index 000000000..cce70b73b Binary files /dev/null and b/sound/direct_sound_samples/cries/aron.aif differ diff --git a/sound/direct_sound_samples/cries/articuno.aif b/sound/direct_sound_samples/cries/articuno.aif new file mode 100644 index 000000000..4f237dd0f Binary files /dev/null and b/sound/direct_sound_samples/cries/articuno.aif differ diff --git a/sound/direct_sound_samples/cries/azumarill.aif b/sound/direct_sound_samples/cries/azumarill.aif new file mode 100644 index 000000000..18411f93c Binary files /dev/null and b/sound/direct_sound_samples/cries/azumarill.aif differ diff --git a/sound/direct_sound_samples/cries/azurill.aif b/sound/direct_sound_samples/cries/azurill.aif new file mode 100644 index 000000000..7f651c3d3 Binary files /dev/null and b/sound/direct_sound_samples/cries/azurill.aif differ diff --git a/sound/direct_sound_samples/cries/bagon.aif b/sound/direct_sound_samples/cries/bagon.aif new file mode 100644 index 000000000..3843fb9f4 Binary files /dev/null and b/sound/direct_sound_samples/cries/bagon.aif differ diff --git a/sound/direct_sound_samples/cries/baltoy.aif b/sound/direct_sound_samples/cries/baltoy.aif new file mode 100644 index 000000000..25e1a708a Binary files /dev/null and b/sound/direct_sound_samples/cries/baltoy.aif differ diff --git a/sound/direct_sound_samples/cries/banette.aif b/sound/direct_sound_samples/cries/banette.aif new file mode 100644 index 000000000..23713f1b5 Binary files /dev/null and b/sound/direct_sound_samples/cries/banette.aif differ diff --git a/sound/direct_sound_samples/cries/barboach.aif b/sound/direct_sound_samples/cries/barboach.aif new file mode 100644 index 000000000..4b9228259 Binary files /dev/null and b/sound/direct_sound_samples/cries/barboach.aif differ diff --git a/sound/direct_sound_samples/cries/bayleef.aif b/sound/direct_sound_samples/cries/bayleef.aif new file mode 100644 index 000000000..8cef22df3 Binary files /dev/null and b/sound/direct_sound_samples/cries/bayleef.aif differ diff --git a/sound/direct_sound_samples/cries/beautifly.aif b/sound/direct_sound_samples/cries/beautifly.aif new file mode 100644 index 000000000..0924b6c55 Binary files /dev/null and b/sound/direct_sound_samples/cries/beautifly.aif differ diff --git a/sound/direct_sound_samples/cries/beedrill.aif b/sound/direct_sound_samples/cries/beedrill.aif new file mode 100644 index 000000000..00d0bc96c Binary files /dev/null and b/sound/direct_sound_samples/cries/beedrill.aif differ diff --git a/sound/direct_sound_samples/cries/beldum.aif b/sound/direct_sound_samples/cries/beldum.aif new file mode 100644 index 000000000..76435a6a8 Binary files /dev/null and b/sound/direct_sound_samples/cries/beldum.aif differ diff --git a/sound/direct_sound_samples/cries/bellossom.aif b/sound/direct_sound_samples/cries/bellossom.aif new file mode 100644 index 000000000..86580df65 Binary files /dev/null and b/sound/direct_sound_samples/cries/bellossom.aif differ diff --git a/sound/direct_sound_samples/cries/bellsprout.aif b/sound/direct_sound_samples/cries/bellsprout.aif new file mode 100644 index 000000000..cfdd7aed2 Binary files /dev/null and b/sound/direct_sound_samples/cries/bellsprout.aif differ diff --git a/sound/direct_sound_samples/cries/blastoise.aif b/sound/direct_sound_samples/cries/blastoise.aif new file mode 100644 index 000000000..76dac2bcc Binary files /dev/null and b/sound/direct_sound_samples/cries/blastoise.aif differ diff --git a/sound/direct_sound_samples/cries/blaziken.aif b/sound/direct_sound_samples/cries/blaziken.aif new file mode 100644 index 000000000..83e5ccf23 Binary files /dev/null and b/sound/direct_sound_samples/cries/blaziken.aif differ diff --git a/sound/direct_sound_samples/cries/blissey.aif b/sound/direct_sound_samples/cries/blissey.aif new file mode 100644 index 000000000..897eb3d69 Binary files /dev/null and b/sound/direct_sound_samples/cries/blissey.aif differ diff --git a/sound/direct_sound_samples/cries/breloom.aif b/sound/direct_sound_samples/cries/breloom.aif new file mode 100644 index 000000000..ea3f1bb66 Binary files /dev/null and b/sound/direct_sound_samples/cries/breloom.aif differ diff --git a/sound/direct_sound_samples/cries/bulbasaur.aif b/sound/direct_sound_samples/cries/bulbasaur.aif new file mode 100644 index 000000000..040fb1df7 Binary files /dev/null and b/sound/direct_sound_samples/cries/bulbasaur.aif differ diff --git a/sound/direct_sound_samples/cries/butterfree.aif b/sound/direct_sound_samples/cries/butterfree.aif new file mode 100644 index 000000000..f27616395 Binary files /dev/null and b/sound/direct_sound_samples/cries/butterfree.aif differ diff --git a/sound/direct_sound_samples/cries/cacnea.aif b/sound/direct_sound_samples/cries/cacnea.aif new file mode 100644 index 000000000..4fd5acd36 Binary files /dev/null and b/sound/direct_sound_samples/cries/cacnea.aif differ diff --git a/sound/direct_sound_samples/cries/cacturne.aif b/sound/direct_sound_samples/cries/cacturne.aif new file mode 100644 index 000000000..d9fb8fda8 Binary files /dev/null and b/sound/direct_sound_samples/cries/cacturne.aif differ diff --git a/sound/direct_sound_samples/cries/camerupt.aif b/sound/direct_sound_samples/cries/camerupt.aif new file mode 100644 index 000000000..325df1220 Binary files /dev/null and b/sound/direct_sound_samples/cries/camerupt.aif differ diff --git a/sound/direct_sound_samples/cries/carvanha.aif b/sound/direct_sound_samples/cries/carvanha.aif new file mode 100644 index 000000000..c7cdedf91 Binary files /dev/null and b/sound/direct_sound_samples/cries/carvanha.aif differ diff --git a/sound/direct_sound_samples/cries/cascoon.aif b/sound/direct_sound_samples/cries/cascoon.aif new file mode 100644 index 000000000..17eef0ee9 Binary files /dev/null and b/sound/direct_sound_samples/cries/cascoon.aif differ diff --git a/sound/direct_sound_samples/cries/castform.aif b/sound/direct_sound_samples/cries/castform.aif new file mode 100644 index 000000000..c10745640 Binary files /dev/null and b/sound/direct_sound_samples/cries/castform.aif differ diff --git a/sound/direct_sound_samples/cries/caterpie.aif b/sound/direct_sound_samples/cries/caterpie.aif new file mode 100644 index 000000000..b0b246b4f Binary files /dev/null and b/sound/direct_sound_samples/cries/caterpie.aif differ diff --git a/sound/direct_sound_samples/cries/celebi.aif b/sound/direct_sound_samples/cries/celebi.aif new file mode 100644 index 000000000..9f9f3ea39 Binary files /dev/null and b/sound/direct_sound_samples/cries/celebi.aif differ diff --git a/sound/direct_sound_samples/cries/chansey.aif b/sound/direct_sound_samples/cries/chansey.aif new file mode 100644 index 000000000..d764c86ce Binary files /dev/null and b/sound/direct_sound_samples/cries/chansey.aif differ diff --git a/sound/direct_sound_samples/cries/charizard.aif b/sound/direct_sound_samples/cries/charizard.aif new file mode 100644 index 000000000..48321b792 Binary files /dev/null and b/sound/direct_sound_samples/cries/charizard.aif differ diff --git a/sound/direct_sound_samples/cries/charmander.aif b/sound/direct_sound_samples/cries/charmander.aif new file mode 100644 index 000000000..d72c0f9e0 Binary files /dev/null and b/sound/direct_sound_samples/cries/charmander.aif differ diff --git a/sound/direct_sound_samples/cries/charmeleon.aif b/sound/direct_sound_samples/cries/charmeleon.aif new file mode 100644 index 000000000..8e84af0d8 Binary files /dev/null and b/sound/direct_sound_samples/cries/charmeleon.aif differ diff --git a/sound/direct_sound_samples/cries/chikorita.aif b/sound/direct_sound_samples/cries/chikorita.aif new file mode 100644 index 000000000..67ceafdc3 Binary files /dev/null and b/sound/direct_sound_samples/cries/chikorita.aif differ diff --git a/sound/direct_sound_samples/cries/chimecho.aif b/sound/direct_sound_samples/cries/chimecho.aif new file mode 100644 index 000000000..87ee2faee Binary files /dev/null and b/sound/direct_sound_samples/cries/chimecho.aif differ diff --git a/sound/direct_sound_samples/cries/chinchou.aif b/sound/direct_sound_samples/cries/chinchou.aif new file mode 100644 index 000000000..356475678 Binary files /dev/null and b/sound/direct_sound_samples/cries/chinchou.aif differ diff --git a/sound/direct_sound_samples/cries/clamperl.aif b/sound/direct_sound_samples/cries/clamperl.aif new file mode 100644 index 000000000..7250bd703 Binary files /dev/null and b/sound/direct_sound_samples/cries/clamperl.aif differ diff --git a/sound/direct_sound_samples/cries/claydol.aif b/sound/direct_sound_samples/cries/claydol.aif new file mode 100644 index 000000000..b89772021 Binary files /dev/null and b/sound/direct_sound_samples/cries/claydol.aif differ diff --git a/sound/direct_sound_samples/cries/clefable.aif b/sound/direct_sound_samples/cries/clefable.aif new file mode 100644 index 000000000..9c2d8c664 Binary files /dev/null and b/sound/direct_sound_samples/cries/clefable.aif differ diff --git a/sound/direct_sound_samples/cries/clefairy.aif b/sound/direct_sound_samples/cries/clefairy.aif new file mode 100644 index 000000000..c370c4a9b Binary files /dev/null and b/sound/direct_sound_samples/cries/clefairy.aif differ diff --git a/sound/direct_sound_samples/cries/cleffa.aif b/sound/direct_sound_samples/cries/cleffa.aif new file mode 100644 index 000000000..b27cdeca9 Binary files /dev/null and b/sound/direct_sound_samples/cries/cleffa.aif differ diff --git a/sound/direct_sound_samples/cries/cloyster.aif b/sound/direct_sound_samples/cries/cloyster.aif new file mode 100644 index 000000000..b406deab0 Binary files /dev/null and b/sound/direct_sound_samples/cries/cloyster.aif differ diff --git a/sound/direct_sound_samples/cries/combusken.aif b/sound/direct_sound_samples/cries/combusken.aif new file mode 100644 index 000000000..7d4b0d4cc Binary files /dev/null and b/sound/direct_sound_samples/cries/combusken.aif differ diff --git a/sound/direct_sound_samples/cries/corphish.aif b/sound/direct_sound_samples/cries/corphish.aif new file mode 100644 index 000000000..f0f5ca01e Binary files /dev/null and b/sound/direct_sound_samples/cries/corphish.aif differ diff --git a/sound/direct_sound_samples/cries/corsola.aif b/sound/direct_sound_samples/cries/corsola.aif new file mode 100644 index 000000000..68e743bfd Binary files /dev/null and b/sound/direct_sound_samples/cries/corsola.aif differ diff --git a/sound/direct_sound_samples/cries/cradily.aif b/sound/direct_sound_samples/cries/cradily.aif new file mode 100644 index 000000000..197dc8d92 Binary files /dev/null and b/sound/direct_sound_samples/cries/cradily.aif differ diff --git a/sound/direct_sound_samples/cries/crawdaunt.aif b/sound/direct_sound_samples/cries/crawdaunt.aif new file mode 100644 index 000000000..a203ce2fb Binary files /dev/null and b/sound/direct_sound_samples/cries/crawdaunt.aif differ diff --git a/sound/direct_sound_samples/cries/crobat.aif b/sound/direct_sound_samples/cries/crobat.aif new file mode 100644 index 000000000..75d039bd8 Binary files /dev/null and b/sound/direct_sound_samples/cries/crobat.aif differ diff --git a/sound/direct_sound_samples/cries/croconaw.aif b/sound/direct_sound_samples/cries/croconaw.aif new file mode 100644 index 000000000..afb7f3fdc Binary files /dev/null and b/sound/direct_sound_samples/cries/croconaw.aif differ diff --git a/sound/direct_sound_samples/cries/cubone.aif b/sound/direct_sound_samples/cries/cubone.aif new file mode 100644 index 000000000..170745da1 Binary files /dev/null and b/sound/direct_sound_samples/cries/cubone.aif differ diff --git a/sound/direct_sound_samples/cries/cyndaquil.aif b/sound/direct_sound_samples/cries/cyndaquil.aif new file mode 100644 index 000000000..4aa580199 Binary files /dev/null and b/sound/direct_sound_samples/cries/cyndaquil.aif differ diff --git a/sound/direct_sound_samples/cries/delcatty.aif b/sound/direct_sound_samples/cries/delcatty.aif new file mode 100644 index 000000000..dd665b110 Binary files /dev/null and b/sound/direct_sound_samples/cries/delcatty.aif differ diff --git a/sound/direct_sound_samples/cries/delibird.aif b/sound/direct_sound_samples/cries/delibird.aif new file mode 100644 index 000000000..dbedc42d4 Binary files /dev/null and b/sound/direct_sound_samples/cries/delibird.aif differ diff --git a/sound/direct_sound_samples/cries/deoxys.aif b/sound/direct_sound_samples/cries/deoxys.aif new file mode 100644 index 000000000..b9623b337 Binary files /dev/null and b/sound/direct_sound_samples/cries/deoxys.aif differ diff --git a/sound/direct_sound_samples/cries/dewgong.aif b/sound/direct_sound_samples/cries/dewgong.aif new file mode 100644 index 000000000..72d69b773 Binary files /dev/null and b/sound/direct_sound_samples/cries/dewgong.aif differ diff --git a/sound/direct_sound_samples/cries/diglett.aif b/sound/direct_sound_samples/cries/diglett.aif new file mode 100644 index 000000000..b116af7f2 Binary files /dev/null and b/sound/direct_sound_samples/cries/diglett.aif differ diff --git a/sound/direct_sound_samples/cries/ditto.aif b/sound/direct_sound_samples/cries/ditto.aif new file mode 100644 index 000000000..2c797f4c4 Binary files /dev/null and b/sound/direct_sound_samples/cries/ditto.aif differ diff --git a/sound/direct_sound_samples/cries/dodrio.aif b/sound/direct_sound_samples/cries/dodrio.aif new file mode 100644 index 000000000..111d8bf3e Binary files /dev/null and b/sound/direct_sound_samples/cries/dodrio.aif differ diff --git a/sound/direct_sound_samples/cries/doduo.aif b/sound/direct_sound_samples/cries/doduo.aif new file mode 100644 index 000000000..5700b91d9 Binary files /dev/null and b/sound/direct_sound_samples/cries/doduo.aif differ diff --git a/sound/direct_sound_samples/cries/donphan.aif b/sound/direct_sound_samples/cries/donphan.aif new file mode 100644 index 000000000..a41c124b1 Binary files /dev/null and b/sound/direct_sound_samples/cries/donphan.aif differ diff --git a/sound/direct_sound_samples/cries/dragonair.aif b/sound/direct_sound_samples/cries/dragonair.aif new file mode 100644 index 000000000..38c3955ef Binary files /dev/null and b/sound/direct_sound_samples/cries/dragonair.aif differ diff --git a/sound/direct_sound_samples/cries/dragonite.aif b/sound/direct_sound_samples/cries/dragonite.aif new file mode 100644 index 000000000..d1e7b11cf Binary files /dev/null and b/sound/direct_sound_samples/cries/dragonite.aif differ diff --git a/sound/direct_sound_samples/cries/dratini.aif b/sound/direct_sound_samples/cries/dratini.aif new file mode 100644 index 000000000..298497480 Binary files /dev/null and b/sound/direct_sound_samples/cries/dratini.aif differ diff --git a/sound/direct_sound_samples/cries/drowzee.aif b/sound/direct_sound_samples/cries/drowzee.aif new file mode 100644 index 000000000..0d53eb2ff Binary files /dev/null and b/sound/direct_sound_samples/cries/drowzee.aif differ diff --git a/sound/direct_sound_samples/cries/dugtrio.aif b/sound/direct_sound_samples/cries/dugtrio.aif new file mode 100644 index 000000000..dff573dfe Binary files /dev/null and b/sound/direct_sound_samples/cries/dugtrio.aif differ diff --git a/sound/direct_sound_samples/cries/dunsparce.aif b/sound/direct_sound_samples/cries/dunsparce.aif new file mode 100644 index 000000000..454617c05 Binary files /dev/null and b/sound/direct_sound_samples/cries/dunsparce.aif differ diff --git a/sound/direct_sound_samples/cries/dusclops.aif b/sound/direct_sound_samples/cries/dusclops.aif new file mode 100644 index 000000000..de9657e4f Binary files /dev/null and b/sound/direct_sound_samples/cries/dusclops.aif differ diff --git a/sound/direct_sound_samples/cries/duskull.aif b/sound/direct_sound_samples/cries/duskull.aif new file mode 100644 index 000000000..d84ea274e Binary files /dev/null and b/sound/direct_sound_samples/cries/duskull.aif differ diff --git a/sound/direct_sound_samples/cries/dustox.aif b/sound/direct_sound_samples/cries/dustox.aif new file mode 100644 index 000000000..56d8eb336 Binary files /dev/null and b/sound/direct_sound_samples/cries/dustox.aif differ diff --git a/sound/direct_sound_samples/cries/eevee.aif b/sound/direct_sound_samples/cries/eevee.aif new file mode 100644 index 000000000..8711a1470 Binary files /dev/null and b/sound/direct_sound_samples/cries/eevee.aif differ diff --git a/sound/direct_sound_samples/cries/ekans.aif b/sound/direct_sound_samples/cries/ekans.aif new file mode 100644 index 000000000..9eb396735 Binary files /dev/null and b/sound/direct_sound_samples/cries/ekans.aif differ diff --git a/sound/direct_sound_samples/cries/electabuzz.aif b/sound/direct_sound_samples/cries/electabuzz.aif new file mode 100644 index 000000000..5abdb49b7 Binary files /dev/null and b/sound/direct_sound_samples/cries/electabuzz.aif differ diff --git a/sound/direct_sound_samples/cries/electrike.aif b/sound/direct_sound_samples/cries/electrike.aif new file mode 100644 index 000000000..56c9666df Binary files /dev/null and b/sound/direct_sound_samples/cries/electrike.aif differ diff --git a/sound/direct_sound_samples/cries/electrode.aif b/sound/direct_sound_samples/cries/electrode.aif new file mode 100644 index 000000000..cbd7f0971 Binary files /dev/null and b/sound/direct_sound_samples/cries/electrode.aif differ diff --git a/sound/direct_sound_samples/cries/elekid.aif b/sound/direct_sound_samples/cries/elekid.aif new file mode 100644 index 000000000..839bdee17 Binary files /dev/null and b/sound/direct_sound_samples/cries/elekid.aif differ diff --git a/sound/direct_sound_samples/cries/entei.aif b/sound/direct_sound_samples/cries/entei.aif new file mode 100644 index 000000000..56a740207 Binary files /dev/null and b/sound/direct_sound_samples/cries/entei.aif differ diff --git a/sound/direct_sound_samples/cries/espeon.aif b/sound/direct_sound_samples/cries/espeon.aif new file mode 100644 index 000000000..53dc62f4d Binary files /dev/null and b/sound/direct_sound_samples/cries/espeon.aif differ diff --git a/sound/direct_sound_samples/cries/exeggcute.aif b/sound/direct_sound_samples/cries/exeggcute.aif new file mode 100644 index 000000000..147912c2f Binary files /dev/null and b/sound/direct_sound_samples/cries/exeggcute.aif differ diff --git a/sound/direct_sound_samples/cries/exeggutor.aif b/sound/direct_sound_samples/cries/exeggutor.aif new file mode 100644 index 000000000..c0b9177bf Binary files /dev/null and b/sound/direct_sound_samples/cries/exeggutor.aif differ diff --git a/sound/direct_sound_samples/cries/exploud.aif b/sound/direct_sound_samples/cries/exploud.aif new file mode 100644 index 000000000..5b80870cc Binary files /dev/null and b/sound/direct_sound_samples/cries/exploud.aif differ diff --git a/sound/direct_sound_samples/cries/farfetchd.aif b/sound/direct_sound_samples/cries/farfetchd.aif new file mode 100644 index 000000000..f1db556dc Binary files /dev/null and b/sound/direct_sound_samples/cries/farfetchd.aif differ diff --git a/sound/direct_sound_samples/cries/fearow.aif b/sound/direct_sound_samples/cries/fearow.aif new file mode 100644 index 000000000..74a76f6d4 Binary files /dev/null and b/sound/direct_sound_samples/cries/fearow.aif differ diff --git a/sound/direct_sound_samples/cries/feebas.aif b/sound/direct_sound_samples/cries/feebas.aif new file mode 100644 index 000000000..c386522f1 Binary files /dev/null and b/sound/direct_sound_samples/cries/feebas.aif differ diff --git a/sound/direct_sound_samples/cries/feraligatr.aif b/sound/direct_sound_samples/cries/feraligatr.aif new file mode 100644 index 000000000..9fcd93cff Binary files /dev/null and b/sound/direct_sound_samples/cries/feraligatr.aif differ diff --git a/sound/direct_sound_samples/cries/flaaffy.aif b/sound/direct_sound_samples/cries/flaaffy.aif new file mode 100644 index 000000000..93dfacfaf Binary files /dev/null and b/sound/direct_sound_samples/cries/flaaffy.aif differ diff --git a/sound/direct_sound_samples/cries/flareon.aif b/sound/direct_sound_samples/cries/flareon.aif new file mode 100644 index 000000000..58d28e60a Binary files /dev/null and b/sound/direct_sound_samples/cries/flareon.aif differ diff --git a/sound/direct_sound_samples/cries/flygon.aif b/sound/direct_sound_samples/cries/flygon.aif new file mode 100644 index 000000000..c8c377016 Binary files /dev/null and b/sound/direct_sound_samples/cries/flygon.aif differ diff --git a/sound/direct_sound_samples/cries/forretress.aif b/sound/direct_sound_samples/cries/forretress.aif new file mode 100644 index 000000000..288dacbea Binary files /dev/null and b/sound/direct_sound_samples/cries/forretress.aif differ diff --git a/sound/direct_sound_samples/cries/furret.aif b/sound/direct_sound_samples/cries/furret.aif new file mode 100644 index 000000000..6b4e9ce11 Binary files /dev/null and b/sound/direct_sound_samples/cries/furret.aif differ diff --git a/sound/direct_sound_samples/cries/gardevoir.aif b/sound/direct_sound_samples/cries/gardevoir.aif new file mode 100644 index 000000000..a14780990 Binary files /dev/null and b/sound/direct_sound_samples/cries/gardevoir.aif differ diff --git a/sound/direct_sound_samples/cries/gastly.aif b/sound/direct_sound_samples/cries/gastly.aif new file mode 100644 index 000000000..93cef851d Binary files /dev/null and b/sound/direct_sound_samples/cries/gastly.aif differ diff --git a/sound/direct_sound_samples/cries/gengar.aif b/sound/direct_sound_samples/cries/gengar.aif new file mode 100644 index 000000000..379b5d37e Binary files /dev/null and b/sound/direct_sound_samples/cries/gengar.aif differ diff --git a/sound/direct_sound_samples/cries/geodude.aif b/sound/direct_sound_samples/cries/geodude.aif new file mode 100644 index 000000000..143b9031c Binary files /dev/null and b/sound/direct_sound_samples/cries/geodude.aif differ diff --git a/sound/direct_sound_samples/cries/girafarig.aif b/sound/direct_sound_samples/cries/girafarig.aif new file mode 100644 index 000000000..1dd5f93e2 Binary files /dev/null and b/sound/direct_sound_samples/cries/girafarig.aif differ diff --git a/sound/direct_sound_samples/cries/glalie.aif b/sound/direct_sound_samples/cries/glalie.aif new file mode 100644 index 000000000..e4e896547 Binary files /dev/null and b/sound/direct_sound_samples/cries/glalie.aif differ diff --git a/sound/direct_sound_samples/cries/gligar.aif b/sound/direct_sound_samples/cries/gligar.aif new file mode 100644 index 000000000..4050f08b0 Binary files /dev/null and b/sound/direct_sound_samples/cries/gligar.aif differ diff --git a/sound/direct_sound_samples/cries/gloom.aif b/sound/direct_sound_samples/cries/gloom.aif new file mode 100644 index 000000000..e930328ac Binary files /dev/null and b/sound/direct_sound_samples/cries/gloom.aif differ diff --git a/sound/direct_sound_samples/cries/golbat.aif b/sound/direct_sound_samples/cries/golbat.aif new file mode 100644 index 000000000..11413df3a Binary files /dev/null and b/sound/direct_sound_samples/cries/golbat.aif differ diff --git a/sound/direct_sound_samples/cries/goldeen.aif b/sound/direct_sound_samples/cries/goldeen.aif new file mode 100644 index 000000000..81fd1ecdf Binary files /dev/null and b/sound/direct_sound_samples/cries/goldeen.aif differ diff --git a/sound/direct_sound_samples/cries/golduck.aif b/sound/direct_sound_samples/cries/golduck.aif new file mode 100644 index 000000000..b6b71a7a4 Binary files /dev/null and b/sound/direct_sound_samples/cries/golduck.aif differ diff --git a/sound/direct_sound_samples/cries/golem.aif b/sound/direct_sound_samples/cries/golem.aif new file mode 100644 index 000000000..0d2c4515e Binary files /dev/null and b/sound/direct_sound_samples/cries/golem.aif differ diff --git a/sound/direct_sound_samples/cries/gorebyss.aif b/sound/direct_sound_samples/cries/gorebyss.aif new file mode 100644 index 000000000..b7605062c Binary files /dev/null and b/sound/direct_sound_samples/cries/gorebyss.aif differ diff --git a/sound/direct_sound_samples/cries/granbull.aif b/sound/direct_sound_samples/cries/granbull.aif new file mode 100644 index 000000000..146b3bd0c Binary files /dev/null and b/sound/direct_sound_samples/cries/granbull.aif differ diff --git a/sound/direct_sound_samples/cries/graveler.aif b/sound/direct_sound_samples/cries/graveler.aif new file mode 100644 index 000000000..773994228 Binary files /dev/null and b/sound/direct_sound_samples/cries/graveler.aif differ diff --git a/sound/direct_sound_samples/cries/grimer.aif b/sound/direct_sound_samples/cries/grimer.aif new file mode 100644 index 000000000..95eed1061 Binary files /dev/null and b/sound/direct_sound_samples/cries/grimer.aif differ diff --git a/sound/direct_sound_samples/cries/groudon.aif b/sound/direct_sound_samples/cries/groudon.aif new file mode 100644 index 000000000..62452b4d9 Binary files /dev/null and b/sound/direct_sound_samples/cries/groudon.aif differ diff --git a/sound/direct_sound_samples/cries/grovyle.aif b/sound/direct_sound_samples/cries/grovyle.aif new file mode 100644 index 000000000..983bcfff3 Binary files /dev/null and b/sound/direct_sound_samples/cries/grovyle.aif differ diff --git a/sound/direct_sound_samples/cries/growlithe.aif b/sound/direct_sound_samples/cries/growlithe.aif new file mode 100644 index 000000000..134e29834 Binary files /dev/null and b/sound/direct_sound_samples/cries/growlithe.aif differ diff --git a/sound/direct_sound_samples/cries/grumpig.aif b/sound/direct_sound_samples/cries/grumpig.aif new file mode 100644 index 000000000..97c372076 Binary files /dev/null and b/sound/direct_sound_samples/cries/grumpig.aif differ diff --git a/sound/direct_sound_samples/cries/gulpin.aif b/sound/direct_sound_samples/cries/gulpin.aif new file mode 100644 index 000000000..f3043b422 Binary files /dev/null and b/sound/direct_sound_samples/cries/gulpin.aif differ diff --git a/sound/direct_sound_samples/cries/gyarados.aif b/sound/direct_sound_samples/cries/gyarados.aif new file mode 100644 index 000000000..238b6d721 Binary files /dev/null and b/sound/direct_sound_samples/cries/gyarados.aif differ diff --git a/sound/direct_sound_samples/cries/hariyama.aif b/sound/direct_sound_samples/cries/hariyama.aif new file mode 100644 index 000000000..1ac1f3f7e Binary files /dev/null and b/sound/direct_sound_samples/cries/hariyama.aif differ diff --git a/sound/direct_sound_samples/cries/haunter.aif b/sound/direct_sound_samples/cries/haunter.aif new file mode 100644 index 000000000..60ec72171 Binary files /dev/null and b/sound/direct_sound_samples/cries/haunter.aif differ diff --git a/sound/direct_sound_samples/cries/heracross.aif b/sound/direct_sound_samples/cries/heracross.aif new file mode 100644 index 000000000..a0734748f Binary files /dev/null and b/sound/direct_sound_samples/cries/heracross.aif differ diff --git a/sound/direct_sound_samples/cries/hitmonchan.aif b/sound/direct_sound_samples/cries/hitmonchan.aif new file mode 100644 index 000000000..40479452c Binary files /dev/null and b/sound/direct_sound_samples/cries/hitmonchan.aif differ diff --git a/sound/direct_sound_samples/cries/hitmonlee.aif b/sound/direct_sound_samples/cries/hitmonlee.aif new file mode 100644 index 000000000..3a4bcddca Binary files /dev/null and b/sound/direct_sound_samples/cries/hitmonlee.aif differ diff --git a/sound/direct_sound_samples/cries/hitmontop.aif b/sound/direct_sound_samples/cries/hitmontop.aif new file mode 100644 index 000000000..3fbee8041 Binary files /dev/null and b/sound/direct_sound_samples/cries/hitmontop.aif differ diff --git a/sound/direct_sound_samples/cries/ho_oh.aif b/sound/direct_sound_samples/cries/ho_oh.aif new file mode 100644 index 000000000..52f8dd307 Binary files /dev/null and b/sound/direct_sound_samples/cries/ho_oh.aif differ diff --git a/sound/direct_sound_samples/cries/hoothoot.aif b/sound/direct_sound_samples/cries/hoothoot.aif new file mode 100644 index 000000000..59e685dcc Binary files /dev/null and b/sound/direct_sound_samples/cries/hoothoot.aif differ diff --git a/sound/direct_sound_samples/cries/hoppip.aif b/sound/direct_sound_samples/cries/hoppip.aif new file mode 100644 index 000000000..ea47877d0 Binary files /dev/null and b/sound/direct_sound_samples/cries/hoppip.aif differ diff --git a/sound/direct_sound_samples/cries/horsea.aif b/sound/direct_sound_samples/cries/horsea.aif new file mode 100644 index 000000000..e41eff4b1 Binary files /dev/null and b/sound/direct_sound_samples/cries/horsea.aif differ diff --git a/sound/direct_sound_samples/cries/houndoom.aif b/sound/direct_sound_samples/cries/houndoom.aif new file mode 100644 index 000000000..6fec16d39 Binary files /dev/null and b/sound/direct_sound_samples/cries/houndoom.aif differ diff --git a/sound/direct_sound_samples/cries/houndour.aif b/sound/direct_sound_samples/cries/houndour.aif new file mode 100644 index 000000000..7431bbf29 Binary files /dev/null and b/sound/direct_sound_samples/cries/houndour.aif differ diff --git a/sound/direct_sound_samples/cries/huntail.aif b/sound/direct_sound_samples/cries/huntail.aif new file mode 100644 index 000000000..f1d3b29d9 Binary files /dev/null and b/sound/direct_sound_samples/cries/huntail.aif differ diff --git a/sound/direct_sound_samples/cries/hypno.aif b/sound/direct_sound_samples/cries/hypno.aif new file mode 100644 index 000000000..32672a3c3 Binary files /dev/null and b/sound/direct_sound_samples/cries/hypno.aif differ diff --git a/sound/direct_sound_samples/cries/igglybuff.aif b/sound/direct_sound_samples/cries/igglybuff.aif new file mode 100644 index 000000000..8de8394d5 Binary files /dev/null and b/sound/direct_sound_samples/cries/igglybuff.aif differ diff --git a/sound/direct_sound_samples/cries/illumise.aif b/sound/direct_sound_samples/cries/illumise.aif new file mode 100644 index 000000000..75e03efc8 Binary files /dev/null and b/sound/direct_sound_samples/cries/illumise.aif differ diff --git a/sound/direct_sound_samples/cries/ivysaur.aif b/sound/direct_sound_samples/cries/ivysaur.aif new file mode 100644 index 000000000..ea474ff88 Binary files /dev/null and b/sound/direct_sound_samples/cries/ivysaur.aif differ diff --git a/sound/direct_sound_samples/cries/jigglypuff.aif b/sound/direct_sound_samples/cries/jigglypuff.aif new file mode 100644 index 000000000..780424b4f Binary files /dev/null and b/sound/direct_sound_samples/cries/jigglypuff.aif differ diff --git a/sound/direct_sound_samples/cries/jirachi.aif b/sound/direct_sound_samples/cries/jirachi.aif new file mode 100644 index 000000000..ea8a5c8ad Binary files /dev/null and b/sound/direct_sound_samples/cries/jirachi.aif differ diff --git a/sound/direct_sound_samples/cries/jolteon.aif b/sound/direct_sound_samples/cries/jolteon.aif new file mode 100644 index 000000000..013369158 Binary files /dev/null and b/sound/direct_sound_samples/cries/jolteon.aif differ diff --git a/sound/direct_sound_samples/cries/jumpluff.aif b/sound/direct_sound_samples/cries/jumpluff.aif new file mode 100644 index 000000000..13b0fd315 Binary files /dev/null and b/sound/direct_sound_samples/cries/jumpluff.aif differ diff --git a/sound/direct_sound_samples/cries/jynx.aif b/sound/direct_sound_samples/cries/jynx.aif new file mode 100644 index 000000000..7394a48a2 Binary files /dev/null and b/sound/direct_sound_samples/cries/jynx.aif differ diff --git a/sound/direct_sound_samples/cries/kabuto.aif b/sound/direct_sound_samples/cries/kabuto.aif new file mode 100644 index 000000000..6ae9801b5 Binary files /dev/null and b/sound/direct_sound_samples/cries/kabuto.aif differ diff --git a/sound/direct_sound_samples/cries/kabutops.aif b/sound/direct_sound_samples/cries/kabutops.aif new file mode 100644 index 000000000..cb888bff9 Binary files /dev/null and b/sound/direct_sound_samples/cries/kabutops.aif differ diff --git a/sound/direct_sound_samples/cries/kadabra.aif b/sound/direct_sound_samples/cries/kadabra.aif new file mode 100644 index 000000000..bfcc18031 Binary files /dev/null and b/sound/direct_sound_samples/cries/kadabra.aif differ diff --git a/sound/direct_sound_samples/cries/kakuna.aif b/sound/direct_sound_samples/cries/kakuna.aif new file mode 100644 index 000000000..7c4e9d7a8 Binary files /dev/null and b/sound/direct_sound_samples/cries/kakuna.aif differ diff --git a/sound/direct_sound_samples/cries/kangaskhan.aif b/sound/direct_sound_samples/cries/kangaskhan.aif new file mode 100644 index 000000000..643e81eb7 Binary files /dev/null and b/sound/direct_sound_samples/cries/kangaskhan.aif differ diff --git a/sound/direct_sound_samples/cries/kecleon.aif b/sound/direct_sound_samples/cries/kecleon.aif new file mode 100644 index 000000000..f27ae1832 Binary files /dev/null and b/sound/direct_sound_samples/cries/kecleon.aif differ diff --git a/sound/direct_sound_samples/cries/kingdra.aif b/sound/direct_sound_samples/cries/kingdra.aif new file mode 100644 index 000000000..ade230c82 Binary files /dev/null and b/sound/direct_sound_samples/cries/kingdra.aif differ diff --git a/sound/direct_sound_samples/cries/kingler.aif b/sound/direct_sound_samples/cries/kingler.aif new file mode 100644 index 000000000..a1d845f45 Binary files /dev/null and b/sound/direct_sound_samples/cries/kingler.aif differ diff --git a/sound/direct_sound_samples/cries/kirlia.aif b/sound/direct_sound_samples/cries/kirlia.aif new file mode 100644 index 000000000..692e03e5f Binary files /dev/null and b/sound/direct_sound_samples/cries/kirlia.aif differ diff --git a/sound/direct_sound_samples/cries/koffing.aif b/sound/direct_sound_samples/cries/koffing.aif new file mode 100644 index 000000000..7ca9de088 Binary files /dev/null and b/sound/direct_sound_samples/cries/koffing.aif differ diff --git a/sound/direct_sound_samples/cries/krabby.aif b/sound/direct_sound_samples/cries/krabby.aif new file mode 100644 index 000000000..6b7692f21 Binary files /dev/null and b/sound/direct_sound_samples/cries/krabby.aif differ diff --git a/sound/direct_sound_samples/cries/kyogre.aif b/sound/direct_sound_samples/cries/kyogre.aif new file mode 100644 index 000000000..290948319 Binary files /dev/null and b/sound/direct_sound_samples/cries/kyogre.aif differ diff --git a/sound/direct_sound_samples/cries/lairon.aif b/sound/direct_sound_samples/cries/lairon.aif new file mode 100644 index 000000000..b487165bf Binary files /dev/null and b/sound/direct_sound_samples/cries/lairon.aif differ diff --git a/sound/direct_sound_samples/cries/lanturn.aif b/sound/direct_sound_samples/cries/lanturn.aif new file mode 100644 index 000000000..dfeac1fbd Binary files /dev/null and b/sound/direct_sound_samples/cries/lanturn.aif differ diff --git a/sound/direct_sound_samples/cries/lapras.aif b/sound/direct_sound_samples/cries/lapras.aif new file mode 100644 index 000000000..61de32408 Binary files /dev/null and b/sound/direct_sound_samples/cries/lapras.aif differ diff --git a/sound/direct_sound_samples/cries/larvitar.aif b/sound/direct_sound_samples/cries/larvitar.aif new file mode 100644 index 000000000..1ab0e1d5f Binary files /dev/null and b/sound/direct_sound_samples/cries/larvitar.aif differ diff --git a/sound/direct_sound_samples/cries/latias.aif b/sound/direct_sound_samples/cries/latias.aif new file mode 100644 index 000000000..46f7235f3 Binary files /dev/null and b/sound/direct_sound_samples/cries/latias.aif differ diff --git a/sound/direct_sound_samples/cries/latios.aif b/sound/direct_sound_samples/cries/latios.aif new file mode 100644 index 000000000..b8ace2a30 Binary files /dev/null and b/sound/direct_sound_samples/cries/latios.aif differ diff --git a/sound/direct_sound_samples/cries/ledian.aif b/sound/direct_sound_samples/cries/ledian.aif new file mode 100644 index 000000000..baefb5fa3 Binary files /dev/null and b/sound/direct_sound_samples/cries/ledian.aif differ diff --git a/sound/direct_sound_samples/cries/ledyba.aif b/sound/direct_sound_samples/cries/ledyba.aif new file mode 100644 index 000000000..4f26859a7 Binary files /dev/null and b/sound/direct_sound_samples/cries/ledyba.aif differ diff --git a/sound/direct_sound_samples/cries/lickitung.aif b/sound/direct_sound_samples/cries/lickitung.aif new file mode 100644 index 000000000..e469450a1 Binary files /dev/null and b/sound/direct_sound_samples/cries/lickitung.aif differ diff --git a/sound/direct_sound_samples/cries/lileep.aif b/sound/direct_sound_samples/cries/lileep.aif new file mode 100644 index 000000000..ed8258eb7 Binary files /dev/null and b/sound/direct_sound_samples/cries/lileep.aif differ diff --git a/sound/direct_sound_samples/cries/linoone.aif b/sound/direct_sound_samples/cries/linoone.aif new file mode 100644 index 000000000..4e5e7d3b5 Binary files /dev/null and b/sound/direct_sound_samples/cries/linoone.aif differ diff --git a/sound/direct_sound_samples/cries/lombre.aif b/sound/direct_sound_samples/cries/lombre.aif new file mode 100644 index 000000000..abafe4321 Binary files /dev/null and b/sound/direct_sound_samples/cries/lombre.aif differ diff --git a/sound/direct_sound_samples/cries/lotad.aif b/sound/direct_sound_samples/cries/lotad.aif new file mode 100644 index 000000000..2596f4390 Binary files /dev/null and b/sound/direct_sound_samples/cries/lotad.aif differ diff --git a/sound/direct_sound_samples/cries/loudred.aif b/sound/direct_sound_samples/cries/loudred.aif new file mode 100644 index 000000000..fed7ebec8 Binary files /dev/null and b/sound/direct_sound_samples/cries/loudred.aif differ diff --git a/sound/direct_sound_samples/cries/ludicolo.aif b/sound/direct_sound_samples/cries/ludicolo.aif new file mode 100644 index 000000000..7cf670f38 Binary files /dev/null and b/sound/direct_sound_samples/cries/ludicolo.aif differ diff --git a/sound/direct_sound_samples/cries/lugia.aif b/sound/direct_sound_samples/cries/lugia.aif new file mode 100644 index 000000000..45890a2fc Binary files /dev/null and b/sound/direct_sound_samples/cries/lugia.aif differ diff --git a/sound/direct_sound_samples/cries/lunatone.aif b/sound/direct_sound_samples/cries/lunatone.aif new file mode 100644 index 000000000..42cbc5e3c Binary files /dev/null and b/sound/direct_sound_samples/cries/lunatone.aif differ diff --git a/sound/direct_sound_samples/cries/luvdisc.aif b/sound/direct_sound_samples/cries/luvdisc.aif new file mode 100644 index 000000000..3cc0cc744 Binary files /dev/null and b/sound/direct_sound_samples/cries/luvdisc.aif differ diff --git a/sound/direct_sound_samples/cries/machamp.aif b/sound/direct_sound_samples/cries/machamp.aif new file mode 100644 index 000000000..ddeaf22c8 Binary files /dev/null and b/sound/direct_sound_samples/cries/machamp.aif differ diff --git a/sound/direct_sound_samples/cries/machoke.aif b/sound/direct_sound_samples/cries/machoke.aif new file mode 100644 index 000000000..97065ee09 Binary files /dev/null and b/sound/direct_sound_samples/cries/machoke.aif differ diff --git a/sound/direct_sound_samples/cries/machop.aif b/sound/direct_sound_samples/cries/machop.aif new file mode 100644 index 000000000..d92419e84 Binary files /dev/null and b/sound/direct_sound_samples/cries/machop.aif differ diff --git a/sound/direct_sound_samples/cries/magby.aif b/sound/direct_sound_samples/cries/magby.aif new file mode 100644 index 000000000..12f3dc889 Binary files /dev/null and b/sound/direct_sound_samples/cries/magby.aif differ diff --git a/sound/direct_sound_samples/cries/magcargo.aif b/sound/direct_sound_samples/cries/magcargo.aif new file mode 100644 index 000000000..bef0351c0 Binary files /dev/null and b/sound/direct_sound_samples/cries/magcargo.aif differ diff --git a/sound/direct_sound_samples/cries/magikarp.aif b/sound/direct_sound_samples/cries/magikarp.aif new file mode 100644 index 000000000..f4f9219c5 Binary files /dev/null and b/sound/direct_sound_samples/cries/magikarp.aif differ diff --git a/sound/direct_sound_samples/cries/magmar.aif b/sound/direct_sound_samples/cries/magmar.aif new file mode 100644 index 000000000..b79c8b9a1 Binary files /dev/null and b/sound/direct_sound_samples/cries/magmar.aif differ diff --git a/sound/direct_sound_samples/cries/magnemite.aif b/sound/direct_sound_samples/cries/magnemite.aif new file mode 100644 index 000000000..ebb9103d9 Binary files /dev/null and b/sound/direct_sound_samples/cries/magnemite.aif differ diff --git a/sound/direct_sound_samples/cries/magneton.aif b/sound/direct_sound_samples/cries/magneton.aif new file mode 100644 index 000000000..53083ac62 Binary files /dev/null and b/sound/direct_sound_samples/cries/magneton.aif differ diff --git a/sound/direct_sound_samples/cries/makuhita.aif b/sound/direct_sound_samples/cries/makuhita.aif new file mode 100644 index 000000000..38d7f4b44 Binary files /dev/null and b/sound/direct_sound_samples/cries/makuhita.aif differ diff --git a/sound/direct_sound_samples/cries/manectric.aif b/sound/direct_sound_samples/cries/manectric.aif new file mode 100644 index 000000000..18a8f4666 Binary files /dev/null and b/sound/direct_sound_samples/cries/manectric.aif differ diff --git a/sound/direct_sound_samples/cries/mankey.aif b/sound/direct_sound_samples/cries/mankey.aif new file mode 100644 index 000000000..dda929d4c Binary files /dev/null and b/sound/direct_sound_samples/cries/mankey.aif differ diff --git a/sound/direct_sound_samples/cries/mantine.aif b/sound/direct_sound_samples/cries/mantine.aif new file mode 100644 index 000000000..d1840aafa Binary files /dev/null and b/sound/direct_sound_samples/cries/mantine.aif differ diff --git a/sound/direct_sound_samples/cries/mareep.aif b/sound/direct_sound_samples/cries/mareep.aif new file mode 100644 index 000000000..2615b9def Binary files /dev/null and b/sound/direct_sound_samples/cries/mareep.aif differ diff --git a/sound/direct_sound_samples/cries/marill.aif b/sound/direct_sound_samples/cries/marill.aif new file mode 100644 index 000000000..48d936e7d Binary files /dev/null and b/sound/direct_sound_samples/cries/marill.aif differ diff --git a/sound/direct_sound_samples/cries/marowak.aif b/sound/direct_sound_samples/cries/marowak.aif new file mode 100644 index 000000000..279381bb5 Binary files /dev/null and b/sound/direct_sound_samples/cries/marowak.aif differ diff --git a/sound/direct_sound_samples/cries/marshtomp.aif b/sound/direct_sound_samples/cries/marshtomp.aif new file mode 100644 index 000000000..c0106ff6c Binary files /dev/null and b/sound/direct_sound_samples/cries/marshtomp.aif differ diff --git a/sound/direct_sound_samples/cries/masquerain.aif b/sound/direct_sound_samples/cries/masquerain.aif new file mode 100644 index 000000000..107bed2f7 Binary files /dev/null and b/sound/direct_sound_samples/cries/masquerain.aif differ diff --git a/sound/direct_sound_samples/cries/mawile.aif b/sound/direct_sound_samples/cries/mawile.aif new file mode 100644 index 000000000..81b252b57 Binary files /dev/null and b/sound/direct_sound_samples/cries/mawile.aif differ diff --git a/sound/direct_sound_samples/cries/medicham.aif b/sound/direct_sound_samples/cries/medicham.aif new file mode 100644 index 000000000..dc85dd3b5 Binary files /dev/null and b/sound/direct_sound_samples/cries/medicham.aif differ diff --git a/sound/direct_sound_samples/cries/meditite.aif b/sound/direct_sound_samples/cries/meditite.aif new file mode 100644 index 000000000..8ac680f79 Binary files /dev/null and b/sound/direct_sound_samples/cries/meditite.aif differ diff --git a/sound/direct_sound_samples/cries/meganium.aif b/sound/direct_sound_samples/cries/meganium.aif new file mode 100644 index 000000000..ea1e1aa51 Binary files /dev/null and b/sound/direct_sound_samples/cries/meganium.aif differ diff --git a/sound/direct_sound_samples/cries/meowth.aif b/sound/direct_sound_samples/cries/meowth.aif new file mode 100644 index 000000000..aaf3825d5 Binary files /dev/null and b/sound/direct_sound_samples/cries/meowth.aif differ diff --git a/sound/direct_sound_samples/cries/metagross.aif b/sound/direct_sound_samples/cries/metagross.aif new file mode 100644 index 000000000..b96e6647c Binary files /dev/null and b/sound/direct_sound_samples/cries/metagross.aif differ diff --git a/sound/direct_sound_samples/cries/metang.aif b/sound/direct_sound_samples/cries/metang.aif new file mode 100644 index 000000000..da544ce4d Binary files /dev/null and b/sound/direct_sound_samples/cries/metang.aif differ diff --git a/sound/direct_sound_samples/cries/metapod.aif b/sound/direct_sound_samples/cries/metapod.aif new file mode 100644 index 000000000..ddba3ed44 Binary files /dev/null and b/sound/direct_sound_samples/cries/metapod.aif differ diff --git a/sound/direct_sound_samples/cries/mew.aif b/sound/direct_sound_samples/cries/mew.aif new file mode 100644 index 000000000..2651b96ca Binary files /dev/null and b/sound/direct_sound_samples/cries/mew.aif differ diff --git a/sound/direct_sound_samples/cries/mewtwo.aif b/sound/direct_sound_samples/cries/mewtwo.aif new file mode 100644 index 000000000..8e1e6c7f1 Binary files /dev/null and b/sound/direct_sound_samples/cries/mewtwo.aif differ diff --git a/sound/direct_sound_samples/cries/mightyena.aif b/sound/direct_sound_samples/cries/mightyena.aif new file mode 100644 index 000000000..53a645edc Binary files /dev/null and b/sound/direct_sound_samples/cries/mightyena.aif differ diff --git a/sound/direct_sound_samples/cries/milotic.aif b/sound/direct_sound_samples/cries/milotic.aif new file mode 100644 index 000000000..93a14161b Binary files /dev/null and b/sound/direct_sound_samples/cries/milotic.aif differ diff --git a/sound/direct_sound_samples/cries/miltank.aif b/sound/direct_sound_samples/cries/miltank.aif new file mode 100644 index 000000000..ad8a41a45 Binary files /dev/null and b/sound/direct_sound_samples/cries/miltank.aif differ diff --git a/sound/direct_sound_samples/cries/minun.aif b/sound/direct_sound_samples/cries/minun.aif new file mode 100644 index 000000000..a55aa5631 Binary files /dev/null and b/sound/direct_sound_samples/cries/minun.aif differ diff --git a/sound/direct_sound_samples/cries/misdreavus.aif b/sound/direct_sound_samples/cries/misdreavus.aif new file mode 100644 index 000000000..39a09f4d0 Binary files /dev/null and b/sound/direct_sound_samples/cries/misdreavus.aif differ diff --git a/sound/direct_sound_samples/cries/moltres.aif b/sound/direct_sound_samples/cries/moltres.aif new file mode 100644 index 000000000..2e038a3d7 Binary files /dev/null and b/sound/direct_sound_samples/cries/moltres.aif differ diff --git a/sound/direct_sound_samples/cries/mr_mime.aif b/sound/direct_sound_samples/cries/mr_mime.aif new file mode 100644 index 000000000..ff870dbc4 Binary files /dev/null and b/sound/direct_sound_samples/cries/mr_mime.aif differ diff --git a/sound/direct_sound_samples/cries/mudkip.aif b/sound/direct_sound_samples/cries/mudkip.aif new file mode 100644 index 000000000..e8fa5c212 Binary files /dev/null and b/sound/direct_sound_samples/cries/mudkip.aif differ diff --git a/sound/direct_sound_samples/cries/muk.aif b/sound/direct_sound_samples/cries/muk.aif new file mode 100644 index 000000000..f61ff4075 Binary files /dev/null and b/sound/direct_sound_samples/cries/muk.aif differ diff --git a/sound/direct_sound_samples/cries/murkrow.aif b/sound/direct_sound_samples/cries/murkrow.aif new file mode 100644 index 000000000..4beddff1e Binary files /dev/null and b/sound/direct_sound_samples/cries/murkrow.aif differ diff --git a/sound/direct_sound_samples/cries/natu.aif b/sound/direct_sound_samples/cries/natu.aif new file mode 100644 index 000000000..e6e38d5cc Binary files /dev/null and b/sound/direct_sound_samples/cries/natu.aif differ diff --git a/sound/direct_sound_samples/cries/nidoking.aif b/sound/direct_sound_samples/cries/nidoking.aif new file mode 100644 index 000000000..a0c86f9ab Binary files /dev/null and b/sound/direct_sound_samples/cries/nidoking.aif differ diff --git a/sound/direct_sound_samples/cries/nidoqueen.aif b/sound/direct_sound_samples/cries/nidoqueen.aif new file mode 100644 index 000000000..6c8f5254b Binary files /dev/null and b/sound/direct_sound_samples/cries/nidoqueen.aif differ diff --git a/sound/direct_sound_samples/cries/nidoran_f.aif b/sound/direct_sound_samples/cries/nidoran_f.aif new file mode 100644 index 000000000..b7c8a5317 Binary files /dev/null and b/sound/direct_sound_samples/cries/nidoran_f.aif differ diff --git a/sound/direct_sound_samples/cries/nidoran_m.aif b/sound/direct_sound_samples/cries/nidoran_m.aif new file mode 100644 index 000000000..08fc81c8b Binary files /dev/null and b/sound/direct_sound_samples/cries/nidoran_m.aif differ diff --git a/sound/direct_sound_samples/cries/nidorina.aif b/sound/direct_sound_samples/cries/nidorina.aif new file mode 100644 index 000000000..91e293a50 Binary files /dev/null and b/sound/direct_sound_samples/cries/nidorina.aif differ diff --git a/sound/direct_sound_samples/cries/nidorino.aif b/sound/direct_sound_samples/cries/nidorino.aif new file mode 100644 index 000000000..959351363 Binary files /dev/null and b/sound/direct_sound_samples/cries/nidorino.aif differ diff --git a/sound/direct_sound_samples/cries/nincada.aif b/sound/direct_sound_samples/cries/nincada.aif new file mode 100644 index 000000000..5f96bda50 Binary files /dev/null and b/sound/direct_sound_samples/cries/nincada.aif differ diff --git a/sound/direct_sound_samples/cries/ninetales.aif b/sound/direct_sound_samples/cries/ninetales.aif new file mode 100644 index 000000000..70c8cf528 Binary files /dev/null and b/sound/direct_sound_samples/cries/ninetales.aif differ diff --git a/sound/direct_sound_samples/cries/ninjask.aif b/sound/direct_sound_samples/cries/ninjask.aif new file mode 100644 index 000000000..a6f07e8d3 Binary files /dev/null and b/sound/direct_sound_samples/cries/ninjask.aif differ diff --git a/sound/direct_sound_samples/cries/noctowl.aif b/sound/direct_sound_samples/cries/noctowl.aif new file mode 100644 index 000000000..fe2e63d45 Binary files /dev/null and b/sound/direct_sound_samples/cries/noctowl.aif differ diff --git a/sound/direct_sound_samples/cries/nosepass.aif b/sound/direct_sound_samples/cries/nosepass.aif new file mode 100644 index 000000000..be65ba082 Binary files /dev/null and b/sound/direct_sound_samples/cries/nosepass.aif differ diff --git a/sound/direct_sound_samples/cries/numel.aif b/sound/direct_sound_samples/cries/numel.aif new file mode 100644 index 000000000..55cce5f2c Binary files /dev/null and b/sound/direct_sound_samples/cries/numel.aif differ diff --git a/sound/direct_sound_samples/cries/nuzleaf.aif b/sound/direct_sound_samples/cries/nuzleaf.aif new file mode 100644 index 000000000..d668f3fd3 Binary files /dev/null and b/sound/direct_sound_samples/cries/nuzleaf.aif differ diff --git a/sound/direct_sound_samples/cries/octillery.aif b/sound/direct_sound_samples/cries/octillery.aif new file mode 100644 index 000000000..75ee28ceb Binary files /dev/null and b/sound/direct_sound_samples/cries/octillery.aif differ diff --git a/sound/direct_sound_samples/cries/oddish.aif b/sound/direct_sound_samples/cries/oddish.aif new file mode 100644 index 000000000..6909a8dad Binary files /dev/null and b/sound/direct_sound_samples/cries/oddish.aif differ diff --git a/sound/direct_sound_samples/cries/omanyte.aif b/sound/direct_sound_samples/cries/omanyte.aif new file mode 100644 index 000000000..15ec2d1ef Binary files /dev/null and b/sound/direct_sound_samples/cries/omanyte.aif differ diff --git a/sound/direct_sound_samples/cries/omastar.aif b/sound/direct_sound_samples/cries/omastar.aif new file mode 100644 index 000000000..e67d5d7fc Binary files /dev/null and b/sound/direct_sound_samples/cries/omastar.aif differ diff --git a/sound/direct_sound_samples/cries/onix.aif b/sound/direct_sound_samples/cries/onix.aif new file mode 100644 index 000000000..aa8a16505 Binary files /dev/null and b/sound/direct_sound_samples/cries/onix.aif differ diff --git a/sound/direct_sound_samples/cries/paras.aif b/sound/direct_sound_samples/cries/paras.aif new file mode 100644 index 000000000..f9d69c21c Binary files /dev/null and b/sound/direct_sound_samples/cries/paras.aif differ diff --git a/sound/direct_sound_samples/cries/parasect.aif b/sound/direct_sound_samples/cries/parasect.aif new file mode 100644 index 000000000..d6d9433e9 Binary files /dev/null and b/sound/direct_sound_samples/cries/parasect.aif differ diff --git a/sound/direct_sound_samples/cries/pelipper.aif b/sound/direct_sound_samples/cries/pelipper.aif new file mode 100644 index 000000000..26718f848 Binary files /dev/null and b/sound/direct_sound_samples/cries/pelipper.aif differ diff --git a/sound/direct_sound_samples/cries/persian.aif b/sound/direct_sound_samples/cries/persian.aif new file mode 100644 index 000000000..40b3a2c56 Binary files /dev/null and b/sound/direct_sound_samples/cries/persian.aif differ diff --git a/sound/direct_sound_samples/cries/phanpy.aif b/sound/direct_sound_samples/cries/phanpy.aif new file mode 100644 index 000000000..2fcab3c82 Binary files /dev/null and b/sound/direct_sound_samples/cries/phanpy.aif differ diff --git a/sound/direct_sound_samples/cries/pichu.aif b/sound/direct_sound_samples/cries/pichu.aif new file mode 100644 index 000000000..de47bbab8 Binary files /dev/null and b/sound/direct_sound_samples/cries/pichu.aif differ diff --git a/sound/direct_sound_samples/cries/pidgeot.aif b/sound/direct_sound_samples/cries/pidgeot.aif new file mode 100644 index 000000000..af400cdc6 Binary files /dev/null and b/sound/direct_sound_samples/cries/pidgeot.aif differ diff --git a/sound/direct_sound_samples/cries/pidgeotto.aif b/sound/direct_sound_samples/cries/pidgeotto.aif new file mode 100644 index 000000000..7c71c8f3e Binary files /dev/null and b/sound/direct_sound_samples/cries/pidgeotto.aif differ diff --git a/sound/direct_sound_samples/cries/pidgey.aif b/sound/direct_sound_samples/cries/pidgey.aif new file mode 100644 index 000000000..b9c3a5d2a Binary files /dev/null and b/sound/direct_sound_samples/cries/pidgey.aif differ diff --git a/sound/direct_sound_samples/cries/pikachu.aif b/sound/direct_sound_samples/cries/pikachu.aif new file mode 100644 index 000000000..690bf5e1d Binary files /dev/null and b/sound/direct_sound_samples/cries/pikachu.aif differ diff --git a/sound/direct_sound_samples/cries/piloswine.aif b/sound/direct_sound_samples/cries/piloswine.aif new file mode 100644 index 000000000..b1f34d3b5 Binary files /dev/null and b/sound/direct_sound_samples/cries/piloswine.aif differ diff --git a/sound/direct_sound_samples/cries/pineco.aif b/sound/direct_sound_samples/cries/pineco.aif new file mode 100644 index 000000000..80292bda0 Binary files /dev/null and b/sound/direct_sound_samples/cries/pineco.aif differ diff --git a/sound/direct_sound_samples/cries/pinsir.aif b/sound/direct_sound_samples/cries/pinsir.aif new file mode 100644 index 000000000..cf27a11de Binary files /dev/null and b/sound/direct_sound_samples/cries/pinsir.aif differ diff --git a/sound/direct_sound_samples/cries/plusle.aif b/sound/direct_sound_samples/cries/plusle.aif new file mode 100644 index 000000000..d68984263 Binary files /dev/null and b/sound/direct_sound_samples/cries/plusle.aif differ diff --git a/sound/direct_sound_samples/cries/politoed.aif b/sound/direct_sound_samples/cries/politoed.aif new file mode 100644 index 000000000..38b1883b4 Binary files /dev/null and b/sound/direct_sound_samples/cries/politoed.aif differ diff --git a/sound/direct_sound_samples/cries/poliwag.aif b/sound/direct_sound_samples/cries/poliwag.aif new file mode 100644 index 000000000..8467f0540 Binary files /dev/null and b/sound/direct_sound_samples/cries/poliwag.aif differ diff --git a/sound/direct_sound_samples/cries/poliwhirl.aif b/sound/direct_sound_samples/cries/poliwhirl.aif new file mode 100644 index 000000000..f0851c693 Binary files /dev/null and b/sound/direct_sound_samples/cries/poliwhirl.aif differ diff --git a/sound/direct_sound_samples/cries/poliwrath.aif b/sound/direct_sound_samples/cries/poliwrath.aif new file mode 100644 index 000000000..8d19f1d86 Binary files /dev/null and b/sound/direct_sound_samples/cries/poliwrath.aif differ diff --git a/sound/direct_sound_samples/cries/ponyta.aif b/sound/direct_sound_samples/cries/ponyta.aif new file mode 100644 index 000000000..46feb123d Binary files /dev/null and b/sound/direct_sound_samples/cries/ponyta.aif differ diff --git a/sound/direct_sound_samples/cries/poochyena.aif b/sound/direct_sound_samples/cries/poochyena.aif new file mode 100644 index 000000000..3b464ce13 Binary files /dev/null and b/sound/direct_sound_samples/cries/poochyena.aif differ diff --git a/sound/direct_sound_samples/cries/porygon.aif b/sound/direct_sound_samples/cries/porygon.aif new file mode 100644 index 000000000..ced70b379 Binary files /dev/null and b/sound/direct_sound_samples/cries/porygon.aif differ diff --git a/sound/direct_sound_samples/cries/porygon2.aif b/sound/direct_sound_samples/cries/porygon2.aif new file mode 100644 index 000000000..c08a3caaf Binary files /dev/null and b/sound/direct_sound_samples/cries/porygon2.aif differ diff --git a/sound/direct_sound_samples/cries/primeape.aif b/sound/direct_sound_samples/cries/primeape.aif new file mode 100644 index 000000000..a868b3120 Binary files /dev/null and b/sound/direct_sound_samples/cries/primeape.aif differ diff --git a/sound/direct_sound_samples/cries/psyduck.aif b/sound/direct_sound_samples/cries/psyduck.aif new file mode 100644 index 000000000..d2d0612f2 Binary files /dev/null and b/sound/direct_sound_samples/cries/psyduck.aif differ diff --git a/sound/direct_sound_samples/cries/pupitar.aif b/sound/direct_sound_samples/cries/pupitar.aif new file mode 100644 index 000000000..7386636ce Binary files /dev/null and b/sound/direct_sound_samples/cries/pupitar.aif differ diff --git a/sound/direct_sound_samples/cries/quagsire.aif b/sound/direct_sound_samples/cries/quagsire.aif new file mode 100644 index 000000000..1953d0e42 Binary files /dev/null and b/sound/direct_sound_samples/cries/quagsire.aif differ diff --git a/sound/direct_sound_samples/cries/quilava.aif b/sound/direct_sound_samples/cries/quilava.aif new file mode 100644 index 000000000..efe873229 Binary files /dev/null and b/sound/direct_sound_samples/cries/quilava.aif differ diff --git a/sound/direct_sound_samples/cries/qwilfish.aif b/sound/direct_sound_samples/cries/qwilfish.aif new file mode 100644 index 000000000..268c5c89d Binary files /dev/null and b/sound/direct_sound_samples/cries/qwilfish.aif differ diff --git a/sound/direct_sound_samples/cries/raichu.aif b/sound/direct_sound_samples/cries/raichu.aif new file mode 100644 index 000000000..e59ffbad4 Binary files /dev/null and b/sound/direct_sound_samples/cries/raichu.aif differ diff --git a/sound/direct_sound_samples/cries/raikou.aif b/sound/direct_sound_samples/cries/raikou.aif new file mode 100644 index 000000000..a57a2365c Binary files /dev/null and b/sound/direct_sound_samples/cries/raikou.aif differ diff --git a/sound/direct_sound_samples/cries/ralts.aif b/sound/direct_sound_samples/cries/ralts.aif new file mode 100644 index 000000000..0baef5760 Binary files /dev/null and b/sound/direct_sound_samples/cries/ralts.aif differ diff --git a/sound/direct_sound_samples/cries/rapidash.aif b/sound/direct_sound_samples/cries/rapidash.aif new file mode 100644 index 000000000..920f510e4 Binary files /dev/null and b/sound/direct_sound_samples/cries/rapidash.aif differ diff --git a/sound/direct_sound_samples/cries/raticate.aif b/sound/direct_sound_samples/cries/raticate.aif new file mode 100644 index 000000000..01601cab5 Binary files /dev/null and b/sound/direct_sound_samples/cries/raticate.aif differ diff --git a/sound/direct_sound_samples/cries/rattata.aif b/sound/direct_sound_samples/cries/rattata.aif new file mode 100644 index 000000000..cb0e1f422 Binary files /dev/null and b/sound/direct_sound_samples/cries/rattata.aif differ diff --git a/sound/direct_sound_samples/cries/rayquaza.aif b/sound/direct_sound_samples/cries/rayquaza.aif new file mode 100644 index 000000000..6115e11d8 Binary files /dev/null and b/sound/direct_sound_samples/cries/rayquaza.aif differ diff --git a/sound/direct_sound_samples/cries/regice.aif b/sound/direct_sound_samples/cries/regice.aif new file mode 100644 index 000000000..6fa23dd73 Binary files /dev/null and b/sound/direct_sound_samples/cries/regice.aif differ diff --git a/sound/direct_sound_samples/cries/regirock.aif b/sound/direct_sound_samples/cries/regirock.aif new file mode 100644 index 000000000..ab2a47eb8 Binary files /dev/null and b/sound/direct_sound_samples/cries/regirock.aif differ diff --git a/sound/direct_sound_samples/cries/registeel.aif b/sound/direct_sound_samples/cries/registeel.aif new file mode 100644 index 000000000..f5374e5f0 Binary files /dev/null and b/sound/direct_sound_samples/cries/registeel.aif differ diff --git a/sound/direct_sound_samples/cries/relicanth.aif b/sound/direct_sound_samples/cries/relicanth.aif new file mode 100644 index 000000000..60af9cf4e Binary files /dev/null and b/sound/direct_sound_samples/cries/relicanth.aif differ diff --git a/sound/direct_sound_samples/cries/remoraid.aif b/sound/direct_sound_samples/cries/remoraid.aif new file mode 100644 index 000000000..16d3f1d65 Binary files /dev/null and b/sound/direct_sound_samples/cries/remoraid.aif differ diff --git a/sound/direct_sound_samples/cries/rhydon.aif b/sound/direct_sound_samples/cries/rhydon.aif new file mode 100644 index 000000000..cfa709ee9 Binary files /dev/null and b/sound/direct_sound_samples/cries/rhydon.aif differ diff --git a/sound/direct_sound_samples/cries/rhyhorn.aif b/sound/direct_sound_samples/cries/rhyhorn.aif new file mode 100644 index 000000000..47f344ba2 Binary files /dev/null and b/sound/direct_sound_samples/cries/rhyhorn.aif differ diff --git a/sound/direct_sound_samples/cries/roselia.aif b/sound/direct_sound_samples/cries/roselia.aif new file mode 100644 index 000000000..50b60b77b Binary files /dev/null and b/sound/direct_sound_samples/cries/roselia.aif differ diff --git a/sound/direct_sound_samples/cries/sableye.aif b/sound/direct_sound_samples/cries/sableye.aif new file mode 100644 index 000000000..1b3a9be30 Binary files /dev/null and b/sound/direct_sound_samples/cries/sableye.aif differ diff --git a/sound/direct_sound_samples/cries/salamence.aif b/sound/direct_sound_samples/cries/salamence.aif new file mode 100644 index 000000000..d2957809c Binary files /dev/null and b/sound/direct_sound_samples/cries/salamence.aif differ diff --git a/sound/direct_sound_samples/cries/sandshrew.aif b/sound/direct_sound_samples/cries/sandshrew.aif new file mode 100644 index 000000000..6879be11d Binary files /dev/null and b/sound/direct_sound_samples/cries/sandshrew.aif differ diff --git a/sound/direct_sound_samples/cries/sandslash.aif b/sound/direct_sound_samples/cries/sandslash.aif new file mode 100644 index 000000000..ee4a458ed Binary files /dev/null and b/sound/direct_sound_samples/cries/sandslash.aif differ diff --git a/sound/direct_sound_samples/cries/sceptile.aif b/sound/direct_sound_samples/cries/sceptile.aif new file mode 100644 index 000000000..7252cb85f Binary files /dev/null and b/sound/direct_sound_samples/cries/sceptile.aif differ diff --git a/sound/direct_sound_samples/cries/scizor.aif b/sound/direct_sound_samples/cries/scizor.aif new file mode 100644 index 000000000..f1f7832ce Binary files /dev/null and b/sound/direct_sound_samples/cries/scizor.aif differ diff --git a/sound/direct_sound_samples/cries/scyther.aif b/sound/direct_sound_samples/cries/scyther.aif new file mode 100644 index 000000000..2b8cbc104 Binary files /dev/null and b/sound/direct_sound_samples/cries/scyther.aif differ diff --git a/sound/direct_sound_samples/cries/seadra.aif b/sound/direct_sound_samples/cries/seadra.aif new file mode 100644 index 000000000..2f60cce4a Binary files /dev/null and b/sound/direct_sound_samples/cries/seadra.aif differ diff --git a/sound/direct_sound_samples/cries/seaking.aif b/sound/direct_sound_samples/cries/seaking.aif new file mode 100644 index 000000000..e4fc7e70d Binary files /dev/null and b/sound/direct_sound_samples/cries/seaking.aif differ diff --git a/sound/direct_sound_samples/cries/sealeo.aif b/sound/direct_sound_samples/cries/sealeo.aif new file mode 100644 index 000000000..d9ea50026 Binary files /dev/null and b/sound/direct_sound_samples/cries/sealeo.aif differ diff --git a/sound/direct_sound_samples/cries/seedot.aif b/sound/direct_sound_samples/cries/seedot.aif new file mode 100644 index 000000000..c37b769f8 Binary files /dev/null and b/sound/direct_sound_samples/cries/seedot.aif differ diff --git a/sound/direct_sound_samples/cries/seel.aif b/sound/direct_sound_samples/cries/seel.aif new file mode 100644 index 000000000..84c4a0a94 Binary files /dev/null and b/sound/direct_sound_samples/cries/seel.aif differ diff --git a/sound/direct_sound_samples/cries/sentret.aif b/sound/direct_sound_samples/cries/sentret.aif new file mode 100644 index 000000000..4aed7cd70 Binary files /dev/null and b/sound/direct_sound_samples/cries/sentret.aif differ diff --git a/sound/direct_sound_samples/cries/seviper.aif b/sound/direct_sound_samples/cries/seviper.aif new file mode 100644 index 000000000..6a15dd6e2 Binary files /dev/null and b/sound/direct_sound_samples/cries/seviper.aif differ diff --git a/sound/direct_sound_samples/cries/sharpedo.aif b/sound/direct_sound_samples/cries/sharpedo.aif new file mode 100644 index 000000000..1b02b56ce Binary files /dev/null and b/sound/direct_sound_samples/cries/sharpedo.aif differ diff --git a/sound/direct_sound_samples/cries/shedinja.aif b/sound/direct_sound_samples/cries/shedinja.aif new file mode 100644 index 000000000..6d1d565f3 Binary files /dev/null and b/sound/direct_sound_samples/cries/shedinja.aif differ diff --git a/sound/direct_sound_samples/cries/shelgon.aif b/sound/direct_sound_samples/cries/shelgon.aif new file mode 100644 index 000000000..24f234ffe Binary files /dev/null and b/sound/direct_sound_samples/cries/shelgon.aif differ diff --git a/sound/direct_sound_samples/cries/shellder.aif b/sound/direct_sound_samples/cries/shellder.aif new file mode 100644 index 000000000..b2ea85228 Binary files /dev/null and b/sound/direct_sound_samples/cries/shellder.aif differ diff --git a/sound/direct_sound_samples/cries/shiftry.aif b/sound/direct_sound_samples/cries/shiftry.aif new file mode 100644 index 000000000..c91ece114 Binary files /dev/null and b/sound/direct_sound_samples/cries/shiftry.aif differ diff --git a/sound/direct_sound_samples/cries/shroomish.aif b/sound/direct_sound_samples/cries/shroomish.aif new file mode 100644 index 000000000..9e944ca20 Binary files /dev/null and b/sound/direct_sound_samples/cries/shroomish.aif differ diff --git a/sound/direct_sound_samples/cries/shuckle.aif b/sound/direct_sound_samples/cries/shuckle.aif new file mode 100644 index 000000000..d835d2de6 Binary files /dev/null and b/sound/direct_sound_samples/cries/shuckle.aif differ diff --git a/sound/direct_sound_samples/cries/shuppet.aif b/sound/direct_sound_samples/cries/shuppet.aif new file mode 100644 index 000000000..1cd9a2f14 Binary files /dev/null and b/sound/direct_sound_samples/cries/shuppet.aif differ diff --git a/sound/direct_sound_samples/cries/silcoon.aif b/sound/direct_sound_samples/cries/silcoon.aif new file mode 100644 index 000000000..ff48950ad Binary files /dev/null and b/sound/direct_sound_samples/cries/silcoon.aif differ diff --git a/sound/direct_sound_samples/cries/skarmory.aif b/sound/direct_sound_samples/cries/skarmory.aif new file mode 100644 index 000000000..88d3985a3 Binary files /dev/null and b/sound/direct_sound_samples/cries/skarmory.aif differ diff --git a/sound/direct_sound_samples/cries/skiploom.aif b/sound/direct_sound_samples/cries/skiploom.aif new file mode 100644 index 000000000..201744d12 Binary files /dev/null and b/sound/direct_sound_samples/cries/skiploom.aif differ diff --git a/sound/direct_sound_samples/cries/skitty.aif b/sound/direct_sound_samples/cries/skitty.aif new file mode 100644 index 000000000..7dc4578f4 Binary files /dev/null and b/sound/direct_sound_samples/cries/skitty.aif differ diff --git a/sound/direct_sound_samples/cries/slaking.aif b/sound/direct_sound_samples/cries/slaking.aif new file mode 100644 index 000000000..b6a4160f3 Binary files /dev/null and b/sound/direct_sound_samples/cries/slaking.aif differ diff --git a/sound/direct_sound_samples/cries/slakoth.aif b/sound/direct_sound_samples/cries/slakoth.aif new file mode 100644 index 000000000..0e4bbc3c3 Binary files /dev/null and b/sound/direct_sound_samples/cries/slakoth.aif differ diff --git a/sound/direct_sound_samples/cries/slowbro.aif b/sound/direct_sound_samples/cries/slowbro.aif new file mode 100644 index 000000000..f74b753d2 Binary files /dev/null and b/sound/direct_sound_samples/cries/slowbro.aif differ diff --git a/sound/direct_sound_samples/cries/slowking.aif b/sound/direct_sound_samples/cries/slowking.aif new file mode 100644 index 000000000..245a42023 Binary files /dev/null and b/sound/direct_sound_samples/cries/slowking.aif differ diff --git a/sound/direct_sound_samples/cries/slowpoke.aif b/sound/direct_sound_samples/cries/slowpoke.aif new file mode 100644 index 000000000..82b05a9a7 Binary files /dev/null and b/sound/direct_sound_samples/cries/slowpoke.aif differ diff --git a/sound/direct_sound_samples/cries/slugma.aif b/sound/direct_sound_samples/cries/slugma.aif new file mode 100644 index 000000000..fed42817c Binary files /dev/null and b/sound/direct_sound_samples/cries/slugma.aif differ diff --git a/sound/direct_sound_samples/cries/smeargle.aif b/sound/direct_sound_samples/cries/smeargle.aif new file mode 100644 index 000000000..00dbedead Binary files /dev/null and b/sound/direct_sound_samples/cries/smeargle.aif differ diff --git a/sound/direct_sound_samples/cries/smoochum.aif b/sound/direct_sound_samples/cries/smoochum.aif new file mode 100644 index 000000000..4005b4ad4 Binary files /dev/null and b/sound/direct_sound_samples/cries/smoochum.aif differ diff --git a/sound/direct_sound_samples/cries/sneasel.aif b/sound/direct_sound_samples/cries/sneasel.aif new file mode 100644 index 000000000..54242a23f Binary files /dev/null and b/sound/direct_sound_samples/cries/sneasel.aif differ diff --git a/sound/direct_sound_samples/cries/snorlax.aif b/sound/direct_sound_samples/cries/snorlax.aif new file mode 100644 index 000000000..f95128e3a Binary files /dev/null and b/sound/direct_sound_samples/cries/snorlax.aif differ diff --git a/sound/direct_sound_samples/cries/snorunt.aif b/sound/direct_sound_samples/cries/snorunt.aif new file mode 100644 index 000000000..53b05b229 Binary files /dev/null and b/sound/direct_sound_samples/cries/snorunt.aif differ diff --git a/sound/direct_sound_samples/cries/snubbull.aif b/sound/direct_sound_samples/cries/snubbull.aif new file mode 100644 index 000000000..bbba023fd Binary files /dev/null and b/sound/direct_sound_samples/cries/snubbull.aif differ diff --git a/sound/direct_sound_samples/cries/solrock.aif b/sound/direct_sound_samples/cries/solrock.aif new file mode 100644 index 000000000..64c71f289 Binary files /dev/null and b/sound/direct_sound_samples/cries/solrock.aif differ diff --git a/sound/direct_sound_samples/cries/spearow.aif b/sound/direct_sound_samples/cries/spearow.aif new file mode 100644 index 000000000..7ce86ae29 Binary files /dev/null and b/sound/direct_sound_samples/cries/spearow.aif differ diff --git a/sound/direct_sound_samples/cries/spheal.aif b/sound/direct_sound_samples/cries/spheal.aif new file mode 100644 index 000000000..fb6470210 Binary files /dev/null and b/sound/direct_sound_samples/cries/spheal.aif differ diff --git a/sound/direct_sound_samples/cries/spinarak.aif b/sound/direct_sound_samples/cries/spinarak.aif new file mode 100644 index 000000000..3c4c1eff1 Binary files /dev/null and b/sound/direct_sound_samples/cries/spinarak.aif differ diff --git a/sound/direct_sound_samples/cries/spinda.aif b/sound/direct_sound_samples/cries/spinda.aif new file mode 100644 index 000000000..0217573c7 Binary files /dev/null and b/sound/direct_sound_samples/cries/spinda.aif differ diff --git a/sound/direct_sound_samples/cries/spoink.aif b/sound/direct_sound_samples/cries/spoink.aif new file mode 100644 index 000000000..6cc9bf546 Binary files /dev/null and b/sound/direct_sound_samples/cries/spoink.aif differ diff --git a/sound/direct_sound_samples/cries/squirtle.aif b/sound/direct_sound_samples/cries/squirtle.aif new file mode 100644 index 000000000..43a98a53d Binary files /dev/null and b/sound/direct_sound_samples/cries/squirtle.aif differ diff --git a/sound/direct_sound_samples/cries/stantler.aif b/sound/direct_sound_samples/cries/stantler.aif new file mode 100644 index 000000000..36ba54658 Binary files /dev/null and b/sound/direct_sound_samples/cries/stantler.aif differ diff --git a/sound/direct_sound_samples/cries/starmie.aif b/sound/direct_sound_samples/cries/starmie.aif new file mode 100644 index 000000000..7452a78f9 Binary files /dev/null and b/sound/direct_sound_samples/cries/starmie.aif differ diff --git a/sound/direct_sound_samples/cries/staryu.aif b/sound/direct_sound_samples/cries/staryu.aif new file mode 100644 index 000000000..6ab5584bf Binary files /dev/null and b/sound/direct_sound_samples/cries/staryu.aif differ diff --git a/sound/direct_sound_samples/cries/steelix.aif b/sound/direct_sound_samples/cries/steelix.aif new file mode 100644 index 000000000..aa05e2d4c Binary files /dev/null and b/sound/direct_sound_samples/cries/steelix.aif differ diff --git a/sound/direct_sound_samples/cries/sudowoodo.aif b/sound/direct_sound_samples/cries/sudowoodo.aif new file mode 100644 index 000000000..1af7e18eb Binary files /dev/null and b/sound/direct_sound_samples/cries/sudowoodo.aif differ diff --git a/sound/direct_sound_samples/cries/suicune.aif b/sound/direct_sound_samples/cries/suicune.aif new file mode 100644 index 000000000..697732d68 Binary files /dev/null and b/sound/direct_sound_samples/cries/suicune.aif differ diff --git a/sound/direct_sound_samples/cries/sunflora.aif b/sound/direct_sound_samples/cries/sunflora.aif new file mode 100644 index 000000000..126931adc Binary files /dev/null and b/sound/direct_sound_samples/cries/sunflora.aif differ diff --git a/sound/direct_sound_samples/cries/sunkern.aif b/sound/direct_sound_samples/cries/sunkern.aif new file mode 100644 index 000000000..bede3bf95 Binary files /dev/null and b/sound/direct_sound_samples/cries/sunkern.aif differ diff --git a/sound/direct_sound_samples/cries/surskit.aif b/sound/direct_sound_samples/cries/surskit.aif new file mode 100644 index 000000000..438b5b67a Binary files /dev/null and b/sound/direct_sound_samples/cries/surskit.aif differ diff --git a/sound/direct_sound_samples/cries/swablu.aif b/sound/direct_sound_samples/cries/swablu.aif new file mode 100644 index 000000000..066095f55 Binary files /dev/null and b/sound/direct_sound_samples/cries/swablu.aif differ diff --git a/sound/direct_sound_samples/cries/swalot.aif b/sound/direct_sound_samples/cries/swalot.aif new file mode 100644 index 000000000..518a9bf5a Binary files /dev/null and b/sound/direct_sound_samples/cries/swalot.aif differ diff --git a/sound/direct_sound_samples/cries/swampert.aif b/sound/direct_sound_samples/cries/swampert.aif new file mode 100644 index 000000000..56bd26405 Binary files /dev/null and b/sound/direct_sound_samples/cries/swampert.aif differ diff --git a/sound/direct_sound_samples/cries/swellow.aif b/sound/direct_sound_samples/cries/swellow.aif new file mode 100644 index 000000000..2b94eb432 Binary files /dev/null and b/sound/direct_sound_samples/cries/swellow.aif differ diff --git a/sound/direct_sound_samples/cries/swinub.aif b/sound/direct_sound_samples/cries/swinub.aif new file mode 100644 index 000000000..dc68d62d8 Binary files /dev/null and b/sound/direct_sound_samples/cries/swinub.aif differ diff --git a/sound/direct_sound_samples/cries/taillow.aif b/sound/direct_sound_samples/cries/taillow.aif new file mode 100644 index 000000000..8322a3224 Binary files /dev/null and b/sound/direct_sound_samples/cries/taillow.aif differ diff --git a/sound/direct_sound_samples/cries/tangela.aif b/sound/direct_sound_samples/cries/tangela.aif new file mode 100644 index 000000000..c900b426d Binary files /dev/null and b/sound/direct_sound_samples/cries/tangela.aif differ diff --git a/sound/direct_sound_samples/cries/tauros.aif b/sound/direct_sound_samples/cries/tauros.aif new file mode 100644 index 000000000..84fa9b317 Binary files /dev/null and b/sound/direct_sound_samples/cries/tauros.aif differ diff --git a/sound/direct_sound_samples/cries/teddiursa.aif b/sound/direct_sound_samples/cries/teddiursa.aif new file mode 100644 index 000000000..ba5cb5bc3 Binary files /dev/null and b/sound/direct_sound_samples/cries/teddiursa.aif differ diff --git a/sound/direct_sound_samples/cries/tentacool.aif b/sound/direct_sound_samples/cries/tentacool.aif new file mode 100644 index 000000000..332bec4b2 Binary files /dev/null and b/sound/direct_sound_samples/cries/tentacool.aif differ diff --git a/sound/direct_sound_samples/cries/tentacruel.aif b/sound/direct_sound_samples/cries/tentacruel.aif new file mode 100644 index 000000000..e8ec1b14c Binary files /dev/null and b/sound/direct_sound_samples/cries/tentacruel.aif differ diff --git a/sound/direct_sound_samples/cries/togepi.aif b/sound/direct_sound_samples/cries/togepi.aif new file mode 100644 index 000000000..87ef6ef2d Binary files /dev/null and b/sound/direct_sound_samples/cries/togepi.aif differ diff --git a/sound/direct_sound_samples/cries/togetic.aif b/sound/direct_sound_samples/cries/togetic.aif new file mode 100644 index 000000000..8aa18ac41 Binary files /dev/null and b/sound/direct_sound_samples/cries/togetic.aif differ diff --git a/sound/direct_sound_samples/cries/torchic.aif b/sound/direct_sound_samples/cries/torchic.aif new file mode 100644 index 000000000..185a79499 Binary files /dev/null and b/sound/direct_sound_samples/cries/torchic.aif differ diff --git a/sound/direct_sound_samples/cries/torkoal.aif b/sound/direct_sound_samples/cries/torkoal.aif new file mode 100644 index 000000000..9e56d3810 Binary files /dev/null and b/sound/direct_sound_samples/cries/torkoal.aif differ diff --git a/sound/direct_sound_samples/cries/totodile.aif b/sound/direct_sound_samples/cries/totodile.aif new file mode 100644 index 000000000..dbf2179a7 Binary files /dev/null and b/sound/direct_sound_samples/cries/totodile.aif differ diff --git a/sound/direct_sound_samples/cries/trapinch.aif b/sound/direct_sound_samples/cries/trapinch.aif new file mode 100644 index 000000000..01664b72e Binary files /dev/null and b/sound/direct_sound_samples/cries/trapinch.aif differ diff --git a/sound/direct_sound_samples/cries/treecko.aif b/sound/direct_sound_samples/cries/treecko.aif new file mode 100644 index 000000000..a7416e8da Binary files /dev/null and b/sound/direct_sound_samples/cries/treecko.aif differ diff --git a/sound/direct_sound_samples/cries/tropius.aif b/sound/direct_sound_samples/cries/tropius.aif new file mode 100644 index 000000000..bbb52787b Binary files /dev/null and b/sound/direct_sound_samples/cries/tropius.aif differ diff --git a/sound/direct_sound_samples/cries/typhlosion.aif b/sound/direct_sound_samples/cries/typhlosion.aif new file mode 100644 index 000000000..f0238d066 Binary files /dev/null and b/sound/direct_sound_samples/cries/typhlosion.aif differ diff --git a/sound/direct_sound_samples/cries/tyranitar.aif b/sound/direct_sound_samples/cries/tyranitar.aif new file mode 100644 index 000000000..557f61769 Binary files /dev/null and b/sound/direct_sound_samples/cries/tyranitar.aif differ diff --git a/sound/direct_sound_samples/cries/tyrogue.aif b/sound/direct_sound_samples/cries/tyrogue.aif new file mode 100644 index 000000000..e5065f58b Binary files /dev/null and b/sound/direct_sound_samples/cries/tyrogue.aif differ diff --git a/sound/direct_sound_samples/cries/umbreon.aif b/sound/direct_sound_samples/cries/umbreon.aif new file mode 100644 index 000000000..38129b1a7 Binary files /dev/null and b/sound/direct_sound_samples/cries/umbreon.aif differ diff --git a/sound/direct_sound_samples/cries/unown.aif b/sound/direct_sound_samples/cries/unown.aif new file mode 100644 index 000000000..8339ccb6b Binary files /dev/null and b/sound/direct_sound_samples/cries/unown.aif differ diff --git a/sound/direct_sound_samples/cries/unused_265.aif b/sound/direct_sound_samples/cries/unused_265.aif new file mode 100644 index 000000000..7f5965f06 Binary files /dev/null and b/sound/direct_sound_samples/cries/unused_265.aif differ diff --git a/sound/direct_sound_samples/cries/unused_268.aif b/sound/direct_sound_samples/cries/unused_268.aif new file mode 100644 index 000000000..5cae364c3 Binary files /dev/null and b/sound/direct_sound_samples/cries/unused_268.aif differ diff --git a/sound/direct_sound_samples/cries/ursaring.aif b/sound/direct_sound_samples/cries/ursaring.aif new file mode 100644 index 000000000..fcc748bd1 Binary files /dev/null and b/sound/direct_sound_samples/cries/ursaring.aif differ diff --git a/sound/direct_sound_samples/cries/vaporeon.aif b/sound/direct_sound_samples/cries/vaporeon.aif new file mode 100644 index 000000000..4967cfdeb Binary files /dev/null and b/sound/direct_sound_samples/cries/vaporeon.aif differ diff --git a/sound/direct_sound_samples/cries/venomoth.aif b/sound/direct_sound_samples/cries/venomoth.aif new file mode 100644 index 000000000..bc291ec33 Binary files /dev/null and b/sound/direct_sound_samples/cries/venomoth.aif differ diff --git a/sound/direct_sound_samples/cries/venonat.aif b/sound/direct_sound_samples/cries/venonat.aif new file mode 100644 index 000000000..e89d87fa8 Binary files /dev/null and b/sound/direct_sound_samples/cries/venonat.aif differ diff --git a/sound/direct_sound_samples/cries/venusaur.aif b/sound/direct_sound_samples/cries/venusaur.aif new file mode 100644 index 000000000..8a1f69e6e Binary files /dev/null and b/sound/direct_sound_samples/cries/venusaur.aif differ diff --git a/sound/direct_sound_samples/cries/vibrava.aif b/sound/direct_sound_samples/cries/vibrava.aif new file mode 100644 index 000000000..3e3180219 Binary files /dev/null and b/sound/direct_sound_samples/cries/vibrava.aif differ diff --git a/sound/direct_sound_samples/cries/victreebel.aif b/sound/direct_sound_samples/cries/victreebel.aif new file mode 100644 index 000000000..d6e6a4fe9 Binary files /dev/null and b/sound/direct_sound_samples/cries/victreebel.aif differ diff --git a/sound/direct_sound_samples/cries/vigoroth.aif b/sound/direct_sound_samples/cries/vigoroth.aif new file mode 100644 index 000000000..fc414f33d Binary files /dev/null and b/sound/direct_sound_samples/cries/vigoroth.aif differ diff --git a/sound/direct_sound_samples/cries/vileplume.aif b/sound/direct_sound_samples/cries/vileplume.aif new file mode 100644 index 000000000..723eec697 Binary files /dev/null and b/sound/direct_sound_samples/cries/vileplume.aif differ diff --git a/sound/direct_sound_samples/cries/volbeat.aif b/sound/direct_sound_samples/cries/volbeat.aif new file mode 100644 index 000000000..6f765081e Binary files /dev/null and b/sound/direct_sound_samples/cries/volbeat.aif differ diff --git a/sound/direct_sound_samples/cries/voltorb.aif b/sound/direct_sound_samples/cries/voltorb.aif new file mode 100644 index 000000000..96e3bff31 Binary files /dev/null and b/sound/direct_sound_samples/cries/voltorb.aif differ diff --git a/sound/direct_sound_samples/cries/vulpix.aif b/sound/direct_sound_samples/cries/vulpix.aif new file mode 100644 index 000000000..20da23fb4 Binary files /dev/null and b/sound/direct_sound_samples/cries/vulpix.aif differ diff --git a/sound/direct_sound_samples/cries/wailmer.aif b/sound/direct_sound_samples/cries/wailmer.aif new file mode 100644 index 000000000..e8de91333 Binary files /dev/null and b/sound/direct_sound_samples/cries/wailmer.aif differ diff --git a/sound/direct_sound_samples/cries/wailord.aif b/sound/direct_sound_samples/cries/wailord.aif new file mode 100644 index 000000000..2c0468010 Binary files /dev/null and b/sound/direct_sound_samples/cries/wailord.aif differ diff --git a/sound/direct_sound_samples/cries/walrein.aif b/sound/direct_sound_samples/cries/walrein.aif new file mode 100644 index 000000000..91d93f3fb Binary files /dev/null and b/sound/direct_sound_samples/cries/walrein.aif differ diff --git a/sound/direct_sound_samples/cries/wartortle.aif b/sound/direct_sound_samples/cries/wartortle.aif new file mode 100644 index 000000000..5dab7fd93 Binary files /dev/null and b/sound/direct_sound_samples/cries/wartortle.aif differ diff --git a/sound/direct_sound_samples/cries/weedle.aif b/sound/direct_sound_samples/cries/weedle.aif new file mode 100644 index 000000000..773c2c8ae Binary files /dev/null and b/sound/direct_sound_samples/cries/weedle.aif differ diff --git a/sound/direct_sound_samples/cries/weepinbell.aif b/sound/direct_sound_samples/cries/weepinbell.aif new file mode 100644 index 000000000..cdd61380a Binary files /dev/null and b/sound/direct_sound_samples/cries/weepinbell.aif differ diff --git a/sound/direct_sound_samples/cries/weezing.aif b/sound/direct_sound_samples/cries/weezing.aif new file mode 100644 index 000000000..2e4a7fe13 Binary files /dev/null and b/sound/direct_sound_samples/cries/weezing.aif differ diff --git a/sound/direct_sound_samples/cries/whiscash.aif b/sound/direct_sound_samples/cries/whiscash.aif new file mode 100644 index 000000000..219737f32 Binary files /dev/null and b/sound/direct_sound_samples/cries/whiscash.aif differ diff --git a/sound/direct_sound_samples/cries/whismur.aif b/sound/direct_sound_samples/cries/whismur.aif new file mode 100644 index 000000000..4da92ca6a Binary files /dev/null and b/sound/direct_sound_samples/cries/whismur.aif differ diff --git a/sound/direct_sound_samples/cries/wigglytuff.aif b/sound/direct_sound_samples/cries/wigglytuff.aif new file mode 100644 index 000000000..90aa90a23 Binary files /dev/null and b/sound/direct_sound_samples/cries/wigglytuff.aif differ diff --git a/sound/direct_sound_samples/cries/wingull.aif b/sound/direct_sound_samples/cries/wingull.aif new file mode 100644 index 000000000..182ef18e6 Binary files /dev/null and b/sound/direct_sound_samples/cries/wingull.aif differ diff --git a/sound/direct_sound_samples/cries/wobbuffet.aif b/sound/direct_sound_samples/cries/wobbuffet.aif new file mode 100644 index 000000000..70ee1f704 Binary files /dev/null and b/sound/direct_sound_samples/cries/wobbuffet.aif differ diff --git a/sound/direct_sound_samples/cries/wooper.aif b/sound/direct_sound_samples/cries/wooper.aif new file mode 100644 index 000000000..51a6b627e Binary files /dev/null and b/sound/direct_sound_samples/cries/wooper.aif differ diff --git a/sound/direct_sound_samples/cries/wurmple.aif b/sound/direct_sound_samples/cries/wurmple.aif new file mode 100644 index 000000000..6442a4063 Binary files /dev/null and b/sound/direct_sound_samples/cries/wurmple.aif differ diff --git a/sound/direct_sound_samples/cries/wynaut.aif b/sound/direct_sound_samples/cries/wynaut.aif new file mode 100644 index 000000000..798732c74 Binary files /dev/null and b/sound/direct_sound_samples/cries/wynaut.aif differ diff --git a/sound/direct_sound_samples/cries/xatu.aif b/sound/direct_sound_samples/cries/xatu.aif new file mode 100644 index 000000000..ac758fdbf Binary files /dev/null and b/sound/direct_sound_samples/cries/xatu.aif differ diff --git a/sound/direct_sound_samples/cries/yanma.aif b/sound/direct_sound_samples/cries/yanma.aif new file mode 100644 index 000000000..df76534c5 Binary files /dev/null and b/sound/direct_sound_samples/cries/yanma.aif differ diff --git a/sound/direct_sound_samples/cries/zangoose.aif b/sound/direct_sound_samples/cries/zangoose.aif new file mode 100644 index 000000000..3c206532f Binary files /dev/null and b/sound/direct_sound_samples/cries/zangoose.aif differ diff --git a/sound/direct_sound_samples/cries/zapdos.aif b/sound/direct_sound_samples/cries/zapdos.aif new file mode 100644 index 000000000..a8d914d14 Binary files /dev/null and b/sound/direct_sound_samples/cries/zapdos.aif differ diff --git a/sound/direct_sound_samples/cries/zigzagoon.aif b/sound/direct_sound_samples/cries/zigzagoon.aif new file mode 100644 index 000000000..52b9bb4f4 Binary files /dev/null and b/sound/direct_sound_samples/cries/zigzagoon.aif differ diff --git a/sound/direct_sound_samples/cries/zubat.aif b/sound/direct_sound_samples/cries/zubat.aif new file mode 100644 index 000000000..45036d072 Binary files /dev/null and b/sound/direct_sound_samples/cries/zubat.aif differ diff --git a/sound/direct_sound_samples/cry_abra.aif b/sound/direct_sound_samples/cry_abra.aif deleted file mode 100644 index 7df4446db..000000000 Binary files a/sound/direct_sound_samples/cry_abra.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_absol.aif b/sound/direct_sound_samples/cry_absol.aif deleted file mode 100644 index 884ab22b3..000000000 Binary files a/sound/direct_sound_samples/cry_absol.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_aerodactyl.aif b/sound/direct_sound_samples/cry_aerodactyl.aif deleted file mode 100644 index c0e40f6d1..000000000 Binary files a/sound/direct_sound_samples/cry_aerodactyl.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_aggron.aif b/sound/direct_sound_samples/cry_aggron.aif deleted file mode 100644 index b89ea1222..000000000 Binary files a/sound/direct_sound_samples/cry_aggron.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_aipom.aif b/sound/direct_sound_samples/cry_aipom.aif deleted file mode 100644 index 5ca276de2..000000000 Binary files a/sound/direct_sound_samples/cry_aipom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_alakazam.aif b/sound/direct_sound_samples/cry_alakazam.aif deleted file mode 100644 index 920e2ff94..000000000 Binary files a/sound/direct_sound_samples/cry_alakazam.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_altaria.aif b/sound/direct_sound_samples/cry_altaria.aif deleted file mode 100644 index 3e8e35e8e..000000000 Binary files a/sound/direct_sound_samples/cry_altaria.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_ampharos.aif b/sound/direct_sound_samples/cry_ampharos.aif deleted file mode 100644 index 4f6e255a0..000000000 Binary files a/sound/direct_sound_samples/cry_ampharos.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_anorith.aif b/sound/direct_sound_samples/cry_anorith.aif deleted file mode 100644 index 96e87e919..000000000 Binary files a/sound/direct_sound_samples/cry_anorith.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_arbok.aif b/sound/direct_sound_samples/cry_arbok.aif deleted file mode 100644 index 6ccace9f9..000000000 Binary files a/sound/direct_sound_samples/cry_arbok.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_arcanine.aif b/sound/direct_sound_samples/cry_arcanine.aif deleted file mode 100644 index 61d802153..000000000 Binary files a/sound/direct_sound_samples/cry_arcanine.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_ariados.aif b/sound/direct_sound_samples/cry_ariados.aif deleted file mode 100644 index 1748624fb..000000000 Binary files a/sound/direct_sound_samples/cry_ariados.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_armaldo.aif b/sound/direct_sound_samples/cry_armaldo.aif deleted file mode 100644 index 756bf0842..000000000 Binary files a/sound/direct_sound_samples/cry_armaldo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_aron.aif b/sound/direct_sound_samples/cry_aron.aif deleted file mode 100644 index cce70b73b..000000000 Binary files a/sound/direct_sound_samples/cry_aron.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_articuno.aif b/sound/direct_sound_samples/cry_articuno.aif deleted file mode 100644 index 4f237dd0f..000000000 Binary files a/sound/direct_sound_samples/cry_articuno.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_azumarill.aif b/sound/direct_sound_samples/cry_azumarill.aif deleted file mode 100644 index 18411f93c..000000000 Binary files a/sound/direct_sound_samples/cry_azumarill.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_azurill.aif b/sound/direct_sound_samples/cry_azurill.aif deleted file mode 100644 index 7f651c3d3..000000000 Binary files a/sound/direct_sound_samples/cry_azurill.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_bagon.aif b/sound/direct_sound_samples/cry_bagon.aif deleted file mode 100644 index 3843fb9f4..000000000 Binary files a/sound/direct_sound_samples/cry_bagon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_baltoy.aif b/sound/direct_sound_samples/cry_baltoy.aif deleted file mode 100644 index 25e1a708a..000000000 Binary files a/sound/direct_sound_samples/cry_baltoy.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_banette.aif b/sound/direct_sound_samples/cry_banette.aif deleted file mode 100644 index 23713f1b5..000000000 Binary files a/sound/direct_sound_samples/cry_banette.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_barboach.aif b/sound/direct_sound_samples/cry_barboach.aif deleted file mode 100644 index 4b9228259..000000000 Binary files a/sound/direct_sound_samples/cry_barboach.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_bayleef.aif b/sound/direct_sound_samples/cry_bayleef.aif deleted file mode 100644 index 8cef22df3..000000000 Binary files a/sound/direct_sound_samples/cry_bayleef.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_beautifly.aif b/sound/direct_sound_samples/cry_beautifly.aif deleted file mode 100644 index 0924b6c55..000000000 Binary files a/sound/direct_sound_samples/cry_beautifly.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_beedrill.aif b/sound/direct_sound_samples/cry_beedrill.aif deleted file mode 100644 index 00d0bc96c..000000000 Binary files a/sound/direct_sound_samples/cry_beedrill.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_beldum.aif b/sound/direct_sound_samples/cry_beldum.aif deleted file mode 100644 index 76435a6a8..000000000 Binary files a/sound/direct_sound_samples/cry_beldum.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_bellossom.aif b/sound/direct_sound_samples/cry_bellossom.aif deleted file mode 100644 index 86580df65..000000000 Binary files a/sound/direct_sound_samples/cry_bellossom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_bellsprout.aif b/sound/direct_sound_samples/cry_bellsprout.aif deleted file mode 100644 index cfdd7aed2..000000000 Binary files a/sound/direct_sound_samples/cry_bellsprout.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_blastoise.aif b/sound/direct_sound_samples/cry_blastoise.aif deleted file mode 100644 index 76dac2bcc..000000000 Binary files a/sound/direct_sound_samples/cry_blastoise.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_blaziken.aif b/sound/direct_sound_samples/cry_blaziken.aif deleted file mode 100644 index 83e5ccf23..000000000 Binary files a/sound/direct_sound_samples/cry_blaziken.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_blissey.aif b/sound/direct_sound_samples/cry_blissey.aif deleted file mode 100644 index 897eb3d69..000000000 Binary files a/sound/direct_sound_samples/cry_blissey.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_breloom.aif b/sound/direct_sound_samples/cry_breloom.aif deleted file mode 100644 index ea3f1bb66..000000000 Binary files a/sound/direct_sound_samples/cry_breloom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_bulbasaur.aif b/sound/direct_sound_samples/cry_bulbasaur.aif deleted file mode 100644 index 040fb1df7..000000000 Binary files a/sound/direct_sound_samples/cry_bulbasaur.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_butterfree.aif b/sound/direct_sound_samples/cry_butterfree.aif deleted file mode 100644 index f27616395..000000000 Binary files a/sound/direct_sound_samples/cry_butterfree.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_cacnea.aif b/sound/direct_sound_samples/cry_cacnea.aif deleted file mode 100644 index 4fd5acd36..000000000 Binary files a/sound/direct_sound_samples/cry_cacnea.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_cacturne.aif b/sound/direct_sound_samples/cry_cacturne.aif deleted file mode 100644 index d9fb8fda8..000000000 Binary files a/sound/direct_sound_samples/cry_cacturne.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_camerupt.aif b/sound/direct_sound_samples/cry_camerupt.aif deleted file mode 100644 index 325df1220..000000000 Binary files a/sound/direct_sound_samples/cry_camerupt.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_carvanha.aif b/sound/direct_sound_samples/cry_carvanha.aif deleted file mode 100644 index c7cdedf91..000000000 Binary files a/sound/direct_sound_samples/cry_carvanha.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_cascoon.aif b/sound/direct_sound_samples/cry_cascoon.aif deleted file mode 100644 index 17eef0ee9..000000000 Binary files a/sound/direct_sound_samples/cry_cascoon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_castform.aif b/sound/direct_sound_samples/cry_castform.aif deleted file mode 100644 index c10745640..000000000 Binary files a/sound/direct_sound_samples/cry_castform.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_caterpie.aif b/sound/direct_sound_samples/cry_caterpie.aif deleted file mode 100644 index b0b246b4f..000000000 Binary files a/sound/direct_sound_samples/cry_caterpie.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_celebi.aif b/sound/direct_sound_samples/cry_celebi.aif deleted file mode 100644 index 9f9f3ea39..000000000 Binary files a/sound/direct_sound_samples/cry_celebi.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_chansey.aif b/sound/direct_sound_samples/cry_chansey.aif deleted file mode 100644 index d764c86ce..000000000 Binary files a/sound/direct_sound_samples/cry_chansey.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_charizard.aif b/sound/direct_sound_samples/cry_charizard.aif deleted file mode 100644 index 48321b792..000000000 Binary files a/sound/direct_sound_samples/cry_charizard.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_charmander.aif b/sound/direct_sound_samples/cry_charmander.aif deleted file mode 100644 index d72c0f9e0..000000000 Binary files a/sound/direct_sound_samples/cry_charmander.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_charmeleon.aif b/sound/direct_sound_samples/cry_charmeleon.aif deleted file mode 100644 index 8e84af0d8..000000000 Binary files a/sound/direct_sound_samples/cry_charmeleon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_chikorita.aif b/sound/direct_sound_samples/cry_chikorita.aif deleted file mode 100644 index 67ceafdc3..000000000 Binary files a/sound/direct_sound_samples/cry_chikorita.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_chimecho.aif b/sound/direct_sound_samples/cry_chimecho.aif deleted file mode 100644 index 87ee2faee..000000000 Binary files a/sound/direct_sound_samples/cry_chimecho.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_chinchou.aif b/sound/direct_sound_samples/cry_chinchou.aif deleted file mode 100644 index 356475678..000000000 Binary files a/sound/direct_sound_samples/cry_chinchou.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_clamperl.aif b/sound/direct_sound_samples/cry_clamperl.aif deleted file mode 100644 index 7250bd703..000000000 Binary files a/sound/direct_sound_samples/cry_clamperl.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_claydol.aif b/sound/direct_sound_samples/cry_claydol.aif deleted file mode 100644 index b89772021..000000000 Binary files a/sound/direct_sound_samples/cry_claydol.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_clefable.aif b/sound/direct_sound_samples/cry_clefable.aif deleted file mode 100644 index 9c2d8c664..000000000 Binary files a/sound/direct_sound_samples/cry_clefable.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_clefairy.aif b/sound/direct_sound_samples/cry_clefairy.aif deleted file mode 100644 index c370c4a9b..000000000 Binary files a/sound/direct_sound_samples/cry_clefairy.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_cleffa.aif b/sound/direct_sound_samples/cry_cleffa.aif deleted file mode 100644 index b27cdeca9..000000000 Binary files a/sound/direct_sound_samples/cry_cleffa.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_cloyster.aif b/sound/direct_sound_samples/cry_cloyster.aif deleted file mode 100644 index b406deab0..000000000 Binary files a/sound/direct_sound_samples/cry_cloyster.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_combusken.aif b/sound/direct_sound_samples/cry_combusken.aif deleted file mode 100644 index 7d4b0d4cc..000000000 Binary files a/sound/direct_sound_samples/cry_combusken.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_corphish.aif b/sound/direct_sound_samples/cry_corphish.aif deleted file mode 100644 index f0f5ca01e..000000000 Binary files a/sound/direct_sound_samples/cry_corphish.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_corsola.aif b/sound/direct_sound_samples/cry_corsola.aif deleted file mode 100644 index 68e743bfd..000000000 Binary files a/sound/direct_sound_samples/cry_corsola.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_cradily.aif b/sound/direct_sound_samples/cry_cradily.aif deleted file mode 100644 index 197dc8d92..000000000 Binary files a/sound/direct_sound_samples/cry_cradily.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_crawdaunt.aif b/sound/direct_sound_samples/cry_crawdaunt.aif deleted file mode 100644 index a203ce2fb..000000000 Binary files a/sound/direct_sound_samples/cry_crawdaunt.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_crobat.aif b/sound/direct_sound_samples/cry_crobat.aif deleted file mode 100644 index 75d039bd8..000000000 Binary files a/sound/direct_sound_samples/cry_crobat.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_croconaw.aif b/sound/direct_sound_samples/cry_croconaw.aif deleted file mode 100644 index afb7f3fdc..000000000 Binary files a/sound/direct_sound_samples/cry_croconaw.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_cubone.aif b/sound/direct_sound_samples/cry_cubone.aif deleted file mode 100644 index 170745da1..000000000 Binary files a/sound/direct_sound_samples/cry_cubone.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_cyndaquil.aif b/sound/direct_sound_samples/cry_cyndaquil.aif deleted file mode 100644 index 4aa580199..000000000 Binary files a/sound/direct_sound_samples/cry_cyndaquil.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_delcatty.aif b/sound/direct_sound_samples/cry_delcatty.aif deleted file mode 100644 index dd665b110..000000000 Binary files a/sound/direct_sound_samples/cry_delcatty.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_delibird.aif b/sound/direct_sound_samples/cry_delibird.aif deleted file mode 100644 index dbedc42d4..000000000 Binary files a/sound/direct_sound_samples/cry_delibird.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_deoxys.aif b/sound/direct_sound_samples/cry_deoxys.aif deleted file mode 100644 index b9623b337..000000000 Binary files a/sound/direct_sound_samples/cry_deoxys.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_dewgong.aif b/sound/direct_sound_samples/cry_dewgong.aif deleted file mode 100644 index 72d69b773..000000000 Binary files a/sound/direct_sound_samples/cry_dewgong.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_diglett.aif b/sound/direct_sound_samples/cry_diglett.aif deleted file mode 100644 index b116af7f2..000000000 Binary files a/sound/direct_sound_samples/cry_diglett.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_ditto.aif b/sound/direct_sound_samples/cry_ditto.aif deleted file mode 100644 index 2c797f4c4..000000000 Binary files a/sound/direct_sound_samples/cry_ditto.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_dodrio.aif b/sound/direct_sound_samples/cry_dodrio.aif deleted file mode 100644 index 111d8bf3e..000000000 Binary files a/sound/direct_sound_samples/cry_dodrio.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_doduo.aif b/sound/direct_sound_samples/cry_doduo.aif deleted file mode 100644 index 5700b91d9..000000000 Binary files a/sound/direct_sound_samples/cry_doduo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_donphan.aif b/sound/direct_sound_samples/cry_donphan.aif deleted file mode 100644 index a41c124b1..000000000 Binary files a/sound/direct_sound_samples/cry_donphan.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_dragonair.aif b/sound/direct_sound_samples/cry_dragonair.aif deleted file mode 100644 index 38c3955ef..000000000 Binary files a/sound/direct_sound_samples/cry_dragonair.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_dragonite.aif b/sound/direct_sound_samples/cry_dragonite.aif deleted file mode 100644 index d1e7b11cf..000000000 Binary files a/sound/direct_sound_samples/cry_dragonite.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_dratini.aif b/sound/direct_sound_samples/cry_dratini.aif deleted file mode 100644 index 298497480..000000000 Binary files a/sound/direct_sound_samples/cry_dratini.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_drowzee.aif b/sound/direct_sound_samples/cry_drowzee.aif deleted file mode 100644 index 0d53eb2ff..000000000 Binary files a/sound/direct_sound_samples/cry_drowzee.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_dugtrio.aif b/sound/direct_sound_samples/cry_dugtrio.aif deleted file mode 100644 index dff573dfe..000000000 Binary files a/sound/direct_sound_samples/cry_dugtrio.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_dunsparce.aif b/sound/direct_sound_samples/cry_dunsparce.aif deleted file mode 100644 index 454617c05..000000000 Binary files a/sound/direct_sound_samples/cry_dunsparce.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_dusclops.aif b/sound/direct_sound_samples/cry_dusclops.aif deleted file mode 100644 index de9657e4f..000000000 Binary files a/sound/direct_sound_samples/cry_dusclops.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_duskull.aif b/sound/direct_sound_samples/cry_duskull.aif deleted file mode 100644 index d84ea274e..000000000 Binary files a/sound/direct_sound_samples/cry_duskull.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_dustox.aif b/sound/direct_sound_samples/cry_dustox.aif deleted file mode 100644 index 56d8eb336..000000000 Binary files a/sound/direct_sound_samples/cry_dustox.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_eevee.aif b/sound/direct_sound_samples/cry_eevee.aif deleted file mode 100644 index 8711a1470..000000000 Binary files a/sound/direct_sound_samples/cry_eevee.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_ekans.aif b/sound/direct_sound_samples/cry_ekans.aif deleted file mode 100644 index 9eb396735..000000000 Binary files a/sound/direct_sound_samples/cry_ekans.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_electabuzz.aif b/sound/direct_sound_samples/cry_electabuzz.aif deleted file mode 100644 index 5abdb49b7..000000000 Binary files a/sound/direct_sound_samples/cry_electabuzz.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_electrike.aif b/sound/direct_sound_samples/cry_electrike.aif deleted file mode 100644 index 56c9666df..000000000 Binary files a/sound/direct_sound_samples/cry_electrike.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_electrode.aif b/sound/direct_sound_samples/cry_electrode.aif deleted file mode 100644 index cbd7f0971..000000000 Binary files a/sound/direct_sound_samples/cry_electrode.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_elekid.aif b/sound/direct_sound_samples/cry_elekid.aif deleted file mode 100644 index 839bdee17..000000000 Binary files a/sound/direct_sound_samples/cry_elekid.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_entei.aif b/sound/direct_sound_samples/cry_entei.aif deleted file mode 100644 index 56a740207..000000000 Binary files a/sound/direct_sound_samples/cry_entei.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_espeon.aif b/sound/direct_sound_samples/cry_espeon.aif deleted file mode 100644 index 53dc62f4d..000000000 Binary files a/sound/direct_sound_samples/cry_espeon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_exeggcute.aif b/sound/direct_sound_samples/cry_exeggcute.aif deleted file mode 100644 index 147912c2f..000000000 Binary files a/sound/direct_sound_samples/cry_exeggcute.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_exeggutor.aif b/sound/direct_sound_samples/cry_exeggutor.aif deleted file mode 100644 index c0b9177bf..000000000 Binary files a/sound/direct_sound_samples/cry_exeggutor.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_exploud.aif b/sound/direct_sound_samples/cry_exploud.aif deleted file mode 100644 index 5b80870cc..000000000 Binary files a/sound/direct_sound_samples/cry_exploud.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_farfetchd.aif b/sound/direct_sound_samples/cry_farfetchd.aif deleted file mode 100644 index f1db556dc..000000000 Binary files a/sound/direct_sound_samples/cry_farfetchd.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_fearow.aif b/sound/direct_sound_samples/cry_fearow.aif deleted file mode 100644 index 74a76f6d4..000000000 Binary files a/sound/direct_sound_samples/cry_fearow.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_feebas.aif b/sound/direct_sound_samples/cry_feebas.aif deleted file mode 100644 index c386522f1..000000000 Binary files a/sound/direct_sound_samples/cry_feebas.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_feraligatr.aif b/sound/direct_sound_samples/cry_feraligatr.aif deleted file mode 100644 index 9fcd93cff..000000000 Binary files a/sound/direct_sound_samples/cry_feraligatr.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_flaaffy.aif b/sound/direct_sound_samples/cry_flaaffy.aif deleted file mode 100644 index 93dfacfaf..000000000 Binary files a/sound/direct_sound_samples/cry_flaaffy.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_flareon.aif b/sound/direct_sound_samples/cry_flareon.aif deleted file mode 100644 index 58d28e60a..000000000 Binary files a/sound/direct_sound_samples/cry_flareon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_flygon.aif b/sound/direct_sound_samples/cry_flygon.aif deleted file mode 100644 index c8c377016..000000000 Binary files a/sound/direct_sound_samples/cry_flygon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_forretress.aif b/sound/direct_sound_samples/cry_forretress.aif deleted file mode 100644 index 288dacbea..000000000 Binary files a/sound/direct_sound_samples/cry_forretress.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_furret.aif b/sound/direct_sound_samples/cry_furret.aif deleted file mode 100644 index 6b4e9ce11..000000000 Binary files a/sound/direct_sound_samples/cry_furret.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_gardevoir.aif b/sound/direct_sound_samples/cry_gardevoir.aif deleted file mode 100644 index a14780990..000000000 Binary files a/sound/direct_sound_samples/cry_gardevoir.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_gastly.aif b/sound/direct_sound_samples/cry_gastly.aif deleted file mode 100644 index 93cef851d..000000000 Binary files a/sound/direct_sound_samples/cry_gastly.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_gengar.aif b/sound/direct_sound_samples/cry_gengar.aif deleted file mode 100644 index 379b5d37e..000000000 Binary files a/sound/direct_sound_samples/cry_gengar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_geodude.aif b/sound/direct_sound_samples/cry_geodude.aif deleted file mode 100644 index 143b9031c..000000000 Binary files a/sound/direct_sound_samples/cry_geodude.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_girafarig.aif b/sound/direct_sound_samples/cry_girafarig.aif deleted file mode 100644 index 1dd5f93e2..000000000 Binary files a/sound/direct_sound_samples/cry_girafarig.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_glalie.aif b/sound/direct_sound_samples/cry_glalie.aif deleted file mode 100644 index e4e896547..000000000 Binary files a/sound/direct_sound_samples/cry_glalie.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_gligar.aif b/sound/direct_sound_samples/cry_gligar.aif deleted file mode 100644 index 4050f08b0..000000000 Binary files a/sound/direct_sound_samples/cry_gligar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_gloom.aif b/sound/direct_sound_samples/cry_gloom.aif deleted file mode 100644 index e930328ac..000000000 Binary files a/sound/direct_sound_samples/cry_gloom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_golbat.aif b/sound/direct_sound_samples/cry_golbat.aif deleted file mode 100644 index 11413df3a..000000000 Binary files a/sound/direct_sound_samples/cry_golbat.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_goldeen.aif b/sound/direct_sound_samples/cry_goldeen.aif deleted file mode 100644 index 81fd1ecdf..000000000 Binary files a/sound/direct_sound_samples/cry_goldeen.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_golduck.aif b/sound/direct_sound_samples/cry_golduck.aif deleted file mode 100644 index b6b71a7a4..000000000 Binary files a/sound/direct_sound_samples/cry_golduck.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_golem.aif b/sound/direct_sound_samples/cry_golem.aif deleted file mode 100644 index 0d2c4515e..000000000 Binary files a/sound/direct_sound_samples/cry_golem.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_gorebyss.aif b/sound/direct_sound_samples/cry_gorebyss.aif deleted file mode 100644 index b7605062c..000000000 Binary files a/sound/direct_sound_samples/cry_gorebyss.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_granbull.aif b/sound/direct_sound_samples/cry_granbull.aif deleted file mode 100644 index 146b3bd0c..000000000 Binary files a/sound/direct_sound_samples/cry_granbull.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_graveler.aif b/sound/direct_sound_samples/cry_graveler.aif deleted file mode 100644 index 773994228..000000000 Binary files a/sound/direct_sound_samples/cry_graveler.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_grimer.aif b/sound/direct_sound_samples/cry_grimer.aif deleted file mode 100644 index 95eed1061..000000000 Binary files a/sound/direct_sound_samples/cry_grimer.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_groudon.aif b/sound/direct_sound_samples/cry_groudon.aif deleted file mode 100644 index 62452b4d9..000000000 Binary files a/sound/direct_sound_samples/cry_groudon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_grovyle.aif b/sound/direct_sound_samples/cry_grovyle.aif deleted file mode 100644 index 983bcfff3..000000000 Binary files a/sound/direct_sound_samples/cry_grovyle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_growlithe.aif b/sound/direct_sound_samples/cry_growlithe.aif deleted file mode 100644 index 134e29834..000000000 Binary files a/sound/direct_sound_samples/cry_growlithe.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_grumpig.aif b/sound/direct_sound_samples/cry_grumpig.aif deleted file mode 100644 index 97c372076..000000000 Binary files a/sound/direct_sound_samples/cry_grumpig.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_gulpin.aif b/sound/direct_sound_samples/cry_gulpin.aif deleted file mode 100644 index f3043b422..000000000 Binary files a/sound/direct_sound_samples/cry_gulpin.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_gyarados.aif b/sound/direct_sound_samples/cry_gyarados.aif deleted file mode 100644 index 238b6d721..000000000 Binary files a/sound/direct_sound_samples/cry_gyarados.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_hariyama.aif b/sound/direct_sound_samples/cry_hariyama.aif deleted file mode 100644 index 1ac1f3f7e..000000000 Binary files a/sound/direct_sound_samples/cry_hariyama.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_haunter.aif b/sound/direct_sound_samples/cry_haunter.aif deleted file mode 100644 index 60ec72171..000000000 Binary files a/sound/direct_sound_samples/cry_haunter.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_heracross.aif b/sound/direct_sound_samples/cry_heracross.aif deleted file mode 100644 index a0734748f..000000000 Binary files a/sound/direct_sound_samples/cry_heracross.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_hitmonchan.aif b/sound/direct_sound_samples/cry_hitmonchan.aif deleted file mode 100644 index 40479452c..000000000 Binary files a/sound/direct_sound_samples/cry_hitmonchan.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_hitmonlee.aif b/sound/direct_sound_samples/cry_hitmonlee.aif deleted file mode 100644 index 3a4bcddca..000000000 Binary files a/sound/direct_sound_samples/cry_hitmonlee.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_hitmontop.aif b/sound/direct_sound_samples/cry_hitmontop.aif deleted file mode 100644 index 3fbee8041..000000000 Binary files a/sound/direct_sound_samples/cry_hitmontop.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_ho_oh.aif b/sound/direct_sound_samples/cry_ho_oh.aif deleted file mode 100644 index 52f8dd307..000000000 Binary files a/sound/direct_sound_samples/cry_ho_oh.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_hoothoot.aif b/sound/direct_sound_samples/cry_hoothoot.aif deleted file mode 100644 index 59e685dcc..000000000 Binary files a/sound/direct_sound_samples/cry_hoothoot.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_hoppip.aif b/sound/direct_sound_samples/cry_hoppip.aif deleted file mode 100644 index ea47877d0..000000000 Binary files a/sound/direct_sound_samples/cry_hoppip.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_horsea.aif b/sound/direct_sound_samples/cry_horsea.aif deleted file mode 100644 index e41eff4b1..000000000 Binary files a/sound/direct_sound_samples/cry_horsea.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_houndoom.aif b/sound/direct_sound_samples/cry_houndoom.aif deleted file mode 100644 index 6fec16d39..000000000 Binary files a/sound/direct_sound_samples/cry_houndoom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_houndour.aif b/sound/direct_sound_samples/cry_houndour.aif deleted file mode 100644 index 7431bbf29..000000000 Binary files a/sound/direct_sound_samples/cry_houndour.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_huntail.aif b/sound/direct_sound_samples/cry_huntail.aif deleted file mode 100644 index f1d3b29d9..000000000 Binary files a/sound/direct_sound_samples/cry_huntail.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_hypno.aif b/sound/direct_sound_samples/cry_hypno.aif deleted file mode 100644 index 32672a3c3..000000000 Binary files a/sound/direct_sound_samples/cry_hypno.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_igglybuff.aif b/sound/direct_sound_samples/cry_igglybuff.aif deleted file mode 100644 index 8de8394d5..000000000 Binary files a/sound/direct_sound_samples/cry_igglybuff.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_illumise.aif b/sound/direct_sound_samples/cry_illumise.aif deleted file mode 100644 index 75e03efc8..000000000 Binary files a/sound/direct_sound_samples/cry_illumise.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_ivysaur.aif b/sound/direct_sound_samples/cry_ivysaur.aif deleted file mode 100644 index ea474ff88..000000000 Binary files a/sound/direct_sound_samples/cry_ivysaur.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_jigglypuff.aif b/sound/direct_sound_samples/cry_jigglypuff.aif deleted file mode 100644 index 780424b4f..000000000 Binary files a/sound/direct_sound_samples/cry_jigglypuff.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_jirachi.aif b/sound/direct_sound_samples/cry_jirachi.aif deleted file mode 100644 index ea8a5c8ad..000000000 Binary files a/sound/direct_sound_samples/cry_jirachi.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_jolteon.aif b/sound/direct_sound_samples/cry_jolteon.aif deleted file mode 100644 index 013369158..000000000 Binary files a/sound/direct_sound_samples/cry_jolteon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_jumpluff.aif b/sound/direct_sound_samples/cry_jumpluff.aif deleted file mode 100644 index 13b0fd315..000000000 Binary files a/sound/direct_sound_samples/cry_jumpluff.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_jynx.aif b/sound/direct_sound_samples/cry_jynx.aif deleted file mode 100644 index 7394a48a2..000000000 Binary files a/sound/direct_sound_samples/cry_jynx.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_kabuto.aif b/sound/direct_sound_samples/cry_kabuto.aif deleted file mode 100644 index 6ae9801b5..000000000 Binary files a/sound/direct_sound_samples/cry_kabuto.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_kabutops.aif b/sound/direct_sound_samples/cry_kabutops.aif deleted file mode 100644 index cb888bff9..000000000 Binary files a/sound/direct_sound_samples/cry_kabutops.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_kadabra.aif b/sound/direct_sound_samples/cry_kadabra.aif deleted file mode 100644 index bfcc18031..000000000 Binary files a/sound/direct_sound_samples/cry_kadabra.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_kakuna.aif b/sound/direct_sound_samples/cry_kakuna.aif deleted file mode 100644 index 7c4e9d7a8..000000000 Binary files a/sound/direct_sound_samples/cry_kakuna.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_kangaskhan.aif b/sound/direct_sound_samples/cry_kangaskhan.aif deleted file mode 100644 index 643e81eb7..000000000 Binary files a/sound/direct_sound_samples/cry_kangaskhan.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_kecleon.aif b/sound/direct_sound_samples/cry_kecleon.aif deleted file mode 100644 index f27ae1832..000000000 Binary files a/sound/direct_sound_samples/cry_kecleon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_kingdra.aif b/sound/direct_sound_samples/cry_kingdra.aif deleted file mode 100644 index ade230c82..000000000 Binary files a/sound/direct_sound_samples/cry_kingdra.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_kingler.aif b/sound/direct_sound_samples/cry_kingler.aif deleted file mode 100644 index a1d845f45..000000000 Binary files a/sound/direct_sound_samples/cry_kingler.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_kirlia.aif b/sound/direct_sound_samples/cry_kirlia.aif deleted file mode 100644 index 692e03e5f..000000000 Binary files a/sound/direct_sound_samples/cry_kirlia.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_koffing.aif b/sound/direct_sound_samples/cry_koffing.aif deleted file mode 100644 index 7ca9de088..000000000 Binary files a/sound/direct_sound_samples/cry_koffing.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_krabby.aif b/sound/direct_sound_samples/cry_krabby.aif deleted file mode 100644 index 6b7692f21..000000000 Binary files a/sound/direct_sound_samples/cry_krabby.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_kyogre.aif b/sound/direct_sound_samples/cry_kyogre.aif deleted file mode 100644 index 290948319..000000000 Binary files a/sound/direct_sound_samples/cry_kyogre.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_lairon.aif b/sound/direct_sound_samples/cry_lairon.aif deleted file mode 100644 index b487165bf..000000000 Binary files a/sound/direct_sound_samples/cry_lairon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_lanturn.aif b/sound/direct_sound_samples/cry_lanturn.aif deleted file mode 100644 index dfeac1fbd..000000000 Binary files a/sound/direct_sound_samples/cry_lanturn.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_lapras.aif b/sound/direct_sound_samples/cry_lapras.aif deleted file mode 100644 index 61de32408..000000000 Binary files a/sound/direct_sound_samples/cry_lapras.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_larvitar.aif b/sound/direct_sound_samples/cry_larvitar.aif deleted file mode 100644 index 1ab0e1d5f..000000000 Binary files a/sound/direct_sound_samples/cry_larvitar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_latias.aif b/sound/direct_sound_samples/cry_latias.aif deleted file mode 100644 index 46f7235f3..000000000 Binary files a/sound/direct_sound_samples/cry_latias.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_latios.aif b/sound/direct_sound_samples/cry_latios.aif deleted file mode 100644 index b8ace2a30..000000000 Binary files a/sound/direct_sound_samples/cry_latios.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_ledian.aif b/sound/direct_sound_samples/cry_ledian.aif deleted file mode 100644 index baefb5fa3..000000000 Binary files a/sound/direct_sound_samples/cry_ledian.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_ledyba.aif b/sound/direct_sound_samples/cry_ledyba.aif deleted file mode 100644 index 4f26859a7..000000000 Binary files a/sound/direct_sound_samples/cry_ledyba.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_lickitung.aif b/sound/direct_sound_samples/cry_lickitung.aif deleted file mode 100644 index e469450a1..000000000 Binary files a/sound/direct_sound_samples/cry_lickitung.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_lileep.aif b/sound/direct_sound_samples/cry_lileep.aif deleted file mode 100644 index ed8258eb7..000000000 Binary files a/sound/direct_sound_samples/cry_lileep.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_linoone.aif b/sound/direct_sound_samples/cry_linoone.aif deleted file mode 100644 index 4e5e7d3b5..000000000 Binary files a/sound/direct_sound_samples/cry_linoone.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_lombre.aif b/sound/direct_sound_samples/cry_lombre.aif deleted file mode 100644 index abafe4321..000000000 Binary files a/sound/direct_sound_samples/cry_lombre.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_lotad.aif b/sound/direct_sound_samples/cry_lotad.aif deleted file mode 100644 index 2596f4390..000000000 Binary files a/sound/direct_sound_samples/cry_lotad.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_loudred.aif b/sound/direct_sound_samples/cry_loudred.aif deleted file mode 100644 index fed7ebec8..000000000 Binary files a/sound/direct_sound_samples/cry_loudred.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_ludicolo.aif b/sound/direct_sound_samples/cry_ludicolo.aif deleted file mode 100644 index 7cf670f38..000000000 Binary files a/sound/direct_sound_samples/cry_ludicolo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_lugia.aif b/sound/direct_sound_samples/cry_lugia.aif deleted file mode 100644 index 45890a2fc..000000000 Binary files a/sound/direct_sound_samples/cry_lugia.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_lunatone.aif b/sound/direct_sound_samples/cry_lunatone.aif deleted file mode 100644 index 42cbc5e3c..000000000 Binary files a/sound/direct_sound_samples/cry_lunatone.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_luvdisc.aif b/sound/direct_sound_samples/cry_luvdisc.aif deleted file mode 100644 index 3cc0cc744..000000000 Binary files a/sound/direct_sound_samples/cry_luvdisc.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_machamp.aif b/sound/direct_sound_samples/cry_machamp.aif deleted file mode 100644 index ddeaf22c8..000000000 Binary files a/sound/direct_sound_samples/cry_machamp.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_machoke.aif b/sound/direct_sound_samples/cry_machoke.aif deleted file mode 100644 index 97065ee09..000000000 Binary files a/sound/direct_sound_samples/cry_machoke.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_machop.aif b/sound/direct_sound_samples/cry_machop.aif deleted file mode 100644 index d92419e84..000000000 Binary files a/sound/direct_sound_samples/cry_machop.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_magby.aif b/sound/direct_sound_samples/cry_magby.aif deleted file mode 100644 index 12f3dc889..000000000 Binary files a/sound/direct_sound_samples/cry_magby.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_magcargo.aif b/sound/direct_sound_samples/cry_magcargo.aif deleted file mode 100644 index bef0351c0..000000000 Binary files a/sound/direct_sound_samples/cry_magcargo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_magikarp.aif b/sound/direct_sound_samples/cry_magikarp.aif deleted file mode 100644 index f4f9219c5..000000000 Binary files a/sound/direct_sound_samples/cry_magikarp.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_magmar.aif b/sound/direct_sound_samples/cry_magmar.aif deleted file mode 100644 index b79c8b9a1..000000000 Binary files a/sound/direct_sound_samples/cry_magmar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_magnemite.aif b/sound/direct_sound_samples/cry_magnemite.aif deleted file mode 100644 index ebb9103d9..000000000 Binary files a/sound/direct_sound_samples/cry_magnemite.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_magneton.aif b/sound/direct_sound_samples/cry_magneton.aif deleted file mode 100644 index 53083ac62..000000000 Binary files a/sound/direct_sound_samples/cry_magneton.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_makuhita.aif b/sound/direct_sound_samples/cry_makuhita.aif deleted file mode 100644 index 38d7f4b44..000000000 Binary files a/sound/direct_sound_samples/cry_makuhita.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_manectric.aif b/sound/direct_sound_samples/cry_manectric.aif deleted file mode 100644 index 18a8f4666..000000000 Binary files a/sound/direct_sound_samples/cry_manectric.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_mankey.aif b/sound/direct_sound_samples/cry_mankey.aif deleted file mode 100644 index dda929d4c..000000000 Binary files a/sound/direct_sound_samples/cry_mankey.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_mantine.aif b/sound/direct_sound_samples/cry_mantine.aif deleted file mode 100644 index d1840aafa..000000000 Binary files a/sound/direct_sound_samples/cry_mantine.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_mareep.aif b/sound/direct_sound_samples/cry_mareep.aif deleted file mode 100644 index 2615b9def..000000000 Binary files a/sound/direct_sound_samples/cry_mareep.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_marill.aif b/sound/direct_sound_samples/cry_marill.aif deleted file mode 100644 index 48d936e7d..000000000 Binary files a/sound/direct_sound_samples/cry_marill.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_marowak.aif b/sound/direct_sound_samples/cry_marowak.aif deleted file mode 100644 index 279381bb5..000000000 Binary files a/sound/direct_sound_samples/cry_marowak.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_marshtomp.aif b/sound/direct_sound_samples/cry_marshtomp.aif deleted file mode 100644 index c0106ff6c..000000000 Binary files a/sound/direct_sound_samples/cry_marshtomp.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_masquerain.aif b/sound/direct_sound_samples/cry_masquerain.aif deleted file mode 100644 index 107bed2f7..000000000 Binary files a/sound/direct_sound_samples/cry_masquerain.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_mawile.aif b/sound/direct_sound_samples/cry_mawile.aif deleted file mode 100644 index 81b252b57..000000000 Binary files a/sound/direct_sound_samples/cry_mawile.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_medicham.aif b/sound/direct_sound_samples/cry_medicham.aif deleted file mode 100644 index dc85dd3b5..000000000 Binary files a/sound/direct_sound_samples/cry_medicham.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_meditite.aif b/sound/direct_sound_samples/cry_meditite.aif deleted file mode 100644 index 8ac680f79..000000000 Binary files a/sound/direct_sound_samples/cry_meditite.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_meganium.aif b/sound/direct_sound_samples/cry_meganium.aif deleted file mode 100644 index ea1e1aa51..000000000 Binary files a/sound/direct_sound_samples/cry_meganium.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_meowth.aif b/sound/direct_sound_samples/cry_meowth.aif deleted file mode 100644 index aaf3825d5..000000000 Binary files a/sound/direct_sound_samples/cry_meowth.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_metagross.aif b/sound/direct_sound_samples/cry_metagross.aif deleted file mode 100644 index b96e6647c..000000000 Binary files a/sound/direct_sound_samples/cry_metagross.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_metang.aif b/sound/direct_sound_samples/cry_metang.aif deleted file mode 100644 index da544ce4d..000000000 Binary files a/sound/direct_sound_samples/cry_metang.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_metapod.aif b/sound/direct_sound_samples/cry_metapod.aif deleted file mode 100644 index ddba3ed44..000000000 Binary files a/sound/direct_sound_samples/cry_metapod.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_mew.aif b/sound/direct_sound_samples/cry_mew.aif deleted file mode 100644 index 2651b96ca..000000000 Binary files a/sound/direct_sound_samples/cry_mew.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_mewtwo.aif b/sound/direct_sound_samples/cry_mewtwo.aif deleted file mode 100644 index 8e1e6c7f1..000000000 Binary files a/sound/direct_sound_samples/cry_mewtwo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_mightyena.aif b/sound/direct_sound_samples/cry_mightyena.aif deleted file mode 100644 index 53a645edc..000000000 Binary files a/sound/direct_sound_samples/cry_mightyena.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_milotic.aif b/sound/direct_sound_samples/cry_milotic.aif deleted file mode 100644 index 93a14161b..000000000 Binary files a/sound/direct_sound_samples/cry_milotic.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_miltank.aif b/sound/direct_sound_samples/cry_miltank.aif deleted file mode 100644 index ad8a41a45..000000000 Binary files a/sound/direct_sound_samples/cry_miltank.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_minun.aif b/sound/direct_sound_samples/cry_minun.aif deleted file mode 100644 index a55aa5631..000000000 Binary files a/sound/direct_sound_samples/cry_minun.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_misdreavus.aif b/sound/direct_sound_samples/cry_misdreavus.aif deleted file mode 100644 index 39a09f4d0..000000000 Binary files a/sound/direct_sound_samples/cry_misdreavus.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_moltres.aif b/sound/direct_sound_samples/cry_moltres.aif deleted file mode 100644 index 2e038a3d7..000000000 Binary files a/sound/direct_sound_samples/cry_moltres.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_mr_mime.aif b/sound/direct_sound_samples/cry_mr_mime.aif deleted file mode 100644 index ff870dbc4..000000000 Binary files a/sound/direct_sound_samples/cry_mr_mime.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_mudkip.aif b/sound/direct_sound_samples/cry_mudkip.aif deleted file mode 100644 index e8fa5c212..000000000 Binary files a/sound/direct_sound_samples/cry_mudkip.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_muk.aif b/sound/direct_sound_samples/cry_muk.aif deleted file mode 100644 index f61ff4075..000000000 Binary files a/sound/direct_sound_samples/cry_muk.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_murkrow.aif b/sound/direct_sound_samples/cry_murkrow.aif deleted file mode 100644 index 4beddff1e..000000000 Binary files a/sound/direct_sound_samples/cry_murkrow.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_natu.aif b/sound/direct_sound_samples/cry_natu.aif deleted file mode 100644 index e6e38d5cc..000000000 Binary files a/sound/direct_sound_samples/cry_natu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_nidoking.aif b/sound/direct_sound_samples/cry_nidoking.aif deleted file mode 100644 index a0c86f9ab..000000000 Binary files a/sound/direct_sound_samples/cry_nidoking.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_nidoqueen.aif b/sound/direct_sound_samples/cry_nidoqueen.aif deleted file mode 100644 index 6c8f5254b..000000000 Binary files a/sound/direct_sound_samples/cry_nidoqueen.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_nidoran_f.aif b/sound/direct_sound_samples/cry_nidoran_f.aif deleted file mode 100644 index b7c8a5317..000000000 Binary files a/sound/direct_sound_samples/cry_nidoran_f.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_nidoran_m.aif b/sound/direct_sound_samples/cry_nidoran_m.aif deleted file mode 100644 index 08fc81c8b..000000000 Binary files a/sound/direct_sound_samples/cry_nidoran_m.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_nidorina.aif b/sound/direct_sound_samples/cry_nidorina.aif deleted file mode 100644 index 91e293a50..000000000 Binary files a/sound/direct_sound_samples/cry_nidorina.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_nidorino.aif b/sound/direct_sound_samples/cry_nidorino.aif deleted file mode 100644 index 959351363..000000000 Binary files a/sound/direct_sound_samples/cry_nidorino.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_nincada.aif b/sound/direct_sound_samples/cry_nincada.aif deleted file mode 100644 index 5f96bda50..000000000 Binary files a/sound/direct_sound_samples/cry_nincada.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_ninetales.aif b/sound/direct_sound_samples/cry_ninetales.aif deleted file mode 100644 index 70c8cf528..000000000 Binary files a/sound/direct_sound_samples/cry_ninetales.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_ninjask.aif b/sound/direct_sound_samples/cry_ninjask.aif deleted file mode 100644 index a6f07e8d3..000000000 Binary files a/sound/direct_sound_samples/cry_ninjask.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_noctowl.aif b/sound/direct_sound_samples/cry_noctowl.aif deleted file mode 100644 index fe2e63d45..000000000 Binary files a/sound/direct_sound_samples/cry_noctowl.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_nosepass.aif b/sound/direct_sound_samples/cry_nosepass.aif deleted file mode 100644 index be65ba082..000000000 Binary files a/sound/direct_sound_samples/cry_nosepass.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_numel.aif b/sound/direct_sound_samples/cry_numel.aif deleted file mode 100644 index 55cce5f2c..000000000 Binary files a/sound/direct_sound_samples/cry_numel.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_nuzleaf.aif b/sound/direct_sound_samples/cry_nuzleaf.aif deleted file mode 100644 index d668f3fd3..000000000 Binary files a/sound/direct_sound_samples/cry_nuzleaf.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_octillery.aif b/sound/direct_sound_samples/cry_octillery.aif deleted file mode 100644 index 75ee28ceb..000000000 Binary files a/sound/direct_sound_samples/cry_octillery.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_oddish.aif b/sound/direct_sound_samples/cry_oddish.aif deleted file mode 100644 index 6909a8dad..000000000 Binary files a/sound/direct_sound_samples/cry_oddish.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_omanyte.aif b/sound/direct_sound_samples/cry_omanyte.aif deleted file mode 100644 index 15ec2d1ef..000000000 Binary files a/sound/direct_sound_samples/cry_omanyte.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_omastar.aif b/sound/direct_sound_samples/cry_omastar.aif deleted file mode 100644 index e67d5d7fc..000000000 Binary files a/sound/direct_sound_samples/cry_omastar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_onix.aif b/sound/direct_sound_samples/cry_onix.aif deleted file mode 100644 index aa8a16505..000000000 Binary files a/sound/direct_sound_samples/cry_onix.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_paras.aif b/sound/direct_sound_samples/cry_paras.aif deleted file mode 100644 index f9d69c21c..000000000 Binary files a/sound/direct_sound_samples/cry_paras.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_parasect.aif b/sound/direct_sound_samples/cry_parasect.aif deleted file mode 100644 index d6d9433e9..000000000 Binary files a/sound/direct_sound_samples/cry_parasect.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_pelipper.aif b/sound/direct_sound_samples/cry_pelipper.aif deleted file mode 100644 index 26718f848..000000000 Binary files a/sound/direct_sound_samples/cry_pelipper.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_persian.aif b/sound/direct_sound_samples/cry_persian.aif deleted file mode 100644 index 40b3a2c56..000000000 Binary files a/sound/direct_sound_samples/cry_persian.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_phanpy.aif b/sound/direct_sound_samples/cry_phanpy.aif deleted file mode 100644 index 2fcab3c82..000000000 Binary files a/sound/direct_sound_samples/cry_phanpy.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_pichu.aif b/sound/direct_sound_samples/cry_pichu.aif deleted file mode 100644 index de47bbab8..000000000 Binary files a/sound/direct_sound_samples/cry_pichu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_pidgeot.aif b/sound/direct_sound_samples/cry_pidgeot.aif deleted file mode 100644 index af400cdc6..000000000 Binary files a/sound/direct_sound_samples/cry_pidgeot.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_pidgeotto.aif b/sound/direct_sound_samples/cry_pidgeotto.aif deleted file mode 100644 index 7c71c8f3e..000000000 Binary files a/sound/direct_sound_samples/cry_pidgeotto.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_pidgey.aif b/sound/direct_sound_samples/cry_pidgey.aif deleted file mode 100644 index b9c3a5d2a..000000000 Binary files a/sound/direct_sound_samples/cry_pidgey.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_pikachu.aif b/sound/direct_sound_samples/cry_pikachu.aif deleted file mode 100644 index 690bf5e1d..000000000 Binary files a/sound/direct_sound_samples/cry_pikachu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_piloswine.aif b/sound/direct_sound_samples/cry_piloswine.aif deleted file mode 100644 index b1f34d3b5..000000000 Binary files a/sound/direct_sound_samples/cry_piloswine.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_pineco.aif b/sound/direct_sound_samples/cry_pineco.aif deleted file mode 100644 index 80292bda0..000000000 Binary files a/sound/direct_sound_samples/cry_pineco.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_pinsir.aif b/sound/direct_sound_samples/cry_pinsir.aif deleted file mode 100644 index cf27a11de..000000000 Binary files a/sound/direct_sound_samples/cry_pinsir.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_plusle.aif b/sound/direct_sound_samples/cry_plusle.aif deleted file mode 100644 index d68984263..000000000 Binary files a/sound/direct_sound_samples/cry_plusle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_politoed.aif b/sound/direct_sound_samples/cry_politoed.aif deleted file mode 100644 index 38b1883b4..000000000 Binary files a/sound/direct_sound_samples/cry_politoed.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_poliwag.aif b/sound/direct_sound_samples/cry_poliwag.aif deleted file mode 100644 index 8467f0540..000000000 Binary files a/sound/direct_sound_samples/cry_poliwag.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_poliwhirl.aif b/sound/direct_sound_samples/cry_poliwhirl.aif deleted file mode 100644 index f0851c693..000000000 Binary files a/sound/direct_sound_samples/cry_poliwhirl.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_poliwrath.aif b/sound/direct_sound_samples/cry_poliwrath.aif deleted file mode 100644 index 8d19f1d86..000000000 Binary files a/sound/direct_sound_samples/cry_poliwrath.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_ponyta.aif b/sound/direct_sound_samples/cry_ponyta.aif deleted file mode 100644 index 46feb123d..000000000 Binary files a/sound/direct_sound_samples/cry_ponyta.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_poochyena.aif b/sound/direct_sound_samples/cry_poochyena.aif deleted file mode 100644 index 3b464ce13..000000000 Binary files a/sound/direct_sound_samples/cry_poochyena.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_porygon.aif b/sound/direct_sound_samples/cry_porygon.aif deleted file mode 100644 index ced70b379..000000000 Binary files a/sound/direct_sound_samples/cry_porygon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_porygon2.aif b/sound/direct_sound_samples/cry_porygon2.aif deleted file mode 100644 index c08a3caaf..000000000 Binary files a/sound/direct_sound_samples/cry_porygon2.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_primeape.aif b/sound/direct_sound_samples/cry_primeape.aif deleted file mode 100644 index a868b3120..000000000 Binary files a/sound/direct_sound_samples/cry_primeape.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_psyduck.aif b/sound/direct_sound_samples/cry_psyduck.aif deleted file mode 100644 index d2d0612f2..000000000 Binary files a/sound/direct_sound_samples/cry_psyduck.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_pupitar.aif b/sound/direct_sound_samples/cry_pupitar.aif deleted file mode 100644 index 7386636ce..000000000 Binary files a/sound/direct_sound_samples/cry_pupitar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_quagsire.aif b/sound/direct_sound_samples/cry_quagsire.aif deleted file mode 100644 index 1953d0e42..000000000 Binary files a/sound/direct_sound_samples/cry_quagsire.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_quilava.aif b/sound/direct_sound_samples/cry_quilava.aif deleted file mode 100644 index efe873229..000000000 Binary files a/sound/direct_sound_samples/cry_quilava.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_qwilfish.aif b/sound/direct_sound_samples/cry_qwilfish.aif deleted file mode 100644 index 268c5c89d..000000000 Binary files a/sound/direct_sound_samples/cry_qwilfish.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_raichu.aif b/sound/direct_sound_samples/cry_raichu.aif deleted file mode 100644 index e59ffbad4..000000000 Binary files a/sound/direct_sound_samples/cry_raichu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_raikou.aif b/sound/direct_sound_samples/cry_raikou.aif deleted file mode 100644 index a57a2365c..000000000 Binary files a/sound/direct_sound_samples/cry_raikou.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_ralts.aif b/sound/direct_sound_samples/cry_ralts.aif deleted file mode 100644 index 0baef5760..000000000 Binary files a/sound/direct_sound_samples/cry_ralts.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_rapidash.aif b/sound/direct_sound_samples/cry_rapidash.aif deleted file mode 100644 index 920f510e4..000000000 Binary files a/sound/direct_sound_samples/cry_rapidash.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_raticate.aif b/sound/direct_sound_samples/cry_raticate.aif deleted file mode 100644 index 01601cab5..000000000 Binary files a/sound/direct_sound_samples/cry_raticate.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_rattata.aif b/sound/direct_sound_samples/cry_rattata.aif deleted file mode 100644 index cb0e1f422..000000000 Binary files a/sound/direct_sound_samples/cry_rattata.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_rayquaza.aif b/sound/direct_sound_samples/cry_rayquaza.aif deleted file mode 100644 index 6115e11d8..000000000 Binary files a/sound/direct_sound_samples/cry_rayquaza.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_regice.aif b/sound/direct_sound_samples/cry_regice.aif deleted file mode 100644 index 6fa23dd73..000000000 Binary files a/sound/direct_sound_samples/cry_regice.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_regirock.aif b/sound/direct_sound_samples/cry_regirock.aif deleted file mode 100644 index ab2a47eb8..000000000 Binary files a/sound/direct_sound_samples/cry_regirock.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_registeel.aif b/sound/direct_sound_samples/cry_registeel.aif deleted file mode 100644 index f5374e5f0..000000000 Binary files a/sound/direct_sound_samples/cry_registeel.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_relicanth.aif b/sound/direct_sound_samples/cry_relicanth.aif deleted file mode 100644 index 60af9cf4e..000000000 Binary files a/sound/direct_sound_samples/cry_relicanth.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_remoraid.aif b/sound/direct_sound_samples/cry_remoraid.aif deleted file mode 100644 index 16d3f1d65..000000000 Binary files a/sound/direct_sound_samples/cry_remoraid.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_rhydon.aif b/sound/direct_sound_samples/cry_rhydon.aif deleted file mode 100644 index cfa709ee9..000000000 Binary files a/sound/direct_sound_samples/cry_rhydon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_rhyhorn.aif b/sound/direct_sound_samples/cry_rhyhorn.aif deleted file mode 100644 index 47f344ba2..000000000 Binary files a/sound/direct_sound_samples/cry_rhyhorn.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_roselia.aif b/sound/direct_sound_samples/cry_roselia.aif deleted file mode 100644 index 50b60b77b..000000000 Binary files a/sound/direct_sound_samples/cry_roselia.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_sableye.aif b/sound/direct_sound_samples/cry_sableye.aif deleted file mode 100644 index 1b3a9be30..000000000 Binary files a/sound/direct_sound_samples/cry_sableye.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_salamence.aif b/sound/direct_sound_samples/cry_salamence.aif deleted file mode 100644 index d2957809c..000000000 Binary files a/sound/direct_sound_samples/cry_salamence.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_sandshrew.aif b/sound/direct_sound_samples/cry_sandshrew.aif deleted file mode 100644 index 6879be11d..000000000 Binary files a/sound/direct_sound_samples/cry_sandshrew.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_sandslash.aif b/sound/direct_sound_samples/cry_sandslash.aif deleted file mode 100644 index ee4a458ed..000000000 Binary files a/sound/direct_sound_samples/cry_sandslash.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_sceptile.aif b/sound/direct_sound_samples/cry_sceptile.aif deleted file mode 100644 index 7252cb85f..000000000 Binary files a/sound/direct_sound_samples/cry_sceptile.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_scizor.aif b/sound/direct_sound_samples/cry_scizor.aif deleted file mode 100644 index f1f7832ce..000000000 Binary files a/sound/direct_sound_samples/cry_scizor.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_scyther.aif b/sound/direct_sound_samples/cry_scyther.aif deleted file mode 100644 index 2b8cbc104..000000000 Binary files a/sound/direct_sound_samples/cry_scyther.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_seadra.aif b/sound/direct_sound_samples/cry_seadra.aif deleted file mode 100644 index 2f60cce4a..000000000 Binary files a/sound/direct_sound_samples/cry_seadra.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_seaking.aif b/sound/direct_sound_samples/cry_seaking.aif deleted file mode 100644 index e4fc7e70d..000000000 Binary files a/sound/direct_sound_samples/cry_seaking.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_sealeo.aif b/sound/direct_sound_samples/cry_sealeo.aif deleted file mode 100644 index d9ea50026..000000000 Binary files a/sound/direct_sound_samples/cry_sealeo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_seedot.aif b/sound/direct_sound_samples/cry_seedot.aif deleted file mode 100644 index c37b769f8..000000000 Binary files a/sound/direct_sound_samples/cry_seedot.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_seel.aif b/sound/direct_sound_samples/cry_seel.aif deleted file mode 100644 index 84c4a0a94..000000000 Binary files a/sound/direct_sound_samples/cry_seel.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_sentret.aif b/sound/direct_sound_samples/cry_sentret.aif deleted file mode 100644 index 4aed7cd70..000000000 Binary files a/sound/direct_sound_samples/cry_sentret.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_seviper.aif b/sound/direct_sound_samples/cry_seviper.aif deleted file mode 100644 index 6a15dd6e2..000000000 Binary files a/sound/direct_sound_samples/cry_seviper.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_sharpedo.aif b/sound/direct_sound_samples/cry_sharpedo.aif deleted file mode 100644 index 1b02b56ce..000000000 Binary files a/sound/direct_sound_samples/cry_sharpedo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_shedinja.aif b/sound/direct_sound_samples/cry_shedinja.aif deleted file mode 100644 index 6d1d565f3..000000000 Binary files a/sound/direct_sound_samples/cry_shedinja.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_shelgon.aif b/sound/direct_sound_samples/cry_shelgon.aif deleted file mode 100644 index 24f234ffe..000000000 Binary files a/sound/direct_sound_samples/cry_shelgon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_shellder.aif b/sound/direct_sound_samples/cry_shellder.aif deleted file mode 100644 index b2ea85228..000000000 Binary files a/sound/direct_sound_samples/cry_shellder.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_shiftry.aif b/sound/direct_sound_samples/cry_shiftry.aif deleted file mode 100644 index c91ece114..000000000 Binary files a/sound/direct_sound_samples/cry_shiftry.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_shroomish.aif b/sound/direct_sound_samples/cry_shroomish.aif deleted file mode 100644 index 9e944ca20..000000000 Binary files a/sound/direct_sound_samples/cry_shroomish.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_shuckle.aif b/sound/direct_sound_samples/cry_shuckle.aif deleted file mode 100644 index d835d2de6..000000000 Binary files a/sound/direct_sound_samples/cry_shuckle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_shuppet.aif b/sound/direct_sound_samples/cry_shuppet.aif deleted file mode 100644 index 1cd9a2f14..000000000 Binary files a/sound/direct_sound_samples/cry_shuppet.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_silcoon.aif b/sound/direct_sound_samples/cry_silcoon.aif deleted file mode 100644 index ff48950ad..000000000 Binary files a/sound/direct_sound_samples/cry_silcoon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_skarmory.aif b/sound/direct_sound_samples/cry_skarmory.aif deleted file mode 100644 index 88d3985a3..000000000 Binary files a/sound/direct_sound_samples/cry_skarmory.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_skiploom.aif b/sound/direct_sound_samples/cry_skiploom.aif deleted file mode 100644 index 201744d12..000000000 Binary files a/sound/direct_sound_samples/cry_skiploom.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_skitty.aif b/sound/direct_sound_samples/cry_skitty.aif deleted file mode 100644 index 7dc4578f4..000000000 Binary files a/sound/direct_sound_samples/cry_skitty.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_slaking.aif b/sound/direct_sound_samples/cry_slaking.aif deleted file mode 100644 index b6a4160f3..000000000 Binary files a/sound/direct_sound_samples/cry_slaking.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_slakoth.aif b/sound/direct_sound_samples/cry_slakoth.aif deleted file mode 100644 index 0e4bbc3c3..000000000 Binary files a/sound/direct_sound_samples/cry_slakoth.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_slowbro.aif b/sound/direct_sound_samples/cry_slowbro.aif deleted file mode 100644 index f74b753d2..000000000 Binary files a/sound/direct_sound_samples/cry_slowbro.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_slowking.aif b/sound/direct_sound_samples/cry_slowking.aif deleted file mode 100644 index 245a42023..000000000 Binary files a/sound/direct_sound_samples/cry_slowking.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_slowpoke.aif b/sound/direct_sound_samples/cry_slowpoke.aif deleted file mode 100644 index 82b05a9a7..000000000 Binary files a/sound/direct_sound_samples/cry_slowpoke.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_slugma.aif b/sound/direct_sound_samples/cry_slugma.aif deleted file mode 100644 index fed42817c..000000000 Binary files a/sound/direct_sound_samples/cry_slugma.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_smeargle.aif b/sound/direct_sound_samples/cry_smeargle.aif deleted file mode 100644 index 00dbedead..000000000 Binary files a/sound/direct_sound_samples/cry_smeargle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_smoochum.aif b/sound/direct_sound_samples/cry_smoochum.aif deleted file mode 100644 index 4005b4ad4..000000000 Binary files a/sound/direct_sound_samples/cry_smoochum.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_sneasel.aif b/sound/direct_sound_samples/cry_sneasel.aif deleted file mode 100644 index 54242a23f..000000000 Binary files a/sound/direct_sound_samples/cry_sneasel.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_snorlax.aif b/sound/direct_sound_samples/cry_snorlax.aif deleted file mode 100644 index f95128e3a..000000000 Binary files a/sound/direct_sound_samples/cry_snorlax.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_snorunt.aif b/sound/direct_sound_samples/cry_snorunt.aif deleted file mode 100644 index 53b05b229..000000000 Binary files a/sound/direct_sound_samples/cry_snorunt.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_snubbull.aif b/sound/direct_sound_samples/cry_snubbull.aif deleted file mode 100644 index bbba023fd..000000000 Binary files a/sound/direct_sound_samples/cry_snubbull.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_solrock.aif b/sound/direct_sound_samples/cry_solrock.aif deleted file mode 100644 index 64c71f289..000000000 Binary files a/sound/direct_sound_samples/cry_solrock.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_spearow.aif b/sound/direct_sound_samples/cry_spearow.aif deleted file mode 100644 index 7ce86ae29..000000000 Binary files a/sound/direct_sound_samples/cry_spearow.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_spheal.aif b/sound/direct_sound_samples/cry_spheal.aif deleted file mode 100644 index fb6470210..000000000 Binary files a/sound/direct_sound_samples/cry_spheal.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_spinarak.aif b/sound/direct_sound_samples/cry_spinarak.aif deleted file mode 100644 index 3c4c1eff1..000000000 Binary files a/sound/direct_sound_samples/cry_spinarak.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_spinda.aif b/sound/direct_sound_samples/cry_spinda.aif deleted file mode 100644 index 0217573c7..000000000 Binary files a/sound/direct_sound_samples/cry_spinda.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_spoink.aif b/sound/direct_sound_samples/cry_spoink.aif deleted file mode 100644 index 6cc9bf546..000000000 Binary files a/sound/direct_sound_samples/cry_spoink.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_squirtle.aif b/sound/direct_sound_samples/cry_squirtle.aif deleted file mode 100644 index 43a98a53d..000000000 Binary files a/sound/direct_sound_samples/cry_squirtle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_stantler.aif b/sound/direct_sound_samples/cry_stantler.aif deleted file mode 100644 index 36ba54658..000000000 Binary files a/sound/direct_sound_samples/cry_stantler.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_starmie.aif b/sound/direct_sound_samples/cry_starmie.aif deleted file mode 100644 index 7452a78f9..000000000 Binary files a/sound/direct_sound_samples/cry_starmie.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_staryu.aif b/sound/direct_sound_samples/cry_staryu.aif deleted file mode 100644 index 6ab5584bf..000000000 Binary files a/sound/direct_sound_samples/cry_staryu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_steelix.aif b/sound/direct_sound_samples/cry_steelix.aif deleted file mode 100644 index aa05e2d4c..000000000 Binary files a/sound/direct_sound_samples/cry_steelix.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_sudowoodo.aif b/sound/direct_sound_samples/cry_sudowoodo.aif deleted file mode 100644 index 1af7e18eb..000000000 Binary files a/sound/direct_sound_samples/cry_sudowoodo.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_suicune.aif b/sound/direct_sound_samples/cry_suicune.aif deleted file mode 100644 index 697732d68..000000000 Binary files a/sound/direct_sound_samples/cry_suicune.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_sunflora.aif b/sound/direct_sound_samples/cry_sunflora.aif deleted file mode 100644 index 126931adc..000000000 Binary files a/sound/direct_sound_samples/cry_sunflora.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_sunkern.aif b/sound/direct_sound_samples/cry_sunkern.aif deleted file mode 100644 index bede3bf95..000000000 Binary files a/sound/direct_sound_samples/cry_sunkern.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_surskit.aif b/sound/direct_sound_samples/cry_surskit.aif deleted file mode 100644 index 438b5b67a..000000000 Binary files a/sound/direct_sound_samples/cry_surskit.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_swablu.aif b/sound/direct_sound_samples/cry_swablu.aif deleted file mode 100644 index 066095f55..000000000 Binary files a/sound/direct_sound_samples/cry_swablu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_swalot.aif b/sound/direct_sound_samples/cry_swalot.aif deleted file mode 100644 index 518a9bf5a..000000000 Binary files a/sound/direct_sound_samples/cry_swalot.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_swampert.aif b/sound/direct_sound_samples/cry_swampert.aif deleted file mode 100644 index 56bd26405..000000000 Binary files a/sound/direct_sound_samples/cry_swampert.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_swellow.aif b/sound/direct_sound_samples/cry_swellow.aif deleted file mode 100644 index 2b94eb432..000000000 Binary files a/sound/direct_sound_samples/cry_swellow.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_swinub.aif b/sound/direct_sound_samples/cry_swinub.aif deleted file mode 100644 index dc68d62d8..000000000 Binary files a/sound/direct_sound_samples/cry_swinub.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_taillow.aif b/sound/direct_sound_samples/cry_taillow.aif deleted file mode 100644 index 8322a3224..000000000 Binary files a/sound/direct_sound_samples/cry_taillow.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_tangela.aif b/sound/direct_sound_samples/cry_tangela.aif deleted file mode 100644 index c900b426d..000000000 Binary files a/sound/direct_sound_samples/cry_tangela.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_tauros.aif b/sound/direct_sound_samples/cry_tauros.aif deleted file mode 100644 index 84fa9b317..000000000 Binary files a/sound/direct_sound_samples/cry_tauros.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_teddiursa.aif b/sound/direct_sound_samples/cry_teddiursa.aif deleted file mode 100644 index ba5cb5bc3..000000000 Binary files a/sound/direct_sound_samples/cry_teddiursa.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_tentacool.aif b/sound/direct_sound_samples/cry_tentacool.aif deleted file mode 100644 index 332bec4b2..000000000 Binary files a/sound/direct_sound_samples/cry_tentacool.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_tentacruel.aif b/sound/direct_sound_samples/cry_tentacruel.aif deleted file mode 100644 index e8ec1b14c..000000000 Binary files a/sound/direct_sound_samples/cry_tentacruel.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_togepi.aif b/sound/direct_sound_samples/cry_togepi.aif deleted file mode 100644 index 87ef6ef2d..000000000 Binary files a/sound/direct_sound_samples/cry_togepi.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_togetic.aif b/sound/direct_sound_samples/cry_togetic.aif deleted file mode 100644 index 8aa18ac41..000000000 Binary files a/sound/direct_sound_samples/cry_togetic.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_torchic.aif b/sound/direct_sound_samples/cry_torchic.aif deleted file mode 100644 index 185a79499..000000000 Binary files a/sound/direct_sound_samples/cry_torchic.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_torkoal.aif b/sound/direct_sound_samples/cry_torkoal.aif deleted file mode 100644 index 9e56d3810..000000000 Binary files a/sound/direct_sound_samples/cry_torkoal.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_totodile.aif b/sound/direct_sound_samples/cry_totodile.aif deleted file mode 100644 index dbf2179a7..000000000 Binary files a/sound/direct_sound_samples/cry_totodile.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_trapinch.aif b/sound/direct_sound_samples/cry_trapinch.aif deleted file mode 100644 index 01664b72e..000000000 Binary files a/sound/direct_sound_samples/cry_trapinch.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_treecko.aif b/sound/direct_sound_samples/cry_treecko.aif deleted file mode 100644 index a7416e8da..000000000 Binary files a/sound/direct_sound_samples/cry_treecko.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_tropius.aif b/sound/direct_sound_samples/cry_tropius.aif deleted file mode 100644 index bbb52787b..000000000 Binary files a/sound/direct_sound_samples/cry_tropius.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_typhlosion.aif b/sound/direct_sound_samples/cry_typhlosion.aif deleted file mode 100644 index f0238d066..000000000 Binary files a/sound/direct_sound_samples/cry_typhlosion.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_tyranitar.aif b/sound/direct_sound_samples/cry_tyranitar.aif deleted file mode 100644 index 557f61769..000000000 Binary files a/sound/direct_sound_samples/cry_tyranitar.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_tyrogue.aif b/sound/direct_sound_samples/cry_tyrogue.aif deleted file mode 100644 index e5065f58b..000000000 Binary files a/sound/direct_sound_samples/cry_tyrogue.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_umbreon.aif b/sound/direct_sound_samples/cry_umbreon.aif deleted file mode 100644 index 38129b1a7..000000000 Binary files a/sound/direct_sound_samples/cry_umbreon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_unown.aif b/sound/direct_sound_samples/cry_unown.aif deleted file mode 100644 index 8339ccb6b..000000000 Binary files a/sound/direct_sound_samples/cry_unown.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_unused_265.aif b/sound/direct_sound_samples/cry_unused_265.aif deleted file mode 100644 index 7f5965f06..000000000 Binary files a/sound/direct_sound_samples/cry_unused_265.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_unused_268.aif b/sound/direct_sound_samples/cry_unused_268.aif deleted file mode 100644 index 5cae364c3..000000000 Binary files a/sound/direct_sound_samples/cry_unused_268.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_ursaring.aif b/sound/direct_sound_samples/cry_ursaring.aif deleted file mode 100644 index fcc748bd1..000000000 Binary files a/sound/direct_sound_samples/cry_ursaring.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_vaporeon.aif b/sound/direct_sound_samples/cry_vaporeon.aif deleted file mode 100644 index 4967cfdeb..000000000 Binary files a/sound/direct_sound_samples/cry_vaporeon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_venomoth.aif b/sound/direct_sound_samples/cry_venomoth.aif deleted file mode 100644 index bc291ec33..000000000 Binary files a/sound/direct_sound_samples/cry_venomoth.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_venonat.aif b/sound/direct_sound_samples/cry_venonat.aif deleted file mode 100644 index e89d87fa8..000000000 Binary files a/sound/direct_sound_samples/cry_venonat.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_venusaur.aif b/sound/direct_sound_samples/cry_venusaur.aif deleted file mode 100644 index 8a1f69e6e..000000000 Binary files a/sound/direct_sound_samples/cry_venusaur.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_vibrava.aif b/sound/direct_sound_samples/cry_vibrava.aif deleted file mode 100644 index 3e3180219..000000000 Binary files a/sound/direct_sound_samples/cry_vibrava.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_victreebel.aif b/sound/direct_sound_samples/cry_victreebel.aif deleted file mode 100644 index d6e6a4fe9..000000000 Binary files a/sound/direct_sound_samples/cry_victreebel.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_vigoroth.aif b/sound/direct_sound_samples/cry_vigoroth.aif deleted file mode 100644 index fc414f33d..000000000 Binary files a/sound/direct_sound_samples/cry_vigoroth.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_vileplume.aif b/sound/direct_sound_samples/cry_vileplume.aif deleted file mode 100644 index 723eec697..000000000 Binary files a/sound/direct_sound_samples/cry_vileplume.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_volbeat.aif b/sound/direct_sound_samples/cry_volbeat.aif deleted file mode 100644 index 6f765081e..000000000 Binary files a/sound/direct_sound_samples/cry_volbeat.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_voltorb.aif b/sound/direct_sound_samples/cry_voltorb.aif deleted file mode 100644 index 96e3bff31..000000000 Binary files a/sound/direct_sound_samples/cry_voltorb.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_vulpix.aif b/sound/direct_sound_samples/cry_vulpix.aif deleted file mode 100644 index 20da23fb4..000000000 Binary files a/sound/direct_sound_samples/cry_vulpix.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_wailmer.aif b/sound/direct_sound_samples/cry_wailmer.aif deleted file mode 100644 index e8de91333..000000000 Binary files a/sound/direct_sound_samples/cry_wailmer.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_wailord.aif b/sound/direct_sound_samples/cry_wailord.aif deleted file mode 100644 index 2c0468010..000000000 Binary files a/sound/direct_sound_samples/cry_wailord.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_walrein.aif b/sound/direct_sound_samples/cry_walrein.aif deleted file mode 100644 index 91d93f3fb..000000000 Binary files a/sound/direct_sound_samples/cry_walrein.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_wartortle.aif b/sound/direct_sound_samples/cry_wartortle.aif deleted file mode 100644 index 5dab7fd93..000000000 Binary files a/sound/direct_sound_samples/cry_wartortle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_weedle.aif b/sound/direct_sound_samples/cry_weedle.aif deleted file mode 100644 index 773c2c8ae..000000000 Binary files a/sound/direct_sound_samples/cry_weedle.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_weepinbell.aif b/sound/direct_sound_samples/cry_weepinbell.aif deleted file mode 100644 index cdd61380a..000000000 Binary files a/sound/direct_sound_samples/cry_weepinbell.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_weezing.aif b/sound/direct_sound_samples/cry_weezing.aif deleted file mode 100644 index 2e4a7fe13..000000000 Binary files a/sound/direct_sound_samples/cry_weezing.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_whiscash.aif b/sound/direct_sound_samples/cry_whiscash.aif deleted file mode 100644 index 219737f32..000000000 Binary files a/sound/direct_sound_samples/cry_whiscash.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_whismur.aif b/sound/direct_sound_samples/cry_whismur.aif deleted file mode 100644 index 4da92ca6a..000000000 Binary files a/sound/direct_sound_samples/cry_whismur.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_wigglytuff.aif b/sound/direct_sound_samples/cry_wigglytuff.aif deleted file mode 100644 index 90aa90a23..000000000 Binary files a/sound/direct_sound_samples/cry_wigglytuff.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_wingull.aif b/sound/direct_sound_samples/cry_wingull.aif deleted file mode 100644 index 182ef18e6..000000000 Binary files a/sound/direct_sound_samples/cry_wingull.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_wobbuffet.aif b/sound/direct_sound_samples/cry_wobbuffet.aif deleted file mode 100644 index 70ee1f704..000000000 Binary files a/sound/direct_sound_samples/cry_wobbuffet.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_wooper.aif b/sound/direct_sound_samples/cry_wooper.aif deleted file mode 100644 index 51a6b627e..000000000 Binary files a/sound/direct_sound_samples/cry_wooper.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_wurmple.aif b/sound/direct_sound_samples/cry_wurmple.aif deleted file mode 100644 index 6442a4063..000000000 Binary files a/sound/direct_sound_samples/cry_wurmple.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_wynaut.aif b/sound/direct_sound_samples/cry_wynaut.aif deleted file mode 100644 index 798732c74..000000000 Binary files a/sound/direct_sound_samples/cry_wynaut.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_xatu.aif b/sound/direct_sound_samples/cry_xatu.aif deleted file mode 100644 index ac758fdbf..000000000 Binary files a/sound/direct_sound_samples/cry_xatu.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_yanma.aif b/sound/direct_sound_samples/cry_yanma.aif deleted file mode 100644 index df76534c5..000000000 Binary files a/sound/direct_sound_samples/cry_yanma.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_zangoose.aif b/sound/direct_sound_samples/cry_zangoose.aif deleted file mode 100644 index 3c206532f..000000000 Binary files a/sound/direct_sound_samples/cry_zangoose.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_zapdos.aif b/sound/direct_sound_samples/cry_zapdos.aif deleted file mode 100644 index a8d914d14..000000000 Binary files a/sound/direct_sound_samples/cry_zapdos.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_zigzagoon.aif b/sound/direct_sound_samples/cry_zigzagoon.aif deleted file mode 100644 index 52b9bb4f4..000000000 Binary files a/sound/direct_sound_samples/cry_zigzagoon.aif and /dev/null differ diff --git a/sound/direct_sound_samples/cry_zubat.aif b/sound/direct_sound_samples/cry_zubat.aif deleted file mode 100644 index 45036d072..000000000 Binary files a/sound/direct_sound_samples/cry_zubat.aif and /dev/null differ -- cgit v1.2.3 From e50777042528a667b4196ed6879b39e573457494 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Mon, 15 Jun 2020 13:17:53 -0400 Subject: Remove some unneeded link filler --- common_syms/link.txt | 2 -- src/link.c | 2 -- 2 files changed, 4 deletions(-) diff --git a/common_syms/link.txt b/common_syms/link.txt index 09def0aed..37c16a557 100644 --- a/common_syms/link.txt +++ b/common_syms/link.txt @@ -33,5 +33,3 @@ gLastSendQueueCount gLink gLastRecvQueueCount gLinkSavedIme -gLinkFiller6 -gLinkFiller7 diff --git a/src/link.c b/src/link.c index 8711e49ac..e04e5e29d 100644 --- a/src/link.c +++ b/src/link.c @@ -96,8 +96,6 @@ u8 gLastSendQueueCount; struct Link gLink; u8 gLastRecvQueueCount; u16 gLinkSavedIme; -u32 gLinkFiller6; -u32 gLinkFiller7; EWRAM_DATA u8 gLinkTestDebugValuesEnabled = 0; EWRAM_DATA u8 gUnknown_020223BD = 0; -- cgit v1.2.3 From 76f6d05173e134d9cea3df0deb65f93804617c0f Mon Sep 17 00:00:00 2001 From: GriffinR Date: Wed, 17 Jun 2020 03:39:03 -0400 Subject: Document confetti --- .../scripts.inc | 2 +- data/specials.inc | 2 +- include/graphics.h | 4 +- include/hall_of_fame.h | 1 - include/rom_81520A8.h | 28 +- src/contest_link_80F57C4.c | 36 +-- src/graphics.c | 4 +- src/hall_of_fame.c | 338 ++++++++++++--------- src/rom_81520A8.c | 116 +++---- 9 files changed, 293 insertions(+), 238 deletions(-) diff --git a/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc index 25522f0c0..048c4fc80 100644 --- a/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc @@ -172,7 +172,7 @@ BattleFrontier_BattleDomeBattleRoom_EventScript_WonTourney:: @ 824BF62 BattleFrontier_BattleDomeBattleRoom_EventScript_WonLvOpenTourney:: @ 824BF96 msgbox BattleFrontier_BattleDomeBattleRoom_Text_PlayerIsLvOpenChamp, MSGBOX_DEFAULT BattleFrontier_BattleDomeBattleRoom_EventScript_CelebrateWin:: @ 824BF9E - special DoConfettiEffect + special DoDomeConfetti playse SE_W227B call BattleFrontier_BattleDomeBattleRoom_EventScript_AudienceLookAround delay 60 diff --git a/data/specials.inc b/data/specials.inc index 97cc3c782..888b11f5c 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -498,7 +498,7 @@ gSpecials:: @ 81DBA64 def_special GetPCBoxToSendMon def_special ShouldShowBoxWasFullMessage def_special SetMatchCallRegisteredFlag - def_special DoConfettiEffect + def_special DoDomeConfetti def_special CreateAbnormalWeatherEvent def_special GetAbnormalWeatherMapNameAndType def_special GetMartEmployeeObjectEventId diff --git a/include/graphics.h b/include/graphics.h index b41a43095..99d396df2 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4082,8 +4082,8 @@ extern const u8 gNamingScreenUnderscoreTiles[]; extern const u32 gUnknown_08D9BA44[]; -extern const u32 gContestConfetti_Gfx[]; -extern const u32 gContestConfetti_Pal[]; +extern const u32 gConfetti_Gfx[]; +extern const u32 gConfetti_Pal[]; extern const u32 gUnknown_08C093F0[]; extern const u32 gSubstituteDollTilemap[]; diff --git a/include/hall_of_fame.h b/include/hall_of_fame.h index a83fad2fc..f1f456713 100644 --- a/include/hall_of_fame.h +++ b/include/hall_of_fame.h @@ -4,7 +4,6 @@ void CB2_DoHallOfFameScreen(void); void CB2_DoHallOfFameScreenDontSaveData(void); void CB2_DoHallOfFamePC(void); -void DoConfettiEffect(void); // hof_pc.c void ReturnFromHallOfFamePC(void); diff --git a/include/rom_81520A8.h b/include/rom_81520A8.h index 2be12200f..9ad299197 100644 --- a/include/rom_81520A8.h +++ b/include/rom_81520A8.h @@ -1,7 +1,7 @@ #ifndef GUARD_ROM_81520A8_H #define GUARD_ROM_81520A8_H -struct UnkStruct_81520A8 +struct OamUtil { struct OamData oam; s16 x; @@ -12,22 +12,22 @@ struct UnkStruct_81520A8 u16 palTag; u16 tileNum; u8 id; - u8 filler17; // Unused. - u8 unk18; - u8 unk19_0:1; - u8 unk19_1:1; - u8 unk19_2:1; + u8 filler; + u8 animNum; + u8 active:1; + u8 allowUpdates:1; + u8 dummied:1; u8 priority:2; s16 data[8]; - void (*callback)(struct UnkStruct_81520A8 *); + void (*callback)(struct OamUtil *); }; -bool32 sub_81521C0(u8 count); -bool32 sub_8152254(void); -bool32 sub_81522D4(void); -u8 sub_8152438(u8 id, void (*func)(struct UnkStruct_81520A8 *)); -u8 sub_8152474(u8 id, u8 dataArrayId, s16 dataValue); -u8 sub_81524C4(const struct OamData *oam, u16 tileTag, u16 palTag, s16 x, s16 y, u8 arg5, u8 priority); -u8 sub_81525D0(u8 id); +bool32 OamUtil_Init(u8 count); +bool32 OamUtil_Free(void); +bool32 OamUtil_Update(void); +u8 OamUtil_SetCallback(u8 id, void (*func)(struct OamUtil *)); +u8 OamUtil_SetData(u8 id, u8 dataArrayId, s16 dataValue); +u8 OamUtil_AddNew(const struct OamData *oam, u16 tileTag, u16 palTag, s16 x, s16 y, u8 animNum, u8 priority); +u8 OamUtil_Remove(u8 id); #endif // GUARD_ROM_81520A8_H diff --git a/src/contest_link_80F57C4.c b/src/contest_link_80F57C4.c index 0cecaed07..65764067c 100644 --- a/src/contest_link_80F57C4.c +++ b/src/contest_link_80F57C4.c @@ -43,6 +43,8 @@ #include "constants/vars.h" #include "contest.h" +#define TAG_CONFETTI 3017 + struct ContestLinkUnk0 { u8 unk0; @@ -139,7 +141,7 @@ static void sub_80F85BC(u8); static void sub_80F86B8(u8); static void sub_80F878C(u8); static void sub_80F87B4(u8); -static void sub_80F7768(struct Sprite *sprite); +static void SpriteCB_Confetti(struct Sprite *sprite); static const u16 sUnknown_0858D6B0[] = INCBIN_U16("graphics/unknown/unknown_58D6B0.gbapal"); static const u8 sUnknown_0858D6D0[] = INCBIN_U8("graphics/unknown/unknown_58D6D0.4bpp"); @@ -191,7 +193,7 @@ static const struct SpritePalette sUnknown_0858D850 = .tag = 3009, }; -static const struct OamData sOamData_858D858 = +static const struct OamData sOamData_Confetti = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -208,29 +210,29 @@ static const struct OamData sOamData_858D858 = .affineParam = 0, }; -static const struct SpriteTemplate sSpriteTemplate_858D860 = +static const struct SpriteTemplate sSpriteTemplate_Confetti = { - .tileTag = 3017, - .paletteTag = 3017, - .oam = &sOamData_858D858, + .tileTag = TAG_CONFETTI, + .paletteTag = TAG_CONFETTI, + .oam = &sOamData_Confetti, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80F7768 + .callback = SpriteCB_Confetti }; -static const struct CompressedSpriteSheet sUnknown_0858D878 = +static const struct CompressedSpriteSheet sSpriteSheet_Confetti = { - .data = gContestConfetti_Gfx, + .data = gConfetti_Gfx, .size = 0x220, - .tag = 3017 + .tag = TAG_CONFETTI }; -static const struct CompressedSpritePalette sUnknown_0858D880 = +static const struct CompressedSpritePalette sSpritePalette_Confetti = { - .data = gContestConfetti_Pal, - .tag = 3017 + .data = gConfetti_Pal, + .tag = TAG_CONFETTI }; static const struct BgTemplate sUnknown_0858D888[] = @@ -869,8 +871,8 @@ static void sub_80F6404(u8 taskId) gSprites[spriteId].oam.priority = 0; gSprites[spriteId].callback = sub_80F75A8; gUnknown_0203A034->unk0->spriteId = spriteId; - LoadCompressedSpriteSheet(&sUnknown_0858D878); - LoadCompressedSpritePalette(&sUnknown_0858D880); + LoadCompressedSpriteSheet(&sSpriteSheet_Confetti); + LoadCompressedSpritePalette(&sSpritePalette_Confetti); CreateTask(sub_80F7670, 10); gTasks[taskId].data[0]++; break; @@ -1829,7 +1831,7 @@ static void sub_80F7670(u8 taskId) gTasks[taskId].data[0] = 0; if (gUnknown_0203A034->unk0->unk7 < 40) { - u8 spriteId = CreateSprite(&sSpriteTemplate_858D860, (Random() % 240) - 20, 44, 5); + u8 spriteId = CreateSprite(&sSpriteTemplate_Confetti, (Random() % 240) - 20, 44, 5); gSprites[spriteId].data[0] = Random() % 512; gSprites[spriteId].data[1] = (Random() % 24) + 16; gSprites[spriteId].data[2] = (Random() % 256) + 48; @@ -1842,7 +1844,7 @@ static void sub_80F7670(u8 taskId) DestroyTask(taskId); } -static void sub_80F7768(struct Sprite *sprite) +static void SpriteCB_Confetti(struct Sprite *sprite) { s16 delta; diff --git a/src/graphics.c b/src/graphics.c index 7a3a225c2..b3327f4d2 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -875,8 +875,8 @@ const u32 gSubstituteDollTilemap[] = INCBIN_U32("graphics/battle_anims/sprites/s const u32 gBattleAnimSpriteGfx_GreenStar[] = INCBIN_U32("graphics/battle_anims/sprites/green_star.4bpp.lz"); const u32 gBattleAnimSpritePal_GreenStar[] = INCBIN_U32("graphics/battle_anims/sprites/green_star.gbapal.lz"); -const u32 gContestConfetti_Gfx[] = INCBIN_U32("graphics/misc/confetti.4bpp.lz"); -const u32 gContestConfetti_Pal[] = INCBIN_U32("graphics/misc/confetti.gbapal.lz"); +const u32 gConfetti_Gfx[] = INCBIN_U32("graphics/misc/confetti.4bpp.lz"); +const u32 gConfetti_Pal[] = INCBIN_U32("graphics/misc/confetti.gbapal.lz"); const u32 gBattleAnimSpriteGfx_PinkCloud[] = INCBIN_U32("graphics/battle_anims/sprites/pink_cloud.4bpp.lz"); const u32 gBattleAnimSpritePal_PinkCloud[] = INCBIN_U32("graphics/battle_anims/sprites/pink_cloud.gbapal.lz"); diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c index 1606c2de5..fa70ae478 100644 --- a/src/hall_of_fame.c +++ b/src/hall_of_fame.c @@ -36,6 +36,9 @@ #include "rom_81520A8.h" #include "constants/rgb.h" +#define HALL_OF_FAME_MAX_TEAMS 50 +#define TAG_CONFETTI 1001 + struct HallofFameMon { u32 tid; @@ -58,33 +61,31 @@ struct HofGfx u8 tilemap2[0x1000]; }; -static EWRAM_DATA u32 sUnknown_0203BCD4 = 0; +static EWRAM_DATA u32 sHofFadePalettes = 0; static EWRAM_DATA struct HallofFameTeam *sHofMonPtr = NULL; static EWRAM_DATA struct HofGfx *sHofGfxPtr = NULL; extern struct MusicPlayerInfo gMPlayInfo_BGM; -#define HALL_OF_FAME_MAX_TEAMS 50 - // this file's functions static void ClearVramOamPltt_LoadHofPal(void); -static void sub_8174F70(void); -static void sub_8174FAC(void); -static bool8 sub_81751FC(void); +static void LoadHofGfx(void); +static void InitHofBgs(void); +static bool8 CreateHofConfettiSprite(void); static void SetCallback2AfterHallOfFameDisplay(void); static bool8 sub_8175024(void); static void Task_Hof_InitMonData(u8 taskId); static void Task_Hof_InitTeamSaveData(u8 taskId); static void Task_Hof_SetMonDisplayTask(u8 taskId); static void Task_Hof_TrySaveData(u8 taskId); -static void Task_Hof_WaitForFrames(u8 taskId); +static void Task_Hof_WaitToDisplayMon(u8 taskId); static void Task_Hof_DisplayMon(u8 taskId); static void Task_Hof_PrintMonInfoAfterAnimating(u8 taskId); static void Task_Hof_TryDisplayAnotherMon(u8 taskId); static void Task_Hof_PaletteFadeAndPrintWelcomeText(u8 taskId); -static void sub_8173DC0(u8 taskId); -static void sub_8173EA4(u8 taskId); -static void sub_8173EE4(u8 taskId); +static void Task_Hof_DoConfetti(u8 taskId); +static void Task_Hof_WaitToDisplayPlayer(u8 taskId); +static void Task_Hof_DisplayPlayer(u8 taskId); static void Task_Hof_WaitAndPrintPlayerInfo(u8 taskId); static void Task_Hof_ExitOnKeyPressed(u8 taskId); static void Task_Hof_HandlePaletteOnExit(u8 taskId); @@ -101,8 +102,8 @@ static void SpriteCB_GetOnScreenAndAnimate(struct Sprite *sprite); static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 unused1, u8 unused2); static void HallOfFame_PrintWelcomeText(u8 unusedPossiblyWindowId, u8 unused2); static void HallOfFame_PrintPlayerInfo(u8 unused1, u8 unused2); -static void Task_DoConfettiEffect(u8 taskId); -static void sub_81751A4(struct Sprite* sprite); +static void Task_DoDomeConfetti(u8 taskId); +static void SpriteCB_HofConfetti(struct Sprite* sprite); // const rom data static const struct BgTemplate sHof_BgTemplates[] = @@ -143,15 +144,15 @@ static const u8 sPlayerInfoTextColors[4] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_D static const u8 sUnused_085E538C[] = {4, 5, 0, 0}; -static const struct CompressedSpriteSheet sHallOfFame_ConfettiSpriteSheet[] = +static const struct CompressedSpriteSheet sSpriteSheet_Confetti[] = { - {gContestConfetti_Gfx, 0x220, 1001}, + {.data = gConfetti_Gfx, .size = 0x220, .tag = TAG_CONFETTI}, {}, }; -static const struct CompressedSpritePalette sHallOfFame_ConfettiSpritePalette[] = +static const struct CompressedSpritePalette sSpritePalette_Confetti[] = { - {gContestConfetti_Pal, 1001}, + {.data = gConfetti_Pal, .tag = TAG_CONFETTI}, {}, }; @@ -172,7 +173,7 @@ static const s16 sHallOfFame_MonHalfTeamPositions[PARTY_SIZE / 2][4] = {-86, 244, 184, 64} }; -static const struct OamData sOamData_85E53FC = +static const struct OamData sOamData_Confetti = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -189,126 +190,138 @@ static const struct OamData sOamData_85E53FC = .affineParam = 0, }; -static const union AnimCmd sSpriteAnim_85E5404[] = +static const union AnimCmd sAnim_PinkConfettiA[] = { ANIMCMD_FRAME(0, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_85E540C[] = +static const union AnimCmd sAnim_RedConfettiA[] = { ANIMCMD_FRAME(1, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_85E5414[] = +static const union AnimCmd sAnim_BlueConfettiA[] = { ANIMCMD_FRAME(2, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_85E541C[] = +static const union AnimCmd sAnim_RedConfettiB[] = { ANIMCMD_FRAME(3, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_85E5424[] = +static const union AnimCmd sAnim_BlueConfettiB[] = { ANIMCMD_FRAME(4, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_85E542C[] = +static const union AnimCmd sAnim_YellowConfettiA[] = { ANIMCMD_FRAME(5, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_85E5434[] = +static const union AnimCmd sAnim_WhiteConfettiA[] = { ANIMCMD_FRAME(6, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_85E543C[] = +static const union AnimCmd sAnim_GreenConfettiA[] = { ANIMCMD_FRAME(7, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_85E5444[] = +static const union AnimCmd sAnim_PinkConfettiB[] = { ANIMCMD_FRAME(8, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_85E544C[] = +static const union AnimCmd sAnim_BlueConfettiC[] = { ANIMCMD_FRAME(9, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_85E5454[] = +static const union AnimCmd sAnim_YellowConfettiB[] = { ANIMCMD_FRAME(10, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_85E545C[] = +static const union AnimCmd sAnim_WhiteConfettiB[] = { ANIMCMD_FRAME(11, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_85E5464[] = +static const union AnimCmd sAnim_GreenConfettiB[] = { ANIMCMD_FRAME(12, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_85E546C[] = +static const union AnimCmd sAnim_PinkConfettiC[] = { ANIMCMD_FRAME(13, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_85E5474[] = +static const union AnimCmd sAnim_RedConfettiC[] = { ANIMCMD_FRAME(14, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_85E547C[] = +static const union AnimCmd sAnim_YellowConfettiC[] = { ANIMCMD_FRAME(15, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_85E5484[] = +static const union AnimCmd sAnim_WhiteConfettiC[] = { ANIMCMD_FRAME(16, 30), ANIMCMD_END }; -static const union AnimCmd * const sSpriteAnimTable_85E548C[] = -{ - sSpriteAnim_85E5404, sSpriteAnim_85E540C, sSpriteAnim_85E5414, sSpriteAnim_85E541C, - sSpriteAnim_85E5424, sSpriteAnim_85E542C, sSpriteAnim_85E5434, sSpriteAnim_85E543C, - sSpriteAnim_85E5444, sSpriteAnim_85E544C, sSpriteAnim_85E5454, sSpriteAnim_85E545C, - sSpriteAnim_85E5464, sSpriteAnim_85E546C, sSpriteAnim_85E5474, sSpriteAnim_85E547C, - sSpriteAnim_85E5484 +static const union AnimCmd * const sAnims_Confetti[] = +{ + sAnim_PinkConfettiA, + sAnim_RedConfettiA, + sAnim_BlueConfettiA, + sAnim_RedConfettiB, + sAnim_BlueConfettiB, + sAnim_YellowConfettiA, + sAnim_WhiteConfettiA, + sAnim_GreenConfettiA, + sAnim_PinkConfettiB, + sAnim_BlueConfettiC, + sAnim_YellowConfettiB, + sAnim_WhiteConfettiB, + sAnim_GreenConfettiB, + sAnim_PinkConfettiC, + sAnim_RedConfettiC, + sAnim_YellowConfettiC, + sAnim_WhiteConfettiC }; -static const struct SpriteTemplate sSpriteTemplate_85E54D0 = +static const struct SpriteTemplate sSpriteTemplate_HofConfetti = { - .tileTag = 1001, - .paletteTag = 1001, - .oam = &sOamData_85E53FC, - .anims = sSpriteAnimTable_85E548C, + .tileTag = TAG_CONFETTI, + .paletteTag = TAG_CONFETTI, + .oam = &sOamData_Confetti, + .anims = sAnims_Confetti, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_81751A4 + .callback = SpriteCB_HofConfetti }; static const u16 sHallOfFame_Pal[] = INCBIN_U16("graphics/misc/japanese_hof.gbapal"); @@ -317,10 +330,19 @@ static const u32 sHallOfFame_Gfx[] = INCBIN_U32("graphics/misc/japanese_hof.4bpp static const struct HallofFameMon sDummyFameMon = { - 0x3EA03EA, 0, 0, 0, {0} + .tid = 0x3EA03EA, + .personality = 0, + .species = SPECIES_NONE, + .lvl = 0, + .nick = {0} }; -static const u8 sUnused2[] = {2, 1, 3, 6, 4, 5, 0, 0}; +// Unused, order of party slots on Hall of Fame screen +static const u8 sHallOfFame_SlotOrder[] = { + 2, 1, 3, + 6, 4, 5, + 0, 0 +}; // code static void VBlankCB_HallOfFame(void) @@ -350,14 +372,14 @@ static bool8 InitHallOfFameScreen(void) gMain.state = 1; break; case 1: - sub_8174F70(); + LoadHofGfx(); gMain.state++; break; case 2: SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 7)); SetGpuReg(REG_OFFSET_BLDY, 0); - sub_8174FAC(); + InitHofBgs(); sHofGfxPtr->state = 0; gMain.state++; break; @@ -433,7 +455,7 @@ static void Task_Hof_InitMonData(u8 taskId) } else { - sHofMonPtr->mon[i].species = 0; + sHofMonPtr->mon[i].species = SPECIES_NONE; sHofMonPtr->mon[i].tid = 0; sHofMonPtr->mon[i].personality = 0; sHofMonPtr->mon[i].lvl = 0; @@ -441,7 +463,7 @@ static void Task_Hof_InitMonData(u8 taskId) } } - sUnknown_0203BCD4 = 0; + sHofFadePalettes = 0; gTasks[taskId].tDisplayedMonId = 0; gTasks[taskId].tPlayerSpriteID = 0xFF; @@ -514,12 +536,12 @@ static void Task_Hof_TrySaveData(u8 taskId) else { PlaySE(SE_SAVE); - gTasks[taskId].func = Task_Hof_WaitForFrames; + gTasks[taskId].func = Task_Hof_WaitToDisplayMon; gTasks[taskId].tFrameCount = 32; } } -static void Task_Hof_WaitForFrames(u8 taskId) +static void Task_Hof_WaitToDisplayMon(u8 taskId) { if (gTasks[taskId].tFrameCount) gTasks[taskId].tFrameCount--; @@ -539,32 +561,32 @@ static void Task_Hof_SetMonDisplayTask(u8 taskId) static void Task_Hof_DisplayMon(u8 taskId) { u8 spriteId; - s16 xPos, yPos, field4, field6; + s16 startX, startY, destX, destY; u16 currMonId = gTasks[taskId].tDisplayedMonId; struct HallofFameMon* currMon = &sHofMonPtr->mon[currMonId]; if (gTasks[taskId].tMonNumber > PARTY_SIZE / 2) { - xPos = sHallOfFame_MonFullTeamPositions[currMonId][0]; - yPos = sHallOfFame_MonFullTeamPositions[currMonId][1]; - field4 = sHallOfFame_MonFullTeamPositions[currMonId][2]; - field6 = sHallOfFame_MonFullTeamPositions[currMonId][3]; + startX = sHallOfFame_MonFullTeamPositions[currMonId][0]; + startY = sHallOfFame_MonFullTeamPositions[currMonId][1]; + destX = sHallOfFame_MonFullTeamPositions[currMonId][2]; + destY = sHallOfFame_MonFullTeamPositions[currMonId][3]; } else { - xPos = sHallOfFame_MonHalfTeamPositions[currMonId][0]; - yPos = sHallOfFame_MonHalfTeamPositions[currMonId][1]; - field4 = sHallOfFame_MonHalfTeamPositions[currMonId][2]; - field6 = sHallOfFame_MonHalfTeamPositions[currMonId][3]; + startX = sHallOfFame_MonHalfTeamPositions[currMonId][0]; + startY = sHallOfFame_MonHalfTeamPositions[currMonId][1]; + destX = sHallOfFame_MonHalfTeamPositions[currMonId][2]; + destY = sHallOfFame_MonHalfTeamPositions[currMonId][3]; } if (currMon->species == SPECIES_EGG) - field6 += 10; + destY += 10; - spriteId = CreatePicSprite2(currMon->species, currMon->tid, currMon->personality, 1, xPos, yPos, currMonId, 0xFFFF); - gSprites[spriteId].tDestinationX = field4; - gSprites[spriteId].tDestinationY = field6; + spriteId = CreatePicSprite2(currMon->species, currMon->tid, currMon->personality, 1, startX, startY, currMonId, 0xFFFF); + gSprites[spriteId].tDestinationX = destX; + gSprites[spriteId].tDestinationY = destY; gSprites[spriteId].data[0] = 0; gSprites[spriteId].tSpecies = currMon->species; gSprites[spriteId].callback = SpriteCB_GetOnScreenAndAnimate; @@ -599,11 +621,11 @@ static void Task_Hof_TryDisplayAnotherMon(u8 taskId) } else { - sUnknown_0203BCD4 |= (0x10000 << gSprites[gTasks[taskId].tMonSpriteId(currPokeID)].oam.paletteNum); - if (gTasks[taskId].tDisplayedMonId <= 4 && currMon[1].species != SPECIES_NONE) // there is another pokemon to display + sHofFadePalettes |= (0x10000 << gSprites[gTasks[taskId].tMonSpriteId(currPokeID)].oam.paletteNum); + if (gTasks[taskId].tDisplayedMonId < PARTY_SIZE - 1 && currMon[1].species != SPECIES_NONE) // there is another pokemon to display { gTasks[taskId].tDisplayedMonId++; - BeginNormalPaletteFade(sUnknown_0203BCD4, 0, 12, 12, RGB(16, 29, 24)); + BeginNormalPaletteFade(sHofFadePalettes, 0, 12, 12, RGB(16, 29, 24)); gSprites[gTasks[taskId].tMonSpriteId(currPokeID)].oam.priority = 1; gTasks[taskId].func = Task_Hof_DisplayMon; } @@ -628,16 +650,19 @@ static void Task_Hof_PaletteFadeAndPrintWelcomeText(u8 taskId) HallOfFame_PrintWelcomeText(0, 15); PlaySE(SE_DENDOU); gTasks[taskId].tFrameCount = 400; - gTasks[taskId].func = sub_8173DC0; + gTasks[taskId].func = Task_Hof_DoConfetti; } -static void sub_8173DC0(u8 taskId) +static void Task_Hof_DoConfetti(u8 taskId) { if (gTasks[taskId].tFrameCount != 0) { gTasks[taskId].tFrameCount--; + + // Create new confetti every 4th frame for the first 290 frames + // For the last 110 frames wait for the existing confetti to fall offscreen if ((gTasks[taskId].tFrameCount & 3) == 0 && gTasks[taskId].tFrameCount > 110) - sub_81751FC(); + CreateHofConfettiSprite(); } else { @@ -647,19 +672,19 @@ static void sub_8173DC0(u8 taskId) if (gTasks[taskId].tMonSpriteId(i) != 0xFF) gSprites[gTasks[taskId].tMonSpriteId(i)].oam.priority = 1; } - BeginNormalPaletteFade(sUnknown_0203BCD4, 0, 12, 12, RGB(16, 29, 24)); + BeginNormalPaletteFade(sHofFadePalettes, 0, 12, 12, RGB(16, 29, 24)); FillWindowPixelBuffer(0, PIXEL_FILL(0)); CopyWindowToVram(0, 3); gTasks[taskId].tFrameCount = 7; - gTasks[taskId].func = sub_8173EA4; + gTasks[taskId].func = Task_Hof_WaitToDisplayPlayer; } } -static void sub_8173EA4(u8 taskId) +static void Task_Hof_WaitToDisplayPlayer(u8 taskId) { if (gTasks[taskId].tFrameCount >= 16) { - gTasks[taskId].func = sub_8173EE4; + gTasks[taskId].func = Task_Hof_DisplayPlayer; } else { @@ -668,7 +693,7 @@ static void sub_8173EA4(u8 taskId) } } -static void sub_8173EE4(u8 taskId) +static void Task_Hof_DisplayPlayer(u8 taskId) { SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); ShowBg(0); @@ -784,14 +809,14 @@ void CB2_DoHallOfFamePC(void) gMain.state = 1; break; case 1: - sub_8174F70(); + LoadHofGfx(); gMain.state++; break; case 2: SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); - sub_8174FAC(); + InitHofBgs(); gMain.state++; break; case 3: @@ -874,7 +899,7 @@ static void Task_HofPC_DrawSpritesPrintText(u8 taskId) savedTeams++; currMon = &savedTeams->mon[0]; - sUnknown_0203BCD4 = 0; + sHofFadePalettes = 0; gTasks[taskId].tCurrMonId = 0; gTasks[taskId].tMonNo = 0; @@ -949,8 +974,8 @@ static void Task_HofPC_PrintMonInfo(u8 taskId) currMonID = gTasks[taskId].tMonSpriteId(gTasks[taskId].tCurrMonId); gSprites[currMonID].oam.priority = 0; - sUnknown_0203BCD4 = (0x10000 << gSprites[currMonID].oam.paletteNum) ^ 0xFFFF0000; - BlendPalettesUnfaded(sUnknown_0203BCD4, 0xC, RGB(16, 29, 24)); + sHofFadePalettes = (0x10000 << gSprites[currMonID].oam.paletteNum) ^ 0xFFFF0000; + BlendPalettesUnfaded(sHofFadePalettes, 0xC, RGB(16, 29, 24)); currMon = &savedTeams->mon[gTasks[taskId].tCurrMonId]; if (currMon->species != SPECIES_EGG) @@ -972,7 +997,7 @@ static void Task_HofPC_HandleInput(u8 taskId) if (gTasks[taskId].tCurrTeamNo != 0) // prepare another team to view { gTasks[taskId].tCurrTeamNo--; - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { u8 spriteId = gTasks[taskId].tMonSpriteId(i); if (spriteId != 0xFF) @@ -1250,7 +1275,7 @@ static void ClearVramOamPltt_LoadHofPal(void) LoadPalette(sHallOfFame_Pal, 0, 0x20); } -static void sub_8174F70(void) +static void LoadHofGfx(void) { ScanlineEffect_Stop(); ResetTasks(); @@ -1259,11 +1284,11 @@ static void sub_8174F70(void) ResetAllPicSprites(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 8; - LoadCompressedSpriteSheet(sHallOfFame_ConfettiSpriteSheet); - LoadCompressedSpritePalette(sHallOfFame_ConfettiSpritePalette); + LoadCompressedSpriteSheet(sSpriteSheet_Confetti); + LoadCompressedSpritePalette(sSpritePalette_Confetti); } -static void sub_8174FAC(void) +static void InitHofBgs(void) { ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sHof_BgTemplates, ARRAY_COUNT(sHof_BgTemplates)); @@ -1344,7 +1369,10 @@ static void SpriteCB_GetOnScreenAndAnimate(struct Sprite *sprite) #undef tDestinationY #undef tSpecies -static void sub_81751A4(struct Sprite* sprite) +#define sSineIdx data[0] +#define sExtraY data[1] + +static void SpriteCB_HofConfetti(struct Sprite* sprite) { if (sprite->pos2.y > 120) { @@ -1353,20 +1381,20 @@ static void sub_81751A4(struct Sprite* sprite) else { u16 rand; - u8 tableID; + u8 sineIdx; sprite->pos2.y++; - sprite->pos2.y += sprite->data[1]; + sprite->pos2.y += sprite->sExtraY; - tableID = sprite->data[0]; + sineIdx = sprite->sSineIdx; rand = (Random() % 4) + 8; - sprite->pos2.x = rand * gSineTable[tableID] / 256; + sprite->pos2.x = rand * gSineTable[sineIdx] / 256; - sprite->data[0] += 4; + sprite->sSineIdx += 4; } } -static bool8 sub_81751FC(void) +static bool8 CreateHofConfettiSprite(void) { u8 spriteID; struct Sprite* sprite; @@ -1374,110 +1402,136 @@ static bool8 sub_81751FC(void) s16 posX = Random() % 240; s16 posY = -(Random() % 8); - spriteID = CreateSprite(&sSpriteTemplate_85E54D0, posX, posY, 0); + spriteID = CreateSprite(&sSpriteTemplate_HofConfetti, posX, posY, 0); sprite = &gSprites[spriteID]; - StartSpriteAnim(sprite, Random() % 17); + StartSpriteAnim(sprite, Random() % ARRAY_COUNT(sAnims_Confetti)); + // 1/4 confetti sprites move an extra Y coord each frame if (Random() & 3) - sprite->data[1] = 0; + sprite->sExtraY = 0; else - sprite->data[1] = 1; + sprite->sExtraY = 1; return FALSE; } -// Used when a Battle Dome tourney is won -void DoConfettiEffect(void) +// The below confetti functions are used when a Battle Dome tourney is won +// For the Hall of Fame confetti see Task_Hof_DoConfetti +// The end result is essentially the same, just a very different way of handling it +#define tState data[0] +#define tTimer data[1] +#define tConfettiCount data[15] + +// Indexes into the data array of the struct OamUtil tracking confetti +#define CONFETTI_SINE_IDX 0 +#define CONFETTI_EXTRA_Y 1 +#define CONFETTI_TASK_ID 7 + +void DoDomeConfetti(void) { u8 taskId; gSpecialVar_0x8004 = 180; - taskId = CreateTask(Task_DoConfettiEffect, 0); + taskId = CreateTask(Task_DoDomeConfetti, 0); if (taskId != 0xFF) { - gTasks[taskId].data[1] = gSpecialVar_0x8004; + gTasks[taskId].tTimer = gSpecialVar_0x8004; gSpecialVar_0x8005 = taskId; } } -static void StopConfettiEffect(void) +static void StopDomeConfetti(void) { u8 taskId; - if ((taskId = FindTaskIdByFunc(Task_DoConfettiEffect)) != 0xFF) + if ((taskId = FindTaskIdByFunc(Task_DoDomeConfetti)) != 0xFF) DestroyTask(taskId); - sub_8152254(); - FreeSpriteTilesByTag(0x3E9); - FreeSpritePaletteByTag(0x3E9); + OamUtil_Free(); + FreeSpriteTilesByTag(TAG_CONFETTI); + FreeSpritePaletteByTag(TAG_CONFETTI); } -static void sub_81752F4(struct UnkStruct_81520A8 *structPtr) +static void UpdateDomeConfetti(struct OamUtil *oamUtil) { - if (structPtr->yDelta > 110) + if (oamUtil->yDelta > 110) { - gTasks[structPtr->data[7]].data[15]--; - sub_81525D0(structPtr->id); + // Destroy confetti after it falls far enough + gTasks[oamUtil->data[CONFETTI_TASK_ID]].tConfettiCount--; + OamUtil_Remove(oamUtil->id); } else { - u8 var; + // Move confetti down + u8 sineIdx; s32 rand; - structPtr->yDelta++; - structPtr->yDelta += structPtr->data[1]; + oamUtil->yDelta++; + oamUtil->yDelta += oamUtil->data[CONFETTI_EXTRA_Y]; - var = structPtr->data[0]; + sineIdx = oamUtil->data[CONFETTI_SINE_IDX]; rand = Random(); rand &= 3; rand += 8; - structPtr->xDelta = (rand) * ((gSineTable[var])) / 256; + oamUtil->xDelta = (rand) * ((gSineTable[sineIdx])) / 256; - structPtr->data[0] += 4; + oamUtil->data[CONFETTI_SINE_IDX] += 4; } } -static void Task_DoConfettiEffect(u8 taskId) +static void Task_DoDomeConfetti(u8 taskId) { - u32 var = 0; + u32 id = 0; u16 *data = gTasks[taskId].data; - switch (data[0]) + switch (tState) { case 0: - if (!sub_81521C0(0x40)) + if (!OamUtil_Init(64)) { + // Init failed DestroyTask(taskId); - gSpecialVar_0x8004 = var; + gSpecialVar_0x8004 = 0; gSpecialVar_0x8005 = 0xFFFF; } - LoadCompressedSpriteSheet(sHallOfFame_ConfettiSpriteSheet); - LoadCompressedSpritePalette(sHallOfFame_ConfettiSpritePalette); - data[0]++; + LoadCompressedSpriteSheet(sSpriteSheet_Confetti); + LoadCompressedSpritePalette(sSpritePalette_Confetti); + tState++; break; case 1: - if (data[1] != 0 && data[1] % 3 == 0) + if (tTimer != 0 && tTimer % 3 == 0) { - var = sub_81524C4(&sOamData_85E53FC, 0x3E9, 0x3E9, Random() % 240, -(Random() % 8), Random() % 0x11, var); - if (var != 0xFF) + // Create new confetti every 3 frames + id = OamUtil_AddNew(&sOamData_Confetti, + TAG_CONFETTI, + TAG_CONFETTI, + Random() % 240, + -(Random() % 8), + Random() % ARRAY_COUNT(sAnims_Confetti), + id); + if (id != 0xFF) { - sub_8152438(var, sub_81752F4); - if ((Random() & 3) == 0) - sub_8152474(var, 1, 1); - sub_8152474(var, 7, taskId); - data[15]++; + OamUtil_SetCallback(id, UpdateDomeConfetti); + + // 1/4 of the confetti move an extra y coord every frame + if ((Random() % 4) == 0) + OamUtil_SetData(id, CONFETTI_EXTRA_Y, 1); + + OamUtil_SetData(id, CONFETTI_TASK_ID, taskId); + tConfettiCount++; } } - sub_81522D4(); - if (data[1] != 0) - data[1]--; - else if (data[15] == 0) - data[0] = 0xFF; + + OamUtil_Update(); + if (tTimer != 0) + tTimer--; + else if (tConfettiCount == 0) + tState = 0xFF; break; case 0xFF: - StopConfettiEffect(); - gSpecialVar_0x8004 = var; + StopDomeConfetti(); + gSpecialVar_0x8004 = 0; gSpecialVar_0x8005 = 0xFFFF; break; } diff --git a/src/rom_81520A8.c b/src/rom_81520A8.c index 8b10d44d0..2c37d7d48 100644 --- a/src/rom_81520A8.c +++ b/src/rom_81520A8.c @@ -7,10 +7,10 @@ static EWRAM_DATA struct { u8 count; - struct UnkStruct_81520A8 *unk4; -} *sUnknown_0203ABB8 = NULL; + struct OamUtil *array; +} *sWork = NULL; -void sub_81520A8(void *dest, u16 value, u8 left, u8 top, u8 width, u8 height) // Unused. +static void sub_81520A8(void *dest, u16 value, u8 left, u8 top, u8 width, u8 height) // Unused. { u8 i; u8 j; @@ -28,7 +28,7 @@ void sub_81520A8(void *dest, u16 value, u8 left, u8 top, u8 width, u8 height) // } } -void sub_8152134(void *dest, const u16 *src, u8 left, u8 top, u8 width, u8 height) // Unused. +static void sub_8152134(void *dest, const u16 *src, u8 left, u8 top, u8 width, u8 height) // Unused. { u8 i; u8 j; @@ -47,7 +47,7 @@ void sub_8152134(void *dest, const u16 *src, u8 left, u8 top, u8 width, u8 heigh } } -bool32 sub_81521C0(u8 count) +bool32 OamUtil_Init(u8 count) { u8 i = 0; @@ -56,69 +56,69 @@ bool32 sub_81521C0(u8 count) if (count > 64) count = 64; - sUnknown_0203ABB8 = AllocZeroed(sizeof(*sUnknown_0203ABB8)); - if (sUnknown_0203ABB8 == NULL) + sWork = AllocZeroed(sizeof(*sWork)); + if (sWork == NULL) return FALSE; - sUnknown_0203ABB8->unk4 = AllocZeroed(count * sizeof(struct UnkStruct_81520A8)); - if (sUnknown_0203ABB8->unk4 == NULL) + sWork->array = AllocZeroed(count * sizeof(struct OamUtil)); + if (sWork->array == NULL) { - FREE_AND_SET_NULL(sUnknown_0203ABB8); + FREE_AND_SET_NULL(sWork); return FALSE; } - sUnknown_0203ABB8->count = count; + sWork->count = count; for (i = 0; i < count; i++) { - memcpy(&sUnknown_0203ABB8->unk4[i].oam, &gDummyOamData, sizeof(struct OamData)); - sUnknown_0203ABB8->unk4[i].unk19_2 = TRUE; + memcpy(&sWork->array[i].oam, &gDummyOamData, sizeof(struct OamData)); + sWork->array[i].dummied = TRUE; } return TRUE; } -bool32 sub_8152254(void) +bool32 OamUtil_Free(void) { u8 i = 0; - if (sUnknown_0203ABB8 == NULL) + if (sWork == NULL) return FALSE; - for (i = 0; i < sUnknown_0203ABB8->count; i++) + for (i = 0; i < sWork->count; i++) memcpy(&gMain.oamBuffer[i + 64], &gDummyOamData, sizeof(struct OamData)); - memset(sUnknown_0203ABB8->unk4, 0, sUnknown_0203ABB8->count * sizeof(struct UnkStruct_81520A8)); - FREE_AND_SET_NULL(sUnknown_0203ABB8->unk4); - memset(sUnknown_0203ABB8, 0, sizeof(*sUnknown_0203ABB8)); - FREE_AND_SET_NULL(sUnknown_0203ABB8); + memset(sWork->array, 0, sWork->count * sizeof(struct OamUtil)); + FREE_AND_SET_NULL(sWork->array); + memset(sWork, 0, sizeof(*sWork)); + FREE_AND_SET_NULL(sWork); return TRUE; } -bool32 sub_81522D4(void) +bool32 OamUtil_Update(void) { u8 i = 0; - if (sUnknown_0203ABB8 == NULL || sUnknown_0203ABB8->unk4 == NULL) + if (sWork == NULL || sWork->array == NULL) return FALSE; - for (i = 0; i < sUnknown_0203ABB8->count; i++) + for (i = 0; i < sWork->count; i++) { - if (sUnknown_0203ABB8->unk4[i].unk19_0 && sUnknown_0203ABB8->unk4[i].unk19_1) + if (sWork->array[i].active && sWork->array[i].allowUpdates) { - if (sUnknown_0203ABB8->unk4[i].callback != NULL) - sUnknown_0203ABB8->unk4[i].callback(&sUnknown_0203ABB8->unk4[i]); + if (sWork->array[i].callback != NULL) + sWork->array[i].callback(&sWork->array[i]); - if (sUnknown_0203ABB8->unk4[i].unk19_2) + if (sWork->array[i].dummied) { memcpy(&gMain.oamBuffer[i + 64], &gDummyOamData, sizeof(struct OamData)); } else { - sUnknown_0203ABB8->unk4[i].oam.y = sUnknown_0203ABB8->unk4[i].y + sUnknown_0203ABB8->unk4[i].yDelta; - sUnknown_0203ABB8->unk4[i].oam.x = sUnknown_0203ABB8->unk4[i].x + sUnknown_0203ABB8->unk4[i].xDelta; - sUnknown_0203ABB8->unk4[i].oam.priority = sUnknown_0203ABB8->unk4[i].priority; - sUnknown_0203ABB8->unk4[i].oam.tileNum = sUnknown_0203ABB8->unk4[i].tileNum; - memcpy(&gMain.oamBuffer[i + 64], &sUnknown_0203ABB8->unk4[i], sizeof(struct OamData)); + sWork->array[i].oam.y = sWork->array[i].y + sWork->array[i].yDelta; + sWork->array[i].oam.x = sWork->array[i].x + sWork->array[i].xDelta; + sWork->array[i].oam.priority = sWork->array[i].priority; + sWork->array[i].oam.tileNum = sWork->array[i].tileNum; + memcpy(&gMain.oamBuffer[i + 64], &sWork->array[i], sizeof(struct OamData)); } } } @@ -126,7 +126,7 @@ bool32 sub_81522D4(void) return TRUE; } -static bool32 sub_81523F4(struct UnkStruct_81520A8 *structPtr, u8 arg1) +static bool32 SetAnimAndTileNum(struct OamUtil *structPtr, u8 animNum) { u16 tileStart; @@ -137,50 +137,50 @@ static bool32 sub_81523F4(struct UnkStruct_81520A8 *structPtr, u8 arg1) if (tileStart == 0xFFFF) return FALSE; - structPtr->unk18 = arg1; - structPtr->tileNum = (GetTilesPerImage(structPtr->oam.shape, structPtr->oam.size) * arg1) + tileStart; + structPtr->animNum = animNum; + structPtr->tileNum = (GetTilesPerImage(structPtr->oam.shape, structPtr->oam.size) * animNum) + tileStart; return TRUE; } -u8 sub_8152438(u8 id, void (*func)(struct UnkStruct_81520A8 *)) +u8 OamUtil_SetCallback(u8 id, void (*func)(struct OamUtil *)) { - if (sUnknown_0203ABB8 == NULL || id >= sUnknown_0203ABB8->count) + if (sWork == NULL || id >= sWork->count) return 0xFF; - else if (!sUnknown_0203ABB8->unk4[id].unk19_0) + else if (!sWork->array[id].active) return 0xFF; - sUnknown_0203ABB8->unk4[id].callback = func; + sWork->array[id].callback = func; return id; } -u8 sub_8152474(u8 id, u8 dataArrayId, s16 dataValue) +u8 OamUtil_SetData(u8 id, u8 dataArrayId, s16 dataValue) { - if (sUnknown_0203ABB8 == NULL || id >= sUnknown_0203ABB8->count) + if (sWork == NULL || id >= sWork->count) return 0xFF; - else if (!sUnknown_0203ABB8->unk4[id].unk19_0 || dataArrayId >= ARRAY_COUNT(sUnknown_0203ABB8->unk4[id].data)) + else if (!sWork->array[id].active || dataArrayId > ARRAY_COUNT(sWork->array[id].data) - 1) // - 1 b/c last slot is reserved for taskId return 0xFF; - sUnknown_0203ABB8->unk4[id].data[dataArrayId] = dataValue; + sWork->array[id].data[dataArrayId] = dataValue; return id; } -u8 sub_81524C4(const struct OamData *oam, u16 tileTag, u16 palTag, s16 x, s16 y, u8 arg5, u8 priority) +u8 OamUtil_AddNew(const struct OamData *oam, u16 tileTag, u16 palTag, s16 x, s16 y, u8 animNum, u8 priority) { - struct UnkStruct_81520A8 *structPtr = NULL; + struct OamUtil *structPtr = NULL; u8 i; - if (sUnknown_0203ABB8 == NULL || oam == NULL) + if (sWork == NULL || oam == NULL) return 0xFF; - for (i = 0; i < sUnknown_0203ABB8->count; i++) + for (i = 0; i < sWork->count; i++) { - if (!sUnknown_0203ABB8->unk4[i].unk19_0) + if (!sWork->array[i].active) { - structPtr = &sUnknown_0203ABB8->unk4[i]; + structPtr = &sWork->array[i]; memset(structPtr, 0, sizeof(*structPtr)); structPtr->id = i; - structPtr->unk19_0 = TRUE; - structPtr->unk19_1 = TRUE; + structPtr->active = TRUE; + structPtr->allowUpdates = TRUE; break; } } @@ -199,20 +199,20 @@ u8 sub_81524C4(const struct OamData *oam, u16 tileTag, u16 palTag, s16 x, s16 y, structPtr->priority = priority; structPtr->oam.priority = priority; } - sub_81523F4(structPtr, arg5); + SetAnimAndTileNum(structPtr, animNum); return structPtr->id; } -u8 sub_81525D0(u8 id) +u8 OamUtil_Remove(u8 id) { - if (sUnknown_0203ABB8 == NULL || !sUnknown_0203ABB8->unk4[id].unk19_0) + if (sWork == NULL || !sWork->array[id].active) return 0xFF; - memset(&sUnknown_0203ABB8->unk4[id], 0, sizeof(struct UnkStruct_81520A8)); - sUnknown_0203ABB8->unk4[id].oam.y = 160; - sUnknown_0203ABB8->unk4[id].oam.x = 240; - sUnknown_0203ABB8->unk4[id].unk19_2 = TRUE; + memset(&sWork->array[id], 0, sizeof(struct OamUtil)); + sWork->array[id].oam.y = 160; + sWork->array[id].oam.x = 240; + sWork->array[id].dummied = TRUE; memcpy(&gMain.oamBuffer[id + 64], &gDummyOamData, sizeof(struct OamData)); return id; } -- cgit v1.2.3 From f600aff71140b34e4b3c210ef27ec1b9704a6f45 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Wed, 17 Jun 2020 03:42:10 -0400 Subject: Rename rom_81520A8 --- include/oam_util.h | 33 ++++++++ include/rom_81520A8.h | 33 -------- ld_script.txt | 2 +- src/hall_of_fame.c | 2 +- src/oam_util.c | 218 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/rom_81520A8.c | 218 -------------------------------------------------- sym_ewram.txt | 2 +- 7 files changed, 254 insertions(+), 254 deletions(-) create mode 100644 include/oam_util.h delete mode 100644 include/rom_81520A8.h create mode 100644 src/oam_util.c delete mode 100644 src/rom_81520A8.c diff --git a/include/oam_util.h b/include/oam_util.h new file mode 100644 index 000000000..24e166c93 --- /dev/null +++ b/include/oam_util.h @@ -0,0 +1,33 @@ +#ifndef GUARD_OAM_UTIL_H +#define GUARD_OAM_UTIL_H + +struct OamUtil +{ + struct OamData oam; + s16 x; + s16 y; + s16 xDelta; + s16 yDelta; + u16 tileTag; + u16 palTag; + u16 tileNum; + u8 id; + u8 filler; + u8 animNum; + u8 active:1; + u8 allowUpdates:1; + u8 dummied:1; + u8 priority:2; + s16 data[8]; + void (*callback)(struct OamUtil *); +}; + +bool32 OamUtil_Init(u8 count); +bool32 OamUtil_Free(void); +bool32 OamUtil_Update(void); +u8 OamUtil_SetCallback(u8 id, void (*func)(struct OamUtil *)); +u8 OamUtil_SetData(u8 id, u8 dataArrayId, s16 dataValue); +u8 OamUtil_AddNew(const struct OamData *oam, u16 tileTag, u16 palTag, s16 x, s16 y, u8 animNum, u8 priority); +u8 OamUtil_Remove(u8 id); + +#endif // GUARD_OAM_UTIL_H diff --git a/include/rom_81520A8.h b/include/rom_81520A8.h deleted file mode 100644 index 9ad299197..000000000 --- a/include/rom_81520A8.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef GUARD_ROM_81520A8_H -#define GUARD_ROM_81520A8_H - -struct OamUtil -{ - struct OamData oam; - s16 x; - s16 y; - s16 xDelta; - s16 yDelta; - u16 tileTag; - u16 palTag; - u16 tileNum; - u8 id; - u8 filler; - u8 animNum; - u8 active:1; - u8 allowUpdates:1; - u8 dummied:1; - u8 priority:2; - s16 data[8]; - void (*callback)(struct OamUtil *); -}; - -bool32 OamUtil_Init(u8 count); -bool32 OamUtil_Free(void); -bool32 OamUtil_Update(void); -u8 OamUtil_SetCallback(u8 id, void (*func)(struct OamUtil *)); -u8 OamUtil_SetData(u8 id, u8 dataArrayId, s16 dataValue); -u8 OamUtil_AddNew(const struct OamData *oam, u16 tileTag, u16 palTag, s16 x, s16 y, u8 animNum, u8 priority); -u8 OamUtil_Remove(u8 id); - -#endif // GUARD_ROM_81520A8_H diff --git a/ld_script.txt b/ld_script.txt index 74d9f6ae6..d22c4a0ce 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -237,7 +237,7 @@ SECTIONS { src/cable_car.o(.text); src/math_util.o(.text); src/roulette_util.o(.text); - src/rom_81520A8.o(.text); + src/oam_util.o(.text); src/save.o(.text); src/mystery_event_script.o(.text); src/field_effect_helpers.o(.text); diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c index fa70ae478..30b170d8e 100644 --- a/src/hall_of_fame.c +++ b/src/hall_of_fame.c @@ -33,7 +33,7 @@ #include "fldeff_misc.h" #include "trainer_pokemon_sprites.h" #include "data.h" -#include "rom_81520A8.h" +#include "oam_util.h" #include "constants/rgb.h" #define HALL_OF_FAME_MAX_TEAMS 50 diff --git a/src/oam_util.c b/src/oam_util.c new file mode 100644 index 000000000..bd1801a7d --- /dev/null +++ b/src/oam_util.c @@ -0,0 +1,218 @@ +#include "global.h" +#include "oam_util.h" +#include "malloc.h" +#include "main.h" +#include "digit_obj_util.h" + +static EWRAM_DATA struct +{ + u8 count; + struct OamUtil *array; +} *sWork = NULL; + +static void sub_81520A8(void *dest, u16 value, u8 left, u8 top, u8 width, u8 height) // Unused. +{ + u8 i; + u8 j; + u8 x; + u8 y; + + for (i = 0, y = top; i < height; i++) + { + for (x = left, j = 0; j < width; j++) + { + *(u16 *)((dest) + (y * 64 + x * 2)) = value; + x = (x + 1) % 32; + } + y = (y + 1) % 32; + } +} + +static void sub_8152134(void *dest, const u16 *src, u8 left, u8 top, u8 width, u8 height) // Unused. +{ + u8 i; + u8 j; + u8 x; + u8 y; + const u16 *_src; + + for (i = 0, _src = src, y = top; i < height; i++) + { + for (x = left, j = 0; j < width; j++) + { + *(u16 *)((dest) + (y * 64 + x * 2)) = *(_src++); + x = (x + 1) % 32; + } + y = (y + 1) % 32; + } +} + +bool32 OamUtil_Init(u8 count) +{ + u8 i = 0; + + if (count == 0) + return FALSE; + if (count > 64) + count = 64; + + sWork = AllocZeroed(sizeof(*sWork)); + if (sWork == NULL) + return FALSE; + sWork->array = AllocZeroed(count * sizeof(struct OamUtil)); + if (sWork->array == NULL) + { + FREE_AND_SET_NULL(sWork); + return FALSE; + } + + sWork->count = count; + for (i = 0; i < count; i++) + { + memcpy(&sWork->array[i].oam, &gDummyOamData, sizeof(struct OamData)); + sWork->array[i].dummied = TRUE; + } + + return TRUE; +} + +bool32 OamUtil_Free(void) +{ + u8 i = 0; + + if (sWork == NULL) + return FALSE; + + for (i = 0; i < sWork->count; i++) + memcpy(&gMain.oamBuffer[i + 64], &gDummyOamData, sizeof(struct OamData)); + + memset(sWork->array, 0, sWork->count * sizeof(struct OamUtil)); + FREE_AND_SET_NULL(sWork->array); + memset(sWork, 0, sizeof(*sWork)); + FREE_AND_SET_NULL(sWork); + + return TRUE; +} + +bool32 OamUtil_Update(void) +{ + u8 i = 0; + + if (sWork == NULL || sWork->array == NULL) + return FALSE; + + for (i = 0; i < sWork->count; i++) + { + if (sWork->array[i].active && sWork->array[i].allowUpdates) + { + if (sWork->array[i].callback != NULL) + sWork->array[i].callback(&sWork->array[i]); + + if (sWork->array[i].dummied) + { + memcpy(&gMain.oamBuffer[i + 64], &gDummyOamData, sizeof(struct OamData)); + } + else + { + sWork->array[i].oam.y = sWork->array[i].y + sWork->array[i].yDelta; + sWork->array[i].oam.x = sWork->array[i].x + sWork->array[i].xDelta; + sWork->array[i].oam.priority = sWork->array[i].priority; + sWork->array[i].oam.tileNum = sWork->array[i].tileNum; + memcpy(&gMain.oamBuffer[i + 64], &sWork->array[i], sizeof(struct OamData)); + } + } + } + + return TRUE; +} + +static bool32 SetAnimAndTileNum(struct OamUtil *structPtr, u8 animNum) +{ + u16 tileStart; + + if (structPtr == NULL) + return FALSE; + + tileStart = GetSpriteTileStartByTag(structPtr->tileTag); + if (tileStart == 0xFFFF) + return FALSE; + + structPtr->animNum = animNum; + structPtr->tileNum = (GetTilesPerImage(structPtr->oam.shape, structPtr->oam.size) * animNum) + tileStart; + return TRUE; +} + +u8 OamUtil_SetCallback(u8 id, void (*func)(struct OamUtil *)) +{ + if (sWork == NULL || id >= sWork->count) + return 0xFF; + else if (!sWork->array[id].active) + return 0xFF; + + sWork->array[id].callback = func; + return id; +} + +u8 OamUtil_SetData(u8 id, u8 dataArrayId, s16 dataValue) +{ + if (sWork == NULL || id >= sWork->count) + return 0xFF; + else if (!sWork->array[id].active || dataArrayId > ARRAY_COUNT(sWork->array[id].data) - 1) // - 1 b/c last slot is reserved for taskId + return 0xFF; + + sWork->array[id].data[dataArrayId] = dataValue; + return id; +} + +u8 OamUtil_AddNew(const struct OamData *oam, u16 tileTag, u16 palTag, s16 x, s16 y, u8 animNum, u8 priority) +{ + struct OamUtil *structPtr = NULL; + u8 i; + + if (sWork == NULL || oam == NULL) + return 0xFF; + + for (i = 0; i < sWork->count; i++) + { + if (!sWork->array[i].active) + { + structPtr = &sWork->array[i]; + memset(structPtr, 0, sizeof(*structPtr)); + structPtr->id = i; + structPtr->active = TRUE; + structPtr->allowUpdates = TRUE; + break; + } + } + + if (structPtr == NULL) + return 0xFF; + + memcpy(&structPtr->oam, oam, sizeof(*oam)); + structPtr->tileTag = tileTag; + structPtr->palTag = palTag; + structPtr->x = x; + structPtr->y = y; + structPtr->oam.paletteNum = IndexOfSpritePaletteTag(palTag); + if (priority < 4) + { + structPtr->priority = priority; + structPtr->oam.priority = priority; + } + SetAnimAndTileNum(structPtr, animNum); + + return structPtr->id; +} + +u8 OamUtil_Remove(u8 id) +{ + if (sWork == NULL || !sWork->array[id].active) + return 0xFF; + + memset(&sWork->array[id], 0, sizeof(struct OamUtil)); + sWork->array[id].oam.y = 160; + sWork->array[id].oam.x = 240; + sWork->array[id].dummied = TRUE; + memcpy(&gMain.oamBuffer[id + 64], &gDummyOamData, sizeof(struct OamData)); + return id; +} diff --git a/src/rom_81520A8.c b/src/rom_81520A8.c deleted file mode 100644 index 2c37d7d48..000000000 --- a/src/rom_81520A8.c +++ /dev/null @@ -1,218 +0,0 @@ -#include "global.h" -#include "rom_81520A8.h" -#include "malloc.h" -#include "main.h" -#include "digit_obj_util.h" - -static EWRAM_DATA struct -{ - u8 count; - struct OamUtil *array; -} *sWork = NULL; - -static void sub_81520A8(void *dest, u16 value, u8 left, u8 top, u8 width, u8 height) // Unused. -{ - u8 i; - u8 j; - u8 x; - u8 y; - - for (i = 0, y = top; i < height; i++) - { - for (x = left, j = 0; j < width; j++) - { - *(u16 *)((dest) + (y * 64 + x * 2)) = value; - x = (x + 1) % 32; - } - y = (y + 1) % 32; - } -} - -static void sub_8152134(void *dest, const u16 *src, u8 left, u8 top, u8 width, u8 height) // Unused. -{ - u8 i; - u8 j; - u8 x; - u8 y; - const u16 *_src; - - for (i = 0, _src = src, y = top; i < height; i++) - { - for (x = left, j = 0; j < width; j++) - { - *(u16 *)((dest) + (y * 64 + x * 2)) = *(_src++); - x = (x + 1) % 32; - } - y = (y + 1) % 32; - } -} - -bool32 OamUtil_Init(u8 count) -{ - u8 i = 0; - - if (count == 0) - return FALSE; - if (count > 64) - count = 64; - - sWork = AllocZeroed(sizeof(*sWork)); - if (sWork == NULL) - return FALSE; - sWork->array = AllocZeroed(count * sizeof(struct OamUtil)); - if (sWork->array == NULL) - { - FREE_AND_SET_NULL(sWork); - return FALSE; - } - - sWork->count = count; - for (i = 0; i < count; i++) - { - memcpy(&sWork->array[i].oam, &gDummyOamData, sizeof(struct OamData)); - sWork->array[i].dummied = TRUE; - } - - return TRUE; -} - -bool32 OamUtil_Free(void) -{ - u8 i = 0; - - if (sWork == NULL) - return FALSE; - - for (i = 0; i < sWork->count; i++) - memcpy(&gMain.oamBuffer[i + 64], &gDummyOamData, sizeof(struct OamData)); - - memset(sWork->array, 0, sWork->count * sizeof(struct OamUtil)); - FREE_AND_SET_NULL(sWork->array); - memset(sWork, 0, sizeof(*sWork)); - FREE_AND_SET_NULL(sWork); - - return TRUE; -} - -bool32 OamUtil_Update(void) -{ - u8 i = 0; - - if (sWork == NULL || sWork->array == NULL) - return FALSE; - - for (i = 0; i < sWork->count; i++) - { - if (sWork->array[i].active && sWork->array[i].allowUpdates) - { - if (sWork->array[i].callback != NULL) - sWork->array[i].callback(&sWork->array[i]); - - if (sWork->array[i].dummied) - { - memcpy(&gMain.oamBuffer[i + 64], &gDummyOamData, sizeof(struct OamData)); - } - else - { - sWork->array[i].oam.y = sWork->array[i].y + sWork->array[i].yDelta; - sWork->array[i].oam.x = sWork->array[i].x + sWork->array[i].xDelta; - sWork->array[i].oam.priority = sWork->array[i].priority; - sWork->array[i].oam.tileNum = sWork->array[i].tileNum; - memcpy(&gMain.oamBuffer[i + 64], &sWork->array[i], sizeof(struct OamData)); - } - } - } - - return TRUE; -} - -static bool32 SetAnimAndTileNum(struct OamUtil *structPtr, u8 animNum) -{ - u16 tileStart; - - if (structPtr == NULL) - return FALSE; - - tileStart = GetSpriteTileStartByTag(structPtr->tileTag); - if (tileStart == 0xFFFF) - return FALSE; - - structPtr->animNum = animNum; - structPtr->tileNum = (GetTilesPerImage(structPtr->oam.shape, structPtr->oam.size) * animNum) + tileStart; - return TRUE; -} - -u8 OamUtil_SetCallback(u8 id, void (*func)(struct OamUtil *)) -{ - if (sWork == NULL || id >= sWork->count) - return 0xFF; - else if (!sWork->array[id].active) - return 0xFF; - - sWork->array[id].callback = func; - return id; -} - -u8 OamUtil_SetData(u8 id, u8 dataArrayId, s16 dataValue) -{ - if (sWork == NULL || id >= sWork->count) - return 0xFF; - else if (!sWork->array[id].active || dataArrayId > ARRAY_COUNT(sWork->array[id].data) - 1) // - 1 b/c last slot is reserved for taskId - return 0xFF; - - sWork->array[id].data[dataArrayId] = dataValue; - return id; -} - -u8 OamUtil_AddNew(const struct OamData *oam, u16 tileTag, u16 palTag, s16 x, s16 y, u8 animNum, u8 priority) -{ - struct OamUtil *structPtr = NULL; - u8 i; - - if (sWork == NULL || oam == NULL) - return 0xFF; - - for (i = 0; i < sWork->count; i++) - { - if (!sWork->array[i].active) - { - structPtr = &sWork->array[i]; - memset(structPtr, 0, sizeof(*structPtr)); - structPtr->id = i; - structPtr->active = TRUE; - structPtr->allowUpdates = TRUE; - break; - } - } - - if (structPtr == NULL) - return 0xFF; - - memcpy(&structPtr->oam, oam, sizeof(*oam)); - structPtr->tileTag = tileTag; - structPtr->palTag = palTag; - structPtr->x = x; - structPtr->y = y; - structPtr->oam.paletteNum = IndexOfSpritePaletteTag(palTag); - if (priority < 4) - { - structPtr->priority = priority; - structPtr->oam.priority = priority; - } - SetAnimAndTileNum(structPtr, animNum); - - return structPtr->id; -} - -u8 OamUtil_Remove(u8 id) -{ - if (sWork == NULL || !sWork->array[id].active) - return 0xFF; - - memset(&sWork->array[id], 0, sizeof(struct OamUtil)); - sWork->array[id].oam.y = 160; - sWork->array[id].oam.x = 240; - sWork->array[id].dummied = TRUE; - memcpy(&gMain.oamBuffer[id + 64], &gDummyOamData, sizeof(struct OamData)); - return id; -} diff --git a/sym_ewram.txt b/sym_ewram.txt index d00f7953c..58fb0648e 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -103,7 +103,7 @@ .include "src/battle_transition.o" .include "src/battle_message.o" .include "src/cable_car.o" - .include "src/rom_81520A8.o" + .include "src/oam_util.o" .include "src/save.o" .include "src/mystery_event_script.o" .include "src/move_relearner.o" -- cgit v1.2.3 From 24569583e49e66fefd0aeaeac68d2ba9bf206145 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Wed, 17 Jun 2020 17:48:20 -0400 Subject: Document contest results --- .../scripts.inc | 4 +- .../scripts.inc | 4 +- data/maps/EverGrandeCity_DrakesRoom/scripts.inc | 2 +- data/maps/LilycoveCity_ContestLobby/scripts.inc | 16 +- .../LilycoveCity_LilycoveMuseum_2F/scripts.inc | 10 +- graphics/contest/clink_tilemap1.bin | Bin 40 -> 0 bytes graphics/contest/clink_tilemap10.bin | 1 - graphics/contest/clink_tilemap11.bin | Bin 24 -> 0 bytes graphics/contest/clink_tilemap2.bin | Bin 40 -> 0 bytes graphics/contest/clink_tilemap3.bin | Bin 40 -> 0 bytes graphics/contest/clink_tilemap4.bin | Bin 40 -> 0 bytes graphics/contest/clink_tilemap5.bin | Bin 20 -> 0 bytes graphics/contest/clink_tilemap6.bin | Bin 20 -> 0 bytes graphics/contest/clink_tilemap7.bin | 1 - graphics/contest/clink_tilemap8.bin | 1 - graphics/contest/clink_tilemap9.bin | 1 - graphics/contest/misc_2.pal | 259 ----- graphics/contest/misc_2.png | Bin 1775 -> 0 bytes graphics/contest/results_screen.bin | Bin 0 -> 24 bytes graphics/contest/results_screen.pal | 259 +++++ graphics/contest/results_screen.png | Bin 0 -> 1775 bytes graphics/contest/results_screen_beauty.bin | 1 + graphics/contest/results_screen_cool.bin | Bin 0 -> 20 bytes graphics/contest/results_screen_cute.bin | 1 + graphics/contest/results_screen_hyper.bin | Bin 0 -> 40 bytes graphics/contest/results_screen_link.bin | Bin 0 -> 20 bytes graphics/contest/results_screen_master.bin | Bin 0 -> 40 bytes graphics/contest/results_screen_normal.bin | Bin 0 -> 40 bytes graphics/contest/results_screen_smart.bin | 1 + graphics/contest/results_screen_super.bin | Bin 0 -> 40 bytes graphics/contest/results_screen_tough.bin | 1 + include/constants/contest.h | 17 + include/constants/field_specials.h | 5 + include/constants/global.h | 1 + include/contest.h | 5 +- include/contest_link_80F57C4.h | 4 +- include/global.h | 2 +- include/graphics.h | 28 +- include/strings.h | 2 +- src/contest.c | 66 +- src/contest_link_80F57C4.c | 1220 ++++++++++---------- src/contest_link_80FC4F4.c | 8 +- src/contest_painting.c | 18 +- src/field_specials.c | 10 +- src/graphics.c | 32 +- src/scrcmd.c | 8 +- src/script_pokemon_util_80F87D8.c | 4 +- src/secret_base.c | 3 +- src/strings.c | 2 +- 49 files changed, 1040 insertions(+), 957 deletions(-) delete mode 100644 graphics/contest/clink_tilemap1.bin delete mode 100644 graphics/contest/clink_tilemap10.bin delete mode 100644 graphics/contest/clink_tilemap11.bin delete mode 100644 graphics/contest/clink_tilemap2.bin delete mode 100644 graphics/contest/clink_tilemap3.bin delete mode 100644 graphics/contest/clink_tilemap4.bin delete mode 100644 graphics/contest/clink_tilemap5.bin delete mode 100644 graphics/contest/clink_tilemap6.bin delete mode 100644 graphics/contest/clink_tilemap7.bin delete mode 100644 graphics/contest/clink_tilemap8.bin delete mode 100644 graphics/contest/clink_tilemap9.bin delete mode 100644 graphics/contest/misc_2.pal delete mode 100644 graphics/contest/misc_2.png create mode 100644 graphics/contest/results_screen.bin create mode 100644 graphics/contest/results_screen.pal create mode 100644 graphics/contest/results_screen.png create mode 100644 graphics/contest/results_screen_beauty.bin create mode 100644 graphics/contest/results_screen_cool.bin create mode 100644 graphics/contest/results_screen_cute.bin create mode 100644 graphics/contest/results_screen_hyper.bin create mode 100644 graphics/contest/results_screen_link.bin create mode 100644 graphics/contest/results_screen_master.bin create mode 100644 graphics/contest/results_screen_normal.bin create mode 100644 graphics/contest/results_screen_smart.bin create mode 100644 graphics/contest/results_screen_super.bin create mode 100644 graphics/contest/results_screen_tough.bin diff --git a/data/maps/BattleFrontier_BattleTowerBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleTowerBattleRoom/scripts.inc index 029009294..89eaeda50 100644 --- a/data/maps/BattleFrontier_BattleTowerBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerBattleRoom/scripts.inc @@ -45,7 +45,7 @@ BattleFrontier_BattleTowerBattleRoom_EventScript_OpponentEnter:: @ 8241BC3 BattleFrontier_BattleTower_EventScript_WarpToLobbyLost:: @ 8241C03 frontier_set FRONTIER_DATA_CHALLENGE_STATUS, CHALLENGE_STATUS_LOST tower_set TOWER_DATA_LVL_MODE - setvar VAR_0x8004, 3 + setvar VAR_0x8004, FANCOUNTER_USED_BATTLE_TOWER special Script_TryGainNewFanFromCounter goto BattleFrontier_BattleTowerBattleRoom_EventScript_WarpToLobby @@ -134,7 +134,7 @@ BattleFrontier_BattleTowerBattleRoom_EventScript_ContinueChallenge:: @ 8241DDC BattleFrontier_BattleTowerBattleRoom_EventScript_WarpToLobbyWon:: @ 8241DF6 frontier_set FRONTIER_DATA_CHALLENGE_STATUS, CHALLENGE_STATUS_WON tower_set TOWER_DATA_LVL_MODE - setvar VAR_0x8004, 3 + setvar VAR_0x8004, FANCOUNTER_USED_BATTLE_TOWER special Script_TryGainNewFanFromCounter goto BattleFrontier_BattleTowerBattleRoom_EventScript_WarpToLobby diff --git a/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc index 3c549a919..754384136 100644 --- a/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc @@ -103,7 +103,7 @@ BattleFrontier_BattleTowerMultiBattleRoom_EventScript_DoTowerBattle:: @ 8249069 BattleFrontier_BattleTowerMultiBattleRoom_EventScript_WarpToLobbyLost:: @ 824907E frontier_set FRONTIER_DATA_CHALLENGE_STATUS, CHALLENGE_STATUS_LOST tower_set TOWER_DATA_LVL_MODE - setvar VAR_0x8004, 3 + setvar VAR_0x8004, FANCOUNTER_USED_BATTLE_TOWER special Script_TryGainNewFanFromCounter goto BattleFrontier_BattleTowerBattleRoom_EventScript_WarpToLobby @@ -208,7 +208,7 @@ BattleFrontier_BattleTowerMultiBattleRoom_EventScript_ContinueChallenge:: @ 8249 BattleFrontier_BattleTowerMultiBattleRoom_EventScript_WarpToLobbyWon:: @ 82492AF frontier_set FRONTIER_DATA_CHALLENGE_STATUS, CHALLENGE_STATUS_WON tower_set TOWER_DATA_LVL_MODE - setvar VAR_0x8004, 3 + setvar VAR_0x8004, FANCOUNTER_USED_BATTLE_TOWER special Script_TryGainNewFanFromCounter goto BattleFrontier_BattleTowerBattleRoom_EventScript_WarpToLobby diff --git a/data/maps/EverGrandeCity_DrakesRoom/scripts.inc b/data/maps/EverGrandeCity_DrakesRoom/scripts.inc index 2ae78caad..b9debf676 100644 --- a/data/maps/EverGrandeCity_DrakesRoom/scripts.inc +++ b/data/maps/EverGrandeCity_DrakesRoom/scripts.inc @@ -54,7 +54,7 @@ EverGrandeCity_DrakesRoom_EventScript_PostBattleSpeech:: @ 822871A end EverGrandeCity_DrakesRoom_EventScript_Defeated:: @ 8228724 - setvar VAR_0x8004, 0 + setvar VAR_0x8004, FANCOUNTER_DEFEATED_DRAKE special Script_TryGainNewFanFromCounter setflag FLAG_DEFEATED_ELITE_4_DRAKE call PokemonLeague_EliteFour_SetAdvanceToNextRoomMetatiles diff --git a/data/maps/LilycoveCity_ContestLobby/scripts.inc b/data/maps/LilycoveCity_ContestLobby/scripts.inc index 12b598346..9f63da98c 100644 --- a/data/maps/LilycoveCity_ContestLobby/scripts.inc +++ b/data/maps/LilycoveCity_ContestLobby/scripts.inc @@ -43,7 +43,7 @@ LilycoveCity_ContestLobby_EventScript_ContestArtist:: @ 821A264 msgbox LilycoveCity_ContestLobby_Text_YourPokemonSpurredMeToPaint, MSGBOX_DEFAULT lockall fadescreen FADE_TO_BLACK - showcontestwinner 0 + showcontestwinner CONTEST_WINNER_ARTIST lockall msgbox LilycoveCity_ContestLobby_Text_ShouldITakePaintingToMuseum, MSGBOX_YESNO compare VAR_RESULT, YES @@ -217,7 +217,7 @@ LilycoveCity_ContestLobby_EventScript_LinkContestArtist:: @ 821A436 msgbox LilycoveCity_ContestLobby_Text_YourPokemonSpurredMeToPaint, MSGBOX_DEFAULT lockall fadescreen FADE_TO_BLACK - showcontestwinner 0 + showcontestwinner CONTEST_WINNER_ARTIST msgbox LilycoveCity_ContestLobby_Text_ShouldITakePaintingToMuseum, MSGBOX_YESNO compare VAR_RESULT, YES goto_if_eq LilycoveCity_ContestLobby_EventScript_TakePaintingToMuseumLink @@ -505,42 +505,42 @@ LilycoveCity_ContestLobby_EventScript_NinjaBoy:: @ 821A735 LilycoveCity_ContestLobby_EventScript_ContestWinner1:: @ 821A73E lockall fadescreen FADE_TO_BLACK - showcontestwinner 1 + showcontestwinner CONTEST_WINNER_HALL_1 releaseall end LilycoveCity_ContestLobby_EventScript_ContestWinner2:: @ 821A745 lockall fadescreen FADE_TO_BLACK - showcontestwinner 2 + showcontestwinner CONTEST_WINNER_HALL_2 releaseall end LilycoveCity_ContestLobby_EventScript_ContestWinner3:: @ 821A74C lockall fadescreen FADE_TO_BLACK - showcontestwinner 3 + showcontestwinner CONTEST_WINNER_HALL_3 releaseall end LilycoveCity_ContestLobby_EventScript_ContestWinner4:: @ 821A753 lockall fadescreen FADE_TO_BLACK - showcontestwinner 4 + showcontestwinner CONTEST_WINNER_HALL_4 releaseall end LilycoveCity_ContestLobby_EventScript_ContestWinner5:: @ 821A75A lockall fadescreen FADE_TO_BLACK - showcontestwinner 5 + showcontestwinner CONTEST_WINNER_HALL_5 releaseall end LilycoveCity_ContestLobby_EventScript_ContestWinner6:: @ 821A761 lockall fadescreen FADE_TO_BLACK - showcontestwinner 6 + showcontestwinner CONTEST_WINNER_HALL_6 releaseall end diff --git a/data/maps/LilycoveCity_LilycoveMuseum_2F/scripts.inc b/data/maps/LilycoveCity_LilycoveMuseum_2F/scripts.inc index 5d45ed144..257bdd086 100644 --- a/data/maps/LilycoveCity_LilycoveMuseum_2F/scripts.inc +++ b/data/maps/LilycoveCity_LilycoveMuseum_2F/scripts.inc @@ -183,35 +183,35 @@ LilycoveCity_LilycoveMuseum_2F_EventScript_RichBoy:: @ 821999C LilycoveCity_LilycoveMuseum_2F_EventScript_ShowCoolPainting:: @ 82199A5 msgbox LilycoveCity_LilycoveMuseum_2F_Text_ItsPaintingOfPokemon, MSGBOX_SIGN fadescreen FADE_TO_BLACK - showcontestwinner 9 + showcontestwinner CONTEST_WINNER_MUSEUM_COOL releaseall end LilycoveCity_LilycoveMuseum_2F_EventScript_ShowBeautyPainting:: @ 82199B3 msgbox LilycoveCity_LilycoveMuseum_2F_Text_ItsPaintingOfPokemon, MSGBOX_SIGN fadescreen FADE_TO_BLACK - showcontestwinner 10 + showcontestwinner CONTEST_WINNER_MUSEUM_BEAUTY releaseall end LilycoveCity_LilycoveMuseum_2F_EventScript_ShowCutePainting:: @ 82199C1 msgbox LilycoveCity_LilycoveMuseum_2F_Text_ItsPaintingOfPokemon, MSGBOX_SIGN fadescreen FADE_TO_BLACK - showcontestwinner 11 + showcontestwinner CONTEST_WINNER_MUSEUM_CUTE releaseall end LilycoveCity_LilycoveMuseum_2F_EventScript_ShowSmartPainting:: @ 82199CF msgbox LilycoveCity_LilycoveMuseum_2F_Text_ItsPaintingOfPokemon, MSGBOX_SIGN fadescreen FADE_TO_BLACK - showcontestwinner 12 + showcontestwinner CONTEST_WINNER_MUSEUM_SMART releaseall end LilycoveCity_LilycoveMuseum_2F_EventScript_ShowToughPainting:: @ 82199DD msgbox LilycoveCity_LilycoveMuseum_2F_Text_ItsPaintingOfPokemon, MSGBOX_SIGN fadescreen FADE_TO_BLACK - showcontestwinner 13 + showcontestwinner CONTEST_WINNER_MUSEUM_TOUGH releaseall end diff --git a/graphics/contest/clink_tilemap1.bin b/graphics/contest/clink_tilemap1.bin deleted file mode 100644 index e22f21839..000000000 Binary files a/graphics/contest/clink_tilemap1.bin and /dev/null differ diff --git a/graphics/contest/clink_tilemap10.bin b/graphics/contest/clink_tilemap10.bin deleted file mode 100644 index 2a91bb78d..000000000 --- a/graphics/contest/clink_tilemap10.bin +++ /dev/null @@ -1 +0,0 @@ -å@æ@ç@è@é@õ@ö@÷@ø@ù@ \ No newline at end of file diff --git a/graphics/contest/clink_tilemap11.bin b/graphics/contest/clink_tilemap11.bin deleted file mode 100644 index 3b46e00b8..000000000 Binary files a/graphics/contest/clink_tilemap11.bin and /dev/null differ diff --git a/graphics/contest/clink_tilemap2.bin b/graphics/contest/clink_tilemap2.bin deleted file mode 100644 index 21c804d12..000000000 Binary files a/graphics/contest/clink_tilemap2.bin and /dev/null differ diff --git a/graphics/contest/clink_tilemap3.bin b/graphics/contest/clink_tilemap3.bin deleted file mode 100644 index d4bb7bae7..000000000 Binary files a/graphics/contest/clink_tilemap3.bin and /dev/null differ diff --git a/graphics/contest/clink_tilemap4.bin b/graphics/contest/clink_tilemap4.bin deleted file mode 100644 index 32f24abd6..000000000 Binary files a/graphics/contest/clink_tilemap4.bin and /dev/null differ diff --git a/graphics/contest/clink_tilemap5.bin b/graphics/contest/clink_tilemap5.bin deleted file mode 100644 index cc07b0f1a..000000000 Binary files a/graphics/contest/clink_tilemap5.bin and /dev/null differ diff --git a/graphics/contest/clink_tilemap6.bin b/graphics/contest/clink_tilemap6.bin deleted file mode 100644 index f3939831e..000000000 Binary files a/graphics/contest/clink_tilemap6.bin and /dev/null differ diff --git a/graphics/contest/clink_tilemap7.bin b/graphics/contest/clink_tilemap7.bin deleted file mode 100644 index fe02ec0b5..000000000 --- a/graphics/contest/clink_tilemap7.bin +++ /dev/null @@ -1 +0,0 @@ -ÅÆÇÈÉÕÖ×ØÙ \ No newline at end of file diff --git a/graphics/contest/clink_tilemap8.bin b/graphics/contest/clink_tilemap8.bin deleted file mode 100644 index d37d6df3c..000000000 --- a/graphics/contest/clink_tilemap8.bin +++ /dev/null @@ -1 +0,0 @@ -Ê Ë Ì Í Î Ú Û Ü Ý Þ \ No newline at end of file diff --git a/graphics/contest/clink_tilemap9.bin b/graphics/contest/clink_tilemap9.bin deleted file mode 100644 index 79d2e3fbb..000000000 --- a/graphics/contest/clink_tilemap9.bin +++ /dev/null @@ -1 +0,0 @@ -à0á0â0ã0ä0ð0ñ0ò0ó0ô0 \ No newline at end of file diff --git a/graphics/contest/misc_2.pal b/graphics/contest/misc_2.pal deleted file mode 100644 index 869aef9e1..000000000 --- a/graphics/contest/misc_2.pal +++ /dev/null @@ -1,259 +0,0 @@ -JASC-PAL -0100 -256 -0 0 0 -255 255 255 -189 189 197 -131 131 139 -98 98 123 -65 74 106 -41 49 90 -255 106 115 -255 57 57 -205 32 0 -246 213 0 -255 123 98 -156 180 90 -164 148 57 -90 106 139 -180 172 82 -0 0 0 -255 255 255 -189 189 197 -131 131 139 -98 98 123 -65 74 106 -41 49 90 -164 222 255 -106 148 255 -24 57 205 -246 213 0 -255 123 98 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -255 255 255 -189 189 197 -131 131 139 -98 98 123 -65 74 106 -41 49 90 -255 197 255 -255 139 255 -213 0 139 -246 213 0 -255 123 98 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -255 255 255 -189 189 197 -131 131 139 -98 98 123 -65 74 106 -41 49 90 -180 255 197 -148 255 164 -65 172 57 -246 213 0 -255 123 98 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -255 255 255 -189 189 197 -131 131 139 -98 98 123 -65 74 106 -41 49 90 -255 255 164 -246 213 0 -230 106 0 -246 213 0 -255 123 98 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -197 255 255 -255 255 255 -213 213 213 -131 131 139 -98 98 123 -65 74 106 -41 49 90 -164 222 255 -106 148 255 -49 82 255 -180 255 197 -148 255 164 -65 172 57 -0 0 0 -0 0 0 -0 0 0 -197 255 255 -255 255 255 -213 213 213 -131 131 139 -98 98 123 -65 74 106 -41 49 90 -255 139 230 -255 139 230 -255 49 156 -255 255 0 -255 255 0 -189 172 0 -41 49 90 -41 49 90 -0 0 0 -197 123 131 -255 255 255 -230 246 255 -205 238 255 -180 238 255 -156 230 255 -139 230 255 -255 205 230 -255 255 139 -255 230 255 -255 255 197 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -197 255 255 -255 255 255 -213 213 213 -131 131 139 -98 98 123 -65 74 106 -41 49 90 -255 172 197 -255 172 172 -255 180 148 -255 189 123 -255 197 98 -255 205 82 -156 156 156 -156 156 156 -156 156 156 -197 255 255 -255 255 255 -213 213 213 -131 131 139 -98 98 123 -65 74 106 -41 49 90 -164 222 255 -106 148 255 -49 82 255 -180 255 197 -148 255 164 -65 172 57 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -164 222 255 -106 230 222 -49 238 189 -0 255 156 -0 255 156 -82 255 98 -164 255 49 -255 255 0 -255 172 16 -255 90 32 -255 8 57 -230 57 106 -205 115 156 -180 164 205 -164 222 255 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/contest/misc_2.png b/graphics/contest/misc_2.png deleted file mode 100644 index 106b975cf..000000000 Binary files a/graphics/contest/misc_2.png and /dev/null differ diff --git a/graphics/contest/results_screen.bin b/graphics/contest/results_screen.bin new file mode 100644 index 000000000..3b46e00b8 Binary files /dev/null and b/graphics/contest/results_screen.bin differ diff --git a/graphics/contest/results_screen.pal b/graphics/contest/results_screen.pal new file mode 100644 index 000000000..869aef9e1 --- /dev/null +++ b/graphics/contest/results_screen.pal @@ -0,0 +1,259 @@ +JASC-PAL +0100 +256 +0 0 0 +255 255 255 +189 189 197 +131 131 139 +98 98 123 +65 74 106 +41 49 90 +255 106 115 +255 57 57 +205 32 0 +246 213 0 +255 123 98 +156 180 90 +164 148 57 +90 106 139 +180 172 82 +0 0 0 +255 255 255 +189 189 197 +131 131 139 +98 98 123 +65 74 106 +41 49 90 +164 222 255 +106 148 255 +24 57 205 +246 213 0 +255 123 98 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +255 255 255 +189 189 197 +131 131 139 +98 98 123 +65 74 106 +41 49 90 +255 197 255 +255 139 255 +213 0 139 +246 213 0 +255 123 98 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +255 255 255 +189 189 197 +131 131 139 +98 98 123 +65 74 106 +41 49 90 +180 255 197 +148 255 164 +65 172 57 +246 213 0 +255 123 98 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +255 255 255 +189 189 197 +131 131 139 +98 98 123 +65 74 106 +41 49 90 +255 255 164 +246 213 0 +230 106 0 +246 213 0 +255 123 98 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +197 255 255 +255 255 255 +213 213 213 +131 131 139 +98 98 123 +65 74 106 +41 49 90 +164 222 255 +106 148 255 +49 82 255 +180 255 197 +148 255 164 +65 172 57 +0 0 0 +0 0 0 +0 0 0 +197 255 255 +255 255 255 +213 213 213 +131 131 139 +98 98 123 +65 74 106 +41 49 90 +255 139 230 +255 139 230 +255 49 156 +255 255 0 +255 255 0 +189 172 0 +41 49 90 +41 49 90 +0 0 0 +197 123 131 +255 255 255 +230 246 255 +205 238 255 +180 238 255 +156 230 255 +139 230 255 +255 205 230 +255 255 139 +255 230 255 +255 255 197 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +197 255 255 +255 255 255 +213 213 213 +131 131 139 +98 98 123 +65 74 106 +41 49 90 +255 172 197 +255 172 172 +255 180 148 +255 189 123 +255 197 98 +255 205 82 +156 156 156 +156 156 156 +156 156 156 +197 255 255 +255 255 255 +213 213 213 +131 131 139 +98 98 123 +65 74 106 +41 49 90 +164 222 255 +106 148 255 +49 82 255 +180 255 197 +148 255 164 +65 172 57 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +164 222 255 +106 230 222 +49 238 189 +0 255 156 +0 255 156 +82 255 98 +164 255 49 +255 255 0 +255 172 16 +255 90 32 +255 8 57 +230 57 106 +205 115 156 +180 164 205 +164 222 255 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/contest/results_screen.png b/graphics/contest/results_screen.png new file mode 100644 index 000000000..106b975cf Binary files /dev/null and b/graphics/contest/results_screen.png differ diff --git a/graphics/contest/results_screen_beauty.bin b/graphics/contest/results_screen_beauty.bin new file mode 100644 index 000000000..fe02ec0b5 --- /dev/null +++ b/graphics/contest/results_screen_beauty.bin @@ -0,0 +1 @@ +ÅÆÇÈÉÕÖ×ØÙ \ No newline at end of file diff --git a/graphics/contest/results_screen_cool.bin b/graphics/contest/results_screen_cool.bin new file mode 100644 index 000000000..f3939831e Binary files /dev/null and b/graphics/contest/results_screen_cool.bin differ diff --git a/graphics/contest/results_screen_cute.bin b/graphics/contest/results_screen_cute.bin new file mode 100644 index 000000000..d37d6df3c --- /dev/null +++ b/graphics/contest/results_screen_cute.bin @@ -0,0 +1 @@ +Ê Ë Ì Í Î Ú Û Ü Ý Þ \ No newline at end of file diff --git a/graphics/contest/results_screen_hyper.bin b/graphics/contest/results_screen_hyper.bin new file mode 100644 index 000000000..d4bb7bae7 Binary files /dev/null and b/graphics/contest/results_screen_hyper.bin differ diff --git a/graphics/contest/results_screen_link.bin b/graphics/contest/results_screen_link.bin new file mode 100644 index 000000000..cc07b0f1a Binary files /dev/null and b/graphics/contest/results_screen_link.bin differ diff --git a/graphics/contest/results_screen_master.bin b/graphics/contest/results_screen_master.bin new file mode 100644 index 000000000..32f24abd6 Binary files /dev/null and b/graphics/contest/results_screen_master.bin differ diff --git a/graphics/contest/results_screen_normal.bin b/graphics/contest/results_screen_normal.bin new file mode 100644 index 000000000..e22f21839 Binary files /dev/null and b/graphics/contest/results_screen_normal.bin differ diff --git a/graphics/contest/results_screen_smart.bin b/graphics/contest/results_screen_smart.bin new file mode 100644 index 000000000..79d2e3fbb --- /dev/null +++ b/graphics/contest/results_screen_smart.bin @@ -0,0 +1 @@ +à0á0â0ã0ä0ð0ñ0ò0ó0ô0 \ No newline at end of file diff --git a/graphics/contest/results_screen_super.bin b/graphics/contest/results_screen_super.bin new file mode 100644 index 000000000..21c804d12 Binary files /dev/null and b/graphics/contest/results_screen_super.bin differ diff --git a/graphics/contest/results_screen_tough.bin b/graphics/contest/results_screen_tough.bin new file mode 100644 index 000000000..2a91bb78d --- /dev/null +++ b/graphics/contest/results_screen_tough.bin @@ -0,0 +1 @@ +å@æ@ç@è@é@õ@ö@÷@ø@ù@ \ No newline at end of file diff --git a/include/constants/contest.h b/include/constants/contest.h index 186c56e2b..2de2866a3 100644 --- a/include/constants/contest.h +++ b/include/constants/contest.h @@ -29,6 +29,23 @@ #define CONTEST_CATEGORY_TOUGH 4 #define CONTEST_CATEGORIES_COUNT 5 +#define CONTEST_WINNER_ARTIST 0 // Winner shown by the artist, painting not necessarily saved +#define CONTEST_WINNER_HALL_1 1 +#define CONTEST_WINNER_HALL_2 2 +#define CONTEST_WINNER_HALL_3 3 +#define CONTEST_WINNER_HALL_4 4 +#define CONTEST_WINNER_HALL_5 5 +#define CONTEST_WINNER_HALL_6 6 +#define NUM_CONTEST_HALL_WINNERS 6 +#define CONTEST_WINNER_7 7 +#define CONTEST_WINNER_8 8 +#define CONTEST_WINNER_MUSEUM_COOL 9 +#define CONTEST_WINNER_MUSEUM_BEAUTY 10 +#define CONTEST_WINNER_MUSEUM_CUTE 11 +#define CONTEST_WINNER_MUSEUM_SMART 12 +#define CONTEST_WINNER_MUSEUM_TOUGH 13 +// NUM_CONTEST_WINNERS in constants/global.h + #define CANT_ENTER_CONTEST 0 #define CAN_ENTER_CONTEST_EQUAL_RANK 1 #define CAN_ENTER_CONTEST_HIGH_RANK 2 diff --git a/include/constants/field_specials.h b/include/constants/field_specials.h index a2dc117e4..a01151378 100644 --- a/include/constants/field_specials.h +++ b/include/constants/field_specials.h @@ -75,4 +75,9 @@ #define FANCLUB_MEMBER7 14 #define FANCLUB_MEMBER8 15 +#define FANCOUNTER_DEFEATED_DRAKE 0 +#define FANCOUNTER_BATTLED_AT_BASE 1 +#define FANCOUNTER_FINISHED_CONTEST 2 +#define FANCOUNTER_USED_BATTLE_TOWER 3 + #endif // GUARD_CONSTANTS_FIELD_SPECIALS_H diff --git a/include/constants/global.h b/include/constants/global.h index c7063d71c..2f4ede229 100644 --- a/include/constants/global.h +++ b/include/constants/global.h @@ -52,6 +52,7 @@ #define APPRENTICE_COUNT 4 #define APPRENTICE_MAX_QUESTIONS 9 #define MAX_REMATCH_ENTRIES 100 // only REMATCH_TABLE_ENTRIES (78) are used +#define NUM_CONTEST_WINNERS 13 #define PYRAMID_BAG_ITEMS_COUNT 10 #define HALL_FACILITIES_COUNT 9 // 7 facilities for single mode + tower double mode + tower multi mode. diff --git a/include/contest.h b/include/contest.h index 00c3191eb..a9b1db9ee 100644 --- a/include/contest.h +++ b/include/contest.h @@ -430,9 +430,9 @@ struct ContestResources extern struct ContestPokemon gContestMons[CONTESTANT_COUNT]; extern s16 gContestMonConditions[CONTESTANT_COUNT]; -extern s16 gUnknown_02039F08[CONTESTANT_COUNT]; +extern s16 gContestMonTotalPoints[CONTESTANT_COUNT]; extern s16 gUnknown_02039F10[CONTESTANT_COUNT]; -extern s16 gUnknown_02039F18[CONTESTANT_COUNT]; +extern s16 gContestMonRound2Points[CONTESTANT_COUNT]; extern u8 gContestFinalStandings[CONTESTANT_COUNT]; extern u8 gContestMonPartyIndex; extern u8 gContestPlayerMonIndex; @@ -448,7 +448,6 @@ extern u8 sContestBgCopyFlags; extern struct ContestWinner gCurContestWinner; extern u8 gUnknown_02039F5C; extern u8 gUnknown_02039F5D; - extern u32 gContestRngValue; // contest.c diff --git a/include/contest_link_80F57C4.h b/include/contest_link_80F57C4.h index add3ae62f..8bbc0f14b 100644 --- a/include/contest_link_80F57C4.h +++ b/include/contest_link_80F57C4.h @@ -5,8 +5,8 @@ void BufferContestantTrainerName(void); void BufferContestantMonNickname(void); void StartContest(void); void BufferContestantMonSpecies(void); -void sub_80F8484(void); -void sub_80F84C4(u8); +void ShowContestResults(void); +void ContestLinkTransfer(u8); void sub_80FC998(u8 taskId); #endif // GUARD_CONTEST_LINK_80F57C4_H diff --git a/include/global.h b/include/global.h index 2b03ebbe1..03b6f47bf 100644 --- a/include/global.h +++ b/include/global.h @@ -960,7 +960,7 @@ struct SaveBlock1 /*0x2E20*/ u8 additionalPhrases[8]; // bitfield for 33 additional phrases in easy chat system /*0x2E28*/ OldMan oldMan; /*0x2e64*/ struct EasyChatPair easyChatPairs[5]; //Dewford trend [0] and some other stuff - /*0x2e90*/ struct ContestWinner contestWinners[13]; // 0 - 5 used in contest hall, 6 - 7 unused?, 8 - 12 museum + /*0x2e90*/ struct ContestWinner contestWinners[NUM_CONTEST_WINNERS]; // see CONTEST_WINNER_* /*0x3030*/ struct DayCare daycare; /*0x3150*/ struct LinkBattleRecords linkBattleRecords; /*0x31A8*/ u8 giftRibbons[52]; diff --git a/include/graphics.h b/include/graphics.h index 99d396df2..186d381db 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4927,23 +4927,23 @@ extern const u32 gRouletteCreditTiles[]; extern const u32 gRouletteNumbersTiles[]; extern const u32 gRouletteMultiplierTiles[]; -// Contest Link -extern const u32 gUnknown_08C19588[]; +// Contest util +extern const u32 gContestResults_Gfx[]; extern const u32 gUnknown_08C19EEC[]; extern const u32 gUnknown_08C1A000[]; extern const u32 gUnknown_08C1A12C[]; -extern const u32 gUnknown_08C1A2B4[]; -extern const u16 gUnknown_08DC6498[]; -extern const u16 gUnknown_08DC63F8[]; -extern const u16 gUnknown_08DC6420[]; -extern const u16 gUnknown_08DC6448[]; -extern const u16 gUnknown_08DC6470[]; -extern const u16 gUnknown_08DC64AC[]; -extern const u16 gUnknown_08DC64C0[]; -extern const u16 gUnknown_08DC64D4[]; -extern const u16 gUnknown_08DC64E8[]; -extern const u16 gUnknown_08DC64FC[]; -extern const u16 gUnknown_08DC6510[]; +extern const u32 gContestResults_Pal[]; +extern const u16 gLinkContestResults_Tilemap[]; +extern const u16 gNormalContestResults_Tilemap[]; +extern const u16 gSuperContestResults_Tilemap[]; +extern const u16 gHyperContestResults_Tilemap[]; +extern const u16 gMasterContestResults_Tilemap[]; +extern const u16 gCoolContestResults_Tilemap[]; +extern const u16 gBeautyContestResults_Tilemap[]; +extern const u16 gCuteContestResults_Tilemap[]; +extern const u16 gSmartContestResults_Tilemap[]; +extern const u16 gToughContestResults_Tilemap[]; +extern const u16 gContestResults_Tilemap[]; // Trainer Card. extern const u16 gHoennTrainerCard0Star_Pal[]; diff --git a/include/strings.h b/include/strings.h index 5720598ad..408eafbd7 100644 --- a/include/strings.h +++ b/include/strings.h @@ -2494,7 +2494,7 @@ extern const u8 gText_CommunicationStandby[]; extern const u8 gText_AnnouncingResults[]; extern const u8 gText_PreliminaryResults[]; extern const u8 gText_Round2Results[]; -extern const u8 gText_Var1sVar2Won[]; +extern const u8 gText_ContestantsMonWon[]; // Trainer Card extern const u8 gText_LinkCableBattles[]; diff --git a/src/contest.c b/src/contest.c index 58628e35d..a43b87679 100644 --- a/src/contest.c +++ b/src/contest.c @@ -155,7 +155,7 @@ static void Contest_StartTextPrinter(const u8 *, u32); static void ContestBG_FillBoxWithIncrementingTile(u8, u16, u8, u8, u8, u8, u8, s16); static bool32 Contest_RunTextPrinters(void); static void Contest_SetBgCopyFlags(u32 flagIndex); -static void sub_80DBD18(void); +static void CalculateFinalScores(void); static void sub_80DD080(u8); static void sub_80DE9DC(u8); static void sub_80DCBE8(u8, u8); @@ -184,7 +184,7 @@ static void sub_80DC3AC(void); static bool8 sub_80DC3C4(void); static void ContestBG_FillBoxWithTile(u8, u16, u8, u8, u8, u8, u8); static void Contest_PrintTextToBg0WindowStd(u32, const u8 *); -static s16 sub_80DBD34(u8); +static s16 GetContestantRound2Points(u8); static void DetermineFinalStandings(void); static bool8 sub_80DBF30(s32, s32, struct UnknownContestStruct6 *); static void sub_80DC0F4(u8); @@ -221,9 +221,9 @@ static void SwapMoveDescAndContestTilemaps(void); // EWRAM vars. EWRAM_DATA struct ContestPokemon gContestMons[CONTESTANT_COUNT] = {0}; EWRAM_DATA s16 gContestMonConditions[CONTESTANT_COUNT] = {0}; -EWRAM_DATA s16 gUnknown_02039F08[CONTESTANT_COUNT] = {0}; +EWRAM_DATA s16 gContestMonTotalPoints[CONTESTANT_COUNT] = {0}; EWRAM_DATA s16 gUnknown_02039F10[CONTESTANT_COUNT] = {0}; -EWRAM_DATA s16 gUnknown_02039F18[CONTESTANT_COUNT] = {0}; +EWRAM_DATA s16 gContestMonRound2Points[CONTESTANT_COUNT] = {0}; EWRAM_DATA u8 gContestFinalStandings[CONTESTANT_COUNT] = {0}; EWRAM_DATA u8 gContestMonPartyIndex = 0; EWRAM_DATA u8 gContestPlayerMonIndex = 0; @@ -239,7 +239,7 @@ EWRAM_DATA u8 gHighestRibbonRank = 0; EWRAM_DATA struct ContestResources *gContestResources = NULL; EWRAM_DATA u8 sContestBgCopyFlags = 0; EWRAM_DATA struct ContestWinner gCurContestWinner = {0}; -EWRAM_DATA u8 gUnknown_02039F5C = 0; +EWRAM_DATA bool8 gUnknown_02039F5C = 0; EWRAM_DATA u8 gUnknown_02039F5D = 0; // IWRAM common vars. @@ -2490,7 +2490,7 @@ static void sub_80DA5E8(u8 taskId) gBattle_BG2_Y = 0; for (i = 0; i < CONTESTANT_COUNT; i++) gUnknown_02039F10[i] = eContestantStatus[i].pointTotal; - sub_80DBD18(); + CalculateFinalScores(); ContestClearGeneralTextWindow(); if (!(gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK)) BravoTrainerPokemonProfile_BeforeInterview1(eContestantStatus[gContestPlayerMonIndex].prevMove); @@ -3367,22 +3367,22 @@ bool8 Contest_IsMonsTurnDisabled(u8 a) return FALSE; } -static void sub_80DBCE0(u8 contestant) +static void CalculateTotalPointsForContestant(u8 contestant) { - gUnknown_02039F18[contestant] = sub_80DBD34(contestant); - gUnknown_02039F08[contestant] = gContestMonConditions[contestant] + gUnknown_02039F18[contestant]; + gContestMonRound2Points[contestant] = GetContestantRound2Points(contestant); + gContestMonTotalPoints[contestant] = gContestMonConditions[contestant] + gContestMonRound2Points[contestant]; } -static void sub_80DBD18(void) +static void CalculateFinalScores(void) { s32 i; for (i = 0; i < CONTESTANT_COUNT; i++) - sub_80DBCE0(i); + CalculateTotalPointsForContestant(i); DetermineFinalStandings(); } -static s16 sub_80DBD34(u8 contestant) +static s16 GetContestantRound2Points(u8 contestant) { return gUnknown_02039F10[contestant] * 2; } @@ -3411,7 +3411,7 @@ static void DetermineFinalStandings(void) for (i = 0; i < CONTESTANT_COUNT; i++) { - sp8[i].unk0 = gUnknown_02039F08[i]; + sp8[i].unk0 = gContestMonTotalPoints[i]; sp8[i].unk4 = gContestMonConditions[i]; sp8[i].unk8 = randomOrdering[i]; sp8[i].unkC = i; @@ -5313,22 +5313,22 @@ bool8 sub_80DEDA8(u8 rank) } if (rank != 0xFE) { - u8 r4 = sub_80DEFA8(rank, 1); + u8 id = sub_80DEFA8(rank, 1); - gSaveBlock1Ptr->contestWinners[r4].personality = gContestMons[i].personality; - gSaveBlock1Ptr->contestWinners[r4].species = gContestMons[i].species; - gSaveBlock1Ptr->contestWinners[r4].trainerId = gContestMons[i].otId; - StringCopy(gSaveBlock1Ptr->contestWinners[r4].monName, gContestMons[i].nickname); - StringCopy(gSaveBlock1Ptr->contestWinners[r4].trainerName, gContestMons[i].trainerName); + gSaveBlock1Ptr->contestWinners[id].personality = gContestMons[i].personality; + gSaveBlock1Ptr->contestWinners[id].species = gContestMons[i].species; + gSaveBlock1Ptr->contestWinners[id].trainerId = gContestMons[i].otId; + StringCopy(gSaveBlock1Ptr->contestWinners[id].monName, gContestMons[i].nickname); + StringCopy(gSaveBlock1Ptr->contestWinners[id].trainerName, gContestMons[i].trainerName); if(gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) - gSaveBlock1Ptr->contestWinners[r4].contestRank = CONTEST_RANK_LINK; + gSaveBlock1Ptr->contestWinners[id].contestRank = CONTEST_RANK_LINK; else - gSaveBlock1Ptr->contestWinners[r4].contestRank = gSpecialVar_ContestRank; + gSaveBlock1Ptr->contestWinners[id].contestRank = gSpecialVar_ContestRank; if (rank != 0xFF) - gSaveBlock1Ptr->contestWinners[r4].contestCategory = gSpecialVar_ContestCategory; + gSaveBlock1Ptr->contestWinners[id].contestCategory = gSpecialVar_ContestCategory; else - gSaveBlock1Ptr->contestWinners[r4].contestCategory = r7; + gSaveBlock1Ptr->contestWinners[id].contestCategory = r7; } else { @@ -5354,24 +5354,24 @@ u8 sub_80DEFA8(u8 rank, u8 b) case CONTEST_RANK_MASTER: if (b != 0) { - for (i = 5; i >= 1; i--) + for (i = NUM_CONTEST_HALL_WINNERS - 1; i >= 1; i--) memcpy(&gSaveBlock1Ptr->contestWinners[i], &gSaveBlock1Ptr->contestWinners[i - 1], sizeof(struct ContestWinner)); } return 0; - default: // CONTEST_RANK_LINK + default: switch (gSpecialVar_ContestCategory) { case CONTEST_CATEGORY_COOL: - return 8; + return CONTEST_WINNER_MUSEUM_COOL - 1; case CONTEST_CATEGORY_BEAUTY: - return 9; + return CONTEST_WINNER_MUSEUM_BEAUTY - 1; case CONTEST_CATEGORY_CUTE: - return 10; + return CONTEST_WINNER_MUSEUM_CUTE - 1; case CONTEST_CATEGORY_SMART: - return 11; + return CONTEST_WINNER_MUSEUM_SMART - 1; case CONTEST_CATEGORY_TOUGH: default: - return 12; + return CONTEST_WINNER_MUSEUM_TOUGH - 1; } } } @@ -5471,7 +5471,7 @@ static void sub_80DF250(void) gContestResources->field_1c[r1].unkD |= 1; for (i = 0; i < CONTESTANT_COUNT; i++) { - if (i != var_38 && gUnknown_02039F08[var_38] - gUnknown_02039F08[i] <= 50) + if (i != var_38 && gContestMonTotalPoints[var_38] - gContestMonTotalPoints[i] <= 50) gContestResources->field_1c[i].unkD |= 4; if (!gContestResources->field_1c[i].unkE_2) @@ -5491,7 +5491,7 @@ static void sub_80DF250(void) { if (gContestMonConditions[i] > gContestMonConditions[j]) r12 = TRUE; - if (gUnknown_02039F18[i] > gUnknown_02039F18[j]) + if (gContestMonRound2Points[i] > gContestMonRound2Points[j]) r8 = TRUE; } if (!r12 && !r8) @@ -5582,7 +5582,7 @@ static void sub_80DF4F8(void) { if (gContestMonConditions[r7] < gContestMonConditions[i]) r9++; - if (gUnknown_02039F18[r7] < gUnknown_02039F18[i]) + if (gContestMonRound2Points[r7] < gContestMonRound2Points[i]) r10++; } diff --git a/src/contest_link_80F57C4.c b/src/contest_link_80F57C4.c index 65764067c..8434c3eac 100644 --- a/src/contest_link_80F57C4.c +++ b/src/contest_link_80F57C4.c @@ -36,6 +36,7 @@ #include "tv.h" #include "util.h" #include "window.h" +#include "constants/field_specials.h" #include "constants/game_stat.h" #include "constants/rgb.h" #include "constants/songs.h" @@ -43,96 +44,113 @@ #include "constants/vars.h" #include "contest.h" +enum { + SLIDING_TEXT_OFFSCREEN, + SLIDING_TEXT_ENTERING, + SLIDING_TEXT_ARRIVED, + SLIDING_TEXT_EXITING, +}; + +enum { + SLIDING_MON_ENTERED = 1, + SLIDING_MON_EXITED, +}; + +#define GET_CONTEST_WINNER_ID(i) { for ((i) = 0; (i) < CONTESTANT_COUNT && gContestFinalStandings[(i)] != 0; (i)++); } + #define TAG_CONFETTI 3017 -struct ContestLinkUnk0 -{ - u8 unk0; - u8 unk1; - u8 taskId; - u8 unk3; - u8 unk4; - u8 unk5; - u8 unk6; - u8 unk7; - u8 spriteId; - u8 unk9; - u8 unkA; - s16 unkC[4]; - u8 unk14; - u8 filler15[0x3]; +#define MAX_BAR_LENGTH 87 + +struct ContestResultsInternal +{ + u8 slidingTextBoxSpriteId; + u8 linkTextBoxSpriteId; + u8 showResultsTaskId; + u8 highlightWinnerTaskId; + u8 slidingTextBoxState; + u8 numStandingsPrinted; + u8 winnerMonSlidingState; + u8 confettiCount; + u8 winnerMonSpriteId; + bool8 destroyConfetti; + bool8 pointsFlashing; + s16 unkC[CONTESTANT_COUNT]; + u8 numBarsUpdating; }; -struct ContestLinkUnk14 +struct ContestMonResults { - int unk0; - int unk4; - u32 unk8; - u32 unkC; - u8 unk10; - u8 unk11; - u8 unk12; + int relativePreliminaryPoints; + int relativeRound2Points; + u32 barLengthPreliminary; + u32 barLengthRound2; + bool8 lostPoints; + u8 numStars; + u8 numHearts; }; -struct ContestLink80F57C4 +struct ContestResults { - struct ContestLinkUnk0 *unk0; - struct ContestLinkUnk14 (*unk4)[4]; - u8 *unk8; - u8 *unkC[4]; - u8 *unk1C; + struct ContestResultsInternal *data; + struct ContestMonResults (*monResults)[CONTESTANT_COUNT]; + u8 *unusedBg; // Allocated/freed, never used + u8 *tilemapBuffers[4]; + u8 *unused; // Allocated/freed, never used }; -EWRAM_DATA struct ContestLink80F57C4 *gUnknown_0203A034 = NULL; +static EWRAM_DATA struct ContestResults *sContestResults = NULL; -static void sub_80F6A9C(void); -static void sub_80F71C8(void); -u8 sub_80F7310(u8, u8); -s8 sub_80F7364(u8, u8); -static void sub_80F7ED0(int, u8 *, int); -static void sub_80F7DF4(void); +static void LoadAllContestMonIconPalettes(void); +static void LoadContestResultsTilemaps(void); +static u8 GetNumPreliminaryPoints(u8, bool8); +static s8 GetNumRound2Points(u8, bool8); +static void AddContestTextPrinter(int, u8 *, int); +static void AllocContestResults(void); +static void FreeContestResults(void); static void LoadAllContestMonIcons(u8, u8); -static void sub_80F6DC0(void); -static void sub_80F6AE8(void); -static void sub_80F5CE4(u8); -static void sub_80F5C00(void); -static void sub_80F68B4(u8); -static void sub_80F7880(void); -static void sub_80F5C24(void); -static void sub_80F707C(const u8 *); -static void sub_80F5ED8(u8); +static void LoadContestResultSprites(void); +static void TryCreateWirelessSprites(void); +static void Task_StartShowContestResults(u8 taskId); +static void CB2_StartShowContestResults(void); +static void Task_ShowContestResults(u8); +static void CB2_ShowContestResults(void); +static void VBlankCB_ShowContestResults(void); +static void Task_SlideContestResultsBg(u8); +static void Task_WaitForLinkPartnersBeforeResults(u8); static void sub_80F5F14(u8); static void sub_80F5F30(u8); -static void sub_80F5F74(u8); -static void sub_80F7144(void); -static void sub_80F68F0(u8); -s32 sub_80F6B78(const u8 *, u8); -static void sub_80F6E9C(s16, u16, u16, u16); -static void sub_80F6058(u8); -static void sub_80F7A80(u8, u8); -void sub_80F7CA8(u8); -static void sub_80F6EF4(u16); -static void sub_80F60F0(u8); -static void sub_80F616C(u8); -static void sub_80F6204(u8); -static void sub_80F73DC(u8); -static void sub_80F74BC(u8); -static void sub_80F753C(u8); -static void sub_80F77E0(u8, u8); -static void sub_80F7824(u8); -static void sub_80F6404(u8); -static void sub_80F75A8(struct Sprite *); -static void sub_80F7670(u8); -static void sub_80F7620(struct Sprite *); -static void sub_80F66B4(u8); -static void sub_80F671C(u8); -static void sub_80F677C(u8); -static void sub_80F67C4(u8); -static void sub_80F6820(u8); -static void sub_80F7E64(void); -static void sub_80F6F68(struct Sprite *); -static void sub_80F7014(struct Sprite *); -static void sub_80F6FDC(struct Sprite *); +static void Task_AnnouncePreliminaryResults(u8); +static void Task_FlashStarsAndHearts(u8); +static void Task_ShowPreliminaryResults(u8); +static void Task_AnnounceRound2Results(u8); +static void Task_ShowRound2Results(u8); +static void Task_AnnounceWinner(u8); +static void Task_DrawFinalStandingNumber(u8); +static void Task_StartHighlightWinnersBox(u8); +static void Task_HighlightWinnersBox(u8); +static void Task_ShowWinnerMonBanner(u8); +static void Task_SetSeenWinnerMon(u8); +static void Task_TryDisconnectLinkPartners(u8); +static void Task_WaitForLinkPartnersDisconnect(u8); +static void Task_TrySetContestInterviewData(u8); +static void Task_EndShowContestResults(u8); +static void CalculateContestantsResultData(void); +static void ShowLinkResultsTextBox(const u8 *); +static void HideLinkResultsTextBox(void); +static s32 DrawResultsTextWindow(const u8 *, u8); +static void StartTextBoxSlideIn(s16, u16, u16, u16); +static void UpdateContestResultBars(bool8, u8); +static void Task_UpdateContestResultBar(u8); +static void StartTextBoxSlideOut(u16); +static void BounceMonIconInBox(u8, u8); +static void Task_BounceMonIconInBox(u8); +static void SpriteCB_WinnerMonSlideIn(struct Sprite *); +static void SpriteCB_WinnerMonSlideOut(struct Sprite *); +static void Task_CreateConfetti(u8); +static void SpriteCB_TextBoxSlideIn(struct Sprite *); +static void SpriteCB_TextBoxSlideOut(struct Sprite *); +static void SpriteCB_EndTextBoxSlideIn(struct Sprite *); static void sub_80F8508(u8); static void sub_80F8568(u8); static void sub_80F8584(u8); @@ -235,7 +253,7 @@ static const struct CompressedSpritePalette sSpritePalette_Confetti = .tag = TAG_CONFETTI }; -static const struct BgTemplate sUnknown_0858D888[] = +static const struct BgTemplate sBgTemplates[] = { { .bg = 0, @@ -275,7 +293,7 @@ static const struct BgTemplate sUnknown_0858D888[] = } }; -static const struct WindowTemplate sUnknown_0858D898[] = +static const struct WindowTemplate sWindowTemplates[] = { { .bg = 1, @@ -355,17 +373,17 @@ static const struct SpriteSheet sUnknown_0858D8E0 = static const u8 sContestLinkTextColors[4] = {TEXT_COLOR_WHITE, TEXT_DYNAMIC_COLOR_6, TEXT_DYNAMIC_COLOR_5}; -void sub_80F57C4(void) +static void InitContestResultsDisplay(void) { int i; SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, sUnknown_0858D888, ARRAY_COUNT(sUnknown_0858D888)); - for (i = 0; i < 4; i++) - SetBgTilemapBuffer(i, gUnknown_0203A034->unkC[i]); + InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); + for (i = 0; i < (int)ARRAY_COUNT(sContestResults->tilemapBuffers); i++) + SetBgTilemapBuffer(i, sContestResults->tilemapBuffers[i]); - InitWindows(sUnknown_0858D898); + InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); SetGpuReg(REG_OFFSET_MOSAIC, 0); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); @@ -400,34 +418,35 @@ void sub_80F57C4(void) gBattle_WIN1V = 0; } -void sub_80F591C(void) +static void LoadContestResultsBgGfx(void) { int i, j; - s8 var0, var1; + s8 numStars, round2Points; u16 tile1, tile2; - LZDecompressVram(gUnknown_08C19588, (void *)BG_CHAR_ADDR(0)); + LZDecompressVram(gContestResults_Gfx, (void *)BG_CHAR_ADDR(0)); CopyToBgTilemapBuffer(3, gUnknown_08C1A12C, 0, 0); CopyToBgTilemapBuffer(2, gUnknown_08C1A000, 0, 0); CopyToBgTilemapBuffer(0, gUnknown_08C19EEC, 0, 0); - sub_80F71C8(); - LoadCompressedPalette(gUnknown_08C1A2B4, 0, 0x200); + LoadContestResultsTilemaps(); + LoadCompressedPalette(gContestResults_Pal, 0, 0x200); LoadPalette(sUnknown_0858D6B0, 0xF0, 0x20); - for (i = 0; i < 4; i++) + for (i = 0; i < CONTESTANT_COUNT; i++) { - var0 = sub_80F7310(i, 1); - var1 = sub_80F7364(i, 1); + numStars = GetNumPreliminaryPoints(i, TRUE); + round2Points = GetNumRound2Points(i, TRUE); for (j = 0; j < 10; j++) { tile1 = 0x60B2; - if (j < var0) + if (j < numStars) tile1 += 2; - if (j < abs(var1)) + // Abs of round2Points is number of hearts + if (j < abs(round2Points)) { tile2 = 0x60A4; - if (var1 < 0) + if (round2Points < 0) tile2 += 2; } else @@ -450,7 +469,7 @@ void sub_80F591C(void) ShowBg(3); } -static void sub_80F5A74(u8 monIndex) +static void LoadContestMonName(u8 monIndex) { struct ContestPokemon *mon = &gContestMons[monIndex]; u8 *str = gDisplayedStringBattle; @@ -458,58 +477,58 @@ static void sub_80F5A74(u8 monIndex) str = StringCopy(gDisplayedStringBattle, gText_ColorDarkGrey); StringCopy(str, mon->nickname); - sub_80F7ED0(monIndex, gDisplayedStringBattle, 0); + AddContestTextPrinter(monIndex, gDisplayedStringBattle, 0); StringCopy(str, gText_Slash); StringAppend(str, mon->trainerName); - sub_80F7ED0(monIndex, gDisplayedStringBattle, 50); + AddContestTextPrinter(monIndex, gDisplayedStringBattle, 50); } -void sub_80F5AE0(void) +static void LoadAllContestMonNames(void) { int i; for (i = 0; i < CONTESTANT_COUNT; i++) - sub_80F5A74(i); + LoadContestMonName(i); CopyBgTilemapBufferToVram(1); } -void sub_80F5B00(void) +static void CB2_StartShowContestResults(void) { - gPaletteFade.bufferTransferDisabled = 1; + gPaletteFade.bufferTransferDisabled = TRUE; SetVBlankCallback(NULL); - sub_80F7DF4(); - sub_80F57C4(); + AllocContestResults(); + InitContestResultsDisplay(); ScanlineEffect_Clear(); ResetPaletteFade(); ResetSpriteData(); ResetTasks(); FreeAllSpritePalettes(); - sub_80F591C(); - sub_80F6A9C(); - LoadAllContestMonIcons(0, 1); - sub_80F5AE0(); - memset(gUnknown_0203A034->unk0, 0, sizeof(*gUnknown_0203A034->unk0)); - memset(gUnknown_0203A034->unk4, 0, sizeof(*gUnknown_0203A034->unk4)); - sub_80F6DC0(); - sub_80F6AE8(); + LoadContestResultsBgGfx(); + LoadAllContestMonIconPalettes(); + LoadAllContestMonIcons(0, TRUE); + LoadAllContestMonNames(); + memset(sContestResults->data, 0, sizeof(*sContestResults->data)); + memset(sContestResults->monResults, 0, sizeof(*sContestResults->monResults)); + LoadContestResultSprites(); + TryCreateWirelessSprites(); BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); - gPaletteFade.bufferTransferDisabled = 0; - gUnknown_0203A034->unk0->taskId = CreateTask(sub_80F5CE4, 5); - SetMainCallback2(sub_80F5C00); + gPaletteFade.bufferTransferDisabled = FALSE; + sContestResults->data->showResultsTaskId = CreateTask(Task_ShowContestResults, 5); + SetMainCallback2(CB2_ShowContestResults); gBattle_WIN1H = 0x00F0; gBattle_WIN1V = 0x80A0; - CreateTask(sub_80F68B4, 20); - sub_80F7880(); + CreateTask(Task_SlideContestResultsBg, 20); + CalculateContestantsResultData(); if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS) - gPaletteFade.bufferTransferDisabled = 1; + gPaletteFade.bufferTransferDisabled = TRUE; else PlayBGM(MUS_CON_K); - SetVBlankCallback(sub_80F5C24); + SetVBlankCallback(VBlankCB_ShowContestResults); } -static void sub_80F5C00(void) +static void CB2_ShowContestResults(void) { AnimateSprites(); BuildOamBuffer(); @@ -519,7 +538,7 @@ static void sub_80F5C00(void) CopyBgTilemapBufferToVram(2); } -static void sub_80F5C24(void) +static void VBlankCB_ShowContestResults(void) { SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_X); SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_Y); @@ -539,29 +558,33 @@ static void sub_80F5C24(void) ScanlineEffect_InitHBlankDmaTransfer(); } -static void sub_80F5CE4(u8 taskId) +#define tState data[0] +#define tTimer data[1] +#define tCounter data[2] + +static void Task_ShowContestResults(u8 taskId) { u16 var; if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) { - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: SaveLinkContestResults(); if (gContestFinalStandings[gContestPlayerMonIndex] == 0) { IncrementGameStat(GAME_STAT_WON_LINK_CONTEST); - gSpecialVar_0x8005 = 8; + gSpecialVar_0x8005 = TVSHOW_CONTEST_LIVE_UPDATES; InterviewBefore(); - if (gSpecialVar_Result != 1) + if (gSpecialVar_Result != TRUE) InterviewAfter(); } - TryGainNewFanFromCounter(2); + TryGainNewFanFromCounter(FANCOUNTER_FINISHED_CONTEST); sub_80DEDA8(gSpecialVar_ContestRank); sub_80DEDA8(0xFE); - gUnknown_02039F5C = 1; + gUnknown_02039F5C = TRUE; gUnknown_02039F5D = sub_80DEFA8(0xFE, 0); var = VarGet(VAR_CONTEST_HALL_STATE); VarSet(VAR_CONTEST_HALL_STATE, 0); @@ -569,26 +592,26 @@ static void sub_80F5CE4(u8 taskId) TrySavingData(SAVE_LINK); ClearContinueGameWarpStatus2(); VarSet(VAR_CONTEST_HALL_STATE, var); - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; break; case 1: - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; if (!(gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS)) - gTasks[taskId].data[0] = 100; + gTasks[taskId].tState = 100; break; case 2: if (IsLinkTaskFinished()) { sub_800ADF8(); - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; } return; case 3: if (IsLinkTaskFinished() == TRUE) { PlayBGM(MUS_CON_K); - gPaletteFade.bufferTransferDisabled = 0; - gTasks[taskId].data[0]++; + gPaletteFade.bufferTransferDisabled = FALSE; + gTasks[taskId].tState++; break; } return; @@ -597,11 +620,11 @@ static void sub_80F5CE4(u8 taskId) if (!gPaletteFade.active) { - gTasks[taskId].data[0] = 0; + gTasks[taskId].tState = 0; if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) { - sub_80F707C(gText_CommunicationStandby); - gTasks[taskId].func = sub_80F5ED8; + ShowLinkResultsTextBox(gText_CommunicationStandby); + gTasks[taskId].func = Task_WaitForLinkPartnersBeforeResults; } else { @@ -611,15 +634,15 @@ static void sub_80F5CE4(u8 taskId) sub_80DEDA8(gSpecialVar_ContestRank); sub_80DEDA8(0xFE); - gUnknown_02039F5C = 1; + gUnknown_02039F5C = TRUE; gUnknown_02039F5D = sub_80DEFA8(0xFE, 0); - TryGainNewFanFromCounter(2); - gTasks[taskId].func = sub_80F5F74; + TryGainNewFanFromCounter(FANCOUNTER_FINISHED_CONTEST); + gTasks[taskId].func = Task_AnnouncePreliminaryResults; } } } -static void sub_80F5ED8(u8 taskId) +static void Task_WaitForLinkPartnersBeforeResults(u8 taskId) { if (gReceivedRemoteLinkPlayers) { @@ -638,194 +661,193 @@ static void sub_80F5F30(u8 taskId) if (IsLinkTaskFinished()) { DestroyTask(taskId); - gTasks[gUnknown_0203A034->unk0->taskId].func = sub_80F5F74; - sub_80F7144(); + gTasks[sContestResults->data->showResultsTaskId].func = Task_AnnouncePreliminaryResults; + HideLinkResultsTextBox(); } } -static void sub_80F5F74(u8 taskId) +static void Task_AnnouncePreliminaryResults(u8 taskId) { - s16 var0; + s16 x; - if (gTasks[taskId].data[0] == 0) + if (gTasks[taskId].tState == 0) { - CreateTask(sub_80F68F0, 20); - var0 = sub_80F6B78(gText_AnnouncingResults, gUnknown_0203A034->unk0->unk0); - sub_80F6E9C(var0, 144, 120, 1088); - gTasks[taskId].data[0]++; + CreateTask(Task_FlashStarsAndHearts, 20); + x = DrawResultsTextWindow(gText_AnnouncingResults, sContestResults->data->slidingTextBoxSpriteId); + StartTextBoxSlideIn(x, 144, 120, 1088); + gTasks[taskId].tState++; } - else if (gTasks[taskId].data[0] == 1) + else if (gTasks[taskId].tState == 1) { - if (gUnknown_0203A034->unk0->unk4 == 0) + // Wait for "Announcing Results" text to leave + if (sContestResults->data->slidingTextBoxState == SLIDING_TEXT_OFFSCREEN) { - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[0]++; + gTasks[taskId].tTimer = 0; + gTasks[taskId].tState++; } } - else if (gTasks[taskId].data[0] == 2) + else if (gTasks[taskId].tState == 2) { - if (++gTasks[taskId].data[1] == 21) + if (++gTasks[taskId].tTimer == 21) { - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[0]++; + gTasks[taskId].tTimer = 0; + gTasks[taskId].tState++; } } - else if (gTasks[taskId].data[0] == 3) + else if (gTasks[taskId].tState == 3) { - var0 = sub_80F6B78(gText_PreliminaryResults, gUnknown_0203A034->unk0->unk0); - sub_80F6E9C(var0, 144, -1, 1088); - gTasks[taskId].data[0]++; + x = DrawResultsTextWindow(gText_PreliminaryResults, sContestResults->data->slidingTextBoxSpriteId); + StartTextBoxSlideIn(x, 144, -1, 1088); + gTasks[taskId].tState++; } - else if (gTasks[taskId].data[0] == 4) + else if (gTasks[taskId].tState == 4) { - if (gUnknown_0203A034->unk0->unk4 == 2) + if (sContestResults->data->slidingTextBoxState == SLIDING_TEXT_ARRIVED) { - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_80F6058; + gTasks[taskId].tState = 0; + gTasks[taskId].func = Task_ShowPreliminaryResults; } } } -static void sub_80F6058(u8 taskId) +static void Task_ShowPreliminaryResults(u8 taskId) { - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: - if (!gUnknown_0203A034->unk0->unkA) + if (!sContestResults->data->pointsFlashing) { - sub_80F7A80(0, gTasks[taskId].data[2]++); - if (!gUnknown_0203A034->unk0->unk14) - gTasks[taskId].data[0] = 2; + UpdateContestResultBars(FALSE, gTasks[taskId].tCounter++); + if (sContestResults->data->numBarsUpdating == 0) + gTasks[taskId].tState = 2; else - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; } break; case 1: - if (!gUnknown_0203A034->unk0->unk14) - gTasks[taskId].data[0] = 0; + if (sContestResults->data->numBarsUpdating == 0) + gTasks[taskId].tState = 0; break; case 2: - sub_80F6EF4(1088); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[2] = 0; - gTasks[taskId].func = sub_80F60F0; + StartTextBoxSlideOut(1088); + gTasks[taskId].tState = 0; + gTasks[taskId].tCounter = 0; + gTasks[taskId].func = Task_AnnounceRound2Results; break; } } -static void sub_80F60F0(u8 taskId) +static void Task_AnnounceRound2Results(u8 taskId) { - s16 var0; + s16 x; - if (gUnknown_0203A034->unk0->unk4 == 0) + if (sContestResults->data->slidingTextBoxState == SLIDING_TEXT_OFFSCREEN) { - if (++gTasks[taskId].data[1] == 21) + if (++gTasks[taskId].tTimer == 21) { - gTasks[taskId].data[1] = 0; - var0 = sub_80F6B78(gText_Round2Results, gUnknown_0203A034->unk0->unk0); - sub_80F6E9C(var0, 144, -1, 1088); + gTasks[taskId].tTimer = 0; + x = DrawResultsTextWindow(gText_Round2Results, sContestResults->data->slidingTextBoxSpriteId); + StartTextBoxSlideIn(x, 144, -1, 1088); } } - else if (gUnknown_0203A034->unk0->unk4 == 2) + else if (sContestResults->data->slidingTextBoxState == SLIDING_TEXT_ARRIVED) { - gTasks[taskId].func = sub_80F616C; + gTasks[taskId].func = Task_ShowRound2Results; } } -static void sub_80F616C(u8 taskId) +static void Task_ShowRound2Results(u8 taskId) { - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: - if (!gUnknown_0203A034->unk0->unkA) + if (!sContestResults->data->pointsFlashing) { - sub_80F7A80(1, gTasks[taskId].data[2]++); - if (!gUnknown_0203A034->unk0->unk14) - gTasks[taskId].data[0] = 2; + UpdateContestResultBars(TRUE, gTasks[taskId].tCounter++); + if (sContestResults->data->numBarsUpdating == 0) + gTasks[taskId].tState = 2; else - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; } break; case 1: - if (!gUnknown_0203A034->unk0->unk14) - gTasks[taskId].data[0] = 0; + if (sContestResults->data->numBarsUpdating == 0) + gTasks[taskId].tState = 0; break; case 2: - sub_80F6EF4(1088); - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_80F6204; + StartTextBoxSlideOut(1088); + gTasks[taskId].tState = 0; + gTasks[taskId].func = Task_AnnounceWinner; break; } } -static void sub_80F6204(u8 taskId) +// Task data for Task_DrawFinalStandingNumber +#define tFinalStanding data[0] +#define tMonIndex data[1] + +static void Task_AnnounceWinner(u8 taskId) { int i; - u8 newTaskId; - u8 buffer[100]; - s16 var0; - - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: - if (!gUnknown_0203A034->unk0->unk4) - gTasks[taskId].data[0]++; + if (sContestResults->data->slidingTextBoxState == SLIDING_TEXT_OFFSCREEN) + gTasks[taskId].tState++; break; case 1: - if (++gTasks[taskId].data[1] == 31) + if (++gTasks[taskId].tTimer == 31) { - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[0]++; + gTasks[taskId].tTimer = 0; + gTasks[taskId].tState++; } break; case 2: for (i = 0; i < CONTESTANT_COUNT; i++) { - newTaskId = CreateTask(sub_80F73DC, 10); - gTasks[newTaskId].data[0] = gContestFinalStandings[i]; - gTasks[newTaskId].data[1] = i; + u8 newTaskId = CreateTask(Task_DrawFinalStandingNumber, 10); + gTasks[newTaskId].tFinalStanding = gContestFinalStandings[i]; + gTasks[newTaskId].tMonIndex = i; } - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; break; case 3: - if (gUnknown_0203A034->unk0->unk5 == 4) + if (sContestResults->data->numStandingsPrinted == CONTESTANT_COUNT) { - if (++gTasks[taskId].data[1] == 31) + if (++gTasks[taskId].tTimer == 31) { - gTasks[taskId].data[1] = 0; - CreateTask(sub_80F74BC, 10); - gTasks[taskId].data[0]++; - for (i = 0; i < CONTESTANT_COUNT && gContestFinalStandings[i] != 0; i++) - ; - - sub_80F77E0(i, 14); + gTasks[taskId].tTimer = 0; + CreateTask(Task_StartHighlightWinnersBox, 10); + gTasks[taskId].tState++; + GET_CONTEST_WINNER_ID(i); + BounceMonIconInBox(i, 14); } } break; case 4: - if (++gTasks[taskId].data[1] == 21) + if (++gTasks[taskId].tTimer == 21) { - gTasks[taskId].data[1] = 0; - for (i = 0; i < CONTESTANT_COUNT && gContestFinalStandings[i] != 0; i++) - ; - + u8 winnerTextBuffer[100]; + s16 x; + gTasks[taskId].tTimer = 0; + GET_CONTEST_WINNER_ID(i); StringCopy(gStringVar1, gContestMons[i].trainerName); sub_81DB5AC(gStringVar1); StringCopy(gStringVar2, gContestMons[i].nickname); - StringExpandPlaceholders(buffer, gText_Var1sVar2Won); - var0 = sub_80F6B78(buffer, gUnknown_0203A034->unk0->unk0); - sub_80F6E9C(var0, 144, -1, 1088); - gTasks[taskId].data[0]++; + StringExpandPlaceholders(winnerTextBuffer, gText_ContestantsMonWon); + x = DrawResultsTextWindow(winnerTextBuffer, sContestResults->data->slidingTextBoxSpriteId); + StartTextBoxSlideIn(x, 144, -1, 1088); + gTasks[taskId].tState++; } break; case 5: - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_80F6404; + gTasks[taskId].tState = 0; + gTasks[taskId].func = Task_ShowWinnerMonBanner; break; } } -static void sub_80F6404(u8 taskId) +static void Task_ShowWinnerMonBanner(u8 taskId) { int i; u8 spriteId; @@ -834,14 +856,13 @@ static void sub_80F6404(u8 taskId) u32 personality; const struct CompressedSpritePalette *pokePal; - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: gBattle_WIN0H = 0x00F0; gBattle_WIN0V = 0x5050; - for (i = 0; i < CONTESTANT_COUNT && gContestFinalStandings[i] != 0; i++) - ; + GET_CONTEST_WINNER_ID(i); species = gContestMons[i].species; personality = gContestMons[i].personality; otId = gContestMons[i].otId; @@ -869,42 +890,42 @@ static void sub_80F6404(u8 taskId) spriteId = CreateSprite(&gMultiuseSpriteTemplate, 272, 80, 10); gSprites[spriteId].data[1] = species; gSprites[spriteId].oam.priority = 0; - gSprites[spriteId].callback = sub_80F75A8; - gUnknown_0203A034->unk0->spriteId = spriteId; + gSprites[spriteId].callback = SpriteCB_WinnerMonSlideIn; + sContestResults->data->winnerMonSpriteId = spriteId; LoadCompressedSpriteSheet(&sSpriteSheet_Confetti); LoadCompressedSpritePalette(&sSpritePalette_Confetti); - CreateTask(sub_80F7670, 10); - gTasks[taskId].data[0]++; + CreateTask(Task_CreateConfetti, 10); + gTasks[taskId].tState++; break; case 1: if (++gTasks[taskId].data[3] == 1) { u8 counter; gTasks[taskId].data[3] = 0; - gTasks[taskId].data[2] += 2; - if (gTasks[taskId].data[2] > 32) - gTasks[taskId].data[2] = 32; + gTasks[taskId].tCounter += 2; + if (gTasks[taskId].tCounter > 32) + gTasks[taskId].tCounter = 32; - counter = gTasks[taskId].data[2]; + counter = gTasks[taskId].tCounter; gBattle_WIN0V = ((80 - counter) << 8) | (80 + counter); if (counter == 32) - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; } break; case 2: - if (gUnknown_0203A034->unk0->unk6 == 1) - gTasks[taskId].data[0]++; + if (sContestResults->data->winnerMonSlidingState == SLIDING_MON_ENTERED) + gTasks[taskId].tState++; break; case 3: - if (++gTasks[taskId].data[1] == 121) + if (++gTasks[taskId].tTimer == 121) { - gTasks[taskId].data[1] = 0; - gSprites[gUnknown_0203A034->unk0->spriteId].callback = sub_80F7620; - gTasks[taskId].data[0]++; + gTasks[taskId].tTimer = 0; + gSprites[sContestResults->data->winnerMonSpriteId].callback = SpriteCB_WinnerMonSlideOut; + gTasks[taskId].tState++; } break; case 4: - if (gUnknown_0203A034->unk0->unk6 == 2) + if (sContestResults->data->winnerMonSlidingState == SLIDING_MON_EXITED) { u8 top = (gBattle_WIN0V >> 8); top += 2; @@ -913,25 +934,25 @@ static void sub_80F6404(u8 taskId) gBattle_WIN0V = (top << 8) | (160 - top); if (top == 80) - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; } break; case 5: - if (gUnknown_0203A034->unk0->unk6 == 2) + if (sContestResults->data->winnerMonSlidingState == SLIDING_MON_EXITED) { - gUnknown_0203A034->unk0->unk9 = 1; - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_80F66B4; + sContestResults->data->destroyConfetti = TRUE; + gTasks[taskId].tState = 0; + gTasks[taskId].func = Task_SetSeenWinnerMon; } break; } } -static void sub_80F66B4(u8 taskId) +static void Task_SetSeenWinnerMon(u8 taskId) { int i, nationalDexNum; - if (gMain.newKeys & A_BUTTON) + if (JOY_NEW(A_BUTTON)) { if (!(gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK)) { @@ -943,62 +964,62 @@ static void sub_80F66B4(u8 taskId) } gTasks[taskId].data[10] = 0; - gTasks[taskId].func = sub_80F671C; + gTasks[taskId].func = Task_TryDisconnectLinkPartners; } } -static void sub_80F671C(u8 taskId) +static void Task_TryDisconnectLinkPartners(u8 taskId) { if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) { if (!gTasks[taskId].data[10]) { - sub_80F707C(gText_CommunicationStandby); + ShowLinkResultsTextBox(gText_CommunicationStandby); sub_800AC34(); - gTasks[taskId].func = sub_80F677C; + gTasks[taskId].func = Task_WaitForLinkPartnersDisconnect; } } else { - gTasks[taskId].func = sub_80F67C4; + gTasks[taskId].func = Task_TrySetContestInterviewData; } } -static void sub_80F677C(u8 taskId) +static void Task_WaitForLinkPartnersDisconnect(u8 taskId) { if (!gReceivedRemoteLinkPlayers) { if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS) DestroyWirelessStatusIndicatorSprite(); - sub_80F7144(); - gTasks[taskId].func = sub_80F67C4; + HideLinkResultsTextBox(); + gTasks[taskId].func = Task_TrySetContestInterviewData; } } -static void sub_80F67C4(u8 taskId) +static void Task_TrySetContestInterviewData(u8 taskId) { if (!(gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK)) BravoTrainerPokemonProfile_BeforeInterview2(gContestFinalStandings[gContestPlayerMonIndex]); BeginHardwarePaletteFade(0xFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_80F6820; + gTasks[taskId].func = Task_EndShowContestResults; } -static void sub_80F6820(u8 taskId) +static void Task_EndShowContestResults(u8 taskId) { if (!gPaletteFade.active) { - if (gTasks[taskId].data[1] == 0) + if (gTasks[taskId].tTimer == 0) { - DestroyTask(gUnknown_0203A034->unk0->unk3); + DestroyTask(sContestResults->data->highlightWinnerTaskId); BlendPalettes(0x0000FFFF, 16, RGB_BLACK); - gTasks[taskId].data[1]++; + gTasks[taskId].tTimer++; } - else if (gTasks[taskId].data[1] == 1) + else if (gTasks[taskId].tTimer == 1) { BlendPalettes(0xFFFF0000, 16, RGB_BLACK); - gTasks[taskId].data[1]++; + gTasks[taskId].tTimer++; } else { @@ -1007,12 +1028,16 @@ static void sub_80F6820(u8 taskId) DestroyTask(taskId); FreeAllWindowBuffers(); SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); - sub_80F7E64(); + FreeContestResults(); } } } -static void sub_80F68B4(u8 taskId) +#undef tState +#undef tTimer +#undef tCounter + +static void Task_SlideContestResultsBg(u8 taskId) { gBattle_BG3_X += 2; gBattle_BG3_Y += 1; @@ -1022,33 +1047,37 @@ static void sub_80F68B4(u8 taskId) gBattle_BG3_Y -= 255; } -static void sub_80F68F0(u8 taskId) +#define tDelay data[0] +#define tCoeff data[1] +#define tDecreasing data[2] + +static void Task_FlashStarsAndHearts(u8 taskId) { - if (++gTasks[taskId].data[0] == 2) + if (++gTasks[taskId].tDelay == 2) { - gTasks[taskId].data[0] = 0; - if (gTasks[taskId].data[2] == 0) - gTasks[taskId].data[1]++; + gTasks[taskId].tDelay = 0; + if (!gTasks[taskId].tDecreasing) + gTasks[taskId].tCoeff++; else - gTasks[taskId].data[1]--; + gTasks[taskId].tCoeff--; - if (gTasks[taskId].data[1] == 16) - gTasks[taskId].data[2] = 1; - else if (gTasks[taskId].data[1] == 0) - gTasks[taskId].data[2] = 0; + if (gTasks[taskId].tCoeff == 16) + gTasks[taskId].tDecreasing = TRUE; + else if (gTasks[taskId].tCoeff == 0) + gTasks[taskId].tDecreasing = FALSE; - BlendPalette(0x6B, 1, gTasks[taskId].data[1], RGB(30, 22, 11)); - BlendPalette(0x68, 1, gTasks[taskId].data[1], RGB_WHITE); - BlendPalette(0x6E, 1, gTasks[taskId].data[1], RGB(30, 29, 29)); + BlendPalette(0x6B, 1, gTasks[taskId].tCoeff, RGB(30, 22, 11)); + BlendPalette(0x68, 1, gTasks[taskId].tCoeff, RGB_WHITE); + BlendPalette(0x6E, 1, gTasks[taskId].tCoeff, RGB(30, 29, 29)); } - if (gTasks[taskId].data[1] == 0) - gUnknown_0203A034->unk0->unkA = 0; + if (gTasks[taskId].tCoeff == 0) + sContestResults->data->pointsFlashing = FALSE; else - gUnknown_0203A034->unk0->unkA = 1; + sContestResults->data->pointsFlashing = TRUE; } -void sub_80F69B8(u16 species, u8 monIndex, u8 srcOffset, u8 useDmaNow, u32 personality) +static void LoadContestMonIcon(u16 species, u8 monIndex, u8 srcOffset, u8 useDmaNow, u32 personality) { const u8 *iconPtr; u16 var0, var1, frameNum; @@ -1073,15 +1102,15 @@ void sub_80F69B8(u16 species, u8 monIndex, u8 srcOffset, u8 useDmaNow, u32 perso } } -static void LoadAllContestMonIcons(u8 srcOffset, u8 useDmaNow) +static void LoadAllContestMonIcons(u8 srcOffset, bool8 useDmaNow) { int i; for (i = 0; i < CONTESTANT_COUNT; i++) - sub_80F69B8(gContestMons[i].species, i, srcOffset, useDmaNow, gContestMons[i].personality); + LoadContestMonIcon(gContestMons[i].species, i, srcOffset, useDmaNow, gContestMons[i].personality); } -static void sub_80F6A9C(void) +static void LoadAllContestMonIconPalettes(void) { int i, species; @@ -1092,7 +1121,7 @@ static void sub_80F6A9C(void) } } -static void sub_80F6AE8(void) +static void TryCreateWirelessSprites(void) { u16 sheet; u8 spriteId; @@ -1113,7 +1142,7 @@ static void sub_80F6AE8(void) // src are placed on different stack positions. #ifdef NONMATCHING -s32 sub_80F6B78(const u8 *text, u8 spriteId) +static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId) { u8 *windowTilesPtr; u16 windowId; @@ -1178,7 +1207,7 @@ s32 sub_80F6B78(const u8 *text, u8 spriteId) #else NAKED -s32 sub_80F6B78(const u8 *text, u8 spriteId) +static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId) { asm_unified("\n\ push {r4-r7,lr}\n\ @@ -1453,18 +1482,18 @@ _080F6D3E:\n\ } #endif // NONMATCHING -static void sub_80F6DC0(void) +static void LoadContestResultSprites(void) { int i; struct SpriteTemplate template; - u8 spriteIds[8]; + u8 spriteIds[ARRAY_COUNT(sUnknown_0858D810)]; template = sSpriteTemplate_858D7F8; for (i = 0; i < (int)ARRAY_COUNT(sUnknown_0858D810); i++) LoadSpriteSheet(&sUnknown_0858D810[i]); LoadSpritePalette(&sUnknown_0858D850); - for (i = 0; i < 8; i++) + for (i = 0; i < (int)ARRAY_COUNT(sUnknown_0858D810); i++) { spriteIds[i] = CreateSprite(&template, 272, 144, 10); template.tileTag++; @@ -1478,60 +1507,68 @@ static void sub_80F6DC0(void) gSprites[spriteIds[4]].data[1] = spriteIds[6]; gSprites[spriteIds[4]].data[2] = spriteIds[7]; - gUnknown_0203A034->unk0->unk0 = spriteIds[0]; - gUnknown_0203A034->unk0->unk4 = 0; - gUnknown_0203A034->unk0->unk1 = spriteIds[4]; - sub_80F7144(); + sContestResults->data->slidingTextBoxSpriteId = spriteIds[0]; + sContestResults->data->slidingTextBoxState = SLIDING_TEXT_OFFSCREEN; + sContestResults->data->linkTextBoxSpriteId = spriteIds[4]; + HideLinkResultsTextBox(); } -static void sub_80F6E9C(s16 arg0, u16 y, u16 arg2, u16 arg3) +#define sTargetX data[4] +#define sSlideOutTimer data[5] +#define sSlideIncrement data[6] +#define sDistance data[7] + +// If slideOutTimer is -1, it will not automatically slide out +static void StartTextBoxSlideIn(s16 x, u16 y, u16 slideOutTimer, u16 slideIncrement) { - struct Sprite *sprite = &gSprites[gUnknown_0203A034->unk0->unk0]; + struct Sprite *sprite = &gSprites[sContestResults->data->slidingTextBoxSpriteId]; sprite->pos1.x = 272; sprite->pos1.y = y; sprite->pos2.x = 0; sprite->pos2.y = 0; - sprite->data[4] = arg0 + 32; - sprite->data[5] = arg2; - sprite->data[6] = arg3; - sprite->data[7] = 0; - sprite->callback = sub_80F6F68; - gUnknown_0203A034->unk0->unk4 = 1; + sprite->sTargetX = x + 32; + sprite->sSlideOutTimer = slideOutTimer; + sprite->sSlideIncrement = slideIncrement; + sprite->sDistance = 0; + sprite->callback = SpriteCB_TextBoxSlideIn; + sContestResults->data->slidingTextBoxState = SLIDING_TEXT_ENTERING; } -static void sub_80F6EF4(u16 arg0) +static void StartTextBoxSlideOut(u16 slideIncrement) { - struct Sprite *sprite = &gSprites[gUnknown_0203A034->unk0->unk0]; + struct Sprite *sprite = &gSprites[sContestResults->data->slidingTextBoxSpriteId]; sprite->pos1.x += sprite->pos2.x; sprite->pos1.y += sprite->pos2.y; sprite->pos2.y = 0; sprite->pos2.x = 0; - sprite->data[6] = arg0; - sprite->data[7] = 0; - sprite->callback = sub_80F7014; - gUnknown_0203A034->unk0->unk4 = 3; + sprite->sSlideIncrement = slideIncrement; + sprite->sDistance = 0; + sprite->callback = SpriteCB_TextBoxSlideOut; + sContestResults->data->slidingTextBoxState = SLIDING_TEXT_EXITING; } -static void sub_80F6F40(struct Sprite *sprite) +static void EndTextBoxSlideOut(struct Sprite *sprite) { sprite->pos1.x = 272; sprite->pos1.y = 144; sprite->pos2.y = 0; sprite->pos2.x = 0; sprite->callback = SpriteCallbackDummy; - gUnknown_0203A034->unk0->unk4 = 0; + sContestResults->data->slidingTextBoxState = SLIDING_TEXT_OFFSCREEN; } -static void sub_80F6F68(struct Sprite *sprite) +static void SpriteCB_TextBoxSlideIn(struct Sprite *sprite) { int i; - s16 delta = sprite->data[7] + sprite->data[6]; + s16 delta = sprite->sDistance + sprite->sSlideIncrement; sprite->pos1.x -= delta >> 8; - sprite->data[7] += sprite->data[6]; - sprite->data[7] &= 0xFF; - if (sprite->pos1.x < sprite->data[4]) - sprite->pos1.x = sprite->data[4]; + sprite->sDistance += sprite->sSlideIncrement; + sprite->sDistance &= 0xFF; + + // Prevent overshooting target + if (sprite->pos1.x < sprite->sTargetX) + sprite->pos1.x = sprite->sTargetX; for (i = 0; i < 3; i++) { @@ -1539,29 +1576,29 @@ static void sub_80F6F68(struct Sprite *sprite) sprite2->pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64; } - if (sprite->pos1.x == sprite->data[4]) - sprite->callback = sub_80F6FDC; + if (sprite->pos1.x == sprite->sTargetX) + sprite->callback = SpriteCB_EndTextBoxSlideIn; } -static void sub_80F6FDC(struct Sprite *sprite) +static void SpriteCB_EndTextBoxSlideIn(struct Sprite *sprite) { - gUnknown_0203A034->unk0->unk4 = 2; - if ((u16)sprite->data[5] != 0xFFFF) + sContestResults->data->slidingTextBoxState = SLIDING_TEXT_ARRIVED; + if ((u16)sprite->sSlideOutTimer != 0xFFFF) { - if (--sprite->data[5] == -1) - sub_80F6EF4(sprite->data[6]); + if (--sprite->sSlideOutTimer == -1) + StartTextBoxSlideOut(sprite->sSlideIncrement); } } -static void sub_80F7014(struct Sprite *sprite) +static void SpriteCB_TextBoxSlideOut(struct Sprite *sprite) { int i; s16 delta; - delta = sprite->data[7] + sprite->data[6]; + delta = sprite->sDistance + sprite->sSlideIncrement; sprite->pos1.x -= delta >> 8; - sprite->data[7] += sprite->data[6]; - sprite->data[7] &= 0xFF; + sprite->sDistance += sprite->sSlideIncrement; + sprite->sDistance &= 0xFF; for (i = 0; i < 3; i++) { struct Sprite *sprite2 = &gSprites[sprite->data[i]]; @@ -1569,25 +1606,25 @@ static void sub_80F7014(struct Sprite *sprite) } if (sprite->pos1.x + sprite->pos2.x < -224) - sub_80F6F40(sprite); + EndTextBoxSlideOut(sprite); } -static void sub_80F707C(const u8 *text) +static void ShowLinkResultsTextBox(const u8 *text) { int i; u16 x; struct Sprite *sprite; - x = sub_80F6B78(text, gUnknown_0203A034->unk0->unk1); - sprite = &gSprites[gUnknown_0203A034->unk0->unk1]; + x = DrawResultsTextWindow(text, sContestResults->data->linkTextBoxSpriteId); + sprite = &gSprites[sContestResults->data->linkTextBoxSpriteId]; sprite->pos1.x = x + 32; sprite->pos1.y = 80; - sprite->invisible = 0; + sprite->invisible = FALSE; for (i = 0; i < 3; i++) { gSprites[sprite->data[i]].pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64; gSprites[sprite->data[i]].pos1.y = sprite->pos1.y; - gSprites[sprite->data[i]].invisible = 0; + gSprites[sprite->data[i]].invisible = FALSE; } gBattle_WIN0H = 0x00F0; @@ -1596,15 +1633,15 @@ static void sub_80F707C(const u8 *text) | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR); } -static void sub_80F7144(void) +static void HideLinkResultsTextBox(void) { int i; struct Sprite *sprite; - sprite = &gSprites[gUnknown_0203A034->unk0->unk1]; - sprite->invisible = 1; + sprite = &gSprites[sContestResults->data->linkTextBoxSpriteId]; + sprite->invisible = TRUE; for (i = 0; i < 3; i++) - gSprites[sprite->data[i]].invisible = 1; + gSprites[sprite->data[i]].invisible = TRUE; gBattle_WIN0H = 0; gBattle_WIN0V = 0; @@ -1614,7 +1651,7 @@ static void sub_80F7144(void) | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); } -static void sub_80F71C8(void) +static void LoadContestResultsTilemaps(void) { u8 palette; int x, y; @@ -1623,147 +1660,153 @@ static void sub_80F71C8(void) y = 1; if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) { - CopyToBgTilemapBufferRect(2, gUnknown_08DC6498, 5, 1, 5, 2); + CopyToBgTilemapBufferRect(2, gLinkContestResults_Tilemap, 5, 1, 5, 2); x = 10; } else if (gSpecialVar_ContestRank == CONTEST_RANK_NORMAL) { - CopyToBgTilemapBufferRect(2, gUnknown_08DC63F8, 5, 1, 10, 2); + CopyToBgTilemapBufferRect(2, gNormalContestResults_Tilemap, 5, 1, 10, 2); x = 15; } else if (gSpecialVar_ContestRank == CONTEST_RANK_SUPER) { - CopyToBgTilemapBufferRect(2, gUnknown_08DC6420, 5, 1, 10, 2); + CopyToBgTilemapBufferRect(2, gSuperContestResults_Tilemap, 5, 1, 10, 2); x = 15; } else if (gSpecialVar_ContestRank == CONTEST_RANK_HYPER) { - CopyToBgTilemapBufferRect(2, gUnknown_08DC6448, 5, 1, 10, 2); + CopyToBgTilemapBufferRect(2, gHyperContestResults_Tilemap, 5, 1, 10, 2); x = 15; } else // CONTEST_RANK_MASTER { - CopyToBgTilemapBufferRect(2, gUnknown_08DC6470, 5, 1, 10, 2); + CopyToBgTilemapBufferRect(2, gMasterContestResults_Tilemap, 5, 1, 10, 2); x = 15; } if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_COOL) { palette = 0; - CopyToBgTilemapBufferRect(2, gUnknown_08DC64AC, x, y, 5, 2); + CopyToBgTilemapBufferRect(2, gCoolContestResults_Tilemap, x, y, 5, 2); } else if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_BEAUTY) { palette = 1; - CopyToBgTilemapBufferRect(2, gUnknown_08DC64C0, x, y, 5, 2); + CopyToBgTilemapBufferRect(2, gBeautyContestResults_Tilemap, x, y, 5, 2); } else if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_CUTE) { palette = 2; - CopyToBgTilemapBufferRect(2, gUnknown_08DC64D4, x, y, 5, 2); + CopyToBgTilemapBufferRect(2, gCuteContestResults_Tilemap, x, y, 5, 2); } else if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_SMART) { palette = 3; - CopyToBgTilemapBufferRect(2, gUnknown_08DC64E8, x, y, 5, 2); + CopyToBgTilemapBufferRect(2, gSmartContestResults_Tilemap, x, y, 5, 2); } else // CONTEST_CATEGORY_TOUGH { palette = 4; - CopyToBgTilemapBufferRect(2, gUnknown_08DC64FC, x, y, 5, 2); + CopyToBgTilemapBufferRect(2, gToughContestResults_Tilemap, x, y, 5, 2); } x += 5; - CopyToBgTilemapBufferRect(2, gUnknown_08DC6510, x, y, 6, 2); - CopyToBgTilemapBufferRect_ChangePalette(2, gUnknown_0203A034->unkC[2], 0, 0, 32, 4, palette); + CopyToBgTilemapBufferRect(2, gContestResults_Tilemap, x, y, 6, 2); + CopyToBgTilemapBufferRect_ChangePalette(2, sContestResults->tilemapBuffers[2], 0, 0, 32, 4, palette); } -u8 sub_80F7310(u8 monIndex, u8 arg1) +// Represented on results board as stars +static u8 GetNumPreliminaryPoints(u8 monIndex, bool8 capPoints) { - u32 var0 = gContestMonConditions[monIndex] << 16; - u32 var1 = var0 / 0x3F; + u32 condition = gContestMonConditions[monIndex] << 16; + u32 numStars = condition / 0x3F; - if (var1 & 0xFFFF) - var1 += 0x10000; + if (numStars & 0xFFFF) + numStars += 0x10000; - var1 >>= 16; - if (var1 == 0 && var0) - var1 = 1; + numStars >>= 16; + if (numStars == 0 && condition) + numStars = 1; - if (arg1 && var1 > 10) - var1 = 10; + if (capPoints && numStars > 10) + numStars = 10; - return var1; + return numStars; } -s8 sub_80F7364(u8 arg0, u8 arg1) +// Represented on results board as hearts +static s8 GetNumRound2Points(u8 monIndex, bool8 capPoints) { - u32 r4, r2; - s16 val; - s8 ret; + u32 r4, numHearts; + s16 results; + s8 points; - val = gUnknown_02039F18[arg0]; - if (val < 0) - r4 = -val << 16; + results = gContestMonRound2Points[monIndex]; + if (results < 0) + r4 = -results << 16; else - r4 = val << 16; + r4 = results << 16; - r2 = r4 / 80; - if (r2 & 0xFFFF) - r2 += 0x10000; + numHearts = r4 / 80; + if (numHearts & 0xFFFF) + numHearts += 0x10000; - r2 >>= 16; - if (r2 == 0 && r4 != 0) - r2 = 1; + numHearts >>= 16; + if (numHearts == 0 && r4 != 0) + numHearts = 1; - if (arg1 != 0 && r2 > 10) - r2 = 10; + if (capPoints && numHearts > 10) + numHearts = 10; - if (gUnknown_02039F18[arg0] < 0) - ret = -r2; + if (gContestMonRound2Points[monIndex] < 0) + points = -numHearts; else - ret = r2; + points = numHearts; - return ret; + return points; } -static void sub_80F73DC(u8 taskId) +#define tState data[10] + +static void Task_DrawFinalStandingNumber(u8 taskId) { u16 firstTileNum; - if (gTasks[taskId].data[10] == 0) + if (gTasks[taskId].tState == 0) { - gTasks[taskId].data[11] = (3 - gTasks[taskId].data[0]) * 40; - gTasks[taskId].data[10]++; + gTasks[taskId].data[11] = (3 - gTasks[taskId].tFinalStanding) * 40; + gTasks[taskId].tState++; } - else if (gTasks[taskId].data[10] == 1) + else if (gTasks[taskId].tState == 1) { if (--gTasks[taskId].data[11] == -1) { - firstTileNum = gTasks[taskId].data[0] * 2 + 0x5043; - WriteSequenceToBgTilemapBuffer(2, firstTileNum, 1, gTasks[taskId].data[1] * 3 + 5, 2, 1, 17, 1); - WriteSequenceToBgTilemapBuffer(2, firstTileNum + 0x10, 1, gTasks[taskId].data[1] * 3 + 6, 2, 1, 17, 1); - gUnknown_0203A034->unk0->unk5++; + firstTileNum = gTasks[taskId].tFinalStanding * 2 + 0x5043; + WriteSequenceToBgTilemapBuffer(2, firstTileNum, 1, gTasks[taskId].tMonIndex * 3 + 5, 2, 1, 17, 1); + WriteSequenceToBgTilemapBuffer(2, firstTileNum + 0x10, 1, gTasks[taskId].tMonIndex * 3 + 6, 2, 1, 17, 1); + sContestResults->data->numStandingsPrinted++; DestroyTask(taskId); PlaySE(SE_JYUNI); } } } -static void sub_80F74BC(u8 taskId) +#undef tFinalStanding +#undef tMonIndex +#undef tState + +static void Task_StartHighlightWinnersBox(u8 taskId) { int i; - for (i = 0; i < CONTESTANT_COUNT && gContestFinalStandings[i] != 0; i++) - ; - - CopyToBgTilemapBufferRect_ChangePalette(2, i * 0xC0 + 0x100 + gUnknown_0203A034->unkC[2], 0, i * 3 + 4, 32, 3, 9); + GET_CONTEST_WINNER_ID(i); + CopyToBgTilemapBufferRect_ChangePalette(2, i * 0xC0 + 0x100 + sContestResults->tilemapBuffers[2], 0, i * 3 + 4, 32, 3, 9); gTasks[taskId].data[10] = i; gTasks[taskId].data[12] = 1; - gTasks[taskId].func = sub_80F753C; - gUnknown_0203A034->unk0->unk3 = taskId; + gTasks[taskId].func = Task_HighlightWinnersBox; + sContestResults->data->highlightWinnerTaskId = taskId; } -static void sub_80F753C(u8 taskId) +static void Task_HighlightWinnersBox(u8 taskId) { if (++gTasks[taskId].data[11] == 1) { @@ -1782,7 +1825,7 @@ static void sub_80F753C(u8 taskId) } } -static void sub_80F75A8(struct Sprite *sprite) +static void SpriteCB_WinnerMonSlideIn(struct Sprite *sprite) { if (sprite->data[0] < 10) { @@ -1805,12 +1848,12 @@ static void sub_80F75A8(struct Sprite *sprite) { sprite->callback = SpriteCallbackDummy; sprite->data[1] = 0; - gUnknown_0203A034->unk0->unk6 = 1; + sContestResults->data->winnerMonSlidingState = SLIDING_MON_ENTERED; } } } -static void sub_80F7620(struct Sprite *sprite) +static void SpriteCB_WinnerMonSlideOut(struct Sprite *sprite) { s16 delta = sprite->data[1] + 0x600; sprite->pos1.x -= delta >> 8; @@ -1819,28 +1862,28 @@ static void sub_80F7620(struct Sprite *sprite) if (sprite->pos1.x < -32) { sprite->callback = SpriteCallbackDummy; - sprite->invisible = 1; - gUnknown_0203A034->unk0->unk6 = 2; + sprite->invisible = TRUE; + sContestResults->data->winnerMonSlidingState = SLIDING_MON_EXITED; } } -static void sub_80F7670(u8 taskId) +static void Task_CreateConfetti(u8 taskId) { if (++gTasks[taskId].data[0] == 5) { gTasks[taskId].data[0] = 0; - if (gUnknown_0203A034->unk0->unk7 < 40) + if (sContestResults->data->confettiCount < 40) { u8 spriteId = CreateSprite(&sSpriteTemplate_Confetti, (Random() % 240) - 20, 44, 5); gSprites[spriteId].data[0] = Random() % 512; gSprites[spriteId].data[1] = (Random() % 24) + 16; gSprites[spriteId].data[2] = (Random() % 256) + 48; gSprites[spriteId].oam.tileNum += Random() % 17; - gUnknown_0203A034->unk0->unk7++; + sContestResults->data->confettiCount++; } } - if (gUnknown_0203A034->unk0->unk9) + if (sContestResults->data->destroyConfetti) DestroyTask(taskId); } @@ -1856,219 +1899,235 @@ static void SpriteCB_Confetti(struct Sprite *sprite) sprite->data[4] &= 0xff; sprite->pos1.y++; - if (gUnknown_0203A034->unk0->unk9) - sprite->invisible = 1; + if (sContestResults->data->destroyConfetti) + sprite->invisible = TRUE; if (sprite->pos1.x > 248 || sprite->pos1.y > 116) { DestroySprite(sprite); - gUnknown_0203A034->unk0->unk7--; + sContestResults->data->confettiCount--; } } -static void sub_80F77E0(u8 monIndex, u8 numFrames) +#define tMonIndex data[0] +#define tNumFrames data[1] +#define tSpecies data[2] +#define tTimer data[10] +#define tBounced data[11] + +static void BounceMonIconInBox(u8 monIndex, u8 numFrames) { - u8 taskId = CreateTask(sub_80F7824, 8); - gTasks[taskId].data[0] = monIndex; - gTasks[taskId].data[1] = numFrames; - gTasks[taskId].data[2] = gContestMons[monIndex].species; + u8 taskId = CreateTask(Task_BounceMonIconInBox, 8); + gTasks[taskId].tMonIndex = monIndex; + gTasks[taskId].tNumFrames = numFrames; + gTasks[taskId].tSpecies = gContestMons[monIndex].species; } -static void sub_80F7824(u8 taskId) +static void Task_BounceMonIconInBox(u8 taskId) { - u8 monIndex = gTasks[taskId].data[0]; - if (gTasks[taskId].data[10]++ == gTasks[taskId].data[1]) + u8 monIndex = gTasks[taskId].tMonIndex; + if (gTasks[taskId].tTimer++ == gTasks[taskId].tNumFrames) { - gTasks[taskId].data[10] = 0; - sub_80F69B8(gTasks[taskId].data[2], monIndex, gTasks[taskId].data[11], FALSE, gContestMons[monIndex].personality); - gTasks[taskId].data[11] ^= 1; + gTasks[taskId].tTimer = 0; + LoadContestMonIcon(gTasks[taskId].tSpecies, monIndex, gTasks[taskId].tBounced, FALSE, gContestMons[monIndex].personality); + gTasks[taskId].tBounced ^= 1; } } -static void sub_80F7880(void) +#undef tMonIndex +#undef tNumFrames +#undef tSpecies +#undef tTimer +#undef tBounced + +static void CalculateContestantsResultData(void) { - int i, r4; - u32 r1; - s16 r2; - s8 var; + int i, relativePoints; + u32 barLength; + s16 highestPoints; + s8 round2Points; - r2 = gUnknown_02039F08[0]; - for (i = 1; i < 4; i++) + highestPoints = gContestMonTotalPoints[0]; + for (i = 1; i < CONTESTANT_COUNT; i++) { - if (r2 < gUnknown_02039F08[i]) - r2 = gUnknown_02039F08[i]; + if (highestPoints < gContestMonTotalPoints[i]) + highestPoints = gContestMonTotalPoints[i]; } - if (r2 < 0) + if (highestPoints < 0) { - r2 = gUnknown_02039F08[0]; - for (i = 1; i < 4; i++) + highestPoints = gContestMonTotalPoints[0]; + for (i = 1; i < CONTESTANT_COUNT; i++) { - if (r2 > gUnknown_02039F08[i]) - r2 = gUnknown_02039F08[i]; + if (highestPoints > gContestMonTotalPoints[i]) + highestPoints = gContestMonTotalPoints[i]; } } for (i = 0; i < CONTESTANT_COUNT; i++) { - r4 = (gContestMonConditions[i] * 1000) / abs(r2); - if (r4 % 10 > 4) - r4 += 10; - (*gUnknown_0203A034->unk4)[i].unk0 = r4 / 10; + relativePoints = (gContestMonConditions[i] * 1000) / abs(highestPoints); + if (relativePoints % 10 > 4) + relativePoints += 10; + (*sContestResults->monResults)[i].relativePreliminaryPoints = relativePoints / 10; - r4 = (abs(gUnknown_02039F18[i]) * 1000) / abs(r2); - if (r4 % 10 > 4) - r4 += 10; - (*gUnknown_0203A034->unk4)[i].unk4 = r4 / 10; + relativePoints = (abs(gContestMonRound2Points[i]) * 1000) / abs(highestPoints); + if (relativePoints % 10 > 4) + relativePoints += 10; + (*sContestResults->monResults)[i].relativeRound2Points = relativePoints / 10; - if (gUnknown_02039F18[i] < 0) - (*gUnknown_0203A034->unk4)[i].unk10 = 1; + if (gContestMonRound2Points[i] < 0) + (*sContestResults->monResults)[i].lostPoints = TRUE; - r1 = ((*gUnknown_0203A034->unk4)[i].unk0 * 22528) / 100; - if ((r1 & 0xFF) > 0x7F) - r1 += 0x100; - (*gUnknown_0203A034->unk4)[i].unk8 = r1 >> 8; + barLength = ((*sContestResults->monResults)[i].relativePreliminaryPoints * 0x5800) / 100; + if ((barLength & 0xFF) > 0x7F) + barLength += 0x100; + (*sContestResults->monResults)[i].barLengthPreliminary = barLength >> 8; - r1 = ((*gUnknown_0203A034->unk4)[i].unk4 * 22528) / 100; - if ((r1 & 0xFF) > 0x7F) - r1 += 0x100; - (*gUnknown_0203A034->unk4)[i].unkC = r1 >> 8; + barLength = ((*sContestResults->monResults)[i].relativeRound2Points * 0x5800) / 100; + if ((barLength & 0xFF) > 0x7F) + barLength += 0x100; + (*sContestResults->monResults)[i].barLengthRound2 = barLength >> 8; - (*gUnknown_0203A034->unk4)[i].unk11 = sub_80F7310(i, 1); - var = sub_80F7364(i, 1); - (*gUnknown_0203A034->unk4)[i].unk12 = abs(var); + (*sContestResults->monResults)[i].numStars = GetNumPreliminaryPoints(i, TRUE); + round2Points = GetNumRound2Points(i, TRUE); + (*sContestResults->monResults)[i].numHearts = abs(round2Points); if (gContestFinalStandings[i]) { - s16 var1 = (*gUnknown_0203A034->unk4)[i].unk8; - s16 var2 = (*gUnknown_0203A034->unk4)[i].unkC; + s16 barLengthPreliminary = (*sContestResults->monResults)[i].barLengthPreliminary; + s16 barLengthRound2 = (*sContestResults->monResults)[i].barLengthRound2; - if ((*gUnknown_0203A034->unk4)[i].unk10) - var2 *= -1; + if ((*sContestResults->monResults)[i].lostPoints) + barLengthRound2 *= -1; - if (var1 + var2 == 88) + if (barLengthPreliminary + barLengthRound2 == MAX_BAR_LENGTH + 1) { - if (var2 > 0) - (*gUnknown_0203A034->unk4)[i].unkC--; - else if (var1 > 0) - (*gUnknown_0203A034->unk4)[i].unk8--; + if (barLengthRound2 > 0) + (*sContestResults->monResults)[i].barLengthRound2--; + else if (barLengthPreliminary > 0) + (*sContestResults->monResults)[i].barLengthPreliminary--; } } } } -static void sub_80F7A80(u8 arg0, u8 arg1) +#define tMonId data[0] +#define tTarget data[1] +#define tDecreasing data[2] + +static void UpdateContestResultBars(bool8 isRound2, u8 numUpdates) { int i, taskId; - u32 var0; - u8 sp8 = 0, spC = 0; + u32 target; + u8 numIncreasing = 0, numDecreasing = 0; - if (!arg0) + if (!isRound2) { - for (i = 0; i < 4; i++) + for (i = 0; i < CONTESTANT_COUNT; i++) { - u8 unk = (*gUnknown_0203A034->unk4)[i].unk11; - if (arg1 < unk) + u8 numStars = (*sContestResults->monResults)[i].numStars; + if (numUpdates < numStars) { - FillBgTilemapBufferRect_Palette0(1, 0x60B3, ((19 + unk) - arg1) - 1, i * 3 + 5, 1, 1); - taskId = CreateTask(sub_80F7CA8, 10); + FillBgTilemapBufferRect_Palette0(1, 0x60B3, ((19 + numStars) - numUpdates) - 1, i * 3 + 5, 1, 1); + taskId = CreateTask(Task_UpdateContestResultBar, 10); - var0 = (((*gUnknown_0203A034->unk4)[i].unk8 << 16) / (*gUnknown_0203A034->unk4)[i].unk11) * (arg1 + 1); - if ((var0 & 0xFFFF) > 0x7FFF) - var0 += 0x10000; + target = (((*sContestResults->monResults)[i].barLengthPreliminary << 16) / (*sContestResults->monResults)[i].numStars) * (numUpdates + 1); + if ((target & 0xFFFF) > 0x7FFF) + target += 0x10000; - gTasks[taskId].data[0] = i; - gTasks[taskId].data[1] = var0 >> 16; - gUnknown_0203A034->unk0->unk14++; - sp8++; + gTasks[taskId].tMonId = i; + gTasks[taskId].tTarget = target >> 16; + sContestResults->data->numBarsUpdating++; + numIncreasing++; } } } else { - for (i = 0; i < 4; i++) + for (i = 0; i < CONTESTANT_COUNT; i++) { - s8 unk = (*gUnknown_0203A034->unk4)[i].unk12; - u32 tile = (*gUnknown_0203A034->unk4)[i].unk10 ? 0x60A5 : 0x60A3; - if (arg1 < unk) + s8 numHearts = (*sContestResults->monResults)[i].numHearts; + u32 tile = (*sContestResults->monResults)[i].lostPoints ? 0x60A5 : 0x60A3; + if (numUpdates < numHearts) { - FillBgTilemapBufferRect_Palette0(1, tile, ((19 + unk) - arg1) - 1, i * 3 + 6, 1, 1); - taskId = CreateTask(sub_80F7CA8, 10); + FillBgTilemapBufferRect_Palette0(1, tile, ((19 + numHearts) - numUpdates) - 1, i * 3 + 6, 1, 1); + taskId = CreateTask(Task_UpdateContestResultBar, 10); - var0 = (((*gUnknown_0203A034->unk4)[i].unkC << 16) / (*gUnknown_0203A034->unk4)[i].unk12) * (arg1 + 1); - if ((var0 & 0xFFFF) > 0x7FFF) - var0 += 0x10000; + target = (((*sContestResults->monResults)[i].barLengthRound2 << 16) / (*sContestResults->monResults)[i].numHearts) * (numUpdates + 1); + if ((target & 0xFFFF) > 0x7FFF) + target += 0x10000; - gTasks[taskId].data[0] = i; - if ((*gUnknown_0203A034->unk4)[i].unk10) + gTasks[taskId].tMonId = i; + if ((*sContestResults->monResults)[i].lostPoints) { - gTasks[taskId].data[2] = 1; - spC++; + gTasks[taskId].tDecreasing = TRUE; + numDecreasing++; } else { - sp8++; + numIncreasing++; } - if ((*gUnknown_0203A034->unk4)[i].unk10) - gTasks[taskId].data[1] = -(var0 >> 16) + (*gUnknown_0203A034->unk4)[i].unk8 ; + if ((*sContestResults->monResults)[i].lostPoints) + gTasks[taskId].tTarget = -(target >> 16) + (*sContestResults->monResults)[i].barLengthPreliminary; else - gTasks[taskId].data[1] = (var0 >> 16) + (*gUnknown_0203A034->unk4)[i].unk8; + gTasks[taskId].tTarget = (target >> 16) + (*sContestResults->monResults)[i].barLengthPreliminary; - gUnknown_0203A034->unk0->unk14++; + sContestResults->data->numBarsUpdating++; } } } - if (spC) + if (numDecreasing) PlaySE(SE_BOO); - if (sp8) + if (numIncreasing) PlaySE(SE_PIN); } -void sub_80F7CA8(u8 taskId) +static void Task_UpdateContestResultBar(u8 taskId) { int i; - u8 var0; - u16 tileNum; - bool32 r4 = FALSE; - bool32 endTask = FALSE; - u8 r6 = gTasks[taskId].data[0]; - s16 r7 = gTasks[taskId].data[1]; - s16 r12 = gTasks[taskId].data[2]; + bool32 minMaxReached = FALSE; + bool32 targetReached = FALSE; + u8 monId = gTasks[taskId].tMonId; + s16 target = gTasks[taskId].tTarget; + s16 decreasing = gTasks[taskId].tDecreasing; - if (r12) + if (decreasing) { - if (gUnknown_0203A034->unk0->unkC[r6] <= 0) - r4 = TRUE; + if (sContestResults->data->unkC[monId] <= 0) + minMaxReached = TRUE; } else { - if (gUnknown_0203A034->unk0->unkC[r6] > 87) - r4 = TRUE; + if (sContestResults->data->unkC[monId] > MAX_BAR_LENGTH) + minMaxReached = TRUE; } - if (gUnknown_0203A034->unk0->unkC[r6] == r7) - endTask = TRUE; + if (sContestResults->data->unkC[monId] == target) + targetReached = TRUE; - if (!endTask) + if (!targetReached) { - if (r4) - gUnknown_0203A034->unk0->unkC[r6] = r7; - else if (r12) - gUnknown_0203A034->unk0->unkC[r6] = gUnknown_0203A034->unk0->unkC[r6] - 1; + if (minMaxReached) + sContestResults->data->unkC[monId] = target; + else if (decreasing) + sContestResults->data->unkC[monId] = sContestResults->data->unkC[monId] - 1; else - gUnknown_0203A034->unk0->unkC[r6] = gUnknown_0203A034->unk0->unkC[r6] + 1; + sContestResults->data->unkC[monId] = sContestResults->data->unkC[monId] + 1; } - if (!r4 && !endTask) + if (!minMaxReached && !targetReached) { + u8 var0; + u16 tileNum; for (i = 0; i < 11; i++) { - if (gUnknown_0203A034->unk0->unkC[r6] >= (i + 1) * 8) + if (sContestResults->data->unkC[monId] >= (i + 1) * 8) var0 = 8; - else if (gUnknown_0203A034->unk0->unkC[r6] >= i * 8) - var0 = gUnknown_0203A034->unk0->unkC[r6] % 8; + else if (sContestResults->data->unkC[monId] >= i * 8) + var0 = sContestResults->data->unkC[monId] % 8; else var0 = 0; @@ -2077,54 +2136,58 @@ void sub_80F7CA8(u8 taskId) else tileNum = 0x5057 + var0; - FillBgTilemapBufferRect_Palette0(2, tileNum, i + 7, r6 * 3 + 6, 1, 1); + FillBgTilemapBufferRect_Palette0(2, tileNum, i + 7, monId * 3 + 6, 1, 1); } } - if (endTask) + if (targetReached) { - gUnknown_0203A034->unk0->unk14--; + sContestResults->data->numBarsUpdating--; DestroyTask(taskId); } } -static void sub_80F7DF4(void) +#undef tMonId +#undef tTarget +#undef tDecreasing + +static void AllocContestResults(void) { - gUnknown_0203A034 = AllocZeroed(sizeof(*gUnknown_0203A034)); - gUnknown_0203A034->unk0 = AllocZeroed(sizeof(*gUnknown_0203A034->unk0)); - gUnknown_0203A034->unk4 = AllocZeroed(sizeof(*gUnknown_0203A034->unk4)); - gUnknown_0203A034->unk8 = AllocZeroed(BG_SCREEN_SIZE); - gUnknown_0203A034->unkC[0] = AllocZeroed(BG_SCREEN_SIZE); - gUnknown_0203A034->unkC[1] = AllocZeroed(BG_SCREEN_SIZE); - gUnknown_0203A034->unkC[2] = AllocZeroed(BG_SCREEN_SIZE); - gUnknown_0203A034->unkC[3] = AllocZeroed(BG_SCREEN_SIZE); - gUnknown_0203A034->unk1C = AllocZeroed(0x1000); + sContestResults = AllocZeroed(sizeof(*sContestResults)); + sContestResults->data = AllocZeroed(sizeof(*sContestResults->data)); + sContestResults->monResults = AllocZeroed(sizeof(*sContestResults->monResults)); + sContestResults->unusedBg = AllocZeroed(BG_SCREEN_SIZE); + sContestResults->tilemapBuffers[0] = AllocZeroed(BG_SCREEN_SIZE); + sContestResults->tilemapBuffers[1] = AllocZeroed(BG_SCREEN_SIZE); + sContestResults->tilemapBuffers[2] = AllocZeroed(BG_SCREEN_SIZE); + sContestResults->tilemapBuffers[3] = AllocZeroed(BG_SCREEN_SIZE); + sContestResults->unused = AllocZeroed(0x1000); AllocateMonSpritesGfx(); } -static void sub_80F7E64(void) +static void FreeContestResults(void) { - FREE_AND_SET_NULL(gUnknown_0203A034->unk0); - FREE_AND_SET_NULL(gUnknown_0203A034->unk4); - FREE_AND_SET_NULL(gUnknown_0203A034->unk8); - FREE_AND_SET_NULL(gUnknown_0203A034->unkC[0]); - FREE_AND_SET_NULL(gUnknown_0203A034->unkC[1]); - FREE_AND_SET_NULL(gUnknown_0203A034->unkC[2]); - FREE_AND_SET_NULL(gUnknown_0203A034->unkC[3]); - FREE_AND_SET_NULL(gUnknown_0203A034->unk1C); - FREE_AND_SET_NULL(gUnknown_0203A034); + FREE_AND_SET_NULL(sContestResults->data); + FREE_AND_SET_NULL(sContestResults->monResults); + FREE_AND_SET_NULL(sContestResults->unusedBg); + FREE_AND_SET_NULL(sContestResults->tilemapBuffers[0]); + FREE_AND_SET_NULL(sContestResults->tilemapBuffers[1]); + FREE_AND_SET_NULL(sContestResults->tilemapBuffers[2]); + FREE_AND_SET_NULL(sContestResults->tilemapBuffers[3]); + FREE_AND_SET_NULL(sContestResults->unused); + FREE_AND_SET_NULL(sContestResults); FreeMonSpritesGfx(); } -static void sub_80F7ED0(int windowId, u8 *str, int arg2) +static void AddContestTextPrinter(int windowId, u8 *str, int x) { struct TextPrinterTemplate textPrinter; textPrinter.currentChar = str; textPrinter.windowId = windowId; textPrinter.fontId = 7; - textPrinter.x = arg2; + textPrinter.x = x; textPrinter.y = 2; - textPrinter.currentX = arg2; + textPrinter.currentX = x; textPrinter.currentY = 2; textPrinter.letterSpacing = 0; textPrinter.lineSpacing = 0; @@ -2276,20 +2339,14 @@ void GetContestMonCondition(void) void GetContestWinnerId(void) { u8 i; - - for (i = 0; i < CONTESTANT_COUNT && gContestFinalStandings[i] != 0; i++) - ; - + GET_CONTEST_WINNER_ID(i); gSpecialVar_0x8005 = i; } void BufferContestWinnerTrainerName(void) { u8 i; - - for (i = 0; i < CONTESTANT_COUNT && gContestFinalStandings[i] != 0; i++) - ; - + GET_CONTEST_WINNER_ID(i); StringCopy(gStringVar3, gContestMons[i].trainerName); sub_81DB5AC(gStringVar3); } @@ -2297,10 +2354,7 @@ void BufferContestWinnerTrainerName(void) void BufferContestWinnerMonName(void) { u8 i; - - for (i = 0; i < CONTESTANT_COUNT && gContestFinalStandings[i] != 0; i++) - ; - + GET_CONTEST_WINNER_ID(i); StringCopy(gStringVar1, gContestMons[i].nickname); } @@ -2330,19 +2384,19 @@ void BufferContestantMonSpecies(void) gSpecialVar_0x8004 = gContestMons[gSpecialVar_0x8006].species; } -static void sub_80F8458(u8 taskId) +static void Task_StartShowContestResults(u8 taskId) { if (!gPaletteFade.active) { DestroyTask(taskId); - SetMainCallback2(sub_80F5B00); + SetMainCallback2(CB2_StartShowContestResults); } } -void sub_80F8484(void) +void ShowContestResults(void) { ScriptContext2_Enable(); - CreateTask(sub_80F8458, 10); + CreateTask(Task_StartShowContestResults, 10); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); } @@ -2351,7 +2405,7 @@ void GetContestPlayerId(void) gSpecialVar_0x8004 = gContestPlayerMonIndex; } -void sub_80F84C4(u8 taskId) +void ContestLinkTransfer(u8 taskId) { u8 newTaskId; ScriptContext2_Enable(); diff --git a/src/contest_link_80FC4F4.c b/src/contest_link_80FC4F4.c index d6cfea638..e17f62485 100644 --- a/src/contest_link_80FC4F4.c +++ b/src/contest_link_80FC4F4.c @@ -296,14 +296,14 @@ void sub_80FCACC(u8 taskId) case 0: if (IsLinkTaskFinished()) { - if (sub_80FC4F4(gUnknown_02039F08, sizeof(gUnknown_02039F08)) == 1) + if (sub_80FC4F4(gContestMonTotalPoints, sizeof(gContestMonTotalPoints)) == 1) gTasks[taskId].data[0]++; } break; case 1: if (sub_80FC55C()) { - memcpy(gUnknown_02039F08, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gUnknown_02039F08)); + memcpy(gContestMonTotalPoints, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestMonTotalPoints)); gTasks[taskId].data[0]++; } break; @@ -334,14 +334,14 @@ void sub_80FCACC(u8 taskId) case 6: if (IsLinkTaskFinished()) { - if (sub_80FC4F4(gUnknown_02039F18, sizeof(gUnknown_02039F18)) == 1) + if (sub_80FC4F4(gContestMonRound2Points, sizeof(gContestMonRound2Points)) == 1) gTasks[taskId].data[0]++; } break; case 7: if (sub_80FC55C()) { - memcpy(gUnknown_02039F18, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gUnknown_02039F18)); + memcpy(gContestMonRound2Points, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestMonRound2Points)); gTasks[taskId].data[0]++; } break; diff --git a/src/contest_painting.c b/src/contest_painting.c index 7f33cac09..5dd4a70a5 100644 --- a/src/contest_painting.c +++ b/src/contest_painting.c @@ -170,7 +170,7 @@ void SetContestWinnerForPainting(int contestWinnerId) u8 *ptr2 = &gUnknown_02039F5C; gCurContestWinner = gSaveBlock1Ptr->contestWinners[contestWinnerId - 1]; *ptr1 = contestWinnerId - 1; - *ptr2 = 0; + *ptr2 = FALSE; } void CB2_ContestPainting(void) @@ -281,7 +281,7 @@ static void InitContestPaintingWindow(void) ShowBg(1); } -static void PrintContestPaintingCaption(u8 contestType, u8 arg1) +static void PrintContestPaintingCaption(u8 contestType, bool8 arg1) { int x; u8 category; @@ -519,12 +519,14 @@ _081303F8:\n\ } #endif -static void LoadContestPaintingFrame(u8 contestWinnerId, u8 arg1) +#define VRAM_PICTURE_DATA(x, y) (((u16 *)(BG_SCREEN_ADDR(12)))[(y) * 32 + (x)]) + +static void LoadContestPaintingFrame(u8 contestWinnerId, bool8 arg1) { u8 x, y; LoadPalette(gPictureFramePalettes, 0, 0x100); - if (arg1 == 1) + if (arg1 == TRUE) { switch (gContestPaintingWinner->contestCategory / 3) { @@ -550,8 +552,6 @@ static void LoadContestPaintingFrame(u8 contestWinnerId, u8 arg1) break; } -#define VRAM_PICTURE_DATA(x, y) (((u16 *)(BG_SCREEN_ADDR(12)))[(y) * 32 + (x)]) - // Set the background for (y = 0; y < 20; y++) { @@ -569,8 +569,6 @@ static void LoadContestPaintingFrame(u8 contestWinnerId, u8 arg1) // Re-set the entire top row to the first top frame part for (x = 0; x < 16; x++) VRAM_PICTURE_DATA(x + 7, 2) = (*gContestMonPixels)[2][7]; - -#undef VRAM_PICTURE_DATA } else if (contestWinnerId < 8) { @@ -605,6 +603,8 @@ static void LoadContestPaintingFrame(u8 contestWinnerId, u8 arg1) } } +#undef VRAM_PICTURE_DATA + static void InitPaintingMonOamData(u8 contestWinnerId) { //Some hacks just to get the asm to match @@ -692,7 +692,7 @@ static void DoContestPaintingImageProcessing(u8 imageEffect) LoadPalette(gContestPaintingMonPalette, 0x100, 0x200); } -static void CreateContestPaintingPicture(u8 contestWinnerId, u8 arg1) +static void CreateContestPaintingPicture(u8 contestWinnerId, bool8 arg1) { AllocPaintingResources(); InitContestMonPixels(gContestPaintingWinner->species, 0); diff --git a/src/field_specials.c b/src/field_specials.c index 818cd70db..e806440f7 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -4095,11 +4095,17 @@ void UpdateTrainerFanClubGameClear(void) } // If the player has < 3 fans, gain a new fan whenever the counter reaches 20+ -// Defeating Drake or participating in a Link Contest increments the counter by 2 +// Defeating Drake or participating in a Contest increments the counter by 2 // Participating at Battle Tower or in a Secret Base battle increments the counter by 1 u8 TryGainNewFanFromCounter(u8 incrementId) { - static const u8 sCounterIncrements[] = { 2, 1, 2, 1 }; + static const u8 sCounterIncrements[] = + { + [FANCOUNTER_DEFEATED_DRAKE] = 2, + [FANCOUNTER_BATTLED_AT_BASE] = 1, + [FANCOUNTER_FINISHED_CONTEST] = 2, + [FANCOUNTER_USED_BATTLE_TOWER] = 1 + }; if (VarGet(VAR_LILYCOVE_FAN_CLUB_STATE) == 2) { diff --git a/src/graphics.c b/src/graphics.c index b3327f4d2..29c6d572e 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -471,13 +471,11 @@ const u8 gTiles_8C19450[] = INCBIN_U8("graphics/contest/heart.4bpp"); const u32 gUnknownGfx_C19470[] = INCBIN_U32("graphics/unknown/unknown_C19470.4bpp.lz"); const u32 gUnknownPal_C19470[] = INCBIN_U32("graphics/unknown/unknown_C19470.gbapal.lz"); -const u32 gUnknown_08C19588[] = INCBIN_U32("graphics/contest/misc_2.4bpp.lz"); - +const u32 gContestResults_Gfx[] = INCBIN_U32("graphics/contest/results_screen.4bpp.lz"); const u32 gUnknown_08C19EEC[] = INCBIN_U32("graphics/contest/misc_2_tilemap_1.bin.lz"); const u32 gUnknown_08C1A000[] = INCBIN_U32("graphics/contest/misc_2_tilemap_2.bin.lz"); const u32 gUnknown_08C1A12C[] = INCBIN_U32("graphics/contest/misc_2_tilemap_3.bin.lz"); - -const u32 gUnknown_08C1A2B4[] = INCBIN_U32("graphics/contest/misc_2.gbapal.lz"); +const u32 gContestResults_Pal[] = INCBIN_U32("graphics/contest/results_screen.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Impact[] = INCBIN_U32("graphics/battle_anims/sprites/impact.4bpp.lz"); const u32 gBattleAnimSpritePal_Impact[] = INCBIN_U32("graphics/battle_anims/sprites/impact.gbapal.lz"); @@ -1298,19 +1296,19 @@ const u8 gFireRedMenuElements_Gfx[] = INCBIN_U8("graphics/interface_fr/menu.4bpp const u8 gBagMenuHMIcon_Gfx[] = INCBIN_U8("graphics/interface/hm.4bpp"); -// contest link stuff, appears to be a set of tilemaps - -const u16 gUnknown_08DC63F8[] = INCBIN_U16("graphics/contest/clink_tilemap1.bin"); -const u16 gUnknown_08DC6420[] = INCBIN_U16("graphics/contest/clink_tilemap2.bin"); -const u16 gUnknown_08DC6448[] = INCBIN_U16("graphics/contest/clink_tilemap3.bin"); -const u16 gUnknown_08DC6470[] = INCBIN_U16("graphics/contest/clink_tilemap4.bin"); -const u16 gUnknown_08DC6498[] = INCBIN_U16("graphics/contest/clink_tilemap5.bin"); -const u16 gUnknown_08DC64AC[] = INCBIN_U16("graphics/contest/clink_tilemap6.bin"); -const u16 gUnknown_08DC64C0[] = INCBIN_U16("graphics/contest/clink_tilemap7.bin"); -const u16 gUnknown_08DC64D4[] = INCBIN_U16("graphics/contest/clink_tilemap8.bin"); -const u16 gUnknown_08DC64E8[] = INCBIN_U16("graphics/contest/clink_tilemap9.bin"); -const u16 gUnknown_08DC64FC[] = INCBIN_U16("graphics/contest/clink_tilemap10.bin"); -const u16 gUnknown_08DC6510[] = INCBIN_U16("graphics/contest/clink_tilemap11.bin"); +// contest results screen + +const u16 gNormalContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_normal.bin"); +const u16 gSuperContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_super.bin"); +const u16 gHyperContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_hyper.bin"); +const u16 gMasterContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_master.bin"); +const u16 gLinkContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_link.bin"); +const u16 gCoolContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_cool.bin"); +const u16 gBeautyContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_beauty.bin"); +const u16 gCuteContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_cute.bin"); +const u16 gSmartContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_smart.bin"); +const u16 gToughContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_tough.bin"); +const u16 gContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen.bin"); // pokenav diff --git a/src/scrcmd.c b/src/scrcmd.c index 9e62c45c5..9c00c3bc8 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1469,7 +1469,9 @@ bool8 ScrCmd_hidemonpic(struct ScriptContext *ctx) bool8 ScrCmd_showcontestwinner(struct ScriptContext *ctx) { u8 contestWinnerId = ScriptReadByte(ctx); - if (contestWinnerId) + + // Don't save artist's painting yet + if (contestWinnerId != CONTEST_WINNER_ARTIST) SetContestWinnerForPainting(contestWinnerId); ShowContestWinner(); @@ -1953,14 +1955,14 @@ bool8 ScrCmd_startcontest(struct ScriptContext *ctx) bool8 ScrCmd_showcontestresults(struct ScriptContext *ctx) { - sub_80F8484(); + ShowContestResults(); ScriptContext1_Stop(); return TRUE; } bool8 ScrCmd_contestlinktransfer(struct ScriptContext *ctx) { - sub_80F84C4(gSpecialVar_ContestCategory); + ContestLinkTransfer(gSpecialVar_ContestCategory); ScriptContext1_Stop(); return TRUE; } diff --git a/src/script_pokemon_util_80F87D8.c b/src/script_pokemon_util_80F87D8.c index 134004fd0..62b445a04 100755 --- a/src/script_pokemon_util_80F87D8.c +++ b/src/script_pokemon_util_80F87D8.c @@ -122,7 +122,7 @@ void ShouldReadyContestArtist(void) { if (gContestFinalStandings[gContestPlayerMonIndex] == 0 && gSpecialVar_ContestRank == CONTEST_RANK_MASTER - && gUnknown_02039F08[gContestPlayerMonIndex] >= 800) + && gContestMonTotalPoints[gContestPlayerMonIndex] >= 800) { gSpecialVar_0x8004 = TRUE; } @@ -304,7 +304,7 @@ u8 GiveMonArtistRibbon(void) if (!hasArtistRibbon && gContestFinalStandings[gContestPlayerMonIndex] == 0 && gSpecialVar_ContestRank == CONTEST_RANK_MASTER - && gUnknown_02039F08[gContestPlayerMonIndex] >= 800) + && gContestMonTotalPoints[gContestPlayerMonIndex] >= 800) { hasArtistRibbon = 1; SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_ARTIST_RIBBON, &hasArtistRibbon); diff --git a/src/secret_base.c b/src/secret_base.c index 172568db6..83626710f 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -37,6 +37,7 @@ #include "constants/event_bg.h" #include "constants/decorations.h" #include "constants/event_objects.h" +#include "constants/field_specials.h" #include "constants/items.h" #include "constants/maps.h" #include "constants/map_types.h" @@ -1120,7 +1121,7 @@ const u8 *GetSecretBaseTrainerLoseText(void) void PrepSecretBaseBattleFlags(void) { - TryGainNewFanFromCounter(1); + TryGainNewFanFromCounter(FANCOUNTER_BATTLED_AT_BASE); gTrainerBattleOpponent_A = TRAINER_SECRET_BASE; gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_SECRET_BASE; } diff --git a/src/strings.c b/src/strings.c index 3ca7f693f..d57b600d6 100644 --- a/src/strings.c +++ b/src/strings.c @@ -1236,7 +1236,7 @@ const u8 gText_BDot[] = _("B."); const u8 gText_AnnouncingResults[] = _("Announcing the results!"); const u8 gText_PreliminaryResults[] = _("The preliminary results!"); const u8 gText_Round2Results[] = _("Round 2 results!"); -const u8 gText_Var1sVar2Won[] = _("{STR_VAR_1}'s {STR_VAR_2} won!"); +const u8 gText_ContestantsMonWon[] = _("{STR_VAR_1}'s {STR_VAR_2} won!"); const u8 gText_CommunicationStandby[] = _("Communication standby…"); const u8 gText_ColorDarkGrey[] = _("{COLOR DARK_GREY}"); const u8 gText_ColorDynamic6WhiteDynamic5[] = _("{COLOR_HIGHLIGHT_SHADOW DYNAMIC_COLOR6 WHITE DYNAMIC_COLOR5}"); // Unused -- cgit v1.2.3 From d2a760afdbb4555e0b831598491e5fe1f410251d Mon Sep 17 00:00:00 2001 From: GriffinR Date: Thu, 18 Jun 2020 18:01:32 -0400 Subject: Rename contest_link_80FC4F4, 80F57C4, and 81D9DE4 --- include/contest_link.h | 13 + include/contest_link_80F57C4.h | 12 - include/contest_link_80FC4F4.h | 13 - include/contest_util.h | 12 + ld_script.txt | 10 +- src/contest.c | 4 +- src/contest_link.c | 549 ++++++++ src/contest_link_80F57C4.c | 2533 ------------------------------------- src/contest_link_80FC4F4.c | 548 -------- src/contest_link_81D9DE4.c | 331 ----- src/contest_link_util.c | 331 +++++ src/contest_util.c | 2533 +++++++++++++++++++++++++++++++++++++ src/scrcmd.c | 2 +- src/script_pokemon_util_80F87D8.c | 2 +- sym_ewram.txt | 2 +- 15 files changed, 3448 insertions(+), 3447 deletions(-) create mode 100644 include/contest_link.h delete mode 100644 include/contest_link_80F57C4.h delete mode 100644 include/contest_link_80FC4F4.h create mode 100644 include/contest_util.h create mode 100644 src/contest_link.c delete mode 100644 src/contest_link_80F57C4.c delete mode 100644 src/contest_link_80FC4F4.c delete mode 100644 src/contest_link_81D9DE4.c create mode 100644 src/contest_link_util.c create mode 100644 src/contest_util.c diff --git a/include/contest_link.h b/include/contest_link.h new file mode 100644 index 000000000..4344d55ad --- /dev/null +++ b/include/contest_link.h @@ -0,0 +1,13 @@ +#ifndef GUARD_CONTEST_LINK_H +#define GUARD_CONTEST_LINK_H + +void sub_80FCC88(u8); +void sub_80FCC88(u8); +void sub_80FCACC(u8); +void sub_80FC580(u8); +void sub_80FC6BC(u8); +void sub_80FC804(u8); +void sub_80FCE48(u8); +void sub_80FC894(u8); + +#endif //GUARD_CONTEST_LINK_H diff --git a/include/contest_link_80F57C4.h b/include/contest_link_80F57C4.h deleted file mode 100644 index 8bbc0f14b..000000000 --- a/include/contest_link_80F57C4.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef GUARD_CONTEST_LINK_80F57C4_H -#define GUARD_CONTEST_LINK_80F57C4_H - -void BufferContestantTrainerName(void); -void BufferContestantMonNickname(void); -void StartContest(void); -void BufferContestantMonSpecies(void); -void ShowContestResults(void); -void ContestLinkTransfer(u8); -void sub_80FC998(u8 taskId); - -#endif // GUARD_CONTEST_LINK_80F57C4_H diff --git a/include/contest_link_80FC4F4.h b/include/contest_link_80FC4F4.h deleted file mode 100644 index a3f118798..000000000 --- a/include/contest_link_80FC4F4.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef GUARD_CONTEST_LINK_80FC4F4_H -#define GUARD_CONTEST_LINK_80FC4F4_H - -void sub_80FCC88(u8); -void sub_80FCC88(u8); -void sub_80FCACC(u8); -void sub_80FC580(u8); -void sub_80FC6BC(u8); -void sub_80FC804(u8); -void sub_80FCE48(u8); -void sub_80FC894(u8); - -#endif //GUARD_CONTEST_LINK_80FC4F4_H diff --git a/include/contest_util.h b/include/contest_util.h new file mode 100644 index 000000000..c0d8df031 --- /dev/null +++ b/include/contest_util.h @@ -0,0 +1,12 @@ +#ifndef GUARD_CONTEST_UTIL_H +#define GUARD_CONTEST_UTIL_H + +void BufferContestantTrainerName(void); +void BufferContestantMonNickname(void); +void StartContest(void); +void BufferContestantMonSpecies(void); +void ShowContestResults(void); +void ContestLinkTransfer(u8); +void sub_80FC998(u8 taskId); + +#endif // GUARD_CONTEST_UTIL_H diff --git a/ld_script.txt b/ld_script.txt index d22c4a0ce..fb4d86300 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -168,7 +168,7 @@ SECTIONS { src/record_mixing.o(.text); src/secret_base.o(.text); src/tv.o(.text); - src/contest_link_80F57C4.o(.text); + src/contest_util.o(.text); src/script_pokemon_util_80F87D8.o(.text); src/field_poison.o(.text); src/pokemon_size_record.o(.text); @@ -176,7 +176,7 @@ SECTIONS { src/field_special_scene.o(.text); src/rotating_gate.o(.text); src/safari_zone.o(.text); - src/contest_link_80FC4F4.o(.text); + src/contest_link.o(.text); src/item_use.o(.text); src/battle_anim_effects_1.o(.text); src/battle_anim_effects_2.o(.text); @@ -328,7 +328,7 @@ SECTIONS { src/trainer_hill.o(.text); src/rayquaza_scene.o(.text); src/walda_phrase.o(.text); - src/contest_link_81D9DE4.o(.text); + src/contest_link_util.o(.text); src/gym_leader_rematch.o(.text); src/unk_transition.o(.text); src/international_string_util.o(.text); @@ -542,13 +542,13 @@ SECTIONS { src/record_mixing.o(.rodata); src/secret_base.o(.rodata); src/tv.o(.rodata); - src/contest_link_80F57C4.o(.rodata); + src/contest_util.o(.rodata); src/script_pokemon_util_80F87D8.o(.rodata); src/pokemon_size_record.o(.rodata) src/fldeff_misc.o(.rodata); src/field_special_scene.o(.rodata); src/rotating_gate.o(.rodata); - src/contest_link_80FC4F4.o(.rodata); + src/contest_link.o(.rodata); src/item_use.o(.rodata); src/battle_anim_effects_1.o(.rodata); src/battle_anim_effects_2.o(.rodata); diff --git a/src/contest.c b/src/contest.c index a43b87679..314ebb381 100644 --- a/src/contest.c +++ b/src/contest.c @@ -31,14 +31,14 @@ #include "tv.h" #include "scanline_effect.h" #include "util.h" -#include "contest_link_80F57C4.h" +#include "contest_util.h" #include "dma3.h" #include "battle_message.h" #include "event_scripts.h" #include "event_data.h" #include "strings.h" #include "contest_effect.h" -#include "contest_link_80FC4F4.h" +#include "contest_link.h" #include "script_pokemon_util_80F87D8.h" #include "international_string_util.h" #include "data.h" diff --git a/src/contest_link.c b/src/contest_link.c new file mode 100644 index 000000000..30ce9e391 --- /dev/null +++ b/src/contest_link.c @@ -0,0 +1,549 @@ +#include "global.h" +#include "contest.h" +#include "decompress.h" +#include "event_data.h" +#include "link.h" +#include "pokemon.h" +#include "random.h" +#include "task.h" +#include "contest_link.h" +#include "constants/flags.h" + +static void sub_80FC5C0(u8); +static void sub_80FC5DC(u8); + +bool32 sub_80FC4F4(void *src, u16 size) +{ + memcpy(gDecompressionBuffer, src, size); + if (SendBlock(bitmask_all_link_players_but_self(), gDecompressionBuffer, size)) + return TRUE; + else + return FALSE; +} + +bool8 sub_80FC530(u8 arg0) +{ + u8 mask = (1 << arg0); + if (!(GetBlockReceivedStatus() & mask)) + { + return FALSE; + } + else + { + ResetBlockReceivedFlag(arg0); + return TRUE; + } +} + +bool8 sub_80FC55C(void) +{ + if (GetBlockReceivedStatus() == sub_800A9D8()) + { + ResetBlockReceivedFlags(); + return TRUE; + } + else + { + return FALSE; + } +} + +void sub_80FC580(u8 taskId) +{ + u8 i; + + for (i = 0; i < 4; i++) + gBlockRecvBuffer[i][0] = 0xFF; + + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_80FC5C0; +} + +static void sub_80FC5C0(u8 taskId) +{ + gTasks[taskId].func = sub_80FC5DC; +} + +static void sub_80FC5DC(u8 taskId) +{ + int i; + + if (!gReceivedRemoteLinkPlayers) + return; + + gContestPlayerMonIndex = GetMultiplayerId(); + gNumLinkContestPlayers = GetLinkPlayerCount(); + gLinkContestFlags = LINK_CONTEST_FLAG_IS_LINK; + if (gWirelessCommType == 1) + gLinkContestFlags = LINK_CONTEST_FLAG_IS_LINK | LINK_CONTEST_FLAG_IS_WIRELESS; + + for (i = 0; i < gNumLinkContestPlayers && (u32)(gLinkPlayers[i].version & 0xFF) - 1 > VERSION_RUBY - 1; i++) + ; + + if (i < gNumLinkContestPlayers) + gLinkContestFlags |= LINK_CONTEST_FLAG_HAS_RS_PLAYER; + + SwitchTaskToFollowupFunc(taskId); +} + +bool32 sub_80FC670(s16 *arg0) +{ + if (gLinkContestFlags & LINK_CONTEST_FLAG_HAS_RS_PLAYER) + return TRUE; + + switch (*arg0) + { + case 0: + if (IsLinkTaskFinished()) + { + sub_800ADF8(); + (*arg0)++; + } + return FALSE; + case 1: + (*arg0)++; + return FALSE; + default: + if (IsLinkTaskFinished() != TRUE) + return FALSE; + else + return TRUE; + } +} + +void sub_80FC6BC(u8 taskId) +{ + int i; + + if (!sub_80FC670(&gTasks[taskId].data[12])) + return; + + switch (gTasks[taskId].data[0]) + { + case 0: + if (GetMultiplayerId() == 0) + { + if (IsLinkTaskFinished()) + { + memcpy(gBlockSendBuffer, &gContestMons[gContestPlayerMonIndex], sizeof(struct ContestPokemon)); + gTasks[taskId].data[0] = 10; + } + } + else + { + memcpy(gBlockSendBuffer, &gContestMons[gContestPlayerMonIndex], sizeof(struct ContestPokemon)); + gTasks[taskId].data[0] = 1; + } + break; + case 1: + if (sub_80FC55C()) + { + for (i = 0; i < gNumLinkContestPlayers; i++) + { + memcpy(&gContestMons[i], gBlockRecvBuffer[i], sizeof(struct ContestPokemon)); + sub_80DFA08(&gContestMons[i], gLinkPlayers[i].language); + } + + gTasks[taskId].data[0]++; + } + break; + case 10: + if (++gTasks[taskId].data[11] > 300) + { + sub_800A4D8(2); + gTasks[taskId].data[0] = 1; + } + break; + default: + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[11] = 0; + gTasks[taskId].data[12] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + } +} + +void sub_80FC804(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + if (GetMultiplayerId() == 0) + { + if (IsLinkTaskFinished() && sub_80FC4F4(&gRngValue, sizeof(gRngValue)) == TRUE) + gTasks[taskId].data[0]++; + } + else + { + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80FC530(0)) + { + memcpy(&gRngValue, gBlockRecvBuffer[0], sizeof(gRngValue)); + memcpy(&gContestRngValue, gBlockRecvBuffer[0], sizeof(gContestRngValue)); + gTasks[taskId].data[0]++; + } + break; + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + } +} + +void sub_80FC894(u8 taskId) +{ + int i; + + if (!sub_80FC670(&gTasks[taskId].data[12])) + return; + + switch (gTasks[taskId].data[0]) + { + case 0: + gBlockSendBuffer[0] = gTasks[taskId].data[9]; + if (GetMultiplayerId() == 0) + { + if (IsLinkTaskFinished()) + gTasks[taskId].data[0] = 10; + } + else + { + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80FC55C()) + { + for (i = 0; i < gNumLinkContestPlayers; i++) + gTasks[taskId].data[i + 1] = gBlockRecvBuffer[i][0]; + + gTasks[taskId].data[0]++; + } + break; + case 10: + if (++gTasks[taskId].data[11] > 10) + { + sub_800A4D8(2); + gTasks[taskId].data[0] = 1; + } + break; + default: + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[11] = 0; + gTasks[taskId].data[12] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + } +} + +void sub_80FC998(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + if (IsLinkTaskFinished()) + { + if (sub_80FC4F4(&gContestPlayerMonIndex, sizeof(gContestPlayerMonIndex)) == TRUE) + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80FC55C()) + gTasks[taskId].data[0]++; + break; + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + } +} + +void sub_80FC9F8(u8 taskId) +{ + int i; + + switch (gTasks[taskId].data[0]) + { + case 0: + if (IsLinkTaskFinished()) + { + if (sub_80FC4F4(&eContestantStatus[gContestPlayerMonIndex].currMove, sizeof(eContestantStatus[gContestPlayerMonIndex].currMove)) == TRUE) + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80FC55C()) + { + for (i = 0; i < gNumLinkContestPlayers; i++) + eContestantStatus[i].currMove = gBlockRecvBuffer[i][0]; + + gTasks[taskId].data[0]++; + } + break; + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + } +} + +void sub_80FCACC(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + if (IsLinkTaskFinished()) + { + if (sub_80FC4F4(gContestMonTotalPoints, sizeof(gContestMonTotalPoints)) == 1) + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80FC55C()) + { + memcpy(gContestMonTotalPoints, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestMonTotalPoints)); + gTasks[taskId].data[0]++; + } + break; + case 2: + case 5: + case 8: + case 11: + if (gTasks[taskId].data[1]++ > 10) + { + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[0]++; + } + break; + case 3: + if (IsLinkTaskFinished()) + { + if (sub_80FC4F4(gUnknown_02039F10, sizeof(gUnknown_02039F10)) == 1) + gTasks[taskId].data[0]++; + } + break; + case 4: + if (sub_80FC55C()) + { + memcpy(gUnknown_02039F10, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gUnknown_02039F10)); + gTasks[taskId].data[0]++; + } + break; + case 6: + if (IsLinkTaskFinished()) + { + if (sub_80FC4F4(gContestMonRound2Points, sizeof(gContestMonRound2Points)) == 1) + gTasks[taskId].data[0]++; + } + break; + case 7: + if (sub_80FC55C()) + { + memcpy(gContestMonRound2Points, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestMonRound2Points)); + gTasks[taskId].data[0]++; + } + break; + case 9: + if (IsLinkTaskFinished()) + { + if (sub_80FC4F4(gContestFinalStandings, sizeof(gContestFinalStandings)) == 1) + gTasks[taskId].data[0]++; + } + break; + case 10: + if (sub_80FC55C()) + { + memcpy(gContestFinalStandings, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestFinalStandings)); + gTasks[taskId].data[0]++; + } + break; + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + } +} + +void sub_80FCC88(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + if (IsLinkTaskFinished()) + { + if (sub_80FC4F4(eContestantStatus, 4 * sizeof(struct ContestantStatus)) == 1) + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80FC55C()) + { + memcpy(eContestantStatus, gBlockRecvBuffer[gUnknown_02039F2B], 4 * sizeof(struct ContestantStatus)); + gTasks[taskId].data[0]++; + } + break; + case 2: + case 5: + case 8: + case 11: + if (gTasks[taskId].data[1]++ > 10) + { + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[0]++; + } + break; + case 3: + if (IsLinkTaskFinished()) + { + if (sub_80FC4F4(gContestResources->field_8, sizeof(struct UnknownContestStruct7)) == 1) + gTasks[taskId].data[0]++; + } + break; + case 4: + if (sub_80FC55C()) + { + memcpy(gContestResources->field_8, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(struct UnknownContestStruct7)); + gTasks[taskId].data[0]++; + } + break; + case 6: + if (IsLinkTaskFinished()) + { + if (sub_80FC4F4(gContestResources->field_10, sizeof(struct UnknownContestStruct5)) == 1) + gTasks[taskId].data[0]++; + } + break; + case 7: + if (sub_80FC55C()) + { + memcpy(gContestResources->field_10, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(struct UnknownContestStruct5)); + gTasks[taskId].data[0]++; + } + break; + case 9: + if (IsLinkTaskFinished()) + { + if (sub_80FC4F4(gContestantTurnOrder, sizeof(gContestantTurnOrder)) == 1) + gTasks[taskId].data[0]++; + } + break; + case 10: + if (sub_80FC55C()) + { + memcpy(gContestantTurnOrder, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestantTurnOrder)); + gTasks[taskId].data[0]++; + } + break; + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + } +} + +void sub_80FCE48(u8 taskId) +{ + int i; + + if (!sub_80FC670(&gTasks[taskId].data[12])) + return; + + switch (gTasks[taskId].data[0]) + { + case 0: + gBlockSendBuffer[0] = 0x6E; + if (GetMultiplayerId() == 0) + { + if (IsLinkTaskFinished()) + gTasks[taskId].data[0] = 10; + } + else + { + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80FC55C()) + { + for (i = 0; i < 4; i++) + gTasks[taskId].data[i + 5] = gBlockRecvBuffer[i][0]; + + gTasks[taskId].data[0]++; + } + break; + case 10: + if (++gTasks[taskId].data[11] > 10) + { + sub_800A4D8(2); + gTasks[taskId].data[0] = 1; + } + break; + default: + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[11] = 0; + gTasks[taskId].data[12] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + } +} + +void sub_80FCF40(u8 taskId) +{ + if (!sub_80FC670(&gTasks[taskId].data[12])) + return; + + switch (gTasks[taskId].data[0]) + { + case 0: + if (IsLinkTaskFinished()) + { + if (sub_80FC4F4(gContestMonConditions, sizeof(gContestMonConditions)) == 1) + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80FC55C()) + { + memcpy(gContestMonConditions, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestMonConditions)); + gTasks[taskId].data[0]++; + } + break; + default: + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[12] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + } +} + +void sub_80FCFD0(u8 taskId) +{ + if (!sub_80FC670(&gTasks[taskId].data[12])) + return; + + switch (gTasks[taskId].data[0]) + { + case 0: + if (IsLinkTaskFinished()) + { + if (sub_80FC4F4(gContestantTurnOrder, sizeof(gContestantTurnOrder)) == 1) + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80FC55C()) + { + memcpy(gContestantTurnOrder, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestantTurnOrder)); + gTasks[taskId].data[0]++; + } + break; + default: + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[12] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + } +} diff --git a/src/contest_link_80F57C4.c b/src/contest_link_80F57C4.c deleted file mode 100644 index 8434c3eac..000000000 --- a/src/contest_link_80F57C4.c +++ /dev/null @@ -1,2533 +0,0 @@ -#include "global.h" -#include "malloc.h" -#include "battle.h" -#include "battle_gfx_sfx_util.h" -#include "bg.h" -#include "contest.h" -#include "contest_link_80F57C4.h" -#include "contest_link_80FC4F4.h" -#include "data.h" -#include "decompress.h" -#include "dma3.h" -#include "event_data.h" -#include "field_specials.h" -#include "gpu_regs.h" -#include "graphics.h" -#include "international_string_util.h" -#include "link.h" -#include "link_rfu.h" -#include "load_save.h" -#include "main.h" -#include "overworld.h" -#include "palette.h" -#include "pokedex.h" -#include "pokemon.h" -#include "pokemon_icon.h" -#include "random.h" -#include "save.h" -#include "scanline_effect.h" -#include "script.h" -#include "sound.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "text.h" -#include "trig.h" -#include "tv.h" -#include "util.h" -#include "window.h" -#include "constants/field_specials.h" -#include "constants/game_stat.h" -#include "constants/rgb.h" -#include "constants/songs.h" -#include "constants/tv.h" -#include "constants/vars.h" -#include "contest.h" - -enum { - SLIDING_TEXT_OFFSCREEN, - SLIDING_TEXT_ENTERING, - SLIDING_TEXT_ARRIVED, - SLIDING_TEXT_EXITING, -}; - -enum { - SLIDING_MON_ENTERED = 1, - SLIDING_MON_EXITED, -}; - -#define GET_CONTEST_WINNER_ID(i) { for ((i) = 0; (i) < CONTESTANT_COUNT && gContestFinalStandings[(i)] != 0; (i)++); } - -#define TAG_CONFETTI 3017 - -#define MAX_BAR_LENGTH 87 - -struct ContestResultsInternal -{ - u8 slidingTextBoxSpriteId; - u8 linkTextBoxSpriteId; - u8 showResultsTaskId; - u8 highlightWinnerTaskId; - u8 slidingTextBoxState; - u8 numStandingsPrinted; - u8 winnerMonSlidingState; - u8 confettiCount; - u8 winnerMonSpriteId; - bool8 destroyConfetti; - bool8 pointsFlashing; - s16 unkC[CONTESTANT_COUNT]; - u8 numBarsUpdating; -}; - -struct ContestMonResults -{ - int relativePreliminaryPoints; - int relativeRound2Points; - u32 barLengthPreliminary; - u32 barLengthRound2; - bool8 lostPoints; - u8 numStars; - u8 numHearts; -}; - -struct ContestResults -{ - struct ContestResultsInternal *data; - struct ContestMonResults (*monResults)[CONTESTANT_COUNT]; - u8 *unusedBg; // Allocated/freed, never used - u8 *tilemapBuffers[4]; - u8 *unused; // Allocated/freed, never used -}; - -static EWRAM_DATA struct ContestResults *sContestResults = NULL; - -static void LoadAllContestMonIconPalettes(void); -static void LoadContestResultsTilemaps(void); -static u8 GetNumPreliminaryPoints(u8, bool8); -static s8 GetNumRound2Points(u8, bool8); -static void AddContestTextPrinter(int, u8 *, int); -static void AllocContestResults(void); -static void FreeContestResults(void); -static void LoadAllContestMonIcons(u8, u8); -static void LoadContestResultSprites(void); -static void TryCreateWirelessSprites(void); -static void Task_StartShowContestResults(u8 taskId); -static void CB2_StartShowContestResults(void); -static void Task_ShowContestResults(u8); -static void CB2_ShowContestResults(void); -static void VBlankCB_ShowContestResults(void); -static void Task_SlideContestResultsBg(u8); -static void Task_WaitForLinkPartnersBeforeResults(u8); -static void sub_80F5F14(u8); -static void sub_80F5F30(u8); -static void Task_AnnouncePreliminaryResults(u8); -static void Task_FlashStarsAndHearts(u8); -static void Task_ShowPreliminaryResults(u8); -static void Task_AnnounceRound2Results(u8); -static void Task_ShowRound2Results(u8); -static void Task_AnnounceWinner(u8); -static void Task_DrawFinalStandingNumber(u8); -static void Task_StartHighlightWinnersBox(u8); -static void Task_HighlightWinnersBox(u8); -static void Task_ShowWinnerMonBanner(u8); -static void Task_SetSeenWinnerMon(u8); -static void Task_TryDisconnectLinkPartners(u8); -static void Task_WaitForLinkPartnersDisconnect(u8); -static void Task_TrySetContestInterviewData(u8); -static void Task_EndShowContestResults(u8); -static void CalculateContestantsResultData(void); -static void ShowLinkResultsTextBox(const u8 *); -static void HideLinkResultsTextBox(void); -static s32 DrawResultsTextWindow(const u8 *, u8); -static void StartTextBoxSlideIn(s16, u16, u16, u16); -static void UpdateContestResultBars(bool8, u8); -static void Task_UpdateContestResultBar(u8); -static void StartTextBoxSlideOut(u16); -static void BounceMonIconInBox(u8, u8); -static void Task_BounceMonIconInBox(u8); -static void SpriteCB_WinnerMonSlideIn(struct Sprite *); -static void SpriteCB_WinnerMonSlideOut(struct Sprite *); -static void Task_CreateConfetti(u8); -static void SpriteCB_TextBoxSlideIn(struct Sprite *); -static void SpriteCB_TextBoxSlideOut(struct Sprite *); -static void SpriteCB_EndTextBoxSlideIn(struct Sprite *); -static void sub_80F8508(u8); -static void sub_80F8568(u8); -static void sub_80F8584(u8); -static void sub_80F85A0(u8); -static void sub_80F85BC(u8); -static void sub_80F86B8(u8); -static void sub_80F878C(u8); -static void sub_80F87B4(u8); -static void SpriteCB_Confetti(struct Sprite *sprite); - -static const u16 sUnknown_0858D6B0[] = INCBIN_U16("graphics/unknown/unknown_58D6B0.gbapal"); -static const u8 sUnknown_0858D6D0[] = INCBIN_U8("graphics/unknown/unknown_58D6D0.4bpp"); -static const u16 sMiscBlank_Pal[] = INCBIN_U16("graphics/interface/blank.gbapal"); - -static const struct OamData sOamData_858D7F0 = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = 0, - .bpp = ST_OAM_4BPP, - .shape = SPRITE_SHAPE(64x32), - .x = 0, - .matrixNum = 0, - .size = SPRITE_SIZE(64x32), - .tileNum = 0, - .priority = 3, - .paletteNum = 2, - .affineParam = 0, -}; - -static const struct SpriteTemplate sSpriteTemplate_858D7F8 = -{ - .tileTag = 3009, - .paletteTag = 3009, - .oam = &sOamData_858D7F0, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy -}; - -static const struct SpriteSheet sUnknown_0858D810[] = -{ - { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3009 }, - { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3010 }, - { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3011 }, - { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3012 }, - { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3013 }, - { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3014 }, - { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3015 }, - { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3016 }, -}; - -static const struct SpritePalette sUnknown_0858D850 = -{ - .data = sMiscBlank_Pal, - .tag = 3009, -}; - -static const struct OamData sOamData_Confetti = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = 0, - .bpp = ST_OAM_4BPP, - .shape = SPRITE_SHAPE(8x8), - .x = 0, - .matrixNum = 0, - .size = SPRITE_SIZE(8x8), - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; - -static const struct SpriteTemplate sSpriteTemplate_Confetti = -{ - .tileTag = TAG_CONFETTI, - .paletteTag = TAG_CONFETTI, - .oam = &sOamData_Confetti, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_Confetti -}; - -static const struct CompressedSpriteSheet sSpriteSheet_Confetti = -{ - .data = gConfetti_Gfx, - .size = 0x220, - .tag = TAG_CONFETTI -}; - - -static const struct CompressedSpritePalette sSpritePalette_Confetti = -{ - .data = gConfetti_Pal, - .tag = TAG_CONFETTI -}; - -static const struct BgTemplate sBgTemplates[] = -{ - { - .bg = 0, - .charBaseIndex = 0, - .mapBaseIndex = 30, - .screenSize = 0, - .paletteMode = 0, - .priority = 0, - .baseTile = 0, - }, - { - .bg = 1, - .charBaseIndex = 0, - .mapBaseIndex = 24, - .screenSize = 0, - .paletteMode = 0, - .priority = 3, - .baseTile = 0, - }, - { - .bg = 2, - .charBaseIndex = 0, - .mapBaseIndex = 28, - .screenSize = 0, - .paletteMode = 0, - .priority = 3, - .baseTile = 0, - }, - { - .bg = 3, - .charBaseIndex = 0, - .mapBaseIndex = 26, - .screenSize = 0, - .paletteMode = 0, - .priority = 3, - .baseTile = 0, - } -}; - -static const struct WindowTemplate sWindowTemplates[] = -{ - { - .bg = 1, - .tilemapLeft = 7, - .tilemapTop = 4, - .width = 12, - .height = 2, - .paletteNum = 15, - .baseBlock = 770 - }, - { - .bg = 1, - .tilemapLeft = 7, - .tilemapTop = 7, - .width = 12, - .height = 2, - .paletteNum = 15, - .baseBlock = 794 - }, - { - .bg = 1, - .tilemapLeft = 7, - .tilemapTop = 10, - .width = 12, - .height = 2, - .paletteNum = 15, - .baseBlock = 818 - }, - { - .bg = 1, - .tilemapLeft = 7, - .tilemapTop = 13, - .width = 12, - .height = 2, - .paletteNum = 15, - .baseBlock = 842 - }, - DUMMY_WIN_TEMPLATE, -}; - -static const struct OamData sUnknown_0858D8C0 = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = 0, - .bpp = ST_OAM_4BPP, - .shape = SPRITE_SHAPE(16x16), - .x = 0, - .matrixNum = 0, - .size = SPRITE_SIZE(16x16), - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; - - -static const struct SpriteTemplate sSpriteTemplate_858D8C8 = -{ - .tileTag = 22222, - .paletteTag = 0, - .oam = &sUnknown_0858D8C0, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy -}; - -static const struct SpriteSheet sUnknown_0858D8E0 = -{ - .data = gMiscBlank_Gfx, - .size = 0x200, - .tag = 22222 -}; - -static const u8 sContestLinkTextColors[4] = {TEXT_COLOR_WHITE, TEXT_DYNAMIC_COLOR_6, TEXT_DYNAMIC_COLOR_5}; - - -static void InitContestResultsDisplay(void) -{ - int i; - - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP); - ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); - for (i = 0; i < (int)ARRAY_COUNT(sContestResults->tilemapBuffers); i++) - SetBgTilemapBuffer(i, sContestResults->tilemapBuffers[i]); - - InitWindows(sWindowTemplates); - DeactivateAllTextPrinters(); - SetGpuReg(REG_OFFSET_MOSAIC, 0); - SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); - SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR); - SetGpuReg(REG_OFFSET_WIN0H, 0); - SetGpuReg(REG_OFFSET_WIN0V, 0); - SetGpuReg(REG_OFFSET_WIN1H, 0); - SetGpuReg(REG_OFFSET_WIN1V, 0); - SetGpuReg(REG_OFFSET_BLDCNT, 0); - SetGpuReg(REG_OFFSET_BLDALPHA, 0); - SetGpuReg(REG_OFFSET_BLDY, 0); - SetGpuReg(REG_OFFSET_BG0HOFS, 0); - SetGpuReg(REG_OFFSET_BG0VOFS, 0); - SetGpuReg(REG_OFFSET_BG1HOFS, 0); - SetGpuReg(REG_OFFSET_BG1VOFS, 0); - SetGpuReg(REG_OFFSET_BG2HOFS, 0); - SetGpuReg(REG_OFFSET_BG2VOFS, 0); - SetGpuReg(REG_OFFSET_BG3HOFS, 0); - SetGpuReg(REG_OFFSET_BG3VOFS, 0); - SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON | DISPCNT_OBJWIN_ON); - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - gBattle_BG1_X = 0; - gBattle_BG1_Y = 0; - gBattle_BG2_X = 0; - gBattle_BG2_Y = 0; - gBattle_BG3_X = 0; - gBattle_BG3_Y = 0; - gBattle_WIN0H = 0; - gBattle_WIN0V = 0; - gBattle_WIN1H = 0; - gBattle_WIN1V = 0; -} - -static void LoadContestResultsBgGfx(void) -{ - int i, j; - s8 numStars, round2Points; - u16 tile1, tile2; - - LZDecompressVram(gContestResults_Gfx, (void *)BG_CHAR_ADDR(0)); - CopyToBgTilemapBuffer(3, gUnknown_08C1A12C, 0, 0); - CopyToBgTilemapBuffer(2, gUnknown_08C1A000, 0, 0); - CopyToBgTilemapBuffer(0, gUnknown_08C19EEC, 0, 0); - LoadContestResultsTilemaps(); - LoadCompressedPalette(gContestResults_Pal, 0, 0x200); - LoadPalette(sUnknown_0858D6B0, 0xF0, 0x20); - - for (i = 0; i < CONTESTANT_COUNT; i++) - { - numStars = GetNumPreliminaryPoints(i, TRUE); - round2Points = GetNumRound2Points(i, TRUE); - for (j = 0; j < 10; j++) - { - tile1 = 0x60B2; - if (j < numStars) - tile1 += 2; - - // Abs of round2Points is number of hearts - if (j < abs(round2Points)) - { - tile2 = 0x60A4; - if (round2Points < 0) - tile2 += 2; - } - else - { - tile2 = 0x60A2; - } - - FillBgTilemapBufferRect_Palette0(1, tile1, j + 19, i * 3 + 5, 1, 1); - FillBgTilemapBufferRect_Palette0(1, tile2, j + 19, i * 3 + 6, 1, 1); - } - } - - CopyBgTilemapBufferToVram(0); - CopyBgTilemapBufferToVram(1); - CopyBgTilemapBufferToVram(2); - CopyBgTilemapBufferToVram(3); - ShowBg(0); - ShowBg(1); - ShowBg(2); - ShowBg(3); -} - -static void LoadContestMonName(u8 monIndex) -{ - struct ContestPokemon *mon = &gContestMons[monIndex]; - u8 *str = gDisplayedStringBattle; - if (monIndex == gContestPlayerMonIndex) - str = StringCopy(gDisplayedStringBattle, gText_ColorDarkGrey); - - StringCopy(str, mon->nickname); - AddContestTextPrinter(monIndex, gDisplayedStringBattle, 0); - StringCopy(str, gText_Slash); - StringAppend(str, mon->trainerName); - AddContestTextPrinter(monIndex, gDisplayedStringBattle, 50); -} - -static void LoadAllContestMonNames(void) -{ - int i; - - for (i = 0; i < CONTESTANT_COUNT; i++) - LoadContestMonName(i); - - CopyBgTilemapBufferToVram(1); -} - -static void CB2_StartShowContestResults(void) -{ - gPaletteFade.bufferTransferDisabled = TRUE; - SetVBlankCallback(NULL); - AllocContestResults(); - InitContestResultsDisplay(); - ScanlineEffect_Clear(); - ResetPaletteFade(); - ResetSpriteData(); - ResetTasks(); - FreeAllSpritePalettes(); - LoadContestResultsBgGfx(); - LoadAllContestMonIconPalettes(); - LoadAllContestMonIcons(0, TRUE); - LoadAllContestMonNames(); - memset(sContestResults->data, 0, sizeof(*sContestResults->data)); - memset(sContestResults->monResults, 0, sizeof(*sContestResults->monResults)); - LoadContestResultSprites(); - TryCreateWirelessSprites(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); - gPaletteFade.bufferTransferDisabled = FALSE; - sContestResults->data->showResultsTaskId = CreateTask(Task_ShowContestResults, 5); - SetMainCallback2(CB2_ShowContestResults); - gBattle_WIN1H = 0x00F0; - gBattle_WIN1V = 0x80A0; - CreateTask(Task_SlideContestResultsBg, 20); - CalculateContestantsResultData(); - if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS) - gPaletteFade.bufferTransferDisabled = TRUE; - else - PlayBGM(MUS_CON_K); - - SetVBlankCallback(VBlankCB_ShowContestResults); -} - -static void CB2_ShowContestResults(void) -{ - AnimateSprites(); - BuildOamBuffer(); - RunTasks(); - UpdatePaletteFade(); - CopyBgTilemapBufferToVram(1); - CopyBgTilemapBufferToVram(2); -} - -static void VBlankCB_ShowContestResults(void) -{ - SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_X); - SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_Y); - SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); - SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); - SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X); - SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y); - SetGpuReg(REG_OFFSET_BG3HOFS, gBattle_BG3_X); - SetGpuReg(REG_OFFSET_BG3VOFS, gBattle_BG3_Y); - SetGpuReg(REG_OFFSET_WIN0H, gBattle_WIN0H); - SetGpuReg(REG_OFFSET_WIN0V, gBattle_WIN0V); - SetGpuReg(REG_OFFSET_WIN1H, gBattle_WIN1H); - SetGpuReg(REG_OFFSET_WIN1V, gBattle_WIN1V); - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - ScanlineEffect_InitHBlankDmaTransfer(); -} - -#define tState data[0] -#define tTimer data[1] -#define tCounter data[2] - -static void Task_ShowContestResults(u8 taskId) -{ - u16 var; - - if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) - { - switch (gTasks[taskId].tState) - { - case 0: - SaveLinkContestResults(); - if (gContestFinalStandings[gContestPlayerMonIndex] == 0) - { - IncrementGameStat(GAME_STAT_WON_LINK_CONTEST); - gSpecialVar_0x8005 = TVSHOW_CONTEST_LIVE_UPDATES; - InterviewBefore(); - if (gSpecialVar_Result != TRUE) - InterviewAfter(); - } - - TryGainNewFanFromCounter(FANCOUNTER_FINISHED_CONTEST); - sub_80DEDA8(gSpecialVar_ContestRank); - sub_80DEDA8(0xFE); - gUnknown_02039F5C = TRUE; - gUnknown_02039F5D = sub_80DEFA8(0xFE, 0); - var = VarGet(VAR_CONTEST_HALL_STATE); - VarSet(VAR_CONTEST_HALL_STATE, 0); - SetContinueGameWarpStatusToDynamicWarp(); - TrySavingData(SAVE_LINK); - ClearContinueGameWarpStatus2(); - VarSet(VAR_CONTEST_HALL_STATE, var); - gTasks[taskId].tState++; - break; - case 1: - gTasks[taskId].tState++; - if (!(gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS)) - gTasks[taskId].tState = 100; - break; - case 2: - if (IsLinkTaskFinished()) - { - sub_800ADF8(); - gTasks[taskId].tState++; - } - return; - case 3: - if (IsLinkTaskFinished() == TRUE) - { - PlayBGM(MUS_CON_K); - gPaletteFade.bufferTransferDisabled = FALSE; - gTasks[taskId].tState++; - break; - } - return; - } - } - - if (!gPaletteFade.active) - { - gTasks[taskId].tState = 0; - if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) - { - ShowLinkResultsTextBox(gText_CommunicationStandby); - gTasks[taskId].func = Task_WaitForLinkPartnersBeforeResults; - } - else - { - IncrementGameStat(GAME_STAT_ENTERED_CONTEST); - if (gContestFinalStandings[gContestPlayerMonIndex] == 0) - IncrementGameStat(GAME_STAT_WON_CONTEST); - - sub_80DEDA8(gSpecialVar_ContestRank); - sub_80DEDA8(0xFE); - gUnknown_02039F5C = TRUE; - gUnknown_02039F5D = sub_80DEFA8(0xFE, 0); - TryGainNewFanFromCounter(FANCOUNTER_FINISHED_CONTEST); - gTasks[taskId].func = Task_AnnouncePreliminaryResults; - } - } -} - -static void Task_WaitForLinkPartnersBeforeResults(u8 taskId) -{ - if (gReceivedRemoteLinkPlayers) - { - CreateTask(sub_80F5F14, 0); - gTasks[taskId].func = TaskDummy; - } -} - -static void sub_80F5F14(u8 taskId) -{ - SetTaskFuncWithFollowupFunc(taskId, sub_80FC998, sub_80F5F30); -} - -static void sub_80F5F30(u8 taskId) -{ - if (IsLinkTaskFinished()) - { - DestroyTask(taskId); - gTasks[sContestResults->data->showResultsTaskId].func = Task_AnnouncePreliminaryResults; - HideLinkResultsTextBox(); - } -} - -static void Task_AnnouncePreliminaryResults(u8 taskId) -{ - s16 x; - - if (gTasks[taskId].tState == 0) - { - CreateTask(Task_FlashStarsAndHearts, 20); - x = DrawResultsTextWindow(gText_AnnouncingResults, sContestResults->data->slidingTextBoxSpriteId); - StartTextBoxSlideIn(x, 144, 120, 1088); - gTasks[taskId].tState++; - } - else if (gTasks[taskId].tState == 1) - { - // Wait for "Announcing Results" text to leave - if (sContestResults->data->slidingTextBoxState == SLIDING_TEXT_OFFSCREEN) - { - gTasks[taskId].tTimer = 0; - gTasks[taskId].tState++; - } - } - else if (gTasks[taskId].tState == 2) - { - if (++gTasks[taskId].tTimer == 21) - { - gTasks[taskId].tTimer = 0; - gTasks[taskId].tState++; - } - } - else if (gTasks[taskId].tState == 3) - { - x = DrawResultsTextWindow(gText_PreliminaryResults, sContestResults->data->slidingTextBoxSpriteId); - StartTextBoxSlideIn(x, 144, -1, 1088); - gTasks[taskId].tState++; - } - else if (gTasks[taskId].tState == 4) - { - if (sContestResults->data->slidingTextBoxState == SLIDING_TEXT_ARRIVED) - { - gTasks[taskId].tState = 0; - gTasks[taskId].func = Task_ShowPreliminaryResults; - } - } -} - -static void Task_ShowPreliminaryResults(u8 taskId) -{ - switch (gTasks[taskId].tState) - { - case 0: - if (!sContestResults->data->pointsFlashing) - { - UpdateContestResultBars(FALSE, gTasks[taskId].tCounter++); - if (sContestResults->data->numBarsUpdating == 0) - gTasks[taskId].tState = 2; - else - gTasks[taskId].tState++; - } - break; - case 1: - if (sContestResults->data->numBarsUpdating == 0) - gTasks[taskId].tState = 0; - break; - case 2: - StartTextBoxSlideOut(1088); - gTasks[taskId].tState = 0; - gTasks[taskId].tCounter = 0; - gTasks[taskId].func = Task_AnnounceRound2Results; - break; - } -} - -static void Task_AnnounceRound2Results(u8 taskId) -{ - s16 x; - - if (sContestResults->data->slidingTextBoxState == SLIDING_TEXT_OFFSCREEN) - { - if (++gTasks[taskId].tTimer == 21) - { - gTasks[taskId].tTimer = 0; - x = DrawResultsTextWindow(gText_Round2Results, sContestResults->data->slidingTextBoxSpriteId); - StartTextBoxSlideIn(x, 144, -1, 1088); - } - } - else if (sContestResults->data->slidingTextBoxState == SLIDING_TEXT_ARRIVED) - { - gTasks[taskId].func = Task_ShowRound2Results; - } -} - -static void Task_ShowRound2Results(u8 taskId) -{ - switch (gTasks[taskId].tState) - { - case 0: - if (!sContestResults->data->pointsFlashing) - { - UpdateContestResultBars(TRUE, gTasks[taskId].tCounter++); - if (sContestResults->data->numBarsUpdating == 0) - gTasks[taskId].tState = 2; - else - gTasks[taskId].tState++; - } - break; - case 1: - if (sContestResults->data->numBarsUpdating == 0) - gTasks[taskId].tState = 0; - break; - case 2: - StartTextBoxSlideOut(1088); - gTasks[taskId].tState = 0; - gTasks[taskId].func = Task_AnnounceWinner; - break; - } -} - -// Task data for Task_DrawFinalStandingNumber -#define tFinalStanding data[0] -#define tMonIndex data[1] - -static void Task_AnnounceWinner(u8 taskId) -{ - int i; - switch (gTasks[taskId].tState) - { - case 0: - if (sContestResults->data->slidingTextBoxState == SLIDING_TEXT_OFFSCREEN) - gTasks[taskId].tState++; - break; - case 1: - if (++gTasks[taskId].tTimer == 31) - { - gTasks[taskId].tTimer = 0; - gTasks[taskId].tState++; - } - break; - case 2: - for (i = 0; i < CONTESTANT_COUNT; i++) - { - u8 newTaskId = CreateTask(Task_DrawFinalStandingNumber, 10); - gTasks[newTaskId].tFinalStanding = gContestFinalStandings[i]; - gTasks[newTaskId].tMonIndex = i; - } - gTasks[taskId].tState++; - break; - case 3: - if (sContestResults->data->numStandingsPrinted == CONTESTANT_COUNT) - { - if (++gTasks[taskId].tTimer == 31) - { - gTasks[taskId].tTimer = 0; - CreateTask(Task_StartHighlightWinnersBox, 10); - gTasks[taskId].tState++; - GET_CONTEST_WINNER_ID(i); - BounceMonIconInBox(i, 14); - } - } - break; - case 4: - if (++gTasks[taskId].tTimer == 21) - { - u8 winnerTextBuffer[100]; - s16 x; - gTasks[taskId].tTimer = 0; - GET_CONTEST_WINNER_ID(i); - StringCopy(gStringVar1, gContestMons[i].trainerName); - sub_81DB5AC(gStringVar1); - StringCopy(gStringVar2, gContestMons[i].nickname); - StringExpandPlaceholders(winnerTextBuffer, gText_ContestantsMonWon); - x = DrawResultsTextWindow(winnerTextBuffer, sContestResults->data->slidingTextBoxSpriteId); - StartTextBoxSlideIn(x, 144, -1, 1088); - gTasks[taskId].tState++; - } - break; - case 5: - gTasks[taskId].tState = 0; - gTasks[taskId].func = Task_ShowWinnerMonBanner; - break; - } -} - -static void Task_ShowWinnerMonBanner(u8 taskId) -{ - int i; - u8 spriteId; - u16 species; - u32 otId; - u32 personality; - const struct CompressedSpritePalette *pokePal; - - switch (gTasks[taskId].tState) - { - case 0: - gBattle_WIN0H = 0x00F0; - gBattle_WIN0V = 0x5050; - - GET_CONTEST_WINNER_ID(i); - species = gContestMons[i].species; - personality = gContestMons[i].personality; - otId = gContestMons[i].otId; - if (i == gContestPlayerMonIndex) - { - HandleLoadSpecialPokePic_2( - &gMonFrontPicTable[species], - gMonSpritesGfxPtr->sprites[1], - species, - personality); - } - else - { - HandleLoadSpecialPokePic_DontHandleDeoxys( - &gMonFrontPicTable[species], - gMonSpritesGfxPtr->sprites[1], - species, - personality); - } - - pokePal = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); - LoadCompressedSpritePalette(pokePal); - SetMultiuseSpriteTemplateToPokemon(species, B_POSITION_OPPONENT_LEFT); - gMultiuseSpriteTemplate.paletteTag = pokePal->tag; - spriteId = CreateSprite(&gMultiuseSpriteTemplate, 272, 80, 10); - gSprites[spriteId].data[1] = species; - gSprites[spriteId].oam.priority = 0; - gSprites[spriteId].callback = SpriteCB_WinnerMonSlideIn; - sContestResults->data->winnerMonSpriteId = spriteId; - LoadCompressedSpriteSheet(&sSpriteSheet_Confetti); - LoadCompressedSpritePalette(&sSpritePalette_Confetti); - CreateTask(Task_CreateConfetti, 10); - gTasks[taskId].tState++; - break; - case 1: - if (++gTasks[taskId].data[3] == 1) - { - u8 counter; - gTasks[taskId].data[3] = 0; - gTasks[taskId].tCounter += 2; - if (gTasks[taskId].tCounter > 32) - gTasks[taskId].tCounter = 32; - - counter = gTasks[taskId].tCounter; - gBattle_WIN0V = ((80 - counter) << 8) | (80 + counter); - if (counter == 32) - gTasks[taskId].tState++; - } - break; - case 2: - if (sContestResults->data->winnerMonSlidingState == SLIDING_MON_ENTERED) - gTasks[taskId].tState++; - break; - case 3: - if (++gTasks[taskId].tTimer == 121) - { - gTasks[taskId].tTimer = 0; - gSprites[sContestResults->data->winnerMonSpriteId].callback = SpriteCB_WinnerMonSlideOut; - gTasks[taskId].tState++; - } - break; - case 4: - if (sContestResults->data->winnerMonSlidingState == SLIDING_MON_EXITED) - { - u8 top = (gBattle_WIN0V >> 8); - top += 2; - if (top > 80) - top = 80; - - gBattle_WIN0V = (top << 8) | (160 - top); - if (top == 80) - gTasks[taskId].tState++; - } - break; - case 5: - if (sContestResults->data->winnerMonSlidingState == SLIDING_MON_EXITED) - { - sContestResults->data->destroyConfetti = TRUE; - gTasks[taskId].tState = 0; - gTasks[taskId].func = Task_SetSeenWinnerMon; - } - break; - } -} - -static void Task_SetSeenWinnerMon(u8 taskId) -{ - int i, nationalDexNum; - - if (JOY_NEW(A_BUTTON)) - { - if (!(gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK)) - { - for (i = 0; i < CONTESTANT_COUNT; i++) - { - nationalDexNum = SpeciesToNationalPokedexNum(gContestMons[i].species); - GetSetPokedexFlag(nationalDexNum, FLAG_SET_SEEN); - } - } - - gTasks[taskId].data[10] = 0; - gTasks[taskId].func = Task_TryDisconnectLinkPartners; - } -} - -static void Task_TryDisconnectLinkPartners(u8 taskId) -{ - if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) - { - if (!gTasks[taskId].data[10]) - { - ShowLinkResultsTextBox(gText_CommunicationStandby); - sub_800AC34(); - gTasks[taskId].func = Task_WaitForLinkPartnersDisconnect; - } - } - else - { - gTasks[taskId].func = Task_TrySetContestInterviewData; - } -} - -static void Task_WaitForLinkPartnersDisconnect(u8 taskId) -{ - if (!gReceivedRemoteLinkPlayers) - { - if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS) - DestroyWirelessStatusIndicatorSprite(); - - HideLinkResultsTextBox(); - gTasks[taskId].func = Task_TrySetContestInterviewData; - } -} - -static void Task_TrySetContestInterviewData(u8 taskId) -{ - if (!(gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK)) - BravoTrainerPokemonProfile_BeforeInterview2(gContestFinalStandings[gContestPlayerMonIndex]); - - BeginHardwarePaletteFade(0xFF, 0, 0, 16, 0); - gTasks[taskId].func = Task_EndShowContestResults; -} - -static void Task_EndShowContestResults(u8 taskId) -{ - if (!gPaletteFade.active) - { - if (gTasks[taskId].tTimer == 0) - { - DestroyTask(sContestResults->data->highlightWinnerTaskId); - BlendPalettes(0x0000FFFF, 16, RGB_BLACK); - gTasks[taskId].tTimer++; - } - else if (gTasks[taskId].tTimer == 1) - { - BlendPalettes(0xFFFF0000, 16, RGB_BLACK); - gTasks[taskId].tTimer++; - } - else - { - SetGpuReg(REG_OFFSET_BLDCNT, 0); - SetGpuReg(REG_OFFSET_BLDY, 0); - DestroyTask(taskId); - FreeAllWindowBuffers(); - SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); - FreeContestResults(); - } - } -} - -#undef tState -#undef tTimer -#undef tCounter - -static void Task_SlideContestResultsBg(u8 taskId) -{ - gBattle_BG3_X += 2; - gBattle_BG3_Y += 1; - if (gBattle_BG3_X > 255) - gBattle_BG3_X -= 255; - if (gBattle_BG3_Y > 255) - gBattle_BG3_Y -= 255; -} - -#define tDelay data[0] -#define tCoeff data[1] -#define tDecreasing data[2] - -static void Task_FlashStarsAndHearts(u8 taskId) -{ - if (++gTasks[taskId].tDelay == 2) - { - gTasks[taskId].tDelay = 0; - if (!gTasks[taskId].tDecreasing) - gTasks[taskId].tCoeff++; - else - gTasks[taskId].tCoeff--; - - if (gTasks[taskId].tCoeff == 16) - gTasks[taskId].tDecreasing = TRUE; - else if (gTasks[taskId].tCoeff == 0) - gTasks[taskId].tDecreasing = FALSE; - - BlendPalette(0x6B, 1, gTasks[taskId].tCoeff, RGB(30, 22, 11)); - BlendPalette(0x68, 1, gTasks[taskId].tCoeff, RGB_WHITE); - BlendPalette(0x6E, 1, gTasks[taskId].tCoeff, RGB(30, 29, 29)); - } - - if (gTasks[taskId].tCoeff == 0) - sContestResults->data->pointsFlashing = FALSE; - else - sContestResults->data->pointsFlashing = TRUE; -} - -static void LoadContestMonIcon(u16 species, u8 monIndex, u8 srcOffset, u8 useDmaNow, u32 personality) -{ - const u8 *iconPtr; - u16 var0, var1, frameNum; - - if (monIndex == gContestPlayerMonIndex) - frameNum = 1; - else - frameNum = 0; - - iconPtr = GetMonIconPtr(species, personality, frameNum); - iconPtr += srcOffset * 0x200 + 0x80; - if (useDmaNow) - { - RequestDma3Copy(iconPtr, (void *)BG_CHAR_ADDR(1) + monIndex * 0x200, 0x180, 1); - var0 = ((monIndex + 10) << 12); - var1 = (monIndex * 0x10 + 0x200); - WriteSequenceToBgTilemapBuffer(1, var1 | var0, 3, monIndex * 3 + 4, 4, 3, 17, 1); - } - else - { - RequestDma3Copy(iconPtr, (void *)BG_CHAR_ADDR(1) + monIndex * 0x200, 0x180, 1); - } -} - -static void LoadAllContestMonIcons(u8 srcOffset, bool8 useDmaNow) -{ - int i; - - for (i = 0; i < CONTESTANT_COUNT; i++) - LoadContestMonIcon(gContestMons[i].species, i, srcOffset, useDmaNow, gContestMons[i].personality); -} - -static void LoadAllContestMonIconPalettes(void) -{ - int i, species; - - for (i = 0; i < CONTESTANT_COUNT; i++) - { - species = gContestMons[i].species; - LoadPalette(gMonIconPalettes[gMonIconPaletteIndices[GetIconSpecies(species, 0)]], i * 0x10 + 0xA0, 0x20); - } -} - -static void TryCreateWirelessSprites(void) -{ - u16 sheet; - u8 spriteId; - - if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS) - { - LoadWirelessStatusIndicatorSpriteGfx(); - CreateWirelessStatusIndicatorSprite(8, 8); - gSprites[gWirelessStatusIndicatorSpriteId].subpriority = 1; - sheet = LoadSpriteSheet(&sUnknown_0858D8E0); - RequestDma3Fill(0xFFFFFFFF, (void *)BG_CHAR_ADDR(4) + sheet * 0x20, 0x80, 1); - spriteId = CreateSprite(&sSpriteTemplate_858D8C8, 8, 8, 0); - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_WINDOW; - } -} - -// Functionally equivalent, the same except compiler generated variables from -// src are placed on different stack positions. - -#ifdef NONMATCHING -static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId) -{ - u8 *windowTilesPtr; - u16 windowId; - int origWidth; - struct WindowTemplate windowTemplate; - int strWidth; - u8 *spriteTilePtrs[4]; - u8 *dst; - int i; - struct Sprite *sprite; - const u8 *src; // The culprit. - - memset(&windowTemplate, 0, sizeof(windowTemplate)); - windowTemplate.width = 30; - windowTemplate.height = 2; - windowId = AddWindow(&windowTemplate); - FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); - - origWidth = GetStringWidth(1, text, 0); - strWidth = (origWidth + 9) / 8; - if (strWidth > 30) - strWidth = 30; - - AddTextPrinterParameterized3(windowId, 1, (strWidth * 8 - origWidth) / 2, 1, sContestLinkTextColors, -1, text); - windowTilesPtr = (u8 *)(GetWindowAttribute(windowId, WINDOW_TILE_DATA)); - src = (u8 *)(sUnknown_0858D6D0); - - sprite = &gSprites[spriteId]; - spriteTilePtrs[0] = (u8 *)(sprite->oam.tileNum * 32 + VRAM + 0x10000); - - for (i = 1; i < 4; i++) - spriteTilePtrs[i] = (void*)(gSprites[sprite->data[i - 1]].oam.tileNum * 32 + VRAM + 0x10000); - - for (i = 0; i < 4; i++) - CpuFill32(0, spriteTilePtrs[i], 0x400); - - dst = spriteTilePtrs[0]; - CpuCopy32(src, dst, 0x20); - CpuCopy32(src + 128, dst + 0x100, 0x20); - CpuCopy32(src + 128, dst + 0x200, 0x20); - CpuCopy32(src + 64, dst + 0x300, 0x20); - - for (i = 0; i < strWidth; i++) - { - dst = &spriteTilePtrs[(i + 1) / 8][((i + 1) % 8) * 32]; - CpuCopy32(src + 192, dst, 0x20); - CpuCopy32(windowTilesPtr, dst + 0x100, 0x20); - CpuCopy32(windowTilesPtr + 960, dst + 0x200, 0x20); - CpuCopy32(src + 224, dst + 0x300, 0x20); - windowTilesPtr += 0x20; - } - - dst = &spriteTilePtrs[(i + 1) / 8][((i + 1) % 8) * 32]; - CpuCopy32(src + 32, dst, 0x20); - CpuCopy32(src + 160, dst + 0x100, 0x20); - CpuCopy32(src + 160, dst + 0x200, 0x20); - CpuCopy32(src + 96, dst + 0x300, 0x20); - RemoveWindow(windowId); - - return (240 - (strWidth + 2) * 8) / 2; -} - -#else -NAKED -static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId) -{ - asm_unified("\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x44\n\ - adds r5, r0, 0\n\ - lsls r1, 24\n\ - lsrs r7, r1, 24\n\ - add r4, sp, 0x20\n\ - adds r0, r4, 0\n\ - movs r1, 0\n\ - movs r2, 0x8\n\ - bl memset\n\ - movs r0, 0x1E\n\ - strb r0, [r4, 0x3]\n\ - movs r0, 0x2\n\ - strb r0, [r4, 0x4]\n\ - adds r0, r4, 0\n\ - bl AddWindow\n\ - lsls r6, r0, 24\n\ - lsrs r4, r6, 24\n\ - adds r0, r4, 0\n\ - movs r1, 0x11\n\ - bl FillWindowPixelBuffer\n\ - movs r0, 0x1\n\ - adds r1, r5, 0\n\ - movs r2, 0\n\ - bl GetStringWidth\n\ - adds r2, r0, 0\n\ - adds r2, 0x9\n\ - cmp r2, 0\n\ - bge _080F6BC4\n\ - adds r2, 0x7\n\ -_080F6BC4:\n\ - asrs r2, 3\n\ - mov r10, r2\n\ - cmp r2, 0x1E\n\ - ble _080F6BD0\n\ - movs r1, 0x1E\n\ - mov r10, r1\n\ -_080F6BD0:\n\ - mov r1, r10\n\ - lsls r2, r1, 3\n\ - subs r2, r0\n\ - lsrs r0, r2, 31\n\ - adds r2, r0\n\ - asrs r2, 1\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - ldr r0, =sContestLinkTextColors\n\ - str r0, [sp]\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - str r0, [sp, 0x4]\n\ - str r5, [sp, 0x8]\n\ - adds r0, r4, 0\n\ - movs r1, 0x1\n\ - movs r3, 0x1\n\ - bl AddTextPrinterParameterized3\n\ - adds r0, r4, 0\n\ - movs r1, 0x7\n\ - bl GetWindowAttribute\n\ - mov r9, r0\n\ - ldr r2, =sUnknown_0858D6D0\n\ - mov r8, r2\n\ - lsls r1, r7, 4\n\ - adds r1, r7\n\ - lsls r1, 2\n\ - ldr r3, =gSprites\n\ - adds r1, r3\n\ - ldrh r0, [r1, 0x4]\n\ - lsls r0, 22\n\ - lsrs r0, 17\n\ - ldr r2, =0x06010000\n\ - adds r0, r2\n\ - str r0, [sp, 0xC]\n\ - str r6, [sp, 0x38]\n\ - mov r7, sp\n\ - adds r7, 0x1C\n\ - str r7, [sp, 0x2C]\n\ - mov r0, r10\n\ - adds r0, 0x2\n\ - str r0, [sp, 0x30]\n\ - movs r5, 0\n\ - add r7, sp, 0x10\n\ - mov r12, r7\n\ - adds r6, r1, 0\n\ - adds r6, 0x2E\n\ - movs r4, 0x2\n\ -_080F6C34:\n\ - adds r0, r6, r5\n\ - movs r7, 0\n\ - ldrsh r1, [r0, r7]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldrh r0, [r0, 0x4]\n\ - lsls r0, 22\n\ - lsrs r0, 17\n\ - adds r0, r2\n\ - mov r1, r12\n\ - adds r1, 0x4\n\ - mov r12, r1\n\ - subs r1, 0x4\n\ - stm r1!, {r0}\n\ - adds r5, 0x2\n\ - subs r4, 0x1\n\ - cmp r4, 0\n\ - bge _080F6C34\n\ - mov r7, r8\n\ - adds r7, 0x80\n\ - mov r2, r8\n\ - adds r2, 0x40\n\ - str r2, [sp, 0x28]\n\ - mov r0, r8\n\ - adds r0, 0x20\n\ - str r0, [sp, 0x3C]\n\ - mov r1, r8\n\ - adds r1, 0xA0\n\ - str r1, [sp, 0x40]\n\ - adds r2, 0x20\n\ - str r2, [sp, 0x34]\n\ - add r5, sp, 0xC\n\ - movs r6, 0\n\ - movs r4, 0x3\n\ -_080F6C7C:\n\ - str r6, [sp, 0x1C]\n\ - ldm r5!, {r1}\n\ - ldr r0, [sp, 0x2C]\n\ - ldr r2, =0x05000100\n\ - bl CpuSet\n\ - subs r4, 0x1\n\ - cmp r4, 0\n\ - bge _080F6C7C\n\ - ldr r5, [sp, 0xC]\n\ - ldr r6, =0x04000008\n\ - mov r0, r8\n\ - adds r1, r5, 0\n\ - adds r2, r6, 0\n\ - bl CpuSet\n\ - movs r0, 0x80\n\ - lsls r0, 1\n\ - adds r1, r5, r0\n\ - adds r0, r7, 0\n\ - adds r2, r6, 0\n\ - bl CpuSet\n\ - movs r2, 0x80\n\ - lsls r2, 2\n\ - adds r1, r5, r2\n\ - adds r0, r7, 0\n\ - adds r2, r6, 0\n\ - bl CpuSet\n\ - movs r7, 0xC0\n\ - lsls r7, 2\n\ - adds r1, r5, r7\n\ - ldr r0, [sp, 0x28]\n\ - adds r2, r6, 0\n\ - bl CpuSet\n\ - movs r4, 0\n\ - cmp r4, r10\n\ - bge _080F6D32\n\ - adds r7, r6, 0\n\ -_080F6CCE:\n\ - adds r6, r4, 0x1\n\ - adds r0, r6, 0\n\ - cmp r6, 0\n\ - bge _080F6CDA\n\ - adds r0, r4, 0\n\ - adds r0, 0x8\n\ -_080F6CDA:\n\ - asrs r0, 3\n\ - lsls r1, r0, 2\n\ - add r1, sp\n\ - adds r1, 0xC\n\ - lsls r0, 3\n\ - subs r0, r6, r0\n\ - lsls r0, 5\n\ - ldr r1, [r1]\n\ - adds r5, r1, r0\n\ - mov r0, r8\n\ - adds r0, 0xC0\n\ - adds r1, r5, 0\n\ - adds r2, r7, 0\n\ - bl CpuSet\n\ - movs r0, 0x80\n\ - lsls r0, 1\n\ - adds r1, r5, r0\n\ - mov r0, r9\n\ - adds r2, r7, 0\n\ - bl CpuSet\n\ - movs r0, 0xF0\n\ - lsls r0, 2\n\ - add r0, r9\n\ - movs r2, 0x80\n\ - lsls r2, 2\n\ - adds r1, r5, r2\n\ - adds r2, r7, 0\n\ - bl CpuSet\n\ - movs r0, 0xC0\n\ - lsls r0, 2\n\ - adds r1, r5, r0\n\ - mov r0, r8\n\ - adds r0, 0xE0\n\ - adds r2, r7, 0\n\ - bl CpuSet\n\ - movs r1, 0x20\n\ - add r9, r1\n\ - adds r4, r6, 0\n\ - cmp r4, r10\n\ - blt _080F6CCE\n\ -_080F6D32:\n\ - adds r2, r4, 0x1\n\ - adds r0, r2, 0\n\ - cmp r2, 0\n\ - bge _080F6D3E\n\ - adds r0, r4, 0\n\ - adds r0, 0x8\n\ -_080F6D3E:\n\ - asrs r0, 3\n\ - lsls r1, r0, 2\n\ - add r1, sp\n\ - adds r1, 0xC\n\ - lsls r0, 3\n\ - subs r0, r2, r0\n\ - lsls r0, 5\n\ - ldr r1, [r1]\n\ - adds r5, r1, r0\n\ - ldr r4, =0x04000008\n\ - ldr r0, [sp, 0x3C]\n\ - adds r1, r5, 0\n\ - adds r2, r4, 0\n\ - bl CpuSet\n\ - movs r2, 0x80\n\ - lsls r2, 1\n\ - adds r1, r5, r2\n\ - ldr r0, [sp, 0x40]\n\ - adds r2, r4, 0\n\ - bl CpuSet\n\ - movs r7, 0x80\n\ - lsls r7, 2\n\ - adds r1, r5, r7\n\ - ldr r0, [sp, 0x40]\n\ - adds r2, r4, 0\n\ - bl CpuSet\n\ - movs r0, 0xC0\n\ - lsls r0, 2\n\ - adds r1, r5, r0\n\ - ldr r0, [sp, 0x34]\n\ - adds r2, r4, 0\n\ - bl CpuSet\n\ - ldr r1, [sp, 0x38]\n\ - lsrs r0, r1, 24\n\ - bl RemoveWindow\n\ - ldr r2, [sp, 0x30]\n\ - lsls r1, r2, 3\n\ - movs r0, 0xF0\n\ - subs r0, r1\n\ - asrs r0, 1\n\ - add sp, 0x44\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .pool"); -} -#endif // NONMATCHING - -static void LoadContestResultSprites(void) -{ - int i; - struct SpriteTemplate template; - u8 spriteIds[ARRAY_COUNT(sUnknown_0858D810)]; - - template = sSpriteTemplate_858D7F8; - for (i = 0; i < (int)ARRAY_COUNT(sUnknown_0858D810); i++) - LoadSpriteSheet(&sUnknown_0858D810[i]); - - LoadSpritePalette(&sUnknown_0858D850); - for (i = 0; i < (int)ARRAY_COUNT(sUnknown_0858D810); i++) - { - spriteIds[i] = CreateSprite(&template, 272, 144, 10); - template.tileTag++; - } - - gSprites[spriteIds[0]].data[0] = spriteIds[1]; - gSprites[spriteIds[0]].data[1] = spriteIds[2]; - gSprites[spriteIds[0]].data[2] = spriteIds[3]; - - gSprites[spriteIds[4]].data[0] = spriteIds[5]; - gSprites[spriteIds[4]].data[1] = spriteIds[6]; - gSprites[spriteIds[4]].data[2] = spriteIds[7]; - - sContestResults->data->slidingTextBoxSpriteId = spriteIds[0]; - sContestResults->data->slidingTextBoxState = SLIDING_TEXT_OFFSCREEN; - sContestResults->data->linkTextBoxSpriteId = spriteIds[4]; - HideLinkResultsTextBox(); -} - -#define sTargetX data[4] -#define sSlideOutTimer data[5] -#define sSlideIncrement data[6] -#define sDistance data[7] - -// If slideOutTimer is -1, it will not automatically slide out -static void StartTextBoxSlideIn(s16 x, u16 y, u16 slideOutTimer, u16 slideIncrement) -{ - struct Sprite *sprite = &gSprites[sContestResults->data->slidingTextBoxSpriteId]; - sprite->pos1.x = 272; - sprite->pos1.y = y; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - sprite->sTargetX = x + 32; - sprite->sSlideOutTimer = slideOutTimer; - sprite->sSlideIncrement = slideIncrement; - sprite->sDistance = 0; - sprite->callback = SpriteCB_TextBoxSlideIn; - sContestResults->data->slidingTextBoxState = SLIDING_TEXT_ENTERING; -} - -static void StartTextBoxSlideOut(u16 slideIncrement) -{ - struct Sprite *sprite = &gSprites[sContestResults->data->slidingTextBoxSpriteId]; - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.y = 0; - sprite->pos2.x = 0; - sprite->sSlideIncrement = slideIncrement; - sprite->sDistance = 0; - sprite->callback = SpriteCB_TextBoxSlideOut; - sContestResults->data->slidingTextBoxState = SLIDING_TEXT_EXITING; -} - -static void EndTextBoxSlideOut(struct Sprite *sprite) -{ - sprite->pos1.x = 272; - sprite->pos1.y = 144; - sprite->pos2.y = 0; - sprite->pos2.x = 0; - sprite->callback = SpriteCallbackDummy; - sContestResults->data->slidingTextBoxState = SLIDING_TEXT_OFFSCREEN; -} - -static void SpriteCB_TextBoxSlideIn(struct Sprite *sprite) -{ - int i; - - s16 delta = sprite->sDistance + sprite->sSlideIncrement; - sprite->pos1.x -= delta >> 8; - sprite->sDistance += sprite->sSlideIncrement; - sprite->sDistance &= 0xFF; - - // Prevent overshooting target - if (sprite->pos1.x < sprite->sTargetX) - sprite->pos1.x = sprite->sTargetX; - - for (i = 0; i < 3; i++) - { - struct Sprite *sprite2 = &gSprites[sprite->data[i]]; - sprite2->pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64; - } - - if (sprite->pos1.x == sprite->sTargetX) - sprite->callback = SpriteCB_EndTextBoxSlideIn; -} - -static void SpriteCB_EndTextBoxSlideIn(struct Sprite *sprite) -{ - sContestResults->data->slidingTextBoxState = SLIDING_TEXT_ARRIVED; - if ((u16)sprite->sSlideOutTimer != 0xFFFF) - { - if (--sprite->sSlideOutTimer == -1) - StartTextBoxSlideOut(sprite->sSlideIncrement); - } -} - -static void SpriteCB_TextBoxSlideOut(struct Sprite *sprite) -{ - int i; - s16 delta; - - delta = sprite->sDistance + sprite->sSlideIncrement; - sprite->pos1.x -= delta >> 8; - sprite->sDistance += sprite->sSlideIncrement; - sprite->sDistance &= 0xFF; - for (i = 0; i < 3; i++) - { - struct Sprite *sprite2 = &gSprites[sprite->data[i]]; - sprite2->pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64; - } - - if (sprite->pos1.x + sprite->pos2.x < -224) - EndTextBoxSlideOut(sprite); -} - -static void ShowLinkResultsTextBox(const u8 *text) -{ - int i; - u16 x; - struct Sprite *sprite; - - x = DrawResultsTextWindow(text, sContestResults->data->linkTextBoxSpriteId); - sprite = &gSprites[sContestResults->data->linkTextBoxSpriteId]; - sprite->pos1.x = x + 32; - sprite->pos1.y = 80; - sprite->invisible = FALSE; - for (i = 0; i < 3; i++) - { - gSprites[sprite->data[i]].pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64; - gSprites[sprite->data[i]].pos1.y = sprite->pos1.y; - gSprites[sprite->data[i]].invisible = FALSE; - } - - gBattle_WIN0H = 0x00F0; - gBattle_WIN0V = ((sprite->pos1.y - 16) << 8) | (sprite->pos1.y + 16); - SetGpuReg(REG_OFFSET_WININ, WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR - | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR); -} - -static void HideLinkResultsTextBox(void) -{ - int i; - struct Sprite *sprite; - - sprite = &gSprites[sContestResults->data->linkTextBoxSpriteId]; - sprite->invisible = TRUE; - for (i = 0; i < 3; i++) - gSprites[sprite->data[i]].invisible = TRUE; - - gBattle_WIN0H = 0; - gBattle_WIN0V = 0; - SetGpuReg(REG_OFFSET_WIN0H, gBattle_WIN0H); - SetGpuReg(REG_OFFSET_WIN0V, gBattle_WIN0V); - SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR - | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); -} - -static void LoadContestResultsTilemaps(void) -{ - u8 palette; - int x, y; - - x = 5; - y = 1; - if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) - { - CopyToBgTilemapBufferRect(2, gLinkContestResults_Tilemap, 5, 1, 5, 2); - x = 10; - } - else if (gSpecialVar_ContestRank == CONTEST_RANK_NORMAL) - { - CopyToBgTilemapBufferRect(2, gNormalContestResults_Tilemap, 5, 1, 10, 2); - x = 15; - } - else if (gSpecialVar_ContestRank == CONTEST_RANK_SUPER) - { - CopyToBgTilemapBufferRect(2, gSuperContestResults_Tilemap, 5, 1, 10, 2); - x = 15; - } - else if (gSpecialVar_ContestRank == CONTEST_RANK_HYPER) - { - CopyToBgTilemapBufferRect(2, gHyperContestResults_Tilemap, 5, 1, 10, 2); - x = 15; - } - else // CONTEST_RANK_MASTER - { - CopyToBgTilemapBufferRect(2, gMasterContestResults_Tilemap, 5, 1, 10, 2); - x = 15; - } - - if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_COOL) - { - palette = 0; - CopyToBgTilemapBufferRect(2, gCoolContestResults_Tilemap, x, y, 5, 2); - } - else if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_BEAUTY) - { - palette = 1; - CopyToBgTilemapBufferRect(2, gBeautyContestResults_Tilemap, x, y, 5, 2); - } - else if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_CUTE) - { - palette = 2; - CopyToBgTilemapBufferRect(2, gCuteContestResults_Tilemap, x, y, 5, 2); - } - else if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_SMART) - { - palette = 3; - CopyToBgTilemapBufferRect(2, gSmartContestResults_Tilemap, x, y, 5, 2); - } - else // CONTEST_CATEGORY_TOUGH - { - palette = 4; - CopyToBgTilemapBufferRect(2, gToughContestResults_Tilemap, x, y, 5, 2); - } - - x += 5; - CopyToBgTilemapBufferRect(2, gContestResults_Tilemap, x, y, 6, 2); - CopyToBgTilemapBufferRect_ChangePalette(2, sContestResults->tilemapBuffers[2], 0, 0, 32, 4, palette); -} - -// Represented on results board as stars -static u8 GetNumPreliminaryPoints(u8 monIndex, bool8 capPoints) -{ - u32 condition = gContestMonConditions[monIndex] << 16; - u32 numStars = condition / 0x3F; - - if (numStars & 0xFFFF) - numStars += 0x10000; - - numStars >>= 16; - if (numStars == 0 && condition) - numStars = 1; - - if (capPoints && numStars > 10) - numStars = 10; - - return numStars; -} - -// Represented on results board as hearts -static s8 GetNumRound2Points(u8 monIndex, bool8 capPoints) -{ - u32 r4, numHearts; - s16 results; - s8 points; - - results = gContestMonRound2Points[monIndex]; - if (results < 0) - r4 = -results << 16; - else - r4 = results << 16; - - numHearts = r4 / 80; - if (numHearts & 0xFFFF) - numHearts += 0x10000; - - numHearts >>= 16; - if (numHearts == 0 && r4 != 0) - numHearts = 1; - - if (capPoints && numHearts > 10) - numHearts = 10; - - if (gContestMonRound2Points[monIndex] < 0) - points = -numHearts; - else - points = numHearts; - - return points; -} - -#define tState data[10] - -static void Task_DrawFinalStandingNumber(u8 taskId) -{ - u16 firstTileNum; - - if (gTasks[taskId].tState == 0) - { - gTasks[taskId].data[11] = (3 - gTasks[taskId].tFinalStanding) * 40; - gTasks[taskId].tState++; - } - else if (gTasks[taskId].tState == 1) - { - if (--gTasks[taskId].data[11] == -1) - { - firstTileNum = gTasks[taskId].tFinalStanding * 2 + 0x5043; - WriteSequenceToBgTilemapBuffer(2, firstTileNum, 1, gTasks[taskId].tMonIndex * 3 + 5, 2, 1, 17, 1); - WriteSequenceToBgTilemapBuffer(2, firstTileNum + 0x10, 1, gTasks[taskId].tMonIndex * 3 + 6, 2, 1, 17, 1); - sContestResults->data->numStandingsPrinted++; - DestroyTask(taskId); - PlaySE(SE_JYUNI); - } - } -} - -#undef tFinalStanding -#undef tMonIndex -#undef tState - -static void Task_StartHighlightWinnersBox(u8 taskId) -{ - int i; - GET_CONTEST_WINNER_ID(i); - CopyToBgTilemapBufferRect_ChangePalette(2, i * 0xC0 + 0x100 + sContestResults->tilemapBuffers[2], 0, i * 3 + 4, 32, 3, 9); - gTasks[taskId].data[10] = i; - gTasks[taskId].data[12] = 1; - gTasks[taskId].func = Task_HighlightWinnersBox; - sContestResults->data->highlightWinnerTaskId = taskId; -} - -static void Task_HighlightWinnersBox(u8 taskId) -{ - if (++gTasks[taskId].data[11] == 1) - { - gTasks[taskId].data[11] = 0; - BlendPalette(0x91, 1, gTasks[taskId].data[12], RGB(13, 28, 27)); - if (gTasks[taskId].data[13] == 0) - { - if (++gTasks[taskId].data[12] == 16) - gTasks[taskId].data[13] = 1; - } - else - { - if (--gTasks[taskId].data[12] == 0) - gTasks[taskId].data[13] = 0; - } - } -} - -static void SpriteCB_WinnerMonSlideIn(struct Sprite *sprite) -{ - if (sprite->data[0] < 10) - { - if (++sprite->data[0] == 10) - { - PlayCry1(sprite->data[1], 0); - sprite->data[1] = 0; - } - } - else - { - s16 delta = sprite->data[1] + 0x600; - sprite->pos1.x -= delta >> 8; - sprite->data[1] += 0x600; - sprite->data[1] &= 0xFF; - if (sprite->pos1.x < 120) - sprite->pos1.x = 120; - - if (sprite->pos1.x == 120) - { - sprite->callback = SpriteCallbackDummy; - sprite->data[1] = 0; - sContestResults->data->winnerMonSlidingState = SLIDING_MON_ENTERED; - } - } -} - -static void SpriteCB_WinnerMonSlideOut(struct Sprite *sprite) -{ - s16 delta = sprite->data[1] + 0x600; - sprite->pos1.x -= delta >> 8; - sprite->data[1] += + 0x600; - sprite->data[1] &= 0xFF; - if (sprite->pos1.x < -32) - { - sprite->callback = SpriteCallbackDummy; - sprite->invisible = TRUE; - sContestResults->data->winnerMonSlidingState = SLIDING_MON_EXITED; - } -} - -static void Task_CreateConfetti(u8 taskId) -{ - if (++gTasks[taskId].data[0] == 5) - { - gTasks[taskId].data[0] = 0; - if (sContestResults->data->confettiCount < 40) - { - u8 spriteId = CreateSprite(&sSpriteTemplate_Confetti, (Random() % 240) - 20, 44, 5); - gSprites[spriteId].data[0] = Random() % 512; - gSprites[spriteId].data[1] = (Random() % 24) + 16; - gSprites[spriteId].data[2] = (Random() % 256) + 48; - gSprites[spriteId].oam.tileNum += Random() % 17; - sContestResults->data->confettiCount++; - } - } - - if (sContestResults->data->destroyConfetti) - DestroyTask(taskId); -} - -static void SpriteCB_Confetti(struct Sprite *sprite) -{ - s16 delta; - - sprite->data[3] += sprite->data[0]; - sprite->pos2.x = Sin(sprite->data[3] >> 8, sprite->data[1]); - delta = sprite->data[4] + sprite->data[2]; - sprite->pos1.x += delta >> 8; - sprite->data[4] += sprite->data[2]; - sprite->data[4] &= 0xff; - - sprite->pos1.y++; - if (sContestResults->data->destroyConfetti) - sprite->invisible = TRUE; - - if (sprite->pos1.x > 248 || sprite->pos1.y > 116) - { - DestroySprite(sprite); - sContestResults->data->confettiCount--; - } -} - -#define tMonIndex data[0] -#define tNumFrames data[1] -#define tSpecies data[2] -#define tTimer data[10] -#define tBounced data[11] - -static void BounceMonIconInBox(u8 monIndex, u8 numFrames) -{ - u8 taskId = CreateTask(Task_BounceMonIconInBox, 8); - gTasks[taskId].tMonIndex = monIndex; - gTasks[taskId].tNumFrames = numFrames; - gTasks[taskId].tSpecies = gContestMons[monIndex].species; -} - -static void Task_BounceMonIconInBox(u8 taskId) -{ - u8 monIndex = gTasks[taskId].tMonIndex; - if (gTasks[taskId].tTimer++ == gTasks[taskId].tNumFrames) - { - gTasks[taskId].tTimer = 0; - LoadContestMonIcon(gTasks[taskId].tSpecies, monIndex, gTasks[taskId].tBounced, FALSE, gContestMons[monIndex].personality); - gTasks[taskId].tBounced ^= 1; - } -} - -#undef tMonIndex -#undef tNumFrames -#undef tSpecies -#undef tTimer -#undef tBounced - -static void CalculateContestantsResultData(void) -{ - int i, relativePoints; - u32 barLength; - s16 highestPoints; - s8 round2Points; - - highestPoints = gContestMonTotalPoints[0]; - for (i = 1; i < CONTESTANT_COUNT; i++) - { - if (highestPoints < gContestMonTotalPoints[i]) - highestPoints = gContestMonTotalPoints[i]; - } - - if (highestPoints < 0) - { - highestPoints = gContestMonTotalPoints[0]; - for (i = 1; i < CONTESTANT_COUNT; i++) - { - if (highestPoints > gContestMonTotalPoints[i]) - highestPoints = gContestMonTotalPoints[i]; - } - } - - for (i = 0; i < CONTESTANT_COUNT; i++) - { - relativePoints = (gContestMonConditions[i] * 1000) / abs(highestPoints); - if (relativePoints % 10 > 4) - relativePoints += 10; - (*sContestResults->monResults)[i].relativePreliminaryPoints = relativePoints / 10; - - relativePoints = (abs(gContestMonRound2Points[i]) * 1000) / abs(highestPoints); - if (relativePoints % 10 > 4) - relativePoints += 10; - (*sContestResults->monResults)[i].relativeRound2Points = relativePoints / 10; - - if (gContestMonRound2Points[i] < 0) - (*sContestResults->monResults)[i].lostPoints = TRUE; - - barLength = ((*sContestResults->monResults)[i].relativePreliminaryPoints * 0x5800) / 100; - if ((barLength & 0xFF) > 0x7F) - barLength += 0x100; - (*sContestResults->monResults)[i].barLengthPreliminary = barLength >> 8; - - barLength = ((*sContestResults->monResults)[i].relativeRound2Points * 0x5800) / 100; - if ((barLength & 0xFF) > 0x7F) - barLength += 0x100; - (*sContestResults->monResults)[i].barLengthRound2 = barLength >> 8; - - (*sContestResults->monResults)[i].numStars = GetNumPreliminaryPoints(i, TRUE); - round2Points = GetNumRound2Points(i, TRUE); - (*sContestResults->monResults)[i].numHearts = abs(round2Points); - - if (gContestFinalStandings[i]) - { - s16 barLengthPreliminary = (*sContestResults->monResults)[i].barLengthPreliminary; - s16 barLengthRound2 = (*sContestResults->monResults)[i].barLengthRound2; - - if ((*sContestResults->monResults)[i].lostPoints) - barLengthRound2 *= -1; - - if (barLengthPreliminary + barLengthRound2 == MAX_BAR_LENGTH + 1) - { - if (barLengthRound2 > 0) - (*sContestResults->monResults)[i].barLengthRound2--; - else if (barLengthPreliminary > 0) - (*sContestResults->monResults)[i].barLengthPreliminary--; - } - } - } -} - -#define tMonId data[0] -#define tTarget data[1] -#define tDecreasing data[2] - -static void UpdateContestResultBars(bool8 isRound2, u8 numUpdates) -{ - int i, taskId; - u32 target; - u8 numIncreasing = 0, numDecreasing = 0; - - if (!isRound2) - { - for (i = 0; i < CONTESTANT_COUNT; i++) - { - u8 numStars = (*sContestResults->monResults)[i].numStars; - if (numUpdates < numStars) - { - FillBgTilemapBufferRect_Palette0(1, 0x60B3, ((19 + numStars) - numUpdates) - 1, i * 3 + 5, 1, 1); - taskId = CreateTask(Task_UpdateContestResultBar, 10); - - target = (((*sContestResults->monResults)[i].barLengthPreliminary << 16) / (*sContestResults->monResults)[i].numStars) * (numUpdates + 1); - if ((target & 0xFFFF) > 0x7FFF) - target += 0x10000; - - gTasks[taskId].tMonId = i; - gTasks[taskId].tTarget = target >> 16; - sContestResults->data->numBarsUpdating++; - numIncreasing++; - } - } - } - else - { - for (i = 0; i < CONTESTANT_COUNT; i++) - { - s8 numHearts = (*sContestResults->monResults)[i].numHearts; - u32 tile = (*sContestResults->monResults)[i].lostPoints ? 0x60A5 : 0x60A3; - if (numUpdates < numHearts) - { - FillBgTilemapBufferRect_Palette0(1, tile, ((19 + numHearts) - numUpdates) - 1, i * 3 + 6, 1, 1); - taskId = CreateTask(Task_UpdateContestResultBar, 10); - - target = (((*sContestResults->monResults)[i].barLengthRound2 << 16) / (*sContestResults->monResults)[i].numHearts) * (numUpdates + 1); - if ((target & 0xFFFF) > 0x7FFF) - target += 0x10000; - - gTasks[taskId].tMonId = i; - if ((*sContestResults->monResults)[i].lostPoints) - { - gTasks[taskId].tDecreasing = TRUE; - numDecreasing++; - } - else - { - numIncreasing++; - } - - if ((*sContestResults->monResults)[i].lostPoints) - gTasks[taskId].tTarget = -(target >> 16) + (*sContestResults->monResults)[i].barLengthPreliminary; - else - gTasks[taskId].tTarget = (target >> 16) + (*sContestResults->monResults)[i].barLengthPreliminary; - - sContestResults->data->numBarsUpdating++; - } - } - } - - if (numDecreasing) - PlaySE(SE_BOO); - if (numIncreasing) - PlaySE(SE_PIN); -} - -static void Task_UpdateContestResultBar(u8 taskId) -{ - int i; - bool32 minMaxReached = FALSE; - bool32 targetReached = FALSE; - u8 monId = gTasks[taskId].tMonId; - s16 target = gTasks[taskId].tTarget; - s16 decreasing = gTasks[taskId].tDecreasing; - - if (decreasing) - { - if (sContestResults->data->unkC[monId] <= 0) - minMaxReached = TRUE; - } - else - { - if (sContestResults->data->unkC[monId] > MAX_BAR_LENGTH) - minMaxReached = TRUE; - } - - if (sContestResults->data->unkC[monId] == target) - targetReached = TRUE; - - if (!targetReached) - { - if (minMaxReached) - sContestResults->data->unkC[monId] = target; - else if (decreasing) - sContestResults->data->unkC[monId] = sContestResults->data->unkC[monId] - 1; - else - sContestResults->data->unkC[monId] = sContestResults->data->unkC[monId] + 1; - } - - if (!minMaxReached && !targetReached) - { - u8 var0; - u16 tileNum; - for (i = 0; i < 11; i++) - { - if (sContestResults->data->unkC[monId] >= (i + 1) * 8) - var0 = 8; - else if (sContestResults->data->unkC[monId] >= i * 8) - var0 = sContestResults->data->unkC[monId] % 8; - else - var0 = 0; - - if (var0 < 4) - tileNum = 0x504C + var0; - else - tileNum = 0x5057 + var0; - - FillBgTilemapBufferRect_Palette0(2, tileNum, i + 7, monId * 3 + 6, 1, 1); - } - } - - if (targetReached) - { - sContestResults->data->numBarsUpdating--; - DestroyTask(taskId); - } -} - -#undef tMonId -#undef tTarget -#undef tDecreasing - -static void AllocContestResults(void) -{ - sContestResults = AllocZeroed(sizeof(*sContestResults)); - sContestResults->data = AllocZeroed(sizeof(*sContestResults->data)); - sContestResults->monResults = AllocZeroed(sizeof(*sContestResults->monResults)); - sContestResults->unusedBg = AllocZeroed(BG_SCREEN_SIZE); - sContestResults->tilemapBuffers[0] = AllocZeroed(BG_SCREEN_SIZE); - sContestResults->tilemapBuffers[1] = AllocZeroed(BG_SCREEN_SIZE); - sContestResults->tilemapBuffers[2] = AllocZeroed(BG_SCREEN_SIZE); - sContestResults->tilemapBuffers[3] = AllocZeroed(BG_SCREEN_SIZE); - sContestResults->unused = AllocZeroed(0x1000); - AllocateMonSpritesGfx(); -} - -static void FreeContestResults(void) -{ - FREE_AND_SET_NULL(sContestResults->data); - FREE_AND_SET_NULL(sContestResults->monResults); - FREE_AND_SET_NULL(sContestResults->unusedBg); - FREE_AND_SET_NULL(sContestResults->tilemapBuffers[0]); - FREE_AND_SET_NULL(sContestResults->tilemapBuffers[1]); - FREE_AND_SET_NULL(sContestResults->tilemapBuffers[2]); - FREE_AND_SET_NULL(sContestResults->tilemapBuffers[3]); - FREE_AND_SET_NULL(sContestResults->unused); - FREE_AND_SET_NULL(sContestResults); - FreeMonSpritesGfx(); -} - -static void AddContestTextPrinter(int windowId, u8 *str, int x) -{ - struct TextPrinterTemplate textPrinter; - textPrinter.currentChar = str; - textPrinter.windowId = windowId; - textPrinter.fontId = 7; - textPrinter.x = x; - textPrinter.y = 2; - textPrinter.currentX = x; - textPrinter.currentY = 2; - textPrinter.letterSpacing = 0; - textPrinter.lineSpacing = 0; - textPrinter.unk = 0; - textPrinter.fgColor = 1; - textPrinter.bgColor = 0; - textPrinter.shadowColor = 8; - AddTextPrinter(&textPrinter, 0, NULL); - PutWindowTilemap(windowId); -} - -void TryEnterContestMon(void) -{ - u8 eligibility = GetContestEntryEligibility(&gPlayerParty[gContestMonPartyIndex]); - - // Nonzero eligibility can still be non-eligibile, if mon is fainted or egg - if (eligibility) - { - sub_80DAB8C(gSpecialVar_ContestCategory, gSpecialVar_ContestRank); - sub_80DB09C(gSpecialVar_ContestCategory); - } - - gSpecialVar_Result = eligibility; -} - -u16 HasMonWonThisContestBefore(void) -{ - u16 hasRankRibbon = FALSE; - struct Pokemon *mon = &gPlayerParty[gContestMonPartyIndex]; - switch (gSpecialVar_ContestCategory) - { - case CONTEST_CATEGORY_COOL: - if (GetMonData(mon, MON_DATA_COOL_RIBBON) > gSpecialVar_ContestRank) - hasRankRibbon = TRUE; - break; - case CONTEST_CATEGORY_BEAUTY: - if (GetMonData(mon, MON_DATA_BEAUTY_RIBBON) > gSpecialVar_ContestRank) - hasRankRibbon = TRUE; - break; - case CONTEST_CATEGORY_CUTE: - if (GetMonData(mon, MON_DATA_CUTE_RIBBON) > gSpecialVar_ContestRank) - hasRankRibbon = TRUE; - break; - case CONTEST_CATEGORY_SMART: - if (GetMonData(mon, MON_DATA_SMART_RIBBON) > gSpecialVar_ContestRank) - hasRankRibbon = TRUE; - break; - case CONTEST_CATEGORY_TOUGH: - if (GetMonData(mon, MON_DATA_TOUGH_RIBBON) > gSpecialVar_ContestRank) - hasRankRibbon = TRUE; - break; - } - - return hasRankRibbon; -} - -void GiveMonContestRibbon(void) -{ - u8 ribbonData; - - if (gContestFinalStandings[gContestPlayerMonIndex] != 0) - return; - - switch (gSpecialVar_ContestCategory) - { - case CONTEST_CATEGORY_COOL: - ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON); - if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) - { - ribbonData++; - SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON, &ribbonData); - if (GetRibbonCount(&gPlayerParty[gContestMonPartyIndex]) > NUM_CUTIES_RIBBONS) - TryPutSpotTheCutiesOnAir(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON); - } - break; - case CONTEST_CATEGORY_BEAUTY: - ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON); - if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) - { - ribbonData++; - SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON, &ribbonData); - if (GetRibbonCount(&gPlayerParty[gContestMonPartyIndex]) > NUM_CUTIES_RIBBONS) - TryPutSpotTheCutiesOnAir(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON); - } - break; - case CONTEST_CATEGORY_CUTE: - ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON); - if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) - { - ribbonData++; - SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON, &ribbonData); - if (GetRibbonCount(&gPlayerParty[gContestMonPartyIndex]) > NUM_CUTIES_RIBBONS) - TryPutSpotTheCutiesOnAir(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON); - } - break; - case CONTEST_CATEGORY_SMART: - ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON); - if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) - { - ribbonData++; - SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON, &ribbonData); - if (GetRibbonCount(&gPlayerParty[gContestMonPartyIndex]) > NUM_CUTIES_RIBBONS) - TryPutSpotTheCutiesOnAir(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON); - } - break; - case CONTEST_CATEGORY_TOUGH: - ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON); - if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) - { - ribbonData++; - SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON, &ribbonData); - if (GetRibbonCount(&gPlayerParty[gContestMonPartyIndex]) > NUM_CUTIES_RIBBONS) - TryPutSpotTheCutiesOnAir(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON); - } - break; - } -} - -void BufferContestantTrainerName(void) -{ - StringCopy(gStringVar1, gContestMons[gSpecialVar_0x8006].trainerName); - sub_81DB5AC(gStringVar1); -} - -void BufferContestantMonNickname(void) -{ - StringCopy(gStringVar3, gContestMons[gSpecialVar_0x8006].nickname); -} - -// Unused script special -void GetContestMonConditionRanking(void) -{ - u8 i, rank; - - for (i = 0, rank = 0; i < CONTESTANT_COUNT; i++) - { - if (gContestMonConditions[gSpecialVar_0x8006] < gContestMonConditions[i]) - rank++; - } - - gSpecialVar_0x8004 = rank; -} - -void GetContestMonCondition(void) -{ - gSpecialVar_0x8004 = gContestMonConditions[gSpecialVar_0x8006]; -} - -void GetContestWinnerId(void) -{ - u8 i; - GET_CONTEST_WINNER_ID(i); - gSpecialVar_0x8005 = i; -} - -void BufferContestWinnerTrainerName(void) -{ - u8 i; - GET_CONTEST_WINNER_ID(i); - StringCopy(gStringVar3, gContestMons[i].trainerName); - sub_81DB5AC(gStringVar3); -} - -void BufferContestWinnerMonName(void) -{ - u8 i; - GET_CONTEST_WINNER_ID(i); - StringCopy(gStringVar1, gContestMons[i].nickname); -} - -void CB2_SetStartContestCallback(void) -{ - SetMainCallback2(CB2_StartContest); -} - -static void Task_StartContest(u8 taskId) -{ - if (!gPaletteFade.active) - { - DestroyTask(taskId); - SetMainCallback2(CB2_SetStartContestCallback); - } -} - -void StartContest(void) -{ - ScriptContext2_Enable(); - CreateTask(Task_StartContest, 10); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); -} - -void BufferContestantMonSpecies(void) -{ - gSpecialVar_0x8004 = gContestMons[gSpecialVar_0x8006].species; -} - -static void Task_StartShowContestResults(u8 taskId) -{ - if (!gPaletteFade.active) - { - DestroyTask(taskId); - SetMainCallback2(CB2_StartShowContestResults); - } -} - -void ShowContestResults(void) -{ - ScriptContext2_Enable(); - CreateTask(Task_StartShowContestResults, 10); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); -} - -void GetContestPlayerId(void) -{ - gSpecialVar_0x8004 = gContestPlayerMonIndex; -} - -void ContestLinkTransfer(u8 taskId) -{ - u8 newTaskId; - ScriptContext2_Enable(); - newTaskId = CreateTask(sub_80FC580, 0); - SetTaskFuncWithFollowupFunc(newTaskId, sub_80FC580, sub_80F8508); - gTasks[newTaskId].data[9] = taskId; -} - -static void sub_80F8508(u8 taskId) -{ - if (gLinkContestFlags & LINK_CONTEST_FLAG_HAS_RS_PLAYER) - { - sub_80DA8C8(gContestMonPartyIndex); - SetTaskFuncWithFollowupFunc(taskId, sub_80FC6BC, sub_80F8568); - } - else - { - sub_80DA8C8(gContestMonPartyIndex); - gTasks[taskId].func = sub_81D9DE4; - } -} - -static void sub_80F8568(u8 taskId) -{ - SetTaskFuncWithFollowupFunc(taskId, sub_80FC804, sub_80F8584); -} - -static void sub_80F8584(u8 taskId) -{ - SetTaskFuncWithFollowupFunc(taskId, sub_80FCE48, sub_80F85A0); -} - -static void sub_80F85A0(u8 taskId) -{ - SetTaskFuncWithFollowupFunc(taskId, sub_80FC894, sub_80F85BC); -} - -static void sub_80F85BC(u8 taskId) -{ - u8 i; - u8 sp0[4]; - u8 sp4[4]; - - memset(sp0, 0, sizeof(sp0)); - memset(sp4, 0, sizeof(sp4)); - - for (i = 0; i < gNumLinkContestPlayers; i++) - sp0[i] = gTasks[taskId].data[i + 1]; - - for (i = 0; i < gNumLinkContestPlayers;) - { - i++; - if (i >= gNumLinkContestPlayers || sp0[0] != sp0[i]) - break; - } - - if (i == gNumLinkContestPlayers) - gSpecialVar_0x8004 = 0; - else - gSpecialVar_0x8004 = 1; - - for (i = 0; i < gNumLinkContestPlayers; i++) - sp4[i] = gTasks[taskId].data[i + 5]; - - gUnknown_02039F2B = sub_80F86E0(sp4); - sub_80DB09C(gSpecialVar_ContestCategory); - SetTaskFuncWithFollowupFunc(taskId, sub_80FCF40, sub_80F86B8); -} - -static void sub_80F86B8(u8 taskId) -{ - SortContestants(FALSE); - SetTaskFuncWithFollowupFunc(taskId, sub_80FCFD0, sub_80F8714); -} - -u8 sub_80F86E0(u8 *arg0) -{ - int i; - u8 result = 0; - - for (i = 1; i < gNumLinkContestPlayers; i++) - { - if (arg0[result] < arg0[i]) - result = i; - } - - return result; -} - -void sub_80F8714(u8 taskId) -{ - int i; - - if (gSpecialVar_0x8004 == 1) - { - if (IsLinkTaskFinished()) - gTasks[taskId].func = sub_80F878C; - } - else - { - for (i = 0; i < CONTESTANT_COUNT; i++) - StringGetEnd10(gContestMons[i].nickname); - - DestroyTask(taskId); - SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); - ScriptContext2_Disable(); - EnableBothScriptContexts(); - } -} - -static void sub_80F878C(u8 taskId) -{ - sub_800AC34(); - gTasks[taskId].func = sub_80F87B4; -} - -static void sub_80F87B4(u8 taskId) -{ - if (!gReceivedRemoteLinkPlayers) - { - DestroyTask(taskId); - ScriptContext2_Disable(); - EnableBothScriptContexts(); - } -} diff --git a/src/contest_link_80FC4F4.c b/src/contest_link_80FC4F4.c deleted file mode 100644 index e17f62485..000000000 --- a/src/contest_link_80FC4F4.c +++ /dev/null @@ -1,548 +0,0 @@ -#include "global.h" -#include "contest.h" -#include "decompress.h" -#include "event_data.h" -#include "link.h" -#include "pokemon.h" -#include "random.h" -#include "task.h" -#include "constants/flags.h" - -static void sub_80FC5C0(u8); -static void sub_80FC5DC(u8); - -bool32 sub_80FC4F4(void *src, u16 size) -{ - memcpy(gDecompressionBuffer, src, size); - if (SendBlock(bitmask_all_link_players_but_self(), gDecompressionBuffer, size)) - return TRUE; - else - return FALSE; -} - -bool8 sub_80FC530(u8 arg0) -{ - u8 mask = (1 << arg0); - if (!(GetBlockReceivedStatus() & mask)) - { - return FALSE; - } - else - { - ResetBlockReceivedFlag(arg0); - return TRUE; - } -} - -bool8 sub_80FC55C(void) -{ - if (GetBlockReceivedStatus() == sub_800A9D8()) - { - ResetBlockReceivedFlags(); - return TRUE; - } - else - { - return FALSE; - } -} - -void sub_80FC580(u8 taskId) -{ - u8 i; - - for (i = 0; i < 4; i++) - gBlockRecvBuffer[i][0] = 0xFF; - - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_80FC5C0; -} - -static void sub_80FC5C0(u8 taskId) -{ - gTasks[taskId].func = sub_80FC5DC; -} - -static void sub_80FC5DC(u8 taskId) -{ - int i; - - if (!gReceivedRemoteLinkPlayers) - return; - - gContestPlayerMonIndex = GetMultiplayerId(); - gNumLinkContestPlayers = GetLinkPlayerCount(); - gLinkContestFlags = LINK_CONTEST_FLAG_IS_LINK; - if (gWirelessCommType == 1) - gLinkContestFlags = LINK_CONTEST_FLAG_IS_LINK | LINK_CONTEST_FLAG_IS_WIRELESS; - - for (i = 0; i < gNumLinkContestPlayers && (u32)(gLinkPlayers[i].version & 0xFF) - 1 > VERSION_RUBY - 1; i++) - ; - - if (i < gNumLinkContestPlayers) - gLinkContestFlags |= LINK_CONTEST_FLAG_HAS_RS_PLAYER; - - SwitchTaskToFollowupFunc(taskId); -} - -bool32 sub_80FC670(s16 *arg0) -{ - if (gLinkContestFlags & LINK_CONTEST_FLAG_HAS_RS_PLAYER) - return TRUE; - - switch (*arg0) - { - case 0: - if (IsLinkTaskFinished()) - { - sub_800ADF8(); - (*arg0)++; - } - return FALSE; - case 1: - (*arg0)++; - return FALSE; - default: - if (IsLinkTaskFinished() != TRUE) - return FALSE; - else - return TRUE; - } -} - -void sub_80FC6BC(u8 taskId) -{ - int i; - - if (!sub_80FC670(&gTasks[taskId].data[12])) - return; - - switch (gTasks[taskId].data[0]) - { - case 0: - if (GetMultiplayerId() == 0) - { - if (IsLinkTaskFinished()) - { - memcpy(gBlockSendBuffer, &gContestMons[gContestPlayerMonIndex], sizeof(struct ContestPokemon)); - gTasks[taskId].data[0] = 10; - } - } - else - { - memcpy(gBlockSendBuffer, &gContestMons[gContestPlayerMonIndex], sizeof(struct ContestPokemon)); - gTasks[taskId].data[0] = 1; - } - break; - case 1: - if (sub_80FC55C()) - { - for (i = 0; i < gNumLinkContestPlayers; i++) - { - memcpy(&gContestMons[i], gBlockRecvBuffer[i], sizeof(struct ContestPokemon)); - sub_80DFA08(&gContestMons[i], gLinkPlayers[i].language); - } - - gTasks[taskId].data[0]++; - } - break; - case 10: - if (++gTasks[taskId].data[11] > 300) - { - sub_800A4D8(2); - gTasks[taskId].data[0] = 1; - } - break; - default: - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[11] = 0; - gTasks[taskId].data[12] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - } -} - -void sub_80FC804(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - case 0: - if (GetMultiplayerId() == 0) - { - if (IsLinkTaskFinished() && sub_80FC4F4(&gRngValue, sizeof(gRngValue)) == TRUE) - gTasks[taskId].data[0]++; - } - else - { - gTasks[taskId].data[0]++; - } - break; - case 1: - if (sub_80FC530(0)) - { - memcpy(&gRngValue, gBlockRecvBuffer[0], sizeof(gRngValue)); - memcpy(&gContestRngValue, gBlockRecvBuffer[0], sizeof(gContestRngValue)); - gTasks[taskId].data[0]++; - } - break; - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - } -} - -void sub_80FC894(u8 taskId) -{ - int i; - - if (!sub_80FC670(&gTasks[taskId].data[12])) - return; - - switch (gTasks[taskId].data[0]) - { - case 0: - gBlockSendBuffer[0] = gTasks[taskId].data[9]; - if (GetMultiplayerId() == 0) - { - if (IsLinkTaskFinished()) - gTasks[taskId].data[0] = 10; - } - else - { - gTasks[taskId].data[0]++; - } - break; - case 1: - if (sub_80FC55C()) - { - for (i = 0; i < gNumLinkContestPlayers; i++) - gTasks[taskId].data[i + 1] = gBlockRecvBuffer[i][0]; - - gTasks[taskId].data[0]++; - } - break; - case 10: - if (++gTasks[taskId].data[11] > 10) - { - sub_800A4D8(2); - gTasks[taskId].data[0] = 1; - } - break; - default: - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[11] = 0; - gTasks[taskId].data[12] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - } -} - -void sub_80FC998(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - case 0: - if (IsLinkTaskFinished()) - { - if (sub_80FC4F4(&gContestPlayerMonIndex, sizeof(gContestPlayerMonIndex)) == TRUE) - gTasks[taskId].data[0]++; - } - break; - case 1: - if (sub_80FC55C()) - gTasks[taskId].data[0]++; - break; - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - } -} - -void sub_80FC9F8(u8 taskId) -{ - int i; - - switch (gTasks[taskId].data[0]) - { - case 0: - if (IsLinkTaskFinished()) - { - if (sub_80FC4F4(&eContestantStatus[gContestPlayerMonIndex].currMove, sizeof(eContestantStatus[gContestPlayerMonIndex].currMove)) == TRUE) - gTasks[taskId].data[0]++; - } - break; - case 1: - if (sub_80FC55C()) - { - for (i = 0; i < gNumLinkContestPlayers; i++) - eContestantStatus[i].currMove = gBlockRecvBuffer[i][0]; - - gTasks[taskId].data[0]++; - } - break; - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - } -} - -void sub_80FCACC(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - case 0: - if (IsLinkTaskFinished()) - { - if (sub_80FC4F4(gContestMonTotalPoints, sizeof(gContestMonTotalPoints)) == 1) - gTasks[taskId].data[0]++; - } - break; - case 1: - if (sub_80FC55C()) - { - memcpy(gContestMonTotalPoints, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestMonTotalPoints)); - gTasks[taskId].data[0]++; - } - break; - case 2: - case 5: - case 8: - case 11: - if (gTasks[taskId].data[1]++ > 10) - { - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[0]++; - } - break; - case 3: - if (IsLinkTaskFinished()) - { - if (sub_80FC4F4(gUnknown_02039F10, sizeof(gUnknown_02039F10)) == 1) - gTasks[taskId].data[0]++; - } - break; - case 4: - if (sub_80FC55C()) - { - memcpy(gUnknown_02039F10, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gUnknown_02039F10)); - gTasks[taskId].data[0]++; - } - break; - case 6: - if (IsLinkTaskFinished()) - { - if (sub_80FC4F4(gContestMonRound2Points, sizeof(gContestMonRound2Points)) == 1) - gTasks[taskId].data[0]++; - } - break; - case 7: - if (sub_80FC55C()) - { - memcpy(gContestMonRound2Points, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestMonRound2Points)); - gTasks[taskId].data[0]++; - } - break; - case 9: - if (IsLinkTaskFinished()) - { - if (sub_80FC4F4(gContestFinalStandings, sizeof(gContestFinalStandings)) == 1) - gTasks[taskId].data[0]++; - } - break; - case 10: - if (sub_80FC55C()) - { - memcpy(gContestFinalStandings, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestFinalStandings)); - gTasks[taskId].data[0]++; - } - break; - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - } -} - -void sub_80FCC88(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - case 0: - if (IsLinkTaskFinished()) - { - if (sub_80FC4F4(eContestantStatus, 4 * sizeof(struct ContestantStatus)) == 1) - gTasks[taskId].data[0]++; - } - break; - case 1: - if (sub_80FC55C()) - { - memcpy(eContestantStatus, gBlockRecvBuffer[gUnknown_02039F2B], 4 * sizeof(struct ContestantStatus)); - gTasks[taskId].data[0]++; - } - break; - case 2: - case 5: - case 8: - case 11: - if (gTasks[taskId].data[1]++ > 10) - { - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[0]++; - } - break; - case 3: - if (IsLinkTaskFinished()) - { - if (sub_80FC4F4(gContestResources->field_8, sizeof(struct UnknownContestStruct7)) == 1) - gTasks[taskId].data[0]++; - } - break; - case 4: - if (sub_80FC55C()) - { - memcpy(gContestResources->field_8, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(struct UnknownContestStruct7)); - gTasks[taskId].data[0]++; - } - break; - case 6: - if (IsLinkTaskFinished()) - { - if (sub_80FC4F4(gContestResources->field_10, sizeof(struct UnknownContestStruct5)) == 1) - gTasks[taskId].data[0]++; - } - break; - case 7: - if (sub_80FC55C()) - { - memcpy(gContestResources->field_10, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(struct UnknownContestStruct5)); - gTasks[taskId].data[0]++; - } - break; - case 9: - if (IsLinkTaskFinished()) - { - if (sub_80FC4F4(gContestantTurnOrder, sizeof(gContestantTurnOrder)) == 1) - gTasks[taskId].data[0]++; - } - break; - case 10: - if (sub_80FC55C()) - { - memcpy(gContestantTurnOrder, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestantTurnOrder)); - gTasks[taskId].data[0]++; - } - break; - default: - gTasks[taskId].data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - } -} - -void sub_80FCE48(u8 taskId) -{ - int i; - - if (!sub_80FC670(&gTasks[taskId].data[12])) - return; - - switch (gTasks[taskId].data[0]) - { - case 0: - gBlockSendBuffer[0] = 0x6E; - if (GetMultiplayerId() == 0) - { - if (IsLinkTaskFinished()) - gTasks[taskId].data[0] = 10; - } - else - { - gTasks[taskId].data[0]++; - } - break; - case 1: - if (sub_80FC55C()) - { - for (i = 0; i < 4; i++) - gTasks[taskId].data[i + 5] = gBlockRecvBuffer[i][0]; - - gTasks[taskId].data[0]++; - } - break; - case 10: - if (++gTasks[taskId].data[11] > 10) - { - sub_800A4D8(2); - gTasks[taskId].data[0] = 1; - } - break; - default: - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[11] = 0; - gTasks[taskId].data[12] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - } -} - -void sub_80FCF40(u8 taskId) -{ - if (!sub_80FC670(&gTasks[taskId].data[12])) - return; - - switch (gTasks[taskId].data[0]) - { - case 0: - if (IsLinkTaskFinished()) - { - if (sub_80FC4F4(gContestMonConditions, sizeof(gContestMonConditions)) == 1) - gTasks[taskId].data[0]++; - } - break; - case 1: - if (sub_80FC55C()) - { - memcpy(gContestMonConditions, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestMonConditions)); - gTasks[taskId].data[0]++; - } - break; - default: - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[12] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - } -} - -void sub_80FCFD0(u8 taskId) -{ - if (!sub_80FC670(&gTasks[taskId].data[12])) - return; - - switch (gTasks[taskId].data[0]) - { - case 0: - if (IsLinkTaskFinished()) - { - if (sub_80FC4F4(gContestantTurnOrder, sizeof(gContestantTurnOrder)) == 1) - gTasks[taskId].data[0]++; - } - break; - case 1: - if (sub_80FC55C()) - { - memcpy(gContestantTurnOrder, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestantTurnOrder)); - gTasks[taskId].data[0]++; - } - break; - default: - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[12] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - } -} diff --git a/src/contest_link_81D9DE4.c b/src/contest_link_81D9DE4.c deleted file mode 100644 index 8060b6cdc..000000000 --- a/src/contest_link_81D9DE4.c +++ /dev/null @@ -1,331 +0,0 @@ -#include "global.h" -#include "contest.h" -#include "event_data.h" -#include "link.h" -#include "random.h" -#include "task.h" - -static void sub_81D9F14(u8); -static void sub_81D9F30(u8); -static void sub_81D9F4C(u8); -static void sub_81D9F68(u8); -static void sub_81DA10C(u8); -static void sub_81DA138(u8); -static void sub_81DA160(u8); -static void sub_81DA244(u8); -static void sub_81DA2E8(u8); -static void sub_81DA3B8(u8); -static void sub_81DA488(u8); - -void sub_81D9DE4(u8 taskId) -{ - int gameCleared; - - switch (gTasks[taskId].data[9]) - { - case 0: - gHighestRibbonRank = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON); - break; - case 1: - gHighestRibbonRank = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON); - break; - case 2: - gHighestRibbonRank = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON); - break; - case 3: - gHighestRibbonRank = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON); - break; - case 4: - default: - gHighestRibbonRank = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON); - break; - } - - gContestMons[gContestPlayerMonIndex].unk2C[0] = gHighestRibbonRank; - gameCleared = FlagGet(FLAG_SYS_GAME_CLEAR) > 0; - gContestMons[gContestPlayerMonIndex].unk2C[1] = gameCleared; - SetTaskFuncWithFollowupFunc(taskId, sub_81DA160, sub_81D9F14); -} - -static void sub_81D9F14(u8 taskId) -{ - SetTaskFuncWithFollowupFunc(taskId, sub_81DA244, sub_81D9F30); -} - -static void sub_81D9F30(u8 taskId) -{ - SetTaskFuncWithFollowupFunc(taskId, sub_81DA2E8, sub_81D9F4C); -} - -static void sub_81D9F4C(u8 taskId) -{ - SetTaskFuncWithFollowupFunc(taskId, sub_81DA3B8, sub_81D9F68); -} - -static void sub_81D9F68(u8 taskId) -{ - u8 i; - u8 rank; - int gameCleared; - u8 data1[4]; - u8 data2[4]; - - memset(data1, 0, sizeof(data1)); - memset(data2, 0, sizeof(data2)); - - for (i = 0; i < gNumLinkContestPlayers; i++) - data1[i] = gTasks[taskId].data[i + 1]; - - i = 0; - if (i < gNumLinkContestPlayers) - { - while (++i < gNumLinkContestPlayers) - { - if (data1[0] != data1[i]) - break; - } - } - - if (i == gNumLinkContestPlayers) - gSpecialVar_0x8004 = 0; - else - gSpecialVar_0x8004 = 1; - - for (i = 0; i < gNumLinkContestPlayers; i++) - data2[i] = gTasks[taskId].data[i + 5]; - - if (gNumLinkContestPlayers != 4 && GetMultiplayerId() == 0) - { - rank = gContestMons[0].unk2C[0]; - for (i = 1; i < gNumLinkContestPlayers; i++) - { - if (rank < gContestMons[i].unk2C[0]) - rank = gContestMons[i].unk2C[0]; - } - - if (rank) - rank--; - - gameCleared = 1; - for (i = 0; i < gNumLinkContestPlayers; i++) - { - if (!gContestMons[i].unk2C[1]) - { - gameCleared = 0; - break; - } - } - - sub_80DACBC(data1[0], rank, gameCleared); - } - - gUnknown_02039F2B = sub_80F86E0(data2); - if (gNumLinkContestPlayers < 4) - SetTaskFuncWithFollowupFunc(taskId, sub_81DA488, sub_81DA10C); - else - gTasks[taskId].func = sub_81DA10C; -} - -static void sub_81DA10C(u8 taskId) -{ - sub_80DB09C(gSpecialVar_ContestCategory); - SetTaskFuncWithFollowupFunc(taskId, sub_80FCF40, sub_81DA138); -} - -static void sub_81DA138(u8 taskId) -{ - SortContestants(FALSE); - SetTaskFuncWithFollowupFunc(taskId, sub_80FCFD0, sub_80F8714); -} - -static void sub_81DA160(u8 taskId) -{ - int i; - - if (!sub_80FC670(&gTasks[taskId].data[12])) - return; - - switch (gTasks[taskId].data[0]) - { - default: - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[12] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - case 0: - if (IsLinkTaskFinished()) - { - if (sub_80FC4F4(&gContestMons[gContestPlayerMonIndex], sizeof(struct ContestPokemon)) == 1) - gTasks[taskId].data[0]++; - } - break; - case 1: - if (sub_80FC55C()) - { - for (i = 0; i < gNumLinkContestPlayers; i++) - { - memcpy(&gContestMons[i], gBlockRecvBuffer[i], sizeof(struct ContestPokemon)); - sub_80DFA08(&gContestMons[i], gLinkPlayers[i].language); - } - - gTasks[taskId].data[0]++; - } - break; - } -} - -static void sub_81DA244(u8 taskId) -{ - if (!sub_80FC670(&gTasks[taskId].data[12])) - return; - - switch (gTasks[taskId].data[0]) - { - default: - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[12] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - case 0: - if (GetMultiplayerId() == 0) - { - if (!IsLinkTaskFinished()) - return; - - if (sub_80FC4F4(&gRngValue, sizeof(gRngValue)) == 1) - gTasks[taskId].data[0]++; - } - else - { - gTasks[taskId].data[0]++; - } - break; - case 1: - if (sub_80FC530(0)) - { - memcpy(&gRngValue, gBlockRecvBuffer[0], sizeof(gRngValue)); - memcpy(&gContestRngValue, gBlockRecvBuffer[0], sizeof(gContestRngValue)); - gTasks[taskId].data[0]++; - } - break; - } -} - -static void sub_81DA2E8(u8 taskId) -{ - int i; - u16 data[4]; - u16 var0; - - if (!sub_80FC670(&gTasks[taskId].data[12])) - return; - - switch (gTasks[taskId].data[0]) - { - default: - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[12] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - case 0: - if (IsLinkTaskFinished()) - { - var0 = 0x6E; - if (sub_80FC4F4(&var0, sizeof(var0)) == 1) - gTasks[taskId].data[0]++; - } - break; - case 1: - if (sub_80FC55C()) - { - for (i = 0; i < gNumLinkContestPlayers; i++) - { - data[i] = gBlockRecvBuffer[i][0]; - gTasks[taskId].data[i + 5] = data[i]; - } - - gTasks[taskId].data[0]++; - } - break; - } -} - -static void sub_81DA3B8(u8 taskId) -{ - int i; - u16 data[4]; - u16 var0; - - if (!sub_80FC670(&gTasks[taskId].data[12])) - return; - - switch (gTasks[taskId].data[0]) - { - default: - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[12] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - case 0: - if (IsLinkTaskFinished()) - { - var0 = gTasks[taskId].data[9]; - if (sub_80FC4F4(&var0, sizeof(var0)) == 1) - gTasks[taskId].data[0]++; - } - break; - case 1: - if (sub_80FC55C()) - { - for (i = 0; i < gNumLinkContestPlayers; i++) - { - data[i] = gBlockRecvBuffer[i][0]; - gTasks[taskId].data[i + 1] = data[i]; - } - - gTasks[taskId].data[0]++; - } - break; - } -} - -static void sub_81DA488(u8 taskId) -{ - int i; - - if (!sub_80FC670(&gTasks[taskId].data[12])) - return; - - switch (gTasks[taskId].data[0]) - { - default: - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[12] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - case 0: - if (GetMultiplayerId() == 0) - { - if (!IsLinkTaskFinished()) - return; - - if (sub_80FC4F4(&gContestMons[gNumLinkContestPlayers], (4 - gNumLinkContestPlayers) * sizeof(struct ContestPokemon)) == 1) - gTasks[taskId].data[0]++; - } - else - { - gTasks[taskId].data[0]++; - } - break; - case 1: - if (sub_80FC530(0)) - { - memcpy(&gContestMons[gNumLinkContestPlayers], gBlockRecvBuffer[0], (4 - gNumLinkContestPlayers) * sizeof(struct ContestPokemon)); - for (i = gNumLinkContestPlayers; i < 4; i++) - sub_80DFA08(&gContestMons[i], gLinkPlayers[0].language); - - gTasks[taskId].data[0]++; - } - break; - } -} diff --git a/src/contest_link_util.c b/src/contest_link_util.c new file mode 100644 index 000000000..8060b6cdc --- /dev/null +++ b/src/contest_link_util.c @@ -0,0 +1,331 @@ +#include "global.h" +#include "contest.h" +#include "event_data.h" +#include "link.h" +#include "random.h" +#include "task.h" + +static void sub_81D9F14(u8); +static void sub_81D9F30(u8); +static void sub_81D9F4C(u8); +static void sub_81D9F68(u8); +static void sub_81DA10C(u8); +static void sub_81DA138(u8); +static void sub_81DA160(u8); +static void sub_81DA244(u8); +static void sub_81DA2E8(u8); +static void sub_81DA3B8(u8); +static void sub_81DA488(u8); + +void sub_81D9DE4(u8 taskId) +{ + int gameCleared; + + switch (gTasks[taskId].data[9]) + { + case 0: + gHighestRibbonRank = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON); + break; + case 1: + gHighestRibbonRank = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON); + break; + case 2: + gHighestRibbonRank = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON); + break; + case 3: + gHighestRibbonRank = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON); + break; + case 4: + default: + gHighestRibbonRank = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON); + break; + } + + gContestMons[gContestPlayerMonIndex].unk2C[0] = gHighestRibbonRank; + gameCleared = FlagGet(FLAG_SYS_GAME_CLEAR) > 0; + gContestMons[gContestPlayerMonIndex].unk2C[1] = gameCleared; + SetTaskFuncWithFollowupFunc(taskId, sub_81DA160, sub_81D9F14); +} + +static void sub_81D9F14(u8 taskId) +{ + SetTaskFuncWithFollowupFunc(taskId, sub_81DA244, sub_81D9F30); +} + +static void sub_81D9F30(u8 taskId) +{ + SetTaskFuncWithFollowupFunc(taskId, sub_81DA2E8, sub_81D9F4C); +} + +static void sub_81D9F4C(u8 taskId) +{ + SetTaskFuncWithFollowupFunc(taskId, sub_81DA3B8, sub_81D9F68); +} + +static void sub_81D9F68(u8 taskId) +{ + u8 i; + u8 rank; + int gameCleared; + u8 data1[4]; + u8 data2[4]; + + memset(data1, 0, sizeof(data1)); + memset(data2, 0, sizeof(data2)); + + for (i = 0; i < gNumLinkContestPlayers; i++) + data1[i] = gTasks[taskId].data[i + 1]; + + i = 0; + if (i < gNumLinkContestPlayers) + { + while (++i < gNumLinkContestPlayers) + { + if (data1[0] != data1[i]) + break; + } + } + + if (i == gNumLinkContestPlayers) + gSpecialVar_0x8004 = 0; + else + gSpecialVar_0x8004 = 1; + + for (i = 0; i < gNumLinkContestPlayers; i++) + data2[i] = gTasks[taskId].data[i + 5]; + + if (gNumLinkContestPlayers != 4 && GetMultiplayerId() == 0) + { + rank = gContestMons[0].unk2C[0]; + for (i = 1; i < gNumLinkContestPlayers; i++) + { + if (rank < gContestMons[i].unk2C[0]) + rank = gContestMons[i].unk2C[0]; + } + + if (rank) + rank--; + + gameCleared = 1; + for (i = 0; i < gNumLinkContestPlayers; i++) + { + if (!gContestMons[i].unk2C[1]) + { + gameCleared = 0; + break; + } + } + + sub_80DACBC(data1[0], rank, gameCleared); + } + + gUnknown_02039F2B = sub_80F86E0(data2); + if (gNumLinkContestPlayers < 4) + SetTaskFuncWithFollowupFunc(taskId, sub_81DA488, sub_81DA10C); + else + gTasks[taskId].func = sub_81DA10C; +} + +static void sub_81DA10C(u8 taskId) +{ + sub_80DB09C(gSpecialVar_ContestCategory); + SetTaskFuncWithFollowupFunc(taskId, sub_80FCF40, sub_81DA138); +} + +static void sub_81DA138(u8 taskId) +{ + SortContestants(FALSE); + SetTaskFuncWithFollowupFunc(taskId, sub_80FCFD0, sub_80F8714); +} + +static void sub_81DA160(u8 taskId) +{ + int i; + + if (!sub_80FC670(&gTasks[taskId].data[12])) + return; + + switch (gTasks[taskId].data[0]) + { + default: + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[12] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + case 0: + if (IsLinkTaskFinished()) + { + if (sub_80FC4F4(&gContestMons[gContestPlayerMonIndex], sizeof(struct ContestPokemon)) == 1) + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80FC55C()) + { + for (i = 0; i < gNumLinkContestPlayers; i++) + { + memcpy(&gContestMons[i], gBlockRecvBuffer[i], sizeof(struct ContestPokemon)); + sub_80DFA08(&gContestMons[i], gLinkPlayers[i].language); + } + + gTasks[taskId].data[0]++; + } + break; + } +} + +static void sub_81DA244(u8 taskId) +{ + if (!sub_80FC670(&gTasks[taskId].data[12])) + return; + + switch (gTasks[taskId].data[0]) + { + default: + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[12] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + case 0: + if (GetMultiplayerId() == 0) + { + if (!IsLinkTaskFinished()) + return; + + if (sub_80FC4F4(&gRngValue, sizeof(gRngValue)) == 1) + gTasks[taskId].data[0]++; + } + else + { + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80FC530(0)) + { + memcpy(&gRngValue, gBlockRecvBuffer[0], sizeof(gRngValue)); + memcpy(&gContestRngValue, gBlockRecvBuffer[0], sizeof(gContestRngValue)); + gTasks[taskId].data[0]++; + } + break; + } +} + +static void sub_81DA2E8(u8 taskId) +{ + int i; + u16 data[4]; + u16 var0; + + if (!sub_80FC670(&gTasks[taskId].data[12])) + return; + + switch (gTasks[taskId].data[0]) + { + default: + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[12] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + case 0: + if (IsLinkTaskFinished()) + { + var0 = 0x6E; + if (sub_80FC4F4(&var0, sizeof(var0)) == 1) + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80FC55C()) + { + for (i = 0; i < gNumLinkContestPlayers; i++) + { + data[i] = gBlockRecvBuffer[i][0]; + gTasks[taskId].data[i + 5] = data[i]; + } + + gTasks[taskId].data[0]++; + } + break; + } +} + +static void sub_81DA3B8(u8 taskId) +{ + int i; + u16 data[4]; + u16 var0; + + if (!sub_80FC670(&gTasks[taskId].data[12])) + return; + + switch (gTasks[taskId].data[0]) + { + default: + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[12] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + case 0: + if (IsLinkTaskFinished()) + { + var0 = gTasks[taskId].data[9]; + if (sub_80FC4F4(&var0, sizeof(var0)) == 1) + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80FC55C()) + { + for (i = 0; i < gNumLinkContestPlayers; i++) + { + data[i] = gBlockRecvBuffer[i][0]; + gTasks[taskId].data[i + 1] = data[i]; + } + + gTasks[taskId].data[0]++; + } + break; + } +} + +static void sub_81DA488(u8 taskId) +{ + int i; + + if (!sub_80FC670(&gTasks[taskId].data[12])) + return; + + switch (gTasks[taskId].data[0]) + { + default: + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[12] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + case 0: + if (GetMultiplayerId() == 0) + { + if (!IsLinkTaskFinished()) + return; + + if (sub_80FC4F4(&gContestMons[gNumLinkContestPlayers], (4 - gNumLinkContestPlayers) * sizeof(struct ContestPokemon)) == 1) + gTasks[taskId].data[0]++; + } + else + { + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80FC530(0)) + { + memcpy(&gContestMons[gNumLinkContestPlayers], gBlockRecvBuffer[0], (4 - gNumLinkContestPlayers) * sizeof(struct ContestPokemon)); + for (i = gNumLinkContestPlayers; i < 4; i++) + sub_80DFA08(&gContestMons[i], gLinkPlayers[0].language); + + gTasks[taskId].data[0]++; + } + break; + } +} diff --git a/src/contest_util.c b/src/contest_util.c new file mode 100644 index 000000000..22074e1a1 --- /dev/null +++ b/src/contest_util.c @@ -0,0 +1,2533 @@ +#include "global.h" +#include "malloc.h" +#include "battle.h" +#include "battle_gfx_sfx_util.h" +#include "bg.h" +#include "contest.h" +#include "contest_util.h" +#include "contest_link.h" +#include "data.h" +#include "decompress.h" +#include "dma3.h" +#include "event_data.h" +#include "field_specials.h" +#include "gpu_regs.h" +#include "graphics.h" +#include "international_string_util.h" +#include "link.h" +#include "link_rfu.h" +#include "load_save.h" +#include "main.h" +#include "overworld.h" +#include "palette.h" +#include "pokedex.h" +#include "pokemon.h" +#include "pokemon_icon.h" +#include "random.h" +#include "save.h" +#include "scanline_effect.h" +#include "script.h" +#include "sound.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "text.h" +#include "trig.h" +#include "tv.h" +#include "util.h" +#include "window.h" +#include "constants/field_specials.h" +#include "constants/game_stat.h" +#include "constants/rgb.h" +#include "constants/songs.h" +#include "constants/tv.h" +#include "constants/vars.h" +#include "contest.h" + +enum { + SLIDING_TEXT_OFFSCREEN, + SLIDING_TEXT_ENTERING, + SLIDING_TEXT_ARRIVED, + SLIDING_TEXT_EXITING, +}; + +enum { + SLIDING_MON_ENTERED = 1, + SLIDING_MON_EXITED, +}; + +#define GET_CONTEST_WINNER_ID(i) { for ((i) = 0; (i) < CONTESTANT_COUNT && gContestFinalStandings[(i)] != 0; (i)++); } + +#define TAG_CONFETTI 3017 + +#define MAX_BAR_LENGTH 87 + +struct ContestResultsInternal +{ + u8 slidingTextBoxSpriteId; + u8 linkTextBoxSpriteId; + u8 showResultsTaskId; + u8 highlightWinnerTaskId; + u8 slidingTextBoxState; + u8 numStandingsPrinted; + u8 winnerMonSlidingState; + u8 confettiCount; + u8 winnerMonSpriteId; + bool8 destroyConfetti; + bool8 pointsFlashing; + s16 unkC[CONTESTANT_COUNT]; + u8 numBarsUpdating; +}; + +struct ContestMonResults +{ + int relativePreliminaryPoints; + int relativeRound2Points; + u32 barLengthPreliminary; + u32 barLengthRound2; + bool8 lostPoints; + u8 numStars; + u8 numHearts; +}; + +struct ContestResults +{ + struct ContestResultsInternal *data; + struct ContestMonResults (*monResults)[CONTESTANT_COUNT]; + u8 *unusedBg; // Allocated/freed, never used + u8 *tilemapBuffers[4]; + u8 *unused; // Allocated/freed, never used +}; + +static EWRAM_DATA struct ContestResults *sContestResults = NULL; + +static void LoadAllContestMonIconPalettes(void); +static void LoadContestResultsTilemaps(void); +static u8 GetNumPreliminaryPoints(u8, bool8); +static s8 GetNumRound2Points(u8, bool8); +static void AddContestTextPrinter(int, u8 *, int); +static void AllocContestResults(void); +static void FreeContestResults(void); +static void LoadAllContestMonIcons(u8, u8); +static void LoadContestResultSprites(void); +static void TryCreateWirelessSprites(void); +static void Task_StartShowContestResults(u8 taskId); +static void CB2_StartShowContestResults(void); +static void Task_ShowContestResults(u8); +static void CB2_ShowContestResults(void); +static void VBlankCB_ShowContestResults(void); +static void Task_SlideContestResultsBg(u8); +static void Task_WaitForLinkPartnersBeforeResults(u8); +static void sub_80F5F14(u8); +static void sub_80F5F30(u8); +static void Task_AnnouncePreliminaryResults(u8); +static void Task_FlashStarsAndHearts(u8); +static void Task_ShowPreliminaryResults(u8); +static void Task_AnnounceRound2Results(u8); +static void Task_ShowRound2Results(u8); +static void Task_AnnounceWinner(u8); +static void Task_DrawFinalStandingNumber(u8); +static void Task_StartHighlightWinnersBox(u8); +static void Task_HighlightWinnersBox(u8); +static void Task_ShowWinnerMonBanner(u8); +static void Task_SetSeenWinnerMon(u8); +static void Task_TryDisconnectLinkPartners(u8); +static void Task_WaitForLinkPartnersDisconnect(u8); +static void Task_TrySetContestInterviewData(u8); +static void Task_EndShowContestResults(u8); +static void CalculateContestantsResultData(void); +static void ShowLinkResultsTextBox(const u8 *); +static void HideLinkResultsTextBox(void); +static s32 DrawResultsTextWindow(const u8 *, u8); +static void StartTextBoxSlideIn(s16, u16, u16, u16); +static void UpdateContestResultBars(bool8, u8); +static void Task_UpdateContestResultBar(u8); +static void StartTextBoxSlideOut(u16); +static void BounceMonIconInBox(u8, u8); +static void Task_BounceMonIconInBox(u8); +static void SpriteCB_WinnerMonSlideIn(struct Sprite *); +static void SpriteCB_WinnerMonSlideOut(struct Sprite *); +static void Task_CreateConfetti(u8); +static void SpriteCB_TextBoxSlideIn(struct Sprite *); +static void SpriteCB_TextBoxSlideOut(struct Sprite *); +static void SpriteCB_EndTextBoxSlideIn(struct Sprite *); +static void sub_80F8508(u8); +static void sub_80F8568(u8); +static void sub_80F8584(u8); +static void sub_80F85A0(u8); +static void sub_80F85BC(u8); +static void sub_80F86B8(u8); +static void sub_80F878C(u8); +static void sub_80F87B4(u8); +static void SpriteCB_Confetti(struct Sprite *sprite); + +static const u16 sUnknown_0858D6B0[] = INCBIN_U16("graphics/unknown/unknown_58D6B0.gbapal"); +static const u8 sUnknown_0858D6D0[] = INCBIN_U8("graphics/unknown/unknown_58D6D0.4bpp"); +static const u16 sMiscBlank_Pal[] = INCBIN_U16("graphics/interface/blank.gbapal"); + +static const struct OamData sOamData_858D7F0 = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(64x32), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(64x32), + .tileNum = 0, + .priority = 3, + .paletteNum = 2, + .affineParam = 0, +}; + +static const struct SpriteTemplate sSpriteTemplate_858D7F8 = +{ + .tileTag = 3009, + .paletteTag = 3009, + .oam = &sOamData_858D7F0, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteSheet sUnknown_0858D810[] = +{ + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3009 }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3010 }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3011 }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3012 }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3013 }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3014 }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3015 }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3016 }, +}; + +static const struct SpritePalette sUnknown_0858D850 = +{ + .data = sMiscBlank_Pal, + .tag = 3009, +}; + +static const struct OamData sOamData_Confetti = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(8x8), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(8x8), + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct SpriteTemplate sSpriteTemplate_Confetti = +{ + .tileTag = TAG_CONFETTI, + .paletteTag = TAG_CONFETTI, + .oam = &sOamData_Confetti, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_Confetti +}; + +static const struct CompressedSpriteSheet sSpriteSheet_Confetti = +{ + .data = gConfetti_Gfx, + .size = 0x220, + .tag = TAG_CONFETTI +}; + + +static const struct CompressedSpritePalette sSpritePalette_Confetti = +{ + .data = gConfetti_Pal, + .tag = TAG_CONFETTI +}; + +static const struct BgTemplate sBgTemplates[] = +{ + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 30, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0, + }, + { + .bg = 1, + .charBaseIndex = 0, + .mapBaseIndex = 24, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0, + }, + { + .bg = 2, + .charBaseIndex = 0, + .mapBaseIndex = 28, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0, + }, + { + .bg = 3, + .charBaseIndex = 0, + .mapBaseIndex = 26, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0, + } +}; + +static const struct WindowTemplate sWindowTemplates[] = +{ + { + .bg = 1, + .tilemapLeft = 7, + .tilemapTop = 4, + .width = 12, + .height = 2, + .paletteNum = 15, + .baseBlock = 770 + }, + { + .bg = 1, + .tilemapLeft = 7, + .tilemapTop = 7, + .width = 12, + .height = 2, + .paletteNum = 15, + .baseBlock = 794 + }, + { + .bg = 1, + .tilemapLeft = 7, + .tilemapTop = 10, + .width = 12, + .height = 2, + .paletteNum = 15, + .baseBlock = 818 + }, + { + .bg = 1, + .tilemapLeft = 7, + .tilemapTop = 13, + .width = 12, + .height = 2, + .paletteNum = 15, + .baseBlock = 842 + }, + DUMMY_WIN_TEMPLATE, +}; + +static const struct OamData sUnknown_0858D8C0 = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(16x16), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(16x16), + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + + +static const struct SpriteTemplate sSpriteTemplate_858D8C8 = +{ + .tileTag = 22222, + .paletteTag = 0, + .oam = &sUnknown_0858D8C0, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteSheet sUnknown_0858D8E0 = +{ + .data = gMiscBlank_Gfx, + .size = 0x200, + .tag = 22222 +}; + +static const u8 sContestLinkTextColors[4] = {TEXT_COLOR_WHITE, TEXT_DYNAMIC_COLOR_6, TEXT_DYNAMIC_COLOR_5}; + + +static void InitContestResultsDisplay(void) +{ + int i; + + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP); + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); + for (i = 0; i < (int)ARRAY_COUNT(sContestResults->tilemapBuffers); i++) + SetBgTilemapBuffer(i, sContestResults->tilemapBuffers[i]); + + InitWindows(sWindowTemplates); + DeactivateAllTextPrinters(); + SetGpuReg(REG_OFFSET_MOSAIC, 0); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR); + SetGpuReg(REG_OFFSET_WIN0H, 0); + SetGpuReg(REG_OFFSET_WIN0V, 0); + SetGpuReg(REG_OFFSET_WIN1H, 0); + SetGpuReg(REG_OFFSET_WIN1V, 0); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_BG0HOFS, 0); + SetGpuReg(REG_OFFSET_BG0VOFS, 0); + SetGpuReg(REG_OFFSET_BG1HOFS, 0); + SetGpuReg(REG_OFFSET_BG1VOFS, 0); + SetGpuReg(REG_OFFSET_BG2HOFS, 0); + SetGpuReg(REG_OFFSET_BG2VOFS, 0); + SetGpuReg(REG_OFFSET_BG3HOFS, 0); + SetGpuReg(REG_OFFSET_BG3VOFS, 0); + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON | DISPCNT_OBJWIN_ON); + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + gBattle_BG2_X = 0; + gBattle_BG2_Y = 0; + gBattle_BG3_X = 0; + gBattle_BG3_Y = 0; + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + gBattle_WIN1H = 0; + gBattle_WIN1V = 0; +} + +static void LoadContestResultsBgGfx(void) +{ + int i, j; + s8 numStars, round2Points; + u16 tile1, tile2; + + LZDecompressVram(gContestResults_Gfx, (void *)BG_CHAR_ADDR(0)); + CopyToBgTilemapBuffer(3, gUnknown_08C1A12C, 0, 0); + CopyToBgTilemapBuffer(2, gUnknown_08C1A000, 0, 0); + CopyToBgTilemapBuffer(0, gUnknown_08C19EEC, 0, 0); + LoadContestResultsTilemaps(); + LoadCompressedPalette(gContestResults_Pal, 0, 0x200); + LoadPalette(sUnknown_0858D6B0, 0xF0, 0x20); + + for (i = 0; i < CONTESTANT_COUNT; i++) + { + numStars = GetNumPreliminaryPoints(i, TRUE); + round2Points = GetNumRound2Points(i, TRUE); + for (j = 0; j < 10; j++) + { + tile1 = 0x60B2; + if (j < numStars) + tile1 += 2; + + // Abs of round2Points is number of hearts + if (j < abs(round2Points)) + { + tile2 = 0x60A4; + if (round2Points < 0) + tile2 += 2; + } + else + { + tile2 = 0x60A2; + } + + FillBgTilemapBufferRect_Palette0(1, tile1, j + 19, i * 3 + 5, 1, 1); + FillBgTilemapBufferRect_Palette0(1, tile2, j + 19, i * 3 + 6, 1, 1); + } + } + + CopyBgTilemapBufferToVram(0); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); + CopyBgTilemapBufferToVram(3); + ShowBg(0); + ShowBg(1); + ShowBg(2); + ShowBg(3); +} + +static void LoadContestMonName(u8 monIndex) +{ + struct ContestPokemon *mon = &gContestMons[monIndex]; + u8 *str = gDisplayedStringBattle; + if (monIndex == gContestPlayerMonIndex) + str = StringCopy(gDisplayedStringBattle, gText_ColorDarkGrey); + + StringCopy(str, mon->nickname); + AddContestTextPrinter(monIndex, gDisplayedStringBattle, 0); + StringCopy(str, gText_Slash); + StringAppend(str, mon->trainerName); + AddContestTextPrinter(monIndex, gDisplayedStringBattle, 50); +} + +static void LoadAllContestMonNames(void) +{ + int i; + + for (i = 0; i < CONTESTANT_COUNT; i++) + LoadContestMonName(i); + + CopyBgTilemapBufferToVram(1); +} + +static void CB2_StartShowContestResults(void) +{ + gPaletteFade.bufferTransferDisabled = TRUE; + SetVBlankCallback(NULL); + AllocContestResults(); + InitContestResultsDisplay(); + ScanlineEffect_Clear(); + ResetPaletteFade(); + ResetSpriteData(); + ResetTasks(); + FreeAllSpritePalettes(); + LoadContestResultsBgGfx(); + LoadAllContestMonIconPalettes(); + LoadAllContestMonIcons(0, TRUE); + LoadAllContestMonNames(); + memset(sContestResults->data, 0, sizeof(*sContestResults->data)); + memset(sContestResults->monResults, 0, sizeof(*sContestResults->monResults)); + LoadContestResultSprites(); + TryCreateWirelessSprites(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + gPaletteFade.bufferTransferDisabled = FALSE; + sContestResults->data->showResultsTaskId = CreateTask(Task_ShowContestResults, 5); + SetMainCallback2(CB2_ShowContestResults); + gBattle_WIN1H = 0x00F0; + gBattle_WIN1V = 0x80A0; + CreateTask(Task_SlideContestResultsBg, 20); + CalculateContestantsResultData(); + if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS) + gPaletteFade.bufferTransferDisabled = TRUE; + else + PlayBGM(MUS_CON_K); + + SetVBlankCallback(VBlankCB_ShowContestResults); +} + +static void CB2_ShowContestResults(void) +{ + AnimateSprites(); + BuildOamBuffer(); + RunTasks(); + UpdatePaletteFade(); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); +} + +static void VBlankCB_ShowContestResults(void) +{ + SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_X); + SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_Y); + SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); + SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); + SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X); + SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y); + SetGpuReg(REG_OFFSET_BG3HOFS, gBattle_BG3_X); + SetGpuReg(REG_OFFSET_BG3VOFS, gBattle_BG3_Y); + SetGpuReg(REG_OFFSET_WIN0H, gBattle_WIN0H); + SetGpuReg(REG_OFFSET_WIN0V, gBattle_WIN0V); + SetGpuReg(REG_OFFSET_WIN1H, gBattle_WIN1H); + SetGpuReg(REG_OFFSET_WIN1V, gBattle_WIN1V); + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + ScanlineEffect_InitHBlankDmaTransfer(); +} + +#define tState data[0] +#define tTimer data[1] +#define tCounter data[2] + +static void Task_ShowContestResults(u8 taskId) +{ + u16 var; + + if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) + { + switch (gTasks[taskId].tState) + { + case 0: + SaveLinkContestResults(); + if (gContestFinalStandings[gContestPlayerMonIndex] == 0) + { + IncrementGameStat(GAME_STAT_WON_LINK_CONTEST); + gSpecialVar_0x8005 = TVSHOW_CONTEST_LIVE_UPDATES; + InterviewBefore(); + if (gSpecialVar_Result != TRUE) + InterviewAfter(); + } + + TryGainNewFanFromCounter(FANCOUNTER_FINISHED_CONTEST); + sub_80DEDA8(gSpecialVar_ContestRank); + sub_80DEDA8(0xFE); + gUnknown_02039F5C = TRUE; + gUnknown_02039F5D = sub_80DEFA8(0xFE, 0); + var = VarGet(VAR_CONTEST_HALL_STATE); + VarSet(VAR_CONTEST_HALL_STATE, 0); + SetContinueGameWarpStatusToDynamicWarp(); + TrySavingData(SAVE_LINK); + ClearContinueGameWarpStatus2(); + VarSet(VAR_CONTEST_HALL_STATE, var); + gTasks[taskId].tState++; + break; + case 1: + gTasks[taskId].tState++; + if (!(gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS)) + gTasks[taskId].tState = 100; + break; + case 2: + if (IsLinkTaskFinished()) + { + sub_800ADF8(); + gTasks[taskId].tState++; + } + return; + case 3: + if (IsLinkTaskFinished() == TRUE) + { + PlayBGM(MUS_CON_K); + gPaletteFade.bufferTransferDisabled = FALSE; + gTasks[taskId].tState++; + break; + } + return; + } + } + + if (!gPaletteFade.active) + { + gTasks[taskId].tState = 0; + if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) + { + ShowLinkResultsTextBox(gText_CommunicationStandby); + gTasks[taskId].func = Task_WaitForLinkPartnersBeforeResults; + } + else + { + IncrementGameStat(GAME_STAT_ENTERED_CONTEST); + if (gContestFinalStandings[gContestPlayerMonIndex] == 0) + IncrementGameStat(GAME_STAT_WON_CONTEST); + + sub_80DEDA8(gSpecialVar_ContestRank); + sub_80DEDA8(0xFE); + gUnknown_02039F5C = TRUE; + gUnknown_02039F5D = sub_80DEFA8(0xFE, 0); + TryGainNewFanFromCounter(FANCOUNTER_FINISHED_CONTEST); + gTasks[taskId].func = Task_AnnouncePreliminaryResults; + } + } +} + +static void Task_WaitForLinkPartnersBeforeResults(u8 taskId) +{ + if (gReceivedRemoteLinkPlayers) + { + CreateTask(sub_80F5F14, 0); + gTasks[taskId].func = TaskDummy; + } +} + +static void sub_80F5F14(u8 taskId) +{ + SetTaskFuncWithFollowupFunc(taskId, sub_80FC998, sub_80F5F30); +} + +static void sub_80F5F30(u8 taskId) +{ + if (IsLinkTaskFinished()) + { + DestroyTask(taskId); + gTasks[sContestResults->data->showResultsTaskId].func = Task_AnnouncePreliminaryResults; + HideLinkResultsTextBox(); + } +} + +static void Task_AnnouncePreliminaryResults(u8 taskId) +{ + s16 x; + + if (gTasks[taskId].tState == 0) + { + CreateTask(Task_FlashStarsAndHearts, 20); + x = DrawResultsTextWindow(gText_AnnouncingResults, sContestResults->data->slidingTextBoxSpriteId); + StartTextBoxSlideIn(x, 144, 120, 1088); + gTasks[taskId].tState++; + } + else if (gTasks[taskId].tState == 1) + { + // Wait for "Announcing Results" text to leave + if (sContestResults->data->slidingTextBoxState == SLIDING_TEXT_OFFSCREEN) + { + gTasks[taskId].tTimer = 0; + gTasks[taskId].tState++; + } + } + else if (gTasks[taskId].tState == 2) + { + if (++gTasks[taskId].tTimer == 21) + { + gTasks[taskId].tTimer = 0; + gTasks[taskId].tState++; + } + } + else if (gTasks[taskId].tState == 3) + { + x = DrawResultsTextWindow(gText_PreliminaryResults, sContestResults->data->slidingTextBoxSpriteId); + StartTextBoxSlideIn(x, 144, -1, 1088); + gTasks[taskId].tState++; + } + else if (gTasks[taskId].tState == 4) + { + if (sContestResults->data->slidingTextBoxState == SLIDING_TEXT_ARRIVED) + { + gTasks[taskId].tState = 0; + gTasks[taskId].func = Task_ShowPreliminaryResults; + } + } +} + +static void Task_ShowPreliminaryResults(u8 taskId) +{ + switch (gTasks[taskId].tState) + { + case 0: + if (!sContestResults->data->pointsFlashing) + { + UpdateContestResultBars(FALSE, gTasks[taskId].tCounter++); + if (sContestResults->data->numBarsUpdating == 0) + gTasks[taskId].tState = 2; + else + gTasks[taskId].tState++; + } + break; + case 1: + if (sContestResults->data->numBarsUpdating == 0) + gTasks[taskId].tState = 0; + break; + case 2: + StartTextBoxSlideOut(1088); + gTasks[taskId].tState = 0; + gTasks[taskId].tCounter = 0; + gTasks[taskId].func = Task_AnnounceRound2Results; + break; + } +} + +static void Task_AnnounceRound2Results(u8 taskId) +{ + s16 x; + + if (sContestResults->data->slidingTextBoxState == SLIDING_TEXT_OFFSCREEN) + { + if (++gTasks[taskId].tTimer == 21) + { + gTasks[taskId].tTimer = 0; + x = DrawResultsTextWindow(gText_Round2Results, sContestResults->data->slidingTextBoxSpriteId); + StartTextBoxSlideIn(x, 144, -1, 1088); + } + } + else if (sContestResults->data->slidingTextBoxState == SLIDING_TEXT_ARRIVED) + { + gTasks[taskId].func = Task_ShowRound2Results; + } +} + +static void Task_ShowRound2Results(u8 taskId) +{ + switch (gTasks[taskId].tState) + { + case 0: + if (!sContestResults->data->pointsFlashing) + { + UpdateContestResultBars(TRUE, gTasks[taskId].tCounter++); + if (sContestResults->data->numBarsUpdating == 0) + gTasks[taskId].tState = 2; + else + gTasks[taskId].tState++; + } + break; + case 1: + if (sContestResults->data->numBarsUpdating == 0) + gTasks[taskId].tState = 0; + break; + case 2: + StartTextBoxSlideOut(1088); + gTasks[taskId].tState = 0; + gTasks[taskId].func = Task_AnnounceWinner; + break; + } +} + +// Task data for Task_DrawFinalStandingNumber +#define tFinalStanding data[0] +#define tMonIndex data[1] + +static void Task_AnnounceWinner(u8 taskId) +{ + int i; + switch (gTasks[taskId].tState) + { + case 0: + if (sContestResults->data->slidingTextBoxState == SLIDING_TEXT_OFFSCREEN) + gTasks[taskId].tState++; + break; + case 1: + if (++gTasks[taskId].tTimer == 31) + { + gTasks[taskId].tTimer = 0; + gTasks[taskId].tState++; + } + break; + case 2: + for (i = 0; i < CONTESTANT_COUNT; i++) + { + u8 newTaskId = CreateTask(Task_DrawFinalStandingNumber, 10); + gTasks[newTaskId].tFinalStanding = gContestFinalStandings[i]; + gTasks[newTaskId].tMonIndex = i; + } + gTasks[taskId].tState++; + break; + case 3: + if (sContestResults->data->numStandingsPrinted == CONTESTANT_COUNT) + { + if (++gTasks[taskId].tTimer == 31) + { + gTasks[taskId].tTimer = 0; + CreateTask(Task_StartHighlightWinnersBox, 10); + gTasks[taskId].tState++; + GET_CONTEST_WINNER_ID(i); + BounceMonIconInBox(i, 14); + } + } + break; + case 4: + if (++gTasks[taskId].tTimer == 21) + { + u8 winnerTextBuffer[100]; + s16 x; + gTasks[taskId].tTimer = 0; + GET_CONTEST_WINNER_ID(i); + StringCopy(gStringVar1, gContestMons[i].trainerName); + sub_81DB5AC(gStringVar1); + StringCopy(gStringVar2, gContestMons[i].nickname); + StringExpandPlaceholders(winnerTextBuffer, gText_ContestantsMonWon); + x = DrawResultsTextWindow(winnerTextBuffer, sContestResults->data->slidingTextBoxSpriteId); + StartTextBoxSlideIn(x, 144, -1, 1088); + gTasks[taskId].tState++; + } + break; + case 5: + gTasks[taskId].tState = 0; + gTasks[taskId].func = Task_ShowWinnerMonBanner; + break; + } +} + +static void Task_ShowWinnerMonBanner(u8 taskId) +{ + int i; + u8 spriteId; + u16 species; + u32 otId; + u32 personality; + const struct CompressedSpritePalette *pokePal; + + switch (gTasks[taskId].tState) + { + case 0: + gBattle_WIN0H = 0x00F0; + gBattle_WIN0V = 0x5050; + + GET_CONTEST_WINNER_ID(i); + species = gContestMons[i].species; + personality = gContestMons[i].personality; + otId = gContestMons[i].otId; + if (i == gContestPlayerMonIndex) + { + HandleLoadSpecialPokePic_2( + &gMonFrontPicTable[species], + gMonSpritesGfxPtr->sprites[1], + species, + personality); + } + else + { + HandleLoadSpecialPokePic_DontHandleDeoxys( + &gMonFrontPicTable[species], + gMonSpritesGfxPtr->sprites[1], + species, + personality); + } + + pokePal = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); + LoadCompressedSpritePalette(pokePal); + SetMultiuseSpriteTemplateToPokemon(species, B_POSITION_OPPONENT_LEFT); + gMultiuseSpriteTemplate.paletteTag = pokePal->tag; + spriteId = CreateSprite(&gMultiuseSpriteTemplate, 272, 80, 10); + gSprites[spriteId].data[1] = species; + gSprites[spriteId].oam.priority = 0; + gSprites[spriteId].callback = SpriteCB_WinnerMonSlideIn; + sContestResults->data->winnerMonSpriteId = spriteId; + LoadCompressedSpriteSheet(&sSpriteSheet_Confetti); + LoadCompressedSpritePalette(&sSpritePalette_Confetti); + CreateTask(Task_CreateConfetti, 10); + gTasks[taskId].tState++; + break; + case 1: + if (++gTasks[taskId].data[3] == 1) + { + u8 counter; + gTasks[taskId].data[3] = 0; + gTasks[taskId].tCounter += 2; + if (gTasks[taskId].tCounter > 32) + gTasks[taskId].tCounter = 32; + + counter = gTasks[taskId].tCounter; + gBattle_WIN0V = ((80 - counter) << 8) | (80 + counter); + if (counter == 32) + gTasks[taskId].tState++; + } + break; + case 2: + if (sContestResults->data->winnerMonSlidingState == SLIDING_MON_ENTERED) + gTasks[taskId].tState++; + break; + case 3: + if (++gTasks[taskId].tTimer == 121) + { + gTasks[taskId].tTimer = 0; + gSprites[sContestResults->data->winnerMonSpriteId].callback = SpriteCB_WinnerMonSlideOut; + gTasks[taskId].tState++; + } + break; + case 4: + if (sContestResults->data->winnerMonSlidingState == SLIDING_MON_EXITED) + { + u8 top = (gBattle_WIN0V >> 8); + top += 2; + if (top > 80) + top = 80; + + gBattle_WIN0V = (top << 8) | (160 - top); + if (top == 80) + gTasks[taskId].tState++; + } + break; + case 5: + if (sContestResults->data->winnerMonSlidingState == SLIDING_MON_EXITED) + { + sContestResults->data->destroyConfetti = TRUE; + gTasks[taskId].tState = 0; + gTasks[taskId].func = Task_SetSeenWinnerMon; + } + break; + } +} + +static void Task_SetSeenWinnerMon(u8 taskId) +{ + int i, nationalDexNum; + + if (JOY_NEW(A_BUTTON)) + { + if (!(gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK)) + { + for (i = 0; i < CONTESTANT_COUNT; i++) + { + nationalDexNum = SpeciesToNationalPokedexNum(gContestMons[i].species); + GetSetPokedexFlag(nationalDexNum, FLAG_SET_SEEN); + } + } + + gTasks[taskId].data[10] = 0; + gTasks[taskId].func = Task_TryDisconnectLinkPartners; + } +} + +static void Task_TryDisconnectLinkPartners(u8 taskId) +{ + if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) + { + if (!gTasks[taskId].data[10]) + { + ShowLinkResultsTextBox(gText_CommunicationStandby); + sub_800AC34(); + gTasks[taskId].func = Task_WaitForLinkPartnersDisconnect; + } + } + else + { + gTasks[taskId].func = Task_TrySetContestInterviewData; + } +} + +static void Task_WaitForLinkPartnersDisconnect(u8 taskId) +{ + if (!gReceivedRemoteLinkPlayers) + { + if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS) + DestroyWirelessStatusIndicatorSprite(); + + HideLinkResultsTextBox(); + gTasks[taskId].func = Task_TrySetContestInterviewData; + } +} + +static void Task_TrySetContestInterviewData(u8 taskId) +{ + if (!(gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK)) + BravoTrainerPokemonProfile_BeforeInterview2(gContestFinalStandings[gContestPlayerMonIndex]); + + BeginHardwarePaletteFade(0xFF, 0, 0, 16, 0); + gTasks[taskId].func = Task_EndShowContestResults; +} + +static void Task_EndShowContestResults(u8 taskId) +{ + if (!gPaletteFade.active) + { + if (gTasks[taskId].tTimer == 0) + { + DestroyTask(sContestResults->data->highlightWinnerTaskId); + BlendPalettes(0x0000FFFF, 16, RGB_BLACK); + gTasks[taskId].tTimer++; + } + else if (gTasks[taskId].tTimer == 1) + { + BlendPalettes(0xFFFF0000, 16, RGB_BLACK); + gTasks[taskId].tTimer++; + } + else + { + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + DestroyTask(taskId); + FreeAllWindowBuffers(); + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); + FreeContestResults(); + } + } +} + +#undef tState +#undef tTimer +#undef tCounter + +static void Task_SlideContestResultsBg(u8 taskId) +{ + gBattle_BG3_X += 2; + gBattle_BG3_Y += 1; + if (gBattle_BG3_X > 255) + gBattle_BG3_X -= 255; + if (gBattle_BG3_Y > 255) + gBattle_BG3_Y -= 255; +} + +#define tDelay data[0] +#define tCoeff data[1] +#define tDecreasing data[2] + +static void Task_FlashStarsAndHearts(u8 taskId) +{ + if (++gTasks[taskId].tDelay == 2) + { + gTasks[taskId].tDelay = 0; + if (!gTasks[taskId].tDecreasing) + gTasks[taskId].tCoeff++; + else + gTasks[taskId].tCoeff--; + + if (gTasks[taskId].tCoeff == 16) + gTasks[taskId].tDecreasing = TRUE; + else if (gTasks[taskId].tCoeff == 0) + gTasks[taskId].tDecreasing = FALSE; + + BlendPalette(0x6B, 1, gTasks[taskId].tCoeff, RGB(30, 22, 11)); + BlendPalette(0x68, 1, gTasks[taskId].tCoeff, RGB_WHITE); + BlendPalette(0x6E, 1, gTasks[taskId].tCoeff, RGB(30, 29, 29)); + } + + if (gTasks[taskId].tCoeff == 0) + sContestResults->data->pointsFlashing = FALSE; + else + sContestResults->data->pointsFlashing = TRUE; +} + +static void LoadContestMonIcon(u16 species, u8 monIndex, u8 srcOffset, u8 useDmaNow, u32 personality) +{ + const u8 *iconPtr; + u16 var0, var1, frameNum; + + if (monIndex == gContestPlayerMonIndex) + frameNum = 1; + else + frameNum = 0; + + iconPtr = GetMonIconPtr(species, personality, frameNum); + iconPtr += srcOffset * 0x200 + 0x80; + if (useDmaNow) + { + RequestDma3Copy(iconPtr, (void *)BG_CHAR_ADDR(1) + monIndex * 0x200, 0x180, 1); + var0 = ((monIndex + 10) << 12); + var1 = (monIndex * 0x10 + 0x200); + WriteSequenceToBgTilemapBuffer(1, var1 | var0, 3, monIndex * 3 + 4, 4, 3, 17, 1); + } + else + { + RequestDma3Copy(iconPtr, (void *)BG_CHAR_ADDR(1) + monIndex * 0x200, 0x180, 1); + } +} + +static void LoadAllContestMonIcons(u8 srcOffset, bool8 useDmaNow) +{ + int i; + + for (i = 0; i < CONTESTANT_COUNT; i++) + LoadContestMonIcon(gContestMons[i].species, i, srcOffset, useDmaNow, gContestMons[i].personality); +} + +static void LoadAllContestMonIconPalettes(void) +{ + int i, species; + + for (i = 0; i < CONTESTANT_COUNT; i++) + { + species = gContestMons[i].species; + LoadPalette(gMonIconPalettes[gMonIconPaletteIndices[GetIconSpecies(species, 0)]], i * 0x10 + 0xA0, 0x20); + } +} + +static void TryCreateWirelessSprites(void) +{ + u16 sheet; + u8 spriteId; + + if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS) + { + LoadWirelessStatusIndicatorSpriteGfx(); + CreateWirelessStatusIndicatorSprite(8, 8); + gSprites[gWirelessStatusIndicatorSpriteId].subpriority = 1; + sheet = LoadSpriteSheet(&sUnknown_0858D8E0); + RequestDma3Fill(0xFFFFFFFF, (void *)BG_CHAR_ADDR(4) + sheet * 0x20, 0x80, 1); + spriteId = CreateSprite(&sSpriteTemplate_858D8C8, 8, 8, 0); + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_WINDOW; + } +} + +// Functionally equivalent, the same except compiler generated variables from +// src are placed on different stack positions. + +#ifdef NONMATCHING +static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId) +{ + u8 *windowTilesPtr; + u16 windowId; + int origWidth; + struct WindowTemplate windowTemplate; + int strWidth; + u8 *spriteTilePtrs[4]; + u8 *dst; + int i; + struct Sprite *sprite; + const u8 *src; // The culprit. + + memset(&windowTemplate, 0, sizeof(windowTemplate)); + windowTemplate.width = 30; + windowTemplate.height = 2; + windowId = AddWindow(&windowTemplate); + FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); + + origWidth = GetStringWidth(1, text, 0); + strWidth = (origWidth + 9) / 8; + if (strWidth > 30) + strWidth = 30; + + AddTextPrinterParameterized3(windowId, 1, (strWidth * 8 - origWidth) / 2, 1, sContestLinkTextColors, -1, text); + windowTilesPtr = (u8 *)(GetWindowAttribute(windowId, WINDOW_TILE_DATA)); + src = (u8 *)(sUnknown_0858D6D0); + + sprite = &gSprites[spriteId]; + spriteTilePtrs[0] = (u8 *)(sprite->oam.tileNum * 32 + VRAM + 0x10000); + + for (i = 1; i < 4; i++) + spriteTilePtrs[i] = (void*)(gSprites[sprite->data[i - 1]].oam.tileNum * 32 + VRAM + 0x10000); + + for (i = 0; i < 4; i++) + CpuFill32(0, spriteTilePtrs[i], 0x400); + + dst = spriteTilePtrs[0]; + CpuCopy32(src, dst, 0x20); + CpuCopy32(src + 128, dst + 0x100, 0x20); + CpuCopy32(src + 128, dst + 0x200, 0x20); + CpuCopy32(src + 64, dst + 0x300, 0x20); + + for (i = 0; i < strWidth; i++) + { + dst = &spriteTilePtrs[(i + 1) / 8][((i + 1) % 8) * 32]; + CpuCopy32(src + 192, dst, 0x20); + CpuCopy32(windowTilesPtr, dst + 0x100, 0x20); + CpuCopy32(windowTilesPtr + 960, dst + 0x200, 0x20); + CpuCopy32(src + 224, dst + 0x300, 0x20); + windowTilesPtr += 0x20; + } + + dst = &spriteTilePtrs[(i + 1) / 8][((i + 1) % 8) * 32]; + CpuCopy32(src + 32, dst, 0x20); + CpuCopy32(src + 160, dst + 0x100, 0x20); + CpuCopy32(src + 160, dst + 0x200, 0x20); + CpuCopy32(src + 96, dst + 0x300, 0x20); + RemoveWindow(windowId); + + return (240 - (strWidth + 2) * 8) / 2; +} + +#else +NAKED +static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId) +{ + asm_unified("\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x44\n\ + adds r5, r0, 0\n\ + lsls r1, 24\n\ + lsrs r7, r1, 24\n\ + add r4, sp, 0x20\n\ + adds r0, r4, 0\n\ + movs r1, 0\n\ + movs r2, 0x8\n\ + bl memset\n\ + movs r0, 0x1E\n\ + strb r0, [r4, 0x3]\n\ + movs r0, 0x2\n\ + strb r0, [r4, 0x4]\n\ + adds r0, r4, 0\n\ + bl AddWindow\n\ + lsls r6, r0, 24\n\ + lsrs r4, r6, 24\n\ + adds r0, r4, 0\n\ + movs r1, 0x11\n\ + bl FillWindowPixelBuffer\n\ + movs r0, 0x1\n\ + adds r1, r5, 0\n\ + movs r2, 0\n\ + bl GetStringWidth\n\ + adds r2, r0, 0\n\ + adds r2, 0x9\n\ + cmp r2, 0\n\ + bge _080F6BC4\n\ + adds r2, 0x7\n\ +_080F6BC4:\n\ + asrs r2, 3\n\ + mov r10, r2\n\ + cmp r2, 0x1E\n\ + ble _080F6BD0\n\ + movs r1, 0x1E\n\ + mov r10, r1\n\ +_080F6BD0:\n\ + mov r1, r10\n\ + lsls r2, r1, 3\n\ + subs r2, r0\n\ + lsrs r0, r2, 31\n\ + adds r2, r0\n\ + asrs r2, 1\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + ldr r0, =sContestLinkTextColors\n\ + str r0, [sp]\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + str r0, [sp, 0x4]\n\ + str r5, [sp, 0x8]\n\ + adds r0, r4, 0\n\ + movs r1, 0x1\n\ + movs r3, 0x1\n\ + bl AddTextPrinterParameterized3\n\ + adds r0, r4, 0\n\ + movs r1, 0x7\n\ + bl GetWindowAttribute\n\ + mov r9, r0\n\ + ldr r2, =sUnknown_0858D6D0\n\ + mov r8, r2\n\ + lsls r1, r7, 4\n\ + adds r1, r7\n\ + lsls r1, 2\n\ + ldr r3, =gSprites\n\ + adds r1, r3\n\ + ldrh r0, [r1, 0x4]\n\ + lsls r0, 22\n\ + lsrs r0, 17\n\ + ldr r2, =0x06010000\n\ + adds r0, r2\n\ + str r0, [sp, 0xC]\n\ + str r6, [sp, 0x38]\n\ + mov r7, sp\n\ + adds r7, 0x1C\n\ + str r7, [sp, 0x2C]\n\ + mov r0, r10\n\ + adds r0, 0x2\n\ + str r0, [sp, 0x30]\n\ + movs r5, 0\n\ + add r7, sp, 0x10\n\ + mov r12, r7\n\ + adds r6, r1, 0\n\ + adds r6, 0x2E\n\ + movs r4, 0x2\n\ +_080F6C34:\n\ + adds r0, r6, r5\n\ + movs r7, 0\n\ + ldrsh r1, [r0, r7]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r3\n\ + ldrh r0, [r0, 0x4]\n\ + lsls r0, 22\n\ + lsrs r0, 17\n\ + adds r0, r2\n\ + mov r1, r12\n\ + adds r1, 0x4\n\ + mov r12, r1\n\ + subs r1, 0x4\n\ + stm r1!, {r0}\n\ + adds r5, 0x2\n\ + subs r4, 0x1\n\ + cmp r4, 0\n\ + bge _080F6C34\n\ + mov r7, r8\n\ + adds r7, 0x80\n\ + mov r2, r8\n\ + adds r2, 0x40\n\ + str r2, [sp, 0x28]\n\ + mov r0, r8\n\ + adds r0, 0x20\n\ + str r0, [sp, 0x3C]\n\ + mov r1, r8\n\ + adds r1, 0xA0\n\ + str r1, [sp, 0x40]\n\ + adds r2, 0x20\n\ + str r2, [sp, 0x34]\n\ + add r5, sp, 0xC\n\ + movs r6, 0\n\ + movs r4, 0x3\n\ +_080F6C7C:\n\ + str r6, [sp, 0x1C]\n\ + ldm r5!, {r1}\n\ + ldr r0, [sp, 0x2C]\n\ + ldr r2, =0x05000100\n\ + bl CpuSet\n\ + subs r4, 0x1\n\ + cmp r4, 0\n\ + bge _080F6C7C\n\ + ldr r5, [sp, 0xC]\n\ + ldr r6, =0x04000008\n\ + mov r0, r8\n\ + adds r1, r5, 0\n\ + adds r2, r6, 0\n\ + bl CpuSet\n\ + movs r0, 0x80\n\ + lsls r0, 1\n\ + adds r1, r5, r0\n\ + adds r0, r7, 0\n\ + adds r2, r6, 0\n\ + bl CpuSet\n\ + movs r2, 0x80\n\ + lsls r2, 2\n\ + adds r1, r5, r2\n\ + adds r0, r7, 0\n\ + adds r2, r6, 0\n\ + bl CpuSet\n\ + movs r7, 0xC0\n\ + lsls r7, 2\n\ + adds r1, r5, r7\n\ + ldr r0, [sp, 0x28]\n\ + adds r2, r6, 0\n\ + bl CpuSet\n\ + movs r4, 0\n\ + cmp r4, r10\n\ + bge _080F6D32\n\ + adds r7, r6, 0\n\ +_080F6CCE:\n\ + adds r6, r4, 0x1\n\ + adds r0, r6, 0\n\ + cmp r6, 0\n\ + bge _080F6CDA\n\ + adds r0, r4, 0\n\ + adds r0, 0x8\n\ +_080F6CDA:\n\ + asrs r0, 3\n\ + lsls r1, r0, 2\n\ + add r1, sp\n\ + adds r1, 0xC\n\ + lsls r0, 3\n\ + subs r0, r6, r0\n\ + lsls r0, 5\n\ + ldr r1, [r1]\n\ + adds r5, r1, r0\n\ + mov r0, r8\n\ + adds r0, 0xC0\n\ + adds r1, r5, 0\n\ + adds r2, r7, 0\n\ + bl CpuSet\n\ + movs r0, 0x80\n\ + lsls r0, 1\n\ + adds r1, r5, r0\n\ + mov r0, r9\n\ + adds r2, r7, 0\n\ + bl CpuSet\n\ + movs r0, 0xF0\n\ + lsls r0, 2\n\ + add r0, r9\n\ + movs r2, 0x80\n\ + lsls r2, 2\n\ + adds r1, r5, r2\n\ + adds r2, r7, 0\n\ + bl CpuSet\n\ + movs r0, 0xC0\n\ + lsls r0, 2\n\ + adds r1, r5, r0\n\ + mov r0, r8\n\ + adds r0, 0xE0\n\ + adds r2, r7, 0\n\ + bl CpuSet\n\ + movs r1, 0x20\n\ + add r9, r1\n\ + adds r4, r6, 0\n\ + cmp r4, r10\n\ + blt _080F6CCE\n\ +_080F6D32:\n\ + adds r2, r4, 0x1\n\ + adds r0, r2, 0\n\ + cmp r2, 0\n\ + bge _080F6D3E\n\ + adds r0, r4, 0\n\ + adds r0, 0x8\n\ +_080F6D3E:\n\ + asrs r0, 3\n\ + lsls r1, r0, 2\n\ + add r1, sp\n\ + adds r1, 0xC\n\ + lsls r0, 3\n\ + subs r0, r2, r0\n\ + lsls r0, 5\n\ + ldr r1, [r1]\n\ + adds r5, r1, r0\n\ + ldr r4, =0x04000008\n\ + ldr r0, [sp, 0x3C]\n\ + adds r1, r5, 0\n\ + adds r2, r4, 0\n\ + bl CpuSet\n\ + movs r2, 0x80\n\ + lsls r2, 1\n\ + adds r1, r5, r2\n\ + ldr r0, [sp, 0x40]\n\ + adds r2, r4, 0\n\ + bl CpuSet\n\ + movs r7, 0x80\n\ + lsls r7, 2\n\ + adds r1, r5, r7\n\ + ldr r0, [sp, 0x40]\n\ + adds r2, r4, 0\n\ + bl CpuSet\n\ + movs r0, 0xC0\n\ + lsls r0, 2\n\ + adds r1, r5, r0\n\ + ldr r0, [sp, 0x34]\n\ + adds r2, r4, 0\n\ + bl CpuSet\n\ + ldr r1, [sp, 0x38]\n\ + lsrs r0, r1, 24\n\ + bl RemoveWindow\n\ + ldr r2, [sp, 0x30]\n\ + lsls r1, r2, 3\n\ + movs r0, 0xF0\n\ + subs r0, r1\n\ + asrs r0, 1\n\ + add sp, 0x44\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .pool"); +} +#endif // NONMATCHING + +static void LoadContestResultSprites(void) +{ + int i; + struct SpriteTemplate template; + u8 spriteIds[ARRAY_COUNT(sUnknown_0858D810)]; + + template = sSpriteTemplate_858D7F8; + for (i = 0; i < (int)ARRAY_COUNT(sUnknown_0858D810); i++) + LoadSpriteSheet(&sUnknown_0858D810[i]); + + LoadSpritePalette(&sUnknown_0858D850); + for (i = 0; i < (int)ARRAY_COUNT(sUnknown_0858D810); i++) + { + spriteIds[i] = CreateSprite(&template, 272, 144, 10); + template.tileTag++; + } + + gSprites[spriteIds[0]].data[0] = spriteIds[1]; + gSprites[spriteIds[0]].data[1] = spriteIds[2]; + gSprites[spriteIds[0]].data[2] = spriteIds[3]; + + gSprites[spriteIds[4]].data[0] = spriteIds[5]; + gSprites[spriteIds[4]].data[1] = spriteIds[6]; + gSprites[spriteIds[4]].data[2] = spriteIds[7]; + + sContestResults->data->slidingTextBoxSpriteId = spriteIds[0]; + sContestResults->data->slidingTextBoxState = SLIDING_TEXT_OFFSCREEN; + sContestResults->data->linkTextBoxSpriteId = spriteIds[4]; + HideLinkResultsTextBox(); +} + +#define sTargetX data[4] +#define sSlideOutTimer data[5] +#define sSlideIncrement data[6] +#define sDistance data[7] + +// If slideOutTimer is -1, it will not automatically slide out +static void StartTextBoxSlideIn(s16 x, u16 y, u16 slideOutTimer, u16 slideIncrement) +{ + struct Sprite *sprite = &gSprites[sContestResults->data->slidingTextBoxSpriteId]; + sprite->pos1.x = 272; + sprite->pos1.y = y; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->sTargetX = x + 32; + sprite->sSlideOutTimer = slideOutTimer; + sprite->sSlideIncrement = slideIncrement; + sprite->sDistance = 0; + sprite->callback = SpriteCB_TextBoxSlideIn; + sContestResults->data->slidingTextBoxState = SLIDING_TEXT_ENTERING; +} + +static void StartTextBoxSlideOut(u16 slideIncrement) +{ + struct Sprite *sprite = &gSprites[sContestResults->data->slidingTextBoxSpriteId]; + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.y = 0; + sprite->pos2.x = 0; + sprite->sSlideIncrement = slideIncrement; + sprite->sDistance = 0; + sprite->callback = SpriteCB_TextBoxSlideOut; + sContestResults->data->slidingTextBoxState = SLIDING_TEXT_EXITING; +} + +static void EndTextBoxSlideOut(struct Sprite *sprite) +{ + sprite->pos1.x = 272; + sprite->pos1.y = 144; + sprite->pos2.y = 0; + sprite->pos2.x = 0; + sprite->callback = SpriteCallbackDummy; + sContestResults->data->slidingTextBoxState = SLIDING_TEXT_OFFSCREEN; +} + +static void SpriteCB_TextBoxSlideIn(struct Sprite *sprite) +{ + int i; + + s16 delta = sprite->sDistance + sprite->sSlideIncrement; + sprite->pos1.x -= delta >> 8; + sprite->sDistance += sprite->sSlideIncrement; + sprite->sDistance &= 0xFF; + + // Prevent overshooting target + if (sprite->pos1.x < sprite->sTargetX) + sprite->pos1.x = sprite->sTargetX; + + for (i = 0; i < 3; i++) + { + struct Sprite *sprite2 = &gSprites[sprite->data[i]]; + sprite2->pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64; + } + + if (sprite->pos1.x == sprite->sTargetX) + sprite->callback = SpriteCB_EndTextBoxSlideIn; +} + +static void SpriteCB_EndTextBoxSlideIn(struct Sprite *sprite) +{ + sContestResults->data->slidingTextBoxState = SLIDING_TEXT_ARRIVED; + if ((u16)sprite->sSlideOutTimer != 0xFFFF) + { + if (--sprite->sSlideOutTimer == -1) + StartTextBoxSlideOut(sprite->sSlideIncrement); + } +} + +static void SpriteCB_TextBoxSlideOut(struct Sprite *sprite) +{ + int i; + s16 delta; + + delta = sprite->sDistance + sprite->sSlideIncrement; + sprite->pos1.x -= delta >> 8; + sprite->sDistance += sprite->sSlideIncrement; + sprite->sDistance &= 0xFF; + for (i = 0; i < 3; i++) + { + struct Sprite *sprite2 = &gSprites[sprite->data[i]]; + sprite2->pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64; + } + + if (sprite->pos1.x + sprite->pos2.x < -224) + EndTextBoxSlideOut(sprite); +} + +static void ShowLinkResultsTextBox(const u8 *text) +{ + int i; + u16 x; + struct Sprite *sprite; + + x = DrawResultsTextWindow(text, sContestResults->data->linkTextBoxSpriteId); + sprite = &gSprites[sContestResults->data->linkTextBoxSpriteId]; + sprite->pos1.x = x + 32; + sprite->pos1.y = 80; + sprite->invisible = FALSE; + for (i = 0; i < 3; i++) + { + gSprites[sprite->data[i]].pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64; + gSprites[sprite->data[i]].pos1.y = sprite->pos1.y; + gSprites[sprite->data[i]].invisible = FALSE; + } + + gBattle_WIN0H = 0x00F0; + gBattle_WIN0V = ((sprite->pos1.y - 16) << 8) | (sprite->pos1.y + 16); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR + | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR); +} + +static void HideLinkResultsTextBox(void) +{ + int i; + struct Sprite *sprite; + + sprite = &gSprites[sContestResults->data->linkTextBoxSpriteId]; + sprite->invisible = TRUE; + for (i = 0; i < 3; i++) + gSprites[sprite->data[i]].invisible = TRUE; + + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + SetGpuReg(REG_OFFSET_WIN0H, gBattle_WIN0H); + SetGpuReg(REG_OFFSET_WIN0V, gBattle_WIN0V); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR + | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); +} + +static void LoadContestResultsTilemaps(void) +{ + u8 palette; + int x, y; + + x = 5; + y = 1; + if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) + { + CopyToBgTilemapBufferRect(2, gLinkContestResults_Tilemap, 5, 1, 5, 2); + x = 10; + } + else if (gSpecialVar_ContestRank == CONTEST_RANK_NORMAL) + { + CopyToBgTilemapBufferRect(2, gNormalContestResults_Tilemap, 5, 1, 10, 2); + x = 15; + } + else if (gSpecialVar_ContestRank == CONTEST_RANK_SUPER) + { + CopyToBgTilemapBufferRect(2, gSuperContestResults_Tilemap, 5, 1, 10, 2); + x = 15; + } + else if (gSpecialVar_ContestRank == CONTEST_RANK_HYPER) + { + CopyToBgTilemapBufferRect(2, gHyperContestResults_Tilemap, 5, 1, 10, 2); + x = 15; + } + else // CONTEST_RANK_MASTER + { + CopyToBgTilemapBufferRect(2, gMasterContestResults_Tilemap, 5, 1, 10, 2); + x = 15; + } + + if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_COOL) + { + palette = 0; + CopyToBgTilemapBufferRect(2, gCoolContestResults_Tilemap, x, y, 5, 2); + } + else if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_BEAUTY) + { + palette = 1; + CopyToBgTilemapBufferRect(2, gBeautyContestResults_Tilemap, x, y, 5, 2); + } + else if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_CUTE) + { + palette = 2; + CopyToBgTilemapBufferRect(2, gCuteContestResults_Tilemap, x, y, 5, 2); + } + else if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_SMART) + { + palette = 3; + CopyToBgTilemapBufferRect(2, gSmartContestResults_Tilemap, x, y, 5, 2); + } + else // CONTEST_CATEGORY_TOUGH + { + palette = 4; + CopyToBgTilemapBufferRect(2, gToughContestResults_Tilemap, x, y, 5, 2); + } + + x += 5; + CopyToBgTilemapBufferRect(2, gContestResults_Tilemap, x, y, 6, 2); + CopyToBgTilemapBufferRect_ChangePalette(2, sContestResults->tilemapBuffers[2], 0, 0, 32, 4, palette); +} + +// Represented on results board as stars +static u8 GetNumPreliminaryPoints(u8 monIndex, bool8 capPoints) +{ + u32 condition = gContestMonConditions[monIndex] << 16; + u32 numStars = condition / 0x3F; + + if (numStars & 0xFFFF) + numStars += 0x10000; + + numStars >>= 16; + if (numStars == 0 && condition) + numStars = 1; + + if (capPoints && numStars > 10) + numStars = 10; + + return numStars; +} + +// Represented on results board as hearts +static s8 GetNumRound2Points(u8 monIndex, bool8 capPoints) +{ + u32 r4, numHearts; + s16 results; + s8 points; + + results = gContestMonRound2Points[monIndex]; + if (results < 0) + r4 = -results << 16; + else + r4 = results << 16; + + numHearts = r4 / 80; + if (numHearts & 0xFFFF) + numHearts += 0x10000; + + numHearts >>= 16; + if (numHearts == 0 && r4 != 0) + numHearts = 1; + + if (capPoints && numHearts > 10) + numHearts = 10; + + if (gContestMonRound2Points[monIndex] < 0) + points = -numHearts; + else + points = numHearts; + + return points; +} + +#define tState data[10] + +static void Task_DrawFinalStandingNumber(u8 taskId) +{ + u16 firstTileNum; + + if (gTasks[taskId].tState == 0) + { + gTasks[taskId].data[11] = (3 - gTasks[taskId].tFinalStanding) * 40; + gTasks[taskId].tState++; + } + else if (gTasks[taskId].tState == 1) + { + if (--gTasks[taskId].data[11] == -1) + { + firstTileNum = gTasks[taskId].tFinalStanding * 2 + 0x5043; + WriteSequenceToBgTilemapBuffer(2, firstTileNum, 1, gTasks[taskId].tMonIndex * 3 + 5, 2, 1, 17, 1); + WriteSequenceToBgTilemapBuffer(2, firstTileNum + 0x10, 1, gTasks[taskId].tMonIndex * 3 + 6, 2, 1, 17, 1); + sContestResults->data->numStandingsPrinted++; + DestroyTask(taskId); + PlaySE(SE_JYUNI); + } + } +} + +#undef tFinalStanding +#undef tMonIndex +#undef tState + +static void Task_StartHighlightWinnersBox(u8 taskId) +{ + int i; + GET_CONTEST_WINNER_ID(i); + CopyToBgTilemapBufferRect_ChangePalette(2, i * 0xC0 + 0x100 + sContestResults->tilemapBuffers[2], 0, i * 3 + 4, 32, 3, 9); + gTasks[taskId].data[10] = i; + gTasks[taskId].data[12] = 1; + gTasks[taskId].func = Task_HighlightWinnersBox; + sContestResults->data->highlightWinnerTaskId = taskId; +} + +static void Task_HighlightWinnersBox(u8 taskId) +{ + if (++gTasks[taskId].data[11] == 1) + { + gTasks[taskId].data[11] = 0; + BlendPalette(0x91, 1, gTasks[taskId].data[12], RGB(13, 28, 27)); + if (gTasks[taskId].data[13] == 0) + { + if (++gTasks[taskId].data[12] == 16) + gTasks[taskId].data[13] = 1; + } + else + { + if (--gTasks[taskId].data[12] == 0) + gTasks[taskId].data[13] = 0; + } + } +} + +static void SpriteCB_WinnerMonSlideIn(struct Sprite *sprite) +{ + if (sprite->data[0] < 10) + { + if (++sprite->data[0] == 10) + { + PlayCry1(sprite->data[1], 0); + sprite->data[1] = 0; + } + } + else + { + s16 delta = sprite->data[1] + 0x600; + sprite->pos1.x -= delta >> 8; + sprite->data[1] += 0x600; + sprite->data[1] &= 0xFF; + if (sprite->pos1.x < 120) + sprite->pos1.x = 120; + + if (sprite->pos1.x == 120) + { + sprite->callback = SpriteCallbackDummy; + sprite->data[1] = 0; + sContestResults->data->winnerMonSlidingState = SLIDING_MON_ENTERED; + } + } +} + +static void SpriteCB_WinnerMonSlideOut(struct Sprite *sprite) +{ + s16 delta = sprite->data[1] + 0x600; + sprite->pos1.x -= delta >> 8; + sprite->data[1] += + 0x600; + sprite->data[1] &= 0xFF; + if (sprite->pos1.x < -32) + { + sprite->callback = SpriteCallbackDummy; + sprite->invisible = TRUE; + sContestResults->data->winnerMonSlidingState = SLIDING_MON_EXITED; + } +} + +static void Task_CreateConfetti(u8 taskId) +{ + if (++gTasks[taskId].data[0] == 5) + { + gTasks[taskId].data[0] = 0; + if (sContestResults->data->confettiCount < 40) + { + u8 spriteId = CreateSprite(&sSpriteTemplate_Confetti, (Random() % 240) - 20, 44, 5); + gSprites[spriteId].data[0] = Random() % 512; + gSprites[spriteId].data[1] = (Random() % 24) + 16; + gSprites[spriteId].data[2] = (Random() % 256) + 48; + gSprites[spriteId].oam.tileNum += Random() % 17; + sContestResults->data->confettiCount++; + } + } + + if (sContestResults->data->destroyConfetti) + DestroyTask(taskId); +} + +static void SpriteCB_Confetti(struct Sprite *sprite) +{ + s16 delta; + + sprite->data[3] += sprite->data[0]; + sprite->pos2.x = Sin(sprite->data[3] >> 8, sprite->data[1]); + delta = sprite->data[4] + sprite->data[2]; + sprite->pos1.x += delta >> 8; + sprite->data[4] += sprite->data[2]; + sprite->data[4] &= 0xff; + + sprite->pos1.y++; + if (sContestResults->data->destroyConfetti) + sprite->invisible = TRUE; + + if (sprite->pos1.x > 248 || sprite->pos1.y > 116) + { + DestroySprite(sprite); + sContestResults->data->confettiCount--; + } +} + +#define tMonIndex data[0] +#define tNumFrames data[1] +#define tSpecies data[2] +#define tTimer data[10] +#define tBounced data[11] + +static void BounceMonIconInBox(u8 monIndex, u8 numFrames) +{ + u8 taskId = CreateTask(Task_BounceMonIconInBox, 8); + gTasks[taskId].tMonIndex = monIndex; + gTasks[taskId].tNumFrames = numFrames; + gTasks[taskId].tSpecies = gContestMons[monIndex].species; +} + +static void Task_BounceMonIconInBox(u8 taskId) +{ + u8 monIndex = gTasks[taskId].tMonIndex; + if (gTasks[taskId].tTimer++ == gTasks[taskId].tNumFrames) + { + gTasks[taskId].tTimer = 0; + LoadContestMonIcon(gTasks[taskId].tSpecies, monIndex, gTasks[taskId].tBounced, FALSE, gContestMons[monIndex].personality); + gTasks[taskId].tBounced ^= 1; + } +} + +#undef tMonIndex +#undef tNumFrames +#undef tSpecies +#undef tTimer +#undef tBounced + +static void CalculateContestantsResultData(void) +{ + int i, relativePoints; + u32 barLength; + s16 highestPoints; + s8 round2Points; + + highestPoints = gContestMonTotalPoints[0]; + for (i = 1; i < CONTESTANT_COUNT; i++) + { + if (highestPoints < gContestMonTotalPoints[i]) + highestPoints = gContestMonTotalPoints[i]; + } + + if (highestPoints < 0) + { + highestPoints = gContestMonTotalPoints[0]; + for (i = 1; i < CONTESTANT_COUNT; i++) + { + if (highestPoints > gContestMonTotalPoints[i]) + highestPoints = gContestMonTotalPoints[i]; + } + } + + for (i = 0; i < CONTESTANT_COUNT; i++) + { + relativePoints = (gContestMonConditions[i] * 1000) / abs(highestPoints); + if (relativePoints % 10 > 4) + relativePoints += 10; + (*sContestResults->monResults)[i].relativePreliminaryPoints = relativePoints / 10; + + relativePoints = (abs(gContestMonRound2Points[i]) * 1000) / abs(highestPoints); + if (relativePoints % 10 > 4) + relativePoints += 10; + (*sContestResults->monResults)[i].relativeRound2Points = relativePoints / 10; + + if (gContestMonRound2Points[i] < 0) + (*sContestResults->monResults)[i].lostPoints = TRUE; + + barLength = ((*sContestResults->monResults)[i].relativePreliminaryPoints * 0x5800) / 100; + if ((barLength & 0xFF) > 0x7F) + barLength += 0x100; + (*sContestResults->monResults)[i].barLengthPreliminary = barLength >> 8; + + barLength = ((*sContestResults->monResults)[i].relativeRound2Points * 0x5800) / 100; + if ((barLength & 0xFF) > 0x7F) + barLength += 0x100; + (*sContestResults->monResults)[i].barLengthRound2 = barLength >> 8; + + (*sContestResults->monResults)[i].numStars = GetNumPreliminaryPoints(i, TRUE); + round2Points = GetNumRound2Points(i, TRUE); + (*sContestResults->monResults)[i].numHearts = abs(round2Points); + + if (gContestFinalStandings[i]) + { + s16 barLengthPreliminary = (*sContestResults->monResults)[i].barLengthPreliminary; + s16 barLengthRound2 = (*sContestResults->monResults)[i].barLengthRound2; + + if ((*sContestResults->monResults)[i].lostPoints) + barLengthRound2 *= -1; + + if (barLengthPreliminary + barLengthRound2 == MAX_BAR_LENGTH + 1) + { + if (barLengthRound2 > 0) + (*sContestResults->monResults)[i].barLengthRound2--; + else if (barLengthPreliminary > 0) + (*sContestResults->monResults)[i].barLengthPreliminary--; + } + } + } +} + +#define tMonId data[0] +#define tTarget data[1] +#define tDecreasing data[2] + +static void UpdateContestResultBars(bool8 isRound2, u8 numUpdates) +{ + int i, taskId; + u32 target; + u8 numIncreasing = 0, numDecreasing = 0; + + if (!isRound2) + { + for (i = 0; i < CONTESTANT_COUNT; i++) + { + u8 numStars = (*sContestResults->monResults)[i].numStars; + if (numUpdates < numStars) + { + FillBgTilemapBufferRect_Palette0(1, 0x60B3, ((19 + numStars) - numUpdates) - 1, i * 3 + 5, 1, 1); + taskId = CreateTask(Task_UpdateContestResultBar, 10); + + target = (((*sContestResults->monResults)[i].barLengthPreliminary << 16) / (*sContestResults->monResults)[i].numStars) * (numUpdates + 1); + if ((target & 0xFFFF) > 0x7FFF) + target += 0x10000; + + gTasks[taskId].tMonId = i; + gTasks[taskId].tTarget = target >> 16; + sContestResults->data->numBarsUpdating++; + numIncreasing++; + } + } + } + else + { + for (i = 0; i < CONTESTANT_COUNT; i++) + { + s8 numHearts = (*sContestResults->monResults)[i].numHearts; + u32 tile = (*sContestResults->monResults)[i].lostPoints ? 0x60A5 : 0x60A3; + if (numUpdates < numHearts) + { + FillBgTilemapBufferRect_Palette0(1, tile, ((19 + numHearts) - numUpdates) - 1, i * 3 + 6, 1, 1); + taskId = CreateTask(Task_UpdateContestResultBar, 10); + + target = (((*sContestResults->monResults)[i].barLengthRound2 << 16) / (*sContestResults->monResults)[i].numHearts) * (numUpdates + 1); + if ((target & 0xFFFF) > 0x7FFF) + target += 0x10000; + + gTasks[taskId].tMonId = i; + if ((*sContestResults->monResults)[i].lostPoints) + { + gTasks[taskId].tDecreasing = TRUE; + numDecreasing++; + } + else + { + numIncreasing++; + } + + if ((*sContestResults->monResults)[i].lostPoints) + gTasks[taskId].tTarget = -(target >> 16) + (*sContestResults->monResults)[i].barLengthPreliminary; + else + gTasks[taskId].tTarget = (target >> 16) + (*sContestResults->monResults)[i].barLengthPreliminary; + + sContestResults->data->numBarsUpdating++; + } + } + } + + if (numDecreasing) + PlaySE(SE_BOO); + if (numIncreasing) + PlaySE(SE_PIN); +} + +static void Task_UpdateContestResultBar(u8 taskId) +{ + int i; + bool32 minMaxReached = FALSE; + bool32 targetReached = FALSE; + u8 monId = gTasks[taskId].tMonId; + s16 target = gTasks[taskId].tTarget; + s16 decreasing = gTasks[taskId].tDecreasing; + + if (decreasing) + { + if (sContestResults->data->unkC[monId] <= 0) + minMaxReached = TRUE; + } + else + { + if (sContestResults->data->unkC[monId] > MAX_BAR_LENGTH) + minMaxReached = TRUE; + } + + if (sContestResults->data->unkC[monId] == target) + targetReached = TRUE; + + if (!targetReached) + { + if (minMaxReached) + sContestResults->data->unkC[monId] = target; + else if (decreasing) + sContestResults->data->unkC[monId] = sContestResults->data->unkC[monId] - 1; + else + sContestResults->data->unkC[monId] = sContestResults->data->unkC[monId] + 1; + } + + if (!minMaxReached && !targetReached) + { + u8 var0; + u16 tileNum; + for (i = 0; i < 11; i++) + { + if (sContestResults->data->unkC[monId] >= (i + 1) * 8) + var0 = 8; + else if (sContestResults->data->unkC[monId] >= i * 8) + var0 = sContestResults->data->unkC[monId] % 8; + else + var0 = 0; + + if (var0 < 4) + tileNum = 0x504C + var0; + else + tileNum = 0x5057 + var0; + + FillBgTilemapBufferRect_Palette0(2, tileNum, i + 7, monId * 3 + 6, 1, 1); + } + } + + if (targetReached) + { + sContestResults->data->numBarsUpdating--; + DestroyTask(taskId); + } +} + +#undef tMonId +#undef tTarget +#undef tDecreasing + +static void AllocContestResults(void) +{ + sContestResults = AllocZeroed(sizeof(*sContestResults)); + sContestResults->data = AllocZeroed(sizeof(*sContestResults->data)); + sContestResults->monResults = AllocZeroed(sizeof(*sContestResults->monResults)); + sContestResults->unusedBg = AllocZeroed(BG_SCREEN_SIZE); + sContestResults->tilemapBuffers[0] = AllocZeroed(BG_SCREEN_SIZE); + sContestResults->tilemapBuffers[1] = AllocZeroed(BG_SCREEN_SIZE); + sContestResults->tilemapBuffers[2] = AllocZeroed(BG_SCREEN_SIZE); + sContestResults->tilemapBuffers[3] = AllocZeroed(BG_SCREEN_SIZE); + sContestResults->unused = AllocZeroed(0x1000); + AllocateMonSpritesGfx(); +} + +static void FreeContestResults(void) +{ + FREE_AND_SET_NULL(sContestResults->data); + FREE_AND_SET_NULL(sContestResults->monResults); + FREE_AND_SET_NULL(sContestResults->unusedBg); + FREE_AND_SET_NULL(sContestResults->tilemapBuffers[0]); + FREE_AND_SET_NULL(sContestResults->tilemapBuffers[1]); + FREE_AND_SET_NULL(sContestResults->tilemapBuffers[2]); + FREE_AND_SET_NULL(sContestResults->tilemapBuffers[3]); + FREE_AND_SET_NULL(sContestResults->unused); + FREE_AND_SET_NULL(sContestResults); + FreeMonSpritesGfx(); +} + +static void AddContestTextPrinter(int windowId, u8 *str, int x) +{ + struct TextPrinterTemplate textPrinter; + textPrinter.currentChar = str; + textPrinter.windowId = windowId; + textPrinter.fontId = 7; + textPrinter.x = x; + textPrinter.y = 2; + textPrinter.currentX = x; + textPrinter.currentY = 2; + textPrinter.letterSpacing = 0; + textPrinter.lineSpacing = 0; + textPrinter.unk = 0; + textPrinter.fgColor = 1; + textPrinter.bgColor = 0; + textPrinter.shadowColor = 8; + AddTextPrinter(&textPrinter, 0, NULL); + PutWindowTilemap(windowId); +} + +void TryEnterContestMon(void) +{ + u8 eligibility = GetContestEntryEligibility(&gPlayerParty[gContestMonPartyIndex]); + + // Nonzero eligibility can still be non-eligibile, if mon is fainted or egg + if (eligibility) + { + sub_80DAB8C(gSpecialVar_ContestCategory, gSpecialVar_ContestRank); + sub_80DB09C(gSpecialVar_ContestCategory); + } + + gSpecialVar_Result = eligibility; +} + +u16 HasMonWonThisContestBefore(void) +{ + u16 hasRankRibbon = FALSE; + struct Pokemon *mon = &gPlayerParty[gContestMonPartyIndex]; + switch (gSpecialVar_ContestCategory) + { + case CONTEST_CATEGORY_COOL: + if (GetMonData(mon, MON_DATA_COOL_RIBBON) > gSpecialVar_ContestRank) + hasRankRibbon = TRUE; + break; + case CONTEST_CATEGORY_BEAUTY: + if (GetMonData(mon, MON_DATA_BEAUTY_RIBBON) > gSpecialVar_ContestRank) + hasRankRibbon = TRUE; + break; + case CONTEST_CATEGORY_CUTE: + if (GetMonData(mon, MON_DATA_CUTE_RIBBON) > gSpecialVar_ContestRank) + hasRankRibbon = TRUE; + break; + case CONTEST_CATEGORY_SMART: + if (GetMonData(mon, MON_DATA_SMART_RIBBON) > gSpecialVar_ContestRank) + hasRankRibbon = TRUE; + break; + case CONTEST_CATEGORY_TOUGH: + if (GetMonData(mon, MON_DATA_TOUGH_RIBBON) > gSpecialVar_ContestRank) + hasRankRibbon = TRUE; + break; + } + + return hasRankRibbon; +} + +void GiveMonContestRibbon(void) +{ + u8 ribbonData; + + if (gContestFinalStandings[gContestPlayerMonIndex] != 0) + return; + + switch (gSpecialVar_ContestCategory) + { + case CONTEST_CATEGORY_COOL: + ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON); + if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) + { + ribbonData++; + SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON, &ribbonData); + if (GetRibbonCount(&gPlayerParty[gContestMonPartyIndex]) > NUM_CUTIES_RIBBONS) + TryPutSpotTheCutiesOnAir(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON); + } + break; + case CONTEST_CATEGORY_BEAUTY: + ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON); + if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) + { + ribbonData++; + SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON, &ribbonData); + if (GetRibbonCount(&gPlayerParty[gContestMonPartyIndex]) > NUM_CUTIES_RIBBONS) + TryPutSpotTheCutiesOnAir(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON); + } + break; + case CONTEST_CATEGORY_CUTE: + ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON); + if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) + { + ribbonData++; + SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON, &ribbonData); + if (GetRibbonCount(&gPlayerParty[gContestMonPartyIndex]) > NUM_CUTIES_RIBBONS) + TryPutSpotTheCutiesOnAir(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON); + } + break; + case CONTEST_CATEGORY_SMART: + ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON); + if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) + { + ribbonData++; + SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON, &ribbonData); + if (GetRibbonCount(&gPlayerParty[gContestMonPartyIndex]) > NUM_CUTIES_RIBBONS) + TryPutSpotTheCutiesOnAir(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON); + } + break; + case CONTEST_CATEGORY_TOUGH: + ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON); + if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4) + { + ribbonData++; + SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON, &ribbonData); + if (GetRibbonCount(&gPlayerParty[gContestMonPartyIndex]) > NUM_CUTIES_RIBBONS) + TryPutSpotTheCutiesOnAir(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON); + } + break; + } +} + +void BufferContestantTrainerName(void) +{ + StringCopy(gStringVar1, gContestMons[gSpecialVar_0x8006].trainerName); + sub_81DB5AC(gStringVar1); +} + +void BufferContestantMonNickname(void) +{ + StringCopy(gStringVar3, gContestMons[gSpecialVar_0x8006].nickname); +} + +// Unused script special +void GetContestMonConditionRanking(void) +{ + u8 i, rank; + + for (i = 0, rank = 0; i < CONTESTANT_COUNT; i++) + { + if (gContestMonConditions[gSpecialVar_0x8006] < gContestMonConditions[i]) + rank++; + } + + gSpecialVar_0x8004 = rank; +} + +void GetContestMonCondition(void) +{ + gSpecialVar_0x8004 = gContestMonConditions[gSpecialVar_0x8006]; +} + +void GetContestWinnerId(void) +{ + u8 i; + GET_CONTEST_WINNER_ID(i); + gSpecialVar_0x8005 = i; +} + +void BufferContestWinnerTrainerName(void) +{ + u8 i; + GET_CONTEST_WINNER_ID(i); + StringCopy(gStringVar3, gContestMons[i].trainerName); + sub_81DB5AC(gStringVar3); +} + +void BufferContestWinnerMonName(void) +{ + u8 i; + GET_CONTEST_WINNER_ID(i); + StringCopy(gStringVar1, gContestMons[i].nickname); +} + +void CB2_SetStartContestCallback(void) +{ + SetMainCallback2(CB2_StartContest); +} + +static void Task_StartContest(u8 taskId) +{ + if (!gPaletteFade.active) + { + DestroyTask(taskId); + SetMainCallback2(CB2_SetStartContestCallback); + } +} + +void StartContest(void) +{ + ScriptContext2_Enable(); + CreateTask(Task_StartContest, 10); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); +} + +void BufferContestantMonSpecies(void) +{ + gSpecialVar_0x8004 = gContestMons[gSpecialVar_0x8006].species; +} + +static void Task_StartShowContestResults(u8 taskId) +{ + if (!gPaletteFade.active) + { + DestroyTask(taskId); + SetMainCallback2(CB2_StartShowContestResults); + } +} + +void ShowContestResults(void) +{ + ScriptContext2_Enable(); + CreateTask(Task_StartShowContestResults, 10); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); +} + +void GetContestPlayerId(void) +{ + gSpecialVar_0x8004 = gContestPlayerMonIndex; +} + +void ContestLinkTransfer(u8 taskId) +{ + u8 newTaskId; + ScriptContext2_Enable(); + newTaskId = CreateTask(sub_80FC580, 0); + SetTaskFuncWithFollowupFunc(newTaskId, sub_80FC580, sub_80F8508); + gTasks[newTaskId].data[9] = taskId; +} + +static void sub_80F8508(u8 taskId) +{ + if (gLinkContestFlags & LINK_CONTEST_FLAG_HAS_RS_PLAYER) + { + sub_80DA8C8(gContestMonPartyIndex); + SetTaskFuncWithFollowupFunc(taskId, sub_80FC6BC, sub_80F8568); + } + else + { + sub_80DA8C8(gContestMonPartyIndex); + gTasks[taskId].func = sub_81D9DE4; + } +} + +static void sub_80F8568(u8 taskId) +{ + SetTaskFuncWithFollowupFunc(taskId, sub_80FC804, sub_80F8584); +} + +static void sub_80F8584(u8 taskId) +{ + SetTaskFuncWithFollowupFunc(taskId, sub_80FCE48, sub_80F85A0); +} + +static void sub_80F85A0(u8 taskId) +{ + SetTaskFuncWithFollowupFunc(taskId, sub_80FC894, sub_80F85BC); +} + +static void sub_80F85BC(u8 taskId) +{ + u8 i; + u8 sp0[4]; + u8 sp4[4]; + + memset(sp0, 0, sizeof(sp0)); + memset(sp4, 0, sizeof(sp4)); + + for (i = 0; i < gNumLinkContestPlayers; i++) + sp0[i] = gTasks[taskId].data[i + 1]; + + for (i = 0; i < gNumLinkContestPlayers;) + { + i++; + if (i >= gNumLinkContestPlayers || sp0[0] != sp0[i]) + break; + } + + if (i == gNumLinkContestPlayers) + gSpecialVar_0x8004 = 0; + else + gSpecialVar_0x8004 = 1; + + for (i = 0; i < gNumLinkContestPlayers; i++) + sp4[i] = gTasks[taskId].data[i + 5]; + + gUnknown_02039F2B = sub_80F86E0(sp4); + sub_80DB09C(gSpecialVar_ContestCategory); + SetTaskFuncWithFollowupFunc(taskId, sub_80FCF40, sub_80F86B8); +} + +static void sub_80F86B8(u8 taskId) +{ + SortContestants(FALSE); + SetTaskFuncWithFollowupFunc(taskId, sub_80FCFD0, sub_80F8714); +} + +u8 sub_80F86E0(u8 *arg0) +{ + int i; + u8 result = 0; + + for (i = 1; i < gNumLinkContestPlayers; i++) + { + if (arg0[result] < arg0[i]) + result = i; + } + + return result; +} + +void sub_80F8714(u8 taskId) +{ + int i; + + if (gSpecialVar_0x8004 == 1) + { + if (IsLinkTaskFinished()) + gTasks[taskId].func = sub_80F878C; + } + else + { + for (i = 0; i < CONTESTANT_COUNT; i++) + StringGetEnd10(gContestMons[i].nickname); + + DestroyTask(taskId); + SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); + ScriptContext2_Disable(); + EnableBothScriptContexts(); + } +} + +static void sub_80F878C(u8 taskId) +{ + sub_800AC34(); + gTasks[taskId].func = sub_80F87B4; +} + +static void sub_80F87B4(u8 taskId) +{ + if (!gReceivedRemoteLinkPlayers) + { + DestroyTask(taskId); + ScriptContext2_Disable(); + EnableBothScriptContexts(); + } +} diff --git a/src/scrcmd.c b/src/scrcmd.c index 9c00c3bc8..326d46a56 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -5,7 +5,7 @@ #include "clock.h" #include "coins.h" #include "contest.h" -#include "contest_link_80F57C4.h" +#include "contest_util.h" #include "contest_painting.h" #include "data.h" #include "decoration.h" diff --git a/src/script_pokemon_util_80F87D8.c b/src/script_pokemon_util_80F87D8.c index 62b445a04..a6ab1693b 100755 --- a/src/script_pokemon_util_80F87D8.c +++ b/src/script_pokemon_util_80F87D8.c @@ -3,7 +3,7 @@ #include "battle_gfx_sfx_util.h" #include "berry.h" #include "contest.h" -#include "contest_link_80F57C4.h" +#include "contest_util.h" #include "contest_painting.h" #include "data.h" #include "daycare.h" diff --git a/sym_ewram.txt b/sym_ewram.txt index 58fb0648e..e99d90a1d 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -74,7 +74,7 @@ .include "src/record_mixing.o" .include "src/secret_base.o" .include "src/tv.o" - .include "src/contest_link_80F57C4.o" + .include "src/contest_util.o" .include "src/rotating_gate.o" .include "src/safari_zone.o" .include "src/item_use.o" -- cgit v1.2.3 From 8b462f3f6c30de55767808136861e892fc3f0356 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Thu, 18 Jun 2020 18:14:30 -0400 Subject: Specify confetti util name --- include/confetti_util.h | 33 ++++++++ include/oam_util.h | 33 -------- ld_script.txt | 2 +- src/confetti_util.c | 218 ++++++++++++++++++++++++++++++++++++++++++++++++ src/hall_of_fame.c | 36 ++++---- src/oam_util.c | 218 ------------------------------------------------ sym_ewram.txt | 2 +- 7 files changed, 271 insertions(+), 271 deletions(-) create mode 100644 include/confetti_util.h delete mode 100644 include/oam_util.h create mode 100644 src/confetti_util.c delete mode 100644 src/oam_util.c diff --git a/include/confetti_util.h b/include/confetti_util.h new file mode 100644 index 000000000..ecc05a220 --- /dev/null +++ b/include/confetti_util.h @@ -0,0 +1,33 @@ +#ifndef GUARD_CONFETTI_UTIL_H +#define GUARD_CONFETTI_UTIL_H + +struct ConfettiUtil +{ + struct OamData oam; + s16 x; + s16 y; + s16 xDelta; + s16 yDelta; + u16 tileTag; + u16 palTag; + u16 tileNum; + u8 id; + u8 filler; + u8 animNum; + u8 active:1; + u8 allowUpdates:1; + u8 dummied:1; + u8 priority:2; + s16 data[8]; + void (*callback)(struct ConfettiUtil *); +}; + +bool32 ConfettiUtil_Init(u8 count); +bool32 ConfettiUtil_Free(void); +bool32 ConfettiUtil_Update(void); +u8 ConfettiUtil_SetCallback(u8 id, void (*func)(struct ConfettiUtil *)); +u8 ConfettiUtil_SetData(u8 id, u8 dataArrayId, s16 dataValue); +u8 ConfettiUtil_AddNew(const struct OamData *oam, u16 tileTag, u16 palTag, s16 x, s16 y, u8 animNum, u8 priority); +u8 ConfettiUtil_Remove(u8 id); + +#endif // GUARD_CONFETTI_UTIL_H diff --git a/include/oam_util.h b/include/oam_util.h deleted file mode 100644 index 24e166c93..000000000 --- a/include/oam_util.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef GUARD_OAM_UTIL_H -#define GUARD_OAM_UTIL_H - -struct OamUtil -{ - struct OamData oam; - s16 x; - s16 y; - s16 xDelta; - s16 yDelta; - u16 tileTag; - u16 palTag; - u16 tileNum; - u8 id; - u8 filler; - u8 animNum; - u8 active:1; - u8 allowUpdates:1; - u8 dummied:1; - u8 priority:2; - s16 data[8]; - void (*callback)(struct OamUtil *); -}; - -bool32 OamUtil_Init(u8 count); -bool32 OamUtil_Free(void); -bool32 OamUtil_Update(void); -u8 OamUtil_SetCallback(u8 id, void (*func)(struct OamUtil *)); -u8 OamUtil_SetData(u8 id, u8 dataArrayId, s16 dataValue); -u8 OamUtil_AddNew(const struct OamData *oam, u16 tileTag, u16 palTag, s16 x, s16 y, u8 animNum, u8 priority); -u8 OamUtil_Remove(u8 id); - -#endif // GUARD_OAM_UTIL_H diff --git a/ld_script.txt b/ld_script.txt index fb4d86300..9ca6dabc8 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -237,7 +237,7 @@ SECTIONS { src/cable_car.o(.text); src/math_util.o(.text); src/roulette_util.o(.text); - src/oam_util.o(.text); + src/confetti_util.o(.text); src/save.o(.text); src/mystery_event_script.o(.text); src/field_effect_helpers.o(.text); diff --git a/src/confetti_util.c b/src/confetti_util.c new file mode 100644 index 000000000..3bda3ab53 --- /dev/null +++ b/src/confetti_util.c @@ -0,0 +1,218 @@ +#include "global.h" +#include "confetti_util.h" +#include "malloc.h" +#include "main.h" +#include "digit_obj_util.h" + +static EWRAM_DATA struct +{ + u8 count; + struct ConfettiUtil *array; +} *sWork = NULL; + +static void sub_81520A8(void *dest, u16 value, u8 left, u8 top, u8 width, u8 height) // Unused. +{ + u8 i; + u8 j; + u8 x; + u8 y; + + for (i = 0, y = top; i < height; i++) + { + for (x = left, j = 0; j < width; j++) + { + *(u16 *)((dest) + (y * 64 + x * 2)) = value; + x = (x + 1) % 32; + } + y = (y + 1) % 32; + } +} + +static void sub_8152134(void *dest, const u16 *src, u8 left, u8 top, u8 width, u8 height) // Unused. +{ + u8 i; + u8 j; + u8 x; + u8 y; + const u16 *_src; + + for (i = 0, _src = src, y = top; i < height; i++) + { + for (x = left, j = 0; j < width; j++) + { + *(u16 *)((dest) + (y * 64 + x * 2)) = *(_src++); + x = (x + 1) % 32; + } + y = (y + 1) % 32; + } +} + +bool32 ConfettiUtil_Init(u8 count) +{ + u8 i = 0; + + if (count == 0) + return FALSE; + if (count > 64) + count = 64; + + sWork = AllocZeroed(sizeof(*sWork)); + if (sWork == NULL) + return FALSE; + sWork->array = AllocZeroed(count * sizeof(struct ConfettiUtil)); + if (sWork->array == NULL) + { + FREE_AND_SET_NULL(sWork); + return FALSE; + } + + sWork->count = count; + for (i = 0; i < count; i++) + { + memcpy(&sWork->array[i].oam, &gDummyOamData, sizeof(struct OamData)); + sWork->array[i].dummied = TRUE; + } + + return TRUE; +} + +bool32 ConfettiUtil_Free(void) +{ + u8 i = 0; + + if (sWork == NULL) + return FALSE; + + for (i = 0; i < sWork->count; i++) + memcpy(&gMain.oamBuffer[i + 64], &gDummyOamData, sizeof(struct OamData)); + + memset(sWork->array, 0, sWork->count * sizeof(struct ConfettiUtil)); + FREE_AND_SET_NULL(sWork->array); + memset(sWork, 0, sizeof(*sWork)); + FREE_AND_SET_NULL(sWork); + + return TRUE; +} + +bool32 ConfettiUtil_Update(void) +{ + u8 i = 0; + + if (sWork == NULL || sWork->array == NULL) + return FALSE; + + for (i = 0; i < sWork->count; i++) + { + if (sWork->array[i].active && sWork->array[i].allowUpdates) + { + if (sWork->array[i].callback != NULL) + sWork->array[i].callback(&sWork->array[i]); + + if (sWork->array[i].dummied) + { + memcpy(&gMain.oamBuffer[i + 64], &gDummyOamData, sizeof(struct OamData)); + } + else + { + sWork->array[i].oam.y = sWork->array[i].y + sWork->array[i].yDelta; + sWork->array[i].oam.x = sWork->array[i].x + sWork->array[i].xDelta; + sWork->array[i].oam.priority = sWork->array[i].priority; + sWork->array[i].oam.tileNum = sWork->array[i].tileNum; + memcpy(&gMain.oamBuffer[i + 64], &sWork->array[i], sizeof(struct OamData)); + } + } + } + + return TRUE; +} + +static bool32 SetAnimAndTileNum(struct ConfettiUtil *structPtr, u8 animNum) +{ + u16 tileStart; + + if (structPtr == NULL) + return FALSE; + + tileStart = GetSpriteTileStartByTag(structPtr->tileTag); + if (tileStart == 0xFFFF) + return FALSE; + + structPtr->animNum = animNum; + structPtr->tileNum = (GetTilesPerImage(structPtr->oam.shape, structPtr->oam.size) * animNum) + tileStart; + return TRUE; +} + +u8 ConfettiUtil_SetCallback(u8 id, void (*func)(struct ConfettiUtil *)) +{ + if (sWork == NULL || id >= sWork->count) + return 0xFF; + else if (!sWork->array[id].active) + return 0xFF; + + sWork->array[id].callback = func; + return id; +} + +u8 ConfettiUtil_SetData(u8 id, u8 dataArrayId, s16 dataValue) +{ + if (sWork == NULL || id >= sWork->count) + return 0xFF; + else if (!sWork->array[id].active || dataArrayId > ARRAY_COUNT(sWork->array[id].data) - 1) // - 1 b/c last slot is reserved for taskId + return 0xFF; + + sWork->array[id].data[dataArrayId] = dataValue; + return id; +} + +u8 ConfettiUtil_AddNew(const struct OamData *oam, u16 tileTag, u16 palTag, s16 x, s16 y, u8 animNum, u8 priority) +{ + struct ConfettiUtil *structPtr = NULL; + u8 i; + + if (sWork == NULL || oam == NULL) + return 0xFF; + + for (i = 0; i < sWork->count; i++) + { + if (!sWork->array[i].active) + { + structPtr = &sWork->array[i]; + memset(structPtr, 0, sizeof(*structPtr)); + structPtr->id = i; + structPtr->active = TRUE; + structPtr->allowUpdates = TRUE; + break; + } + } + + if (structPtr == NULL) + return 0xFF; + + memcpy(&structPtr->oam, oam, sizeof(*oam)); + structPtr->tileTag = tileTag; + structPtr->palTag = palTag; + structPtr->x = x; + structPtr->y = y; + structPtr->oam.paletteNum = IndexOfSpritePaletteTag(palTag); + if (priority < 4) + { + structPtr->priority = priority; + structPtr->oam.priority = priority; + } + SetAnimAndTileNum(structPtr, animNum); + + return structPtr->id; +} + +u8 ConfettiUtil_Remove(u8 id) +{ + if (sWork == NULL || !sWork->array[id].active) + return 0xFF; + + memset(&sWork->array[id], 0, sizeof(struct ConfettiUtil)); + sWork->array[id].oam.y = 160; + sWork->array[id].oam.x = 240; + sWork->array[id].dummied = TRUE; + memcpy(&gMain.oamBuffer[id + 64], &gDummyOamData, sizeof(struct OamData)); + return id; +} diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c index 30b170d8e..bf9850dec 100644 --- a/src/hall_of_fame.c +++ b/src/hall_of_fame.c @@ -33,7 +33,7 @@ #include "fldeff_misc.h" #include "trainer_pokemon_sprites.h" #include "data.h" -#include "oam_util.h" +#include "confetti_util.h" #include "constants/rgb.h" #define HALL_OF_FAME_MAX_TEAMS 50 @@ -1423,7 +1423,7 @@ static bool8 CreateHofConfettiSprite(void) #define tTimer data[1] #define tConfettiCount data[15] -// Indexes into the data array of the struct OamUtil tracking confetti +// Indexes into the data array of the struct ConfettiUtil #define CONFETTI_SINE_IDX 0 #define CONFETTI_EXTRA_Y 1 #define CONFETTI_TASK_ID 7 @@ -1448,18 +1448,18 @@ static void StopDomeConfetti(void) if ((taskId = FindTaskIdByFunc(Task_DoDomeConfetti)) != 0xFF) DestroyTask(taskId); - OamUtil_Free(); + ConfettiUtil_Free(); FreeSpriteTilesByTag(TAG_CONFETTI); FreeSpritePaletteByTag(TAG_CONFETTI); } -static void UpdateDomeConfetti(struct OamUtil *oamUtil) +static void UpdateDomeConfetti(struct ConfettiUtil *util) { - if (oamUtil->yDelta > 110) + if (util->yDelta > 110) { // Destroy confetti after it falls far enough - gTasks[oamUtil->data[CONFETTI_TASK_ID]].tConfettiCount--; - OamUtil_Remove(oamUtil->id); + gTasks[util->data[CONFETTI_TASK_ID]].tConfettiCount--; + ConfettiUtil_Remove(util->id); } else { @@ -1467,16 +1467,16 @@ static void UpdateDomeConfetti(struct OamUtil *oamUtil) u8 sineIdx; s32 rand; - oamUtil->yDelta++; - oamUtil->yDelta += oamUtil->data[CONFETTI_EXTRA_Y]; + util->yDelta++; + util->yDelta += util->data[CONFETTI_EXTRA_Y]; - sineIdx = oamUtil->data[CONFETTI_SINE_IDX]; + sineIdx = util->data[CONFETTI_SINE_IDX]; rand = Random(); rand &= 3; rand += 8; - oamUtil->xDelta = (rand) * ((gSineTable[sineIdx])) / 256; + util->xDelta = (rand) * ((gSineTable[sineIdx])) / 256; - oamUtil->data[CONFETTI_SINE_IDX] += 4; + util->data[CONFETTI_SINE_IDX] += 4; } } @@ -1488,7 +1488,7 @@ static void Task_DoDomeConfetti(u8 taskId) switch (tState) { case 0: - if (!OamUtil_Init(64)) + if (!ConfettiUtil_Init(64)) { // Init failed DestroyTask(taskId); @@ -1503,7 +1503,7 @@ static void Task_DoDomeConfetti(u8 taskId) if (tTimer != 0 && tTimer % 3 == 0) { // Create new confetti every 3 frames - id = OamUtil_AddNew(&sOamData_Confetti, + id = ConfettiUtil_AddNew(&sOamData_Confetti, TAG_CONFETTI, TAG_CONFETTI, Random() % 240, @@ -1512,18 +1512,18 @@ static void Task_DoDomeConfetti(u8 taskId) id); if (id != 0xFF) { - OamUtil_SetCallback(id, UpdateDomeConfetti); + ConfettiUtil_SetCallback(id, UpdateDomeConfetti); // 1/4 of the confetti move an extra y coord every frame if ((Random() % 4) == 0) - OamUtil_SetData(id, CONFETTI_EXTRA_Y, 1); + ConfettiUtil_SetData(id, CONFETTI_EXTRA_Y, 1); - OamUtil_SetData(id, CONFETTI_TASK_ID, taskId); + ConfettiUtil_SetData(id, CONFETTI_TASK_ID, taskId); tConfettiCount++; } } - OamUtil_Update(); + ConfettiUtil_Update(); if (tTimer != 0) tTimer--; else if (tConfettiCount == 0) diff --git a/src/oam_util.c b/src/oam_util.c deleted file mode 100644 index bd1801a7d..000000000 --- a/src/oam_util.c +++ /dev/null @@ -1,218 +0,0 @@ -#include "global.h" -#include "oam_util.h" -#include "malloc.h" -#include "main.h" -#include "digit_obj_util.h" - -static EWRAM_DATA struct -{ - u8 count; - struct OamUtil *array; -} *sWork = NULL; - -static void sub_81520A8(void *dest, u16 value, u8 left, u8 top, u8 width, u8 height) // Unused. -{ - u8 i; - u8 j; - u8 x; - u8 y; - - for (i = 0, y = top; i < height; i++) - { - for (x = left, j = 0; j < width; j++) - { - *(u16 *)((dest) + (y * 64 + x * 2)) = value; - x = (x + 1) % 32; - } - y = (y + 1) % 32; - } -} - -static void sub_8152134(void *dest, const u16 *src, u8 left, u8 top, u8 width, u8 height) // Unused. -{ - u8 i; - u8 j; - u8 x; - u8 y; - const u16 *_src; - - for (i = 0, _src = src, y = top; i < height; i++) - { - for (x = left, j = 0; j < width; j++) - { - *(u16 *)((dest) + (y * 64 + x * 2)) = *(_src++); - x = (x + 1) % 32; - } - y = (y + 1) % 32; - } -} - -bool32 OamUtil_Init(u8 count) -{ - u8 i = 0; - - if (count == 0) - return FALSE; - if (count > 64) - count = 64; - - sWork = AllocZeroed(sizeof(*sWork)); - if (sWork == NULL) - return FALSE; - sWork->array = AllocZeroed(count * sizeof(struct OamUtil)); - if (sWork->array == NULL) - { - FREE_AND_SET_NULL(sWork); - return FALSE; - } - - sWork->count = count; - for (i = 0; i < count; i++) - { - memcpy(&sWork->array[i].oam, &gDummyOamData, sizeof(struct OamData)); - sWork->array[i].dummied = TRUE; - } - - return TRUE; -} - -bool32 OamUtil_Free(void) -{ - u8 i = 0; - - if (sWork == NULL) - return FALSE; - - for (i = 0; i < sWork->count; i++) - memcpy(&gMain.oamBuffer[i + 64], &gDummyOamData, sizeof(struct OamData)); - - memset(sWork->array, 0, sWork->count * sizeof(struct OamUtil)); - FREE_AND_SET_NULL(sWork->array); - memset(sWork, 0, sizeof(*sWork)); - FREE_AND_SET_NULL(sWork); - - return TRUE; -} - -bool32 OamUtil_Update(void) -{ - u8 i = 0; - - if (sWork == NULL || sWork->array == NULL) - return FALSE; - - for (i = 0; i < sWork->count; i++) - { - if (sWork->array[i].active && sWork->array[i].allowUpdates) - { - if (sWork->array[i].callback != NULL) - sWork->array[i].callback(&sWork->array[i]); - - if (sWork->array[i].dummied) - { - memcpy(&gMain.oamBuffer[i + 64], &gDummyOamData, sizeof(struct OamData)); - } - else - { - sWork->array[i].oam.y = sWork->array[i].y + sWork->array[i].yDelta; - sWork->array[i].oam.x = sWork->array[i].x + sWork->array[i].xDelta; - sWork->array[i].oam.priority = sWork->array[i].priority; - sWork->array[i].oam.tileNum = sWork->array[i].tileNum; - memcpy(&gMain.oamBuffer[i + 64], &sWork->array[i], sizeof(struct OamData)); - } - } - } - - return TRUE; -} - -static bool32 SetAnimAndTileNum(struct OamUtil *structPtr, u8 animNum) -{ - u16 tileStart; - - if (structPtr == NULL) - return FALSE; - - tileStart = GetSpriteTileStartByTag(structPtr->tileTag); - if (tileStart == 0xFFFF) - return FALSE; - - structPtr->animNum = animNum; - structPtr->tileNum = (GetTilesPerImage(structPtr->oam.shape, structPtr->oam.size) * animNum) + tileStart; - return TRUE; -} - -u8 OamUtil_SetCallback(u8 id, void (*func)(struct OamUtil *)) -{ - if (sWork == NULL || id >= sWork->count) - return 0xFF; - else if (!sWork->array[id].active) - return 0xFF; - - sWork->array[id].callback = func; - return id; -} - -u8 OamUtil_SetData(u8 id, u8 dataArrayId, s16 dataValue) -{ - if (sWork == NULL || id >= sWork->count) - return 0xFF; - else if (!sWork->array[id].active || dataArrayId > ARRAY_COUNT(sWork->array[id].data) - 1) // - 1 b/c last slot is reserved for taskId - return 0xFF; - - sWork->array[id].data[dataArrayId] = dataValue; - return id; -} - -u8 OamUtil_AddNew(const struct OamData *oam, u16 tileTag, u16 palTag, s16 x, s16 y, u8 animNum, u8 priority) -{ - struct OamUtil *structPtr = NULL; - u8 i; - - if (sWork == NULL || oam == NULL) - return 0xFF; - - for (i = 0; i < sWork->count; i++) - { - if (!sWork->array[i].active) - { - structPtr = &sWork->array[i]; - memset(structPtr, 0, sizeof(*structPtr)); - structPtr->id = i; - structPtr->active = TRUE; - structPtr->allowUpdates = TRUE; - break; - } - } - - if (structPtr == NULL) - return 0xFF; - - memcpy(&structPtr->oam, oam, sizeof(*oam)); - structPtr->tileTag = tileTag; - structPtr->palTag = palTag; - structPtr->x = x; - structPtr->y = y; - structPtr->oam.paletteNum = IndexOfSpritePaletteTag(palTag); - if (priority < 4) - { - structPtr->priority = priority; - structPtr->oam.priority = priority; - } - SetAnimAndTileNum(structPtr, animNum); - - return structPtr->id; -} - -u8 OamUtil_Remove(u8 id) -{ - if (sWork == NULL || !sWork->array[id].active) - return 0xFF; - - memset(&sWork->array[id], 0, sizeof(struct OamUtil)); - sWork->array[id].oam.y = 160; - sWork->array[id].oam.x = 240; - sWork->array[id].dummied = TRUE; - memcpy(&gMain.oamBuffer[id + 64], &gDummyOamData, sizeof(struct OamData)); - return id; -} diff --git a/sym_ewram.txt b/sym_ewram.txt index e99d90a1d..03b5d43b1 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -103,7 +103,7 @@ .include "src/battle_transition.o" .include "src/battle_message.o" .include "src/cable_car.o" - .include "src/oam_util.o" + .include "src/confetti_util.o" .include "src/save.o" .include "src/mystery_event_script.o" .include "src/move_relearner.o" -- cgit v1.2.3 From 3264cf697f5fe996c2a79c6c34181c186fe2f96e Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Sat, 9 May 2020 14:49:51 +0200 Subject: fix aggressive loop optimizations Previously, aggressive loop optimizations with a new compiler were not possible due to undefined behaviour at end of arrays. A macro "UBFIX" is added to allow ifdefs for fixes which resolve undefined behavior. For example newer GCC versions will detect various bugs in the original game code and will otherwise not compile with -Werror. --- Makefile | 4 ++-- include/config.h | 8 ++++++++ include/global.tv.h | 7 +++++++ src/berry_blender.c | 5 +++++ src/berry_crush.c | 5 +++++ src/easy_chat.c | 5 +++++ src/fieldmap.c | 7 +++++++ src/image_processing_effects.c | 44 +++++++++++++++++++++--------------------- src/slot_machine.c | 23 ++++++++++------------ src/tv.c | 16 +++++++-------- 10 files changed, 79 insertions(+), 45 deletions(-) diff --git a/Makefile b/Makefile index 27d77754c..53a2c7f25 100644 --- a/Makefile +++ b/Makefile @@ -67,7 +67,7 @@ OBJ_DIR := build/emerald LIBPATH := -L ../../tools/agbcc/lib else CC1 = $(shell $(CC) --print-prog-name=cc1) -quiet -override CFLAGS += -mthumb -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -fno-aggressive-loop-optimizations -Wno-pointer-to-int-cast +override CFLAGS += -mthumb -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast ROM := pokeemerald_modern.gba OBJ_DIR := build/modern LIBPATH := -L "$(dir $(shell $(CC) -mthumb -print-file-name=libgcc.a))" -L "$(dir $(shell $(CC) -mthumb -print-file-name=libc.a))" @@ -232,7 +232,7 @@ $(C_BUILDDIR)/record_mixing.o: CFLAGS += -ffreestanding $(C_BUILDDIR)/librfu_intr.o: CC1 := tools/agbcc/bin/agbcc_arm $(C_BUILDDIR)/librfu_intr.o: CFLAGS := -O2 -mthumb-interwork -quiet else -$(C_BUILDDIR)/librfu_intr.o: CFLAGS := -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -fno-aggressive-loop-optimizations -Wno-pointer-to-int-cast +$(C_BUILDDIR)/librfu_intr.o: CFLAGS := -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast endif ifeq ($(NODEP),1) diff --git a/include/config.h b/include/config.h index 318ed39d8..4f97a12a3 100644 --- a/include/config.h +++ b/include/config.h @@ -26,4 +26,12 @@ #define UNITS_METRIC #endif +// Various undefined behavior bugs may or may not prevent compilation with +// newer compilers. So always fix them when using a modern compiler. +#if MODERN +#ifndef UBFIX +#define UBFIX +#endif +#endif + #endif // GUARD_CONFIG_H diff --git a/include/global.tv.h b/include/global.tv.h index 34791d43c..ba1c3c37e 100644 --- a/include/global.tv.h +++ b/include/global.tv.h @@ -18,6 +18,13 @@ typedef union // size = 0x24 /*0x23*/ u8 trainerIdHi; } common; + // Common init (used for initialization loop) + struct { + /*0x00*/ u8 kind; + /*0x01*/ bool8 active; + /*0x02*/ u8 pad02[34]; + } commonInit; + // Local shows // TVSHOW_FAN_CLUB_LETTER struct { diff --git a/src/berry_blender.c b/src/berry_blender.c index 2a122541d..4d3b7eb6f 100644 --- a/src/berry_blender.c +++ b/src/berry_blender.c @@ -2202,6 +2202,11 @@ static s16 sub_8081BD4(void) return sUnknown_03000E06; } +#if MODERN +// TODO remove this as soon as the code below is understood +// add a UBFIX if required (code buggy?) +__attribute__((optimize("no-aggressive-loop-optimizations"))) +#endif static void Blender_CalculatePokeblock(struct BlenderBerry *berries, struct Pokeblock *pokeblock, u8 playersNo, u8 *flavors, u16 maxRPM) { s32 i, j; diff --git a/src/berry_crush.c b/src/berry_crush.c index 48e4ac4c3..48ad7f4e3 100755 --- a/src/berry_crush.c +++ b/src/berry_crush.c @@ -3209,6 +3209,11 @@ static u32 sub_8024568(__attribute__((unused)) struct BerryCrushGame *r0, __attr return 0; } +#if MODERN +// TODO remove this as soon as the code below is understood +// add a UBFIX if required (code buggy?) +__attribute__((optimize("no-aggressive-loop-optimizations"))) +#endif void sub_8024578(struct BerryCrushGame *r4) { u8 r5 = 0; diff --git a/src/easy_chat.c b/src/easy_chat.c index 1bdb3fdc0..2a4c49213 100644 --- a/src/easy_chat.c +++ b/src/easy_chat.c @@ -5273,12 +5273,17 @@ void InitEasyChatPhrases(void) gSaveBlock1Ptr->mail[i].words[j] = 0xFFFF; } +#ifndef UBFIX // BUG: This is supposed to clear 64 bits, but this loop is clearing 64 bytes. // However, this bug has no resulting effect on gameplay because only the // Mauville old man data is corrupted, which is initialized directly after // this function is called when starting a new game. for (i = 0; i < 64; i++) gSaveBlock1Ptr->additionalPhrases[i] = 0; +#else + for (i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->additionalPhrases); i++) + gSaveBlock1Ptr->additionalPhrases[i] = 0; +#endif } static bool8 sub_811F28C(void) diff --git a/src/fieldmap.c b/src/fieldmap.c index e953e0f93..25157ebb1 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -533,9 +533,16 @@ static bool32 SavedMapViewIsEmpty(void) u16 i; u32 marker = 0; +#ifndef UBFIX // BUG: This loop extends past the bounds of the mapView array. Its size is only 0x100. for (i = 0; i < 0x200; i++) marker |= gSaveBlock1Ptr->mapView[i]; +#else + // UBFIX: Only iterate over 0x100 + for (i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->mapView); i++) + marker |= gSaveBlock1Ptr->mapView[i]; +#endif + if (marker == 0) return TRUE; diff --git a/src/image_processing_effects.c b/src/image_processing_effects.c index 13794faf0..cbd8b9b37 100644 --- a/src/image_processing_effects.c +++ b/src/image_processing_effects.c @@ -5,7 +5,7 @@ // IWRAM common u8 gCanvasColumnStart; -u16 (*gCanvasPixels)[][32]; +u16 *gCanvasPixels; u8 gCanvasRowEnd; u8 gCanvasHeight; u8 gCanvasColumnEnd; @@ -125,7 +125,7 @@ static void ApplyImageEffect_RedChannelGrayscale(u8 delta) for (j = 0; j < gCanvasRowEnd; j++) { - u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixelRow = &gCanvasPixels[(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { @@ -150,7 +150,7 @@ static void ApplyImageEffect_RedChannelGrayscaleHighlight(u8 highlight) for (j = 0; j < gCanvasRowEnd; j++) { - u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixelRow = &gCanvasPixels[(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { @@ -179,7 +179,7 @@ static void ApplyImageEffect_Grayscale(void) for (j = 0; j < gCanvasRowEnd; j++) { - u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixelRow = &gCanvasPixels[(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { @@ -195,7 +195,7 @@ static void ApplyImageEffect_Blur(void) for (i = 0; i < gCanvasColumnEnd; i++) { - u16 *pixelRow = &(*gCanvasPixels)[0][gCanvasRowStart * gCanvasWidth]; + u16 *pixelRow = &gCanvasPixels[gCanvasRowStart * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart + i]; u16 prevPixel = *pixel; @@ -221,7 +221,7 @@ static void ApplyImageEffect_PersonalityColor(u8 personality) for (j = 0; j < gCanvasRowEnd; j++) { - u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixelRow = &gCanvasPixels[(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { @@ -237,7 +237,7 @@ static void ApplyImageEffect_BlackAndWhite(void) for (j = 0; j < gCanvasRowEnd; j++) { - u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixelRow = &gCanvasPixels[(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { @@ -255,7 +255,7 @@ static void ApplyImageEffect_BlackOutline(void) // Handle top row of pixels first. for (j = 0; j < gCanvasRowEnd; j++) { - u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixelRow = &gCanvasPixels[(gCanvasRowStart + j) * gCanvasWidth]; pixel = &pixelRow[gCanvasColumnStart]; *pixel = QuantizePixel_BlackOutline(pixel, pixel + 1); for (i = 1, pixel++; i < gCanvasColumnEnd - 1; i++, pixel++) @@ -270,7 +270,7 @@ static void ApplyImageEffect_BlackOutline(void) // Handle each column from left to right. for (i = 0; i < gCanvasColumnEnd; i++) { - u16 *pixelRow = &(*gCanvasPixels)[0][gCanvasRowStart * gCanvasWidth]; + u16 *pixelRow = &gCanvasPixels[gCanvasRowStart * gCanvasWidth]; pixel = &pixelRow[gCanvasColumnStart + i]; *pixel = QuantizePixel_BlackOutline(pixel, pixel + gCanvasWidth); for (j = 1, pixel += gCanvasWidth; j < gCanvasRowEnd - 1; j++, pixel += gCanvasWidth) @@ -289,7 +289,7 @@ static void ApplyImageEffect_Invert(void) for (j = 0; j < gCanvasRowEnd; j++) { - u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixelRow = &gCanvasPixels[(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { @@ -306,7 +306,7 @@ static void ApplyImageEffect_Shimmer(void) u16 prevPixel; // First, invert all of the colors. - pixel = (*gCanvasPixels)[0]; + pixel = gCanvasPixels; for (i = 0; i < 64; i++) { for (j = 0; j < 64; j++, pixel++) @@ -319,7 +319,7 @@ static void ApplyImageEffect_Shimmer(void) // Blur the pixels twice. for (j = 0; j < 64; j++) { - pixel = &(*gCanvasPixels)[0][j]; + pixel = &gCanvasPixels[j]; prevPixel = *pixel; *pixel = 0x8000; for (i = 1, pixel += 64; i < 63; i++, pixel += 64) @@ -332,7 +332,7 @@ static void ApplyImageEffect_Shimmer(void) } *pixel = 0x8000; - pixel = &(*gCanvasPixels)[0][j]; + pixel = &gCanvasPixels[j]; prevPixel = *pixel; *pixel = 0x8000; for (i = 1, pixel += 64; i < 63; i++, pixel += 64) @@ -350,7 +350,7 @@ static void ApplyImageEffect_Shimmer(void) // Finally, invert colors back to the original color space. // The above blur causes the outline areas to darken, which makes // this inversion give the effect of light outlines. - pixel = (*gCanvasPixels)[0]; + pixel = gCanvasPixels; for (i = 0; i < 64; i++) { for (j = 0; j < 64; j++, pixel++) @@ -367,7 +367,7 @@ static void ApplyImageEffect_BlurRight(void) for (j = 0; j < gCanvasRowEnd; j++) { - u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixelRow = &gCanvasPixels[(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; u16 prevPixel = *pixel; for (i = 1, pixel++; i < gCanvasColumnEnd - 1; i++, pixel++) @@ -387,7 +387,7 @@ static void ApplyImageEffect_BlurDown(void) for (i = 0; i < gCanvasColumnEnd; i++) { - u16 *pixelRow = &(*gCanvasPixels)[0][gCanvasRowStart * gCanvasWidth]; + u16 *pixelRow = &gCanvasPixels[gCanvasRowStart * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart + i]; u16 prevPixel = *pixel; for (j = 1, pixel += gCanvasWidth; j < gCanvasRowEnd - 1; j++, pixel += gCanvasWidth) @@ -445,7 +445,7 @@ static void AddPointillismPoints(u16 arg0) for (i = 0; i < points[0].delta; i++) { - u16 *pixel = &(*gCanvasPixels)[points[i].row * 2][points[i].column]; + u16 *pixel = &gCanvasPixels[points[i].row * 64] + points[i].column; if (!(0x8000 & *pixel)) { @@ -910,7 +910,7 @@ static void QuantizePalette_Standard(bool8 useLimitedPalette) gCanvasPalette[maxIndex] = RGB2(15, 15, 15); for (j = 0; j < gCanvasRowEnd; j++) { - u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixelRow = &gCanvasPixels[(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { @@ -978,7 +978,7 @@ static void QuantizePalette_BlackAndWhite(void) for (j = 0; j < gCanvasRowEnd; j++) { - u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixelRow = &gCanvasPixels[(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { @@ -1009,7 +1009,7 @@ static void QuantizePalette_GrayscaleSmall(void) for (j = 0; j < gCanvasRowEnd; j++) { - u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixelRow = &gCanvasPixels[(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { @@ -1027,7 +1027,7 @@ static void QuantizePalette_Grayscale(void) for (j = 0; j < gCanvasRowEnd; j++) { - u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixelRow = &gCanvasPixels[(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { @@ -1045,7 +1045,7 @@ static void QuantizePalette_PrimaryColors(void) for (j = 0; j < gCanvasRowEnd; j++) { - u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixelRow = &gCanvasPixels[(gCanvasRowStart + j) * gCanvasWidth]; u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { diff --git a/src/slot_machine.c b/src/slot_machine.c index 9e94d11f0..d1cb05b18 100644 --- a/src/slot_machine.c +++ b/src/slot_machine.c @@ -384,7 +384,7 @@ static const u16 gSlotPayouts[]; static const u8 *const gUnknown_083EDCE4; static const u8 *const gUnknown_083EDCDC; static const u32 gReelTimeGfx[]; -static const struct SpriteSheet gSlotMachineSpriteSheets[]; +static const struct SpriteSheet gSlotMachineSpriteSheets[22]; static const struct SpritePalette gSlotMachineSpritePalettes[]; static const u16 *const gUnknown_083EDE20; static const s16 gInitialReelPositions[][2]; @@ -4171,8 +4171,8 @@ static void sub_81063C0(void) LZDecompressWram(gSlotMachineReelTime_Gfx, sUnknown_0203AAD4); sUnknown_0203AAD8 = Alloc(0x3600); LZDecompressWram(gReelTimeGfx, sUnknown_0203AAD8); - sUnknown_0203AB30 = AllocZeroed(sizeof(struct SpriteSheet) * 22); - for (i = 0; i < 22; i++) + sUnknown_0203AB30 = AllocZeroed(sizeof(struct SpriteSheet) * ARRAY_COUNT(gSlotMachineSpriteSheets)); + for (i = 0; i < ARRAY_COUNT(gSlotMachineSpriteSheets); i++) { sUnknown_0203AB30[i].data = gSlotMachineSpriteSheets[i].data; sUnknown_0203AB30[i].size = gSlotMachineSpriteSheets[i].size; @@ -6708,7 +6708,7 @@ static const struct SubspriteTable *const gUnknown_083EDBC4[] = NULL }; -static const struct SpriteSheet gSlotMachineSpriteSheets[] = +static const struct SpriteSheet gSlotMachineSpriteSheets[22] = { { .data = gSlotMachineReelSymbol1Tiles, .size = 0x200, .tag = 0 }, { .data = gSlotMachineReelSymbol2Tiles, .size = 0x200, .tag = 1 }, @@ -6727,15 +6727,12 @@ static const struct SpriteSheet gSlotMachineSpriteSheets[] = { .data = gSlotMachineNumber7Tiles, .size = 0x40, .tag = 14 }, { .data = gSlotMachineNumber8Tiles, .size = 0x40, .tag = 15 }, { .data = gSlotMachineNumber9Tiles, .size = 0x40, .tag = 16 }, -}; - -static const u8 sUnused1[][8] = -{ - {0, 0, 0, 0, 0, 2, 18}, - {0, 0, 0, 0, 0, 2, 19}, - {0, 0, 0, 0, 0, 3, 20}, - {0, 0, 0, 0, 0, 3, 21}, - {0, 0, 0, 0, 0, 0, 0} + // the data for these sheets is determined at runtime + { .data = NULL, .size = 0x200, .tag = 18 }, + { .data = NULL, .size = 0x200, .tag = 19 }, + { .data = NULL, .size = 0x300, .tag = 20 }, + { .data = NULL, .size = 0x300, .tag = 21 }, + {}, }; static const u8 *const gUnknown_083EDCDC = gUnknown_08DD19F8; diff --git a/src/tv.c b/src/tv.c index eaf30f82b..b3722e87a 100644 --- a/src/tv.c +++ b/src/tv.c @@ -764,11 +764,11 @@ void ClearTVShowData(void) for (i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->tvShows); i ++) { - gSaveBlock1Ptr->tvShows[i].common.kind = 0; - gSaveBlock1Ptr->tvShows[i].common.active = 0; - for (j = 0; j < sizeof(TVShow) - 2; j ++) + gSaveBlock1Ptr->tvShows[i].commonInit.kind = 0; + gSaveBlock1Ptr->tvShows[i].commonInit.active = 0; + for (j = 0; j < ARRAY_COUNT(gSaveBlock1Ptr->tvShows[i].commonInit.pad02); j ++) { - gSaveBlock1Ptr->tvShows[i].common.pad02[j] = 0; + gSaveBlock1Ptr->tvShows[i].commonInit.pad02[j] = 0; } } ClearPokemonNews(); @@ -3167,11 +3167,11 @@ void DeleteTVShowInArrayByIdx(TVShow *shows, u8 idx) { u8 i; - shows[idx].common.kind = TVSHOW_OFF_AIR; - shows[idx].common.active = FALSE; - for (i = 0; i < 34; i ++) + shows[idx].commonInit.kind = TVSHOW_OFF_AIR; + shows[idx].commonInit.active = FALSE; + for (i = 0; i < ARRAY_COUNT(shows[idx].commonInit.pad02); i++) { - shows[idx].common.pad02[i] = 0; + shows[idx].commonInit.pad02[i] = 0; } } -- cgit v1.2.3 From 938aec45d32eef8f4a6894e1c4cc19ffccc85543 Mon Sep 17 00:00:00 2001 From: PokeCodec <67983839+PokeCodec@users.noreply.github.com> Date: Tue, 7 Jul 2020 20:22:06 -0400 Subject: Match CreatePokeDexList Cherry-picked from the pret Ruby repo --- src/pokedex.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/pokedex.c b/src/pokedex.c index c3d38681c..d2e1a0666 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -2218,18 +2218,14 @@ static void CreatePokedexList(u8 dexMode, u8 order) } else { - bool32 r10; - s16 r5; - - r10 = r5 = i = 0; - for (i = 0; i < temp_dexCount; i++) + s16 r5, r10; + for (i = 0, r5 = 0, r10 = 0; i < temp_dexCount; i++) { temp_dexNum = i + 1; if (GetSetPokedexFlag(temp_dexNum, FLAG_GET_SEEN)) r10 = 1; if (r10) { - asm(""); //Needed to match for some reason sPokedexView->pokedexList[r5].dexNum = temp_dexNum; sPokedexView->pokedexList[r5].seen = GetSetPokedexFlag(temp_dexNum, FLAG_GET_SEEN); sPokedexView->pokedexList[r5].owned = GetSetPokedexFlag(temp_dexNum, FLAG_GET_CAUGHT); -- cgit v1.2.3