예제 #1
0
        private void producingTick(MessageTick tick)
        {
            if (_model.TickForNextProduction <= tick.Tick)
            {
                if (_model.Owner != null)
                {
                    MessageProducedResources mpr = new MessageProducedResources(_bp.Produces, _model.Owner);
                    _planetC.ReceiveProducedResource(mpr);
                    _model.Producing = false;

                    //foreach (ResourceQuantity resQ in _bp.Produces)
                    //{
                    //    _actorTextOutput.Tell(_model.Name + " PRODUCES " + resQ.Quantity + " " + resQ.Type.ToString() + " " + tick.Tick.ToString());
                    //}
                }

                if (_model.AutoResumeProduction)
                {
                    requestResources(tick);
                }
                else
                {
                    _model.Producing = false;
                }
            }
        }
 private void receiveEngineRunCommand(MessageEngineRunCommand msg)
 {
     MessageTick pulse = new MessageTick(0);
     if (msg.RunCommand == EngineRunCommand.RunMax && _runState != TickEngineRunState.RunningMax)
     {
         cancelPulse();
         _numberOfIncompleteSS = _subscribedActorSolarSystems.Count();
         _runState = TickEngineRunState.RunningMax;
         startTicksTimer();
         receiveTick(pulse);
     }
     else if (msg.RunCommand == EngineRunCommand.RunPulse && _runState != TickEngineRunState.Running)
     {
         _runState = TickEngineRunState.Running;
         _runCancel = Context.System.Scheduler.ScheduleTellRepeatedlyCancelable(0, 5, Self, pulse, ActorRefs.Nobody);
         startTicksTimer();
         receiveTick(pulse);
     }
     else if (msg.RunCommand == EngineRunCommand.Stop && _runState != TickEngineRunState.Stopped)
     {
         _runState = TickEngineRunState.Stopped;
         cancelPulse();
         _secondTimer.Stop();
     }
 }
예제 #3
0
 private void receiveDefaultTick(MessageTick tick)
 {
     Object message = _agentC.Tick(tick);
     if (message != null)
         Sender.Tell(message);
     sendAgentCompletedMessage();
 }
예제 #4
0
 public void Tick(MessageTick tick)
 {
     if (_model.Producing)
     {
         producingTick(tick);
     }
     else if (_model.AutoResumeProduction || _model.ProduceNThenStop > 0)
     {
         requestResources(tick);
     }
 }
예제 #5
0
 private void receiveTick(MessageTick tick)
 {
     _curTick = tick.Tick;
     _solarSystemC.Tick(tick);
     foreach(IActorRef agentActor in _actorAgentValues)
     {
         agentActor.Tell(tick);
     }
     if (!_subscribedActorAgents.Any())
         sendSSCompletedMessage();
 }
예제 #6
0
 public void Tick(MessageTick tick)
 {
     if (_model.ShipState == ShipStateEnum.SpaceCruising && _model.DestinationScId != 0)
     {
         // move ship towards destination
         PointD newPoint = NavigationUtils.GetNewPointForShip(_model.Type.MaxCruisingSpeedKmH, _model.PositionX, _model.PositionY, _destination.PositionX, _destination.PositionY);
         _model.PositionX = newPoint.X;
         _model.PositionY = newPoint.Y;
         if (_model.PositionX == _destination.PositionX && _model.PositionY == _destination.PositionY)
         {
             // we are at our destination.
             MessageAgentDestinationReached msg = new MessageAgentDestinationReached(tick.Tick);
             _solarSystemC.SendMessageToAgent(_model.Pilot.AgentId, msg);
         }
     }
 }
예제 #7
0
 private object pilotingShip(MessageTick tick)
 {
     if (isPilotingShip())
     {
         if (_model.CurrentShipDestinationScId != _memory.CurrentDestinationScId)
         {
             IMessageShipCommandData msd = new MessageShipSetDestination(ShipCommandEnum.SetDestination, _memory.CurrentDestinationScId);
             MessageShipCommand msc = new MessageShipCommand(msd, tick.Tick, _model.CurrentShipId);
             ScPlanet curDest = StarChart.GetPlanet(_memory.CurrentDestinationScId);
             //_actorTextOutput.Tell("Agent Piloting Ship towards " + curDest.Name);
             return msc;
         }
     }
     return null;
 }
예제 #8
0
 private object pilotingDockedShip(MessageTick tick)
 {
     if (isPilotingShip())
     {
         setNewDestinationFromDocked();
         _currentState = InternalAgentState.PilotingAwaitingUndockingResponse;
         //_actorTextOutput.Tell("Agent Requesting Undock from " + _currentShip.DockedPlanet.Name);
         return new MessageShipCommand(new MessageShipBasic(ShipCommandEnum.Undock), tick.Tick, _model.CurrentShipId);
     }
     return null;
 }
예제 #9
0
 public void Tick(MessageTick tick)
 {
     updatePlanets(tick);
     updateShips(tick);
 }
예제 #10
0
 private void updateShips(MessageTick tick)
 {
     foreach (ShipController sc in _shipValues)
     {
         sc.Tick(tick);
     }
 }
예제 #11
0
 private void updatePlanets(MessageTick tick)
 {
     foreach (PlanetController pc in _planetValues)
     {
         pc.Tick(tick);
     }
 }
예제 #12
0
 private void updateProducers(MessageTick tick)
 {
     foreach (ProducerController pc in _producerCs)
     {
         pc.Tick(tick);
     }
 }
 private void receiveTick(MessageTick pulse)
 {
     _state.CurrentTick++;
     MessageTick tick = new MessageTick(_state.CurrentTick);
     foreach (IActorRef ssActor in _subscribedActorSolarSystems)
     {
         ssActor.Tell(tick);
     }
 }
예제 #14
0
 public void Tick(MessageTick tick)
 {
     movePlanetXY(tick);
     updateProducers(tick);
 }
예제 #15
0
        public object Tick(MessageTick tick)
        {
            object message = null;

            switch (_currentState)
            {
                case InternalAgentState.Planetside:
                case InternalAgentState.PilotingAwaitingUndockingResponse:
                case InternalAgentState.PilotingAwaitingDockingResponse:
                    break;
                case InternalAgentState.Piloting:
                    message = pilotingShip(tick);
                    break;
                case InternalAgentState.PilotingDockedShip:
                    message = pilotingDockedShip(tick);
                    break;
            }

            return message;
        }
예제 #16
0
 private void requestResources(MessageTick tick)
 {
     MessageRequestResources msg = new MessageRequestResources(_bp.Consumes, _model.Owner, tick.Tick);
     if (_planetC.ReceiveResourceRequest(msg))
     {
         _model.TickForNextProduction = msg.TickSent + _bp.BaseTicks;
         _model.Producing = true;
         _model.ProduceNThenStop--;
     }
     else
     {
         _model.Producing = false;
     }
 }
예제 #17
0
 private void movePlanetXY(MessageTick tick)
 {
     PointD pt = OrbitalUtils.CalcPositionFromTick(tick.Tick, _orbitHours, _scPlanet.OrbitKm);
     _model.PositionX = pt.X;
     _model.PositionY = pt.Y;
 }