Tuesday, May 23, 2017

ターゲットSpecificなコールバック関数 その1

TES4の、アイテムのスクリプトのひとつ。


OnAddというのは、誰かのインベントリに入った時に呼ばれる関数なんだろうけど、どうも見た感じ、playerのインベントリに入った時と、NivanDalviluREFのインベントリに入った時とで、呼ぶ関数を分けられるみたい。

こうすると、「誰かのインベントリ」の、「誰」の部分の判定をコードに書かなくて良いので、有用だと思うんだけど、、
Luaだとこういう記述はできないと思うので、さて、どうしようということで、
function ITEMSCRIPT:OnAdd__EDITORID()
という感じで関数名にEditorIDを書くと、そのIDのキャラがターゲットの時に呼ばれる、という形にならできるかなあ(ハイライターも効かなくなるから見やすくないし、なんか格好悪い気もするけど)。

続く

Tuesday, May 2, 2017

「エイリアス」によるデータ操作


赤丸の部分でキャラクターに、「TEST01」というEditorIDをセット。
青の部分で、TEST01というEditorIDを持ったキャラクターの「エイリアス」を作成。
すると、紫の下線部分のような形で、データにアクセス可能に。

CreateCharacterAlias関数は、character[ EditorID(この場合"TEST01") ]を作って、それを戻り値として返しますcharacter[~]はグローバルに作られるので、戻り値を無視して、character["TEST01"]を使うのもアリです。見やすい方で。
player(黄色の下線)は、プレイヤーキャラクターへのエイリアスとして、ゲーム開始時に自動的に作成されます。

なぜ「エイリアス」を使うのかというと

ld25では、ほとんどのゲームデータはシステム(delphi)側に置いているんですが、Lua側とシステム側のメモリは、それぞれ独立していて、直接代入などで読み書き出来ないためです。
上の例で言うと、Lua側には各エイリアスの「Money」の実際のデータは存在しておらず、エイリアスは自身のMoneyパラメータにI/Oがあった時に、「スタックを使ってシステムと値のやりとりをする」関数を走らせて、システム側のエイリアスのターゲットキャラのMoneyデータに対して操作します。

とりあえず、そのエイリアスの動作確認ができたので、キャラクター以外のデータもそう出来るようにしていきます(キャラクターエイリアスもまだパラメータ全部は書き終わってないですが)。:D