summaryrefslogtreecommitdiff
path: root/src/wonder_news.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/wonder_news.c')
-rw-r--r--src/wonder_news.c160
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;
+ }
+}