From 6d6f207eb4a6348ccf63fdddd7c904ea977cf60b Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sat, 19 Nov 2022 18:52:29 -0500 Subject: [PATCH] Initial mystery gift sync --- data/mystery_event_msg.s | 8 +- data/scripts/cable_club.inc | 2 +- data/specials.inc | 2 +- include/constants/flags.h | 42 +-- include/constants/vars.h | 2 +- include/easy_chat.h | 2 +- include/event_data.h | 4 +- include/global.h | 4 +- include/main.h | 3 +- include/mystery_gift.h | 68 ++-- include/mystery_gift_server.h | 2 +- include/wonder_news.h | 13 +- src/easy_chat.c | 4 +- src/easy_chat_2.c | 2 +- src/event_data.c | 4 +- src/field_control_avatar.c | 2 +- src/field_specials.c | 10 +- src/mystery_gift.c | 588 ++++++++++++++++++---------------- src/mystery_gift_client.c | 12 +- src/mystery_gift_menu.c | 56 +--- src/mystery_gift_server.c | 16 +- src/new_game.c | 2 +- src/script.c | 4 +- src/wonder_news.c | 97 +++--- 24 files changed, 488 insertions(+), 461 deletions(-) diff --git a/data/mystery_event_msg.s b/data/mystery_event_msg.s index 26048ca52..fed033c39 100644 --- a/data/mystery_event_msg.s +++ b/data/mystery_event_msg.s @@ -208,7 +208,7 @@ MysteryEventScript_AuroraTicket:: setvaddress MysteryEventScript_AuroraTicket lock faceplayer - vgoto_if_set FLAG_GOT_AURORA_TICKET, AuroraTicket_Obtained + vgoto_if_set FLAG_RECEIVED_AURORA_TICKET, AuroraTicket_Obtained vgoto_if_set FLAG_FOUGHT_DEOXYS, AuroraTicket_Obtained checkitem ITEM_AURORA_TICKET, 1 vgoto_if_eq VAR_RESULT, TRUE, AuroraTicket_Obtained @@ -219,7 +219,7 @@ MysteryEventScript_AuroraTicket:: vgoto_if_eq VAR_RESULT, FALSE, AuroraTicket_NoBagSpace giveitem ITEM_AURORA_TICKET setflag FLAG_ENABLE_SHIP_BIRTH_ISLAND - setflag FLAG_GOT_AURORA_TICKET + setflag FLAG_RECEIVED_AURORA_TICKET vmessage sText_AuroraTicket2 waitmessage waitbuttonpress @@ -266,7 +266,7 @@ MysteryEventScript_MysticTicket:: setvaddress MysteryEventScript_MysticTicket lock faceplayer - vgoto_if_set FLAG_GOT_MYSTIC_TICKET, MysticTicket_Obtained + vgoto_if_set FLAG_RECEIVED_MYSTIC_TICKET, MysticTicket_Obtained vgoto_if_set FLAG_FOUGHT_LUGIA, MysticTicket_Obtained vgoto_if_set FLAG_FOUGHT_HO_OH, MysticTicket_Obtained checkitem ITEM_MYSTIC_TICKET, 1 @@ -278,7 +278,7 @@ MysteryEventScript_MysticTicket:: vgoto_if_eq VAR_RESULT, FALSE, MysticTicket_NoBagSpace giveitem ITEM_MYSTIC_TICKET setflag FLAG_ENABLE_SHIP_NAVEL_ROCK - setflag FLAG_GOT_MYSTIC_TICKET + setflag FLAG_RECEIVED_MYSTIC_TICKET vmessage sText_MysticTicket1 waitmessage waitbuttonpress diff --git a/data/scripts/cable_club.inc b/data/scripts/cable_club.inc index f725dbaea..e7f53ada2 100644 --- a/data/scripts/cable_club.inc +++ b/data/scripts/cable_club.inc @@ -3,7 +3,7 @@ CableClub_OnTransition:: end CableClub_EventScript_HideOrShowMysteryGiftMan:: - specialvar VAR_RESULT, ValidateReceivedWonderCard + specialvar VAR_RESULT, ValidateSavedWonderCard goto_if_eq VAR_RESULT, FALSE, EventScript_HideMysteryGiftMan clearflag FLAG_HIDE_MG_DELIVERYMEN return diff --git a/data/specials.inc b/data/specials.inc index f815d05d6..5c6e5eb0c 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -392,7 +392,7 @@ gSpecials:: def_special Script_SetHelpContext def_special BackupHelpContext def_special RestoreHelpContext - def_special ValidateReceivedWonderCard + def_special ValidateSavedWonderCard def_special SetUnlockedPokedexFlags def_special InitUnionRoom def_special BufferUnionRoomPlayerName diff --git a/include/constants/flags.h b/include/constants/flags.h index 5baa6c75c..24e44dd9e 100644 --- a/include/constants/flags.h +++ b/include/constants/flags.h @@ -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 diff --git a/include/constants/vars.h b/include/constants/vars.h index 56dafee12..5c7bbf8a3 100644 --- a/include/constants/vars.h +++ b/include/constants/vars.h @@ -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 diff --git a/include/easy_chat.h b/include/easy_chat.h index 853060f4f..ec5488bca 100644 --- a/include/easy_chat.h +++ b/include/easy_chat.h @@ -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); diff --git a/include/event_data.h b/include/event_data.h index 5a6f98c6c..285b4cc83 100644 --- a/include/event_data.h +++ b/include/event_data.h @@ -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); diff --git a/include/global.h b/include/global.h index 79dedcdc2..417cee4f7 100644 --- a/include/global.h +++ b/include/global.h @@ -627,7 +627,7 @@ struct FameCheckerSaveData struct WonderNewsMetadata { - u8 unk_0_0:2; + u8 newsType:2; u8 unk_0_2:3; u8 unk_0_5:3; u8 berry; @@ -635,7 +635,7 @@ struct WonderNewsMetadata struct WonderNews { - u16 newsId; + u16 id; u8 sendType; // SEND_TYPE_* u8 bgType; u8 titleText[WONDER_NEWS_TEXT_LENGTH]; diff --git a/include/main.h b/include/main.h index a27145c7b..4a5f79a9d 100644 --- a/include/main.h +++ b/include/main.h @@ -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; diff --git a/include/mystery_gift.h b/include/mystery_gift.h index e25598c9a..a8ec84f86 100644 --- a/include/mystery_gift.h +++ b/include/mystery_gift.h @@ -2,6 +2,8 @@ #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 @@ -17,21 +19,21 @@ enum { NEWS_INPUT_NONE = 0xFF }; -struct MEventClientHeaderStruct +struct MysteryGiftLinkGameData { 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]; + 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; }; @@ -66,41 +68,41 @@ 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); +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, void *unused); +u32 MysteryGift_CheckStamps(const u16 * stamp, const struct MysteryGiftLinkGameData * data, 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 DestroyWonderCard(void); -void DestroyWonderNews(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 CheckReceivedGiftFromWonderCard(void); +bool32 IsSavedWonderCardGiftNotReceived(void); void WonderNews_AddScrollIndicatorArrowPair(void); void WonderNews_RemoveScrollIndicatorArrowPair(void); -bool32 WonderNews_Test_Unk_02(void); -bool32 WonderCard_Test_Unk_08_6(void); +bool32 IsSendingSavedWonderNewsAllowed(void); +bool32 IsSendingSavedWonderCardAllowed(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 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); diff --git a/include/mystery_gift_server.h b/include/mystery_gift_server.h index 06bac26f3..2a9070afb 100644 --- a/include/mystery_gift_server.h +++ b/include/mystery_gift_server.h @@ -102,7 +102,7 @@ struct mevent_srv_common void *recvBuffer; struct WonderCard * card; struct WonderNews * news; - struct MEventClientHeaderStruct * mevent_unk1442cc; + struct MysteryGiftLinkGameData * mevent_unk1442cc; void *sendBuffer1; u32 sendBuffer1Size; void *sendBuffer2; diff --git a/include/wonder_news.h b/include/wonder_news.h index ec845906e..3cbb46055 100644 --- a/include/wonder_news.h +++ b/include/wonder_news.h @@ -3,8 +3,15 @@ #include "global.h" -void MENewsJisan_SetRandomReward(u32 a0); -void MENewsJisanReset(void); -void MENewsJisanStepCounter(void); +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 diff --git a/src/easy_chat.c b/src/easy_chat.c index 443500453..563a7bd5c 100644 --- a/src/easy_chat.c +++ b/src/easy_chat.c @@ -472,10 +472,10 @@ void InitEasyChatPhrases(void) #endif } -void EC_ResetMEventProfileMaybe(void) +void InitQuestionnaireWords(void) { s32 i; - u16 *ptr = GetMEventProfileECWordsMaybe(); + u16 *ptr = GetQuestionnaireWordsPtr(); for (i = 0; i < 4; i++) ptr[i] = EC_WORD_UNDEFINED; } diff --git a/src/easy_chat_2.c b/src/easy_chat_2.c index 1688e92e0..6951da8e8 100644 --- a/src/easy_chat_2.c +++ b/src/easy_chat_2.c @@ -271,7 +271,7 @@ void ShowEasyChatScreen(void) words = gSaveBlock1Ptr->easyChatBattleLost; break; case EASY_CHAT_TYPE_QUESTIONNAIRE: - words = GetMEventProfileECWordsMaybe(); + words = GetQuestionnaireWordsPtr(); break; case EASY_CHAT_TYPE_MAIL: words = gSaveBlock1Ptr->mail[gSpecialVar_0x8005].words; diff --git a/src/event_data.c b/src/event_data.c index 5d3bad5d6..13ec93917 100644 --- a/src/event_data.c +++ b/src/event_data.c @@ -129,7 +129,7 @@ bool32 IsMysteryGiftEnabled(void) return FlagGet(FLAG_SYS_MYSTERY_GIFT_ENABLED); } -void ResetMysteryEventFlags(void) +void ClearMysteryGiftFlags(void) { FlagClear(FLAG_MYSTERY_GIFT_DONE); FlagClear(FLAG_MYSTERY_GIFT_1); @@ -149,7 +149,7 @@ void ResetMysteryEventFlags(void) FlagClear(FLAG_MYSTERY_GIFT_15); } -void ResetMysteryEventVars(void) +void ClearMysteryGiftVars(void) { VarSet(VAR_EVENT_PICHU_SLOT, 0); VarSet(VAR_MYSTERY_GIFT_1, 0); diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index c673a0753..31dd27e17 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -215,7 +215,7 @@ int ProcessPlayerFieldInput(struct FieldInput *input) if (input->tookStep) { IncrementGameStat(GAME_STAT_STEPS); - MENewsJisanStepCounter(); + WonderNews_IncrementStepCounter(); IncrementRenewableHiddenItemStepCounter(); RunMassageCooldownStepCounter(); IncrementResortGorgeousStepCounter(); diff --git a/src/field_specials.c b/src/field_specials.c index 8ee9bb04c..45fc701a9 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -1955,15 +1955,15 @@ u16 BattleCardAction(void) switch (gSpecialVar_Result) { case 0: - return MEvent_GetBattleCardCount(3); + return MysteryGift_GetCardStat(3); case 1: - return MEvent_GetBattleCardCount(4); + return MysteryGift_GetCardStat(4); case 2: - return MEvent_GetBattleCardCount(0); + return MysteryGift_GetCardStat(0); case 3: - return MEvent_GetBattleCardCount(1); + return MysteryGift_GetCardStat(1); case 4: - return MEvent_GetBattleCardCount(2); + return MysteryGift_GetCardStat(2); default: AGB_ASSERT_EX(0, ABSPATH("scr_tool.c"), 3873); return 0; diff --git a/src/mystery_gift.c b/src/mystery_gift.c index a12238263..fa164b924 100644 --- a/src/mystery_gift.c +++ b/src/mystery_gift.c @@ -19,6 +19,8 @@ #include "mystery_gift.h" #include "strings.h" +#define CALC_CRC(data) CalcCRC16WithTable((void *)&(data), sizeof(data)) + struct MEventTaskData1 { u16 stateAdvanceDelay; @@ -36,44 +38,44 @@ struct MEventTaskData1 }; static void Task_EReaderComm(u8 taskId); -static bool32 IsReceivedWonderNewsHeaderValid(const struct WonderNews * src); -static void BlankWonderNews(void); -static void BlankMENewsJisan(void); -static bool32 IsReceivedWonderCardHeaderValid(const struct WonderCard * src); -static void BlankSavedWonderCard(void); -static void BlankMEventBuffer2(void); -static void RecordIdOfWonderCardSender(u32 eventId, u32 trainerId, u32 *idsList, s32 count); -static void BlankBuffer344(void); +static bool32 ValidateWonderNews(const struct WonderNews * src); +static void ClearSavedWonderNews(void); +static void ClearSavedWonderNewsMetadata(void); +static bool32 ValidateWonderCard(const struct WonderCard * src); +static void ClearSavedWonderCard(void); +static void ClearSavedWonderCardMetadata(void); +static void IncrementCardStatForNewTrainer(u32 eventId, u32 trainerId, u32 *idsList, s32 count); +static void ClearSavedTrainerIds(void); extern const u8 gMultiBootProgram_EReader_Start[]; extern const u8 gMultiBootProgram_EReader_End[]; -static const u16 sGiftItemFlagIds[] = { - FLAG_GOT_AURORA_TICKET, - FLAG_GOT_MYSTIC_TICKET, - FLAG_0x2A9, - FLAG_0x2AA, - FLAG_0x2AB, - FLAG_0x2AC, - FLAG_0x2AD, - FLAG_0x2AE, - FLAG_0x2AF, - FLAG_0x2B0, - FLAG_0x2B1, - FLAG_0x2B2, - FLAG_0x2B3, - FLAG_0x2B4, - FLAG_0x2B5, - FLAG_0x2B6, - FLAG_0x2B7, - FLAG_0x2B8, - FLAG_0x2B9, - FLAG_0x2BA +static const u16 sReceivedGiftFlags[] = { + FLAG_RECEIVED_AURORA_TICKET, + FLAG_RECEIVED_MYSTIC_TICKET, + FLAG_RECEIVED_OLD_SEA_MAP, // Not used until Emerald + FLAG_WONDER_CARD_UNUSED_1, + FLAG_WONDER_CARD_UNUSED_2, + FLAG_WONDER_CARD_UNUSED_3, + FLAG_WONDER_CARD_UNUSED_4, + FLAG_WONDER_CARD_UNUSED_5, + FLAG_WONDER_CARD_UNUSED_6, + FLAG_WONDER_CARD_UNUSED_7, + FLAG_WONDER_CARD_UNUSED_8, + FLAG_WONDER_CARD_UNUSED_9, + FLAG_WONDER_CARD_UNUSED_10, + FLAG_WONDER_CARD_UNUSED_11, + FLAG_WONDER_CARD_UNUSED_12, + FLAG_WONDER_CARD_UNUSED_13, + FLAG_WONDER_CARD_UNUSED_14, + FLAG_WONDER_CARD_UNUSED_15, + FLAG_WONDER_CARD_UNUSED_16, + FLAG_WONDER_CARD_UNUSED_17 }; struct MEvent_Str_1 sMEventSendToEReaderManager; -static EWRAM_DATA bool32 sReceivedWonderCardIsValid = FALSE; +static EWRAM_DATA bool32 sStatsEnabled = FALSE; void SendUnknownSerialData_Init(struct MEvent_Str_1 *mgr, size_t size, const void *data) { @@ -475,11 +477,11 @@ static void Task_EReaderComm(u8 taskId) } } -void InitMEventData(void) +void ClearMysteryGift(void) { CpuFill32(0, &gSaveBlock1Ptr->mysteryGift, sizeof(gSaveBlock1Ptr->mysteryGift)); - BlankMENewsJisan(); - EC_ResetMEventProfileMaybe(); + ClearSavedWonderNewsMetadata(); + InitQuestionnaireWords(); } struct WonderNews * GetSavedWonderNews(void) @@ -492,301 +494,310 @@ struct WonderCard * GetSavedWonderCard(void) return &gSaveBlock1Ptr->mysteryGift.card; } -struct WonderCardMetadata * sav1_get_mevent_buffer_2(void) +struct WonderCardMetadata * GetSavedWonderCardMetadata(void) { return &gSaveBlock1Ptr->mysteryGift.cardMetadata; } -struct WonderNewsMetadata * GetMENewsJisanStructPtr(void) +struct WonderNewsMetadata * GetSavedWonderNewsMetadata(void) { return &gSaveBlock1Ptr->mysteryGift.newsMetadata; } -u16 * GetMEventProfileECWordsMaybe(void) +u16 * GetQuestionnaireWordsPtr(void) { return gSaveBlock1Ptr->mysteryGift.questionnaireWords; } -void DestroyWonderNews(void) +// Equivalent to ClearSavedWonderCardAndRelated, but nothing else to clear +void ClearSavedWonderNewsAndRelated(void) { - BlankWonderNews(); + ClearSavedWonderNews(); } -bool32 OverwriteSavedWonderNewsWithReceivedNews(const struct WonderNews * src) +bool32 SaveWonderNews(const struct WonderNews * news) { - if (!IsReceivedWonderNewsHeaderValid(src)) + if (!ValidateWonderNews(news)) return FALSE; - BlankWonderNews(); - gSaveBlock1Ptr->mysteryGift.news = *src; - gSaveBlock1Ptr->mysteryGift.newsCrc = CalcCRC16WithTable((void *)&gSaveBlock1Ptr->mysteryGift.news, sizeof(struct WonderNews)); + + ClearSavedWonderNews(); + gSaveBlock1Ptr->mysteryGift.news = *news; + gSaveBlock1Ptr->mysteryGift.newsCrc = CALC_CRC(gSaveBlock1Ptr->mysteryGift.news); return TRUE; } -bool32 ValidateReceivedWonderNews(void) +bool32 ValidateSavedWonderNews(void) { - if (CalcCRC16WithTable((void *)&gSaveBlock1Ptr->mysteryGift.news, sizeof(struct WonderNews)) != gSaveBlock1Ptr->mysteryGift.newsCrc) + if (CALC_CRC(gSaveBlock1Ptr->mysteryGift.news) != gSaveBlock1Ptr->mysteryGift.newsCrc) return FALSE; - if (!IsReceivedWonderNewsHeaderValid(&gSaveBlock1Ptr->mysteryGift.news)) + if (!ValidateWonderNews(&gSaveBlock1Ptr->mysteryGift.news)) return FALSE; return TRUE; } -static bool32 IsReceivedWonderNewsHeaderValid(const struct WonderNews * data) +static bool32 ValidateWonderNews(const struct WonderNews * news) { - if (data->newsId == 0) + if (news->id == 0) return FALSE; return TRUE; } -bool32 WonderNews_Test_Unk_02(void) +bool32 IsSendingSavedWonderNewsAllowed(void) { - const struct WonderNews * data = &gSaveBlock1Ptr->mysteryGift.news; - if (data->sendType == 0) + const struct WonderNews * news = &gSaveBlock1Ptr->mysteryGift.news; + if (news->sendType == SEND_TYPE_DISALLOWED) return FALSE; return TRUE; } -static void BlankWonderNews(void) +static void ClearSavedWonderNews(void) { CpuFill32(0, GetSavedWonderNews(), sizeof(gSaveBlock1Ptr->mysteryGift.news)); gSaveBlock1Ptr->mysteryGift.newsCrc = 0; } -static void BlankMENewsJisan(void) +static void ClearSavedWonderNewsMetadata(void) { - CpuFill32(0, GetMENewsJisanStructPtr(), sizeof(struct WonderNewsMetadata)); - MENewsJisanReset(); + CpuFill32(0, GetSavedWonderNewsMetadata(), sizeof(gSaveBlock1Ptr->mysteryGift.newsMetadata)); + WonderNews_Reset(); } -bool32 MEvent_HaveAlreadyReceivedWonderNews(const u8 * src) +bool32 IsWonderNewsSameAsSaved(const u8 * news) { - const u8 * r5 = (const u8 *)&gSaveBlock1Ptr->mysteryGift.news; + const u8 * savedNews = (const u8 *)&gSaveBlock1Ptr->mysteryGift.news; u32 i; - if (!ValidateReceivedWonderNews()) + if (!ValidateSavedWonderNews()) return FALSE; - for (i = 0; i < sizeof(struct WonderNews); i++) + + for (i = 0; i < sizeof(gSaveBlock1Ptr->mysteryGift.news); i++) { - if (r5[i] != src[i]) + if (savedNews[i] != news[i]) return FALSE; } return TRUE; } -void DestroyWonderCard(void) +void ClearSavedWonderCardAndRelated(void) { - BlankSavedWonderCard(); - BlankMEventBuffer2(); - BlankBuffer344(); + ClearSavedWonderCard(); + ClearSavedWonderCardMetadata(); + ClearSavedTrainerIds(); ClearRamScript(); - ResetMysteryEventFlags(); - ResetMysteryEventVars(); + ClearMysteryGiftFlags(); + ClearMysteryGiftVars(); ClearEReaderTrainer(&gSaveBlock2Ptr->battleTower.ereaderTrainer); } -bool32 OverwriteSavedWonderCardWithReceivedCard(const struct WonderCard * data) +bool32 SaveWonderCard(const struct WonderCard * card) { - struct WonderCardMetadata * r2; - struct WonderCard * r1; - if (!IsReceivedWonderCardHeaderValid(data)) + struct WonderCardMetadata * metadata; + if (!ValidateWonderCard(card)) return FALSE; - DestroyWonderCard(); - memcpy(&gSaveBlock1Ptr->mysteryGift.card, data, sizeof(struct WonderCard)); - gSaveBlock1Ptr->mysteryGift.cardCrc = CalcCRC16WithTable((void *)&gSaveBlock1Ptr->mysteryGift.card, sizeof(struct WonderCard)); - // Annoying hack to match - r2 = &gSaveBlock1Ptr->mysteryGift.cardMetadata; - r1 = &gSaveBlock1Ptr->mysteryGift.card; - r2->iconSpecies = r1->iconSpecies; + + ClearSavedWonderCardAndRelated(); + memcpy(&gSaveBlock1Ptr->mysteryGift.card, card, sizeof(struct WonderCard)); + gSaveBlock1Ptr->mysteryGift.cardCrc = CALC_CRC(gSaveBlock1Ptr->mysteryGift.card); + metadata = &gSaveBlock1Ptr->mysteryGift.cardMetadata; + metadata->iconSpecies = (&gSaveBlock1Ptr->mysteryGift.card)->iconSpecies; return TRUE; } -bool32 ValidateReceivedWonderCard(void) +bool32 ValidateSavedWonderCard(void) { - if (gSaveBlock1Ptr->mysteryGift.cardCrc != CalcCRC16WithTable((void *)&gSaveBlock1Ptr->mysteryGift.card, sizeof(struct WonderCard))) + if (gSaveBlock1Ptr->mysteryGift.cardCrc != CALC_CRC(gSaveBlock1Ptr->mysteryGift.card)) return FALSE; - if (!IsReceivedWonderCardHeaderValid(&gSaveBlock1Ptr->mysteryGift.card)) + if (!ValidateWonderCard(&gSaveBlock1Ptr->mysteryGift.card)) return FALSE; if (!ValidateRamScript()) return FALSE; return TRUE; } -static bool32 IsReceivedWonderCardHeaderValid(const struct WonderCard * data) +static bool32 ValidateWonderCard(const struct WonderCard * card) { - if (data->flagId == 0) + if (card->flagId == 0) return FALSE; - if (data->type > 2) + if (card->type >= CARD_TYPE_COUNT) return FALSE; - if (!(data->sendType == 0 || data->sendType == 1 || data->sendType == 2)) + if (!(card->sendType == SEND_TYPE_DISALLOWED + || card->sendType == SEND_TYPE_ALLOWED + || card->sendType == SEND_TYPE_ALLOWED_ALWAYS)) return FALSE; - if (data->bgType > 7) + if (card->bgType >= NUM_WONDER_BGS) return FALSE; - if (data->maxStamps > 7) + if (card->maxStamps > MAX_STAMP_CARD_STAMPS) return FALSE; return TRUE; } -bool32 WonderCard_Test_Unk_08_6(void) +bool32 IsSendingSavedWonderCardAllowed(void) { - const struct WonderCard * data = &gSaveBlock1Ptr->mysteryGift.card; - if (data->sendType == 0) + const struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card; + if (card->sendType == SEND_TYPE_DISALLOWED) return FALSE; return TRUE; } -static void BlankSavedWonderCard(void) +static void ClearSavedWonderCard(void) { - CpuFill32(0, &gSaveBlock1Ptr->mysteryGift.card, sizeof(struct WonderCard)); + CpuFill32(0, &gSaveBlock1Ptr->mysteryGift.card, sizeof(gSaveBlock1Ptr->mysteryGift.card)); gSaveBlock1Ptr->mysteryGift.cardCrc = 0; } -static void BlankMEventBuffer2(void) +static void ClearSavedWonderCardMetadata(void) { - CpuFill32(0, sav1_get_mevent_buffer_2(), 18 * sizeof(u16)); + CpuFill32(0, GetSavedWonderCardMetadata(), sizeof(gSaveBlock1Ptr->mysteryGift.cardMetadata)); gSaveBlock1Ptr->mysteryGift.cardMetadataCrc = 0; } u16 GetWonderCardFlagId(void) { - if (ValidateReceivedWonderCard()) + if (ValidateSavedWonderCard()) return gSaveBlock1Ptr->mysteryGift.card.flagId; return 0; } -void MEvent_WonderCardResetUnk08_6(struct WonderCard * buffer) +void DisableWonderCardSending(struct WonderCard * card) { - if (buffer->sendType == 1) - buffer->sendType = 0; + if (card->sendType == SEND_TYPE_ALLOWED) + card->sendType = SEND_TYPE_DISALLOWED; } -static bool32 IsCardIdInValidRange(u16 a0) +static bool32 IsWonderCardFlagIDInValidRange(u16 flagId) { - if (a0 >= 1000 && a0 < 1020) + if (flagId >= WONDER_CARD_FLAG_OFFSET && flagId < WONDER_CARD_FLAG_OFFSET + NUM_WONDER_CARD_FLAGS) return TRUE; return FALSE; } -bool32 CheckReceivedGiftFromWonderCard(void) +bool32 IsSavedWonderCardGiftNotReceived(void) { u16 value = GetWonderCardFlagId(); - if (!IsCardIdInValidRange(value)) + if (!IsWonderCardFlagIDInValidRange(value)) return FALSE; - if (FlagGet(sGiftItemFlagIds[value - 1000]) == TRUE) + + // If flag is set, player has received gift from this card + if (FlagGet(sReceivedGiftFlags[value - WONDER_CARD_FLAG_OFFSET]) == TRUE) return FALSE; return TRUE; } -static s32 CountReceivedDistributionMons(const struct WonderCardMetadata * data, s32 size) +static s32 GetNumStampsInMetadata(const struct WonderCardMetadata * data, s32 size) { - s32 r3 = 0; + s32 numStamps = 0; s32 i; for (i = 0; i < size; i++) { - if (data->stampData[1][i] && data->stampData[0][i]) - r3++; + if (data->stampData[STAMP_ID][i] && data->stampData[STAMP_SPECIES][i]) + numStamps++; } - return r3; + return numStamps; } -static bool32 HasPlayerAlreadyReceivedDistributedMon(const struct WonderCardMetadata * data1, const u16 * data2, s32 size) +static bool32 IsStampInMetadata(const struct WonderCardMetadata * metadata, const u16 * stamp, s32 maxStamps) { s32 i; - for (i = 0; i < size; i++) + for (i = 0; i < maxStamps; i++) { - if (data1->stampData[1][i] == data2[1]) + if (metadata->stampData[STAMP_ID][i] == stamp[STAMP_ID]) return TRUE; - if (data1->stampData[0][i] == data2[0]) + if (metadata->stampData[STAMP_SPECIES][i] == stamp[STAMP_SPECIES]) return TRUE; } return FALSE; } -static bool32 IsWonderCardSpeciesValid(const u16 * data) +static bool32 ValidateStamp(const u16 * stamp) { - if (data[1] == 0) + if (stamp[STAMP_ID] == 0) return FALSE; - if (data[0] == SPECIES_NONE) + if (stamp[STAMP_SPECIES] == SPECIES_NONE) return FALSE; - if (data[0] >= NUM_SPECIES) + if (stamp[STAMP_SPECIES] >= NUM_SPECIES) return FALSE; return TRUE; } -static s32 ValidateCardAndCountMonsReceived(void) +static s32 GetNumStampsInSavedCard(void) { - struct WonderCard * data; - if (!ValidateReceivedWonderCard()) + struct WonderCard * card; + if (!ValidateSavedWonderCard()) return 0; - data = &gSaveBlock1Ptr->mysteryGift.card; - if (data->type != 1) + card = &gSaveBlock1Ptr->mysteryGift.card; + if (card->type != CARD_TYPE_STAMP) return 0; - return CountReceivedDistributionMons(&gSaveBlock1Ptr->mysteryGift.cardMetadata, data->maxStamps); + return GetNumStampsInMetadata(&gSaveBlock1Ptr->mysteryGift.cardMetadata, card->maxStamps); } -bool32 MEvent_ReceiveDistributionMon(const u16 * data) +bool32 MysteryGift_TrySaveStamp(const u16 * stamp) { - struct WonderCard * buffer = &gSaveBlock1Ptr->mysteryGift.card; - s32 capacity = buffer->maxStamps; + struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card; + s32 maxStamps = card->maxStamps; s32 i; - if (!IsWonderCardSpeciesValid(data)) + if (!ValidateStamp(stamp)) return FALSE; - if (HasPlayerAlreadyReceivedDistributedMon(&gSaveBlock1Ptr->mysteryGift.cardMetadata, data, capacity)) + if (IsStampInMetadata(&gSaveBlock1Ptr->mysteryGift.cardMetadata, stamp, maxStamps)) return FALSE; - for (i = 0; i < capacity; i++) + for (i = 0; i < maxStamps; i++) { - if (gSaveBlock1Ptr->mysteryGift.cardMetadata.stampData[1][i] == 0 && gSaveBlock1Ptr->mysteryGift.cardMetadata.stampData[0][i] == 0) + if (gSaveBlock1Ptr->mysteryGift.cardMetadata.stampData[STAMP_ID][i] == 0 + && gSaveBlock1Ptr->mysteryGift.cardMetadata.stampData[STAMP_SPECIES][i] == SPECIES_NONE) { - gSaveBlock1Ptr->mysteryGift.cardMetadata.stampData[1][i] = data[1]; - gSaveBlock1Ptr->mysteryGift.cardMetadata.stampData[0][i] = data[0]; + gSaveBlock1Ptr->mysteryGift.cardMetadata.stampData[STAMP_ID][i] = stamp[STAMP_ID]; + gSaveBlock1Ptr->mysteryGift.cardMetadata.stampData[STAMP_SPECIES][i] = stamp[STAMP_SPECIES]; return TRUE; } } return FALSE; } +#define GAME_DATA_VALID_VAR 0x101 + #if defined(FIRERED) -#define MEVENT_HEADER_VERSION_CODE 1 +#define VERSION_CODE 1 #elif defined(LEAFGREEN) -#define MEVENT_HEADER_VERSION_CODE 2 +#define VERSION_CODE 2 #endif -void BuildMEventClientHeader(struct MEventClientHeaderStruct * data) +void MysteryGift_LoadLinkGameData(struct MysteryGiftLinkGameData * data) { s32 i; - CpuFill32(0, data, sizeof(struct MEventClientHeaderStruct)); + CpuFill32(0, data, sizeof(*data)); // Magic - data->unk_00 = 0x101; + data->unk_00 = GAME_DATA_VALID_VAR; data->unk_04 = 1; data->unk_08 = 1; data->unk_0C = 1; - data->unk_10 = MEVENT_HEADER_VERSION_CODE; + data->unk_10 = VERSION_CODE; // Check whether a card already exists - if (ValidateReceivedWonderCard()) + if (ValidateSavedWonderCard()) { // Populate fields - data->id = GetSavedWonderCard()->flagId; - data->unk_20 = *sav1_get_mevent_buffer_2(); - data->maxDistributionMons = GetSavedWonderCard()->maxStamps; + data->flagId = GetSavedWonderCard()->flagId; + data->cardMetadata = *GetSavedWonderCardMetadata(); + data->maxStamps = GetSavedWonderCard()->maxStamps; } else - data->id = 0; + { + data->flagId = 0; + } - // Get something - for (i = 0; i < 4; i++) - data->unk_16[i] = gSaveBlock1Ptr->mysteryGift.questionnaireWords[i]; + for (i = 0; i < NUM_QUESTIONNAIRE_WORDS; i++) + data->questionnaireWords[i] = gSaveBlock1Ptr->mysteryGift.questionnaireWords[i]; - // Get player ID CopyTrainerId(data->playerTrainerId, gSaveBlock2Ptr->playerTrainerId); StringCopy(data->playerName, gSaveBlock2Ptr->playerName); - for (i = 0; i < 6; i++) + for (i = 0; i < EASY_CHAT_BATTLE_WORDS_COUNT; i++) data->easyChatProfile[i] = gSaveBlock1Ptr->easyChatProfile[i]; - memcpy(data->gameCode, RomHeaderGameCode, 4); + + memcpy(data->gameCode, RomHeaderGameCode, GAME_CODE_LENGTH); data->version = RomHeaderSoftwareVersion; } -bool32 ValidateMEventClientHeader(const struct MEventClientHeaderStruct * data) +bool32 MysteryGift_ValidateLinkGameData(const struct MysteryGiftLinkGameData * data) { - if (data->unk_00 != 0x101) + if (data->unk_00 != GAME_DATA_VALID_VAR) return FALSE; if (!(data->unk_04 & 1)) return FALSE; @@ -799,145 +810,156 @@ bool32 ValidateMEventClientHeader(const struct MEventClientHeaderStruct * data) return TRUE; } -u32 sub_8144418(const u16 * a0, const struct MEventClientHeaderStruct * a1, void *unused) +u32 MysteryGift_CompareCardFlags(const u16 * flagId, const struct MysteryGiftLinkGameData * data, void *unused) { - if (a1->id == 0) + // Has a Wonder Card already? + if (data->flagId == 0) return 0; - if (*a0 == a1->id) + + // Has this Wonder Card already? + if (*flagId == data->flagId) return 1; + + // Player has a different Wonder Card return 2; } -u32 MEvent_CanPlayerReceiveDistributionMon(const u16 * a0, const struct MEventClientHeaderStruct * a1, void *unused) +u32 MysteryGift_CheckStamps(const u16 * stamp, const struct MysteryGiftLinkGameData * data, void *unused) { - s32 numSpaces = a1->maxDistributionMons - CountReceivedDistributionMons(&a1->unk_20, a1->maxDistributionMons); - if (numSpaces == 0) + s32 stampsMissing = data->maxStamps - GetNumStampsInMetadata(&data->cardMetadata, data->maxStamps); + + // Has full stamp card? + if (stampsMissing == 0) return 1; - if (HasPlayerAlreadyReceivedDistributedMon(&a1->unk_20, a0, a1->maxDistributionMons)) + + // Already has stamp? + if (IsStampInMetadata(&data->cardMetadata, stamp, data->maxStamps)) return 3; - if (numSpaces == 1) + + // Only 1 empty stamp left? + if (stampsMissing == 1) return 4; + + // This is a new stamp return 2; } -bool32 sub_8144474(const struct MEventClientHeaderStruct * a0, const u16 * a1) +bool32 MysteryGift_DoesQuestionnaireMatch(const struct MysteryGiftLinkGameData * data, const u16 * words) { s32 i; - for (i = 0; i < 4; i++) + for (i = 0; i < NUM_QUESTIONNAIRE_WORDS; i++) { - if (a0->unk_16[i] != a1[i]) + if (data->questionnaireWords[i] != words[i]) return FALSE; } return TRUE; } -static s32 GetNumReceivedDistributionMons(const struct MEventClientHeaderStruct * a0) +static s32 GetNumStampsInLinkData(const struct MysteryGiftLinkGameData * data) { - return CountReceivedDistributionMons(&a0->unk_20, a0->maxDistributionMons); + return GetNumStampsInMetadata(&data->cardMetadata, data->maxStamps); } -u16 sub_81444B0(const struct MEventClientHeaderStruct * a0, u32 command) +u16 MysteryGift_GetCardStatFromLinkData(const struct MysteryGiftLinkGameData * data, u32 stat) { - switch (command) + switch (stat) { - case 0: - return a0->unk_20.battlesWon; - case 1: - return a0->unk_20.battlesLost; - case 2: - return a0->unk_20.numTrades; - case 3: - return GetNumReceivedDistributionMons(a0); - case 4: - return a0->maxDistributionMons; - default: - AGB_ASSERT_EX(0, ABSPATH("mevent.c"), 825); - return 0; + case CARD_STAT_BATTLES_WON: + return data->cardMetadata.battlesWon; + case CARD_STAT_BATTLES_LOST: + return data->cardMetadata.battlesLost; + case CARD_STAT_NUM_TRADES: + return data->cardMetadata.numTrades; + case CARD_STAT_NUM_STAMPS: + return GetNumStampsInLinkData(data); + case CARD_STAT_MAX_STAMPS: + return data->maxStamps; + default: + AGB_ASSERT_EX(0, ABSPATH("mevent.c"), 825); + return 0; } } -// Increments an interaction count in the save block -static void IncrementBattleCardCount(u32 command) +static void IncrementCardStat(u32 statType) { - struct WonderCard * data = &gSaveBlock1Ptr->mysteryGift.card; - if (data->type == 2) + struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card; + if (card->type == CARD_TYPE_LINK_STAT) { - u16 * dest = NULL; - switch (command) + u16 * stat = NULL; + switch (statType) { - case 0: - dest = &gSaveBlock1Ptr->mysteryGift.cardMetadata.battlesWon; - break; - case 1: - dest = &gSaveBlock1Ptr->mysteryGift.cardMetadata.battlesLost; - break; - case 2: - dest = &gSaveBlock1Ptr->mysteryGift.cardMetadata.numTrades; - break; - case 3: - break; - case 4: - break; + case CARD_STAT_BATTLES_WON: + stat = &gSaveBlock1Ptr->mysteryGift.cardMetadata.battlesWon; + break; + case CARD_STAT_BATTLES_LOST: + stat = &gSaveBlock1Ptr->mysteryGift.cardMetadata.battlesLost; + break; + case CARD_STAT_NUM_TRADES: + stat = &gSaveBlock1Ptr->mysteryGift.cardMetadata.numTrades; + break; + case CARD_STAT_NUM_STAMPS: + case CARD_STAT_MAX_STAMPS: + break; } - if (dest == NULL) + if (stat == NULL) { AGB_ASSERT_EX(0, ABSPATH("mevent.c"), 868); } - else if (++(*dest) > 999) + else if (++(*stat) > MAX_WONDER_CARD_STAT) { - *dest = 999; + *stat = MAX_WONDER_CARD_STAT; } } } -u16 MEvent_GetBattleCardCount(u32 command) +u16 MysteryGift_GetCardStat(u32 stat) { - switch (command) + switch (stat) { - case 0: + case CARD_STAT_BATTLES_WON: + { + struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card; + if (card->type == CARD_TYPE_LINK_STAT) { - struct WonderCard * data = &gSaveBlock1Ptr->mysteryGift.card; - if (data->type == 2) - { - struct WonderCardMetadata * buffer = &gSaveBlock1Ptr->mysteryGift.cardMetadata; - return buffer->battlesWon; - } - break; + struct WonderCardMetadata * metadata = &gSaveBlock1Ptr->mysteryGift.cardMetadata; + return metadata->battlesWon; } - case 1: + break; + } + case CARD_STAT_BATTLES_LOST: + { + struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card; + if (card->type == CARD_TYPE_LINK_STAT) { - struct WonderCard * data = &gSaveBlock1Ptr->mysteryGift.card; - if (data->type == 2) - { - struct WonderCardMetadata * buffer = &gSaveBlock1Ptr->mysteryGift.cardMetadata; - return buffer->battlesLost; - } - break; + struct WonderCardMetadata * metadata = &gSaveBlock1Ptr->mysteryGift.cardMetadata; + return metadata->battlesLost; } - case 2: + break; + } + case CARD_STAT_NUM_TRADES: + { + struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card; + if (card->type == CARD_TYPE_LINK_STAT) { - struct WonderCard * data = &gSaveBlock1Ptr->mysteryGift.card; - if (data->type == 2) - { - struct WonderCardMetadata * buffer = &gSaveBlock1Ptr->mysteryGift.cardMetadata; - return buffer->numTrades; - } - break; - } - case 3: - { - struct WonderCard * data = &gSaveBlock1Ptr->mysteryGift.card; - if (data->type == 1) - return ValidateCardAndCountMonsReceived(); - break; - } - case 4: - { - struct WonderCard * data = &gSaveBlock1Ptr->mysteryGift.card; - if (data->type == 1) - return data->maxStamps; - break; + struct WonderCardMetadata * metadata = &gSaveBlock1Ptr->mysteryGift.cardMetadata; + return metadata->numTrades; } + break; + } + case CARD_STAT_NUM_STAMPS: + { + struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card; + if (card->type == CARD_TYPE_STAMP) + return GetNumStampsInSavedCard(); + break; + } + case CARD_STAT_MAX_STAMPS: + { + struct WonderCard * card = &gSaveBlock1Ptr->mysteryGift.card; + if (card->type == CARD_TYPE_STAMP) + return card->maxStamps; + break; + } } AGB_ASSERT_EX(0, ABSPATH("mevent.c"), 913); return 0; @@ -945,85 +967,93 @@ u16 MEvent_GetBattleCardCount(u32 command) void MysteryGift_DisableStats(void) { - sReceivedWonderCardIsValid = FALSE; + sStatsEnabled = FALSE; } bool32 MysteryGift_TryEnableStatsByFlagId(u16 flagId) { - sReceivedWonderCardIsValid = FALSE; + sStatsEnabled = FALSE; if (flagId == 0) return FALSE; - if (!ValidateReceivedWonderCard()) + if (!ValidateSavedWonderCard()) return FALSE; if (gSaveBlock1Ptr->mysteryGift.card.flagId != flagId) return FALSE; - sReceivedWonderCardIsValid = TRUE; + sStatsEnabled = TRUE; return TRUE; } -void MysteryGift_TryIncrementStat(u32 eventId, u32 trainerId) +void MysteryGift_TryIncrementStat(u32 stat, u32 trainerId) { - if (sReceivedWonderCardIsValid) + if (sStatsEnabled) { - switch (eventId) + switch (stat) { - case 2: // trade - RecordIdOfWonderCardSender(2, trainerId, gSaveBlock1Ptr->mysteryGift.trainerIds[1], 5); - break; - case 0: // link win - RecordIdOfWonderCardSender(0, trainerId, gSaveBlock1Ptr->mysteryGift.trainerIds[0], 5); - break; - case 1: // link loss - RecordIdOfWonderCardSender(1, trainerId, gSaveBlock1Ptr->mysteryGift.trainerIds[0], 5); - break; - default: - AGB_ASSERT_EX(0, ABSPATH("mevent.c"), 988); + case CARD_STAT_NUM_TRADES: + IncrementCardStatForNewTrainer(CARD_STAT_NUM_TRADES, + trainerId, + gSaveBlock1Ptr->mysteryGift.trainerIds[1], + ARRAY_COUNT(gSaveBlock1Ptr->mysteryGift.trainerIds[1])); + break; + case CARD_STAT_BATTLES_WON: + IncrementCardStatForNewTrainer(CARD_STAT_BATTLES_WON, + trainerId, + gSaveBlock1Ptr->mysteryGift.trainerIds[0], + ARRAY_COUNT(gSaveBlock1Ptr->mysteryGift.trainerIds[0])); + break; + case CARD_STAT_BATTLES_LOST: + IncrementCardStatForNewTrainer(CARD_STAT_BATTLES_LOST, + trainerId, + gSaveBlock1Ptr->mysteryGift.trainerIds[0], + ARRAY_COUNT(gSaveBlock1Ptr->mysteryGift.trainerIds[0])); + break; + default: + AGB_ASSERT_EX(0, ABSPATH("mevent.c"), 988); + break; } } } -static void BlankBuffer344(void) +static void ClearSavedTrainerIds(void) { CpuFill32(0, gSaveBlock1Ptr->mysteryGift.trainerIds, sizeof(gSaveBlock1Ptr->mysteryGift.trainerIds)); } -// Looks up trainerId in an array idsList with count elements. -// If trainerId is found, rearranges idsList to put it in the front. -// Otherwise, drops the last element of the list and inserts -// trainerId at the front. -// Returns TRUE in the latter case. -static bool32 PlaceTrainerIdAtFrontOfList(u32 trainerId, u32 * idsList, s32 count) +// Returns TRUE if it's a new trainer id, FALSE if an existing one. +// In either case the given trainerId is saved in element 0 +static bool32 RecordTrainerId(u32 trainerId, u32 * trainerIds, s32 size) { s32 i; s32 j; - for (i = 0; i < count; i++) + for (i = 0; i < size; i++) { - if (idsList[i] == trainerId) + if (trainerIds[i] == trainerId) break; } - if (i == count) + + if (i == size) { - for (j = count - 1; j > 0; j--) - { - idsList[j] = idsList[j - 1]; - } - idsList[0] = trainerId; + // New trainer, shift array and insert new id at front + for (j = size - 1; j > 0; j--) + trainerIds[j] = trainerIds[j - 1]; + + trainerIds[0] = trainerId; return TRUE; } else { + // Existing trainer, shift back to old slot and move id to front for (j = i; j > 0; j--) - { - idsList[j] = idsList[j - 1]; - } - idsList[0] = trainerId; + trainerIds[j] = trainerIds[j - 1]; + + trainerIds[0] = trainerId; return FALSE; } } -static void RecordIdOfWonderCardSender(u32 eventId, u32 trainerId, u32 * idsList, s32 count) +static void IncrementCardStatForNewTrainer(u32 stat, u32 trainerId, u32 * trainerIds, s32 size) { - if (PlaceTrainerIdAtFrontOfList(trainerId, idsList, count)) - IncrementBattleCardCount(eventId); + if (RecordTrainerId(trainerId, trainerIds, size)) + IncrementCardStat(stat); } diff --git a/src/mystery_gift_client.c b/src/mystery_gift_client.c index 289de83f4..48fc8ffc3 100644 --- a/src/mystery_gift_client.c +++ b/src/mystery_gift_client.c @@ -188,19 +188,19 @@ static u32 client_mainseq_4(struct mevent_client * svr) svr->flag = 0; return 4; case 8: - BuildMEventClientHeader(svr->sendBuffer); - mevent_srv_sub_init_send(&svr->manager, 0x11, svr->sendBuffer, sizeof(struct MEventClientHeaderStruct)); + MysteryGift_LoadLinkGameData(svr->sendBuffer); + mevent_srv_sub_init_send(&svr->manager, 0x11, svr->sendBuffer, sizeof(struct MysteryGiftLinkGameData)); break; case 14: mevent_client_send_word(svr, 0x13, svr->param); break; case 10: - OverwriteSavedWonderCardWithReceivedCard(svr->recvBuffer); + SaveWonderCard(svr->recvBuffer); break; case 9: - if (!MEvent_HaveAlreadyReceivedWonderNews(svr->recvBuffer)) + if (!IsWonderNewsSameAsSaved(svr->recvBuffer)) { - OverwriteSavedWonderNewsWithReceivedNews(svr->recvBuffer); + SaveWonderNews(svr->recvBuffer); mevent_client_send_word(svr, 0x13, 0); } else @@ -212,7 +212,7 @@ static u32 client_mainseq_4(struct mevent_client * svr) svr->flag = 0; break; case 16: - MEvent_ReceiveDistributionMon(svr->recvBuffer); + MysteryGift_TrySaveStamp(svr->recvBuffer); break; case 17: InitRamScript_NoObjectEvent(svr->recvBuffer, 1000); diff --git a/src/mystery_gift_menu.c b/src/mystery_gift_menu.c index 7e65298cd..cb8a5bfe9 100644 --- a/src/mystery_gift_menu.c +++ b/src/mystery_gift_menu.c @@ -784,13 +784,9 @@ s32 HandleMysteryGiftListMenu(u8 * textState, u16 * windowId, bool32 cannotToss, bool32 ValidateCardOrNews(bool32 cardOrNews) { if (cardOrNews == 0) - { - return ValidateReceivedWonderCard(); - } + return ValidateSavedWonderCard(); else - { - return ValidateReceivedWonderNews(); - } + return ValidateSavedWonderNews(); } bool32 HandleLoadWonderCardOrNews(u8 * state, bool32 cardOrNews) @@ -802,7 +798,7 @@ bool32 HandleLoadWonderCardOrNews(u8 * state, bool32 cardOrNews) case 0: if (cardOrNews == 0) { - WonderCard_Init(GetSavedWonderCard(), sav1_get_mevent_buffer_2()); + WonderCard_Init(GetSavedWonderCard(), GetSavedWonderCardMetadata()); } else { @@ -837,13 +833,9 @@ bool32 HandleLoadWonderCardOrNews(u8 * state, bool32 cardOrNews) bool32 DestroyNewsOrCard(bool32 cardOrNews) { if (cardOrNews == 0) - { - DestroyWonderCard(); - } + ClearSavedWonderCardAndRelated(); else - { - DestroyWonderNews(); - } + ClearSavedWonderNewsAndRelated(); return TRUE; } @@ -1128,25 +1120,17 @@ void task00_mystery_gift(u8 taskId) { case 0: data->IsCardOrNews = 0; - if (ValidateReceivedWonderCard() == TRUE) - { + if (ValidateSavedWonderCard() == TRUE) data->state = 18; - } else - { data->state = 2; - } break; case 1: data->IsCardOrNews = 1; - if (ValidateReceivedWonderNews() == TRUE) - { + if (ValidateSavedWonderNews() == TRUE) data->state = 18; - } else - { data->state = 2; - } break; case -2u: data->state = 37; @@ -1307,7 +1291,7 @@ void task00_mystery_gift(u8 taskId) switch (flag) { case 0: - if (CheckReceivedGiftFromWonderCard() == TRUE) + if (IsSavedWonderCardGiftNotReceived() == TRUE) { data->state = 12; } @@ -1382,13 +1366,9 @@ void task00_mystery_gift(u8 taskId) if (data->prevPromptWindowId == 3) { if (data->source == 1) - { - MENewsJisan_SetRandomReward(1); - } + WonderNews_SetReward(1); else - { - MENewsJisan_SetRandomReward(2); - } + WonderNews_SetReward(2); } if (sp0 == 0) { @@ -1452,25 +1432,17 @@ void task00_mystery_gift(u8 taskId) u32 result; if (data->IsCardOrNews == 0) { - if (WonderCard_Test_Unk_08_6()) - { + if (IsSendingSavedWonderCardAllowed()) result = HandleMysteryGiftListMenu(&data->textState, &data->curPromptWindowId, data->IsCardOrNews, FALSE); - } else - { result = HandleMysteryGiftListMenu(&data->textState, &data->curPromptWindowId, data->IsCardOrNews, TRUE); - } } else { - if (WonderNews_Test_Unk_02()) - { + if (IsSendingSavedWonderNewsAllowed()) result = HandleMysteryGiftListMenu(&data->textState, &data->curPromptWindowId, data->IsCardOrNews, FALSE); - } else - { result = HandleMysteryGiftListMenu(&data->textState, &data->curPromptWindowId, data->IsCardOrNews, TRUE); - } } switch (result) { @@ -1497,7 +1469,7 @@ void task00_mystery_gift(u8 taskId) switch (mevent_message_prompt_discard(&data->textState, &data->curPromptWindowId, data->IsCardOrNews)) { case 0: - if (data->IsCardOrNews == 0 && CheckReceivedGiftFromWonderCard() == TRUE) + if (data->IsCardOrNews == 0 && IsSavedWonderCardGiftNotReceived() == TRUE) { data->state = 23; } @@ -1628,7 +1600,7 @@ void task00_mystery_gift(u8 taskId) { if (data->source == 1 && data->prevPromptWindowId == 3) { - MENewsJisan_SetRandomReward(3); + WonderNews_SetReward(3); data->state = 17; } else diff --git a/src/mystery_gift_server.c b/src/mystery_gift_server.c index 98211e2ae..d2f15644a 100644 --- a/src/mystery_gift_server.c +++ b/src/mystery_gift_server.c @@ -48,7 +48,7 @@ static void mevent_srv_init_common(struct mevent_srv_common * svr, const void *c svr->card = AllocZeroed(sizeof(struct WonderCard)); svr->news = AllocZeroed(sizeof(struct WonderNews)); svr->recvBuffer = AllocZeroed(ME_SEND_BUF_SIZE); - svr->mevent_unk1442cc = AllocZeroed(sizeof(struct MEventClientHeaderStruct)); + svr->mevent_unk1442cc = AllocZeroed(sizeof(struct MysteryGiftLinkGameData)); svr->cmdBuffer = cmdBuffer; svr->cmdidx = 0; mevent_srv_sub_init(&svr->manager, sendPlayerNo, recvPlayerNo); @@ -145,12 +145,12 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr) case 5: AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 376); AGB_ASSERT_EX(cmd->parameter == NULL, ABSPATH("mevent_server.c"), 377); - memcpy(svr->mevent_unk1442cc, svr->recvBuffer, sizeof(struct MEventClientHeaderStruct)); + memcpy(svr->mevent_unk1442cc, svr->recvBuffer, sizeof(struct MysteryGiftLinkGameData)); break; case 6: AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 382); AGB_ASSERT_EX(cmd->parameter == NULL, ABSPATH("mevent_server.c"), 383); - svr->param = ValidateMEventClientHeader(svr->mevent_unk1442cc); + svr->param = MysteryGift_ValidateLinkGameData(svr->mevent_unk1442cc); break; case 4: if (svr->param == cmd->flag) @@ -162,7 +162,7 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr) case 7: AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 396); ptr = mevent_first_if_not_null_else_second(cmd->parameter, svr->card); - svr->param = sub_8144418(ptr, svr->mevent_unk1442cc, ptr); + svr->param = MysteryGift_CompareCardFlags(ptr, svr->mevent_unk1442cc, ptr); break; case 8: AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 402); @@ -172,15 +172,15 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr) case 9: AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 408); ptr = mevent_first_if_not_null_else_second(cmd->parameter, &svr->sendWord); - svr->param = MEvent_CanPlayerReceiveDistributionMon(ptr, svr->mevent_unk1442cc, ptr); + svr->param = MysteryGift_CheckStamps(ptr, svr->mevent_unk1442cc, ptr); break; case 10: AGB_ASSERT_EX(cmd->parameter == NULL, ABSPATH("mevent_server.c"), 415); - svr->param = sub_81444B0(svr->mevent_unk1442cc, cmd->flag); + svr->param = MysteryGift_GetCardStatFromLinkData(svr->mevent_unk1442cc, cmd->flag); break; case 11: AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 420); - svr->param = sub_8144474(svr->mevent_unk1442cc, cmd->parameter); + svr->param = MysteryGift_DoesQuestionnaireMatch(svr->mevent_unk1442cc, cmd->parameter); break; case 12: AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 426); @@ -243,7 +243,7 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr) case 26: AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, ABSPATH("mevent_server.c"), 506); memcpy(svr->card, GetSavedWonderCard(), 332); - MEvent_WonderCardResetUnk08_6(svr->card); + DisableWonderCardSending(svr->card); break; case 27: AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, ABSPATH("mevent_server.c"), 512); diff --git a/src/new_game.c b/src/new_game.c index 18ff73e29..ab5fa9958 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -143,7 +143,7 @@ void NewGameInitData(void) ResetTrainerFanClub(); UnionRoomChat_InitializeRegisteredTexts(); ResetMiniGamesResults(); - InitMEventData(); + ClearMysteryGift(); SetAllRenewableItemFlags(); WarpToPlayersRoom(); RunScriptImmediately(EventScript_ResetAllMapFlags); diff --git a/src/script.c b/src/script.c index 9095ab3ba..4d021606d 100644 --- a/src/script.c +++ b/src/script.c @@ -2,12 +2,12 @@ #include "script.h" #include "event_data.h" #include "quest_log.h" +#include "mystery_gift.h" #include "constants/maps.h" #include "constants/map_scripts.h" extern void ResetContextNpcTextColor(void); // field_specials extern u16 CalcCRC16WithTable(u8 *data, int length); // util -extern bool32 ValidateReceivedWonderCard(void); #define RAM_SCRIPT_MAGIC 51 @@ -554,7 +554,7 @@ bool32 ValidateRamScript(void) u8 *GetSavedRamScriptIfValid(void) { struct RamScriptData *scriptData = &gSaveBlock1Ptr->ramScript.data; - if (!ValidateReceivedWonderCard()) + if (!ValidateSavedWonderCard()) return NULL; if (scriptData->magic != RAM_SCRIPT_MAGIC) return NULL; diff --git a/src/wonder_news.c b/src/wonder_news.c index 20f0ab3e7..4e7c4f472 100644 --- a/src/wonder_news.c +++ b/src/wonder_news.c @@ -5,85 +5,100 @@ #include "wonder_news.h" #include "constants/items.h" +/* + Wonder News related functions. + Because this feature is largely unused, the names in here are + mostly nebulous and without a real indication of purpose. +*/ + +enum { + NEWS_VAL_INVALID, + NEWS_VAL_RECV_FRIEND, + NEWS_VAL_RECV_WIRELESS, + NEWS_VAL_NONE, + NEWS_VAL_SENT, + NEWS_VAL_SENT_MAX, + NEWS_VAL_GET_MAX, +}; + static u32 GetMENewsJisanRewardItem(struct WonderNewsMetadata *); static void MENewsJisanIncrementCounterUnk0_5(struct WonderNewsMetadata *); static u32 GetMENewsJisanState(struct WonderNewsMetadata *); static void MENewsJisanIncrementCounterUnk0_2(struct WonderNewsMetadata *); static void MENewsJisanResetCounterUnk0_2(struct WonderNewsMetadata *); -void MENewsJisan_SetRandomReward(u32 a0) +void WonderNews_SetReward(u32 newsType) { - struct WonderNewsMetadata *r5 = GetMENewsJisanStructPtr(); + struct WonderNewsMetadata *data = GetSavedWonderNewsMetadata(); - r5->unk_0_0 = a0; - switch (a0) + data->newsType = newsType; + switch (newsType) { - case 0: + case WONDER_NEWS_NONE: break; - case 1: - case 2: - r5->berry = (Random() % 15) + ITEM_TO_BERRY(ITEM_RAZZ_BERRY); + case WONDER_NEWS_RECV_FRIEND: + case WONDER_NEWS_RECV_WIRELESS: + data->berry = (Random() % 15) + ITEM_TO_BERRY(ITEM_RAZZ_BERRY); break; - case 3: - r5->berry = (Random() % 15) + ITEM_TO_BERRY(ITEM_CHERI_BERRY); + case WONDER_NEWS_SENT: + data->berry = (Random() % 15) + ITEM_TO_BERRY(ITEM_CHERI_BERRY); break; } } -void MENewsJisanReset(void) +void WonderNews_Reset(void) { - struct WonderNewsMetadata *r5 = GetMENewsJisanStructPtr(); + struct WonderNewsMetadata *r5 = GetSavedWonderNewsMetadata(); - r5->unk_0_0 = 0; + r5->newsType = 0; r5->unk_0_2 = 0; r5->unk_0_5 = 0; r5->berry = 0; - VarSet(VAR_MENEWS_JISAN_STEP_COUNTER, 0); + VarSet(VAR_WONDER_NEWS_STEP_COUNTER, 0); } -void MENewsJisanStepCounter(void) +void WonderNews_IncrementStepCounter(void) { - u16 *r4 = GetVarPointer(VAR_MENEWS_JISAN_STEP_COUNTER); - struct WonderNewsMetadata *r2 = GetMENewsJisanStructPtr(); - struct WonderNewsMetadata r0 = *r2; + u16 *stepCounter = GetVarPointer(VAR_WONDER_NEWS_STEP_COUNTER); + struct WonderNewsMetadata *data = GetSavedWonderNewsMetadata(); - if ((u8)r0.unk_0_5 > 4 && ++(*r4) >= 500) + if (data->unk_0_5 > 4 && ++(*stepCounter) >= 500) { - r2->unk_0_5 = 0; - *r4 = 0; + data->unk_0_5 = 0; + *stepCounter = 0; } } u16 GetMENewsJisanItemAndState(void) { - u16 *r6 = &gSpecialVar_Result; - struct WonderNewsMetadata *r4 = GetMENewsJisanStructPtr(); + u16 *result = &gSpecialVar_Result; + struct WonderNewsMetadata *data = GetSavedWonderNewsMetadata(); u16 r5; - if (!IsMysteryGiftEnabled() || !ValidateReceivedWonderNews()) + if (!IsMysteryGiftEnabled() || !ValidateSavedWonderNews()) return 0; - r5 = GetMENewsJisanState(r4); + r5 = GetMENewsJisanState(data); switch (r5) { case 0: break; case 1: - *r6 = GetMENewsJisanRewardItem(r4); + *result = GetMENewsJisanRewardItem(data); break; case 2: - *r6 = GetMENewsJisanRewardItem(r4); + *result = GetMENewsJisanRewardItem(data); break; case 3: break; case 4: - *r6 = GetMENewsJisanRewardItem(r4); - MENewsJisanIncrementCounterUnk0_2(r4); + *result = GetMENewsJisanRewardItem(data); + MENewsJisanIncrementCounterUnk0_2(data); break; case 5: - *r6 = GetMENewsJisanRewardItem(r4); - MENewsJisanResetCounterUnk0_2(r4); + *result = GetMENewsJisanRewardItem(data); + MENewsJisanResetCounterUnk0_2(data); break; case 6: break; @@ -96,7 +111,7 @@ static u32 GetMENewsJisanRewardItem(struct WonderNewsMetadata *a0) { u32 r4; - a0->unk_0_0 = 0; + a0->newsType = 0; r4 = a0->berry + FIRST_BERRY_INDEX - 1; a0->berry = 0; MENewsJisanIncrementCounterUnk0_5(a0); @@ -122,23 +137,21 @@ static void MENewsJisanIncrementCounterUnk0_5(struct WonderNewsMetadata *a0) a0->unk_0_5 = 5; } -static u32 GetMENewsJisanState(struct WonderNewsMetadata *a0) +static u32 GetMENewsJisanState(struct WonderNewsMetadata *data) { - struct WonderNewsMetadata r0; - if ((u8)a0->unk_0_5 == 5) + if (data->unk_0_5 == 5) return 6; - r0 = *a0; - switch (r0.unk_0_0) + switch (data->newsType) { - case 0: + case WONDER_NEWS_NONE: return 3; - case 1: + case WONDER_NEWS_RECV_FRIEND: return 1; - case 2: + case WONDER_NEWS_RECV_WIRELESS: return 2; - case 3: - if ((u8)r0.unk_0_2 < 3) + case WONDER_NEWS_SENT: + if (data->unk_0_2 < 3) return 4; return 5; default: