TRLE Level BOX
This Site is an unofficial site by NGLE fan.

NGLE講座

■IDとインデックスとスロット

IDとインデックスとスロット

スクリプトコマンドの説明を読んでいると「ID」と「インデックス」と「スロット」という単語が頻繁に登場します。
ヘルプの中では厳密に単語の使い分けがされていないので、これからの説明を読むと余計混乱するかもしれません。ですが、一応この講座の中での意味合いを説明したいと思います。

IDとインデックスとスロットを理解する前に

そこで簡単な例をあげながら説明したいと思います。
まずは住所録のようなものを想像してみてください。
郵便番号、住所、名前、電話番号と情報が一杯ですね。
これを人が認識する場合は住所が「東京」とか、「大阪」とか、住所で認識しますが、コンピュータは「0」と「1」の世界なので、数字で認識した方が都合がいいです。
そこで、郵便番号や電話番号の登場です。これなら東京の人だけを検索したりするのは便利ですね。
同じことがNGLEの世界でも行われています。

スロットについて

人間なら住所のようにオブジェクト名で一つ一つを認識しますが、コンピュータは先述の説明どおり数字の方が便利なので、郵便番号ならぬスロットという名の入れ物を用意して、そのスロットに番号を割り振ります。するとその番号に一致するものだけ検索すればいいことになります。
ngle0335_01.jpg
というわけで、スロットとはオブジェクトを入れている入れ物とそれに割り振られている番号と考えてください。
ヘルプではそういう入れ物として説明していたり、オブジェクト名と同義のように名前として説明していたりするので、どちらの意味で書かれているのか読み解くことが必要です。

マップ内のオブジェクトのIDとインデックス

スロットに番号を割り振ることは既に説明しました。
この番号はレベルが違っても変わることはありません。LARAは0番、BADDY_1は41番と決まっています。
NG_Center【Reference】タブのSLOT MOVEABLES indices listで全ての番号を調べることができます。
ngle0335_02.jpg
ところが、マップにはBADDY_1が二人いたり、メディパックが二つあったりします。その場合、どのようにオブジェクトを認識すればいいのでしょう。
そこで、登場するのがIDまたはインデックスです。
新規にマップを作成してララを部屋に配置してみてください。ララを選択すると以下のように黄色の枠の中の数字が「0」番のはずです。
ngle0335_03.jpg
それから、メディパックでも配置してみてください。追加するにしたがって番号は増えていきます。
この番号こそが、IDまたはインデックスで、この番号はNGLEが自動で割り当てます。メディパックを二つ配置したら、先に配置したのとは違う番号になっているはずです。
このように、スロットはレベルが違っても変わることはありませんでしたが、IDまたは、インデックスはレベルによって同じオブジェクトでも違う番号になります。
ヘルプではIDとインデックスはほぼ同義として扱われています。ヘルプの中のIDやインデックスが変わることのある数値なのか、そうでないのか読み解く必要があります。

変わるマップ内のオブジェクトのIDとインデックス

では、今度は部屋を追加して最初の部屋とつなげてみましょう。
ヘルプには説明がありませんが、部屋にも番号が割り振られます。
ルーム情報でいう「Item」がまさにそれで、部屋を接続すれば、「Item」が増えていきます。
ngle0335_04.jpg
これも実はIDやインデックスに関係していて、部屋を接続した後、メディパックを配置してみてください。
直前に追加したメディパックの番号の次の番号にはなっていないはずです。
では、次にメディパックを追加し、BADDY_1を追加し、メディパックを削除し、BADDY_2を追加し、メディパックを削除した所に再度メディパックを追加してみてください。
ngle0335_05.jpg
なんだかわかりにくい説明ですが、レベルを作成していると途中でオブジェクトを削除したり、再度配置したりすることがあるはずです。
その場合、再配置したオブジェクトが削除する前と同じIDやインデックスを持っているとは限らないという事です。

『Move Lara here』

話はいきなり変わってしまいますが、NGLEには『Move Lara here』というボタンがあります。
LARAオブジェクトをマップ内で移動させるボタンです。
このボタンをクリックしてもLARAオブジェクトのIDやインデックスは変わりません。
『Move Lara here』ボタンはLARAオブジェクトを削除した後、すぐにLARAオブジェクトを配置するからです。
先述の説明ではIDやインデックスが変わることを理解してもらうためわかりにくい説明をしましたが、
IDやインデックスを変更しないようにするには、オブジェクトを削除した後、すぐに再配置すればIDやインデックスが変わることはありません。
そのため、オブジェクトを削除した後、再配置する場合はすぐに配置するようにしてください。

マップ内のトリガのIDとインデックス

ここまではオブジェクトに関するIDやインデックスの話でした。
ここからは、トリガに関するIDやインデックスの話です。
TRLEではトリガとスクリプトコマンドには何の関係もなかったのですが、NGLEからはスクリプトコマンドでトリガのIDやインデックスを読み込み、トリガのように処理を行うことができます。
トリガのIDやインデックスは『Export Script Trigger』ボタンで調べることができます。
ngle0335_06.jpg
実際にエクスポートすると以下のようなテキストファイルが表示されます。

; Set Trigger Type - ACTION 43
; Exporting: TRIGGER(43:0) for ACTION(9) {Tomb_NextGeneration}
; <#> : WATERFALLMIST              ID 9      in sector (3,2) of Room0
; <&> : Trigger. (Moveable) Activate <#>Object with (E)Timer value
; (E) : Timer= +00
; Values to add in script command: $5000, 9, $2B

太字の3つがトリガのIDやインデックスになります。
『Export Anim Command』ボタンはWADMergerのAnimationEditorのAnimCommandsで使用するための数値をエクスポートするものです。
このトリガのIDも、レベルを作成している途中でオブジェクトを削除したり、再度配置したりすると同じIDやインデックスを持っているとは限りません。

スクリプトコマンドのIDとインデックス

やっと、スクリプトコマンドに関するIDやインデックスの話です。
オブジェクトやトリガだけでも手一杯という方もいるかもしれませんが、スクリプトコマンドもオブジェクトやトリガと似たような性質を持っています。
スクリプトコマンドもオブジェクトやトリガと同じように複数配置することができます。
以下の例をみてください。

Parameters=PARAM_MOVE_ITEM,1,IGNORE, 20, DIR_EAST, 128, 32, IGNORE, IGNORE
Parameters=PARAM_MOVE_ITEM,2,IGNORE, 38, DIR_SOUTH, 6144, 32, 155, 122
Parameters=PARAM_MOVE_ITEM,3,IGNORE, 142, DIR_NORTH, 200, 100 , IGNORE, IGNORE
ColorRGB=1,0,0,0

のようにParametersで始まる行を何行も書くことができます。
そして、太字の部分が、スクリプトコマンドのIDまたはインデックスと呼ばれるものです。
例のように、同じセクション内で違うスクリプトコマンド(例ではParametersとColorRGBとが違う)なら同じ数字「1」を使用しても構いませんが、同じセクション内で同じスクリプトコマンド(例ではParameters)なら同じ数字は使用できません。
ところが、以下の例では同じ数字(例では「1」)を使用しています。

Parameters=PARAM_SCALE_ITEM, 1, 10, IGNORE, 200, 100, 20
Parameters=PARAM_SHOW_SPRITE, 1, FSS_EFFECT_FROM_BOTTOM, 145, 140, >
           172, 232, CUSTOM_SPRITES, 0, IGNORE, IGNORE, IGNORE, 40

これは、Parametersコマンドではフィールド(例ではPARAM_で始まる)が異なると同じ番号「1」でもよい。という仕様になっているからです。
このようにスクリプトコマンドによって重複が許可されたり、されなかったりします。

English.txtの[ExtraNG]セクションのIDとインデックス

スクリプトコマンド(Diary、WindowsFontなど)やトリガ(FLIPEFFECTトリガ219番など)には[ExtraNG]セクションの値を使用するものがあります。
[ExtraNG]セクションへ文字を追加するには、NG_Center【Strings】タブでEnglish.txtを編集を参照してください。

スクリプトコマンドで使用するマップ内のオブジェクトのIDとインデックス

では、実際にオブジェクトのIDやインデックスがスクリプトコマンド内でどのように使われているのかみてみましょう。
以下の例をみてください。

Parameters=PARAM_MOVE_ITEM, 1 ,IGNORE, 20, DIR_EAST, 128, 32, IGNORE, IGNORE

太字の部分がオブジェクトのIDまたはインデックスと呼ばれるものです。
これを指定することで、このParametersコマンドはID「20」番のオブジェクトに対して処理を行うことができます。
先述の説明どおりオブジェクトのIDやインデックスが変更されているとスクリプトコマンドは正常に動作しません。上手く動作しない場合は、オブジェクトのIDやインデックスを再度確認してみてください。

スクリプトコマンドで使用するマップ内のトリガのIDとインデックス

今度はトリガのIDやインデックスをスクリプトコマンドで使う場合をみてみましょう。
以下の例をみてください。

; Exporting: CONDITION(3:50) for PARAMETER(176)
; <#> : PUZZLE_ITEM2                    Slot=176
; <&> : Inventory. There are at least (E) of  <#>inventory_item in inventory
; (E) :    6
;Add following three values in your script command:
;$8000, 176, $603

TriggerGroup=1, $8000, 176, $603

太字の部分がトリガのIDまたはインデックスと呼ばれるものです。
これを指定することで、このTriggerGroupコマンドはID「$8000, 176, $603」番のトリガのように処理を行うことができます。
先述の説明どおりトリガのIDやインデックスが変更されているとスクリプトコマンドは正常に動作しません。上手く動作しない場合は、トリガのIDやインデックスを再度確認してみてください。

スクリプトコマンドで使用するスクリプトコマンドのIDとインデックス

次はスクリプトコマンド同士でIDやインデックスをやり取りする場合をみてみましょう。
以下の例をみてください。

ColorRGB=1, 255,255,255
WindowsFont=1, Arial, WFF_BOLD+WFF_CENTER_ALIGN, 40, 1, IGNORE

ColorRGB行の太字がこのColorRGBのIDです。
次に、WindowsFont行の最初の数字もこのWindowsFontのIDです。後に続く太字の「1」が、前の行で設定されたColorRGB行のIDです。
この数字でColorRGB行で設定された内容をWindowsFont行は受け取っています。
今度は以下の例をみてください。

WindowsFont=1, Arial, WFF_BOLD+WFF_CENTER_ALIGN, 40, 1, IGNORE
ColorRGB=1, 255,255,255

先述の例とよく似ていますが行の順番が逆になっています。
スクリプトコマンドは上から順に処理されるので、この例ではWindowsFont行が受け取るIDが見つかりません。
この例ではNG_Centerでエラーにはなりませんが、IDの受け渡しを行う場合は注意してください。

スクリプトコマンドで使用する[ExtraNG]セクションのIDとインデックス

次はスクリプトコマンドで[ExtraNG]セクションのIDとインデックスを使用する場合をみてみましょう。
以下の例をみてください。

WindowsFont=1, Arial, WFF_BOLD+WFF_CENTER_ALIGN, 40, 1, IGNORE

WindowsFont行の太字が[ExtraNG]セクションにあるIDというかテキストです。
スクリプトコマンドで[ExtraNG]セクションにあるテキストを使用する場合は、English.txtの[ExtraNG]セクションにも同じテキストが必要です。

トリガで使用するスクリプトコマンドのIDとインデックス

次は、スクリプトコマンドのIDやインデックスをトリガで使う場合をみてみましょう。
以下の例をみてください。

ItemGroup=1, 14, 24, 29, 30

ItemGroupコマンドの1番にオブジェクトを設定しました。
これをトリガで使用するにはFLIPEFFECTトリガ144番を使います。
ngle0335_07.jpg
このようにスクリプトコマンドで設定したスクリプトコマンドのIDとインデックスをトリガで使用できます。

トリガで使用する[ExtraNG]セクションのIDとインデックス

最後はトリガで[ExtraNG]セクションのIDとインデックスを使用する場合をみてみましょう。
以下の例をみてください。

Diary=1,PICKUP_ITEM2, LDF_ZOOM_START+LDF_SOUND_EFFECTS, 1, >
      PL_DOUBLE_PAGE,@Pages5_6.txt,1, 2

Diaryコマンドの1番にPages5_6.txtを設定しました。
これをトリガで使用するにはFLIPEFFECTトリガ219番を使います。
ngle0335_08.jpg
このように[ExtraNG]セクションで設定したIDとインデックスをトリガで使用できます。

まとめ

ngle0335_09.jpg
このように、オブジェクト、トリガ、スクリプトコマンド、[ExtraNG]セクションはすべてIDまたはインデックスで情報(命令)のやりとりをしています。
ということは、レベル作成時にはオブジェクト、トリガ、[ExtraNG]セクションを全て配置設定済の状態でスクリプトコマンドの作成をはじめる必要があります。

しかしそれは現実的ではありません。部屋ごとにスクリプトコマンドを書き、オブジェクトを削除し、再配置する場合は、すぐに再配置するよう心がけてください。

最初は文字を表示するなどの簡単なスクリプトコマンドをスクリプトコマンドに関する基本的な事を参考に、書いて慣れてください。
そこから条件のついたスクリプトコマンドや複雑な処理を行うスクリプトコマンドを書いていくとよいでしょう。