/// <summary> /// Initializes a new instance of the <see cref="T:Novel.NovelRuntime"/> class. /// </summary> /// <param name="code">ソースコード.</param> public NovelRuntime(string code) { // Null チェックをしつつ,コードの分析 runtimeCode = NParser.Parse(code ?? throw new ArgumentNullException(nameof(code))); commands = new Dictionary <string, NFunc>(); }
public void Reload(IEnumerable <TextAsset> assets) { // combined text asset var text = string.Join("\n", assets.Select(a => a.text)); code = NParser.Parse(text); }
/// <summary> /// [内部的に使用するメソッド] 指定した実行可能コードを逐次実行します. /// </summary> /// <param name="code">実行するべきコード.</param> /// <param name="num">実行する先頭の行番号.</param> void Run(INCode code, int num = 0) { for (int i = num; i < code.Statements.Length; i++) { var statement = code.Statements[i]; try { CallFunc(statement.SpriteTag, statement.CommandName, statement.Arguments); } catch (NRuntimeException ex) { // ランタイムエラー表示 Console.Error.WriteLine($"エラー(行 {i}, {statement.CommandName}): {ex.Message}"); } catch (Exception ex) { // バグだ. Console.Error.WriteLine($"内部エラー({ex.Message})\n{ex.StackTrace}"); } //デバッグコードにつきコメントアウト //Console.WriteLine($"{statement.SpriteTag}+{statement.CommandName} {string.Join(", ", statement.Arguments)}"); } }
/// <summary> /// Novel の実行可能コードを文字列に変換します. /// </summary> /// <param name="c"></param> /// <returns></returns> public static string ToString(this INCode c) { var sb = new StringBuilder(); // ラベルの書き出し sb.AppendLine($"{nameof(c.Labels)}: "); sb.AppendLine(string.Join(Environment.NewLine, c.Labels.Select(l => $" {l.Key} : {l.Value}"))); // ステートメントの書き出し sb.AppendLine($"{nameof(c.Statements)}: "); sb.AppendLine(string.Join(Environment.NewLine, c.Statements.Select((s, i) => $" {i:##0} {s.SpriteTag}+{s.CommandName} {string.Join(", ", s.Arguments)}"))); return(sb.ToString()); }
public RuntimeCode(INCode code, int entryPoint) { Code = code; EntryPoint = entryPoint; }