pokeplatinum/src/vars_flags.c
Eduardo Quezada 6ef937a8eb
Define and use Var constants (#474)
* Missing uses of defined vars

* Vars 0x4000 to 0x402F with Var macros

* Vars 0x4000 to 0x402F with other macros

^ Conflicts:
^	res/field/scripts/scripts_amity_square.s
^	res/field/scripts/scripts_veilstone_city_southwest_house.s

* Other vars

* Special Flags

* Unk vars

* NUM_VARS

* `SPECIAL_VARS_START` -> `SCRIPT_LOCAL_VARS_START`

* `VAR_0x800C` -> `VAR_RESULT`

* `VAR_0x800D` -> `VAR_LAST_TALKED`

* Format

* VAR_MAP_LOCAL

* VAR_OBJ_GFX_ID

* STORY_VARS
2025-04-20 17:38:03 -07:00

70 lines
1.7 KiB
C

#include "vars_flags.h"
#include <nitro.h>
#include <string.h>
#include "constants/savedata/save_table.h"
#include "savedata.h"
#define GET_FLAG_BIT(flagID) (1 << (flagID % 8))
// TODO: where are these flags used, if ever?
static u8 sUnknownFlags[NUM_UNKNOWN_FLAGS / 8] = {};
int VarsFlags_SaveSize(void)
{
return sizeof(VarsFlags);
}
void VarsFlags_Init(VarsFlags *varsFlags)
{
memset(varsFlags, 0, sizeof(VarsFlags));
}
VarsFlags *SaveData_GetVarsFlags(SaveData *saveData)
{
return SaveData_SaveTable(saveData, SAVE_TABLE_ENTRY_VARS_FLAGS);
}
BOOL VarsFlags_CheckFlag(VarsFlags *varsFlags, u16 flagID)
{
u8 *flagChunk = VarsFlags_GetFlagChunk(varsFlags, flagID);
return flagChunk && *flagChunk & GET_FLAG_BIT(flagID);
}
void VarsFlags_SetFlag(VarsFlags *varsFlags, u16 flagID)
{
u8 *flagChunk = VarsFlags_GetFlagChunk(varsFlags, flagID);
if (flagChunk) {
*flagChunk |= GET_FLAG_BIT(flagID);
}
}
void VarsFlags_ClearFlag(VarsFlags *varsFlags, u16 flagID)
{
u8 *flagChunk = VarsFlags_GetFlagChunk(varsFlags, flagID);
if (flagChunk) {
*flagChunk &= 0xFF ^ GET_FLAG_BIT(flagID);
}
}
u8 *VarsFlags_GetFlagChunk(VarsFlags *varsFlags, u16 flagID)
{
if (flagID == 0) {
return NULL;
} else if (flagID < VARS_START) {
GF_ASSERT(flagID / 8 < NUM_FLAGS / 8);
return &varsFlags->flags[flagID / 8];
} else {
GF_ASSERT((flagID - VARS_START) / 8 < NUM_UNKNOWN_FLAGS / 8);
return &(sUnknownFlags[(flagID - VARS_START) / 8]);
}
}
u16 *VarsFlags_GetVarAddress(VarsFlags *varsFlags, u16 varID)
{
GF_ASSERT(varID - VARS_START < NUM_VARS);
return &varsFlags->vars[varID - VARS_START];
}