ユーザー定義関数メモ

OBSEを導入しないと使えません。
作成方法は、スクリプトファイルを新規作成して、そこに書きます。
スクリプトのタイプは指定する必要はありません。
1つのファイルに1つの関数しか定義できません。
関数を定義すれば、他のスクリプトから呼び出せるようになります。

ScriptName 関数名
int arg1
int arg2
int return_value
begin Function {arg1, arg2}
  let return_value := arg1 + arg2
  SetFunctionValue return_value
end

値を返したいなら、SetFunctionValueに指定します。
ユーザー定義関数の呼び出し方は Call 関数名 引数
戻り値を変数に格納する場合 let v := Call 関数名 1 2

OBSEのドキュメントに書いてありますが、探すのにちょっと苦労しました。
User-Defined Functionsでテキスト検索すればヒットします。

ユーザー定義関数を使う時に注意するのは、呼び出すのが遅いという点。
入力しているキーを素早く調べたいなど、タイムラグを許容できないような状況ではちょっと使えません。

fQuestDelayTimeの設定も受け付けるようです。
毎フレーム呼び出されるほど小さい値を設定しても、遅いです。

Esc、Tabで閉じられないメニューを極力無くす 2

Esc、Tabで閉じられないメニューを極力無くす 1の改善点に、閉じるキーや全て取るキーなどを、ユーザー定義関数を使って判定しようと書いたのですが、ユーザー定義関数の呼び出しが遅すぎて使い物になりません。

要は、キーの入力判定をどこか一箇所で出来ればそれでOKです。
判定するキーの追加・削除・変更があった場合、その一箇所をいじれば全ての場所に反映されるため、メンテナンスが容易になります。

例えば、ロックピックメニューの入力判定は begin MenuMode 1014 の中でやっています。
これより先に呼び出されるコマンドやイベントがあるなら、その中でキー入力判定をしておき、結果を変数に保存しておきます。
それより後に呼び出される begin MenuMode 1014 の中ではキー入力判定はせず、変数に保存された結果を参照します。
これで出来るはずです。

でも、このような処理は可能でしょうか?


short flag
begin MenuMode
  if IsKeyPressed2 1  ;Escキー押されてる?
    let flag := 1
  else
    let flag := 0
  endif
end
begin MenuMode 1014
  if flag
    print "Esc key pressed"
  else
    print "Esc key not pressed"
  endif
end

これで出来ます。
begin MenuMode 数字なし は、begin MenuMode 1014 より先に呼び出されるため可能となります。
判定するキーに変更があっても、begin MenuMode 数字なし をいじるだけで済みます。

クエストスクリプトのEditorID

GameModeやMenuModeで処理するスクリプトはクエストスクリプトとして作成。
CSメニューのCharacter→QuestsでEditorID(FormID)を新規作成して登録。
Scriptの項目に作成したクエストスクリプトを設定。

という手順が必要ですが、EditorIDの先頭には数字を使わない方が無難です。

Questリストの先頭に表示される(自分の作ったクエストを見つけやすい)という理由で、EditorIDを数字の0から始まる名前で登録していましたが、これだと、別のスクリプトから変数を呼び出せなくなってしまいます。

121119_1.jpg
EditorIDは0123...9ABC...Zの順に整列される。
EditorIDを123OolongTeaなど、数字から始まる名前にすると、アルファベットで始まる名前より上に表示されるようにはなるが…。


例えば、Testというクエストスクリプトを作成。
EditorIDをOssanTestと登録。
Testには外部からアクセス可能な変数aurigaがあるとします。


ScriptName Test
int auriga

このaurigaの値をテキストファイルで変更できるようにしたい場合、test.iniというような、適当な名前のテキストファイルを作り、その中でaurigaの値をセットするスクリプトを記述します。


set OssanTest.auriga to 1919

スクリプト実行時にこのテキストファイルをRunBatchScriptを使って読み込むことで、aurigaの値がテキストファイルに設定した値(1919)に書き換えられます。


ScriptName Test
int auriga
begin GameMode
  RunBatchScript "test.ini"
  print "auriga=" + (tostring auriga)
end

;test.iniはOblivion.exeと同じフォルダに置く。
;test.iniを正常に読み込めて、test.iniの内容に問題がなければ、コンソールに auriga=1919 と表示される。
;問題があった場合、auriga=0 になる。


このテキストファイル(test.ini)は、Testスクリプトから見れば別のスクリプトファイルなので、オブジェクトの参照(この場合はEditorID)を使わなければ、Testスクリプトのaurigaにアクセスできません。
EditorIDをOssanTestと登録したので、OssanTest.aurigaと書くことになります。

121119_2.jpg

もしこのEditorIDが0ssanTest(先頭は数字のゼロです)だった場合、aurigaの値は書き換えられません。
数字から始まる名前は不正とみなされるようで、aurigaにアクセスする箇所が無効になってしまうようです。
2文字目以降に数字が使われるのは問題ないようですが、先頭に数字が来る名前は使えません。
正確に言うと登録はできますが、外部から参照する時に問題が起きます。

EditorIDを登録するときにCSがチェックしてくれれば、こういう間違いが減って良いのですが…。
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。