Clean up mystery gift sync, document wonder news
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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 |
@@ -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
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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[] = _("むげんのチケット");
|
||||
|
||||
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user