www.tombraiderforums.com

Go Back   www.tombraiderforums.com > Tomb Raider Modding > Tomb Raider Level Editor > Tomb Raider Level Editor Tutorials

Closed Thread
 
Thread Tools
Old 15-08-15, 10:04   #1
AkyV
Moderator
 
Join Date: Dec 2011
Location: Hungary
Posts: 2,377
Default TRNG - Hidden triggers (original)

An update:
http://www.tombraiderforums.com/showthread.php?t=203758

Made using TRNG 1.2.2.6

Would you like to be able to use 'extra' triggers in TRNG? See the few examples below to understand what I'm talking about:
-Make One Shot triggers 'retriggerable'.
-Control the enemy jeep on its route as a harmless 'civil' car, a 'friendly jeep' i.e. without shooting grenades.
-Customize the ammunition amount of the baddies (without picking up Uzi clips).
-Make the active mutant attack only when you want.
-Customize the speed of little beetles coming out of the wall.
-Transport the ahmet to a new start position (instead of his original cage, into another room) when the scales are just being reset.
-Shoot the rollingball out like a cannonball.
-Customize the speed of teeth spikes.
-Customize the extension of joby spikes.
-Extinguish the flames on the burning floor to prevent it from crashing.
-Customize the length of the flame blown from a flame emitter.
-More control on the electric arches striking into lightning conductor nullmesh objects.
-Make turn switches useable to trigger anything, not only obelisks.
-Disable/enable Lara's interaction with objects such as doors, falling blocks, ziplines, some switch types etc.
-Make the placed and triggered grenade perform an amazing, long exploding effect.
-Customize the intensity of earthquakes.
-Fiddle with the effects of AI objects.
-Simulating AnimCommands for a given object of the slot (because 'real' AnimCommands work for all the objects of the slot).
-Force a required actual vitality on an enemy, including temporary immortality.
-Customize the amount of the usage of the mechanical scarab.
-Improve the control on the weapon selection.
-Trigger things after Lara's death.
-Make little scorpion be poisonous in the first levels of the game as well.
-Adjust Lara's dash power.
-Adjust audio/sound volume (of Options menu) during the game, by triggers.
-Turn the 'normal' level into 'train level' (or vice verse), when the level is already being played.
-Switch on/off sun disk in the whole level in a simple way, when the level is already being played.
-Make only the required mesh(es) of an object shatterable.
-Edit the size of the shadow (without changing the collision box).
-Prevent a collision problem: when you can't push/pull pushable objects over pickable items.
-Change some animation properties (FrameRate, Accel etc.) during the game.
-Change the coordinates or the name of an item in the inventory, even if we don't have a Script command for that item type to do that.
-Expand the amount limits in executable or condition triggers about ammunition, medipacks or flares in the inventory.
-Change some values of Statistics information or study them in condition triggers.
-Conditions about the good old timer (typed in the Timer box of the trigger).
-Conditions about the facing of the objects.
-Conditions about the color of the ambience light shining on the object.
-A condition about Lara's actual air in her lungs.
-A condition about the player just using DOZY or not.
-A condition about how far Lara is just swinging on the rope.
-Conditions about Lara aiming at an enemy.
-Conditions about which camera type is just being used.
-Conditions about the speed of clouds.
-A condition about volumetric FX being switched on/off.

Last edited by AkyV; 15-08-15 at 11:06.
AkyV is offline  
Old 15-08-15, 10:11   #2
AkyV
Moderator
 
Join Date: Dec 2011
Location: Hungary
Posts: 2,377
Default

Introduction

The hidden triggers are executable or condition triggers (with the trigger name 'Variables') in TRNG. But - unlike other triggers - the hidden triggers are useless if we use them alone, i.e. a hidden trigger will be useful only if we use it combined with other hidden triggers.

And it's recommended to use the combinations of hidden triggers because those combinations will be able to do things you cannot achieve with other triggers!
Let's see two examples to understand how it works:

a, Executable combination:

When BADDY_1 comes to life then he will shoot maximum four rounds with his Uzi at Lara before he runs out of the bullets (shooting 7 bullets in each round). Do you have a trigger in TRNG to give more initial ammunition for a given BADDY_1 enemy? No, you don't have. But you can use a combination of 'Variables' triggers to do that.
The combination is a TriggerGroup, containing these triggers (in this order), for example:

$5000, 85, $36, $2000, 232, $4650, $2000, 257, $1750

The meaning of the triggers in the combination:

; Set Trigger Type - ACTION 54
; Exporting: TRIGGER(54:0) for ACTION(85)
; <#> : BADDY_1 ID 85
; <&> : Variables. Set the index of <#>moveable as Selected Item
; (E) :
; Values to add in script command: $5000, 85, $36

; Set Trigger Type - FLIPEFFECT 232
; Exporting: TRIGGER(18000:0) for FLIPEFFECT(232)
; <#> : Variables. Numeric. Set <&>Variable with (E)value
; <&> : Local Short Alfa1
; (E) : Value 70
; Values to add in script command: $2000, 232, $4650

; Set Trigger Type - FLIPEFFECT 257
; Exporting: TRIGGER(5968:0) for FLIPEFFECT(257)
; <#> : Variables. Memory. Copy from <&>Numeric Variable to (E)Selected Item Memory
; <&> : Local Short Alfa1
; (E) : Custom_C (Different usage in according with type of item) (Short)
; Values to add in script command: $2000, 257, $1750

So, as the first trigger of the combination, A54 says the required BADDY_1 is which one has Object ID85. Then F232 trigger will define a value - which is 70 now - in a variable - which is Local Short Alfa1 now. Then F257 trigger will put that 70 into Custom_C field of the so-called Item Memory Zone. Custom_C field means - in the case of each placed BADDY_1 enemy - the actual ammunition.
Now we forced 70 into Custom_C field which means BADDY_1 with ID85 (still not living) will have 70 Uzi bullets (for 70/7=10 rounds) when comes to life.
(Naturally you can force new bullets for the baddy even if he already lives.)

b, Condition combination:

We want to know if Mesh9 (right wheel on the front side) of ANIMATING6 objects of the original tut1.wad (the jeep) is shatterable in the given moment or not.
The combination is a TriggerGroup, containing these triggers (in this order), for example:

$2000, 292, $1B5, $2000, 293, $1071, $8000, 113, $228

The meaning of the triggers in the combination:

; Set Trigger Type - FLIPEFFECT 292
; Exporting: TRIGGER(437:0) for FLIPEFFECT(292)
; <#> : Variables. Memory. Set the <&>Slot as Selected Slot Memory
; <&> : ANIMATING6 Id=437
; (E) :
; Values to add in script command: $2000, 292, $1B5

; Set Trigger Type - FLIPEFFECT 293
; Exporting: TRIGGER(4209:0) for FLIPEFFECT(293)
; <#> : Variables. Memory. Copy from (E)Selected Slot Memory to <&>Numeric Variable
; <&> : Local Long Beta
; (E) : Explosion Mask. (Each bit a type of weapon able to do explode it (Long)
; Values to add in script command: $2000, 293, $1071

; Set Trigger Type - CONDITION 40
; Exporting: CONDITION(40:58) for PARAMETER(113)
; <#> : Local Long Beta
; <&> : Variables. The <#>Numeric Variable is = than (E)Big Number value
; (E) : Value of Parameters=PARAM_BIG_NUMBERS at index= 2
; Values to add in script command: $8000, 113, $228

So, as the first trigger of the combination, F292 says the subject of the combination is each object of ANIMATING6 slot. (ID437 is the slot ID - see the slot indices in NG Center/Reference.) Then F293 trigger will put the actual value of Explosion Mask field - which is a field of the so-called Slot Memory Zone - into a variable - which is Local Long Beta now. Explosion Mask field works for the shatterable properties of the meshes of the given object slot. (Whatever the field name says.) Each bit in the field means the mesh with the same ID number is shatterable. So, if the value of Local Long Beta is 512 (=Bit9)* now, that means Mesh9 (and only Mesh9!) for each object of ANIMATING6 object slot is shatterable in the given moment. That's why C40 trigger will examine if Local Long Beta is 512 now.
(*: bits are exponents for Value 2. Bit0 is Value 2 with exponent 0=1, Bit1 is Value 2 with exponent 1=2, Bit2 is Value 2 with exponent 2=4, Bit3 is Value 2 with exponent 3=8 etc. So Bit9 is Value 2 with exponent 9=512.)
Let's suppose we have this Script entry:

Parameters= PARAM_BIG_NUMBERS, 1024, 659, 512, 4096

The first number (1024) of PARAM_BIG_NUMBERS has ID0, the second number (659) of PARAM_BIG_NUMBERS has ID1 etc. It means the number with PARAM_BIG_NUMBERS ID2 is 512 now. So if C40 compares Local Long Beta to PARAM_BIG_NUMBERS ID2 number, that means C40 compares Local Long Beta to 512:

- If Local Long Beta is 512 then the condition is true, only Mesh9 is shatterable.
- If Local Long Beta is not 512 then the condition is not true, not only Mesh9 is shatterable, not Mesh9 is shatterable or there is no shatterable mesh.

Important things you need to know

I-1. General measure units in the tutorial

1 square=4 clicks=1024 units
1 second=30 frames

I-2. Which object index should I use in the combinations?

Usually it is the Room Editor index (Paolone calls it 'NGLE index').
I will tell you if you should use the game index (Paolone calls it 'tomb index') instead of that.

'Room Editor index' is the index that you can see in that little yellow box that will pop up if you click on the object in the Room Editor.
'Game index' is the index the object uses in the game. (I will tell you later how you can meet a game index of an object.)

I-3. I'd like to calculate 'facing' - but what is a 'face' of an object?

The 'face' of the object is the side of the object which will always see the east if you have just placed the object in the Room Editor. (Be careful! It is not always 'the real face' of the object, i.e. the side that looks like a face.) - It is north in the game.

I-4. Learn more about variables and memory zone fields, if you want

See these tutorials on TRF:
- NGLE Encyclopedia
- Paolone's tutorial for variables
- Memory Zones tutorial
- TRNG - New general condition method with variables (if you want more special conditions than I listed in the present tutorial)

I-5. What are memory zones and memory zone fields?

Memory Zones contain the different properties of the game:

- Item Memory Zone: the most of the Moveable objects have some properties that can be represented by numbers. The numbers - representing the actual state of the object in that property (for example, the direction of Lara's facing or the length of a blown flame etc.) - are recorded here.
- Savegame Memory Zone: the amount/presence of given things are recorded here (for example the air amount in Lara's lungs or the type of the weapon which is just on Lara's back etc.), so the game will know - if the player loads the game - the proper amount/presence of things when a savegame has just been loaded. (I.e. now we use this technique to record/study these values any time we want.)
- Code Memory Zone: this zone represents some special properties of the game, such as which camera type is just being used etc.
- Slot Memory Zone: each Moveable object slot in a WAD has the same values for each object that is placed of that slot. This zone represents the actual values for these general slot properties. (Eg. the size of the shadow or which meshes are shatterable etc.)
- Animation Memory Zone: some properties of the Moveable object animations are known for WADMerger, some of them are not. This field represents the actual values of these known/unknown animation properties (Next Frame, Accel etc.).
- Inventory Memory Zone: this zone contains data about the inventory. (In fact, about the items in the inventory. Mostly about their positions in the inventory.)

Each memory zone has more fields. Each field controls a given property in its zone.

I-6. What are variables?

The purpose of the variables is 'only' to take different numeric (or sometimes textual) values. So the variables are independent of any concrete feature of the game engine. That's why if you have a value in a variable then you can apply that value to control various TR4/TRNG procedures.

Note:
In this tutorial we don't care about variables for textual values, only about numeric variables.

I-7. When should I use variables?

- Do you remember that F232 trigger above with Value 70? Well, if you use an F232 to put a value (eg.70) into a variable then you can print that 70 on the screen with another trigger, not using A54 or F257 at all. - So, as you see, you can use variables even independently of memory zone fields, if you want.
But in this tutorial we don't care about variables without memory zone fields.
- As you saw above in F257 or F293 triggers, you need variables

a, when you force a value into a memory zone field to change the property of that field, or
b, when you put a memory zone field value into a variable to study it.

Important!
If you use an executable combination, then you don't need variables everyway. I mean, you can force a value into a memory zone fielddirectlywith a trigger, i.e. without using a variable.
For example, above we defined Value 70 by F232 and then we forced it into a memory zone field by F257. But, instead of those two triggers, you can use only one F255 to force Value 70 directly into that field, avoiding variables.
But we can use the direct method only with the executable combinations of these memory zones:

- Item Memory Zone
- Savegame Memory Zone
- Code Memory Zone
- Inventory Memory Zone

So if you have the possibility to choose between a variable method and a non-variable method then naturally you will choose the easier one, with the non-variable method.
Except:

- if you want to force/study a really big value (i.e. above 65535). Moreover, in some memory zone fields you can have problems even with using not too big values. (I'll tell you later why). Or
- if you want to be tricky with the forced value. I mean, consider this:
The variable method is more flexible. I mean, eg. you replace that F232 by an F231. F232 said this: 'Value=constant 70'. But F231 says this: 'Value=X+constant 70' in which X is a non-constant value.
For example, you have another TriggerGroup, this one: 'if A happens then X=0, or else if B happens then X=50, or else if C happens then X=170'. So, depending on the outcome of the 'another' TriggerGroup, not always 70 will be forced as the new ammunition amount, but perhaps 0+70=70, perhaps 50+70=120, perhaps 170+70=240.

See more below about the variable triggers or the triggers of the direct forces we use.

Note:
In this tutorial I won't mention all the triggers about variables and memory zones, only the more important ones.
For example, F259 is a trigger which will force bits into a memory zone field. Bit0=1, Bit1=2, Bit2=4, Bit3=8 etc. But I didn't want to make the things more complicated that's why I skipped that trigger. I.e. if you want to force bit values, then force directly 1, 2, 4, 8 etc. (Or feel free to swap the original trigger by that F259, if you want.)

I-8. What values can I use?

Possibly we can use values (either in variables or directly) 'only' in the 'from -2 147 483 648 to 2 147 483 647' interval.
But be careful! We can't have digits after the decimal point. So, for example, Value 25,76 will be treated as 25.

I-9. Which variable should I choose?

As you saw above in F232 or F293 triggers (and as you can it in several other 'Variables' flipeffect triggers) you're the one who needs to choose the variable that will be used in that trigger. Usually you should choose a variable of the Local Alfa, Local Beta, Local Delta, Global Alfa, Global Beta or Global Delta series.
After all, your choice is RANDOM (i.e. you can choose any variable you want) if you observe some rules:

1. As you see, there is a 'byte', 'short', 'long' remark in the name of the memory zone fields (see eg. in F232 or F293 triggers). Use a Byte variable for any 'byte' field, a Short variable for any 'short' field and a Long variable for any 'long' field. (Each series has 1 Long, 2 Short and 4 Byte variables.) - The remarks mean the size of the field:

a, The value of a 'byte' variable must be always between 0 and 255. I.e. a field with 'byte' remark will have its values between 0 and 255.
b, The value of a 'short' variable must be always between -32 768 and 32 767. I.e. a field with 'short' remark will have its values between -32768 and 32767.
c, The value of a 'long' variable must be always between -2 147 483 648 and 2 147 483 647. I.e. a field with 'long' remark will have its values between -2 147 483 648 and 2 147 483 647.

In fact, it's not quite right. I mean, some combinations will use - relatively - little values, because that combination will not use all the possibilities of that field.
So you can choose a 'less' variable if you want. For example, if the field is 'short', but the biggest value the combination will use is smaller than 100, then feel free to use a 'byte' variable, if you want.

2. The default value of each numeric variable is 0. Unless you change their values, Global variables will keep their values in the whole game, Local variables will keep their values 'only' in the whole level.
(It means eg. if you used Local Byte Alfa1 variable with Value 50 in Level A, and then if you used Local Byte Alfa1 variable with Value 75 in Level B, then Local Byte Alfa1 will be 50 again, if Lara goes back to Level A.)

Please, don't misunderstand:
I mean, the constancy of the variable value and the constancy of the field value is not the same!
For example, the amount of the big medipacks is a global value, because, if you have X amount of big medipacks at the end of Level A, then you also have X amount of big medipacks of the start of Level B, if you jump at the end of Level A to the start of Level B.
So, if you use a local variable to define X medipacks at the end of Level A, and you jump to Level B, then the amount of the medipacks will remain X - though that local variable will become 0 at the start of Level B.

Notes:
a, Global variables may lose their values in the next level if you used a ResetHUB command during the level jump!
b, The title is a 'separate world'. I.e. you cannot carry variable values from the title into the game - or vice verse -, even with global variables.

3. You cannot use a variable of a series if you use another variable of the SAME series AT THE SAME TIME.
In fact, sometimes you are allowed to use another variable of the same series. Here are the exact rules:

a, If you use a 'Long' variable for a field then you can't use any other variables of the series at the same time. (So, for example, you can't use Global Long Beta with Global Short Beta1 at the same time. But you can use Global Long Beta with Local Long Beta or Global Long Alfa or Local Short Beta2 or Global Byte Delta4 etc. at the same time in your game.)
b, If you use a 'Short1' variable then you can't use 'Long' or 'Byte1' or 'Byte2' variables of the series at the same time.
c, If you use a 'Short2' variable then you can't use 'Long' or 'Byte3' or 'Byte4' variables of the series at the same time.
d, If you use a 'Byte1' or 'Byte2' variable then you can't use 'Long' or 'Short1' variables of the series at the same time.
e, If you use a 'Byte3' or 'Byte4' variable then you can't use 'Long' or 'Short2' variables of the series at the same time.

4. 'Current Value' is a special long and global variable, use it if I say that.
5. Last Input Number, Local/Global Long Timer or Store variables are special variables, don't choose them now - see more about them at the end of the tutorial.

I-10. What an executable combination should contain?

As you see above in the example with baddy ammunition, the formula of an executable combination (i.e. a TriggerGroup) usually contains these triggers:

1. The first executable trigger is a trigger that defines the subject of the combination. (You need it only in the case of Item, Slot, Animation or Inventory Memory Zone.) The subject is the thing whose properties will change if the value has been forced.
2. The second executable trigger defines a value in a variable.
3. The third executable trigger forces the value of the variable into a memory zone field. - And now the field has started using the forced value, i.e. the property (that is attached to that field) has changed.

Or an alternative version without variables (only for Item, Savegame, Code or Inventory Memory Zone):

1. The first executable trigger is a trigger that defines the subject of the combination. (You need it only in the case of Item or Inventory Memory Zone.)
2. The second executable trigger forces a value into a memory zone field. - And now the field has started using the forced value, i.e. the property (that is attached to that field) has changed. (As you see, if it is Savegame or Code Memory Zone, then there is only one trigger in the TriggerGroup. So if you wanted to use an F118 to activate the combination, then you don't need that F118 and that TriggerGroup. I.e. just place this only one trigger in the map, and that's all.)

When we execute the combination that means all the triggers in the combination will be executed, in the given order. If the last trigger of the combination has been executed then the purpose of the combination has been happened (i.e. the value has been forced into the field).
If you activate that TriggerGroup, then the combination will be executed.

Note:
'Usually' means:
Some combinations could be more complicated, with more triggers than three.
(You can increase the amount of the triggers in the combination:

a, because the combination wouldn't work without that, or
b, the effect of the combination will be more interesting this way.)

See more about all of this below.

I-11. How can we activate the TriggerGroup of the executable combinations to execute the combination?

The general possibilities to activate that TriggerGroup:

- An F118 trigger (in 'single' mode, a TRIGGER or a HEAVY) placed in the map, for the given TriggerGroup. (Maybe having a CONDITION trigger overlapped with it.)
- Or a GlobalTrigger which will activate the given TriggerGroup if the condition for the GlobalTrigger is true. (The condition could be anything you want.)

Note:
'General' means there are some other functions that are also able to activate any TriggerGroup, including the TriggerGroups of executable combinations. (See eg. Switch Script command etc.)

I-12. What a condition combination should contain?

As you see above in the example with the shatterable mesh, the formula of a condition combination (i.e. a TriggerGroup) usually contains these triggers:

1. The first one is an executable trigger that defines the subject of the combination. (Only in the case of Item, Slot or Animation Memory Zone.) The subject is the thing whose properties will be examined in the condition trigger.
2. The second one is also an executable trigger that puts the actual value of a memory zone field into a variable.
3. The third one is a condition trigger that studies the value of the variable. - I.e. if we know the value of the variable then we know the value of the field, so we know the value of the property attached to that field.

Unfortunately conditions for Inventory Memory Zone don't work!

When we start the combination, that means:

- First of all, all the executable triggers in the combination will be executed, in the given order. If the last executable trigger of the combination has been executed, that means the executable triggers have 'filled up' the condition trigger with data.
- After that, the condition trigger will able to study the value, because the trigger has the proper data for that, at last.

If you activate that TriggerGroup, then the combination will be started.

Note:
'Usually' means:
Some combinations could be more complicated, with more triggers than three.
(You can increase the amount of the triggers in the combination:

a, because the combination wouldn't work without that, or
b, the effect of the combination will be more interesting this way.)

See more about all of this below.

I-13. How can we activate the TriggerGroup of the condition combinations to study the value in the combination?

The general possibilities to activate that TriggerGroup:

- A C15 trigger placed in the map, for the given TriggerGroup. An executable TRIGGER is naturally placed on the same square, overlapped with the CONDITION trigger, and naturally will be executed if this condition is true.
- Or a GlobalTrigger which has the given TriggerGroup as the condition for the GlobalTrigger. If this condition is true then the GlobalTrigger will execute an executable trigger.

Notes:
- An alternative solution instead of C15+TRIGGER: place only one TRIGGER (or one HEAVY), without a C15. This TRIGGER (HEAVY) is an F118 to activate the TriggerGroup of the condition combination, but this time in 'multiple' mode. The executable trigger that will be activated when the condition is true, this time will be placed in this TriggerGroup, just after the condition trigger. (This alternative method is maybe better because now we don't waste triggers, using only one instead of two. Moreover, with C15, you can't use a HEAVY.)
- 'General' means there are some other functions that are also able to activate any TriggerGroup, including the TriggerGroups of condition combinations. (See eg. Switch Script command etc.)
I-14. Smaller/bigger condition relations

Naturally not only the 'if the value is X' is the only logical condition - but only if the examined value is a part of a sequence.
Sequences could be for example:

- timer
- distance from a given point
- ammunition amount
- speed of an animation
- earthquake intensity
- 360 degrees
- etc.

So, you can use 'smaller/bigger' condition triggers in these cases, such as

'if time in the timer is smaller than ... frames'
'if the baddy has less Uzi ammunition than ... bullets'
'if the object is farther from a given point than ... units'
'if the earthquake intensity is bigger than ...'
Etc.

See more about it below.

Notes:
- In fact, we have only 'bigger or equal' conditions, so we don't have clearly 'bigger' conditions. I.e. be careful when you want to describe a condition exactly. (For example, if you want a 'bigger than 50' condition, then you need to use a 'bigger than or equal with 51' condition.)
- Hereafter I call 'simple condition' if a condition is not a sequence.

I-15. Cycle sequences

The 360 degrees of a circle is treated in TRNG as a circle which is split into 65535 parts. It means 1° is about 182(=65535/360) and about 0,005° is 1. So we have 0,005° precision now.
That 65535 works in two half-circles. One of the half-circles goes from 0 to 32767: 0, 1, 2... 32765, 32766, 32767. The other half-circle goes from -1 to -32768: -1, -2... -32766, -32767, -37678.



0 is the default point=0 degree=360 degrees.

So eg. 'equal with -32768' means a turn of 180 degrees, 'bigger than 16384' means 'farther from 0 degree than 90 degrees clockwise', 'less than -16384' means 'closer to 0 degree than 90 degrees anti-clockwise'.

Note:
The values of a circle perfectly fit in a Short variable: -32768 to 32767.
But be careful! I experienced sometimes -32768 wouldn't fit a Short variable so I needed to use a Long variable for that value.


Last edited by AkyV; 16-10-15 at 14:43.
AkyV is offline  
Old 15-08-15, 10:15   #3
AkyV
Moderator
 
Join Date: Dec 2011
Location: Hungary
Posts: 2,377
Default

I-16. When could we avoid memory zones?

You may ask me: 'You said at the beginning of the tutorial that combinations will able to do things you cannot achieve with other triggers. Why did you say that? That's not always true. I foundTransparence level (0 = opaque / 126 transparent / over 127 removes item) (Short)Item Memory Zone field in F257 trigger. But A53 is able to do the same. I don't want to choose the hard memory zone method instead of the easy A53'.

Well, in fact, there are some memory zone fields that are able to do the same thing that a 'regular' trigger. (Probably Paolone developed some regular triggers basing on memory zone fields.) But that doesn't mean it is not worth using a memory zone field if that has a 'regular pair'. Because there can be 'irregular circumstances', when the regular trigger is unable to work.
For example, A53 is not able to study if the actual transparence level of the object is smaller than a given value or not. ButTransparence level (0 = opaque / 126 transparent / over 127 removes item) (Short)field is able to achieve that examination.

See more about it below.

I-17. How can I know which value should I force/which value should I study?

Naturally it is clear several times. I mean, if you want to give 70 bullets to the baddy, then the value in the variable is 70.
But, for example, how should you know that 'Value 51' means the proper value for the hit condition? - I.e. if the value of a given field is 51 (by the way it is 'Flags of Item' Item Memory Zone field), then that means this condition: 'if the enemy has just been hit by a bullet'.

Well, usually you don't need to search values like that. I searched them yet and wrote them in the descriptions of the combinations below.
You ask how I got them? - Well, Paolone's tutorial about variables helped me a lot. But not always and not clearly everyway. So as I wanted to know the unclear values of the fields, I needed to use three additional tools:

a, Diagnostics

If you use a Diagnostics Script command, then lots of Diagnostics messages will show up on your screen during the game.
If you want only a concrete message on the screen (removing the bothering, unnecessary messages) you need another Script command as well. This is DiagnosticType.
Use DiagnosticType with DGX_COMMON_VARIABLES constant, so only the message about the numeric variable actual values will be typed on the screen.

And now you need a GT_ALWAYS GlobalTrigger that will activate a TriggerGroup. This TriggerGroup contains one or two triggers:

Trigger1. To defines the subject of the combination. (Only in the case of Item, Slot or Animation Memory Zone.)
Trigger2. To put the actual value of a memory zone field into a variable.

Build the Script, and start the game. See the Diagnostics message about the given variable. The field value will be updated continuously in the variable. I.e. if you notices any change in the variable value printed on the screen, that means something has just happened that changed the field value.
So, for example, if the variable value has turned into 51 when you use 'Flags of Item' in Trigger2 and when a shot of Lara is just hitting the subject enemy, then you will know it means this:

- the 'Flags of Item' field is useful if you want to use a hit condition, and
- the value of 'Flags of Item' field is 51 if a bullet hits the subject enemy.

You can remove that GlobalTrigger and that TriggerGroup if you stop using Diagnostics this way.

b, Log program

Sometimes the variable values in the Diagnostics message on the screen is changing too fast, you will be unable to follow them. (It happens naturally mostly if the studied field belongs to a sequence.) - That's why you need the log function.
First of all, you need the ID of the variable you use in Trigger2. You can find the variable ID's in NG Center\Reference\Variable Placefolders, in #XXXX format. So, for example, the ID of Local Byte Beta1 variable is #0044.
Now choose a (any) Extra NG string in NG Center. Type that variable ID into that string.
Then, place one more trigger (Trigger3) after Trigger2 in the TriggerGroup. It is an F308 - with that string in the Timer window.
Now build the Script.

You can find the log program for TRNG TR4.exe in the Tools folder of the Level Editor. This is TOMB4_LOG.exe. Start it and the empty window of the program will pop up.
Start the game. The log program window should remain over the Tomb Raider screen, and a lot of 'unnecessary' entries show up fast in the log window, after each other.
When the 'attack of the unnecessary entries' has stopped, then you will probably see a constant value in the log window. It is the actual value of that variable. - For example, the field is about some distance, and the subject is Lara object. If the value is eg. 59770 that means Lara is from 59770 units distance from a given point.
Now Lara starts moving, so the values start running in the log window - for example this way: 59723, 59676, 59629, 59582, 59535, 59491 etc.
Each new entry means a new frame. So you can see how the value is changing frame by frame.

If you stop studying the value, then exit the log program.

c, Log TXT

Each usage of the log program creates/updates a tomb4_log.txt in Tools folder. This TXT shows each entry that showed up in the log program when the log program was open the last time.
If the values in the log window are still too fast for you (or if you are unable to see the log window when the game is running) then open this TXT, find the part about the variable value, and examine that.

Notes:
- As you see, if the value is constant (i.e. 'if Lara doesn't move' now) then the value won't be updated in the log program, though the time is passing.
If you want the log program to repeat the constant values, frame by frame, then check this in the log program drop down menu bar (File): 'Show also same mexages in different times'.
- The described three methods won't work in Inventory Memory Zone.

And why did I tell all of that?
Because not all the combination descriptions have an exact list of (all) the possible values.
For example see that 59723, 59676, 59629, 59582, 59535, 59491 sequence above. I mean, Lara's distance from a point is naturally chaotic, could be anything, we cannot describe the possible distance values in an exact way in a tutorial.
That's why in those 'chaotic cases' it's you who should discover the proper values for yourself, using Diagnostics or the log.

I-18. Conditions with tolerance

Sometimes you MUST use smaller/bigger relations in the conditions of the sequences. - Here are two examples to help to understand:

a, When the timer is running, then it is changing linearly, one by one. Eg. 86, 87, 88, 89, 90, 91, 92 etc. frames. So you can use eg. this condition: 'if the time in timer is 90 frames (3 seconds)'.
b, Probably you think when an objects moves then it moves nicely. So, for example, if its distance from a given point is just 617 units and it starts going away then you think, the value will start changing this way: 618, 619, 620, 621 etc.
But it's not true. When the object starts moving from 617 units, then the game will detect its next position for example at 625 units. So if you have an 'if the distance is 620 units' condition then the condition will fail - though the object will reach that position when moving.
The solution - use the condition with a tolerance. For example, 'if the distance is bigger than 618 units AND if the distance is smaller than 626 units'. And now the game will detect that 625 instead of the impossible 620. (So you don't need to try other values again and again in an 'equal' condition if that 620 fails.)
Let's see for example how we should reform a basic condition formula for a case with a tolerance:

A basic formula:
Trigger1. Define X object as the subject of Item Memory Zone.
Trigger2. Put Y field value into Z variable.
Trigger3. Study if Z variable value is A (620) or not.

The reformed formula:
Trigger1. Define X object as the object of Item Memory Zone.
Trigger2. Put Y field value into Z variable.
Trigger3. Study if Z variable value is bigger thanB (618)or not.
Trigger4. AND study if Z variable value is smaller than C (626) or not.

(Naturally it works in a similar way in the case of the basic formulas of other memory zones.)

So if your examined value is a value of a sequence, but the 'equal' condition fails then you probably should change the 'equal' condition for a 'bigger than... and smaller than...' condition.

Note:
The tolerance is not always so little (i.e. 626-618=8). Sometimes it could be bigger or much bigger. For example, when Lara is turning and the game detects its start position at 4541 - it means about 25 degrees clockwise from the north direction in the game -, then her next position (clockwise) will be probably at 5936 - which is about 32-33 degrees. So now you should use about a 1400-1500 big tolerance.
Test your tolerance idea in the game (and/or use Diagnostics or the log), and you will find the proper tolerance sooner or later!

Important!
You can have another reason to apply conditions with a tolerance in the case of sequences. For example, if I say the examined value is between 1 and 150, and you use a 'bigger than/equal with 140' condition, then the solution could be problematic. Because it's not sure that 150 means 'maximum value in that field', perhaps that means 'the biggest value in that field you can use in the condition without problems'. So if the condition fails (as the value becomes 151 or bigger, and that is really the wrong number) then you should suspect it can be a problem like this.
So try to prevent the problem with using a condition with a tolerance: 'bigger than/equal with 140, smaller than 151'.
I think it's the better if you apply smaller/bigger conditions always in 'a tolerated way' if you don't know that field too much.

I-19. Conditions with negative values

If you want to force a negative value with an executable combination then you probably won't have a problem with it. (I will tell if you will.)
But if you want to study a negative value in a condition combination, that could be buggy if you don't do that considerately. - We have this method to prevent the problem:

Let's see this example: a vertical distance above Floor Level 0 is always negative, but a vertical distance below Floor Level 0 is always positive. Naturally the value is 0 if it is exactly Floor Level 0.

We use three reformed formulas instead of one basic formula:

a, If the examined value is below Floor Level 0 or exactly Floor Level 0(hereafter we call it 'Positive formula'):

Trigger1. Define X object as the subject of Item Memory Zone.
Trigger2. Put Y field value into Z variable.
Trigger3. A C41 trigger to study if Z variable value >=0.
Trigger4. Study if Z variable value is A or not.

b, If the examined value is above Floor Level 0 or exactly Floor Level 0(hereafter we call it 'Negative formula'):

Trigger1. Define X object as the subject of Item Memory Zone.
Trigger2. Put Y field value into Z variable.
Trigger3. A C42 trigger to study if Z variable value <1.
Trigger4. An F284 trigger to turn the sign in Z variable. (Nothing happens if you want to turn the sign with 0 - i.e. if the condition is exactly Floor Level 0. Which is good.)
Trigger5. Study if Z variable value is A or not.('A' must be the positive version of the negative number!)

c, If the examined value is exactly Floor Level 0(hereafter we call it 'Null formula'):

Trigger1. Define X object as the subject of Item Memory Zone.
Trigger2. Put Y field value into Z variable.
Trigger3. Study if Z variable value is0or not.

(Naturally it works in a similar way in the case of the basic formulas of other memory zones.)

Note:
If you use a 'smaller than 0' anywhere, then that is not a condition for a negative number - because the studied value is 0, not a negative number -, though it's about negative numbers.

I-20. When do I need to use PARAM_BIG_NUMBERS?

- Triggers to force positive values (to variables or directly), when the value is defined in the trigger: work from 0 to 127.
- Triggers to force negative values (to variables or directly), when the value is defined in the trigger: work from -1 to -128.*
- Triggers to force any values (to variables or directly), when the value is defined in PARAM_BIG_NUMBERS: work from -65536 to 65535.*
- Triggers to study any values (in variables), when the value is defined in the trigger: work from 0 to 31.
- Triggers to study any values (in variables), when the value is defined in PARAM_BIG_NUMBERS: work from 0 to 65535.**

*: forcing negative numbers sometimes could be buggy. In those cases we will force positive numbers, inverting the sign - just as we did that above in the conditions. (See more about it later, in the descriptions below.)
**: you can type negative numbers now, but they will be useless. (See above how we'll study negative values.)

So, if you want, you can use PARAM_BIG_NUMBERS all the time, skipping the method when the value is defined in the trigger, you don't need those triggers. But I don't recommend the exclusive usage of PARAM_BIG_NUMBERS if you have too many numbers to be defined as a big number. I mean, the big number ID's run from 0 to 254. It is 255 numbers. So if you need many big numbers, then it's better if you don't waste big number ID's for 'little numbers'.
I.e. if you need many big numbers then everyway

- use the triggers (when the value is defined in the trigger) for the 'little numbers", and
- use PARAM_BIG_NUMBERS only:

a, If you want to force a value from -65536 to -129 or from 128 to 65535.
b, If you want to study a value from 32 to 65535.

I-21. If the big number is too big for an executable combination

Unfortunately PARAM_BIG_NUMBERS is unable to handle too big numbers, i.e. values above 65535. So if you need values above 65535 to force, then you must perform some tricks:

See how we must change a basic formula (feel free to choose any method) to force a value above 65535:

This is our basic formula for the examples:

Trigger1. Define X object as the subject of Item Memory Zone.
Trigger2. Put Y value into Z variable.
Trigger3. Force Y value of Z variable into A field.

a, Using addition:

Trigger1. Define X object as the subject of Item Memory Zone.
Trigger2. An F263 to put U value into Current Value variable. (U is from 0 to 65535 big number)
Trigger3. PutWvalue into Z variable.(W is from 0 to 65535 big number)
Trigger4. An F285 to add U to W (U+W=Y).
Trigger5. Force Y value ofCurrent Valueinto A field.

b, Using multiplication (1):

Trigger1. Define X object as the subject of Item Memory Zone.
Trigger2. An F263 to put U value into Current Value variable. (U is from 0 to 65535 big number)
Trigger3. PutWvalue into Z variable.(W is from 0 to 65535 big number)
Trigger4. An F288 to multiply U by W (UxW=Y).
Trigger5. Force Y value ofCurrent Valueinto A field.

c, Using multiplication (2):

Trigger1. Define X object as the subject of Item Memory Zone.
Trigger2. PutWvalue into Z variable.(W is from 0 to 65535 big number)
Trigger3. An F251 to multiply U by W (UxW=Y). (U is from 0 to 127, defined in this trigger.)
Trigger4. Force Y value of Z variable into A field.

(Naturally it works in a similar way in the case of the basic formulas of other memory zones.)

Notes:
- These methods don't work if you don't use variables in the executable formula.
- We don't need these methods for 'too big negative numbers', because TRNG memory zone fields won't use a 'more negative' number than -65536. (I think that -32768 above is 'the most negative' used value of TRNG memory zone fields.)

I-22. If the big number is too big for a condition combination

Unfortunately PARAM_BIG_NUMBERS is unable to handle too big numbers, i.e. values above 65535. So if you need values above 65535 to study, then you must perform some tricks:

See how we must change a basic formula (feel free to choose any method) to study a value above 65535:

This is our basic formula again for the examples:

Trigger1. Define X object as the subject of Item Memory Zone.
Trigger2. Put Y field value into Z variable.
Trigger3. Study if Z variable value is A or not.

a, Using subtraction:

Trigger1. Define X object as the subject of Item Memory Zone.
Trigger2. Put Y field value intoCurrent Valuevariable.
Trigger3. A C38 trigger to study if Current Value variable value >=V. (V=65535 big number.)
Trigger4. An F263 to put U value into Z variable. (U=any positive big number.)
Trigger5. An F286 to subtract U from W (W-U=A). (W=a number above 65535 we wanted to study originally)
Trigger6. Study ifCurrent Valuevariable value is A or not.

Notes:
- Don't use this method if the maximum value is more than about 130 000. ('Maximum value': for example, if we examine the values of a 0, 1, 2... 98, 99, 100 interval then the maximum value is 100.)
- If you don't know how to choose Value U, then here's the help: (presumed) maximum value minus Value U equals with a number being at least a bit less than 65535. (So eg. if maximum value=100 000, then choose eg. U=35 000 because 100 000 minus 35 000 is 65 000.)
- So eg. if U=35 000 and if you wanted to study 80 000 originally then A=80 000 minus 35 000=45 000.)

b, Using division (1):

Trigger1. Define X object as the subject of Item Memory Zone.
Trigger2. Put Y field value intoCurrent Valuevariable.
Trigger3. A C38 trigger to study if Current Value variable value >=V. (V=65535 big number.)
Trigger4. An F263 to put U value into Z variable. (U=any positive big number.)
Trigger5. An F287 to divide W by U (W/U=A). (W=a number above 65535 we wanted to study originally)
Trigger6. Study ifCurrent Valuevariable value is A or not.

Notes:
- 'A' must be a number below 65535 after dividing W by U.
(So eg. if we wanted to study 80 000 originally then 200 is a good U, because 80 000/200=400=A.)
- The combination could be pretty complicated if we'd like to use a condition with tolerance (see above) eg. for the 'a' (Subtraction) formula. But this 'b' formula is a pretty good formula to solve that tolerance problem in the case of too big numbers, if you choose a proper U.
Just think about it: as we know, there can't be digits after the decimal point, so A will be 400 not only if W=80 000, but if W is a value from the 'from 80 000 to 80 199' interval. (Because 80 199/200=400,995=400, but 80 200/200=401.) I.e. if you choose U=200 now that will work as if you used a 'bigger than 79 999 but smaller than 80 200' condition.

c, Using division (2):

Trigger1. Define X object as the subject of Item Memory Zone.
Trigger2. Put Y field value into Z variable.
Trigger3. A C38 trigger to study if Z variable value >=V. (V=65535 big number.)
Trigger4. An F253 to divide W by U (W/U=A). (U is from 0 to 127, defined in this trigger. W=a number above 65535 we wanted to study originally)
Trigger5. Study if Z variable value is A or not.

Notes:
- 'A' must be a number below 65535 after dividing W by U.
(So eg. if we wanted to study 80 000 originally then 2 is a good U, because 80 000/2=40 000=A.)
- That 'tolerance solution' that I mentioned at 'b' formula works now as well. But the efficiency seems too low now.
Because 80 000/2=40 000 and 80 001/2=40 000,5=40 000 but 80 002/2=40 001. I.e. it means only a 'bigger than 79 999 but smaller than 80 003' tolerance.

(Naturally it works in a similar way in the case of the basic formulas of other memory zones.)

I
-23. Single and continuous combinations

As I said above the technique of the executable combination works this way: a trigger forces a value into a memory zone field.
The question is: if you forced a value into a field, then the 'natural procedures' of the game will want to overwrite it in the next moment or not?
So we can have two results:

1. The 'natural procedures' don't want to overwrite it - this needs a 'single force'. You can achieve it in two ways:
- You force only once, in that moment. (It is not a One Shot function. The force happens only once in that moment, that's all.)
- You force again and again, in each moment, but it is only the first moment when anything happens. (I mean, in the further moments, the 'natural procedures' won't overwrite anything, so the value in the field remains the same, so the further forces won't cause anything new.)
2. The 'natural procedures' wants to overwrite it - this needs a 'continuous force'. You can achieve it in one way:
- You force again and again, in each moment. The value will be forced in the first moment. In the second moment, the 'natural procedures' would like to overwrite it, but you are still forcing, so the value will be forced again. In the third moment, the 'natural procedures' would like to overwrite it again, but you are still forcing, so the value will be forced again. Etc.

To understand 'single' or 'continuous' forces, read this:
First of all we need to talk about single and continuous parameters:

- The conditions in the GlobalTrigger could be both single and continuous:

= For example, a GT_USED_BIG_MEDIPACK is a single condition, because it becomes true only for a moment, when the player uses a big medipack.
= For example, GT_LARA_HOLDS_ITEM is a continuous condition. I.e. eg. till Lara is holding the pistols in the hands, the condition is true.
= GT_ALWAYS is clearly a continuous condition.
= For example GT_COLLIDE_ITEM could be an interesting case. If Lara goes slowly to the object and touches it gently, then it is a continuous condition. But if she jumps forwards and bounces back from the object, that is a single condition.
= The GT_CONDITION_GROUP condition could define several single or continuous TriggerGroups, as conditions.
= FGT_SINGLE_SHOT(_RESUMED) flag is a good tool to make the continuous conditions single.

We can have similar single/continuous conditions in the CONDITION triggers overlapped by F118 triggers:

= For example, use C20 trigger ('if the Screen Timer is just at X seconds') as a single condition.
= For example, 'if Lara is performing X animation' is a nice continuous condition.

- The executable combinations could have both single and continuous parameters:

= For example, 'force X time into the running timer of the object' is a single thing because the time is running, not constant.
= For example, 'make the object disabled' is a continuous thing, because the disabled state is constant, the object remains disabled till we enable it again.

The possibilities are:

a, If you use a GlobalTrigger for the force that could be either single or continuous.

- Single GT condition with single executable combination parameter: eg. 'if a big medipack has been used, then force 25 seconds into the timer of the object'. This is a single force, because the timer runs further at once after Lara has used the medipack: 26, 27 etc. seconds.
- Continuous GT condition with single executable combination parameter: eg. 'if Lara holds the pistols, then force 25 seconds into the timer of the object'. This is a continuous force, because she is holding the pistols continuously, so 25 seconds will be forced continuously. So the timer won't run - as if it weren't a timed object at all. (So it doesn't really matter which second value you will force continuously. I mean, perhaps it could matter - because, if you stop forcing, holstering the pistols, then the timer starts running from that 25 seconds.)
- Single GT condition with continuous executable combination parameter: eg. 'if a big medipack has been used, then make the object disabled'. This is a single force, because nothing new will happen, the object remain disabled after Lara has used the medipack.
- Continuous GT condition with continuous executable combination parameter: eg. 'if Lara holds the pistols, then make the object disabled'. This is a single force, because the object will be disabled the first time when the GlobalTrigger detects the pistols in Lara's hands. Then the pistols are still in her hands - but nothing new will happen because the object has been disabled yet.

b, If you use F118 to activate the combination that is always a single force:

- Single executable combination parameter, without a condition trigger overlapped: eg. 'force 25 seconds into the timer of the object'. This is a single force, because the timer runs further at once after the force: 26, 27 etc. seconds.
- Continuous executable combination parameter, without a condition trigger overlapped: eg. 'make the object disabled'. This is a single force, because the object remain disabled after the force, nothing new will happen. (Anyway, after the single force, the trigger won't care about Lara even if she is still on the square of the trigger.)
- Single condition trigger with single executable combination parameter: eg. 'if the screen timer is at 30 seconds, then force 25 seconds into the timer of the object'. This is a single force, because the object timer runs further at once after the screen timer has turned into 30: 26, 27 etc. seconds.
- Continuous condition trigger with single executable combination parameter: eg. 'if Lara is performing Animation 1, then force 25 seconds into the timer of the object'. This is a single force, because placed Condition triggers will detect Lara only in the moment when she reaches the square of the trigger. Animating1 is the walking animation, so if Lara is walking over that square, then the 25 seconds will be forced only once, when Lara steps on that square - not continuously while she's walking over that square. (So, after all, the condition works like a single condition.)
- Single condition trigger with continuous executable combination parameter: eg. 'if the screen timer is at 30 seconds, then make the object disabled'. This is a single force, because nothing new will happen, the object remain disabled after the screen timer has turned into 30.
- Continuous condition trigger with continuous executable combination parameter: eg. 'if Lara is performing Animation 1, then make the object disabled'. This is a single force, because the object will be disabled when Lara steps on the trigger square by walking. Then she's still walking - but nothing will happen because the object has been disabled yet and because the Condition trigger won't detect her now. (So, after all, the condition works like a single condition.)

And why did I tell all of that?
Because the executable combinations must be used definitely only with a single or only with a continuous force, so we are allowed to use only one of the methods for a task! (I will tell you which task works with which force method.)

Notes:
- Be careful, test cautiously with other methods - i.e. eg. if you activate the TriggerGroup by a Switch Script command, that is a single or a continuous force at the given task?
- Single conditions could be pretty hard conditions in placed Condition triggers. For example, 'if the screen timer is at 30 seconds' will be true only if Lara will step on the trigger square exactly in that second when the screen timer is at 30 seconds. The chance of this is pretty low. (Naturally it is not true if a continuous condition work like a single condition.)
- If the one that activates the trigger is not Lara (but eg. a pushable object) that also be detected on the trigger square only for a moment.
- As the 'regular' conditions in GlobalTriggers or in placed Condition triggers (see above), condition combinations naturally could also be single or continuous

= in placed Condition triggers or
= as conditions for GlobalTriggers

('Simple' and 'single' conditions are naturally not the same.)

I-24. When am I allowed to use the parts of a combination again?


Be careful with any combinations, because the combination just working will engage

- the subject that the combination uses, and
- the variable that the combination uses, and
- the field that the combination uses.

So:

- you can't have another subject for that memory zone, and
- you can't use that variable for other purposes, and
- you can't use that field for anything else

in the moment when that F118 for the combination is just being triggered or while that GlobalTrigger for the combination is enabled.

Except:
- If the GlobalTrigger has a single condition and you are sure that the condition won't be true while you want to use that memory zone/variable/field for another purpose. (This naturally won't work if a 'do it if the condition is not true' TriggerGroup is also attached to the GlobalTrigger.)
- If you use a pair of that combination at the same time. I.e. if you force something by an executable combination, and meanwhile you examine that value in a condition combination, then in the executable/condition pairs you will use the same subject/variable/field.
(Attention! As you will see later, if we have both an executable and a condition combination with a field, that doesn't always mean they are a pair, because perhaps they will work for different things. See eg. Chapter 1.2.1.: what the executable combination executes is not the same what the condition combination studies.)

I-25. Block the effect of GlobalTriggers by disabling/enabling them

Please don't forget: if a GlobalTrigger is enabled then it is able to do its effect till we disable it. So, for example:

- If it is an 'if a big medipack has been used, then force 25 seconds into the timer of the object' GlobalTrigger, then it will force 25 seconds into the timer each time when the player uses a big medipack.
- If it is an 'if Lara holds the pistols, then force 25 seconds into the timer of the object' GlobalTrigger, then it will force 25 seconds into the timer each time till Lara holsters the pistols.

So now it doesn't matter if a GlobalTrigger will perform a single or a continuous force. What matters is the GlobalTrigger is able to perform its effect any time till the GlobalTrigger is enabled.

Naturally you are not always interested in that. I mean, probably eg. you don't want X executable combination to be always activated when Lara is holding her pistols.
For example you want the GlobalTrigger of that combination to work only when Lara is in a given room. That's why

- the GlobalTrigger has an FGT_DISABLED flag (so the GlobalTrigger is disabled when the level starts), and
- there is an F109 trigger at the entrance of the room to enable the GlobalTrigger when Lara enters the room, and
- there is another F109 trigger at the exit of the room to disable the GlobalTrigger again when Lara exits the room.

Notes:
- Sometimes you should disable a GlobalTrigger only for technical reasons. For example a GlobalTrigger has this condition: 'if X enemy has died'. The GlobalTrigger should be enabled only just before the enemy comes to life. And the GlobalTrigger should be disabled again as soon as possible after the enemy died. (I mean a GlobalTrigger wastes your memory when the GlobalTrigger is enabled - because an enabled GlobalTrigger will be study its condition in each frame when being enabled. That's why you will save some memory if you disable the GlobalTrigger when the enabled status is unnecessary.)
-Be careful! Usually I don't recommend using FGT_DISABLED because that could often be buggy. Instead of that, you should place Lara object on an F109 trigger to disable the GlobalTrigger when the level starts.

I-26. Possible problems between executable and condition combinations

Be careful when you use a condition combination.
I mean, if you use an executable combination after that, to change the examined value.

For example, what if you study if a countdown timer has reached 10 seconds and the answer is yes. It means the condition is true. The timer goes further, reaching 5 seconds, and now you force the timer back to 15 seconds. The condition will become false because of that - though 5 seconds before that you got the answer: 'yes, the timer will expire in 10 seconds'.
Maybe it is logical for you in the actual situation, maybe it is not.

Or: you force a value continuously, meanwhile you examine the same field in a combination. Now naturally the condition is useless, because the solution is the constant, forced value, not something changing that you should study.

I-27. Savegame and level jump stability problem in executable combinations

If you singly forced a continuous parameter (eg. 'the object is disabled') into a field, then perhaps sometimes you experience that the value in a field is not stable, i.e. the field will lose the forced value if you

- save the game and, after that, load that savegame, or if you
- jump to the next level.

Solution in the savegame-stability problem:

- If you wanted that single force by an F118:
The executable combination must be activated by a GT_ALWAYS GlobalTrigger with FGT_DISABLED flag. There won't be an F118 where you want to start the single force, but an F109 will be there to enable that GlobalTrigger.
Or: activate the combination by an F118, as usual, but also activate an F109 there to enable a GlobalTrigger. This GlobalTrigger works in GT_LOADED_SAVEGAME mode, using FGT_DISABLED flag. The executable trigger in the GlobalTrigger is the executable combination.
- If you wanted that single force by a GlobalTrigger:
If the condition in the GlobalTrigger is true then that activates not the combination but an F109. This F109 activates a GT_ALWAYS GlobalTrigger with an FGT_DISABLED flag. The executable trigger in the second GlobalTrigger is the executable combination.
Or: if the condition in the GlobalTrigger is true then that activates not only the combination but an F109 in the combination of the TriggerGroup as well. This F109 activates a GT_LOADED_SAVEGAME GlobalTrigger with an FGT_DISABLED flag. The executable trigger in the second GlobalTrigger is the executable combination.

Solution in the level jump-stability problem:
The executable combination must be activated by a GT_ALWAYS GlobalTrigger, when the level starts.
Or place an F118 TRIGGER under Lara object to activate the combination when the level starts. (You can't use any Condition trigger overlapped with that TRIGGER this time.) There is a GT_LOADED_SAVEGAME GlobalTrigger in the Script, having the executable combination as the executable trigger.

Because of the problem, test all of your executable combinations on savegame stability and on level jump as well (if you want to keep the forced value after level jump).

Notes:
- You can disable these GlobalTriggers later, by other F109 triggers, if you don't want to keep the forced value any more.
- When you disable those GlobalTriggers to lose the forced value that doesn't always mean the forced value will be changed at once. I.e. the value will change any time after that, when the 'natural procedures' of the game want that.
- There is an important difference between the GT_ALWAYS and the GT_LOADED_SAVEGAME method:
GT_ALWAYS is a continuous condition, GT_LOADED_SAVEGAME is a single one. So

= you can't use the memory zone/variable/field of the GT_ALWAYS GlobalTrigger for another purpose till the GlobalTrigger is disabled, but
= if you are sure that the GT_LOADED_SAVEGAME condition won't be true while you want to use that memory zone/variable/field for another purpose, then you can use that memory zone/variable/field for another purpose. (This naturally won't work if a 'do it if the condition is not true' TriggerGroup is also attached to the GlobalTrigger.)

-if you want a more precise but more complicated method, then see the chapter in Paolone's Variables tutorial - The wooden Door: how save and restore our changes, about GlobalTriggers with GT_BEFORE_SAVING_VARIABLES and GT_AFTER_RELOADING_VARIABLES constants. Also see the relevant parts in the Script/project attached to that tutorial.

I-28. Savegame and level jump stability problem in condition combinations

Some of the fields (independently of the field just has a 'real' or a forced value) will lose their values (though nothing happened in the status of the examined thing) if you

- save the game and, after that, load that savegame, or if you
- jump to the next level.

That means a problem in condition combinations:
For example, a continuous condition studies if a value of a field is X or not. The value turns into X so the condition will become true. Then the player saves the game and then loads that. Now the value turns into Y. The continuous condition is still enabled, so it studies the examined thing again. But now the condition becomes false - though the status of the examined thing is still the same when the value was X.
So the condition starts working in a bad way.

If we encounter that problem then we'll change the executable trigger that should be executed when the condition is true.
Let's say the condition uses Variable A. The new executable trigger is an F271 flipeffect which will copy the value of Variable A into Current Value variable. - So if Variable A=X is true then F271 will copy X into Current Value. (So X will be the new value of Current Value.)
And we also need a new, GT_ALWAYS GlobalTrigger (in the next level, too, if we also want to study the value there):

condition: 'if Current Value is X' - i.e. almost the same condition as the original one, but this time the variable is Current Value, not Variable A.
executable trigger: the trigger you want to execute originally.

And now the condition should work properly any time.
(Disable the GlobalTrigger if the condition isn't important for you any more.)

Because of the problem, test all of your condition combinations on savegame stability and on level jump stability as well (if you want to study the vaule after level jump).

Note:
Naturally if the original condition is 'smaller' or 'bigger' for Variable A, then that is 'smaller' or 'bigger' for Current Value as well.

I-29. A problem source: the same value in different states

See an example to understand:
A field in Item Memory Zone has these values:
- 0 when the object (the actual subject of the zone) is inactive
- non-0 values when the objectis active
- sometimes 0 when the object is active

That's why if you want to examine a 0 value in that condition but it is important for you that the condition won't say 'yes, it's true' when the subject is not active, then you should prevent that somehow:

- Use one more condition in the formula (placed just before the condition you can see there): a C14 trigger in 'the subject is active/alive' mode. (A creature can be either 'active' or 'alive' in that condition. But a non-creature is never 'alive', that always must be 'active'.)
- Or, another solution instead of C14: the condition combination cannot be used when the subject is inactive. - For example, you don't want Lara to step on the F118 TriggerGroup trigger for the condition combination when the subject is inactive, that's why a door - between Lara's actual position and that F118 - will also close when Lara step on the antitrigger that turns off the subject.
- Another example: if the condition combination is the condition of a GlobalTrigger then disable the GlobalTrigger when the subject becomes inactive.

So always test your condition combinations of Item Memory Zone in these situations:
- if the object (enemy, other) haven't been activated yet,
- if the object is active (i.e. if the enemy is alive),
- if the object is antitriggered or the enemy is killed.

Note:
In the case of the creatures it is trivial what 'alive' or 'dead' means. But if a non-creature doesn't move after having been activated that doesn't mean it is 'not active'. I mean, eg., if a door has opened or a boulder has stopped at the end of its track, then they are active objects, because we didn't deactivate them after activating them. So, use an antitrigger to close the door or to make the stopped boulder do nothing - and now they are 'not active' again.
(However, all of this knowledge is not always too helpful. I mean, see for example the value of 'Custom_D' field in the case of FLOOR_4BLADE trap. It is 200 when the trap is almost stopped, it is still 200 when the trap has been stopped, and it is still 200 when the idle trap has been antitriggered. So, if you use a C14 'if the trap is active' condition, that rules out the antitriggered part, but 200 will still have two meanings: the trap is almost stopped or has been stopped.)

I-30. Ruling out problematic methods


In fact - as opposed to what I say in the previous Chapter - you'll never find 'Value 200' in the description of FLOOR_4BLADE trap. Why? Because, as I said above, I try to save big number ID's because we have only relatively few (255) of them.
That's why I skipped that '=200' condition. Instead of that, I used a '>=21' condition (which doesn't need a PARAM_BIG_NUMBERS ID), which is naturally means 200, because the possible values in that field with FLOOR_4BLADE are 0, 20, 200. (I didn't even mention that Value 200 in the description of that trap.)
I:e. the 'bigger/smaller condition' could be useful even for technical reasons, not only for sequences.

Note:
Anyway, I used the same method to get rid of the problematic 'conditions with negative numbers' thing, where I was able to, using 'smaller than 0' condition.
AkyV is offline  
Old 15-08-15, 10:19   #4
AkyV
Moderator
 
Join Date: Dec 2011
Location: Hungary
Posts: 2,377
Default

1. Combinations in Item Memory Zone

The subject of the Item Memory Zone is always a concrete Moveable object (including Lara as LARA object) which is placed in the map.

Triggers for the executable combinations:

The basic formulas if you use variables in the combination:

a, the version if you don't use big numbers:

Trigger1. An A54 to define the actual subject of Item Memory Zone. (Hereafter we call that subject 'X object'.)
Trigger2. An F232 to put a value (Y) between 0 and 127 into the chosen variable. Or an F252 to put a value (Y)between -1 and -128 into the chosen variable.

Trigger3. An F257 to force the chosen variable value into the chosen field.

b, the version if you use big numbers:

Trigger1. An A54 to define the actual subject of Item Memory Zone. (Hereafter we call that subject 'X object'.)
Trigger2. An F263 to put a value (Y) between -65536 and 65535 into the chosen variable.
Trigger3. An F257 to force the chosen variable value into the chosen field.

The basic formulas if you don't use variables in the combination:

a, the version if you don't use big numbers:

Trigger1. An A54 to define the actual subject of Item Memory Zone.
Trigger2. An F255 to put a value (Y)between 0 and 127 into the chosen field.

b, the version if you use big numbers:

Trigger1. An A54 to define the actual subject of Item Memory Zone.
Trigger2. An F261 to put a value (Y)between -65536 and 65535 into the chosen field.

Changing the basic formula:

a, Only with variables - if the number you want to force is above 65535: see Chapter I-21.
b, If you want to accomplish something special with the formula: see Chapter 7. and 8.

Triggers for the condition combinations:

The basic formulas:

a, the version if you don't use big numbers:

Trigger1. An A54 to define the actual subject of Item Memory Zone.
Trigger2. An F256 to put the value of the chosen memory zone field into the chosen variable.
Trigger3. A C43 trigger to study the chosen variable value if that is equal with a chosen number(A) between 0 and 31.

b, the version if you use big numbers:

Trigger1. An A54 to define the actual subject of Item Memory Zone.
Trigger2. An F256 to put the value of the chosen memory zone field into the chosen variable.
Trigger3. A C40 trigger to study the chosen variable value if that is equal with a chosen number (A) between 0 and 65535.


Changing the basic formula:

a, For smaller/bigger condition relations (if I say that or - if you're studying a sequence - any time):
- if you don't use big numbers:

= replace C43 trigger by C42 trigger to study the chosen variable value if that is smaller than a chosen number between 0 and 31, or
= replace C43 trigger by C41 trigger to study the chosen variable value if that is bigger than/equal with a chosen number between 0 and 31..

- if you use big numbers:

= replace C40 trigger by C39 trigger to study the chosen variable value if that is smaller than a chosen number between 0 and 65535, or
= replace C40 trigger by C38 trigger to study the chosen variable value if that is bigger than/equal with a chosen number between 0 and 65535.

b, If you're studying a sequence, and the condition need a tolerance: see Chapter I-18.
c, If the subject may have negative value in the examined property: see Chapter I-19. (I will always tell when it is needed.)
d, If the number you want to study is above 65535: see Chapter I-22.
e, If you want to accomplish something special with the formula: see Chapter 7. and 8.

1.1. General subject


1.1.1. The name of the field:
Contact Flags ($2400 = damage lara on touching) (Long)

Executable combination:
Make Lara invulnerable against the direct attack of (X) enemy

Y: 0
Force: continuous. When stopping it: the invulnerability ends at once.

Notes:
- 'Direct attack': sword, bite etc. I.e. the combination doesn't work with bullets. (Hurts caused by traps are also not included now.)
- 'If Lara collides with X object' conditions will probably fail if you are just using this executable combination on X object.

1.1.2. The name of the field:
Custom Flags (Different flags in according with object type) (Byte)

Executable combination (1):
Reactivate (X) Moveable object in (Y) way

Y:
62-general
63-One Shot
Force: single.

Notes:
- 'Reactivate' means this combination will work to activate the object only if you have deactivated the object before at least once.
- It also works if the 'real' trigger of the object was either One Shot or not.
- Don't use it with timed objects. (Except: if you antitrigger them - independently of them just working or not - before using the combination.)

Executable combination (2):
Remove the One Shot status of (X) Moveable object (till the next One Shot activation) in (Y) mode

Y:
0:
- remove the One Shot status of the antitriggered object or
- antitrigger the just active object (even if the object is not One Shot!), also removing its One Shot status
62:
- remove the One Shot status of the just active object, or
- remove the One Shot status of the timed object (independently of the - negative or positive - timer is still running or expired), or
- Be careful! It will retrigger the antitriggered objects (without One Shot status) (see Executable combination (1))
Force: single.

Having 'One Shot status' means the object has been activated by a One Shot trigger, so you cannot activate it once again.

So use this combination if you have activated an object by a One Shot trigger.
After that, you will be able to activate any (One Shot, non-One Shot) trigger of the object (again).

Notes:
- Don't misunderstand: this combination won't remove the 'One Shot' flag from a trigger, that's why I said: 'till the next One Shot activation', when the combination loses its effect.
- This combination is effectless about One Shot status if you activate it when the object doesn't have the One Shot status.
- The combination doesn't work if you use a TGROUP_SINGLE_SHOT flag instead of One Shot.

Executable combination (3):
Add One Shot status to (X) Moveable object in (Y) mode

Y:
1:
- add One Shot status to the just inactive object (after antitriggering or before the first activation) or
- antitrigger the just active object (even if the object is One Shot!), also adding One Shot status to that
63:
- add One Shot status to the just active object, or
- add One Shot status to the timed object (independently of the - negative or positive - timer is still running or expired), or
- Be careful! It will retrigger the antitriggered objects (with One Shot status) (see Executable combination (1))
Force: single.

So, after that, you won't be able to activate the object again - unless you remove the One Shot status.

Notes:
- This combination is effectless about One Shot status if you activate it when the object has the One Shot status.
- The combination doesn't work if you use a TGROUP_SINGLE_SHOT flag instead of One Shot.

Executable combination (4):
Force (Y) codebit button status on (X) Moveable object

Y:
+2: Button1 is active
+4: Button2 is active
+8: Button3 is active
+16: Button4 is active
+32: Button5 is active
Force: single.

As you know you need five active number buttons (1, 2, 3, 4, 5) so the object will be active. - See an example:
Button1, 2 and 3 are switched on (active) in OCB panel. You have a trigger where Button4 and 5 are switched on. If you activate the trigger then you also activate the trigger codebit buttons. Now all the number buttons are active, so the object will be active.

This combination is useful for example for this trick:
There is a Trigger X for Object A, with 1, 2 buttons are switched on (+2+4=6).
There is a Trigger Y for Object A, with 3, 4, 5 buttons are switched on (+8+16+32=56).
Lara activates Trigger X and then Trigger Y, so the object will be activated. Now you force Value 6 into this field as if only Trigger X had been activated, so the object will be antitriggered. Now Lara needs to activate Trigger Y again to retrigger the object.

Note:
Unfortunately, this doesn't work with objects which cannot be triggered. I.e. eg. you can't change the codebit button value of an AI_FOLLOW to make the guide do something else, reaching that AI_FOLLOW.

Condition combination (1):
If the One Shot status of (X) Moveable object is (A)

A:
'equal'
0:
- the object hasn't been triggered before (naturally not having One Shot status), or
- the object is antitriggered, not having One Shot status
1:
- the object hasn't been triggered before (having One Shot status forced on), or
- the object is antitriggered, having One Shot status
62:
- the (timed or not timed) object is active, not having One Shot status, or
- the timer for the positive timer has expired, the object has become inactive, not having One Shot status, or
- the timer for the negative timer has started, the object still isn't active, not having One Shot status
63:
- the (timed or not timed) object is active, having One Shot status, or
- the timer for the positive timer has expired, the object has become inactive, having One Shot status, or
- the timer for the negative timer has started, the object still isn't active, having One Shot status
Type: simple.

Note:
Don't use this combination if you can have a Condition combination (2) case for the object. (So if you switch on/off codebit buttons.)

Condition combination (2):
If the codebit button status of (X) Moveable object is (A)

A:
'equal'
0:
- the object doesn't have active codebit buttons and hasn't been activated before, or
- the object has been antitriggered
+2:
- Button1 in Set Trigger Type panel is switched on, and has become active when the trigger with this button for the object has been activated or
- Button1 in OCB panel is active (i.e. switched on)
+4:
- Button2 in Set Trigger Type panel is switched on, and has become active when the trigger with this button for the object has been activated or
- Button2 in OCB panel is active (i.e. switched on)
+8:
- Button3 in Set Trigger Type panel is switched on, and has become active when the trigger with this button for the object has been activated or
- Button3 in OCB panel is active (i.e. switched on)
+16:
- Button4 in Set Trigger Type panel is switched on, and has become active when the trigger with this button for the object has been activated or
- Button4 in OCB panel is active (i.e. switched on)
+32:
- Button5 in Set Trigger Type panel is switched on, and has become active when the trigger with this button for the object has been activated or
- Button5 in OCB panel is active (i.e. switched on)
Type: simple.

Notes:
- The condition is useful if you want to change the button status by the executable combination (4), and if you want to study if it has happened yet or not.
- Don't use this combination if you can have a Condition combination (1) case for the object. (So if you switched on One Shot button or if you forced on/off One Shot status.)
- If Button1, 2, 3, 4 and 5 in the OCB panel are all active (i.e. switched on) it means the object will be activated at once, without any trigger, when the level starts. But the value is not +2+4+8+16+32=62 now, but 64.
-If you activate a TRIGGER with Value 64 object, then the object will be antitriggered, and the value becomes 126. (This deed could be useful, if you want to use a One Shot switch to switch off an object.) You need to deactivate the object with a 'real' antitrigger so the values (and TRIGGER triggers) will 'start acting normally'.

Condition combination (3):
If (X) enemy is dead (general solution)

A: 'bigger/equal' 100
Type: simple.

Note:
Use it if you have problems with C14 trigger to examine the death of the enemy:

- Because C14 is not savegame-stable. I.e. you can't study the death of the enemy if you save the game after the death, and you load that savegame after that.
- Because C14 won't work with special deaths. (See: Chapter 1.1.6. Condition combination (3).)

1.1.3. The name of the field:
Facing Horizontal (Short)

Executable combination:
Turn (X) Moveable object suddenly to face (Y) direction of the compass

Y: from -32768 to 32767
Force:
- single: the AI of the object or (in the case of Lara) the player by the keys are able to correct it at once.
- continuous: the object (including Lara) is not able to turn to another direction. When stopping it: the AI of the object or (in the case of Lara) the player by the keys are able to correct it at once.

Notes:
- The meaning of the main directions (according to the game, not the Room Editor):

0: north
8192: northeast
16384: east
24576: southeast
-32768: south
-24576: southwest
-16384: west
-8192: northwest

- This is a useful combination for every Moveable object. (Including the similar combinations with the other 'Facing' fields below.) I mean, there are some other methods to turn the objects:

= ACTION triggers or Parameters= PARAM_ROTATE_ITEM Script commands to turn the item suddenly or continuously by a given degrees.
= ACTION triggers to turn the item continuously to face a given main direction.

But - except these 'Facing' fields - we don't have methods to turn the object suddenly to face a given (either main or not main) direction.
- In the case of Lara the continuous force is not the same as when you disable left/right arrow keys so she can't turn. First, the keys are enabled now, so Lara will try to turn if the player hit them - but she can't. Secondly, the keys are enabled now, so the player can use them for other purposes, eg. rolling the inventory.

Condition combination:
If (X) Moveable object faces (A) direction of the compass

A:
- with Positive formula (facing the 'eastern half' or exactly north): from 0 to 32767
- with Negative formula (facing the 'western half' or exactly north/south): from 0 to 32768
- with Null formula (facing exactly north): 0
Type: sequence.

1.1.4. The name of the field:
Facing Rotation (Only for Lara) (Short)

Executable combination (1):
Turn the face of (X) Moveable object suddenly left or right to (Y)

Y: from -32768 to 32767
Force: continuous. When stopping it: the game will correct the position automatically to the default one.

Notes:
- The main directions are:

exactly upside (default): 0
exactly right (90degrees): 16384
exactly upside down (180degrees): -32768
exactly left (90degrees): -16384

- Whatever the field name says - 'only Lara' -, this field works well with other objects.
- If Lara is rotated then maybe some of her animations - for example: doing interactions with objects - are impossible to do.
- Hair object of Lara may be buggy a bit with this kind of rotation.

Executable combination (2):
Turn Lara under water to (Y)

Y: from -32768 to 32767
Force: continuous. When stopping it: the game will correct the position automatically to the default one.

Lara's 'relative vertical axis' always goes from her feet to her head even if she's just leaning backwards/forwards etc. Executable combination (1) turns the object around a horizontal axis, but Executable combination (2) turns Lara around her 'relative vertical axis'.

Notes:
- The main directions are:

turned exactly upside (default, i.e. faces exactly below): 0
turned exactly right (i.e. faces exactly the left) (90degrees): 16384
turned exactly upside down (i.e. faces exactly above) (180degrees): -32768
turned exactly left (i.e. faces exactly right) (90degrees): -16384

- Executable combination (2) works for only Lara in water. So eg. in the case of crocodiles only Executable combination (1) will work both on land and in water.

Condition combination (1):
If the face of (X) Moveable object is turned (A) left or right

A:
- with Positive formula (turned to the 'right half' or exactly upside): from 0 to 32767
- with Negative formula (turned to the 'left half' or exactly upside/upside down): from 0 to 32768
- with Null formula (exactly upside): 0
Type: sequence.

Note:
This combination doesn't work for Lara under water.

Condition combination (2):
If Lara is turned under water to (A)

A:
- with Positive formula (faces the 'left half' or exactly below): from 0 to 32767
- with Negative formula (faces the 'right half' or exactly below/above): from 0 to 32768
- with Null formula (faces exactly below): 0
Type: sequence.

Note:
The condition is useful if you want to change the angle by the executable combination, and if you want to study if it has happened yet or not.

1.1.5. The name of the field:
Facing Vertical (Short)

Executable combination:
Turn (X) Moveable object suddenly to face (Y) the ceiling or the floor

Y: from -32768 to 32767
Force:
- Usually single.
- With Lara: continuous. When stopping it: some 'serious state changes' - for example, jumping with Lara into deep water - may annul the effect of the rotation after that.

Note:
The main directions are:

exactly upside (default): 0
turned exactly backwards (i.e. faces exactly the ceiling) (90degrees): 16384
turned exactly upside down (180degrees): -32768
turned exactly forwards (i.e. faces exactly the floor) (90degrees): -16384

Condition combination:
If (X) Moveable object faces (A) the ceiling or the floor

A:
- with Positive formula (turned to the 'back half' or exactly upside): from 0 to 32767
- with Negative formula (turned to the 'front half' or exactly upside/upside down): from 0 to 32768
- with Null formula (exactly upside): 0
Type: sequence.

1.1.6. The name of the field:
Flags of Item (Long)

Be careful!
This field is very useful but could be problematic. The best way to avoid the problems is if you avoid complex and/or special situations with this field about the actual subject. For example, don't use this field if the object doesn't have a collision. Or if the enemy is poisoned then don't examine by this field if the enemy has been hit or not. Etc.
So if something doesn't work with this field that possibly means the situation is too complex/special - so make it easier!

Executable combination (1):
Force Guard AI property on (X) enemy

Y: 547
Force: single.

Notes:
- Force the value only if the creature is active (alive).
- The property will be 'created' where the creature just is. So, if you force the property then the creature stops where he just is and starts acting as if he were standing at an AI_GUARD object.
- This forced property has the same property as the original AI object. For example, the creature at AI_GUARD object will notice Lara if she is close to him, dropping the property. That's why you cannot force Guard property on the creature if Lara is too close to him, when you activate the combination.
- An AI_GUARD object works only once during the lifetime of the creature. But you can force Guard property any time you want while the creature is living.
- Forcing other AI properties is buggy or effectless. (Or useless. For example why should you force Follow property? I mean, 'AI_FOLLOW type creatures' - Guide, Von Croy etc. - always need AI_FOLLOW objects, but other creatures can't do anything with Follow property even if you force it on them.)
- 'Forcing Guard' means only the single Guard property, i.e. not including Guard+Modify.
- 'Forcing Guard' when the creature is standing at an AI_GUARD and an AI_MODIFY object means the creature will drop Modify property and starts acting as if only there were an AI_GUARD object there.

Executable combination (2):
Force (X) enemy to drop all the AI properties

Y: 35
Force: single.

Notes:
- Force the value only if the creature is active (alive).
- For example, if the creature keeps guard at an AI_GUARD object, then dropping this Guard property (i.e. forcing 35) means the creature will leave his post - though Lara has not disturbed him, being too far away from him. (It also works with forced Guard property.)
So 'drop' means 'as if Lara had distracted the creature performing that property'.
- The combination is useful only with Guard, Modify, Guard+Modify, Patrol properties.

Executable combination (3):
Poison (X) enemy

Y: 291
Force: single.

Notes:
- Force the value only if the creature is active (alive).
- After all, this field means 'decrease the health of the enemy by degrees, but continuously, in a rhythm as if a poisoned arrow had hit him'.

Executable combination (4):
Make (X) horseman starts patrolling

Y: 8227
Force: single.

Notes:
- Force the value only if the horseman is riding.
- 'Patrolling' means this now: sometimes during the battle with Lara, the horseman decides to ride back to the AI_FOLLOW objects. First to his and then to the one of the horse. So he starts not caring about Lara (now the value turns into 8227) and rides back. If he reaches the AI_FOLLOW of the horse, then 8227 will change, the patrol ends.

Executable combination (5):
(Y) Enable/disable Lara's interaction with (X) Moveable object

Y: 32 (enable), 35 (disable), 96 (disable: only in the case of a standalone camera target)
Force: single.

Note:
You can force interaction status only with some object types such as pushable objects, pushpull/kick doors, double doors, crowbar doors, underwater doors, floor/ceiling trapdoors, zipline, sarcophagus, scales or standalone camera targets.
But it doesn't work (or buggy) with vehicles, rope, polerope, parallel (swing) bar, pickups, switches, key/puzzle holes, falling blocks, smashable bike wall/floor, burning floor, twoblock platforms (moving by the weight of Lara), SAS drag blokes, pushed rollingballs or element puzzle. (I didn't test other objects here but you can try that.)
Some remarks about the theme:

- Some objects need to be triggered so that it will work properly (burning floor, twoblock platform etc.). The triggered/antitriggered status has nothing to do with the enabled/disabled status. 'Enabled' means 'something will happen with that object if Lara touches that by herself or - eg. see the torch in the case of the burning floor - by a tool'.
- In fact it works with firerope, falling block or crowbar pickups, but if you disabled the interaction then you can't enable it again. (I.e. eg. a disabled falling block becomes a stable platform forever. Or a disabled firerope won't catch fire ever.)
- Don't worry if this combination can't do what you want. See eg. further descriptions below to know how you can enable/disable the interaction with falling blocks, pulley or crowbar switch, including the conditions about that.
- See A77 and A78 triggers to enable/disable tightropes.
- Let's see a nice example: a pushpull door (with disabled interaction) has an invisible keyhole (just as in the door in Coastal Ruins in the mouth of the tunnel towards the Catacombs). Lara cannot open the door, but then you will use the key in the keyhole that will enable the interaction again, so she will be able to open the door. I.e. it is a very nice natural situation: 'the door is closed, but use the key, and you will able to use the doorknob'.

Condition combination (1):
If (X) enemy has (A) AI property

A:
'equal'
35: the enemy doesn't have AI property, because:
a, he's dropped his AI properties when he's been distracted by Lara, or
b, you've made him drop all the AI properties by the executable combination above, or
c, he will have Guard AI property, but only later, if you will force it on him.
547: the enemy has Guard AI property, because
a, he's standing at an AI_GUARD object, or
b, you've forced Guard property on him, or
c, he's reached the second AI_AMBUSH object from the first one, or
d, he was standing at an AI_GUARD and an AI_MODIFY object but you've forced Guard property on him.
1059: the enemy has Ambush AI property, because he's running from the first AI_AMBUSH object to the second one.
2083: the enemy has Patrol AI property, because he's patrolling between AI_PATROL1 and AI_PATROL2 objects.
4131: the enemy has Modify AI property, because he's standing at an AI_MODIFY object.
4643: the enemy has Guard+Modify AI property, because he's standing at an AI_GUARD and an AI_MODIFY object.
Type: simple.

Notes:
- Don't use the combination if the enemy is not alive (still not living or dead).
- The value is also 35 if the enemy doesn't have an AI property and he hasn't had it before and he won't have it later. But it is naturally a case which is not needed to study.
- We won't study the Follow AI property (A=8227), because, as I said above it is logical that some objects have that flag but some objects don't.
(In fact, the guide or Von Croy won't have Follow property continuously during their lifetime, sometimes they drop it temporarily. But it is not easy to tell exactly when it happens so we should skip discussing this.)
- Be careful, we can have some special situations with AI properties. - Some cases I discovered:

= It is not so easy to 'really' lose the Modify property. For example, a crocodile will leave AI_MODIFY after having been distracted, but still having the value of Modify property. Or, baddy_1 distracted can't leave AI_MODIFY, just starts shooting at Lara with infinite ammo, still having the value of Modify property. - To make everything work normally again, you need to force the creature to drop all the AI properties.
= If the skeleton/baddy jumps aside when triggered (see: OCB 1 or 2) then he adopts Guard property (temporarily, while he's doing that).
= If Setha can't find Lara, then he adopts Ambush property (forever, so he won't drop it if he will find Lara later).

Condition combination (2):
If (X) enemy has (A) special status

A:
'equal'
43: dying, affected by gravitation (i.e. the skeleton is just falling into the pit after Lara having shot that, or the harpy is just falling into the ground after Lara having shot that)
51: has just been hit
291: alive but poisoned
8227: the horseman is just getting on the horse or patrolling
Type: simple.

Notes:
- About Value 51:

= It also works with immortal enemies.
= It works only with bullets, i.e. useless with arrows or grenades. (But you can do something similar with arrows or grenades - see Customize=CUST_AMMO Script command.)
= It works even if the aggressor is not Lara. (See if Troops shoots at a scorpion.) But it doesn't work with direct attacks. (See if the scorpion grabs a Troops.)
= If Lara hits 'accidentally' (i.e. if the player uses 'automatic targeting', but Lara shoots without aiming) that also matters now.

- About Value 8227:

= If Lara starts disturbing the horseman (i.e. shoots after him when he rides to get farther from her to AI_FOLLOW's) then two things is possible:
a, (Usually.) He drops Value 8227, aborting the patrol, and comes back to her.
b, (Rarely.) He comes back to her, not dropping 8227, saying 'It's so rude to disturb me. Now I punish you to learn good manners and then go back patrolling'.
= See more about horsemen in Chapter 1.8.


- Though teeth spikes are naturally not 'enemies', you can also use this condition with teeth spikes, with Value A=38, which means 'the teeth spikes has never been activated before'. Because C14 condition (which works not only with 'enemies', though the trigger name is about 'creatures') doesn't work with non-creatures in the case of 'Enemy has not been yet activated' condition.
And one more thing about C14 in the case of teeth spikes: 'Enemy is active' means 'the spikes are sticking out' and 'Enemy is not active' means 'the spikes are totally drawn back'. So teeth spikes are 'not active' even they are triggered but they are totally drawn back. So these are not 'triggered' or 'antitriggered' conditions now.
So be careful with C14 in the case of teeth spikes!
(In the cases of other non-living objects 'active' equals with 'triggered' and 'not active' equals with 'antitriggered'.)

Condition combination (3):
If (X) enemy is dead with (A) special death

A:
'smaller'
10 - a non-living Moveable object (column, teeth spikes etc.) has been exploded (as 'creature') by A14 trigger.
'equal'
2 - any enemy (including wraith) is killed by A14 trigger in 'exploding creature' way.
4 - smash object (triggered or not) or hydra has been shattered by explosive ammunition or smash object (triggered) has been shattered by Lara jumping to that (it is a useful condition, because in the case of the 'death' of smash objects - which can never happen by non-explosive ammo! - HEAVY triggers are useless, as opposed to Shatter objects)
18 - any enemy killed by explosive ammunition
34 - wraith1, wraith2 has died in the water, or falling block has fallen, or laserhead/smashable bike wall/floor has been shattered, or any enemy (including wraith) has been removed by A14 trigger
36 - jeep/motorbike has been exploded (fallen into water), or any enemy (including wraith)/a non-living Moveable object has been exploded (in 'ground/sky' or 'underwater' way) by A14 trigger
38 - the guide has been disappeared (by OCB codebit buttons of AI_FOLLOW)
42 - the skeleton has gone after Lara having shot that into the pit
51 - the fishes are all emitted (i.e. the emitter itself is 'dead')
258 - any enemy was poisoned when being killed by A14 trigger in 'exploding creature' way
260 - any enemy died when being poisoned (but perhaps not the poison itself but bullets killed him)
274 - any enemy was poisoned when explosive ammunition killed him
292 - any enemy was poisoned when being killed by A14 trigger in 'exploding ground/sky' or 'exploding underwater' way
8230 - baboon has gone by a flash
Type: simple.

Notes:
- Use C14 if you want to study the death of the enemy by A14 trigger, in 'kill creature' mode.
- After some kills performed by A14, Lara is able to aim/shoot at - even the last, empty position of - the 'dead' enemy. (So do not shoot at dead enemies.)
- The 'usual' death can also be examined in this combination, with 'equal=4'.
- As you see this condition will also work with some non-creature Moveable objects.
- In the case of some 'serious' non-living Moveable object (i.e. if the Moveables that are more than simple Animatings) the condition will also work with A14 trigger, in 'remove' mode. But the values are a bit chaotic, so I didn't put them into the list. Test your object in this condition if you want to know that value. (Or try that 1.1.2. 'general death' condition instead.)
- Cases when the status remains 'living' after the death:

= If Lara shot the ahmet dead so he's lying dead on the floor. Because, don't forget, according to the original setup, an Ahmet will never be dead, but will be transported to his cage when having been shot dead.
= A Flipeffect has made the little beetles or fishes disappear.
= Lara has shot the head of the skeleton, making that shatter.
= Locusts after dissipating.
= Kill any enemy by A14 trigger in 'antitrigger' (freezing) way.
= Create a pause in emitting creatures by A14 trigger in 'disable' way.
= Hide the enemy by A14 trigger.
= Ghost trap (see A13 trigger) for wraith3.

Condition combination (4):
If (X) wraith3 death status is (A)

A:
547: wraith3 has touched ANIMATING10 the first time
(each +512 means a newer touch)
13346: wraith3 has touched ANIMATING10 the last time - which has made him killed
Type: sequence.

As you know, a wraith3 dies if he touches an ANIMATING10, circling around it. But not right away, i.e. he must touch it more than once. Each frame when he touches the object is +512 in the counter. The 26th frame means the death of the wraith.
It happens in three (sometimes four) parts. Each part usually means a 8-10 frames long touch. So, for example, when he touches first then the counter starts: 547, 1059. 4131, 4643. Then he gets farther from ANIMATING10. Then he comes back for a newer part: 5155, 5667. 8739, 9251. Then he gets farther from ANIMATING10 again. Then he comes back for a newer part again: 9763, 10275. 12835, 13346. And now he dies.

Condition combination (5):
If Lara's interaction with (X) Moveable object is (A)

A:
'equal'
32 - tightrope is enabled (with or without an interaction) or
pushable object, pushpull/kick door, double door, crowbar door, underwater door, floor/ceiling trapdoor, zipline, sarcophagus is enabled but there is no interaction being performed or
scales is enabled but there is no interaction being performed (only in the start position i.e. before the first usage or after any reset) or
switch (without triggers) or timed switch hasn't been used before or
there is no interaction being performed with (non-timed) switch (with triggers) or SAS drag bloke or
timed switch is in off position again (after one or more usage) with Lara at the switch or
puzzle hole hasn't been used before or there is an interaction being performed with it (It's worth using this condition if there aren't triggers on the square of the hole. If there are - and usually there are, naturally - then the usual 'the KEY trigger hasn't been activated yet' means this condition.) or
key hole hasn't been used before or
standalone camera target hasn't been used before or enabled again
34 - tightrope is disabled or
Lara is performing the 'reaching into the backpack and inserting key item' animation at the key hole (see a similar condition for puzzle holes in Chapter 1.42.) and (if there are no triggers on the square of the hole) after that
35 - there is an interaction being performed with pushable object, zipline, (non-timed) switch or
there is an interaction being performed with scales or - after the interaction - the ahmet hasn't killed yet to reset the scales
the one and only interaction is being performed or has been performed with pushpull/kick door, double door, crowbar door, underwater door, floor/ceiling trapdoor, sarcophagus, SAS drag bloke or
pushable object, pushpull/kick door, double door, crowbar door, underwater door, floor/ceiling trapdoor, zipline, sarcophagus, scales is disabled or
zipline is just being triggered (to get back to the upper position)* or
there is an interaction being performed with timed switch or the timed switch is in on position or
the puzzle hole (a, if there are triggers on the square of the hole: the moment when puzzle item has just been inserted or if Lara is not at the hole after inserting the item, b, if there aren't triggers on the square of the hole: when puzzle item has been inserted)
36 - the key hole (after inserting the item) - only if there are triggers on the square of the hole (After all, you don't need this condition, because 'the KEY trigger has been activated yet' means this condition.)
37 - switch (without triggers) isn't just being used but hasn't been used at least once before or
timed switch is in off position again (after one or more usage) without Lara at the switch or
the puzzle hole (if Lara is at the hole after inserting the item) - only if there are triggers on the square of the hole
96 - there is an interaction being performed with a standalone camera target or (still not enabling the target again) there was an interaction being performed
Type: simple.

*: the value is 35 even there is nothing for the trigger to do i.e. if the zipline is in the upper position.

Notes:
- If the object is moving without Lara (eg. if she has let the zipline so she falls down, but the zipline is still sliding) that is also calculated as she's just in interaction with it.
- See interaction conditions about fireropes in Chapter 1.26.1.
- See a general interaction condition here: Chapter 2.51.
- See the 'disabled pushpull door with a key' example above. If you try that then you can also try this:
An AOD-type 'trying the closed pushpull door unsuccessfully' custom animation, starting it with this condition: 'if the door is disabled and performing the "closed" animation (Animation0) and Lara's hands are free and she is in a given position to the door - see: TestPosition Script command - and she's performing Animation103, and CTRL is being used then start the animation'. (You need another GlobalTrigger now to disable all the keys while Lara's performing the custom animation, so eg. she will not be able to draw weapons when trying the door.)

Last edited by AkyV; 15-08-15 at 10:26.
AkyV is offline  
Old 15-08-15, 10:25   #5
AkyV
Moderator
 
Join Date: Dec 2011
Location: Hungary
Posts: 2,377
Default

1.1.7. The name of the field:
Frame Now (warning it's an abs value) (Short)

Condition combination:
If (X) Moveable object just performs (A) absolute frame

A: 'equal' absolute frame index
Type: simple.

'Absolute' frames always calculate all the actual animations of the object, as if all the animations were only one, huge animation. I.e. each absolute animation frame shows up only once in the case of that object. So eg. the absolute frame with ID=567 at that object doesn't belong to a concrete animation, it belongs to that object, there is no other Absolute Frame 567 of that object.
For example you'd like to know the absolute ID of Frame 8 of Animation 18 of BADDY_1. (This is the animation when the baddy is just standing immovably.) Then open that WAD in NG Center\Tools\Animation Watcher, in 'Show PRESENT ANIMATIONS for current slot' mode. Choose BADDY_1 slot then see 'Anim' column. Choose the line of 18 (i.e. the line of Animation 18). See the green window below, searching for 'FrameStart' line. The value here is the Absolute Frame ID of Frame 0 of that animation. Probably you'll see 400 there now. 0+8=8, so 400+8=408, i.e. the absolute ID of Frame 8 of Animation 18 of BADDY_1 is 408.
So eg. 'If (BADDY_1 ID25) Moveable object just performs (408) absolute frame' true condition means the BADDY_1 that has object index=25 is just performing Frame 8 of his Animation 18.

Be careful! Adding/removing frames/animations to/from that object may change that absolute frame index.

Note:
This condition could be useful eg. if you want an AnimCommand not for all the BADDY_1 creatures placed in the map, but only for a concrete BADDY_1. (In the case of ACTION triggers it is possible if you export a trigger into WADMerger. But it doesn't work with other cases.) So you won't add that AnimCommand to that frame of BADDY_1 objects in WADMerger. Instead of that, you apply that AnimCommand as a placed trigger in the map (or an exported trigger in a GlobalTrigger), and then use this condition for that trigger. So the trigger will be executed only if this concrete BADDY_1 performs that frame.
(And there is one more trick here: you can disable that trigger temporarily, for example with a Trigger Triggerer. It will cause that concrete BADDY_1 will activate that trigger only if he performs that frame AND if the trigger is just enabled.)
(You can see something similar in Chapter 2.52.)

1.1.8. The name of the field:
Height Floor below the item (Long)

Condition combination:
If the floor below (X) Moveable object is just at (A) units from Floor Level 0

A:
- with Positive formula (below Floor Level 0 or exactly Floor Level 0): from 0 to 32 512 units*
- with Negative formula (above Floor Level 0 or exactly Floor Level 0): from 0 to 32 768 units**
- with Null formula (exactly Floor Level 0): 0 unit
Type: sequence.

*: the deepest useful floor is Floor Level -127=-127 clicks=127x256 units=32 512 units
**: the highest useful floor is Floor Level 128=128 clicks=128x256 units=32 768 units

Notes:
- The usage is recommended only with creatures if they are just alive.
- Two examples to understand why this condition could be a great help for level-editing:

= Lara is in a room with a very uneven floor. You want her to activate a thing only if the floor below her is on a given level. It means one trigger on each square that has on that level, with 'fragmented' conditions. (The conditions are needed because not each part of a broken surface has on the same level.) Or, instead of that, you create a GlobalTrigger, with an 'if the floor below.' condition for Lara. The A in that condition is the required floor level. (The GlobalTrigger is naturally enabled only if Lara is in that room.)
(Use one more condition in the GlobalTrigger: C25, in 'touching floor' mode. It causes 'if the floor below her is on a given level' turns into 'if she's on the given floor level'.)
= You want a trigger for Lara and a HEAVY trigger on the same square. It isn't possible, of course, so you place a trigger for Lara there and - instead of placing that HEAVY - create a GlobalTrigger, with an 'if the floor below.' condition, for the required creature. The A in that condition is the floor level value of that square. (In the zone where the GlobalTrigger is enabled there can't be other square on that floor level.)

1.1.9. The name of the field:

HP (Current life level. $C000 = unkillable) (Short)

Executable combination (1):
Adjust the actual life points of (X) enemy to (Y)

Y: from 1 to any
Force: single.

Note:
You can adjust the value even before triggering the creature. In that case the actual life point is naturally the same as the maximal life points. (So it is a good method if you want to force a new maximal life points only for a given creature, meanwhile the other creatures of the slot will have the original maximal life points or the maximal life points forced by an Enemy Script command.)

Executable combination (2):
Make (X) enemy immortal from now on

Y: from 1 to any
Force: continuous. When stopping it: the enemy will become mortal, with Y actual life points.

Note:
These 'immortal' enemies remain 'aimable'.

Condition combination:
If the actual life points of (X) enemy is (A)

A: from 1 to any
Type: sequence.

1.1.10. The name of the field:
OCB Code (The value you typed in OCB of this item) (Short)

Condition combination:
If the OCB code typed of (X) Moveable object is (A)

A: 'equal' OCB code typed in the OCB window
Type: simple.

Notes:
- The executable combination of this field is workable but needless. I mean, A79 trigger will do the same. But we have some problems to force a new OCB value on an object:

= Sometimes it is not savegame-stable. So not only activate A79, but trigger it with a continuous force, in a GlobalTrigger. Disable the GlobalTrigger only if you don't want to keep the forced value any more.
= Force a new OCB number on an enemy only if he hasn't come to life yet. But we still cannot be sure it will work.

- The condition combination is useful, because if you can change the OCB number by A79 then perhaps it is worth examining if the OCB number is this or that in the given moment.

1.1.11. The name of the field:

Position X (Long)

Executable combination:
Force (Y) new X horizontal actual position on (X) Moveable object

Y: from 1 to 103 424 units (counted from the northern - 'upper' - edge of Room Editor Window)
Force: single.

Notes:
- The northest square line of the editor window is useless for the inside part of the rooms. One square is 1024 units, so one square line has 1024 units width. It means if you move your room in the editor window as northern as you can, then you will always see a little (1024 units wide) gap, the northern wall of the room will never reach the northern edge of the window.
That's why eg. if you place your room in the northest position, and you want to force an 'in 3 squares distance from that wall' horizontal position on the object, then the proper solution is 1024+3x1024=4096 units, not 0+3x1024=3072 units.
The biggest distance from wall to wall inside the rooms is 100 squares=102 400 units.
That's why I said that 102 400+1024=103 424.
- You may ask why we want to complicate this thing. I mean, a simple 'Move' ACTION trigger or a Parameters=PARAM_MOVE_ITEM command would be more simple to force the position, wouldn't it? - Well, those features move the object with a given distance, but this combination moves the object into a given position. That is not always the same.
And one more thing: a 'usual' transportation with LARA_START_POS objects (see A40 trigger) always forces a new X, Y and Z coordinates on (X) object. But this combination will be able to force only Position X and the transported thing will keep its actual Position Y and Z.
- If you feel it's hard to define a value like that then use Diagnostics for Lara. Take her to the required position, then see her coordinates on the screen - and now you got the required value.
- We cannot always transport anything anywhere, i.e. there are some rules:

= Usually Moveable objects can be transported ONLY inside the room where they are placed in Room Editor.
= Objects with AI can be transported ONLY inside the room where they just are in the moment when you transport them.
= Lara can be transported into any room, with one of these methods:

a, The vector of the move from the start to the target cannot cross walls or floors, only portals between rooms.
b, You can transport her into any room, if you also force the ID of the destination room (see 'Room (Room where is the item) (Short)' field below) at the same time on her.

- If the animation has a SetPosition AnimCommand (see for example: LARA object Animation 97), changing a coordinate, then that coordinate won't be refreshed in this field while the animation is being performed.

Condition combination:
If the X horizontal position of (X) Moveable object is (A)

A: from 1 to 103 424 units
Type: sequence.

Note:
The original 'fragmented' conditions work only for Lara. You should see: you can also use the position condition combinations for other Moveables as 'HEAVY type fragmented conditions'. (Because eg. a condition like that is able to define a position such as 'in the middle of a square'.)

1.1.12. The name of the field:

Position Y (Long)

Condition combination:
If the Y vertical position of (X) Moveable object is (A)

A:
- with Positive formula (below Floor Level 0 or exactly Floor Level 0): from 0 to 32 512 units*
- with Negative formula (above Floor Level 0 or exactly Floor Level 0): from 0 to 32 768 units**
- with Null formula (exactly Floor Level 0): 0 unit
Type: sequence.

*: the deepest useful point of the level is on Floor Level -127=-127 clicks=127x256 units=32 512 units
**: the highest useful point of the level is on Floor Level 128=128 clicks=128x256 units=32 768 units

1.1.13. The name of the field:

Position Z (Long)

Executable combination:
Force (Y) new Z horizontal actual position on (X) Moveable object

Y: from 1 to 103 424 units (counted from the western - 'left' - edge of Room Editor Window)
Force: single.

Note:
See the notes above. (1.1.11. executable.)

Condition combination:
If the Z horizontal position of (X) Moveable object is (A)

A: from 1 to 103 424 units
Type: sequence.

Note:
The original 'fragmented' conditions work only for Lara. You should see: you can also use the position condition combinations for other Moveables as 'HEAVY type fragmented conditions'. (Because eg. a condition like that is able to define a position such as 'in the middle of a square'.)

1.1.14. The name of the field:

Room (Room where is the item) (Short)

Executable combination:
Force (Y) new room on Lara

Y: the game ('tomb') index of the room (See Select Room window in Room Editor. In 'RoomName (A:B )' B means the room game index. A is the Room Editor - 'NGLE' - index.)
Force: single.

Notes:
- It is useful with 'Position X (Long)' and 'Position Z (Long)' fields (see above) if you transported Lara into a new room, if the vector of the move crossed walls/floors. So use it in the same TriggerGroup, where you can find the executable formula for Lara of 'Position X (Long)' or 'Position Z (Long)' field. Put the present formula after that formula in that TriggerGroup.
- If you can't decide about the room, then see the pivot of the object. For example, if Lara is standing in a 1 click deep pool, then she's in the room above the water surface. But, when she's standing in a 2 clicks deep (waist-deep) pool, then she's in the pool. - It's because when Lara is standing in a 1 click deep (knee-deep) pool, then her pivot (her butt) is above the water surface.

Condition combination:
If (X) Moveable object is just in (A) room

A: 'equal' the game ('tomb') index of the room
Type: simple.

Notes:
- It also works for Lara, but there is a simpler solution for her: see ENV_ROOM_IS type MultEnvCondition.
- I said in Chapter 1.1.11. you cannot transport non-AI Moveable objects out of their rooms. But it doesn't mean they won't leave their rooms. Just think about a zipline that will slide from one room to another. (Or the motorbike etc.) And yes, in their cases the index of the room will be updated when they change rooms.

1.1.15. The name of the field:
Speed in horizontal movements (Short)


Executable combination:
Force (Y) horizontal speed on the actual animation of (X) Moveable object

Y: from 0 to any speed value
Force: continuous. When stopping it: the speeds start working 'normally'.

Notes:
- Let's see an example to understand what 'horizontal speed' exactly means now:
When Lara's standing, then she's performing her ID103 animation (Speed value in WADMerger Animation Editor: 0.) Then she starts running, performing her ID6 animation (Speed value: 23.) Then she's running, performing her ID0 animation (Speed value: 47.)
When she starts running (Animation6) then the Speed jumps from Value 0 of the previous animation to Value 23 of the present Animation, at once. But Animation6 has an 'Accel: 1' value in WADMerger Animation Editor. It means the speed will be increased by 1 per frame in the game: 24, 25 etc. When Animation6 has ended and Lara starts performing Animation0 then the last speed of Animation6 (it's probably 36) will jump from the 47 constant speed value of Animation0.
So not always WADMerger Speed value is shown in this field, but the accelerated speed value as well if the animation has Accel value. (Naturally negative Accel value means decreasing speed.)
- By the way, eg. 25 in this field means Lara will move horizontally 25 units during that frame. - Though this time 1024 units seems a bit less than 1 square.
- This combination doesn't always work. - Let's see another example to understand:
This is the 'stand jumping forward' animation combination of Lara, according to WADMerger Animation Editor:

Animation73: she's ready to jump, Speed: 0, Accel: 0
Animation76: she starts jumping forward, Speed: 99, Accel: 0
Animation77: she's jumping forward, Speed: 0, Accel: 0

But, when you study this field in the game (by Diagnostics), that's what you'll see:

Animation76: speed is constantly 99.
Animation77: speed is constantly 50. Not 0 at all!

But that is logical. I mean the speed of Animation77 is hardcoded, because the real value is 50 when Lara's performing a stand jump, and 75 when Lara's performing a run jump. WADMerger seems to be unable to handle hardcoded speed value, that's why that shows 0 speed value.
And that's the point: it seems you can force the speed value with this combination only in the case of hardcoded speeds.
For example, use it this way, if you want to force a new speed for the running jump: GlobalTrigger1 will force continuously the formula, in GT_ALWAYS way, but the GlobalTrigger is still disabled.
There are two more GlobalTriggers:
GlobalTrigger2 has a TriggerGroup as a condition. This TriggerGroup contains these condition triggers: 'if Lara is performing Animation16' OR 'if Lara is performing Animation18'. (Because the running jumps will start with Animation16 or 18, instead Animation76.) The executable trigger of this GlobalTrigger is a trigger to enable GlobalTrigger1.
So GlobalTrigger2 enabled GlobalTrigger1, the continuous force has started on the actual animation. Animation16 or 18 actual animations are too short and doesn't have a hardcoded speed, so the force has no effect now. But it will have an effect, if Animation77 starts.
GlobalTrigger3 has a TriggerGroup as a condition. This TriggerGroup contains this condition trigger: 'if Lara is not performing jumping status'. The executable trigger of this GlobalTrigger is a trigger to disable GlobalTrigger1 again. - So if Lara has finished the jump (Animation77), then the continuous force ends, preventing from overwriting the hardcoded speed of further animations.
- See more about horizontal speed in the description of 'Speed (Short)' Animation Memory Zone field below. (Chapter 5.10.)

Condition combination:
If the actual horizontal speed of (X) Moveable object is (A)

A: from 0 to any speed value
Type: sequence.

Note:
It works with any animation even that doesn't have a hardcoded speed. Let's see an example how this condition is useful:
When Lara is driving vehicles then you must study the horizontal speed of the vehicle (instead the speed of Lara object or Vehicle_Extra object). The biggest speed with motorbike (after using nitro) is 192. So if you use 'If the actual horizontal speed of (motorbike) Moveable object is (192)' condition, and that is true, that means Lara used the nitro and drives the motorbike with maximum speed.

1.1.16. The name of the field:
Speed vertical movements or underwater (Short)

Executable combination:
Force (Y) vertical speed on the actual animation of (X) Moveable object

Y: negative speed value (moving upwards), positive speed value (moving downwards) or 0 (no move)
Force: continuous. When stopping it: the speeds start working 'normally'.

Notes:
- Probably you cannot force a bigger value than the biggest default (Animation Editor) vertical speed of that animation.
- It doesn't always need to use this combination. See eg. F136 to force a new vertical speed on Lara jumping.
- Also use this field if you are interested in Lara's swimming speed. (But only in her case. I.e. eg. the swimming speed of the crocodile is calculated as a horizontal speed.) - This speed is always positive.
For example, when swimming under water (Animation 86) then Lara's maximum swimming speed is 200. Let's say, the pool is not water but some 'thick liquid', so you force Value 50 into this field (to make Lara swim slower), continuously, this time using 'if Lara is performing Animation 86' as a condition. (So 50 will act as a new maximum swimming speed, instead of 200.)

Condition combination:
If the actual vertical speed of (X) Moveable object is (A)

A:
- with Positive formula (moving downwards speed or no speed): 0 or positive speed values
- with Negative formula (moving upwards or no speed): 0 or positive speed values
- with Null formula (no speed): 0 speed
Type: sequence.

Note:
Let's see an example how this condition is useful:
Animation28 is the 'jumping up then falling down' animation of Lara. When she starts jumping up, then her energy (i.e. the vertical speed) is the biggest and starts decreasing while she gets higher and higher (-104, -98, -92, -86 etc.). When she reaches the top, then the energy is -2, and when the fall-down phase starts from the top, then it starts increasing while she gets lower and lower (4, 10, 16, 22 etc.) Just before she reaches back to the ground, the energy is 100.
So, for example Value -2 in this field means 'if Lara has just reached the top of her fly'. (You also need to use 'if Lara is performing Animation28' condition in the combination, after the last condition trigger of the original combination. Because, without that, -2 condition would also work if Lara had -2 vertical speed in the case of another animation.)

1.1.17. The name of the field:

State Id Next (Short)

Condition combination:
If the next state ID of (X) Moveable object is (A)

A: 'equal' State ID of the object
Type: simple.

Notes:
- This field shows the state of an animation. This state is the state of the animation that will be performed after the actual animation. This state is the state of the animation you can see in 'Next Animation' box of the actual animation, in Animation Editor.
- We don't talk about an executable formula for this field because we have other triggers for that: F78, F170 or F171 in the case of Lara or A39 in the case of other Moveable objects. (Honestly, I don't find A39 too useful.)

1.1.18. The name of the field:
State Id Now (Short)

Executable combination:
Force (Y) actual State ID on (X) Moveable object

Y: State ID of the object
Force: single.

Note:
Use it only if the subject is not Lara. See Lara's State ID triggers here: F78, F170 or F171.

Condition combination:
If the actual state ID of (X) Moveable object is (A)

A: 'equal' State ID of the object
Type: simple.

Notes:
- This field shows the state of an animation. This state is the state of the actual animation. This state is seen in 'StateID' box of the actual animation, in Animation Editor.
- Don't use this combination in the case of Lara. Use C31 instead.

1.1.19. The name of the field:
Unknown (Light_A) (Long)

Condition combination:
If red ambience light shining on (X) Moveable object is (A)

A: color value
Type: simple, but you can use either 'equal' or 'smaller' or 'bigger/equal' conditions.

Notes:
- The definition of 'red ambience light':

= the red component of RGB ambience light of the actual room typed in Room Editor, but
= don't forget: the RGB ambience value of the actual room is 'mixed' with the RGB ambience value of the adjacent room close to the portal between those two rooms. That's why the red ambience light shining on the object is not exactly the value you typed, if the object is close to a portal and if the room at the other side of the portal has another red ambience light. (Use another condition combination as well in the TriggerGroup of the present combination - see Chapter 1.1.26. - if you want the present condition to be true only when exactly the typed ambience light of the room shines on the object.)

- A is always the eightfold of the component. So eg A=8 is Red light=1, A=512 is Red light=64, A=1024 is Red light=128 etc.
- These values won't be affected if another light source (light bulb, fog bulb etc.) also shines on the object.
- There is a tiny bug about this condition: it won't work properly until the object comes through doors (portals) between rooms at least once or twice. (Don't misunderstand: it doesn't matter how many doors the object will cross or which ones those doors are. Which matters is the number of crosses so far, but through any doors.) - But each cross matters to prevent the bug only if the given color is different on the two sides of the door!
So use the condition only if you are sure that the object has crossed at least two doors during its lifetime so far, with different colors on each side of the doors.

1.1.20. The name of the field:
Unknown (Light_B ) (Long)

Condition combination:
If green ambience light shining on (X) Moveable object is (A)

This combination works in similar way as I said in Chapter 1.1.19.

1.1.21. The name of the field:

Unknown (Light_C) (Long)

Condition combination:
If blue ambience light shining on (X) Moveable object is (A)

This combination works in similar way as I said in Chapter 1.1.19.

1.1.22. The name of the field:
Unknown (Light_D) (Long)

Executable combination:
Force blinking (Y) color on (X) Moveable object

Y: color value
Force: continuous. When stopping it: only the 'normal' colors (ambience, bulbs etc.) will shine on the object again.

While you are forcing, the blink has two phase: when you see the 'normal' colors on the object and when you see the forced (Y) color on the object. (The rhythm of the blink is hardcoded, mostly constant. Maybe it changes sometimes: eg. if the color of the unused motorbike is blinking but then Lara starts riding the bike.)
If you have the RGB code you want to force then turn it into hexadecimal format. For example the color is R/G/B=20/100/50. It is $14/$64/$32 in hexadecimal. Merge the numbers: $146432. Then turn that back into decimal: 1336370. This 1336370 is your Value Y.

Notes:
- A condition combination will work for this field, if you want to study the RGB ambience light just shining on the object. But unnecessary. I mean, it is simpler if you combine the single color conditions (see above) in a TriggerGroup: 'If red ambience light shining on (X) Moveable object is (A) and if green ambience light shining on (X) Moveable object is (A) and If blue ambience light shining on (X) Moveable object is (A)'.
- A similar command works for the colors of Static objects: see Parameters= PARAM_COLOR_ITEM Script command.

1.1.23. The name of the field:

Unknown (Light_E) (Long)

Condition combination:
If red ambience light shining on (X) Moveable object has changed (A) compared to the previous room

A:
- with Positive formula (more light color in the new room): positive change values (C41 this time must be '>=1'.)
- with Negative formula (less light color in the new room): positive change values (C42 this time must be '<0'.)
- with Null formula (no change): doesn't work!
Type: simple, but you can use either 'equal' or 'smaller' or 'bigger/equal' conditions.

Notes:

- For example, the red ambience light in Room Editor in Room A is 60 and in Room B is 45. When Lara (if her object ID is X now) steps through the door (portal) between the rooms from Room A into Room B then the field becomes -15, because 45-60= -15.
- The condition won't work if there is no change between two rooms. (i.e. if A is 0.) - So don't use this condition if the red color of the adjacent rooms is the same.
- The 'crossing two doors' problem (see above) also exists now.

1.1.24. The name of the field:
Unknown (Light_F) (Long)

Condition combination:
If green ambience light shining on (X) Moveable object has changed (A) compared to the previous room

This combination works in similar way as I said in Chapter 1.1.23.

1.1.25. The name of the field:
Unknown (Light_G) (Long)

Condition combination:
If blue ambience light shining on (X) Moveable object has changed (A) compared to the previous room

This combination works in similar way as I said in Chapter 1.1.23.

1.1.26. The name of the field:
Unknown (Light_H) (Long)

Condition combination (1):
If the ambience light shining on (X) Moveable object (A) is/is not a mixture of two adjacent rooms

A:
'equal'
0: not mixture, the ambience light is exactly the typed light of the room where the object is
0, with TGROUP_NOT flag in the condition trigger: mixture, the object is close to the portal of the room having different ambience light
Type: simple.

Notes:
- See in Chapter 1.1.19. what this condition means.
- The 'crossing two doors' problem (see above) also exists now.

Condition combination (2):
If (X) Moveable object (A) has just/has not come through a door

A:
'equal'
7: has just come through a door (i.e. portal between rooms)
7, with TGROUP_NOT flag in the condition trigger: has not come through a door
Type: simple.

Note:
The 'crossing two doors' problem (see above) also exists now.

1.1.27. The name of the field:
Unknown (Pheraps accelleration on falling) (Short)

Condition combination:
If (X) Moveable object performs (A) action at AI_FOLLOW

A: 'equal' State ID of the object
Type: simple.

So this field is useful only with objects using AI_FOLLOW nullmeshes. - Two examples to understand what it is:

- When the guide starts his route the he reaches soon a square on which there's an AI_FOLLOW. Now the field value is 42 for a short while. ('For a short while' means the value is 42 then it is 0 again very soon.) When he's got the torch from the wall and steps further to ignite it, then the value is 11 for a short while. Then a flipeffect sends him further. He reaches the next AI_FOLLOW. The value is 41 for a short while. Then (thanks to this AI_FOLLOW having OCB 2 codebit on) he performs his crouching animation, causing the value become 43 for a short while.
42, 11, 41 and 43 are State ID's for the guide's animations: 42 (Animation67 - a short step to arrange him to the AI_FOLLOW), 11 - (Animation30 - to ignite the torch), 41 - (Animation66 - a short step to arrange him to the AI_FOLLOW ), 43 - (Animation69 - the crouching animation).
- When the horseman has finished the patrol (see Chapter 1.1.6. Executable combination (4)) then he starts riding back fast to Lara from the AI_FOLLOW. Now the field value is 17 for a short while.
17 is a State ID for these animations of the horseman: Animation29 (fast riding), Animation30 (starts fast riding).

Note:
This condition is not always useful. For example, if the guide ignites the torch, then an 'if the guide's state ID is 11' or 'if the guide's animation is 30' could be an easier condition. - Because it is the guide's one and only chance to ignite the torch.
But it is a good condition for example in the case of Value 17 with the horseman. Because 'if the horseman's animation is 29' means 'if the horseman is riding fast any time'. But 'If (horseman) Moveable object performs (17) action at AI_FOLLOW' means 'the horseman starts riding fast just after finishing the patrol'.

1.1.28. The name of the field:
Unknown Countdown (Some counter, not yet discovered) (Short)

Condition combination (1):
If the timer of (X) Moveable object has (A) frames before expiring

A: positive frames or 0 ('A' must be the positive version of the negative number if the timer is negative!)
Type: sequence.

Notes:
- So this condition is a condition for the good old timer we type in the Timer box of Set Trigger Type panel.
- Use F284 to invert the sign in the chosen variable if you typed a negative number in the Timer box. Place that F284 exactly before the condition trigger in the TriggerGroup.
I.e. in this field we won't use Negative/Positive/Null formula, because the values are surely only positive or only negative values!
- The field takes the value from the trigger even if the timer won't start. (For example, the timer will start a flame for 10 seconds=300 frames. If Lara steps on the trigger, then the field value jumps from 0 to 300. Even if the timer won't start - because Lara is still standing on the trigger.) - So you shouldn't use the timer maximum value in this condition.
- An executable combination for this field could be useful. But unnecessary. I mean just use another timed trigger to overwrite the original trigger timer value.

Condition combination (2):
If the activity status of timer of (X) Moveable object is (A)

The basic formula is peculiar now:

Trigger1. An A54 to define the actual subject of Item Memory Zone.
Trigger2. An F256 to put the value of the chosen memory zone field into the chosen variable
Trigger3. F284 to invert the sign in the chosen variable - but you need it only if you typed a negative number in the Timer box!
Trigger4. A C40/43 trigger to study the chosen variable value.
Trigger5. A C43 trigger to study U. - Use it only if you want to separate the meanings of A>=1. (See below.)

A:
'equal' 0:
- the trigger of the positive timer has never been activated before or
- the negative timer is not running (because the timer has never been activated before or expired, so not because Lara is standing on the trigger)
'smaller' 0: the positive timer is not running (because the timer has expired so not because Lara is standing on the trigger), but has been activated at least once before
'bigger/equal' 1:
- the timed (positive or negative) trigger is activated, but the timer is not running because Lara is still standing on the trigger
- the positive or negative timer of the timed trigger is running
Type: simple.

U: the maximum value of the timer in frames (invert the sign here if the timer is negative)
Use TGROUP_NOT flag in Trigger5, if you want only this meaning of A>=1 condition: 'the positive or negative timer of the timed trigger is running', ruling out the 'Lara is standing on the trigger' part.
Or don't use TGROUP_NOT flag in Trigger5, if you want only this meaning of A>=1 condition: 'the timed (positive or negative) trigger is activated, but the timer is not running because Lara is still standing on the trigger', ruling out the 'timer is running' part.

Note:
This condition is useful, because the object (triggered by a positive or negative timer) will have 'active' status forever (except: if you antitrigger the object) for C14 trigger always after the timed trigger has been activated for the very first time. (I.e. C14 is not useful for timed objects.)

1.1.29. The name of the field:
Visible Mesh Flags (each mesh a different bit) (Long)


Condition combination:
If (A) meshes of (X) Moveable object are invisible/shattered

A: 'equal' 1 plus B
B:
Each mesh of the object has a codebit in this field. - It is easy to understand:

All the meshes are visible or unhurt: 0
Only Mesh0 is invisible or shattered: Bit 0=Value 1
Only Mesh1 is invisible or shattered: Bit 1=Value 2
Only Mesh2 is invisible or shattered: Bit 2=Value 4
Only Mesh3 is invisible or shattered: Bit 3=Value 8
Etc.

If more meshes are invisible/shattered at the same time, then their aggregate what matters.
So, for example, if only Mesh2 and Mesh4 are invisible/shattered, then the value is 1+Bit 2+Bit 4= 1+4+16=21.

Type: simple.

Notes:
- Use F284 to invert the sign in the chosen variable. (Because of technical reasons I don't explain it now.) Place that F284 exactly before the condition trigger in the TriggerGroup.
- See in Chapter 4.1. how you can make a single mesh shatterable.
- Don't mix the two possibilities: i.e. use this condition for invisibility only if all the meshes are and remain unhurt, or use this condition for the shatter function only if all the meshes are and remain visible.
- The mesh keeps the collision after becoming invisible/having shattered.
- Lara needs to aim with the lasersight to shatter now.
- This condition is useful in the shatter case, because we can't use the 'if the Shatter object shatters then that activates a Heavy trigger' method now.
- There is an executable version of this formula to make meshes visible/invisible. But it's unnecessary. Use A50 (invisible) or A51 (visible again) instead.
(A50 has a savegame-stability problem, use NEF_SAVE_MESH_VISIBILITY Script flag to solve that problem.
Unfortunately, NEF_SAVE_MESH_VISIBILITY doesn't work with non-creatures. So now not only activate A50, but trigger it with a GT_ALWAYS or GT_LOADED_SAVEGAME GlobalTrigger. Disable the GlobalTrigger only if you don't want to keep that mesh in invisible status any more.)
- We can have a complicated savegame-stability problem in this field if the meshes are shattered. To prevent that, I highly recommend using maximum one shatterable mesh for an object. (It doesn't mean you don't need to prevent the savegame-stability problem for that only one mesh now. Use this method:
GlobalTrigger1.Condition: 'if the given mesh has shattered' (i.e. if B=the given mesh). Executable: enable GlobalTrigger2.
GlobalTrigger2. FGT_DISABLED. Condition: GT_ALWAYS or GT_LOADED_SAVEGAME. Executable: A50 to make the given mesh invisible.)
AkyV is offline  
Old 15-08-15, 10:33   #6
AkyV
Moderator
 
Join Date: Dec 2011
Location: Hungary
Posts: 2,377
Default

1.2. Enemy jeep subject

1.2.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Executable combination:
Adjust (X) enemy jeep speed (approximately) to (Y) units/second

Y: 1 or bigger units/second values
Force: continuous. When stopping it: the default speed will be restored.

Notes:
- The bigger the difference between the default and the customized speed is the more likely the route won’t be nice.
- The forced speed naturally doesn’t have any effect (and is not disturbing) if the jeep is just parked at an AI_FOLLOW.

Condition combination:
If (X) enemy jeep is just (A) moving/not moving between two AI_FOLLOW’s

A:
“equal”
0: just parked at an AI_FOLLOW
0, with TGROUP_NOT flag in the condition trigger: just moving between two AI_FOLLOW’s
Type: simple.

1.2.2. The name of the field:
Custom_C (Different usage in according with type of item) (Short)

Executable combination (1):
Shoot the next grenade from (X) enemy jeep in (Y) frames

Y: 1 or bigger frames
Force: single.

Notes:
- The default value is 5 seconds between two grenades.
- The combination will work only for the next shot that is just coming. So the shots after this next shot will come according to the default value.
- A grenade will be shot out of the jeep everyway:

= if the jeep has just arrived to an AI_FOLLOW, knowing about Lara or
= if the jeep is at AI_FOLLOW, not knowing about Lara so far but now it notices her.

So this combination is useful only if the jeep is already at the AI_FOLLOW, knowing about Lara.

Executable combination (2):
Adjust the time between two grenade shots to (Y) frames at (X) enemy jeep

Y: from 1 to 148 frames
Force: single, everyway with a GlobalTrigger.

The condition TriggerGroup of the GlobalTrigger must be this:

Trigger1. An A54 to define the same subject of Item Memory Zone.
Trigger2. An F256 to put the value of the same memory zone field into the same variable.
Trigger3. A C40 trigger to study the variable value if that is equal with 149.

Executable combination (3):
Disable (X) enemy jeep to shoot grenades

Y: 1 or bigger frames
Force: continuous. When stopping it:

- The jeep starts shooting grenades again in Y frames.
- If the jeep is just between two AI_FOLLOW’s in Y frames, then it starts shooting again only when arriving at the next AI_FOLLOW.

Condition combination:
If (X) enemy jeep has shot the latest grenade (B) frames ago

B: 149 minus A frames
A: from 1 to 148
Type: sequence.

Notes:
- Now the relations will be inverted, if you use them: “less than A” means ”more than B”, “more than/equal with A” means ”less than/equal with B”.
- You can use the combination in an “If (X) enemy jeep shots the next grenade in (A) frames” way, if you want.

1.2.3. The name of the field:
Custom_D (Different usage in according with type of item) (Short)

Condition combination:
If (X) enemy jeep is just at/is just heading for (A) AI_FOLLOW

A: ID of AI_FOLLOW (typed in the OCB window of AI_FOLLOW)
Type: simple, but you can use either “equal” or “smaller” or “bigger/equal” conditions.

Notes:
- Maybe it’s hard to find out the exact meanings of the smaller/bigger conditions now, so I’ll help:

= “Smaller than…”: it still did not start to (A) AI_FOLLOW, the jeep can be anywhere before that AI_FOLLOW.
= “Bigger than/equal with…”: it has left (A-1) AI_FOLLOW yet, the jeep can be anywhere after that AI_FOLLOW.

- Now we calculate AI_FOLLOW’s only with 0 or positive ID’s.

1.3. Guide subject

1.3.1. The name of the field:
Custom_B (Different usage in according with type of item) (Short)

Executable combination:
Put out the flaming torch temporarily in (X) guide’s hand

Y: 1
Force: single.

“Temporarily” means the guide will light it again at once.

Condition combination:
If the torch status in (X) guide’s hand is (A)

A:
“equal”
0: the torch is still not in the hand
1: he reaches for the torch/has it unlit in the hand/tries to light it at the first time (unsuccessfully)
2: he tries to light it at the second time (successfully)/has it lit in the hand
Type: simple.

1.3.2. The name of the field:
Custom_D (Different usage in according with type of item) (Short)

Condition combination:
If (X) guide is just heading for (A) AI_FOLLOW or is standing at the previous AI_FOLLOW

A: ID of AI_FOLLOW (typed in the OCB window of AI_FOLLOW)
Type: simple, but you can use either “equal” or “smaller” or “bigger/equal” conditions.

Notes:
- “Previous AI_FOLLOW”: for example, A=3 if the guide is heading for AI_FOLLOW 3 or standing at AI_FOLLOW 2.
I.e. the value turns 2 from 3 if he reaches AI_FOLLOW 2, and remains 3 till reaching AI_FOLLOW 3. (Performing a task at an AI_FOLLOW, A will change there only if he is already performing the task, so a bit after arriving at that AI_FOLLOW.)
- Maybe it’s hard to find out the exact meanings of the smaller/bigger conditions now, so I’ll help:

= “Smaller than…”: the guide can be anywhere before (A-1) AI_FOLLOW. Or – if there’s a task at (A-1) AI_FOLLOW – he perhaps has arrived at (A-1) AI_FOLLOW but hasn’t started the task yet.
= “Bigger than/equal with…”: the guide is standing at (A-1) AI_FOLLOW or – if there’s a task at (A-1) AI_FOLLOW – he surely performs/performed that task. Or, if he has left (A-1) AI_FOLLOW yet, then he can be anywhere after that AI_FOLLOW.

- Now we calculate AI_FOLLOW’s only with 0 or positive ID’s.

1.4. Von Croy subject

1.4.1. The name of the field:
Custom_C (Different usage in according with type of item) (Short)

Executable combination:
Disable (X) Von Croy to turn to Lara when waving

Y: 1
Force: continuous. When stopping it: he will be able to turn to Lara again.

When Von Croy arrives to an AI_FOLLOW, he turns to Lara and starts waving to her. If you disable that that means he starts waving when he arrives there, but won’t turn to Lara, keeping the original position in which he reached that AI_FOLLOW.

Condition combination:
If (X) Von Croy is still performing his cutscene-movements after the cutscene

A: 2
Type: simple.

Note:
These are not “usual” cutscenes. We are talking about the “Angkor Wat type” cutscenes when we could hear Von Croy’s advices to Lara. – An example to understand:
Von Croy takes his book from his jacket when he’s talking about during the cutscene. Now the player hits the “Look” key to interrupt the cutscene. Now the condition is true because he will take the book back into his jacket after the interruption.

1.4.2. The name of the field:
Custom_D (Different usage in according with type of item) (Short)

Condition combination:
If (X) Von Croy is just at/is just heading for (A) AI_FOLLOW

A: ID of AI_FOLLOW (typed in the OCB window of AI_FOLLOW)
Type: simple, but you can use either “equal” or “smaller” or “bigger/equal” conditions.

Notes:

- If he performs a task at an AI_FOLLOW then the A will change to the ID of the next AI_FOLLOW when he starts performing the task. (“Angkor Wat type” cutscenes are not “tasks”.)
- Maybe it’s hard to find out the exact meanings of the smaller/bigger conditions now, so I’ll help:

= “Smaller than…”: he still did not start to (A) AI_FOLLOW, Von Croy can be anywhere before that AI_FOLLOW. And – if there’s a task at (A-1) AI_FOLLOW – he surely hasn’t started that task.
= “Bigger than/equal with…”: he has left (A-1) AI_FOLLOW yet, Von Croy can be anywhere after that AI_FOLLOW. Except: if there’s a task at (A-1) AI_FOLLOW, then he perhaps is just performing that task.

- Now we calculate AI_FOLLOW’s only with 0 or positive ID’s.

1.5. Baddy1, Baddy2 subject

1.5.1. The name of the field:
Custom_C (Different usage in according with type of item) (Short)

Executable combination (1):
Adjust ammunition of (X) baddy to (Y) bullets

Y: any bullet amount (including 0)
Force: single.

Executable combination (2):
Give infinite ammunition to (X) baddy

Y: any bullet amount
Force: continuous. When stopping it: the baddy will have Y bullets.

Condition combination:
If the ammunition of (X) baddy is (A) bullets

A: any bullet amount (including 0)
Type: sequence.

Note:
Be careful: each round is 7 bullets, so eg. if he starts shooting a round, having 4 bullets, then the round will end at -3. I.e. “0” doesn’t always mean “empty weapon” condition. – Use “less than 1” condition instead.

1.6. Setha subject

1.6.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Executable combination:
Make energy attacks of (X) setha enervate with (Y) light effect

Y: from 1 to 150
Force: continuous. When stopping it: setha will “regain his health”, i.e. “conquer the enervation”. (If you want to stop forcing then it’s recommended to do that when he just doesn’t perform an energy attack.)

“Energy attacks” means the “direct attack” (when setha rushes at Lara) is not counted now. Setha has three types of energy attacks:

- 151 frames long: standing on the ground, a big energy ball
- 161 frames long: standing on the ground, “little” energy bullets
- 199 frames long: jumping into the air, “little” energy bullets

If you force Y that means all the possible energy attack procedures that the setha will perform after that, will have the proper noises – but there won’t be missiles to hurt Lara. (That’s why the attack is “enervate”.)
In the given frame of the “real” attack procedure, the setha will perform different light effects on himself. (“No light” is included in the “different” now.) For example, in the 100th frame of the jumping attack we could see a given light effect on setha. Call that effect “Alpha”. So, if we force Y=100 now, then he will perform “Alpha” light effect continuously when performing an enervate jumping attack. (Naturally maybe Y=100 means another light effect with the other two procedures. I didn’t check all the possibilities. I suggest choosing Y value randomly and then test it the game if that Y is proper for all the three procedures.)

Notes:
- Y value cannot reach the length of the shortest (151 frames long) attack type or the solution will be buggy perhaps.
- The forced value naturally doesn’t have any effect if the setha is just not energy-attacking.

Condition combination:
If (X) setha has started an energy attack – still being performed - (A) frames ago

A: from 1 to 150 frames
Type: sequence.

1.7. Crocodile subject


1.7.1. The name of the field:
Custom_B (Different usage in according with type of item) (Short)

Executable combination:
Make (X) crocodile waiting an AI_GUARD to move his tail in (Y) direction (till he can)

Y: leftwards (-12). rightwards (12)
Force: continuous. When stop forcing: the crocodile will start moving his tail as his wish.

Condition combination:
If (X) crocodile waiting an AI_GUARD moves/moved the last time his tail in (A) direction

A:
“equal” 12: rightwards
“smaller” 0: leftwards
Type: simple.

Note:
This condition works properly only together with an “if the creature is in AI_GUARD mode” condition (see above), using the two condition combinations after each other in the same TriggerGroup.

1.8. Horseman subject

1.8.1. The name of the field:
Custom_B (Different usage in according with type of item) (Short)

Condition combination:
If (X) horseman (A) is/is not on the horse

A: “equal” 0 (still not getting on the horse or fallen down), 1 (riding/getting on the horse)
Type: simple.

Note:
Use this condition together with the Condition combination (2) of Chapter 1.1.6. (In the same TriggerGroup, after each other.) Because eg. if we combine the 8227 of that combination and this 0, then the “aggregated” condition means: “if the horseman is getting on the horse”. (So this 0 rules out the “patrolling” part there, and that 8227 rules out the “fallen down” part here.)

1.9. Mutant subject

1.9.1. The name of the field:
Custom_C (Different usage in according with type of item) (Short)

Executable combination (1):
Make (X) mutant perform the harmless rage for (approximately) further (W) frames from now on

W: 600 minus Y frames
Y: from 1 to 599
Force: single.

Notes:
- The harmless rage will start if the mutant – has just come to life – has totally opened his “double collars”. So, if you activate this combination then the counter in the combination won’t start till the collars are totally open.
- The default value is 600 frames (20 seconds) for his harmless rage.
- Some moments after stopping raging, the mutant will notice Lara. Until he notices her, he won’t attack her.
- “Approximately” means if the mutant is just in the middle of a “rage animation” when W timer is just expires then he finishes the animation everyway after that.
- If you activate this condition after he started attacking then he stops attacking now to rage again for W frames. (If you activate the condition when he is just in the middle of an attack then he finishes the attack before starts raging.)

Executable combination (2):
Make (X) mutant perform the harmless rage forever

W: 600 minus Y frames
Y: from 1 to 599
Force: continuous. When stop forcing: the rage will stop (approximately) in W frames.

Note:
Activate the combination after he started attacking and he aborts the attack (at the end of the attacking animation) for a never-ending rage.

Condition combination (1):
If there are still (B) frames (approximately) before (X) mutant stops the harmless rage

B: 600 minus Y frames
A: from 1 to 599
Type: sequence.

Note:
Now the relations will be inverted, if you use them: “less than A” means ”more than B”, “more than/equal with A” means ”less than/equal with B”.

Condition combination (2):
If (X) mutant is just (A) harmful/not harmful to Lara

A:
“equal”
999: harmful
999, with TGROUP_NOT flag in the condition trigger: harmless (i.e. the mutant is just raging)
Type: simple.

1.10. Harpy subject


1.10.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Executable combination:
Make energy attacks of (X) harpy enervate with (Y) light effect

Y: from 1 to 118
Force: continuous. When stopping it: harpy will “regain his health”, i.e. “conquer the enervation”. (If you want to stop forcing then it’s recommended to do that when she – harpies are definitely “she”s, right? - just doesn’t perform an energy attack.)

The one and only energy attack type of the harpy is 118 frames long.

(See setha above to understand this.)

Condition combination:
If (X) harpy has started an energy attack – still being performed - (A) frames ago

A: from 1 to 118 frames
Type: sequence.

1.11. Little beetle subject


1.11.1. The name of the field:
Custom_C (Different usage in according with type of item) (Short)

Executable combination:
Make (X) little beetle be emitted from the wall with (Y) speed

Y:
0: they will be emitted fast, in only one bunch (because little beetles will be emitted in four bunches from the wall usually)
1: only one or few beetles will be emitted at the same time. There is one or few seconds pause between two emissions
Force: continuous. When you stop forcing: the emission will continue “normally” (if there still are beetles in the wall).

Note:
“From the wall” means it works only for +4000 OCB, when the scarabs are emitted from the wall.

Condition combination:
If (A) bunches of all the four bunches of (X) little beetle has not emitted from the wall yet

A: from 0 to 4
Type: sequence.

Note:
When the first bunch has been emitted, then the field value turns from 4 to 3, when the second bunch has been emitted, then the field value turns from 3 to 2 etc.

1.12. Wraith subject

1.12.1. The name of the field:
Custom_B (Different usage in according with type of item) (Short)

Executable combination (1):
Customize (X) fire wraith in (Y) way

Y: 10000 (each contact with Lara will ignite her + wraith is invulnerable in water), 1 (each contact with Lara will not ignite her + wraith is invulnerable in water), -2 (each contact with Lara will not ignite her + wraith is vulnerable in water)
Force: continuous. When stopping it: everything will start working “normally” about ignition/vulnerability.

Executable combination (2):
Make (X) ice wraith invulnerable in water

Y: 1
Force: continuous. When stopping it: the wraith can be killed after that in water.

Note:
If the invulnerable ice wraith contacts with water then the flipmap (that should be activated when the wraith dies in water) won’t be activated.

Condition combination (1):
If the status of (X) fire wraith is (A)

A:
“equal”
10000 (each contact with Lara will ignite her + wraith is invulnerable in water)
1 (each contact with Lara will not ignite her + wraith is invulnerable in water)
“smaller”
0 (each contact with Lara will not ignite her + wraith is vulnerable in water)
Type: simple.

Note:
Use it only if you also use the executable combination for customization.

Condition combination (2):
If (X) ice wraith is (A) vulnerable/invulnerable in water

A: “equal” 1 (invulnerable), 0 (vulnerable)
Type: simple.

1.12.2. The name of the field:
Custom_C (Different usage in according with type of item) (Short)

Condition combination:
If (X) wraith is circling (A) clockwise/anti-clockwise

A:
“bigger/equal” 1 (clockwise)
“smaller” 0 (anti-clockwise)
Type: simple.

Note:
Naturally if the radius is big then the route of the wraith seems linear, though that isn’t.

1.12.3. The name of the field:
Custom_D (Different usage in according with type of item) (Short)

Executable combination:
Make (X) wraith have (Y) route

Y: positive numbers (moving forwards+constantly downwards), negative numbers (moving forwards+constantly upwards), 0 (moving forwards+keeping constantly his Room Editor vertical position).
Force: continuous. When stopping it: the wraith will continue its route as usual.

Notes:
- The scale is not linear. I.e. if Y=-1 is a very low ascension, then Y=-1000 is not a thousandfold ascension, but much less.
- Don’t forget to kill the wraith if he ascended too high/descended too low, disappearing above the ceiling/below the floor forever. (Use an A14 if there is no other way to kill him.) Or stop forcing and the wraith will start chasing Lara again.

Condition combination:
If (X) wraith is (A) coming closer to/going farther from Lara

A:
“bigger/equal” 1 (going farther)
“smaller” 0 (coming closer)
Type: simple.

Note:
This condition seems a bit buggy (i.e. it will have the wrong result) if you use it too soon. That’s why first you should use it at the first attack against Lara (and not before, but at any time after that). (I.e. start this condition combination if you are sure that the wraith has been living for a couple of seconds, at least.)

Last edited by AkyV; 15-08-15 at 10:38.
AkyV is offline  
Old 15-08-15, 10:34   #7
AkyV
Moderator
 
Join Date: Dec 2011
Location: Hungary
Posts: 2,377
Default

1.13. Ahmet subject

1.13.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Executable combination:
Transport (X) ahmet to (Y) new X horizontal start position when the scales are being reset the next time

Y: 1st-100th squares of the floor grid, counted from the northern (top) edge of Room Editor Window
Force: single.

Note:
- If you don’t change Z horizontal coordinate (see below) then that will keep its value.
- The game draws a horizontal vector that starts from the previous X, Z point, and ends at the next X, Z point. The vector cannot cross room walls or else the combination will fail. But that doesn’t mean the new X, Z point cannot be in another room – in this case the vector must cross portals (doors) where there were room walls before.
- In the new X, Z position the ahmet will be put on the floor square of the room there. (If the ahmet will be in a higher/lower floor square after this “transportation”, in another room, so not where you want, then you probably must descend/ascend the vertical position of the previous X, Z point – i.e. the floor square there -, to solve the problem.)

Condition combination:
If (X) ahmet will be in (A) X horizontal start position when the scales are being reset the next time

A: 1st-100th squares of the floor grid, counted from the northern (top) edge of Room Editor Window
Type: sequence.

1.13.2. The name of the field:
Custom_C (Different usage in according with type of item) (Short)

Executable combination:
Transport (X) ahmet to (Y) new Z horizontal start position when the scales are being reset the next time

This combination works in similar way as I said in Chapter 1.1.23.
The squares now counted from the western (left) edge of Room Editor Window.

Condition combination:
If (X) ahmet will be in (A) Z horizontal start position when the scales are being reset the next time

A: 1st-100th squares of the floor grid, counted from the western (left) edge of Room Editor Window.
Type: sequence.

1.14. Scales subject

1.14.1. The name of the field:
Custom_B (Different usage in according with type of item) (Short)

Condition combination:
If the wrong amount of water is just poured in (X) scales

Y: “equal” 1
Type: simple.

Note:
This combination could be useful because the original setup of scales is able to activate only objects if the wrong amount is poured – but now you can activate anything with this condition.

1.15. Falling block subject

1.15.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

This field will work only if Lara steps on the block. (So don’t use it if the block will start falling down by a trigger.)

Executable combination:
(Y) Enable/disable (X) falling block to be able to shiver (i.e. to start falling down)

Y: disable (1), enable (0)
Force: single.

Condition combination:
If (X) falling block (already shivering) will fall down in (B) frames

B: A minus 1
A: 2-60 frames (60 is when the block starts shivering)
Type: sequence.

1.16. Rollingball subject

1.16.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Executable combination:
Adjust (X) rollingball north/south speed to (Y)

Y: positive numbers (southwards), negative numbers (northwards), 0 (no speed). (Approximately?) each 512 means the speed of the ball is just enough for a one square long travel. - So eg. 512 means the chafing between the ball and the floor will slow down the ball that will stop after further one square long travel – except, naturally, if the ball gets on a slope down or encounter an obstacle in the meantime.
(Another example: -1792=-3,5×512 means: in the given moment the speed of the ball – rolling in the north direction - is just enough for a 3,5 squares long travel, before the chafing stops the ball.)
Force: continuous. When stopping it: the ball will roll “according to the rules of physics”.

Notes:
- North/south: in Room Editor facing.
- This combination is a great tool to make the ball roll down slow in a sharp slope or to shoot it out like a cannonball etc. (For example: place the ball in a totally horizontal floor, and trigger it. Now the ball won’t move, but it is triggered – so, when you force a big speed on it, the ball will start rolling fast as if he were shot out of a cannon. – Or start with the speed, and the ball will be shot out when triggered.
Then the ball will cross a HEAVY to disable the GlobalTrigger – i.e. to stop forcing – so the ball wall lose his momentum by degrees and stop soon.)
- Naturally it is a complicated situation if the vector of the ball doesn’t have a main (north, east, south, west) direction. For example, if it is rolling with A speed to northeastwards then it means it is rolling with B speed to northwards AND with C speed to eastwards.

Condition combination (1):
If (X) rollingball north/south speed is (A)

A:
- with Positive formula (moving southwards speed or no speed): 0 or positive speed values
- with Negative formula (moving northwards or no speed): 0 or positive speed values
- with Null formula (no speed): 0 speed
Type: sequence.

Notes:
Naturally 0 doesn’t always mean “stopped”. I mean, if the direction of the ball has an east/west part then 0 in north/south speed means the ball is rolling exactly eastwards or exactly westwards.

Condition combination (2):
If (X) rollingball is rolling (A) northwards/southwards

A:
“bigger/equal” 1 (moving southwards)
“smaller” 0 (moving northwards)
“equal” 0 (doesn’t move)
Type: simple.

1.16.2. The name of the field:
Custom_B (Different usage in according with type of item) (Short)

Executable combination:
Adjust (X) rollingball east/west speed to (Y)

Y: positive numbers (eastwards), negative numbers (westwards), 0 (no speed).
Force: continuous. When stopping it: the ball will roll “according to the rules of physics”.

Note:
East/west: in Room Editor facing.

Condition combination (1):
If (X) rollingball east/west speed is (A)

A:
- with Positive formula (moving eastwards speed or no speed): 0 or positive speed values
- with Negative formula (moving westwards or no speed): 0 or positive speed values
- with Null formula (no speed): 0 speed
Type: sequence.

Notes:
Naturally 0 doesn’t always mean “stopped”. I mean, if the direction of the ball has a north/south part then 0 in east/west speed means the ball is rolling exactly northwards or exactly southwards.

Condition combination (2):
If (X) rollingball is rolling (A) eastwards/westwards

A:
“bigger/equal” 1 (moving eastwards)
“smaller” 0 (moving westwards)
“equal” 0 (doesn’t move)
Type: simple.

1.17. Teeth spikes subject

1.17.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Executable combination:
Adjust (X) teeth spikes speed to (Y)

Y: from 1 to about 850
Force: continuous. When stopping it: the speed of the spikes will be “normal”.

Notes:
- Customized teeth spikes seem less dangerous than usual.
- Usually teeth spikes are “bouncing”. If you force the speed then they will not.
- If the speed is too slow (i.e. closer to 0) then the spikes will not have enough time to be drawn back totally, so they will jump up again before reaching the floor level.

Condition combination:
If (X) teeth spikes extension is in (A) position

A: “equal” 0 (the spikes are just totally extended), 1024: (the spikes are just totally drawn back)
Type: simple.

Note:
The spikes are “bouncing” so they reach the top position twice at each extension.

1.17.2. The name of the field:
Custom_C (Different usage in according with type of item) (Short)

Executable combination:
Adjust the extension time to (Y) frames at (X) teeth spikes

Y:
from 1 to 63 frames (for the first condition)
from 1 to any frames (for the second condition)
Force: single.

Notes:
- “Extension time” counted from when the spikes starting drawing back after the bounce, till the spikes shoot out of the ground the next time.
- If the time is too short (i.e. closer to 0) then the spikes will not have enough time to be drawn back totally, so they will jump up again before reaching the floor level.
- “First” and “second” condition means you must activate this combination by a GlobalTrigger, and the condition TriggerGroup of the GlobalTrigger must be this (first condition):

Trigger1. An A54 to define the same subject of Item Memory Zone.
Trigger2. An F256 to put the value of the same memory zone field into the same variable.
Trigger3. A C40 trigger to study the variable value if that is equal with 64.

Or this (second condition):

Trigger1. An A54 to define the same subject of Item Memory Zone.
Trigger2. An F256 to put the value of Custom_A memory zone field into another variable.
Trigger3. A C43 trigger to study the second variable value if that is equal with 0.

The differences between the two methods:

= Bouncing: it looks nicely (with first condition), it doesn’t happen (with second condition)
= Possibility of bigger time than the default 64 frames: spikes cannot exceed the limit (with first condition), spikes can exceed the limit (with second condition)

Condition combination:
If the next extension of (X) teeth spikes start in (A) frames

A: from 1 to 64 frames (with the default method or if the executable formula is used with the first condition), from 1 to any frames (if the executable formula is used with the second condition)
Type: sequence.

1.18. Joby spikes subject

1.18.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Executable combination:
Adjust (X) joby spike rotation speed to (Y)

The basic formula (let’s see only the version with variables now) is peculiar now:

Trigger1. An A54 to define the actual subject of Item Memory Zone.
Trigger2. An F256 to put the value of the chosen memory zone field into the chosen variable.
Trigger3. A C41 trigger to study if the chosen variable value >=1.
Trigger4. An F232/F263 to put a value into the chosen variable. (The force if the rotation is anti-clockwise.)
Trigger5. An F257 to force the chosen variable value into the chosen field. (The force if the rotation is anti-clockwise.)
Trigger6. A C42 trigger (with TGROUP_ELSE flag) to study if the chosen variable value <0.
Trigger7. An F232/F263 to put a value into the chosen variable. (The force if the rotation is clockwise.)
Trigger8. F284 to invert the sign in the chosen variable.
Trigger9. An F257 to force the chosen variable value into the chosen field. (The force if the rotation is clockwise.)

Y: from 1 to any speed (After 10000 the spike rotates very fast. 4100-whatever is the default maximum value.)
Force:
- Single, forced speed below the maximum: the speed jumps to the new value (increasing/decreasing the actual speed) then accelerates till reaching the maximum.
- Single, forced speed above the maximum: the spike will apply and keep the forced speed value.
- Continuous, forced speed below the maximum: the spike will apply and keep the forced speed value. When stopping it: the speed will increase to the maximum.

Notes:
- The odd formula is necessary because of the direction of the rotation that seems random: the speed value is positive in anti-clockwise case but negative in clockwise case. (I.e. it depends on the game: the spike will be triggered in clockwise or anti-clockwise way.) – We always force the same (positive) value in Trigger4 and Trigger7, so you should turn the sign of the negative value in Trigger7.
- If you activate the formula by an F118, then don’t forget: TriggerGroups with condition triggers must be “multiple” type in their F118.
- If the joby spike goes mad after you’ve loaded a savegame that means the game tries to perform both the directions at once. Load the savegame again (and again) to solve the problem (I can’t see other solution now).
- When the joby spike has been triggered, first it rotates slowly, but after some seconds it reaches the maximum of its rotation speed.
- You cannot invert the direction forcing negative value on positive speed (or vice verse).

Condition combination (1):
If (X) joby spike rotation speed is (A)

The basic formula is peculiar now:

Trigger1. An A54 to define the actual subject of Item Memory Zone.
Trigger2. An F256 to put the value of the chosen memory zone field into the chosen variable
Trigger3. A C41 trigger to study if the chosen variable value >=1.
Trigger4. A C40/43 trigger to study the chosen variable value, as usual. (The study if the rotation is anti-clockwise.)
Trigger5. An executable trigger that will be executed if the speed is the given value.
Trigger6. A C42 trigger (with TGROUP_ELSE flag) to study if the chosen variable value <0.
Trigger7. F284 to invert the sign in the chosen variable.
Trigger8. A C40/43 trigger to study the chosen variable value, as usual. (The study if the rotation is clockwise.)
Trigger9. The same executable trigger that will be executed if the speed is the given value.

A: from 1 to any speed
Type: sequence.

Notes:
- Trigger4 and 8 study the same (positive) value. (Or “values”, if Trigger4 or 8 are not one C40/43 trigger but each of them is a “bigger/equal-smaller” condition trigger pair.)
- As you see, this time we need to apply everyway the executable trigger (that will be executed if the condition is true) in the formula. (As you see, this trigger is the same, independently of the direction of the rotation, but you can choose different triggers if you want.)
- In this field we won’t use Negative/Positive/Null formula, because now we use this peculiar formula instead of them.

Condition combination (2):
If (X) joby spike is rotating (A) clockwise/anti-clockwise

A:
“bigger/equal” 1 (anti-clockwise)
“smaller” 0 (clockwise)
Type: simple.

1.18.2. The name of the field:
Custom_B (Different usage in according with type of item) (Short)

Executable combination:
Adjust (X) joby spike actual extension to (Y)

Y: from 0 to any (the default maximum is 6303)
Force:
- Single, forced extension below the maximum: the extension jumps to the new value (increasing/decreasing the actual extension) then extends till reaching the maximum.
- Single, forced extension above the maximum: the spike will apply and keep the forced extension value.
- Continuous, forced extension below the maximum: the spike will apply and keep the forced extension value. When stopping it: the extension will increase to the maximum.

Note:
It works even if the spike is inactive.

Condition combination:
If the actual extension of (X) joby spike has (A) length

A: from 0 to any
Type: sequence.

1.18.3. The name of the field:
Custom_D (Different usage in according with type of item) (Short)

Executable combination:
Adjust (X) joby spike maximal extension to (Y)

Y: from 1 to any
Force: single.

Condition combination:
If the maximal extension of (X) joby spike has (A) length

A: from 1 to any
Type: sequence.

1.19. Chain/Plough/Stargate/Moving blade subject

1.19.1. The name of the field:
Custom_D (Different usage in according with type of item) (Short)

Condition combination:
If (X) chain/plough/stargate/moving blade first activity status is (A)

A:
“equal”
0: the trap has never been activated before
0, with TGROUP_NOT flag in the condition trigger:
a, the trap is active or
b, the trap is inactive but has been activated before at least once
Type: simple.

Note:
This “first activity” condition is useful, because the “Enemy has not been yet activated” in C14 works only with creatures. (Though “Enemy is active” and “Enemy is not active” are also useful with non-living objects in C14.)

1.20. Hammer subject

1.20.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Condition combination:
If (X) hammer is (A) striking/not striking

A:
“equal”
0: the hammer is ascending
0, with TGROUP_NOT flag in the condition trigger: the hammer is striking
Type: simple.

Note:
The first part of the shiver after the strike is included in the strike now.

1.20.2. The name of the field:
Custom_C (Different usage in according with type of item) (Short)

Condition combination:
If (X) hammer (A) is/is not in the uppermost position

A:
“equal”
0: the hammer is in the uppermost position
0, with TGROUP_NOT flag in the condition trigger: the hammer is not in the uppermost position
Type: simple.

1.20.3. The name of the field:
Custom_D (Different usage in according with type of item) (Short)

Condition combination:
If (X) hammer first activity status is (A)

A:
“equal”
0: the hammer has never been activated before
0, with TGROUP_NOT flag in the condition trigger:
a, the hammer is active or
b, the hammer is inactive but has been activated before at least once
Type: simple.

1.21. Burning floor subject

1.21.1. The name of the field:
Custom_C (Different usage in according with type of item) (Short)

Executable combination:
Force (Y) fire intensity on (X) burning floor

Y: from 1 to any
Force:
- The force is single (1-255), before the floor catches fire: the floor will catch fire with that intensity when the torch lands on it. Then the counter starts running up from that intensity.
If the force is continuous then the counter won’t start till you abort forcing.
- The force is single (1-255), when the counter runs up: the intensity jumps (up/down) to that value, but the counter continues running up.
If the force is continuous then the counter won’t continue till you abort forcing.
- The force is single (1-255), when the counter is at the maximum (255): the intensity jumps down to that value, and the counter runs up to 255 again.
If the force is continuous then the counter won’t run up again till you abort forcing.
- The force is single (1-255), when the counter runs down: the intensity jumps (up/down) to that value, but the counter continues running down.
If the force is continuous then the counter won’t continue till you abort forcing.
- The force is single (above 255), when the counter runs down: it causes a peculiar cycle. I.e. eg. if you force 850 that means three and a half cycle: from 850 to 765 (a lower half of the decreasing cycle), from 765 to 510 (a complete decreasing cycle: 765-510=255), from 510 to 255 (a complete decreasing cycle, 510-255=255), from 255 to 0 (a complete decreasing cycle). So, when the fire extinguishes at 765, 510 or 255 then it will flame out again at once, with full intensity. (At 0 the floor crumbles, naturally.)
If the force is continuous then the counter won’t run till you abort forcing.

Notes:
- The trigger has no effect if the floor isn’t burning.
- When the floor catches fire then a counter starts in this field from 0 to 255. The higher the number is the larger the fire is. When the counter stops at 255 then the intensity is constantly maximal. After some moments, the counter starts counting down. The lower the number is the more little the fire is. Reaching 0, the floor crumbles.
So, for example, if you want “Intensity 200” that means this is the fire intensity when the counter (up/down) reaches 200.

Condition combination:
If the status of (X) burning floor is (A)

A:
“equal”
0 (the floor still isn’t burning)
2 (the floor has been crumbled)
255 (the flames are at the constant maximum)
“bigger/equal” (3) and “smaller” (255): the flames are just increasing/decreasing (Yes, two condition triggers, after each other!)
Type: simple.

1.21.2. The name of the field:
Custom_D (Different usage in according with type of item) (Short)

Executable combination (1):
Ignite (X) burning floor as if (Y) frames had been elapsed since the floor has caught fire

Y: from 1 to 449 frames
Force: single.

When the floor catches fire then a frame counter starts in this field from 0 to 450. When the counter reaches 450 then the fires start extinguishing.
So, for example, value 400 means the fires have started burning 400 frames ago, and they start extinguishing in 50 frames.

Notes:
- If you force a value then the floor catches fire by itself at once (having the intensity that belongs to that frame), and the counter starts from that frame.
- Using numbers above about 430 the solution is more or less buggy. (I.e. the flames will be put out sooner than you expect, with those numbers.)

Executable combination (2):
Force (Y) special status on (X) burning floor

Y: 0 or 450
Force:
- Single with 0: extinguishes the flames at once, the floor remains whole.
- Single with 450: the floor (still not burning) will crumble at once.
- Continuous with 0: the torch (though it will be devoured as usual) won’t ignite this floor (till stop forcing) if Lara throws that on that.

Condition combination:
If (X) burning floor has been burning for (A) frames

A: from 1 to 449 frames
Type: sequence.
AkyV is offline  
Old 15-08-15, 10:36   #8
AkyV
Moderator
 
Join Date: Dec 2011
Location: Hungary
Posts: 2,377
Default

1.22. Spikeball subject

1.22.1. The name of the field:
Custom_D (Different usage in according with type of item) (Short)

Condition combination (1):
If (X) spikeball first activity status is (A)

A:
“equal”
0: the spikeball has never been activated before
0, with TGROUP_NOT flag in the condition trigger:
a, the spikeball is active or
b, the spikeball is inactive but has been activated before at least once
Type: simple.

Note:
The spikeball is inactive only if it has returned into its cage on the ceiling.

Condition combination (2):
If the injuriousness status of (X) spikeball is (A)

A: “equal” 50 (injurious – i.e. the knives are extended), 150 (not injurious – the ball is still falling down, or has fallen down but the knives haven’t extended yet)
Type: simple.

1.23. Flame emitter subject

These fields work only if the flame is being blown horizontally/vertically from the emitter!

1.23.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Executable combination (1):
Make (X) flame emitter stop blowing and start the next blow in (Y) frames

Y: 1 or bigger frames
Force: single.

Notes:
- The “stop” means the emitter starts stopping the blow, as usual, i.e. by degrees, so it is not a sudden stop.
Naturally, if the flame is just not being flown, then nothing will stop, but the next blow will start in Y frames.
- The combination will work only for the next blow that is just coming. So the blows after this next blow will come according to the default value (i.e. according to the OCB value of the emitter).
- If the emitter hasn’t been activated when you activate the combination, then the timer starts when the emitter has been activated.

Executable combination (2):
Make (X) flame emitter stop blowing and disable to start more blows

Y: 1 or bigger frames
Force: continuous. When stopping it: the blow will start in Y frames.

Note:
Maybe you think you shouldn’t use this combination. But, instead of that, you will antitrigger the flame and then – also using Executable combination (1) – you will trigger the flame again.
But that is not the same. Because, when the emitter is antitriggered then you can’t see the “basic flame” (which is not blown). But if you stop the blows by this combination, then you’ll see the basic flame.

Executable combination (3):
Make (X) flame emitter start a continuous blow or (if the flame is just being blown) make the actual blown flame continuous

Y: 0
Force: continuous. When stopping it, and after that, if you forced a value by Executable combination (1): the flame will start working with its normal rhythm.

Condition combination (1):
If the blow status of (X) flame emitter is (A)

A:
“equal”
0: the emitter is just blowing the flame
0, with TGROUP_NOT flag in the condition trigger: the flame is just not being blown, or reducing just after finishing the blow
Type: simple.

Condition combination (2):
If the next blow of (X) flame emitter starts in (A) frames

A: from 1 to bigger frames
Type: sequence.

Note:
The condition is useful only if the flame is not being blown or if the actual blown flame has started decreasing.

1.23.2. The name of the field:
Custom_B (Different usage in according with type of item) (Short)

Executable combination:
Make (X) flame emitter have (Y) long flame

Y: from -1 to -8192 (-8192 is the default length, probably -1 means 1 unit)
Force: continuous. When stopping it: the length will go back to the result one.

Notes:
- It’s recommended using it only if the blow is continuous.
- You cannot change the direction. (So, eg. don’t try to force a positive number at a vertically blown flame, because the flame won’t be blown downwards.)

Condition combination:
If the blown flame of (X) flame emitter has (A) length

A: from 1 to 8192 (I.e. use the positive version of the negative value!)
Type: sequence.

Note:
Use F284 to invert the sign in the chosen variable. Place that F284 exactly before the condition trigger in the TriggerGroup.
I.e. in this field we won’t use Negative/Positive/Null formula, because the values are surely only negative values!

1.23.3. The name of the field:
Custom_C (Different usage in according with type of item) (Short)

Condition combination (1):
If the blown flame of (X) flame emitter has (A) length status

A:
“equal”
0 (the length is just at the maximum)
256 (the length is just at the minimum)
“bigger/equal” (1) and “smaller” (256): the flame is just increasing/decreasing (Yes, two condition triggers, after each other!)
Type: simple.

Note:
It’s worth using “If the blow status of (X) flame emitter is (A)” condition together with “the flame is just increasing/decreasing” condition. (I.e. in the same TriggerGroup, after each other.) Because, for example, “the emitter is just blowing the flame” and the “the flame is just increasing/decreasing” together means “the flame is just increasing”, ruling out the “decreasing” part.

Condition combination (2):
If the blown flame of (X) flame emitter is just (A) harmful/not harmful to Lara

A:
“equal”
256: the flame is just harmless (being at the minimum length)
256, with TGROUP_NOT flag in the condition trigger: the flame is just harmful (not being at the minimum length)
Type: simple.

1.23.4. The name of the field:
Custom_D (Different usage in according with type of item) (Short)

Executable combination (1):
Make the flame being just blown from (X) flame emitter be emitted further (Y) frames from now on

Y: from 1 to any frames
Force: single.

Notes:
- If the flame isn’t just being blown then the combination is useless.
- 0 frame value means the blow starts stopping by degrees at once.

Executable combination (2):
Make the actual or (if the flame is just not being blown) the next blown flame of (X) flame emitter be continuous

Y: from 1 to any frames
Force: continuous. When stopping it: the blow (being just blown) will start stopping in Y frames.

Note:
Values below about 10 seem buggy. (I.e. the length will be too short.)

Condition combination:
If (X) flame emitter starts stopping the blow in (A) frames

A: from 1 to any frames
Type: sequence.

1.24. Flame emitter2 subject

1.24.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

This field works only if a negative number is typed in the OCB window of the emitter, for a special usage!

Condition combination:
If the flipmap of the scales-ahmet setup – controlled by (X) flame emitter2 – (A) has been/has not been switched on

A:
“equal”
0 (has not been switched on)
1 (has been switched on)
Type: simple.

Note:
If a Flame emitter2 has a negative number in its OCB window then a flipmap (without any flames) will be activated if you trigger that emitter. (For example, Flipmap Number 3 if the OCB value is -3.) – But:
- You can’t antitrigger this emitter to switch off the flipmap.
- Don’t use this condition if you control the flipmap by other triggers (as well).

1.25. Flame emitter3 subject

1.25.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

This field works only if the emitter produces flames!

Executable combination:
Make (X) flame emitter3 has only two, continuous bursts in (Y) way

Y: from 1 to 11
Force: continuous. When stopping it: the emitter starts working “normally”.

As you know Flame emitter3 has more bursts that will burst from the floor at different points, at different time. But if you force a value here between 1 and 11, then only 2 bursts will burst, but continuously.
You can’t really control which two bursts will burst if you force a value. I.e. it seems random. But probably different values have different pairs. So eg. probably “this” and “that” burst will appear together randomly only if you force Value 1, and they never will be together with Value 2. (I say “probably” so maybe it is absolutely unimportant if you force 1, 2… or 11.)

1.26. Firerope subject

1.26.1. The name of the field:
Custom_B (Different usage in according with type of item) (Short)

Condition combination:
If the status of (X) firerope is (A)

The basic formula is peculiar now:

Trigger1. An A54 to define the actual subject of Item Memory Zone.
Trigger2. An F256 to put the value of the chosen memory zone field into the chosen variable.
Trigger3. An F256 to put the value of Custom_D field into another variable.
Trigger4. A C41/C42/C43 trigger to study the chosen variable value.
Trigger5. A C43 trigger to study the second variable value, if that is 0.
Trigger6. A C43 trigger to study a third variable value, if that is 0 or if that is 1. (Use this trigger only in “not ignited” or “started crumbling” cases.)

A:
“equal”
0, if the third variable value=0: the rope hasn’t been ignited
0, with TGROUP_NOT flag in Trigger4 and in Trigger5: the rope is burning
0, if the third variable value=1: the rope has just started crumbling
16: the rope has been crumbled
“bigger/equal” (1) and “smaller” (16): the rope is crumbling (Yes, two condition triggers –Trigger4a, Trigger4b -, after each other!)
Type: simple.

An additional condition is necessary (to put a value into that third variable) if you need Trigger6:

GlobalTrigger= 2, IGNORE, GT_CONDITION_GROUP, IGNORE, 2, 3, IGNORE
TriggerGroup= 2
TriggerGroup= 3

TriggerGroup2:
Trigger1. An A54 to define the actual subject of Item Memory Zone.
Trigger2. An F256 to put the value of Custom_D field into the second variable.
Trigger3. A C43 trigger to study if the second variable value is 1.

TriggerGroup3:
Trigger1. An F232 to put 1 in the third variable.

(So GlobalTrigger2 turns the third variable value into 1 when the rope catches fire.
But that variable will remain 0 – i.e. the default value of the variable - if the firerope has not been ignited yet.)

1.26.2. The name of the field:
Custom_D (Different usage in according with type of item) (Short)

Executable combination (1):
Make (X) firerope (still burning) be burning further (Y) frames from now on

Y: from 1 to any frames
Force: single.

Note:
If the firerope isn’t just burning then the combination is useless.

Executable combination (2):
Disable (X) firerope to start crumbling

Y: from 1 to any frames
Force: continuous. When stopping it: the flaming firerope will start crumbling in Y frames.

“Disable” means the rope will catch fire if Lara hits the rope with the torch after activating the combination, but the rope will be burning continuously, never starting crumbling.

Notes:
- It will work both for burning or still not burning fireropes.
- Values below about 10 seem buggy. (I.e. with those numbers, some parts of the rope will crumble at once when Lara ignites the rope and/or the flames will disappear.)

Condition combination:
If (X) firerope (still burning) starts crumbling in (A) frames

A: from 1 to 150 frames (customize the maximum by Executable combination (1))
Type: sequence.

1.27. Twoblock platform subject

These fields work only if it is a platform that descends half a click when Lara steps on it!

1.27.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Executable combination:
Make (X) twoblock platform to descend to (Y) units position if Lara is standing on it

Y:
- positive numbers: units counted below Floor Level 0. (So eg. 1024 means the platform will descend to a position which is 1024 clicks below Floor Level 0.)
- negative numbers: units counted above Floor Level 0. (So eg. -1024 means the platform will descend to a position which is 1024 clicks above Floor Level 0.)
- 0 as Floor Level 0
Force: single.

Notes:
- Before activating the combination, the position of the twoblock platform must be higher than Value Y.
- After activating the combination, the platform will do nothing till Lara steps on it. It starts descending when Lara steps on it.
- If the platform descending reaches Y position then the platform will descend half a click as well, as usual. Now if Lara steps off it then the platform will ascend half a click, as usual. Stepping on the platform again and again after that, now only those half a click changes will be repeated.
- If Lara steps off the platform descending before the platform reaches Y position then the platform will stop at once. If she steps on the platform again then the platform will continue descending towards Y position.

Condition combination:
If the base of (X) twoblock platform is at (A) units

A:
- with Positive formula (base is below Floor Level 0 or on exactly Floor Level 0): 0 or positive units
- with Negative formula (base is above Floor Level 0 or on exactly Floor Level 0): 0 or positive units
- with Null formula (base is exactly Floor Level 0): 0 unit
Type: simple, but you can use either “equal” or “smaller” or “bigger/equal” conditions.

Notes:
“Base” means this is the position from which the platform will perform that descend with half a click. If you didn’t use the executable formula then the “base” is the original position of the platform. If you used the executable formula then the “base” is the Y (forced) position of the platform.

1.27.2. The name of the field:
Custom_B (Different usage in according with type of item) (Short)

Condition combination:
If (X) twoblock platform is in (A) base/lower position

A:
“equal” 1 (the platform is in base position or the platform is just descending from base position)
“smaller” 0 (the platform is in lower position or the platform is just ascending from lower position)
Type: simple.

Note:
See above to understand what “base” means. “Lower” is the position if the platform has descended that half a click.

1.28. Raising block subject

1.28.1. The name of the field:
Custom_B (Different usage in according with type of item) (Short)

Executable combination:
Force (X) raising block to have (Y) size

Y: from 1 to any
Force: see below.

Notes:
- 4096 is always the default maximum size. So 4096 is “1 square high” at RAISING_BLOCK1 but “2 squares high” at RAISING_BLOCK2. (0 naturally means the platform is totally descended, being on ground level.)
- Be careful! Blocks with forced size have a bad collision.
- See for example RAISING_BLOCK2.
2048 is the half of 4096, so if the forced value is 2048 that means RAISING_BLOCK2 will be extended only 1 square high.
On the other hand, 8192 is twice as big as 4096, so if the forced value is 8192 that means RAISING_BLOCK2 will be extended 4 squares high.
See some examples:

= Force 2048 singly before activating the block. The block will jump to that size at once, and remain that. Trigger the block and that will ascend to the normal 4096 size. Then antitrigger the block to lower that into the ground.
= Force 2048 continuously before activating the block. The block will jump to that size at once, and remain that. Trigger the block – but nothing will happen. Stop the continuous force – and the block starts ascending to 4096 size.
= Trigger the block, then force 2048 singly. Whether the block has reached 4096 size or not, now the block will jump to 2048 size and starts ascending to 4096 size.
= Trigger the block, then antitrigger it, then force 2048 singly. Whether the block has reached the ground or not, now the block will jump to 2048 size and starts descending to the ground.
= Force 8192 singly before activating the block. The block will jump to that size at once, and remain that. Trigger the block and that will ascend to the normal 4096 size.
= Trigger the block, then force 8192 singly. Whether the block has reached 4096 size or not, now the block will jump to 8192 size and remain that.
= Trigger the block, then antitrigger it, then force 8192 singly. Whether the block has reached the ground or not, now the block will jump to 8192 size and starts descending to the ground.

RAISING_BLOCK1 is naturally analogous with that.
- An extra: use negative numbers to force them. Negative sizes make the things interesting. I mean, they will “turn in” the outside of the block.

Condition combination:
If (X) raising block actual size is (A)

A: from 1 to any
Type: sequence.

Note:
Seeing the executable formula, eg. A=4096 means “the block has totally extended”, or A=2048 means “the block ascending/descending has extended the half of its whole size” etc. (Naturally the meanings of the numbers will change if you use the executable formula. I mean, eg. 4096 is not the total size if you forced 8192.)

1.29. Expanding platform subject

1.29.1. The name of the field:
Custom_B (Different usage in according with type of item) (Short)

Executable combination:
Force (X) expanding platform to have (Y) size

Y: from 1 to any
Force: see below.

Notes:
- 4096 is always the default maximum size. So 4096 means “extended the distance of 1 square”. (0 naturally means the platform is totally drawn back.)
- Be careful! Platforms with forced size have a bad collision.
- See the raising block to understand how it works. So, for example, you can force 2048 singly in a way like that:
Trigger the platform, then force 2048 singly. Whether the platform has reached 4096 size or not, now the platform will jump to 2048 size and starts extending to 4096 size. Etc.
- An extra: use negative numbers to force them. Negative sizes make the things interesting. I mean, they will “turn in” the outside of the platform.

Condition combination:
If (X) expanding platform actual size is (A)

A: from 1 to any
Type: sequence.

Note:
See the similar condition with raising blocks to understand how it works.

1.30. Squishy block2 subject

1.30.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Executable combination (1):
Make (X) squishy block2 (triggered yet) fall down in (W) frames

W: 60 minus Y frames
Y: from 1 to 59
Force: single.

Executable combination (2):
Disable (X) squishy block2 (triggered yet) to fall down in (W) way

W: 60 minus Y frames
Y: from 1 to 59
Force: continuous. When stopping it: the block will fall down in W frames.

The default time between triggering the block and the block starts falling down is 60 frames. “In (W) way” means the level is quaking when the block is about to fall down, and the intensity of the quake is different at different frames. For example, the intensity at 20th frame is not the same as the intensity at 45th frame.
So eg. if you want the level (after triggering the block) to have a quake with a constant “20th frame intensity” till the bock falls down then W must be 20 now.

Note:
You can activate the combination either before activating the block or after that.

Condition combination:
If there are still (B) frames before (X) squishy block2 (triggered yet) falls down

B: 60 minus A frames
A: from 1 to 59 frames
Type: sequence.

Note:
Now the relations will be inverted, if you use them: “less than A” means ”more than B”, “more than/equal with A” means ”less than/equal with B”.

1.31. Pushable object subject

1.31.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Condition combination:
If (X) pushable object first activity status is (A)

A:
“equal”
0: the object has never been pushed/pulled before
0, with TGROUP_NOT flag in the condition trigger:
a, the object is just being pushed/pulled or
b, the object is just not being pushed/pulled but has been pushed/pulled before at least once
Type: simple.
AkyV is offline  
Old 15-08-15, 10:37   #9
AkyV
Moderator
 
Join Date: Dec 2011
Location: Hungary
Posts: 2,377
Default

1.32. Sentry gun subject

1.32.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Condition combination:
If (X) sentry gun shooting status is (A)

A:
“equal”
0: the gun has not been activated/is just idle/is just throwing flames
0, with TGROUP_NOT flag in the condition trigger: the gun is just shooting
Type: simple.

1.32.2. The name of the field:
Custom_B (Different usage in according with type of item) (Short)

Executable combination:
Force (Y) radar status on (X) sentry gun

Y: -768, 768, 0
Force:
-768: continuous anti-clockwise rotation (force continuously) – stop the continuous force to restore the default state
768: continuous clockwise rotation (force continuously) – stop the continuous force to restore the default state
0: the radar freezes in the actual position (single force) - force 768 in a single way to restore the default state

Condition combination:
If (X) sentry gun radar status is (A)

A:
- with default values:
“equal” 768: the radar is totally turned towards the gun or just turning away from the gun
“smaller” 0: the radar is totally turned with its back to the gun or just turning towards the gun
- with forced values:
“equal” 768: the radar is turning clockwise, 0: the radar is frozen
“smaller” 0: the radar is turning anti-clockwise
Type: simple.

Note:
The gun keeps the radar status last value even if the gun is not active or exploded.

1.33. Mine subject

The field works only if you want to blow the mine up by triggers, i.e. if OCB=1

1.33.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Executable combination (1):
Make (X) mine explode in further (W) frames from now on

W: 150 minus Y frames
Y: from 1 to 149
Force: single.

Notes:
- The default value is 150 frames from triggering till the explosion.
- If the mine hasn’t been activated when you activate the combination, then the timer starts when you activate the mine after that.

Executable combination (2):
Make (X) mine burn forever

W: 150 minus Y frames
Y: from 1 to 149
Force: continuous. When stopping it: the burning mine will explode in W frames.

Condition combination:
If there are still (B) frames before (X) mine explodes

B: 150 minus A frames
A: from 1 to 149
Type: sequence.

Note:
Now the relations will be inverted, if you use them: “less than A” means ”more than B”, “more than/equal with A” means ”less than/equal with B”.

1.34. Obelisk subject

1.34.1. The name of the field:
Custom_D (Different usage in according with type of item) (Short)

See the obelisk setup of “The Great Hypostyle Hall” TRLR level.
You can use any obelisk of the setup now.

Condition combination (1):
If there are still (B) frames (approximately) before the electric arch of (X) obelisk shatters the cage

B: 255 minus A frames
A: from 1 to 255
Type: sequence.

Notes:
- The cage is the ANIMATING3 object of the setup where PUZZLE_ITEM1_COMBO1 is hidden.
- Now the relations will be inverted, if you use them: “less than A” means ”more than B”, “more than/equal with A” means ”less than/equal with B”.

Condition combination (2):
If there are still (B) frames (approximately) before the electric arch of (X) obelisk vanishes

B: 347 minus A frames
A: from 1 to 346
Type: sequence.

Notes:
- This combination starts counting the time when the arches start. So NOT after ANIMATING3 shatters.
- Now the relations will be inverted, if you use them: “less than A” means ”more than B”, “more than/equal with A” means ”less than/equal with B”.

1.35. Floor 4blade, Roof 4blade subject

1.35.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Condition combination:
If (X) floor 4blade/roof 4blade is just (A) working/not working harmfully

A:
“equal”
0: the blades are active but idle/just moving harmlessly after clapping together
0, with TGROUP_NOT flag in the condition trigger: the blades are just moving to hurt Lara (including both the first move and – when the blades clap together – the second move)
Type: simple.

1.35.2. The name of the field:
Custom_D (Different usage in according with type of item) (Short)

Condition combination:
If (X) floor 4blade/roof 4blade status is (A)

A:
“equal”
0: the trap has never been activated before
20: the trap is just performing the first harmful move or is in the short idle position after that
“bigger/equal” 21: the trap is just performing the second – “clapping” – harmful move, or is in the short idle position after that, or moving harmlessly after clapping together, or is idle after all its moves
Type: simple.

Note:
It could be useful to apply the two conditions together (i.e. in the same TriggerGroup, after each other). For example, if the first condition uses TGROUP_NOT and the second condition uses Value 20 that means the trap is just performing the first harmful move. (Because TGROUP_NOT rules out the second part of Value 20: “or is in the short idle position after that”.)

1.36. Bird blade subject

1.36.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Condition combination:
If (X) bird blade is just (A) working/not working harmfully

A:
“equal”
0: the blades are just moving harmlessly up after clapping together
0, with TGROUP_NOT flag in the condition trigger: the blades are just moving down to hurt Lara (including when they clap together and the bounce after clapping together)
Type: simple.

1.36.2. The name of the field:
Custom_D (Different usage in according with type of item) (Short)

Condition combination:
If (X) bird blade first activity status is (A)

A:
“equal”
0: the trap has never been activated before
0, with TGROUP_NOT flag in the condition trigger:
a, the trap is active or
b, the trap is inactive but has been activated before at least once
Type: simple.

1.37. Catwalk blade subject

1.37.1. The name of the field:
Custom_D (Different usage in according with type of item) (Short)

Condition combination:
If (X) catwalk blade is (A) moving/not moving

A:
“equal”
0: the blades are not moving
0, with TGROUP_NOT flag in the condition trigger: the blades are moving
Type: simple.

Note:
“Moving/not moving” is not the same condition now as “active/inactive”, because

- when the blades have been activated then they won’t start moving for some moments, and
- as I said above, after all the moves, the objects are idle, not “inactive”.

1.38. Plinth blade subject

1.38.1. The name of the field:
Custom_D (Different usage in according with type of item) (Short)

Condition combination:
If (X) plinth blade is (A) working/not working

A:
“equal”
0: the blades are not working
0, with TGROUP_NOT flag in the condition trigger: the blades are working
Type: simple.

Notes:

- “Working” means the two short moves now, including the short stop between them.
- “Working/not working” is not the same condition now as “active/inactive”, because, as I said above, after all the moves, the objects are idle, not “inactive”.

1.39. Seth blade subject

1.39.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Condition combination:
If (X) seth blade general status is (A)

A:
“equal” 0: the trap is idle or the double blades are just moving upwards
“smaller” 0: the double blades are just moving downwards
“bigger/equal” 1: the double blades just hit the ground
Type: simple.

1.39.2. The name of the field:
Custom_C (Different usage in according with type of item) (Short)

Executable combination:
Make (X) seth blade strike in (Y) frames from now on

Y: 1 or bigger frames
Force: single.

Notes:
- If the blades haven’t been activated when you activate the combination, then the timer starts when you activate the blades after that.
- Though it is not a general knowledge, seth blades are working not only with negative OCB numbers, but positive OCB numbers:

= As you know, a negative OCB number means the trap will start moving in a time which is defined the OCB number (as frames), and, after that, the trap won’t move any more.
= A positive OCB number means the trap will start moving in a time which is defined the OCB number (as frames), and, after that, the trap will start moving again (according to that time). An antitrigger means a pause for those moves.

So Y frames overwrite that OCB value (only for the next strike!), but never overwrite the original meaning (one shot work or not) of the OCB value.
- Try to force 0 in a GT_LOADED_SAVEGAME GlobalTrigger, to remove the “trap will be reactivated when a savegame has been loaded” bug.

Condition combination:
If there are still (A) frames before (X) seth blade performs the next strike

A: 1 or bigger frames
Type: sequence.

1.39.3. The name of the field:
Custom_D (Different usage in according with type of item) (Short)

Condition combination:
If (X) seth blade first strike status is (A)

A:
“equal”
0: the trap has never performed a strike before
0, with TGROUP_NOT flag in the condition trigger: the trap is performing/has performed its first strike
Type: simple.

Note:
If the trap has been activated at very first time but hasn’t started moving then that naturally means the trap has never performed a strike before.

1.40. Lightning conductor subject

1.40.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Executable combination (1):
Make an electric arch strike into (X) lightning conductor for further (Y) frames from now on

Y: 1 or bigger frames
Force: single.

Notes:
- If the conductor hasn’t been activated when you activate the combination, then the timer (with the arch) starts when you activate the conductor after that.
- If the conductor is active when you activate the combination but there is no arch in the given moment, then an arch starts at once.

Executable combination (2):
Make an electric arch strike continuously into (X) lightning conductor

Y: 1 or bigger frames
Force: continuous. When stopping it: the strike will end in Y frames.

Condition combination:
If there are still (A) frames before (X) lightning conductor stops the actual electric arch

A: 1 or bigger frames
Type: sequence.

Note:
The default electric arches are very short, so the logical Value A in their cases is 1-2 frames. (Maximum 4 frames, because that seems to be the longest arch.)

1.40.2. The name of the field:
Custom_B (Different usage in according with type of item) (Short)

Condition combination:
If an electric arch of (X) lightning conductor just starts striking

The basic formula is peculiar now:

Trigger1. An A54 to define the actual subject of Item Memory Zone.
Trigger2. An F271 to copy the chosen variable value into Current Value.
Trigger2. An F256 to put the value of the chosen memory zone field into the chosen variable.
Trigger4. A C40/43 trigger to study the chosen variable value. A C57 (with TGROUP_NOT flag) to compare the chosen variable to Current Value, if they are the same.

A: there is no A this time
Type: simple.

Note:
Each arch has its own value in this field. F271 will copy the value of the previous arch into Current Value variable, F256 will put the value of the actual arch into “any” variable, then the condition trigger will compare them to each other. - If the values are not the same that means a new arch has just struck.

1.40.3. The name of the field:
Custom_D (Different usage in according with type of item) (Short)

Use it only with the special lightning conductor setup you saw in “Street Bazaar” TRLR level.

Executable combination (1):
Make the electric arch – diverted from the first lightning conductor - strike into (X) second lightning conductor in (W) frames from now on

W: 120 minus Y frames
Y: from 1 to 119
Force: single.

Notes:
- The default value is 120. I.e. if you’ve activated the FLAME_EMITTER2 of the setup (pushing/pulling a pushable object on the square of the first lightning conductor) then the lightning stops striking into the first conductor and a frame counter starts. When the counter reaches 120 then the lightning will strike into the second conductor.
- If the lightning hasn’t been diverted when you activate the combination, then the timer starts when you diverted the lightning after that.

Executable combination (2):
Disable the electric arch – diverted from the first lightning conductor – to strike into (X) second lightning conductor

W: 120 minus Y frames
Y: from 1 to 119
Force: continuous. When stopping it: the lightning will strike into the second conductor in W frames.

Condition combination:
If there are still (B) frames before the electric arch – diverted from the first lightning conductor - strikes into (X) second lightning conductor

B: 120 minus A frames
A: from 1 to 119
Type: sequence.

Note:
-Now the relations will be inverted, if you use them: “less than A” means ”more than B”, “more than/equal with A” means ”less than/equal with B”.

1.41. Element puzzle subject

1.41.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Condition combination:
If (X) “element puzzle” (scale) status is (A)

A:
“equal”
0: the scale has not been used yet
1: material (water, dirt, petrol) has poured into the scale
2: Lara holds the torch to the petrol
3: the petrol is burning
Type: simple.

1.42. Puzzle hole subject

1.42.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Condition combination:
If Lara is (A) performing/not performing the “reaching into the backpack and inserting puzzle item” animation at (X) puzzle hole

A:
“equal”
0: Lara is not performing the animation (because she hasn’t tried to insert the item or the item has been inserted or she is anywhere else in the level)
0, with TGROUP_NOT flag in the condition trigger: Lara is performing the animation
Type: simple.

Note:
See something similar about key holes in Chapter 1.1.6. Condition combination (5).

1.43. Turn switch subject

1.43.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Condition combination:
If (X) turn switch direction status is (A)

A:
“equal”
0: the switch hasn’t been used
1: the switch is just being turned anti-clockwise or the last direction in which the switch has been turned is anti-clockwise
2: the switch is just being turned clockwise or the last direction in which the switch has been turned is clockwise
Type: simple.

1.43.2. The name of the field:
Custom_B (Different usage in according with type of item) (Short)

Condition combination:
If (X) turn switch functional status is (A)

A:
“equal”
0: the switch hasn’t been used or just being turned
2: the switch has been turned (so now it is idle)
Type: simple.

Notes:
- It could be useful to apply the two conditions together (i.e. in the same TriggerGroup, after each other). For example, if the first condition is 1 and the second condition is 0 that means the switch is just being turned anti-clockwise. (Because 0 at Custom_B field rules out the idle part of Value 1 of Custom_A field: “or the last direction in which the switch has been turned is anti-clockwise”.)
- Usually turn switches are used only for the obelisk setup. But you must notice: with these two conditions you can trigger/antitrigger anything by turn switches.

1.44. Crowbar switch subject

1.44.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Executable combination:
(Y) Enable/disable (X) crowbar switch

Y: disable (1), enable (0)
Force: single.

Note:
Originally 0 value turns into 1 (i.e. to “useless”) when a BABOON_NORMAL has been triggered in the same room.

Condition combination:
If (X) crowbar switch is (A) enabled/disabled

A: “equal” disabled (1), enabled (0)
Type: simple.

1.45. Pulley subject

1.45.1. The name of the field:
Custom_B (Different usage in according with type of item) (Short)

Executable combination:
(Y) Enable/disable (X) pulley

Y: disable (1), enable (0)
Force: single.

Note:
Originally 0 and 1 values work only with the obelisk setup: till the obelisks turned into the right positions, the pulley value is 1 (i.e. “useless”) but now becomes 0.

Condition combination:
If (X) pulley is (A) enabled/disabled

A: “equal” disabled (1), enabled (0)
Type: simple.

1.45.2. The name of the field:
Custom_C (Different usage in according with type of item) (Short)

Condition combination:
If (X) pulley first activity status is (A)

A:
“equal”
0: the switch has never been used before
0, with TGROUP_NOT flag in the condition trigger: the switch has been used before at least once
Type: simple.

Note:
It will become 1 (i.e. not 0) in the moment when the pulley is still working with the first usage, just triggering the thing that it must to activate.
AkyV is offline  
Old 15-08-15, 10:40   #10
AkyV
Moderator
 
Join Date: Dec 2011
Location: Hungary
Posts: 2,377
Default

1.46. Door type subject

This field works only if the door is being moved by a cog switch.

1.46.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Executable combination (1):
Simulate a cog switch move with (Y) intensity on (X) door type

Y: from 1 to 193
Force: single.

Note:
When Lara starts turning a cog switch then a counter starts down from 40 in this field. It reaches 0 exactly when Lara finishes the move – raising the door a bit. The door starts sinking now. When she turns the cog once more then another sequence starts from 40 to 0, raising the door a bit again. The door starts sinking now again. But if the door reaches the highest position then the counter will be interrupted – though Lara is still turning the cog. (For example, if the value is 28 when the door reaches the highest position, then the counter turns into 0 at once.)
So the intensity for each “real” cog move is 40. 193 causes the largest distance – that moves the door from the ground straightly to the highest position. With 194 or bigger number the counter should be interrupted everyway.

Executable combination (2):
Simulate a constant cog switch move on (X) door type to raise that to the highest position and keep that there permanently

Y: 1
Force: continuous. When stopping it: the door will start sinking at once – even if it hasn’t reached the highest position when you stop the force.

Attention!
Any of these two executable combinations will work only if a cog switch moved that door at least once, at least a bit. I.e. you can’t activate the combination till Lara performs that move with the cog!

Condition combination:
If (X) door type is just (A) being/not being raised by a (real or simulated) cog switch move

A:
“equal”
0: the door is sinking
0, with TGROUP_NOT flag in the condition trigger: the door is rising
Type: simple.

1.47. Sequence door subject

1.47.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Executable combination:
Force (X) sequence door to open

Y: 1
Force: single.

Note:
Usually only sequence switches are able to open sequence doors, Triggers (!) or Antitriggers will close them.
But if you want to open a sequence door without sequence switches then activate this combination. But

- Use the combination only if you haven’t opened the door by the switches before.
- If you forced a door to open, then, after that, the proper code of sequence switches for that door won’t do anything (if the door is still open) or only will reset the switches (if the door has been closed yet).

Condition combination:
If (X) sequence door status is (A)

A:
“equal”
0: the door hasn’t been opened before
0, with TGROUP_NOT flag in the condition trigger:
a, the door is open, or
b, the door is closed but has been opened before
Type: simple.

1.48. Sequence switch subject

1.48.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Condition combination:
If (X) sequence switch status is (A)

A:
“equal”
0: the button hasn’t been pushed at all/is reset
0, with TGROUP_NOT flag in the condition trigger: the button is pushed
Type: simple.

1.49. God head subject

1.49.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Condition combination:
If (X) god head status is (A)

A:
“equal”
0: the head is expanding
0, with TGROUP_NOT flag in the condition trigger: the head is at the maximal size/drawing back/drawn back
Type: simple.

1.49.2. The name of the field:
Custom_B (Different usage in according with type of item) (Short)

Executable combination:
Force (X) god head to have (Y) size

Y: from 1 to any
Force: see the raising block above to understand how it works.

Notes:
- God heads can be activated only once, automatically. (I.e. you don’t need a “One Shot” flag for that.)
- 4096 is always the default size. So 4096 means “extended the distance of 1 square”. (0 naturally means the head is totally drawn back.)
- The head starts expanding when it is transparent. When it’s about at half-size then it is semi-transparent. When it is totally expanded (at 4096) then it is opaque. When it starts drawing back then it starts fading away. – Calculate all of this when you choose a forced size. I mean, each size has its own transparency level.
- An extra: use negative numbers to force them. Negative sizes make the things interesting. I mean, they will “turn in” the outside of the head.

Condition combination:
If (X) god head actual size is (A)

A: “equal” from 1 to any
Type: sequence.

Notes:

- See the similar condition with raising blocks to understand how it works.
- It could be useful to apply the two conditions together (i.e. in the same TriggerGroup, after each other). For example, if the first condition is 1 and the second condition is 2048 that means “the head is just half-sized and drawing back”. Because, without that 1, 2048 could be a size both for the expanding and the drawing-back head.

1.49.3. The name of the field:
Custom_C (Different usage in according with type of item) (Short)

Executable combination (1):
Make (X) god head keep the actual size for further (Y) frames from now on

Y: from 1 to any frames
Force: single.

Notes:
- Originally the head keeps only the maximal size, for 210 frames.
- The combination will work only if the head has reached the maximal size. So you can keep only these sizes:

= The maximal size.
= Any size which is actual when you activate the combination, but only when the head is drawing back.

Executable combination (2):
Make (X) god head keep the actual size forever

Y: from 1 to any frames
Force: continuous. When stopping it: the head will start drawing back in Y frames.

Condition combination:
If there are still (A) frames before (X) god head stops keeping the size

A: from 1 to any frames
Type: sequence.

1.50. Statue plinth subject

1.50.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Condition combination:
If (X) statue plinth status is (A)

A:
“equal”
0: the puzzle item hasn’t been inserted
0, with TGROUP_NOT flag in the condition trigger: the puzzle item has been inserted
Type: simple.

Statue plinth is a very peculiar puzzle hole, because
- The puzzle item of Statue plinth is always a PUZZLE_ITEM5.
- Unlike other holes, that are using KEY-TRIGGER trigger pairs to activate something, Statue plinth uses HEAVY triggers. (By the way, activating HEAVY is not always the same as “if the puzzle item has been inserted”. Because you can examine the combination value even after activating that HEAVY.)
- It’s a puzzle hole and a puzzle done at the same time. (If you want to see the “done” version instead of the “hole” version, without inserting the puzzle item here, then type 1 in the OCB window of that Statue plinth.)

Note:
Unfortunately, the object is not “savegame-stable”. So, if you insert the item, and you save the game, and then you load that savegame then the “done” version changes back into “hole” version. (Not annulling the effect of the activated HEAVY trigger but turning the value of this field back to 0.) – Except with OCB=1.

1.50.2. The name of the field:
Custom_B (Different usage in according with type of item) (Short)

Condition combination:
If inventory is (A) open/not open to insert the puzzle item on (X) statue plinth

A:
“equal”
0: not open
0, with TGROUP_NOT flag in the condition trigger: open
Type: simple.

Note:
So, if Lara has a PUZZLE_ITEM5 in the backpack, and the player hits CTRL at the Statue plinth to insert the puzzle item, then this condition is true while the inventory is open now. (If the inventory closes either because she inserts the item or the player hits ESC, the condition becomes false.) – The true status won’t change if the player starts searching in the inventory now.

1.51. Grenade subject

1.51.1. The name of the field:
Custom_B (Different usage in according with type of item) (Short)

This field works only with placed and triggered grenades. See for examle Leonvdn's pyrotechnics tutorial.

Executable combination (1):
Make (X) grenade perform an (approximately) (Y) frames long exploding effect from now on

Y: from 2 to any frames
Force: single.

Notes:
- Originally the effect is 16 frames long. (I.e. if you explode that grenade without this combination.)
- If the grenade hasn’t been exploded when you activate the combination, then the timer starts when the grenade explodes after that.

Executable combination (2):
Make (X) grenade perform a continuous exploding effect

Y: from 2 to any frames
Force: continuous. When stopping it: the effect will stop in Y frames.

Condition combination:
If there are (approximately) still (A) frames before (X) grenade stops the exploding effect

A: from 1 to any
Type: sequence.

1.52. Steam emitter subject

1.52.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

These combinations work only if the emitter blows a harmful steam, horizontally:

Executable combination (1):
Make (X) steam emitter stop blowing and start the next blow in (Y) frames

Y: 1 or bigger frames
Force: single.

Notes:
- The “stop” means the emitter starts stopping the blow, as usual, i.e. by degrees, so it is not a sudden stop.
Naturally, if the steam is just not being flown, then nothing will stop, but the next blow will start in (V) frames.
- The combination will work only for the next blow that is just coming. So the blows after this next blow will come according to the default value (i.e. according to the OCB value of the emitter).
- If the emitter hasn’t been activated when you activate the combination, then the timer starts when the emitter has been activated.

Executable combination (2):
Make (X) steam emitter stop blowing and disable to start more blows

Y: 1 or bigger frames
Force: continuous. When stopping it: the blow will start in Y frames.

Note:
Maybe you think you shouldn’t use this combination. But, instead of that, you will antitrigger the steam and then – also using Executable combination (1) – you will trigger the steam again.
But that is not the same. Because, when the emitter is antitriggered then you can’t see the “basic steam” (which is not blown). But if you stop the blows by this combination, then you’ll see the basic steam.

Executable combination (3):
Make (X) steam emitter start a continuous blow or (if the steam is just being blown) make the actual blown steam continuous

Y: 0
Force: continuous. When stopping it: the blow will start stopping at once.

Condition combination (1):
If the blow status of (X) steam emitter is (A)

A:
“equal”
0: the emitter is just blowing the steam
0, with TGROUP_NOT flag in the condition trigger: the steam is just not being blown, or reducing just after finishing the blow
Type: simple.

Condition combination (2):
If the next blow of (X) steam emitter starts in (A) frames

A: from 1 to bigger frames
Type: sequence.

Note:
The condition is useful only if the steam is not being blown or if the actual blown steam has started decreasing.

These combinations work only for non-continuous bubble emitters (OCB=0):

Executable combination (4):
Make (X) steam emitter start emitting (Y) bubbles from now on

Y: 1 or more bubbles
Force: single.

The default value is randomly between 4 and 7. So eg. if the value is 4 then four bubbles will be emitted (while the counter counts down), then some pause (0) happens, then another random value will show up, for example 6, to emit six bubbles (while the counter counts down) before the next pause etc.
So if you forced Y bubbles then Y bubbles will be emitted (while the counter counts down) then a pause happens and the emitter will start working normally again, emitting bubbles between somewhere four and seven.

Note:
If the emitter hasn’t been activated when you activate the combination, then the bubbles will start when the emitter has been activated.

Executable combination (5):
Make (X) steam emitter start emitting bubbles continuously

Y: 1 or more bubbles
Force: continuous. When stopping it: then Y bubbles will be emitted (while the counter counts down), then a pause happens, then the emitter starts working normally.

Condition combination (3):
If the bubble status of (X) steam emitter is (A)

A:
“equal”
0: there is a pause now
0, with TGROUP_NOT flag in the condition trigger: the emitter is just emitting bubbles
Type: simple.

Condition combination (4):
If further (A) bubbles will be emitted from (X) steam emitter before the next pause

A: from 1 to more bubbles
Type: sequence.

These combinations work only for continuous bubble emitters (OCB=1):

Executable combination (6):
Force thick and concentrated bubble emitting on (X) steam emitter for further (Y) frames from now on

Y: 1 or bigger frames
Force: single.

“Thick” means a lot of bubbles will be emitted now in each moment.
“Concentrated” means these bubbles (sometimes) will be dissipated 1 click above the emitter – never reaching the water surface is the surface is in a higher position. (“Sometimes” means it is probably depends on the distance between Lara and the emitter.)

Notes:
- Usually you have only maximum 20 frames (after activating the emitter the first time) to activate this combination. If you were successful, then you can force any values here any time – but only before the counter (counting back from the forced value) reaches 0! (Antitriggering means a pause in this counter.)
If you want to force value after that 20 frames, then you need a peculiar basic formula (let’s see only the version with variables now):

Trigger1. An A54 to define the actual subject of Item Memory Zone.
Trigger2. An F232/F263 to put a value into the chosen variable.
Trigger3. An F257 to force the chosen variable value into the chosen field.
Trigger4. An F232 to put Value 1 into another variable.
Trigger5. An F257 to force the second variable value into Custom_B field.

- If the emitter hasn’t been activated when you activate the combination, then the bubbles will start when the emitter has been activated.

Executable combination (7):
Force continuous thick and concentrated bubble emitting on (X) steam emitter

Y: 2 or bigger frames
Force: continuous. When stopping it: the emitter starts working normally in Y frames

See the same notes just as above.

Executable combination (8):
Start a bubble counter for (X) steam emitter to count down bubbles from (Y) amount

Y: 1 or bigger
Force: single.

So for example force 180, and Value 1 will be subtracted from 180, then from 179, then from 178 etc. each time when a bubble is being emitted. If Y reaches 0 again, then the counter stops.

Note:
You should force the value after those 20 frames I told above. (I.e. it doesn’t work with “thick and concentrated bubbles”.)

Condition combination (5):
If the bubble counter of (X) steam emitter has (A) bubbles before the counter expires

A: from 1 to bigger
Type: sequence.

Note:
Use this condition only if your bubble counter is just running.

1.52.2. The name of the field:
Custom_B (Different usage in according with type of item) (Short)

These combinations work only if the emitter blows a harmful steam, horizontally:

Executable combination (1):
Make the steam being just flown from (X) steam emitter be emitted further (Y) frames from now on

Y: from 1 to any frames
Force: single.

Notes:
- If the steam isn’t just being flown then the combination is useless.
- 0 frame value means the blow starts stopping by degrees at once.

Executable combination (2):
Make the actual or (if the steam is just not being blown) the next blown steam of (X) steam emitter be continuous

Y: from 1 to any frames
Force: continuous. When stopping it: the blow (being just blown) will start stopping in Y frames.

Condition combination:
If (X) steam emitter starts stopping the blow in (A) frames

A: from 1 to bigger frames
Type: sequence.

1.52.3. The name of the field:
Custom_C (Different usage in according with type of item) (Short)

These combinations work only if the emitter blows a harmful steam, horizontally:

Executable combination (1):
Force a (Y) long steam from (X) steam emitter for some moments

Y: from 256 to any (4096 is the default length, it is approximately 1-1,5 squares long)
Force: single.

Notes:
- It will work only if you activate the combination when the emitter is not blowing the steam.
- Values below 256 seem buggy.
- I recommend using the exponents of Value 2 (256, 512, 1024 etc.) for the length or else the solution perhaps will be buggy.
- You cannot change the direction of the blow.

Executable combination (2):
Make (X) steam emitter chug with (Y) length

Y: 256, 512, 1024, 2048 (4096 is the default length, it is approximately 1-1,5 squares long)
Force: single.

Notes:
- It will work only if you activate the combination when the emitter is blowing the steam.
- When you activate the condition then the length will be reduced to Y, but the “proper” length will be restored at once.

Executable combination (3):
Make (X) steam emitter have (Y) long steam

Y: from 8192 to any (4096 is the default length, it is approximately 1-1,5 squares long)
Force: single.

Notes:
- It will work only if you activate the combination when the emitter is blowing the steam. (I.e. it will work only for the actual steam.)
- Now the steam will have Y maximal length that will be reduced with the usual rhythm.
- I recommend using the exponents of Value 2 (256, 512, 1024 etc.) for the length or else the solution perhaps will be buggy.

Executable combination (4):
Make (X) steam emitter perform a continuous steam with (Y) length

Y: from 256 to any (4096 is the default length, it is approximately 1-1,5 squares long)
Force: continuous. When stopping it: the blow will start reducing at once, and everything will work as usual.

Notes:
- If the steam is just being blown, then that will be continuous. If it is not, then a new steam will start at once.
- If the emitter hasn’t been activated when you activate the combination, then the combination “really” starts when the emitter has been activated.
- I recommend using the exponents of Value 2 (256, 512, 1024 etc.) for the length or else the solution perhaps will be buggy.

Condition combination:
If the blown steam of (X) steam emitter has (A) length

A: from 256 to any
Type: sequence.

Note:
It’s worth using this condition together with “If the blow status of (X) steam emitter is (A)” condition. (I.e. in the same TriggerGroup, after each other.) Because, for example, “the emitter is just blowing the steam” and the actual length is 2048 then that means “the flame increasing is 2048 long”, ruling out the “2048 and decreasing” part.

1.53. Earthquake subject

See more about earthquakes in Chapter 3.7.

1.53.1. The name of the field:
Custom_A (Different usage in according with type of item) (Short)

Executable combination (1):
Perform one (Y) large single quake with (X) earthquake

Y: 110 or bigger
Force: single.

Note:
- The usual intensity of an earthquake is randomly between 1 and 109 (usually being at near the maximum or the minimum, but including a sharp but short increasing and a sharp but short decreasing intensity part between them). If you force a value in that interval, then that won’t have any important effect. That’s why you will force a value above 109 – that will start decreasing (continuously) at once to the 1-109 random interval.
- If the earthquake object hasn’t been activated when you activate the combination, then the combination “really” starts when the object has been activated.

Executable combination (2):
Perform a quake with a continuous (Y) intensity with (X) earthquake

Y: from 1 to any
Force: continuous. When stopping it: the quake will continue as usual.

Condition combination:
If (X) earthquake has (A) intensity

A: from 1 to any
Type: sequence.

1.53.2. The name of the field:
Custom_B (Different usage in according with type of item) (Short)

Condition combination:
If (X) earthquake intensity status is (A)

A:
“equal” 20: the intensity is decreasing or fluctuating around the minimum
“bigger/equal” 21: the intensity is increasing or fluctuating around the maximum
Type: simple.

1.53.3. The name of the field:
Custom_C (Different usage in according with type of item) (Short)

Executable combination (1):
Make the increasing/decreasing phase of the quake of (X) earthquake last further (Y) frames from now on

Y: from 1 to any frames
Force: single.

Notes:
- You should use an “If the (X) earthquake intensity status is (A)” condition before you activate this combination (in the same TriggerGroup), so you will know if you will force on the increasing or the decreasing phase. (If you don’t do that then the combination will affect always the actual phase.)
- The longest time interval is about 200 originally. So if you force a definitely bigger number than 200 that will keep the intensity permanently at the minimum (in decreasing phase) or at the maximum (in increasing phase).
- The earthquakes start with a pretty short “fluctuating around the maximum” part before it starts decreasing. So if you activate the combination before activating the earthquake object then - activating the earthquake object - the combination will affect always the increasing phase.

Executable combination (2):
Keep the increasing/decreasing phase of the quake of (X) earthquake continuously at the maximum/minimum

Y: from 1 to any frames
Force: continuous. When stopping it: the quake will start working “normally” in Y frames.

Condition combination:
If (X) earthquake keeps the actual intensity status for further (A) frames from now on

A: from 1 to any frames
Type: sequence.

Notes:
- You can also use the “If the (X) earthquake intensity status is (A)” condition in the same TriggerGroup (after this one). So, eg. if the intensity status is “increasing” then the present condition will sound this way: “If the (X) earthquake keeps the increasing intensity status for further (A) frames from now on”.
- The solution will be buggy if you use this condition in the first second after triggering the earthquake.

Last edited by AkyV; 15-08-15 at 10:44.
AkyV is offline  
Closed Thread

Bookmarks

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off



All times are GMT. The time now is 04:36.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2017, vBulletin Solutions Inc.