Struct ModifierSet
ENGINE: Fixed-size modifier storage (cache-friendly, deterministic) Uses fixed arrays for zero allocations and cache locality
Performance: O(1) lookup, 8KB per instance (512 types × 2 longs × 8 bytes) Memory layout: Contiguous arrays for additive and multiplicative values
DETERMINISM: Stores FixedPoint64.RawValue (long) for cross-platform compatibility Pattern used by: EU4 (modifier system), CK3 (character modifiers), Stellaris (empire modifiers)
public struct ModifierSet
Fields
MAX_MODIFIER_TYPES
public const int MAX_MODIFIER_TYPES = 512
Field Value
- int
Properties
HasActiveTypes
Check if any modifier type is active (has non-zero values)
public bool HasActiveTypes { get; }
Property Value
- bool
Methods
Add(ushort, FixedPoint64, bool)
Add a modifier (stacks with existing)
public void Add(ushort modifierTypeId, FixedPoint64 value, bool isMultiplicative)
Parameters
modifierTypeIdushortvalueFixedPoint64isMultiplicativebool
ApplyModifier(ushort, FixedPoint64)
Apply modifier to base value Formula: (base + additive) * (1 + multiplicative)
public FixedPoint64 ApplyModifier(ushort modifierTypeId, FixedPoint64 baseValue)
Parameters
modifierTypeIdushortbaseValueFixedPoint64
Returns
Clear()
Clear all modifiers (reset to zero) Uses UnsafeUtility.MemClear for fast bulk zeroing
public void Clear()
ClearActive()
Clear only active modifier types using bitmask, then zero the mask. Much faster than full Clear() when only 2-5 types are active out of 512.
public void ClearActive()
CopyActiveToSet(ref ModifierSet)
Copy only active (non-zero) modifier values from this set to target set. Uses bitmask to skip empty modifier types — typically iterates 2-5 types vs 512.
public void CopyActiveToSet(ref ModifierSet target)
Parameters
targetModifierSet
Get(ushort)
Get accumulated modifier value
public ModifierValue Get(ushort modifierTypeId)
Parameters
modifierTypeIdushort
Returns
Remove(ushort, FixedPoint64, bool)
Remove a modifier (for temporary effects)
public void Remove(ushort modifierTypeId, FixedPoint64 value, bool isMultiplicative)
Parameters
modifierTypeIdushortvalueFixedPoint64isMultiplicativebool
Set(ushort, FixedPoint64, bool)
Set modifier to exact value (replaces existing)
public void Set(ushort modifierTypeId, FixedPoint64 value, bool isMultiplicative)
Parameters
modifierTypeIdushortvalueFixedPoint64isMultiplicativebool