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
IsDirty
Whether this scope needs rebuilding
public bool IsDirty { 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
ApplyModifierFromCache(ushort, FixedPoint64)
Apply modifier from cached set without rebuild check. Only call when you know the scope is NOT dirty (check IsDirty first).
public FixedPoint64 ApplyModifierFromCache(ushort modifierTypeId, FixedPoint64 baseValue)
Parameters
modifierTypeIdushortbaseValueFixedPoint64
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?
RebuildIfDirtyFromParentPtr(ScopedModifierContainer*)
Rebuild modifier set using an unsafe pointer to parent scope (avoids 8KB struct copy). Parent must already be clean (call EnsureCountryScopeClean first).
public void RebuildIfDirtyFromParentPtr(ScopedModifierContainer* parentPtr)
Parameters
parentPtrScopedModifierContainer*
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