diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/event_data.c | 325 | ||||
-rw-r--r-- | src/main_menu.c | 4 | ||||
-rw-r--r-- | src/menews_jisan.c | 2 | ||||
-rw-r--r-- | src/new_game.c | 2 | ||||
-rw-r--r-- | src/quest_log.c | 4 | ||||
-rw-r--r-- | src/scrcmd.c | 4 | ||||
-rw-r--r-- | src/trainer_tower.c | 4 |
7 files changed, 335 insertions, 10 deletions
diff --git a/src/event_data.c b/src/event_data.c new file mode 100644 index 000000000..105567fe8 --- /dev/null +++ b/src/event_data.c @@ -0,0 +1,325 @@ +#include "global.h" +#include "event_data.h" +#include "item_menu.h" +#include "quest_log.h" + +static bool8 IsFlagOrVarStoredInQuestLog(u16 idx, u8 a1); + +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 u16 gSpecialVar_MonBoxId = 0; +EWRAM_DATA u16 gSpecialVar_MonBoxPos = 0; +EWRAM_DATA u16 gSpecialVar_TextColor = 0; +EWRAM_DATA u16 gSpecialVar_PrevTextColor = 0; +EWRAM_DATA u16 gUnknown_20370DE = 0; +EWRAM_DATA u8 gUnknown_20370E0[SPECIAL_FLAGS_COUNT] = {}; + +u16 gUnknown_300507C; + +extern u16 *const gSpecialVars[]; + +void InitEventData(void) +{ + memset(gSaveBlock1Ptr->flags, 0, FLAGS_COUNT); + memset(gSaveBlock1Ptr->vars, 0, VARS_COUNT * 2); + memset(gUnknown_20370E0, 0, SPECIAL_FLAGS_COUNT); +} + +void sub_806E110(void) +{ + memset(gSaveBlock1Ptr->flags, 0, 4); + memset(gSaveBlock1Ptr->vars, 0, 16 * 2); + FlagClear(FLAG_SYS_WHITE_FLUTE_ACTIVE); + FlagClear(FLAG_SYS_BLACK_FLUTE_ACTIVE); + FlagClear(FLAG_SYS_STRENGTH_ACTIVE); + FlagClear(FLAG_SYS_SPECIAL_WILD_BATTLE); + FlagClear(FLAG_SYS_INFORMED_OF_LOCAL_WIRELESS_PLAYER); +} + +void sub_806E168(void) +{ + u16 *ptr = GetVarPointer(VAR_0x403C); + gSaveBlock2Ptr->pokedex.nationalMagic = 0; + *ptr = 0; + FlagClear(FLAG_0x838); +} + +void sub_806E190(void) +{ + u16 *ptr = GetVarPointer(VAR_0x403C); + gSaveBlock2Ptr->pokedex.nationalMagic = 0xDA; + *ptr = 0x0302; + FlagSet(FLAG_0x838); +} + +bool32 sub_806E1C0(void) +{ + if (gSaveBlock2Ptr->pokedex.nationalMagic != 0xDA) + return FALSE; + if (VarGet(VAR_0x403C) != 0x0302) + return FALSE; + if (!FlagGet(FLAG_0x838)) + return FALSE; + return TRUE; +} + +void sub_806E204(void) +{ + u16 *ptr = GetVarPointer(VAR_0x404E); + gSaveBlock2Ptr->pokedex.unknown2 = 0; + *ptr = 0; + FlagClear(FLAG_SYS_NATIONAL_DEX); +} + +void EnableNationalPokedex(void) +{ + u16 *ptr = GetVarPointer(VAR_0x404E); + gSaveBlock2Ptr->pokedex.unknown2 = 0xB9; + *ptr = 0x6258; + FlagSet(FLAG_SYS_NATIONAL_DEX); +} + +bool32 IsNationalPokedexEnabled(void) +{ + if (gSaveBlock2Ptr->pokedex.unknown2 != 0xB9) + return FALSE; + if (VarGet(VAR_0x404E) != 0x6258) + return FALSE; + if (!FlagGet(FLAG_SYS_NATIONAL_DEX)) + return FALSE; + return TRUE; +} + +void DisableMysteryGift(void) +{ + FlagClear(FLAG_SYS_MYSTERY_GIFT_ENABLED); +} + +void EnableMysteryGift(void) +{ + FlagSet(FLAG_SYS_MYSTERY_GIFT_ENABLED); +} + +bool32 IsMysteryGiftEnabled(void) +{ + return FlagGet(FLAG_SYS_MYSTERY_GIFT_ENABLED); +} + +void sub_806E2D0(void) +{ + FlagClear(FLAG_MYSTERY_EVENT_DONE); + FlagClear(FLAG_0x3D9); + FlagClear(FLAG_0x3DA); + FlagClear(FLAG_0x3DB); + FlagClear(FLAG_0x3DC); + FlagClear(FLAG_0x3DD); + FlagClear(FLAG_0x3DE); + FlagClear(FLAG_0x3DF); + FlagClear(FLAG_0x3E0); + FlagClear(FLAG_0x3E1); + FlagClear(FLAG_0x3E2); + FlagClear(FLAG_0x3E3); + FlagClear(FLAG_0x3E4); + FlagClear(FLAG_0x3E5); + FlagClear(FLAG_0x3E6); + FlagClear(FLAG_0x3E7); +} + +void sub_806E370(void) +{ + VarSet(VAR_EVENT_PICHU_SLOT, 0); + VarSet(VAR_0x40B6, 0); + VarSet(VAR_0x40B7, 0); + VarSet(VAR_0x40B8, 0); + VarSet(VAR_0x40B9, 0); + VarSet(VAR_0x40BA, 0); + VarSet(VAR_0x40BB, 0); + VarSet(VAR_0x40BC, 0); + VarSet(VAR_ALTERING_CAVE_WILD_SET, 0); +} + +void DisableResetRTC(void) +{ + VarSet(VAR_0x4032, 0); + FlagClear(FLAG_0x837); +} + +void EnableResetRTC(void) +{ + VarSet(VAR_0x4032, 0x0920); + FlagSet(FLAG_0x837); +} + +bool32 CanResetRTC(void) +{ + if (!FlagGet(FLAG_0x837)) + return FALSE; + if (VarGet(VAR_0x4032) != 0x0920) + return FALSE; + return TRUE; +} + +u16 *GetVarPointer(u16 idx) +{ + u16 *ptr; + if (idx < VARS_START) + return NULL; + if (idx < SPECIAL_VARS_START) + { + switch (gUnknown_3005E88) + { + case 0: + default: + break; + case 1: + ptr = sub_8112D40(0, idx); + if (ptr != NULL) + gSaveBlock1Ptr->vars[idx - VARS_START] = *ptr; + break; + case 2: + if (IsFlagOrVarStoredInQuestLog(idx - VARS_START, 1) == TRUE) + { + gUnknown_300507C = idx - VARS_START; + sub_8112DB0(0, idx, gSaveBlock1Ptr->vars[idx - VARS_START]); + } + break; + } + return &gSaveBlock1Ptr->vars[idx - VARS_START]; + } + return gSpecialVars[idx - SPECIAL_VARS_START]; +} + +static bool8 IsFlagOrVarStoredInQuestLog(u16 idx, u8 a1) +{ + if (a1 == 0) + { + if (idx < STORY_FLAGS_START) + return FALSE; + if (idx >= SYS_FLAGS && idx < PERMA_SYS_FLAGS_START) + return FALSE; + } + else + { + if (idx < VAR_0x4030 - VARS_START) + return FALSE; + if (idx >= VAR_MAP_SCENE_PALLET_TOWN_OAK - VARS_START && idx < VAR_PORTHOLE - VARS_START) + return FALSE; + } + return TRUE; +} + +u16 VarGet(u16 idx) +{ + u16 *ptr = GetVarPointer(idx); + if (ptr == NULL) + return idx; + return *ptr; +} + +bool8 VarSet(u16 idx, u16 val) +{ + u16 *ptr = GetVarPointer(idx); + if (ptr == NULL) + return FALSE; + *ptr = val; + return TRUE; +} + +u8 VarGetFieldObjectGraphicsId(u8 idx) +{ + return VarGet(0x4010 + idx); +} + +u8 *GetFlagAddr(u16 idx) +{ + u8 *ptr; + if (idx == 0) + return NULL; + if (idx < SPECIAL_FLAGS_START) + { + switch (gUnknown_3005E88) + { + case 0: + default: + break; + case 1: + ptr = sub_8112D40(1, idx); + if (ptr != NULL) + gSaveBlock1Ptr->flags[idx >> 3] = *ptr; + break; + case 2: + if (IsFlagOrVarStoredInQuestLog(idx, 0) == TRUE) + { + gUnknown_300507C = idx; + sub_8112DB0(1, idx, gSaveBlock1Ptr->flags[idx / 8]); + } + break; + } + return &gSaveBlock1Ptr->flags[idx / 8]; + } + return &gUnknown_20370E0[(idx - SPECIAL_FLAGS_START) / 8]; +} + +bool8 FlagSet(u16 idx) +{ + u8 *ptr = GetFlagAddr(idx); + if (ptr != NULL) + *ptr |= 1 << (idx & 7); + return FALSE; +} + +bool8 FlagClear(u16 idx) +{ + u8 *ptr = GetFlagAddr(idx); + if (ptr != NULL) + *ptr &= ~(1 << (idx & 7)); + return FALSE; +} + +bool8 FlagGet(u16 idx) +{ + u8 *ptr = GetFlagAddr(idx); + if (ptr == NULL) + return FALSE; + if (!(*ptr & 1 << (idx & 7))) + return FALSE; + return TRUE; +} + +void ResetSpecialVars(void) +{ + gSpecialVar_0x8000 = 0; + gSpecialVar_0x8001 = 0; + gSpecialVar_0x8002 = 0; + gSpecialVar_0x8003 = 0; + gSpecialVar_0x8004 = 0; + gSpecialVar_0x8005 = 0; + gSpecialVar_0x8006 = 0; + gSpecialVar_0x8007 = 0; + gSpecialVar_0x8008 = 0; + gSpecialVar_0x8009 = 0; + gSpecialVar_0x800A = 0; + gSpecialVar_0x800B = 0; + gSpecialVar_Facing = 0; + gSpecialVar_Result = 0; + gSpecialVar_ItemId = 0; + gSpecialVar_LastTalked = 0; + gSpecialVar_MonBoxId = 0; + gSpecialVar_MonBoxPos = 0; + gSpecialVar_TextColor = 0; + gSpecialVar_PrevTextColor = 0; + gUnknown_20370DE = 0; +} diff --git a/src/main_menu.c b/src/main_menu.c index cf788fa21..542bcf8ea 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -240,7 +240,7 @@ static void Task_SetWin0BldRegsAndCheckSaveFile(u8 taskId) { case SAVE_STATUS_OK: LoadUserFrameToBg(0); - if (Flag_0x839_IsSet() == TRUE) + if (IsMysteryGiftEnabled() == TRUE) { gTasks[taskId].tMenuType = MAIN_MENU_MYSTERYGIFT; } @@ -259,7 +259,7 @@ static void Task_SetWin0BldRegsAndCheckSaveFile(u8 taskId) SetStdFrame0OnBg(0); gTasks[taskId].tMenuType = MAIN_MENU_CONTINUE; PrintSaveErrorStatus(taskId, gText_SaveFileCorruptedPrevWillBeLoaded); - if (Flag_0x839_IsSet() == TRUE) + if (IsMysteryGiftEnabled() == TRUE) { gTasks[taskId].tMenuType = MAIN_MENU_MYSTERYGIFT; } diff --git a/src/menews_jisan.c b/src/menews_jisan.c index 2f6172bbc..4605b162b 100644 --- a/src/menews_jisan.c +++ b/src/menews_jisan.c @@ -59,7 +59,7 @@ u16 sub_8146CE8(void) struct MysteryEventStruct *r4 = sub_8143D94(); u16 r5; - if (!Flag_0x839_IsSet() || !ValidateReceivedWonderNews()) + if (!IsMysteryGiftEnabled() || !ValidateReceivedWonderNews()) return 0; r5 = sub_8146E0C(r4); diff --git a/src/new_game.c b/src/new_game.c index bede6ce94..e27c862bb 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -103,7 +103,7 @@ void ResetMenuAndMonGlobals(void) BerryPouch_CursorResetToTop(); sub_811089C(); sub_8083214(Random()); - sub_806E6FC(); + ResetSpecialVars(); } void NewGameInitData(void) diff --git a/src/quest_log.c b/src/quest_log.c index 11d57341b..11046b59f 100644 --- a/src/quest_log.c +++ b/src/quest_log.c @@ -982,7 +982,7 @@ void sub_8111274(u8 a0, u8 a1) static void sub_8111368(void) { gUnknown_203ADFA = 2; - sub_806E6FC(); + ResetSpecialVars(); ClearBag(); ClearPCItemSlots(); if (sub_8110AC8() == 1) @@ -1231,7 +1231,7 @@ static void sub_8111914(void) static void sub_8111984(void) { - sub_806E6FC(); + ResetSpecialVars(); Save_ResetSaveCounters(); Save_LoadGameData(0); SetMainCallback2(sub_8057430); diff --git a/src/scrcmd.c b/src/scrcmd.c index ae994fceb..7a70d09c7 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1263,8 +1263,8 @@ bool8 ScrCmd_release(struct ScriptContext *ctx) bool8 ScrCmd_textcolor(struct ScriptContext *ctx) { - gUnknown_20370DC = gUnknown_20370DA; - gUnknown_20370DA = ScriptReadByte(ctx); + gSpecialVar_PrevTextColor = gSpecialVar_TextColor; + gSpecialVar_TextColor = ScriptReadByte(ctx); return FALSE; } diff --git a/src/trainer_tower.c b/src/trainer_tower.c index c5631ee1b..d74da5542 100644 --- a/src/trainer_tower.c +++ b/src/trainer_tower.c @@ -920,8 +920,8 @@ void sub_815E068(u8 battleType, u8 facilityClass) } break; } - gUnknown_20370DC = gUnknown_20370DA; - gUnknown_20370DA = r5; + gSpecialVar_PrevTextColor = gSpecialVar_TextColor; + gSpecialVar_TextColor = r5; } void sub_815E114(void) |