Table of Contents

Class UnitSystem

Namespace
Core.Units
Assembly
Core.dll

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

Constructors

UnitSystem(int, EventBus)

public UnitSystem(int initialCapacity = 10000, EventBus eventBus = null)

Parameters

initialCapacity int
eventBus EventBus

Properties

MovementQueue

Get the movement queue for time-based movement

public UnitMovementQueue MovementQueue { get; }

Property Value

UnitMovementQueue

Methods

AddTroops(ushort, ushort)

Add troops to unit (reinforcement)

public void AddTroops(ushort unitID, ushort amount)

Parameters

unitID ushort
amount ushort

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

provinceID ushort
countryID ushort
unitTypeID ushort
troopCount ushort

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

provinceID ushort
countryID ushort
unitTypeID ushort
unitCount ushort

Returns

ushort

DisbandUnit(ushort, DestructionReason)

Disband a unit and recycle its ID.

public void DisbandUnit(ushort unitID, DestructionReason reason = DestructionReason.Disbanded)

Parameters

unitID ushort
reason DestructionReason

Dispose()

public void Dispose()

GetColdData(ushort)

Get or create cold data for a unit

public UnitColdData GetColdData(ushort unitID)

Parameters

unitID ushort

Returns

UnitColdData

GetCountryUnitCount(ushort)

Get count of units owned by a country

public int GetCountryUnitCount(ushort countryID)

Parameters

countryID ushort

Returns

int

GetCountryUnits(ushort)

Get all unit IDs owned by a country

public List<ushort> GetCountryUnits(ushort countryID)

Parameters

countryID ushort

Returns

List<ushort>

GetUnit(ushort)

Get unit state by ID

public UnitState GetUnit(ushort unitID)

Parameters

unitID ushort

Returns

UnitState

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

provinceID ushort

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

provinceID ushort

Returns

List<ushort>

HasColdData(ushort)

Check if unit has cold data

public bool HasColdData(ushort unitID)

Parameters

unitID ushort

Returns

bool

HasUnit(ushort)

Does this unit exist?

public bool HasUnit(ushort unitID)

Parameters

unitID ushort

Returns

bool

LoadState(BinaryReader)

public void LoadState(BinaryReader reader)

Parameters

reader BinaryReader

MoveUnit(ushort, ushort)

Move unit to a new province. Updates sparse mappings automatically.

public void MoveUnit(ushort unitID, ushort newProvinceID)

Parameters

unitID ushort
newProvinceID ushort

RemoveTroops(ushort, ushort)

Remove troops from unit (combat losses)

public void RemoveTroops(ushort unitID, ushort amount)

Parameters

unitID ushort
amount ushort

SaveState(BinaryWriter)

public void SaveState(BinaryWriter writer)

Parameters

writer BinaryWriter

SetUnitCount(ushort, ushort)

Set unit count (RISK-style troop count)

public void SetUnitCount(ushort unitID, ushort count)

Parameters

unitID ushort
count ushort