Ejemplo n.º 1
0
        public Universe Clone()
        {
            var ships = AllShips.Select(s => s.Clone()).ToArray();

            return(new Universe(Planet, ships, Tick));
        }
Ejemplo n.º 2
0
        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;
            }
        }