diff options
Diffstat (limited to 'src/wonder_news.c')
-rw-r--r-- | src/wonder_news.c | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/src/wonder_news.c b/src/wonder_news.c new file mode 100644 index 000000000..ec93d293e --- /dev/null +++ b/src/wonder_news.c @@ -0,0 +1,160 @@ +#include "global.h" +#include "mystery_gift.h" +#include "random.h" +#include "event_data.h" +#include "wonder_news.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 GetNewsId(struct WonderNewsMetadata *); +static void IncrementGetNewsCounter(struct WonderNewsMetadata *); +static u32 GetNewsValByNewsType(struct WonderNewsMetadata *); +static void IncrementSentNewsCounter(struct WonderNewsMetadata *); +static void ResetSentNewsCounter(struct WonderNewsMetadata *); + +void GenerateRandomWonderNews(u32 newsType) +{ + struct WonderNewsMetadata *data = GetSavedWonderNewsMetadata(); + + data->newsType = newsType; + switch (newsType) + { + case WONDER_NEWS_NONE: + break; + case WONDER_NEWS_RECV_FRIEND: + case WONDER_NEWS_RECV_WIRELESS: + data->rand = (Random() % 15) + 16; + break; + case WONDER_NEWS_SENT: + data->rand = (Random() % 15) + 1; + break; + } +} + +void InitSavedWonderNews(void) +{ + struct WonderNewsMetadata *data = GetSavedWonderNewsMetadata(); + + data->newsType = WONDER_NEWS_NONE; + data->sentCounter = 0; + data->getCounter = 0; + data->rand = 0; + VarSet(VAR_WONDER_NEWS_COUNTER, 0); +} + +// Unused +static void TryIncrementWonderNewsVar(void) +{ + u16 *var = GetVarPointer(VAR_WONDER_NEWS_COUNTER); + struct WonderNewsMetadata *data = GetSavedWonderNewsMetadata(); + + if (data->getCounter > 4 && ++(*var) >= 500) + { + data->getCounter = 0; + *var = 0; + } +} + +// Unused +u16 RetrieveWonderNewsVal(void) +{ + u16 *result = &gSpecialVar_Result; + struct WonderNewsMetadata *data = GetSavedWonderNewsMetadata(); + u16 newsVal; + + // Checks if Mystery Event is enabled, not Mystery Gift? + if (!IsMysteryEventEnabled() || !ValidateSavedWonderNews()) + return 0; + + newsVal = GetNewsValByNewsType(data); + + switch (newsVal) + { + case NEWS_VAL_RECV_FRIEND: + *result = GetNewsId(data); + break; + case NEWS_VAL_RECV_WIRELESS: + *result = GetNewsId(data); + break; + case NEWS_VAL_SENT: + *result = GetNewsId(data); + IncrementSentNewsCounter(data); + break; + case NEWS_VAL_SENT_MAX: + *result = GetNewsId(data); + ResetSentNewsCounter(data); + break; + case NEWS_VAL_INVALID: + case NEWS_VAL_NONE: + case NEWS_VAL_GET_MAX: + break; + } + + return newsVal; +} + +static u32 GetNewsId(struct WonderNewsMetadata *data) +{ + u32 id; + data->newsType = WONDER_NEWS_NONE; + id = data->rand + 132; + data->rand = 0; + IncrementGetNewsCounter(data); + return id; +} + +static void ResetSentNewsCounter(struct WonderNewsMetadata *data) +{ + data->sentCounter = 0; +} + +static void IncrementSentNewsCounter(struct WonderNewsMetadata *data) +{ + data->sentCounter++; + if (data->sentCounter > 4) + data->sentCounter = 4; +} + +static void IncrementGetNewsCounter(struct WonderNewsMetadata *data) +{ + data->getCounter++; + if (data->getCounter > 5) + data->getCounter = 5; +} + +static u32 GetNewsValByNewsType(struct WonderNewsMetadata *data) +{ + if (data->getCounter == 5) + return NEWS_VAL_GET_MAX; + + switch (data->newsType) + { + case WONDER_NEWS_NONE: + return NEWS_VAL_NONE; + case WONDER_NEWS_RECV_FRIEND: + return NEWS_VAL_RECV_FRIEND; + case WONDER_NEWS_RECV_WIRELESS: + return NEWS_VAL_RECV_WIRELESS; + case WONDER_NEWS_SENT: + if (data->sentCounter < 3) + return NEWS_VAL_SENT; + return NEWS_VAL_SENT_MAX; + default: + AGB_ASSERT(0); + return NEWS_VAL_INVALID; + } +} |