예제 #1
0
        /// <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>();
        }
예제 #2
0
        public void Reload(IEnumerable <TextAsset> assets)
        {
            // combined text asset
            var text = string.Join("\n", assets.Select(a => a.text));

            code = NParser.Parse(text);
        }
예제 #3
0
        /// <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)}");
            }
        }
예제 #4
0
        /// <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());
        }
예제 #5
0
 public RuntimeCode(INCode code, int entryPoint)
 {
     Code       = code;
     EntryPoint = entryPoint;
 }