public override void Update(DwarfTime gameTime, ChunkManager chunks, Camera camera) { IdleTimer.Update(gameTime); SpeakTimer.Update(gameTime); OrderEnemyAttack(); DeleteBadTasks(); PreEmptTasks(); if (Status.Energy.IsUnhappy() && PlayState.Time.IsNight()) { Task toReturn = new SatisfyTirednessTask(); toReturn.SetupScript(Creature); if (!Tasks.Contains(toReturn)) { Tasks.Add(toReturn); } } if (Status.Hunger.IsUnhappy() && Faction.CountResourcesWithTag(Resource.ResourceTags.Food) > 0) { Task toReturn = new SatisfyHungerTask(); toReturn.SetupScript(Creature); if (!Tasks.Contains(toReturn)) { Tasks.Add(toReturn); } } if (CurrentTask != null && CurrentAct != null) { Act.Status status = CurrentAct.Tick(); bool retried = false; if (status == Act.Status.Fail) { if (CurrentTask.ShouldRetry(Creature)) { if (!Tasks.Contains(CurrentTask)) { CurrentTask.Priority = Task.PriorityType.Eventually; Tasks.Add(CurrentTask); CurrentTask.SetupScript(Creature); retried = true; } } } if (status != Act.Status.Running && !retried) { CurrentTask = null; } } else { bool tantrum = false; if (Status.Happiness.IsUnhappy()) { tantrum = MathFunctions.Rand(0, 1) < 0.25f; } Task goal = GetEasiestTask(Tasks); if (goal != null) { if (tantrum) { Creature.DrawIndicator(IndicatorManager.StandardIndicators.Sad); if (Creature.Allies == "Dwarf") { PlayState.AnnouncementManager.Announce(Stats.FullName + " (" + Stats.CurrentLevel.Name + ")" + " refuses to work!", "Our employee is unhappy, and would rather not work!", ZoomToMe); } CurrentTask = null; } else { IdleTimer.Reset(IdleTimer.TargetTimeSeconds); goal.SetupScript(Creature); CurrentTask = goal; Tasks.Remove(goal); } } else { CurrentTask = ActOnIdle(); } } PlannerTimer.Update(gameTime); UpdateThoughts(); UpdateXP(); base.Update(gameTime, chunks, camera); }
public void Update(DwarfGame game, DwarfTime time) { GamblingState.Update(time); TaskManager.Update(Faction.Minions); CurrentTool.Update(game, time); Faction.RoomBuilder.Update(); UpdateOrphanedTasks(); if (!World.Paused) { } else { CameraController.LastWheel = Mouse.GetState().ScrollWheelValue; } UpdateInput(game, time); if (Faction.Minions.Any(m => m.IsDead && m.TriggersMourning)) { foreach (CreatureAI minion in Faction.Minions) { minion.Creature.AddThought(Thought.ThoughtType.FriendDied); if (!minion.IsDead) { continue; } World.MakeAnnouncement( String.Format("{0} ({1}) died!", minion.Stats.FullName, minion.Stats.CurrentClass.Name)); SoundManager.PlaySound(ContentPaths.Audio.Oscar.sfx_gui_negative_generic); World.Tutorial("death"); } } Faction.Minions.RemoveAll(m => m.IsDead); UpdateRooms(); HandlePosessedDwarf(); if (sliceDownheld) { sliceDownTimer.Update(time); if (sliceDownTimer.HasTriggered) { SetMaxViewingLevel(MaxViewingLevel - 1); sliceDownTimer.Reset(sliceDownTimer.TargetTimeSeconds * 0.6f); } } else if (sliceUpheld) { sliceUpTimer.Update(time); if (sliceUpTimer.HasTriggered) { SetMaxViewingLevel(MaxViewingLevel + 1); sliceUpTimer.Reset(sliceUpTimer.TargetTimeSeconds * 0.6f); } } // Make sure that the faction's money is identical to the money in treasuries. Faction.Economy.CurrentMoney = Faction.Treasurys.Sum(treasury => treasury.Money); checkFoodTimer.Update(time); if (checkFoodTimer.HasTriggered) { var food = Faction.CountResourcesWithTag(Resource.ResourceTags.Edible); if (food == 0) { Faction.World.MakeAnnouncement("We're out of food!", null, () => { return(Faction.CountResourcesWithTag(Resource.ResourceTags.Edible) == 0); }); } } foreach (var minion in Faction.Minions) { if (minion == null) { throw new InvalidProgramException("Null minion?"); } if (minion.Status == null) { throw new InvalidProgramException("Minion has null status?"); } if (minion.Status.IsAsleep) { continue; } if (minion.CurrentTask == null) { continue; } if (minion.Stats.IsTaskAllowed(Task.TaskCategory.Dig)) { minion.Movement.SetCan(MoveType.Dig, GameSettings.Default.AllowAutoDigging); } minion.ResetPositionConstraint(); } foreach (var applicant in NewArrivals) { if (World.Time.CurrentDate >= applicant.ArrivalTime) { Faction.HireImmediately(applicant.Applicant); } } NewArrivals.RemoveAll(a => World.Time.CurrentDate >= a.ArrivalTime); }
public void Update(DwarfGame game, DwarfTime time) { GamblingState.Update(time); TaskManager.Update(Faction.Minions); CurrentTool.Update(game, time); Faction.RoomBuilder.Update(); UpdateOrphanedTasks(); if (!World.Paused) { } else { CameraController.LastWheel = Mouse.GetState().ScrollWheelValue; } UpdateInput(game, time); if (Faction.Minions.Any(m => m.IsDead && m.TriggersMourning)) { foreach (CreatureAI minion in Faction.Minions) { minion.Creature.AddThought(Thought.ThoughtType.FriendDied); if (!minion.IsDead) { continue; } World.MakeAnnouncement( String.Format("{0} ({1}) died!", minion.Stats.FullName, minion.Stats.CurrentClass.Name)); SoundManager.PlaySound(ContentPaths.Audio.Oscar.sfx_gui_negative_generic); World.Tutorial("death"); } } Faction.Minions.RemoveAll(m => m.IsDead); UpdateRooms(); HandlePosessedDwarf(); if (sliceDownheld) { sliceDownTimer.Update(time); if (sliceDownTimer.HasTriggered) { SetMaxViewingLevel(MaxViewingLevel - 1); sliceDownTimer.Reset(sliceDownTimer.TargetTimeSeconds * 0.6f); } } else if (sliceUpheld) { sliceUpTimer.Update(time); if (sliceUpTimer.HasTriggered) { SetMaxViewingLevel(MaxViewingLevel + 1); sliceUpTimer.Reset(sliceUpTimer.TargetTimeSeconds * 0.6f); } } // Make sure that the faction's money is identical to the money in treasuries. Faction.Economy.CurrentMoney = Faction.Treasurys.Sum(treasury => treasury.Money); checkFoodTimer.Update(time); if (checkFoodTimer.HasTriggered) { var food = Faction.CountResourcesWithTag(Resource.ResourceTags.Edible); if (food == 0) { Faction.World.MakeAnnouncement("We're out of food!", null, () => { return(Faction.CountResourcesWithTag(Resource.ResourceTags.Edible) == 0); }); } } }