Struct ScopedModifierContainer
ENGINE: Container for modifiers with scope inheritance Pattern used by: EU4 (province ← country ← global), CK3 (character ← dynasty ← culture)
Scope Hierarchy:
- Province modifiers (local only)
- Country modifiers (inherited by all provinces)
- Global modifiers (inherited by everyone)
Design:
- ActiveModifierList for local modifiers
- Reference to parent scope (optional)
- Cached ModifierSet (dirty flag optimization)
- Rebuild only when modifiers change
Performance: O(n) rebuild where n = local + inherited modifiers Cached lookups: O(1) after rebuild
public struct ScopedModifierContainer
Properties
HasLocalModifiers
Check if this container has any local modifiers
public bool HasLocalModifiers { get; }
Property Value
- bool
LocalModifierCount
Get count of local modifiers
public int LocalModifierCount { get; }
Property Value
- int
Methods
Add(ModifierSource)
Add a modifier to this scope
public bool Add(ModifierSource source)
Parameters
sourceModifierSource
Returns
- bool
ApplyModifier(ushort, FixedPoint64, ScopedModifierContainer?)
Apply modifier to a base value (rebuilds if dirty)
public FixedPoint64 ApplyModifier(ushort modifierTypeId, FixedPoint64 baseValue, ScopedModifierContainer? parentScope = null)
Parameters
modifierTypeIdushortbaseValueFixedPoint64parentScopeScopedModifierContainer?
Returns
Clear()
Clear all local modifiers
public void Clear()
CountLocalModifiersBySource(SourceType, uint)
Count local modifiers from a specific source
public int CountLocalModifiersBySource(ModifierSource.SourceType sourceType, uint sourceId)
Parameters
sourceTypeModifierSource.SourceTypesourceIduint
Returns
- int
Create(int, Allocator)
Create a new scoped modifier container
public static ScopedModifierContainer Create(int capacity = 64, Allocator allocator = Allocator.Persistent)
Parameters
capacityintallocatorAllocator
Returns
Dispose()
Dispose native collections
public void Dispose()
ExpireModifiers(int)
Expire temporary modifiers
public int ExpireModifiers(int currentTick)
Parameters
currentTickint
Returns
- int
ForEachLocalModifier(Action<ModifierSource>)
Iterate over local modifiers (for debugging/tooltips)
public void ForEachLocalModifier(Action<ModifierSource> action)
Parameters
actionAction<ModifierSource>
ForEachLocalModifierBySource(SourceType, uint, Action<ModifierSource>)
Iterate over local modifiers from a specific source
public void ForEachLocalModifierBySource(ModifierSource.SourceType sourceType, uint sourceId, Action<ModifierSource> action)
Parameters
sourceTypeModifierSource.SourceTypesourceIduintactionAction<ModifierSource>
ForEachLocalModifierByType(ushort, Action<ModifierSource>)
Iterate over local modifiers of a specific modifier type
public void ForEachLocalModifierByType(ushort modifierTypeId, Action<ModifierSource> action)
Parameters
modifierTypeIdushortactionAction<ModifierSource>
GetModifierSet(ScopedModifierContainer?)
Get the final modifier set (rebuilds if dirty)
public ModifierSet GetModifierSet(ScopedModifierContainer? parentScope = null)
Parameters
parentScopeScopedModifierContainer?
Returns
MarkDirty()
Mark this container as dirty (forces rebuild on next access) Use this when parent scope changes
public void MarkDirty()
RebuildIfDirty(ScopedModifierContainer?)
Rebuild modifier set from local + inherited modifiers
public void RebuildIfDirty(ScopedModifierContainer? parentScope = null)
Parameters
parentScopeScopedModifierContainer?
RemoveBySource(SourceType, uint)
Remove modifiers from a specific source
public int RemoveBySource(ModifierSource.SourceType sourceType, uint sourceId)
Parameters
sourceTypeModifierSource.SourceTypesourceIduint
Returns
- int
RemoveBySourceAndType(SourceType, uint, ushort)
Remove modifiers of a specific type from a specific source
public int RemoveBySourceAndType(ModifierSource.SourceType sourceType, uint sourceId, ushort modifierTypeId)
Parameters
sourceTypeModifierSource.SourceTypesourceIduintmodifierTypeIdushort
Returns
- int