MosswartMassacre/MosswartMassacre/SpellManager.cs
2025-06-08 00:15:55 +02:00

227 lines
No EOL
8.3 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using Mag.Shared.Spells;
namespace MosswartMassacre
{
/// <summary>
/// Manages spell identification and cantrip detection for the Flag Tracker
/// </summary>
public static class SpellManager
{
private static readonly Dictionary<int, Spell> SpellsById = new Dictionary<int, Spell>();
private static readonly List<string[]> SpellData = new List<string[]>();
private static bool isInitialized = false;
static SpellManager()
{
Initialize();
}
private static void Initialize()
{
if (isInitialized) return;
try
{
// Load spell data from embedded CSV resource
var assembly = Assembly.GetExecutingAssembly();
// Try to find the resource with different naming patterns
var availableResources = assembly.GetManifestResourceNames();
var spellResource = availableResources.FirstOrDefault(r => r.Contains("Spells.csv"));
if (string.IsNullOrEmpty(spellResource))
{
// If not embedded, try to load from file system
var csvPath = Path.Combine(Path.GetDirectoryName(assembly.Location), "..", "Shared", "Spells", "Spells.csv");
if (File.Exists(csvPath))
{
LoadFromFile(csvPath);
isInitialized = true;
return;
}
}
else
{
using (var stream = assembly.GetManifestResourceStream(spellResource))
{
if (stream != null)
{
using (var reader = new StreamReader(stream))
{
LoadFromReader(reader);
}
}
}
}
isInitialized = true;
}
catch (Exception ex)
{
PluginCore.WriteToChat($"SpellManager initialization error: {ex.Message}");
}
}
private static void LoadFromFile(string path)
{
using (var reader = new StreamReader(path))
{
LoadFromReader(reader);
}
}
private static void LoadFromReader(StreamReader reader)
{
// Skip header line
var header = reader.ReadLine();
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
if (!string.IsNullOrWhiteSpace(line))
{
var parts = line.Split(',');
if (parts.Length >= 6) // Minimum required fields
{
SpellData.Add(parts);
// Parse spell data
if (int.TryParse(parts[0], out int id))
{
var name = parts[1];
int.TryParse(parts[3], out int difficulty);
int.TryParse(parts[4], out int duration);
int.TryParse(parts[5], out int family);
var spell = new Spell(id, name, difficulty, duration, family);
SpellsById[id] = spell;
}
}
}
}
}
/// <summary>
/// Gets a spell by its ID
/// </summary>
public static Spell GetSpell(int id)
{
if (SpellsById.TryGetValue(id, out var spell))
return spell;
return null;
}
/// <summary>
/// Gets a spell by its name (case-insensitive)
/// </summary>
public static Spell GetSpell(string name)
{
return SpellsById.Values.FirstOrDefault(s =>
string.Equals(s.Name, name, StringComparison.OrdinalIgnoreCase));
}
/// <summary>
/// Gets the total number of spells loaded
/// </summary>
public static int GetSpellCount()
{
return SpellsById.Count;
}
/// <summary>
/// Detects if a spell is a cantrip and returns its info
/// </summary>
public static CantripInfo DetectCantrip(Spell spell)
{
if (spell == null || spell.CantripLevel == Spell.CantripLevels.None)
return null;
var info = new CantripInfo
{
SpellId = spell.Id,
Name = spell.Name,
Level = GetCantripLevelName(spell.CantripLevel),
Color = GetCantripColor(spell.CantripLevel)
};
// Extract skill/attribute name from spell name
info.SkillName = ExtractSkillFromSpellName(spell.Name, info.Level);
return info;
}
private static string GetCantripLevelName(Spell.CantripLevels level)
{
switch (level)
{
case Spell.CantripLevels.Minor: return "Minor";
case Spell.CantripLevels.Moderate: return "Moderate";
case Spell.CantripLevels.Major: return "Major";
case Spell.CantripLevels.Epic: return "Epic";
case Spell.CantripLevels.Legendary: return "Legendary";
default: return "N/A";
}
}
private static System.Drawing.Color GetCantripColor(Spell.CantripLevels level)
{
switch (level)
{
case Spell.CantripLevels.Minor: return System.Drawing.Color.White;
case Spell.CantripLevels.Moderate: return System.Drawing.Color.Green;
case Spell.CantripLevels.Major: return System.Drawing.Color.Blue;
case Spell.CantripLevels.Epic: return System.Drawing.Color.Purple;
case Spell.CantripLevels.Legendary: return System.Drawing.Color.Orange;
default: return System.Drawing.Color.White;
}
}
private static string ExtractSkillFromSpellName(string spellName, string level)
{
// Remove the cantrip level prefix
var skillPart = spellName;
if (!string.IsNullOrEmpty(level) && skillPart.StartsWith(level + " "))
{
skillPart = skillPart.Substring(level.Length + 1);
}
// Map common spell name patterns to skill names
if (skillPart.Contains("Strength")) return "Strength";
if (skillPart.Contains("Endurance")) return "Endurance";
if (skillPart.Contains("Coordination")) return "Coordination";
if (skillPart.Contains("Quickness")) return "Quickness";
if (skillPart.Contains("Focus")) return "Focus";
if (skillPart.Contains("Self") || skillPart.Contains("Willpower")) return "Willpower";
// Protection mappings
if (skillPart.Contains("Armor")) return "Armor";
if (skillPart.Contains("Bludgeoning")) return "Bludgeoning Ward";
if (skillPart.Contains("Piercing")) return "Piercing Ward";
if (skillPart.Contains("Slashing")) return "Slashing Ward";
if (skillPart.Contains("Flame") || skillPart.Contains("Fire")) return "Flame Ward";
if (skillPart.Contains("Frost") || skillPart.Contains("Cold")) return "Frost Ward";
if (skillPart.Contains("Acid")) return "Acid Ward";
if (skillPart.Contains("Lightning") || skillPart.Contains("Electric")) return "Storm Ward";
// Return the skill part as-is if no mapping found
return skillPart;
}
/// <summary>
/// Information about a detected cantrip
/// </summary>
public class CantripInfo
{
public int SpellId { get; set; }
public string Name { get; set; }
public string SkillName { get; set; }
public string Level { get; set; }
public System.Drawing.Color Color { get; set; }
}
}
}