Class ModifierSystem
ENGINE: Central manager for all modifier scopes (global, country, province) Pattern used by: EU4 (modifier system), CK3 (effect manager), Stellaris (empire modifiers)
Architecture:
- Global scope (inherited by all)
- Country scopes (inherited by country provinces)
- Province scopes (local only)
Scope Inheritance: Province Final = Province Local + Country + Global
Performance:
- O(1) scope lookup
- O(n) rebuild where n = active modifiers in scope chain
- Dirty flag optimization (only rebuild when changed)
Multiplayer Safe:
- Deterministic operations only
- Fixed-size allocations
- Command-based modifications
public class ModifierSystem
- Inheritance
-
objectModifierSystem
Constructors
ModifierSystem(int, int)
Initialize the modifier system
public ModifierSystem(int maxCountries = 256, int maxProvinces = 8192)
Parameters
maxCountriesintmaxProvincesint
Methods
AddCountryModifier(ushort, ModifierSource)
Add a country modifier (inherited by country provinces)
public bool AddCountryModifier(ushort countryId, ModifierSource source)
Parameters
countryIdushortsourceModifierSource
Returns
- bool
AddGlobalModifier(ModifierSource)
Add a global modifier (inherited by all)
public bool AddGlobalModifier(ModifierSource source)
Parameters
sourceModifierSource
Returns
- bool
AddProvinceModifier(ushort, ModifierSource)
Add a province modifier (local only)
public bool AddProvinceModifier(ushort provinceId, ModifierSource source)
Parameters
provinceIdushortsourceModifierSource
Returns
- bool
ClearCountryModifiers(ushort)
Remove all modifiers from a country scope Returns count of modifiers removed
public int ClearCountryModifiers(ushort countryId)
Parameters
countryIdushort
Returns
- int
ClearGlobalModifiers()
Remove all global modifiers Returns count of modifiers removed
public int ClearGlobalModifiers()
Returns
- int
ClearProvinceModifiers(ushort)
Remove all modifiers from a province scope Returns count of modifiers removed
public int ClearProvinceModifiers(ushort provinceId)
Parameters
provinceIdushort
Returns
- int
CountCountryModifiersBySource(ushort, SourceType, uint)
Count country modifiers from a specific source
public int CountCountryModifiersBySource(ushort countryId, ModifierSource.SourceType sourceType, uint sourceId)
Parameters
countryIdushortsourceTypeModifierSource.SourceTypesourceIduint
Returns
- int
CountProvinceModifiersBySource(ushort, SourceType, uint)
Count province modifiers from a specific source
public int CountProvinceModifiersBySource(ushort provinceId, ModifierSource.SourceType sourceType, uint sourceId)
Parameters
provinceIdushortsourceTypeModifierSource.SourceTypesourceIduint
Returns
- int
Dispose()
Dispose native collections
public void Dispose()
ExpireModifiers(int)
Expire temporary modifiers (call every game tick)
public void ExpireModifiers(int currentTick)
Parameters
currentTickint
ForEachCountryModifierBySource(ushort, SourceType, uint, Action<ModifierSource>)
Iterate over country modifiers from a specific source
public void ForEachCountryModifierBySource(ushort countryId, ModifierSource.SourceType sourceType, uint sourceId, Action<ModifierSource> action)
Parameters
countryIdushortsourceTypeModifierSource.SourceTypesourceIduintactionAction<ModifierSource>
ForEachCountryModifierWithInheritance(ushort, Action<ModifierSource, ModifierScopeLevel>)
Iterate over all country modifiers with global inheritance (Country + Global)
public void ForEachCountryModifierWithInheritance(ushort countryId, Action<ModifierSource, ModifierScopeLevel> action)
Parameters
countryIdushortactionAction<ModifierSource, ModifierScopeLevel>
ForEachGlobalModifierBySource(SourceType, uint, Action<ModifierSource>)
Iterate over global modifiers from a specific source
public void ForEachGlobalModifierBySource(ModifierSource.SourceType sourceType, uint sourceId, Action<ModifierSource> action)
Parameters
sourceTypeModifierSource.SourceTypesourceIduintactionAction<ModifierSource>
ForEachProvinceModifierBySource(ushort, SourceType, uint, Action<ModifierSource>)
Iterate over province modifiers from a specific source (local only - not inherited) Useful for UI showing what modifiers a specific building/tech adds
public void ForEachProvinceModifierBySource(ushort provinceId, ModifierSource.SourceType sourceType, uint sourceId, Action<ModifierSource> action)
Parameters
provinceIdushortsourceTypeModifierSource.SourceTypesourceIduintactionAction<ModifierSource>
ForEachProvinceModifierByType(ushort, ushort, ushort, Action<ModifierSource, ModifierScopeLevel>)
Iterate over province modifiers of a specific modifier type (with inheritance) Useful for tooltips showing all sources affecting a specific stat
public void ForEachProvinceModifierByType(ushort provinceId, ushort countryId, ushort modifierTypeId, Action<ModifierSource, ModifierScopeLevel> action)
Parameters
provinceIdushortcountryIdushortmodifierTypeIdushortactionAction<ModifierSource, ModifierScopeLevel>
ForEachProvinceModifierWithInheritance(ushort, ushort, Action<ModifierSource, ModifierScopeLevel>)
Iterate over all province modifiers with full inheritance (Province + Country + Global) Useful for tooltips showing all modifier sources affecting a province
public void ForEachProvinceModifierWithInheritance(ushort provinceId, ushort countryId, Action<ModifierSource, ModifierScopeLevel> action)
Parameters
provinceIdushortcountryIdushortactionAction<ModifierSource, ModifierScopeLevel>
GetCountryModifier(ushort, ushort, FixedPoint64)
Get country modifier value with global inheritance Country Final = Country Local + Global
public FixedPoint64 GetCountryModifier(ushort countryId, ushort modifierTypeId, FixedPoint64 baseValue)
Parameters
countryIdushortmodifierTypeIdushortbaseValueFixedPoint64
Returns
GetGlobalModifier(ushort, FixedPoint64)
Get global modifier value
public FixedPoint64 GetGlobalModifier(ushort modifierTypeId, FixedPoint64 baseValue)
Parameters
modifierTypeIdushortbaseValueFixedPoint64
Returns
GetProvinceModifier(ushort, ushort, ushort, FixedPoint64)
Get province modifier value with full scope inheritance Province Final = Province Local + Country + Global
public FixedPoint64 GetProvinceModifier(ushort provinceId, ushort countryId, ushort modifierTypeId, FixedPoint64 baseValue)
Parameters
provinceIdushortcountryIdushortmodifierTypeIdushortbaseValueFixedPoint64
Returns
HasCountryModifiersFromSource(ushort, SourceType, uint)
Check if a source has any modifiers on a country
public bool HasCountryModifiersFromSource(ushort countryId, ModifierSource.SourceType sourceType, uint sourceId)
Parameters
countryIdushortsourceTypeModifierSource.SourceTypesourceIduint
Returns
- bool
HasProvinceModifiersFromSource(ushort, SourceType, uint)
Check if a source has any modifiers on a province
public bool HasProvinceModifiersFromSource(ushort provinceId, ModifierSource.SourceType sourceType, uint sourceId)
Parameters
provinceIdushortsourceTypeModifierSource.SourceTypesourceIduint
Returns
- bool
LoadState(BinaryReader)
Load ModifierSystem state from binary reader Restores: capacities, global scope, country scopes, province scopes Note: Must be called AFTER Initialize() with matching capacities
public void LoadState(BinaryReader reader)
Parameters
readerBinaryReader
RemoveCountryModifiersBySource(ushort, SourceType, uint)
Remove country modifiers by source
public int RemoveCountryModifiersBySource(ushort countryId, ModifierSource.SourceType sourceType, uint sourceId)
Parameters
countryIdushortsourceTypeModifierSource.SourceTypesourceIduint
Returns
- int
RemoveGlobalModifiersBySource(SourceType, uint)
Remove global modifiers by source
public int RemoveGlobalModifiersBySource(ModifierSource.SourceType sourceType, uint sourceId)
Parameters
sourceTypeModifierSource.SourceTypesourceIduint
Returns
- int
RemoveProvinceModifiersBySource(ushort, SourceType, uint)
Remove province modifiers by source
public int RemoveProvinceModifiersBySource(ushort provinceId, ModifierSource.SourceType sourceType, uint sourceId)
Parameters
provinceIdushortsourceTypeModifierSource.SourceTypesourceIduint
Returns
- int
RemoveProvinceModifiersBySourceAndType(ushort, SourceType, uint, ushort)
Remove province modifiers by source and type
public int RemoveProvinceModifiersBySourceAndType(ushort provinceId, ModifierSource.SourceType sourceType, uint sourceId, ushort modifierTypeId)
Parameters
provinceIdushortsourceTypeModifierSource.SourceTypesourceIduintmodifierTypeIdushort
Returns
- int
SaveState(BinaryWriter)
Save ModifierSystem state to binary writer Serializes: capacities, global scope, country scopes, province scopes
public void SaveState(BinaryWriter writer)
Parameters
writerBinaryWriter