Table of Contents

Class UnitMovementQueue

Namespace
Core.Units
Assembly
Core.dll

Tracks units that are currently in transit between provinces. Implements EU4-style time-based movement: units take X days to move.

DESIGN:

  • Dictionary tracks moving units: unitID → MovementState
  • Each day, decrement daysRemaining for all moving units
  • When daysRemaining reaches 0, move unit to destination
  • Units can cancel movement mid-transit (return to origin)

PERFORMANCE:

  • Sparse storage: Only tracks moving units (not all units)
  • Daily tick processes O(n) where n = units currently moving
  • Typically 10-100 units moving at once (not 10k)
  • ZERO ALLOCATIONS: Pre-allocated buffers for daily tick processing
public class UnitMovementQueue
Inheritance
object
UnitMovementQueue

Constructors

UnitMovementQueue(UnitSystem, EventBus)

public UnitMovementQueue(UnitSystem unitSystem, EventBus eventBus = null)

Parameters

unitSystem UnitSystem
eventBus EventBus

Methods

CancelMovement(ushort)

Cancel a unit's movement (unit stays at origin)

public void CancelMovement(ushort unitID)

Parameters

unitID ushort

GetFullPath(ushort)

Get full movement path for visualization (current position + all waypoints) Returns empty list if unit is not moving

public List<ushort> GetFullPath(ushort unitID)

Parameters

unitID ushort

Returns

List<ushort>

GetMovingUnitCount()

Get count of units currently moving

public int GetMovingUnitCount()

Returns

int

GetMovingUnits()

Get all moving unit IDs

public IEnumerable<ushort> GetMovingUnits()

Returns

IEnumerable<ushort>

GetRemainingPath(ushort)

Get remaining path for a unit (for UI visualization)

public List<ushort> GetRemainingPath(ushort unitID)

Parameters

unitID ushort

Returns

List<ushort>

IsUnitMoving(ushort)

Check if a unit is currently moving

public bool IsUnitMoving(ushort unitID)

Parameters

unitID ushort

Returns

bool

LoadState(BinaryReader)

public void LoadState(BinaryReader reader)

Parameters

reader BinaryReader

ProcessDailyTick()

Process daily tick - advance all movements Called by TimeManager on daily tick ZERO ALLOCATIONS: Uses pre-allocated buffers

public void ProcessDailyTick()

SaveState(BinaryWriter)

public void SaveState(BinaryWriter writer)

Parameters

writer BinaryWriter

StartMovement(ushort, ushort, int, List<ushort>)

Start a unit moving toward a destination Supports multi-hop paths for pathfinding

public void StartMovement(ushort unitID, ushort destinationProvinceID, int movementDays, List<ushort> fullPath = null)

Parameters

unitID ushort

Unit to move

destinationProvinceID ushort

Next waypoint

movementDays int

Days to reach next waypoint

fullPath List<ushort>

Optional: Full path including all waypoints (for multi-hop movement)

TryGetMovementState(ushort, out MovementState)

Get movement state for a unit (returns false if not moving)

public bool TryGetMovementState(ushort unitID, out UnitMovementQueue.MovementState state)

Parameters

unitID ushort
state UnitMovementQueue.MovementState

Returns

bool