using Microsoft.Xna.Framework; using System; using System.Collections.Generic; namespace Barotrauma { partial class CrewManager { const float ConversationIntervalMin = 100.0f; const float ConversationIntervalMax = 180.0f; const float ConversationIntervalMultiplierMultiplayer = 5.0f; private float conversationTimer, conversationLineTimer; private List> pendingConversationLines = new List>(); public List> ActiveOrders { get; } = new List>(); public bool IsSinglePlayer { get; private set; } public CrewManager(bool isSinglePlayer) { IsSinglePlayer = isSinglePlayer; conversationTimer = 5.0f; InitProjectSpecific(); } partial void InitProjectSpecific(); public bool AddOrder(Order order, float fadeOutTime) { if (order.TargetEntity == null) { DebugConsole.ThrowError("Attempted to add an order with no target entity to CrewManager!\n" + Environment.StackTrace); return false; } Pair existingOrder = ActiveOrders.Find(o => o.First.Prefab == order.Prefab && o.First.TargetEntity == order.TargetEntity); if (existingOrder != null) { existingOrder.Second = fadeOutTime; return false; } else { ActiveOrders.Add(new Pair(order, fadeOutTime)); return true; } } public void RemoveOrder(Order order) { ActiveOrders.RemoveAll(o => o.First == order); } public void Update(float deltaTime) { foreach (Pair order in ActiveOrders) { order.Second -= deltaTime; } ActiveOrders.RemoveAll(o => o.Second <= 0.0f); UpdateConversations(deltaTime); UpdateProjectSpecific(deltaTime); } #region Dialog public void AddConversation(List> conversationLines) { if (conversationLines == null || conversationLines.Count == 0) { return; } pendingConversationLines.AddRange(conversationLines); } partial void CreateRandomConversation(); private void UpdateConversations(float deltaTime) { if (GameMain.NetworkMember != null && GameMain.NetworkMember.ServerSettings.DisableBotConversations) { return; } conversationTimer -= deltaTime; if (conversationTimer <= 0.0f) { CreateRandomConversation(); conversationTimer = Rand.Range(ConversationIntervalMin, ConversationIntervalMax); if (GameMain.NetworkMember != null) { conversationTimer *= ConversationIntervalMultiplierMultiplayer; } } if (pendingConversationLines.Count > 0) { conversationLineTimer -= deltaTime; if (conversationLineTimer <= 0.0f) { //speaker of the next line can't speak, interrupt the conversation if (pendingConversationLines[0].First.SpeechImpediment >= 100.0f) { pendingConversationLines.Clear(); return; } pendingConversationLines[0].First.Speak(pendingConversationLines[0].Second, null); if (pendingConversationLines.Count > 1) { conversationLineTimer = MathHelper.Clamp(pendingConversationLines[0].Second.Length * 0.1f, 1.0f, 5.0f); } pendingConversationLines.RemoveAt(0); } } } #endregion partial void UpdateProjectSpecific(float deltaTime); } }