Files
LuaCsForBarotraumaEP/Barotrauma/BarotraumaShared/SharedSource/GameSession/CrewManager.cs
T
2020-03-27 15:22:59 -03:00

118 lines
4.0 KiB
C#

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<Pair<Character, string>> pendingConversationLines = new List<Pair<Character, string>>();
public List<Pair<Order, float>> ActiveOrders { get; } = new List<Pair<Order, float>>();
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<Order, float> 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, float>(order, fadeOutTime));
return true;
}
}
public void RemoveOrder(Order order)
{
ActiveOrders.RemoveAll(o => o.First == order);
}
public void Update(float deltaTime)
{
foreach (Pair<Order, float> order in ActiveOrders)
{
order.Second -= deltaTime;
}
ActiveOrders.RemoveAll(o => o.Second <= 0.0f);
UpdateConversations(deltaTime);
UpdateProjectSpecific(deltaTime);
}
#region Dialog
public void AddConversation(List<Pair<Character, string>> 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);
}
}