Merge pull request #586 from GriffinRichards/sync-mevent

Sync mystery gift
This commit is contained in:
GriffinR
2022-11-26 11:34:59 -05:00
committed by GitHub
59 changed files with 3401 additions and 3126 deletions
+22 -20
View File
@@ -701,26 +701,28 @@
#define FLAG_0x2A4 0x2A4
#define FLAG_CAN_USE_ROCKET_HIDEOUT_LIFT 0x2A5
#define FLAG_GOT_TEA 0x2A6
#define FLAG_GOT_AURORA_TICKET 0x2A7
#define FLAG_GOT_MYSTIC_TICKET 0x2A8
#define FLAG_0x2A9 0x2A9
#define FLAG_0x2AA 0x2AA
#define FLAG_0x2AB 0x2AB
#define FLAG_0x2AC 0x2AC
#define FLAG_0x2AD 0x2AD
#define FLAG_0x2AE 0x2AE
#define FLAG_0x2AF 0x2AF
#define FLAG_0x2B0 0x2B0
#define FLAG_0x2B1 0x2B1
#define FLAG_0x2B2 0x2B2
#define FLAG_0x2B3 0x2B3
#define FLAG_0x2B4 0x2B4
#define FLAG_0x2B5 0x2B5
#define FLAG_0x2B6 0x2B6
#define FLAG_0x2B7 0x2B7
#define FLAG_0x2B8 0x2B8
#define FLAG_0x2B9 0x2B9
#define FLAG_0x2BA 0x2BA
#define FLAG_RECEIVED_AURORA_TICKET 0x2A7
#define FLAG_RECEIVED_MYSTIC_TICKET 0x2A8
#define FLAG_RECEIVED_OLD_SEA_MAP 0x2A9
#define FLAG_WONDER_CARD_UNUSED_1 0x2AA
#define FLAG_WONDER_CARD_UNUSED_2 0x2AB
#define FLAG_WONDER_CARD_UNUSED_3 0x2AC
#define FLAG_WONDER_CARD_UNUSED_4 0x2AD
#define FLAG_WONDER_CARD_UNUSED_5 0x2AE
#define FLAG_WONDER_CARD_UNUSED_6 0x2AF
#define FLAG_WONDER_CARD_UNUSED_7 0x2B0
#define FLAG_WONDER_CARD_UNUSED_8 0x2B1
#define FLAG_WONDER_CARD_UNUSED_9 0x2B2
#define FLAG_WONDER_CARD_UNUSED_10 0x2B3
#define FLAG_WONDER_CARD_UNUSED_11 0x2B4
#define FLAG_WONDER_CARD_UNUSED_12 0x2B5
#define FLAG_WONDER_CARD_UNUSED_13 0x2B6
#define FLAG_WONDER_CARD_UNUSED_14 0x2B7
#define FLAG_WONDER_CARD_UNUSED_15 0x2B8
#define FLAG_WONDER_CARD_UNUSED_16 0x2B9
#define FLAG_WONDER_CARD_UNUSED_17 0x2BA
#define NUM_WONDER_CARD_FLAGS (1 + FLAG_WONDER_CARD_UNUSED_17 - FLAG_RECEIVED_AURORA_TICKET)
#define FLAG_GOT_POWDER_JAR 0x2BB
#define FLAG_FOUGHT_MEWTWO 0x2BC
#define FLAG_FOUGHT_MOLTRES 0x2BD
+8
View File
@@ -44,4 +44,12 @@
#define WONDER_CARD_FLAG_OFFSET 1000
#define NEWS_REWARD_NONE 0
#define NEWS_REWARD_RECV_SMALL 1
#define NEWS_REWARD_RECV_BIG 2
#define NEWS_REWARD_WAITING 3
#define NEWS_REWARD_SENT_SMALL 4
#define NEWS_REWARD_SENT_BIG 5
#define NEWS_REWARD_AT_MAX 6
#endif //GUARD_CONSTANTS_MYSTERY_GIFT_H
+1 -1
View File
@@ -84,7 +84,7 @@
// Bits 12-15 are the same for the player's party.
// Used by Quest Log.
#define VAR_QUEST_LOG_MON_COUNTS 0x4027
#define VAR_MENEWS_JISAN_STEP_COUNTER 0x4028
#define VAR_WONDER_NEWS_STEP_COUNTER 0x4028
#define VAR_0x4029 0x4029
#define VAR_0x402A 0x402A
#define VAR_0x402B 0x402B
+1 -1
View File
@@ -36,7 +36,7 @@ struct EasyChatWordsByLetter
u8 *CopyEasyChatWord(u8 *dest, u16 word);
u8 *ConvertEasyChatWordsToString(u8 *dest, const u16 *src, u16 columns, u16 rows);
bool8 EC_DoesEasyChatStringFitOnLine(const u16 *easyChatWords, u8 columns, u8 rows, u16 maxLength);
void EC_ResetMEventProfileMaybe(void);
void InitQuestionnaireWords(void);
void InitEasyChatPhrases(void);
void EnableRareWord(u8);
bool8 InitEasyChatSelection(void);
+6 -3
View File
@@ -14,17 +14,20 @@ enum {
#define EREADER_XFER_EXE 1
#define EREADER_XFER_CHK 2
#define EREADER_XFER_SHIFT 0
#define EREADER_XFER_MASK 3
#define EREADER_XFER_MASK ((EREADER_XFER_EXE | EREADER_XFER_CHK) << EREADER_XFER_SHIFT)
#define EREADER_CANCEL_TIMEOUT 1
#define EREADER_CANCEL_KEY 2
#define EREADER_CANCEL_MASK 0xC
#define EREADER_CANCEL_SHIFT 2
#define EREADER_CANCEL_TIMEOUT_MASK (EREADER_CANCEL_TIMEOUT << EREADER_CANCEL_SHIFT)
#define EREADER_CANCEL_KEY_MASK (EREADER_CANCEL_KEY << EREADER_CANCEL_SHIFT)
#define EREADER_CANCEL_MASK ((EREADER_CANCEL_TIMEOUT | EREADER_CANCEL_KEY) << EREADER_CANCEL_SHIFT)
#define EREADER_CHECKSUM_OK 1
#define EREADER_CHECKSUM_ERR 2
#define EREADER_CHECKSUM_MASK 0x30
#define EREADER_CHECKSUM_SHIFT 4
#define EREADER_CHECKSUM_OK_MASK (EREADER_CHECKSUM_OK << EREADER_CHECKSUM_SHIFT)
#define EREADER_CHECKSUM_MASK ((EREADER_CHECKSUM_OK | EREADER_CHECKSUM_ERR) << EREADER_CHECKSUM_SHIFT)
void EReaderHelper_SerialCallback(void);
void EReaderHelper_Timer3Callback(void);
+2 -2
View File
@@ -49,8 +49,8 @@ bool8 FlagGet(u16 id);
u16 * GetVarPointer(u16 id);
bool32 IsMysteryGiftEnabled(void);
void ResetSpecialVars(void);
void ResetMysteryEventFlags(void);
void ResetMysteryEventVars(void);
void ClearMysteryGiftFlags(void);
void ClearMysteryGiftVars(void);
bool32 IsNationalPokedexEnabled(void);
void EnableNationalPokedex_RSE(void);
void ClearTempFieldEventData(void);
+4 -4
View File
@@ -627,15 +627,15 @@ struct FameCheckerSaveData
struct WonderNewsMetadata
{
u8 unk_0_0:2;
u8 unk_0_2:3;
u8 unk_0_5:3;
u8 newsType:2;
u8 sentRewardCounter:3;
u8 rewardCounter:3;
u8 berry;
};
struct WonderNews
{
u16 newsId;
u16 id;
u8 sendType; // SEND_TYPE_*
u8 bgType;
u8 titleText[WONDER_NEWS_TEXT_LENGTH];
+12 -6
View File
@@ -85,12 +85,12 @@
#define LINKCMD_PARTNER_CANCEL_TRADE 0xEECC
#define LINKCMD_NONE 0xEFFF
#define LINKTYPE_TRADE 0x1111 // trade
#define LINKTYPE_0x1122 0x1122 // trade
#define LINKTYPE_TRADE 0x1111
#define LINKTYPE_TRADE_CONNECTING 0x1122
#define LINKTYPE_TRADE_SETUP 0x1133
#define LINKTYPE_0x1144 0x1144 // trade
#define LINKTYPE_TRADE_DISCONNECTED 0x1144
#define LINKTYPE_BATTLE 0x2211
#define LINKTYPE_0x2222 0x2222 // unused battle?
#define LINKTYPE_UNUSED_BATTLE 0x2222 // Unused, inferred from gap
#define LINKTYPE_SINGLE_BATTLE 0x2233
#define LINKTYPE_DOUBLE_BATTLE 0x2244
#define LINKTYPE_MULTI_BATTLE 0x2255
@@ -100,7 +100,12 @@
#define LINKTYPE_RECORD_MIX_BEFORE 0x3311
#define LINKTYPE_RECORD_MIX_AFTER 0x3322
#define LINKTYPE_BERRY_BLENDER_SETUP 0x4411
#define LINKTYPE_BERRY_BLENDER 0x4422
#define LINKTYPE_MYSTERY_EVENT 0x5501
#define LINKTYPE_EREADER_FRLG 0x5502
#define LINKTYPE_EREADER_EM 0x5503
#define LINKTYPE_CONTEST_GMODE 0x6601
#define LINKTYPE_CONTEST_EMODE 0x6602
enum {
BLOCK_REQ_SIZE_NONE, // Identical to 200
@@ -110,8 +115,9 @@ enum {
BLOCK_REQ_SIZE_40,
};
#define MASTER_HANDSHAKE 0x8FFF
#define SLAVE_HANDSHAKE 0xB9A0
#define MASTER_HANDSHAKE 0x8FFF
#define SLAVE_HANDSHAKE 0xB9A0
#define EREADER_HANDSHAKE 0xCCD0
#define IsSendCmdComplete() (gSendCmd[0] == 0)
+2 -4
View File
@@ -233,8 +233,6 @@ extern struct RfuGameData gHostRfuGameData;
extern u8 gHostRfuUsername[];
extern struct RfuManager gRfu;
void AddTextPrinterToWindow1(const u8 *str);
bool32 PrintMysteryGiftMenuMessage(u8 * cmdPtr, const u8 * src);
void LinkRfu_FatalError(void);
void MG_DrawCheckerboardPattern(void);
void Rfu_SetCloseLinkCallback(void);
@@ -324,7 +322,7 @@ void RfuSetNormalDisconnectMode(void);
void SetUnionRoomChatPlayerData(u32 numPlayers);
void ClearRecvCommands(void);
#include "mevent_server.h"
extern const struct mevent_server_cmd gServerScript_ClientCanceledCard[];
#include "mystery_gift_server.h"
extern const struct MysteryGiftServerCmd gServerScript_ClientCanceledCard[];
#endif //GUARD_LINK_RFU_H
+2 -1
View File
@@ -69,7 +69,8 @@ void StartTimer1(void);
void SeedRngAndSetTrainerId(void);
u16 GetGeneratedTrainerIdLower(void);
extern const char RomHeaderGameCode[4];
#define GAME_CODE_LENGTH 4
extern const char RomHeaderGameCode[GAME_CODE_LENGTH];
extern const char RomHeaderSoftwareVersion;
extern u8 gLinkTransferringData;
-10
View File
@@ -1,10 +0,0 @@
#ifndef GUARD_MENEWS_JISAN_H
#define GUARD_MENEWS_JISAN_H
#include "global.h"
void MENewsJisan_SetRandomReward(u32 a0);
void MENewsJisanReset(void);
void MENewsJisanStepCounter(void);
#endif //GUARD_MENEWS_JISAN_H
-108
View File
@@ -1,108 +0,0 @@
#ifndef GUARD_MEVENT_H
#define GUARD_MEVENT_H
#include "global.h"
#define CARD_STAT_BATTLES_WON 0
#define CARD_STAT_BATTLES_LOST 1
#define CARD_STAT_NUM_TRADES 2
#define CARD_STAT_NUM_STAMPS 3
#define CARD_STAT_MAX_STAMPS 4
enum {
NEWS_INPUT_A,
NEWS_INPUT_B,
NEWS_INPUT_SCROLL_UP,
NEWS_INPUT_SCROLL_DOWN,
NEWS_INPUT_NONE = 0xFF
};
struct MEventClientHeaderStruct
{
u32 unk_00;
u16 unk_04;
u32 unk_08;
u16 unk_0C;
u32 unk_10;
u16 id;
u16 unk_16[4];
struct WonderCardMetadata unk_20;
u8 maxDistributionMons;
u8 playerName[7];
u8 playerTrainerId[4];
u16 easyChatProfile[6];
u8 gameCode[4];
u8 version;
};
struct MEvent_Str_1
{
u16 status;
size_t size;
const void *data;
};
struct MEvent_Str_2
{
u8 fill_00[0x40];
};
struct WonderGraphics
{
u8 titleTextPal:4;
u8 bodyTextPal:4;
u8 footerTextPal:4;
u8 stampShadowPal:4;
const u8 * tiles;
const u8 * map;
const u16 * pal;
};
extern const u16 gCard1Pal[];
extern const u16 gCard2Pal[];
extern const u16 gCard3Pal[];
extern const u16 gCard4Pal[];
extern const u16 gCard5Pal[];
struct WonderNews * GetSavedWonderNews(void);
struct WonderCard * GetSavedWonderCard(void);
struct WonderCardMetadata * sav1_get_mevent_buffer_2(void);
struct WonderNewsMetadata * GetMENewsJisanStructPtr(void);
bool32 OverwriteSavedWonderNewsWithReceivedNews(const struct WonderNews * src);
bool32 ValidateReceivedWonderNews(void);
bool32 ValidateReceivedWonderCard(void);
bool32 MEvent_HaveAlreadyReceivedWonderNews(const u8 * src);
bool32 OverwriteSavedWonderCardWithReceivedCard(const struct WonderCard * data);
void MEvent_WonderCardResetUnk08_6(struct WonderCard * buffer);
bool32 MEvent_ReceiveDistributionMon(const u16 * data);
void BuildMEventClientHeader(struct MEventClientHeaderStruct * data);
bool32 ValidateMEventClientHeader(const struct MEventClientHeaderStruct * data);
u32 sub_8144418(const u16 * a0, const struct MEventClientHeaderStruct * a1, void *unused);
u32 MEvent_CanPlayerReceiveDistributionMon(const u16 * a0, const struct MEventClientHeaderStruct * a1, void *unused);
bool32 sub_8144474(const struct MEventClientHeaderStruct * a0, const u16 * a1);
u16 sub_81444B0(const struct MEventClientHeaderStruct * a0, u32 command);
bool32 WonderCard_Init(struct WonderCard * card, struct WonderCardMetadata * metadata);
bool32 WonderNews_Init(const struct WonderNews * news);
s32 WonderCard_Enter(void);
s32 WonderNews_Enter(void);
void DestroyWonderCard(void);
void DestroyWonderNews(void);
void WonderCard_Destroy(void);
void WonderNews_Destroy(void);
s32 WonderCard_Exit(bool32 flag);
s32 WonderNews_Exit(bool32 flag);
bool32 CheckReceivedGiftFromWonderCard(void);
void WonderNews_AddScrollIndicatorArrowPair(void);
void WonderNews_RemoveScrollIndicatorArrowPair(void);
bool32 WonderNews_Test_Unk_02(void);
bool32 WonderCard_Test_Unk_08_6(void);
u32 WonderNews_GetInput(u16 input);
void InitMEventData(void);
u16 MEvent_GetBattleCardCount(u32 command);
void MysteryGift_TryIncrementStat(u32 eventId, u32 trainerId);
u16 *GetMEventProfileECWordsMaybe(void);
void MysteryGift_DisableStats(void);
bool32 MysteryGift_TryEnableStatsByFlagId(u16 flagId);
u16 GetWonderCardFlagId(void);
#endif //GUARD_MEVENT_H
-129
View File
@@ -1,129 +0,0 @@
#ifndef GUARD_MEVENT_SERVER_H
#define GUARD_MEVENT_SERVER_H
#include "global.h"
#define ME_SEND_BUF_SIZE 0x400
struct mevent_srv_sub
{
s32 seqno;
u8 sendPlayerNo;
u8 recvPlayerNo;
u16 recvIdent;
u16 recvCounter;
u16 recvCRC;
u16 recvSize;
u16 sendIdent;
u16 sendCounter;
u16 sendCRC;
u16 sendSize;
void *recvBfr;
const void *sendBfr;
u32 (*recvFunc)(struct mevent_srv_sub *);
u32 (*sendFunc)(struct mevent_srv_sub *);
};
struct send_recv_header
{
u16 ident;
u16 crc;
u16 size;
};
struct mevent_client_cmd
{
u32 instr;
u32 parameter;
};
// Client commands
#define CLI_RETURN(x) {.instr = 1, .parameter = x}
#define CLI_RECEIVE(x) {.instr = 2, .parameter = x}
#define CLI_WAITSND {.instr = 3, .parameter = 0}
#define CLI_JUMPBUF {.instr = 4, .parameter = 0}
#define CLI_SNDHEAD {.instr = 8, .parameter = 0}
#define CLI_VLDNEWS {.instr = 9, .parameter = 0}
#define CLI_RECVSAV {.instr = 10, .parameter = 0}
#define CLI_RECVBUF {.instr = 12, .parameter = 0}
#define CLI_REQWORD {.instr = 13, .parameter = 0}
#define CLI_SNDWORD {.instr = 14, .parameter = 0}
#define CLI_RECVMON {.instr = 16, .parameter = 0}
#define CLI_RECVRAM {.instr = 17, .parameter = 0}
#define CLI_SENDALL {.instr = 20, .parameter = 0}
struct mevent_client
{
u32 unk_00;
u32 param;
u32 mainseqno;
u32 flag;
u32 cmdidx;
void *sendBuffer;
void *recvBuffer;
struct mevent_client_cmd * cmdBuffer;
void *buffer;
struct mevent_srv_sub manager;
};
struct mevent_server_cmd
{
u32 instr;
bool32 flag;
void *parameter;
};
// Server commands
#define SRV_RETURN(x) {.instr = 0, .flag = x}
#define SRV_WAITSND {.instr = 1}
#define SRV_RECV(x) {.instr = 2, .flag = x}
#define SRV_BRANCH(y) {.instr = 3, .parameter = (void *)y}
#define SRV_BRANCHIF(x, y) {.instr = 4, .flag = x, .parameter = (void *)y}
#define SRV_READ_1442CC {.instr = 5}
#define SRV_VALID_1442CC {.instr = 6}
#define SRV_CHECK_1442CC_14 {.instr = 7}
#define SRV_READWORD {.instr = 8}
#define SRV_SEND_CARD {.instr = 13}
#define SRV_SEND_NEWS {.instr = 14}
#define SRV_BUFFER_SEND {.instr = 15}
#define SRV_SEND(x, y) {.instr = 18, .flag = x, .parameter = (void *)y}
#define SRV_SENDSTR(x, y) {.instr = 20, .flag = x, .parameter = (void *)y}
#define SRV_BUFFER_CARD {.instr = 26}
#define SRV_BUFFER_NEWS {.instr = 27}
#define SRV_RAM_SCRIPT_IF_VALID {.instr = 28}
struct mevent_srv_common
{
u32 unk_00;
u32 param;
u32 mainseqno;
u32 cmdidx;
const struct mevent_server_cmd * cmdBuffer;
void *recvBuffer;
struct WonderCard * card;
struct WonderNews * news;
struct MEventClientHeaderStruct * mevent_unk1442cc;
void *sendBuffer1;
u32 sendBuffer1Size;
void *sendBuffer2;
u32 sendBuffer2Size;
u32 sendWord;
struct mevent_srv_sub manager;
};
u32 mevent_srv_sub_recv(struct mevent_srv_sub * svr);
u32 mevent_srv_sub_send(struct mevent_srv_sub * svr);
void mevent_srv_sub_init(struct mevent_srv_sub * svr, u32 sendPlayerNo, u32 recvPlayerNo);
void mevent_srv_sub_init_send(struct mevent_srv_sub * svr, u32 ident, const void *src, u32 size);
void mevent_srv_sub_init_recv(struct mevent_srv_sub * svr, u32 ident, void *dest);
void mevent_client_do_init(void);
u32 mevent_client_do_exec(u16 * a0);
void mevent_client_inc_flag(void);
void *mevent_client_get_buffer(void);
void mevent_client_set_param(u32 a0);
void mevent_srv_init_wnews(void);
void mevent_srv_new_wcard(void);
u32 mevent_srv_common_do_exec(u16 * a0);
#endif //GUARD_MEVENT_SERVER_H
+98
View File
@@ -0,0 +1,98 @@
#ifndef GUARD_MYSTERY_GIFT_H
#define GUARD_MYSTERY_GIFT_H
#include "global.h"
#include "main.h"
#include "constants/mystery_gift.h"
#define CARD_STAT_BATTLES_WON 0
#define CARD_STAT_BATTLES_LOST 1
#define CARD_STAT_NUM_TRADES 2
#define CARD_STAT_NUM_STAMPS 3
#define CARD_STAT_MAX_STAMPS 4
enum {
NEWS_INPUT_A,
NEWS_INPUT_B,
NEWS_INPUT_SCROLL_UP,
NEWS_INPUT_SCROLL_DOWN,
NEWS_INPUT_NONE = 0xFF
};
struct MysteryGiftLinkGameData
{
u32 unk_00;
u16 unk_04;
u32 unk_08;
u16 unk_0C;
u32 unk_10;
u16 flagId;
u16 questionnaireWords[NUM_QUESTIONNAIRE_WORDS];
struct WonderCardMetadata cardMetadata;
u8 maxStamps;
u8 playerName[PLAYER_NAME_LENGTH];
u8 playerTrainerId[TRAINER_ID_LENGTH];
u16 easyChatProfile[EASY_CHAT_BATTLE_WORDS_COUNT];
u8 gameCode[GAME_CODE_LENGTH];
u8 version;
};
struct WonderGraphics
{
u8 titleTextPal:4;
u8 bodyTextPal:4;
u8 footerTextPal:4;
u8 stampShadowPal:4;
const u8 * tiles;
const u8 * map;
const u16 * pal;
};
extern const u16 gCard1Pal[];
extern const u16 gCard2Pal[];
extern const u16 gCard3Pal[];
extern const u16 gCard4Pal[];
extern const u16 gCard5Pal[];
struct WonderNews * GetSavedWonderNews(void);
struct WonderCard * GetSavedWonderCard(void);
struct WonderCardMetadata * GetSavedWonderCardMetadata(void);
struct WonderNewsMetadata * GetSavedWonderNewsMetadata(void);
bool32 SaveWonderNews(const struct WonderNews * news);
bool32 ValidateSavedWonderNews(void);
bool32 ValidateSavedWonderCard(void);
bool32 IsWonderNewsSameAsSaved(const u8 * news);
bool32 SaveWonderCard(const struct WonderCard * card);
void DisableWonderCardSending(struct WonderCard * card);
bool32 MysteryGift_TrySaveStamp(const u16 * stamp);
void MysteryGift_LoadLinkGameData(struct MysteryGiftLinkGameData * data);
bool32 MysteryGift_ValidateLinkGameData(const struct MysteryGiftLinkGameData * data);
u32 MysteryGift_CompareCardFlags(const u16 * flagId, const struct MysteryGiftLinkGameData * data, const void *unused);
u32 MysteryGift_CheckStamps(const u16 * stamp, const struct MysteryGiftLinkGameData * data, const void *unused);
bool32 MysteryGift_DoesQuestionnaireMatch(const struct MysteryGiftLinkGameData * data, const u16 * words);
u16 MysteryGift_GetCardStatFromLinkData(const struct MysteryGiftLinkGameData * data, u32 stat);
bool32 WonderCard_Init(struct WonderCard * card, struct WonderCardMetadata * metadata);
bool32 WonderNews_Init(const struct WonderNews * news);
s32 WonderCard_Enter(void);
s32 WonderNews_Enter(void);
void ClearSavedWonderCardAndRelated(void);
void ClearSavedWonderNewsAndRelated(void);
void WonderCard_Destroy(void);
void WonderNews_Destroy(void);
s32 WonderCard_Exit(bool32 flag);
s32 WonderNews_Exit(bool32 flag);
bool32 IsSavedWonderCardGiftNotReceived(void);
void WonderNews_AddScrollIndicatorArrowPair(void);
void WonderNews_RemoveScrollIndicatorArrowPair(void);
bool32 IsSendingSavedWonderNewsAllowed(void);
bool32 IsSendingSavedWonderCardAllowed(void);
u32 WonderNews_GetInput(u16 input);
void ClearMysteryGift(void);
u16 MysteryGift_GetCardStat(u32 stat);
void MysteryGift_TryIncrementStat(u32 stat, u32 trainerId);
u16 *GetQuestionnaireWordsPtr(void);
void MysteryGift_DisableStats(void);
bool32 MysteryGift_TryEnableStatsByFlagId(u16 flagId);
u16 GetWonderCardFlagId(void);
#endif // GUARD_MYSTERY_GIFT_H
+91
View File
@@ -0,0 +1,91 @@
#ifndef GUARD_MYSTERY_GIFT_CLIENT_H
#define GUARD_MYSTERY_GIFT_CLIENT_H
#include "mystery_gift_link.h"
// Return values for client functions called by MysteryGiftClient_Run
enum {
CLI_RET_INIT,
CLI_RET_ACTIVE,
CLI_RET_YES_NO,
CLI_RET_PRINT_MSG,
CLI_RET_ASK_TOSS,
CLI_RET_COPY_MSG,
CLI_RET_END,
};
// IDs for client script instructions
enum {
CLI_NONE,
CLI_RETURN,
CLI_RECV,
CLI_SEND_LOADED,
CLI_COPY_RECV,
CLI_YES_NO,
CLI_COPY_RECV_IF_N,
CLI_COPY_RECV_IF,
CLI_LOAD_GAME_DATA,
CLI_SAVE_NEWS,
CLI_SAVE_CARD,
CLI_PRINT_MSG,
CLI_COPY_MSG,
CLI_ASK_TOSS,
CLI_LOAD_TOSS_RESPONSE,
CLI_RUN_MEVENT_SCRIPT,
CLI_SAVE_STAMP,
CLI_SAVE_RAM_SCRIPT,
CLI_RECV_EREADER_TRAINER,
CLI_SEND_STAT,
CLI_SEND_READY_END,
CLI_RUN_BUFFER_SCRIPT,
};
// IDs for client messages when ending a script.
// Given as the parameter to CLI_RETURN, and resolved to text in GetClientResultMessage
enum {
CLI_MSG_NOTHING_SENT,
CLI_MSG_RECORD_UPLOADED,
CLI_MSG_CARD_RECEIVED,
CLI_MSG_NEWS_RECEIVED,
CLI_MSG_STAMP_RECEIVED,
CLI_MSG_HAD_CARD,
CLI_MSG_HAD_STAMP,
CLI_MSG_HAD_NEWS,
CLI_MSG_NO_ROOM_STAMPS,
CLI_MSG_COMM_CANCELED,
CLI_MSG_CANT_ACCEPT,
CLI_MSG_COMM_ERROR,
CLI_MSG_TRAINER_RECEIVED,
CLI_MSG_BUFFER_SUCCESS,
CLI_MSG_BUFFER_FAILURE,
};
#define CLIENT_MAX_MSG_SIZE 64
struct MysteryGiftClientCmd
{
u32 instr;
u32 parameter;
};
struct MysteryGiftClient
{
u32 unused;
u32 param;
u32 funcId;
u32 funcState;
u32 cmdidx;
void *sendBuffer;
void *recvBuffer;
struct MysteryGiftClientCmd * script;
void *msg;
struct MysteryGiftLink link;
};
void MysteryGiftClient_Create(void);
u32 MysteryGiftClient_Run(u16 * endVal);
void MysteryGiftClient_AdvanceState(void);
void * MysteryGiftClient_GetMsg(void);
void MysteryGiftClient_SetParam(u32 value);
#endif //GUARD_MYSTERY_GIFT_CLIENT_H
+49
View File
@@ -0,0 +1,49 @@
#ifndef GUARD_MYSTERY_GIFT_LINK_H
#define GUARD_MYSTERY_GIFT_LINK_H
#define MG_LINK_BUFFER_SIZE 0x400
// Send/receive ids for the Client/Server to make sure
// they're sending/receiving the same thing
enum {
MG_LINKID_CLIENT_SCRIPT = 16,
MG_LINKID_GAME_DATA,
MG_LINKID_GAME_STAT,
MG_LINKID_RESPONSE,
MG_LINKID_READY_END,
MG_LINKID_DYNAMIC_MSG,
MG_LINKID_CARD,
MG_LINKID_NEWS,
MG_LINKID_STAMP,
MG_LINKID_RAM_SCRIPT,
MG_LINKID_EREADER_TRAINER,
MG_LINKID_UNK_1,
MG_LINKID_UNK_2,
};
struct MysteryGiftLink
{
s32 state;
u8 sendPlayerId;
u8 recvPlayerId;
u16 recvIdent;
u16 recvCounter;
u16 recvCRC;
u16 recvSize;
u16 sendIdent;
u16 sendCounter;
u16 sendCRC;
u16 sendSize;
void * recvBuffer;
const void * sendBuffer;
u32 (*recvFunc)(struct MysteryGiftLink *);
u32 (*sendFunc)(struct MysteryGiftLink *);
};
void MysteryGiftLink_Init(struct MysteryGiftLink * link, u32 sendPlayerId, u32 recvPlayerId);
void MysteryGiftLink_InitSend(struct MysteryGiftLink * link, u32 ident, const void * src, u32 size);
bool32 MysteryGiftLink_Recv(struct MysteryGiftLink * link);
bool32 MysteryGiftLink_Send(struct MysteryGiftLink * link);
void MysteryGiftLink_InitRecv(struct MysteryGiftLink * link, u32 ident, void * dest);
#endif //GUARD_MYSTERY_GIFT_LINK_H
+3 -1
View File
@@ -3,9 +3,11 @@
extern bool8 gGiftIsFromEReader;
bool32 PrintMysteryGiftMenuMessage(u8 * cmdPtr, const u8 * src);
void AddTextPrinterToWindow1(const u8 *str);
void MainCB_FreeAllBuffersAndReturnToInitTitleScreen(void);
void PrintMysteryGiftOrEReaderTopMenu(bool8, bool32);
void c2_mystery_gift(void);
void CB2_InitMysteryGift(void);
void CB2_MysteryGiftEReader(void);
s8 DoMysteryGiftYesNo(u8 * textState, u16 * windowId, bool8 yesNoBoxPlacement, const u8 * str);
void MG_DrawTextBorder(u8 windowId);
+104
View File
@@ -0,0 +1,104 @@
#ifndef GUARD_MYSTERY_GIFT_SERVER_H
#define GUARD_MYSTERY_GIFT_SERVER_H
#include "global.h"
#include "mystery_gift_link.h"
// Return values for Server_* functions.
// Other than SVR_RET_END, effectively useless (not checked for).
enum {
SVR_RET_INIT,
SVR_RET_ACTIVE,
SVR_RET_UNUSED,
SVR_RET_END
};
// IDs for server script instructions
enum {
SVR_RETURN,
SVR_SEND,
SVR_RECV,
SVR_GOTO,
SVR_GOTO_IF_EQ,
SVR_COPY_GAME_DATA,
SVR_CHECK_GAME_DATA, // In Emerald, this was separated into SVR_CHECK_GAME_DATA_CARD and SVR_CHECK_GAME_DATA_NEWS
SVR_CHECK_EXISTING_CARD,
SVR_READ_RESPONSE,
SVR_CHECK_EXISTING_STAMPS,
SVR_GET_CARD_STAT,
SVR_CHECK_QUESTIONNAIRE,
SVR_COMPARE,
SVR_LOAD_CARD,
SVR_LOAD_NEWS,
SVR_LOAD_RAM_SCRIPT,
SVR_LOAD_STAMP,
SVR_LOAD_UNK_2,
SVR_LOAD_CLIENT_SCRIPT,
SVR_LOAD_EREADER_TRAINER,
SVR_LOAD_MSG,
SVR_COPY_STAMP,
SVR_COPY_CARD,
SVR_COPY_NEWS,
SVR_SET_RAM_SCRIPT,
SVR_SET_CLIENT_SCRIPT,
SVR_COPY_SAVED_CARD,
SVR_COPY_SAVED_NEWS,
SVR_COPY_SAVED_RAM_SCRIPT,
SVR_LOAD_UNK_1,
};
// Create arguments for SVR_LOAD_CLIENT_SCRIPT or SVR_LOAD_MSG
// (a script/text size and pointer to send to the client)
#define PTR_ARG(pointer) .param = sizeof(pointer), .ptr = pointer
// IDs for server messages when ending a script.
// Given as the parameter to SVR_RETURN, and resolved to text in GetServerResultMessage
enum {
SVR_MSG_NOTHING_SENT,
SVR_MSG_RECORD_UPLOADED,
SVR_MSG_CARD_SENT,
SVR_MSG_NEWS_SENT,
SVR_MSG_STAMP_SENT,
SVR_MSG_HAS_CARD,
SVR_MSG_HAS_STAMP,
SVR_MSG_HAS_NEWS,
SVR_MSG_NO_ROOM_STAMPS,
SVR_MSG_CLIENT_CANCELED,
SVR_MSG_CANT_SEND_GIFT_1,
SVR_MSG_COMM_ERROR,
SVR_MSG_GIFT_SENT_1,
SVR_MSG_GIFT_SENT_2,
SVR_MSG_CANT_SEND_GIFT_2,
};
struct MysteryGiftServerCmd
{
u32 instr;
bool32 param;
const void *ptr;
};
struct MysteryGiftServer
{
u32 unused;
u32 param;
u32 funcId;
u32 cmdidx;
const struct MysteryGiftServerCmd * script;
void *recvBuffer;
struct WonderCard * card;
struct WonderNews * news;
struct MysteryGiftLinkGameData * linkGameData;
const void *ramScript;
u32 ramScriptSize;
const void *clientScript;
u32 clientScriptSize;
u32 stamp;
struct MysteryGiftLink manager;
};
void MysterGiftServer_CreateForNews(void);
void MysterGiftServer_CreateForCard(void);
u32 MysterGiftServer_Run(u16 * endVal);
#endif //GUARD_MYSTERY_GIFT_SERVER_H
+1 -1
View File
@@ -1141,7 +1141,7 @@ extern const u8 gText_PeopleBattling[];
extern const u8 gText_PeopleInUnionRoom[];
extern const u8 gText_PeopleCommunicating[];
// mevent
// mystery_gift
extern const u8 gJPText_ReceiveMysteryGiftWithEReader[];
extern const u8 gJPText_SelectConnectFromEReaderMenu[];
extern const u8 gJPText_SelectConnectWithGBA[];
+17
View File
@@ -0,0 +1,17 @@
#ifndef GUARD_WONDER_NEWS_H
#define GUARD_WONDER_NEWS_H
#include "global.h"
enum {
WONDER_NEWS_NONE,
WONDER_NEWS_RECV_FRIEND,
WONDER_NEWS_RECV_WIRELESS,
WONDER_NEWS_SENT,
};
void WonderNews_SetReward(u32 newsType);
void WonderNews_Reset(void);
void WonderNews_IncrementStepCounter(void);
#endif //GUARD_WONDER_NEWS_H