public Universe Clone() { var ships = AllShips.Select(s => s.Clone()).ToArray(); return(new Universe(Planet, ships, Tick)); }
public void AdvanceGame() { var turn = this.GetOrCreateTurn(this.SimulationTimeStamp.TurnNumber); if (this.SimulationTimeStamp.TurnStep == TurnStep.EnergyAllocation) { AllShips.ForEach(x => { if (turn.EnergyAllocations.ContainsKey(x.ShipId)) { var energyAllocation = turn.EnergyAllocations[x.ShipId]; x.ExecuteDeclaredEnergyAllocation(energyAllocation); } else { var energyAllocation = x.CreateDefaultEnergyAllocation(); x.ExecuteDeclaredEnergyAllocation(energyAllocation); } }); this.SimulationTimeStamp = SimulationTimeStamp.Increment(); return; } if (this.SimulationTimeStamp.TurnStep == TurnStep.ImpulseProcess) { if (this.SimulationTimeStamp.ImpulseStep == ImpulseStep.SpeedChange) { this.SimulationTimeStamp = SimulationTimeStamp.Increment(); return; } if (this.SimulationTimeStamp.ImpulseStep == ImpulseStep.Movement) { AllShips.ForEach(x => { var declaredNavigation = turn.ImpulseProcessActions.GetDeclaredNavigation(x.ShipId, this.SimulationTimeStamp); ExecutePlottedNavigation(x, declaredNavigation); }); this.SimulationTimeStamp = SimulationTimeStamp.Increment(); return; } if (this.SimulationTimeStamp.ImpulseStep == ImpulseStep.OffensiveFire) { var fireDeclarations = AllShips.Select(x => turn.ImpulseProcessActions.GetOffensiveFire(x.ShipId, this.SimulationTimeStamp)) .Where(x => x != null).ToList(); ExecuteSimultaneousFireDeclarations(fireDeclarations); this.SimulationTimeStamp = SimulationTimeStamp.Increment(); return; } } if (this.SimulationTimeStamp.TurnStep == TurnStep.RepairPhase) { AllShips.ForEach(x => x.RolloverExcessEnergyIntoBatteries()); AllShips.ForEach(x => x.RechargeWeapons()); this.SimulationTimeStamp = SimulationTimeStamp.Increment(); return; } }