Sync union room

This commit is contained in:
GriffinR
2022-11-07 14:56:34 -05:00
parent 75a53efc90
commit 9983b41c1d
23 changed files with 2255 additions and 2194 deletions
+59 -34
View File
@@ -1,47 +1,51 @@
#ifndef GUARD_CONSTANTS_UNION_ROOM_H
#define GUARD_CONSTANTS_UNION_ROOM_H
// The number of possible group leaders visible in the Union Room.
// Note that this is different than the number of people actively
// connected as children via the Wireless Adapter, which cannot
// exceed RFU_CHILD_MAX (4), for a total of 5 including the player.
#define MAX_UNION_ROOM_LEADERS 8
#define UNION_ROOM_SPAWN_NONE 0
#define UNION_ROOM_SPAWN_IN 1
#define UNION_ROOM_SPAWN_OUT 2
#define ACTIVITY_NONE 0
#define ACTIVITY_BATTLE 1
#define ACTIVITY_DBLBATTLE 2
#define ACTIVITY_MLTBATTLE 3
#define ACTIVITY_TRADE 4
#define ACTIVITY_CHAT 5
#define ACTIVITY_WCARD 6
#define ACTIVITY_WNEWS 7
#define ACTIVITY_CARD 8
#define ACTIVITY_PJUMP 9
#define ACTIVITY_BCRUSH 10
#define ACTIVITY_BPICK 11
#define ACTIVITY_SEARCH 12
#define ACTIVITY_SPINTRADE 13
#define ACTIVITY_ITEMTRADE 14
#define UNION_ROOM_MAX_LEVEL 30
// The number of possible trainer classes for a trainer of a given gender in the Union Room.
// This value is necessarily a power of 2 because of the way it's treated in GetUnionRoomTrainerPic / GetUnionRoomTrainerClass
#define NUM_UNION_ROOM_CLASSES (1 << 3) // 8
#define ACTIVITY_NONE 0
#define ACTIVITY_BATTLE_SINGLE 1
#define ACTIVITY_BATTLE_DOUBLE 2
#define ACTIVITY_BATTLE_MULTI 3
#define ACTIVITY_TRADE 4
#define ACTIVITY_CHAT 5
#define ACTIVITY_WONDER_CARD_DUP 6 // Duplicates of later WONDER constants
#define ACTIVITY_WONDER_NEWS_DUP 7 //
#define ACTIVITY_CARD 8
#define ACTIVITY_POKEMON_JUMP 9
#define ACTIVITY_BERRY_CRUSH 10
#define ACTIVITY_BERRY_PICK 11
#define ACTIVITY_SEARCH 12
#define ACTIVITY_SPIN_TRADE 13
#define ACTIVITY_ITEM_TRADE 14 // Replaced with ACTIVITY_BATTLE_TOWER_OPEN in Emerald
#define ACTIVITY_RECORD_CORNER 15
#define ACTIVITY_BERRY_BLENDER 16
// Player response
#define ACTIVITY_ACCEPT 17
#define ACTIVITY_DECLINE 18
#define ACTIVITY_ACCEPT 17
#define ACTIVITY_DECLINE 18
#define ACTIVITY_NPCTALK 19
#define ACTIVITY_PLYRTALK 20
#define ACTIVITY_NPCTALK 19
#define ACTIVITY_PLYRTALK 20
// Duplicate IDs?
#define ACTIVITY_WCARD2 21
#define ACTIVITY_WNEWS2 22
#define ACTIVITY_WONDER_CARD 21
#define ACTIVITY_WONDER_NEWS 22
#define IN_UNION_ROOM 0x40
// Used in UR_AddTextPrinterParameterized
#define UR_COLOR_DKE_WHT_LTE 0
#define UR_COLOR_RED_WHT_LTR 1
#define UR_COLOR_GRN_WHT_LTG 2
#define UR_COLOR_WHT_WHT_LTE 3
#define UR_COLOR_WHT_DKE_LTE 4
#define UR_COLOR_GRN_DN6_LTB 5
#define UR_COLOR_DN5_DN6_LTB 6
#define IN_UNION_ROOM (1 << 6)
#define LINK_GROUP_SINGLE_BATTLE 0
#define LINK_GROUP_DOUBLE_BATTLE 1
@@ -52,9 +56,30 @@
#define LINK_GROUP_BERRY_PICKING 6
#define LINK_GROUP_WONDER_CARD 7
#define LINK_GROUP_WONDER_NEWS 8
#define NUM_LINK_GROUP_TYPES 9
#define LINK_GROUP_UNION_ROOM_RESUME 9
#define LINK_GROUP_UNION_ROOM_INIT 10
#define LINK_GROUP_UNK_11 11
#define LINK_GROUP_UNK_12 12
#define NUM_LINK_GROUP_TYPES 13
#define UR_TRADE_MATCH 0
#define UR_TRADE_NOTYPE 1
#define UR_TRADE_NOEGG 2
#define UR_TRADE_READY 0
#define UR_TRADE_PLAYER_NOT_READY 1
#define UR_TRADE_PARTNER_NOT_READY 2
#define UR_INTERACT_PLAYER_1 1
#define UR_INTERACT_PLAYER_2 2
#define UR_INTERACT_PLAYER_3 3
#define UR_INTERACT_PLAYER_4 4
#define UR_INTERACT_PLAYER_5 5
#define UR_INTERACT_PLAYER_6 6
#define UR_INTERACT_PLAYER_7 7
#define UR_INTERACT_PLAYER_8 8
#define UR_INTERACT_ATTENDANT 9
#define UR_INTERACT_UNUSED 10
#define UR_INTERACT_START_MENU 11
#endif //GUARD_CONSTANTS_UNION_ROOM_H
+5 -6
View File
@@ -233,17 +233,16 @@ extern struct RfuGameData gHostRfuGameData;
extern u8 gHostRfuUsername[];
extern struct RfuManager gRfu;
// GameFreak signatures
void AddTextPrinterToWindow1(const u8 *str);
bool32 MG_PrintTextOnWindow1AndWaitButton(u8 * cmdPtr, const u8 * src);
bool32 PrintMysteryGiftMenuMessage(u8 * cmdPtr, const u8 * src);
void LinkRfu_FatalError(void);
void MG_DrawCheckerboardPattern(void);
void Rfu_SetCloseLinkCallback(void);
bool8 IsLinkRfuTaskFinished(void);
void DestroyWirelessStatusIndicatorSprite(void);
void MEvent_CreateTask_CardOrNewsWithFriend(u32 arg0);
void MEvent_CreateTask_CardOrNewsOverWireless(u32 arg0);
void MEvent_CreateTask_Leader(u32 arg0);
void CreateTask_LinkMysteryGiftWithFriend(u32 arg0);
void CreateTask_LinkMysteryGiftOverWireless(u32 arg0);
void CreateTask_SendMysteryGift(u32 activity);
void Rfu_SendPacket(void *data);
u8 CreateTask_ListenToWireless(void);
void DestroyTask_RfuIdle(void);
@@ -268,7 +267,7 @@ u32 GetRfuRecvQueueLength(void);
void LinkRfu_Shutdown(void);
void CreateTask_RfuIdle(void);
bool8 Rfu_SetLinkRecovery(bool32 enable);
void var_800D_set_xB(void);
void SetUsingUnionRoomStartMenu(void);
struct RfuGameData *GetHostRfuGameData(void);
void UpdateWirelessStatusIndicatorSprite(void);
void InitRFU(void);
+2 -2
View File
@@ -101,8 +101,8 @@ void InitMEventData(void);
u16 MEvent_GetBattleCardCount(u32 command);
void MysteryGift_TryIncrementStat(u32 eventId, u32 trainerId);
u16 *GetMEventProfileECWordsMaybe(void);
void ResetReceivedWonderCardFlag(void);
bool32 MEventHandleReceivedWonderCard(u16 flagId);
void MysteryGift_DisableStats(void);
bool32 MysteryGift_TryEnableStatsByFlagId(u16 flagId);
u16 GetWonderCardFlagId(void);
#endif //GUARD_MEVENT_H
+1 -1
View File
@@ -7,7 +7,7 @@ void MainCB_FreeAllBuffersAndReturnToInitTitleScreen(void);
void PrintMysteryGiftOrEReaderTopMenu(bool8, bool32);
void c2_mystery_gift(void);
void CB2_MysteryGiftEReader(void);
s8 mevent_message_print_and_prompt_yes_no(u8 * textState, u16 * windowId, bool8 yesNoBoxPlacement, const u8 * str);
s8 DoMysteryGiftYesNo(u8 * textState, u16 * windowId, bool8 yesNoBoxPlacement, const u8 * str);
void MG_DrawTextBorder(u8 windowId);
u16 GetMysteryGiftBaseBlock(void);
+6 -6
View File
@@ -3,14 +3,14 @@
#include "union_room.h"
u8 ZeroUnionObjWork(struct UnionObj * ptr);
void DeleteUnionObjWorkAndStopTask(void);
u8 ZeroUnionObjWork(struct UnionRoomObject * ptr);
void DestroyUnionRoomPlayerObjects(void);
void CreateGroupMemberObjectsInvisible(u8 *spriteIds, s32 group);
void DestroyGroupMemberObjects(u8 *spriteIds);
void MakeGroupAssemblyAreasPassable(void);
void ScheduleUnionRoomPlayerRefresh(struct UnkStruct_URoom *uroom_p);
void HandleUnionRoomPlayerRefresh(struct UnkStruct_URoom *uroom_p);
bool32 RfuUnionTool_GetGroupAndMemberInFrontOfPlayer(struct UnkStruct_Main0 *main0_p, s16 *member_p, s16 *group_p, u8 *spriteIds);
void UpdateUnionGroupMemberFacing(u32 member, u32 group, struct UnkStruct_Main0 *main0_p);
void ScheduleUnionRoomPlayerRefresh(struct WirelessLink_URoom *uroom_p);
void HandleUnionRoomPlayerRefresh(struct WirelessLink_URoom *uroom_p);
bool32 TryInteractWithUnionRoomMember(struct RfuPlayerList *main0_p, s16 *member_p, s16 *group_p, u8 *spriteIds);
void UpdateUnionGroupMemberFacing(u32 member, u32 group, struct RfuPlayerList *main0_p);
#endif //GUARD_UNION_ROOM_PLAYER_AVATAR_H
+1 -1
View File
@@ -13,7 +13,7 @@ extern const u8 gText_FemaleSymbol4[];
extern const u8 gText_GenderlessSymbol[];
extern const u16 gTradeOrHatchMonShadowTilemap[];
void CB2_ReturnFromLinkTrade(void);
void CB2_StartCreateTradeMenu(void);
s32 Trade_CalcLinkPlayerCompatibilityParam(void);
s32 CanRegisterMonForTradingBoard(struct RfuGameCompatibilityData rfuPlayer, u16 species2, u16 species, u8 isEventLegal);
s32 GetUnionRoomTradeMessageId(struct RfuGameCompatibilityData rfuPlayer, struct RfuGameCompatibilityData rfuPartner, u16 playerSpecies2, u16 partnerSpecies, u8 requestedType, u16 playerSpecies, u8 isEventLegal);
+1 -1
View File
@@ -1,7 +1,7 @@
#ifndef GUARD_TRADE_SCENE_H
#define GUARD_TRADE_SCENE_H
void CB2_InitTradeAnim_LinkTrade(void);
void CB2_LinkTrade(void);
void CreateInGameTradePokemon(void);
void DoInGameTradeScene(void);
void DrawTextOnTradeWindow(u8 windowId, const u8 *str, s8 speed);
+85 -97
View File
@@ -3,58 +3,60 @@
#include "global.h"
#include "link_rfu.h"
#include "constants/union_room.h"
// Return value of IsRequestedTypeAndSpeciesInPlayerParty
#define UR_TRADE_MATCH 0
#define UR_TRADE_NOTYPE 1
#define UR_TRADE_NOEGG 2
// In the Union Room the player is only ever connected to ≤ 4 other players.
// However, there can be up to MAX_UNION_ROOM_LEADERS (8) object events to
// represent leaders of recently discovered link groups, and each of those groups
// may have up to MAX_RFU_PLAYERS (5) players in it including the leader.
// These players are represented on-screen by NPC sprites drawn around the leader.
// Thus there can be 40 sprites of other players on-screen, in 8 groups of 5.
#define NUM_UNION_ROOM_SPRITES (MAX_UNION_ROOM_LEADERS * MAX_RFU_PLAYERS)
#define UROOM_MAX_GROUP_COUNT 8
#define UROOM_MAX_PARTY_SIZE 5
// The maximum number of recently connected players that can be tracked.
// Note that this is significantly less than NUM_UNION_ROOM_SPRITES, i.e. not
// every player that can be shown in the Union Room can be tracked at once.
// Information such as a group member's gender can instead be read from partnerInfo
// of the leader's RfuGameData by tracking at least all of the group leaders.
#define MAX_RFU_PLAYER_LIST_SIZE 16
struct UnionGnameUnamePair
struct RfuPlayerData
{
struct RfuGameData gname;
u8 ALIGNED(4) uname[PLAYER_NAME_LENGTH + 1];
struct RfuGameData data;
u8 ALIGNED(4) name[RFU_USER_NAME_LENGTH];
};
struct UnkStruct_x1C
struct RfuPlayer
{
struct UnionGnameUnamePair gname_uname;
struct RfuPlayerData rfu;
u16 timeoutCounter;
u8 groupScheduledAnim:2;
bool8 useRedText:1; // Never set
u8 newPlayerCountdown;
u8 unused;
};
struct RfuPlayerList
{
struct RfuPlayer players[0]; // TODO: Should be size MAX_RFU_PLAYER_LIST_SIZE
};
struct RfuIncomingPlayer
{
struct RfuPlayerData rfu;
u8 active:1;
};
struct UnkStruct_x20
struct RfuIncomingPlayerList
{
struct UnionGnameUnamePair gname_uname;
u16 field_18;
u8 groupScheduledAnim:2;
bool8 field_1A_1:1;
u8 field_1B;
u32 field_1C; // unused
struct RfuIncomingPlayer players[0]; // TODO: Should be size MAX_RFU_PLAYERS
};
// These arrays are dynamically allocated but must be
// represented as structs to match.
// Don't ask me why.
// FIXME: Find a way around this.
struct UnkStruct_Main0
struct WirelessLink_Leader
{
struct UnkStruct_x20 arr[0];
};
struct UnkStruct_Main4
{
struct UnkStruct_x1C arr[0];
};
struct UnkStruct_Leader
{
struct UnkStruct_Main0 * field_0;
struct UnkStruct_Main4 * field_4;
struct UnkStruct_Main0 * field_8;
struct RfuPlayerList * playerList;
struct RfuIncomingPlayerList * incomingPlayerList;
struct RfuPlayerList * playerListBackup;
u8 state;
u8 textState;
u8 delayTimerAfterOk;
@@ -63,36 +65,35 @@ struct UnkStruct_Leader
u8 nPlayerModeWindowId;
u8 listTaskId;
u8 playerCount;
u8 messageWindowId;
u8 field_15;
u8 field_16;
u16 yesNoWindowId;
u8 unused;
u8 listenTaskId;
u8 activity;
u8 field_19;
u16 field_1A;
u8 joinRequestAnswer;
u16 memberConfirmTimeout;
};
struct UnkStruct_Group
struct WirelessLink_Group
{
struct UnkStruct_Main0 * field_0;
struct UnkStruct_Main4 * field_4;
struct RfuPlayerList * playerList;
struct RfuIncomingPlayerList * incomingPlayerList;
u8 state;
u8 textState;
u8 field_A; // unused
u8 delayTimerAfterOk; // unused
u8 listWindowId;
u8 bButtonCancelWindowId;
u8 playerNameAndIdWindowId;
u8 listTaskId;
u8 leaderId;
u8 field_10;
u8 unused;
u8 listenTaskId;
u8 cardOrNews;
u8 field_13; // referenced but never set
bool8 isWonderNews;
bool8 showListMenu; // referenced but never set
u8 refreshTimer;
u8 delayBeforePrint;
};
struct UnionObj
struct UnionRoomObject
{
u8 state;
u8 gfxId;
@@ -100,69 +101,56 @@ struct UnionObj
u8 schedAnim;
};
struct UnkStruct_URoom
struct WirelessLink_URoom
{
/* 0x000 */ struct UnkStruct_Main0 * field_0;
/* 0x004 */ struct UnkStruct_Main4 * field_4;
/* 0x008 */ struct UnkStruct_Main0 * field_8;
/* 0x00C */ struct UnkStruct_Main4 * field_C;
/* 0x010 */ u16 field_10;
/* 0x012 */ u16 field_12;
/* 0x014 */ u8 state;
/* 0x015 */ u8 stateAfterPrint;
/* 0x016 */ u8 textState;
/* 0x017 */ u8 field_17;
/* 0x018 */ u8 field_18;
/* 0x019 */ u8 field_19;
/* 0x01A */ u8 field_1A;
/* 0x01B */ u8 topListMenuWindowId;
/* 0x01C */ u8 topListMenuListMenuId;
/* 0x01D */ u8 tradeBoardSelectWindowId;
/* 0x01E */ u8 tradeBoardDetailsWindowId;
/* 0x01F */ u8 field_1F;
/* 0x020 */ u8 field_20;
/* 0x021 */ u8 spriteIds[40];
/* 0x049 */ u8 field_49;
/* 0x04A */ u8 tradeBoardListMenuId;
// For communication with potential link partners
/* 0x04C */ u16 playerSendBuffer[6];
/* 0x058 */ u8 activityRequestStrbufs[4][11];
/* 0x084 */ u16 partnerYesNoResponse;
/* 0x086 */ u16 recvActivityRequest[3]; // activity[, species, level]
/* 0x08C */ struct UnionObj unionObjs[8];
/* 0x0AC */ u8 trainerCardStrbufs[12][15];
/* 0x160 */ u8 field_174[48];
/* 0x190 */ u8 field_1A4[200];
};
union UnkUnion_Main
{
struct UnkStruct_Leader * leader;
struct UnkStruct_Group * group;
struct UnkStruct_URoom * uRoom;
struct RfuPlayerList * playerList;
struct RfuIncomingPlayerList * incomingChildList;
struct RfuPlayerList * spawnPlayer;
struct RfuIncomingPlayerList * incomingParentList;
u16 unknown; // Never read
u16 unreadPlayerId;
u8 state;
u8 stateAfterPrint;
u8 textState;
u8 filler[4];
u8 topListMenuWindowId;
u8 topListMenuId;
u8 tradeBoardMainWindowId;
u8 tradeBoardHeaderWindowId;
u8 unused1;
u8 searchTaskId;
u8 spriteIds[NUM_UNION_ROOM_SPRITES];
u8 unused2;
u8 tradeBoardListMenuId;
// For communication with potential link partners
u16 playerSendBuffer[6];
u8 activityRequestStrbufs[4][11];
u16 partnerYesNoResponse;
u16 recvActivityRequest[3]; // activity[, species, level]
struct UnionRoomObject objects[MAX_UNION_ROOM_LEADERS];
u8 trainerCardStrBuffer[12][15];
u8 trainerCardColorStrBuffer[48];
u8 trainerCardMsgStrBuffer[200];
};
struct UnionRoomTrade
{
u16 field_0;
u16 state;
u16 type;
u32 playerPersonality;
u8 field_8;
u8 field_9;
u8 offerPlayerId;
u16 playerSpecies;
u16 playerLevel;
u16 species;
u16 level;
u16 field_12;
u32 personality;
};
extern struct RfuGameCompatibilityData gPartnerTgtGnameSub;
extern struct RfuGameCompatibilityData gRfuPartnerCompatibilityData;
extern u16 gUnionRoomOfferedSpecies;
extern u8 gUnionRoomRequestedMonType;
void StartUnionRoomBattle(u16 battleFlags);
u8 UnionRoom_CreateTask_CallCB2ReturnFromLinkTrade(void);
u8 CreateTask_CreateTradeMenu(void);
#endif //GUARD_UNION_ROOM_H