Files
Firebird_2D/Firebird2D.ModulLoader/ModulLoader.cs
T
2025-04-22 20:19:35 +02:00

100 lines
3.0 KiB
C#

using Firebird2D.Datatypes;
using Firebird2D.Interfaces;
using Firebird2D.Logger;
using Firebird2D.Requirement;
using System.ComponentModel.DataAnnotations;
using System.Reflection;
using System.Xml.Serialization;
namespace Firebird2D.ModulLoading
{
public struct Modul
{
public ModuleType ModuleType { get; set; }
public string Name { get; set; }
public string RelativePath { get; set; }
}
[XmlRoot("Moduls")]
public class ModulList
{
[XmlArrayItem("Modul")]
public List<Modul> mods = [];
}
public class ModulLoader
{
private readonly IGame gameInstance;
private ModulList? modulList = null;
public ModulLoader(IGame gameInstance)
{
this.gameInstance = gameInstance;
}
public void LoadModules()
{
DeserialiseModulList();
if (modulList == null) return;
List<Modul> eventModul = modulList.mods.Where(m => m.ModuleType == ModuleType.EventSystem).ToList();
if (eventModul.Count > 1) GameLogger.GetInstance(0).Log("ModuleLoader", LogType.Warning, $"More then one EventModul defined first modul ist loaded");
if (eventModul.Count != 0)
{
try
{
Assembly eventAssembly = Assembly.Load(eventModul[0].RelativePath);
GameLogger.GetInstance(0).Log("ModuleLoader", LogType.Info, $"F{eventModul[0].Name} loaded.");
LinkEventAssembly(eventAssembly);
}
catch(Exception ex)
{
GameLogger.GetInstance(0).Log("ModuleLoader", LogType.Warning, $"Failed to load {eventModul[0].Name}, with exception {ex.Message}");
}
}
else
GameLogger.GetInstance(0).Log("ModuleLoader", LogType.Warning, $"More then one EventModul defined first modul ist loaded");
if (modulList.mods.Count == 0) return;
}
private void LinkEventAssembly(Assembly assembly)
{
Type? type = assembly.GetTypes().FirstOrDefault(t => typeof(IEventBus).IsAssignableFrom(t) && !t.IsInterface);
Require.NotNull(type,"type",0);
IEventBus? eventBus = Activator.CreateInstance(type) as IEventBus;
Require.NotNull(eventBus,"eventBus",0);
gameInstance.EventBus = eventBus;
}
private void DeserialiseModulList()
{
try
{
using (FileStream file = new FileStream("Modules/Moduls.xml", FileMode.Open))
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(ModulList));
modulList = (ModulList?)xmlSerializer.Deserialize(file);
}
}
catch(Exception ex) {
modulList = null;
GameLogger.GetInstance(0).Log("ModulLoader",LogType.Warning, $"Modul file not existing or invalid: {ex.Message}");
}
}
}
}