diff --git a/generated/text_banks.txt b/generated/text_banks.txt index a59a227f78..baf65be396 100644 --- a/generated/text_banks.txt +++ b/generated/text_banks.txt @@ -637,7 +637,7 @@ TEXT_BANK_UNION_ROOM TEXT_BANK_UNDERGROUND_NPCS TEXT_BANK_UNDERGROUND_DECORATE_BASE TEXT_BANK_UNDERGROUND_CAPTURE_FLAG -TEXT_BANK_UNDERGROUND_BASE_PC +TEXT_BANK_UNDERGROUND_PC TEXT_BANK_UNDERGROUND_RECORDS TEXT_BANK_DUMMY_0641 TEXT_BANK_ROUTE_226 diff --git a/include/comm_player_manager.h b/include/comm_player_manager.h index b7d2122917..6100e8b06b 100644 --- a/include/comm_player_manager.h +++ b/include/comm_player_manager.h @@ -21,7 +21,7 @@ enum PauseBit { PAUSE_BIT_3 = 1 << 3, PAUSE_BIT_TRAPS = 1 << 4, PAUSE_BIT_5 = 1 << 5, - PAUSE_BIT_6 = 1 << 6, + PAUSE_BIT_LINK_PC = 1 << 6, PAUSE_BIT_RADAR = 1 << 7, }; @@ -59,7 +59,7 @@ typedef struct CommPlayerManager { u8 moveTimer[MAX_CONNECTED_PLAYERS]; UnkStruct_ov23_0224ABC4 unk_14A[8 + 1]; TrainerInfo *unk_27C[5]; - TrainerInfo *unk_290[MAX_CONNECTED_PLAYERS]; + TrainerInfo *heldFlagOwnerInfo[MAX_CONNECTED_PLAYERS]; u16 unk_2B0; u16 unk_2B2; u8 unk_2B4[4]; diff --git a/include/overlay023/funcptr_ov23_022431EC.h b/include/overlay023/funcptr_ov23_022431EC.h deleted file mode 100644 index 5d5e40a3ac..0000000000 --- a/include/overlay023/funcptr_ov23_022431EC.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef POKEPLATINUM_FUNCPTR_OV23_022431EC_H -#define POKEPLATINUM_FUNCPTR_OV23_022431EC_H - -#include "sys_task_manager.h" - -typedef void (*UnkFuncPtr_ov23_022431EC)(SysTask *, void *); - -#endif // POKEPLATINUM_FUNCPTR_OV23_022431EC_H diff --git a/include/overlay023/ov23_02241F74.h b/include/overlay023/ov23_02241F74.h index d151741276..672fa35877 100644 --- a/include/overlay023/ov23_02241F74.h +++ b/include/overlay023/ov23_02241F74.h @@ -4,7 +4,6 @@ #include "struct_decls/struct_02029894_decl.h" #include "field/field_system_decl.h" -#include "overlay023/funcptr_ov23_022431EC.h" #include "overlay023/underground_defs.h" #include "overlay023/underground_text_printer.h" @@ -13,16 +12,18 @@ #include "sys_task_manager.h" #include "trainer_info.h" +typedef void (*EndSysTaskFunc)(SysTask *sysTask, void *ctx); + enum UndergroundStoredPosKeys { UNDERGROUND_STORED_POS_NONE = 0, - UNDERGROUND_STORED_POS_KEY_1, + UNDERGROUND_STORED_POS_KEY_PC, UNDERGROUND_STORED_POS_KEY_START_MENU, UNDERGROUND_STORED_POS_KEY_3, }; enum UndergroundMenuKeys { - UNDERGROUND_MENU_KEY_2 = 2, - UNDERGROUND_MENU_KEY_6 = 6, + UNDERGROUND_MENU_KEY_STORE_GOODS = 2, + UNDERGROUND_MENU_KEY_WITHDRAW_GOODS = 6, UNDERGROUND_MENU_KEY_TRAPS = 8, UNDERGROUND_MENU_KEY_SPHERES, UNDERGROUND_MENU_KEY_GOODS, @@ -35,8 +36,8 @@ enum UndergroundMenuKeys { UNDERGROUND_MENU_KEY_17, UNDERGROUND_MENU_KEY_18, UNDERGROUND_MENU_KEY_19, - UNDERGROUND_MENU_KEY_22 = 22, - UNDERGROUND_MENU_KEY_23 + UNDERGROUND_MENU_KEY_PC_RADAR = 22, + UNDERGROUND_MENU_KEY_PC }; #define BIT_TRAPS_FULL 1 << 4 @@ -81,9 +82,9 @@ int ov23_02242EE0(int param0); int ov23_02242F48(int param0); void ov23_02242FA8(void); void ov23_02242FBC(void); -void ov23_02242FD0(void); -void ov23_02242FE4(void); -void ov23_02242FF8(void); +void CommManUnderground_SetSphereRadarActive(void); +void CommManUnderground_SetTrapRadarActive(void); +void CommManUnderground_SetTreasureRadarActive(void); void ov23_0224300C(int param0, int param1); void ov23_02243020(int param0); void UndergroundMan_SetReturnLog(int param0); @@ -93,8 +94,8 @@ void CommManUnderground_StoreCursorAndListPos(u16 menuKey, u16 cursorPos, u16 li u16 CommManUnderground_GetStoredListPos(u16 menuKey); u16 CommManUnderground_GetStoredCursorPos(u16 menuKey); void ov23_022431C4(int param0, int param1, void *param2, void *param3); -void ov23_022431EC(void *param0, SysTask *param1, UnkFuncPtr_ov23_022431EC param2); -void ov23_02243204(void); +void CommManUnderground_SetCurrentSysTask(void *ctx, SysTask *sysTask, EndSysTaskFunc endFunc); +void CommManUnderground_ClearCurrentSysTaskInfo(void); BOOL ov23_0224321C(void); BOOL ov23_02243298(int param0); void ov23_02243360(void); diff --git a/include/overlay023/ov23_0224A1D0.h b/include/overlay023/ov23_0224A1D0.h index 756267d1c6..394fa0ba43 100644 --- a/include/overlay023/ov23_0224A1D0.h +++ b/include/overlay023/ov23_0224A1D0.h @@ -38,8 +38,8 @@ void ov23_RevertPlayerStatusToNormal(int netID); void ov23_0224ADB0(int param0, int param1, int param2, int param3); void ov23_0224ADE8(int param0, int param1, int param2, int param3); BOOL ov23_0224AE60(int param0); -BOOL ov23_0224AEA4(int param0); -BOOL ov23_0224AEC4(int param0, int param1); +BOOL ov23_IsPlayerHoldingFlag(int param0); +BOOL ov23_TryTakeFlag(int param0, int param1); void ov23_0224AF4C(int param0); void ov23_0224AF7C(int param0); void ov23_ShowExclamationEmote(int netID); diff --git a/include/overlay023/ov23_0225128C.h b/include/overlay023/ov23_0225128C.h deleted file mode 100644 index 5ed3d07dfa..0000000000 --- a/include/overlay023/ov23_0225128C.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef POKEPLATINUM_OV23_0225128C_H -#define POKEPLATINUM_OV23_0225128C_H - -#include "overlay023/underground_defs.h" -#include "overlay023/underground_menu.h" - -void UndergroundMenu_UpdateScrollPrompts(UndergroundMenu *menu, int listPos, int count, int maxDisplay); -int ov23_022512D4(Coordinates *param0, int param1); -BOOL ov23_02251324(int param0, Coordinates *param1); -void ov23_022513B0(int param0, int param1, void *param2, void *param3); -int ov23_02251414(void); -void ov23_0225215C(int param0, int param1, void *param2, void *param3); -void ov23_02252178(int param0, int param1, void *param2, void *param3); - -#endif // POKEPLATINUM_OV23_0225128C_H diff --git a/include/overlay023/ov23_022521F0.h b/include/overlay023/ov23_022521F0.h index f373bab03d..94907b4082 100644 --- a/include/overlay023/ov23_022521F0.h +++ b/include/overlay023/ov23_022521F0.h @@ -11,9 +11,9 @@ void ov23_02252CD4(void); void ov23_02252CE0(int param0, int param1); void ov23_02252CF4(int param0, int param1); void ov23_02252D08(int param0, int param1); -void ov23_02252D74(UndergroundMenu *param0, int param1); -void ov23_02252DF4(UndergroundMenu *param0); -void ov23_02252E18(UndergroundMenu *param0); +void UndergroundMenu_PrintMenuDescription(UndergroundMenu *param0, int param1); +void UndergroundMenu_RemoveDescriptionWindow(UndergroundMenu *param0); +void UndergroundMenu_RemoveDescriptionWindowInstant(UndergroundMenu *param0); void ov23_022534A0(FieldSystem *fieldSystem); #endif // POKEPLATINUM_OV23_022521F0_H diff --git a/include/overlay023/underground_menu.h b/include/overlay023/underground_menu.h index a0b9e97fe1..2fe77f4a00 100644 --- a/include/overlay023/underground_menu.h +++ b/include/overlay023/underground_menu.h @@ -40,7 +40,7 @@ typedef struct UndergroundMenu { FieldSystem *fieldSystem; Window primaryWindow; Window secondaryWindow; - Window unk_30; + Window menuDescriptionWindow; StringList *menuOptions; StringList *itemSelectedOptions; ListMenu *unk_48; @@ -113,11 +113,12 @@ void UndergroundMenu_StartHoldingFlag(ExitCallback exitCallback, FieldSystem *fi void UndergroundMenu_PrintGoodDescription(ListMenu *listMenu, u32 index, u8 onInit); void ov23_02250CB0(UndergroundMenu *menu); void UndergroundMenu_OpenGoodsMenu(UndergroundMenu *menu); -void ov23_02250D2C(UndergroundMenu *menu); -void ov23_02250D5C(UndergroundMenu *menu); -void UndergroundMenu_ExitGiftMenu(void *data, u32 input); +void UndergroundMenu_OpenStoreGoodsMenu(UndergroundMenu *menu); +void UndergroundMenu_OpenWithdrawGoodsMenu(UndergroundMenu *menu); +void UndergroundMenu_Exit(void *data, u32 input); void *UndergroundMenu_StartGiftMenu(ExitCallback exitCallback, FieldSystem *fieldSystem); void UndergroundMenu_MoveListCursorPosInBounds(UndergroundMenu *menu, int maxDisplay, int count); -void ov23_02251270(SysTask *sysTask, void *param1); +void UndergroundMenu_ResetBrightnessAndExit(SysTask *sysTask, void *data); +void UndergroundMenu_UpdateScrollPrompts(UndergroundMenu *menu, int listPos, int count, int maxDisplay); #endif // POKEPLATINUM_OV23_0224F294_H diff --git a/include/overlay023/underground_pc.h b/include/overlay023/underground_pc.h new file mode 100644 index 0000000000..4bec92cc7e --- /dev/null +++ b/include/overlay023/underground_pc.h @@ -0,0 +1,16 @@ +#ifndef POKEPLATINUM_UNDERGROUND_PC_H +#define POKEPLATINUM_UNDERGROUND_PC_H + +#include "overlay023/underground_defs.h" +#include "overlay023/underground_menu.h" + +#define PC_NONE 0xFF + +int UndergroundPC_GetPCAtCoordinates(Coordinates *coordinates, int dir); +BOOL UndergroundPC_TryUsePC(int netID, Coordinates *coordinates); +void UndergroundPC_ProcessPCInteraction(int unused0, int unused1, void *data, void *data2); +int CommPacketSizeOf_PCInteraction(void); +void UndergroundPC_ProcessTakeFlagAttempt(int unused0, int unused1, void *data, void *unused3); +void UndergroundPC_ProcessTakenFlag(int unused0, int unused1, void *data, void *unused3); + +#endif // POKEPLATINUM_UNDERGROUND_PC_H diff --git a/include/player_avatar.h b/include/player_avatar.h index a957869d3b..182607e0b7 100644 --- a/include/player_avatar.h +++ b/include/player_avatar.h @@ -57,7 +57,7 @@ void sub_0205EB08(PlayerAvatar *playerAvatar, int param1); int PlayerAvatar_MoveState(const PlayerAvatar *playerAvatar); void sub_0205EB10(PlayerAvatar *playerAvatar, int param1); int Player_MoveState(const PlayerAvatar *playerAvatar); -void PlayerAvatar_SetHidden(PlayerAvatar *playerAvatar, int param1); +void PlayerAvatar_SetVisible(PlayerAvatar *playerAvatar, BOOL hidden); void PlayerAvatar_SetMapObject(PlayerAvatar *playerAvatar, MapObject *param1); MapObject *Player_MapObject(PlayerAvatar *playerAvatar); const MapObject *PlayerAvatar_ConstMapObject(const PlayerAvatar *playerAvatar); diff --git a/include/struct_defs/underground_record.h b/include/struct_defs/underground_record.h index b3e0786589..d1e8c07d7d 100644 --- a/include/struct_defs/underground_record.h +++ b/include/struct_defs/underground_record.h @@ -13,7 +13,7 @@ typedef struct UndergroundRecord { u32 numTrapsTriggered : 20; u32 numPlayersHelped : 20; u32 numGiftsReceived : 20; - u32 unk_2C_0 : 20; + u32 timesFlagTaken : 20; u32 unk_30_0 : 20; u32 unk_34_0 : 20; u32 capturedFlagCount : 20; diff --git a/include/unk_0202854C.h b/include/unk_0202854C.h index e0dfb78e03..9ca2dea48f 100644 --- a/include/unk_0202854C.h +++ b/include/unk_0202854C.h @@ -127,8 +127,8 @@ int UndergroundRecord_GetNumPlayersHelped(const UndergroundRecord *undergroundRe void UndergroundRecord_IncrementNumPlayersHelped(UndergroundRecord *undergroundRecord); int UndergroundRecord_GetGiftsReceived(const UndergroundRecord *undergroundRecord); void UndergroundRecord_IncrementGiftsReceived(UndergroundRecord *undergroundRecord); -int sub_020297AC(const UndergroundRecord *param0); -void sub_020297B4(UndergroundRecord *param0); +int UndergroundRecord_GetTimesFlagTaken(const UndergroundRecord *undergroundRecord); +void UndergroundRecord_IncrementTimesFlagTaken(UndergroundRecord *undergroundRecord); int sub_020297E4(const UndergroundRecord *param0); void sub_020297EC(UndergroundRecord *param0); int sub_0202981C(const UndergroundRecord *param0); diff --git a/include/unk_02033200.h b/include/unk_02033200.h index f0e67379f8..c2c26e4983 100644 --- a/include/unk_02033200.h +++ b/include/unk_02033200.h @@ -31,7 +31,7 @@ void sub_020339AC(int param0, TrainerInfo *param1); BOOL sub_020339E8(u16 param0); void sub_02033A5C(void); void sub_02033D94(u16 param0); -BOOL sub_02033DFC(void); +BOOL CommServerClient_IsInClosedSecretBase(void); BOOL CommServerClient_IsInitialized(void); BOOL sub_02033E30(void); BOOL CommServerClient_IsClientConnecting(void); diff --git a/platinum.us/main.lsf b/platinum.us/main.lsf index 8bf5b88d62..6a40b2d89d 100644 --- a/platinum.us/main.lsf +++ b/platinum.us/main.lsf @@ -851,7 +851,7 @@ Overlay overlay23 Object main.nef.p/src_overlay023_ov23_0224B05C.c.o Object main.nef.p/src_overlay023_underground_player_talk.c.o Object main.nef.p/src_overlay023_underground_menu.c.o - Object main.nef.p/src_overlay023_ov23_0225128C.c.o + Object main.nef.p/src_overlay023_underground_pc.c.o Object main.nef.p/src_overlay023_ov23_022521F0.c.o Object main.nef.p/src_overlay023_ov23_02253598.c.o Object main.nef.p/src_overlay023_underground_text_printer.c.o diff --git a/res/text/underground_capture_flag.json b/res/text/underground_capture_flag.json index eb05ad3deb..5f50a15da1 100644 --- a/res/text/underground_capture_flag.json +++ b/res/text/underground_capture_flag.json @@ -48,14 +48,14 @@ ] }, { - "id": "pl_msg_00000638_00008", + "id": "UndergroundCaptureFlag_Text_YouObtainedFlag", "en_US": [ "You’ve obtained the Flag\n", "from {STRVAR_1 1, 0, 0}’s Base!" ] }, { - "id": "pl_msg_00000638_00009", + "id": "UndergroundCaptureFlag_Text_YouAlreadyHaveFlag", "en_US": "You already have a Flag!" }, { diff --git a/res/text/underground_common.json b/res/text/underground_common.json index 55ccd83eea..08d9db33f6 100644 --- a/res/text/underground_common.json +++ b/res/text/underground_common.json @@ -391,7 +391,7 @@ ] }, { - "id": "pl_msg_00000634_00067", + "id": "UndergroundCommon_Text_TakeFlagPrompt", "en_US": [ "This appears to be {STRVAR_1 3, 0, 0}’s\n", "Secret Base.\r", diff --git a/res/text/underground_base_pc.json b/res/text/underground_pc.json similarity index 75% rename from res/text/underground_base_pc.json rename to res/text/underground_pc.json index 2bd402e544..5085a007e3 100644 --- a/res/text/underground_base_pc.json +++ b/res/text/underground_pc.json @@ -2,60 +2,60 @@ "key": 9886, "messages": [ { - "id": "pl_msg_00000639_00000", + "id": "UndergroundPC_Text_Decorate", "en_US": "DECORATE" }, { - "id": "pl_msg_00000639_00001", + "id": "UndergroundPC_Text_StoreGoods", "en_US": "STORE GOODS" }, { - "id": "pl_msg_00000639_00002", + "id": "UndergroundPC_Text_ReceiveGoods", "en_US": "RECEIVE GOODS" }, { - "id": "pl_msg_00000639_00003", + "id": "UndergroundPC_Text_CheckFlags", "en_US": "CHECK FLAGS" }, { - "id": "pl_msg_00000639_00004", + "id": "UndergroundPC_Text_UseRadar", "en_US": "USE RADAR" }, { - "id": "pl_msg_00000639_00005", + "id": "UndergroundPC_Text_Exit", "en_US": "EXIT" }, { - "id": "pl_msg_00000639_00006", + "id": "UndergroundPC_Text_DecorateDescription", "en_US": [ "Decoration goods stored on the PC\n", "can be brought out and displayed." ] }, { - "id": "pl_msg_00000639_00007", + "id": "UndergroundPC_Text_StoreGoodsDescription", "en_US": "Store decoration goods on the PC." }, { - "id": "pl_msg_00000639_00008", + "id": "UndergroundPC_Text_ReceiveGoodsDescription", "en_US": [ "Take out stored decoration goods\n", "from the PC." ] }, { - "id": "pl_msg_00000639_00009", + "id": "UndergroundPC_Text_CheckFlagsDescription", "en_US": "Check your collection of Flags." }, { - "id": "pl_msg_00000639_00010", + "id": "UndergroundPC_Text_UseRadarDescription", "en_US": [ "Search for hidden things in the\n", "underground passages." ] }, { - "id": "pl_msg_00000639_00011", + "id": "UndergroundPC_Text_ExitDescription", "en_US": "Switch off the PC." }, { @@ -123,7 +123,7 @@ "garbage": 3 }, { - "id": "pl_msg_00000639_00028", + "id": "UndergroundPC_Text_GoodsOnHand", "en_US": [ "Goods on\n", "hand" @@ -151,7 +151,7 @@ ] }, { - "id": "pl_msg_00000639_00032", + "id": "UndergroundPC_Text_GoodsInPC", "en_US": [ "Goods in\n", "PC" @@ -179,73 +179,73 @@ ] }, { - "id": "pl_msg_00000639_00036", + "id": "UndergroundPC_Text_GoodWasWithdrawn", "en_US": [ "The {STRVAR_1 25, 2, 0} was withdrawn\n", "from the PC." ] }, { - "id": "pl_msg_00000639_00037", + "id": "UndergroundPC_Text_GoodWasStored", "en_US": [ "The {STRVAR_1 25, 2, 0} was stored\n", "on the PC." ] }, { - "id": "pl_msg_00000639_00038", + "id": "UndergroundPC_Text_PCIsFull", "en_US": "Your PC is full." }, { - "id": "pl_msg_00000639_00039", + "id": "UndergroundPC_Text_BagIsFull", "en_US": [ "You can’t carry any more\n", "goods with you." ] }, { - "id": "pl_msg_00000639_00040", + "id": "UndergroundPC_Text_TreasureSearch", "en_US": "TREASURE SEARCH" }, { - "id": "pl_msg_00000639_00041", + "id": "UndergroundPC_Text_SphereSearch", "en_US": "SPHERE SEARCH" }, { - "id": "pl_msg_00000639_00042", + "id": "UndergroundPC_Text_TrapSearch", "en_US": "TRAP SEARCH" }, { - "id": "pl_msg_00000639_00043", + "id": "UndergroundPC_Text_Cancel", "en_US": "CANCEL" }, { - "id": "pl_msg_00000639_00044", + "id": "UndergroundPC_Text_TreasureSearchDescription", "en_US": [ "Scan for Treasure hidden in the\n", "underground passages." ] }, { - "id": "pl_msg_00000639_00045", + "id": "UndergroundPC_Text_SphereSearchDescription", "en_US": [ "Scan for Spheres you buried\n", "yourself." ] }, { - "id": "pl_msg_00000639_00046", + "id": "UndergroundPC_Text_TrapSearchDescription", "en_US": [ "Scan for Traps hidden in the\n", "underground passages." ] }, { - "id": "pl_msg_00000639_00047", + "id": "UndergroundPC_Text_CancelDescription", "en_US": "Turns off the Radar." }, { - "id": "pl_msg_00000639_00048", + "id": "UndergroundPC_Text_TreasureRadarBootedUp", "en_US": [ "The Treasure Search System was\n", "booted up.\r", @@ -254,7 +254,7 @@ ] }, { - "id": "pl_msg_00000639_00049", + "id": "UndergroundPC_Text_SphereRadarBootedUp", "en_US": [ "The Sphere Search System was\n", "booted up.\r", @@ -263,7 +263,7 @@ ] }, { - "id": "pl_msg_00000639_00050", + "id": "UndergroundPC_Text_TrapRadarBootedUp", "en_US": [ "The Trap Search System was\n", "booted up.\r", @@ -288,14 +288,14 @@ "garbage": 17 }, { - "id": "pl_msg_00000639_00055", + "id": "UndergroundPC_Text_CantWithdrawDisplayedGood", "en_US": [ "Displayed decoration goods can’t\n", "be withdrawn." ] }, { - "id": "pl_msg_00000639_00056", + "id": "UndergroundPC_Text_CantDecorateWithEntranceOpen", "en_US": [ "It’s unsafe if you get a visitor\n", "while you are decorating.\r", @@ -303,7 +303,7 @@ ] }, { - "id": "pl_msg_00000639_00057", + "id": "UndergroundPC_Text_TreasureRadarEntranceClosed", "en_US": [ "The Treasure Search System was\n", "booted up.\r", @@ -313,7 +313,7 @@ ] }, { - "id": "pl_msg_00000639_00058", + "id": "UndergroundPC_Text_SphereRadarEntranceClosed", "en_US": [ "The Sphere Search System was\n", "booted up.\r", @@ -323,7 +323,7 @@ ] }, { - "id": "pl_msg_00000639_00059", + "id": "UndergroundPC_Text_TrapRadarEntranceClosed", "en_US": [ "The Trap Search System was\n", "booted up.\r", @@ -333,7 +333,7 @@ ] }, { - "id": "pl_msg_00000639_00060", + "id": "UndergroundPC_Text_StoreGoodsBeforeDecorating", "en_US": [ "Please store goods in the PC before\n", "decorating." diff --git a/src/comm_player_manager.c b/src/comm_player_manager.c index 2ddaa4d262..c9cbcdfc70 100644 --- a/src/comm_player_manager.c +++ b/src/comm_player_manager.c @@ -264,11 +264,11 @@ void CommPlayer_CopyPersonal(int netJd) sCommPlayerManager->playerLocationServer[netId].x = sCommPlayerManager->playerLocationServer[netJd].x; sCommPlayerManager->playerLocationServer[netId].z = sCommPlayerManager->playerLocationServer[netJd].z; sCommPlayerManager->playerLocationServer[netId].dir = sCommPlayerManager->playerLocationServer[netJd].dir; - sCommPlayerManager->unk_290[netId] = sCommPlayerManager->unk_290[netJd]; - sCommPlayerManager->unk_290[netJd] = NULL; + sCommPlayerManager->heldFlagOwnerInfo[netId] = sCommPlayerManager->heldFlagOwnerInfo[netJd]; + sCommPlayerManager->heldFlagOwnerInfo[netJd] = NULL; - if (sCommPlayerManager->unk_290[netId]) { - TrainerInfo_Copy(sCommPlayerManager->unk_290[netId], (TrainerInfo *)&sCommPlayerManager->unk_14A[netId].unk_00); + if (sCommPlayerManager->heldFlagOwnerInfo[netId]) { + TrainerInfo_Copy(sCommPlayerManager->heldFlagOwnerInfo[netId], (TrainerInfo *)&sCommPlayerManager->unk_14A[netId].unk_00); } sCommPlayerManager->unk_14A[netJd].unk_20 = 0xff; diff --git a/src/meson.build b/src/meson.build index afafe72507..c3be6d39e2 100644 --- a/src/meson.build +++ b/src/meson.build @@ -651,7 +651,7 @@ pokeplatinum_c = files( 'overlay023/ov23_0224B05C.c', 'overlay023/underground_player_talk.c', 'overlay023/underground_menu.c', - 'overlay023/ov23_0225128C.c', + 'overlay023/underground_pc.c', 'overlay023/ov23_022521F0.c', 'overlay023/ov23_02253598.c', 'overlay023/underground_text_printer.c', diff --git a/src/overlay023/ov23_0223E140.c b/src/overlay023/ov23_0223E140.c index 775eb54d02..31046bdd37 100644 --- a/src/overlay023/ov23_0223E140.c +++ b/src/overlay023/ov23_0223E140.c @@ -1006,7 +1006,7 @@ void ov23_0223E9D4(int param0, int param1, void *param2, void *param3) Unk_ov23_02257740->unk_A24 = UndergroundTextPrinter_PrintText(CommManUnderground_GetCommonTextPrinter(), UndergroundCommon_Text_WallIsBulging, FALSE, NULL); Unk_ov23_02257740->unk_8C8 = SysTask_Start(ov23_0223EA38, Unk_ov23_02257740, 0); - ov23_022431EC(NULL, Unk_ov23_02257740->unk_8C8, ov23_0223E99C); + CommManUnderground_SetCurrentSysTask(NULL, Unk_ov23_02257740->unk_8C8, ov23_0223E99C); CommPlayerMan_PauseFieldSystem(); } } @@ -1037,7 +1037,7 @@ static void ov23_0223EA38(SysTask *param0, void *param1) UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetCommonTextPrinter()); SysTask_Done(param0); - ov23_02243204(); + CommManUnderground_ClearCurrentSysTaskInfo(); Unk_ov23_02257740->unk_8C8 = NULL; } diff --git a/src/overlay023/ov23_02241F74.c b/src/overlay023/ov23_02241F74.c index be36d1fa7b..84a288cf4c 100644 --- a/src/overlay023/ov23_02241F74.c +++ b/src/overlay023/ov23_02241F74.c @@ -3,6 +3,8 @@ #include #include +#include "constants/map_object.h" + #include "struct_decls/struct_02029894_decl.h" #include "struct_decls/struct_02061AB4_decl.h" #include "struct_defs/underground.h" @@ -10,17 +12,16 @@ #include "field/field_system.h" #include "overlay005/land_data.h" #include "overlay005/ov5_021EAFA4.h" -#include "overlay023/funcptr_ov23_022431EC.h" #include "overlay023/ov23_0223E140.h" #include "overlay023/ov23_0224A1D0.h" #include "overlay023/ov23_0224B05C.h" -#include "overlay023/ov23_0225128C.h" #include "overlay023/ov23_022521F0.h" #include "overlay023/ov23_02253598.h" #include "overlay023/struct_ov23_02241A80.h" #include "overlay023/struct_ov23_02241A88.h" #include "overlay023/struct_ov23_02253598_decl.h" #include "overlay023/underground_menu.h" +#include "overlay023/underground_pc.h" #include "overlay023/underground_spheres.h" #include "overlay023/underground_text_printer.h" #include "overlay023/underground_traps.h" @@ -61,9 +62,9 @@ typedef struct StoredListMenuPos { } StoredListMenuPos; typedef struct { - void *unk_00; - SysTask *unk_04; - UnkFuncPtr_ov23_022431EC unk_08; + void *currentSysTaskCtx; + SysTask *currentSysTask; + EndSysTaskFunc endCurrentSysTask; FieldSystem *fieldSystem; UnkStruct_ov23_02253598 *unk_10; SysTask *unk_14; @@ -91,7 +92,7 @@ typedef struct { u8 unk_13D[8]; u8 unk_145; u8 unk_146; - u8 unk_147; + u8 activeRadar; u8 unk_148; u8 unk_149; u8 unk_14A; @@ -135,7 +136,7 @@ static void CommManUnderground_Init(CommManUnderground *param0, FieldSystem *fie sCommManUnderground->unk_1C.x = 0; sCommManUnderground->unk_1C.z = 0; sCommManUnderground->unk_14B = 0; - sCommManUnderground->unk_147 = 1; + sCommManUnderground->activeRadar = 1; sCommManUnderground->commonTextPrinter = UndergroundTextPrinter_New(TEXT_BANK_UNDERGROUND_COMMON, HEAP_ID_33, fieldSystem->bgConfig, renderDelay, 500); sCommManUnderground->captureFlagTextPrinter = UndergroundTextPrinter_New(TEXT_BANK_UNDERGROUND_CAPTURE_FLAG, HEAP_ID_33, fieldSystem->bgConfig, renderDelay, 0); sCommManUnderground->miscTextPrinter = UndergroundTextPrinter_New(TEXT_BANK_UNDERGROUND_NPCS, HEAP_ID_33, fieldSystem->bgConfig, renderDelay, 1000); @@ -324,7 +325,7 @@ BOOL ov23_0224240C(int x, int z) return TRUE; } - if (ov23_022512D4(&coordinates, -1) != 0xff) { + if (UndergroundPC_GetPCAtCoordinates(&coordinates, DIR_NONE) != PC_NONE) { return TRUE; } @@ -682,7 +683,7 @@ void ov23_022428D8(int param0, int param1, void *param2, void *param3) return; } - if (ov23_02251324(param0, &v2)) { + if (UndergroundPC_TryUsePC(param0, &v2)) { sub_02059058(param0, 0); return; } @@ -910,7 +911,7 @@ int ov23_02242E78(int param0) if (param0 < 16) { v1 = param0; - switch (sCommManUnderground->unk_147) { + switch (sCommManUnderground->activeRadar) { case 0: return 0; case 1: @@ -941,7 +942,7 @@ int ov23_02242EE0(int param0) if (param0 < 16) { v1 = param0; - switch (sCommManUnderground->unk_147) { + switch (sCommManUnderground->activeRadar) { case 0: return 0; case 1: @@ -969,7 +970,7 @@ int ov23_02242F48(int param0) { if (sCommManUnderground) { if (param0 < 16) { - switch (sCommManUnderground->unk_147) { + switch (sCommManUnderground->activeRadar) { case 1: if (param0 < 8) { return 12; @@ -995,27 +996,27 @@ int ov23_02242F48(int param0) void ov23_02242FA8(void) { - sCommManUnderground->unk_147 = 0; + sCommManUnderground->activeRadar = 0; } void ov23_02242FBC(void) { - sCommManUnderground->unk_147 = 1; + sCommManUnderground->activeRadar = 1; } -void ov23_02242FD0(void) +void CommManUnderground_SetSphereRadarActive(void) { - sCommManUnderground->unk_147 = 2; + sCommManUnderground->activeRadar = 2; } -void ov23_02242FE4(void) +void CommManUnderground_SetTrapRadarActive(void) { - sCommManUnderground->unk_147 = 4; + sCommManUnderground->activeRadar = 4; } -void ov23_02242FF8(void) +void CommManUnderground_SetTreasureRadarActive(void) { - sCommManUnderground->unk_147 = 3; + sCommManUnderground->activeRadar = 3; } void ov23_0224300C(int param0, int param1) @@ -1132,27 +1133,27 @@ void ov23_022431C4(int param0, int param1, void *param2, void *param3) } } -void ov23_022431EC(void *param0, SysTask *param1, UnkFuncPtr_ov23_022431EC param2) +void CommManUnderground_SetCurrentSysTask(void *ctx, SysTask *sysTask, EndSysTaskFunc endFunc) { - sCommManUnderground->unk_00 = param0; - sCommManUnderground->unk_04 = param1; - sCommManUnderground->unk_08 = param2; + sCommManUnderground->currentSysTaskCtx = ctx; + sCommManUnderground->currentSysTask = sysTask; + sCommManUnderground->endCurrentSysTask = endFunc; } -void ov23_02243204(void) +void CommManUnderground_ClearCurrentSysTaskInfo(void) { - sCommManUnderground->unk_00 = NULL; - sCommManUnderground->unk_04 = NULL; - sCommManUnderground->unk_08 = NULL; + sCommManUnderground->currentSysTaskCtx = NULL; + sCommManUnderground->currentSysTask = NULL; + sCommManUnderground->endCurrentSysTask = NULL; } BOOL ov23_0224321C(void) { BOOL v0 = 0; - if (sCommManUnderground->unk_04) { - sCommManUnderground->unk_08(sCommManUnderground->unk_04, sCommManUnderground->unk_00); - ov23_02243204(); + if (sCommManUnderground->currentSysTask) { + sCommManUnderground->endCurrentSysTask(sCommManUnderground->currentSysTask, sCommManUnderground->currentSysTaskCtx); + CommManUnderground_ClearCurrentSysTaskInfo(); v0 = 1; } @@ -1171,7 +1172,7 @@ BOOL ov23_02243298(int param0) { int v0, v1; - if (sCommManUnderground->unk_04) { + if (sCommManUnderground->currentSysTask) { return 0; } diff --git a/src/overlay023/ov23_022499E4.c b/src/overlay023/ov23_022499E4.c index 6cfbf9cd6c..5687afbd85 100644 --- a/src/overlay023/ov23_022499E4.c +++ b/src/overlay023/ov23_022499E4.c @@ -116,7 +116,7 @@ void ov23_02249A74(void) static void ov23_02249A88(void) { - if (!sub_02033DFC()) { + if (!CommServerClient_IsInClosedSecretBase()) { ov23_0224C198(); ov23_02249C24(ov23_02249C34, 0); } diff --git a/src/overlay023/ov23_0224A1D0.c b/src/overlay023/ov23_0224A1D0.c index 10b0ab37e7..d81184478d 100644 --- a/src/overlay023/ov23_0224A1D0.c +++ b/src/overlay023/ov23_0224A1D0.c @@ -81,7 +81,7 @@ static void ov23_0224A204(int param0) CommPlayerManager *commPlayerMan = CommPlayerMan_Get(); if (param0 == CommSys_CurNetId()) { - if (commPlayerMan->unk_290[param0] != NULL) { + if (commPlayerMan->heldFlagOwnerInfo[param0] != NULL) { GameRecords_IncrementTrainerScore(SaveData_GetGameRecords(commPlayerMan->fieldSystem->saveData), TRAINER_SCORE_EVENT_UNDERGROUND_CAPTURE_FLAG); if (commPlayerMan->unk_27C[5 - 1]) { @@ -92,10 +92,10 @@ static void ov23_0224A204(int param0) commPlayerMan->unk_27C[v0] = commPlayerMan->unk_27C[v0 - 1]; } - commPlayerMan->unk_27C[0] = commPlayerMan->unk_290[param0]; - sub_02028830(SaveData_GetUnderground(FieldSystem_GetSaveData(commPlayerMan->fieldSystem)), commPlayerMan->unk_290[param0]); + commPlayerMan->unk_27C[0] = commPlayerMan->heldFlagOwnerInfo[param0]; + sub_02028830(SaveData_GetUnderground(FieldSystem_GetSaveData(commPlayerMan->fieldSystem)), commPlayerMan->heldFlagOwnerInfo[param0]); - commPlayerMan->unk_290[param0] = NULL; + commPlayerMan->heldFlagOwnerInfo[param0] = NULL; commPlayerMan->unk_14A[param0].unk_20 = 0xff; } } else { @@ -107,14 +107,14 @@ static BOOL ov23_0224A294(int param0, int param1) { CommPlayerManager *v0 = CommPlayerMan_Get(); - if ((v0->unk_290[param0] == NULL) && (v0->unk_290[param1] != NULL)) { - v0->unk_290[param0] = v0->unk_290[param1]; - v0->unk_290[param1] = NULL; + if ((v0->heldFlagOwnerInfo[param0] == NULL) && (v0->heldFlagOwnerInfo[param1] != NULL)) { + v0->heldFlagOwnerInfo[param0] = v0->heldFlagOwnerInfo[param1]; + v0->heldFlagOwnerInfo[param1] = NULL; v0->emote[param0] = EMOTE_FLAG; v0->emote[param1] = EMOTE_NONE; v0->unk_14A[param0].unk_20 = param0; v0->unk_14A[param1].unk_20 = 0xff; - TrainerInfo_Copy(v0->unk_290[param0], (TrainerInfo *)&v0->unk_14A[param0].unk_00); + TrainerInfo_Copy(v0->heldFlagOwnerInfo[param0], (TrainerInfo *)&v0->unk_14A[param0].unk_00); return 1; } @@ -164,7 +164,7 @@ void ov23_0224A348(int param0, int param1, void *param2, void *param3) v0.unk_01 = param0; if (commPlayerMan->unk_E2[param0] && !ov23_0224ACC0(param0)) { - if (ov23_0224AEA4(param0)) { + if (ov23_IsPlayerHoldingFlag(param0)) { v0.unk_00 = 3; } else { v0.unk_00 = 1; @@ -327,12 +327,12 @@ BOOL ov23_0224A658(int param0, int param1, BOOL param2) if (param2 & 0x1) { v0.unk_00 = 11; - } else if (ov23_0224AEA4(param0)) { + } else if (ov23_IsPlayerHoldingFlag(param0)) { v0.unk_00 = 11; } else { if (param1 == 0xff) { return 0; - } else if (!ov23_0224AEA4(param1)) { + } else if (!ov23_IsPlayerHoldingFlag(param1)) { return 0; } else { v0.unk_00 = 5; @@ -353,7 +353,7 @@ BOOL ov23_0224A6B8(int param0) { UnkStruct_ov23_0224A570 v0; - if (ov23_0224AEA4(param0)) { + if (ov23_IsPlayerHoldingFlag(param0)) { v0.unk_00 = 12; } else { return 0; @@ -399,7 +399,7 @@ void ov23_0224A77C(int param0, int param1, void *param2, void *param3) switch (v1->unk_00) { case 0: - if (commPlayerMan->unk_290[v1->unk_01]) { + if (commPlayerMan->heldFlagOwnerInfo[v1->unk_01]) { ov23_0224AE60(v1->unk_01); ov23_ClearEmote(v1->unk_01); @@ -416,7 +416,7 @@ void ov23_0224A77C(int param0, int param1, void *param2, void *param3) return; } - if (commPlayerMan->unk_290[v1->unk_02] == NULL) { + if (commPlayerMan->heldFlagOwnerInfo[v1->unk_02] == NULL) { if (v1->unk_01 == CommSys_CurNetId()) { CommPlayerMan_ResumeFieldSystem(); } @@ -424,7 +424,7 @@ void ov23_0224A77C(int param0, int param1, void *param2, void *param3) return; } - if (TrainerInfo_Equals(commPlayerMan->unk_290[v1->unk_02], CommInfo_TrainerInfo(v1->unk_01)) == 1) { + if (TrainerInfo_Equals(commPlayerMan->heldFlagOwnerInfo[v1->unk_02], CommInfo_TrainerInfo(v1->unk_01)) == 1) { ov23_0224AE60(v1->unk_02); if (v1->unk_01 == CommSys_CurNetId()) { @@ -475,8 +475,8 @@ void ov23_0224A77C(int param0, int param1, void *param2, void *param3) UndergroundRecord_IncrementCapturedFlagCount(undergroundRecord); SystemFlag_SetDeliveredStolenFlag(SaveData_GetVarsFlags(commPlayerMan->fieldSystem->saveData)); - if (commPlayerMan->unk_290[v1->unk_01]) { - FieldSystem_SaveTVEpisodeSegment_CaptureTheFlagDigest_TakeFlag(commPlayerMan->fieldSystem, commPlayerMan->unk_290[v1->unk_01]); + if (commPlayerMan->heldFlagOwnerInfo[v1->unk_01]) { + FieldSystem_SaveTVEpisodeSegment_CaptureTheFlagDigest_TakeFlag(commPlayerMan->fieldSystem, commPlayerMan->heldFlagOwnerInfo[v1->unk_01]); if (commPlayerMan->unk_2B2 != 0xffff) { commPlayerMan->unk_2B2++; @@ -495,8 +495,8 @@ void ov23_0224A77C(int param0, int param1, void *param2, void *param3) Sound_FadeOutAndPlayBGM(4, SEQ_TANKOU, 60, 0, 0xff, NULL); } - if (commPlayerMan->unk_290[v1->unk_01]) { - if (TrainerInfo_Equals(commPlayerMan->unk_290[v1->unk_01], CommInfo_TrainerInfo(CommSys_CurNetId())) == 1) { + if (commPlayerMan->heldFlagOwnerInfo[v1->unk_01]) { + if (TrainerInfo_Equals(commPlayerMan->heldFlagOwnerInfo[v1->unk_01], CommInfo_TrainerInfo(CommSys_CurNetId())) == 1) { FieldSystem_SaveTVEpisodeSegment_CaptureTheFlagDigest_LoseFlag(commPlayerMan->fieldSystem, CommInfo_TrainerInfo(v1->unk_01)); } } @@ -528,8 +528,8 @@ void ov23_0224AAB0(void) commPlayerMan->unk_2B9 = 0; - if (commPlayerMan->unk_290[CommSys_CurNetId()]) { - CommSys_SendDataFixedSize(91, commPlayerMan->unk_290[CommSys_CurNetId()]); + if (commPlayerMan->heldFlagOwnerInfo[CommSys_CurNetId()]) { + CommSys_SendDataFixedSize(91, commPlayerMan->heldFlagOwnerInfo[CommSys_CurNetId()]); } else { TrainerInfo *v0 = TrainerInfo_New(HEAP_ID_COMMUNICATION); Strbuf *v1 = Strbuf_Init(20, HEAP_ID_COMMUNICATION); @@ -591,12 +591,12 @@ void ov23_0224ABC4(int param0, int param1, void *param2, void *param3) if (commPlayerMan) { v3 = v1->unk_20; - if (commPlayerMan->unk_290[v3]) { - Heap_Free(commPlayerMan->unk_290[v3]); + if (commPlayerMan->heldFlagOwnerInfo[v3]) { + Heap_Free(commPlayerMan->heldFlagOwnerInfo[v3]); } - commPlayerMan->unk_290[v3] = TrainerInfo_New(HEAP_ID_COMMUNICATION); - TrainerInfo_Copy((TrainerInfo *)v1->unk_00, commPlayerMan->unk_290[v3]); + commPlayerMan->heldFlagOwnerInfo[v3] = TrainerInfo_New(HEAP_ID_COMMUNICATION); + TrainerInfo_Copy((TrainerInfo *)v1->unk_00, commPlayerMan->heldFlagOwnerInfo[v3]); commPlayerMan->emote[v3] = EMOTE_FLAG; } } @@ -631,9 +631,9 @@ void ov23_0224AC4C(void) int v3 = CommSys_CurNetId(); CommPlayerManager *commPlayerMan = CommPlayerMan_Get(); - if (commPlayerMan->unk_290[v3]) { - v0 = commPlayerMan->unk_290[v3]; - commPlayerMan->unk_290[v3] = NULL; + if (commPlayerMan->heldFlagOwnerInfo[v3]) { + v0 = commPlayerMan->heldFlagOwnerInfo[v3]; + commPlayerMan->heldFlagOwnerInfo[v3] = NULL; commPlayerMan->emote[v3] = EMOTE_NONE; commPlayerMan->unk_14A[v3].unk_20 = 0xff; } @@ -643,7 +643,7 @@ void ov23_0224AC4C(void) } if (v0) { - commPlayerMan->unk_290[0] = v0; + commPlayerMan->heldFlagOwnerInfo[0] = v0; commPlayerMan->emote[0] = EMOTE_FLAG; TrainerInfo_Copy(v0, (TrainerInfo *)&commPlayerMan->unk_14A[0].unk_00); @@ -764,10 +764,10 @@ BOOL ov23_0224AE60(int param0) { CommPlayerManager *v0 = CommPlayerMan_Get(); - if (v0->unk_290[param0] != NULL) { - Heap_Free(v0->unk_290[param0]); + if (v0->heldFlagOwnerInfo[param0] != NULL) { + Heap_Free(v0->heldFlagOwnerInfo[param0]); - v0->unk_290[param0] = NULL; + v0->heldFlagOwnerInfo[param0] = NULL; v0->emote[param0] = EMOTE_NONE; v0->unk_14A[param0].unk_20 = 0xff; @@ -777,43 +777,43 @@ BOOL ov23_0224AE60(int param0) return 0; } -BOOL ov23_0224AEA4(int param0) +BOOL ov23_IsPlayerHoldingFlag(int netID) { - CommPlayerManager *v0 = CommPlayerMan_Get(); + CommPlayerManager *commPlayerMan = CommPlayerMan_Get(); - if (v0->unk_290[param0] != NULL) { - return 1; + if (commPlayerMan->heldFlagOwnerInfo[netID] != NULL) { + return TRUE; } - return 0; + return FALSE; } -BOOL ov23_0224AEC4(int param0, int param1) +BOOL ov23_TryTakeFlag(int flagTakerNetID, int flagOwnerNetID) { - CommPlayerManager *v0 = CommPlayerMan_Get(); + CommPlayerManager *commPlayerMan = CommPlayerMan_Get(); - if (v0->unk_290[param0] == NULL) { - TrainerInfo *v1 = CommInfo_TrainerInfo(param1); + if (commPlayerMan->heldFlagOwnerInfo[flagTakerNetID] == NULL) { + TrainerInfo *trainerInfo = CommInfo_TrainerInfo(flagOwnerNetID); - if (v1) { - v0->unk_290[param0] = TrainerInfo_New(HEAP_ID_COMMUNICATION); - TrainerInfo_Copy(v1, v0->unk_290[param0]); + if (trainerInfo) { + commPlayerMan->heldFlagOwnerInfo[flagTakerNetID] = TrainerInfo_New(HEAP_ID_COMMUNICATION); + TrainerInfo_Copy(trainerInfo, commPlayerMan->heldFlagOwnerInfo[flagTakerNetID]); - v0->emote[param0] = EMOTE_FLAG; - v0->unk_14A[param0].unk_20 = param0; + commPlayerMan->emote[flagTakerNetID] = EMOTE_FLAG; + commPlayerMan->unk_14A[flagTakerNetID].unk_20 = flagTakerNetID; - TrainerInfo_Copy(v1, (TrainerInfo *)&v0->unk_14A[param0].unk_00); + TrainerInfo_Copy(trainerInfo, (TrainerInfo *)&commPlayerMan->unk_14A[flagTakerNetID].unk_00); - if (param1 == CommSys_CurNetId()) { - UndergroundRecord *v2 = SaveData_UndergroundRecord(v0->fieldSystem->saveData); - sub_020297B4(v2); + if (flagOwnerNetID == CommSys_CurNetId()) { + UndergroundRecord *undergroundRecord = SaveData_UndergroundRecord(commPlayerMan->fieldSystem->saveData); + UndergroundRecord_IncrementTimesFlagTaken(undergroundRecord); } - return 1; + return TRUE; } } - return 0; + return FALSE; } void ov23_0224AF4C(int netID) diff --git a/src/overlay023/ov23_0224B05C.c b/src/overlay023/ov23_0224B05C.c index d5fd7928c8..c2e52d98ce 100644 --- a/src/overlay023/ov23_0224B05C.c +++ b/src/overlay023/ov23_0224B05C.c @@ -292,7 +292,7 @@ static void ov23_0224B0DC(int param0, UnkStruct_ov23_0224B098 *param1) const int v1 = 32; int v2; - if (sub_02033DFC()) { + if (CommServerClient_IsInClosedSecretBase()) { param1->unk_00 = v0.unk_00; param1->unk_02 = v0.unk_02; return; @@ -810,7 +810,7 @@ static void ov23_0224BA48(SysTask *param0, void *param1) SysTask_Done(param0); Heap_Free(v0); - ov23_02243204(); + CommManUnderground_ClearCurrentSysTaskInfo(); } static void ov23_0224BA6C(SysTask *param0, void *param1) @@ -830,7 +830,7 @@ static void ov23_0224BA6C(SysTask *param0, void *param1) SysTask_Done(param0); Heap_Free(v0); - ov23_02243204(); + CommManUnderground_ClearCurrentSysTaskInfo(); ov23_0224DC24(); } @@ -844,7 +844,7 @@ static void ov23_0224BAAC(SysTask *param0, void *param1) switch (v0->unk_0C) { case 0: - if (sub_02033DFC()) { + if (CommServerClient_IsInClosedSecretBase()) { v5 = 47; v0->unk_0C = 3; } else { @@ -918,7 +918,7 @@ static void ov23_0224BAAC(SysTask *param0, void *param1) return; } - if (!sub_02033DFC()) { + if (!CommServerClient_IsInClosedSecretBase()) { if ((v0->unk_2C < (7 + 1)) && !CommSys_IsPlayerConnected(v0->unk_2C) && (CommSys_CurNetId() != 0)) { v7 = 1; } @@ -950,7 +950,7 @@ static void ov23_0224BC5C(FieldSystem *fieldSystem, int param1, int param2, int v0->fieldSystem = fieldSystem; v0->unk_08 = SysTask_Start(ov23_0224BAAC, v0, 100); - ov23_022431EC(v0, v0->unk_08, ov23_0224BA6C); + CommManUnderground_SetCurrentSysTask(v0, v0->unk_08, ov23_0224BA6C); CommPlayerMan_PauseFieldSystem(); } @@ -1086,7 +1086,7 @@ static void ov23_0224BE28(SysTask *param0, void *param1) if (v6 == 0) { v0->unk_04 = NULL; - if (ov23_0224AEA4(v0->unk_2C) || (ov23_0224BD1C(v0->unk_2C, 0) > 0)) { + if (ov23_IsPlayerHoldingFlag(v0->unk_2C) || (ov23_0224BD1C(v0->unk_2C, 0) > 0)) { UndergroundTextPrinter_PrintText(CommManUnderground_GetCommonTextPrinter(), 44, FALSE, NULL); v0->unk_0C = 3; } else { @@ -1126,7 +1126,7 @@ static void ov23_0224BE28(SysTask *param0, void *param1) } break; case 9: - if (sub_02033DFC() && (CommSys_CurNetId() == 0)) { + if (CommServerClient_IsInClosedSecretBase() && (CommSys_CurNetId() == 0)) { u8 v9 = 1; CommSys_SendDataFixedSize(86, &v9); @@ -1182,7 +1182,7 @@ static void ov23_0224C090(FieldSystem *fieldSystem, int param1, int param2, int ov23_0224DC08(); v0->unk_08 = SysTask_Start(ov23_0224BE28, v0, 100); - ov23_022431EC(v0, v0->unk_08, ov23_0224BA6C); + CommManUnderground_SetCurrentSysTask(v0, v0->unk_08, ov23_0224BA6C); CommPlayerMan_PauseFieldSystem(); } @@ -1623,7 +1623,7 @@ static BOOL ov23_0224C790(FieldTask *param0) break; } - if (sub_02033DFC() && !Underground_AreCoordinatesInSecretBase(v1->unk_1C, v1->unk_20)) { + if (CommServerClient_IsInClosedSecretBase() && !Underground_AreCoordinatesInSecretBase(v1->unk_1C, v1->unk_20)) { v1->unk_2E = 0; } else { v1->unk_2E = 1; @@ -1655,7 +1655,7 @@ static BOOL ov23_0224C790(FieldTask *param0) v1->unk_29++; if (v1->unk_29 > 10) { - if (!sub_02033DFC() || !v1->unk_2E) { + if (!CommServerClient_IsInClosedSecretBase() || !v1->unk_2E) { v1->unk_0C = 13; } else { v1->unk_0C = 11; @@ -1680,7 +1680,7 @@ static BOOL ov23_0224C790(FieldTask *param0) } break; case 13: - if (sub_02033DFC() && !Underground_AreCoordinatesInSecretBase(v1->unk_1C, v1->unk_20)) { + if (CommServerClient_IsInClosedSecretBase() && !Underground_AreCoordinatesInSecretBase(v1->unk_1C, v1->unk_20)) { ov23_02249AA4(); } else { ov23_02249B60(); @@ -1690,7 +1690,7 @@ static BOOL ov23_0224C790(FieldTask *param0) CommPlayerMan_ResumeFieldSystem(); Heap_Free(v1); - if (sub_02033DFC() && Underground_AreCoordinatesInSecretBase(v1->unk_1C, v1->unk_20)) { + if (CommServerClient_IsInClosedSecretBase() && Underground_AreCoordinatesInSecretBase(v1->unk_1C, v1->unk_20)) { ov23_02242FA8(); } else { ov23_02242FBC(); @@ -1827,7 +1827,7 @@ static void ov23_0224CB1C(SysTask *param0, void *param1) v0->unk_0C = 10; break; case 10: - if (sub_02033DFC() && (CommSys_CurNetId() == 0)) { + if (CommServerClient_IsInClosedSecretBase() && (CommSys_CurNetId() == 0)) { u8 v10 = 2; if (v0->unk_12) { @@ -1840,7 +1840,7 @@ static void ov23_0224CB1C(SysTask *param0, void *param1) SysTask_Done(param0); Heap_Free(v0); - ov23_02243204(); + CommManUnderground_ClearCurrentSysTaskInfo(); return; } break; @@ -1860,7 +1860,7 @@ static void ov23_0224CB1C(SysTask *param0, void *param1) SysTask_Done(param0); Heap_Free(v0); - ov23_02243204(); + CommManUnderground_ClearCurrentSysTaskInfo(); ov23_0224DC24(); } } @@ -1951,7 +1951,7 @@ static void ov23_0224CE94(SysTask *param0, void *param1) SysTask_Done(param0); Heap_Free(v0); - ov23_02243204(); + CommManUnderground_ClearCurrentSysTaskInfo(); CommPlayerMan_ResumeFieldSystem(); ov23_0224DC24(); } @@ -1970,7 +1970,7 @@ static void ov23_0224CEC8(void) v0->fieldSystem = Unk_ov23_022577AC->fieldSystem; v0->unk_04 = SysTask_Start(ov23_0224CB1C, v0, 100); - ov23_022431EC(v0, v0->unk_04, ov23_0224CE94); + CommManUnderground_SetCurrentSysTask(v0, v0->unk_04, ov23_0224CE94); } void ov23_0224CF18(int param0, int param1, void *param2, void *param3) @@ -2383,7 +2383,7 @@ static void ov23_0224D5BC(SysTask *param0, void *param1) case 4: Heap_Free(param1); SysTask_Done(param0); - ov23_02243204(); + CommManUnderground_ClearCurrentSysTaskInfo(); break; } } @@ -2414,7 +2414,7 @@ void ov23_0224D6AC(int param0, int param1, void *param2, void *param3) v3->unk_05 = v1[1]; v2 = SysTask_Start(ov23_0224D5BC, v3, 100); - ov23_022431EC(v3, v2, ov23_0224D5A8); + CommManUnderground_SetCurrentSysTask(v3, v2, ov23_0224D5A8); } else { (void)0; } @@ -2678,7 +2678,7 @@ void ov23_0224DAD0(int param0) return; } - if (sub_02033DFC()) { + if (CommServerClient_IsInClosedSecretBase()) { return; } } diff --git a/src/overlay023/ov23_0225128C.c b/src/overlay023/ov23_0225128C.c deleted file mode 100644 index ee5b2b0796..0000000000 --- a/src/overlay023/ov23_0225128C.c +++ /dev/null @@ -1,960 +0,0 @@ -#include "overlay023/ov23_0225128C.h" - -#include -#include - -#include "struct_defs/underground.h" - -#include "field/field_system.h" -#include "overlay023/ov23_0223E140.h" -#include "overlay023/ov23_02241F74.h" -#include "overlay023/ov23_0224A1D0.h" -#include "overlay023/ov23_0224B05C.h" -#include "overlay023/ov23_022521F0.h" -#include "overlay023/ov23_02253598.h" -#include "overlay023/ov23_02254A14.h" -#include "overlay023/underground_item_list_menu.h" -#include "overlay023/underground_menu.h" -#include "overlay023/underground_spheres.h" -#include "overlay023/underground_text_printer.h" -#include "overlay023/underground_traps.h" - -#include "bg_window.h" -#include "brightness_controller.h" -#include "camera.h" -#include "comm_player_manager.h" -#include "communication_information.h" -#include "communication_system.h" -#include "field_system.h" -#include "field_task.h" -#include "heap.h" -#include "list_menu.h" -#include "location.h" -#include "menu.h" -#include "message.h" -#include "player_avatar.h" -#include "render_window.h" -#include "save_player.h" -#include "screen_fade.h" -#include "scroll_prompts.h" -#include "sound_playback.h" -#include "strbuf.h" -#include "string_list.h" -#include "string_template.h" -#include "sys_task.h" -#include "sys_task_manager.h" -#include "system.h" -#include "system_flags.h" -#include "unk_0202854C.h" -#include "unk_02033200.h" -#include "vars_flags.h" - -typedef struct { - u8 unk_00; - u8 unk_01; - u8 unk_02; -} UnkStruct_ov23_022513B0; - -typedef struct { - int unk_00; - int unk_04; - u8 unk_08; -} UnkStruct_ov23_02251ACC; - -typedef struct { - int unk_00; - FieldSystem *fieldSystem; - Menu *unk_08; - UnkStruct_ov23_022513B0 unk_0C; - SysTask *primaryWindow; -} UnkStruct_ov23_02252038; - -static void ov23_022520E8(FieldSystem *fieldSystem, UnkStruct_ov23_022513B0 *param1); -static void ov23_02251F94(FieldSystem *fieldSystem); -static void ov23_022521C8(UndergroundMenu *param0); - -static const WindowTemplate Unk_ov23_022569C8 = { - 0x3, - 0x19, - 0xD, - 0x6, - 0x4, - 0xD, - 0x21F -}; - -void UndergroundMenu_UpdateScrollPrompts(UndergroundMenu *menu, int listPos, int count, int maxDisplay) -{ - if (count <= maxDisplay) { - return; - } - - if (listPos != 0) { - ScrollPrompts_SetDrawFlag(menu->scrollPrompts, SCROLL_PROMPT_TOP_ARROW, TRUE); - } else { - ScrollPrompts_SetDrawFlag(menu->scrollPrompts, SCROLL_PROMPT_TOP_ARROW, FALSE); - } - - if (listPos + maxDisplay != count) { - ScrollPrompts_SetDrawFlag(menu->scrollPrompts, SCROLL_PROMPT_BOTTOM_ARROW, TRUE); - } else { - ScrollPrompts_SetDrawFlag(menu->scrollPrompts, SCROLL_PROMPT_BOTTOM_ARROW, FALSE); - } - - ScrollPrompts_UpdateAnim(menu->scrollPrompts); -} - -// possibly check for secret base pc? -// coordinates it's checking for are in the secret base range -int ov23_022512D4(Coordinates *coordinates, int param1) -{ - int v0; - int x = coordinates->x; - int z = coordinates->z; - int v3 = 0; - - if (param1 != -1) { - if (param1 != 0) { - return 0xff; - } - } - - if (z == 12) { - v3 = 0; - } else if (z == 12 + 32) { - v3 = 8; - } else { - return 0xff; - } - - if (x == 15 || x == 15 + 1) { - return 0; - } - - for (v0 = 0; v0 < MAX_CONNECTED_PLAYERS; v0++) { - if (x == 15 + 32 || x == 15 + 32 + 1) { - return v0 + v3; - } - - x -= 32; - } - - return 0xff; -} - -BOOL ov23_02251324(int param0, Coordinates *param1) -{ - int v0; - int v1 = param1->x; - int v2 = param1->z; - UnkStruct_ov23_022513B0 v3; - int v4 = ov23_022512D4(param1, CommPlayer_DirServer(param0)); - - if (CommPlayer_Dir(v4) == -1) { - v4 = 0xff; - } - - if (v4 != 0xff) { - sub_02059058(param0, 0); - - v3.unk_01 = v4; - v3.unk_00 = param0; - v3.unk_02 = 0; - - if (v4 != param0) { - if (!ov23_0224AEA4(param0)) { - v3.unk_02 = 1; - } else { - (void)0; - } - } else { - if (ov23_0224AEA4(param0)) { - u8 v5 = 3; - ov23_0224A570(param0, 1, &v5, NULL); - return 1; - } - } - - sub_02035B48(83, &v3); - return 1; - } - - return 0; -} - -static void ov23_022513A4(int param0) -{ - CommPlayerMan_ResumeFieldSystemWithContextBit(PAUSE_BIT_6); -} - -void ov23_022513B0(int param0, int param1, void *param2, void *param3) -{ - UnkStruct_ov23_022513B0 *v0 = param2; - FieldSystem *fieldSystem = param3; - - if (!CommSys_IsSendingMovementData()) { - return; - } - - if (v0->unk_00 == CommSys_CurNetId()) { - if (v0->unk_01 == CommSys_CurNetId()) { - Sound_PlayEffect(SEQ_SE_DP_PC_ON); - CommPlayerMan_PauseFieldSystem(); - ov23_02251F94(fieldSystem); - } else { - CommPlayerMan_PauseFieldSystemWithContextBit(PAUSE_BIT_6); - - if (v0->unk_02) { - ov23_022520E8(fieldSystem, v0); - } else { - UndergroundTextPrinter_PrintText(CommManUnderground_GetCaptureFlagTextPrinter(), 9, TRUE, ov23_022513A4); - } - } - } else { - (void)0; - } - - if (v0->unk_02) { - (void)0; - } -} - -int ov23_02251414(void) -{ - return sizeof(UnkStruct_ov23_022513B0); -} - -static BOOL ov23_02251418(int param0, UndergroundMenu *param1) -{ - Underground *v0 = SaveData_GetUnderground(FieldSystem_GetSaveData(param1->fieldSystem)); - int v1 = Underground_GetGoodAtSlotBag(v0, param0); - - if (Underground_TryAddGoodPC(v0, v1)) { - Underground_RemoveGoodAtSlotBag(v0, param0); - return 1; - } - - return 0; -} - -static int ov23_0225144C(int param0, UndergroundMenu *param1) -{ - Underground *v0 = SaveData_GetUnderground(FieldSystem_GetSaveData(param1->fieldSystem)); - int v1; - - if (Underground_IsGoodAtSlotPlacedInBase(v0, param0)) { - return -1; - } - - v1 = Underground_GetGoodAtSlotPC(v0, param0); - - if (UndergroundInventory_TryAddGoodBag(v1)) { - Underground_RemoveGoodAtSlotPC(v0, param0); - return 1; - } - - return 0; -} - -static void ov23_0225148C(ListMenu *param0, u32 param1, u8 param2) -{ - UndergroundMenu *v0 = (UndergroundMenu *)ListMenu_GetAttribute(param0, 19); - int v1 = param1; - - if (param1 == 0xfffffffe) { - v1 = 5; - } - - UndergroundTextPrinter_PrintTextInstant(CommManUnderground_GetMiscTextPrinter(), 6 + v1, FALSE, NULL); -} - -static void ov23_022514B0(ListMenu *param0, u32 param1, u8 param2) -{ - UndergroundMenu *v0 = (UndergroundMenu *)ListMenu_GetAttribute(param0, 19); - int v1 = param1; - - if (param1 == 0xfffffffe) { - v1 = 3; - } - - UndergroundTextPrinter_PrintTextInstant(CommManUnderground_GetMiscTextPrinter(), 44 + v1, FALSE, NULL); -} - -static BOOL ov23_022514D8(SysTask *param0, void *param1) -{ - UndergroundMenu *v0 = param1; - u32 v1; - u16 v2, v3; - - v1 = ListMenu_ProcessInput(v0->unk_48); - ListMenu_GetListAndCursorPos(v0->unk_48, &v2, &v3); - - CommManUnderground_StoreCursorAndListPos(UNDERGROUND_MENU_KEY_23, v3, v2); - ov23_022521C8(v0); - - switch (v1) { - case 0xffffffff: - return 0; - case 0xfffffffe: - Sound_PlayEffect(SEQ_SE_DP_PC_LOGOFF); - v0->state = 2; - break; - case 0: { - Underground *v4 = SaveData_GetUnderground(v0->fieldSystem->saveData); - - if (0 == Underground_GetGoodsCountPC(v4)) { - UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), 60, FALSE, NULL); - v0->state = 23; - } else if (sub_02033DFC()) { - ov23_02243204(); - v0->state = 3; - } else { - UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), 56, FALSE, NULL); - v0->state = 23; - } - } break; - case 4: - Sound_PlayEffect(SEQ_SE_CONFIRM); - v0->state = 8; - break; - case 3: - Sound_PlayEffect(SEQ_SE_CONFIRM); - v0->state = 6; - break; - case 1: - Sound_PlayEffect(SEQ_SE_CONFIRM); - v0->state = 17; - break; - case 2: - Sound_PlayEffect(SEQ_SE_CONFIRM); - v0->state = 20; - break; - default: - break; - } - - return 1; -} - -static void ov23_022515D8(UndergroundMenu *param0, int param1, int param2, CursorCallback cursorCallback, int param4) -{ - ListMenuTemplate v0; - int v1 = param2 + 1; - BOOL v2 = 1; - - if (BASE_FLAG_GOLD > UndergroundRecord_GetFlagRank(SaveData_UndergroundRecord(param0->fieldSystem->saveData))) { - v2 = 0; - v1 -= 1; - } - - UndergroundMenu_EraseCurrentMenu(param0); - - param0->menuOptions = StringList_New(v1, HEAP_ID_FIELD1); - - Window_Add(param0->fieldSystem->bgConfig, ¶m0->primaryWindow, 3, 17, 3, 14, v1 * 2, 13, 2); - Window_DrawStandardFrame(¶m0->primaryWindow, 1, 1024 - (18 + 12) - 9, 11); - - { - MessageLoader *v3; - int v4 = 0; - - v3 = MessageLoader_Init(MSG_LOADER_PRELOAD_ENTIRE_BANK, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_UNDERGROUND_BASE_PC, HEAP_ID_FIELD1); - - for (v4 = 0; v4 < v1; v4++) { - if (v4 == (v1 - 1)) { - StringList_AddFromMessageBank(param0->menuOptions, v3, param1 + 5, 0xfffffffe); - } else { - StringList_AddFromMessageBank(param0->menuOptions, v3, param1 + v4, v4); - } - } - - MessageLoader_Free(v3); - } - - MI_CpuCopy8(UndergroundTextPrinter_GetListMenuTemplate(), &v0, sizeof(ListMenuTemplate)); - - v0.count = v1; - v0.maxDisplay = v1; - v0.choices = param0->menuOptions; - v0.window = ¶m0->primaryWindow; - - if (cursorCallback) { - v0.cursorCallback = cursorCallback; - } - - v0.parent = param0; - UndergroundMenu_MoveListCursorPosInBounds(param0, v1, v0.count); - param0->unk_48 = ListMenu_New(&v0, param0->listMenuListPos, param0->listMenuCursorPos, HEAP_ID_FIELD1); -} - -static void ov23_022516E8(UndergroundMenu *param0, int param1, int param2, CursorCallback cursorCallback, int param4) -{ - ListMenuTemplate v0; - int v1 = param2 + 1; - BOOL v2 = 1; - - UndergroundMenu_EraseCurrentMenu(param0); - - param0->menuOptions = StringList_New(v1, HEAP_ID_FIELD1); - - Window_Add(param0->fieldSystem->bgConfig, ¶m0->primaryWindow, 3, 17, 3, 14, v1 * 2, 13, (2 + 14 * 16)); - Window_DrawStandardFrame(¶m0->primaryWindow, 1, 1024 - (18 + 12) - 9, 11); - - { - MessageLoader *v3; - int v4 = 0; - - v3 = MessageLoader_Init(MSG_LOADER_PRELOAD_ENTIRE_BANK, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_UNDERGROUND_BASE_PC, HEAP_ID_FIELD1); - - for (v4 = 0; v4 < v1; v4++) { - if (v4 == param2) { - StringList_AddFromMessageBank(param0->menuOptions, v3, param1 + v4, 0xfffffffe); - } else { - StringList_AddFromMessageBank(param0->menuOptions, v3, param1 + v4, v4); - } - } - - MessageLoader_Free(v3); - } - - MI_CpuCopy8(UndergroundTextPrinter_GetListMenuTemplate(), &v0, sizeof(ListMenuTemplate)); - - v0.count = param2 + 1; - v0.maxDisplay = v1; - v0.choices = param0->menuOptions; - v0.window = ¶m0->primaryWindow; - - if (cursorCallback) { - v0.cursorCallback = cursorCallback; - } - - v0.parent = param0; - UndergroundMenu_MoveListCursorPosInBounds(param0, v1, v0.count); - param0->unk_48 = ListMenu_New(&v0, param0->listMenuListPos, param0->listMenuCursorPos, HEAP_ID_FIELD1); -} - -static BOOL ov23_022517E0(SysTask *param0, void *param1) -{ - UndergroundMenu *v0 = param1; - u32 v1; - u16 v2, v3; - - v1 = ListMenu_ProcessInput(v0->unk_48); - ListMenu_GetListAndCursorPos(v0->unk_48, &v2, &v3); - - CommManUnderground_StoreCursorAndListPos(UNDERGROUND_MENU_KEY_22, v3, v2); - ov23_022521C8(v0); - - switch (v1) { - case 0xffffffff: - return 0; - case 0xfffffffe: - Sound_PlayEffect(SEQ_SE_CONFIRM); - v0->state = 0; - break; - case 0: - if (sub_02033DFC()) { - v0->state = 11; - } else { - v0->state = 10; - } - break; - case 1: - if (sub_02033DFC()) { - v0->state = 13; - } else { - v0->state = 12; - } - break; - case 2: - if (sub_02033DFC()) { - v0->state = 15; - } else { - v0->state = 14; - } - break; - default: - v0->state = 2; - break; - } - - return 1; -} - -static BOOL ov23_02251894(SysTask *param0, void *param1) -{ - UndergroundMenu *v0 = param1; - u32 v1, v2; - u16 v3, v4; - - v1 = UndergroundItemListMenu_ProcessInput(v0->itemListMenu); - - ListMenu_GetListAndCursorPos(v0->itemListMenu->listMenu, &v3, &v4); - CommManUnderground_StoreCursorAndListPos(UNDERGROUND_MENU_KEY_2, v4, v3); - - if (v1 == 0xfffffffe) { - v1 = 0xfffffffe; - } - - switch (v1) { - case 0xffffffff: - UndergroundMenu_UpdateScrollPrompts(v0, v3, ListMenu_GetAttribute(v0->itemListMenu->listMenu, 2), 6); - return 0; - case 0xfffffffe: - UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetItemNameTextPrinter()); - v0->state = 0; - break; - default: - UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetItemNameTextPrinter()); - v2 = UndergroundMenu_GetGoodAtSlotBag(v1, v0); - - if (ov23_02251418(v1, v0)) { - UndergroundTextPrinter_SetUndergroundGoodsName(CommManUnderground_GetMiscTextPrinter(), v2); - UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), 37, FALSE, NULL); - } else { - UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), 38, FALSE, NULL); - } - - v0->state = 19; - UndergroundMenu_EraseCurrentMenu(v0); - break; - } - - return 1; -} - -static BOOL ov23_02251960(SysTask *param0, void *param1) -{ - UndergroundMenu *v0 = param1; - u32 v1, v2; - u16 v3, v4; - int v5; - - v1 = UndergroundItemListMenu_ProcessInput(v0->itemListMenu); - - ListMenu_GetListAndCursorPos(v0->itemListMenu->listMenu, &v3, &v4); - CommManUnderground_StoreCursorAndListPos(UNDERGROUND_MENU_KEY_6, v4, v3); - - if (v1 == 0xfffffffe) { - v1 = 0xfffffffe; - } - - switch (v1) { - case 0xffffffff: - UndergroundMenu_UpdateScrollPrompts(v0, v3, ListMenu_GetAttribute(v0->itemListMenu->listMenu, 2), 6); - return 0; - case 0xfffffffe: - UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetItemNameTextPrinter()); - v0->state = 0; - break; - default: - UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetItemNameTextPrinter()); - v2 = UndergroundMenu_GetGoodAtSlotPC(v1, v0); - v5 = ov23_0225144C(v1, v0); - - if (1 == v5) { - UndergroundTextPrinter_SetUndergroundGoodsName(CommManUnderground_GetMiscTextPrinter(), v2); - UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), 36, FALSE, NULL); - } else if (-1 == v5) { - UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), 55, FALSE, NULL); - } else { - UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), 39, FALSE, NULL); - } - - v0->state = 22; - UndergroundMenu_EraseCurrentMenu(v0); - break; - } - - ScrollPrompts_SetDrawFlag(v0->scrollPrompts, SCROLL_PROMPT_TOP_ARROW, FALSE); - ScrollPrompts_SetDrawFlag(v0->scrollPrompts, SCROLL_PROMPT_BOTTOM_ARROW, FALSE); - - return 1; -} - -static BOOL ov23_02251A58(UndergroundMenu *param0) -{ - if (UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetMiscTextPrinter()) == FALSE) { - if (gSystem.pressedKeys & (PAD_BUTTON_A | PAD_BUTTON_B)) { - UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetMiscTextPrinter()); - return 1; - } - } - - return 0; -} - -static void ov23_02251A84(BOOL param0, FieldSystem *fieldSystem) -{ - VecFx32 v0; - - v0.y = 0; - v0.x = 15 * FX32_ONE * 16 - Player_GetXPos(fieldSystem->playerAvatar) * FX32_ONE * 16; - v0.z = 17 * FX32_ONE * 16 - Player_GetZPos(fieldSystem->playerAvatar) * FX32_ONE * 16; - - if (!param0) { - v0.x = -v0.x; - v0.z = -v0.z; - } - - Camera_Move(&v0, fieldSystem->camera); -} - -static BOOL ov23_02251ACC(FieldTask *param0) -{ - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(param0); - UnkStruct_ov23_02251ACC *v1 = FieldTask_GetEnv(param0); - Location v2; - u32 v3; - BOOL v4 = 0; - int v5; - - switch (v1->unk_00) { - case 0: - Sound_PlayEffect(SEQ_SE_DP_PC_LOGIN); - StartScreenFade(FADE_SUB_THEN_MAIN, FADE_TYPE_BRIGHTNESS_OUT, FADE_TYPE_BRIGHTNESS_OUT, COLOR_BLACK, 6, 1, HEAP_ID_FIELD1); - v1->unk_00 = 1; - break; - case 1: - if (IsScreenFadeDone()) { - PlayerAvatar_SetHidden(fieldSystem->playerAvatar, 0); - - ov23_02251A84(1, fieldSystem); - v1->unk_00 = 2; - } - break; - case 2: - ov23_02254D98(fieldSystem, param0); - v1->unk_00 = 3; - break; - case 3: - v1->unk_00 = 4; - break; - case 4: - PlayerAvatar_SetHidden(fieldSystem->playerAvatar, 1); - ov23_02251A84(0, fieldSystem); - StartScreenFade(FADE_MAIN_THEN_SUB, FADE_TYPE_BRIGHTNESS_IN, FADE_TYPE_BRIGHTNESS_IN, COLOR_BLACK, 6, 1, HEAP_ID_FIELD1); - v1->unk_00 = 5; - break; - case 5: - if (IsScreenFadeDone()) { - ov23_0224B2C8(fieldSystem); - SystemFlag_SetDecoratedSecretBase(SaveData_GetVarsFlags(fieldSystem->saveData)); - ov23_02251F94(fieldSystem); - Heap_Free(v1); - return 1; - } - break; - } - - return 0; -} - -static void ov23_02251BB4(SysTask *param0, UndergroundMenu *param1) -{ - Strbuf_Free(param1->strbuf); - Strbuf_Free(param1->fmtString); - StringTemplate_Free(param1->template); - - if (param1->exitCallback != NULL) { - param1->exitCallback(0); - } - - if (param1->scrollPrompts) { - ScrollPrompts_Free(param1->scrollPrompts); - param1->scrollPrompts = NULL; - } - - UndergroundMenu_EraseCurrentMenu(param1); - UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetMiscTextPrinter()); - - SysTask_Done(param0); - Heap_Free(param1); -} - -static void ov23_02251C04(SysTask *param0, void *param1) -{ - UndergroundMenu *v0 = param1; - u32 v1; - UnkStruct_ov23_02251ACC *v2; - - switch (v0->state) { - case 0: - ov23_02252E18(param1); - v0->listMenuCursorPos = CommManUnderground_GetStoredCursorPos(23); - v0->listMenuListPos = CommManUnderground_GetStoredListPos(23); - v0->unk_2AE = v0->listMenuCursorPos; - ov23_022515D8(param1, 0, 5, ov23_0225148C, 0); - v0->state = 1; - break; - case 1: - ov23_022514D8(param0, param1); - break; - case 2: - CommPlayerMan_ResumeFieldSystem(); - ov23_02243204(); - ov23_02251BB4(param0, v0); - break; - case 6: - UndergroundMenu_EraseCurrentMenu(param1); - UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetMiscTextPrinter()); - v0->unk_270 = ov23_02253C64(v0->fieldSystem->bgConfig, SaveData_GetTrainerInfo(FieldSystem_GetSaveData(v0->fieldSystem)), SaveData_GetUnderground(FieldSystem_GetSaveData(v0->fieldSystem)), NULL, NULL); - v0->state = 7; - break; - case 7: - if (gSystem.pressedKeys & (PAD_BUTTON_A | PAD_BUTTON_B)) { - ov23_02253D10(v0->unk_270); - v0->unk_270 = NULL; - v0->state = 0; - } - break; - case 8: - UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetMiscTextPrinter()); - v0->listMenuCursorPos = CommManUnderground_GetStoredCursorPos(22); - v0->listMenuListPos = CommManUnderground_GetStoredListPos(22); - v0->unk_2AE = v0->listMenuCursorPos; - ov23_022516E8(param1, 40, 3, ov23_022514B0, 1); - v0->state = 9; - break; - case 9: - ov23_022517E0(param0, param1); - break; - case 10: - UndergroundMenu_EraseCurrentMenu(v0); - ov23_02242FF8(); - ov23_022412F0(); - BrightnessController_StartTransition(1, -6, 0, GX_BLEND_PLANEMASK_BG0, BRIGHTNESS_MAIN_SCREEN); - UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), 48, FALSE, NULL); - v0->state = 16; - break; - case 11: - UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), 57, FALSE, NULL); - v0->state = 16; - break; - case 12: - UndergroundMenu_EraseCurrentMenu(v0); - ov23_02242FD0(); - SphereRadar_Start(); - BrightnessController_StartTransition(1, -6, 0, GX_BLEND_PLANEMASK_BG0, BRIGHTNESS_MAIN_SCREEN); - UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), 49, FALSE, NULL); - v0->state = 16; - break; - case 13: - UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), 58, FALSE, NULL); - v0->state = 16; - break; - case 14: - UndergroundMenu_EraseCurrentMenu(v0); - ov23_02242FE4(); - TrapRadar_Start(); - BrightnessController_StartTransition(1, -6, 0, GX_BLEND_PLANEMASK_BG0, BRIGHTNESS_MAIN_SCREEN); - UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), 50, FALSE, NULL); - v0->state = 16; - break; - case 15: - UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), 59, FALSE, NULL); - v0->state = 16; - break; - case 16: - if (UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetMiscTextPrinter()) == FALSE) { - if (gSystem.pressedKeys & (PAD_BUTTON_A | PAD_BUTTON_B)) { - if (!sub_02033DFC()) { - BrightnessController_StartTransition(1, 0, -6, GX_BLEND_PLANEMASK_BG0, BRIGHTNESS_MAIN_SCREEN); - } - - UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetMiscTextPrinter()); - - if (sub_02033DFC()) { - ov23_02242FA8(); - } else { - ov23_02242FBC(); - } - - TrapRadar_Exit(); - ov23_02241364(); - SphereRadar_Exit(); - - v0->state = 8; - } - } - break; - case 3: - if (v0->fieldSystem->task == NULL) { - v2 = Heap_AllocAtEnd(HEAP_ID_FIELD2, sizeof(UnkStruct_ov23_02251ACC)); - MI_CpuClear8(v2, sizeof(UnkStruct_ov23_02251ACC)); - v2->unk_00 = 0; - v2->unk_04 = 0; - FieldSystem_CreateTask(v0->fieldSystem, ov23_02251ACC, v2); - } - - ov23_02251BB4(param0, v0); - break; - case 17: - v0->listMenuCursorPos = CommManUnderground_GetStoredCursorPos(2); - v0->listMenuListPos = CommManUnderground_GetStoredListPos(2); - ov23_02250D2C(param1); - ov23_02252D74(param1, 28); - v0->state = 18; - break; - case 18: - ov23_02251894(param0, param1); - break; - case 19: - if (ov23_02251A58(v0)) { - v0->state = 17; - } - break; - case 20: - v0->listMenuCursorPos = CommManUnderground_GetStoredCursorPos(6); - v0->listMenuListPos = CommManUnderground_GetStoredListPos(6); - ov23_02250D5C(param1); - ov23_02252D74(param1, 32); - v0->state = 21; - break; - case 21: - ov23_02251960(param0, param1); - break; - case 22: - if (ov23_02251A58(v0)) { - v0->state = 20; - } - break; - case 23: - if (ov23_02251A58(v0)) { - v0->state = 0; - } - break; - } -} - -static void ov23_02251F94(FieldSystem *fieldSystem) -{ - ListMenuTemplate v0; - UndergroundMenu *v1; - const int v2 = 6; - - CommManUnderground_SetStoredPosKey(UNDERGROUND_STORED_POS_KEY_1); - - v1 = Heap_Alloc(HEAP_ID_FIELD1, sizeof(UndergroundMenu)); - MI_CpuFill8(v1, 0, sizeof(UndergroundMenu)); - v1->fieldSystem = fieldSystem; - - UndergroundTextPrinter_ChangeMessageLoaderBank(CommManUnderground_GetMiscTextPrinter(), TEXT_BANK_UNDERGROUND_BASE_PC, MSG_LOADER_LOAD_ON_DEMAND); - - v1->state = 0; - v1->strbuf = Strbuf_Init((50 * 2), HEAP_ID_FIELD1); - v1->fmtString = Strbuf_Init((50 * 2), HEAP_ID_FIELD1); - v1->template = StringTemplate_Default(HEAP_ID_FIELD1); - v1->scrollPrompts = ScrollPrompts_New(HEAP_ID_FIELD1); - - ScrollPrompts_SetPosition(v1->scrollPrompts, 200, 20, 122); - ScrollPrompts_SetDrawFlag(v1->scrollPrompts, SCROLL_PROMPT_TOP_ARROW, FALSE); - ScrollPrompts_SetDrawFlag(v1->scrollPrompts, SCROLL_PROMPT_BOTTOM_ARROW, FALSE); - - v1->sysTask = SysTask_Start(ov23_02251C04, v1, 10000); - - ov23_022431EC(v1, v1->sysTask, ov23_02251270); -} - -static void ov23_02252038(SysTask *param0, void *param1) -{ - UnkStruct_ov23_02252038 *v0 = param1; - int v1; - - switch (v0->unk_00) { - case 0: - if (UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetCommonTextPrinter()) == FALSE) { - v0->unk_08 = Menu_MakeYesNoChoice(v0->fieldSystem->bgConfig, &Unk_ov23_022569C8, 1024 - (18 + 12) - 9, 11, 4); - v0->unk_00 = 1; - } - break; - case 1: - v1 = Menu_ProcessInputAndHandleExit(v0->unk_08, 4); - - if (v1 == 0xffffffff) { - return; - } else if (v1 == 0) { - CommSys_SendDataFixedSize(89, &v0->unk_0C); - } else { - CommPlayerMan_ResumeFieldSystemWithContextBit(PAUSE_BIT_6); - UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetCommonTextPrinter()); - } - - v0->unk_00 = 2; - v0->unk_08 = NULL; - break; - case 2: - Heap_Free(v0); - ov23_02243204(); - SysTask_Done(param0); - break; - } -} - -static void ov23_022520C8(SysTask *param0, void *param1) -{ - UnkStruct_ov23_02252038 *v0 = param1; - - if (v0->unk_08) { - Menu_DestroyForExit(v0->unk_08, 4); - } - - Heap_Free(v0); - SysTask_Done(param0); -} - -static void ov23_022520E8(FieldSystem *fieldSystem, UnkStruct_ov23_022513B0 *param1) -{ - UnkStruct_ov23_02252038 *v0 = Heap_Alloc(HEAP_ID_FIELD1, sizeof(UndergroundMenu)); - - MI_CpuFill8(v0, 0, sizeof(UnkStruct_ov23_02252038)); - - v0->unk_00 = 0; - v0->fieldSystem = fieldSystem; - v0->primaryWindow = SysTask_Start(ov23_02252038, v0, 10000); - - UndergroundTextPrinter_SetPlayerNameIndex0(CommManUnderground_GetCommonTextPrinter(), CommInfo_TrainerInfo(param1->unk_01)); - UndergroundTextPrinter_PrintText(CommManUnderground_GetCommonTextPrinter(), 67, FALSE, NULL); - - v0->unk_0C.unk_00 = param1->unk_00; - v0->unk_0C.unk_01 = param1->unk_01; - v0->unk_0C.unk_02 = param1->unk_02; - - ov23_022431EC(v0, v0->primaryWindow, ov23_022520C8); -} - -void ov23_0225215C(int param0, int param1, void *param2, void *param3) -{ - UnkStruct_ov23_022513B0 *v0 = param2; - - if (ov23_0224AEC4(v0->unk_00, v0->unk_01)) { - sub_02035B48(90, v0); - } -} - -void ov23_02252178(int param0, int param1, void *param2, void *param3) -{ - FieldSystem *fieldSystem = param3; - UnkStruct_ov23_022513B0 *v1 = param2; - - if (CommSys_CurNetId() == v1->unk_00) { - UndergroundTextPrinter_SetPlayerNameIndex0(CommManUnderground_GetCaptureFlagTextPrinter(), CommInfo_TrainerInfo(v1->unk_01)); - UndergroundTextPrinter_PrintText(CommManUnderground_GetCaptureFlagTextPrinter(), 8, TRUE, ov23_022513A4); - Sound_PlayBGM(SEQ_HATANIGE); - } - - ov23_0224AEC4(v1->unk_00, v1->unk_01); - ov23_0224D500(v1->unk_00, v1->unk_01); -} - -static void ov23_022521C8(UndergroundMenu *param0) -{ - u16 v0 = param0->unk_2AE; - ListMenu_CalcTrueCursorPos(param0->unk_48, ¶m0->unk_2AE); - - if (v0 != param0->unk_2AE) { - Sound_PlayEffect(SEQ_SE_CONFIRM); - } - - return; -} diff --git a/src/overlay023/ov23_022521F0.c b/src/overlay023/ov23_022521F0.c index 1b27d955f7..64d7dd096f 100644 --- a/src/overlay023/ov23_022521F0.c +++ b/src/overlay023/ov23_022521F0.c @@ -3,6 +3,8 @@ #include #include +#include "constants/field_base_tiles.h" + #include "struct_decls/struct_02061AB4_decl.h" #include "struct_defs/underground.h" @@ -553,32 +555,32 @@ static void ov23_02252D1C(UndergroundMenu *param0) Window_CopyToVRAM(¶m0->secondaryWindow); } -void ov23_02252D74(UndergroundMenu *param0, int param1) +void UndergroundMenu_PrintMenuDescription(UndergroundMenu *menu, int bankEntry) { - Window_Add(param0->fieldSystem->bgConfig, ¶m0->unk_30, 3, 1, 1, 7, 4, 13, 51); - Window_DrawStandardFrame(¶m0->unk_30, 1, 1024 - (18 + 12) - 9, 11); + Window_Add(menu->fieldSystem->bgConfig, &menu->menuDescriptionWindow, BG_LAYER_MAIN_3, 1, 1, 7, 4, 13, 51); + Window_DrawStandardFrame(&menu->menuDescriptionWindow, TRUE, BASE_TILE_STANDARD_WINDOW_FRAME, 11); - Window_FillTilemap(¶m0->unk_30, 15); - Window_CopyToVRAM(¶m0->unk_30); + Window_FillTilemap(&menu->menuDescriptionWindow, 15); + Window_CopyToVRAM(&menu->menuDescriptionWindow); - MessageLoader_GetStrbuf(UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), param1, param0->strbuf); - Text_AddPrinterWithParams(¶m0->unk_30, FONT_SYSTEM, param0->strbuf, 1, 1, TEXT_SPEED_NO_TRANSFER, NULL); - Window_ScheduleCopyToVRAM(¶m0->unk_30); + MessageLoader_GetStrbuf(UndergroundTextPrinter_GetMessageLoader(CommManUnderground_GetMiscTextPrinter()), bankEntry, menu->strbuf); + Text_AddPrinterWithParams(&menu->menuDescriptionWindow, FONT_SYSTEM, menu->strbuf, 1, 1, TEXT_SPEED_NO_TRANSFER, NULL); + Window_ScheduleCopyToVRAM(&menu->menuDescriptionWindow); } -void ov23_02252DF4(UndergroundMenu *param0) +void UndergroundMenu_RemoveDescriptionWindow(UndergroundMenu *menu) { - if (Window_IsInUse(¶m0->unk_30)) { - Window_EraseStandardFrame(¶m0->unk_30, 1); - Window_Remove(¶m0->unk_30); + if (Window_IsInUse(&menu->menuDescriptionWindow)) { + Window_EraseStandardFrame(&menu->menuDescriptionWindow, TRUE); + Window_Remove(&menu->menuDescriptionWindow); } } -void ov23_02252E18(UndergroundMenu *param0) +void UndergroundMenu_RemoveDescriptionWindowInstant(UndergroundMenu *menu) { - if (Window_IsInUse(¶m0->unk_30)) { - Window_EraseStandardFrame(¶m0->unk_30, 0); - Window_Remove(¶m0->unk_30); + if (Window_IsInUse(&menu->menuDescriptionWindow)) { + Window_EraseStandardFrame(&menu->menuDescriptionWindow, FALSE); + Window_Remove(&menu->menuDescriptionWindow); } } @@ -723,7 +725,7 @@ static void ov23_02252E70(SysTask *param0, void *param1) v0->listMenuListPos = CommManUnderground_GetStoredListPos(12); ov23_02250184(v0); - ov23_02252D74(v0, 19); + UndergroundMenu_PrintMenuDescription(v0, 19); if (v0->unk_2AC == 1) { ov23_02252CF4(2, v0->unk_274[v0->unk_2A8]); @@ -747,13 +749,13 @@ static void ov23_02252E70(SysTask *param0, void *param1) case 0xffffffff: break; case 0xfffffffe: - ov23_02252DF4(v0); + UndergroundMenu_RemoveDescriptionWindow(v0); v0->state = 4; break; default: v1 = ov23_02252404(v0, v0->unk_2A8, v1); ov23_02252B90(v0, 1); - ov23_02252DF4(v0); + UndergroundMenu_RemoveDescriptionWindow(v0); if (v1 == 0xfffc) { ov23_02252C9C(3); @@ -810,13 +812,13 @@ static void ov23_02252E70(SysTask *param0, void *param1) if (v0->unk_2AC == 1) { ov23_0224FDBC(v0); - ov23_02252D74(v0, 20); + UndergroundMenu_PrintMenuDescription(v0, 20); } else if (v0->unk_2AC == 0) { ov23_02250CB0(v0); - ov23_02252D74(v0, 21); + UndergroundMenu_PrintMenuDescription(v0, 21); } else { ov23_02250578(v0); - ov23_02252D74(v0, 29); + UndergroundMenu_PrintMenuDescription(v0, 29); } v0->state = 13; @@ -830,7 +832,7 @@ static void ov23_02252E70(SysTask *param0, void *param1) case 0xfffffffe: UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetItemNameTextPrinter()); ov23_02252B90(v0, 1); - ov23_02252DF4(v0); + UndergroundMenu_RemoveDescriptionWindow(v0); v0->state = 2; break; case 0xffffffff: @@ -840,7 +842,7 @@ static void ov23_02252E70(SysTask *param0, void *param1) UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetItemNameTextPrinter()); v0->unk_2A8 = v1; ov23_02252B90(v0, 1); - ov23_02252DF4(v0); + UndergroundMenu_RemoveDescriptionWindow(v0); ov23_02252BB8(v1, v0); v0->state = 14; } @@ -896,7 +898,7 @@ static void ov23_02252E70(SysTask *param0, void *param1) if (gSystem.pressedKeys & (PAD_BUTTON_A | PAD_BUTTON_B)) { ov23_02252CD4(); ov23_02252C78(v0); - ov23_02243204(); + CommManUnderground_ClearCurrentSysTaskInfo(); SysTask_Done(param0); CommPlayerMan_ResumeFieldSystem(); } @@ -933,7 +935,7 @@ void ov23_022534A0(FieldSystem *fieldSystem) Sound_PlayEffect(SEQ_SE_CONFIRM); v4->sysTask = SysTask_Start(ov23_02252E70, v4, 10000); - ov23_022431EC(v4, v4->sysTask, ov23_02251270); + CommManUnderground_SetCurrentSysTask(v4, v4->sysTask, UndergroundMenu_ResetBrightnessAndExit); { int objEventCount, i; diff --git a/src/overlay023/ov23_02253598.c b/src/overlay023/ov23_02253598.c index ea505d3217..b9e35daed0 100644 --- a/src/overlay023/ov23_02253598.c +++ b/src/overlay023/ov23_02253598.c @@ -107,7 +107,7 @@ static UnkFuncPtr_ov23_022576EC Unk_ov23_022576EC[] = { UndergroundRecord_GetNumTrapsTriggered, UndergroundRecord_GetNumPlayersHelped, UndergroundRecord_GetGiftsReceived, - sub_020297AC, + UndergroundRecord_GetTimesFlagTaken, sub_020297E4, sub_0202981C, UndergroundRecord_GetCapturedFlagCount @@ -406,7 +406,7 @@ void *ov23_02253C64(BgConfig *param0, TrainerInfo *param1, Underground *undergro Window_Add(param0, &v4->unk_08, 3, 4, 2, 24, 19, 13, 1); Window_DrawStandardFrame(&v4->unk_08, 1, 1024 - (18 + 12) - 9, 11); - v1 = MessageLoader_Init(MSG_LOADER_PRELOAD_ENTIRE_BANK, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_UNDERGROUND_BASE_PC, HEAP_ID_FIELD1); + v1 = MessageLoader_Init(MSG_LOADER_PRELOAD_ENTIRE_BANK, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_UNDERGROUND_PC, HEAP_ID_FIELD1); Window_FillTilemap(&v4->unk_08, 15); v0 = Unk_ov23_022577BC->record; diff --git a/src/overlay023/underground_menu.c b/src/overlay023/underground_menu.c index 8146f6bde6..164e0e74e2 100644 --- a/src/overlay023/underground_menu.c +++ b/src/overlay023/underground_menu.c @@ -14,7 +14,6 @@ #include "overlay023/ov23_02241F74.h" #include "overlay023/ov23_0224A1D0.h" #include "overlay023/ov23_0224B05C.h" -#include "overlay023/ov23_0225128C.h" #include "overlay023/ov23_022521F0.h" #include "overlay023/ov23_02253598.h" #include "overlay023/underground_item_list_menu.h" @@ -489,7 +488,7 @@ void UndergroundMenu_Start(ExitCallback exitCallback, FieldSystem *fieldSystem) menu->template = StringTemplate_Default(HEAP_ID_FIELD1); menu->sysTask = SysTask_Start(UndergroundMenu_Main, menu, 10000); - ov23_022431EC(menu, menu->sysTask, ov23_02251270); + CommManUnderground_SetCurrentSysTask(menu, menu->sysTask, UndergroundMenu_ResetBrightnessAndExit); } #define ADD_OPTION(__menuOption) \ @@ -569,12 +568,12 @@ static void UndergroundMenu_Main(SysTask *sysTask, void *data) break; case UNDERGROUND_MENU_STATE_CLOSE: UndergroundMenu_EraseCurrentMenu(menu); - ov23_02243204(); + CommManUnderground_ClearCurrentSysTaskInfo(); UndergroundMenu_Free(sysTask, menu, FALSE); return; case UNDERGROUND_MENU_STATE_CLOSE_LEAVE_PAUSED: UndergroundMenu_EraseCurrentMenu(menu); - ov23_02243204(); + CommManUnderground_ClearCurrentSysTaskInfo(); UndergroundMenu_Free(sysTask, menu, TRUE); return; case UNDERGROUND_MENU_STATE_TRAPS: @@ -605,7 +604,7 @@ static void UndergroundMenu_Main(SysTask *sysTask, void *data) if (JOY_NEW(PAD_BUTTON_A)) { UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetCommonTextPrinter()); UndergroundMenu_Free(sysTask, menu, FALSE); - ov23_02243204(); + CommManUnderground_ClearCurrentSysTaskInfo(); return; } } @@ -623,7 +622,7 @@ static void UndergroundMenu_Main(SysTask *sysTask, void *data) case UNDERGROUND_MENU_STATE_RETURN_TO_SURFACE: UndergroundMenu_EraseCurrentMenu(menu); UndergroundMenu_Free(sysTask, menu, TRUE); - ov23_02243204(); + CommManUnderground_ClearCurrentSysTaskInfo(); FieldTask_SetUndergroundMapChange(menu->fieldSystem); return; case UNDERGROUND_MENU_STATE_TRAP_SELECTED: @@ -711,7 +710,7 @@ void UndergroundMenu_EraseCurrentMenu(UndergroundMenu *menu) Bg_ScheduleTilemapTransfer(menu->primaryWindow.bgConfig, menu->primaryWindow.bgLayer); Window_Remove(&menu->primaryWindow); StringList_Free(menu->menuOptions); - ov23_02252DF4(menu); + UndergroundMenu_RemoveDescriptionWindow(menu); } } @@ -1424,7 +1423,7 @@ void UndergroundMenu_StartHoldingFlag(ExitCallback exitCallback, FieldSystem *fi UndergroundTextPrinter_PrintText(CommManUnderground_GetCaptureFlagTextPrinter(), UndergroundCaptureFlag_Text_PromptThrowAwayFlag, FALSE, NULL); menu->sysTask = SysTask_Start(ov23_02250B9C, menu, 10000); - ov23_022431EC(menu, menu->sysTask, ov23_02251270); + CommManUnderground_SetCurrentSysTask(menu, menu->sysTask, UndergroundMenu_ResetBrightnessAndExit); } static void UndergroundMenu_ConfirmThrowAwayFlag(UndergroundMenu *menu) @@ -1486,7 +1485,7 @@ static void ov23_02250B9C(SysTask *sysTask, void *data) { UndergroundMenu *menu = data; - if (!ov23_0224AEA4(CommSys_CurNetId())) { + if (!ov23_IsPlayerHoldingFlag(CommSys_CurNetId())) { if (menu->state == UNDERGROUND_MENU_STATE_INIT || menu->state == UNDERGROUND_MENU_STATE_START) { menu->state = UNDERGROUND_MENU_STATE_CLOSE; } @@ -1500,11 +1499,11 @@ static void ov23_02250B9C(SysTask *sysTask, void *data) UndergroundMenu_CheckForThrowAwayYesNo(data); break; case UNDERGROUND_MENU_STATE_CLOSE: - ov23_02243204(); + CommManUnderground_ClearCurrentSysTaskInfo(); UndergroundMenu_Free(sysTask, data, FALSE); return; case UNDERGROUND_MENU_STATE_CLOSE_LEAVE_PAUSED: - ov23_02243204(); + CommManUnderground_ClearCurrentSysTaskInfo(); UndergroundMenu_Free(sysTask, data, TRUE); u8 buffer = 0; CommSys_SendDataFixedSize(84, &buffer); @@ -1569,7 +1568,7 @@ void UndergroundMenu_OpenGoodsMenu(UndergroundMenu *menu) UndergroundMenu_InitGoodsMenu(menu, Underground_MoveGoodBag); } -void ov23_02250D2C(UndergroundMenu *menu) +void UndergroundMenu_OpenStoreGoodsMenu(UndergroundMenu *menu) { menu->getItemCount = UndergroundMenu_GetGoodsCountBag; menu->getItem = UndergroundMenu_GetGoodAtSlotBag; @@ -1579,7 +1578,7 @@ void ov23_02250D2C(UndergroundMenu *menu) UndergroundMenu_InitGoodsMenu(menu, Underground_MoveGoodBag); } -void ov23_02250D5C(UndergroundMenu *menu) +void UndergroundMenu_OpenWithdrawGoodsMenu(UndergroundMenu *menu) { menu->getItemCount = UndergroundMenu_GetGoodsCountPC; menu->getItem = UndergroundMenu_GetGoodAtSlotPC; @@ -1716,7 +1715,7 @@ static BOOL UndergroundMenu_HandleGoodSelectedMenu(SysTask *sysTask, void *data) return TRUE; } -void UndergroundMenu_ExitGiftMenu(void *data, u32 input) +void UndergroundMenu_Exit(void *data, u32 input) { UndergroundMenu *menu = data; @@ -1793,11 +1792,10 @@ static BOOL UndergroundMenu_HandleGiftMenu(SysTask *sysTask, void *data) } UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetItemNameTextPrinter()); - UndergroundMenu_ExitGiftMenu(menu, input); - ov23_02243204(); + UndergroundMenu_Exit(menu, input); + CommManUnderground_ClearCurrentSysTaskInfo(); return TRUE; default: - if (menu->exitCallback != NULL) { ctx->selectedSlot = input; ctx->selectedID = UndergroundMenu_GetGoodAtSlotBag(input, menu); @@ -1806,8 +1804,8 @@ static BOOL UndergroundMenu_HandleGiftMenu(SysTask *sysTask, void *data) } UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetItemNameTextPrinter()); - UndergroundMenu_ExitGiftMenu(menu, input); - ov23_02243204(); + UndergroundMenu_Exit(menu, input); + CommManUnderground_ClearCurrentSysTaskInfo(); return TRUE; break; } @@ -1836,7 +1834,7 @@ void *UndergroundMenu_StartGiftMenu(ExitCallback exitCallback, FieldSystem *fiel menu->state = UNDERGROUND_MENU_STATE_GIVE_GIFT; menu->sysTask = SysTask_Start(UndergroundMenu_Main, menu, 10000); - ov23_022431EC(menu, menu->sysTask, ov23_02251270); + CommManUnderground_SetCurrentSysTask(menu, menu->sysTask, UndergroundMenu_ResetBrightnessAndExit); return menu; } @@ -1859,8 +1857,29 @@ void UndergroundMenu_MoveListCursorPosInBounds(UndergroundMenu *menu, int maxDis } } -void ov23_02251270(SysTask *sysTask, void *param1) +void UndergroundMenu_ResetBrightnessAndExit(SysTask *sysTask, void *data) { BrightnessController_SetScreenBrightness(0, GX_BLEND_PLANEMASK_BG0, BRIGHTNESS_MAIN_SCREEN); - UndergroundMenu_ExitGiftMenu(param1, LIST_CANCEL); + UndergroundMenu_Exit(data, LIST_CANCEL); +} + +void UndergroundMenu_UpdateScrollPrompts(UndergroundMenu *menu, int listPos, int count, int maxDisplay) +{ + if (count <= maxDisplay) { + return; + } + + if (listPos != 0) { + ScrollPrompts_SetDrawFlag(menu->scrollPrompts, SCROLL_PROMPT_TOP_ARROW, TRUE); + } else { + ScrollPrompts_SetDrawFlag(menu->scrollPrompts, SCROLL_PROMPT_TOP_ARROW, FALSE); + } + + if (listPos + maxDisplay != count) { + ScrollPrompts_SetDrawFlag(menu->scrollPrompts, SCROLL_PROMPT_BOTTOM_ARROW, TRUE); + } else { + ScrollPrompts_SetDrawFlag(menu->scrollPrompts, SCROLL_PROMPT_BOTTOM_ARROW, FALSE); + } + + ScrollPrompts_UpdateAnim(menu->scrollPrompts); } diff --git a/src/overlay023/underground_pc.c b/src/overlay023/underground_pc.c new file mode 100644 index 0000000000..f3a54caac9 --- /dev/null +++ b/src/overlay023/underground_pc.c @@ -0,0 +1,966 @@ +#include "overlay023/underground_pc.h" + +#include +#include + +#include "constants/field_base_tiles.h" +#include "constants/map_object.h" + +#include "struct_defs/underground.h" + +#include "field/field_system.h" +#include "overlay023/ov23_0223E140.h" +#include "overlay023/ov23_02241F74.h" +#include "overlay023/ov23_0224A1D0.h" +#include "overlay023/ov23_0224B05C.h" +#include "overlay023/ov23_022521F0.h" +#include "overlay023/ov23_02253598.h" +#include "overlay023/ov23_02254A14.h" +#include "overlay023/underground_item_list_menu.h" +#include "overlay023/underground_menu.h" +#include "overlay023/underground_spheres.h" +#include "overlay023/underground_text_printer.h" +#include "overlay023/underground_traps.h" + +#include "bg_window.h" +#include "brightness_controller.h" +#include "camera.h" +#include "comm_player_manager.h" +#include "communication_information.h" +#include "communication_system.h" +#include "field_system.h" +#include "field_task.h" +#include "heap.h" +#include "list_menu.h" +#include "location.h" +#include "menu.h" +#include "message.h" +#include "player_avatar.h" +#include "render_window.h" +#include "save_player.h" +#include "screen_fade.h" +#include "scroll_prompts.h" +#include "sound_playback.h" +#include "strbuf.h" +#include "string_list.h" +#include "string_template.h" +#include "sys_task.h" +#include "sys_task_manager.h" +#include "system.h" +#include "system_flags.h" +#include "unk_0202854C.h" +#include "unk_02033200.h" +#include "vars_flags.h" + +#include "res/text/bank/underground_capture_flag.h" +#include "res/text/bank/underground_common.h" +#include "res/text/bank/underground_pc.h" + +#define SECRET_BASE_WIDTH 32 +#define SECRET_BASE_HEIGHT 32 + +#define PC_COORDINATE_X 15 +#define PC_COORDINATE_Z 12 + +enum UndergroundPCMenuState { + UG_PC_MENU_STATE_INIT = 0, + UG_PC_MENU_STATE_MAIN, + UG_PC_MENU_STATE_EXIT, + UG_PC_MENU_STATE_DECORATE, + UG_PC_MENU_STATE_INIT_CHECK_FLAGS = 6, + UG_PC_MENU_STATE_CHECK_FLAGS, + UG_PC_MENU_STATE_INIT_RADAR_MENU, + UG_PC_MENU_STATE_RADAR_MENU_MAIN, + UG_PC_MENU_STATE_START_TREASURE_RADAR, + UG_PC_MENU_STATE_TREASURE_RADAR_NOT_AVAILABLE, + UG_PC_MENU_STATE_START_SPHERE_RADAR, + UG_PC_MENU_STATE_SPHERE_RADAR_NOT_AVAILABLE, + UG_PC_MENU_STATE_START_TRAP_RADAR, + UG_PC_MENU_STATE_TRAP_RADAR_NOT_AVAILABLE, + UG_PC_MENU_STATE_EXIT_RADAR_ON_BUTTON_PRESS, + UG_PC_MENU_STATE_INIT_STORE_GOODS, + UG_PC_MENU_STATE_STORE_GOODS, + UG_PC_MENU_STATE_STORE_GOODS_WAIT_FOR_MESSAGE, + UG_PC_MENU_STATE_INIT_WITHDRAW_GOODS, + UG_PC_MENU_STATE_WITHDRAW_GOODS, + UG_PC_MENU_STATE_WITHDRAW_GOODS_WAIT_FOR_MESSAGE, + UG_PC_MENU_STATE_WAIT_FOR_MESSAGE, +}; + +enum UndergroundPCMenuOption { + UG_PC_MENU_OPTION_DECORATE = 0, + UG_PC_MENU_OPTION_STORE_GOODS, + UG_PC_MENU_OPTION_RECEIVE_GOODS, + UG_PC_MENU_OPTION_CHECK_FLAGS, + UG_PC_MENU_OPTION_USE_RADAR, +}; + +enum RadarMenuOption { + RADAR_MENU_OPTION_TREASURE = 0, + RADAR_MENU_OPTION_SPHERE, + RADAR_MENU_OPTION_TRAP, +}; + +enum TakeFlagPromptState { + TAKE_FLAG_PROMPT_STATE_INIT = 0, + TAKE_FLAG_PROMPT_STATE_MAIN, + TAKE_FLAG_PROMPT_STATE_EXIT, +}; + +enum DecorateState { + DECORATE_STATE_FADE = 0, + DECORATE_STATE_UPDATE_CAMERA, + DECORATE_STATE_START, + DECORATE_STATE_MAIN, + DECORATE_STATE_REVERT_CAMERA, + DECORATE_STATE_END, +}; + +typedef struct PCInteraction { + u8 playerNetID; + u8 pcNetID; + u8 canTakeFlag; +} PCInteraction; + +typedef struct DecorateContext { + int state; + int dummy; + u8 unused; +} DecorateContext; + +typedef struct TakeFlagPromptContext { + int state; + FieldSystem *fieldSystem; + Menu *menu; + PCInteraction pcInteraction; + SysTask *sysTask; +} TakeFlagPromptContext; + +static void UndergroundPC_StartTakeFlagPromptTask(FieldSystem *fieldSystem, PCInteraction *pcInteraction); +static void UndergroundPC_OpenPCMenu(FieldSystem *fieldSystem); +static void UndergroundPC_UpdateCursorPos(UndergroundMenu *menu); + +static const WindowTemplate sWindowTemplate = { + .bgLayer = BG_LAYER_MAIN_3, + .tilemapLeft = 25, + .tilemapTop = 13, + .width = 6, + .height = 4, + .palette = 13, + .baseTile = 543, +}; + +int UndergroundPC_GetPCAtCoordinates(Coordinates *coordinates, int dir) +{ + int netID; + int x = coordinates->x; + int z = coordinates->z; + int modifier = 0; + + if (dir != DIR_NONE && dir != DIR_NORTH) { + return PC_NONE; + } + + if (z == PC_COORDINATE_Z) { + modifier = 0; + } else if (z == PC_COORDINATE_Z + SECRET_BASE_HEIGHT) { + modifier = MAX_CONNECTED_PLAYERS; // bug: would lead to out of bounds array access + } else { + return PC_NONE; + } + + if (x == PC_COORDINATE_X || x == PC_COORDINATE_X + 1) { + return 0; + } + + for (netID = 0; netID < MAX_CONNECTED_PLAYERS; netID++) { + if (x == PC_COORDINATE_X + SECRET_BASE_WIDTH || x == PC_COORDINATE_X + 1 + SECRET_BASE_WIDTH) { + return netID + modifier; + } + + x -= SECRET_BASE_WIDTH; + } + + return PC_NONE; +} + +BOOL UndergroundPC_TryUsePC(int netID, Coordinates *coordinates) +{ + int pcNetID = UndergroundPC_GetPCAtCoordinates(coordinates, CommPlayer_DirServer(netID)); + + if (CommPlayer_Dir(pcNetID) == DIR_NONE) { + pcNetID = PC_NONE; + } + + if (pcNetID != PC_NONE) { + sub_02059058(netID, FALSE); + + PCInteraction pcInteraction; + pcInteraction.pcNetID = pcNetID; + pcInteraction.playerNetID = netID; + pcInteraction.canTakeFlag = FALSE; + + if (pcNetID != netID) { + if (!ov23_IsPlayerHoldingFlag(netID)) { + pcInteraction.canTakeFlag = TRUE; + } + } else { + if (ov23_IsPlayerHoldingFlag(netID)) { + u8 v5 = 3; // TODO: label this when below function is documented + ov23_0224A570(netID, 1, &v5, NULL); + return TRUE; + } + } + + sub_02035B48(83, &pcInteraction); + return TRUE; + } + + return FALSE; +} + +static void UndergroundPC_ResumeFieldSystem(int unused) +{ + CommPlayerMan_ResumeFieldSystemWithContextBit(PAUSE_BIT_LINK_PC); +} + +void UndergroundPC_ProcessPCInteraction(int unused0, int unused1, void *data, void *data2) +{ + PCInteraction *pcInteraction = data; + FieldSystem *fieldSystem = data2; + + if (!CommSys_IsSendingMovementData()) { + return; + } + + if (pcInteraction->playerNetID == CommSys_CurNetId()) { + if (pcInteraction->pcNetID == CommSys_CurNetId()) { + Sound_PlayEffect(SEQ_SE_DP_PC_ON); + CommPlayerMan_PauseFieldSystem(); + UndergroundPC_OpenPCMenu(fieldSystem); + } else { + CommPlayerMan_PauseFieldSystemWithContextBit(PAUSE_BIT_LINK_PC); + + if (pcInteraction->canTakeFlag) { + UndergroundPC_StartTakeFlagPromptTask(fieldSystem, pcInteraction); + } else { + UndergroundTextPrinter_PrintText(CommManUnderground_GetCaptureFlagTextPrinter(), UndergroundCaptureFlag_Text_YouAlreadyHaveFlag, TRUE, UndergroundPC_ResumeFieldSystem); + } + } + } +} + +int CommPacketSizeOf_PCInteraction(void) +{ + return sizeof(PCInteraction); +} + +static BOOL UndergroundPC_TryDepositGood(int slot, UndergroundMenu *menu) +{ + Underground *underground = SaveData_GetUnderground(FieldSystem_GetSaveData(menu->fieldSystem)); + int goodID = Underground_GetGoodAtSlotBag(underground, slot); + + if (Underground_TryAddGoodPC(underground, goodID)) { + Underground_RemoveGoodAtSlotBag(underground, slot); + return TRUE; + } + + return FALSE; +} + +static int UndergroundPC_TryWithdrawGood(int slot, UndergroundMenu *menu) +{ + Underground *underground = SaveData_GetUnderground(FieldSystem_GetSaveData(menu->fieldSystem)); + + if (Underground_IsGoodAtSlotPlacedInBase(underground, slot)) { + return -1; + } + + int goodID = Underground_GetGoodAtSlotPC(underground, slot); + + if (UndergroundInventory_TryAddGoodBag(goodID)) { + Underground_RemoveGoodAtSlotPC(underground, slot); + return TRUE; + } + + return FALSE; +} + +static void UndergroundPC_PrintMenuItemDescription(ListMenu *listMenu, u32 menuItemIdx, u8 unused) +{ + ListMenu_GetAttribute(listMenu, LIST_MENU_PARENT); + int index = menuItemIdx; + + if (menuItemIdx == LIST_CANCEL) { + index = UndergroundPC_Text_ExitDescription - UndergroundPC_Text_DecorateDescription; + } + + UndergroundTextPrinter_PrintTextInstant(CommManUnderground_GetMiscTextPrinter(), UndergroundPC_Text_DecorateDescription + index, FALSE, NULL); +} + +static void UndergroundPC_PrintRadarMenuItemDescription(ListMenu *listMenu, u32 menuItemIdx, u8 unused) +{ + ListMenu_GetAttribute(listMenu, LIST_MENU_PARENT); + int index = menuItemIdx; + + if (menuItemIdx == LIST_CANCEL) { + index = UndergroundPC_Text_CancelDescription - UndergroundPC_Text_TreasureSearchDescription; + } + + UndergroundTextPrinter_PrintTextInstant(CommManUnderground_GetMiscTextPrinter(), UndergroundPC_Text_TreasureSearchDescription + index, FALSE, NULL); +} + +static BOOL UndergroundPC_HandleMenu(SysTask *sysTask, void *data) +{ + UndergroundMenu *menu = data; + + u32 input = ListMenu_ProcessInput(menu->unk_48); + u16 listPos, cursorPos; + ListMenu_GetListAndCursorPos(menu->unk_48, &listPos, &cursorPos); + + CommManUnderground_StoreCursorAndListPos(UNDERGROUND_MENU_KEY_PC, cursorPos, listPos); + UndergroundPC_UpdateCursorPos(menu); + + switch (input) { + case LIST_NOTHING_CHOSEN: + return FALSE; + case LIST_CANCEL: + Sound_PlayEffect(SEQ_SE_DP_PC_LOGOFF); + menu->state = UG_PC_MENU_STATE_EXIT; + break; + case UG_PC_MENU_OPTION_DECORATE: + Underground *underground = SaveData_GetUnderground(menu->fieldSystem->saveData); + + if (Underground_GetGoodsCountPC(underground) == 0) { + UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), UndergroundPC_Text_StoreGoodsBeforeDecorating, FALSE, NULL); + menu->state = UG_PC_MENU_STATE_WAIT_FOR_MESSAGE; + } else if (CommServerClient_IsInClosedSecretBase()) { + CommManUnderground_ClearCurrentSysTaskInfo(); + menu->state = UG_PC_MENU_STATE_DECORATE; + } else { + UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), UndergroundPC_Text_CantDecorateWithEntranceOpen, FALSE, NULL); + menu->state = UG_PC_MENU_STATE_WAIT_FOR_MESSAGE; + } + break; + case UG_PC_MENU_OPTION_USE_RADAR: + Sound_PlayEffect(SEQ_SE_CONFIRM); + menu->state = UG_PC_MENU_STATE_INIT_RADAR_MENU; + break; + case UG_PC_MENU_OPTION_CHECK_FLAGS: + Sound_PlayEffect(SEQ_SE_CONFIRM); + menu->state = UG_PC_MENU_STATE_INIT_CHECK_FLAGS; + break; + case UG_PC_MENU_OPTION_STORE_GOODS: + Sound_PlayEffect(SEQ_SE_CONFIRM); + menu->state = UG_PC_MENU_STATE_INIT_STORE_GOODS; + break; + case UG_PC_MENU_OPTION_RECEIVE_GOODS: + Sound_PlayEffect(SEQ_SE_CONFIRM); + menu->state = UG_PC_MENU_STATE_INIT_WITHDRAW_GOODS; + break; + default: + break; + } + + return TRUE; +} + +static void UndergroundPC_InitMenu(UndergroundMenu *menu, int startBankEntry, int optionCount, CursorCallback cursorCallback, int unused) +{ + int trueOptionCount = optionCount + 1; + BOOL radarEnabled = TRUE; + + if (UndergroundRecord_GetFlagRank(SaveData_UndergroundRecord(menu->fieldSystem->saveData)) < BASE_FLAG_GOLD) { + radarEnabled = FALSE; + trueOptionCount -= 1; + } + + UndergroundMenu_EraseCurrentMenu(menu); + + menu->menuOptions = StringList_New(trueOptionCount, HEAP_ID_FIELD1); + + Window_Add(menu->fieldSystem->bgConfig, &menu->primaryWindow, BG_LAYER_MAIN_3, 17, 3, 14, trueOptionCount * 2, 13, 2); + Window_DrawStandardFrame(&menu->primaryWindow, TRUE, BASE_TILE_STANDARD_WINDOW_FRAME, 11); + + MessageLoader *loader = MessageLoader_Init(MSG_LOADER_PRELOAD_ENTIRE_BANK, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_UNDERGROUND_PC, HEAP_ID_FIELD1); + + for (int i = 0; i < trueOptionCount; i++) { + if (i == trueOptionCount - 1) { + StringList_AddFromMessageBank(menu->menuOptions, loader, startBankEntry + (UndergroundPC_Text_Exit - UndergroundPC_Text_Decorate), LIST_CANCEL); + } else { + StringList_AddFromMessageBank(menu->menuOptions, loader, startBankEntry + i, i); + } + } + + MessageLoader_Free(loader); + + ListMenuTemplate template; + MI_CpuCopy8(UndergroundTextPrinter_GetListMenuTemplate(), &template, sizeof(ListMenuTemplate)); + + template.count = trueOptionCount; + template.maxDisplay = trueOptionCount; + template.choices = menu->menuOptions; + template.window = &menu->primaryWindow; + + if (cursorCallback) { + template.cursorCallback = cursorCallback; + } + + template.parent = menu; + UndergroundMenu_MoveListCursorPosInBounds(menu, trueOptionCount, template.count); + menu->unk_48 = ListMenu_New(&template, menu->listMenuListPos, menu->listMenuCursorPos, HEAP_ID_FIELD1); +} + +static void UndergroundPC_InitRadarMenu(UndergroundMenu *menu, int startBankEntry, int optionCount, CursorCallback cursorCallback, int unused) +{ + int trueOptionCount = optionCount + 1; + + UndergroundMenu_EraseCurrentMenu(menu); + + menu->menuOptions = StringList_New(trueOptionCount, HEAP_ID_FIELD1); + + Window_Add(menu->fieldSystem->bgConfig, &menu->primaryWindow, BG_LAYER_MAIN_3, 17, 3, 14, trueOptionCount * 2, 13, 2 + 14 * 16); + Window_DrawStandardFrame(&menu->primaryWindow, TRUE, BASE_TILE_STANDARD_WINDOW_FRAME, 11); + + MessageLoader *loader = MessageLoader_Init(MSG_LOADER_PRELOAD_ENTIRE_BANK, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_UNDERGROUND_PC, HEAP_ID_FIELD1); + + for (int i = 0; i < trueOptionCount; i++) { + if (i == optionCount) { + StringList_AddFromMessageBank(menu->menuOptions, loader, startBankEntry + i, LIST_CANCEL); + } else { + StringList_AddFromMessageBank(menu->menuOptions, loader, startBankEntry + i, i); + } + } + + MessageLoader_Free(loader); + + ListMenuTemplate template; + MI_CpuCopy8(UndergroundTextPrinter_GetListMenuTemplate(), &template, sizeof(ListMenuTemplate)); + + template.count = optionCount + 1; + template.maxDisplay = trueOptionCount; + template.choices = menu->menuOptions; + template.window = &menu->primaryWindow; + + if (cursorCallback) { + template.cursorCallback = cursorCallback; + } + + template.parent = menu; + UndergroundMenu_MoveListCursorPosInBounds(menu, trueOptionCount, template.count); + menu->unk_48 = ListMenu_New(&template, menu->listMenuListPos, menu->listMenuCursorPos, HEAP_ID_FIELD1); +} + +static BOOL UndergroundPC_HandleRadarMenu(SysTask *sysTask, void *data) +{ + UndergroundMenu *menu = data; + + u32 input = ListMenu_ProcessInput(menu->unk_48); + + u16 listPos, cursorPos; + ListMenu_GetListAndCursorPos(menu->unk_48, &listPos, &cursorPos); + + CommManUnderground_StoreCursorAndListPos(UNDERGROUND_MENU_KEY_PC_RADAR, cursorPos, listPos); + UndergroundPC_UpdateCursorPos(menu); + + switch (input) { + case LIST_NOTHING_CHOSEN: + return FALSE; + case LIST_CANCEL: + Sound_PlayEffect(SEQ_SE_CONFIRM); + menu->state = UG_PC_MENU_STATE_INIT; + break; + case RADAR_MENU_OPTION_TREASURE: + if (CommServerClient_IsInClosedSecretBase()) { + menu->state = UG_PC_MENU_STATE_TREASURE_RADAR_NOT_AVAILABLE; + } else { + menu->state = UG_PC_MENU_STATE_START_TREASURE_RADAR; + } + break; + case RADAR_MENU_OPTION_SPHERE: + if (CommServerClient_IsInClosedSecretBase()) { + menu->state = UG_PC_MENU_STATE_SPHERE_RADAR_NOT_AVAILABLE; + } else { + menu->state = UG_PC_MENU_STATE_START_SPHERE_RADAR; + } + break; + case RADAR_MENU_OPTION_TRAP: + if (CommServerClient_IsInClosedSecretBase()) { + menu->state = UG_PC_MENU_STATE_TRAP_RADAR_NOT_AVAILABLE; + } else { + menu->state = UG_PC_MENU_STATE_START_TRAP_RADAR; + } + break; + default: + menu->state = UG_PC_MENU_STATE_EXIT; + break; + } + + return TRUE; +} + +static BOOL UndergroundPC_HandleStoreGoodsMenu(SysTask *sysTask, void *data) +{ + UndergroundMenu *menu = data; + + u32 input = UndergroundItemListMenu_ProcessInput(menu->itemListMenu); + + u16 listPos, cursorPos; + ListMenu_GetListAndCursorPos(menu->itemListMenu->listMenu, &listPos, &cursorPos); + CommManUnderground_StoreCursorAndListPos(UNDERGROUND_MENU_KEY_STORE_GOODS, cursorPos, listPos); + + // make sure we have the right type of -2 + if (input == MENU_CANCELED) { + input = LIST_CANCEL; + } + + switch (input) { + case LIST_NOTHING_CHOSEN: + UndergroundMenu_UpdateScrollPrompts(menu, listPos, ListMenu_GetAttribute(menu->itemListMenu->listMenu, LIST_MENU_COUNT), 6); + return FALSE; + case LIST_CANCEL: + UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetItemNameTextPrinter()); + menu->state = UG_PC_MENU_STATE_INIT; + break; + default: + UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetItemNameTextPrinter()); + u32 goodID = UndergroundMenu_GetGoodAtSlotBag(input, menu); + + if (UndergroundPC_TryDepositGood(input, menu)) { + UndergroundTextPrinter_SetUndergroundGoodsName(CommManUnderground_GetMiscTextPrinter(), goodID); + UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), UndergroundPC_Text_GoodWasStored, FALSE, NULL); + } else { + UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), UndergroundPC_Text_PCIsFull, FALSE, NULL); + } + + menu->state = UG_PC_MENU_STATE_STORE_GOODS_WAIT_FOR_MESSAGE; + UndergroundMenu_EraseCurrentMenu(menu); + break; + } + + return TRUE; +} + +static BOOL UndergroundPC_HandleWithdrawGoodsMenu(SysTask *sysTask, void *data) +{ + UndergroundMenu *menu = data; + + u32 input = UndergroundItemListMenu_ProcessInput(menu->itemListMenu); + + u16 listPos, cursorPos; + ListMenu_GetListAndCursorPos(menu->itemListMenu->listMenu, &listPos, &cursorPos); + CommManUnderground_StoreCursorAndListPos(UNDERGROUND_MENU_KEY_WITHDRAW_GOODS, cursorPos, listPos); + + // make sure we have the right type of -2 + if (input == MENU_CANCELED) { + input = LIST_CANCEL; + } + + switch (input) { + case LIST_NOTHING_CHOSEN: + UndergroundMenu_UpdateScrollPrompts(menu, listPos, ListMenu_GetAttribute(menu->itemListMenu->listMenu, LIST_MENU_COUNT), 6); + return FALSE; + case LIST_CANCEL: + UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetItemNameTextPrinter()); + menu->state = UG_PC_MENU_STATE_INIT; + break; + default: + UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetItemNameTextPrinter()); + u32 goodID = UndergroundMenu_GetGoodAtSlotPC(input, menu); + int withdrawResult = UndergroundPC_TryWithdrawGood(input, menu); + + if (withdrawResult == 1) { + UndergroundTextPrinter_SetUndergroundGoodsName(CommManUnderground_GetMiscTextPrinter(), goodID); + UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), UndergroundPC_Text_GoodWasWithdrawn, FALSE, NULL); + } else if (withdrawResult == -1) { + UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), UndergroundPC_Text_CantWithdrawDisplayedGood, FALSE, NULL); + } else { + UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), UndergroundPC_Text_BagIsFull, FALSE, NULL); + } + + menu->state = 22; + UndergroundMenu_EraseCurrentMenu(menu); + break; + } + + ScrollPrompts_SetDrawFlag(menu->scrollPrompts, SCROLL_PROMPT_TOP_ARROW, FALSE); + ScrollPrompts_SetDrawFlag(menu->scrollPrompts, SCROLL_PROMPT_BOTTOM_ARROW, FALSE); + + return TRUE; +} + +static BOOL UndergroundPC_IsMessageClosed(UndergroundMenu *unused) +{ + if (!UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetMiscTextPrinter())) { + if (JOY_NEW(PAD_BUTTON_A | PAD_BUTTON_B)) { + UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetMiscTextPrinter()); + return TRUE; + } + } + + return FALSE; +} + +static void UndergroundPC_MoveCamera(BOOL isDecorating, FieldSystem *fieldSystem) +{ + VecFx32 delta; + + delta.y = 0; + delta.x = 15 * FX32_ONE * 16 - Player_GetXPos(fieldSystem->playerAvatar) * FX32_ONE * 16; + delta.z = 17 * FX32_ONE * 16 - Player_GetZPos(fieldSystem->playerAvatar) * FX32_ONE * 16; + + if (!isDecorating) { + delta.x = -delta.x; + delta.z = -delta.z; + } + + Camera_Move(&delta, fieldSystem->camera); +} + +static BOOL UndergroundPC_DecorateTask(FieldTask *task) +{ + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(task); + DecorateContext *ctx = FieldTask_GetEnv(task); + + switch (ctx->state) { + case DECORATE_STATE_FADE: + Sound_PlayEffect(SEQ_SE_DP_PC_LOGIN); + StartScreenFade(FADE_SUB_THEN_MAIN, FADE_TYPE_BRIGHTNESS_OUT, FADE_TYPE_BRIGHTNESS_OUT, COLOR_BLACK, 6, 1, HEAP_ID_FIELD1); + ctx->state = DECORATE_STATE_UPDATE_CAMERA; + break; + case DECORATE_STATE_UPDATE_CAMERA: + if (IsScreenFadeDone()) { + PlayerAvatar_SetVisible(fieldSystem->playerAvatar, FALSE); + + UndergroundPC_MoveCamera(TRUE, fieldSystem); + ctx->state = DECORATE_STATE_START; + } + break; + case DECORATE_STATE_START: + ov23_02254D98(fieldSystem, task); + ctx->state = DECORATE_STATE_MAIN; + break; + case DECORATE_STATE_MAIN: + ctx->state = DECORATE_STATE_REVERT_CAMERA; + break; + case DECORATE_STATE_REVERT_CAMERA: + PlayerAvatar_SetVisible(fieldSystem->playerAvatar, TRUE); + UndergroundPC_MoveCamera(FALSE, fieldSystem); + StartScreenFade(FADE_MAIN_THEN_SUB, FADE_TYPE_BRIGHTNESS_IN, FADE_TYPE_BRIGHTNESS_IN, COLOR_BLACK, 6, 1, HEAP_ID_FIELD1); + ctx->state = DECORATE_STATE_END; + break; + case DECORATE_STATE_END: + if (IsScreenFadeDone()) { + ov23_0224B2C8(fieldSystem); + SystemFlag_SetDecoratedSecretBase(SaveData_GetVarsFlags(fieldSystem->saveData)); + UndergroundPC_OpenPCMenu(fieldSystem); + Heap_Free(ctx); + return TRUE; + } + break; + } + + return FALSE; +} + +static void UndergroundPC_ExitPCMenu(SysTask *sysTask, UndergroundMenu *menu) +{ + Strbuf_Free(menu->strbuf); + Strbuf_Free(menu->fmtString); + StringTemplate_Free(menu->template); + + if (menu->exitCallback != NULL) { + menu->exitCallback(0); + } + + if (menu->scrollPrompts) { + ScrollPrompts_Free(menu->scrollPrompts); + menu->scrollPrompts = NULL; + } + + UndergroundMenu_EraseCurrentMenu(menu); + UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetMiscTextPrinter()); + + SysTask_Done(sysTask); + Heap_Free(menu); +} + +static void UndergroundPC_Main(SysTask *sysTask, void *data) +{ + UndergroundMenu *menu = data; + DecorateContext *decorateCtx; + + switch (menu->state) { + case UG_PC_MENU_STATE_INIT: + UndergroundMenu_RemoveDescriptionWindowInstant(menu); + menu->listMenuCursorPos = CommManUnderground_GetStoredCursorPos(UNDERGROUND_MENU_KEY_PC); + menu->listMenuListPos = CommManUnderground_GetStoredListPos(UNDERGROUND_MENU_KEY_PC); + menu->unk_2AE = menu->listMenuCursorPos; + UndergroundPC_InitMenu(menu, UndergroundPC_Text_Decorate, 5, UndergroundPC_PrintMenuItemDescription, 0); + menu->state = UG_PC_MENU_STATE_MAIN; + break; + case UG_PC_MENU_STATE_MAIN: + UndergroundPC_HandleMenu(sysTask, menu); + break; + case UG_PC_MENU_STATE_EXIT: + CommPlayerMan_ResumeFieldSystem(); + CommManUnderground_ClearCurrentSysTaskInfo(); + UndergroundPC_ExitPCMenu(sysTask, menu); + break; + case UG_PC_MENU_STATE_INIT_CHECK_FLAGS: + UndergroundMenu_EraseCurrentMenu(menu); + UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetMiscTextPrinter()); + menu->unk_270 = ov23_02253C64(menu->fieldSystem->bgConfig, SaveData_GetTrainerInfo(FieldSystem_GetSaveData(menu->fieldSystem)), SaveData_GetUnderground(FieldSystem_GetSaveData(menu->fieldSystem)), NULL, NULL); + menu->state = UG_PC_MENU_STATE_CHECK_FLAGS; + break; + case UG_PC_MENU_STATE_CHECK_FLAGS: + if (JOY_NEW(PAD_BUTTON_A | PAD_BUTTON_B)) { + ov23_02253D10(menu->unk_270); + menu->unk_270 = NULL; + menu->state = UG_PC_MENU_STATE_INIT; + } + break; + case UG_PC_MENU_STATE_INIT_RADAR_MENU: + UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetMiscTextPrinter()); + menu->listMenuCursorPos = CommManUnderground_GetStoredCursorPos(UNDERGROUND_MENU_KEY_PC_RADAR); + menu->listMenuListPos = CommManUnderground_GetStoredListPos(UNDERGROUND_MENU_KEY_PC_RADAR); + menu->unk_2AE = menu->listMenuCursorPos; + UndergroundPC_InitRadarMenu(menu, UndergroundPC_Text_TreasureSearch, 3, UndergroundPC_PrintRadarMenuItemDescription, 1); + menu->state = UG_PC_MENU_STATE_RADAR_MENU_MAIN; + break; + case UG_PC_MENU_STATE_RADAR_MENU_MAIN: + UndergroundPC_HandleRadarMenu(sysTask, menu); + break; + case UG_PC_MENU_STATE_START_TREASURE_RADAR: + UndergroundMenu_EraseCurrentMenu(menu); + CommManUnderground_SetTreasureRadarActive(); + ov23_022412F0(); + BrightnessController_StartTransition(1, -6, 0, GX_BLEND_PLANEMASK_BG0, BRIGHTNESS_MAIN_SCREEN); + UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), UndergroundPC_Text_TreasureRadarBootedUp, FALSE, NULL); + menu->state = UG_PC_MENU_STATE_EXIT_RADAR_ON_BUTTON_PRESS; + break; + case UG_PC_MENU_STATE_TREASURE_RADAR_NOT_AVAILABLE: + UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), UndergroundPC_Text_TreasureRadarEntranceClosed, FALSE, NULL); + menu->state = UG_PC_MENU_STATE_EXIT_RADAR_ON_BUTTON_PRESS; + break; + case UG_PC_MENU_STATE_START_SPHERE_RADAR: + UndergroundMenu_EraseCurrentMenu(menu); + CommManUnderground_SetSphereRadarActive(); + SphereRadar_Start(); + BrightnessController_StartTransition(1, -6, 0, GX_BLEND_PLANEMASK_BG0, BRIGHTNESS_MAIN_SCREEN); + UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), UndergroundPC_Text_SphereRadarBootedUp, FALSE, NULL); + menu->state = UG_PC_MENU_STATE_EXIT_RADAR_ON_BUTTON_PRESS; + break; + case UG_PC_MENU_STATE_SPHERE_RADAR_NOT_AVAILABLE: + UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), UndergroundPC_Text_SphereRadarEntranceClosed, FALSE, NULL); + menu->state = UG_PC_MENU_STATE_EXIT_RADAR_ON_BUTTON_PRESS; + break; + case UG_PC_MENU_STATE_START_TRAP_RADAR: + UndergroundMenu_EraseCurrentMenu(menu); + CommManUnderground_SetTrapRadarActive(); + TrapRadar_Start(); + BrightnessController_StartTransition(1, -6, 0, GX_BLEND_PLANEMASK_BG0, BRIGHTNESS_MAIN_SCREEN); + UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), UndergroundPC_Text_TrapRadarBootedUp, FALSE, NULL); + menu->state = UG_PC_MENU_STATE_EXIT_RADAR_ON_BUTTON_PRESS; + break; + case UG_PC_MENU_STATE_TRAP_RADAR_NOT_AVAILABLE: + UndergroundTextPrinter_PrintText(CommManUnderground_GetMiscTextPrinter(), UndergroundPC_Text_TrapRadarEntranceClosed, FALSE, NULL); + menu->state = UG_PC_MENU_STATE_EXIT_RADAR_ON_BUTTON_PRESS; + break; + case UG_PC_MENU_STATE_EXIT_RADAR_ON_BUTTON_PRESS: + if (!UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetMiscTextPrinter())) { + if (JOY_NEW(PAD_BUTTON_A | PAD_BUTTON_B)) { + if (!CommServerClient_IsInClosedSecretBase()) { + BrightnessController_StartTransition(1, 0, -6, GX_BLEND_PLANEMASK_BG0, BRIGHTNESS_MAIN_SCREEN); + } + + UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetMiscTextPrinter()); + + if (CommServerClient_IsInClosedSecretBase()) { + ov23_02242FA8(); + } else { + ov23_02242FBC(); + } + + TrapRadar_Exit(); + ov23_02241364(); + SphereRadar_Exit(); + + menu->state = UG_PC_MENU_STATE_INIT_RADAR_MENU; + } + } + break; + case UG_PC_MENU_STATE_DECORATE: + if (menu->fieldSystem->task == NULL) { + decorateCtx = Heap_AllocAtEnd(HEAP_ID_FIELD2, sizeof(DecorateContext)); + MI_CpuClear8(decorateCtx, sizeof(DecorateContext)); + decorateCtx->state = 0; + decorateCtx->dummy = 0; + FieldSystem_CreateTask(menu->fieldSystem, UndergroundPC_DecorateTask, decorateCtx); + } + + UndergroundPC_ExitPCMenu(sysTask, menu); + break; + case UG_PC_MENU_STATE_INIT_STORE_GOODS: + menu->listMenuCursorPos = CommManUnderground_GetStoredCursorPos(UNDERGROUND_MENU_KEY_STORE_GOODS); + menu->listMenuListPos = CommManUnderground_GetStoredListPos(UNDERGROUND_MENU_KEY_STORE_GOODS); + UndergroundMenu_OpenStoreGoodsMenu(menu); + UndergroundMenu_PrintMenuDescription(menu, UndergroundPC_Text_GoodsOnHand); + menu->state = UG_PC_MENU_STATE_STORE_GOODS; + break; + case UG_PC_MENU_STATE_STORE_GOODS: + UndergroundPC_HandleStoreGoodsMenu(sysTask, menu); + break; + case UG_PC_MENU_STATE_STORE_GOODS_WAIT_FOR_MESSAGE: + if (UndergroundPC_IsMessageClosed(menu)) { + menu->state = UG_PC_MENU_STATE_INIT_STORE_GOODS; + } + break; + case UG_PC_MENU_STATE_INIT_WITHDRAW_GOODS: + menu->listMenuCursorPos = CommManUnderground_GetStoredCursorPos(UNDERGROUND_MENU_KEY_WITHDRAW_GOODS); + menu->listMenuListPos = CommManUnderground_GetStoredListPos(UNDERGROUND_MENU_KEY_WITHDRAW_GOODS); + UndergroundMenu_OpenWithdrawGoodsMenu(menu); + UndergroundMenu_PrintMenuDescription(menu, UndergroundPC_Text_GoodsInPC); + menu->state = UG_PC_MENU_STATE_WITHDRAW_GOODS; + break; + case UG_PC_MENU_STATE_WITHDRAW_GOODS: + UndergroundPC_HandleWithdrawGoodsMenu(sysTask, menu); + break; + case UG_PC_MENU_STATE_WITHDRAW_GOODS_WAIT_FOR_MESSAGE: + if (UndergroundPC_IsMessageClosed(menu)) { + menu->state = UG_PC_MENU_STATE_INIT_WITHDRAW_GOODS; + } + break; + case UG_PC_MENU_STATE_WAIT_FOR_MESSAGE: + if (UndergroundPC_IsMessageClosed(menu)) { + menu->state = UG_PC_MENU_STATE_INIT; + } + break; + } +} + +static void UndergroundPC_OpenPCMenu(FieldSystem *fieldSystem) +{ + const int unused = 6; + + CommManUnderground_SetStoredPosKey(UNDERGROUND_STORED_POS_KEY_PC); + + UndergroundMenu *menu = Heap_Alloc(HEAP_ID_FIELD1, sizeof(UndergroundMenu)); + MI_CpuFill8(menu, 0, sizeof(UndergroundMenu)); + menu->fieldSystem = fieldSystem; + + UndergroundTextPrinter_ChangeMessageLoaderBank(CommManUnderground_GetMiscTextPrinter(), TEXT_BANK_UNDERGROUND_PC, MSG_LOADER_LOAD_ON_DEMAND); + + menu->state = UG_PC_MENU_STATE_INIT; + menu->strbuf = Strbuf_Init(50 * 2, HEAP_ID_FIELD1); + menu->fmtString = Strbuf_Init(50 * 2, HEAP_ID_FIELD1); + menu->template = StringTemplate_Default(HEAP_ID_FIELD1); + menu->scrollPrompts = ScrollPrompts_New(HEAP_ID_FIELD1); + + ScrollPrompts_SetPosition(menu->scrollPrompts, 200, 20, 122); + ScrollPrompts_SetDrawFlag(menu->scrollPrompts, SCROLL_PROMPT_TOP_ARROW, FALSE); + ScrollPrompts_SetDrawFlag(menu->scrollPrompts, SCROLL_PROMPT_BOTTOM_ARROW, FALSE); + + menu->sysTask = SysTask_Start(UndergroundPC_Main, menu, 10000); + + CommManUnderground_SetCurrentSysTask(menu, menu->sysTask, UndergroundMenu_ResetBrightnessAndExit); +} + +static void UndergroundPC_TakeFlagPromptTask(SysTask *sysTask, void *data) +{ + TakeFlagPromptContext *ctx = data; + + switch (ctx->state) { + case TAKE_FLAG_PROMPT_STATE_INIT: + if (!UndergroundTextPrinter_IsPrinterActive(CommManUnderground_GetCommonTextPrinter())) { + ctx->menu = Menu_MakeYesNoChoice(ctx->fieldSystem->bgConfig, &sWindowTemplate, BASE_TILE_STANDARD_WINDOW_FRAME, 11, HEAP_ID_FIELD1); + ctx->state = TAKE_FLAG_PROMPT_STATE_MAIN; + } + break; + case TAKE_FLAG_PROMPT_STATE_MAIN: + int input = Menu_ProcessInputAndHandleExit(ctx->menu, HEAP_ID_FIELD1); + + if (input == MENU_NOTHING_CHOSEN) { + return; + } else if (input == 0) { + CommSys_SendDataFixedSize(89, &ctx->pcInteraction); + } else { + CommPlayerMan_ResumeFieldSystemWithContextBit(PAUSE_BIT_LINK_PC); + UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetCommonTextPrinter()); + } + + ctx->state = TAKE_FLAG_PROMPT_STATE_EXIT; + ctx->menu = NULL; + break; + case TAKE_FLAG_PROMPT_STATE_EXIT: + Heap_Free(ctx); + CommManUnderground_ClearCurrentSysTaskInfo(); + SysTask_Done(sysTask); + break; + } +} + +static void UndergroundPC_EndFlagPromptTask(SysTask *sysTask, void *data) +{ + TakeFlagPromptContext *ctx = data; + + if (ctx->menu) { + Menu_DestroyForExit(ctx->menu, HEAP_ID_FIELD1); + } + + Heap_Free(ctx); + SysTask_Done(sysTask); +} + +static void UndergroundPC_StartTakeFlagPromptTask(FieldSystem *fieldSystem, PCInteraction *pcInteraction) +{ + TakeFlagPromptContext *ctx = Heap_Alloc(HEAP_ID_FIELD1, sizeof(UndergroundMenu)); + + MI_CpuFill8(ctx, 0, sizeof(TakeFlagPromptContext)); + + ctx->state = TAKE_FLAG_PROMPT_STATE_INIT; + ctx->fieldSystem = fieldSystem; + ctx->sysTask = SysTask_Start(UndergroundPC_TakeFlagPromptTask, ctx, 10000); + + UndergroundTextPrinter_SetPlayerNameIndex0(CommManUnderground_GetCommonTextPrinter(), CommInfo_TrainerInfo(pcInteraction->pcNetID)); + UndergroundTextPrinter_PrintText(CommManUnderground_GetCommonTextPrinter(), UndergroundCommon_Text_TakeFlagPrompt, FALSE, NULL); + + ctx->pcInteraction.playerNetID = pcInteraction->playerNetID; + ctx->pcInteraction.pcNetID = pcInteraction->pcNetID; + ctx->pcInteraction.canTakeFlag = pcInteraction->canTakeFlag; + + CommManUnderground_SetCurrentSysTask(ctx, ctx->sysTask, UndergroundPC_EndFlagPromptTask); +} + +void UndergroundPC_ProcessTakeFlagAttempt(int unused0, int unused1, void *data, void *unused3) +{ + PCInteraction *pcInteraction = data; + + if (ov23_TryTakeFlag(pcInteraction->playerNetID, pcInteraction->pcNetID)) { + sub_02035B48(90, pcInteraction); + } +} + +void UndergroundPC_ProcessTakenFlag(int unused0, int unused1, void *data, void *unused3) +{ + PCInteraction *pcInteraction = data; + + if (CommSys_CurNetId() == pcInteraction->playerNetID) { + UndergroundTextPrinter_SetPlayerNameIndex0(CommManUnderground_GetCaptureFlagTextPrinter(), CommInfo_TrainerInfo(pcInteraction->pcNetID)); + UndergroundTextPrinter_PrintText(CommManUnderground_GetCaptureFlagTextPrinter(), UndergroundCaptureFlag_Text_YouObtainedFlag, TRUE, UndergroundPC_ResumeFieldSystem); + Sound_PlayBGM(SEQ_HATANIGE); + } + + ov23_TryTakeFlag(pcInteraction->playerNetID, pcInteraction->pcNetID); + ov23_0224D500(pcInteraction->playerNetID, pcInteraction->pcNetID); +} + +static void UndergroundPC_UpdateCursorPos(UndergroundMenu *menu) +{ + u16 prevPos = menu->unk_2AE; + ListMenu_CalcTrueCursorPos(menu->unk_48, &menu->unk_2AE); + + if (prevPos != menu->unk_2AE) { + Sound_PlayEffect(SEQ_SE_CONFIRM); + } +} diff --git a/src/overlay023/underground_player_talk.c b/src/overlay023/underground_player_talk.c index 787b766cda..54a73567b8 100644 --- a/src/overlay023/underground_player_talk.c +++ b/src/overlay023/underground_player_talk.c @@ -360,8 +360,8 @@ static void UndergroundTalk_Exit(SysTask *sysTask, TalkMenu *menu) } if (menu->giftMenu) { - UndergroundMenu_ExitGiftMenu(menu->giftMenu, LIST_CANCEL); - ov23_02243204(); + UndergroundMenu_Exit(menu->giftMenu, LIST_CANCEL); + CommManUnderground_ClearCurrentSysTaskInfo(); } UndergroundTalk_CloseTalkMenu(sysTask, menu); @@ -908,8 +908,8 @@ static void UndergroundTalk_Main(SysTask *sysTask, void *data) } if (menu->giftMenu) { - UndergroundMenu_ExitGiftMenu(menu->giftMenu, LIST_CANCEL); - ov23_02243204(); + UndergroundMenu_Exit(menu->giftMenu, LIST_CANCEL); + CommManUnderground_ClearCurrentSysTaskInfo(); UndergroundTextPrinter_EraseMessageBoxWindow(CommManUnderground_GetItemNameTextPrinter()); menu->giftMenu = NULL; } @@ -1456,12 +1456,10 @@ void UndergroundTalk_ExitConversation(void) static void UndergroundTalk_UpdateCursorPos(TalkMenu *menu) { - u16 pos = menu->cursorPos; + u16 prevPos = menu->cursorPos; ListMenu_CalcTrueCursorPos(menu->listMenu, &menu->cursorPos); - if (pos != menu->cursorPos) { + if (prevPos != menu->cursorPos) { Sound_PlayEffect(SEQ_SE_CONFIRM); } - - return; } diff --git a/src/player_avatar.c b/src/player_avatar.c index d5308f566f..2c7344546e 100644 --- a/src/player_avatar.c +++ b/src/player_avatar.c @@ -270,11 +270,11 @@ int Player_MoveState(const PlayerAvatar *playerAvatar) return playerAvatar->unk_18; } -void PlayerAvatar_SetHidden(PlayerAvatar *playerAvatar, int param1) +void PlayerAvatar_SetVisible(PlayerAvatar *playerAvatar, BOOL visible) { MapObject *mapObj = Player_MapObject(playerAvatar); - if (param1 == 1) { + if (visible == TRUE) { MapObject_SetStatusFlagOff(mapObj, MAP_OBJ_STATUS_HIDE); } else { MapObject_SetStatusFlagOn(mapObj, MAP_OBJ_STATUS_HIDE); diff --git a/src/unk_0202854C.c b/src/unk_0202854C.c index 5c6b2b6462..9fea1a6dcd 100644 --- a/src/unk_0202854C.c +++ b/src/unk_0202854C.c @@ -1274,15 +1274,15 @@ void UndergroundRecord_IncrementGiftsReceived(UndergroundRecord *undergroundReco } } -int sub_020297AC(const UndergroundRecord *param0) +int UndergroundRecord_GetTimesFlagTaken(const UndergroundRecord *undergroundRecord) { - return param0->unk_2C_0; + return undergroundRecord->timesFlagTaken; } -void sub_020297B4(UndergroundRecord *param0) +void UndergroundRecord_IncrementTimesFlagTaken(UndergroundRecord *undergroundRecord) { - if (param0->unk_2C_0 < 999999) { - param0->unk_2C_0++; + if (undergroundRecord->timesFlagTaken < 999999) { + undergroundRecord->timesFlagTaken++; } } diff --git a/src/unk_02033200.c b/src/unk_02033200.c index 90dc792813..f8f5f547e1 100644 --- a/src/unk_02033200.c +++ b/src/unk_02033200.c @@ -779,7 +779,7 @@ static int sub_02033DDC(void) return v0; } -BOOL sub_02033DFC(void) +BOOL CommServerClient_IsInClosedSecretBase(void) { if (sCommServerClient && (sCommServerClient->unk_1516 == 3)) { return 1; diff --git a/src/unk_020366A0.c b/src/unk_020366A0.c index cdb7886283..70ad19ae8f 100644 --- a/src/unk_020366A0.c +++ b/src/unk_020366A0.c @@ -2478,7 +2478,7 @@ void sub_02038A20(int param0) BOOL sub_02038AB8(void) { - if (sub_02033DFC() || !CommMan_IsInitialized()) { + if (CommServerClient_IsInClosedSecretBase() || !CommMan_IsInitialized()) { return 1; } diff --git a/src/unk_0205CA94.c b/src/unk_0205CA94.c index c33fba43d5..47272cf979 100644 --- a/src/unk_0205CA94.c +++ b/src/unk_0205CA94.c @@ -127,7 +127,7 @@ void sub_0205CA94(SysTask *param0, void *param1) switch (v0->unk_1E4) { case 0: MapObject_SetPauseMovementOff(Player_MapObject(v0->fieldSystem->playerAvatar)); - PlayerAvatar_SetHidden(v0->fieldSystem->playerAvatar, 0); + PlayerAvatar_SetVisible(v0->fieldSystem->playerAvatar, 0); v0->unk_1E4++; break; case 1: @@ -189,7 +189,7 @@ void sub_0205CBFC(SysTask *param0, void *param1) switch (v0->unk_1E4) { case 0: - PlayerAvatar_SetHidden(v0->fieldSystem->playerAvatar, 0); + PlayerAvatar_SetVisible(v0->fieldSystem->playerAvatar, 0); v0->unk_1E4++; break; case 1: @@ -216,7 +216,7 @@ void sub_0205CBFC(SysTask *param0, void *param1) if (v0->unk_1E8 > 0) { v0->unk_1E4++; - PlayerAvatar_SetHidden(v0->fieldSystem->playerAvatar, 1); + PlayerAvatar_SetVisible(v0->fieldSystem->playerAvatar, 1); } break; case 4: @@ -242,7 +242,7 @@ void sub_0205CD3C(SysTask *param0, void *param1) switch (v0->unk_1E4) { case 0: - PlayerAvatar_SetHidden(v0->fieldSystem->playerAvatar, 0); + PlayerAvatar_SetVisible(v0->fieldSystem->playerAvatar, 0); v0->unk_1E4++; break; case 1: @@ -303,7 +303,7 @@ void sub_0205CE7C(SysTask *param0, void *param1) switch (v0->unk_1E4) { case 0: - PlayerAvatar_SetHidden(v0->fieldSystem->playerAvatar, 0); + PlayerAvatar_SetVisible(v0->fieldSystem->playerAvatar, 0); sub_0205D274(v0, &v0->unk_1C0[0], 4); sub_0205D274(v0, &v0->unk_1C0[1], 5); v0->unk_1E0 = 2; @@ -323,7 +323,7 @@ void sub_0205CE7C(SysTask *param0, void *param1) v1[0] = v0->unk_1C0[0].unk_0C(&v0->unk_1C0[0]); if (v1[0] == 0) { - PlayerAvatar_SetHidden(v0->fieldSystem->playerAvatar, 1); + PlayerAvatar_SetVisible(v0->fieldSystem->playerAvatar, 1); v0->unk_1E8 = 6; v0->unk_1E4++; } diff --git a/src/unk_02099500.c b/src/unk_02099500.c index 10f98d2a0a..e83230d30d 100644 --- a/src/unk_02099500.c +++ b/src/unk_02099500.c @@ -9,8 +9,8 @@ #include "overlay023/ov23_02241F74.h" #include "overlay023/ov23_0224A1D0.h" #include "overlay023/ov23_0224B05C.h" -#include "overlay023/ov23_0225128C.h" #include "overlay023/ov23_02253598.h" +#include "overlay023/underground_pc.h" #include "overlay023/underground_player_talk.h" #include "overlay023/underground_spheres.h" #include "overlay023/underground_traps.h" @@ -49,7 +49,7 @@ static const CommCmdTable Unk_020F68A4[] = { { CommPlayer_RecvLocation, CommPacketSizeOf_RecvLocation, NULL }, { CommPlayer_RecvLocationAndInit, CommPacketSizeOf_RecvLocationAndInit, NULL }, { ov23_022431C4, CommPacketSizeOf_NetId, NULL }, - { ov23_0224ACE8, sub_0203294C, NULL }, + { ov23_0224ACE8, sub_0203294C, NULL }, // 25 { ov23_0224ACF8, CommPacketSizeOf_NetId, NULL }, { ov23_0224A348, sub_0203294C, NULL }, { ov23_022428D8, ov23_022428D4, NULL }, @@ -74,7 +74,7 @@ static const CommCmdTable Unk_020F68A4[] = { { UndergroundTraps_ReceiveTrapRadarResults, CommPacketSizeOf_TrapRadarResult, NULL }, { ov23_022425F8, CommPacketSizeOf_Coordinates, NULL }, { ov23_02242624, sub_02032944, NULL }, - { ov23_02242654, sub_02032944, NULL }, + { ov23_02242654, sub_02032944, NULL }, // 50 { UndergroundTraps_ProcessDisengagedTrap, CommPacketSizeOf_TriggeredTrap, NULL }, { CommPlayer_RecvDelete, CommPacketSizeOf_NetId, NULL }, { ov23_0224C384, ov23_0224C41C, NULL }, @@ -99,7 +99,7 @@ static const CommCmdTable Unk_020F68A4[] = { { ov23_0224142C, ov23_022414D0, NULL }, { UndergroundTalk_RequestLinkTalkStateUpdateServer, CommPacketSizeOf_TalkStateChangeRequest, NULL }, { UndergroundTalkResponse_RequestLinkTalkStateUpdateServer, CommPacketSizeOf_TalkStateChangeRequest, NULL }, - { UndergroundTalkResponse_HandleLinkTalkStateUpdateServer, CommPacketSizeOf_TalkStateChangeRequest, NULL }, + { UndergroundTalkResponse_HandleLinkTalkStateUpdateServer, CommPacketSizeOf_TalkStateChangeRequest, NULL }, // 75 { UndergroundTalk_HandleLinkTalkStateUpdateServer, CommPacketSizeOf_TalkStateChangeRequest, NULL }, { UndergroundTalk_SendGiftServer, CommPacketSizeOf_Gift, NULL }, { UndergroundTalkResponse_ReceiveGiftOffer, CommPacketSizeOf_Gift, NULL }, @@ -107,14 +107,14 @@ static const CommCmdTable Unk_020F68A4[] = { { UndergroundTalk_ReceiveTalkMessage, CommPacketSizeOf_TalkMessage, NULL }, { ov23_SendRecordServer, sub_02032944, NULL }, { ov23_ReceiveRecord, sub_02032944, NULL }, - { ov23_022513B0, ov23_02251414, NULL }, + { UndergroundPC_ProcessPCInteraction, CommPacketSizeOf_PCInteraction, NULL }, // 83 { ov23_0224A570, CommPacketSizeOf_NetId, NULL }, { ov23_0224A77C, ov23_0224A56C, NULL }, { ov23_0224CD80, CommPacketSizeOf_NetId, NULL }, { ov23_0224CF18, ov23_0224CD7C, NULL }, { sub_02059EAC, CommPacketSizeOf_TrainerCard, sub_02059EBC }, - { ov23_0225215C, ov23_02251414, NULL }, - { ov23_02252178, ov23_02251414, NULL }, + { UndergroundPC_ProcessTakeFlagAttempt, CommPacketSizeOf_PCInteraction, NULL }, + { UndergroundPC_ProcessTakenFlag, CommPacketSizeOf_PCInteraction, NULL }, { ov23_0224AB30, ov23_0224AB2C, NULL }, { ov23_0224ABC4, ov23_0224AC0C, ov23_0224AAA0 }, { ov23_0224AC10, CommPacketSizeOf_NetId, NULL },