Table of Contents

Struct ModifierSet

Namespace
Core.Modifiers
Assembly
Core.dll

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

modifierTypeId ushort
value FixedPoint64
isMultiplicative bool

ApplyModifier(ushort, FixedPoint64)

Apply modifier to base value Formula: (base + additive) * (1 + multiplicative)

public FixedPoint64 ApplyModifier(ushort modifierTypeId, FixedPoint64 baseValue)

Parameters

modifierTypeId ushort
baseValue FixedPoint64

Returns

FixedPoint64

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

target ModifierSet

Get(ushort)

Get accumulated modifier value

public ModifierValue Get(ushort modifierTypeId)

Parameters

modifierTypeId ushort

Returns

ModifierValue

Remove(ushort, FixedPoint64, bool)

Remove a modifier (for temporary effects)

public void Remove(ushort modifierTypeId, FixedPoint64 value, bool isMultiplicative)

Parameters

modifierTypeId ushort
value FixedPoint64
isMultiplicative bool

Set(ushort, FixedPoint64, bool)

Set modifier to exact value (replaces existing)

public void Set(ushort modifierTypeId, FixedPoint64 value, bool isMultiplicative)

Parameters

modifierTypeId ushort
value FixedPoint64
isMultiplicative bool