(d9829ac) v0.9.4.0

This commit is contained in:
Regalis
2019-10-24 18:05:42 +02:00
parent 9aa12bcac2
commit b39922a074
319 changed files with 12516 additions and 6815 deletions
@@ -24,6 +24,12 @@ namespace Barotrauma
private readonly Dictionary<ulong, int> traitorCountsBySteamId = new Dictionary<ulong, int>();
private readonly Dictionary<string, int> traitorCountsByEndPoint = new Dictionary<string, int>();
public bool ShouldEndRound
{
get;
set;
}
public int GetTraitorCount(Tuple<ulong, string> steamIdAndEndPoint)
{
if (steamIdAndEndPoint.Item1 > 0 && traitorCountsBySteamId.TryGetValue(steamIdAndEndPoint.Item1, out var steamIdResult))
@@ -51,6 +57,16 @@ namespace Barotrauma
return Traitors.Any(traitor => traitor.Character == character);
}
public string GetTraitorRole(Character character)
{
var traitor = Traitors.FirstOrDefault(candidate => candidate.Character == character);
if (traitor == null)
{
return "";
}
return traitor.Role;
}
public TraitorManager()
{
}
@@ -60,18 +76,21 @@ namespace Barotrauma
#if DISABLE_MISSIONS
return;
#endif
if (server == null) return;
if (server == null) { return; }
ShouldEndRound = false;
Traitor.TraitorMission.InitializeRandom();
this.server = server;
//TODO: configure countdowns in xml
startCountdown = MathHelper.Lerp(90.0f, 180.0f, (float)Traitor.TraitorMission.RandomDouble());
startCountdown = MathHelper.Lerp(server.ServerSettings.TraitorsMinStartDelay, server.ServerSettings.TraitorsMaxStartDelay, (float)Traitor.TraitorMission.RandomDouble());
traitorCountsBySteamId.Clear();
traitorCountsByEndPoint.Clear();
}
public void Update(float deltaTime)
{
if (ShouldEndRound) { return; }
#if DISABLE_MISSIONS
return;
#endif
@@ -102,21 +121,20 @@ namespace Barotrauma
missionCompleted = true;
foreach (var traitor in mission.Value.Traitors.Values)
{
traitor.UpdateCurrentObjective("");
traitor.UpdateCurrentObjective("", mission.Value.Identifier);
}
}
}
if (gameShouldEnd)
{
GameMain.GameSession.WinningTeam = winningTeam;
GameMain.Server.EndGame();
ShouldEndRound = true;
return;
}
if (missionCompleted)
{
Missions.Clear();
//TODO: configure countdowns in xml
startCountdown = MathHelper.Lerp(90.0f, 180.0f, (float)Traitor.TraitorMission.RandomDouble());
startCountdown = MathHelper.Lerp(server.ServerSettings.TraitorsMinRestartDelay, server.ServerSettings.TraitorsMaxRestartDelay, (float)Traitor.TraitorMission.RandomDouble());
}
}
else if (startCountdown > 0.0f && server.GameStarted)
@@ -127,7 +145,7 @@ namespace Barotrauma
int playerCharactersCount = server.ConnectedClients.Sum(client => client.Character != null && !client.Character.IsDead ? 1 : 0);
if (playerCharactersCount < server.ServerSettings.TraitorsMinPlayerCount)
{
startCountdown = 60.0f;
startCountdown = MathHelper.Lerp(server.ServerSettings.TraitorsMinRestartDelay, server.ServerSettings.TraitorsMaxRestartDelay, (float)Traitor.TraitorMission.RandomDouble());
return;
}
if (GameMain.GameSession.Mission is CombatMission)
@@ -141,10 +159,10 @@ namespace Barotrauma
Missions.Add(teamId, mission);
}
}
var canBeStartedCount = Missions.Sum(mission => mission.Value.CanBeStarted(server, this, mission.Key, "traitor") ? 1 : 0);
var canBeStartedCount = Missions.Sum(mission => mission.Value.CanBeStarted(server, this, mission.Key) ? 1 : 0);
if (canBeStartedCount >= Missions.Count)
{
var startSuccessCount = Missions.Sum(mission => mission.Value.Start(server, this, mission.Key, "traitor") ? 1 : 0);
var startSuccessCount = Missions.Sum(mission => mission.Value.Start(server, this, mission.Key) ? 1 : 0);
if (startSuccessCount >= Missions.Count)
{
return;
@@ -155,9 +173,9 @@ namespace Barotrauma
{
var mission = TraitorMissionPrefab.RandomPrefab()?.Instantiate();
if (mission != null) {
if (mission.CanBeStarted(server, this, Character.TeamType.None, "traitor"))
if (mission.CanBeStarted(server, this, Character.TeamType.None))
{
if (mission.Start(server, this, Character.TeamType.None, "traitor"))
if (mission.Start(server, this, Character.TeamType.None))
{
Missions.Add(Character.TeamType.None, mission);
return;
@@ -166,7 +184,7 @@ namespace Barotrauma
}
}
Missions.Clear();
startCountdown = 60.0f;
startCountdown = MathHelper.Lerp(server.ServerSettings.TraitorsMinRestartDelay, server.ServerSettings.TraitorsMaxRestartDelay, (float)Traitor.TraitorMission.RandomDouble());
}
}
}
@@ -178,23 +196,31 @@ namespace Barotrauma
#endif
if (GameMain.Server == null || !Missions.Any()) return "";
return string.Join("\n\n", Missions.Select(mission => mission.Value.GlobalEndMessage));
return TextManager.JoinServerMessages("\n\n", Missions.Select(mission => mission.Value.GlobalEndMessage).ToArray());
}
public static T WeightedRandom<T>(ICollection<T> collection, Func<int, int> random, Func<T, int> readSelectedWeight, Action<T, int> writeSelectedWeight, int entryWeight, int selectionWeight) where T : class
public static T WeightedRandom<T>(IList<T> collection, int startIndex, int count, Func<int, int> random, Func<T, int> readSelectedWeight, Action<T, int> writeSelectedWeight, int entryWeight, int selectionWeight) where T : class
{
var count = collection.Count;
if (count <= 0)
{
return null;
}
var maxCount = entryWeight + collection.Max(readSelectedWeight);
var totalWeight = collection.Sum(entry => maxCount - readSelectedWeight(entry));
var selected = random(totalWeight);
foreach (var entry in collection)
var maxWeight = readSelectedWeight(collection[startIndex]);
var totalWeight = entryWeight + maxWeight;
for (var i = 1; i < count; ++i)
{
var weight = readSelectedWeight(collection[startIndex + i]);
maxWeight = Math.Max(maxWeight, weight);
totalWeight += weight;
}
maxWeight += entryWeight;
totalWeight = count * maxWeight - totalWeight;
var selected = random(totalWeight);
for(var i = 0; i < count; ++i)
{
var entry = collection[startIndex + i];
var weight = readSelectedWeight(entry);
selected -= maxCount;
selected -= maxWeight;
selected += weight;
if (selected <= 0)
{
@@ -204,5 +230,10 @@ namespace Barotrauma
}
return null;
}
public static T WeightedRandom<T>(IList<T> collection, Func<int, int> random, Func<T, int> readSelectedWeight, Action<T, int> writeSelectedWeight, int entryWeight, int selectionWeight) where T : class
{
return WeightedRandom<T>(collection, 0, collection.Count, random, readSelectedWeight, writeSelectedWeight, entryWeight, selectionWeight);
}
}
}