public void Tick() { // Only update once per second or so if (--waitTicks > 0) { return; } playerBuildings = world.ActorsWithTrait <Building>() .Where(a => a.Actor.Owner == player) .Select(a => a.Actor) .ToArray(); var active = false; foreach (var queue in ai.FindQueues(category)) { if (TickQueue(queue)) { active = true; } } waitTicks = active ? ai.Info.StructureProductionActiveDelay : ai.Info.StructureProductionInactiveDelay; }
public void Tick() { // Pick a free queue var queue = ai.FindQueues(category).FirstOrDefault(); if (queue == null) { return; } var currentBuilding = queue.CurrentItem(); switch (state) { case BuildState.ChooseItem: { var item = chooseItem(queue); if (item == null) { state = BuildState.WaitForFeedback; lastThinkTick = ai.ticks; } else { HackyAI.BotDebug("AI: Starting production of {0}".F(item.Name)); state = BuildState.WaitForProduction; ai.world.IssueOrder(Order.StartProduction(queue.self, item.Name, 1)); } } break; case BuildState.WaitForProduction: if (currentBuilding == null) { return; /* let it happen.. */ } else if (currentBuilding.Paused) { ai.world.IssueOrder(Order.PauseProduction(queue.self, currentBuilding.Item, false)); } else if (currentBuilding.Done) { state = BuildState.WaitForFeedback; lastThinkTick = ai.ticks; /* place the building */ var location = ai.ChooseBuildLocation(currentBuilding.Item); if (location == null) { HackyAI.BotDebug("AI: Nowhere to place {0}".F(currentBuilding.Item)); ai.world.IssueOrder(Order.CancelProduction(queue.self, currentBuilding.Item, 1)); } else { ai.world.IssueOrder(new Order("PlaceBuilding", ai.p.PlayerActor, false) { TargetLocation = location.Value, TargetString = currentBuilding.Item }); } } break; case BuildState.WaitForFeedback: if (ai.ticks - lastThinkTick > HackyAI.feedbackTime) { state = BuildState.ChooseItem; } break; } }
public void Tick() { // Pick a free queue var queue = ai.FindQueues(category).FirstOrDefault(); if (queue == null) { return; } var currentBuilding = queue.CurrentItem(); switch (state) { case BuildState.ChooseItem: var item = chooseItem(queue); if (item == null) { state = BuildState.WaitForFeedback; lastThinkTick = ai.ticks; } else { HackyAI.BotDebug("AI: Starting production of {0}".F(item.Name)); state = BuildState.WaitForProduction; ai.world.IssueOrder(Order.StartProduction(queue.self, item.Name, 1)); } break; case BuildState.WaitForProduction: if (currentBuilding == null) { return; } if (currentBuilding.Paused) { ai.world.IssueOrder(Order.PauseProduction(queue.self, currentBuilding.Item, false)); } else if (currentBuilding.Done) { state = BuildState.WaitForFeedback; lastThinkTick = ai.ticks; // Place the building var type = BuildingType.Building; if (ai.Map.Rules.Actors[currentBuilding.Item].Traits.Contains <AttackBaseInfo>()) { type = BuildingType.Defense; } else if (ai.Map.Rules.Actors[currentBuilding.Item].Traits.Contains <OreRefineryInfo>()) { type = BuildingType.Refinery; } var location = ai.ChooseBuildLocation(currentBuilding.Item, type); if (location == null) { HackyAI.BotDebug("AI: Nowhere to place {0}".F(currentBuilding.Item)); ai.world.IssueOrder(Order.CancelProduction(queue.self, currentBuilding.Item, 1)); } else { ai.world.IssueOrder(new Order("PlaceBuilding", ai.p.PlayerActor, false) { TargetLocation = location.Value, TargetString = currentBuilding.Item }); } } break; case BuildState.WaitForFeedback: if (ai.ticks - lastThinkTick > HackyAI.feedbackTime) { state = BuildState.ChooseItem; } break; } }