Customised Switch Sequences
by AkyV

When we're talking about switch sequences then it means the switches will trigger the required thing only if Lara switches them in the required order.

Note:
This tutorial has nothing to do with the original TR4 switch sequence (see the SEQUENCE_SWITCH buttons and the SEQUENCE_DOOR1 doors from the 'Underneath the Sphinx' TRLR level).

Let's see an example to understand the tutorial:

You have three lever switches placed in the map:

Switch1= ID25
Switch2= ID15
Switch3= ID24

If you push the switches in the required order (this is 1-2-3 now) then a placed door (ID14) will open. The switches won't be reset automatically after pushing all of them.
If you don't push the switches in the required order then the door won't open. The switches will be reset automatically after pushing all of them.
If you have pushed a switch then you can't pushed it back directly by Lara into the starting position.
There is no any other task that the switches should do now.

THE SETUP:

1. In WADMerger Animation Editor

See the Animation2 of the LEVER_SWITCH. Remove the only one entry from State Change Editor (that enables 'pushing back to the starting position' Animation3 when Lara does that move), so if Lara wants to push the lever back to the starting position, then the lever won't move.

2. In Room Editor

Then place the required objects (see above) and triggers on the map:
DON'T place any SWITCH triggers or triggers for the door. But place two triggers for each switch:

- An F109 trigger on the square of Switch1 that enables GlobalTrigger1 when Lara is on that square. And another F109 trigger near the switch (Lara must activate that before reaching the other two switches) to disable the same GlobalTrigger.
- An F109 trigger on the square of Switch2 that enables GlobalTrigger2 when Lara is on that square. And another F109 trigger near the switch (Lara must activate that before reaching the other two switches) to disable the same GlobalTrigger.
- An F109 trigger on the square of Switch3 that enables GlobalTrigger3 when Lara is on that square. And another F109 trigger near the switch (Lara must activate that before reaching the other two switches) to disable the same GlobalTrigger.

Note:
Maybe you should place the enabling F109 trigger not on the square of the switch but a square next to the switch if you experience the GlobalTrigger won't be enabled in the proper time. (I mean maybe Lara will start using the switch first and step on the switch square to enable GlobalTrigger only after that. That causes she will perform Animation324 - that's bad -, without the switch moving - that's good -, when she wants to switch off.)

3. In NG Center

And this must go to the Script:

GlobalTrigger= 1, IGNORE, GT_CONDITION_GROUP, IGNORE, 1, 4, IGNORE
TriggerGroup= 1, $8000, 324, $1E, $9000, 25, $215
GlobalTrigger= 2, IGNORE, GT_CONDITION_GROUP, IGNORE, 2, 4, IGNORE
TriggerGroup= 2, $8000, 324, $1E, $9000, 15, $215
GlobalTrigger= 3, IGNORE, GT_CONDITION_GROUP, IGNORE, 3, 4, IGNORE
TriggerGroup= 3, $8000, 324, $1E, $9000, 24, $215
TriggerGroup= 4, $2000, 77, $67
GlobalTrigger= 4, FGT_SINGLE_SHOT_RESUMED, GT_CONDITION_GROUP, IGNORE, 5, 6, IGNORE
TriggerGroup= 5, $9000, 25, $215, $9000+TGROUP_NOT, 15, $215, $9000+TGROUP_NOT, 24, $215
TriggerGroup= 6, $2000, 231, $140
GlobalTrigger= 5, FGT_SINGLE_SHOT_RESUMED, GT_CONDITION_GROUP, IGNORE, 7, 6, IGNORE
TriggerGroup= 7, $8000, 64, $12B, $9000, 15, $215, $9000+TGROUP_NOT, 24, $215
GlobalTrigger= 6, IGNORE, GT_CONDITION_GROUP, IGNORE, 8, 9, IGNORE
TriggerGroup= 8, $8000, 64, $22B, $9000, 24, $215
TriggerGroup= 9, $5000, 14, $2B
GlobalTrigger= 7, IGNORE, GT_CONDITION_GROUP, IGNORE, 10, 11, IGNORE
TriggerGroup= 10, $9000, 25, $215, $9000, 15, $215, $9000, 24, $215, $9000, 14, $40E
TriggerGroup= 11, $5000, 25, $30F, $5000, 15, $30F, $5000, 24, $30F, $2000, 232, $40

3.1. Preventing Lara from switching off the switches manually

When Lara reaches the square of Switch1 then the GlobalTrigger will be enabled by the F109 placed there. (It's important if you disabled that GlobalTrigger with the disabling F109 trigger before.) So if TriggerGroup1 is true (i.e. if Lara is performing her switch-pushing Animation324 and the switch is performing its 'I'm switched on' Animation2) then the game will execute TriggerGroup4, i.e. it will force the basic 'standing and still' Animation103 on Lara.

; Set Trigger Type - CONDITION 30
; Exporting: CONDITION(30:62) for PARAMETER(324)
; <#> : Animation= 324
; <&> : Lara. (Animation) Lara is performing <#>animation
; (E) :
; Values to add in script command: $8000, 324, $1E

; Set Trigger Type - CONDITION 21
; Exporting: CONDITION(21:58) for OBJECT(25)
; <#> : LEVER_SWITCH ID 25
; <&> : Creature. Current animation of <#>creature is (E)animation (0-31)
; (E) : Animation= 2
; Values to add in script command: $9000, 25, $215

; Set Trigger Type - FLIPEFFECT 77
; Exporting: TRIGGER(103:0) for FLIPEFFECT(77)
; <#> : Lara. (Animation) Force <&>Animation (0-255) of (E)slot for Lara
; <&> : 103 Animation
; (E) : SLOT_000 LARA
; Values to add in script command: $2000, 77, $67

Why is it important? - Because that's what will happen:

- Lara pushes the switch from the starting position (i.e. when the switch performs its Animation0). It is successful.
- Lara wants to push the switch from the ending position (i.e. when the switch performs its Animation2). But she can't, because of that removed WADMerger entry, and because we force Animation103 on her.

If Lara leaves the switch then she will disable the GlobalTrigger with the other F109 near the switch, so she won't perform Animation103 instead of Animation324 if she switches on Switch2 or Switch3 after switching on Switch1.

All of this works in a similar way with Switch2 or Switch 3 - see GlobalTrigger2, 3 and TriggerGroup2, 3, 4 in the Script.

Note:
It's easy to identify the object in the C21 trigger: i.e. see the numbers that are written in red above. (I say that because now you can identify $9000, 15, $215 and $9000, 24, $215 triggers.)

3.2. Defining the first switch to switch on

GlobalTrigger4 will activate TriggerGroup6 if TriggerGroup5 is true. It means if Switch1 is switched on (i.e. if the switch is just performing Animation2: $9000, 25, $215) but Switch2 or 3 aren't ($9000+TGROUP_NOT, 15, $215, $9000+TGROUP_NOT, 24, $215) then the game will add Value 1 to Local Byte Alfa1 - so Local Byte Alfa 1 is 1 now if Lara pushed only Switch1 but didn't push Switch2 or 3:

; Set Trigger Type - FLIPEFFECT 231
; Exporting: TRIGGER(320:0) for FLIPEFFECT(231)
; <#> : Variables. Numeric. Add to <&>Variable the (E)value
; <&> : Local Byte Alfa1
; (E) : Value 1
; Values to add in script command: $2000, 231, $140

Notes:

1. FGT_SINGLE_SHOT_RESUMED is necessary, or else 1 will be added again and again to the variable if the Switch1 is switched on.
And yes, it is FGT_SINGLE_SHOT_RESUMED and not FGT_SINGLE_SHOT. Without RESUMED, the GlobalTrigger may be useless at the second, third etc. attempts. But we need those attempts if at the first attempt the order of the switches were wrong.
2. Two 'TGROUP_NOT' after each other always produce an 'or' connection: 'not this or not that'. (If you want an 'and' connection - 'not this and not that' -, then place the two 'TGROUP_NOT' trigger in a separated triggergroup, and define that triggergroup as a subject of a MultEnvCondition. Then use that MultEnvCondition as the required condition, in 'AND' way.)
So now we have an 'or' connection between Switch2 and 3 conditions, but it doesn't matter. I mean, if either Switch2 or Switch3 is switched on, then the order won't be proper if you switch on Switch1 after that. So we don't need a 'Switch2 AND Switch3 are switched on' condition now.

3.3. Defining the second switch to switch on

GlobalTrigger5 will activate TriggerGroup6 if TriggerGroup7 is true. It means if Switch2 is switched on (i.e. if the switch is just performing Animation2: $9000, 15, $215) and Local Byte Alfa1 is 1 (i.e. if Switch1 has been switched before: $8000, 64, $12B), but Switch3 isn't switched on ($9000+TGROUP_NOT, 24, $215) then the game will add Value 1 to Local Byte Alfa1 - so Local Byte Alfa 1 is 2 now if Lara pushed Switch1 and then Switch2 but didn't push Switch3.

; Set Trigger Type - CONDITION 43
; Exporting: CONDITION(43:60) for PARAMETER(64)
; <#> : Local Byte Alfa1
; <&> : Variables. The <#>Numeric Variable is = than (E)Value
; (E) : Value= 1
; Values to add in script command: $8000, 64, $12B

Note:
Naturally, FGT_SINGLE_SHOT_RESUMED is also necessary now.

3.4. Defining the third switch to switch on

GlobalTrigger6 will activate TriggerGroup9 if TriggerGroup8 is true. It means if Switch3 is switched on (i.e. if the switch is just performing Animation2: $9000, 24, $215) and Local Byte Alfa1 is 2 (i.e. if Switch1 and 2 has been switched before in the right order: $8000, 64, $22B) then the game will open the door:

; Set Trigger Type - ACTION 43
; Exporting: TRIGGER(43:0) for ACTION(14)
; <#> : DOOR_TYPE4 ID 14
; <&> : Trigger. (Moveable) Activate <#>Object with (E)Timer value
; (E) : Timer= +00
; Values to add in script command: $5000, 14, $2B

3.5. Resetting the switches

GlobalTrigger7 will activate TriggerGroup11 if TriggerGroup10 is true. It means if all the switches are switched on (i.e. if all of them perform Animation2) but the door is closed ($9000, 14, $40E) then the game will force Animation3 ('go to the starting position') on all the three switches and turn the variable into 0:

; Set Trigger Type - CONDITION 14
; Exporting: CONDITION(14:54) for OBJECT(14)
; <#> : DOOR_TYPE2 ID 14
; <&> : Creature. <#>Creature is currently (E)
; (E) : Enemy is not active
; Values to add in script command: $9000, 14, $40E

; Set Trigger Type - ACTION 15
; Exporting: TRIGGER(783:0) for ACTION(25)
; <#> : LEVER_SWITCH ID 25
; <&> : Force (E) animation (0-31) for <#>object
; (E) : 3 Animation
; Values to add in script command: $5000, 25, $30F

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

So, after pushing all of them - except if they were pushed in the right order, i.e. if the door is open now - the game will reset the switches and the variable as well, for a newer attempt.

Important! If GlobalTrigger7 is placed in the Script before the other GlobalTriggers that may disturb the proper working of the setup.

Notes:

1. It's easy to identify the object in the A15 trigger: i.e. see the numbers that are written in red above. (I say that because now you can identify $5000, 15, $30F and $5000, 24, $30F triggers.)
2. If you use 'the switches are all on and the variable is not 2' condition instead of 'the switches are all on and the door is closed' condition, that will do the same now.
And maybe it is important. I mean, eg. if you used the switches to activate a flipmap and not to activate an object, then you can't use an 'if the object is inactive' condition.

And what if I want to open another door by the switches, too?

So, I'm talking about the case, when there is another door placed (eg. it's ID117 now) as well, and you will open that if you switch on the switches in another order now. Let's say this order is 3-1-2.
This is how it works now:

If you push the switches in one of the required orders (1-2-3) then the placed doorID14 will open. The switches won't be reset automatically after pushing all of them if doorID117 is also open now, but they will, if that isn't.
If you push the switches in one of the required orders (3-1-2) then the placed doorID117 will open. The switches won't be reset automatically after pushing all of them if doorID14 is also open now, but they will, if that isn't.
If you don't push the switches in any of the required orders then none of the doors will open. The switches will be reset automatically after pushing all of them.
If you have pushed a switch then you can't pushed it back directly by Lara into the starting position.
There is no any other task that the switches should do now.

THE SETUP

Supposing you are just using the 'one door setup' now:

1. In WADMerger Animation Editor

Don't do anything new.

2. In Room Editor

Just place the doorID117 anywhere.

3. In NG Center

Edit the Script, i.e. type the green text in it:

GlobalTrigger= 1, IGNORE, GT_CONDITION_GROUP, IGNORE, 1, 4, IGNORE
TriggerGroup= 1, $8000, 324, $1E, $9000, 25, $215
GlobalTrigger= 2, IGNORE, GT_CONDITION_GROUP, IGNORE, 2, 4, IGNORE
TriggerGroup= 2, $8000, 324, $1E, $9000, 15, $215
GlobalTrigger= 3, IGNORE, GT_CONDITION_GROUP, IGNORE, 3, 4, IGNORE
TriggerGroup= 3, $8000, 324, $1E, $9000, 24, $215
TriggerGroup= 4, $2000, 77, $67
GlobalTrigger= 4, FGT_SINGLE_SHOT_RESUMED, GT_CONDITION_GROUP, IGNORE, 5, 6, IGNORE
TriggerGroup= 5, $9000, 25, $215, $9000+TGROUP_NOT, 15, $215, $9000+TGROUP_NOT, 24, $215
TriggerGroup= 6, $2000, 231, $140
GlobalTrigger= 5, FGT_SINGLE_SHOT_RESUMED, GT_CONDITION_GROUP, IGNORE, 7, 6, IGNORE
TriggerGroup= 7, $8000, 64, $12B, $9000, 15, $215, $9000+TGROUP_NOT, 24, $215
GlobalTrigger= 6, IGNORE, GT_CONDITION_GROUP, IGNORE, 8, 9, IGNORE
TriggerGroup= 8, $8000, 64, $22B, $9000, 24, $215
TriggerGroup= 9, $5000, 14, $2B
GlobalTrigger= 8, FGT_SINGLE_SHOT_RESUMED, GT_CONDITION_GROUP, IGNORE, 12, 13, IGNORE
TriggerGroup= 12, $9000, 24, $215, $9000+TGROUP_NOT, 15, $215, $9000+TGROUP_NOT, 25, $215
TriggerGroup= 13, $2000, 231, $340
GlobalTrigger= 9, FGT_SINGLE_SHOT_RESUMED, GT_CONDITION_GROUP, IGNORE, 14, 6, IGNORE
TriggerGroup= 14, $8000, 64, $12B, $9000, 25, $215, $9000+TGROUP_NOT, 15, $215
GlobalTrigger= 10, IGNORE, GT_CONDITION_GROUP, IGNORE, 15, 16, IGNORE
TriggerGroup= 15, $8000, 64, $22B, $9000, 15, $215
TriggerGroup= 16, $5000, 117, $2B
GlobalTrigger= 7, IGNORE, GT_CONDITION_GROUP, IGNORE, 10, 11, IGNORE
TriggerGroup= 10, $9000, 25, $215, $9000, 15, $215, $9000, 24, $215, $9000, 14, $40E, $9000+TGROUP_OR, 117, $40E
TriggerGroup= 11, $5000, 25, $30F, $5000, 15, $30F, $5000, 24, $30F, $2000, 232, $40

3.1. Preventing Lara from switching off the switches manually

You didn't do anything new about that in the Script.

3.2. Defining the first switch to switch on

- For 1-2-3 sequence (doorID14): as I said above, GlobalTrigger4 and TriggerGroup5 and 6 will care about it.
- For 3-1-2 sequence (doorID117): GlobalTrigger8 and TriggerGroup12 and 13 will care about it.

The difference between the two sequences is 1-2-3 sequence will use the variable value 1 and then the variable value 2, but 3-1-2 sequence will use the variable value 3 and then the variable value 4. That's why GlobalTrigger8 won't use TriggerGroup6 to turn the starting variable value from 0 into 1 but will use TriggerGroup13 to turn that 0 into 3.

; Set Trigger Type - FLIPEFFECT 231
; Exporting: TRIGGER(832:0) for FLIPEFFECT(231)
; <#> : Variables. Numeric. Add to <&>Variable the (E)value
; <&> : Local Byte Alfa1
; (E) : Value 3
; Values to add in script command: $2000, 231, $340

3.3. Defining the second switch to switch on

- For 1-2-3 sequence (doorID14): as I said above, GlobalTrigger5 and TriggerGroup7 and 6 will care about it.
- For 3-1-2 sequence (doorID117): GlobalTrigger9 and TriggerGroup14 and 6 will care about it.

So GlobalTrigger5 will use TriggerGroup6 to turn the variable value from 1 into 2, and GlobalTrigger9 will also use that to turn the variable value from 3 into 4.

3.4. Defining the third switch to switch on

- For 1-2-3 sequence (doorID14): as I said above, GlobalTrigger6 and TriggerGroup8 and 9 will care about it.
- For 3-1-2 sequence (doorID117): GlobalTrigger10 and TriggerGroup15 and 16 will care about it.

3.5. Resetting the switches

This time you must type this trigger into TriggerGroup10: $9000+TGROUP_OR, 117, $40E. So the switches will be reset only if any of the doors is closed.
But if both of them are open then the switches won't be reset any more.

Made using TRNG 1.2.2.6