using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Windows.Forms;
using System.Xml;
namespace TeslaConsole.BattleTech;
///
/// The BattleTech mission-highlight narrative strings, loaded from
/// BattleTech\BTStrings.xml. Mirrors TeslaConsole.RPStrings: each
/// category is a pool of templates and one is picked at random with the
/// {time}/{player}/{vehicle}/{damager} placeholders substituted. The RP-only
/// categories (score/boost/lap) have no BT counterpart; DeathWithoutHonor
/// replaces SelfKill.
///
internal class BTStrings
{
private static bool sInitalized = false;
private static List sLightDamage = new List();
private static List sModerateDamage = new List();
private static List sHeavyDamage = new List();
private static List sKill = new List();
private static List sDeathWithoutHonor = new List();
private static List sRecap = new List();
private static Random sRandom = new Random();
private static void Initalize()
{
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "BattleTech\\BTStrings.xml"));
if (xmlDocument.DocumentElement.Name != "BTStrings")
{
throw new XmlException("Document element was not a BTStrings node.");
}
foreach (XmlNode childNode in xmlDocument.DocumentElement.ChildNodes)
{
switch (childNode.Name)
{
case "LightDamage":
if (!sLightDamage.Contains(childNode.InnerText))
{
sLightDamage.Add(childNode.InnerText);
}
break;
case "ModerateDamage":
if (!sModerateDamage.Contains(childNode.InnerText))
{
sModerateDamage.Add(childNode.InnerText);
}
break;
case "HeavyDamage":
if (!sHeavyDamage.Contains(childNode.InnerText))
{
sHeavyDamage.Add(childNode.InnerText);
}
break;
case "Kill":
if (!sKill.Contains(childNode.InnerText))
{
sKill.Add(childNode.InnerText);
}
break;
case "DeathWithoutHonor":
if (!sDeathWithoutHonor.Contains(childNode.InnerText))
{
sDeathWithoutHonor.Add(childNode.InnerText);
}
break;
case "Recap":
if (!sRecap.Contains(childNode.InnerText))
{
sRecap.Add(childNode.InnerText);
}
break;
}
}
sInitalized = true;
}
private static string GetRandomStringAndReplace(List list, TimeSpan time, string player, string vehicle, string damager)
{
if (!sInitalized)
{
Initalize();
}
if (list.Count == 0)
{
return null;
}
return list[sRandom.Next(list.Count)].Replace("{time}", GetTimeString(time)).Replace("{player}", player).Replace("{vehicle}", vehicle)
.Replace("{damager}", damager);
}
public static string GetTimeString(TimeSpan time)
{
int num = (int)(time.TotalSeconds + 0.5);
int num2 = num / 60;
return $"{num2:D2}:{num % 60:D2}";
}
public static string LightDamage(TimeSpan time, string player, string vehicle, string damager)
{
return GetRandomStringAndReplace(sLightDamage, time, player, vehicle, damager);
}
public static string ModerateDamage(TimeSpan time, string player, string vehicle, string damager)
{
return GetRandomStringAndReplace(sModerateDamage, time, player, vehicle, damager);
}
public static string HeavyDamage(TimeSpan time, string player, string vehicle, string damager)
{
return GetRandomStringAndReplace(sHeavyDamage, time, player, vehicle, damager);
}
public static string Kill(TimeSpan time, string player, string vehicle, string damager)
{
return GetRandomStringAndReplace(sKill, time, player, vehicle, damager);
}
public static string DeathWithoutHonor(TimeSpan time, string player, string vehicle)
{
return GetRandomStringAndReplace(sDeathWithoutHonor, time, player, vehicle, "");
}
public static string Recap(string[] playerRanking)
{
StringBuilder stringBuilder = new StringBuilder(playerRanking[0]);
for (int i = 1; i < playerRanking.Length - 1; i++)
{
stringBuilder.AppendFormat(", {0}", playerRanking[i]);
}
return GetRandomStringAndReplace(sRecap, TimeSpan.Zero, "", "", "").Replace("{winners}", stringBuilder.ToString()).Replace("{looser}", (playerRanking.Length > 1) ? playerRanking[playerRanking.Length - 1] : "nobody");
}
}