Hanging Strength for Lara as TR6
by
AkyV
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: