The NGLE Manual
Hanging
Strength for Lara as TR6
By AkyV
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
Back to Top