public override void CalculateGlobalIssue() { hullSeverities.Clear(); foreach (Gap gap in Gap.GapList) { if (AIObjectiveFixLeaks.IsValidTarget(gap, shipCommandManager.character)) { hullSeverities.Add(AIObjectiveFixLeaks.GetLeakSeverity(gap)); } } float averagePercentage = 0f; if (hullSeverities.Any()) { hullSeverities.Sort(); averagePercentage = hullSeverities.TakeLast(3).Average(); // get the 3 most damaged items on the ship and get their average } GlobalImportance = averagePercentage; }
protected void ReportProblems() { Order newOrder = null; if (Character.CurrentHull != null) { foreach (var hull in VisibleHulls) { foreach (Character c in Character.CharacterList) { if (c.CurrentHull != hull) { continue; } if (AIObjectiveFightIntruders.IsValidTarget(c, Character)) { AddTargets <AIObjectiveFightIntruders, Character>(Character, c); if (newOrder == null) { var orderPrefab = Order.PrefabList.Find(o => o.AITag == "reportintruders"); newOrder = new Order(orderPrefab, c.CurrentHull, null, orderGiver: Character); } } } if (AIObjectiveExtinguishFires.IsValidTarget(hull, Character)) { AddTargets <AIObjectiveExtinguishFires, Hull>(Character, hull); if (newOrder == null) { var orderPrefab = Order.PrefabList.Find(o => o.AITag == "reportfire"); newOrder = new Order(orderPrefab, hull, null, orderGiver: Character); } } foreach (Character c in Character.CharacterList) { if (c.CurrentHull != hull) { continue; } if (AIObjectiveRescueAll.IsValidTarget(c, Character)) { if (AddTargets <AIObjectiveRescueAll, Character>(c, Character)) { if (newOrder == null) { var orderPrefab = Order.PrefabList.Find(o => o.AITag == "requestfirstaid"); newOrder = new Order(orderPrefab, c.CurrentHull, null, orderGiver: Character); } } } } foreach (var gap in hull.ConnectedGaps) { if (AIObjectiveFixLeaks.IsValidTarget(gap, Character)) { AddTargets <AIObjectiveFixLeaks, Gap>(Character, gap); if (newOrder == null && !gap.IsRoomToRoom) { var orderPrefab = Order.PrefabList.Find(o => o.AITag == "reportbreach"); newOrder = new Order(orderPrefab, hull, null, orderGiver: Character); } } } foreach (Item item in Item.ItemList) { if (item.CurrentHull != hull) { continue; } if (AIObjectiveRepairItems.IsValidTarget(item, Character)) { if (item.Repairables.All(r => item.Condition > r.ShowRepairUIThreshold)) { continue; } AddTargets <AIObjectiveRepairItems, Item>(Character, item); if (newOrder == null) { var orderPrefab = Order.PrefabList.Find(o => o.AITag == "reportbrokendevices"); newOrder = new Order(orderPrefab, item.CurrentHull, item.Repairables?.FirstOrDefault(), orderGiver: Character); } } } } } if (newOrder != null) { if (GameMain.GameSession?.CrewManager != null && GameMain.GameSession.CrewManager.AddOrder(newOrder, newOrder.FadeOutTime)) { Character.Speak(newOrder.GetChatMessage("", Character.CurrentHull?.DisplayName, givingOrderToSelf: false), ChatMessageType.Order); #if SERVER GameMain.Server.SendOrderChatMessage(new OrderChatMessage(newOrder, "", Character.CurrentHull, null, Character)); #endif } } }