Clean up mystery gift sync, document wonder news

This commit is contained in:
GriffinR
2022-11-21 23:52:11 -05:00
parent 76c3b014d8
commit a19cb44458
17 changed files with 212 additions and 189 deletions
+1
View File
@@ -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
+29 -19
View File
@@ -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
+3 -3
View File
@@ -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
+2 -2
View File
@@ -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

Before

Width:  |  Height:  |  Size: 141 B

After

Width:  |  Height:  |  Size: 141 B

+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
+2 -2
View File
@@ -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;
};
-1
View File
@@ -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
+3 -3
View File
@@ -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
+1 -1
View File
@@ -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;
}
+11 -11
View File
@@ -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;
-1
View File
@@ -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;
+3 -3
View File
@@ -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:
+3 -3
View File
@@ -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[] = _("むげんのチケット");
+4 -4
View File
@@ -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
};
+74 -61
View File
@@ -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
}
+68 -75
View File
@@ -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;
}
}