public ScriptLoader(EcsWorld world, Game game, Codex codex, ILogger logger) { Logger = logger; var scriptGlobals = new ScriptGlobals(codex, game, world); var opts = ScriptOptions.Default.AddImports("System", "System.Collections.Generic", "System.Drawing", "RoadTrip.Game", "RoadTrip.Game.Components", "RoadTrip.Game.Blueprints"); var assemblies = AppDomain.CurrentDomain.GetAssemblies() .Where(x => x.IsDynamic == false); foreach (var assembly in assemblies) { opts.AddReferences(assembly); } var allScripts = Directory.GetFiles(Path.Join(AppContext.BaseDirectory, "Data"), "*.csx", SearchOption.AllDirectories) .OrderBy(x => x) .ToList(); foreach (var scriptPath in allScripts) { var code = File.ReadAllText(scriptPath); var script = CSharpScript.Create(code, opts, typeof(ScriptGlobals)); var compilation = script.GetCompilation(); var diagnostics = compilation.GetDiagnostics(); if (diagnostics.Any()) { var fail = false; foreach (var diagnostic in diagnostics) { if (diagnostic.WarningLevel == 0) { fail = true; Logger.Fatal("Failed to execute {Script}: {Message}", scriptPath, diagnostic.ToString()); } else { Logger.Error("Failed to execute {Script}: {Message}", scriptPath, diagnostic.ToString()); } } if (fail) { throw new Exception("Aborted due to script errors"); } } var result = script.RunAsync(scriptGlobals) .Result; } codex.TerrainLookup = codex.TerrainTypes.ToDictionary(k => k.Id, v => v); codex.MobsLookup = codex.Mobs.ToDictionary(k => k.Id, v => v); }
public ScriptGlobals(Codex codex, Game game, EcsWorld world) { Codex = codex; Game = game; World = world; }