From dea9552563313740724ebbf9623dd93da1069e4f Mon Sep 17 00:00:00 2001 From: cbt6 <91667135+cbt6@users.noreply.github.com> Date: Mon, 7 Nov 2022 14:52:23 +0800 Subject: [PATCH] Document src/event_data.c --- include/constants/flags.h | 88 +++++++++++++++++++++------------------ include/constants/vars.h | 44 ++++++++++---------- include/event_data.h | 2 +- include/global.h | 4 +- src/event_data.c | 77 +++++++++++++++++++--------------- src/new_game.c | 2 +- 6 files changed, 118 insertions(+), 99 deletions(-) diff --git a/include/constants/flags.h b/include/constants/flags.h index e4c13dce6..5baa6c75c 100644 --- a/include/constants/flags.h +++ b/include/constants/flags.h @@ -3,37 +3,45 @@ #include "constants/trainers.h" -#define FLAG_TEMP_1 0x001 -#define FLAG_TEMP_2 0x002 -#define FLAG_TEMP_3 0x003 -#define FLAG_TEMP_4 0x004 -#define FLAG_TEMP_5 0x005 -#define FLAG_TEMP_6 0x006 -#define FLAG_TEMP_7 0x007 -#define FLAG_TEMP_8 0x008 -#define FLAG_TEMP_9 0x009 -#define FLAG_TEMP_A 0x00A -#define FLAG_TEMP_B 0x00B -#define FLAG_TEMP_C 0x00C -#define FLAG_TEMP_D 0x00D -#define FLAG_TEMP_E 0x00E -#define FLAG_TEMP_F 0x00F -#define FLAG_TEMP_10 0x010 -#define FLAG_TEMP_11 0x011 -#define FLAG_TEMP_12 0x012 -#define FLAG_TEMP_13 0x013 -#define FLAG_TEMP_14 0x014 -#define FLAG_TEMP_15 0x015 -#define FLAG_TEMP_16 0x016 -#define FLAG_TEMP_17 0x017 -#define FLAG_TEMP_18 0x018 -#define FLAG_TEMP_19 0x019 -#define FLAG_TEMP_1A 0x01A -#define FLAG_TEMP_1B 0x01B -#define FLAG_TEMP_1C 0x01C -#define FLAG_TEMP_1D 0x01D -#define FLAG_TEMP_1E 0x01E -#define FLAG_TEMP_1F 0x01F +// Temporary Flags +// These temporary flags are are cleared every time a map is loaded. They are used +// for things like shortening an NPCs introduction text if the player already spoke +// to them once. +#define TEMP_FLAGS_START 0x0 +#define FLAG_TEMP_1 (TEMP_FLAGS_START + 0x01) +#define FLAG_TEMP_2 (TEMP_FLAGS_START + 0x02) +#define FLAG_TEMP_3 (TEMP_FLAGS_START + 0x03) +#define FLAG_TEMP_4 (TEMP_FLAGS_START + 0x04) +#define FLAG_TEMP_5 (TEMP_FLAGS_START + 0x05) +#define FLAG_TEMP_6 (TEMP_FLAGS_START + 0x06) +#define FLAG_TEMP_7 (TEMP_FLAGS_START + 0x07) +#define FLAG_TEMP_8 (TEMP_FLAGS_START + 0x08) +#define FLAG_TEMP_9 (TEMP_FLAGS_START + 0x09) +#define FLAG_TEMP_A (TEMP_FLAGS_START + 0x0A) +#define FLAG_TEMP_B (TEMP_FLAGS_START + 0x0B) +#define FLAG_TEMP_C (TEMP_FLAGS_START + 0x0C) +#define FLAG_TEMP_D (TEMP_FLAGS_START + 0x0D) +#define FLAG_TEMP_E (TEMP_FLAGS_START + 0x0E) +#define FLAG_TEMP_F (TEMP_FLAGS_START + 0x0F) +#define FLAG_TEMP_10 (TEMP_FLAGS_START + 0x10) + +// Used for obstacles (e.g. cut trees and rock smash rocks) +#define FLAG_TEMP_11 (TEMP_FLAGS_START + 0x11) +#define FLAG_TEMP_12 (TEMP_FLAGS_START + 0x12) +#define FLAG_TEMP_13 (TEMP_FLAGS_START + 0x13) +#define FLAG_TEMP_14 (TEMP_FLAGS_START + 0x14) +#define FLAG_TEMP_15 (TEMP_FLAGS_START + 0x15) +#define FLAG_TEMP_16 (TEMP_FLAGS_START + 0x16) +#define FLAG_TEMP_17 (TEMP_FLAGS_START + 0x17) +#define FLAG_TEMP_18 (TEMP_FLAGS_START + 0x18) +#define FLAG_TEMP_19 (TEMP_FLAGS_START + 0x19) +#define FLAG_TEMP_1A (TEMP_FLAGS_START + 0x1A) +#define FLAG_TEMP_1B (TEMP_FLAGS_START + 0x1B) +#define FLAG_TEMP_1C (TEMP_FLAGS_START + 0x1C) +#define FLAG_TEMP_1D (TEMP_FLAGS_START + 0x1D) +#define FLAG_TEMP_1E (TEMP_FLAGS_START + 0x1E) +#define FLAG_TEMP_1F (TEMP_FLAGS_START + 0x1F) +#define TEMP_FLAGS_END FLAG_TEMP_1F #define FLAG_0x020 0x020 #define FLAG_0x021 0x021 @@ -1376,8 +1384,8 @@ #define FLAG_SYS_NOT_SOMEONES_PC (SYS_FLAGS + 0x34) #define FLAG_0x835 (SYS_FLAGS + 0x35) #define FLAG_0x836 (SYS_FLAGS + 0x36) -#define FLAG_0x837 (SYS_FLAGS + 0x37) -#define FLAG_0x838 (SYS_FLAGS + 0x38) +#define FLAG_SYS_RESET_RTC_ENABLE (SYS_FLAGS + 0x37) +#define FLAG_0x838 (SYS_FLAGS + 0x38) // Set, never read #define FLAG_SYS_MYSTERY_GIFT_ENABLED (SYS_FLAGS + 0x39) #define FLAG_0x83A (SYS_FLAGS + 0x3A) #define FLAG_SYS_RIBBON_GET (SYS_FLAGS + 0x3B) @@ -1515,13 +1523,11 @@ #define FLAGS_COUNT (FLAG_0x8FF + 1) -// SPECIAL FLAGS (unknown purpose) -#define SPECIAL_FLAGS_START 0x4000 -#define SPECIAL_FLAGS_COUNT 16 -#define FLAG_DONT_SHOW_MAP_NAME_POPUP 0x4000 -#define FLAG_DONT_TRANSITION_MUSIC 0x4001 -#define FLAG_SPECIAL_FLAG_0x4002 0x4002 -#define FLAG_SPECIAL_FLAG_0x4003 0x4003 -#define FLAG_SPECIAL_FLAG_0x4004 0x4004 +// Special Flags (Stored in EWRAM (sSpecialFlags, not in the SaveBlock) +#define SPECIAL_FLAGS_START 0x4000 +#define FLAG_DONT_SHOW_MAP_NAME_POPUP (SPECIAL_FLAGS_START + 0x0) +#define FLAG_DONT_TRANSITION_MUSIC (SPECIAL_FLAGS_START + 0x1) +// FLAG_SPECIAL_FLAG_0x4002 - 0x407F also exist and are unused +#define SPECIAL_FLAGS_END (SPECIAL_FLAGS_START + 0x7F) #endif // GUARD_CONSTANTS_FLAGS_H diff --git a/include/constants/vars.h b/include/constants/vars.h index 0a88f6508..56dafee12 100644 --- a/include/constants/vars.h +++ b/include/constants/vars.h @@ -3,23 +3,25 @@ #define VARS_START 0x4000 -// Temporary variables. Reset on map load. -#define VAR_TEMP_0 0x4000 -#define VAR_TEMP_1 0x4001 -#define VAR_TEMP_2 0x4002 -#define VAR_TEMP_3 0x4003 -#define VAR_TEMP_4 0x4004 -#define VAR_TEMP_5 0x4005 -#define VAR_TEMP_6 0x4006 -#define VAR_TEMP_7 0x4007 -#define VAR_TEMP_8 0x4008 -#define VAR_TEMP_9 0x4009 -#define VAR_TEMP_A 0x400A -#define VAR_TEMP_B 0x400B -#define VAR_TEMP_C 0x400C -#define VAR_TEMP_D 0x400D -#define VAR_TEMP_E 0x400E -#define VAR_TEMP_F 0x400F +// Temporary variables. Temp vars are cleared every time a map is loaded. +#define TEMP_VARS_START 0x4000 +#define VAR_TEMP_0 (TEMP_VARS_START + 0x0) +#define VAR_TEMP_1 (TEMP_VARS_START + 0x1) +#define VAR_TEMP_2 (TEMP_VARS_START + 0x2) +#define VAR_TEMP_3 (TEMP_VARS_START + 0x3) +#define VAR_TEMP_4 (TEMP_VARS_START + 0x4) +#define VAR_TEMP_5 (TEMP_VARS_START + 0x5) +#define VAR_TEMP_6 (TEMP_VARS_START + 0x6) +#define VAR_TEMP_7 (TEMP_VARS_START + 0x7) +#define VAR_TEMP_8 (TEMP_VARS_START + 0x8) +#define VAR_TEMP_9 (TEMP_VARS_START + 0x9) +#define VAR_TEMP_A (TEMP_VARS_START + 0xA) +#define VAR_TEMP_B (TEMP_VARS_START + 0xB) +#define VAR_TEMP_C (TEMP_VARS_START + 0xC) +#define VAR_TEMP_D (TEMP_VARS_START + 0xD) +#define VAR_TEMP_E (TEMP_VARS_START + 0xE) +#define VAR_TEMP_F (TEMP_VARS_START + 0xF) +#define TEMP_VARS_END VAR_TEMP_F // Object event graphics IDs which can be changed by // script commands. @@ -86,7 +88,7 @@ #define VAR_0x4029 0x4029 #define VAR_0x402A 0x402A #define VAR_0x402B 0x402B -#define VAR_RESET_RTC_ENABLE 0x402C +#define VAR_0x402C 0x402C #define VAR_0x402D 0x402D #define VAR_0x402E 0x402E @@ -94,7 +96,7 @@ #define VAR_ICE_STEP_COUNT 0x4030 #define VAR_STARTER_MON 0x4031 // 0: Bulbasaur, 1: Squirtle, 2: Charmander -#define VAR_0x4032 0x4032 +#define VAR_RESET_RTC_ENABLE 0x4032 #define VAR_ENIGMA_BERRY_AVAILABLE 0x4033 #define VAR_0x4034 0x4034 @@ -105,7 +107,7 @@ #define VAR_FANCLUB_LOSE_FAN_TIMER 0x4039 #define VAR_ELEVATOR_FLOOR 0x403A #define VAR_RESORT_GORGEOUS_REWARD 0x403B -#define VAR_0x403C 0x403C +#define VAR_0x403C 0x403C // Set to 0x0302, never read #define VAR_HERACROSS_SIZE_RECORD 0x403D #define VAR_DEOXYS_INTERACTION_NUM 0x403E #define VAR_0x403F 0x403F @@ -158,7 +160,7 @@ #define VAR_MAP_SCENE_PEWTER_CITY 0x406C #define VAR_0x406D 0x406D #define VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE 0x406E -#define VAR_CABLE_CLUB_STATE 0x406F +#define VAR_CABLE_CLUB_STATE 0x406F #define VAR_MAP_SCENE_PALLET_TOWN_SIGN_LADY 0x4070 #define VAR_MAP_SCENE_CINNABAR_ISLAND 0x4071 #define VAR_0x4072 0x4072 diff --git a/include/event_data.h b/include/event_data.h index fcad84b6a..5a6f98c6c 100644 --- a/include/event_data.h +++ b/include/event_data.h @@ -52,7 +52,7 @@ void ResetSpecialVars(void); void ResetMysteryEventFlags(void); void ResetMysteryEventVars(void); bool32 IsNationalPokedexEnabled(void); -void sub_806E190(void); +void EnableNationalPokedex_RSE(void); void ClearTempFieldEventData(void); #endif // GUARD_EVENT_DATA_H diff --git a/include/global.h b/include/global.h index 05a0e77f1..79dedcdc2 100644 --- a/include/global.h +++ b/include/global.h @@ -183,8 +183,8 @@ struct Pokedex { /*0x00*/ u8 order; /*0x01*/ u8 mode; - /*0x02*/ u8 nationalMagic; // must equal 0xDA in order to have National mode - /*0x03*/ u8 unknown2; // set to 0xB9 when national dex is first enabled + /*0x02*/ u8 unused; // set to 0xDA, never read + /*0x03*/ u8 nationalMagic; // set to 0xB9 when national dex is first enabled /*0x04*/ u32 unownPersonality; // set when you first see Unown /*0x08*/ u32 spindaPersonality; // set when you first see Spinda /*0x0C*/ u32 unknown3; diff --git a/src/event_data.c b/src/event_data.c index ac227177d..5d3bad5d6 100644 --- a/src/event_data.c +++ b/src/event_data.c @@ -5,6 +5,14 @@ static bool8 IsFlagOrVarStoredInQuestLog(u16 idx, u8 a1); +#define NUM_SPECIAL_FLAGS (SPECIAL_FLAGS_END - SPECIAL_FLAGS_START + 1) +#define NUM_TEMP_FLAGS (TEMP_FLAGS_END - TEMP_FLAGS_START + 1) +#define NUM_TEMP_VARS (TEMP_VARS_END - TEMP_VARS_START + 1) + +#define SPECIAL_FLAGS_SIZE (NUM_SPECIAL_FLAGS / 8) // 8 flags per byte +#define TEMP_FLAGS_SIZE (NUM_TEMP_FLAGS / 8) +#define TEMP_VARS_SIZE (NUM_TEMP_VARS * 2) // 1/2 var per byte + EWRAM_DATA u16 gSpecialVar_0x8000 = 0; EWRAM_DATA u16 gSpecialVar_0x8001 = 0; EWRAM_DATA u16 gSpecialVar_0x8002 = 0; @@ -25,7 +33,7 @@ EWRAM_DATA u16 gSpecialVar_MonBoxPos = 0; EWRAM_DATA u16 gSpecialVar_TextColor = 0; EWRAM_DATA u16 gSpecialVar_PrevTextColor = 0; EWRAM_DATA u16 gSpecialVar_0x8014 = 0; -EWRAM_DATA u8 sSpecialFlags[SPECIAL_FLAGS_COUNT] = {}; +EWRAM_DATA u8 sSpecialFlags[SPECIAL_FLAGS_SIZE] = {}; u16 gLastQuestLogStoredFlagOrVarIdx; @@ -33,15 +41,15 @@ extern u16 *const gSpecialVars[]; void InitEventData(void) { - memset(gSaveBlock1Ptr->flags, 0, NUM_FLAG_BYTES); - memset(gSaveBlock1Ptr->vars, 0, VARS_COUNT * 2); - memset(sSpecialFlags, 0, SPECIAL_FLAGS_COUNT); + memset(gSaveBlock1Ptr->flags, 0, sizeof(gSaveBlock1Ptr->flags)); + memset(gSaveBlock1Ptr->vars, 0, sizeof(gSaveBlock1Ptr->vars)); + memset(sSpecialFlags, 0, sizeof(sSpecialFlags)); } void ClearTempFieldEventData(void) { - memset(gSaveBlock1Ptr->flags, 0, 4); - memset(gSaveBlock1Ptr->vars, 0, 16 * 2); + memset(gSaveBlock1Ptr->flags + (TEMP_FLAGS_START / 8), 0, TEMP_FLAGS_SIZE); + memset(gSaveBlock1Ptr->vars + ((TEMP_VARS_START - VARS_START) * 2), 0, TEMP_VARS_SIZE); FlagClear(FLAG_SYS_WHITE_FLUTE_ACTIVE); FlagClear(FLAG_SYS_BLACK_FLUTE_ACTIVE); FlagClear(FLAG_SYS_USE_STRENGTH); @@ -49,37 +57,41 @@ void ClearTempFieldEventData(void) FlagClear(FLAG_SYS_INFORMED_OF_LOCAL_WIRELESS_PLAYER); } -void sub_806E168(void) // Unused +// Unused +static void DisableNationalPokedex_RSE(void) { u16 *ptr = GetVarPointer(VAR_0x403C); - gSaveBlock2Ptr->pokedex.nationalMagic = 0; + gSaveBlock2Ptr->pokedex.unused = 0; *ptr = 0; FlagClear(FLAG_0x838); } -void sub_806E190(void) +// The magic numbers used here (0xDA and 0x0302) correspond to those +// used in RSE for enabling the national Pokedex +void EnableNationalPokedex_RSE(void) { + // Note: the var, struct member, and flag are never used u16 *ptr = GetVarPointer(VAR_0x403C); - gSaveBlock2Ptr->pokedex.nationalMagic = 0xDA; + gSaveBlock2Ptr->pokedex.unused = 0xDA; *ptr = 0x0302; FlagSet(FLAG_0x838); } -bool32 sub_806E1C0(void) // Unused +// Unused +static bool32 IsNationalPokedexEnabled_RSE(void) { - if (gSaveBlock2Ptr->pokedex.nationalMagic != 0xDA) - return FALSE; - if (VarGet(VAR_0x403C) != 0x0302) - return FALSE; - if (!FlagGet(FLAG_0x838)) - return FALSE; - return TRUE; + if (gSaveBlock2Ptr->pokedex.unused == 0xDA + && VarGet(VAR_0x403C) == 0x0302 + && FlagGet(FLAG_0x838)) + return TRUE; + + return FALSE; } void DisableNationalPokedex(void) { u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX); - gSaveBlock2Ptr->pokedex.unknown2 = 0; + gSaveBlock2Ptr->pokedex.nationalMagic = 0; *nationalDexVar = 0; FlagClear(FLAG_SYS_NATIONAL_DEX); } @@ -87,20 +99,19 @@ void DisableNationalPokedex(void) void EnableNationalPokedex(void) { u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX); - gSaveBlock2Ptr->pokedex.unknown2 = 0xB9; + gSaveBlock2Ptr->pokedex.nationalMagic = 0xB9; *nationalDexVar = 0x6258; FlagSet(FLAG_SYS_NATIONAL_DEX); } bool32 IsNationalPokedexEnabled(void) { - if (gSaveBlock2Ptr->pokedex.unknown2 != 0xB9) - return FALSE; - if (VarGet(VAR_NATIONAL_DEX) != 0x6258) - return FALSE; - if (!FlagGet(FLAG_SYS_NATIONAL_DEX)) - return FALSE; - return TRUE; + if (gSaveBlock2Ptr->pokedex.nationalMagic == 0xB9 + && VarGet(VAR_NATIONAL_DEX) == 0x6258 + && FlagGet(FLAG_SYS_NATIONAL_DEX)) + return TRUE; + + return FALSE; } void DisableMysteryGift(void) @@ -153,21 +164,21 @@ void ResetMysteryEventVars(void) void DisableResetRTC(void) { - VarSet(VAR_0x4032, 0); - FlagClear(FLAG_0x837); + VarSet(VAR_RESET_RTC_ENABLE, 0); + FlagClear(FLAG_SYS_RESET_RTC_ENABLE); } void EnableResetRTC(void) { - VarSet(VAR_0x4032, 0x0920); - FlagSet(FLAG_0x837); + VarSet(VAR_RESET_RTC_ENABLE, 0x0920); + FlagSet(FLAG_SYS_RESET_RTC_ENABLE); } bool32 CanResetRTC(void) { - if (!FlagGet(FLAG_0x837)) + if (!FlagGet(FLAG_SYS_RESET_RTC_ENABLE)) return FALSE; - if (VarGet(VAR_0x4032) != 0x0920) + if (VarGet(VAR_RESET_RTC_ENABLE) != 0x0920) return FALSE; return TRUE; } diff --git a/src/new_game.c b/src/new_game.c index 0bd25b23c..d6400d763 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -130,7 +130,7 @@ void NewGameInitData(void) ClearPlayerLinkBattleRecords(); InitHeracrossSizeRecord(); InitMagikarpSizeRecord(); - sub_806E190(); + EnableNationalPokedex_RSE(); gPlayerPartyCount = 0; ZeroPlayerPartyMons(); ResetPokemonStorageSystem();