summaryrefslogtreecommitdiff
path: root/src/event_data.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/event_data.c')
-rw-r--r--src/event_data.c182
1 files changed, 182 insertions, 0 deletions
diff --git a/src/event_data.c b/src/event_data.c
new file mode 100644
index 000000000..9d6d2372b
--- /dev/null
+++ b/src/event_data.c
@@ -0,0 +1,182 @@
+#include "global.h"
+#include "event_data.h"
+#include "pokedex.h"
+
+#define TEMP_FLAGS_SIZE 0x4
+#define DAILY_FLAGS_SIZE 0x8
+#define TEMP_VARS_SIZE 0x20
+
+EWRAM_DATA u16 gSpecialVar_0x8000 = 0;
+EWRAM_DATA u16 gSpecialVar_0x8001 = 0;
+EWRAM_DATA u16 gSpecialVar_0x8002 = 0;
+EWRAM_DATA u16 gSpecialVar_0x8003 = 0;
+EWRAM_DATA u16 gSpecialVar_0x8004 = 0;
+EWRAM_DATA u16 gSpecialVar_0x8005 = 0;
+EWRAM_DATA u16 gSpecialVar_0x8006 = 0;
+EWRAM_DATA u16 gSpecialVar_0x8007 = 0;
+EWRAM_DATA u16 gSpecialVar_0x8008 = 0;
+EWRAM_DATA u16 gSpecialVar_0x8009 = 0;
+EWRAM_DATA u16 gSpecialVar_0x800A = 0;
+EWRAM_DATA u16 gSpecialVar_0x800B = 0;
+EWRAM_DATA u16 gSpecialVar_Result = 0;
+EWRAM_DATA u16 gSpecialVar_LastTalked = 0;
+EWRAM_DATA u16 gSpecialVar_Facing = 0;
+EWRAM_DATA u8 gUnknown_0202E8E2[16] = {0};
+
+extern u16 *gSpecialVars[];
+
+void InitEventData(void)
+{
+ memset(gSaveBlock1.flags, 0, sizeof(gSaveBlock1.flags));
+ memset(gSaveBlock1.vars, 0, sizeof(gSaveBlock1.vars));
+ memset(gUnknown_0202E8E2, 0, sizeof(gUnknown_0202E8E2));
+}
+
+void ClearTempFieldEventData(void)
+{
+ memset(gSaveBlock1.flags, 0, TEMP_FLAGS_SIZE);
+ memset(gSaveBlock1.vars, 0, TEMP_VARS_SIZE);
+ FlagClear(FLAG_SYS_ENC_UP_ITEM);
+ FlagClear(FLAG_SYS_ENC_DOWN_ITEM);
+ FlagClear(FLAG_SYS_USE_STRENGTH);
+ FlagClear(FLAG_SYS_CTRL_OBJ_DELETE);
+}
+
+// probably had different flag splits at one point.
+void ClearDailyFlags(void)
+{
+ memset(gSaveBlock1.flags + (DAILY_FLAGS_START / 8), 0, DAILY_FLAGS_SIZE);
+}
+
+void DisableNationalPokedex(void)
+{
+ u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX);
+ gSaveBlock2.pokedex.nationalMagic = 0;
+ *nationalDexVar = 0;
+ FlagClear(FLAG_SYS_NATIONAL_DEX);
+}
+
+void EnableNationalPokedex(void)
+{
+ u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX);
+ gSaveBlock2.pokedex.nationalMagic = 0xDA;
+ *nationalDexVar = 0x302;
+ FlagSet(FLAG_SYS_NATIONAL_DEX);
+ gSaveBlock2.pokedex.unknown1 = 1;
+ gSaveBlock2.pokedex.order = 0;
+ sub_808C0A0();
+}
+
+bool32 IsNationalPokedexEnabled(void)
+{
+ if (gSaveBlock2.pokedex.nationalMagic == 0xDA && VarGet(VAR_NATIONAL_DEX) == 0x302 && FlagGet(FLAG_SYS_NATIONAL_DEX))
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void DisableMysteryGift(void)
+{
+ FlagClear(FLAG_SYS_EXDATA_ENABLE);
+}
+
+void EnableMysteryGift(void)
+{
+ FlagSet(FLAG_SYS_EXDATA_ENABLE);
+}
+
+bool32 IsMysteryGiftEnabled(void)
+{
+ return FlagGet(FLAG_SYS_EXDATA_ENABLE);
+}
+
+void DisableResetRTC(void)
+{
+ VarSet(VAR_RESET_RTC_ENABLE, 0);
+ FlagClear(FLAG_SYS_RESET_RTC_ENABLE);
+}
+
+void EnableResetRTC(void)
+{
+ VarSet(VAR_RESET_RTC_ENABLE, 0x920);
+ FlagSet(FLAG_SYS_RESET_RTC_ENABLE);
+}
+
+bool32 CanResetRTC(void)
+{
+ if (FlagGet(FLAG_SYS_RESET_RTC_ENABLE) && VarGet(VAR_RESET_RTC_ENABLE) == 0x920)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+u16 *GetVarPointer(u16 id)
+{
+ if (id < VARS_START)
+ return NULL;
+ if (id < 0x8000)
+ return &gSaveBlock1.vars[id - VARS_START];
+ return gSpecialVars[id - 0x8000];
+}
+
+u16 VarGet(u16 id)
+{
+ u16 *ptr = GetVarPointer(id);
+ if (!ptr)
+ return id;
+ return *ptr;
+}
+
+bool8 VarSet(u16 id, u16 value)
+{
+ u16 *ptr = GetVarPointer(id);
+ if (!ptr)
+ return FALSE;
+ *ptr = value;
+ return TRUE;
+}
+
+u8 VarGetFieldObjectGraphicsId(u8 id)
+{
+ return VarGet(VAR_OBJ_GFX_ID_0 + id);
+}
+
+u8 *GetFlagPointer(u16 id)
+{
+ if (id == 0)
+ return 0;
+
+ if (id < 0x4000)
+ return &gSaveBlock1.flags[id / 8];
+
+ return &gUnknown_0202E8E2[(id - 0x4000) / 8];
+}
+
+u8 FlagSet(u16 id)
+{
+ u8 *ptr = GetFlagPointer(id);
+ if (ptr)
+ *ptr |= 1 << (id & 7);
+ return 0;
+}
+
+u8 FlagClear(u16 id)
+{
+ u8 *ptr = GetFlagPointer(id);
+ if (ptr)
+ *ptr &= ~(1 << (id & 7));
+ return 0;
+}
+
+bool8 FlagGet(u16 id)
+{
+ u8 *ptr = GetFlagPointer(id);
+
+ if (!ptr)
+ return FALSE;
+
+ if (!(((*ptr) >> (id & 7)) & 1))
+ return FALSE;
+
+ return TRUE;
+}