/// <summary>キャラをロードし、インスタンスを返します。</summary> /// <param name="characterName">キャラの名前</param> /// <returns>キャラのインスタンス</returns> public static IHarrietCharacter Load(string characterName) { var loader = new MEFCharacterLoader(); string path = DirectoryNames.GetCharacterLoadedDirectory(characterName); var catalog = new DirectoryCatalog(path); var container = new CompositionContainer(catalog); container.ComposeParts(loader); return(loader.character); }
/// <summary>キャラを定められた仕様にもとづいてロードする。失敗すると例外が飛んでくる</summary> public static IHarrietCharacter LoadCharacter(string characterName) { var engine = Python.CreateEngine(); //名前参照にexeのディレクトリとキャラのディレクトリを追加 var paths = engine.GetSearchPaths(); paths.Add(Environment.CurrentDirectory); paths.Add(DirectoryNames.GetCharacterScriptDirectory(characterName)); paths.Add(DirectoryNames.GetCharacterLoadedDirectory(characterName)); engine.SetSearchPaths(paths); string path = GetInitializeScriptPath(characterName); if (!File.Exists(path)) { throw new FileNotFoundException($"file '{path}' was not found: this is needed to load character data"); } engine.ExecuteFile(path, engine.Runtime.Globals); dynamic loadFunction; bool result = engine.Runtime.Globals.TryGetVariable(CharacterLoadFunction, out loadFunction); if (!result) { throw new InvalidOperationException($"'{CharacterLoadFunction}' function does not exist in '{path}'"); } PythonFunction function = loadFunction as PythonFunction; if (function == null) { throw new InvalidOperationException($"'{CharacterLoadFunction}' defined in '{path}' is not function"); } IHarrietCharacter character = loadFunction() as IHarrietCharacter; if (character == null) { throw new InvalidOperationException($"{CharacterLoadFunction} result does not implements IHarrietCharacter"); } return(character); }
private static string GetInitializeScriptPath(string characterName) { return(Path.Combine(DirectoryNames.GetCharacterLoadedDirectory(characterName), InitializeScriptName)); }