Class UnitMovementQueue
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
-
objectUnitMovementQueue
Constructors
UnitMovementQueue(UnitSystem, EventBus)
public UnitMovementQueue(UnitSystem unitSystem, EventBus eventBus = null)
Parameters
unitSystemUnitSystemeventBusEventBus
Methods
CancelMovement(ushort)
Cancel a unit's movement (unit stays at origin)
public void CancelMovement(ushort unitID)
Parameters
unitIDushort
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
unitIDushort
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
unitIDushort
Returns
- List<ushort>
IsUnitMoving(ushort)
Check if a unit is currently moving
public bool IsUnitMoving(ushort unitID)
Parameters
unitIDushort
Returns
- bool
LoadState(BinaryReader)
public void LoadState(BinaryReader reader)
Parameters
readerBinaryReader
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
writerBinaryWriter
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
unitIDushortUnit to move
destinationProvinceIDushortNext waypoint
movementDaysintDays to reach next waypoint
fullPathList<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
unitIDushortstateUnitMovementQueue.MovementState
Returns
- bool