#include "global.h" #include "generational_changes.h" #include "malloc.h" #include "constants/generational_changes.h" #define UNPACK_CONFIG_GEN_CHANGES2(_name, _field, ...) ._field = B_##_name, const struct GenChanges sConfigChanges = { CONFIG_DEFINITIONS(UNPACK_CONFIG_GEN_CHANGES2) /* Expands to: .critChance = B_CRIT_CHANCE, .critMultiplier = B_CRIT_MULTIPLIER, */ }; #if TESTING EWRAM_DATA struct GenChanges *gConfigChangesTestOverride = NULL; #define UNPACK_CONFIG_OVERRIDE_GETTERS(_name, _field, ...) case CONFIG_##_name: return gConfigChangesTestOverride->_field; #define UNPACK_CONFIG_GETTERS(_name, _field, ...) case CONFIG_##_name: return sConfigChanges._field; #define UNPACK_CONFIG_CLAMPER(_name, _field, _typeMaxValue, ...) case CONFIG_##_name: clampedValue = min(GET_CONFIG_MAXIMUM(_typeMaxValue), newValue); break; #define UNPACK_CONFIG_SETTERS(_name, _field, _typeMaxValue, ...) case CONFIG_##_name: gConfigChangesTestOverride->_field = clampedValue; break; #else #define UNPACK_CONFIG_OVERRIDE_GETTERS(_name, _field, ...) case CONFIG_##_name: return sConfigChanges._field; #define UNPACK_CONFIG_GETTERS(_name, _field, ...) case CONFIG_##_name: return sConfigChanges._field; #define UNPACK_CONFIG_CLAMPER(_name, _field, ...) case CONFIG_##_name: return 0; #define UNPACK_CONFIG_SETTERS(_name, _field, ...) case CONFIG_##_name: return; #endif // Gets the value of a volatile status flag for a certain battler // Primarily used for the debug menu and scripts. Outside of it explicit references are preferred u32 GetConfig(enum ConfigTag _genConfig) { #if TESTING if (gConfigChangesTestOverride == NULL) { switch (_genConfig) { CONFIG_DEFINITIONS(UNPACK_CONFIG_GETTERS) /* Expands to: case CONFIG_CRIT_CHANCE: return gConfigChangesTestOverride->critChance; */ default: return 0; } } else #endif { switch (_genConfig) { CONFIG_DEFINITIONS(UNPACK_CONFIG_OVERRIDE_GETTERS) /* Expands to: case CONFIG_CRIT_CHANCE: return sConfigChanges.critChance; */ default: // Invalid config tag return 0; } } } #if TESTING u32 GetClampedValue(enum ConfigTag _genConfig, u32 newValue) { u32 clampedValue = 0; switch(_genConfig) { CONFIG_DEFINITIONS(UNPACK_CONFIG_CLAMPER) default: return 0; } return clampedValue; } #endif void SetConfig(enum ConfigTag _genConfig, u32 _value) { #if TESTING // Clamping is done here instead of the switch due to an internal compiler error! u32 clampedValue = GetClampedValue(_genConfig, _value); switch (_genConfig) { CONFIG_DEFINITIONS(UNPACK_CONFIG_SETTERS) /* Expands to: #if TESTING case CONFIG_CRIT_CHANCE: gConfigChangesTestOverride->critChance = clampedValue; break; #else case CONFIG_CRIT_CHANCE: return; #endif */ default: // Invalid config tag return; } #endif } #if TESTING void TestInitConfigData(void) { gConfigChangesTestOverride = Alloc(sizeof(sConfigChanges)); memcpy(gConfigChangesTestOverride, &sConfigChanges, sizeof(sConfigChanges)); } void TestFreeConfigData(void) { TRY_FREE_AND_SET_NULL(gConfigChangesTestOverride) } #endif