Class UnitSystem
Central manager for all units in the game.
ARCHITECTURE:
- Hot data: NativeArray of UnitState (8 bytes each)
- Sparse mapping: Province → Unit IDs (scales with actual units, not possible units)
- Cold data: Dictionary for rare data (custom names, history, etc.)
- Movement data: Separate NativeArray for movement points (2 bytes per unit)
PERFORMANCE:
- 10k units × 8 bytes = 80KB hot data
- 10k units × 2 bytes = 20KB movement data
- Sparse collections scale with usage (not possibility)
- GetUnitsInProvince() is O(m) where m = units in province (typically 1-10)
PERSISTENCE:
- SaveState/LoadState for all data
- Atomic unit ID assignment (deterministic)
- Command pattern ensures multiplayer safety
public class UnitSystem
- Inheritance
-
objectUnitSystem
Constructors
UnitSystem(int, EventBus)
public UnitSystem(int initialCapacity = 10000, EventBus eventBus = null)
Parameters
initialCapacityinteventBusEventBus
Properties
MovementQueue
Get the movement queue for time-based movement
public UnitMovementQueue MovementQueue { get; }
Property Value
Methods
AddTroops(ushort, ushort)
Add troops to unit (reinforcement)
public void AddTroops(ushort unitID, ushort amount)
Parameters
unitIDushortamountushort
CreateUnit(ushort, ushort, ushort, ushort)
Create a new unit with specified troop count (RISK-style). Returns the assigned unit ID (1-65535).
public ushort CreateUnit(ushort provinceID, ushort countryID, ushort unitTypeID, ushort troopCount = 1)
Parameters
provinceIDushortcountryIDushortunitTypeIDushorttroopCountushort
Returns
- ushort
CreateUnitWithStats(ushort, ushort, ushort, ushort)
Create a unit with custom stats (for loading saves, reinforcements, etc.)
public ushort CreateUnitWithStats(ushort provinceID, ushort countryID, ushort unitTypeID, ushort unitCount)
Parameters
provinceIDushortcountryIDushortunitTypeIDushortunitCountushort
Returns
- ushort
DisbandUnit(ushort, DestructionReason)
Disband a unit and recycle its ID.
public void DisbandUnit(ushort unitID, DestructionReason reason = DestructionReason.Disbanded)
Parameters
unitIDushortreasonDestructionReason
Dispose()
public void Dispose()
GetColdData(ushort)
Get or create cold data for a unit
public UnitColdData GetColdData(ushort unitID)
Parameters
unitIDushort
Returns
GetCountryUnitCount(ushort)
Get count of units owned by a country
public int GetCountryUnitCount(ushort countryID)
Parameters
countryIDushort
Returns
- int
GetCountryUnits(ushort)
Get all unit IDs owned by a country
public List<ushort> GetCountryUnits(ushort countryID)
Parameters
countryIDushort
Returns
- List<ushort>
GetUnit(ushort)
Get unit state by ID
public UnitState GetUnit(ushort unitID)
Parameters
unitIDushort
Returns
GetUnitCount()
Get total unit count in the game
public int GetUnitCount()
Returns
- int
GetUnitCountInProvince(ushort)
Get count of units in a province
public int GetUnitCountInProvince(ushort provinceID)
Parameters
provinceIDushort
Returns
- int
GetUnitsInProvince(ushort)
Get all unit IDs in a province (O(m) where m = units in province)
public List<ushort> GetUnitsInProvince(ushort provinceID)
Parameters
provinceIDushort
Returns
- List<ushort>
HasColdData(ushort)
Check if unit has cold data
public bool HasColdData(ushort unitID)
Parameters
unitIDushort
Returns
- bool
HasUnit(ushort)
Does this unit exist?
public bool HasUnit(ushort unitID)
Parameters
unitIDushort
Returns
- bool
LoadState(BinaryReader)
public void LoadState(BinaryReader reader)
Parameters
readerBinaryReader
MoveUnit(ushort, ushort)
Move unit to a new province. Updates sparse mappings automatically.
public void MoveUnit(ushort unitID, ushort newProvinceID)
Parameters
unitIDushortnewProvinceIDushort
RemoveTroops(ushort, ushort)
Remove troops from unit (combat losses)
public void RemoveTroops(ushort unitID, ushort amount)
Parameters
unitIDushortamountushort
SaveState(BinaryWriter)
public void SaveState(BinaryWriter writer)
Parameters
writerBinaryWriter
SetUnitCount(ushort, ushort)
Set unit count (RISK-style troop count)
public void SetUnitCount(ushort unitID, ushort count)
Parameters
unitIDushortcountushort