Luaから実行できる関数を、ScenarioMod側に用意する

Luaからも実行可能な関数の作成方法

Luaからも実行可能な関数の作成方法には、作法が存在する。
それらは、WebやLuaの書籍に多くの例題が掲載されている。
ScenarioModにおいても、「全くその作法通りの記述」で実装が可能である。

  • カスタム駆動関数.cpp

    // 引数 : lua_State *L という形。
    // 返値 : int型。その関数が返す「値の個数」。 (Luaは複数の返り値を並べて返すことができる、その個数)
    
    // 指定の武将番号の武将の名前を得る
    int Lua_GetBushouName(lua_State *L) {
    
      // Lという画用紙に最後に書いたうち、1番目の引数を、整数として取得
      int iBushouID = (int)lua_tointeger(L, 1);
    
       // Lという画用紙に最後に書いた引数群を削除
      lua_pop(L, lua_gettop(L));
    
      string s = Get_名前(iBushouID);
    
       // Lという画用紙に逆に、この返り値を書く
      lua_pushstring(L, s.c_str());
    
       // 画用紙に書いた数(この関数が呼ばれた際に返す返り値の数)を返す
      return 1;
    }
    
    void カスタム::On_起動時() {
      // 上記関数を「GetBushuName」という関数名でLの画用紙に登録
      lua_register(L, "GetBushouName", &Lua_GetBushouName);
    }
    

    これだけで、準備は整った。

    これにより、Lの画用紙に「GetBushouName」という関数が定義された。
    そして、その挙動は、ScenarioModの「Get_名前」関数と同じ、ということになるだろう。

    この関数を実際にLuaから使うには、ゲーム中に使わなければ意味がないので以下のようなテスト記述を書き足そう。

  • カスタム駆動関数.cpp

    void カスタム::On_起動時() {
    
      // 上記関数を「GetBushuName」という関数名でLの画用紙に登録
      lua_register(L, "GetBushouName", &Lua_GetBushouName);
    
      // test.lua というファイルの内容をLの画用紙に書いて、実行
      try {
          LUA::Do_ファイル("test.lua");
      } catch (...) { }
    }
    
    void カスタム::On_相場変更直前() {
      // Lの画用紙にある、「soba_change」の関数を呼び出す。
      try {
          LUA::Do_コマンド("soba_change()");
      } catch(...) { }
    }
    

    起動時に「test.lua」を呼出して、実行する記述を付けたし、
    又、相場変更時に、「soba_change」という関数を実行する。

  • test.lua

    function soba_change()
        local bushou_name = GetBushouName( 10 )  -- 武将番号【配列用】が10番目の武将の名前を得る
        dprint(bushou_name)
    end
    

    相場が変わる時、武将番号【配列用】が「10」の武将の名前がModDebuggerに表示されるであろう。