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

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

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

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

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

PICTURE

一気に全部やると、理解が難しいので、最初の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)
    

    PICTURE

    理解できますか?

    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という画用紙の理解();
    }
    

    PICTURE

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

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

  • 「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)