Document src/event_data.c

This commit is contained in:
cbt6
2022-11-07 14:52:23 +08:00
parent 965f3cc1f6
commit dea9552563
6 changed files with 118 additions and 99 deletions
+46 -40
View File
@@ -3,37 +3,45 @@
#include "constants/trainers.h" #include "constants/trainers.h"
#define FLAG_TEMP_1 0x001 // Temporary Flags
#define FLAG_TEMP_2 0x002 // These temporary flags are are cleared every time a map is loaded. They are used
#define FLAG_TEMP_3 0x003 // for things like shortening an NPCs introduction text if the player already spoke
#define FLAG_TEMP_4 0x004 // to them once.
#define FLAG_TEMP_5 0x005 #define TEMP_FLAGS_START 0x0
#define FLAG_TEMP_6 0x006 #define FLAG_TEMP_1 (TEMP_FLAGS_START + 0x01)
#define FLAG_TEMP_7 0x007 #define FLAG_TEMP_2 (TEMP_FLAGS_START + 0x02)
#define FLAG_TEMP_8 0x008 #define FLAG_TEMP_3 (TEMP_FLAGS_START + 0x03)
#define FLAG_TEMP_9 0x009 #define FLAG_TEMP_4 (TEMP_FLAGS_START + 0x04)
#define FLAG_TEMP_A 0x00A #define FLAG_TEMP_5 (TEMP_FLAGS_START + 0x05)
#define FLAG_TEMP_B 0x00B #define FLAG_TEMP_6 (TEMP_FLAGS_START + 0x06)
#define FLAG_TEMP_C 0x00C #define FLAG_TEMP_7 (TEMP_FLAGS_START + 0x07)
#define FLAG_TEMP_D 0x00D #define FLAG_TEMP_8 (TEMP_FLAGS_START + 0x08)
#define FLAG_TEMP_E 0x00E #define FLAG_TEMP_9 (TEMP_FLAGS_START + 0x09)
#define FLAG_TEMP_F 0x00F #define FLAG_TEMP_A (TEMP_FLAGS_START + 0x0A)
#define FLAG_TEMP_10 0x010 #define FLAG_TEMP_B (TEMP_FLAGS_START + 0x0B)
#define FLAG_TEMP_11 0x011 #define FLAG_TEMP_C (TEMP_FLAGS_START + 0x0C)
#define FLAG_TEMP_12 0x012 #define FLAG_TEMP_D (TEMP_FLAGS_START + 0x0D)
#define FLAG_TEMP_13 0x013 #define FLAG_TEMP_E (TEMP_FLAGS_START + 0x0E)
#define FLAG_TEMP_14 0x014 #define FLAG_TEMP_F (TEMP_FLAGS_START + 0x0F)
#define FLAG_TEMP_15 0x015 #define FLAG_TEMP_10 (TEMP_FLAGS_START + 0x10)
#define FLAG_TEMP_16 0x016
#define FLAG_TEMP_17 0x017 // Used for obstacles (e.g. cut trees and rock smash rocks)
#define FLAG_TEMP_18 0x018 #define FLAG_TEMP_11 (TEMP_FLAGS_START + 0x11)
#define FLAG_TEMP_19 0x019 #define FLAG_TEMP_12 (TEMP_FLAGS_START + 0x12)
#define FLAG_TEMP_1A 0x01A #define FLAG_TEMP_13 (TEMP_FLAGS_START + 0x13)
#define FLAG_TEMP_1B 0x01B #define FLAG_TEMP_14 (TEMP_FLAGS_START + 0x14)
#define FLAG_TEMP_1C 0x01C #define FLAG_TEMP_15 (TEMP_FLAGS_START + 0x15)
#define FLAG_TEMP_1D 0x01D #define FLAG_TEMP_16 (TEMP_FLAGS_START + 0x16)
#define FLAG_TEMP_1E 0x01E #define FLAG_TEMP_17 (TEMP_FLAGS_START + 0x17)
#define FLAG_TEMP_1F 0x01F #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_0x020 0x020
#define FLAG_0x021 0x021 #define FLAG_0x021 0x021
@@ -1376,8 +1384,8 @@
#define FLAG_SYS_NOT_SOMEONES_PC (SYS_FLAGS + 0x34) #define FLAG_SYS_NOT_SOMEONES_PC (SYS_FLAGS + 0x34)
#define FLAG_0x835 (SYS_FLAGS + 0x35) #define FLAG_0x835 (SYS_FLAGS + 0x35)
#define FLAG_0x836 (SYS_FLAGS + 0x36) #define FLAG_0x836 (SYS_FLAGS + 0x36)
#define FLAG_0x837 (SYS_FLAGS + 0x37) #define FLAG_SYS_RESET_RTC_ENABLE (SYS_FLAGS + 0x37)
#define FLAG_0x838 (SYS_FLAGS + 0x38) #define FLAG_0x838 (SYS_FLAGS + 0x38) // Set, never read
#define FLAG_SYS_MYSTERY_GIFT_ENABLED (SYS_FLAGS + 0x39) #define FLAG_SYS_MYSTERY_GIFT_ENABLED (SYS_FLAGS + 0x39)
#define FLAG_0x83A (SYS_FLAGS + 0x3A) #define FLAG_0x83A (SYS_FLAGS + 0x3A)
#define FLAG_SYS_RIBBON_GET (SYS_FLAGS + 0x3B) #define FLAG_SYS_RIBBON_GET (SYS_FLAGS + 0x3B)
@@ -1515,13 +1523,11 @@
#define FLAGS_COUNT (FLAG_0x8FF + 1) #define FLAGS_COUNT (FLAG_0x8FF + 1)
// SPECIAL FLAGS (unknown purpose) // Special Flags (Stored in EWRAM (sSpecialFlags, not in the SaveBlock)
#define SPECIAL_FLAGS_START 0x4000 #define SPECIAL_FLAGS_START 0x4000
#define SPECIAL_FLAGS_COUNT 16 #define FLAG_DONT_SHOW_MAP_NAME_POPUP (SPECIAL_FLAGS_START + 0x0)
#define FLAG_DONT_SHOW_MAP_NAME_POPUP 0x4000 #define FLAG_DONT_TRANSITION_MUSIC (SPECIAL_FLAGS_START + 0x1)
#define FLAG_DONT_TRANSITION_MUSIC 0x4001 // FLAG_SPECIAL_FLAG_0x4002 - 0x407F also exist and are unused
#define FLAG_SPECIAL_FLAG_0x4002 0x4002 #define SPECIAL_FLAGS_END (SPECIAL_FLAGS_START + 0x7F)
#define FLAG_SPECIAL_FLAG_0x4003 0x4003
#define FLAG_SPECIAL_FLAG_0x4004 0x4004
#endif // GUARD_CONSTANTS_FLAGS_H #endif // GUARD_CONSTANTS_FLAGS_H
+22 -20
View File
@@ -3,23 +3,25 @@
#define VARS_START 0x4000 #define VARS_START 0x4000
// Temporary variables. Reset on map load. // Temporary variables. Temp vars are cleared every time a map is loaded.
#define VAR_TEMP_0 0x4000 #define TEMP_VARS_START 0x4000
#define VAR_TEMP_1 0x4001 #define VAR_TEMP_0 (TEMP_VARS_START + 0x0)
#define VAR_TEMP_2 0x4002 #define VAR_TEMP_1 (TEMP_VARS_START + 0x1)
#define VAR_TEMP_3 0x4003 #define VAR_TEMP_2 (TEMP_VARS_START + 0x2)
#define VAR_TEMP_4 0x4004 #define VAR_TEMP_3 (TEMP_VARS_START + 0x3)
#define VAR_TEMP_5 0x4005 #define VAR_TEMP_4 (TEMP_VARS_START + 0x4)
#define VAR_TEMP_6 0x4006 #define VAR_TEMP_5 (TEMP_VARS_START + 0x5)
#define VAR_TEMP_7 0x4007 #define VAR_TEMP_6 (TEMP_VARS_START + 0x6)
#define VAR_TEMP_8 0x4008 #define VAR_TEMP_7 (TEMP_VARS_START + 0x7)
#define VAR_TEMP_9 0x4009 #define VAR_TEMP_8 (TEMP_VARS_START + 0x8)
#define VAR_TEMP_A 0x400A #define VAR_TEMP_9 (TEMP_VARS_START + 0x9)
#define VAR_TEMP_B 0x400B #define VAR_TEMP_A (TEMP_VARS_START + 0xA)
#define VAR_TEMP_C 0x400C #define VAR_TEMP_B (TEMP_VARS_START + 0xB)
#define VAR_TEMP_D 0x400D #define VAR_TEMP_C (TEMP_VARS_START + 0xC)
#define VAR_TEMP_E 0x400E #define VAR_TEMP_D (TEMP_VARS_START + 0xD)
#define VAR_TEMP_F 0x400F #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 // Object event graphics IDs which can be changed by
// script commands. // script commands.
@@ -86,7 +88,7 @@
#define VAR_0x4029 0x4029 #define VAR_0x4029 0x4029
#define VAR_0x402A 0x402A #define VAR_0x402A 0x402A
#define VAR_0x402B 0x402B #define VAR_0x402B 0x402B
#define VAR_RESET_RTC_ENABLE 0x402C #define VAR_0x402C 0x402C
#define VAR_0x402D 0x402D #define VAR_0x402D 0x402D
#define VAR_0x402E 0x402E #define VAR_0x402E 0x402E
@@ -94,7 +96,7 @@
#define VAR_ICE_STEP_COUNT 0x4030 #define VAR_ICE_STEP_COUNT 0x4030
#define VAR_STARTER_MON 0x4031 // 0: Bulbasaur, 1: Squirtle, 2: Charmander #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_ENIGMA_BERRY_AVAILABLE 0x4033
#define VAR_0x4034 0x4034 #define VAR_0x4034 0x4034
@@ -105,7 +107,7 @@
#define VAR_FANCLUB_LOSE_FAN_TIMER 0x4039 #define VAR_FANCLUB_LOSE_FAN_TIMER 0x4039
#define VAR_ELEVATOR_FLOOR 0x403A #define VAR_ELEVATOR_FLOOR 0x403A
#define VAR_RESORT_GORGEOUS_REWARD 0x403B #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_HERACROSS_SIZE_RECORD 0x403D
#define VAR_DEOXYS_INTERACTION_NUM 0x403E #define VAR_DEOXYS_INTERACTION_NUM 0x403E
#define VAR_0x403F 0x403F #define VAR_0x403F 0x403F
+1 -1
View File
@@ -52,7 +52,7 @@ void ResetSpecialVars(void);
void ResetMysteryEventFlags(void); void ResetMysteryEventFlags(void);
void ResetMysteryEventVars(void); void ResetMysteryEventVars(void);
bool32 IsNationalPokedexEnabled(void); bool32 IsNationalPokedexEnabled(void);
void sub_806E190(void); void EnableNationalPokedex_RSE(void);
void ClearTempFieldEventData(void); void ClearTempFieldEventData(void);
#endif // GUARD_EVENT_DATA_H #endif // GUARD_EVENT_DATA_H
+2 -2
View File
@@ -183,8 +183,8 @@ struct Pokedex
{ {
/*0x00*/ u8 order; /*0x00*/ u8 order;
/*0x01*/ u8 mode; /*0x01*/ u8 mode;
/*0x02*/ u8 nationalMagic; // must equal 0xDA in order to have National mode /*0x02*/ u8 unused; // set to 0xDA, never read
/*0x03*/ u8 unknown2; // set to 0xB9 when national dex is first enabled /*0x03*/ u8 nationalMagic; // set to 0xB9 when national dex is first enabled
/*0x04*/ u32 unownPersonality; // set when you first see Unown /*0x04*/ u32 unownPersonality; // set when you first see Unown
/*0x08*/ u32 spindaPersonality; // set when you first see Spinda /*0x08*/ u32 spindaPersonality; // set when you first see Spinda
/*0x0C*/ u32 unknown3; /*0x0C*/ u32 unknown3;
+42 -31
View File
@@ -5,6 +5,14 @@
static bool8 IsFlagOrVarStoredInQuestLog(u16 idx, u8 a1); 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_0x8000 = 0;
EWRAM_DATA u16 gSpecialVar_0x8001 = 0; EWRAM_DATA u16 gSpecialVar_0x8001 = 0;
EWRAM_DATA u16 gSpecialVar_0x8002 = 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_TextColor = 0;
EWRAM_DATA u16 gSpecialVar_PrevTextColor = 0; EWRAM_DATA u16 gSpecialVar_PrevTextColor = 0;
EWRAM_DATA u16 gSpecialVar_0x8014 = 0; EWRAM_DATA u16 gSpecialVar_0x8014 = 0;
EWRAM_DATA u8 sSpecialFlags[SPECIAL_FLAGS_COUNT] = {}; EWRAM_DATA u8 sSpecialFlags[SPECIAL_FLAGS_SIZE] = {};
u16 gLastQuestLogStoredFlagOrVarIdx; u16 gLastQuestLogStoredFlagOrVarIdx;
@@ -33,15 +41,15 @@ extern u16 *const gSpecialVars[];
void InitEventData(void) void InitEventData(void)
{ {
memset(gSaveBlock1Ptr->flags, 0, NUM_FLAG_BYTES); memset(gSaveBlock1Ptr->flags, 0, sizeof(gSaveBlock1Ptr->flags));
memset(gSaveBlock1Ptr->vars, 0, VARS_COUNT * 2); memset(gSaveBlock1Ptr->vars, 0, sizeof(gSaveBlock1Ptr->vars));
memset(sSpecialFlags, 0, SPECIAL_FLAGS_COUNT); memset(sSpecialFlags, 0, sizeof(sSpecialFlags));
} }
void ClearTempFieldEventData(void) void ClearTempFieldEventData(void)
{ {
memset(gSaveBlock1Ptr->flags, 0, 4); memset(gSaveBlock1Ptr->flags + (TEMP_FLAGS_START / 8), 0, TEMP_FLAGS_SIZE);
memset(gSaveBlock1Ptr->vars, 0, 16 * 2); memset(gSaveBlock1Ptr->vars + ((TEMP_VARS_START - VARS_START) * 2), 0, TEMP_VARS_SIZE);
FlagClear(FLAG_SYS_WHITE_FLUTE_ACTIVE); FlagClear(FLAG_SYS_WHITE_FLUTE_ACTIVE);
FlagClear(FLAG_SYS_BLACK_FLUTE_ACTIVE); FlagClear(FLAG_SYS_BLACK_FLUTE_ACTIVE);
FlagClear(FLAG_SYS_USE_STRENGTH); FlagClear(FLAG_SYS_USE_STRENGTH);
@@ -49,37 +57,41 @@ void ClearTempFieldEventData(void)
FlagClear(FLAG_SYS_INFORMED_OF_LOCAL_WIRELESS_PLAYER); FlagClear(FLAG_SYS_INFORMED_OF_LOCAL_WIRELESS_PLAYER);
} }
void sub_806E168(void) // Unused // Unused
static void DisableNationalPokedex_RSE(void)
{ {
u16 *ptr = GetVarPointer(VAR_0x403C); u16 *ptr = GetVarPointer(VAR_0x403C);
gSaveBlock2Ptr->pokedex.nationalMagic = 0; gSaveBlock2Ptr->pokedex.unused = 0;
*ptr = 0; *ptr = 0;
FlagClear(FLAG_0x838); 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); u16 *ptr = GetVarPointer(VAR_0x403C);
gSaveBlock2Ptr->pokedex.nationalMagic = 0xDA; gSaveBlock2Ptr->pokedex.unused = 0xDA;
*ptr = 0x0302; *ptr = 0x0302;
FlagSet(FLAG_0x838); FlagSet(FLAG_0x838);
} }
bool32 sub_806E1C0(void) // Unused // Unused
static bool32 IsNationalPokedexEnabled_RSE(void)
{ {
if (gSaveBlock2Ptr->pokedex.nationalMagic != 0xDA) if (gSaveBlock2Ptr->pokedex.unused == 0xDA
return FALSE; && VarGet(VAR_0x403C) == 0x0302
if (VarGet(VAR_0x403C) != 0x0302) && FlagGet(FLAG_0x838))
return FALSE;
if (!FlagGet(FLAG_0x838))
return FALSE;
return TRUE; return TRUE;
return FALSE;
} }
void DisableNationalPokedex(void) void DisableNationalPokedex(void)
{ {
u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX); u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX);
gSaveBlock2Ptr->pokedex.unknown2 = 0; gSaveBlock2Ptr->pokedex.nationalMagic = 0;
*nationalDexVar = 0; *nationalDexVar = 0;
FlagClear(FLAG_SYS_NATIONAL_DEX); FlagClear(FLAG_SYS_NATIONAL_DEX);
} }
@@ -87,20 +99,19 @@ void DisableNationalPokedex(void)
void EnableNationalPokedex(void) void EnableNationalPokedex(void)
{ {
u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX); u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX);
gSaveBlock2Ptr->pokedex.unknown2 = 0xB9; gSaveBlock2Ptr->pokedex.nationalMagic = 0xB9;
*nationalDexVar = 0x6258; *nationalDexVar = 0x6258;
FlagSet(FLAG_SYS_NATIONAL_DEX); FlagSet(FLAG_SYS_NATIONAL_DEX);
} }
bool32 IsNationalPokedexEnabled(void) bool32 IsNationalPokedexEnabled(void)
{ {
if (gSaveBlock2Ptr->pokedex.unknown2 != 0xB9) if (gSaveBlock2Ptr->pokedex.nationalMagic == 0xB9
return FALSE; && VarGet(VAR_NATIONAL_DEX) == 0x6258
if (VarGet(VAR_NATIONAL_DEX) != 0x6258) && FlagGet(FLAG_SYS_NATIONAL_DEX))
return FALSE;
if (!FlagGet(FLAG_SYS_NATIONAL_DEX))
return FALSE;
return TRUE; return TRUE;
return FALSE;
} }
void DisableMysteryGift(void) void DisableMysteryGift(void)
@@ -153,21 +164,21 @@ void ResetMysteryEventVars(void)
void DisableResetRTC(void) void DisableResetRTC(void)
{ {
VarSet(VAR_0x4032, 0); VarSet(VAR_RESET_RTC_ENABLE, 0);
FlagClear(FLAG_0x837); FlagClear(FLAG_SYS_RESET_RTC_ENABLE);
} }
void EnableResetRTC(void) void EnableResetRTC(void)
{ {
VarSet(VAR_0x4032, 0x0920); VarSet(VAR_RESET_RTC_ENABLE, 0x0920);
FlagSet(FLAG_0x837); FlagSet(FLAG_SYS_RESET_RTC_ENABLE);
} }
bool32 CanResetRTC(void) bool32 CanResetRTC(void)
{ {
if (!FlagGet(FLAG_0x837)) if (!FlagGet(FLAG_SYS_RESET_RTC_ENABLE))
return FALSE; return FALSE;
if (VarGet(VAR_0x4032) != 0x0920) if (VarGet(VAR_RESET_RTC_ENABLE) != 0x0920)
return FALSE; return FALSE;
return TRUE; return TRUE;
} }
+1 -1
View File
@@ -130,7 +130,7 @@ void NewGameInitData(void)
ClearPlayerLinkBattleRecords(); ClearPlayerLinkBattleRecords();
InitHeracrossSizeRecord(); InitHeracrossSizeRecord();
InitMagikarpSizeRecord(); InitMagikarpSizeRecord();
sub_806E190(); EnableNationalPokedex_RSE();
gPlayerPartyCount = 0; gPlayerPartyCount = 0;
ZeroPlayerPartyMons(); ZeroPlayerPartyMons();
ResetPokemonStorageSystem(); ResetPokemonStorageSystem();