経験の無い人にもわかるように書こうと思ったが、イマイチまとまらないのでとりあえずメモ程度に。そのうちイチからわかるようにするかも
基本はC言語と同じだが、機能は大幅に削除されている。
- ステートメントはBegin~EndとIf~EndifとSetとReturnのみ。
- OBSEならLavel/GotoやSaveIP/RestoreIPを使って繰り返し文の真似事が可能。
- 変数はShort、Long、Flort、Refのみ。
- 関係演算子は> >= == <= < !=
- 算術演算は+-*/と%(除り)を確認。
- 論理演算は 論理積(&&)と 論理和 (||) を確認
- 関係演算が真なら1、否なら0になる。
- 0以外は真として認識するため If IsSneaking == 1 をIf IsSneakingと略すことは可能。 だが否定は無いのでIf !IsSneakingは出来ない。
- set文に関係演算を使うことは可能。 Aが100以上140未満のときだけ、Bに20をいれ、それ以外は10を入れる場合、 Set B to ((A >= 100) && (A < 140 )) * 10 + 10 とif文を使わずに一行で実現可能。
- 計算式はSet文以外には書けない。
自分のIDを取得するGetSelfは、Itemsでは使えない。おそらくいくらでも増えるものや使い捨てるものが多いからであろう。
スクリプト内で実行不可能なことがあると、直ちに中断されてしまう。SetされていないRef変数を参照しようとすると、それ以降の命令は実行されない。
スクリプトが与えられた各リファレンスは独自の変数を持つが、外部からそれを参照することはできない。一旦グローバル変数やクエスト変数を中継するしかない。おそらくNPC.Hensuuとなるとファンクションとの区別がつかなくなるからであろう。
クエストのEditorIDは先頭の数字が無視される?000testはTestとして認識される。a000Testならそのまま認識される。
魔法が当たったときに実行される
OnMagicEffectHitは、生物以外では範囲魔法には反応せず、直撃でしか実行されない。 DisableをしてもそのObjectはなくなるわけではない。同Cell内にいる限りScriptは延々実行されてつづけている。 ScriptEffectFinishでは、あまり時間のかかる処理をさせるとフリーズする。Finish部にMessageBoxなどをつけて、リキャストしたりすると一発で固まる。 GetSecondsPassedは動き続けるようなBegin-End節、つまりGameMode、MenuMode、ScriptEffectUpdateでしか働かない。これは単純にそれらの節が以前に実行されてからの経過時間のみを示す。 QuestStageのResultScriptは、setstageされるたびに実行されるため、応用すれば繰り返し処理や関数として利用できる。 SetposはActorやItems以外のオブジェクトではデータ上は移動してるのにグラフィックは移動しないなど上手く動かない。 接触したときに実行されるOnTorigger系は、当たり判定ポリゴンと重ならないと発動しない。つまり、炎のように素通りできるモノでないと発動しない。ただし、素通りできるあたり判定をnifに追加すれば、普通のアイテムでもOnTorrigerは可能である。詳しいことはわからないが、firearcanemedium01.nif(魔法大学の紫の炎)のトップ下にあるDamageSphereというValueのノードをコピペすれば、接触判定が可能となることを確認した。 MassageBoxは一見処理が止まっているように見えるが、実際は次のフレームに移らないだけで、そのフレームでの処理はMessageBoxが出ている間に最後まで実行されてしまっている。だからMessageBoxのあとにMessageをおくと、MessageBoxを消してからではなく、出ている間にMessageが表示される。これはGetButtonPressedが同一フレーム内では有効にならないことを意味している。MassageBoxは一見処理が止まっているように見えるが、実際は次のフレームに移らないだけで、そのフレームでの処理はMessageBoxが出ている間に最後まで実行されてしまっている。だからMessageBoxのあとにMessageをおくと、MessageBoxを消してからではなく、出ている間にMessageが表示される。つまりGetButtonPressedも同一フレーム内では有効にならないということになる(選択分岐は次のフレームまで待たねばならない)