rigidchips-lib / rigidchips

23 stars 7 forks source link

モデルの関数をシナリオから無効化する機能 #129

Open lempiji opened 6 years ago

lempiji commented 6 years ago

戦闘シナリオなどを作るときのため、_PLAYERXなどを使えないようにシナリオで制御したい 制限が掛かっていることにモデル側で気付けるかどうか、でいくつか実装パターンが分かれそう?

siruhu commented 6 years ago

int luaSetScriptFunction(lua_State L) { char name=(char*)lua_tostring(L, 1); lua_CFunction func=lua_tocfunction(L, 2);

if((name==NULL) | (func==NULL) | (ScriptL==NULL))return 1;
lua_register(ScriptL, name, func);
return 1;

} シナリオ関数をモデル側Luaに渡す関数はこんな感じ LuaSub.cppに置いてる これ足してLuaScript.cppのlua_State luaScriptInit(char buff) {内 int e=lua_dobuffer (L,buff,strlen(buff),szUpdateFileName0);の前あたりでシナリオ側LuaでOnModelLoadとかの呼び出し位置作ればだいたい出来るはず

lempiji commented 6 years ago

1回lua_registerされた関数は公式に解除する方法なし、という話らしいですね。 http://lua-users.org/lists/lua-l/2006-12/msg00061.html

モデルのLuaブロックの頭でグローバル変数に退避されるとインスタンスは残ってる感じ。 なのでフラグ1個でダミー処理になるようにするマクロ作って、既定の関数全部ラップすれば良いかなーと思ってます。

siruhu commented 6 years ago

削除する方法はないのでモデルを読み込んだ後、モデル再読込を挟まずに動的に関数の使用可否を変更するのは無理

だけど、所詮Luaのグローバル変数として登録されてるだけなのでモデル読み込み時にモデルのLuaを読み込む前で関数を上書きしちゃえばアクセスできなくなる ので上の対処(モデル読み込み時のlua_dobuffer前でシナリオ呼び出し)で求めてる機能は実現できるはず 動的変更はいらない・・・よね?

lempiji commented 6 years ago

システムが登録する関数群の仕様を変えて、C++側でフラグが立つと-1とか返すようになるように実装しておけば良いかなーと思ってました。 たとえばシナリオ側に_DISABLENETWORK関数足して、呼ぶとネットワーク系が全部ー1返すようになれば良いかなーと

で、関数追加するときのこと考えると1個1個やるのは面倒そうなので、何か楽にできるマクロ作れないかなって感じです。

動的変更はやりたくないですね…