Table of Contents

Class ModifierSystem

Namespace
Core.Modifiers
Assembly
Core.dll

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
object
ModifierSystem

Constructors

ModifierSystem(int, int)

Initialize the modifier system

public ModifierSystem(int maxCountries = 256, int maxProvinces = 8192)

Parameters

maxCountries int
maxProvinces int

Methods

AddCountryModifier(ushort, ModifierSource)

Add a country modifier (inherited by country provinces)

public bool AddCountryModifier(ushort countryId, ModifierSource source)

Parameters

countryId ushort
source ModifierSource

Returns

bool

AddGlobalModifier(ModifierSource)

Add a global modifier (inherited by all)

public bool AddGlobalModifier(ModifierSource source)

Parameters

source ModifierSource

Returns

bool

AddProvinceModifier(ushort, ModifierSource)

Add a province modifier (local only)

public bool AddProvinceModifier(ushort provinceId, ModifierSource source)

Parameters

provinceId ushort
source ModifierSource

Returns

bool

ClearCountryModifiers(ushort)

Remove all modifiers from a country scope Returns count of modifiers removed

public int ClearCountryModifiers(ushort countryId)

Parameters

countryId ushort

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

provinceId ushort

Returns

int

CountCountryModifiersBySource(ushort, SourceType, uint)

Count country modifiers from a specific source

public int CountCountryModifiersBySource(ushort countryId, ModifierSource.SourceType sourceType, uint sourceId)

Parameters

countryId ushort
sourceType ModifierSource.SourceType
sourceId uint

Returns

int

CountProvinceModifiersBySource(ushort, SourceType, uint)

Count province modifiers from a specific source

public int CountProvinceModifiersBySource(ushort provinceId, ModifierSource.SourceType sourceType, uint sourceId)

Parameters

provinceId ushort
sourceType ModifierSource.SourceType
sourceId uint

Returns

int

Dispose()

Dispose native collections

public void Dispose()

ExpireModifiers(int)

Expire temporary modifiers (call every game tick)

public void ExpireModifiers(int currentTick)

Parameters

currentTick int

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

countryId ushort
sourceType ModifierSource.SourceType
sourceId uint
action Action<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

countryId ushort
action Action<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

sourceType ModifierSource.SourceType
sourceId uint
action Action<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

provinceId ushort
sourceType ModifierSource.SourceType
sourceId uint
action Action<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

provinceId ushort
countryId ushort
modifierTypeId ushort
action Action<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

provinceId ushort
countryId ushort
action Action<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

countryId ushort
modifierTypeId ushort
baseValue FixedPoint64

Returns

FixedPoint64

GetGlobalModifier(ushort, FixedPoint64)

Get global modifier value

public FixedPoint64 GetGlobalModifier(ushort modifierTypeId, FixedPoint64 baseValue)

Parameters

modifierTypeId ushort
baseValue FixedPoint64

Returns

FixedPoint64

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

provinceId ushort
countryId ushort
modifierTypeId ushort
baseValue FixedPoint64

Returns

FixedPoint64

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

countryId ushort
sourceType ModifierSource.SourceType
sourceId uint

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

provinceId ushort
sourceType ModifierSource.SourceType
sourceId uint

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

reader BinaryReader

RemoveCountryModifiersBySource(ushort, SourceType, uint)

Remove country modifiers by source

public int RemoveCountryModifiersBySource(ushort countryId, ModifierSource.SourceType sourceType, uint sourceId)

Parameters

countryId ushort
sourceType ModifierSource.SourceType
sourceId uint

Returns

int

RemoveGlobalModifiersBySource(SourceType, uint)

Remove global modifiers by source

public int RemoveGlobalModifiersBySource(ModifierSource.SourceType sourceType, uint sourceId)

Parameters

sourceType ModifierSource.SourceType
sourceId uint

Returns

int

RemoveProvinceModifiersBySource(ushort, SourceType, uint)

Remove province modifiers by source

public int RemoveProvinceModifiersBySource(ushort provinceId, ModifierSource.SourceType sourceType, uint sourceId)

Parameters

provinceId ushort
sourceType ModifierSource.SourceType
sourceId uint

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

provinceId ushort
sourceType ModifierSource.SourceType
sourceId uint
modifierTypeId ushort

Returns

int

SaveState(BinaryWriter)

Save ModifierSystem state to binary writer Serializes: capacities, global scope, country scopes, province scopes

public void SaveState(BinaryWriter writer)

Parameters

writer BinaryWriter