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 13-08-15, 10:29   #1
AkyV
Moderator
 
Join Date: Dec 2011
Location: Hungary
Posts: 2,505
Default TRNG - Hanging Strength for Lara as TR6

Download a project file illustrating this tutorial


From TR1 to TR5, Lara always has endless strength when she is hanging.
But in TR6, she will get tired if she’s hanging too long. - There is a yellow strength bar just under her red life energy bar. It is decreasing continuously while Lara is hanging. When the bar reaches 0, Lara releases the “handle” (ledge etc.) automatically, indicating she has got tired, her hanging strength has just run out.



In this tutorial I will show you how to use a similar hanging strength bar in NGLE:


1. The definition of “hanging strength”

Lara’s strength to hang will decrease if she’s just hanging on:

- ledges or
- ladders or
- monkey bars or
- ropes or
- poleropes or
- ziplines or
- parallel (swing) bars.


The setup is calculated and tested only on

- the original and (definitely) used TR4 hanging animations and on
- the TR5 parallel bar hanging animation imported into NGLE by Paolone.

So you have to re-edit the setup, if you want to use further hanging animations in it. - See, for example, the shelf-climbing Lara animation in TR5: Animation466.


2. Extra strength

Sometimes there are too long ledges, too high ladders etc. that Lara can never shimmy, climb etc. all the way on, because all of her strength is too little for that. In those cases she will eat a chocolate bar that gives her some extra hanging strength. - It works like a medipack with the health points: if Lara’s health is low, then a medipack will give her new health points.
(Okay, I admit, this is a thing you couldn’t find in TR6. This is new. So it has nothing to do with the permanent strength-getting of TR6, when Lara says: “I feel stronger”.)

Notes:

1. Each chocolate bar is a pickable object. I use chocolate bars in PUZZLE_ITEM4 slot now. (Without puzzle holes.)
You can find chocolate pickable objects, for example, on TRSearch. – In TRSearch Item#1335 you can find the TR6 chocolate by Trinity:



2. There is no animation for “Lara puts the chocolate bar into her mouth - while hanging only by one hand - and eats that”. Use your illusion – or create the proper animations.
(So “eating a bar” means only “minus one chocolate bar from the inventory and giving some extra strength” now.)

3. Don’t let Lara have too many chocolate bars in the inventory at the same time, or else you make the player’s thing too easy to get through the harder hanging operations.


3. The strength bar

The strength bar will be set exactly below the damage bar (including the name of the damage bar written with little font below the damage bar). You use the first custom bar (see the setup below: BAR_CUSTOM1) as the strength bar now. You use an FBAR_SHOW_BAR_NAME constant in the setup that means the custom bar has a name now.
You must always type the name of the first custom bar in ExtraNG#301 string (so this place is hardcoded). Now the strength type and the amount of chocolate bars will be used as a bar name in that string:

Hanging Strength\nChocolate Bars: #0000

“\n” means “I hit ENTER” and #0000 is the actual value of Global Byte Alfa1 variable (i.e. the actual amount of the chocolate bars in the inventory) so that is the name you’ll see on the screen now:

Hanging Strength
Chocolate Bars: X

In which “X” is the actual amount of the chocolate bars.



That bar-position on the screen is a constant place for the strength bar (according to this tutorial, at least), so the bar will be in that position even if Lara isn’t in a damage room:



The strength bar shows up if Lara starts hanging.
The strength bar starts decreasing continuously from 100 % strength while Lara’s hanging. If the bar reaches 0 (i.e. if her strength has just been run out) then she will release the ledge/ladder/monkey bar/rope/polerope/zipline/parallel bar automatically. (If the player releases CTRL before the bar reaches 0, making Lara release the ledge etc., then the decreasing of the strength bar will stop at once, of course.)
The strength bar won’t disappear when Lara falls down, releasing the ledge etc. Instead of that, the bar starts increasing continuously (“Lara’s strength is increasing, because her arm-muscles are just resting, because Lara’s not using them”), and it will disappear only if it reaches 100 %. (Of course, Lara can start hanging again before the strength bar reaches 100 %. But in this case the increasing of the bar stops and it starts decreasing at once.)

Notes:

1. See more about variables in Paolone’s Variables demo project and in NG Center\Reference\Variable Placefolders.

2. In TR6 the bar has full strength again just after finishing the hanging. So there’s no “increasing strength” there. – But I think this tutorial shows you more natural event with the increasing strength. And more exciting.

3. Eating a chocolate bar gives Lara 50 % of her full hanging strength – I mean, of course, she will get less if she would step over 100 % with that plus 50 %.

4. Feel free to use the name you want in ExtraNG#301.

So, for example, type only “Hanging Strength”:






Or type only “Chocolate Bars: #0000”:



Or don’t type any name (in this case write IGNORE in the setup instead of FBAR_SHOW_BAR_NAME):



Or type any other name.


4. The cases

Case A– Lara uses only arms, hanging on ledges, ladders, monkey bars, ropes, poleropes, ziplines or parallel bars.
In Case A Lara loses 4 % of her strength in every second. - So, if she starts hanging with her full strength then she is able to hang (without eating chocolates) maximum for 100/4=25 seconds before she falls down.



Case B– Lara uses arms, also locking her legs around ropes or poleropes.
In Case B Lara loses 2 % of her strength in every second. - So, if she starts hanging with her full strength then she is able to hang (without eating chocolates) maximum for 100/2=50 seconds before she falls down.



Case C– Lara uses arms, also putting her feet on the ladder.
In Case C Lara loses 1 % of her strength in every second. - So, if she starts hanging with her full strength then she is able to hang (without eating chocolates) maximum for 100/1=100 seconds before she falls down.



The speed of increasing the strength is 3 % in every second, in all the cases. - So, if she falls down because her strength has just become 0 then it will take 100/3=33-34 seconds (without eating chocolates) for the strength to reach 100 % strength after that.
(Of course, only if she doesn’t start hanging again before reaching 100%, because if she does, then it will take much time to reach 100 % from 0.)

Modify the setup if you want to use other percent values.

Notes:

1. Of course, there are connections among the cases. So, for example, if Lara is hanging on a ladder without feet on it, then she loses 4 % strength in every second. But when she puts the feet on it, the decreasing reduces, it’s only 1 % strength-losing in every second after that.

2. As you see, you can eat chocolates not only in the decreasing phase, when Lara needs that extra strength to prevent her from falling down. But also in the increasing phase, so you will get 100 % strength sooner.

3. To make the things less complicated, I skipped some factors in the setup, making that become a bit subjective, incorrect.
So, for example, if Lara climbs down a ladder, that is exactly as just hard to her as climbing up there – because I skipped the gravitation factor in this case.


5. How it works

If you use the setup of the strength bar (see below) then that’s what will happen in the game:

The setup uses two crucial variables:

- Local Byte Alfa1: here you calculate numbers, from 0 to 100. These numbers are the percent values of the strength, from 0 % to 100 %. (The lowest number a custom bar shows is always 0 and the highest number a custom bar shows is always 100, that’s why the 0 % strength is always mean a totally empty bar and the 100 % strength is always mean a totally full bar – and that is just perfect now, of course.)
- Local Byte Alfa2: you count in this variable how long Lara will be hanging. (No, we can’t use an Organizer now. – I’d rather skip the details why.)

You have to place this FLIPEFFECT on the square where LARA object is – so the game defines a 100 % starting value for the hanging strength of Lara when the level starts:

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

The trigger must be “One Shot” to prevent Lara from giving the starting value to the strength again, later in the level, accidentally.

(We don’t define a starting value for Local Byte Alfa2, so that will have the default starting value: 0.)

If Lara starts performing one of the hanging animations, then the strength bar will appear on the screen, and Local Byte Alfa2 starts counting the frames – because number 1 will be added at each frame to Local Byte Alfa2.
Remember: we want to decrease the strength after 1 second by 4, 2 or 1 %. 30 frames mean 1 second in the game, so if Local Byte Alfa2 reaches 30, the game will subtract 4 % (performing a Case A animation), 2 % (performing a Case B animation) or 1 % (performing a Case C animation) from the 100 % starting value of the strength (i.e. from Local Byte Alfa1).
Local Byte Alfa2 becomes 0 now, but starts increasing at once again, and if it reaches 30 again, the game subtracts 4/2/1 % from the actual value of the strength.
After that, Local Byte Alfa2 continues decreasing Local Byte Alfa1 until Lara releases her grab. (Minus 4/2/1 % per second, again and again.)

“Lara releases her grab” means the player releases CTRL or the game disables CTRL for a short moment when the strength reaches 0. (So, as you see, we won’t create “real hanging strength”, using this setup, actually. I mean we create percent numbers in a 0-100 interval, showing the values in a bar, and when the value is 0, then we will disable CTRL for a short while, making Lara fall down.)

If Lara has just released her grab then the game will continue adding number 1 to Local Byte Alfa2 at each frame. After every second (i.e. after every 30 frames) 3 % will be added to the strength (i.e. to Local Byte Alfa1) – because, as I said above, if the strength is not maximal (i.e. not 100 %), the strength will be increased by 3 % in each second.
If Local Byte Alfa1 reaches 100 % (i.e. the maximal strength), then the game will stop adding number 1 to Local Byte Alfa2 (that has its starting value 0 again from now on) and removes the bar off the screen.

Additional features (calculated in the setup):

- The chocolate bar (as I said above).
- A sound signal (a short “beep”) is heard in every second when the strength is too low, warning the player of Lara’s fall-down is coming. (This “beep” is the same beep that damage bars use: sound slot #112, called TICK_TOCK, that uses the original tick.wav.)


6. The setup

You don’t need to understand the setup below. (I must admit it’s complicated.) So, if you want, just copy it, then paste it into the [Level] block of your level – and enjoy the result!
But don’t forget about these things:

- Your LARA object must have the hanging animations the abovementioned tools/situations (ledge/ladder/monkey bar/rope/polerope/zipline/parallel bar) use.
- If you want, hit key C to eat a chocolate bar, any time when Lara’s strength is not full.
- Type “Chocolate Bar” in [Strings].
- Place chocolate bars as PUZZLE_ITEM4 pickable items in your level. So after Lara picked them up she can eat them. (Using our setup, your game starts with 5 bars in the inventory.)
- Decide if you want to use a name for the bar. (See above how to create a name for the bar.)
- Local Byte Alfa1, Local Byte Alfa2 and Global Byte Alfa1 are variables that our setup uses now. So you can’t use these variables for other purposes in your level.
- Place that FLIPEFFECT – I mentioned above - on LARA’s square.
- You must have the TICK_TOCK sound slot (having the original tick.wav) in your WAD.

If you want to change the setup, you must read the description following that to understand that.
(See more about Script commands and constants in NG Center\Reference.)


So, this is the setup:

TriggerGroup= 1, $8000, 12, $5, $8000+TGROUP_OR, 18, $5, $8000+TGROUP_OR, 215, $1E, >
$8000+TGROUP_OR, 331, $1E, $8000+TGROUP_OR, 337, $1E, >
$8000+TGROUP_OR, 355, $1E, $8000+TGROUP_OR, 356, $1E, >
$8000+TGROUP_OR, 357, $1E, $8000+TGROUP_OR, 358, $1E, $8000+TGROUP_OR, 359, $1E, >
$8000+TGROUP_OR, 360, $1E, $8000+TGROUP_OR, 361, $1E, $8000+TGROUP_OR, 362, $1E, >
$8000+TGROUP_OR, 373, $1E, $8000+TGROUP_OR, 384, $1E, $8000+TGROUP_OR, 394, $1E, >
$8000+TGROUP_OR, 462, $1E
TriggerGroup= 2, $8000, 100, $1F, $8000+TGROUP_OR, 101, $1F, >
$8000+TGROUP_OR, 102, $1F, $8000+TGROUP_OR, 103, $1F, >
$8000+TGROUP_OR, 327, $1E, $8000+TGROUP_OR, 328, $1E, >
$8000+TGROUP_OR, 374, $1E, $8000+TGROUP_OR, 375, $1E, >
$8000+TGROUP_OR, 376, $1E, $8000+TGROUP_OR, 385, $1E, >
$8000+TGROUP_OR, 387, $1E, $8000+TGROUP_OR, 392, $1E, $8000+TGROUP_OR, 393, $1E
TriggerGroup= 3, $8000, 0, $5, $8000+TGROUP_OR, 363, $1E, $8000+TGROUP_OR, 364, $1E, >
$8000+TGROUP_OR, 365, $1E, $8000+TGROUP_OR, 366, $1E, $8000+TGROUP_OR, 367, $1E, >
$8000+TGROUP_OR, 368, $1E, $8000+TGROUP_OR, 369, $1E, $8000+TGROUP_OR, 370, $1E
ColorRGB= 1, 0, 0, 0
ColorRGB= 2, 250, 211, 97
Customize= CUST_BAR, BAR_CUSTOM1, FBAR_SHOW_BAR_NAME, 6, 65, 150, 12, 1, 2, #0040
GlobalTrigger= 1, IGNORE, GT_CONDITION_GROUP, IGNORE, 4, 5, IGNORE
TriggerGroup= 4, $8000, 1, $F, $8000+TGROUP_OR, 2, $F, $8000+TGROUP_OR, 3, $F
TriggerGroup= 5, $2000, 231, $141, $2000, 331, $4
GlobalTrigger= 2, IGNORE, GT_CONDITION_GROUP, IGNORE, 6, 7, 8
TriggerGroup= 6, $8000, 64, $2B
TriggerGroup= 7, $2000, 51, $9, $8000, 376, $1E, $2000, 80, $76
TriggerGroup= 8, $2000, 52, $9
Parameters= PARAM_BIG_NUMBERS, 100, 98, 51
GlobalTrigger= 3, IGNORE, GT_CONDITION_GROUP, IGNORE, 1, 9, 10
TriggerGroup= 9, $8000, 65, $1E2B, $8000, 64, $429, $2000, 233, $440, $2000, 232, $41, >
$8000+TGROUP_ELSE, 65, $1E2B, $8000, 64, $42A, $2000, 232, $40, $2000, 232, $41
TriggerGroup= 10, $8000, 65, $1E2B, $8000, 64, $127, $8000+TGROUP_NOT, 2, $F, >
$8000+TGROUP_NOT, 3, $F, $2000, 231, $340, $2000, 232, $41, >
$8000+TGROUP_ELSE, 65, $1E2B, $8000, 64, $126, $8000+TGROUP_NOT, 2, $F, >
$8000+TGROUP_NOT, 3, $F, $2000, 232, $6440, $2000, 232, $41
GlobalTrigger= 4, IGNORE, GT_CONDITION_GROUP, IGNORE, 2, 11, IGNORE
TriggerGroup= 11, $8000, 65, $1E2B, $8000, 64, $229, $2000, 233, $240, $2000, 232, $41, >
$8000+TGROUP_ELSE, 65, $1E2B, $8000, 64, $12B, $2000, 232, $40, $2000, 232, $41
GlobalTrigger= 5, IGNORE, GT_CONDITION_GROUP, IGNORE, 3, 12, IGNORE
TriggerGroup= 12, $8000, 65, $1E2B, $2000, 233, $140, $2000, 232, $41
GlobalTrigger= 6, IGNORE, GT_CONDITION_GROUP, IGNORE, 13, 14, IGNORE
TriggerGroup= 13, $8000, 15, $F, $8000+TGROUP_OR, 16, $F
TriggerGroup= 14, $2000, 231, $141
TriggerGroup= 15, $8000, 64, $27, $8000+TGROUP_NOT, 1, $F, >
$8000+TGROUP_NOT, 2, $F, $8000+TGROUP_NOT, 3, $F
TriggerGroup= 16, $8000, 64, $28, $8000+TGROUP_NOT, 65, $2B, >
$8000+TGROUP_NOT, 1, $F, $8000+TGROUP_NOT, 2, $F, $8000+TGROUP_NOT, 3, $F
GlobalTrigger= 7, FGT_SINGLE_SHOT_RESUMED, GT_CONDITION_GROUP, IGNORE, 17, 18, IGNORE
TriggerGroup= 17, $8000, 64, $28, $8000, 65, $2B
TriggerGroup= 18, $2000, 127, $1
Organizer= 1, IGNORE, IGNORE, 1, 19
TriggerGroup= 19, $2000, 332, $4
GlobalTrigger= 8, IGNORE, GT_CONDITION_GROUP, IGNORE, 20, 21, IGNORE
TriggerGroup= 20, $8000, 65, $F2B, $8000, 22, $F, $8000+TGROUP_OR, 23, $F, $8000+TGROUP_OR, 24, $F
TriggerGroup= 21, $2000, 70, $1F70
TriggerGroup= 22, $8000, 64, $142A, $8000, 1, $F
TriggerGroup= 23, $8000, 64, $A2A, $8000, 2, $F
TriggerGroup= 24, $8000, 64, $52A, $8000, 3, $F
Equipment= PUZZLE_ITEM4, 5
Puzzle= 4, Chocolate Bar, $0009, $0300, $0000, $0000, $0000, $0002
GlobalTrigger= 9, IGNORE, GT_ALWAYS, IGNORE, IGNORE, 25, IGNORE
TriggerGroup= 25, $2000, 244, $2B00
GlobalTrigger= 10, FGT_SINGLE_SHOT_RESUMED, GT_CONDITION_GROUP, IGNORE, 26, 27, IGNORE
TriggerGroup= 26, $8000, 46, $10C, $8000, 64, $27, $8000, 0, $129
TriggerGroup= 27, $2000, 49, $3, $8000, 64, $227, $2000, 231, $3240, >
$8000+TGROUP_ELSE, 64, $226, $2000, 232, $6440
GlobalTrigger= 11, IGNORE, GT_LARA_HP_LESS_THAN, 1, IGNORE, 19, IGNORE
GlobalTrigger= 12, IGNORE, GT_CONDITION_GROUP, IGNORE, 28, 29, IGNORE
TriggerGroup= 28, $8000, 65, $1F2B
TriggerGroup= 29, $2000, 232, $1D41


6.1. Basic conditions

The basic conditions of the setup are contained in TriggerGroup#1, 2 and 3:

a, If any of the animations in TriggerGroup#1 is just being performed, then it means Case A just happens:

- If Lara is performing “monkey” action (i.e. any of the “monkey” animations).

; Set Trigger Type - CONDITION 5
; Exporting: CONDITION(5:62) for PARAMETER(12)
; <#> : Monkey
; <&> : Lara. (Status) Lara is performing <#>action is (E)
; (E) : TRUE (Lara is performing #action)
; Values to add in script command: $8000, 12, $5

- If Lara is performing “hanged” action (i.e. any of the “hanging without using legs/feet” animations, excluding “shimmying around external/internal corners” animations, but including “turning on monkey bars” – 271, 272 – animations).

; Set Trigger Type - CONDITION 5
; Exporting: CONDITION(5:62) for PARAMETER(18)
; <#> : Hanged
; <&> : Lara. (Status) Lara is performing <#>action is (E)
; (E) : TRUE (Lara is performing #action)
; Values to add in script command: $8000, 18, $5

- If Lara slides on a zipline: Animation 215.
- If Lara jumps and grabs a polerope: Animation 331, 337.
- If Lara is performing any of the “shimmying around external/internal corners without feet on ladder” animations: Animation 355, 356, 357, 358, 359, 360, 361, 362.
- If Lara is performing any of the rope animations when her legs aren’t locked around the rope: Animation 373, 384, 394.
- If Lara is swinging on parallel bars: Animation 462.

b, If any of the animations in TriggerGroup#2 is just being performed, then it means Case B just happens:

- If Lara is performing any of the polerope animations when her legs are locked around the polerope: all of the animations of State 100 (Animation 329, 338), State 101 (Animation 334, 335, 336), State 102 (Animation 332, 343, 344) and State 103 (Animation 333, 345, 346), furthermore Animation 327 or 328.
- If Lara is performing any of the rope animations when her legs are locked around the rope: Animation 374, 375, 376, 385, 387, 392, 393.

c, If any of the animations in TriggerGroup#3 is just being performed, then it means Case C just happens:

- If Lara is performing “climbing” action (i.e. any of the “climbing on ladder with feet on it” animations, excluding “shimmying around external/internal corners” animations).

; Set Trigger Type - CONDITION 5
; Exporting: CONDITION(5:62) for PARAMETER(0)
; <#> : Climbing
; <&> : Lara. (Status) Lara is performing <#>action is (E)
; (E) : TRUE (Lara is performing #action)
; Values to add in script command: $8000, 0, $5

- If Lara is performing any of the “shimmying around external/internal corners with feet on ladder” animations: Animation 363, 364, 365, 366, 367, 368, 369, 370.

Notes:

1. It’s easy to identify the condition triggers used on states or animations in TriggerGroup#1, 2 or 3:

; Set Trigger Type - CONDITION 31
; Exporting: CONDITION(31:0) for PARAMETER(
X)
; <#> : State-Id=
X
; <&> : Lara. (State-Id) Lara is in <#>State-id
; (E) :
; Values to add in script command: $8000,
X, $1F

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

2. When I say “Lara can perform ANY animations” then this “any of them” is represented by TGROUP_OR constants in these TriggerGroups.


6.2. Showing the bar

Our custom bar, the strength bar is formed in the “Customize= CUST_BAR” Script command:

- BAR_CUSTOM1 means you use the first custom bar slot for the strength bar.
- FBAR_SHOW_NAME means the bar has a name.
- 6, 65, 150, 12 are the coordinates of the bar on the screen.
- 1 and 2 are the IDs of ColorRGB commands. The colors defined in those ColorRGBs are the colors of the bar.
- #0040 is the ID of Local Byte Alfa1. It means the actual value of Local Byte Alfa1 is shown in the bar.

GlobalTrigger#1 uses TriggerGroup#4 as a condition. If TriggerGroup#4 is true then TriggerGroup#5 will happen.
So, if Lara performs any animation of TriggerGroup#1, #2 or #3 (i.e. if one of Case A, B or C just happens, so if Lara’s just hanging) then the game will add number 1 to Local Byte Alfa2 and puts the bar on the screen:

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

; Set Trigger Type - FLIPEFFECT 331
; Exporting: TRIGGER(4:0) for FLIPEFFECT(331)
; <#> : Custom Bar. Show the <&>Custom bar on screen for (E)Seconds
; <&> : BAR_CUSTOM1
; (E) : Forever (use other action/effect to disable it)
; Values to add in script command: $2000, 331, $4

Excepting some cases (see for example FGT_SINGLE_SHOT_FLAG below) an enabled GlobalTrigger will check its condition(s) at each frame. (The GlobalTriggers of this setup are always enabled.) That’s why number 1 will be added at each frame to Local Byte Alfa2 if Lara’s just hanging. (It also means the bar will be placed on the screen at each frame, if Lara’s just hanging. It is necessary, because you can be sure now that the bar will be refreshed on the screen, if it has a new percent, i.e. if Local Byte Alfa1 has a new value.)

Note:
It’s easy to identify the condition triggers used on TriggerGroups in TriggerGroup#4:

; Set Trigger Type - CONDITION 15
; Exporting: CONDITION(15:0) for PARAMETER(
Z)
; <#> : TriggerGroup=
Z
; <&> : Multiple condition of <#>TriggerGroup script command
; (E) :
; Values to add in script command: $8000,
Z,$F


6.3. Losing the strength totally

GlobalTrigger#2 uses TriggerGroup#6 as a condition. If TriggerGroup#6 is true then TriggerGroup#7 will happen. Or, if TriggerGroup#6 isn’t true then TriggerGroup#8 will happen.
So, if the decreasing bar (i.e. the decreasing value of Local Byte Alfa1) reaches 0 then the game disables the Key CTRL, and – if Lara’s just performing Animation 376 – forces Lara to perform Animation 374.
But, if the bar leaves 0 (because Lara’s strength – i.e. the value of Local Byte Alfa1 – starts increasing at once if Lara’s just stopped hanging) then the game enables the Key CTRL again. (As you know now, if Lara’s not hanging, then her strength starts increasing by 3 % in each second. That’s why 1 second after the disabling, the game always re-enables CTRL, because the strength isn’t 0 now.)

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

; Set Trigger Type - FLIPEFFECT 51
; Exporting: TRIGGER(9:0) for FLIPEFFECT(51)
; <#> : Keyboard. Disable <&>keyboard command for (E) time
; <&> : Action (and Enter)
; (E) : Forever (use other action/effect to disable it)
; Values to add in script command: $2000, 51, $9

; Set Trigger Type - FLIPEFFECT 80
; Exporting: TRIGGER(118:0) for FLIPEFFECT(80)
; <#> : Lara. (Animation) Force <&>Animation (256-512) of (E)slot for Lara
; <&> : 374 Animation
; (E) : SLOT_000 LARA
; Values to add in script command: $2000, 80, $76

; Set Trigger Type - FLIPEFFECT 52
; Exporting: TRIGGER(9:0) for FLIPEFFECT(52)
; <#> : Keyboard. Enable newly <&>keyboard command
; <&> : Action (and Enter)
; (E) :
; Values to add in script command: $2000, 52, $9

Animation 376 is the animation when Lara’s climbing up a rope. If she’s just performing it when the decreasing bar reaches 0 then disabling CTRL is useless. But if Lara stops climbing up (so if she becomes still), the disabling will work at last, Lara will fall down.
The “still Lara is on rope” animation is Animation 374. So, when Lara’s just climbing up and the bar reaches 0 then the game will force her to stop (i.e. to perform Animation 374). And, because Animation 374 is usable for the CTRL-disabling, Lara will fall down.

Note:
You won’t be able to use CTRL for other purposes (shooting, saving the game in Save Game menu etc.) either, through 1 second (i.e. until the re-enabling) after the disabling. – If it bothers you, change the setup somehow.


6.4. Counting the percents

GlobalTrigger#3 counts the 4 % decreasing when Lara performs a Case A animation.
GlobalTrigger#4 counts the 2 % decreasing when Lara performs a Case B animation.
GlobalTrigger#5 counts the 1 % decreasing when Lara performs a Case C animation.
And also GlobalTrigger#3 counts the 3 % increasing – but it works in all the cases, i.e. if Lara has fallen down whether performing a Case A animation, or performing a Case B animation, or performing a Case C animation before.

(Some parts of the setup – including some of these GlobalTriggers - use numbers you can’t define directly in triggers. These numbers will be defined in the fields of the “Parameters= PARAM_BIG_NUMBERS” Script command.)

So, GlobalTrigger#3 uses TriggerGroup#1 as a condition. If TriggerGroup#1 is true then TriggerGroup#9 will happen. Or, if TriggerGroup#1 isn’t true then TriggerGroup#10 will happen.
So, if Lara’s just performing a Case A animation, then two counting cases are possible:

- If Local Byte Alfa2=30 and Local Byte Alfa1 is bigger than 4 or equal with 4 then the game subtracts 4 from Local Byte Alfa1 (giving a new value to that) and turns Local Byte Alfa2 into 0.
So: as you know, if 1 second elapsed and Case A happens then the value of the bar will decrease by 4. Now “Local Byte Alfa2=30” means that second and “Local Byte Alfa1 minus 4” means the decreasing by 4.
(Local Byte Alfa2 turns into 0 so that variable now starts counting the next second, that will be elapsed if the variable reaches 30 again etc.
And the “Local Byte Alfa1 is bigger than 4 or equal with 4” condition is necessary, because it’s logical we can’t subtract 4 from the variable, if that’s smaller than 4. Because 3-4=-1, 2-4=-2 and 1-4=-3 are not valid numbers, there isn’t “minus percent strength”.
Of course, there are no 0-4=-4, -1-4=-5 etc. problems now, because the counting down will stop if it reaches 0 %: Lara releases the grab and the strength starts increasing. I mean, for example, there will never be percent value -1, that’s why the game will never want to subtract 4 from that.)

; Set Trigger Type - CONDITION 43
; Exporting: CONDITION(43:2) for PARAMETER(65)
; <#> : Local Byte Alfa2
; <&> : Variables. The <#>Numeric Variable is = than (E)Value
; (E) : Value= 30
; Values to add in script command: $8000, 65, $1E2B

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

; Set Trigger Type - FLIPEFFECT 233
; Exporting: TRIGGER(1088:0) for FLIPEFFECT(233)
; <#> : Variables. Numeric. Substract from <&>Variable the (E)value
; <&> : Local Byte Alfa1
; (E) : Value 4
; Values to add in script command: $2000, 233, $440

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

- If Local Byte Alfa2=30 ($8000, 65, $1E2B) and Local Byte Alfa1 is smaller than 4 then the game turns both Local Byte Alfa1 and Local Byte Alfa2 into 0 ($2000, 232, $41). – So this is the way to prevent “negative percent strength”, because in those 3-4, 2-4 and 1-4 cases the game always calculates 0 percent strength when the 1 second elapsed.

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

; 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

If Lara’s just not performing a Case A animation, then TriggerGroup#10 will happen. – There are two counting cases again:

- If Local Byte Alfa2=30 ($8000, 65, $1E2B) and Local Byte Alfa1 is smaller than the value of PARAM_BIG_NUMBERS field#1 (i.e. 98) and Lara’s performing neither Case B ($8000+TGROUP_NOT, 2, $F) nor Case C ($8000+TGROUP_NOT, 3, $F) then the game adds number 3 to Local Byte Alfa1 (giving a new value to that) and turns Local Byte Alfa2 into 0 ($2000, 232, $41).
As you know, if 1 second elapsed and Lara’s not hanging then the value of the bar will increase by 3. Thanks to the main condition (TriggerGroup#1) of GlobalTrigger#3 and $8000+TGROUP_NOT, 2, $F and $8000+TGROUP_NOT, 3, $F conditions, the “not hanging” condition now is defined. The “1 second elapsed” is defined in “Local Byte Alfa2=30” and the “increasing by 3” is defined in “Local Byte Alfa1 plus 3”.
(Local Byte Alfa2 turns into 0 so that variable now starts counting the next second, that will be elapsed if the variable reaches 30 again etc.
And the “Local Byte Alfa1 is smaller than 98” condition is necessary – i.e. if the variable is 97 at most -, because it’s logical we can’t add 3 to the variable, if that’s bigger than 97. Because, 98+3=101 and 99+3=102 are not valid numbers, there isn’t “more than one hundred percent strength”.
Of course, there are no 101+3=104, 102+3=105 etc. problems now, because TriggerGroup#10 can’t let bigger strength value than 100. I mean, for example, there will never be percent value 101, that’s why the game will never want to add 3 to that. – But there is 100+3=103 problem and that will also be solved now, at this TriggerGroup - but you will understand it at Chapter 6.5.)

; Set Trigger Type - CONDITION 39
; Exporting: CONDITION(39:60) for PARAMETER(64)
; <#> : Local Byte Alfa1
; <&> : Variables. The <#>Numeric Variable is < than (E)Big Number value
; (E) : Value of Parameters=PARAM_BIG_NUMBERS at index= 1
; Values to add in script command: $8000, 64, $127

; 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

- If Local Byte Alfa2=30 ($8000, 65, $1E2B) and Local Byte Alfa1 is bigger than the value of PARAM_BIG_NUMBERS field#1 (i.e. 98) or equal with it, and Lara’s performing neither Case B ($8000+TGROUP_NOT, 2, $F) nor C ($8000+TGROUP_NOT, 3, $F) then the game turns Local Byte Alfa into 100 ($2000, 232, $6440) and turns Local Byte Alfa2 into 0 ($2000, 232, $41). – So this is the way to prevent “more than one hundred percent strength”, because in those 98+3 and 99+3 and 100+3 cases the game always calculates 100 percent strength when the 1 second elapsed.

; Set Trigger Type - CONDITION 38
; Exporting: CONDITION(38:60) for PARAMETER(64)
; <#> : Local Byte Alfa1
; <&> : Variables. The <#>Numeric Variable is >= than (E)Big Number value
; (E) : Value of Parameters=PARAM_BIG_NUMBERS at index= 1
; Values to add in script command: $8000, 64, $126

GlobalTrigger#4 uses TriggerGroup#2 as a condition. If TriggerGroup#2 is true then TriggerGroup#11 will happen.
So, if Lara’s just performing a Case B animation, then two counting cases are possible:

- If Local Byte Alfa2=30 ($8000, 65, $1E2B) and Local Byte Alfa1 is bigger than 2 or equal with 2 then the game subtracts 2 from Local Byte Alfa1 (giving a new value to that) and turns Local Byte Alfa2 into 0 ($2000, 232, $41).
So: as you know, if 1 second elapsed and Case B happens then the value of the bar will decrease by 2. Now “Local Byte Alfa2=30” means that second and “Local Byte Alfa1 minus 2” means the decreasing by 2.
(Local Byte Alfa2 turns into 0 so that variable now starts counting the next second, that will be elapsed if the variable reaches 30 again etc.
And the “Local Byte Alfa1 is bigger than 2 or equal with 2” condition is necessary, because it’s logical we can’t subtract 2 from the variable, if that’s smaller than 2. Because, 1-2=-1 is not a valid number, there isn’t “minus 1 percent strength”.
Of course, there are no 0-2=-2, -1-2=-3 etc. problems now, because the counting down will stop if it reaches 0 %.)

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

; Set Trigger Type - FLIPEFFECT 233
; Exporting: TRIGGER(576:0) for FLIPEFFECT(233)
; <#> : Variables. Numeric. Substract from <&>Variable the (E)value
; <&> : Local Byte Alfa1
; (E) : Value 2
; Values to add in script command: $2000, 233, $240

- If Local Byte Alfa2=30 ($8000, 65, $1E2B) and Local Byte Alfa1 is 1 then the game turns both Local Byte Alfa1 ($2000, 232, $40) and Local Byte Alfa2 into 0 ($2000, 232, $41). – So this is the way to prevent “minus percent strength”, because in that 1-2=-1 case the game always calculates 0 percent strength when the 1 second elapsed.

; 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

GlobalTrigger#5 uses TriggerGroup#3 as a condition. If TriggerGroup#3 is true then TriggerGroup#12 will happen.
So, if Lara’s just performing a Case C animation, and Local Byte Alfa2=30 ($8000, 65, $1E2B) then the game subtracts 1 from Local Byte Alfa1 (giving a new value to that) and turns Local Byte Alfa2 into 0 ($2000, 232, $41).
So: as you know, if 1 second elapsed and Case C happens then the value of the bar will decrease by 1. Now “Local Byte Alfa2=30” means that second and “Local Byte Alfa1 minus 1” means the decreasing by 1.
(Local Byte Alfa2 turns into 0 so that variable now starts counting the next second, that will be elapsed if the variable reaches 30 again etc.)

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


6.5. The rest

Either the game releases CTRL by GlobalTrigger#2 or the player releases CTRL by him/herself, the decreasing of the strength bar will stop (at 0 or a bigger value). Exactly at that moment, the bar starts increasing, which indicates “Lara’s just resting, so she’s just getting strength”. – But, of course, she can’t get more strength if the bar reaches 100 %.

GlobalTrigger#6 will control that procedure:
The GlobalTrigger uses TriggerGroup#13 as a condition. If TriggerGroup#13 is true then TriggerGroup#14 will happen. So, if all the conditions in TriggerGroup#15 are true ($8000, 15, $F) or all the conditions in TriggerGroup#16 are true ($8000+TGROUP_OR, 16, $F) then the game adds number 1 to Local Byte Alfa2 ($2000, 231, $141).

The conditions in TriggerGroup#15:
If Local Byte Alfa1 is smaller than the value of PARAM_BIG_NUMBERS field#0 (i.e. 100) - i.e. if the variable is 99 at most - and Lara’s not hanging (because she’s not performing Case A, B, C triggers, i.e. TriggerGroup#1, 2 or 3 triggers: $8000+TGROUP_NOT, 1, $F, $8000+TGROUP_NOT, 2, $F, $8000+TGROUP_NOT, 3, $F.

; Set Trigger Type - CONDITION 39
; Exporting: CONDITION(39:62) for PARAMETER(64)
; <#> : Local Byte Alfa1
; <&> : Variables. The <#>Numeric Variable is < than (E)Big Number value
; (E) : Value of Parameters=PARAM_BIG_NUMBERS at index= 0
; Values to add in script command: $8000, 64, $27

The conditions in TriggerGroup#16:
If Local Byte Alfa1 is equal with the value of PARAM_BIG_NUMBERS field#0 (i.e. 100) and Local Byte Alfa2 isn’t 0 and Lara’s not hanging (because she’s not performing Case A, B, C triggers, i.e. TriggerGroup#1, 2 or 3 triggers).

; Set Trigger Type - CONDITION 40
; Exporting: CONDITION(40:62) for PARAMETER(64)
; <#> : Local Byte Alfa1
; <&> : Variables. The <#>Numeric Variable is = than (E)Big Number value
; (E) : Value of Parameters=PARAM_BIG_NUMBERS at index= 0
; Values to add in script command: $8000, 64, $28

; Set Trigger Type - CONDITION 43
; Exporting: CONDITION(43:62) for PARAMETER(65)
; <#> : Local Byte Alfa2
; <&> : Variables. The <#>Numeric Variable is = than (E)Value
; (E) : Value= 0
; Values to add in script command: $8000, 65, $2B

So, if Lara’s just not hanging then GlobalTrigger#6 runs the “timer” in Local Byte Alfa2 – the same way as GlobalTrigger#1 does: adding number 1 to it, at each frame. – But this time 1 will be added to that variable if Lara’s not hanging while GlobalTrigger#1 does that when Lara’s hanging.
So, with GlobalTrigger#1 you control the timer for decreasing strength, but with GlobalTrigger#6 you control the timer for increasing strength.

The “more simply part” of that is what TriggerGroup#15 will cause: it adds number 1 to Local Byte Alfa2 always when Local Byte Alfa1 (the strength) is anywhere between 0 and 99 (including 0 and 99 itself). So Local Byte Alfa2 reaches 30 again and again, from 0 % strength to 99 % strength – and that’s what TriggerGroup#10 will use (see above) to increase Local Byte Alfa1 by 3 % per second.

As I said above, “I skipped some factors in the setup”. One of them is about a small cheat with the timer:
Let’s see an example: the hanging Lara’s strength is just 60 and the timer has just counted from 0 to 25 when the player releases the ledge and Lara falls down. So GlobalTrigger#6 starts, i.e. it also adds 1 and 1 and 1 etc. to the timer. That’s why that becomes 26, 27, 28, 29, 30 – and then TriggerGroup#10 increases the strength from 60 to 63.
And that is a “skipped factor”. - I mean, yes, there are 30 frames, 1 second between 60 and 63, but not all that 30 frames were spent having increasing strength. Only 5 frames were. And that is illogical a bit.

I told all of that only to understand the next part of the description:

When Lara’s not hanging and she has her full hanging strength, then Local Byte Alfa1 (the strength) is 100 %, and Local Byte Alfa2 (the “timer”) is not running, having its starting value 0 continuously. – Naturally, mostly that’s the situation when the player is playing.
So, with full strength, not hanging, Local Byte Alfa1 is 100 and Local Byte Alfa2 is 0. That’s why GlobalTrigger#6 is not allowed to detect those values. (Because, why should it increase the strength when that is full?) I mean, if TriggerGroup#10 turns the strength into 100 and turns the timer into 0, then nothing happens, because GlobalTrigger#6 won’t care about these values. – So this is the way to stop the increasing strength when that has just reached the full strength!

But we need GlobalTrigger#6 values for the increasing strength when the strength is 100 and the timer is NOT 0. – That condition is defined in TriggerGroup#16.

Wait a minute! It means increasing strength with 100 % value! 100 % means full, how can it be “increasing”?
Well, it is logical – though it’s very technical:
Let’s see an example: Lara has full strength, 100 %, and she’s not hanging, so the timer won’t move, i.e. Local Byte Alfa2 is 0. Then she jumps up to grab a ledge. The timer starts: 1, 2, 3 etc. But Lara will hang only for some short moments, because the player releases CTRL, when the timer reaches 17, so Lara will fall down.
So the strength is still 100 – but technically it’s not full, I mean it starts the increasing procedure now, because Lara is weaker now by 17 frames than the full strength. It means GlobalTrigger#6 starts adding 1 and 1 and 1 etc. to the timer now (18, 19 etc.). When the timer reaches 30, TriggerGroup#10 turns the timer into 0, and doesn’t let 100 % strength to be 103. (That’s why I said at the description of TriggerGroup#10 that 100+3 problem exists but TriggerGroup#10 will solve that as well.) – And now we reached the “Local Byte Alfa1=100 and Local Byte Alfa2=0” case again, the strength is full and not changing.


6.6. Removing the bar

If the increasing bar reaches the full strength, that will disappear off the screen (until it appears on the screen again, because Lara is hanging again).
It’s GlobalTrigger#7 that will clear the bar off the screen, with an Organizer.
The Organizer is needed, because without that, the bar will disappear exactly at the moment when it reaches 100 %. And that is ugly. That’s why the Organizer will remove the bar 1 second after reaching 100 %.

GlobalTrigger#7 uses TriggerGroup#17 as a condition. If TriggerGroup#17 is true, then TriggerGroup#18 will happen, starting Organizer#1.

; Set Trigger Type - FLIPEFFECT 127
; Exporting: TRIGGER(1:0) for FLIPEFFECT(127)
; <#> : Organizer. Enable <&>Organizer
; <&> : Organizer= 1
; (E) :
; Values to add in script command: $2000, 127, $1

“If TriggerGroup#17 is true” means if Local Byte Alfa1 is the value of PARAM_BIG_NUMBERS field#0, i.e. 100 ($8000, 64, $28) and if Local Byte Alfa2=0 ($8000, 65, $2B) – so, “if the increasing strength has reached its maximum”, thanks to TriggerGroup#10, then we don’t need the bar on the screen any more, that’s why the Organizer starts, to remove it.
Organizer#1 starts TriggerGroup#19 after 1 second. TriggerGroup#19 contains the bar-removing trigger, that’s why the bar will be removed 1 second after starting Organizer#1.

; Set Trigger Type - FLIPEFFECT 332
; Exporting: TRIGGER(4:0) for FLIPEFFECT(332)
; <#> : Custom Bar. Hide the <&>Custom bar
; <&> : BAR_CUSTOM1
; (E) :
; Values to add in script command: $2000, 332, $4

The GlobalTrigger#7 has an FGT_SINGLE_SHOT_RESUMED flag. It’s important, because of technical reasons. (Without that flag, the bar would remain on the screen when the bar reaches its maximum. Because, without that, the game states at each frame – when the condition is true – that “remove the bar not now, but only after 1 second”.)


6.7. The sound signal

GlobalTrigger#8 controls the procedure, making the game play “beep” sounds when Lara’s just hanging and the strength is too low.
The beep plays in each second when Lara has maximum 5 seconds before her strength runs out. – That’s why the beeping starts in different strength percents at the different cases:

- In Case A, the change is 4 %, that’s why the beeping must be started just below 20 %, because 4 %×5 seconds=20 %.
- In Case B, the change is 2 %, that’s why the beeping must be started just below 10 %, because 2 %×5 seconds=10 %.
- In Case C, the change is 1 %, that’s why the beeping must be started just below 5 %, because 1 %×5 seconds=5 %.

Let’s see for example Case A to make it clear:

The decreasing bar reaches 24 %.
Then the decreasing bar reaches 20 %. After that, the first beep plays.
Then the decreasing bar reaches 16 %. After that, the second beep plays.
Then the decreasing bar reaches 12 %. After that, the third beep plays.
Then the decreasing bar reaches 8 %. After that, the fourth beep plays.
Then the decreasing bar reaches 4 %. After that, the fifth beep plays.
Then the decreasing bar reaches 0 %. Lara falls down.

As you see, the beep won’t play when the bar reaches a given percent, but will play when the timer is - exactly - between two given percents. (I mean, if the timer – running always from 0 to 30 frames - reaches always 15 frames.) Why? Because it seems a bit buggy if I try to play that sound exactly when the percent changes.

The condition of Case A is defined in TriggerGroup#22: if the strength (Local Byte Alfa1) is smaller than 20 and if Lara’s performing a Case A animation of TriggerGroup#1 ($8000, 1, $F).

; Set Trigger Type - CONDITION 42
; Exporting: CONDITION(42:22) for PARAMETER(64)
; <#> : Local Byte Alfa1
; <&> : Variables. The <#>Numeric Variable is < than (E)Value
; (E) : Value= 20
; Values to add in script command: $8000, 64, $142A

The condition of Case B is defined in TriggerGroup#23: if the strength (Local Byte Alfa1) is smaller than 10 and if Lara’s performing a Case B animation of TriggerGroup#2 ($8000, 2, $F).

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

The condition of Case C is defined in TriggerGroup#24: if the strength (Local Byte Alfa1) is smaller than 5 and if Lara’s performing a Case C animation of TriggerGroup#3 ($8000, 3, $F).

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

TriggerGroup#20 merges the three conditions, saying: if either TriggerGroup#22 is true ($8000, 22, $F), or TriggerGroup#23 is true ($8000+TGROUP_OR, 23, $F), or TriggerGroup#24 is true ($8000+TGROUP_OR, 24, $F) – and, of course, if the “timer” (Local Byte Alfa2) is just 15.

; Set Trigger Type - CONDITION 43
; Exporting: CONDITION(43:32) for PARAMETER(65)
; <#> : Local Byte Alfa2
; <&> : Variables. The <#>Numeric Variable is = than (E)Value
; (E) : Value= 15
; Values to add in script command: $8000, 65, $F2B

GlobalTrigger#8 uses TriggerGroup#20 as a condition: if that is true, then TriggerGroup#21 (i.e. playing the “beep”) will happen. – I mean, if Lara’s hanging and her strength is under a given percent, then you will hear a beep in every second, until her strength has just totally run out.

; Set Trigger Type - FLIPEFFECT 70
; Exporting: TRIGGER(8048:0) for FLIPEFFECT(70)
; <#> : Sound. Play <&>Sound sample of first group (0-255) for (E) time
; <&> : TICK_TOCK 112 Ok tick
; (E) : Perform one single time
; Values to add in script command: $2000, 70, $1F70


6.8. Eating chocolates

First of all, you need a usual Script entry for the chocolate bar (i.e. PUZZLE_ITEM4):

Puzzle= 4, Chocolate Bar, $0009, $0300, $0000, $0000, $0000, $0002

GlobalTrigger#9 is a GlobalTrigger that is always true (see: GT_ALWAYS). So it performs TriggerGroup#25 at every frame of the level: it copies the actual amount of PUZZLE_ITEM4 chocolate bars in the inventory into Global Byte Alfa1 variable. - Thanks to the continuous performing, if Lara picks up a bar or “eats” one, the new amount will be realized at once in the variable.

; Set Trigger Type - FLIPEFFECT 244
; Exporting: TRIGGER(11008:0) for FLIPEFFECT(244)
; <#> : Variables. Memory. Copy to <&>Numeric Variable the (E)Savegame Memory value
; <&> : Global Byte Alfa1
; (E) : Inventory. Puzzle Item 4 (Byte)
; Values to add in script command: $2000, 244, $2B00

GlobalTrigger#10 controls what will happen if Lara eats a chocolate. “Eating” means the conditions in TriggerGroup#26 are true. The “happenings” are defined in TriggerGroup#27.

These are the conditions in TriggerGroup#26:
If the player has just hit key C and if Local Byte Alfa1, the strength is smaller than the value of PARAM_BIG_NUMBERS field#0 (i.e. 100) - i.e. if the variable is 99 at most – ($8000, 64, $27) and if Global Byte Alfa1 is bigger than 1 or equal with 1.

; Set Trigger Type - CONDITION 12
; Exporting: CONDITION(12:60) for PARAMETER(46)
; <#> : KeyC
; <&> : Keyboard. <#>keyboard scancode is currently (E)
; (E) : ACTIVE (Single shot for positive condition)
; Values to add in script command: $8000, 46, $10C

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

So TriggerGroup#26 says this:
We could encounter more problems if we wanted to use a PUZZLE_ITEM4 chocolate from directly the inventory. (For example, there is no hole for this puzzle item.) So this time, “if I hit key C” (“C” – Chocolate) means “if I used a chocolate from the inventory”. – But only:

- If the strength is not full, maximum 99. (Because we don’t want Lara to eat a bar when she doesn’t need that. That would be illogical. – Anyway, this is similar to the case of medipacks: you can’t use a medipack when Lara is totally healthy.)
- And if there is at least one chocolate bar in the inventory. (Without $8000, 0, $129 condition, hitting C won’t detect if you run out of the bars, and it will give Lara extra strength – though the amount of the bars is 0 both in the inventory and in Global Byte Alfa1.)

These are the “happenings” in TriggerGroup#27:
The game subtracts one bar from the actual inventory amount of the chocolate bars

; Set Trigger Type - FLIPEFFECT 49
; Exporting: TRIGGER(3:0) for FLIPEFFECT(49)
; <#> : Inventory-Item. Decrease (-1) number of <&>inventory-item in inventory
; <&> : PUZZLE_ITEM4 Slot=178
; (E) :
; Values to add in script command: $2000, 49, $3

and:

- If Local Byte Alfa1, the strength is smaller than the value of PARAM_BIG_NUMBERS field#2 (i.e. 51) then adds 50 percent to the strength.

; Set Trigger Type - CONDITION 39
; Exporting: CONDITION(39:58) for PARAMETER(64)
; <#> : Local Byte Alfa1
; <&> : 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, 64, $227

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

- Or, if Local Byte Alfa1, the strength is bigger than the value of PARAM_BIG_NUMBERS field#2 (i.e. 51) or equal with that, then makes the strength full, i.e. 100 % ($2000, 232, $6440).

; Set Trigger Type - CONDITION 38
; Exporting: CONDITION(38:58) for PARAMETER(64)
; <#> : Local Byte Alfa1
; <&> : 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, 64, $226

Thanks to those two PARAM_BIG_NUMBERS type conditions, Lara will get 50 % extra strength, when the strength is maximum 100 % after that, but if her actual strength is between 51 and 99 % (including 51 and 99 itself) then she can’t get 50 % extra strength, because in that case her strength would exceed 100 % after that (and that is illogical, of course) - instead of that, she will get exactly as much extra strength as she needs to 100 %.

One more thing:
GlobalTrigger#10 has an FGT_SINGLE_SHOT_RESUMED flag. If it hadn’t, then the game adds extra strength at each frame when key C is pressed.
It will clear with an example:

Good result with FGT_SINGLE_SHOT_RESUMED:

Strength is 25 %.
Player hits key C. - Frame#1: 25+50=75 %. Minus 1 chocolate bar.
The key is still pressed at frame#2: nothing happens.

Bad result without FGT_SINGLE_SHOT_RESUMED:

Strength is 25 %.
Player hits key C. - Frame#1: 25+50=75 %. Minus 1 chocolate bar.
The key is still pressed at frame#2: 75 % will become 100 %. Minus 1 chocolate bar.

Naturally, the reaction time of the player can’t be so perfect that (s)he will release key C after only one frame. That’s why if (s)he presses key C at 25 % strength, without that flag, then (s)he will notice very soon that Lara has got 75 % extra strength, and not 50 %, and two chocolate bars has been eaten by hitting C only once.

Note:
In this setup I let Lara have some (5) chocolate bars in the inventory when the game starts:

Equipment= PUZZLE_ITEM4, 5


6.9. Troubleshooting

The other parts of the setup are “only” for troubleshooting:

Trouble#1:
As we know, that’s what will happen if Lara dies:

1. The dying animation starts.
2. Then the dying animation finishes, Lara’s dead now.
3. Then some seconds elapse before the game starts automatically loading into the title level.

But let’s think about these cases:

- She dies when she is just hanging. She falls down automatically, and the strength bar – decreasing so far – starts increasing (because she’s just not hanging), until reaches 100 %. (Or until the game starts loading.)
- She dies when she is just not hanging. But she was hanging just some seconds ago, so there’s just an increasing strength bar on the screen. Now that continues increasing, until reaches 100 %. (Or until the game starts loading.)

So, if Lara’s dead body is just lying on the floor, you can encounter an increasing bar.
This is illogical, of course. Dead people can’t get any strength. – So we need to do something that will remove the bar off the screen, just when the dying animation starts.
GlobalTrigger#11 will do that. I mean, if Lara has lesser life points (see: GT_LARA_HP_LESS_THAN) than 1, then the GlobalTrigger starts TriggerGroup#19 – and that TriggerGroup, as we know now, removes the bar.
(“Lesser life points than 1” is not the same as “0 life point”. Because:

- “Lesser than 1” means “it has become 0 exactly just in this moment”, so it means the dying animation has just started.
- We can’t use the “exactly dead” - i.e. “0 life point” - condition, because neither local nor global triggers can be activated if Lara is dead, having finished her dying animation.)

Trouble#2:

I think we push the limits using the setup of the strength bar.
I mean I realized sometimes – but only sometimes - the timer (Local Byte Alfa2) won’t be turned into 0 when it reaches 30, but continues running calmly: 31, 32, 33 etc., ignoring the commands in the setup, not changing the percent. (I think “sometimes” means now if you change too often and too fast between the hanging/non-hanging animations.)
GlobalTrigger#12 will solve that problem: uses TriggerGroup#28 as a condition. If TriggerGroup#28 is true, then TriggerGroup#29 will happen. – So, if Local Byte Alfa2 runs over 30, reaching 31, then Local Byte Alfa2 will be put back into 29 – but not stopping the timer, so that will be 30 at the next frame to change the percent value.
(Yes, not 30 but 29. If we put it back into 30 then maybe it won’t be turned into 0 at once, but will run again into 31 again.)

; Set Trigger Type - CONDITION 43
; Exporting: CONDITION(43:0) for PARAMETER(65)
; <#> : Local Byte Alfa2
; <&> : Variables. The <#>Numeric Variable is = than (E)Value
; (E) : Value= 31
; Values to add in script command: $8000, 65, $1F2B

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

Note:
I think this is an old TRLE bug I can’t prevent it now in the setup:
If Lara leaves a polerope (jumping/falling down from it) then maybe the player can’t use CTRL after that. (And maybe SPACE, either, if Lara starts running now.)
After that, the player is able to prevent the bug in more ways, using miscellaneous (?) key combinations. For example, if (s)he makes Lara stop, and then uses SPACE to draw weapons. – After that, the CTRL will be usable again.


Made using TRNG 1.2.2.6
AkyV is online now  
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 22:00.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2017, vBulletin Solutions Inc.