public void Update(WorldManager world, DwarfTime time) { int hour = world.Time.CurrentDate.Hour; bool shouldEat = TimeDiff(hour, HourOfLastEating) > 12; if (_prevHour < 0) { _prevHour = hour; } int timeDiff = TimeDiff(hour, _prevHour); if (timeDiff > 0) { _prevHour = hour; MaybeDelay(world); } switch (AdventureState) { case State.None: { var balloonPorts = world.PlayerFaction.GetRooms().OfType <BalloonPort>().ToList(); if (balloonPorts.Count == 0) { LastEvent = "The adventuring party was cancelled, no balloon port."; AdventureState = State.Done; break; } foreach (var creature in Party) { if (!(creature.CurrentTask is GoToZoneTask)) { creature.AssignTask(new GoToZoneTask(balloonPorts.First()) { Priority = Task.PriorityType.High, Wait = true }); } } AdventureState = State.Starting; Vehicle = EntityFactory.CreateEntity <Balloon>("Balloon", balloonPorts.First().GetBoundingBox().Center() + Vector3.Up * 10); Vehicle.GetComponent <BalloonAI>().State = BalloonAI.BalloonState.Waiting; Vehicle.GetComponent <BalloonAI>().WaitTimer.Reset(); break; } case State.Starting: { if (Vehicle != null) { Vehicle.GetComponent <BalloonAI>().State = BalloonAI.BalloonState.Waiting; Vehicle.GetComponent <BalloonAI>().WaitTimer.Reset(); } var balloonPorts = world.PlayerFaction.GetRooms().OfType <BalloonPort>().ToList(); if (balloonPorts.Count == 0) { LastEvent = "The adventuring party was cancelled, no balloon port."; foreach (var creature in Party) { ReturnCreature(creature); if (creature.CurrentTask is GoToZoneTask) { creature.CancelCurrentTask(); } } AdventureState = State.Done; break; } var port = balloonPorts.First(); Party.RemoveAll(creature => creature.IsDead); if (Party.Count == 0) { LastEvent = "The adventuring party was cancelled, no more members."; AdventureState = State.Done; break; } bool allOnZone = true; foreach (var creature in Party.Where(c => c.Active)) { if (!port.IsRestingOnZone(creature.Position)) { if (!(creature.CurrentTask is GoToZoneTask)) { creature.AssignTask(new GoToZoneTask(balloonPorts.First()) { Priority = Task.PriorityType.High, Wait = true }); } allOnZone = false; break; } else { DestroyCreature(creature); allOnZone = false; } } if (allOnZone) { Vehicle.GetComponent <BalloonAI>().State = BalloonAI.BalloonState.Leaving; OnStart(world); AdventureState = State.TravelingtoDestination; } break; } case State.TravelingtoDestination: { RemainingTravelTime -= new TimeSpan(0, timeDiff, 0, 0, 0); if (shouldEat) { Eat(world.Time.CurrentDate); if (AdventureState == State.Done) { break; } } if (RemainingTravelTime.TotalHours < 1) { this.LastEvent = String.Format("The adventuring party has arrived at {0}", DestinationFaction); AdventureState = State.PerformingAction; ActionTimer = new Timer(ActionTimeMinutes * 60.0f, true); OnArrival(world); } break; } case State.PerformingAction: { ActionTimer.Update(time); if (ActionTimer.HasTriggered) { OnAction(world); AdventureState = State.ComingBack; RemainingTravelTime = GetETA(world); } break; } case State.ComingBack: { RemainingTravelTime -= new TimeSpan(0, timeDiff, 0, 0, 0); if (shouldEat) { Eat(world.Time.CurrentDate); if (AdventureState == State.Done) { break; } } if (RemainingTravelTime.TotalHours < 1) { var balloonPorts = world.PlayerFaction.GetRooms().OfType <BalloonPort>().ToList(); Vector3 location = world.Camera.Position; if (balloonPorts.Count != 0) { location = balloonPorts.First().GetBoundingBox().Center() + Vector3.Up * 10; } if (Vehicle == null || Vehicle.IsDead) { Vehicle = EntityFactory.CreateEntity <Balloon>("Balloon", location); } Vehicle.GetComponent <BalloonAI>().State = BalloonAI.BalloonState.DeliveringGoods; OnReturn(world); AdventureState = State.Done; } break; } case State.Done: { if (Vehicle != null) { Vehicle.GetRoot().Delete(); } break; } } }