MosswartMassacre/Shared/Spells/SpellTools.cs
2025-05-12 20:27:00 +02:00

149 lines
3.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
using System.IO;
using System.Reflection;
namespace Mag.Shared.Spells
{
public static class SpellTools
{
static readonly List<string> SpellTableHeader = new List<string>();
static readonly Collection<string[]> SpellTable = new Collection<string[]>();
static readonly Dictionary<int, Spell> SpellsById = new Dictionary<int, Spell>();
static SpellTools()
{
var resourceNames = Assembly.GetExecutingAssembly().GetManifestResourceNames();
if (resourceNames.Length == 0)
return;
var rootNameSpace = resourceNames[0].Substring(0, resourceNames[0].IndexOf('.'));
using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(rootNameSpace + ".Shared.Spells.Spells.csv"))
{
if (stream != null)
{
using (StreamReader reader = new StreamReader(stream))
{
SpellTableHeader = new List<string>(reader.ReadLine().Split(','));
while (!reader.EndOfStream)
SpellTable.Add(reader.ReadLine().Split(','));
}
}
}
}
/// <summary>
/// Will return null if no spell was found.
/// </summary>
public static Spell GetSpell(int id)
{
if (SpellsById.TryGetValue(id, out var spell))
return spell;
int idIndex = SpellTableHeader.IndexOf("Id");
foreach (string[] line in SpellTable)
{
if (line[idIndex] == id.ToString(CultureInfo.InvariantCulture))
return GetSpell(line);
}
//throw new ArgumentException("Spell of id: " + id + " not found in Spells.csv");
return null;
}
/// <summary>
/// Will return null if no spell was found.
/// </summary>
public static Spell GetSpell(string name)
{
foreach (var kvp in SpellsById)
{
if (String.Equals(kvp.Value.Name, name, StringComparison.OrdinalIgnoreCase))
return kvp.Value;
}
int nameIndex = SpellTableHeader.IndexOf("Name");
foreach (string[] line in SpellTable)
{
if (String.Equals(line[nameIndex], name, StringComparison.OrdinalIgnoreCase))
return GetSpell(line);
}
//throw new ArgumentException("Spell of name: " + name + " not found in Spells.csv");
return null;
}
private static Spell GetSpell(string[] splitLine)
{
int idIndex = SpellTableHeader.IndexOf("Id");
int nameIndex = SpellTableHeader.IndexOf("Name");
int difficultyIndex = SpellTableHeader.IndexOf("Difficulty");
int durationIndex = SpellTableHeader.IndexOf("Duration");
int familyIndex = SpellTableHeader.IndexOf("Family");
int id;
int.TryParse(splitLine[idIndex], out id);
string name = splitLine[nameIndex];
int difficulty;
int.TryParse(splitLine[difficultyIndex], out difficulty);
int duration;
int.TryParse(splitLine[durationIndex], out duration);
int family;
int.TryParse(splitLine[familyIndex], out family);
var spell = new Spell(id, name, difficulty, duration, family);
if (!SpellsById.ContainsKey(spell.Id))
SpellsById.Add(spell.Id, spell);
return spell;
}
public static bool IsAKnownSpell(int id)
{
if (SpellsById.ContainsKey(id))
return true;
int idIndex = SpellTableHeader.IndexOf("Id");
foreach (string[] line in SpellTable)
{
if (line[idIndex] == id.ToString(CultureInfo.InvariantCulture))
return true;
}
return false;
}
public static bool IsAKnownSpell(string name)
{
foreach (var kvp in SpellsById)
{
if (String.Equals(kvp.Value.Name, name, StringComparison.OrdinalIgnoreCase))
return true;
}
int nameIndex = SpellTableHeader.IndexOf("Name");
foreach (string[] line in SpellTable)
{
if (line[nameIndex] == name)
return true;
}
return false;
}
}
}