2017-09-02 21:43:53 +02:00
|
|
|
#include "global.h"
|
|
|
|
#include "event_data.h"
|
2018-12-15 21:12:28 +01:00
|
|
|
#include "pokedex.h"
|
2017-09-02 21:43:53 +02:00
|
|
|
|
2017-09-02 22:31:37 +02:00
|
|
|
#define TEMP_FLAGS_SIZE 0x4
|
2019-02-12 07:40:34 +01:00
|
|
|
#define DAILY_FLAGS_SIZE 0x8
|
2017-09-02 22:31:37 +02:00
|
|
|
#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;
|
2017-11-11 01:12:18 +01:00
|
|
|
EWRAM_DATA u16 gSpecialVar_Result = 0;
|
|
|
|
EWRAM_DATA u16 gSpecialVar_LastTalked = 0;
|
|
|
|
EWRAM_DATA u16 gSpecialVar_Facing = 0;
|
2017-11-08 22:20:10 +01:00
|
|
|
EWRAM_DATA u16 gSpecialVar_MonBoxId = 0;
|
|
|
|
EWRAM_DATA u16 gSpecialVar_MonBoxPos = 0;
|
2017-09-02 22:31:37 +02:00
|
|
|
EWRAM_DATA u16 gSpecialVar_0x8014 = 0;
|
|
|
|
EWRAM_DATA static u8 gUnknown_020375FC[16] = {0};
|
|
|
|
|
2018-08-12 22:04:49 +02:00
|
|
|
extern u16 *const gSpecialVars[];
|
2017-09-02 22:31:37 +02:00
|
|
|
|
2017-09-02 21:43:53 +02:00
|
|
|
void InitEventData(void)
|
|
|
|
{
|
|
|
|
memset(gSaveBlock1Ptr->flags, 0, sizeof(gSaveBlock1Ptr->flags));
|
|
|
|
memset(gSaveBlock1Ptr->vars, 0, sizeof(gSaveBlock1Ptr->vars));
|
|
|
|
memset(gUnknown_020375FC, 0, sizeof(gUnknown_020375FC));
|
|
|
|
}
|
2017-09-02 22:31:37 +02:00
|
|
|
|
|
|
|
void ClearTempFieldEventData(void)
|
|
|
|
{
|
|
|
|
memset(gSaveBlock1Ptr->flags, 0, TEMP_FLAGS_SIZE);
|
|
|
|
memset(gSaveBlock1Ptr->vars, 0, TEMP_VARS_SIZE);
|
2017-11-08 22:20:10 +01:00
|
|
|
FlagClear(FLAG_SYS_ENC_UP_ITEM);
|
|
|
|
FlagClear(FLAG_SYS_ENC_DOWN_ITEM);
|
|
|
|
FlagClear(FLAG_SYS_USE_STRENGTH);
|
|
|
|
FlagClear(FLAG_SYS_CTRL_OBJ_DELETE);
|
2019-01-02 22:12:43 +01:00
|
|
|
FlagClear(FLAG_NURSE_UNION_ROOM_REMINDER);
|
2017-09-02 22:31:37 +02:00
|
|
|
}
|
|
|
|
|
2019-02-12 07:40:34 +01:00
|
|
|
void ClearDailyFlags(void)
|
2017-09-02 22:31:37 +02:00
|
|
|
{
|
2019-02-12 07:40:34 +01:00
|
|
|
memset(gSaveBlock1Ptr->flags + 0x124, 0, DAILY_FLAGS_SIZE);
|
2017-09-02 22:31:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void DisableNationalPokedex(void)
|
|
|
|
{
|
|
|
|
u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX);
|
|
|
|
gSaveBlock2Ptr->pokedex.nationalMagic = 0;
|
|
|
|
*nationalDexVar = 0;
|
2017-11-08 22:20:10 +01:00
|
|
|
FlagClear(FLAG_SYS_NATIONAL_DEX);
|
2017-09-02 22:31:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void EnableNationalPokedex(void)
|
|
|
|
{
|
|
|
|
u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX);
|
|
|
|
gSaveBlock2Ptr->pokedex.nationalMagic = 0xDA;
|
|
|
|
*nationalDexVar = 0x302;
|
2017-11-08 22:20:10 +01:00
|
|
|
FlagSet(FLAG_SYS_NATIONAL_DEX);
|
2018-12-15 21:12:28 +01:00
|
|
|
gSaveBlock2Ptr->pokedex.mode = DEX_MODE_NATIONAL;
|
2017-09-02 22:31:37 +02:00
|
|
|
gSaveBlock2Ptr->pokedex.order = 0;
|
2019-02-15 09:40:57 +01:00
|
|
|
ResetPokedexScrollPositions();
|
2017-09-02 22:31:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
bool32 IsNationalPokedexEnabled(void)
|
|
|
|
{
|
2017-11-08 22:20:10 +01:00
|
|
|
if (gSaveBlock2Ptr->pokedex.nationalMagic == 0xDA && VarGet(VAR_NATIONAL_DEX) == 0x302 && FlagGet(FLAG_SYS_NATIONAL_DEX))
|
2017-09-02 22:31:37 +02:00
|
|
|
return TRUE;
|
|
|
|
else
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void DisableMysteryEvent(void)
|
|
|
|
{
|
2017-11-08 22:20:10 +01:00
|
|
|
FlagClear(FLAG_SYS_MYSTERY_EVENT_ENABLE);
|
2017-09-02 22:31:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void EnableMysteryEvent(void)
|
|
|
|
{
|
2017-11-08 22:20:10 +01:00
|
|
|
FlagSet(FLAG_SYS_MYSTERY_EVENT_ENABLE);
|
2017-09-02 22:31:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
bool32 IsMysteryEventEnabled(void)
|
|
|
|
{
|
2017-11-08 22:20:10 +01:00
|
|
|
return FlagGet(FLAG_SYS_MYSTERY_EVENT_ENABLE);
|
2017-09-02 22:31:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void DisableMysteryGift(void)
|
|
|
|
{
|
2017-11-08 22:20:10 +01:00
|
|
|
FlagClear(FLAG_SYS_MYSTERY_GIFT_ENABLE);
|
2017-09-02 22:31:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void EnableMysteryGift(void)
|
|
|
|
{
|
2017-11-08 22:20:10 +01:00
|
|
|
FlagSet(FLAG_SYS_MYSTERY_GIFT_ENABLE);
|
2017-09-02 22:31:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
bool32 IsMysteryGiftEnabled(void)
|
|
|
|
{
|
2017-11-08 22:20:10 +01:00
|
|
|
return FlagGet(FLAG_SYS_MYSTERY_GIFT_ENABLE);
|
2017-09-02 22:31:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void sub_809D4D8(void)
|
|
|
|
{
|
2018-08-11 22:54:34 +02:00
|
|
|
FlagClear(FLAG_MYSTERY_EVENT_DONE);
|
2019-01-02 22:12:43 +01:00
|
|
|
FlagClear(FLAG_MYSTERY_EVENT_1);
|
|
|
|
FlagClear(FLAG_MYSTERY_EVENT_2);
|
|
|
|
FlagClear(FLAG_MYSTERY_EVENT_3);
|
|
|
|
FlagClear(FLAG_MYSTERY_EVENT_4);
|
|
|
|
FlagClear(FLAG_MYSTERY_EVENT_5);
|
|
|
|
FlagClear(FLAG_MYSTERY_EVENT_6);
|
|
|
|
FlagClear(FLAG_MYSTERY_EVENT_7);
|
|
|
|
FlagClear(FLAG_MYSTERY_EVENT_8);
|
|
|
|
FlagClear(FLAG_MYSTERY_EVENT_9);
|
|
|
|
FlagClear(FLAG_MYSTERY_EVENT_10);
|
|
|
|
FlagClear(FLAG_MYSTERY_EVENT_11);
|
|
|
|
FlagClear(FLAG_MYSTERY_EVENT_12);
|
|
|
|
FlagClear(FLAG_MYSTERY_EVENT_13);
|
|
|
|
FlagClear(FLAG_MYSTERY_EVENT_14);
|
|
|
|
FlagClear(FLAG_MYSTERY_EVENT_15);
|
2017-09-02 22:31:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void sub_809D570(void)
|
|
|
|
{
|
2018-08-11 22:54:34 +02:00
|
|
|
VarSet(VAR_EVENT_PICHU_SLOT, 0);
|
|
|
|
VarSet(VAR_0x40DE, 0);
|
|
|
|
VarSet(VAR_0x40DF, 0);
|
|
|
|
VarSet(VAR_0x40E0, 0);
|
|
|
|
VarSet(VAR_0x40E1, 0);
|
|
|
|
VarSet(VAR_0x40E2, 0);
|
|
|
|
VarSet(VAR_0x40E3, 0);
|
|
|
|
VarSet(VAR_0x40E4, 0);
|
2017-09-02 22:31:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void DisableResetRTC(void)
|
|
|
|
{
|
|
|
|
VarSet(VAR_RESET_RTC_ENABLE, 0);
|
2017-11-08 22:20:10 +01:00
|
|
|
FlagClear(FLAG_SYS_RESET_RTC_ENABLE);
|
2017-09-02 22:31:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void EnableResetRTC(void)
|
|
|
|
{
|
|
|
|
VarSet(VAR_RESET_RTC_ENABLE, 0x920);
|
2017-11-08 22:20:10 +01:00
|
|
|
FlagSet(FLAG_SYS_RESET_RTC_ENABLE);
|
2017-09-02 22:31:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
bool32 CanResetRTC(void)
|
|
|
|
{
|
2017-11-08 22:20:10 +01:00
|
|
|
if (FlagGet(FLAG_SYS_RESET_RTC_ENABLE) && VarGet(VAR_RESET_RTC_ENABLE) == 0x920)
|
2017-09-02 22:31:37 +02:00
|
|
|
return TRUE;
|
|
|
|
else
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
u16 *GetVarPointer(u16 id)
|
|
|
|
{
|
2018-08-11 22:54:34 +02:00
|
|
|
if (id < VARS_START)
|
2017-09-02 22:31:37 +02:00
|
|
|
return NULL;
|
2018-08-12 22:04:49 +02:00
|
|
|
else if (id < SPECIAL_VARS_START)
|
2018-08-11 22:54:34 +02:00
|
|
|
return &gSaveBlock1Ptr->vars[id - VARS_START];
|
2018-08-12 22:33:41 +02:00
|
|
|
else
|
|
|
|
return gSpecialVars[id - SPECIAL_VARS_START];
|
2017-09-02 22:31:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2018-06-12 02:11:48 +02:00
|
|
|
u8 VarGetEventObjectGraphicsId(u8 id)
|
2017-09-02 22:31:37 +02:00
|
|
|
{
|
2018-08-11 22:54:34 +02:00
|
|
|
return VarGet(VAR_OBJ_GFX_ID_0 + id);
|
2017-09-02 22:31:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
u8 *GetFlagPointer(u16 id)
|
|
|
|
{
|
|
|
|
if (id == 0)
|
2018-08-11 22:54:34 +02:00
|
|
|
return NULL;
|
2018-08-12 22:04:49 +02:00
|
|
|
else if (id < SPECIAL_FLAGS_START)
|
2017-09-02 22:31:37 +02:00
|
|
|
return &gSaveBlock1Ptr->flags[id / 8];
|
2018-08-12 22:33:41 +02:00
|
|
|
else
|
|
|
|
return &gUnknown_020375FC[(id - SPECIAL_FLAGS_START) / 8];
|
2017-09-02 22:31:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
u8 FlagSet(u16 id)
|
|
|
|
{
|
|
|
|
u8 *ptr = GetFlagPointer(id);
|
|
|
|
if (ptr)
|
|
|
|
*ptr |= 1 << (id & 7);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2017-10-12 09:06:19 +02:00
|
|
|
u8 FlagClear(u16 id)
|
2017-09-02 22:31:37 +02:00
|
|
|
{
|
|
|
|
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;
|
|
|
|
}
|