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
+47 -41
View File
@@ -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
+23 -21
View File
@@ -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
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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;
+44 -33
View File
@@ -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;
}
+1 -1
View File
@@ -130,7 +130,7 @@ void NewGameInitData(void)
ClearPlayerLinkBattleRecords();
InitHeracrossSizeRecord();
InitMagikarpSizeRecord();
sub_806E190();
EnableNationalPokedex_RSE();
gPlayerPartyCount = 0;
ZeroPlayerPartyMons();
ResetPokemonStorageSystem();