「L」という画用紙の理解

  • 全ては「L」という画用紙に書きつけられる

    ScenarioModは、C/C++ 言語としてのメインの文法とは別に、「L」というLuaの「画用紙」のような空間を持っています。
    「ScnearioMod」側からこの画用紙に書き込むこともできますし、外部のファイル(lua形式)からこの画用紙に書き込むこともできます。

    このことを理解しておけば、ScenarioMod側と、Lua側で連携したコードでも、その挙動をよく理解できるようになります。

    それでは、以下のようなことを行います。


    一気に全部やると、理解が難しいので、最初の2つだけみてみましょう。

  • その①~その②

    • カスタム駆動関数.cpp

      void Lという画用紙の理解() {
        // ①番目。
        try {
          LUA::Do_コマンド("my_var = 3"); // 画用紙に書き込み実行
        } catch (...) { }
      
        // ②番目。
        try {
          LUA::Do_ファイル("Test1.lua"); // Test1.luaの内容を画用紙に書き込み実行。
        } catch(...) { }
      }
      
      void カスタム::On_起動時() {
          Lという画用紙の理解();
      }
      
      • LUA::Do_コマンド("文字列")
        とは、画用紙にそのまま文字列を書き込み、実行します。

      • LUA::Do_ファイル("ファイル名")
        とは、ファイルに書いてある文字列を画用紙へと書き込み、実行します。

      そして、以下のように対象となるluaファイルを「天翔記フォルダ」に用意します。

    • Test1.lua

      -- L画用紙からの読み書き
      my_var = my_var + 10
      
      -- dprintという関数は、普通のluaにはない。
      -- printと同じ挙動だが、表示先が「ModDebugger」である。
      dprint("luaからModdebuggerに表示:")
      dprint(my_var)
      


      理解できますか?

      ScenarioModとLuaで、「同じ画用紙」を相手に読み書きしているからこそ、
      「13」という値となるのです。

  • その③

    それでは続きです。

    • カスタム駆動関数.cpp

      void Lという画用紙の理解() {
          // ①番目。
          try {
              LUA::Do_コマンド("my_var = 3"); // 画用紙に書き込み実行
          } catch (...) { }
      
          // ②番目。
          try {
              LUA::Do_ファイル("Test1.lua"); // Test1.luaの内容を画用紙に書き込み実行。
          } catch(...) { }
      
          // ③番目。
          int import_var = 0;
          try {
              // 画用紙からの読み込み。
              // Lの画用紙の数値は全て「実数」として取り扱われるため、整数が欲しいなら、整数へと落とす。
              import_var = (int)LUA::Get_グローバル数値("my_var");
      
              デバッグ出力 << "ScenarioModからModDebuggerに表示" << endl;
              デバッグ出力 << import_var << endl;
          } catch (...) { }
      
      }
      
      void カスタム::On_起動時() {
          Lという画用紙の理解();
      }
      
      • LUA::Get_グローバル数値("変数名")
        とは、画用紙から対象の変数名のものを「少数」として取得します。
  • その④

    さて、4番目を実装してみましょう。

    新たに、以下のような、luaファイルを「天翔記フォルダ」に用意します。

    • Test2.lua

      -- 関数を定義する。
      -- このファイルを実行した際は、「関数の定義が画用紙に書かれる」だけ。
      -- 関数の中身は、my_plusを呼ばない限り実行されない。
      function my_plus( x )
          ret_var = my_var + x   -- my_var と x が足される
          dprint(ret_var)        -- ModDebuggerに表示
      end
      
  • その⑤

    最後の5番目の実装です。

    • カスタム駆動関数.cpp

      void Lという画用紙の理解() {
          // ①番目。
          try {
              LUA::Do_コマンド("my_var = 3"); // 画用紙に書き込み実行
          } catch (...) { }
      
          // ②番目。
          try {
              LUA::Do_ファイル("Test1.lua"); // Test1.luaの内容を画用紙に書き込み実行。
          } catch(...) { }
      
          // ③番目。
          int import_var = 0;
          try {
              // 画用紙からの読み込み。
              // Lの画用紙の数値は全て「実数」として取り扱われるため、整数が欲しいなら、整数へと落とす。
              import_var = (int)LUA::Get_グローバル数値("my_var");
      
              デバッグ出力 << "ScenarioModからModDebuggerに表示" << endl;
              デバッグ出力 << import_var << endl;
          } catch (...) { }
      
          // ⑤番目。
          try {
              LUA::Do_ファイル("Test2.lua"); // Test2.luaの内容を画用紙に書き込み実行。
              LUA::Do_コマンド("my_plus(100)"); // 文字列を画用紙に書き込み実行
          } catch(...) { }
      
      }
      
      void カスタム::On_起動時() {
          Lという画用紙の理解();
      }
      

      さて、画用紙に書かれた内容は、最終的にどうなものだったのでしょうか?

      以下のようになったのです。

    • 「L」という画用紙の内容

      my_var = 3
      my_var = my_var + 10
      
      dprint("luaからModdebuggerに表示:")
      dprint(my_var)
      
      function my_plus( x )
          ret_var = my_var + x
          dprint(ret_var)
      end
      
      my_plus(100)