diff --git a/data/event_scripts.s b/data/event_scripts.s index 5e349996d..d6aa4d512 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -36,6 +36,7 @@ #include "constants/easy_chat.h" #include "constants/trainer_card.h" #include "constants/help_system.h" +#include "constants/mystery_gift.h" .include "asm/macros.inc" .include "asm/macros/event.inc" .set FALSE, 0 diff --git a/data/maps/CeruleanCity_House4/scripts.inc b/data/maps/CeruleanCity_House4/scripts.inc index e812d3b73..42ddde3f2 100644 --- a/data/maps/CeruleanCity_House4/scripts.inc +++ b/data/maps/CeruleanCity_House4/scripts.inc @@ -1,5 +1,8 @@ .set LOCALID_WONDER_NEWS_BERRY_MAN, 1 +.set REWARD_TYPE, VAR_0x8004 +.set REWARD_ITEM, VAR_0x8008 + CeruleanCity_House4_MapScripts:: .byte 0 @@ -7,62 +10,69 @@ CeruleanCity_House4_EventScript_WonderNewsBerryMan:: goto_if_questlog EventScript_ReleaseEnd special QuestLog_CutRecording lock - specialvar VAR_0x8004, GetMENewsJisanItemAndState - copyvar VAR_0x8008, VAR_RESULT - goto_if_eq VAR_0x8004, 0, CeruleanCity_House4_EventScript_NoNews - goto_if_eq VAR_0x8004, 1, CeruleanCity_House4_EventScript_News1 - goto_if_eq VAR_0x8004, 2, CeruleanCity_House4_EventScript_News2 - goto_if_eq VAR_0x8004, 3, CeruleanCity_House4_EventScript_NewsNotSpread - goto_if_eq VAR_0x8004, 4, CeruleanCity_House4_EventScript_NewsSpread1 - goto_if_eq VAR_0x8004, 5, CeruleanCity_House4_EventScript_NewsSpread2 - goto_if_eq VAR_0x8004, 6, CeruleanCity_House4_EventScript_NewsDone + specialvar REWARD_TYPE, WonderNews_GetRewardInfo + copyvar REWARD_ITEM, VAR_RESULT + goto_if_eq REWARD_TYPE, NEWS_REWARD_NONE, CeruleanCity_House4_EventScript_NoNews + goto_if_eq REWARD_TYPE, NEWS_REWARD_RECV_SMALL, CeruleanCity_House4_EventScript_Reward_RecvSmall + goto_if_eq REWARD_TYPE, NEWS_REWARD_RECV_BIG, CeruleanCity_House4_EventScript_Reward_RecvBig + goto_if_eq REWARD_TYPE, NEWS_REWARD_WAITING, CeruleanCity_House4_EventScript_Waiting + goto_if_eq REWARD_TYPE, NEWS_REWARD_SENT_SMALL, CeruleanCity_House4_EventScript_Reward_SentSmall + goto_if_eq REWARD_TYPE, NEWS_REWARD_SENT_BIG, CeruleanCity_House4_EventScript_Reward_SentBig + goto_if_eq REWARD_TYPE, NEWS_REWARD_AT_MAX, CeruleanCity_House4_EventScript_AtMax end +@ Mystery Gift is not enabled, or the player has no saved Wonder News CeruleanCity_House4_EventScript_NoNews:: msgbox CeruleanCity_House4_Text_NothingEntertaining release end -CeruleanCity_House4_EventScript_News1:: +@ Small reward for receiving Wonder News from friend +CeruleanCity_House4_EventScript_Reward_RecvSmall:: call CeruleanCity_House4_EventScript_MovementReactionToNews msgbox CeruleanCity_House4_Text_NewNewsInformativeHaveThis - giveitem VAR_0x8008 + giveitem REWARD_ITEM goto_if_eq VAR_RESULT, FALSE, CeruleanCity_House4_EventScript_NoRoomForBerries release end -CeruleanCity_House4_EventScript_News2:: +@ Big reward for receiving Wonder News from non-friend source +CeruleanCity_House4_EventScript_Reward_RecvBig:: call CeruleanCity_House4_EventScript_MovementReactionToNews msgbox CeruleanCity_House4_Text_IncredibleNewsHaveBerries - giveitem VAR_0x8008, 4 + giveitem REWARD_ITEM, 4 goto_if_eq VAR_RESULT, FALSE, CeruleanCity_House4_EventScript_NoRoomForBerries release end -CeruleanCity_House4_EventScript_NewsNotSpread:: +@ Player has not recently sent Wonder News +CeruleanCity_House4_EventScript_Waiting:: applymovement LOCALID_WONDER_NEWS_BERRY_MAN, Common_Movement_FacePlayer waitmovement 0 msgbox CeruleanCity_House4_Text_WishCouldShareNewsWithOthers release end -CeruleanCity_House4_EventScript_NewsSpread1:: +@ Small reward for sending Wonder News every 1-3 times +CeruleanCity_House4_EventScript_Reward_SentSmall:: call CeruleanCity_House4_EventScript_MovementReactionToNews msgbox CeruleanCity_House4_Text_ThanksForSpreadingNewsTakeThis - giveitem VAR_0x8008 + giveitem REWARD_ITEM goto_if_eq VAR_RESULT, FALSE, CeruleanCity_House4_EventScript_NoRoomForBerries release end -CeruleanCity_House4_EventScript_NewsSpread2:: +@ Big reward for sending Wonder News every 4th time +CeruleanCity_House4_EventScript_Reward_SentBig:: call CeruleanCity_House4_EventScript_MovementReactionToNews msgbox CeruleanCity_House4_Text_MagnificentNewsSpreadHaveBerries - giveitem VAR_0x8008, 4 + giveitem REWARD_ITEM, 4 goto_if_eq VAR_RESULT, FALSE, CeruleanCity_House4_EventScript_NoRoomForBerries release end -CeruleanCity_House4_EventScript_NewsDone:: +@ Player has hit reward limit and must wait to receive new rewards +CeruleanCity_House4_EventScript_AtMax:: applymovement LOCALID_WONDER_NEWS_BERRY_MAN, Common_Movement_FacePlayer waitmovement 0 msgbox CeruleanCity_House4_Text_EnjoyingMyselfWithAllSortsOfNews diff --git a/data/mystery_event_msg.s b/data/mystery_event_msg.s index fed033c39..d4fe7faf2 100644 --- a/data/mystery_event_msg.s +++ b/data/mystery_event_msg.s @@ -17,9 +17,9 @@ MysteryEventScript_StampCard:: setvaddress MysteryEventScript_StampCard setorcopyvar VAR_RESULT, 1 - specialvar VAR_0x8008, BattleCardAction + specialvar VAR_0x8008, GetMysteryGiftCardStat setorcopyvar VAR_RESULT, 0 - specialvar VAR_0x8009, BattleCardAction + specialvar VAR_0x8009, GetMysteryGiftCardStat subvar VAR_0x8008, VAR_0x8009 buffernumberstring STR_VAR_1, VAR_0x8008 lock @@ -162,7 +162,7 @@ MysteryEventScript_BattleCard:: setvaddress MysteryEventScript_BattleCard vgoto_if_set FLAG_MYSTERY_GIFT_DONE, MysteryEventScript_BattleCardInfo setorcopyvar VAR_RESULT, 2 - specialvar VAR_0x8008, BattleCardAction + specialvar VAR_0x8008, GetMysteryGiftCardStat vgoto_if_ne VAR_0x8008, 3, MysteryEventScript_BattleCardInfo lock faceplayer diff --git a/data/specials.inc b/data/specials.inc index 5c6e5eb0c..be6e3d575 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -398,10 +398,10 @@ gSpecials:: def_special BufferUnionRoomPlayerName def_special QuestLog_StartRecordingInputsAfterDeferredEvent def_special GetMartClerkObjectId - def_special BattleCardAction + def_special GetMysteryGiftCardStat def_special GetQuestLogState def_special QuestLog_CutRecording - def_special GetMENewsJisanItemAndState + def_special WonderNews_GetRewardInfo def_special GetPCBoxToSendMon def_special OpenMuseumFossilPic def_special CloseMuseumFossilPic diff --git a/graphics/interface/unk_textbox_border.png b/graphics/interface/mystery_gift_textbox_border.png similarity index 100% rename from graphics/interface/unk_textbox_border.png rename to graphics/interface/mystery_gift_textbox_border.png diff --git a/include/constants/mystery_gift.h b/include/constants/mystery_gift.h index 8ff71c3aa..13eb7f103 100644 --- a/include/constants/mystery_gift.h +++ b/include/constants/mystery_gift.h @@ -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 diff --git a/include/global.h b/include/global.h index 417cee4f7..3c643f184 100644 --- a/include/global.h +++ b/include/global.h @@ -628,8 +628,8 @@ struct FameCheckerSaveData struct WonderNewsMetadata { u8 newsType:2; - u8 unk_0_2:3; - u8 unk_0_5:3; + u8 sentRewardCounter:3; + u8 rewardCounter:3; u8 berry; }; diff --git a/include/mystery_gift_link.h b/include/mystery_gift_link.h index 8f36d9108..32100db5f 100644 --- a/include/mystery_gift_link.h +++ b/include/mystery_gift_link.h @@ -2,7 +2,6 @@ #define GUARD_MYSTERY_GIFT_LINK_H #define MG_LINK_BUFFER_SIZE 0x400 -#define ME_SEND_BUF_SIZE MG_LINK_BUFFER_SIZE // Send/receive ids for the Client/Server to make sure // they're sending/receiving the same thing diff --git a/include/mystery_gift_server.h b/include/mystery_gift_server.h index 64bb9e9bf..9832cb05a 100644 --- a/include/mystery_gift_server.h +++ b/include/mystery_gift_server.h @@ -49,7 +49,7 @@ enum { // 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) .flag = sizeof(pointer), .parameter = pointer +#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 @@ -74,8 +74,8 @@ enum { struct MysteryGiftServerCmd { u32 instr; - bool32 flag; - const void *parameter; + bool32 param; + const void *ptr; }; struct MysteryGiftServer diff --git a/src/easy_chat.c b/src/easy_chat.c index 563a7bd5c..4a08a1afb 100644 --- a/src/easy_chat.c +++ b/src/easy_chat.c @@ -476,7 +476,7 @@ void InitQuestionnaireWords(void) { s32 i; u16 *ptr = GetQuestionnaireWordsPtr(); - for (i = 0; i < 4; i++) + for (i = 0; i < NUM_QUESTIONNAIRE_WORDS; i++) ptr[i] = EC_WORD_UNDEFINED; } diff --git a/src/field_specials.c b/src/field_specials.c index 45fc701a9..331a32b15 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -1950,20 +1950,20 @@ void QuestLog_TryRecordDepartedLocation(void) } } -u16 BattleCardAction(void) +u16 GetMysteryGiftCardStat(void) { switch (gSpecialVar_Result) { - case 0: - return MysteryGift_GetCardStat(3); - case 1: - return MysteryGift_GetCardStat(4); - case 2: - return MysteryGift_GetCardStat(0); - case 3: - return MysteryGift_GetCardStat(1); - case 4: - return MysteryGift_GetCardStat(2); + case GET_NUM_STAMPS: + return MysteryGift_GetCardStat(CARD_STAT_NUM_STAMPS); + case GET_MAX_STAMPS: + return MysteryGift_GetCardStat(CARD_STAT_MAX_STAMPS); + case GET_CARD_BATTLES_WON: + return MysteryGift_GetCardStat(CARD_STAT_BATTLES_WON); + case GET_CARD_BATTLES_LOST: + return MysteryGift_GetCardStat(CARD_STAT_BATTLES_LOST); + case GET_CARD_NUM_TRADES: + return MysteryGift_GetCardStat(CARD_STAT_NUM_TRADES); default: AGB_ASSERT_EX(0, ABSPATH("scr_tool.c"), 3873); return 0; diff --git a/src/mystery_gift_client.c b/src/mystery_gift_client.c index dc1830b60..ab25ceb43 100644 --- a/src/mystery_gift_client.c +++ b/src/mystery_gift_client.c @@ -99,7 +99,6 @@ static void MysteryGiftClient_InitSendWord(struct MysteryGiftClient * client, u3 static u32 Client_Init(struct MysteryGiftClient * client) { - // init memcpy(client->script, gMysteryGiftClientScript_Init, MG_LINK_BUFFER_SIZE); client->cmdidx = 0; client->funcId = FUNC_RUN; diff --git a/src/mystery_gift_link.c b/src/mystery_gift_link.c index 0ef2eb84a..f066574e9 100644 --- a/src/mystery_gift_link.c +++ b/src/mystery_gift_link.c @@ -55,7 +55,7 @@ void MysteryGiftLink_InitSend(struct MysteryGiftLink * link, u32 ident, const vo if (size != 0) link->sendSize = size; else - link->sendSize = ME_SEND_BUF_SIZE; + link->sendSize = MG_LINK_BUFFER_SIZE; link->sendBuffer = src; } @@ -99,7 +99,7 @@ static bool32 MGL_Receive(struct MysteryGiftLink * link) MGL_ReceiveBlock(link->recvPlayerId, &header, sizeof(header)); link->recvSize = header.size; link->recvCRC = header.crc; - if (link->recvSize > ME_SEND_BUF_SIZE) + if (link->recvSize > MG_LINK_BUFFER_SIZE) { LinkRfu_FatalError(); return FALSE; @@ -167,7 +167,7 @@ static bool32 MGL_Send(struct MysteryGiftLink * link) link->sendCRC = header.crc; link->sendCounter = 0; SendBlock(0, &header, sizeof(header)); - ++link->state; + link->state++; } break; case 1: diff --git a/src/mystery_gift_menu.c b/src/mystery_gift_menu.c index 09c1b9378..7a711aacf 100644 --- a/src/mystery_gift_menu.c +++ b/src/mystery_gift_menu.c @@ -30,8 +30,8 @@ static void CreateMysteryGiftTask(void); static void Task_MysteryGift(u8 taskId); extern void CreateEReaderTask(void); -static const u16 sTextboxBorder_Pal[] = INCBIN_U16("graphics/interface/unk_textbox_border.gbapal"); -static const u32 sTextboxBorder_Gfx[] = INCBIN_U32("graphics/interface/unk_textbox_border.4bpp.lz"); +static const u16 sTextboxBorder_Pal[] = INCBIN_U16("graphics/interface/mystery_gift_textbox_border.gbapal"); +static const u32 sTextboxBorder_Gfx[] = INCBIN_U32("graphics/interface/mystery_gift_textbox_border.4bpp.lz"); struct MysteryGiftTaskData { @@ -344,7 +344,7 @@ static const u8 *const sUnusedMenuTexts[] = { ALIGNED(4) static const u8 sTextColors_TopMenu[3] = { 0, 1, 2 }; ALIGNED(4) static const u8 sTextColors_TopMenu_Copy[3] = { 0, 1, 2 }; -ALIGNED(4) static const u8 sMG_Ereader_TextColor_2[3] = { 1, 2, 3 }; +ALIGNED(4) static const u8 sMG_Ereader_TextColor_2[3] = { 1, 2, 3 }; static const u8 sText_Test[] = _("テスト"); static const u8 sText_EonTicket[] = _("むげんのチケット"); diff --git a/src/mystery_gift_scripts.c b/src/mystery_gift_scripts.c index 0af0f2346..ef781c5af 100644 --- a/src/mystery_gift_scripts.c +++ b/src/mystery_gift_scripts.c @@ -153,8 +153,8 @@ static const struct MysteryGiftServerCmd sServerScript_TossPrompt[] = { {SVR_SEND}, {SVR_RECV, MG_LINKID_RESPONSE}, {SVR_READ_RESPONSE}, - {SVR_GOTO_IF_EQ, FALSE, sServerScript_SendCard}, // Tossed old card, send new one - {SVR_GOTO, .parameter = gServerScript_ClientCanceledCard} // Kept old card, cancel new one + {SVR_GOTO_IF_EQ, FALSE, sServerScript_SendCard}, // Tossed old card, send new one + {SVR_GOTO, .ptr = gServerScript_ClientCanceledCard} // Kept old card, cancel new one }; static const struct MysteryGiftServerCmd sServerScript_HasCard[] = { @@ -179,7 +179,7 @@ const struct MysteryGiftServerCmd gMysteryGiftServerScript_SendWonderNews[] = { {SVR_COPY_GAME_DATA}, {SVR_CHECK_GAME_DATA}, {SVR_GOTO_IF_EQ, FALSE, sServerScript_CantSend}, - {SVR_GOTO, .parameter = sServerScript_SendNews}, + {SVR_GOTO, .ptr = sServerScript_SendNews}, }; const struct MysteryGiftServerCmd gMysteryGiftServerScript_SendWonderCard[] = { @@ -194,5 +194,5 @@ const struct MysteryGiftServerCmd gMysteryGiftServerScript_SendWonderCard[] = { {SVR_CHECK_EXISTING_CARD}, {SVR_GOTO_IF_EQ, HAS_DIFF_CARD, sServerScript_TossPrompt}, {SVR_GOTO_IF_EQ, HAS_NO_CARD, sServerScript_SendCard}, - {SVR_GOTO, .parameter = sServerScript_HasCard} // HAS_SAME_CARD + {SVR_GOTO, .ptr = sServerScript_HasCard} // HAS_SAME_CARD }; diff --git a/src/mystery_gift_server.c b/src/mystery_gift_server.c index 9c6868b6e..f3b2af2f5 100644 --- a/src/mystery_gift_server.c +++ b/src/mystery_gift_server.c @@ -4,6 +4,24 @@ #include "mystery_gift.h" #include "mystery_gift_server.h" +// Assert statements use the original GF names, which are defined below. +// Note that their name "flag" is especially misleading, +// as it's not a boolean (for example it can contain a size argument). +// 'parameter' is shortened to param explicitly to avoid a collision with +// the original name for a different field. +#define mainseqno funcId +#define func_tbl sFuncTable +#define parameter ptr +#define flag param +#define ME_SEND_BUF_SIZE MG_LINK_BUFFER_SIZE +#define FILE ABSPATH("mevent_server.c") + +#define ASSERT_PTR_EMPTY(lineNum) AGB_ASSERT_EX(cmd->parameter == NULL, FILE, (lineNum)); +#define ASSERT_PARAM_EMPTY(lineNum) AGB_ASSERT_EX(cmd->flag == FALSE, FILE, (lineNum)); +#define ASSERT_PTR_PARAM_EMPTY(lineNum) AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, FILE, (lineNum)); +#define ASSERT_VALID_FUNC(lineNum) AGB_ASSERT_EX(svr->mainseqno < NELEMS(func_tbl), FILE, (lineNum)); +#define ASSERT_SIZE_OK(lineNum) AGB_ASSERT_EX(size <= ME_SEND_BUF_SIZE, FILE, (lineNum)); + enum { FUNC_INIT, FUNC_DONE, @@ -54,7 +72,7 @@ static void MysteryGiftServer_Init(struct MysteryGiftServer * svr, const void *s svr->funcId = FUNC_INIT; svr->card = AllocZeroed(sizeof(*svr->card)); svr->news = AllocZeroed(sizeof(*svr->news)); - svr->recvBuffer = AllocZeroed(ME_SEND_BUF_SIZE); + svr->recvBuffer = AllocZeroed(MG_LINK_BUFFER_SIZE); svr->linkGameData = AllocZeroed(sizeof(*svr->linkGameData)); svr->script = script; svr->cmdidx = 0; @@ -71,7 +89,7 @@ static void MysteryGiftServer_Free(struct MysteryGiftServer * svr) static void MysteryGiftServer_InitSend(struct MysteryGiftServer * svr, u32 ident, const void *src, u32 size) { - AGB_ASSERT_EX(size <= ME_SEND_BUF_SIZE, ABSPATH("mevent_server.c"), 257); + ASSERT_SIZE_OK(257); MysteryGiftLink_InitSend(&svr->manager, ident, src, size); } @@ -130,136 +148,136 @@ static u32 Server_Run(struct MysteryGiftServer * svr) switch (cmd->instr) { case SVR_RETURN: - AGB_ASSERT_EX(cmd->parameter == NULL, ABSPATH("mevent_server.c"), 354); + ASSERT_PTR_EMPTY(354); svr->funcId = FUNC_DONE; - svr->param = cmd->flag; // Set for endVal in MysteryGiftServer_Run + svr->param = cmd->param; // Set for endVal in MysteryGiftServer_Run break; case SVR_SEND: svr->funcId = FUNC_SEND; break; case SVR_RECV: - AGB_ASSERT_EX(cmd->parameter == NULL, ABSPATH("mevent_server.c"), 364); - MysteryGiftLink_InitRecv(&svr->manager, cmd->flag, svr->recvBuffer); + ASSERT_PTR_EMPTY(364); + MysteryGiftLink_InitRecv(&svr->manager, cmd->param, svr->recvBuffer); svr->funcId = FUNC_RECV; break; case SVR_GOTO: - AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 370); + ASSERT_PARAM_EMPTY(370); svr->cmdidx = 0; - svr->script = cmd->parameter; + svr->script = cmd->ptr; break; case SVR_COPY_GAME_DATA: - AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 376); - AGB_ASSERT_EX(cmd->parameter == NULL, ABSPATH("mevent_server.c"), 377); + ASSERT_PARAM_EMPTY(376); + ASSERT_PTR_EMPTY(377); memcpy(svr->linkGameData, svr->recvBuffer, sizeof(*svr->linkGameData)); break; case SVR_CHECK_GAME_DATA: - AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 382); - AGB_ASSERT_EX(cmd->parameter == NULL, ABSPATH("mevent_server.c"), 383); + ASSERT_PARAM_EMPTY(382); + ASSERT_PTR_EMPTY(383); svr->param = MysteryGift_ValidateLinkGameData(svr->linkGameData); break; case SVR_GOTO_IF_EQ: - if (svr->param == cmd->flag) + if (svr->param == cmd->param) { svr->cmdidx = 0; - svr->script = cmd->parameter; + svr->script = cmd->ptr; } break; case SVR_CHECK_EXISTING_CARD: - AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 396); - ptr = MysteryGiftServer_GetSendData(cmd->parameter, svr->card); + ASSERT_PARAM_EMPTY(396); + ptr = MysteryGiftServer_GetSendData(cmd->ptr, svr->card); svr->param = MysteryGift_CompareCardFlags(ptr, svr->linkGameData, ptr); break; case SVR_READ_RESPONSE: - AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 402); - AGB_ASSERT_EX(cmd->parameter == NULL, ABSPATH("mevent_server.c"), 403); + ASSERT_PARAM_EMPTY(402); + ASSERT_PTR_EMPTY(403); svr->param = *(u32 *)svr->recvBuffer; break; case SVR_CHECK_EXISTING_STAMPS: - AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 408); - ptr = MysteryGiftServer_GetSendData(cmd->parameter, &svr->stamp); + ASSERT_PARAM_EMPTY(408); + ptr = MysteryGiftServer_GetSendData(cmd->ptr, &svr->stamp); svr->param = MysteryGift_CheckStamps(ptr, svr->linkGameData, ptr); break; case SVR_GET_CARD_STAT: - AGB_ASSERT_EX(cmd->parameter == NULL, ABSPATH("mevent_server.c"), 415); - svr->param = MysteryGift_GetCardStatFromLinkData(svr->linkGameData, cmd->flag); + ASSERT_PTR_EMPTY(415); + svr->param = MysteryGift_GetCardStatFromLinkData(svr->linkGameData, cmd->param); break; case SVR_CHECK_QUESTIONNAIRE: - AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 420); - svr->param = MysteryGift_DoesQuestionnaireMatch(svr->linkGameData, cmd->parameter); + ASSERT_PARAM_EMPTY(420); + svr->param = MysteryGift_DoesQuestionnaireMatch(svr->linkGameData, cmd->ptr); break; case SVR_COMPARE: - AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 426); - svr->param = MysteryGiftServer_Compare(cmd->parameter, *(void **)svr->recvBuffer); + ASSERT_PARAM_EMPTY(426); + svr->param = MysteryGiftServer_Compare(cmd->ptr, *(void **)svr->recvBuffer); break; case SVR_LOAD_NEWS: - AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 432); - MysteryGiftServer_InitSend(svr, MG_LINKID_NEWS, MysteryGiftServer_GetSendData(cmd->parameter, svr->news), sizeof(struct WonderNews)); + ASSERT_PARAM_EMPTY(432); + MysteryGiftServer_InitSend(svr, MG_LINKID_NEWS, MysteryGiftServer_GetSendData(cmd->ptr, svr->news), sizeof(struct WonderNews)); break; case SVR_LOAD_CARD: - AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 438); - MysteryGiftServer_InitSend(svr, MG_LINKID_CARD, MysteryGiftServer_GetSendData(cmd->parameter, svr->card), sizeof(struct WonderCard)); + ASSERT_PARAM_EMPTY(438); + MysteryGiftServer_InitSend(svr, MG_LINKID_CARD, MysteryGiftServer_GetSendData(cmd->ptr, svr->card), sizeof(struct WonderCard)); break; case SVR_LOAD_STAMP: - AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 444); - MysteryGiftServer_InitSend(svr, MG_LINKID_STAMP, MysteryGiftServer_GetSendData(cmd->parameter, &svr->stamp), sizeof(svr->stamp)); + ASSERT_PARAM_EMPTY(444); + MysteryGiftServer_InitSend(svr, MG_LINKID_STAMP, MysteryGiftServer_GetSendData(cmd->ptr, &svr->stamp), sizeof(svr->stamp)); break; case SVR_LOAD_RAM_SCRIPT: - if (cmd->parameter == NULL) + if (cmd->ptr == NULL) MysteryGiftServer_InitSend(svr, MG_LINKID_RAM_SCRIPT, svr->ramScript, svr->ramScriptSize); else - MysteryGiftServer_InitSend(svr, MG_LINKID_RAM_SCRIPT, cmd->parameter, cmd->flag); + MysteryGiftServer_InitSend(svr, MG_LINKID_RAM_SCRIPT, cmd->ptr, cmd->param); break; case SVR_LOAD_CLIENT_SCRIPT: - if (cmd->parameter == NULL) + if (cmd->ptr == NULL) MysteryGiftServer_InitSend(svr, MG_LINKID_CLIENT_SCRIPT, svr->clientScript, svr->clientScriptSize); else - MysteryGiftServer_InitSend(svr, MG_LINKID_CLIENT_SCRIPT, cmd->parameter, cmd->flag); + MysteryGiftServer_InitSend(svr, MG_LINKID_CLIENT_SCRIPT, cmd->ptr, cmd->param); break; case SVR_LOAD_EREADER_TRAINER: - AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 466); - MysteryGiftServer_InitSend(svr, MG_LINKID_EREADER_TRAINER, cmd->parameter, 188); + ASSERT_PARAM_EMPTY(466); + MysteryGiftServer_InitSend(svr, MG_LINKID_EREADER_TRAINER, cmd->ptr, sizeof(struct BattleTowerEReaderTrainer)); break; case SVR_LOAD_MSG: - MysteryGiftServer_InitSend(svr, MG_LINKID_DYNAMIC_MSG, cmd->parameter, cmd->flag); + MysteryGiftServer_InitSend(svr, MG_LINKID_DYNAMIC_MSG, cmd->ptr, cmd->param); break; case SVR_LOAD_UNK_2: - MysteryGiftServer_InitSend(svr, MG_LINKID_UNK_2, cmd->parameter, cmd->flag); + MysteryGiftServer_InitSend(svr, MG_LINKID_UNK_2, cmd->ptr, cmd->param); break; case SVR_COPY_CARD: - AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 481); - memcpy(svr->card, cmd->parameter, sizeof(*svr->card)); + ASSERT_PARAM_EMPTY(481); + memcpy(svr->card, cmd->ptr, sizeof(*svr->card)); break; case SVR_COPY_NEWS: - AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 486); - memcpy(svr->news, cmd->parameter, sizeof(*svr->news)); + ASSERT_PARAM_EMPTY(486); + memcpy(svr->news, cmd->ptr, sizeof(*svr->news)); break; case SVR_COPY_STAMP: - AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 491); - svr->stamp = *(u32 *)cmd->parameter; + ASSERT_PARAM_EMPTY(491); + svr->stamp = *(u32 *)cmd->ptr; break; case SVR_SET_RAM_SCRIPT: - svr->ramScript = cmd->parameter; - svr->ramScriptSize = cmd->flag; + svr->ramScript = cmd->ptr; + svr->ramScriptSize = cmd->param; break; case SVR_SET_CLIENT_SCRIPT: - svr->clientScript = cmd->parameter; - svr->clientScriptSize = cmd->flag; + svr->clientScript = cmd->ptr; + svr->clientScriptSize = cmd->param; break; case SVR_COPY_SAVED_CARD: - AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, ABSPATH("mevent_server.c"), 506); + ASSERT_PTR_PARAM_EMPTY(506); memcpy(svr->card, GetSavedWonderCard(), sizeof(*svr->card)); DisableWonderCardSending(svr->card); break; case SVR_COPY_SAVED_NEWS: - AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, ABSPATH("mevent_server.c"), 512); + ASSERT_PTR_PARAM_EMPTY(512); memcpy(svr->news, GetSavedWonderNews(), sizeof(*svr->news)); break; case SVR_COPY_SAVED_RAM_SCRIPT: - AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, ABSPATH("mevent_server.c"), 517); + ASSERT_PTR_PARAM_EMPTY(517); svr->ramScript = GetSavedRamScriptIfValid(); break; case SVR_LOAD_UNK_1: - MysteryGiftServer_InitSend(svr, MG_LINKID_UNK_1, cmd->parameter, cmd->flag); + MysteryGiftServer_InitSend(svr, MG_LINKID_UNK_1, cmd->ptr, cmd->param); break; } @@ -276,14 +294,9 @@ static u32 (*const sFuncTable[])(struct MysteryGiftServer *) = { static u32 MysteryGiftServer_CallFunc(struct MysteryGiftServer * svr) { -// Original GF names -#define mainseqno funcId -#define func_tbl sFuncTable u32 response; - AGB_ASSERT_EX(svr->mainseqno < NELEMS(func_tbl), ABSPATH("mevent_server.c"), 546); + ASSERT_VALID_FUNC(546) response = sFuncTable[svr->funcId](svr); - AGB_ASSERT_EX(svr->mainseqno < NELEMS(func_tbl), ABSPATH("mevent_server.c"), 548); + ASSERT_VALID_FUNC(548) return response; -#undef mainseqno -#undef func_tbl } diff --git a/src/wonder_news.c b/src/wonder_news.c index 4e7c4f472..03dd4c73f 100644 --- a/src/wonder_news.c +++ b/src/wonder_news.c @@ -5,27 +5,18 @@ #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. -*/ +// Every 4th reward for sending Wonder News to a link partner is a "big" reward. +#define MAX_SENT_REWARD 4 -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, -}; +// Only up to 5 rewards can be received in a short period. After this the player +// must take 500 steps before any more rewards can be received. +#define MAX_REWARD 5 -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 *); +static u32 GetRewardItem(struct WonderNewsMetadata *); +static u32 GetRewardType(struct WonderNewsMetadata *); +static void IncrementRewardCounter(struct WonderNewsMetadata *); +static void IncrementSentRewardCounter(struct WonderNewsMetadata *); +static void ResetSentRewardCounter(struct WonderNewsMetadata *); void WonderNews_SetReward(u32 newsType) { @@ -38,9 +29,11 @@ void WonderNews_SetReward(u32 newsType) break; case WONDER_NEWS_RECV_FRIEND: case WONDER_NEWS_RECV_WIRELESS: + // Random berry between ITEM_RAZZ_BERRY and ITEM_NOMEL_BERRY data->berry = (Random() % 15) + ITEM_TO_BERRY(ITEM_RAZZ_BERRY); break; case WONDER_NEWS_SENT: + // Random berry between ITEM_CHERI_BERRY and ITEM_IAPAPA_BERRY data->berry = (Random() % 15) + ITEM_TO_BERRY(ITEM_CHERI_BERRY); break; } @@ -48,12 +41,12 @@ void WonderNews_SetReward(u32 newsType) void WonderNews_Reset(void) { - struct WonderNewsMetadata *r5 = GetSavedWonderNewsMetadata(); + struct WonderNewsMetadata *data = GetSavedWonderNewsMetadata(); - r5->newsType = 0; - r5->unk_0_2 = 0; - r5->unk_0_5 = 0; - r5->berry = 0; + data->newsType = WONDER_NEWS_NONE; + data->sentRewardCounter = 0; + data->rewardCounter = 0; + data->berry = 0; VarSet(VAR_WONDER_NEWS_STEP_COUNTER, 0); } @@ -62,100 +55,100 @@ void WonderNews_IncrementStepCounter(void) u16 *stepCounter = GetVarPointer(VAR_WONDER_NEWS_STEP_COUNTER); struct WonderNewsMetadata *data = GetSavedWonderNewsMetadata(); - if (data->unk_0_5 > 4 && ++(*stepCounter) >= 500) + // If the player has reached the reward limit, start counting steps. + // When they reach 500 steps reset the reward counter to allow them to + // receive rewards again. + if (data->rewardCounter >= MAX_REWARD && ++(*stepCounter) >= 500) { - data->unk_0_5 = 0; + data->rewardCounter = 0; *stepCounter = 0; } } -u16 GetMENewsJisanItemAndState(void) +u16 WonderNews_GetRewardInfo(void) { u16 *result = &gSpecialVar_Result; struct WonderNewsMetadata *data = GetSavedWonderNewsMetadata(); - u16 r5; + u16 rewardType; if (!IsMysteryGiftEnabled() || !ValidateSavedWonderNews()) - return 0; + return NEWS_REWARD_NONE; - r5 = GetMENewsJisanState(data); + rewardType = GetRewardType(data); - switch (r5) + switch (rewardType) { - case 0: + case NEWS_REWARD_RECV_SMALL: + case NEWS_REWARD_RECV_BIG: + *result = GetRewardItem(data); break; - case 1: - *result = GetMENewsJisanRewardItem(data); + case NEWS_REWARD_SENT_SMALL: + *result = GetRewardItem(data); + IncrementSentRewardCounter(data); break; - case 2: - *result = GetMENewsJisanRewardItem(data); + case NEWS_REWARD_SENT_BIG: + *result = GetRewardItem(data); + ResetSentRewardCounter(data); break; - case 3: - break; - case 4: - *result = GetMENewsJisanRewardItem(data); - MENewsJisanIncrementCounterUnk0_2(data); - break; - case 5: - *result = GetMENewsJisanRewardItem(data); - MENewsJisanResetCounterUnk0_2(data); - break; - case 6: + case NEWS_REWARD_NONE: + case NEWS_REWARD_WAITING: + case NEWS_REWARD_AT_MAX: break; } - return r5; + return rewardType; } -static u32 GetMENewsJisanRewardItem(struct WonderNewsMetadata *a0) +static u32 GetRewardItem(struct WonderNewsMetadata *data) { - u32 r4; + u32 itemId; - a0->newsType = 0; - r4 = a0->berry + FIRST_BERRY_INDEX - 1; - a0->berry = 0; - MENewsJisanIncrementCounterUnk0_5(a0); - return r4; + data->newsType = WONDER_NEWS_NONE; + itemId = data->berry + FIRST_BERRY_INDEX - 1; + data->berry = 0; + IncrementRewardCounter(data); + return itemId; } -static void MENewsJisanResetCounterUnk0_2(struct WonderNewsMetadata *a0) +static void ResetSentRewardCounter(struct WonderNewsMetadata *data) { - a0->unk_0_2 = 0; + data->sentRewardCounter = 0; } -static void MENewsJisanIncrementCounterUnk0_2(struct WonderNewsMetadata *a0) +// Track number of times a reward was received (or attmepted to receive) for sending Wonder News to a link partner. +static void IncrementSentRewardCounter(struct WonderNewsMetadata *data) { - a0->unk_0_2++; - if ((u8)a0->unk_0_2 > 4) - a0->unk_0_2 = 4; + data->sentRewardCounter++; + if (data->sentRewardCounter > MAX_SENT_REWARD) + data->sentRewardCounter = MAX_SENT_REWARD; } -static void MENewsJisanIncrementCounterUnk0_5(struct WonderNewsMetadata *a0) +static void IncrementRewardCounter(struct WonderNewsMetadata *data) { - a0->unk_0_5++; - if ((u8)a0->unk_0_5 > 5) - a0->unk_0_5 = 5; + data->rewardCounter++; + if (data->rewardCounter > MAX_REWARD) + data->rewardCounter = MAX_REWARD; } -static u32 GetMENewsJisanState(struct WonderNewsMetadata *data) +static u32 GetRewardType(struct WonderNewsMetadata *data) { - if (data->unk_0_5 == 5) - return 6; + if (data->rewardCounter == MAX_REWARD) + return NEWS_REWARD_AT_MAX; switch (data->newsType) { case WONDER_NEWS_NONE: - return 3; + return NEWS_REWARD_WAITING; case WONDER_NEWS_RECV_FRIEND: - return 1; + return NEWS_REWARD_RECV_SMALL; case WONDER_NEWS_RECV_WIRELESS: - return 2; + return NEWS_REWARD_RECV_BIG; case WONDER_NEWS_SENT: - if (data->unk_0_2 < 3) - return 4; - return 5; + if (data->sentRewardCounter < MAX_SENT_REWARD - 1) + return NEWS_REWARD_SENT_SMALL; + return NEWS_REWARD_SENT_BIG; default: AGB_ASSERT_EX(0, ABSPATH("menews_jisan.c"), 383); - return 0; + return NEWS_REWARD_NONE; } }