TRNG変数

前書き
変数を使って何が得られるでしょうか?
異なるタイプの変数
Local変数とGlobal変数
変数のサイズ
数値またはText変数
共通変数と特殊変数
Timer変数
CurrentValue変数
LastInputNumber変数
Store変数
変数のプレースフォルダ
クリティカルメモリゾーン
アイテムメモリゾーン
セーブデータメモリゾーン
コードメモリゾーン
スロットメモリゾーン
アニメーションメモリゾーン
インベントリメモリゾーン
変数サンプルプロジェクト
TRNGTimerと得られたメディパック
ジャンプゲインのスキル
木製のドア:私たちの変更をどのように保存して復元するか
ヒントとコツ
いくつかのメモリフィールドの感覚をどのように発見するか
スクリプトコマンドのデバッグを有効にする
いくつかのMoveableについての座標の保存を強制する
タイマーを使わずに時間間隔を検出する方法


前書き

このドキュメントでは、TRNG変数の機能と使い方について説明します。

どのように変数を使用するかは非常に簡単です。フリップエフェクトを使って変数を別の変数にコピーするか、何らかの数学関数を適用し、何らかの変数に掛け算を加えます。

代わりに、より複雑なことは、変数を使って役に立つものを実現する方法を理解することです。

変数を使って何が得られるでしょうか?

変数で得ることができる最初の目標は、ゲーム内で起こったいくつかの事柄を覚えておき、将来的に異なる行動を起こすことです。
ほとんどのトリガは、同一レベルだけで動作しますが、変数によって、第1レベルのレースで経過した時間を覚えて、第3レベルの終わりにボーナスレベルを賭ける機会を与えることができます。

もう一つの目標は、GlobalTrigger、TriggerGroupと条件を使用して、非常に複雑な新しいスキルを実現することです。
TRNGでは、プログラミングのように多くのコマンドが動作しています。コマンドのためのTriggerGroupと条件のためのコンディショントリガです。
しかし、それは各プログラミング言語の基本要件、すなわち変数を欠いていました。

例えば、GlobalTriggerとTriggerGroupを使用して、新しい車両やハードコーディングされたパズルをシミュレートするなど、新しい複雑な操作を実現できますが、これを実現するには、これらの複雑な操作のどの段階でそれを行うか覚えておく必要があります。

TRNG_variables.zipプロジェクトのJump-Gainの例を見ると、変数を使ってララの新しいスキルをどのように使用できるかを理解できます。

異なるタイプの変数

フリップエフェクトの変数(すべて「Variables」という文字で始まる)を見ると、TRNGで使用可能な変数の長いリストが表示されます。
それは、異なる基準にしたがって、異なるグループに分けることができます。

Local変数とGlobal変数

変数にはLocal変数とGlobal変数の2つがあります。
実際には異なる変数であることを理解することが重要です。Local Alfa変数はGlobal Alfaよりも独立した値を持ちます。
Local Alfa変数は、一つのレベルでのみ適用されるLocal変数です。一方、Global変数は、すべてのレベルで同じ値を持ちます。
Global変数の方が良いと思うかもしれませんが、現実にはLocal変数はそれぞれのレベルの変数を保持する利点があるので、レベル1のLocal Alfaの値を持つことができます(フィニッシュトリガ付き)。レベル2に入ると、レベル2のLocal Alfaでは異なる値を持つことができます。レベル1に戻ると、レベル1のLocal Alfaの値が新たに見つかります。

変数がそのレベルにのみ影響を及ぼす場合はLocal変数を使用し、あるレベルに値を設定し、将来のレベルでもその値を使いたい場合はGlobal変数を使用する必要があります。

変数のサイズ

変数の大きさに関する説明は複雑に見えるかもしれませんが、それは箱のようなものを考えるだけです。
大きな箱があるとしましょう。そこには小さな箱を入れることが出来ます。
同じようなことがTRNG変数でも起こります。
大型の箱をいくつ使用するかどうかを決めることができます。つまり、大きな数値を格納できる変数をいくつか、あるいは小さな数値をたくさん格納したい場合は、小さな変数をたくさん持つことが出来ます。

TRNG変数で使用されているオーバーラップを理解するために、大きなボックスを分割して多くの小さなボックスを収納することを想像してみてください。

次の画像を参照してください。

image

このスキームは、すべてのTRNG変数をどのように動作させるかを示します。
各変数名が「Local Alfa」、「Global Delta」、「Local Beta」の場合、4つの小さなボックス(Byte1,2,3,4)または2つの中間変数(Short1とShort2)または単一の大きな変数を使用するかどうかを決定できます。
これらの異なる「ボックス」に保存できる数字は次のとおりです。
Byte :Min= 0             ;Max= 255(正の数のみ)
Short:Min= -32768        ;Max= +32767
Long :Min= -2.147.483.648;Max= +2.147.483.647(すなわち、約+/-20億)
大きな変数または小さな変数が重複している場合は、大きな変数を上書きする際にエラーを回避しなければなりません。
例えば、Short1を使用して番号を格納する場合、同じ変数のByte1またはByte2にアンサー番号を格納することはできません。この方法では、Short1も変更され予期しない結果になるからです。
別の方法として、上記の画像を見ると、Byte3とByte4とShort2も使用できます。これらの変数はShort1と重複していないため、アンサー番号を格納することができます。

数値またはText変数

おそらく数値変数をより頻繁に使用すると思いますが、テキストを格納できるText変数もあります。
Text変数には以下の名前があります。

Text1
Text2
Text3
Text4
BigText
LastInputText

Text変数では、余分な文字列をコピーすることも、将来のバージョンでは、名前やいくつかのテスト用パスワードのようなプレイヤーによって入力されたテキストをコピーすることもできます。
BigText変数にテキストを追加するフリップエフェクトがいくつかあります。この変数は他のText#変数(Text1からText4)よりも大きく、Text#変数では最大79文字しか格納できませんが、最大319文字まで格納することができます。

共通変数と特殊変数

一般的な変数は、Alfa、Beta、Delta、LocalまたはGlobalです。
上記のすべての変数は、変数のサイズの章に示されているように分割することができます。
特別なものを持つ変数があります。

Timerは、LocalまたはGlobalな変数
CurrentValue変数(Globalのみ)
LastInputNumber変数(Globalのみ)
Store変数:変数Aから変数Pまで(すべてのGlobalと共通変数のようにByte、ShortまたはLongサイズに分割できる)

以下の章では、上記の特殊変数について説明します。

Timer変数

Timer変数にはGlobal変数とLocal変数の2つがあります。
Timer変数は、それが常にLongであることを除いて、他の共通変数のように使用することができます。したがって、TimerでByteまたはShortを使用することはできません。
とにかく、Timer変数には、その名前のように、時間を数えることに関する興味深い機能がいくつかあります。
フリップエフェクトを使用して、LocalTimerまたはGlobalTimerを開始または停止します。
TRNGTimer変数はtomb4のスクリーンタイマーとは異なり、独立していることに注意してください。

TRNGTimerで時間を設定するには、2つのフリップエフェクトがあります。値は秒単位またはティックフレーム単位で設定できます。1秒= 30ティックフレームです。
これらの異なるフリップエフェクトにもかかわらず、TRNGTimerの値は常にティックフレームであることを覚えておいてください。単純にフリップエフェクトによって値を秒単位で入力すると、エンジンはティックフレーム単位で変換すると考えます。

TRNGTimerを起動するフリップエフェクトは、画面上でタイマーを表示しないことに注意してください。TRNGTimerを表示または非表示にするには別のフリップエフェクトを使用する必要があります。
場合によっては、新しいスキルのための時間間隔を計算する「隠された」タイマーを持つと便利かもしれません。
例えばジャンプゲインスキルでも、ジャンプの到着から1.5秒が経過したときにすべてを無効にするためにLocalTimerを使用しました。

TRNGTimerのもう一つの興味深い特徴は、プレースフォルダ(変数のプレースフォルダを参照)を任意のテキストに挿入できることです。そのTimer変数は現在の時間で置き換えられます。形式は次のとおりです。

mm:ss:t

「mm」は分、「ss」は秒、「t」は秒です。
このようにして、簡単に次のようなテキストを表示できます。

Remaining time: #0073

そして、それはゲームで、このように表示されます。

Reamining time: 00:53:4

この値は、時間の経過とともに継続的に更新されます。

進行を増減するためのタイマーを設定することができます。

フリップエフェクトを使用すると、画面上にTRNG時間をすばやく表示できます。

テキストの色や大きさについてはプレフィックスが付いていますが、そのフリップエフェクトで変更することはできません。一方サイズや色が異なるTRNGTimerを表示するには、一般的な「print ng string」フリップエフェクトは、希望のタイマーのプレースフォルダを含んでいるので、色、サイズ、および望みどおりの表示を設定することができます。
TRNGTimerを表示するフリップエフェクトは、テキストの書式設定をしないでタイマーを表示するだけです。

TRNGTimerのGlobalTrigger

タイマーを使用すると、GT_TRNG_G_TIMER_EQUALSまたはGT_TRNG_L_TIMER_EQUALS GlobalTriggerで時間の完了を検出できます。
上記のGlobalTriggerの唯一の違いは、GlobalTimerには「_G_TIMER」が使用され、LocalTimerには「_L_TIMER」が使用される点です。
理論上、タイマーの内容をテストするためのコンディショントリガを使用することもできますが、GlobalTriggerは誤検出を避けるよう設計されているため、より正確で使いやすいです。
例えば、プレイヤーに何らかの操作を完了させるのに10秒だけ与えようと、カウントダウンの開始値を10秒、終了値を0秒で設定した場合、コンディショントリガで問題が発生する可能性があります。ゲームの開始時にGlobalTriggerを有効にすると、新しいレベルの開始時にすべての変数がクリアされるため、TRNGTimerはゼロを即座に検出するからです。
GT_TRNG_G_TIMER_EQUALS(またはGT_TRNG_L_TIMER_EQUALS)GlobalTriggerのParameterフィールドに0を指定して使用すると、このGlobalTriggerはタイマーの実行中にのみ機能するため、問題はありません。

上記の方法のおかげで、GlobalTriggerでSINGLE_SHOTフラグを使用する必要はありません(またどちらも推奨できません)。TRNGTimerが最終値に達したときに停止し、タイマーの次回起動までGlobalTriggerは使用できません。

CurrentValue変数

CurrentVariableは、フリップエフェクトで実行されるすべての操作に確実に存在する唯一の変数であるため、特別な変数です。
実際には、いくつかの数学的演算やコピーがすべての変数で利用できるわけではありませんが、CurrentValueに対しては常にその演算が行われます。
この変数について覚えておかなければならないのは、長時間保存したい値を格納するのを避けることです。数値変数から重要なメモリに値を移動する場合にのみ使用する必要があります。このケースでは、値を保存するのに問題があるはずですが、この値を常に長期目標から解放して、必要なときに使用できるようにする方が簡単です。

LastInputNumber変数

LastInputNumber変数には常にKeyPadスイッチでタイプされた値がコピーされます。プレイヤーがキーパッドをエスケープで打ち切ると-1がコピーされます。
TRNGの将来のバージョンでは、他の入力メソッドもこの変数に値を設定できます。

Store変数

Store変数はAlfa、Beta、Deltaという共通変数に非常に似ていますが、Byte、Short、またはLongで分割することもできます。
一般的な変数よりも最も大きな違いは、技術的な理由から、あなたはこれらのStore変数を操作するために直接的な数学演算を使用することはできません。しかし、Store変数をCurrentValue変数にコピーするか、(逆に)CurrentValue変数をStore変数にコピーできます。
この一連の変数は、共通変数がそれを維持するのに十分ではないときに、レベルの過程で得られる異なる結果を格納するために使用されます。
Store変数の利点は、多くのStore変数があることです。16個のLongStore変数があるため、32個のShort変数や64個のByte変数があるように見ることもできます。
Store変数の最適な使用法は、このゾーン内で値がほんの僅かしか必要でないか、将来的に必要であることがわかったときに値をコピーして、効果的な計算のためにいくつかの共通変数を解放することです。

変数のプレースフォルダ

NG_Center[Reference]の「VARIABLE PLACEFOLDERS」セクションでは、変数の内容を画面に表示するため、[ExtraNG]Strings(通常の[PCStrings]でも使用できます)にコピーする小さな番号(プレースフォルダ)を見つけることができます。
リストには共通の数値変数がありますが、特殊変数とStore変数もあります。

ゲームで変数の値を表示するには、プレースフォルダをテキストにコピーして表示します。

この方法でできることはたくさんあります。
例えば、セーブデータのメモリから変数の中の望むものをコピーし、次のようなテキストを表示して、独自の統計情報を表示することができます。

Stars of Iside #0044
Remaing Time #0073
Missing Targets #004A

変数に正しい値をコピーすると、次のように表示されます。

Stars of Iside 2
Remaining Time 05:23:2
Missing Targets: 8

TimerプレースフォルダについてはTimer変数の章も参照してください。

ピックアップしたアイテムやその他の統計情報の値を取得するには、重要なメモリゾーンについての次の章を参照してください。


クリティカルメモリゾーン

変数機能を使用すると、別の興味深いチャンスがあります。今では、tomb4エンジンの多くの重要なメモリセルを変更し、変数からこれらのメモリゾーンに値をコピーすることができます。

クリティカルメモリゾーンとは、TRNGエンジンがオブジェクトの位置、インベントリアイテムの数、および他の多くの興味深いものを設定するために使用するゾーンを意味します。
ほとんどのTRNGフリップエフェクトは、正しいメモリゾーンに正しい値を書き込んで作成されています。今度は、このように他の独自の特殊効果を作成することもできます。

私はクリティカルメモリゾーンの変更がいくつかのひどい混乱を起こす可能性があることを覚えておいてください。もしあなたが優れたエキスパートではないなら、インベントリアイテムの数や統計情報の値といった限られた内容を読むためにのみ、クリティカルメモリゾーンの使用を制限したほうがよいでしょう。

別の方法として、新しいスキルを作成したい場合は、クリティカルメモリゾーンを変更する必要があります。例えば、Moveableに関するすべての最も重要な値が保存されているアイテム構造の例があります。

現在、次のクリティカルメモリゾーンが利用可能です。

アイテムメモリ
それは、ララから他の敵またはANIMATINGまでの各Moveableに関するほとんどのデータを保存します。
セーブデータメモリ
それは多くのインベントリ値だけでなく、統計情報などを保持します。
スロットメモリ
スロットは、Moveableタイプの構造体であり、同じタイプのMoveableの共通特性を含んでいます。
アニメーションメモリ
特定のアニメーション構造のメモリを管理します。
コードメモリ
それは他のグループによってゾーンの違いを考慮していますが、現在このリストは短いですが、将来的に拡大する可能性があります。
インベントリメモリ
インベントリのピックアップの存在は考慮されません(これはセーブデータメモリによって管理されます)が、インベントリにアイテムを表示するモードとみなされます。それらのサイズ、位置および向き。さらに、このメモリでは、サブメニュー「combine」、「separe」、または「load game」、「save game」などの特別な機能のような、いくつかのインタラクティブ機能を確認することができます。

以下の章では、ゾーンごとに説明します。


アイテムメモリゾーン

アイテムメモリの説明

アイテムメモリ上で操作を実行する前に、アクショントリガを使用する必要があります。「Variables. Set the index of <#>moveable as Selected Item」。変更するアイテムメモリを選択します。各移動体は、自身のアイテムメモリ、すなわちそのデータを有する構造体を有します。
備考:説明が間違っている可能性があります。ヒントとコツの章で提案されている方法を使用して、一部のフィールドの動作を検証することができます。
フィールド名
サイズ
フィールドの説明
Animation NowShort このフィールドは現在のアニメーションをホストします。
このアニメーションの数は絶対的なものです。これは、ある敵の最初のアニメーションの0の番号を見つけることができないことを意味しますが、TR4ファイルの以前のすべてのMoveableのアニメーションの完全なリストの中に、現在のアニメーションの番号についてのBigNumberを見つけることができます。
例えば、Moveableの最初のアニメーションが0になり、2番目のアニメーションが1になるような、相対番号でこの絶対番号を変換するには、この計算を実行する必要があります。

1)「Slot id」フィールドからスロットインデックスを読み取ります(まだわからない場合)。
2)選択されたスロットメモリで動作するようにこのインデックスを設定します。

3)スロットメモリ内の「First Animation Index」を読みます。

4)これで、相対アニメーションを次のように取得できます。

RelativeAnimIndex = ItemMemory.AnimationNumber - Slot.FirstAnimationIndex.
Contact FlagsLong $ 2000と$ 400の単一のビットがあると、ララは触れるとこのアイテムによって損傷するはずです。
ダーツにはこの値があります。$ 2400
Custom FlagsByte 謎のフィールド。
このフィールドの値は、オブジェクトのタイプに応じて変化するようです。
何かを知らせるビットフラグのように見えます。
Custom_AShort このフィールドは、他のカスタムフィールドと同様に、オブジェクトのタイプに応じて使い方が異なります。
特定のアイテムからどのように使用されるかを調べる唯一の方法は、そのアイテムが有効な間にこのフィールドを調べることです。
ヒントとコツの章を参照してください。
Custom_BShort Custom_Aフィールドの説明を参照
Custom_CShort Custom_Aフィールドの説明を参照
Custom_DShort Custom_Aフィールドの説明を参照
Facing HorizontalShort この値は横向きです。つまり、上からララを見ると、ララが見ている方向です。

値については、「Facing Vertical」フィールドに説明があります。
プレイヤーが上矢印キーを押すと、ララ(または他のアイテム)が移動する方向を設定するため、水平方向のフェイスは非常に重要です。
例えば、水平速度は、水平面の方向で計算されます。

Facing RotationShort このフェーシングは特に重要であり、ララのアイテムのみで動作するはずです。
このフィールドの影響を受ける回転軸を理解するには、AnimationCommandのサンプルの画像を見ることができます。
Facing VerticalShort この値は、床とのperienticolarの線よりも尊重度を表します。
プロジェクトのサンプル「Variables_TRNG」では、垂直方向の変化を見ることができます。
値は0から360度の範囲は0000から$ FFFFです。
例えば$ 4000は90度、$ 8000は180度です。

この値がゼロでないことはめったにありません。ララがダッシュで走ったときに起こります。

Flags of ItemLong これは非常に重要で非常に複雑なフィールドです。
このFlagsフィールドでは、各ビットが現在のアイテムのいくつかのプロパティを設定します。
ここに表示されている値は各ビットの絶対値です。つまり、$ 0008が表示されている場合は、絶対値$ 0008を持つビット3を設定またはクリアする必要があることを意味します。

これは私の発見のリストです。

$ 0001:アイテムが有効になっています
$ 0002:アイテムが衝突しているか、このアイテムに更新が必要です
$ 0004:アイテムはまだゲームで有効になっていません
$ 0008:アイテムが落下しています(このアイテムには重力が働いています)
$ 0010:アイテムで負傷しました。ララのライフバーの表示を強制します
$ 0020:敵はまだ死んでいない。彼は有効にすることも、彼が生きていることもできる
$ 0040:敵は爆発で殺されました
$ 0100:敵が毒殺された
$ 0200:敵はAI_GUARDモードです
$ 0400:敵はAI_AMBUSHモードです
$ 0800:敵はAI_PATROL1モードです
$ 1000:敵はAI_MODIFYモードです
$ 2000:敵はAI_FOLLOWモードです
$ 4000:これは新しい自己作成アイテムです。GrenadeやCrossBow弾薬のように
Frame NowShort 現在のアニメーションの現在のフレーム番号です。
警告:この値は絶対値です。これは、アニメーションが開始されるときに、(最初のフレームのような)ゼロのかわりにBigNumberになる可能性があることを意味します。
相対(現在のアニメーションのフレームに対して)インデックスを絶対フレーム番号を変換するには、次の計算を実行する必要があります。

1)「Animation Now」フィールドを読む。
2)選択したアニメーションメモリにこの値を使用する。
3)選択されたアニメーションメモリで、「First absolute Frame index」フィールドを読み込む。

そして、この方法で現在のアニメーションの相対的なフレーム数を取得します。

RelativeFrameIndex= Item.FrameNow - Animation.FirstAbsFrameIndex
Height Floor below the itemLong このアイテムには、現在のアイテムの下にある床のY座標が含まれます。
値はアイテムのY座標と同じフォーマットであり、非常に頻繁に同じ値です。アイテムが地面に触れるたびに発生します。
HP VitalityShort このフィールドには、通常、現在のアイテムのHPの残量(ライフレベル)があります。
アイテムがこのフィールド内の敵(AI機能で移動可能)でない場合、このアイテムがキル可能でターゲティング可能ではないことを示す$ C000値になります。
Object buttonsShort このフィールドには、オブジェクトコードウィンドウで読み込んだ5つのボタン(+ Invisibleボタン)を示すビットが格納されます。
OCB CodeShort このフィールドには、NGLEプログラムのこのアイテムのOCBウィンドウに入力した数値が表示されます。
Position XLong 現在のアイテムのX座標。
X軸は、上下のビューで対応しています。
X座標は常に正の値をとります。
他のPosition YおよびPosition Zフィールドの場合と同様に、1セクタは1024単位、1クリックは256単位です。
Position YLong ポジションYは正と負の値を持ち、ララの垂直座標(フロアよりも上または下の点)を通知します。

上辺は負の値を持ち、下辺は正の値を持ちます。

Position ZLong 現在のアイテムのZ座標です。
Z軸は、左右の角度で対応しています。
Z座標は常に正の値をとります
他のPosition YおよびPosition Xフィールドの場合と同様に、1セクタは1024単位、1クリックは256単位です。
RoomShort 部屋のインデックスは、このアイテムがどこにあるかを示します。
備考:
- tomb4のインデックスは、NGLEで表示されるルームインデックスと異なる場合があります。これは、NGLEのプロジェクトに空きがあることによって異なります。
とにかく、正しいフリップエフェクトを使用して、部屋のインデックスでtomb4の部屋のインデックスを変換することができます。

- 部屋のインデックスの値は255を超えることはできません。したがって、このフィールドには短いサイズがありますが、必要に応じてこの番号をByte変数に格納することもできます。

Slot IdShort このフィールドには、現在のアイテムのスロット番号が含まれます。例えば、Lara = 0、AHMET = 102 など。
この番号をインデックスとして使用して、選択したスロットメモリを設定することができます。
Speed HorizontalShort このフィールドは、現在のアイテムの水平方向の速度です。
実際には速度は増分され、アイテムの現在の方向(直面)に続くX、Z座標に加算されます。
Speed VerticalShort このフィールドは垂直速度です。通常、下降(正の値)または上へのジャンプ(負の値)の速度です。
備考:ララが水中にあるときは、この速度値だけが使用され、水平速度は無視されます。
State Id NextShort このフィールドは、「State Id Now」フィールドのように機能しますが、次のStateIDを設定したままにします。
State Id NowShort このアイテムの現在のStateIDです。
ララのStateIDはよく知られていますが、他の敵もStateIDを持っています。
Transparence levelShort このアイテムは、現在のアイテムの透明度レベルを示します。
値が0のときは透明度がないので、アイテムは完全に不透明です。
値が126の場合、アイテムは完全に透明になります。
備考:アクショントリガを使用して、Moveableの透明部分を変更することができます。一方、この操作を変数で実行しようとすると、TRNGエンジンによって0以外の値では値が増え、値が127に達するとアイテムが削除されることに注意してください。
実際には、このフィールドにゼロ以外の値を入力するとアイテムは透明になり、その後削除されます。
透明性のみを設定する場合は、特定のアクショントリガを使用することをお勧めします。このアクショントリガはこのフィールドの値をフリーズして削除フェーズを停止します。
Unknown (落下時の加速度?)Short このフィールドでは加速値を維持できますが、いくつかのフィールドについては、ターゲットが不明です。
Unknown (Grenadeを撃った?)Short 謎のフィールド。
私が知っているのは、敵が手榴弾を撃ったときにこのフィールドに$ C210という値が書かれていることだけです。
Unknown (Sprite1 Id)Byte 謎のフィールド。
私の古い研究では、Moveableで使われているいくつかのスプライトだと思えたので、スプライトのインデックスでなければなりませんでしたが、今はよく覚えていません。
Unknown (Sprite2 Id)Byte このフィールドについては、他のフィールド「Unknown(Sprite1 Id)」の説明を参照してください。
Unknown CountDownShort このフィールドにはいくつかの調査が必要です。それはカウントダウンのように見えますが、どういう意味なのかは分かりません。それは遅延起動のためのカウンターかもしれません。
Unknowns (Light A - H)Long これは多くの未知のフィールドです。
それらはアイテムの光や色について使うことができましたが、現実にはわかりません。
Visible Mesh FlagsLong 各セットビットは、可視メッシュに信号を送ります。
メッシュ0ビット0(値= $ 1)、メッシュ1ビット1(値$ 2)、メッシュ2ビット2(値$ 4)。
デフォルト値は-1、つまりすべてのビットを有効にしてアイテムのすべてのメッシュを表示する$ FFFFFFFFFです。
メッシュを目に見えないようにしたい場合は、「Clear bit ..」で始まるフリップエフェクトにしてください。とにかく、メッシュを表示/非表示にするいくつかのアクショントリガが既にあることを覚えておいてください。


セーブデータメモリゾーン

セーブデータメモリの説明

このメモリには、すべての値がセーブデータに保存/復元されます。
値の大部分はインベントリアイテムですが、TRNG用の特別な値もあります。
フィールド名
サイズ
フィールドの説明
Inventory.
Keys 1 - 8
Keys 9 - 16
Pickup Items 1 - 8
Quest items 1-8
Byte これらのフィールドはすべて同じように動作します。各ビットは特定のアイテム番号の存在を知らせます。

$01 = Item 1
$02 = Item 2
$04 = Item 3
$08 = Item 4
$10 = Item 5
$20 = Item 6
$40 = Item 7
$80 = Item 8

Inventory.
Laser Sight
Binocular
Crow Bar
Byte アイテムが存在する場合の値は1、ない場合の値は0
Inventory.
Pistols mask
UZI Mask
Shotgun
CrowBow
Greanade-Gun
Revolver
Byte これらのフィールドはすべて同じように動作します。
それらは、それぞれの武器の存在と、弾薬とLASERSIGHTの存在を知らせるビットマスクを持っています。

$ 01 =武器は存在する
$ 02 =Unknow(おそらく「武器がアンロードされた」という意味です)
$ 04 =武器はレーザーサイトを装備しました
$ 08 =普通の弾薬
$ 10 =ワイドショット(Shotgun)、スーパー(Grenade)または毒矢(CrossBow)弾薬
$ 20 =爆発(CrossBow)またはフラッシュ(Grenade)弾薬

Inventory.
Small medipacks
Large Medipacks
Flares
Ammo Pistol
Ammo UZI
Ammo revolver
Ammo Normal Shotgun
Ammo Wide-shot Shotgun
Ammo Normal Grenade
Ammo Super Grenade
Ammo Flash Grenade
Ammo Normal CrossBow
Ammo Poisoned CrossBow
Ammo Explosive CrossBow
Short これらのフィールドはすべて、そのアイテムのそれぞれの数量を示します。

いくつかのメモ:

- Shotgunの弾薬は、インベントリで表示される数より6倍大きいです。例えば、通常のShotgunの弾薬に5が表示されている場合、「Ammo Normal Shotgun」は値30(6 * 5 = 30)になります。

- これらのフィールドのいくつかに-1がある場合、これは無制限の数量を意味します。
Inventory. Big Skin BagByte ビッグ水袋(Scalesで使用)の存在とその中のリットルの量を知らせるビットマスクです。

0 =行方不明
1 =存在するが空
2 =現在1リットル
4 =現在3リットル
6 =現在5リットル

Inventory. Combo items 1 - 4Byte コンボアイテムごとに2つの要素があることを知らせるビットマスクです。
コンボアイテムは2つに分割されたアイテムです。ララはそれぞれのアイテムを見つけ、両方のアイテムを所有しているときに、それらを結合して別の新しいアイテムを入手することができます。
このフィールドには、1つのコンボだけに関する情報があります。

$ 01 =パズル1のコンボアイテム1
$ 02 =パズル1のコンボアイテム2
$ 04 =パズル2のコンボアイテム1
$ 08 =パズル2のコンボアイテム2
$ 10 =パズル3のコンボアイテム1
$ 20 =パズル3のコンボアイテム2
$ 40 =パズル4のコンボアイテム1
$ 80 =パズル4のコンボアイテム2

Inventory. Combo items 5 - 8Byte これは、パズルアイテム5、6、7、および8の単一のコンボアイテムのインベントリの存在を表すためのビットマスクです。

$ 01 =パズル5のコンボアイテム1
$ 02 =パズル5のコンボアイテム2
$ 04 =パズル6のコンボアイテム1
$ 08 =パズル6のコンボアイテム2
$ 10 =パズル7のコンボアイテム1
$ 20 =パズル7のコンボアイテム2
$ 40 =パズル8のコンボアイテム1
$ 80 =パズル8のコンボアイテム2

Inventory. Little Skin BagByte リトル水袋(Scalesで使用)の存在とその中のリットルの量を知らせるビットマスクです。

0 =行方不明
1 =存在するが空
2 =現在1リットル
4 =現在3リットル

Inventory. Mechanical ScarabByte このフィールドは、単一のメカニカルスカラベの存在を維持するためのマスクビットです。

1 =フルメカニカルスカラベ(キーがスカラベに取り付けられています)
$ 02 =インベントリに巻き取りキーがあります
$ 04 =インベントリにメカニカルスカラベ(キーは装備されていない)

Inventory. Remaining usage of Mechanical ScarabShort このフィールドは、メカニカルスカラベがどれくらい使用されたかを記録します。
値が0の時、ララがもう一回使用すると、スカラベは爆発します。
スカラベがインベントリにない場合、または(スカラベとキー)のいずれか1つしかない場合、値は0です。
メカニカルスカラベが完成したばかりのとき、エンジンはこのフィールドに値3を入力します。
スカラベが使用されるたびにこの値は1だけ減少します。
Inventory.
Examine Item 1
Examine Item 2
Examine Item 3
Puzzle Item 1
Puzzle Item 2
Puzzle Item 3
Puzzle Item 4
Puzzle Item 5
Puzzle Item 6
Puzzle Item 7
Puzzle Item 8
Puzzle Item 9
Puzzle Item 10
Puzzle Item 11
Puzzle Item 12
Byte これらのフィールドの値は単純に数です。
ゼロは「欠落」を意味し、他の値はこのタイプのアイテムがララによってどれだけ集められたかを示します。
Lara. Air for LaraShort これは水中でのララの酸素量です。
最大酸素量(バーがいっぱいのとき)は1800ですが、値が0のときはHPバー(ライフレベル)が減少し始めます。
Lara. Current WeaponShort このフィールドには現在選択されている武器が格納されますが、この武器は必ずしもララの手の中ではありません。
このフィールドには、プレイヤーがDRAW WEAPONコマンド(スペースバー)を使用するときに、どの武器が抽出されなければならないかがエンジンに伝えられます。

0 =何もない
1 =Pistol
2 =Revolver
3 =UZI
4 =Shotgun
5 =Grenade
6 =CrossBow

Lara. Environment where lara is.Short このフィールドは非常に重要で、水、水中または地面といった、どのような環境であるかを伝えます。
ララを管理するためのすべての手順は、この値に従って劇的に変化します。

0 =地面だけでなく登山、モンキースイング、ジャンプ、落下
1 =水中
2 =水上浮遊
3 =特別:dozy、車両、ハードコーディングされたカットシーン
4 =足首ぐらいの浅い水

Lara. Hands. Attached Lara StatusShort このフィールドは、彼女の手の中のアイテムに関するララの現在の動作を記録します。
1 =特殊付属品:ポールロープ、乗り物、壁をつかむ
2 =彼女はアイテム(武器、トーチ、フレア)を拾っている
3 =彼女はアイテム(武器、トーチ、フレア)を手放している
4 =彼女は手の武器やトーチ(フレアではない)をつかんでいる
Lara. Hands. Item in the Hands of Lara (current)Short 現在のアイテムをララの手に保持します。アイテムが手になければ0にします。
このフィールドの値は、次の値を持つことができます。
0 =何もない
1 =Pistol
2 =Revolver
3 =UZI
4 =Shotgun
5 =Grenade
6 =CrossBow
7 =フレア
8 =トーチ

トリック:このフィールドに値8(=トーチ)を書いて、「Attached Lara Status」フィールドに値2(=ララがアイテムを投げている)を書き込むと、ララの手には存在しないにもかかわらずトーチが作成されます。

Lara. Hands. Item in the Hands of Lara (next)Short このフィールドは、「Lara. Hands. Item in the Hands of Lara (Current)」のフィールドのアイテムと同じ値ですが、このフィールドにはララが取るであろうアイテムが格納されます。
Lara. Hands. Remaining time with lighted flare in the handShort これは、ララがフレアを手に入れたときにティックフレーム単位(1秒= 30ティックフレーム)でカウントダウンを維持します。
カウントダウンがゼロ(0)に達すると、ララはフレアを捨てます。
最大値は900または1000と思われ、それはフレアの最大維持値です。
Lara. Hands. Weapon in the handShort このフィールドは、ララの手の武器を表しています。
備考:ララがこのフィールドに武器(フレア、トーチ)と異なるアイテムを保持している場合、0

0 =何もない
1 =Pistol
2 =Revolver
3 =UZI
4 =Shotgun
5 =Grenade
6 =CrossBow

Lara. Item Index of LaraShort これは、アイテムメモリのララのインデックスです。ララのアイテムメモリに対する操作を実行する場合は、このフィールドの値を読み取り、「Item Index of Selected Item Memory」にコピーできます。
このインデックスの値はtomb4のフォーマットであり、すぐに使うことができますが、ララに関するNGLEプログラムで見られるインデックスとは異なる場合があります。
Lara. Poison1Short このフィールドには、ララへの毒の量が表示されます。
これは、レベルの画面の変形を設定するために使用されます。大きな値でより大きな変形になります。
このフィールドは常にPoison2の値が同じです。異なる値を設定すると、短時間に同じ値になります。

大きなサソリの毒は2048

Lara. Poison2Short このフィールドは、Lara Poison1と連携して動作します。
このフィールドはPoison1よりも重要であると思われます。なぜなら、このフィールドに0以外の値を入れてPoison1を0にするとララは毒状態になりますが、逆にすると何も起こらないからです。
Lara. Rope. Speed sliding on the ropeShort ララはロープをつかんでいて、スイングのスピードを加速させようとしています。
Lara. Special Status of LaraByte これは、ララのステータスを示すフラグ付きのビットマスクです。

$ 01 =ララはトーチやフレア(武器ではない)をにぎっている
$ 04 =ララは地上の乗り物に乗っている(要検証)
$ 08 =ララは燃えている、dozyモードにいる、彼女が殺されている
$ 10 =ララはしゃがんでいる(要検証)
$ 20 =ララのスワップメッシュが実行中(要検証)
$ 40 =ララはモンキーな属性を持つセクターにいる

Lara. Special2 Status of LaraByte ララのその他のステータス。

0x04 =ララはひっくり返っています(要検証)
0x20 =ララは燃えているトーチを持っています(要検証)
0x40 =ララはロープを持っています(要検証)

Lara. Test. Climb sector TestShort このフィールドはあまり役に立ちません。それは、登ることの出来る壁があったとしても、それがどこにあるのか、その壁が何であるか、またはこの壁に近づいているかどうかは分からないからです。
唯一の用途は、このフィールドにゼロを入力し登れないようにすることですが、エンジンがこのフィールドを正しい値に更新し続けるので、それが機能するかどうかはわかりません。
Lara. Test. Lara has a flare in her handShort ララがフレアを持っているとき、このフィールドは値= 1になる。
Lara. Test. Lara is on ropeShort このフィールドには、ララがいるロープのインデックスが含まれていなければなりません。
このフィールドに-1がある場合、ララはロープにいませんが、値が-1と異なる場合はロープにあり、値はララによって使用されるロープアイテムのインデックスです。
Lara. Test. Lara is placing the weapon on the backShort ララが武器をしまうとき、この武器(Shotgun、CrossBow、Grenade)は背中にかつぐものの1つである。このフィールドは1になる。
Lara. Test. Throw out item from the HandsShort ララがトーチやフレアを投げ込んでいる場合、または彼女が武器をしまっている場合。
1 =彼女はアイテムを投げ捨てている。
Lara. Weapon on the back of LaraShort このフィールドには、CrossBow、Grenade、CrowBarなどの武器が含まれています。
値はスロットインデックスです。例えば、このフィールドにCrossBowがある場合、値は356になります。

備考:明らかに、このフィールドはララのメッシュのホルスターの存在も変えるかもしれませんが、私はこの問題を研究する時間がありませんでした。

Statistics.
Secrets
Used MediPacks
Byte 見つけたシークレットの数と使用したメディパックを統計画面に示します。
Statistics. DistanceLong このフィールドには、ララが、これまでゲーム全体で移動した距離が含まれています。
使用される単位は、このように計算される。この値の1メートル= 419単位。
Statistics. Killed EnemiesShort 統計画面に表示されるララが、これまでゲーム全体で殺した敵の数です。
Statistics. Used AmmosShort このフィールドは、統計画面の使用された弾薬に対応します。
System. Auto-Aiming for EnemyByte 私は覚えていませんが、このフィールドには、ララが目指す現在の敵についての情報、または自動照準モードが有効になっている場合は少なくなっています。(要検証)
System. Core Game TimerLong このフィールドはあまり役に立ちません。理論的には、冒険の開始からの経過時間を記録しなければなりませんが、実際にはこれは最後のロードゲーム操作の値だけです。
この値は、最後にゲームをロード/セーブした後にのみ更新されます。
コアゲームタイマーのアクティブバージョンをチェックしたい場合は、コードメモリに「Frame 3d Counter」を、またはゲームメモリに「TRNG Organizer Timer」を使用する必要があります。
System. Disable special keysShort これは奇妙なフィールドです。
このフィールドに値= 15が設定されている場合、プレイヤーは、インベントリ管理、一時停止、セーブゲーム、またはセーブゲーム画面の読み込みを行うことができます。
System. Fog Bulb ColorLong 霧の電球の色です。
System. Index of enemy aimed by LaraLong これは現在、ララが目指している敵のインデックスです。これはララの武器の現在の目標です。
ララが敵をターゲットにしていない場合、このフィールドの値は-1です。
System. Number of current LevelByte Script.datの[Level]セクションの次に続く現在のレベルの番号です。
タイトルは0で、最初の再生可能レベルは常に1です。
System. Screen TimerLong これは、「Run for the iris」レベルで見たのと同じ画面時間です。
ティックフレーム(1秒= 30ティックフレーム)です。
エンジンはゼロと異なるときにのみこの値を増加させます。
このフィールドが0以外の場合、タイマーは画面に表示され、0の場合はタイマーは非表示になり、このフィールドは無視されます(これ以上は増加しません)。
System. Unknown (インベントリから選択されたアイテム?)Long このフィールドは、インベントリで選択された最後のアイテムとリンクしていますが、インベントリアイテムの選択をチェックする場合は、GT_USED_INVENTORY_ITEM GlobalTriggerを使用することをお勧めします。
TRNG Index. Animation Index for Selected Animation MemoryShort 「variables. memory ... Selected Animation memory」フリップエフェクト/コンディションでアニメーションメモリを確認または変更するために使われます。
この値を変更して、確認または変更するアニメーション構造を選択することができます。
TRNG Index. Index of found ItemShort これは、TestPositionコマンドまたはGT_DISTANCE_FROM_ITEM GlobalTriggerのような、いくつかのTRNG条件で見つかったアイテムの索引です。
TriggerGroupコマンドでは、TGROUP_USE_FOUND_ITEM_INDEXフラグを使用してこのインデックスの使用を強制することができます。このように、エクスポートされたトリガに存在するアクショントリガのより詳細なインデックスは無視され、TRNG関数の最後のアイテムについてこのインデックスが使用されます。
このインデックスは、いくつかの変数にインデックスが格納されたアイテムに対してアクショントリガを実行するために非常に便利です。この「Found Index」フィールドにインデックスをコピーし、TGROUP_USE_FOUND_ITEM_INDEXフラグでエクスポートされたトリガを実行するだけです。
TRNG Index. Index of moveable performing last AnimComandShort 最後に実行されたAnimCommandsを所有するMoveableのインデックスです。
TriggerGroupでは、TGROUP_USE_OWNER_ANIM_ITEM_INDEXフラグを使用してこのインデックスの使用を強制できます。
TRNG Index. Item Index for Selected Item MemoryShort これは、変数で変更するアイテム構造を選択するために使用されるインデックスです。メモリフリップエフェクトは、選択されたアイテムメモリ上で動作します。
通常、アクショントリガを使用して、使用するアイテムメモリを設定しますが、この変数を渡す場合は、アイテムのインデックス番号を入力できます。アイテムメモリに関するフリップエフェクトでこの希望のアイテムのメモリを読み書きします。
TRNG Index. Slot Index for Selected Slot MemoryShort これはTRNGインデックスです。
変数とスロットメモリに関する操作を実行すると、TRNGエンジンはこのインデックスを使用して、使用されるスロットを認識します。
したがって、このインデックスには、確認または変更したいスロットメモリのスロットインデックスを書き込むことができます。
TRNG Organizer TimerLong Organizerコマンドを計算するためにTRNGが使用するタイマーです。
Organizerがあってもなくても、このフィールドはフレームごとに常に更新されます。
このため、イベントからどれくらいの時間が経過したかを検出することができます。
「ヒントとコツ」の章を参照してください。

備考:このタイマーはゲームで更新されますが、インベントリ中または一時停止中にこのタイマーは停止されます。



コードメモリゾーン

コードメモリの説明

フィールド名
サイズ
フィールドの説明
Audio Track Number on Channel 1Short このフィールドは、bass.dll機能を使用している場合にのみ機能します。
このフィールドには、現在チャンネル1で再生されているオーディオトラックの数が表示されます。オーディオトラックが再生されていない場合は-1です。
Audio Track Number on Channel 2Short このフィールドは上記と同様に動作しますが、チャンネル2用です。
Camera Mode Now
Camera Mode Next
Long これらのフィールドは、カメラの種類に関する表示を含む。カメラモード。

0 =追尾カメラ
1 =固定カメラ
2 =見回す
3 =戦闘カメラ

Current Level numberByte このフィールドには現在のレベル番号が格納されます。0はタイトル、1は再生可能な最初のレベルです。
備考:この値は、セーブデータメモリにある「System. Number of current Level」よりも更新されています。
Dash Bar Value Short ダッシュバーの値です(ララがダッシュしている時に実行されます)。
最大値は120です。
Earthquake vertical movement Long このフィールドには地震の影響がある場合、カメラビューのY軸の垂直方向の移動距離とに負の値があります。
Frame 3d CounterLong このフィールドは「Frame System Counter」のように機能しますが、唯一の違いはこの「Frame 3d Counter」がPAUSEモードで停止することです。
Frame System Counter.Long これはゲームのチックフレームのメインカウンターです。
これは、セーブゲームやポーズモードでも機能します。
上記の理由から、「ヒントとコツ」セクションで説明されている署名付き時間の方法については良い選択ではありません(画面上にメニューがある時間を含みます)。
Inventory Item required in gameLong このフィールドには、スイッチ(キーを尋ねる)、ドア(CrowBarを尋ねる)、ジープ(ジープのキーを求める)などのインタラクティブオブジェクトによって必要とされるインベントリアイテムのスロット番号が一時的に保存されます。
KeyBoard Game Command hitLong プレイヤーがキーによってララを移動させた(または何かさせた)とき、ここにそのキーコマンドのコードが表示されます。
値をテストするか、ビット操作(ビット/クリアビットの設定)を使用して(理論的に)それらを変更することができます。

NG_Center[Reference]にあるKEY1_とKEY2_の定数です。
備考:KEY2_の値をテストする場合は、実際の絶対値を得るために右に4つのゼロ「0000」を加えなければなりません。

例えば、現在あるかどうかを確認する場合は、次のようになります。

$ 4000 KEY2_DASH

この値は「$ 40000000」のように表示されます(右側に4つの「0」が追加されています)。
ビット数としては以下のようになります。

ビット30($ 40000000; 1073741824)
Music volumeLong このフィールドには、オーディオトラックの音量です。
最大値は100です。
このフィールドを変更すると、TRNGエンジンは音量を変更しますが、bass.dllを使用している場合にのみ機能します。
Screen.
Width game screen in pixel
Height game screen in pixel
Short これらのフィールドには、現在のゲームスクリーンのスクリーンサイズがあります。
この値を変更して現在の解像度を変更するのに、あまり有用ではありません。とにかく、コンディショントリガ+文字列を表示してプレイヤーにセットアッププログラムによる現在の解像度の変更を通知するのに、画面がごくわずかかどうかをチェックするために使用します。
Script Dat. Level FlagsShort 現在のレベルのScript.datからのフラグを持つビットマスクです。

$ 0001 =YoungLara
$ 0002 =Weather
$ 0004 =Horizon
$ 0008 =Layer1
$ 0010 =Layer2
$ 0020 =StarField
$ 0040 =Lightning
$ 0080 =Train
$ 0100 =Pulse

0x0200 ColAddHorizon
0x0400 ResetHub
0x0800 LensFlare
0x1000 Timer
0x2000 Mirror
0x4000 RemoveAmulet
0x8000 NoLevel

Script Dat. Option FlagsByte このフィールドは、Script.datファイルの設定を保存するマスクビットです。
単一のビットを読んだり、変更したりすることができます。

$ 01 =FlyCheat有効になっています
$ 02 =LoadSaveが有効になっています
$ 04 =タイトルレベルがあります
$ 08 =PlayAnyLevelが有効になっています
$ 80 =DemoDiskを有効になっています

Sound SFX volumeLong 効果音の音量です。
最大値= 100
Speed Layer1
Speed Layer2
Byte これらのフィールドは、Layer1(またはLayer2)スクリプトコマンドの第4フィールドの値タイプをホストします。

範囲の値:-16 +16
負の値を使用するとアニメーションの動きが反転します。

Test. Disable Fog BulbsByte このフィールドでは、ソフトウェアを介して霧の電球を無効にすることができます。
このフィールドが1のとき、霧の電球はゲームでは隠されます。
Test. How entered in current gameLong このフィールドには、このゲームセクションの開始方法を示す値があります。
とにかく0= 新しいレベル、4= セーブゲームからロードされた。すべての値はわかりません。
Test. There is a Flyby in progressLong フライバイが進行中の場合、このフィールドは= 1であり、フライバイが進行中でない場合は0です。


スロットメモリゾーン

スロットメモリの説明

スロットメモリの操作を行う前に、「Variables. Memory. Set the <&>Slot as Selected Slot Memory」フリップエフェクトを使用して、次の操作に使用するスロットを選択してください。
フィールド名
サイズ
フィールドの説明
Explosion Mask.Long それはマスクビットです。各ビットは、それを爆発させることができる武器である可能性があります。(要検証)
First Animation IndexShort 現在のアイテムで使用されている最初のアニメーションの絶対インデックスです。
このフィールドは、アイテムに関するアニメーションの相対的な数を計算するのに重要です。
アイテムメモリの「Animation Now」フィールドも参照してください。
First Mesh IndexShort 現在のMoveableのメッシュの最初のメッシュの絶対数です。
これは、Moveableのメッシュの相対メッシュを取得するために使用する必要があります。
現在、このフィールドは有用ではありません。
Flags. Main flagsShort 現在のスロットに関する多くの機能を通知するためのビットマスクです。

$ 0001 =このスロットは存在します(このレベルに0がない場合)
$ 0002 =クリーチャー。AI機能付きアイテム
$ 0008 =これらのアイテムの位置は、セーブデータで保存して復元する必要があります
$ 0010 =知られていないが、それは「地面に動きがある」
$ 0020 =不明ですが、「このアイテムはレベル内で移動できます」
$ 0040 =不明ですが、「このアイテムには衝突があります」
$ 1000 =このアイテムの効果音(メインシーンでは0の場合)
$ 2000 =軽い武器(ピストル、UZI)に耐えるクリーチャー

FootStepShort ララまたは敵の影(要検証)
HP. Max Vitality at startShort このフィールドには、現在のスロットタイプのすべてのアイテムのデフォルトの開始時のHPがあります。
このフィールドでスロットがキル可能でない場合、$ c000の値になる可能性があります。
Number of MeshesShort 現在のMoveableのメッシュの数です。
Pointer for Collision ProcedureLong 現在のアイテムとララの衝突をチェックします。
このフィールドに0を入力すると、このスロットを持つすべてのアイテムは衝突を失い、ララはそれらの間を通過できるようになります。
Pointer for Draw Extra ProcedureLong アイテムの余分なオプションを描画する手続きポインタ。
ジープとサイドカーに使用されています。
Pointer for Emitter ProcedureLong アイテムが他のアイテムに発行できる場合、このポインタには、この操作のためのコードを入力します。
Pointer for Initialization ProcedureLong このスロットを持つすべてのMoveableは、このフィールドに格納されたアドレスを持つプロシージャによって初期化されます。
このフィールドを変更するのは有用ではありません。
Pointer for Main Control ProcedureLong メインコントロールプロシージャアドレス。
メインコントロールプロシージャは、AIに適用され、アイテムを移動し、現在のアイテムタイプに関する他の「アニメーション」機能を実行する。
このフィールドに0を入力すると、このスロットのすべてのアイテムが凍結します。
とにかく、いくつかのアイテムを凍結する場合は、アクショントリガを使用して移動を凍結するほうがよいでしょう。
Pointer for Special Ceiling ProcedureLong このプロシージャは、天井のアイテムを処理する必要がありますが、それは少し神秘的です。
Pointer for Special Floor ProcedureLong 特別なプロシージャのポインタはほとんどMoveableにだけ存在します。
私はそれがこれらのアイテムの上を歩くことが許されていたと思うが、私は確信していない。
Test Attack LaraShort Moveableの敵タイプの信号、つまりアイテムはララを攻撃する必要があります。(要検証)

値1 =ララを攻撃する
値0 =ララを無視する

Unknown1Short おそらくMIPバージョンを有効にするための距離。
Unknown2Short 通常、値は50です。
Unknown3Short Item構造体のCustom_Bアイテムにコピーされます。
Unknown4Long これについてはわかりません。


アニメーションメモリゾーン

アニメーションメモリの説明

アニメーションメモリを使用する前に、「Variables. Memory. Set <&>Animation as Seleted Animation Memory.」フリップエフェクトトリガを選択してください。
備考:この表では、既知または有用なフィールドのみが記述され、他のフィールドは無視されていますが、選択されたアニメーションメモリのフリップエフェクトで全てのフィールドを見つけることが出来ます。
フィールド名
サイズ
フィールドの説明
First absolute Frame indexShort このフィールドは、このアニメーションで使用される最初のフレームのインデックスです。
このフィールドを使用すると、現在の相対フレーム番号を検出できます。
アイテムメモリの「Frame Now」フィールドも参照してください。
Frame RateByte このフィールドは繰り返しフレームを掛け合わせるため、この数値が大きいほどアニメーションが遅く見えます。
Frame SizeByte このフィールドはフレームに必要なバイト数を示しますが、現在のアニメーションが存在するかどうかを検出するために読み取り専用でこのフィールドを使用できます。
FrameSIze = 0の場合、アニメーションが欠落しています。
Next Animation indexShort これは、この最後に実行されるアニメーションのインデックスです。
Number of Animation CommandsShort このアニメーションにAnimCommandsが含まれている場合、このフィールドにはAnimCommandsの数があります。それ以外の場合は0になります。
Number of State ChangesShort このフィールドには、このアニメーションのState Changesレコードの数があります。
Stateは複雑なビットで、現在のアニメーションとMoveableのNextStateIDフィールドと同じStateIDを持つ別のアニメーションを渡す正しいフレームを選択するために使用されます。
SpeedShort 現在の水平移動速度を変更する必要がありますが、このフィールドは非常に頻繁に0です。
State IdShort アニメーションが実行されると、このStateIDはMoveableのために設定されます。


インベントリメモリゾーン

インベントリメモリゾーン

インベントリメモリフィールドで操作を実行する前に、フリップエフェクトを使用して常にTriggerGroupを起動して、選択したインベントリメモリを作業対象に設定するようにしてください。
フリップエフェクトは次のとおりです。
「Variables. Memory. Set the <&>Inventory item as Selected Inventory Memory」
フィールド名
サイズ
フィールドの説明
Distance of Cam.Short この値は、カムからのアイテムの距離がどのくらいであるかを示します。
距離が大きくなると、アイテムは小さく表示され、距離が小さくなるとアイテムが大きく表示されます。
Slot of Mesh to show in InventoryShort このフィールドには、アイテムのスロット番号が表示されます。
スロットは、インベントリ画面に正しいメッシュを表示するためにのみ使用されます。
例えば、Large Medipackの場合、スロット番号は368です。
String index of NameShort このフィールドにはStringのインデックス(English.datから)がアイテムの下の画面に表示される名前と一緒にあります。
例えば、「Load」アイテムの場合、数値は78。
Top Border in 2d plane.Short この値は、オブジェクトを上または下に移動するための2次元ビューでの調整です。
インベントリのアイテムがあまりにも上すぎる場合は、このフィールドを増やし、アイテムを下げ、アイテムが低すぎる場合は、このフィールドを減らし、アイテムを上げることができます。
Type FlagsShort このフィールドはフラグをホストします。それぞれが特定の機能を有効にするために使用される1つ以上の単一の値。

このフィールドは異なるフィールドであるため、[View Flags]と混同しないでください。
タイプフラグは、このアイテムのいくつかの対話的な特徴を示しました。

これらは許容されるフラグです。

$ 0001 =このアイテムを表示する(存在する)
$ 0002 =テキスト「EQUIP」テキストを表示する(武器に使用される)
$ 0004 =テキストを表示する「USE」テキスト(多くのピックアップやキーで使用されます)
$ 0008 =「COMBINE」テキストを表示する(水袋/パズルコンボ、武器+レーザーサイト)
$ 0010 =「SEPARATE」テキストを表示する(レーザーサイト付きの武器について)
$ 0020 =「EXAMINE」テキストを表示する
$ 0040 =Shotgun弾薬(ノーマルショットまたはワイドショットを選択可能)
$ 0080 =CrossBow弾薬(普通、毒矢、爆発物を選ぶことを選択可能)
$ 0100 =Grenade弾薬(ノーマル、スーパー、フラッシュを選択可能)
$ 0200 =UZI弾薬
$ 0400 =ピストル弾薬
$ 1000 =ゲームをロードする
$ 2000 =ゲームを保存する
UnknownLong 私はこのフィールドの平均を知らない。
私はこのフィールドに常に2つの値しかないことを知っています:+1または-1。
0または1、+ 1以外の数を入力すると、アイテムのメッシュがインベントリから消えているように見えます。
View FlagsShort このフィールドはフラグをホストします。それぞれが特定の機能を有効にするために使用される1つ以上の単一の値。
私は各値の平均を知らない。
確かに値2は次のことを意味します。
$ 4000と$ 8000のフラグは使用方法とリンクしていますが、どのように動作するのかよくわかりません。
X Facing about the cam view on X AxisShort このフィールドは、PuzzleスクリプトコマンドのOrient_Xフィールドと同じ値です。
Y Facing of an ideal cam placed in front of the item.Short このフィールドは、PuzzleスクリプトコマンドのOrient_Yフィールドと同じ値です。
Z Facing about the cam view on Z AxisShort このフィールドは、PuzzleスクリプトコマンドのOrient_Zフィールドと同じ値です。


変数サンプルプロジェクト

TRNG Variablesに関するサンプルプロジェクトでは、変数、クリティカルメモリ、新しいGlobalTriggerの高度な使い方についてのデモンストレーションが含まれています。
まだサンプルレベルをプレイしていない場合は、今すぐプレイするほうが良いでしょう。そうでなければ、この章を理解することはできません。

TRNGTimerと得られたメディパック

この効果を実現するために、TRNGLocalTimerを使用して、これらの3つのフリップエフェクトトリガで30秒からカウントダウンを実行します。

TRNGTimerを開始する

; <#> : Variables. Timer. Initialize <&>TRNG Timer to (E)Seconds
; <&> : Global Timer
; (E) : Seconds=   30

; <#> : Variables. Timer. Start the <&>TRNG Timer in (E)Mode
; <&> : Global Timer
; (E) : Decreasing Timer (Countdown)

; <#> : Variables. Timer. Show <&>TRNG Timer in (E)Position
; <&> : Global Timer
; (E) : POSITION_TOP_CENTER
3つのフリップエフェクトトリガの内容は以下の通り。

1)タイマーの値を設定する
2)カウントダウンを開始する
3)タイマーを表示する。なぜなら、場合によってはタイマーは隠れているから。

タイマーが所定の値に達したかどうかを検出する

次に、GlobalTriggerコマンドを使用して、タイマーが0になったかどうかを検出します。
その場合には、プレイヤーは時間を使い切ったことを意味し、時間の終了を知らせるテキストを表示します。
; Exporting: TRIGGER(259:0) for FLIPEFFECT(66)
; <#> : Text. Set <&>color and (E)position for next Print String flipeffect
; <&> : Red
; (E) : Bottom line, central alignment
; Values to add in script command: $2000, 66, $103

; Exporting: TRIGGER(772:0) for FLIPEFFECT(64)
; <#> : Text. Print ExtraNG <&>string on screen for (E) seconds
; <&> : 4: The time is completed
; (E) :    5 seconds
; Values to add in script command:  $2000, 64, $504

; Exporting: TRIGGER(513:0) for FLIPEFFECT(270)
; <#> : Variables. Timer. Hide <&>TRNG Timer in (E)Seconds
; <&> : Global Timer
; (E) : Seconds=    2
; Values to add in script command: $2000, 270, $201

TriggerGroup=1, $2000, 66, $103, $2000, 64, $304, $2000, 270, $201

GlobalTrigger=1, IGNORE, GT_TRNG_G_TIMER_EQUALS, 0, IGNORE, 1
メディパックで保存した秒数を変換する

別の方法として、レース終了時にタイマーを止めることができれば、最も興味深いことです。
そのセクターには、Script.datファイルでTriggerGroup = 2を実行するトリガがあります。
; Exporting: TRIGGER(1:1) for FLIPEFFECT(265)
; <#> : Variables. Timer. Stop the <&>TRNG Timer
; <&> : Global Timer
; (E) :
; Values to add in script command: $2000, 265, $1

; Exporting: TRIGGER(769:1) for FLIPEFFECT(270)
; <#> : Variables. Timer. Hide <&>TRNG Timer in (E)Seconds
; <&> : Global Timer
; (E) : Seconds=    3
; Values to add in script command: $2000, 270, $301

; Exporting: TRIGGER(51:0) for FLIPEFFECT(271)
; <#> : Variables. Numeric. Copy <&>Numeric Variable to CurrentValue
; <&> : Global Long Timer
; (E) :
; Values to add in script command: $2000, 271, $33

; Exporting: TRIGGER(7935:0) for FLIPEFFECT(253)
; <#> : Variables. Numeric. Divide <&>Numeric Variable by (E)Value
; <&> : Current Value
; (E) : Value    30
; Values to add in script command: $2000, 253, $1EFF

; Exporting: TRIGGER(58:0) for FLIPEFFECT(273)
; <#> : Variables. Memory. Add to <&>Savegame Memory the CurrentValue
; <&> : Inventory. Small medikit (Short)
; (E) :
; Values to add in script command: $2000, 273, $3A

; Exporting: TRIGGER(1286:0) for FLIPEFFECT(64)
; <#> : Text. Print ExtraNG <&>string on screen for (E) seconds
; <&> : 6: You saved #0800 seconds\ntherefore you gained #0800 medipacks.
; (E) :    5 seconds
; Values to add in script command: $2000, 64, $506

TriggerGroup=2, $2000, 265, $1, $2000, 270, $301, $2000, 271, $33, >
             $2000, 253, $1EFF, $2000, 273, $3A, $2000, 64, $506
我々は以下の操作を行いました。

1)タイマーを停止する
2)タイマーを非表示にします(そうでなければ、タイマーは静止していても永遠に画面に残ります)
3)次に、LocalTimer変数から次の時刻を読み込みます
4)そして、その値を30で割りました。なぜなら、タイマーはティックフレーム単位で働くからです。毎秒30単位
5)今度はCurrentValue変数に保存秒数があり、それをメディパックで変換することができます
6)現在の値を、インベントリ中のメディパックの数が少ないセーブゲームメモリのフィールドに追加する
7)最後に、CurrentValueのプレースフォルダにテキスト「#0800」を入力して結果を表示します。

ジャンプゲインのスキル

このスキルで使用されるすべてのエクスポートされたトリガは、Script.txtファイルでコメントとともに表示されます。
ここでは、使用する方法を普通の言語で、この手順で必要な問題の解決を説明します。

ジャンプを強化する計算

ジャンプの長さを増やすには、別の方法があります。ジャンプと同時に、より大きな距離になるように、水平速度を上げることができます。
もう1つの方法は、3d世界のララの垂直座標であるY座標を変更することです。
Y座標は負の値で上に移動し、正の値で下に移動するので、ララを高くジャンプさせるために、Y座標に値を減算する(負の値を追加する)必要があります。
より現実的なジャンプを得るために、両方の方法を同時に使用しました。

ジャンプゲインの価値をどこから得ることができますか?

ジャンプを増やす方法を決めたら、この計算を実行するためにどの値を使うかを選択する必要があります。つまり、上記の数式で使用するジャンプゲインの値です。

私はダッシュバーの残りのダッシュ速度を選びました。コードメモリにこの値が設定されています。これは、フィジカルと一貫しています。ジャンプする前にララを速く走らせると、ジャンプが大きくなるはずです。
実際には、この方法ではジャンプゲイン値を得るのに退屈な問題がありました。ララがダッシュフェーズにあるときにエンジンはジャンプを許さず、ララが通常速度に戻ると、エンジンはララにジャンプを許可します。

この問題を回避するために、私はジャンプを開始する近くのセクターに、残ったダッシュの速度を捕らえるためのトリガを置きました。
このようにして、残りの速度を捕まえるために使用されるTrigggerGroupは、実際のジャンプの直前に動作するので、意味のある値をとることができます(ララがジャンプしているときにこの値が常に0になるのとは異なります)。

今後の拡張

これらのセクターストリップをすべてのジャンプゾーンに配置する必要があるため、これは退屈です。
とにかくこれは、新しいスキルを追加する方法を説明するためのサンプルであり、得られる最高のスキルはありません。
ジャンプゲインとして使用する値を得るための一般的な方法があります。GlobalTriggerといくつかの条件を使用してこの値を取得すると、すべてのジャンプゾーンにトリガが置かれます。
例えば、非力なララが訓練で強くなるようなことを変数を使って再現することができます。この値は、多くのゲームで起こるように、より多くのララジャンプとより多くのジャンプスキルを習得することができます。

ジャンプゲイン値をキャッチ

1)ララはジャンプゾーンに近いセクタに触れる。
2)TrigggerGroup = 3が実行されます。
3)このTriggerGroup 3では、コードメモリ「Dash Bar Value」の値が読み込まれます。
4)「Dash Bar Value」の値が120のダッシュバーがないため、120 - 「Dash Bar Value」を実行し、この方法でジャンプゲインとして使用する値を取得します。
5)ジャンプゲイン > = 1の条件を確認します。
6)条件がtrue(ジャンプゲイン > = 1)の場合、使用するジャンプゲインがあることを通知するビットを設定します。
7)Local Long Alphaのビット0(絶対値$ 01)を使用しました。
8)今度は、有効なジャンプゲインを捕まえた瞬間を覚えてTRNGLocalTimerを開始します。この動作の理由は、スーパージャンプを実行する最大時間を与えることであり、この時間が経過するとジャンプゲインを打ち切るためです。この有効期限の理由は、作成されたダッシュ値とすぐに使用されないダッシュ値が、後で何度も使用されることを避けるためです。

ジャンプを検出し、ジャンプゲインを適用する

1)GlobalTrigger = 2を使用して、ジャンプ中であることを確認し、同時にLong Long Alphaのビット0(値$ 01)を設定します。この条件はTriggerGroup = 4であり、このTriggerGroupはGlobalTrigger = 2のConditionTriggerGroupフィールドに配置されます。
2)両方の条件が真であれば、ジャンプゲインを適用することができます。
3)速度とY座標を変更するトリガはTriggerGroup = 5で、GlobalTrigger = 2のPerformTriggerGroupフィールドにID = 5を設定します。
4)Horizontal Speedを、次のように計算された値に置き換えます。ジャンプゲイン(Local Short Beta1変数に保存)+ 75(75はフォワードジャンプの一般的な水平速度です)、ジャンプゲイン値だけ標準的なH_Speedを増やすことができます。この方法は、ジャンプゲインをH_Speed値に直接追加するよりも優れています。そうでなければ、巨大なH_Speedを作成し続けなければなりません。
5)そして、ララを上に動かす座標を減らしますが、この計算では、LS_Beta1では元のジャンプゲインを使用できません。それは大きすぎる可能性があり、ララは通常のように飛んで飛び降りる可能性があるからです。
6)したがって、一時的にジャンプゲインの値を減らしてからY positionを減らします。
7)ジャンプゲインを4で除算し、この値をY Positionから引きます。
8)ジャンプゲインを示すテキストを出力します。ジャンプモードがオンになるまで継続的に続くため、1秒間のテキストを使用しました。
9)最後に、LocalTimerをクリアして開始します。これはもう一つの有効期限を持つことです。この場合、ジャンプが完了したらビット0(値$ 01)をクリアする必要があります。したがって、ジャンプがタイマーにある間は、すべてが機能し、GlobalTrigger = 2の条件が偽になると、LocalTimerは続行できますが、継続的にクリアされます。

ジャンプが完了したらすべてクリア

1)今度は、ジャンプゲインを通知するためにLocalLongAlfaのビット0が設定されていますが、ジャンプが完了したらこの変数をクリアする必要があります。
2)GlobalTrigger = 3を使用してすべてをクリアします。
3)GlobalTrigger3では、GT_TRNG_L_TIMER_EQUALS = 45(ティックフレーム、つまり1.5秒)の条件を使用したので、ジャンプの最後までに1.5秒が経過すると、条件は真となります。
4)LocalTimerが1.5秒になると、TriggerGroup = 6が実行されます。
5)TriggerGroup = 6では、LocalLongAlfaのビット0をクリアし、LocalShortBeta1の値とLocalTimerもクリアします。
6)ジャンプゲインモードを記憶するのに使用されるすべての変数がクリアされました。

木製のドア:私たちの変更を保存して復元する方法

木製のドアからの衝突を取り除く方法はちょっとばかげていますが、その例は非常に重要な操作、パッチを保存して復元すること、いくつかの状況で実行できたことを説明するために必要でした。
フリップエフェクトでいくつかのメモリゾーンを変更すると、結果はすぐに得られますが、プレイヤーがセーブデータを保存しリロードするとそれらの変更は消えるため、これらの変更は一時的なものになる可能性があります。
このエラーの理由は、多くのメモリフィールドは、保存も復元もされないためです。
このような状況を避けるために、私たちが行った変更を保存し、セーブデータがリロードされたときにそれらを復元する必要があります。

The Global Trigger: GT_BEFORE_SAVING_VARIABLES and GT_AFTER_RELOADING_VARIABLES

新しいGlobalTriggerを使用して、ゲームがいつ保存されたか、またはリロードされた直後を検出できます。
このようにして、この2つの基本的な操作が行われるときに、(GlobalTriggerにリンクされている)TriggerGroupを実行できます。

最初のステップは、セーブデータで何を保存(そして復元)すべきかを理解することです。

TRNG変数を保存してリロードする必要があるため、この説明を混同しないでください。これは真実ではありません。すべてのTRNG変数は自動的に保存され、再ロードされます。

別の方法として、いくつかのメモリゾーンで行った変更を保存して復元するだけでなく、信号を保存する場所にいくつかの変数を使用することを思い出す必要があります。

新しいスキルを作成したら、スキルが永続的であるかどうかを確認する必要があります。それがゲームの保存と再読み込みの後にも残っている場合。
それが残っていればそれは完璧です。あなたは何も保存する必要はありません。

再読み込み後に消えるのを発見したら、次の操作を実行する必要があります。

パッチを保存するための標準的な手順

1)このパッチを保存/復元するために使用する変数(およびビット)を決定する必要があります。
2)私たちのサンプルプロジェクトでは、ビット0(値1)が既にジャンプゲインモードの信号として使用されていたので、LocalLongAlfa変数のビット1(値2)を使用しました。
3)私たちのパッチがtrue / false(または適用/適用されていない)状態についてのみである場合、単一のビットを使用できますが、異なる値を持つ可能性のある番号を使用して変更を加えるとその変数にパッチで使用されている特定の番号を保存します。
4)ゲームが保存され、GT_BEFORE_SAVING_VARIABLES GlobalTriggerが有効になっているとき、パッチが当てはまるかどうかを検出する必要があります。
5)それが適用されたことがわかっているゲームでは、我々は信号を置く必要があります。LocalLongAlfaのビット1(値2)が設定されます。
6)プロジェクトでパッチがすでに適用されているかどうかを確認するため、変更可能なスロットメモリのPointer for Collision Procedureフィールドを確認します。
7)そのフィールドがゼロの場合、これは既にパッチを適用したことを意味し、LocalLongAlfaにビット1を設定します。

パッチをリロードする標準的な手順

1)GT_AFTER_RELOADING_VARIABLES GlobalTriggerが起動されると、信号が存在するかどうかをテストするTrigggerGroupを実行します。
2)この例では、LocalLongAlfa変数のビット1だけをテストする必要がありますが、多くのパッチがあれば、多くの異なるメモリフィールドをテストする必要があります。
3)信号が見つかった場合は同じパッチを適用する必要があるため、スロットメモリのPointer for Collision Procedureフィールドに0を書き込みます。
4)シグナルが欠落している間、これはゲームが保存されたときに適用されるパッチがないことを意味するので、デフォルト値はロードゲーム手順によって既に復元されるため、変更する必要はありません。

ヒントとコツ

この章では、変数の機能を最良の方法で使用するためのいくつかの小さなトリックを見ていきます。

いくつかのメモリフィールドの感覚を発見する方法

私はトゥームレイダーエンジンの作者ではないので、多くのメモリフィールドの記述が不足しているか不正確です。それがどのように動作するのか理解しようとしましたが、間違っている可能性があります。
フィールドがどのように動作するかを理解するには、ゲーム中にどのように変化するかを理解するのが最良の方法です。
ですから、フィールドを理解したい場合、つまりtomb4からそのフィールドに書き込まれる値と、その値が意味するものを理解するには、以下の方法を使用できます。

1)学習するメモリフィールドの内容を読み込むTriggerGroupを作成し、この値を共通の数値変数にコピーします。
2)GT_ALWAYSと共にGlobalTriggerを使用して、TriggerGroupの上に連続して(つまり、常に)実行します。
3)ここで、いくつかの変数には、私たちの学習するメモリゾーンの内容があります。
4)これで、画面上に連続的に表示される変数で診断することができます。
5)それであまりにも速く表示が変化する場合は、tomb4_log.exeユーティリティで作成したログファイルにもこの値を表示することができます。
6)ログファイルに値を表示するには、TriggerGroupに「Variables. Log. Print in log file the <&>Extra NG String」フリップエフェクトを追加します。
7)変数のプレースフォルダを持つ[ExtraNG]Stringのテキストを使用して、その変数の現在の値を表示します。
8)こうしてゲームでは、ゲームにおける私たちの行動に従って、そのフィールドの内容がどのように変化するかを見ることができます。

メモリメッセージの内容を診断メッセージに挿入する

ここでは、上記の手続きの手本的な例を作成します。
今回はアイテムメモリの「Flags of Item」フィールドの作業をよりよく研究したいとしましょう。
最初のステップとして、この調査に使用する敵をプロジェクトに配置し、このアイテムに対してアクショントリガを作成して、選択アイテムメモリを設定します。
; Exporting: TRIGGER(54:0) for ACTION(495)
; <#> : HARPY                      ID:495    in sector:(10,7) of Room70
; <&> : Variables. Set the index of <#>moveable as Selected Item
; (E) :
; Values to add in script command: $5000, 495, $36
今回はHarpyアイテムを選択しました。
エクスポートされたトリガをScript.txtの上にコピーします。

次に、「Flags of Item」フィールドの値を変数「Local Long Delta」(以下LL_Delta)にコピーするエクスポートされたトリガを追加します。

; Exporting: TRIGGER(10098:0) for FLIPEFFECT(256)
; <#> : Variables. Memory. Copy to <&> Numeric Variable the (E)Selected Item Memory
; <&> : Local Long Delta
; (E) : Flags of Item (Long)
; Values to add in script command: $2000, 256, $2772
「Flags of Item」フィールドのすべての変更の一覧を取得するには、utiltiy Tomb4_log.exeで作成されたログファイルにLL_Delta変数の内容を出力するようにトリガするように追加します。
; Exporting: TRIGGER(1650:0) for FLIPEFFECT(309)
; <#> : Variables. Log. Print the value of <&>Numeric Variable in (E)Format
; <&> : Local Long Delta
; (E) : Hexadecimal and Binary
; Values to add in script command: $2000, 309, $672
今度は、上記のすべてのトリガを新しいTriggerGroupにコピーします。
TriggerGroup=15, $5000, 495, $36, $2000, 256, $2772, $2000, 309, $672
最後に、GlobalTriggerを作成して、常にTriggerGroup 15の上で実行します。
GlobalTrigger=8, IGNORE, GT_ALWAYS, IGNORE, IGNORE, 15
次に、スクリプトの[Options]セクションで変数の診断を有効にする必要があります。
Diagnostic=ENABLED
DiagnosticType=DGX_COMMON_VARIABLES, IGNORE
よくできました。これでScript.txtファイルの作業が完了しました。

このプロジェクトでは、「Item of Flags」の値をアクティブ化の最初に確認することが面白いため、Harpyをトリガする場所に配置してアイテムをトリガします。

今度はスクリプトとレベルを構築することができます。ログファイルのリストを取得したい場合は、「Tomb4_log.exe」ユーティリティを起動してゲームをプレイします。
画面上では、「Flags of Item」が変化したときにLL_Delta変数が変化し、ログファイルでは進行の変化のリストを見ることができます。

ログファイルを調べる

この例では、ログに次の値の変更があります。

6859: Local Long Delta = %00000000000000000000000000100110 $26 ;not yet enabled
26078: Local Long Delta = %00000000000000000000000000100011 $23 ;enabled in game
67266: Local Long Delta = %00000000000000000000000000110011 $33 ;lara shots harpy
67297: Local Long Delta = %00000000000000000000000000100011 $23 ;nothing
67609: Local Long Delta = %00000000000000000000000000110011 $33 ;lara shots harpy
67641: Local Long Delta = %00000000000000000000000000101011 $2B ;harpy touches lara
67906: Local Long Delta = %00000000000000000000000000100011 $23 ;nothing
70078: Local Long Delta = %00000000000000000000000000000100 $4 ;harpy has been killed

私はバイナリ形式の変数のログを選択して、ただちにシングルビットの変更を認識しました。

Flags of Itemの変更が発生したときに私がやっていたことについてのコメントを追加しました。

上記のログを見てみると、例えば、ララがHarpyに当たったとき、短い瞬間($ 23から$ 33 = + $ 10)のビットが追加されるので、$ 10ビットは「現在のアイテムが傷ついている」。

その後、他の興味深い事実を発見することができました(実際には既に知られています、アイテムメモリゾーンを参照)。
$ 20のビットは、Harpyがまだ有効になっていないときに存在し、有効になっているときは残っていますが、Harpyが終了すると消えます。
ですから、$ 20のビットは「敵はまだゲームにとって面白い」と考えることができます。ビット$ 20が失われている間、敵は死んでおり、それはもはや使われなくなるでしょう。

私たちの発見の用法を見つける

面白いフラグを見つけたら、このような面白いことがあるかどうかを確認するために、フラグを立ててトリガをかけて実験を修正することができました。
例えば、上記の発見について、我々はHarpyを殺した後、Harpyの「Flit of Iitem」に、$ 26という値を書き込むことができます。つまり、その値がHaryをトリガする前に存在し、Harpyを殺した後にもかかわらず、新しくこの操作を再度有効にできるかどうかを確認することができます。
これらの実験は、我々の発見を検証するかのようで有用です。

実験を行う

与えられたフィールドでいくつかのフィールドやフラグの意味を発見するもう1つの方法は、そのフィールドに値を書き込んでから、ゲームで何が起こるかを見ることです。
例えば、私がゲームで見つけたことのない「Flags of Item」のフラグはたくさんありますが、その中にはいくつかの点で本当に便利なものがあります。発見する方法はそれを試みることです。
例えば、「Flags of Item」フィールドのビット$ 0002が何を意味するかどうかはわかりません。
発見するには、ゲーム内で何が起こるかを見るためにHarpyが生きている間にそのビットを試すことです。
1ビットを有効にするには、「ビット操作」を使用する必要があることに注意してください。そのビットを作成するには、「ビットを設定」を使用してそのビットを削除し、「ビットをクリア」します。

これらの実験を実行すると、何も起こっていないと感じるかもしれませんが、そのアイテムに対して異なるアクションを適用して、より良い方法で変更をテストする必要があります。

例えば、他のクリーチャーを配置して、あなたの変更がHarpyと他の敵との間の関係を変更するかどうかを確認することができます。
戦闘段階にいくつかの相違があるかどうかを確認するために、Harpyを撃つことを試みることができます。
少なくともこのように変更があるかどうかを確認するために、Harpyの下にいくつかのAIアイテムを配置しようとすることができます。
Etc。

スクリプトコマンドのデバッグを有効にする

新しいスキルの構築は複雑な問題です。
多くのTriggerGroup、コンディショントリガを作成し、変数を使用して操作を実行し、ゲームを保存する前に変更を保存して変数にリロードする必要があります(場合によって)。
これらの理由から、最初の試みでコードが正常に動作しない可能性があります。
スクリプトコマンドが理解できない場合は、スクリプトコマンドのデバッグを有効にすることをお勧めします。そのため、新しいスキルをテストしている間にTRNGエンジンで何が起こるかを確認する機会があります。

完全なデバッグまたは簡潔なデバッグ

デバッグを有効にするには、スクリプトコマンドを使用して診断を行います。
Diagnostic=ENABLED
DiagnosticType=DGX_LOG_SCRIPT_COMMANDS, IGNORE
DiagnosticTypeコマンドでDGX_LOG_SCRIPT_COMMANDSフラグを使用すると、新しい値は画面に表示されませんが、Tomb4_log.exeユーティリティ(TRLE\TOOLSフォルダにあります)で作成されたファイルに毎回長い診断のリストが表示されます。TRNGは、いくつかのTriggerGroup、GlobalTrigger、Organizer、またはSwitchを実行します。

スクリプトデバッグには2種類あります。コマンドで有効にする完全なデバッグです。

DiagnosticType=DGX_LOG_SCRIPT_COMMANDS, IGNORE
また、EDGX_CONCISE_SCRIPT_LOG値のコマンドに追加できる簡潔なデバッグ。
DiagnosticType=DGX_LOG_SCRIPT_COMMANDS, EDGX_CONCISE_SCRIPT_LOG
この選択肢の長所と短所については、次の点を考慮する必要があります。

完全なデバッグにはより多くの情報が含まれているため、スクリプトコマンドで実際に発生することがわかりますが、解析するポイントを見つけるのが難しい巨大なログファイルを作成することになります。
簡潔なデバッグは反対に、情報は少なくなりますが、より簡潔なログファイルを入手すると読みやすくなります。

初めは、簡潔なデバッグを行うことをお勧めします。問題が見つからない場合にのみ完全デバッグを実行してください。

スクリプトのデバッグの例

ここでは、サンプルプロジェクトの簡潔なログの例を示します。ララがタイマーのカウントダウンを停止し、メディパックを取得すると

95485: {Global Long Timer} = 900
108266: Perform TriggerGroup=2
108266:           Perform Trigger: [$2002, 265, $1]
108266:                     "Variables. Timer. Stop the <&>TRNG Timer" <<&> = 1 (E) = 0>
108266:                     TriggerResult=true
108281:           Perform Trigger: [$2002, 270, $301]
108281:                     "Variables. Timer. Hide <&>TRNG Timer in (E)Seconds" <<&> = 1 (E) = 3>
108281:                     TriggerResult=true
108281:           Perform Trigger: [$2002, 271, $33]
108281:                     "Variables. Numeric. Copy <&>Numeric Variable to CurrentValue" <<&> = 51 (E) = 0>
108281:                     {Global Long Timer} = 518
108297:                     {CurrentValue} = 518
108297:                     TriggerResult=true
108297:           Perform Trigger: [$2002, 253, $1EFF]
108297:                     "Variables. Numeric. Divide <&>Numeric Variable by (E)Value" <<&> = 255 (E) = 30>
108297:                     {CurrentValue} = 518
108297:                     {CurrentValue} = 17
108297:                     TriggerResult=true
108313:           Perform Trigger: [$2002, 273, $3A]
108313:                     "Variables. Memory. Add to <&>Savegame Memory the CurrentValue" <<&> = 58 (E) = 0>
108313:                     {Inventory. Small medikit} = 3
108313:                     {CurrentValue} = 17
108313:                     {Inventory. Small medikit} = 20
108313:                     TriggerResult=true
108328:           Perform Trigger: [$2002, 64, $506]
108328:                     "Text. Print ExtraNG <&>string on screen for (E) seconds" <<&> = 6 (E) = 5>
108328:                     TriggerResult=true

上記のログからどのように見ることができますか?変数が使用された(条件付きで読み込み、書き込み、またはテストされる)たびに、その値がログに表示されます。
この機能は、スクリプトコマンドではうまくいかないことを理解するのに非常に役立ちます。

コンディショントリガ

上記の「TriggerResult = true」については、上記のログに表示されているように、条件ではないので奇妙に思えるかもしれません。とにかくこれは正常です。共通トリガは常に結果に戻り、コマンドトリガでは常に「true」になります。条件をトリガすると、結果はtrueまたはfalseである可能性があります。
この方法のおかげで、条件付きTriggerGroupにいくつかの一般的な(条件付きでない)トリガも挿入することができます。この条件は、条件を実行する前に変数から別の値に移動する必要がある場合に非常に重要です。

完全デバッグのログファイルのこの例を参照してください。


5735: SCAN GlobalTrigger=2
5750:           GlobalTrigger=2, check for ConditionTriggerGoup=4
5750:                     Perform TriggerGroup=4
5750:                               Perform Trigger: [$8002, 112, $2C]
5750:                                         "Variables. The <#>Numeric Variable has the (E)Bit set" <<#> = 112 (E) = 0>
5750:                                         Required to use index of trigger (TGROUP_USE_TRIGGER_ITEM_INDEX)
5750:                                         {Local Long Alfa} = 1
5750:                                         TrigggerResult=true
5766:                               Perform Trigger: [$2002, 256, $4FF]
5766:                                         "Variables. Memory. Copy to <&> Numeric Variable the (E)Selected Item Memory" <<&> = 255 (E) = 4>
5766:                                         Required to use index of trigger (TGROUP_USE_TRIGGER_ITEM_INDEX)
5766:                                         {State Id Now} = 1
5766:                                         {CurrentValue} = 1
5766:                                         TriggerResult=true
5781:                               Perform Trigger: [$8002, 3, $30]
5781:                                         "Variables. The Current Value variable is = than <#>Value" <<#> = 3 (E) = 0>
5781:                                         Required to use index of trigger (TGROUP_USE_TRIGGER_ITEM_INDEX)
5781:                                         {CurrentValue} = 1
5781:                                         TrigggerResult=false
5781:                               Conditional block is false
5797:                               END TriggerGroup=4
5797:                     ConditionTriggerGroup = false
5797:           END GlobalTrigger=2
5797: XXXXXXXXXXXXXXXXXXXXX START NEW GAME FRAME XXXXXXXXXXXXXXXXXXXXX

上記のコンディショントリガでは、2つの条件をテストしました。
1)LocalLongAlfa変数にビット0(値1)がセットされているかどうか確認する。
2)そして、もしララの現在の状態IDが3ならば

最初の条件では、変数の状態に対する他の条件を使用して単一のトリガで実行できますが、コンディショントリガでチェックする前に値を「State-id」アイテムフィールドから共通変数に移動する必要があるため不可能です。
不幸なことに、StateIDから現在の値に値を移動する非コンディショントリガは条件リスト内の何も変更しないので、この操作は可能です。

デバッグログを中断して再開する

フルデバッグを使用すると、ログファイルに書き込まれるテキストの量が膨大になります。
あなたのテストのための正しい位置に達するために時間が必要な場合は、何もない数MBのログファイルが作成されます。
この場合、ファンクションキーF9を使用して一時デバッグモードを解除し、後でいつでもF9キーを使用して再開することができます。

いくつかのMoveableについての座標の保存を強制する

いくつかの変数フリップエフェクトを使用してMoveableの座標を変更する場合は、アクショントリガを使用してTRNGエンジンを呼び出して、セーブデータでこのMoveableの座標(および向き)を保存してから再読み込みする必要があります。
このターゲットを実現するには、次のアクショントリガを使用する必要があります。

「Enemy. Save the coordinates and facing of <#>Moveable in savegame」

この状況に関するいくつかの考慮事項があります。

1)可能ならば、同じアクションを実行する独自のプロシージャを再構築するために、標準のアクショントリガを使用してアイテムを移動したり向きを変更したりする方が良いでしょう。
TRNGアクショントリガは長い間テストされており、変更されたアイテムの座標と向きを保存して再ロードします。
2)上記のアクションを必ずしも実行する必要はありません。例えば、アイテムがクリーチャーである場合、すべてのクリーチャー(AI機能を持つMoveableアイテム)がセーブデータに保存され、そこから再配置されるためです。

タイマーを使わずに時間間隔を検出する方法

変数プロジェクトでは、TRNGTimerを使用して、スーパージャンプの開始から1.5秒経過したときを確認しました。
私たちが経過時間のコントロールを維持したいと思う多くの状況があります。

新しい技術があれば、2つのTRNGTimerがすべての要求に対して十分ではない可能性があります。
幸いにも、同時に多くのカウンターを持っている簡単なトリックがあり、TRNGTimerを使う必要はありません。

Organizer Timerの値を使用することができます。セーブデータメモリでそれを読み取ることができます。
オーガナイザーのタイマーは、プログラムがゲームモード(インベントリなしまたは画面の一時停止中)の間は常に更新されます。
このタイマーのおかげで、現在のオーガナイザタイマーを保存して、最後の読み取りからどれくらいの目盛りフレームが経過したかを確認することができます。

例えば、与えられた瞬間から30ティックフレームが経過したと計算する場合は、オーガナイザタイマーのコピーをLong変数、例えば変数Betaに入れて、次のサイクルで、数式:

TimeNow = OrganizerTimer - Beta

この方法では、複数のタイマーを使用して効果を同期させることができます。