Memory Zones
by
AkyV
Which variable should
I use for a field?
What should I do if I want to put the value of a variable into a field
(in Case A )?
What should I do if I want to put the value of a field into a variable
(Case B )?
Item Memory Zone
fields
Savegame Memory
Zone fields
Code Memory Zone
fields
Slot Memory Zone fields
Animation Memory Zone fields
Inventory Memory Zone fields
Addendum
* Please note that there is a new tutorial containing fresher data available, which contains special information only contained there. Consider this tutorial for advanced level builders while the new tutorials were written for level builders looking for information quickly. Find the new tutorial here.
First of all, read the
variable tutorial by Paolone to understand the variables and these
phrases:
- memory zones and
- fields of memory zones
So,
every memory zones have several fields. In each field, the game contains
the value of a given property of the game. You can use the fields for
two purposes:
- Put the value of a variable into a field. The
property of that field will use that new value, so the property will
change. - It is useful if you don't have a direct method to change that
value. (For example, at the moment you don't have a Script command or a
trigger to change the inventory coordinates of a weapon directly - but,
using fields, you will be able to do that.) - Hereafter I call this
purpose 'Case A'.
- Put the value of a field (i.e. a value of a
property) into a variable, to examine the value in the variable. - It is
useful if you don't have a direct method to examine the value of the
property. (For example, at the moment you don't have a CONDITION trigger
or a MultEnvCondition/GlobalTrigger Script situation to examine directly
how many liters of water Lara just has in the waterskins - but, using
fields, you will be able to do that.) - Hereafter I call this purpose
'Case B'.
So, in this tutorial, I will look through all the
memory zone fields to show you how you can use them for Case A or B.
Note - things that won't be discussed in this tutorial:
1. There are 'alternative versions' of Case B. I mean, when you use
the values not for a condition but something else. For example, you put
the value of a field into a variable, and then show that variable value
in a customized bar. Or print on the screen. Etc.
2. Though we are
talking about variables and memory zones at the same time now, the
connection between them is not constant. Because:
- For example,
you can use a 'Variables. Numeric' FLIPEFFECT trigger to define a value
of a variable, and then you can use a 'Variables' CONDITION trigger to
compare that variable value to another number. - As you see, now you
didn't use a memory zone field at all.
- For example, you will use a
'Variables. Memory. Set in' FLIPEFFECT trigger to define the value of a
field, using directly a given number. - As you see, now you didn't use a
variable at all. (Though, if you want, you can use Case A's the way like
that. I.e. forcing a given number into a field, and not forcing a value
of a variable into that field.)
Which variable should I use for a field?
You will
use some 'Variables. Memory' FLIPEFFECT trigger to put the value of a
variable into a field (in Case A ) or to put the value of a field into a
variable (in Case B ). Those FLIPEFFECT triggers will always offer these
variables to use:
Current Value
Global Byte Alfa1-4, Beta1-4,
Delta1-4
Global Long Alfa, Beta, Delta
Global Long Timer
Global
Short Alfa1-2, Beta1-2, Delta1-2
Last Input Number
Local Byte
Alfa1-4, Beta1-4, Delta1-4
Local Long Alfa, Beta, Delta
Local Long
Timer
Local Short Alfa1-2, Beta1-2, Delta1-2
It doesn't matter
which variable you'll choose for the field - if you don't forget about
these things:
1. The variables named 'Local' will lose their
actual values
- if you modify them or
- if Lara jumps into
another level (Level B ) from the level (Level A ) where you defined
that variable. (So each level has its own local variables, and all of
those variables have 0 default values when that level starts.) - But if
Lara gets back to Level A, then the local variables will get back the
values automatically that they lost at the level jump.
The
variables named 'Global' will lose their actual values only if you
modify them. (The default values of all of the global variables are 0.)
- But be careful with ResetHUB Script command that may annul your values
in global variables when leaving the level.
Current Value and
Last Input Number are global variables.
2. 'Byte', 'short' and
'long' mean the number interval the variable is able to handle:
-
The value of a 'byte' variable must be always between 0 and 255.
-
The value of a 'short' variable must be always between -32 768 and 32
767.
- The value of a 'long' variable must be always between -2 147
483 648 and 2 147 483 647.
Important!
You have to observe
these rules:
- If you use a 'Long' variable for a field then you
can't use (for any other purposes in the game) other variables with the
same locality ('same locality' means if these variables are all local
variables OR if they are all global variables) AND the same Greek
alphabet letter (alpha, beta, delta) at the same time. (So, for example,
you can't use Global Long Beta with Global Short Beta1 at the same time.
But you can use Global Long Beta with Local Long Beta or Global Long
Alfa or Local Short Beta2 or Global Byte Delta4 or Current Value or
Global Long Timer etc. at the same time in your game.)
- If you use a
'Short1' variable then you can't use 'Long' or 'Byte1' or 'Byte2'
variables with the same locality and the same Greek alphabet letter at
the same time.
- If you use a 'Short2' variable then you can't use
'Long' or 'Byte3' or 'Byte4' variables with the same locality and the
same Greek alphabet letter at the same time.
- If you use a 'Byte1'
or 'Byte2' variable then you can't use 'Long' or 'Short1' variables with
the same locality and the same Greek alphabet letter at the same time.
- If you use a 'Byte3' or 'Byte4' variable then you can't use 'Long' or
'Short2' variables with the same locality and the same Greek alphabet
letter at the same time.
Current Value and Last Input Number
are working as 'Long' variables.
3. The 'byte', 'short' and
'long' words in the names of the fields indicate the number the field
may have.
For example, if you can see the 'short' word in a field
name then that means the smallest expected value in that field is -32
768 and the biggest expected value in that field is 32 767.
So, if
you have a field with 'short' word then it's highly recommended to use a
'short' or a 'long' variable for that field, because 'byte' variables
can't handle the value of the field if that is between -32 768 and 0 or
if that is between 255 and 32 767.
4. If you use a variable for a
given task in your level then you can't use that variable for another
task in your level at the same time.
But if you don't use a variable
for a given task in your level then you can use that variable for
another task in your level at the same time.
(It also means:
-
if you don't use a variable for a given field at the moment, because you
will do that only later, then you can use that variable for any other
thing now,
- if you don't use a variable for a given field at the
moment, because you did that only before, then you can use that variable
for any other thing now.)
5. Special variables:
- If it is
not needed then don't use Current Value variable for a task if you can
use another variable for that task. Why? Because - as you see in some
FLIPEFFECT or CONDITION triggers - there are some special tasks in which
you can use ONLY Current Value variable. (I mean, if you use Current
Value for a task in which you can use any other variable, then you can't
use Current Value for a special task at the same time.)
- Last Input
Number is the number you typed last in your keyboard. (It works only
with keypad switch at the moment.)
- Local/Global Long Timer values
are values of the timers you can adjust by 'Variables. Timer' FLIPEFFECT
triggers. (These timers have nothing to do with any other timers of the
game.) - 1 second means Value 30 in the variable.
Notes:
1. The 'local/global' type of a variable and the local/global effect of
it in the fields is not the same. - See two examples to understand:
a, The amount of the big medipacks is a global value, because, if
you have X amount of big medipacks at the end of Level A, then you also
have X amount of big medipacks of the start of Level B, if you jump at
the end of Level A to the start of Level B.
So, if you use a local
variable to define X medipacks at the end of Level A, and you jump to
Level B, then the amount of the medipacks willl remain X - though that
local variable will become 0 at the start of Level B.
b, The Speed
value of an animation is always a local value, because every Speed value
is defined by the WAD of the actual level (see the Speed boxes in
Animation Editor of WADMerger). - But there's a possibility to modify
Speed by variables:
Let's suppose, you have the same Lara-animation
in Animation X slots of Level A and the following Level B, so the Speed
values of both of them are Value Y. You will define Value Z in a global
variable in Level A, and use a trigger to put that value in a field to
turn the Speed of Animation X in Level A from Value Y into Value Z. But,
if you jump to Level B, the WAD of Level B will turn back the speed into
Value Y - though the value of the global variable will remain Z. (So, if
you want Value Z in Level B, then you need to put that global variable
value into that field again, in Level B.)
2. Every procedure has
its own variable values. So Profile A (the game of Person A ) will have
other variable values, compared to Profile B (the game of Person B ).
But, unfortunately, it also means if you define a global variable value
in title then you can't carry it into your game, because 'starting a new
game from title' means 'starting a new procedure'.
What should I do if I want to put the value of a variable into a field
(in Case A )?
Using Item Memory Zone
1. The
subject of this memory zone is always a given Moveable object placed in
your level. You will define that object, using A54 trigger.
2. Then
use one or more 'Variables. Numeric' FLIPEFFECT triggers to define a
value in a variable.
3. Then use F257 trigger to set the value of the
variable, in the field that is defined in Window E of the trigger.
Now the property of that field changes, using its new value.
Using Savegame Memory Zone
1. Use one or more 'Variables.
Numeric' FLIPEFFECT triggers to define a value in a variable.
2. Then
use F245 trigger to set the value of the variable, in the field that is
defined in Window E of the trigger:
Now the property of that field
changes, using its new value.
Using Code Memory Zone
1.
Use one or more 'Variables. Numeric' FLIPEFFECT triggers to define a
value only in Current Value variable.
2. Then use F278 trigger to set
the value of the variable, in the field that is defined in Window & of
the trigger:
Now the property of that field changes, using its new
value.
Using Slot Memory Zone
1. The subject of this
memory zone is always a given Moveable object slot of your WAD. You will
define that slot, using F292 trigger.
2. Then use one or more
'Variables. Numeric' FLIPEFFECT triggers to define a value in a
variable.
3. Then use F294 trigger to set the value of the variable,
in the field that is defined in Window E of the trigger.
Now the
property of that field changes, using its new value.
Using
Animation Memory Zone
1. The subject of this memory zone is
always a given absolute animation of your WAD. You will define that
animation, using F307 trigger.
2. Then use one or more 'Variables.
Numeric' FLIPEFFECT triggers to define a value in a variable.
3. Then
use F296 trigger to set the value of the variable, in the field that is
defined in Window E of the trigger.
Now the property of that field
changes, using its new value.
(The absolute number of an
animation is the position of the animation amongst all the object
animations of your WAD.
To understand what the absolute animation is,
see this example:
Naturally there are both LARA and PISTOLS_ANIM
objects in your WAD. LARA object of the WAD has the lowest slot ID: 0.
PISTOLS_ANIM has the next slot ID: 1. LARA has the lowest ID, so her ID0
animation is the ID0 absolute animation of the WAD.
Usually LARA's
last animation has ID444, so it is ID444 absolute animation of the WAD.
There's no more animation for Lara now, so the next absolute animation
index will be the lowest animation number of the next - used - object
slot: Animation0 of ID1 PISTOLS_ANIM. It is the ID445 absolute
animation, and, naturally, Animation1 of PISTOLS_ANIM is the ID446
absolute animation etc. - Use 'NG Center\Tools\Animation Watcher\Show
PRESENT ANIMATIONS for current slot' to know the absolute animation
numbers of a given object slot of your WAD.
However, as my
experiences indicate, only the animations of LARA object will work
properly in Animation Memory Zone operations.)
Using Inventory
Memory Zone
1. The subject of this memory zone is always a given
inventory item slot (whether the WAD just has that slot or not). You
will define that slot, using F335 trigger.
2. Then use one or more
'Variables. Numeric' FLIPEFFECT triggers to define a value in a
variable.
3. Then use F336 trigger to set the value of the variable,
in the field that is defined in Window E of the trigger.
Now the
property of that field changes, using its new value.
The
recommended methods to force a value into a field:
1. Place an
F118 trigger (as 'Single performing') to activate all the needed
triggers at once, as a TriggerGroup. For example, in the case of Item
Memory Zone, you will place an A54 trigger, 'Variables. Numeric'
FLIPEFFECT triggers and an F257 trigger in the TriggerGroup in the
Script. (When you place those triggers in the TriggerGroup in the
Script, don't forget to place F257 trigger at the last place in the
range of the triggers - so that is the last trigger that will be
activated in that TriggerGroup. Which is important.) You may place one
or more CONDITION triggers before A54 in the TriggerGroup, if you want
the activation only under some circumstances (now F118 must be 'Multiple
performing').
2. Use a TriggerGroup, but don't place an F118 in Room
Editor. Instead of that, place that TriggerGroup in a GlobalTrigger in
the Script (in IdPerformTriggerGroup field), and the condition in the
GlobalTrigger will activate the TriggerGroup.
Notes:
1.
See further 'Variables. Memory' FLIPEFFECTs. Using them (together with
'Variables. Numeric' FLIPEFFECT triggers), you will be able to make
further operations on the new value of the field, modifying that value.
(See for example 'Variables. Memory. Subtract' triggers.)
2. When
you define the subjects of the memory zones (Item, Slot, Animation or
Inventory Memory Zone) then you will always define a given subject by
the triggers I mentioned above.
But, using some Savegame Memory Zone
fields, the actual value of the field will be the actual subject of
those zones. - The fields are:
- TRNG Index. Animation Index for
Selected Animation Memory (Short)
- TRNG Index. Item Index for
Selected Item Memory (Short)
- TRNG Index. Slot Index for Selected
Slot Memory (Short)
See more about them below.
Inventory
Memory Zone doesn't have a field like that.
(I will write
sometimes below that you don't need to use a given field because you
have a direct method for that forcing operation. But that's not true if
the operation has an inconstant subject, because the direct methods
always work with a constant subject.
So, if you want an inconstant
subject for an operation, then define that subject by these 'TRNG
index,' triggers then use that subject in the given field, avoiding the
direct method.
And a similar thing: using any memory zones - so
even Savegame or Code Memory Zone - you can define different forced
values in another way, compared to as you can defined that with the
direct methods. - See an explanation of an example to understand:
Direct method:
Condition A is true, then triggering with value
100
Condition B is true, then triggering with value 200
Memory
zone method:
The value of Variable X is defined as Y.
Condition A
is true, then triggering with value Y+50
Condition B is true, then
triggering with value Y+150
As you see, the result of the methods
is the same only if Y=50. The triggering value is always 100 or 200 at
the direct methods but could be anything - i.e. 50 or 150 plus the
actual Value Y - with the memory zone methods.
So if you want a more
flexible value for the operation, then skip the direct method, and try
to use the memory zone method - even when I say you don't need the
memory zone method.)
3. If you defined a value in a variable but
you don't want to use it right now in a field, then store it in a Store
variable (by F236 trigger), so you can use it later (by F237 trigger).
4. Unfortunately, sometimes you may experience that memory zone
fields will lose the values you forced on them by variables:
-
sometimes at level jumps or
- sometimes, if you save the game and
then you will load that saved game.
If it happens or not, that
depends on which field you are using.
If you want to know more about
this problem, see this part in the variable tutorial of Paolone: The
wooden Door: how save and restore our changes.
(If you don't use that
variable for other purpose in that level, then it's a more simple method
if you force that value always into that field by a GT_ALWAYS
GlobalTrigger. - Or, if you don't want the value to be forced into that
field in the whole level, then disable the GlobalTrigger when that is
not wanted.)
5. Some fields cannot be forced, so you can't use
Case A with some fields.
What should I do if I want to put the value of a field into a variable
(Case B )?
Using Item Memory Zone
1. The
subject of this memory zone is always a given Moveable object placed in
your level. You will define that object, using A54 trigger.
2. Use
F256 trigger to put the actual value of a field (defined in Window E of
the trigger) into a variable.
3. Then use a 'Variables' CONDITION to
examine how the value of the variable (i.e. the actual value of the
field) is related to another value.
Using Savegame Memory Zone
1. Use F244 trigger to put the actual value of a field (defined in
Window E of the trigger) into a variable.
2. Then use a 'Variables'
CONDITION to examine how the value of the variable (i.e. the actual
value of the field) is related to another value.
Using Code
Memory Zone
1. Use F277 trigger to put the actual value of a
field (defined in Window & of the trigger) only into Current
Value variable.
2. Then use a 'Variables' CONDITION to examine how
the value of the Current Value variable (i.e. the actual value of the
field) is related to another value.
Using Slot Memory Zone
1. The subject of this memory zone is always a given Moveable object
slot of your WAD. You will define that slot, using F292 trigger.
2.
Use F293 trigger to put the actual value of a field (defined in Window E
of the trigger) into a variable.
3. Then use a 'Variables' CONDITION
to examine how the value of the variable (i.e. the actual value of the
field) is related to another value.
Using Animation Memory Zone
1. The subject of this memory zone is always a given absolute
animation of your WAD. You will define that animation, using F307
trigger.
2. Use F295 trigger to put the actual value of a field
(defined in Window E of the trigger) into a variable.
3. Then use a
'Variables' CONDITION to examine how the value of the variable (i.e. the
actual value of the field) is related to another value.
Using
Inventory Memory Zone
1. The subject of this memory zone is
always a given inventory item slot (whether the WAD just has that slot
or not). You will define that slot, using F335 trigger.
2. Use F339
trigger to put the actual value of a field (defined in Window E of the
trigger) into a variable.
3. Then use a 'Variables' CONDITION to
examine how the value of the variable (i.e. the actual value of the
field) is related to another value.
The recommended methods to
study a value of a field as a condition of some executable trigger(s):
1. Place an F118 trigger (as 'Multiple performing') to activate all
the needed triggers at once, as a TriggerGroup. For example, in the case
of Item Memory Zone, you will place an A54 trigger, an F256 trigger and
a 'Variables' CONDITION trigger in the TriggerGroup in the Script.
(Place CONDITION trigger at the last place in the range of the
triggers.) And then, also place one and more executable triggers in this
TriggerGroup (after CONDITION): these triggers will be activated, if the
condition will be true. (You may place one or more other CONDITION
triggers before A54 and F256: so the value of the field will be studied
only if those other conditions are true.)
2. Use a TriggerGroup, but
don't place an F118 in Room Editor. Instead of that, place that
TriggerGroup in a GlobalTrigger in the Script (in
IdPerformTriggerGroup), and the condition in the GlobalTrigger will
activate the TriggerGroup. (So the value of the field will be studied
only if the condition in the GlobalTrigger is true.)
Notes:
1. After you have put the field value into a variable, you don't
need to study it in a CONDITION trigger at once. I mean, maybe you want
to modify it before that study.
Let's see for example the case of
Item Memory Zone: use one or more 'Variables. Numeric' or 'Variables.
Memory' FLIPEFFECT triggers to modify the value you got by F256. Place
those Numeric/Memory triggers between F256 and the 'Variables' CONDITION
trigger in the TriggerGroup.
2. Item#2-#4 of the notes in Chapter
'What should I do if I want to put the value of a variable into a field
(in Case A)?' can be valid in the present chapter as well.
3.
Some fields are senseless to be studied, so you can't use Case B with
some fields.
4. F339 trigger probably doesn't work, so you can't
use conditions for Inventory Memory Zone fields. - Moreover, my
experience: if you use (some fields of) this trigger and Lara collides
with the objects then the game will crash.
(However, using conditions
for inventory items is not a really useful thing, so we don't lose much
if we skip this trigger.)
Item Memory Zone
fields
Animation Now (Number of current animation)
(Short)
It defines the actual animation of the subject (i.e. a
Moveable object). (Note: it works with absolute animation ID's.)
Case A: it seems buggy for me. So, if you want to force an animation on
Lara or another Moveable, then use A15, A16, A17 or F77, F80, F169,
F170, F171 triggers.
Case B: you don't need to use that, because if
you want to know if the actual animation of Lara or another Moveable is
a given animation, then use C21, C23, C24 or C30 triggers. (Please note
you can't examine an animation of Lara if that animation is not an
animation of the placed LARA object, but it's an animation of her from
VEHICLE_EXTRA or any other 'animation store' objects.)
Contact
Flags ($2400 = damage lara on touching) (Long)
It defines if Lara is
just colliding with a Moveable object or not. If the value is 0 then
she's not colliding, but if it is not 0 (but any other number) then
she's colliding. (In fact, it works in a different way at different
objects. I mean, the value will always be updated at creatures, but at
ANIMATINGs it will be updated only at newer collisions. It means, after
the first collision between them, the value will never be 0 again at the
given ANIMATING. And, for example, at traps this field seems not really
useful.)
Case A: there is only one case when it's worth forcing a
value here: it is Value 0 at creatures. The collision will happen now,
but Lara will be invulnerable against the given enemy. (You have F91
trigger if you want to force invulnerability on Lara. But that trigger
is general. I mean, if you want Lara to be invulnerable only against a
given enemy - the subject -, then put 0 into this field.)
Force the 0
continuously, i.e. using a GlobalTrigger, while the enemy is alive - or
till you want the invulnerability to work.
Please note it is useful
only at collision, i.e. at direct contact (eg. a sword hits Lara), so it
won't work if a bullet of the enemy hits Lara.
Case B: if the
'Variables' CONDITION trigger confirms the value is 0 then that is an
'if Lara is just not colliding with the subject Moveable' condition. If
that confirms the value is not 0 then that is an 'if Lara is just
colliding with the subject Moveable' condition. (See similar conditions
in "GT_COLLIDE" type GlobalTriggers or "Collision" tpye CONDITION
triggers.)
(That Value $2400 did not work for me the way as Paolone
wrote that.)
Custom Flags (Different flags in according with
object type) (Byte)
It tells you about the activity state of the
subject. (0: not activated/deactivated, 62: active, 191: dead enemy.)
Case A: you don't need to use that, because if you want to
trigger/antitrigger objects then you have a lot of other triggers for
that.
Case B: you don't need to use that, because C14 trigger will
examine if an object is active or not.
(Note: in C14, all the
conditions work for creatures - 'active' and 'living' seem to be the
same for them -, but use only 'active' and 'not active' conditions for
non-creature Moveable objects.
Important: if a non-creature doesn't
move after having been activated that doesn't mean it is 'not active'. I
mean, eg., if a door has opened or a boulder has stopped at the end of
its track, then they are active objects, because we didn't deactivate
them after activating them. So, use an antitrigger to close the door or
to make the stopped boulder do nothing - and now they are 'not active'
again.)
Custom_A (Different usage in according with type of item)
(Short)
The game calculates here some movement-related things of some
Moveable objects that are not creatures but more than simple ANIMATINGs.
Let's see how this works in the case of rollingball subjects:
The
game calculates here how many length units the moving rollingball
subject must 'travel' in the north or south direction (Room Editor
facing) in the given moment, until that stops. (Negative numbers= moving
northwards, positive numbers= moving southwards.) I think
(approximately?) 512 length units is 1 square now. (Naturally, the
bigger the number is the more the speed of the ball is.)
Case A:
the length will be calculated again and again, in every moment,
according to the actual speed and direction. That's why if you want to
force a value into this field, then you want to force it again and again
- or else the game will overwrite your new value at the next moment. -
So here's an example about what you should do - type a GlobalTrigger
into your Script:
GlobalTrigger= 1, FGT_DISABLED, GT_ALWAYS,
IGNORE, IGNORE, 1, IGNORE
TriggerGroup= 1, A54: the subject is the
rollingball, 'Variables.Numeric' FLIPEFFECTs: the variable value is
6144, F257: the field is this 'Custom_A,' field
In the game, the
ball has been activated and starts rolling southwards on a non-sharp
slope. It reaches a HEAVY trigger that enables GlobalTrigger#1.
6144(=12x512) means a big speed (because you need a big speed for a 6144
units long travel), so the ball will pushed southwards hard now. In the
next moments, the length is still 6144, so the ball remains fast. Later,
the ball reaches another HEAVY to disable GlobalTrigger#1, so the ball
moves 'in the regular way' again now, and will stop soon by itself.
Case B: it's hard to create a nice Case B condition, if the rollingball
has a complicated track. For example, if the ball moves southwards, but
a slope will divert it westwards, then the value of the field will
remain 0 continuously after that, saying 'the ball is still moving, but
will move neither northwards nor southwards from now on, until it
stops'.
But if the track is easy then the condition is clear. For
example, if the ball just rolls southwards and then stops, then 0
condition means 'if the ball stops' now.
(It is interesting to use a
non-0 value here. For example, -512 means 'if the ball stops in 1 square
distance'. - But, don't forget: values are calculated again and again,
so, if the speed and/or the direction changes during the 'traveling',
then the field may be -512 more than one time, during the 'traveling'.)
And now let's see a TEETH_SPIKES subject here:
Though this seems
a bit inaccurate statement now, the value in the field indicates how
many height units are between the actual positions of the tips of the
spikes and the totally extended positions of them - in which 1024=1
square, positive number: moving towards the bottoms of the spikes,
negative number: moving towards the tips of the spikes. (It doesn't
matter in which direction the spikes are indicating.)
The point is
the value is 1024 when the spikes are totally drawn back (even if they
haven't been activated), and 0 if they are totally extended.
Case
A: I don't think you should force the position on teeth spikes by this
field. If you want to do that then you'd better use 'Move' ACTION
triggers or similar Parameters Script commands.
Case B: the useful
values now seem to be 1024 ('if the spikes are totally drawn back' -
even if they are just active) or 0 ('if the spikes are totally extended'
- even if they are just active). (But be careful: each time the spikes
jumps out and back, they are extended twice, because they are 'bouncing'
a bit - see it in the game. So before they are drawn back, they will
reach the Position 0 twice.)
And now let's see a PUSHABLE_OBJECT
subject here:
Now this value here indicates the distance of the
object from a given base (in which 1024=1 square). Unfortunately, I
don't know where that base is exactly. (Maybe that is an east-west axis
of the Room Editor Window.)
Case A: the base is undetermined so
you'd better avoid forces coordinates on Pushable by this field.
Besides, use 'Move' ACTION triggers or similar Parameters Script
commands instead, to force the coordinates.
Case B: the base is
undetermined (so we can't really comprehend the values here - by the
way, if you need an 'if the PUSHABLE is in a given position' condition,
then use HEAVY/HEAVYSWITCH triggers, as usual). But the field will
always be refreshed if the player hits CTRL to make Lara push/pull the
object. - It means 0 is a useful value now. Why? Because, while Lara
doesn't push/pull the object at all, the value is 0. So Value 0 means an
'if Lara hasn't pushed/pulled this object before at all' condition.
Further values I experienced with some further objects (as you see
they are not always 'movement-related' things):
- BIRD_BLADE: 0:
inactive/just opening, 6: just closing.
- FLOOR_4BLADE: 30: blades
move upwards (both the first movement and when the blades will clap
together), 0: in any other cases.
- PUZZLE_HOLE: 1: if Lara is just
placing the puzzle item here, 0: in any other cases.
- STEAM_EMITTER
(with OCB values to blow the harmful, horizontal steam): 480xA+8 OCB
value is needed, in which A=the seconds of the pause. So, for example,
480x1+8=488 OCB means 1 second pause. This 1 second=30 frames will
appear in this field (as 30) and starts counting down.
-
FLAME_EMITTER: blowing a horizontal or vertical flame, also the same
type timer is in this field, as at STEAM_EMITTER (i.e. it's a pause
timer).
- EARTHQUAKE: the actual intensity of the earthquake. (109
seems the biggest one.) - Just think about this nice condition in a
GlobalTrigger: if the intensity of the earthquake is bigger than X then
the rollingball will fall down.
- AMBER_LIGHT: if the pulsing light
is active then the value runs continuously from -32768 to 32767, again
and again. (So each value means the actual degree of the pulsing
intensity.) - It changes Value 2048 after each frame. So each cycle is
32 frames long.
- WHITE_LIGHT: it's a timer, in frames. It starts
from 0 when the object is activated. When this 'neon light that starts
lighting in a blinking mode' lights continuously at last, then that
means the timer stops at 160, and remains that.
If you want to
know how other objects work in this field then follow these
instructions:
1. Create a GlobalTrigger. The condition is
GT_ALWAYS. And that is in the executable triggergroup: 'an A54 trigger
that defines the subject of the memory zone and then another trigger
(F256) that puts the actual value of this Custom_A field into a
variable'.
2. Enable Diagnostic mode and use DGX_COMMON_VARIABLES
DiagnosticType.
3. Build the Script and start the game and the level
with that object.
4. You can see a lot of variable values on the
screen, including the variable with the actual Custom_A value of the
subject item.
5. Activate the item or interact with it and see how
the variable (field) value will change (continuously) if the item does
this or does that.
But sometimes the value changes in the
variable too fast so you can't read the values from the screen. If you
encounter this, then you need to do some more things:
6. See the
ID of the variable (that you put the value of the field into) in NG
Center\Reference\Variable Placefolders. Put this ID into a (any) ExtraNG
String.
7. See the executable triggergroup of that GT_ALWAYS
GlobalTrigger. Put F308 trigger after F256 here, with that ExtraNG
String.
8. Build the Script.
9. Start TOMB4_LOG.exe from Tools
folder and then start the game and the level with that object. The
window of the log program is also on the screen now.
10. Activate the
item or interact with it - you can see: the variable (field) values are
changing not only on the screen but also in the log program window.
11. Quit the game and the log program.
12. Study the tomb4_log.txt in
Tools folder. This is the latest log file of the game (made by
TOMB4_LOG.exe just before) so you can examine the field values here.
(Each entry means a new frame. So you can see how the value changed
frame by frame.)
If you want to know more about this
diagnostic/log method, then read that in the 'How discover the sense of
some memory fields' chapter in the variable tutorial of Paolone.
(Naturally, the method is useful for other Item Memory Zone fields as
well.)
Custom_B (Different usage in according with type of item)
(Short)
It's similar to 'Custom_A,' field. - Let's see some examples:
- ROLLINGBALL: the horizontal 'travel' of the moving rollingball
eastwards (positive numbers) or westwards (negative numbers), with the
same units as above.
- TEETH_SPIKES: 0: the spikes are totally drawn
back, 5120: the spikes are totally extended. (So this is a similar thing
as at Custom_A, but the numbers are other numbers.)
-RAISING_BLOCK2:
0: the block is totally descended, 4096: the block is totally ascended
(i.e. 2048=ascended 1 square). - So, for example, forcing 6144 in Case A
into the field, the too extended block will be ascended 3 squares (12
clicks) - but the block loses the collision.
- STEAM_EMITTER: a
countdown timer in frames. It starts when the emitter starts blowing the
steam, and stops when it starts stopping blowing that.
-
FLAME_EMITTER: when it starts blowing a flame, then the value starts
running from 0 to -8192. When it starts stopping blowing flame, then the
value starts running from -8192 to 0. - It's the actual length of the
flown flame. (-8192=2 squares long.) You can't use positive number to
flow the flame in the opposite way.
- EARTHQUAKE: the actual
intensity of the earthquake, but not as precise as in Custom_A. I mean,
there are only two values now: 20: low earthquake, 100: high earthquake.
Custom_C (Different usage in according with type of item) (Short)
It is also similar to Custom_A.
For example, if you use a
PUSHABLE_OBJECT2 here, then you see here its distance from a given base
(which may be a north-south axis of the Room Editor Window this time)
again.
Or use TEETH_SPIKES here. When the 'bouncing' spikes reach
Position 0 (see above) at the second time, then a timer will start. It's
64 now (as frames) and counts down. The spikes will be drawn back, and
remains there until the timer reaches 0. Now the spikes jump out again.
Case A: for example, use this GlobalTrigger:
GlobalTrigger= 1,
IGNORE, GT_CONDITION_GROUP, IGNORE, 1, 2, IGNORE
TriggerGroup= 1,
A54: the subject is the TEETH_SPIKES object, F256: the field is
'Custom_A,' field (putting it into Local Short Alfa1), C43: 'if Local
Short Alfa 1 is 0'
TriggerGroup= 2, 'Variables. Numeric' FLIPEFFECTs:
the value of Local Short Alfa2 variable is 32, F257: the field is
'Custom_C,' field (putting Local Short Alfa2 into it)
(Note: in
TG2, the subject is still that TEETH_SPIKES, so we don't need to define
that again.)
That's what happens in the game now: the ascending
spikes reach Position 0 (see: if Local Short Alfa1=0). The GlobalTrigger
starts the timer (with 32 as a start value). But then the bouncing
spikes reach Position 0 again, so the timer starts again: 32, 31 etc. 32
is 50% of the original 64, so this TEETH_SPIKES object will jump
out/back twice fast, compared to the 'default TEETH_SPIKES speed'.
(Anyway, I think the 'bouncing part' has changed a bit now.)
(Note: if the timer is too short then there is no time for the spikes to
be drawn back totally. So they will be drawn back a bit - more or less
for halfway - and then jump out again.)
Case B: for example,
Value 30 means now an 'if the moving spikes have 1 second before the
next jump-out' condition. (Because 30 frames=1 second.)
An
example shows when the field doesn't indicate some movement-related
thing but something else:
Use a BADDY_1 here. (Yes, a creature!)
When he's not active then the field value is 24. Then he 'awakes' and
starts shooting Lara. Every time when he pulls the trigger, it subtracts
7 from that 24: 24, 17, 10, 3, -4 - and now he takes his sword.
Case
A: the baddy always stops shooting if his ammunition is not a positive
number. So, if we force Value 20 on him now, then he can shoot three
times before taking the sword: 20, 13, 6, -1. (Of course, you can give
much more ammunition to the baddy - forcing a big number in the field.
Or, force any number, but make it unchangeable by a GT_ALWAYS
Globaltrigger - and the starting ammo of the baddy will be unlimited.)
Case B: for example, not forcing any number in Case A, Value 10 means
now an 'if that BADDY_1 has shot twice at Lara just after having been
activated' condition.
Some other values:
- FLAME_EMITTER:
it's 256, with blown type flame, even if it is not activated. When the
emitter starts blowing, then it counts down to 0 fast. When the emitter
starts stopping blowing, then it counts to 256 fast.
- STEAM_EMITTER:
when the emitter starts blowing, then it counts from 0 to 4096. When the
emitter starts stopping blowing, then it counts down from 4096 to 0. -
It's the actual length of the flown steam. 4096=1 square long.
-
EARTHQUAKE: it's a countdown timer. It starts from a value, and,
reaching 0, it will start again from a different value. I think every
phase from the start point to 0 means an intensity range. (So when the
timer counts down the next phase from the start to 0 then the earthquake
will have another intensity range, with bigger or smaller quakes as in
the previous phase.)
Custom_D (Different usage in according with
type of item) (Short)
It is also similar to Custom_A. - Some
examples:
- BIRD_BLADE: from 0, the value becomes 100 'forever'
after the trap has been activated. (So, for example, Value 100 means an
'if the trap is active or deactive, but has been activated at least once
before' condition in Case B.)
- FOOR_4BLADE: from 0, the value
becomes 20 when the blades (moving upwards) stops first, and becomes 200
when they (moving upwards more) clap together. (It remains 200, and
repeats the sequence at newer activations: 20-200, 20-200 etc.)
-
CATWALK_BLADE: the value is 100 when the blades are just moving, in any
other cases it's 0.
- PLINTH_BLADE: from the start to the final stop
the value is 200, in any other cases it's 0.
- STARGATE: from 0, the
value becomes 50 'forever' after the trap has been activated. (So, for
example, Value 0 means an 'if the trap has never been activated'
condition in Case B.)
- FLAME_EMITTER: it's a countdown timer in
frames. It starts when the emitter starts blowing the flame, and stops
(reaches 0) when the emitter stops (totally) blowing the flame.
Facing Horizontal (Short)
Facing Rotation (Only for Lara) (Short)
Facing Vertical (Short)
There are some methods to turn the objects
around their axes (see: Turn ACTION triggers or Parameters Script
command). They are different type of rotations (more or less) that's why
they can have different effect on the different objects. It means, for
example, sometimes they don't really like affecting Lara. - But these
three 'Facing' fields are great tools to rotate Lara. So I'll show now
how they work with her (though you can try them with other objects).
a, 'Facing Horizontal' defines how Lara will be rotated around her
vertical axis.
Some accentuated values are:
Lara faces east
exactly (Room Editor facing) = 0 degrees turn (default state) = Value 0
($0000) = 360 degrees turn (full circle) = Value 65535 ($FFFF)
Lara
faces south exactly (Room Editor facing) = 90 degrees turn = Value 16384
($4000)
Lara faces west exactly (Room Editor facing) = 180 degrees
turn = Value 32768 ($8000)
Lara faces north exactly (Room Editor
facing) = 270 degrees turn = Vale 49152 ($C000)
(Note: see Lara
in the Animation Editor of WADMerger. As you see, Lara's face looks in
the different direction, compared to that long blue line. So, if you say
'an object faces east in Room Editor' that means 'the side of the object
that looks in the different direction, compared to that long blue line,
faces east in Room Editor'.)
Case A: an example - use this
TriggerGroup in the Script:
TriggerGroup= 1, A54: the subject is
Lara, 'Variables.Numeric' FLIPEFFECTs: the variable value is 16384,
F257: the field is this 'Facing Horizontal,' field
Let's suppose
Lara runs eastwards and then she steps on the square where an F118
activates this TriggerGroup. She will be rotated to face south at once -
but it doesn't mean the player loses the control on her so the player
can modify how she faces, at once, if (s)he wants.
And now, type this
GlobalTrigger into the Script:
GlobalTrigger= 1, IGNORE,
GT_ALWAYS, IGNORE, IGNORE, 1, IGNORE
So Lara will face south when
the level starts and the player can't modify it, because GT_ALWAYS will
force the south side again and again. (It doesn't mean the left or right
arrows are disabled. So if you hit left/right arrows then the game will
try to move Lara - but then nothing will happen.)
Case B: for
example, Value 32768 means an 'if Lara faces west exactly' condition.
b, 'Facing Rotation' defines how Lara will be rotated around her
horizontal axis that is perpendicular to her shoulders and drawn in the
level of her soles.
Some accentuated values are:
Lara
stands vertically exactly = 0 degrees turn (default state) = Value 0
($0000) = 360 degrees turn (full circle) = Value 65535 ($FFFF)
Lara
leans totally right = 90 degrees turn = Value 16384 ($4000)
Lara
stands upside down exactly = 180 degrees turn = Value 32768 ($8000)
Lara leans totally left = 270 degrees turn = Vale 49152 ($C000)
(Notes:
1. The game will correct the new position at once
automatically - back to the default one -, so you want to force it
continuously - by a GlobalTrigger - so Lara will hold the position.
2. If Lara is rotated then maybe some of her animations - for example:
doing interactions with objects - are impossible to do.
3. Hair
object may be buggy a bit with this kind of rotation.
4. When Lara
swims in water, then the field works in another way:
Facing
Rotation' defines how Lara will be rotated around her vertical axis - I
mean that is not vertical now, for example, if she swims forward under
water: now that is the longitudinal axis of her body.
Some
accentuated values are - supposing she swims forward under water:
Lara swims with her face down exactly = 0 degrees turn (default
state) = Value 0 ($0000) = 360 degrees turn (full circle) = Value 65535
($FFFF)
Lara swims with her face left exactly = 90 degrees turn =
Value 16384 ($4000)
Lara swims with her face above exactly = 180
degrees turn = Value 32768 ($8000)
Lara swims with her face right
exactly = 270 degrees turn = Vale 49152 ($C000)
5. Whatever the
field name says - 'only Lara' -, this field works well with other
objects.)
c, 'Facing Vertical' defines how Lara will be rotated
around her horizontal axis that is in the line of her shoulders and
drawn in the level of her soles.
Some accentuated values are:
Lara stands vertically exactly = 0 degrees turn (default state) =
Value 0 ($0000) = 360 degrees turn (full circle) = Value 65535 ($FFFF)
Lara leans totally back = 90 degrees turn = Value 16384 ($4000)
Lara
stands upside down exactly = 180 degrees turn = Value 32768 ($8000)
Lara leans totally forward = 270 degrees turn = Vale 49152 ($C000)
(Note: some 'serious state changes' - for example, jumping into deep
water - may annul the effect of the rotation, if you don't force it on
Lara continuously, by a GlobalTrigger.)
Flags of Item (Long)
This field shows lots of flags for the object. - Thanks to Paolone's
tutorial, (some of?) the flags are identified (renewed by me):
1
($0001): the object has been triggered and has not been killed. ('Kill'
doesn't mean 'antitriggered' now.)
2 ($0002): the object has the
collision.
4 ($0004): the object has not been triggered or has been
killed.
8 ($0008): the gravity affects the item (so it's just falling
down)
16 ($0010): the object is just being hit.
32 ($0020): the
object has not been killed.
64 ($0040): Paolone says it indicates if
an object has been killed by an explosion. According to my experiences,
that is wrong. I mean I experienced the independent (i.e. 'camera-less')
CAMERA_TARGET objects have this flag, if they are activated at least
once.
128 ($0080): supposedly an existing flag. But it's unknown.
256 ($0100): the object has been poisoned.
512 ($0200): the object is
in AI_GUARD mode.
1024 ($0400): the object is in AI_AMBUSH mode.
2048 ($0800): the object is in AI_PATROL mode.
4096 ($1000): the
object is in AI_MODIFY mode.
8192 ($2000): the object is in AI_FOLLOW
mode.
16384 ($4000): Paolone says it indicates if the object is
'self-created' such as GRENADE or CROSSBOW_BOLT. (I suppose FLARE_ITEM
is also one of them.) I can't examine that, because if I place an object
like that intentionally in the map (and then make it to be the subject
of the field) then the flag doesn't work.
The non-creature
objects use these flags in a bit peculiar way, so, I think it's better
if I talk about first how the creatures use the flags:
See a
simple case:
The aggregated flag value of the living creatures is
mostly 35, because:
1: they are living, and
2: they have their
collisions, and
32: they haven't been killed.
And 1+2+32=35.
If Lara shoots at an enemy and hits the target, then the creature
mostly has Value 51, because 16 (he's been hit)+35 (1+2+32)=51.
When
the enemy has been killed, his flag value is 4 mostly (and remains that
forever, of course, because the flags of a dead enemy will not change).
But he will take a situation flag on if he had that when he was killed.
I mean, for example, if a poisoned arrow of Lara poisons the creature,
then he will have 291 (256 'poisoned'+35 'lives') flag value, and then
he will die, having 260 (256 'poisoned'+4 'dead') flag value.
But, for example, what if the creature is alive, and keeping guard at an
AI_GUARD object? - Well, then he has Value 547, because 512 (AI_GUARD
mode)+35 (1+2+32)=547.
It's a bit complicated to understand the
value of the creature before he has been triggered.
I mean, mostly 38
is the flag value of a 'still not living' enemy, because:
2: he
has the collision, and
4: still not triggered, and
20: still not
dead.
Yes, he has the collision. I mean, creatures always have
their collisions if they are not killed. ('Die' means, actually: he is
frozen at the last frame of his dying animation, he loses his collision,
and he becomes invisible, having Value 4 flag.) So, if they are not
triggered, they have collision, but the collision won't be realized
until triggering the creature, so Lara won't bump into a non-triggered,
invisible creature.
(Naturally, for example, if a 'still not
living' enemy is placed on a square with an AI_GUARD object, then he
will have the 512 'AI_GUARD'+38= 550 flag value.)
Case A: for
example, if the creature keeps guard at an AI_GUARD point with 547 flag
value, you will force Value 35 on him, dropping the 512 'AI_GUARD' flag.
So the creature will leave his post - though Lara has not disturbed him,
being too far away from him.
(But don't forget two things: not all
the flags or flag-combinations can be forced, and don't force flags on
an object, if the object is not active.)
Case B: for example, Value
51 means an 'if the enemy has just been hit' condition or Value 260
means an 'if the enemy is dead, but he was poisoned' condition. (It's
not sure that he was killed by the poison. I mean, for example, Lara
poisoned him and then drew Uzis to make him die sooner.)
Other
remarks about creatures:
- Some creatures will use not Value 38
but 32 ('has not been killed') before being activated. These are the
creatures that are visible before activation (eg. skeletons lying on the
floor - i.e. with Value 3 in the OCB window -, or wraiths if you forget
to hit 'Invisible' button on the OCB panel) or the emitter creatures
(such as scarabs, locusts etc.).
- Hit (16) flag always works if a
bullet has hit the creature. So even when he's immortal or he's blocked
the hit or if the aggressor is not Lara (but, eg., TROOPS shoots at
SCORPION). - Notes:
a, Other harms (arrows, grenades or if the
SCORPION grabs TROOPS etc.) are not calculated in this flag.
b, If
Lara shoots the horseman on the horse then the hit is calculated at both
the horseman and the horse.
c, If Lara is too close to the enemy but
not close enough to aim automatically, but she shoots and hits with
'automatic targeting' adjusted, then that is also calculated in this
flag.
- If a creature has been killed by an explosion then his
flag is 18=2+16. (An interesting case: the creature was poisoned but
killed by an explosion: 256+2+16=274 - so Flag 4 is missing now.)
-
When the skeleton has been shot off the ledge by the shotgun, and is
just 'falling into the death', then the flag is 43 (8 'gravity'+35).
When he's gone, fallen into the pit, then the flag is 42 (8
'gravity'+2+32). (But the 'headless' skeleton remains 35.)
The harpy
is similar: Lara has shot him, so he's just falling down by Flag 43.
Then he lands, but still visible, so the flag changes into 35. Then he
dies 'totally' (becoming invisible), so the flag is 4 now.
- The
'dead' (gone) guide has Value 38.
- If the Ahmet has been killed, he
remains 35, whether he will be transported back into his cage or not.
- Little beetles remain 35 after having been killed by an OldFlip
FLIPEFFECT. Unfortunately, saving and loading the game now resets their
activating trigger, so the flag turns into 32. (To avoid the unwanted,
newer activation of this trigger, use ACTION+One Shot trigger to
activate them.)
- If the locusts have been all activated, then the
value becomes not 35 but 34=2+32. (I mean, if Lara is just standing on
their trigger - even they are activated or all gone - the value will be
35 till she leaves that square. Use One Shot trigger to avoid Value 35
when they are activated/all gone.)
- If the skeleton/baddy jumps
aside when triggered (see: OCB 1 or 2) then he adopts AI_GUARD flag
(temporarily, while he's doing that).
- If the enemy stops at the
second AI_AMBUSH nullmesh, then his AI_AMBUSH flag turns into AI_GUARD
flag.
- If SETHA can't find Lara (try that, using DOZY to fly above
him), then he adopts AI_AMBUSH flag forever.
- Patrolling (AI_PATROL)
enemies are harmless. And, if they are distracted by Lara, then lose
their AI_PATROL flag (and remain harmless).
- AI_MODIFY nullmesh is
interesting. It's almost the same as AI_GUARD, but the creature has less
head-movements now, so it's harder to him to notice Lara. Moreover, eg.,
a BADDY_1 here won't leave this place, having been distracted, and
shoots Lara with infinite ammo. And, as the baddy won't leave his post,
he won't ever drop his AI_MODIFY flag. - But, eg., a crocodile will
leave this place - though, he also won't drop the flag.
- AI_MODIFY
with AI_GUARD mean the creature won't move the head at all here. If Lara
distracts him, he'll drop AI_GUARD flag, but won't drop AI_MODIFY flag,
and act as if he were in a simple AI_MODIFY mode.
- If the guide
arrives to an AI_FOLLOW nullmesh, temporarily loses AI_FOLLOW flag -
till the game adjusts his position to the nullmesh.
- In the
horse-horseman connection, only the horseman has the AI_FOLLOW flag -
till he climbs up the horse. (It's interesting, but during the battle of
Lara and the mounted horseman, he rides back sometimes to the AI_FOLLOW
nullmesh 'to rest a bit'. In these moments, he temporarily has the
AI_FOLLOW flag again.) - By the way, after having been activated, the
horse has value 34 forever.
- If any of the baboons have died by a
flash, then they have a strange flag: 38+AI_FOLLOW=8230.
- AI_X1 and
X2 have no flags in this field.
- Gravity (8) flag is the only flag
in this field that works with Lara as well. (Even when she's just
jumping up.)
And this is what you need to know about non-creature
Moveable objects:
- Most of the Moveable objects are seeable in
the map when the level starts. (Of course, if you hide an object, using
'Move' ACTION triggers or some other tricky way, then that doesn't
matter now as 'non-seeable'.) They have Flag 32 now. The non-seeable
ones (such as teeth spikes, for example) will have Flag 38 (2+4+20)
before activation.
- Activating the seeable ones, they'll mostly have
Flag 35 (1+2+32) 'forever' - so, eg., even if you stop them and then
restart them. But this is not true if Lara has interaction with them. I
mean, if Lara is just moving a pushable object (or a SAS_DRAG_BLOKE), a
switch, a death slide (zipline), 'scales' object (see: setup of Ahmet
creatures) etc., then the value is 35, but after that, it is 32 again. -
Exceptions I revealed:
If Lara used a switch without triggers (!) at
least at once, then the flag is always 37 (1+4+32) if Lara is just not
using the switch.
If Lara used a timed switch, then the flag remains
35, and changes back into 32 only if the switch has been switched off
automatically. (If that automatic motion happens when Lara isn't on the
square of the trigger then the value is 37 and not 32 - till Lara comes
there again.)
If Lara uses a 'hole in the wall' switch to get an item
from it, then she doesn't use it as a switch, so the value remains 32.
If Lara poured the wrong amount of water into the scales, then the value
remains 35, and gets back to 32 only if she's 'killed' the Ahmet.
If
Lara used them, the element puzzle 'scales' remains 32 constantly -
except the one you've ignited the petrol on it (35).
If Lara places
the puzzle item in the (subject) puzzle hole then the value becomes 35
only if the hole has been replaced by the puzzle done object. (And, if
the animation has ended - because Lara's lowered her hands - then the
value becomes 37. It is 35 again if Lara leaves the trigger zone, but
changes back into 37 again and again, if she comes back there. It
doesn't matter if KEY trigger is One Shot or not.)
If Lara activates
a trigger to send back the zipline into the start position, then the
value is 35 while Lara stands on the trigger. (As you see it is the same
problem I mentioned at locusts. Moreover, for example, the trigger of a
GAME_PIECE of the Seneth game has the similar property.)
The
motorbike remains 32 if Lara using that, but the flag becomes 36=4+32 if
the bike has been exploded in water.
The kayak needs a technical
trigger. The kayak never will be 35 when triggered but will be 34=2+32.
- I think the value of the activated non-seeable ones is always
individual. - Some examples I found:
When the teeth spikes are moving
out or back then the value is 35. If they are just in the start (hidden)
position, during the moving, then the value is 39=1+2+4+32.
(Deactivating the spikes, they will keep the actual 35 or 39 value till
the next start.)
Or see the objects that have Invisible button on
(eg. pickable items, waterfalls). They are usually 32 constantly (I
mean, if the pickable activates a PICKUP trigger, then it becomes 38,
having been picked up), but having that button on, they start the level
with Flag 38. Activating them (i.e. making them seeable) they become 35.
- Then, if you pick up a pickable item that was invisible before, its
flag turns into 34 (or 38, activating a PICKUP).
- The non-triggered
'real' nullmeshes - flame emitters, earthquake etc. - are 32, and they
become constantly 35 after triggering. ('Not real' nullmeshes are the
technical nullmeshes: see eg. AI objects. This field can't identify
them.)
You may reveal exceptions. I found ropes that - triggered or
not - will always have Flag 33 (1+32).
- Having been exploded, Smash
Objects only have Flag 4.
- If you use an independent CAMERA_TARGET
object, then that will have 96=32+64 flag forever, after having been
activated.
- As you know, waterfallmists stop working if you load the
game. It's because the game loses 'the mist is activated' (35) value
when loading, turning it back into 32 ('the mist still isn't
activated'). (By the way the problem could be solved by, for example, a
simple GT_LOADED_SAVEGAME GlobalTrigger, that activates the mist again
and again if the game has just been loaded.)
- If you have a problem
with the unwanted collision, then switching 'Clear Body' button in the
OCB panel seems a good solution. But it isn't. It's buggy. (See more
about it below: 'Pointer for Collision Procedure (Long):' field.)
Moreover, if you use Clear Body then that will affect the values of the
present field.
Case A: I don't think it's a useful thing to force
values on non-creatures now.
Case B: for example, using a pushable
subject, Value 35 means an 'if Lara is just pushing/pulling the given
object' condition.
Please, don't forget it is a very complicated
field here, so whatever you read now, they are only some products of
some of my tests, and there may be more values (even about further
objects).
Frame Now (warning it's an abs value) (Short)
It
defines the actual FrameID of the actual animation. - Attention! It
works with absolute FrameID's.
If you understood above what absolute
animations mean then it's also easy to understand the absolute frames. -
Let's see an example:
The studied frame has ID8 in its animation,
which is Animation2. So the object has two animations with lowest ID's
(Animation0 and 1) and they have 48 frames aggregated. So the first
frame of Animation2 (ID0) has Frame49 absolute ID. It means the ID8
frame of the animation has Frame57 absolute ID.
See 'NG
Center\Tools\Animation Watcher\Show PRESENT ANIMATIONS for current
slot', where you can identify easily the absolute frame ID's:
For
example, you want ID11 frame of Animation6 of SAS objects as a
condition. Find SAS and his Animation6 here, in this NG Center tool. See
the green window below. You'll see a FrameStart=120 field here - it
means the first frame (ID0) of the animation is the ID120 absolute frame
of the SAS. It means ID11 frame of the animation is the ID131 absolute
frame of the SAS - so, if you use a Case B with this field (with a SAS
as a subject), then Value 131 means an 'if the actual frame of the given
SAS is his Animation6 ID11 frame' condition.
Case A: forcing a
frame on an object seems buggy.
Case B: why should you use a frame as
a condition, with this method? I mean, this is what AnimCommands should
do, instead of this method, don't they? - Well, this Case B isn't
illogical, if you don't want AnimCommands to be always activated at the
given frame.
I mean, if you place a trigger into the SAS Animation6
ID11 frame in WADMerger Animation Editor (as an AnimCommand), then that
frame will activate that trigger at all the SAS Animation6 ID11 frames.
But, using an 'if the actual frame of the given SAS is his Animation6
ID11 frame' CONDITION trigger, only the Animation6 ID11 frame of the
given (subject) SAS will activate the trigger.
Moreover, place that
trigger in a disabled and GT_CONDITION_GROUP type GlobalTrigger as an
executable trigger. The condition in the GlobalTrigger is this 'if the
actual frame of the given SAS is his Animation6 ID11 frame' CONDITION
trigger. Even the given SAS Animation6 ID11 frame won't activate that
trigger, either - until you enable the GlobalTrigger by an F109 trigger.
Height Floor below the item (Long)
This field contains the actual
floor level below the subject item. 1024=1 square vertical distance,
negative number=above the 0 floor level, positive number=below the 0
floor level. - For example:
The harpy is activated in a room on a
point which has 12 clicks (3 squares) floor value. (Now the field value
is 1024x-3=-3072.) He flies over the next square which is a portal
towards the room below it. The room below has 2 clicks (0,5 square)
floor value at that point. (Now the field value is 1024x-0,5=-512.) The
harpy flies through the portal, and over the next square, but the floor
value is still 2 clicks under him. (So the field remains -512.) Now he
flies through the room, above a pit which has -5 clicks (1,25 squares)
floor value. (Now the field value is 1024x1,25=1280.)
Notes:
-
Objects keep their actual values before activation (comes to life etc.)
or after deactivation (death, picked up etc.).
- If the object moves
but without AI (such as ziplines, rollingballs etc.) then it will keep
the start value in this field.
Case A: no effect if you want to
force this floor data on an object.
Case B: for example, with a
creature subject, Value 6400 means an 'if the floor level below the
creature is just -25 clicks' condition. It is a useful condition, for
example, in a GlobalTrigger, if the harpy is flying around in a room
with a -20 clicks average floor level, but with a lot of pits there,
having -25 clicks floor levels, and you want the harpy to activate
things only if he just flies above a pit like that. And if you don't
want to place HEAVY triggers for the harpy in the pits, saying, there
are PAD triggers in the pits, because Lara will activate things,
climbing down into any of the pits.
HP (Current life level. $C000
= unkillable) (Short)
This field shows the actual life points of the
given enemy.
Case A: if you want to force a new maximal life
point for an object slot, then use Enemy Script command. But if you want
to force a new actual life point on a given enemy, then just use this
Case A, any time before killing the enemy.
Case B: C19 trigger
studies Lara's life points. But if you want to study a life point of a
given enemy, then use this Case B.
Notes:
- The subject
enemy has its maximal life point in this field, before coming to life.
(So you can use Case A before triggering him.)
- After having been
killed, the life points of the enemy turns from 0 into $C000. Seeing the
field name, the enemy is 'unkillable' now. (The value is -1 at Lara if
she's dead.)
Object buttons. Five buttons + invisible button
(Short)
This field contains the states of the OCB panel buttons of
the given object. (Despite of the name of the field, Invisible button
isn't calculated in this field - but Clear Body button is.)
The
values are:
Button1 is on: 512
Button2 is on: 1024
Button3
is on: 2048
Button4 is on: 4096
Button5 is on: 8192
Clear Body
is on: -32768
So, for example, if only Button1, 2 and 4 are on at
the given object, then the field value is 512+1024+4096=5632.
Important! If all the five number buttons is on, then the value is not
15872 (though, this is their aggregate) but 16416.
Case A: no
effect if you force a value in this field.
Case B: for example, Value
12188 means an 'if only Button 4 and 5 are on at the given object'
condition, but - because Case A doesn't work - usually I can't see where
this condition could be useful. (I mean, the OCB value of the object is
always the same you adjusted in Room Editor.) But if you don't define a
concrete subject by A54 trigger but you define a 'random' subject by the
'TRNG Index. Item Index for Selected Item Memory (Short)' Savegame
Memory Zone field then it's worth studying the OCB buttons of the
subject item in the game.
OCB Code (The value you typed in OCB of
this item) (Short)
This field contains the value in the OCB window of
the Moveable objects.
Case A: theoretically, you don't need to
use this Case A, because using A79 will force a new OCB number on the
object. But this property is one of the (possibly) instable properties I
mentioned above (see: The wooden Door: how save and restore our
changes.) So if you experience the forced OCB is instable during the
loading procedure, then don't use A79 but use this Case A, according
to The wooden Door: how save and restore our changes. (Or use a
GT_LOADED_SAVEGAME type GlobalTrigger to activate A79 every time when a
Savegame has been loaded.)
Case B: because Case A is useful now, Case
B is also useful now, to examine the actual OCB value of the subject
item in the game.
Note: the field contains the number before the
activation as well. But creatures lose their OCB values, having been
activated.
Position X (Long)
Position Y (Long)
Position Z
(Long)
These three 'Position' field define the actual coordinate of
the object.
1. Position X
It shows the horizontal position of
(the pivot of) the object, compared to the north ('upper') edge of Room
Editor Window. 1024=1 square.
2. Position Y
It shows the vertical
position of (the lowest point of) the object, compared to the Floor 0
level. 1024=1 square. Negative numbers=above Floor 0 level. Positive
numbers=below Floor 0 level.
3. Position Z
It shows the horizontal
position of (the pivot of) the object, compared to the west ('left')
edge of Room Editor Window. 1024=1 square.
Case A: a 'usual'
transportation with LARA_START_POS objects always forces a new X, Y and
Z coordinates on the subject item. But in this Case A you will be able
to force, for example, only Position X and the transported creature will
keep its actual Position Y and Z.
Case B: if you use a
coordinate-condition, it's always recommended to use it with tolerance.
I mean, for example, an 'if the creature is at Position X=44205' is a
too precise condition, i.e. the creature may never reach that point
exactly, during its lifetime. So, a 'duplicated condition' is more
useful. For example: 'if the creature is at a bigger Position X value
than 44150' and, at the same time 'if the creature is at a smaller
Position X value than 44250'.
Notes:
1. Naturally, it's
not easy to find out so complicated values as that '44205'. So I
recommend this method: use Diagnostic mode with DGX_LARA diagnostic
type. Start the game and use DOZY mode to take Lara into the position
where you want to transport your object to. You can see the required X,
Y or Z value (Cx, Cy, Cz) typed on the screen. Use that value in the
forcing trigger.
2. Whatever transporting method you use, never
transport your objects out of their rooms (i.e. where they are placed).
I mean, you can transport creatures if they left the room where they'd
been placed but you can transport them only inside the room where they
just are.
3. You may ask why we want to complicate this thing. I
mean, if you can't take the object out of the room, then a simple 'Move'
ACTION trigger or a Parameters command would be more simple to force the
position, wouldn't it? - Well, those features move the object with a
given distance, but this Case A moves the object into a given position.
That is not always the same.
4. You can take Lara out of any room
with this Case A. But don't forget: the transportation is a move from
Point A to Point B. This move vector must be going through portals
between the rooms. If the vector crosses a wall, then the transporting
operation fails - except if you also force the destination room number
(see below: 'Room (Room where is the item) (Short)' field) on Lara at
the same time.
5. Never force a vertical (Y) position on Lara or
other creatures.
6. If the animation has a SetPosition AnimCommand
(see for example: LARA object Animation 97), changing a coordinate, then
that coordinate won't be refreshed in this field while the animation is
being performed.
Room (Room where is the item) (Short)
This
field contains the index of the room in which the object is just located
at the moment.
Case A: see about it just above.
Case B: using
ENV_ROOM_IS type MultEnvCondition you can study the actual room of Lara.
But, if you want to study the actual room of another Moveable object,
then use this Case B.
Notes:
1. This index is the index
from the game ('tomb index') and not the one from the Room Editor ('NGLE
index').
Let's say you have a room named 'Big Room' in your project.
Click on 'Select' button to open the list of the rooms. For example,
this is what you see at 'Big Room':
Big Room (30:23)
It
means the NGLE index of the Big Room is 30 (that's why the original name
of the room was Room30 in the Room Editor) and the tomb index of the Big
Room is 23.
See F298 or F299 trigger to convert tomb room index to
NGLE room index or vice versa.
2. If an object cannot be transported
out of its room (see above) then that doesn't mean that object won't
leave its room during its 'regular working'. (For example, a zipline can
slide from one room to another.)
3. The border between the rooms
seems not too exact sometimes. For example, if Lara is standing in a 1
click deep pool, then she's in the room above the water surface. But,
when she's standing in a 2 clicks deep (waist-deep) pool, then she's in
the pool. - I think it's because the pivot of the object what matters to
define the position. And, when Lara is standing in a 1 click deep
(knee-deep) pool, then her pivot (her butt) is above the water surface.
Slot Id (number of slot) (Short)
This field contains the slot
index of the object. (By the way, you can also find them here: 'NG
Center\Reference\SLOT MOVEABLES indices list'.)
Case A: forcing a
new slot number on an object means the subject item will put the look of
the object in the new slot on. But it is buggy.
Case B: for example,
Value 73 means an 'if the object slot of the subject is WILD_BOAR'
condition, but - because Case A doesn't work - usually I can't see where
this condition could be useful. (I mean, the slot value of the object is
always the same.) But if you don't define a concrete subject by A54
trigger but you define a 'random' subject by the 'TRNG Index. Item Index
for Selected Item Memory (Short)' Savegame Memory Zone field then it's
worth studying the object slot of the subject item in the game.
Speed in horizontal movements (Short)
This field shows the actual
horizontal speed value of the object. - Let's see an example to
understand that:
When Lara's standing, then she's performing her
ID103 animation (Speed value in WADMerger Animation Editor: 0.) Then she
starts running, performing her ID6 animation (Speed value: 23.) The
she's running, performing her ID0 animation (Speed value: 47.)
When
she starts running (Animation6) then the Speed jumps from Value 0 of the
previous animation to Value 23 of this Animation, at once. But
Animation6 has an 'Accel: 1' value. It means the speed will be increased
by 1 per frame in the game: 24, 25 etc. When Animation6 has ended and
Lara starts performing Animation0 then the last speed of Animation6
(it's probably 36) will jump from the 47 constant speed value of
Animation0. - So these speed values are shown in this field.
Notes:
1. For example, 25 in this field means Lara will move
horizontally 25 units during that frame. (This time 1024 units seems a
bit less than 1 square.)
2. Naturally negative Accel value means
decreasing speed.
3. The theory above doesn't always seem true. I
mean, see for example the 'stand jumping forward' animation combination
of Lara:
Animation73: she's ready to jump, Speed: 0, Accel: 0
Animation76: she starts jumping forward, Speed: 99, Accel: 0
Animation77: she's jumping forward, Speed: 0, Accel: 0
But, when
you study this field in the game, that's what you'll see:
Animation76: Speed is constantly 99.
Animation77: Speed is constantly
50.
But that is logical. I mean the Speed of Animation77 is
hardcoded, because the value is 50 when Lara's performing a stand jump,
and 75 when Lara's performing a run jump.
Case A: it is
interesting, but it seems you can force the value on an object only if
the animation has that 'hardcoded case'. (But it will work only with a
continuous forcing, by a GlobalTrigger.) For example, forcing Value 100
on Lara when she's performing Animation77 (started from standing), that
means Lara will perform a long jump forward if the player hits ALT+up
arrow.
(Notes:
1. It's not easy to define the 'started from
standing' condition, because you can't find an exact condition like 'if
Lara started the jump standing'. So you need to define that condition in
a tricky way. For example: a variable will be 1 when Lara is running.
When she's performing Animation77 and the variable is 1 then that means
a running jump. But when she's performing Animation77 and the variable
is 0 then that means a standing jump.
2. Be careful! You have to
study the speed of other animations as well in complex cases: when Lara
will grab a ledge at the end of the jump, when she turns around in
midair during the jump etc.)
Case B: the maximum horizontal speed of
the motorbike is about 130. But, with nitro, it's about 190. So, for
example, Value 190 with motorbike subject in this field means 'if Lara
reached the maximum speed riding the bike with nitro' condition.
(Note: when Lara uses a vehicle then you need to calculate her speed as
the speed of the vehicle object.)
Speed vertical movements or
underwater (Short)
This field shows the actual vertical speed value
of the object. - It is similar to the horizontal moves but vertical
values (either Speed or Accel) aren't shown in Animation Editor.
This
example will help you to understand:
Lara jumps up. The energy is
the biggest when she starts jumping, naturally, that's why the value
(moved units per frame) here's the biggest. Approaching the upper point,
the energy decreases, that's why the higher Lara has jumped the smaller
the value is. (Moving upwards, the values are negative numbers.)
And
now Lara starts falling down. The energy is the smallest when she starts
falling naturally, that's why the value (moved units per frame) here's
the smallest. Approaching the ground, the energy increases, that's why
the lower Lara has fallen the bigger the value is. (Moving downwards,
the values are positive numbers.)
(The largest values are about
-100/100 when Lara jumps up/falls down from jumping up.)
Now the
'vertical' doesn't always mean 'the object moves up or down'. For
example, when Lara's swimming forward, then she also moves towards her
head, just as if she were jumping up - so 'swimming forward' is
calculated as a vertical movement. - That's how it works:
Animation109 starts when Lara starts swimming forward. The vertical
speed starts increasing fast. Then the animation changes into
Animation86, that is the 'real' 'swim forward' animation. The speed
reaches 200, and remains that, while the player holds ALT pushed down to
swim continuously forward.
Case A: if you want to force Lara on a
vertical jumping speed then you'd better use F136 trigger. But be
careful in other cases. I mean, for example, according to my experiences
you can force a swimming forward vertical speed on Lara (continuously,
by a GlobalTrigger) only if that is less than the default 200. - For
example you want Lara to swim slowly in the 'too thick liquid', that's
why you force Value 50 on her when she's in that pool and performing
Animation86 or 109. (But you can be more precise, for example, if you
calculate different speeds in Animation86, simulating the acceleration
from 0 to 50. For example, using 'Frame Now (warning it's an abs value)
(Short)' field as a condition to calculate different speed for each
frame of Animation86.)
(And don't forget: the speed will decrease by
degrees when Lara stops swimming. That's why you must study the speeds
of the animations that follow Animation86.)
Case B: when the jump-up
phase reaches the top, then the lowest energy (the vertical speed) is
-2, and then, when the fall-down phase starts from the top, then the
lowest energy (the vertical speed) is 4. So, for example, with Lara as a
subject, Value -2 (together with the 'if Lara is just performing the
jumping-up/falling-down animation i.e. Animation28' condition) in this
field means 'if Lara has just reached the top of her fly'.
State
Id Next (Short)
This field shows the state of an animation. This
state is the state of the animation that will be performed after the
actual animation. This state is the state of the animation you can see
in 'Next Animation' box of the actual animation, in Animation Editor.
Case A: if you want to force a next state ID on Lara then use F78,
F170 or F171 trigger instead. If you want to force a next state ID on
another object, then use A39 trigger instead.
(Note: I don't know all
the cases when it's worth forcing a new State ID on an animation. But I
know it's worth it if you want to use an animation under other
circumstances in a cutscene - embedded in your 'real level' -, compared
to as you use that under 'normal' circumstances. - For an example, see
the tutorial Talking to Zip, its demo project
and its readme).
Case B: sometimes this
Case B with states is better than a Case B of another field with
animations. For example: you need a condition if Lara picks up an
object. But there are more picking-up animations so you need more
picking-up animation conditions at the same time. Instead of that, you'd
better use the State ID 39 (that is the state of these picking-up
animations: swimming, standing, crouching, crowbar, high/low pedestal)
and the State ID 67 (that is the state of picking up the dropped flare
swimming, standing, crouching) at the same time, as conditions. And, at
the same time, you use only the other picking-up animations
(sarcophagus, wall hole etc.) as single conditions.
State Id Now
(Short)
This field shows the state of an animation. This state is the
state of the actual animation. This state is seen in 'StateID' box of
the actual animation, in Animation Editor.
Case A: if you want to
force an actual state ID on Lara then use F78 trigger instead.
Case
B: see the comment about Case B just as above with 'State Id Next
(Short)'. - If you want to study Lara's actual StateID then use C31
trigger instead of this Case B.
Transparence level (0 = opaque /
126 transparent / over 127 removes item) (Short)
This field contains
how transparent the subject item is.
Case A: use A53 trigger
instead of this Case A.
Case B: use C37 trigger instead of this Case
B.
Unknown (Light_A) (Long)
Unknown (Light_B ) (Long)
Unknown (Light_C) (Long)
Unknown (Light_D) (Long)
Unknown
(Light_E) (Long)
Unknown (Light_F) (Long)
Unknown (Light_G) (Long)
Unknown (Light_H) (Long)
These 'Unknown' fields show values about the
ambience light of the room in which the subject item is just located.
1. Light_A, B and C fields
Each field is a color component (red,
green or blue) value of the ambience light:
Light_A: red
Light_B: green
Light_C: blue
It's easy to understand the
values there. - Because, for example:
1024 Field Value = 128
Color Value
512 Field Value = 64 Color Value
8 Field Value = 1
Color Value
So, for example, Value 120 in Light_B field means
Value 15 (=120/8) green color component in the ambience light of that
room.
(Note: in fact, that is not always the green ambience value of
the room. So that is the actual green ambience value - that just affects
the object in that moment - in that room. For example, when Lara steps
from a room with Value 10 green factor into a room with Value 30 green
factor then the new green factor will accept her by degrees: 11, 12, 13,
14, 15, 16 etc. - though, very fast.
So, if we want to be exact, then
Value 120 in Light_B field means: 'if the green component of the
ambience color, that is just affecting the item, is 15 - either that is
the adjusted color of the room or the effect is just realized when the
item is stepping through a door' condition.
Of course, I can say the
same thing on the red or blue components.)
2. Light_D field:
This field shows a long number for the whole RedGreenBlue ambience light
value of the room. - For example:
The value is 1336370 in the
field. Turn it into a hexadecimal number with your Windows calculator.
The solution is $146432. Read that number split into three blocks:
$14/$64/$32. Turn each number back into a decimal value. The solution
is: 20/100/50. - And this is the RedGreenBlue value, I mean Red=20,
Green=100, Blue=50 now.
(See the same note just as above.)
3.
Light_E, F and G fields
Each field is a color component (red, green
or blue) difference value of the ambience light:
Light_E: red
difference
Light_F: green difference
Light_G: blue difference
For example, the blue ambience component in Room Editor in Room A is
60 and in Room B is 45. When Lara (as the subject of Light_G field)
steps through the door between the rooms from Room A into Room B then
the field becomes -15, because 45-60= -15.
4. Light_H field
This field shows how much the object has adopted the ambience color
value of the room after having just arrived here from another room. -
The lowest degree is 7.
For example:
Lara is the subject. The
value of the field is 0. Lara is going through a door from Room A into
Room B. A fast countdown timer starts running (one new value per each
frame): 7, 6, 5, 4, 3, 2, 1, 0. When the value is 0 again then that
means the ambience light shining on Lara is totally the ambience light
of Room B. - So this is the procedure:
0: the ambience light shining
on Lara is totally the ambience light of Room A.
7: the ambience
light has started turning into the ambience light of Room B.
6: the
ambience light continues turning from Room A color to Room B color.
5: the ambience light continues turning from Room A color to Room B
color.
4: the ambience light continues turning from Room A color to
Room B color.
3: the ambience light continues turning from Room A
color to Room B color.
2: the ambience light continues turning from
Room A color to Room B color.
1: the ambience light is almost totally
the ambience light of Room B.
0: the ambience light shining on Lara
is totally the ambience light of Room B.
Case A: you can force a
color only in Light_D field. The force in other fields seems more or
less useless.
You should force the value in Light_D only with
continuously (by a GlobalTrigger). But it doesn't mean the game won't
try continuously to turn back the value into the default value. That's
why the forced color will be realized on the object as a blinking color:
the forced color that turns continuously back into the default color
that turns continuously back into the forced color etc.
Case B: with
Lara as a subject, eg. Light_D Value 1336370 doesn't mean an 'if Lara is
a room with RGB=20/100/50 ambience light' condition, under any
circumstances. Why? Because, when she's just stepping through a door,
then (see that 7-1 timer above) sometimes the field adopts that 1336370
for a frame, so, even if neither the room where Lara comes from, or the
room where Lara goes into has RGB=20/100/50 ambience color value
adjusted. To prevent that problem, use another condition with that: 'if
the actual ambience light shining on the item is exactly the one that is
defined in the room', so if Light_H is 0. (This is also true with
Light_A, B or C conditions. But Light_E, F or G values will be realized
at once when the object is stepping through the door.)
Some other
interesting conditions:
- 'If Light_E is -100 or more and if Light_F
is -100 or more and if Light_G is -100 or more': it means when Lara (the
subject) steps from one room into another, then the new room is too
dark, compared to the previous one.
- 'If Light_H is 7' means the
subject item has just come through a door.
Notes:
- There
are some tiny bugs about these fields. I mean, some values won't be
realized until the subject item comes through doors between rooms at
least once or twice:
= Light_A, B, C, E, F, G value in the field
won't be realized till then.
= The change from one Light_D value to
the other is immediate, so it won't use the change by degrees till then.
= Light_H value is not 0 but -1, and the 7-1 timer won't start till
then.
It means you should use only the items in these fields that
could move through two doors at least, during their lifetime: Lara,
enemy, rollingball etc. And, use the value with them only if you are
sure that they have moved through two doors at least so far.
(Don't
misunderstand: it doesn't matter how many doors the item will cross or
which ones those doors are. Which matters is the number of crosses so
far, but through any doors.)
- These values won't be affected if
another light source (light bulb, fog bulb etc.) also shines on the
subject item.
- The 7-1 timer is not so clear when the subject item
is not Lara. For example, the timer runs from 7 to 1, then will be
paused, and some seconds will pass when it will turn into 0 at last. -
It means, the last step will be late a bit for the item to realize
perfectly the ambience light of that room. (It is not a bug - this is
how the engine works.)
Unknown (Pheraps accelleration on falling)
(Short)
This field has something to do with objects that are
controlled by AI_FOLLOW nullmeshes. - I did some tests. These are the
outcomes:
HORSEMAN: when he went back during the battle to
AI_FOLLOW's and starts coming ride back to Lara fast, then the field
value is 17 for a short while. ('For a short while' means the value is
17 then it is 0 again very soon.)
GUIDE: when the moving GUIDE
reaches a square on which there's an AI_FOLLOW then the field value is
41 for a short while. When he's got the torch and steps further to
ignite it, then the value is 11 for a short while. When he's performing
his crouching animation with OCB 2 AI_FOLLOW codebit, then the value is
43 for a short while. Etc.
The values seem mystical but they are
not: they are the State ID values of the actual animation. (If you want
to know what could Case A or B mean now, then see above 'State Id Next
(Short)' or 'State Id Now (Short)' fields. - But the present field is a
bit more than that. I mean, for example, with HORSEMAN subject: an 'if
the HORSEMAN State ID now is 17' condition means 'if the horseman is
riding fast'. But an 'if this Unknown, field is 17' condition means 'if
the Horseman starts riding fast back to Lara from AI_FOLLOW'.)
Unknown (Sprite1 Id) (Byte)
Unknown (Sprite2 Id) (Byte)
These
fields have a constant value (255), regardless of which Moveable object
is the subject item of the field. (So even if it is an item with
sprites: flame emitter, rope etc.) Whatever that object is doing,
whatever are its properties.
Unknown (Used when enemy shot a
granade = $c210) (Short)
This field has a constant value (-1),
regardless of which Moveable object is the subject item of the field.
(Even if that is a SAS or an ENEMY_JEEP shooting a grenade.) Whatever
that object is doing, whatever are its properties.
Unknown
Countdown (Some counter, not yet discovered) (Short)
This field
contains the (positive or negative) timer value of the object (in
frames) - that you can see in the trigger of the object (in seconds).
Case A: you don't need this Case A. Just use another timed trigger
to overwrite the original trigger timer value.
Case B: for example,
if the subject is a door and the value is -300 then it means 'if the
door will open in 10 seconds' condition - because 30 frames=1 seconds.
(Of course, you can trick this condition: for example, 10 seconds
remained in the timer, so the condition will activate the executable
trigger, but then you change back the timer into -20 seconds, so the
door won't open after 10 seconds.)
(This Case B has nothing to do
with these conditions of GlobalTriggers: GT_SCREEN_TIMER_REACHED,
GT_TRNG_G_TIMER_EQUALS, GT_TRNG_L_TIMER_EQUALS.)
Note: the
positive timer counted down is -1 and not 0 in this field. This is the
value here till the next activation of any timer of the object.
Visible Mesh Flags (each mesh a different bit) (Long)
This field
defines the visible meshes of a Moveable object (except Lara).
Each mesh of the object has a codebit in this field. - It is easy to
understand:
Only Mesh0 is visible: Bit 0=Value 1
Only Mesh1 is
visible: Bit 1=Value 2
Only Mesh2 is visible: Bit 2=Value 4
Only
Mesh3 is visible: Bit 3=Value 8
Etc.
If more meshes are
visible at the same time, then their aggregate what matters. (So, for
example, if only Mesh2 and Mesh4 are visible, then the value is Bit
2+Bit 4= 4+16=20.)
If all the meshes are visible at the same time,
then the value is -1.
If none of the meshes are visible at the same
time, then the value is 0.
Case A: use A50 or A51 trigger instead
of this Case A to force (in)visibility on a given mesh.
(Note: you
can use NEF_SAVE_MESH_VISIBILITY Script constant so the value won't be
lost when you save and then load the game.)
Case B: for example, as I
said, Value 20 means an 'if only Mesh2 and Mesh4 are visible' condition.
Savegame
Memory Zone fields
Inventory. Ammo Explosive
CrossBow (Short)
Inventory. Ammo Flash Grenade (Short)
Inventory.
Ammo Normal CrossBow (Short)
Inventory. Ammo Normal Grenade (Short)
Inventory. Ammo Normal Shotgun (Short)
Inventory. Ammo Pistol (Short)
Inventory. Ammo Poisoned CrossBow (Short)
Inventory. Ammo revolver
(Short)
Inventory. Ammo Super Grenade (Short)
Inventory. Ammo UZI
(Short)
Inventory. Ammo Wide-shot Shotgun (Short)
These fields
contain the actual amount that the given ammunition has in the
inventory:
- Note the value is not the clips amount but the
ammunition amount.
- The -1 value means: 'unlimited'.
- The
shotgun ammo amount in the field is always six times bigger than the
amount in the inventory. - So, for example, if the 'real' amount is 20
bullets, then the value of the field is 6x20=120.
Case A: there
are more methods to force a new amount on a given ammunition (see:
Equipment Script command, CUST_AMMO Script constant or 'Inventory-Item'
FLIPEFFECT triggers). But if you want to force a bigger, given amount in
the inventory (including: unlimited) but any time during the game, then
use this Case A.
Case B: C3 and C4 triggers are always examine a
minimum/maximum amount of an inventory item. Use those two conditions at
once if you want to use an exact amount of the given ammo as a
condition. (So you don't need to use this Case B.)
Inventory.
Pistols Mask. (Byte)
Inventory. UZI Mask (Byte)
Inventory.
Revolver (Byte)
Inventory. Shotgun (Byte)
Inventory. CrowBow
(Byte)
Inventory. Greanade-Gun (Byte)
These fields define the
presence/the state of the given weapon in the inventory. - The values
are:
Pistols/Uzis:
0: the weapon is not in the inventory,
9: the weapon is in the inventory.
Revolver:
0: the
revolver is not in the inventory,
9: the revolver is in the
inventory,
13: the revolver is in the inventory, combined with the
lasersight.
Shotgun:
0: the shotgun is not in the
inventory,
9: the shotgun is in the inventory, loaded with normal
bullets,
13: the shotgun is in the inventory, loaded with wideshot
bullets.
Crossbow:
0: the crossbow is not in the
inventory,
9: the crossbow is in the inventory, loaded with normal
arrows,
13: the crossbow is in the inventory, loaded with normal
arrows, combined with the lasersight,
17: the crossbow is in the
inventory, loaded with poisoned arrows,
21: the crossbow is in the
inventory, loaded with poisoned arrows, combined with the lasersight,
33: the crossbow is in the inventory, loaded with explosive arrows,
37: the crossbow is in the inventory, loaded with explosive arrows,
combined with the lasersight.
Grenade gun:
0: the grenade
gun is not in the inventory,
9: the grenade gun is in the inventory,
loaded with normal grenades,
17: the grenade gun is in the inventory,
loaded with super grenades,
33: the grenade gun is in the inventory,
loaded with flash grenades.
Case A: use an Equipment Script
command or an 'Inventory-Item' FLIPEFFECT trigger to force the weapons
into the inventory, instead of this Case A. - Notes:
a, To remove
any weapon, any time during the game, use F96 trigger to remove all the
weapons. - But never use an Equipment Script command or an
'Inventory-Item' FLIPEFFECT trigger or this Case A with Value 0!
b,
Usually the value is 9 when a weapon gets into the inventory. But you
may want to change that, saying, for example, you want the crossbow to
be loaded with poisoned arrow and combined with lasersight when that has
just been picked up. LOAD type Script constants will solve this problem,
but only at the Equipment command. So if you want to force the weapon
into the inventory in the game, but with not according to Value 9, then
use this Case A and not the 'Inventory-Item' FLIPEFFECTs. (By the way,
if the weapon is already in the inventory, you also use this Case A to
modify the actual adjustments of ammo/lasersight.)
Case B: to
examine the presence of the weapons in the inventory, use C1 or C2
trigger instead of this Case B. (But if you want more information - i.e.
which type of ammo is just loaded?, is the lasersight just attached? -
then use this Case B.)
Inventory. Large Medikit (Short)
Inventory. Small medikit (Short)
Inventory. Flares (Short)
These
fields contain the actual amount of the given item in the inventory.
Notes:
- The value at flares is not the box of flares amount
but the flares amount.
- The -1 value means: 'unlimited'.
Case
A: there are more methods to force a new amount on the item (see:
Equipment Script command, 'Inventory-Item' FLIPEFFECT triggers). But if
you want to force a bigger, given amount (including: unlimited) but any
time during the game, then use this Case A.
(Note: you can't define
flares by 'Inventory-Item' FLIPEFFECT triggers, because those triggers
use FLARE_ITEM [which is useless] and not FLARE_INV_ITEM - so use this
Case A instead, if you want to define the amount during the game.)
Case B: C3 and C4 triggers are always examine a minimum/maximum amount
of an inventory item. Use those two conditions at once if you want to
use an exact amount of the given item as a condition. (So you don't need
to use this Case B.)
(Note: C3 and C4 triggers use FLARE_ITEM and not
FLARE_INV_ITEM - so use this Case B instead of them, if you want a
'given amount of the flares in the inventory' condition.)
Inventory. Binocular (1= present) (Byte)
Inventory. Crow Bar (1=
present) (Byte)
Inventory. Laser Sight (Byte)
Inventory. Examine
Item 1 (Byte)
Inventory. Examine Item 2 (Byte)
Inventory. Examine
Item 3 (Byte)
These fields examine the presence of the given item in
the inventory. - The values are:
0: the item is not in the
inventory.
1: the item is in the inventory.
Case A: use an
Equipment Script command or an 'Inventory-Item' FLIPEFFECT trigger,
instead of this Case A.
Case B: to examine the presence of the item
in the inventory, use C1 or C2 trigger instead of this Case B.
Inventory. Keys 1 - 8 (Byte)
Inventory. Keys 9 - 12 (Byte)
Inventory. Combo items 1 - 4 (Byte) - for PUZZLE_ITEM_COMBOs
Inventory. Combo item 5 - 8 (Byte) - for PUZZLE_ITEM_COMBOs
Inventory. Pickup Items 1 - 8 (Byte)
Inventory. Quest items 1-8
(Byte)
These fields examine the presence of the given item in the
inventory. - The values are:
Keys1-8:
0: none of them is
present
1: KEY_ITEM1 is present
2: KEY_ITEM2 is present
4:
KEY_ITEM3 is present
8: KEY_ITEM4 is present
16: KEY_ITEM5 is
present
32: KEY_ITEM6 is present
64: KEY_ITEM7 is present
128:
KEY_ITEM8 is present
Keys9-12:
0: none of them is present
1: KEY_ITEM9 is present
2: KEY_ITEM10 is present
4: KEY_ITEM11 is
present
8: KEY_ITEM12 is present
Puzzle Combo1-4:
0:
none of them is present
1: PUZZLE_ITEM1_COMBO1 is present
2:
PUZZLE_ITEM1_COMBO2 is present
4: PUZZLE_ITEM2_COMBO1 is present
8: PUZZLE_ITEM2_COMBO2 is present
16: PUZZLE_ITEM3_COMBO1 is present
32: PUZZLE_ITEM3_COMBO2 is present
64: PUZZLE_ITEM4_COMBO1 is present
128: PUZZLE_ITEM4_COMBO2 is present
Puzzle Combo5-8:
0:
none of them is present
1: PUZZLE_ITEM5_COMBO1 is present
2:
PUZZLE_ITEM5_COMBO2 is present
4: PUZZLE_ITEM6_COMBO1 is present
8: PUZZLE_ITEM6_COMBO2 is present
16: PUZZLE_ITEM7_COMBO1 is present
32: PUZZLE_ITEM7_COMBO2 is present
64: PUZZLE_ITEM8_COMBO1 is present
128: PUZZLE_ITEM8_COMBO2 is present
Pickup1-4:
0: none of
them is present
1: PICKUP_ITEM1 is present
2: PICKUP_ITEM2 is
present
4: PICKUP_ITEM3 is present
8: PICKUP_ITEM4 is present
Quest1-6:
0: none of them is present
1: QUEST_ITEM1 is
present
2: QUEST_ITEM2 is present
4: QUEST_ITEM3 is present
8:
QUEST_ITEM4 is present
16: QUEST_ITEM5 is present
32: QUEST_ITEM6
is present
If more items are in the inventory at the same time,
then their aggregate what matters. - So, for example, if only
PUZZLE_ITEM1_COMBO1, PUZZLE_ITEM1_COMBO2 and PUZZLE_ITEM3_COMBO2 are
present in the inventory, then the value is 1+2+32=35 in 'Inventory.
Combo items 1 - 4 (Byte)' field.
But it isn't calculated as presence
if you combined the items. For example, if you combine now PUZZLE_ITEM1
from PUZZLE_ITEM1_COMBO1 and PUZZLE_ITEM1_COMBO2, then 1 and 2 will be
subtracted from 35 and the field value will be 32.
Case A: use an
Equipment Script command or an 'Inventory-Item' FLIPEFFECT trigger,
instead of this Case A.
Case B: to examine the presence of these
items in the inventory, use C1 or C2 trigger instead of this Case B.
Note: as I see, there are no fields for KEY_ITEM_COMBO or
PICKUP_ITEM_COMBO objects.
Inventory. Puzzle Item 1 (Byte)
Inventory. Puzzle Item 2 (Byte)
Inventory. Puzzle Item 3 (Byte)
Inventory. Puzzle Item 4 (Byte)
Inventory. Puzzle Item 5 (Byte)
Inventory. Puzzle Item 6 (Byte)
Inventory. Puzzle Item 7 (Byte)
Inventory. Puzzle Item 8 (Byte)
Inventory. Puzzle Item 9 (Byte)
Inventory. Puzzle Item 10 (Byte)
Inventory. Puzzle Item 11 (Byte)
Inventory. Puzzle Item 12 (Byte)
These fields contain the actual
amount that the given item has in the inventory.
Case A: there
are more methods to force a new amount on a given item (see: Equipment
Script command, 'Inventory-Item' FLIPEFFECT triggers). But if you want
to force a bigger, given amount but any time during the game, then use
this Case A.
Case B: C3 and C4 triggers are always examine a
minimum/maximum amount of an inventory item. Use those two conditions at
once if you want to use an exact amount of the given item as a
condition. (So you don't need to use this Case B.)
Inventory. Big
Skin Bag (Byte)
Inventory. Little Skin Bag (Byte)
These fields
define the state of the big/small waterskin in the inventory. - The
values are:
0: the waterskin is not in the inventory.
1-6: the
big waterskin is in the inventory and contains X-1 liters of water. (So,
for example, Value 4 means the waterskin is in the inventory, with 3
liters of water.)
1-4: the small waterskin is in the inventory and
contains X-1 liters of water.
Case A: usually use an Equipment
Script command or an 'Inventory-Item' FLIPEFFECT trigger, instead of
this Case A. But, for example, when Lara picks up the big waterskin,
then activate a PICKUP trigger, that activates a TRIGGER that uses this
field, with Value 2. So this time it's not an empty waterskin Lara has
picked up, but a waterskin with 1 liter of water. (By the way, you don't
need to pick the item up or that PICKUP trigger to force a waterskin
with some water into the inventory. Just use Case A, if you want.)
Case B: for example, Value 3 means now an 'if there are 2 liters of
water in the waterskin in the inventory' condition.
Inventory.
Mechanical Scarab (1=full item; 2=key;4=only scarab) (Byte)
This
field defines the state of the mechanical scarab in the inventory. - The
values are:
0: the scarab with key or the parts are not in the
inventory.
1: the scarab with key is in the inventory, combined.
2: only the key is in the inventory.
4: only the scarab is in the
inventory.
6: the scarab with key is in the inventory, separated.
Case A: use an Equipment Script command or an 'Inventory-Item'
FLIPEFFECT trigger, instead of this Case A.
Case B: to examine the
presence of the item in the inventory, use C1 or C2 trigger instead of
this Case B.
Inventory. Remaining usage of Mechanical Scarab
(Short)
The field name tells exactly what this field does. - The
values:
0: the scarab with key is not in the inventory (combined)
or if it is, then you can't use that any longer.
1-3: the remaining
usage amount of the scarab is 1-3.
Case A: you can force here
even a bigger or a smaller number than 3 to use the scarab maximum not
by the default value.
Case B: for example, Value 2 means an 'if the
mechanical scarab can be used maximum 2 times now' condition.
Lara. Air for Lara (0 - 1800) (Short)
This field contains the amount
of air in Lara's lungs (when she is swimming).
0: Lara has no
air.
1800: Lara's lungs are full of air.
Case A: you can also
adjust Lara's air by F104 or F110 triggers. But if you want to define a
given air amount for Lara then use this Case A. (Adjusting Lara's air
has no effect if she's not swimming/floating on/in water.)
Case B:
for example, Value 900 means an 'if there is 50 % air in Lara's lungs'
condition. (Note this is also true, if Lara has come up to the water
surface with low air, and her air has started to increase, and then it
has reached 50 %. So, if you want this condition to be true only if Lara
is under water then also use an 'if Lara is under water' condition.)
Lara. Current Weapon (not necessarly in the hand) (Short)
This
field shows which weapon
- is just in Lara's hand or
- will be
drawn if you hit SPACE now.
The values are:
0: no weapon
is selected (that's what will happen, for example, after you have made
Lara to throw flare/torch by F83 trigger). - Now Lara can draw a weapon
only with shortcut keys or directly from the inventory.
1: pistols
(the default value)
2: revolver
3: Uzis
4: shotgun
5:
grenade gun
6: crossbow
Case A: for example, if there are
pistols in Lara's hands and you force Value 4 in this field, then
nothing will happen (so you cannot force the value to make Lara draw
another weapon) - but if you holster the pistols now and then hit SPACE
then Lara will draw the shotgun. (So the value can be forced only for
the next SPACE.)
Case B: for example, Value 6 means now an 'if Lara
has the crossbow in her hand or will draw the crossbow if you hit SPACE
now' condition. But if you also use an 'if there is no crossbow in
Lara's hand' condition (i.e. a C35 trigger in 'Holding_Crossbow' mode,
in a TriggerGroup, in which you attach a TGROUP_NOT flag to it or a
similar GlobalTrigger) then Value 6 only means 'if Lara will draw the
crossbow if you hit SPACE now' condition.
But if you want Value 6 to
mean only an 'if Lara has the crossbow in her hand' condition, then use
C35 trigger in 'Holding_Crossbow' mode (or HOLD_CROSSBOW type
GlobalTrigger) instead.
Lara. Environment where lara is. (ground,
underwater ecc,) (Short)
As the name says, this field defines the
environment in which Lara just is:
0: Lara is on dry land.
1:
Lara is swimming/floating under water.
2: Lara is swimming/floating
on water surface.
3: Paolone says this is the value if Lara is in
DOZY mode, riding motorbike or in hardcoded cutscenes. I can confirm the
DOZY mode but I can't the motorbike (it is 0 for me when she's riding).
(I didn't test the cutscene.)
4: Lara is wading in water/quicksand.
Case A: forcing these values seems buggy.
Case B: if you want to
study Lara's environment, then you don't need this Case B, I mean there
are some similar and nice tools, for example: PLACE constants with
Animation Script command, C5, C30 or C81 triggers etc.
Note: as I
said above, Lara in knee-deep water is in the 'air room' above the water
surface (so she will walk/run here as if she were on dry land) but in
waist-deep water is in the pool (so she can't walk/run but wade here).
But there's a well-known bug about that: if Lara's standing in a
waist-deep water and then step up on a ledge in knee-deep water, then
she will wade on the higher ledge as if she were in waist-deep water.
Please note when you encounter that bug then the field value is 4,
though, Lara is in the room above the room surface. It results a very
peculiar case: while Lara is working by the bug, she is neither in 'air'
(see ENV_ONLAND constant of MultEnvCondition Script Command), nor water
(see ENV_ROOM_IS constant of MultEnvCondition Script Command, with
ROOM_WATER room type). - And the bug also exists in quicksand.
And
one more thing: you also encounter this 'neither air/nor water'
situation in the short moment when Lara swimming upwards is just
breaking through the water surface.
Lara. Hands. Attached Lara
Status (Short)
This field defines the situation Lara's hands are
engaged with. - The values are:
0: empty hands or holding a flare
1: being on all fours, grabbing a ledge, a ladder, a monkey bar, a rope,
a polerope, a parallel bar, a zipline, driving a vehicle (or getting
in/on/out), picking up (first moves) a torch or a working flare, picking
up other items (in any way), placing items, using switches, interacting
with doors (including kicking in), pushing/pulling pushable objects (or
ready to move them), using a crowbar, using a waterskin/jerrycan/bag of
sand, using the nitro, using the mechanical scarab
2: drawing a
weapon, igniting a flare
3: holstering a weapon, throwing
automatically a flare
4: holding a weapon, a torch,
igniting*/throwing a torch, igniting* with a torch, picking up (last
moves) the torch
5: picking up (last moves) the working flare
*: just ending this movement, the value will be 0 for a frame.
Case A: the value only sometimes can be forced. - The cases I revealed:
- Forcing 0 or 1 when Lara is holding weapons, she will lower (but
not holster!) the weapons. (This is the same effect just as F12 can do.)
- Forcing 3 when she's holding flare or weapon she will throw
flare/holster weapon. (Nothing will happen with torch in the hand. With
empty hands, the game will crash.) - This is what F83 trigger does,
anyway.
Case B: You can study some values by direct conditions.
For example Value 0 as a condition can do the same thing as
ENV_FREE_HANDS Script constant can do. Or, Value 2 is the same as 'if
the keyboard command is Extract flare or Extract current weapon'
condition. Etc.
But there also are some interesting things here. For
example: use all these conditions at once: 'when Lara is performing the
animations of picking up the working flares crouching, standing,
swimming' and 'if the value of Lara. Hands. Attached Lara Status (Short)
field is 1'. This 'multi-condition' will mean 'if Lara reaches for the
working flare to pick it up'.
Lara. Hands. Item in the Hands of
Lara (Current) (Short)
This field is similar to 'Lara. Current Weapon
(not necessarly in the hand) (Short)' field, but not exactly. - The
values are:
0: this is the value if Lara has dropped the torch,
and didn't extract a weapon or a flare after that
1: the default
value and if pistols are the latest chosen weapons (even if they are not
in Lara's hands now)
2: revolver is the latest chosen weapon (even if
it is not in Lara's hand now)
3: Uzis are the latest chosen weapons
(even if they are not in Lara's hands now)
4: shotgun is the latest
chosen weapon (even if it is not in Lara's hand now)
5: grenade gun
is the latest chosen weapon (even if it is not in Lara's hand now)
6:
crossbow is the latest chosen weapon (even if it is not in Lara's hand
now)
7: there's just a flare in Lara's hand
8: there's just a
torch in Lara's hand*
*: just ending this movement, the value
will be the latest chosen weapon for a frame.
Case A: you
shouldn't force this field ever. The solution sometimes is buggy,
sometimes is illogical (eg., this way Lara can drop the torch that is
NOT in her hand) and sometimes is something you can do with other
methods as well (eg. extracting/lowering the actual weapon).
Case B:
Use C35 trigger (or a similar GlobalTrigger) instead of Value 7 or 8.
And use 'Lara. Current Weapon (not necessarly in the hand) (Short)'
field instead of Value 1-6. But Value 0 could be a useful and strange
condition now.
Lara. Hands. Item in the Hands of Lara (Following
(Short)
The values of this field are exactly the same as the previous
one - except: that remark with * doesn't exist now.
Case A: you
can force all the values (except Value 8 which would be buggy). - Two
examples:
a, Lara has the pistols in her hands. You force Value 7
- and now she will holster the pistols and ignite a flare.
b, Lara's
hands are empty, but the shotgun is the latest weapon. You force Value 5
- and now she will draw the grenade gun.
Case B: see Case B just
above.
Lara. Hands. Remaining time with lighted flare in the hand
(Short)
This field is a timer counting from 0 to 900. It is a timer
for the flare that is in Lara's hand. It starts counting from 0 when
Lara has ignited it and stops at 900 when the flare is totally dead and
Lara will throw it. (30 means 1 second.)
Case A: the timer
maximum value can be customized by CUST_FLARE Script constant. But, that
constant will work on all of the flares.
If you want to manipulate
the timer of a given flare (always the one that just is in Lara's hand),
then force a value into this field:
- if the value is bigger than
900 (or the customized maximum value) then the flare will be out
suddenly, at once, and Lara will throw it,
- if the value is smaller
than 900 (or the customized maximum value) then the actual position of
the timer will be adjusted ahead/back to that value, at once (not
stopping counting).
Case B: for example, Value 600 means (with
the default 900 maximum value) an 'if the flare in Lara's hand has 10
seconds before it will be totally out - supposing we won't manipulate
the timer value' condition.
Lara. Hands. Weapon in the hand
(Short)
The value is usually -1. But becomes some other value if Lara
has the shotgun or the grenade gun or the crossbow in her hand. - This
'some other value' is the actual value of the Moveable objects that are
just placed in the map.
I don't think this field is useful for us.
Unless you're just making your level and want to know the number of
Moveables that are just placed. (It's not always the Moveable number you
see in Room Info Box in Room Editor. I mean it's the aggregate of the
placed objects in TXT file of the project in graphics\wad folder. - It's
because some placed objects, eg. AI objects, are not calculated in the
TXT file as placed objects.)
Lara. Item Index of Lara (Short)
This index shows the game index ('tomb index') of LARA object.
Put it
into a variable, if you want - maybe you can use it in a condition.
Note: if you have an object index in the Current Value variable,
then you can transform it. I mean F300 turns game ('tomb') index into
Room Editor ('NGLE') index or F301 turns Room Editor index into game
index.
Lara. Poison1 (giant scorpion = 2048) (Short)
Lara.
Poison2 (Short)
Two similar fields to calculate Lara's degree of
poisoning - in these ways:
1. Let's see for example the poison of
SMALL_SCORPION and SCORPION:
Though both Poison1 and Poison2 fields
show the actual value of the poisoning, this value is calculated in an
exponential way in Poison1 field and in a linear way in Poison2 field:
At the SMALL_SCORPION in Poison1 field, the difference between the
first and the second value (one value for each frame) is 32, the second
and the third value is 30 (+/-1) etc. The difference will decrease frame
by frame and will be constantly 1 at last. - So this is how the
procedure will happen (eg. if the small scorpion bites - and poisons -
Lara when she has the full life points):
1000 value of life bar -
0 poisoning value
next life value: 980 - 32 poisoning value - the
small scorpion has bitten and poisoned Lara (the life bar has gone
green)
still life value: 980 - 62, 90, 116, 141, 518, 520, 522
poisoning value - the poisoning value is changing though the life value
is still the same
next life value 978 - 524, 526, 528,595, 596, 597
poisoning value - the life value starts decreasing continuously, due to
Lara being poisoned
next life value: 976 - 598, 599, 600, 659, 660,
661 poisoning value
next life value: 974 - 662, 663, 664, 723, 724,
725 poisoning value
Etc.
(Notes:
- The poisoning
situations cannot be repeated exactly, under any circumstances. So, for
example, if you saved the game before the bite, and now load it, and the
small scorpion bites Lara at 1000 life points again, then maybe eg. 679
- and not 662 - will be the value when 976 life points turns into 974
life points.
- Both in Poison1 and Poison2 field, the life values
will change in an increasing exponential way. - So, eg., that's why 972
was the next value in the case above, but then 969 came, and then 966 -
so the difference changed from 2 to 3. Etc.
- As you see, when the
small scorpion bites Lara that means minus 20 life points and starting
an exponential poison value sequence: 32, 30, 28 etc. differences. If
that bites her again that will mean newer minus 20 life points, and if
that bite is a poisoned bite then the sequence differences will start
again. - For example:
life value: 850 - poison value: ,1241,
1242, 1243
life value: 830 - poison value: 1276, 1307, 1337, 1365, -
now the small scorpion has bitten/poisoned Lara again.)
And that
is what will happen in Poison2 field, in the same situation - so the
differences are 1 constantly (but a poisoning bite means a Value 512
jump in the poison value):
1000 value of life bar - 0 poisoning
value
next life value: 980 - 512 poisoning value - the small scorpion
has bitten and poisoned Lara (the life bar has gone green)
still life
value: 980 - 513, 514, 515, 542, 543, 544 poisoning value - the
poisoning value is changing though the life value is still the same
next life value: 979 - 545, 546, 547,606, 607, 608 poisoning value - the
life value starts decreasing continuously, due to Lara being poisoned
next life value: 977 - 609, 610, 611, 670, 671, 672 poisoning value
next life value: 975 - 673, 674, 675, 734, 735, 736 poisoning value
Etc.
At the SCORPION in Poison1 field, the difference between the
first and the second value (one value for each frame) is 128, the second
and the third value is 120 (+/-1) etc. The difference will decrease
frame by frame and will be constantly 1 at last. - So this is how the
procedure will happen (eg. if the scorpion bites - and poisons - Lara
when she has the full life points):
1000 value of life bar - 0
poisoning value
next life value: 880 - 128 poisoning value - the
scorpion has bitten and poisoned Lara (the life bar has gone green)
still life value: 880 - 248, 360, 465, 564, 657 poisoning value
then
the life value starts decreasing continuously, due to Lara being
poisoned
Etc.
But that is what will happen in Poison2 field,
in the same situation - so the differences are 1 constantly (but a
poisoning bite means a Value 2048 jump in the poison value):
1000
value of life bar - 0 poisoning value
next life value: 880 - 2048
poisoning value - the scorpion has bitten and poisoned Lara (the life
bar has gone green)
still life value: 880 - 2049, 2050, 2051, 2090,
2091, 2092 poisoning value
then the life value starts decreasing
continuously, due to Lara being poisoned
Etc.
2. Though the
poisoning will change (increase) and the life energy will also change
(decrease) above 4097 poison value, both Poison1 and Poison2 field will
usually stop showing the increasing poison sequence at Value 4097. (If
Lara was poisoned with full life energy and bitten only once then she
will has half of her life energy points at this Value 4097.)
Notes:
- Naturally, if Lara has been poisoned with low life
energy, then the poison value will never reach 4097, because Lara will
die before that.
- If some 'special effect' happened then there can
be values after 4097 in these fields. ('Special effects' eg. if more
than one poisoning bite hit Lara or if you force a value into this
field.) - So, eg. if the scorpion bites and poisons Lara when Poison2
running value is 4000 then the poison value jumps to 4000+2048=6048
value, and stops, because that is bigger than 4097 - though, life energy
and poisoning continue changing.
But be careful: values above 4097
can be inaccurate to calculate with them, so e.g. you'd better avoid
them in conditions.
- Now you can understand why the small scorpion
linear sequence starts from 512 and the scorpion sequence starts from
2048: the scorpion sequence will reach 4097 sooner, demonstrating 'this
is a stronger poison'. - The bigger jumps between the starting values in
the scorpion exponential sequence result the same.
3. Using a
small medipack, the life energy stops decreasing and jumps up to +50 %.
Using a big medipack, the life energy stops decreasing and jumps up to
the full energy.
Using any medipack, the screen stops flickering in
about 1-2 seconds.
Using any medipack, the value in Poison1 field
stops increasing, and starts decreasing fast to 0 in an exponential way.
(The life bar remains green till reaching this 0.)
Using any
medipack, the value in Poison2 field stops increasing, and jumps to 0 at
once.
Case A:
a, Poison1: if you force a value into this field
then the life energy will continue changing as if nothing had been
happened. The poison value will run fast to its normal value - for
example: the 'real' value is just 687 when you force 4000 into the
field. After that, the value will run fast to - no, not to 687, because
the 'real' poison value continues increasing so far. So it will run fast
to eg. 808, that is the actual real poison value now. And then, the
poison value continues increasing in this field.
But all of this
seems senseless. Or it is not? - Well, it's worth forcing a value here,
because the screen will always flicker according to the value in the
poison fields. So, a jump from 687 to 4000 and then a fast run to 808
will result this: 'the screen is flickering only a little, but with a
sudden jump, it will flicker hard for a moment, then soon, it will
flicker only a little again'.
Forcing a value here when Lara is not
poisoned results the screen will flicker for a moment (eg. if the forced
value is 4000 then it will flicker hard) and the life bar will be
poisoned for a moment.
b, Poison2: if you force a value into this
field then the life energy will continue changing as if nothing had been
happened. The poison value will jump (ahead or back) to the forced
value, and continues the increasing change, keeping the rhythm.
Forcing a value here when Lara is not poisoned results she will be
poisoned, according to the forced value. (So, eg. forcing 4000 here now
results a hard screen flickering, with a 4000 poison value that is
increasing towards 4097.)
c, forcing a value continuously (see:
GT_ALWAYS GlobalTrigger) either in Poison1 or Poison2: the life energy
will continue changing as if nothing had been happened. The poison value
will be constant (the forced value) with a constant flickering. (So, eg.
forcing 600 here now results a constant low screen flickering.)
Case B: for example, a 'value is bigger than 4000' means an 'if Lara is
poisoned hard and the screen is flickering hard' condition in both
fields. (C25 trigger examines only if Lara is poisoned but doesn't care
about the degree of the poisoning.)
Lara. Rope. Speed sliding on
the rope (Short)
This field shows Lara's actual horizontal
coordinate, compared to the original vertical axis of the rope, when
she's just hanging on that rope.
The values change in an interval in
which the maximum value is about 11000, and the minimum value is about
-11000. (I think 4096 means 1 square distance.) Positive values mean
'Lara swings forwards', negative values mean 'Lara swings backwards'.
(The value won't be updated, so the last value will be 'frozen' in the
field
- while Lara is turning around the rope or climbing up or
down, or
- if Lara had left the rope and then didn't catch this rope
or another one.)
Case A: this value cannot be forced.
Case B:
don't forget the rope also moves a bit with Lara when she's just hanging
on it. So she will also produces positive or negative values in this
field if she's not swinging. That's why, eg. a 'Value is smaller than 0'
is not a proper definition for an 'if Lara's just swinging backwards'
condition. So, if you want to define an 'if Lara's just swinging
backwards' condition, then use this 'Value is smaller than 0' in this
Case A, and a 'usual' 'if the keyboard command is dash' condition as
well - so the game will study if the value is smaller than 0 only if the
player holds Key 'Dash' down to swing the rope. (Naturally, the game
won't study Value 0 now if Lara swings on the rope, but due to the
momentum after the player have released Key 'Dash'.)
Naturally, if
Lara is just hanging on the rope then the value will never be too big in
this field. So, eg. a 'Value is bigger than 10000' always mean an 'if
Lara has just swung forwards very long' condition (either if Key 'Dash'
is just pushed down or only if the momentum took Lara forward a so big
distance after Key 'Dash' being pushed down or if Lara has left the rope
after the swing and the value is 'frozen' in the field).
Lara.
Special Status of Lara (Byte)
This field contains some flags for
Lara.
I think it's pretty complicated - but that's what my
experiences are:
0: she jumps aside, steps aside, the moment when
standing and facing the wall (or in a low angle) touches/bumps that,
shimmying around the corner (both on ledges and ladders), dead, the
moment when getting the parallel bar, ignites the torch/with the torch,
picks up the item (in any way), places the item (except nitro), uses
sandbag/waterskin/jerrycan, interaction with doors/switches*/pushables,
uses the crowbar, uses the mechanical scarab
+1: this flag is added
if she holds the flare/torch in her hand** - but only if she does that
according to FLARE_ANIM or TORCH_ANIM. (So, eg. the flag is not used if
she holds the flare jumping or swimming etc., because her hand movements
are different from ANIM object hand animations.)
+2: supposedly an
existing flag. But it's unknown.
+4: this flag is added if she does
anything that is not mentioned at Flag0.
+8: this flag is added if
she is burning.
+16: I couldn't identify this flag. Paolone says the
flag may be added if she's on all fours - but 'all fours' state is
calculated in '+4' flag.
+32: this flag is added if Lara starts an
interactive animation (to pick up an item etc.) and she needs some
automatic aligning (sidesteps etc.) to start the animation. (The flag is
added even if the aligning is so little that you can't see any aligning
on the screen.)***
+64: this flag is added if Lara is over a square
having the monkey attribute. (So the flag is also added if Lara is not
doing monkey swing there.)****
*: it seems +4 flag in the case of
buttons, instead of 0.
**: with the torch in Lara's hand, the flag is
usually 5 (+1+4). When Lara ignites the torch/with the torch then these
will be the new flags before getting back to 5: 4 (moving hand to the
fire), 0 (igniting), 1 (moving hand back from the fire).
***: if this
flag exists, then the flag will turn into picking up '0' flag a bit
later, naturally, if the interactive animation starts. But, not at once.
I mean, if +32 flag exists, then the flag turns into 4 or 32 before the
0. (If it's 4 or 32 that depends on the type of the aligning.)
****:
this flag will be dropped for a frame if the player releases monkey bars
during Lara is moving.
Note: as you see, some flags will appear
only for one or two frames. I mentioned some of them - but only the more
important cases. (So maybe you encounter other cases in which the flags
will change only for some moments.)
Some examples, to understand
the flags:
Lara is running over some flat squares, with a flare
in her hand when there are monkey bars above her - the flag is now:
+64+1+4=69.
Lara bumps to the wall while burning, or lying dead on
the floor while burning - the flag is now: 0+8=8.
Case A: forcing
these values could be buggy. (Anyway, use 'real' triggers instead of
them, if it's possible. E.g. use F63 if you want Lara to be burning
etc.)
Case B: as this field is very complicated, you'd better be
careful, if you want to define a condition here. - By the way there are
'real' and clear CONDITION triggers if you want this kind of condition
(e.g. C5 or C30 etc.) and even 'the monkey bar above Lara' condition can
be found in ENV_MONKEY_CEILING Script constant.
But, for example, +32
flag could be an interesting condition if you want to study the
existence of aligning.
Lara. Special2 Status of Lara (Byte)
This field contains some flags for Lara - that's what my experiences
are:
+1: Lara is over a square having a grey frame (by Room
Editor 'B' button) for the mechanical scarab.
+2: supposedly an
existing flag. But it's unknown.
+4: Lara is crouching - after
standing or on all four.
+8: Lara shoots. (The effective shooting. I
mean, it doesn't matter now, eg., if Lara loads the shotgun.)
+16:
the screen is seen through the binoculars or the lasersight graphics.
+32: Lara has a burning torch in her hand.
+64: Lara uses/used a
ladder (and didn't hang on a ledge after that).
Some examples, to
understand the flags:
Lara has climbed up a ladder and drawn her
crossbow and now she's shooting - the flag is now: +64+8=72.
Lara has
climbed down a ladder then grabbed a ledge to hang and fallen down. Now
she's crouching on a square with a grey frame - the flag is now +1+4= 5.
Note: when there is the lasersight graphics on the screen and Lara's
shooting with the revolver then +8 won't be added to +16. I.e. it will
only with the crossbow.
Case A: forcing these values could be
buggy. (Anyway, use 'real' triggers instead of them, if it's possible.
E.g. you can force the crouching animation on Lara, if you want.)
Case B: there are some conditions instead of this Case B. For example,
'if Value is +8' is the same as 'if Lara is shooting' in C5 trigger.
But, for example, studying if Lara is over a grey framed square or if
there is the lasersight graphics on the screen (removing the
binoculars-usage, that has the same flag, by another condition) are
possible only with this Case B now.
Lara. Test. Climb sector Test
(=1 yes; =0 no) (Short)
It defines if Lara is over a square that has
the climb attribute at any wall around it (1) or not (0).
Case A:
if you don't want to use a flipmap to create/remove a climbable wall in
a room, then force 0 (continuously!) in this field (which will remove
the climb attribute all around the actual square where Lara just is) or
force 1 (continuously!) in this field (which will create the climb
attribute all around the actual square where Lara just is).
Case B:
you can use this Case B as a condition if all you want to know if Lara
is in a climbable place or not. But see ENV_CLIMB Script constants for
more exact conditions.
Lara. Test. Lara has a flare in the and (1
= yes) (Short)
It defines if Lara has a working (!) flare in her hand
(1) or not (0).
Note: if the flare is almost totally out, so it
will start flickering, then the value also starts 'flickering' between 0
and 1.
Case A: forcing values here is buggy or effectless.
Case B: Value 1 means an 'if Lara has a flare in her hand' condition.
Value 0 means an 'if Lara hasn't a flare in her hand' condition. (This 0
could be pretty useful to use it with an 'empty hand' condition
together, if you want a 'totally empty hand' condition, because a simple
'empty hand' condition means 'totally empty or a flare in it'
condition.)
Lara. Test. Lara is on rope (different than -1 lara
is on the rope) (Long)
It defines if Lara is on a given (!) rope (not
-1) or not on any rope (-1).
The values depend on the Room ID (the
lower room ID's have the lower field values) and when the given rope was
placed in the given room (the sooner placed ropes have the lower field
values). - For example, in a level that has these five ropes:
Room6:
- Rope placed in the first place of the ropes that are just
placed in this room: field value is 0
- Rope placed in the second
place of the ropes that are just placed in this room: field value is 1
Room14:
- Rope placed in the first place of the ropes that are just
placed in this room: field value is 2
- Rope placed in the second
place of the ropes that are just placed in this room: field value is 3
Room15:
- The only one rope in this room now: field value is 4
So it is NOT the object ID that matters when you want to define the
first, the second etc. rope of the room!
Case A: forcing these
values is buggy.
Case B: for example, in the example above, Value 2
means an 'if Lara is hanging on one rope of Room14, which rope was
placed in the first place of the ropes that are just placed in that
room' condition.
But if you use a 'Value is bigger than -1' condition
that means 'if Lara is hanging on a rope'. (This condition is realizable
with animation and/or stateID conditions, as well.)
Note:
See
another method for this, here, below: 'TRNG Index. Index of last item
used by Lara (Short)' field.
Lara. Test. Lara is placing the
weapon on the back (1 = yes) (Short)
It defines if Lara is aiming at
any enemy (1) with any weapon or not (0).
Notes:
- Only the
'real aiming' is what matters. So, if the enemy is aimed only because
you force the aiming with the lasersight, that doesn't calculated now.
- If Lara is aiming but holstering the weapons then the value will
remain 1 during the holstering move.
Case A: this value cannot be
forced.
Case B: Value 1 means an 'if Lara is aiming at an enemy'
condition. Value 0 means an 'if Lara isn't aiming at an enemy'
condition.
Lara. Test. Throw out item from the Hands (1 = lara is
throwing out item) (Short)
This field contains flags for the torch:
0: Lara picks up/holds the torch / torch is (in NGLE
position/thrown/dropped) on the floor
1: Lara throws the torch by
hitting SPACE
2: Lara drops the torch by drawing a weapon (with
shortcut keys or in inventory)
3: Lara ignites the torch with the
flame / the flame with the torch
Case A: some of these properties
can be forced with 'normal' triggers. See more about this in the
tutorial on The Torch.
Case B: see the same
tutorial if you want to know about how to use these values as
conditions.
Lara. Weapon on the back of Lara (Short)
It
indicates if a weapon is just seen placed on Lara's back. - The values
are:
0 - there's no weapon on Lara's back
3 - the shotgun is
on Lara's back (because object slot ID3 is SHOTGUN_ANIM)
4 - the
crossbow is on Lara's back (because object slot ID4 is CROSSBOW_ANIM)
5 - the grenade gun is on Lara's back (because object slot ID5 is
GRENADE_GUN_ANIM)
Case A: forcing a value here, the required
weapon will be seen on Lara's back. (It has nothing to do with which
weapon Lara will draw, hitting SPACE.)
Case B: for example, Value 5
means an 'if the grenade gun is seen on Lara's back' condition.
Statistics. Distance (Long)
This field contains the distance Lara has
traveled in the whole game (!) so far.
Each 419 means a new meter. -
So, for example:
If the value is 2095 (5x419=2095) then Lara has
traveled 5 meters exactly, the Statistics show '5m'.
If the value is
2514 (6x419=2514) then Lara has traveled 6 meters exactly, the
Statistics show '6m'.
If the value is 2407 then Lara has traveled
more than 5 meters but less than 6 meters, the Statistics show '5m'.
Horizontal and vertical distances are both calculated.
(Please
note what I said above: if the animation has a SetPosition AnimCommand,
changing a coordinate, then that coordinate won't be refreshed in this
field while the animation is being performed - so, till the end of the
animation, the distance won't be refreshed either.)
Case A:
sometimes it is worth forcing a value here. For example, if you start a
new level then you force 0 here so the distance in the new level will be
counted from 0 meter (as if the counter worked on only the actual level
and not the whole game) - because this forced 0 affected the distance
value in Statistics as well!
Case B: for example, Value 209500 means
'if Lara has traveled exactly 500 meters so far' condition.
(This
condition may seem to be dumb first, but it isn't under any
circumstances. I mean, for example you will open a secret level for the
player only if he/she was clever and found all the tasks of the level
without too much sauntering. I.e. you will use an 'if the Value is
smaller than,' condition.)
Statistics. Killed Enemies (Short)
This field contains the number of the enemies Lara has killed in the
whole game (!) so far. - But please note:
- Each killing by
explosive ammunition now is calculated as if Lara had killed 2 enemies
at once.
- 'Special' deaths (killings by ACTION triggers, WRAITH1
disappears in the water, poisoned death, 'headless' skeleton etc.) isn't
calculated in this field.
Case A: sometimes it is worth forcing a
value here. For example, if you start a new level then you force 0 here
so the number of the killed enemies will be counted from 0 (as if the
counter worked on only the actual level and not the whole game).
Case
B: for example, Value 15 means an 'if Lara has killed 15 enemies'
condition - if she didn't kill one by explosive ammunition or some
'special' death.
Statistics. Secrets (Byte)
This field
contains the number of the secrets Lara has revealed in the whole game
(!) so far.
Case A: sometimes it is worth forcing a value here.
For example, if you start a new level then you force 0 here so the
number of the found secrets will be counted from 0 (as if the counter
worked on only the actual level and not the whole game) - because this
forced 0 affected the secret value in Statistics as well! (Don't
misunderstand: CUST_SET_SECRET_NUMBER will define the maximum secret
number of a level, and not the starting number of the found secrets on
that level.)
Case B: use C18 (or C17) trigger instead of this Case B.
Statistics. Used Ammos (Short)
This field contains the number of
the ammunition Lara has shot in the whole game (!) so far.
(Each shot
bullet means +1 value in the field. Even if that is a crossbow arrow or
a grenade. - But don't forget: each shot with a dual weapons means 2
shot bullets.)
Case A: sometimes it is worth forcing a value
here. For example, if you start a new level then you force 0 here so the
number of the shot ammunition will be counted from 0 (as if the counter
worked on only the actual level and not the whole game) - because this
forced 0 affected the ammunition value in Statistics as well!
Case B:
for example, Value 500 means 'if Lara has shot 500 bullets so far'
condition.
(This condition may seem to be dumb first, but it isn't
under any circumstances. I mean, for example you will open a secret
level for the player only if he/she was clever and did all the killings
only with a few amount of ammo, aiming precisely. I.e. you will use an
'if the Value is smaller than,' condition. - Of course, it will be a
nice condition only if Lara doesn't have some 'super ammo' just as
grenades.)
Statistics. Used MediPacks (Byte)
This field
contains the number of the small AND big medipacks Lara has used in the
whole game (!) so far.
Case A: sometimes it is worth forcing a
value here. For example, if you start a new level then you force 0 here
so the number of the used medipacks will be counted from 0 (as if the
counter worked on only the actual level and not the whole game) -
because this forced 0 affected the medipack value in Statistics as well!
Case B: for example, Value 20 means 'if Lara has used 20 small or big
medipacks so far' condition.
(This condition may seem to be dumb
first, but it isn't under any circumstances. I mean, for example you
will open a secret level for the player only if he/she was clever and
did the things without too much loss in the health. I.e. you will use an
'if the Value is smaller than,' condition.)
Similar conditions - see:
GT_USED_BIG_MEDIPACK or GT_USED_LITTLE_MEDIPACK type GlobalTriggers.
System. Auto-Aiming for Enemy (Byte)
This field shows if the
auto-aiming is just enabled (2) or not (0).
(Note: if the auto-aiming
is enabled then Value 2 won't show up in the field till drawing a weapon
at the very first time.)
Case A: this value cannot be forced.
Case B: for example, Value 2 means an 'if the auto-aiming is enabled'
condition.
System. Core Game Timer (one unit = 1/30 of second)
(Long)
This field contains the time (in frames) that has passed in
the whole game (!) so far.
Notes:
- This value is updated only
if you have just saved the game (or if you have just loaded that
savegame).
- The 'dead time' (i.e. when the game is paused because
there's a menu on the screen) is also calculated in this field.
Case A: this value is meaningless to be forced.
Case B: for example,
Value 1200 means an 'if 40 seconds has been passed since starting the
game, including when the menus were open' condition (because 1200/30
frames=40 seconds). - But I can't see where this condition could be
useful.
System. Disable special keys (15 disable inventory pause
f5) (Short)
This field starts counting the frames (from 0) when Lara
starts a dying animation. When the counter reaches 301 (i.e. 10
seconds+one more frame) then the game will load you back to the title.
(Of course, with some buttons, the player can force this load to happen
sooner after the dying animation has ended.)
(No, I don't know what
Paolone meant when he said Value 15 has a disabling effect now.)
Case A: forcing a value is useless or sometimes buggy.
Case B: for
example, Value 210 means an 'if 7 seconds has passed after Lara starting
a dying animation' condition.
And this is a very nice Case B,
because, usually, you can't activate anything after Lara died. But, if a
dying animation is shorter than that 7 seconds, then this Case B with
Value 210 will activate anything AFTER the dying animation has ended, so
if Lara is 'totally' dead!
System. Fog Bulb Color (Long)
The
value of the field is the actual color code of fog (whether the distance
fog or fog bulbs just have that) that is defined by an F28 or an F224
trigger. (So if the fog color isn't defined by a trigger, then the value
is 0.)
The meaning of a color code is simple, Just see what I said
above at 'Unknown (Light_D) (Long)' field: so, for example, 1336370 code
means RGB=20/100/50.
Case A: this value cannot be forced.
Case
B: for example, Value 16107580 means an 'if the fog color (defined by a
trigger) is RGB=245/200/60' condition, because
16107580=$F5C83C=$F5/$C8/$3C=245/200/60.
System. Item Memory
address of enemy aimed by Lara (Long)
The value of this field is some
kind of identification of the enemy that is just aimed (automatically)
by Lara.
Honestly, I don't know what that value means (for example,
52551314?) but we don't need to understand that. So, if you want to
identify the enemy that is just aimed by Lara, then put that value into
the Current Value variable. And then F351 trigger will turn that long
number into the game ('tomb') index of the object, and then F300 trigger
will turn the game index into the Room Editor ('NGLE') index of the
object - and that is already a useful value in a condition ('if the
enemy aimed by Lara has XX NGLE object index').
System. Number of
current Level (Byte)
This field shows the ID of the level - but
updates that only if you save the game or loading that savegame.
(The
ID of the level depends on the position of the [Level] block of the
level in the Script. So title ID is 0, the level with the first [Level]
block has ID1, the level with the second [Level] block has ID2 etc. -
these 1, 2 etc. are the ID's that FINISH triggers use.)
Case A:
this value cannot be forced.
Case B: it is senseless to use these
values as conditions. I mean, the conditions of a level always work only
in that level, so you don't need to study if you are in the given level.
System. Screen Timer (Increased only when it is different than 0)
(Long)
This field shows (in frames) the actual value of the so-called
'Screen Timer'.
Please note the Screen Timer will show up on the
screen only if you use 'Timer= ENABLED' Script entry - but, without that
entry, the F86 trigger of the Screen Timer will also start and stop the
timer in this field. (So, without that entry, you can use the Screen
Timer in a hidden way.)
Case A: either you use the Screen Timer
in a hidden way or not, you can force a value in this field. The timer
will jump ahead/back at once to the forced value, continuing running.
(If you force the value when the timer is not running, then the timer
will start running, from the forced value.)
Case B: for example,
Value 1500 means an 'if the Screen Timer has just reached 50 seconds'
condition. - But, if you don't use the timer in a hidden way then use
C20 timer instead of this Case B. (Note: in TRNG 1.2.2.6 there's a
clerical error in C20, i.e. you must change the 'lower' and the 'higher'
conditions with each other. When I'm making this tutorial, the problem
is solved in 1.2.2.7 beta.)
System. Unknown (Item chosen from
Inventory? (Long)
The default value here is -1 - but will change if
Lara chose anything from the inventory:
0: Uzis
1: pistols
2: shotgun
3: revolver
4: revolver with lasersight
,
19: standalone lasersight
20: big medipack
21: small medipack
22: binoculars
23: flare
,.
25: load game
26: save game
,
44: PUZZLE_ITEM8
,
There are a lot of values here. I didn't want to find all of them, so I
wrote only some examples now. So if you want to know the value of an
inventory item after you've chosen that, then put the field value in a
variable and study the variable value after you've chosen the item.
Notes:
- the field won't be updated if you change something
by keys and not directly from the inventory.
- the value will change
even if there is no effect (i.e. if you chose the weapon that just is in
Lara's hand or if you chose a medipack when Lara is totally healthy
etc.).
Case A: this value cannot be forced.
Case B: usually
there are better methods than this Case B if you want to examine if an
item is chosen or not (see C59 trigger or GT_USED type GlobalTriggers).
But I think there are some special items when none of them work, so you
can try this Case B somehow.
TRNG Index. Animation Index for
Selected Animation Memory (Short)
The subject of a field of the
Animation Memory Zone is usually a constant animation number, defined by
F307 trigger.
But you can put this or that animation number into a
variable during a game, and then put that variable value into this 'TRNG
Index,' field. Doing that, you've defined the subject animation - so you
don't need F307 trigger now.
TRNG Index. Index of last item found
with testposition or condition (Short)
This field contains the game
('tomb') index that is just found by a condition.
For example, use a
GT_COLLIDE_SLOT type GlobalTrigger, with BADDY_1 slot. If Lara collides
with a BADDY_1 then a TriggerGroup will be activated. In this
TriggerGroup, you will put an F244 trigger that puts the value of this
'TRNG Index,' field into a variable. This value is the game index of the
object that is defined by the latest condition. This condition is
GT_COLLIDE_SLOT-BADDY_1 so this game index is the game index of the
BADDY_1 Lara has just collided with now.
Use an F300 trigger to turn
the game index into the Room Editor ('NGLE') index of the object - and
that is already a useful value in a condition ('if the BADDY_1 Lara
collides with has XX NGLE object index').
(Okay, there is an easier
way for this concrete operation - see: GT_COLLIDE_ITEM type
GlobalTrigger - but now we understand how this field works. Besides, if
you don't want to study that index in a condition, but want to know the
actual BADDY_1 index Lara collides with, then this example could be
useful the way it is written.)
Please note that the field will be
updated only at the next find of an index.
TRNG Index. Index of
last item used by Lara (Short)
This field contains the game (!) index
of the object Lara has interaction with last.
So if she grabs a rope
or a parallel bar or pushes a button or gets on a motorbike etc. then
the game index of the object will show up in the field.
Please
note that the field will be updated only if Lara has a new interaction
and some interactions (picking up an item, placing an item, using a
lever switch, climbing on a polerope etc.) are not working in this
field. So, if you want to know what kind of object interactions are
useful in this field then put the field value in a variable and study if
the variable value changes if you use that object.
Case A: this
value cannot be forced.
Case B: after you transform that game index
into NGLE index (by F300 trigger) then that index is useful in a
condition. For example, having a big wall button (just as in the
original catacomb.prj Room84) with 63 NGLE object index: an 'if the
object NGLE index is 63' and an 'if Lara is doing the big wall
button-pushing animation' mean 'if Lara is using ID63 button'. (The
animation-condition is necessary. Without that, the index-condition
would also be true after using the button - because, as I said, the
field won't be updated after the usage, only at the next interaction
with anything.)
TRNG Index. Index of moveable performing last
AnimComand (Short)
For example, your BADDY_1 slot has an AnimCommand
at a frame of AnimationX. This AnimCommand is a TriggerGroup that
contains two triggers: one of the triggers (T1) is the one the baddy
will execute at that frame. The other trigger (T2) is an F244 trigger
that puts the actual value of this 'TRNG Index,' field into a variable.
It means T2 puts the game index of the baddy just executing T1 into that
variable.
Let's suppose there are more than one BADDY_1 (A, B and C)
are living at the same time. Create a GlobalTrigger that transforms the
game indices in that variable into NGLE indices continuously while the
baddies are living.
Let's suppose you want to activate something only
if 'A' BADDY_1 executes T1 and don't want activate that if 'B' or 'C'
baddies do that. So now you study the NGLE index in the variable (in the
same GlobalTrigger), and if that is the index of 'A' baddy then the true
condition activates what you want.
Please note that the field will be
updated only at the next performing (by anyone) of that AnimCommand.
(See some similar thing above: 'Frame Now (warning it's an abs value)
(Short)' field.)
TRNG Index. Item Index for Selected Item Memory
(Short)
The subject of a field of the Item Memory Zone is usually a
constant object, defined by A54 trigger.
But you can put this or that
object game (!) index into a variable during a game, and then put that
variable value into this 'TRNG Index,' field. Doing that, you've defined
the subject object - so you don't need A54 trigger now.
(Use F301
trigger if you don't know the game index of an object.)
TRNG
Index. Slot Index for Selected Slot Memory (Short)
The subject of a
field of the Slot Memory Zone is usually a constant object slot, defined
by F292 trigger.
But you can put this or that object slot index into
a variable during a game, and then put that variable value into this
'TRNG Index,' field. Doing that, you've defined the subject object slot
- so you don't need F292 trigger now.
TRNG Organizer Timer.
(Increased always in game but not in inventory and pause) (Long)
This
field contains the time (in frames) that has passed in the whole game
(!) so far.
Notes:
- This value is updated continuously.
-
The 'dead time' (i.e. when the game is paused because there's a menu on
the screen) is NOT calculated in this field.
Case A: sometimes it
is worth forcing a value here. For example, if you start a new level
then you force 0 here so the number of the passed time will be counted
from 0 (as if the counter worked on only the actual level and not the
whole game).
Case B: for example, Value 1200 means an 'if 40 seconds
has been passed since starting the level, excluding when the menus were
open' condition (because 1200/30 frames=40 seconds).
This condition
is a nice tool to activate things in the given moments of the level. Or
to give some reward to the player if (s)he accomplish the level during a
given time.
Code Memory Zone
fields
Audio Track Number on Channel 1 (only for
read) (Short)
Audio Track Number on Channel 2 (only for read) (Short)
These fields (using the new sound system) show which audio file just
plays on channel1 or channel2. (-1 means no audio file is just playing.)
Case A: this value cannot be forced. (By the way, there are the
'Sound' FLIPEFFECTs to play an audio file.)
Case B: for example,
Value 80 in Channel2 field means an 'if ID80 audio file of the audio
folder is just playing on channel2' condition.
(But be careful! If
the file stops in single mode because it has ended by itself and not
because it has been stopped, then the value remains the file ID, not -1,
and will be updated only when the next file will play.)
Camera
Mode Next (0='follow me', 1='fixed', 2='look'; 3 ='combat') (Long)
Camera Mode Now (0='follow me', 1='fixed', 2='look'; 3 ='combat') (Long)
The 'now' field shows the actual camera type that is being used:
0: chase camera
1: placed Camera or Fixed Camera
2: look camera or
standalone TARGET
3: combat camera
Notes:
- Do some
tests if you want to know how this field works with flyby cameras. (I
mean it seems a bit messy for me. Anyway, it uses 0 and 1.)
- Special
camera effects use the camera value of the camera they use. (Eg. standby
effect uses chase camera so standby effect uses the value of the chase
camera.)
Case A: the 'next' field value seems a constant 0.
However, the 'next' field is useful, because you can't force the camera
values in the 'now' field. So, if you want your actual chase camera will
adopt the position of the look camera, then force Value 2 (continuously)
in the 'next' field, or, if you want your actual chase camera will adopt
the position of the combat camera, then force Value 3 (continuously) in
the 'next' field.
(An interesting fact: forcing Value 2, if you move
the look camera view with look button and cursor keys, and then release
those buttons, then the chase camera position will keep the last camera
view you've adjusted by the buttons.)
Case B: for example, Value 3 in
the 'now' field means an 'if the combat camera is just active'
condition.
Current Level number (more updated than savegame
memory) (Byte)
This field shows the ID of the level.
So this is
the same thing as 'System. Number of current Level (Byte)' has. The
difference: the value in the present field is always updated.
(Though
this time it may be worth forcing a value here - if you have a hardcoded
limitation due to level ID. - Thanks sapper for the information.
For
example, as you know, small scorpions won't poison Lara if the level ID
is smaller than 4. So if you are in the first, second or third level of
your game, and you want the small scorpion to poison Lara then force a
value that is bigger than 3 in this field.
However, be careful: it
will disturb the working of the FINISH triggers. So, before a level
jump, force back into this field the 'real' level ID.)
Dash Bar
Value (0 - 120) (Short)
This field contains Lara's power to dash:
0: Lara has no power to dash.
120: Lara has full power to dash.
Case A: force Value 120 here continuously (it doesn't matter if
she's just sprinting or not), and Lara will have infinite power to dash
- without the dash bar appearing (because when the value is 120, the
game removes the dash bar automatically). (If you force another value
here continuously when Lara's making the sprint animations, then the
power will be infinite and the bar will appear. But now you will see in
the bar that is not full.)
Or force any other value here (not
continuously) when she's sprinting, to remove/add some dash power (i.e.
to adjust the actual power to the forced value).
Case B: for example,
Value 60 means an 'if there is 50 % power of Lara to dash' condition.
(Note this is also true, if Lara has finished the sprint and the dash
bar started increasing. So, if you want this condition to be true only
if Lara is sprinting then also use an 'if Lara is sprinting' condition.)
Earthquake vertical movement (negative values) (Long)
This is the
same I told you at 'Custom_A (Different usage in according with type of
item) (Short)' field, about EARTHQUAKE object. I mean this field shows
the actual intensity of the earthquake. (But this time the values are
negative.)
The difference between that field and this field is this
is a 'general' field, so works with any earthquake, and not only a given
EARTHQUAKE object.
Case A: forcing these values is useless. (I
mean, any value here starts an earthquake at once when being forced, but
that won't affect the 'real' intensity in the game.)
Case B: for
example, Value -50 means an 'if the earthquake intensity just reached a
middle-sized intensity' condition.
Frame 3d Counter. (It works in
game and inventory but not in pause) (Long)
This field contains the
time (in frames) that has passed in the whole game (!) so far.
Notes:
- This value is updated continuously.
- The Pause/F5/F6
menu 'dead time' is not calculated in this field, but the inventory
'dead time' is.
If you want to know more about game timers then
see above 'System. Core Game Timer (one unit = 1/30 of second) (Long)'
or 'TRNG Organizer Timer. (Increased always in game but not in inventory
and pause) (Long)' fields.
Frame System Counter. (Works always,
in game, inventory and pause screens) (Long)
This is almost the same
as 'Frame 3d Counter. (It works in game and inventory but not in pause)
(Long)' field. The difference is this time every 'dead time' is
calculated in the field.
Inventory Item just chosen from
inventory (example a key to open a door) (Long)
The purpose of this
field is troubleshooting. To understand that, I quoted some short (and
edited) part of TRNG 1.2.1.9. readme file:
'Inventory.
The item selected from inventory is <#>Item' condition is interesting
when you wish to create a custom interactive item, where it's necessary
to use some inventory item to engage it. It works like the keys for the
doors, the combo items with some hole combos, or the crowbar for some
wooden doors.
Remark: when you manage the correct selected item
remember to perform also this field: 'Inventory Item just chosen from
inventory (example a key to open a door) (Long)', with -1 as a Value in
Window E.
The reason is that otherwise you'll hear the "NO" sound
sample after using this inventory item.
Inventory Item required in game (example, crowbar for door)
(Long)
This field has usually Value -1. But if the inventory
opens when the player hits CTRL at an object to interact with that, then
the value will be the slot ID of the object that needs for the
interaction, till the inventory is open.
For example: Lara is
standing in front of a door that will open with crowbar (value: -1). Now
the player hits CTRL, the inventory will open at the crowbar (value:
246=crowbar slot ID). The player chooses the crowbar, the inventory
closes (value: -1) and Lara opens the door with the crowbar.
Case
A: there are some receptacles where nothing will happen if you hit CTRL
(see eg. element puzzles), and you need to choose the item will be
placed there manually. Forcing the proper ID in this field in the proper
moment (and when the player hits CTRL), the inventory will open at the
required item. - But use F306 trigger instead for this purpose.
Case
B: to study the just selected item you should use C59 instead this Case
B.
KeyBoard Game Command hit (Use bit operations with KEY1_
constants) (Long)
When the player moves Lara (or does anything) by
the keys then you will see here the code of that key command.
See
KEY1 and KEY2 constants in NG Center\Reference\Mnemonic Constants if you
want to know the meaning of the codes. For example, the code of
KEY1_LEFT is 4, so when the value of the field is 4 that means the
player holds the left arrow pushed down.
Notes:
- If you
customize keyboard commands in Options menu, then both (!) the original
key and the new key will have the code of the key command.
- If the
players hits more than one key at the same time then the aggregate what
matters. For example, hitting up arrow and SHIFT to walk forward=1 (up
code) +128 (SHIFT code)=129.
- Be careful, if you have an
'alternative solution' for that key command. For example, PAGE DOWN is
an alternative solution for right arrow+SHIFT, as you know. Right (8)
plus SHIFT (128) is 136 - but PAGE DOWN/Right+SHIFT will show 2048 (?)
plus 128 (SHIFT)=2176 value in the game. (DELETE is 1024+SHIFT=1152.)
- The KEY2 codes in this field must be read this way:
For example,
the code of KEY2_DASH is 16384. It's $4000 as a hexadecimal code. Put
four times Digit 0 to the end. It's $40000000. Now turn it back into a
decimal value: 1073741824 - and this is the 'real' code of this key
command in this field.
- Unfortunately, keyboard commands aren't
detected when the menus are open. That's why there isn't a KEY1/KEY2
code for, eg., ESC in the Mnemonic Constants. (Though ESC just being
pressed will be detected, if you hit that to close a menu, and the menu
is closed now, but the ESC still is being pushed. The code is 2097408.)
- Value 0: if the player is just not hitting any key.
Case A: try
F53 trigger instead of this Case A.
Case B: try C13 trigger instead
of this Case A. (And see a similar condition: C12.)
Music volume
(max = 100) (Long)
This field has nothing to do with C133 trigger
that adjusts the volume on a given audio channel. I.e. this field
(working perfectly only in the new sound system) contains the 'general
volume' of the audio - the one you see in Options menu.
0: audio
is mute
100: audio with max volume
Case A: you can force a
preset audio volume for your game, with SoundSettings Script command.
But use this Case A if you want to force a new volume, during the game.
Case B: for example, Value 40 means an 'if the audio volume in Options
menu is 40%' condition.
Screen. Height game screen in pixel (only
for read) (Short)
Screen. Width game screen in pixel (only for read)
(Short)
These fields aren't really useful. I mean they inform you
about your screen resolution - but you can't modify that in the fields.
For example, at 1024x768 resolution, 'height' field is 768 and 'width'
field is 1024.
Script Dat. Level Flags (Use bit operation to read
or change) (Short)
This field contains information about a lot of old
Script commands (either they are well-known or unused in our Level
Editor) you can find in [Level] blocks.
If a command like that is
present in a level with numeric or ENABLED values then that command will
have a value in this field.
But if a command like that is not present
in a level or is present but with DISABLED value (or is disabled with a
semicolon) that command won't have a value in this field.
For
example, a 'Horizon=ENABLED' command in your [Level] block has a value
(4) in this field, and a 'Layer1= 160, 160, 192, 7' in your [Level]
block will also have (8). The 'real' value of the field is the aggregate
of the values of the commands here.
So, eg. if only that
'Horizon=ENABLED' and 'Layer1= 160, 160, 192, 7' have values in this
field, then the 'real' value of the field is 4+8=12.
All the
values are:
1: YoungLara
2: Weather
4: Horizon
8: Layer1
16: Layer2
32: StarField
64: Lightning
128: Train
256: Pulse
512: ColAddHorizon
1024: ResetHUB
2048: LensFlare
4096: Timer
8192: Mirror
16384: RemoveAmulet
32768: NoLevel
Case A: be
careful - some of the values can be forced in this field, but some of
them can't. However, this field is a nice tool to enable/disable
properties you can't enable/disable by a direct method (at all or in a
nice way). - Let's see an example:
The field value is 2060=Horizon
(4)+Layer1 (8)+LensFlare (2048). You want a moment in your level, when
the sun effect (i.e. LensFlare) will be switched off in all the outside
rooms. You can do that, if you create a flipmap version for all your
outsides rooms, switching off the NL button in all those flipped rooms.
- Or another method: you force Value 12 in this field (4+8), leaving
horizon and layer values alone, but removing the value of LensFlare
(2048).
Or another nice possibility: You don't have a Train=ENABLED
entry in your Script, so this is not a train level - though, there is a
train formed here. Lara will get into the train, you force the value of
Train (128) in the field - and 'the train will start'.
Unfortunately,
you cannot force something to switch on in an easy way if that thing
uses numeric values in the Script. For example, you don't have a
LensFlare entry in your Script, so if you make LensFlare become enabled
in this field, then that will be useless (because the game won't know
which numeric values to use). - The problem could be solved, if you
place a LensFlare entry in the Script, but remove its value from the
field when the level will start, and later, in the required moment, you
will add its value to the field.
Case B: this Case B is a bit
complicated, but usable. So, eg. Value 5120 (1024+4096) is an 'if this
level is a ResetHUB level and if it is possible to print the Screen
Timer on the screen here, but there aren't other command values'
condition.
Script Dat. Option Flags (Use bit operations to read
or write) (Byte)
I don't know what to say. I mean, in my levels, this
field always has a constant, long value (270055424) and if I try to
force another value here then nothing will happen. If I try the same
things in the [Title] block then the solution will be buggy.
Paolone
says, Option flags (FlyCheat, LoadSave etc.) are written in this field,
but whatever I do (i.e. eg. disabling flycheat) then the value will
remain the same in the levels.
Sound SFX volume (max = 100)
(Long)
This field contains the 'general volume' of the sound - the
one you see in Options menu.
0: sound is mute
100: sound with
max volume
Case A: you can force a preset sound volume for your
game, with SoundSettings Script command. But use this Case A if you want
to force a new volume, during the game.
Case B: for example, Value 40
means an 'if the sound volume in Options menu is 40%' condition.
Speed Layer1 (4th field of Layer1= script command) (Byte)
Speed
Layer2 (4th field of Layer2= script command) (Byte)
Layer1 and Layer2
are sky patterns. You can define their preset values in the Script. -
This is what 'speed' means now:
0: the clouds are still
from 1
(minimum speed) to 127 (maximum speed): the clouds are drifting
northwards (Room Editor facing)
from 128 (maximum speed) to 255
(minimum speed): the clouds are drifting southwards (Room Editor facing)
I mean, using Layer2, the north/south intervals are swapped with
each other. (So 1-127 is the south interval, and 128-255 is the north
one.) Except: if both of the layers are being used at the same time.
Case A: use F153 trigger instead of this Case A, to force a new
speed/direction for the clouds.
Case B: for example, Value 60 in
Layer1 field is an 'if Layer1 sky pattern is drifting northwards,
according to Room Editor facing, with an average speed' condition.
Test. Disable Fog Bulbs (1 = disable) (Byte)
This field contains
information about Volumetric FX option:
0 - option is checked
(i.e. fog bulbs are enabled, the distance fog is disabled)
1 - option
is unchecked (i.e. fog bulbs are disabled, the distance fog is enabled)
Case A: instead of this Case A, use the setup of the game, the
ForceVolumetricFX Script command or F61/F62 triggers.
Case B: Value 0
means an 'if fog bulbs are enabled and the distance fog is disabled'
condition, Value 1 means an 'if fog bulbs are disabled and the distance
fog is enabled' condition.
Test. How entered in current game (New
level=0; From savegame = 4) (Byte)
Whatever I do the value of this
field is always 0 for me. Even after a savegame has been loaded.
Test. There is a Flyby in progress (1 = true / 0 = false) (Long)
This
field informs you if a (any) flyby camera sequence is just
0 -
not being performed
1 - being performed
Note: if the sequence
is endless, in a loop mode, because Lara is standing on the
flyby-activating trigger continuously, then the value will be 0 for a
moment when the sequence is just being restarted.
Case A: forcing
these values is buggy.
Case B: Value 0 means an 'if any flyby
sequence is just not being performed' condition, Value 1 means an 'if
any flyby sequence is just being performed' condition.
Slot Memory Zone
fields
Explosion Mask. (Each bit a type of weapon
able to do explode it (Long)
The most of our objects don't have a
shatterable mesh. But if you have a value here that is not 0 then one or
more meshes of the object is shatterable - but only if that is aimed by
lasersight. (Thanks sapper for the information.) - The values are simple
bits:
Bit0 (1) - Mesh0 is shatterable
Bit1 (2) - Mesh1 is
shatterable
Bit2 (4) - Mesh2 is shatterable
Bit3 (8) - Mesh3 is
shatterable
Bit4 (16) - Mesh4 is shatterable
Etc.
For
example, you can shatter the head (Mesh9) and the shield (Mesh11) of the
skeleton, that's why the value of the skeleton in this field is
512+2048=2560, because Mesh9 has Bit9 (i.e. 512) and Mesh11 has Bit11
(i.e. 2048).
Case A: force a value here to make one or more
meshes of an object become shatterable. (Still having the collision
after the crash.)
(Note: you cannot place a HEAVY under this object
to activate something if the mesh has been crashed. But you can use a
trick:
As I said, if all the meshes of the object are visible, then
the value of 'Visible Mesh Flags (each mesh a different bit) (Long)'
field is -1. Let's suppose all the meshes are visible now and Lara has
shot Mesh9 using the lasersight. Now the value of Mesh9, i.e. 512 will
be subtracted from the field value, that is -1-512=-513 now. - So a
Value -513 condition in 'Visible,' field means an 'if all the meshes are
visible and Mesh9 has been shot" condition.
The formula will also
work if not all the meshes are visible.)
Case B: it's worth studying
if a mesh shatterable or not if you force the 'shatterable' property on
that mesh only in a given moment of the game.
First Animation
Index (Short)
This field helps you to identify the first animation ID
of an object slot (if you don't want to identify that from NG
Center\Tools\Animation Watcher).
For example, if the Animation0 of
BADDY_1 has Animation656 as the absolute animation index of X.wad then
the value of this field is 656.
It helps you, eg. in 'Animation Now
(Number of current animation) (Short)' field (see above):
Actual
absolute animation ID minus first absolute animation ID equals actual
(non-absolute) animation ID.
First Mesh Index (Short)
Open the
'Select Object' panel in the Room Editor. Let's suppose this is what you
see at BADDY_1: #RMI=80, #AMI=332.
If you find Mesh #80 in StrPix,
then this is the first mesh of that BADDY_1 (i.e. the mesh you find as
Mesh 0 in WADMerger Animation Editor). Value 332 is the so-called
'absolute index' of this mesh.
The value of the field is always
'twice #AMI'. It means this time the field value is 2x332=664. - But I
don't know where it could be useful.
Flags. Main flags (Short)
This field seems complicated - so I'll just write my experiences:
1: if the object slot has this flag then the object slot will be
present in the TR4 file. (So if you converted a PRJ file having this
slot in its WAD into a TR4 file, then the slot will have the flag - even
if you didn't place an object of the slot in the map.)
2: object
slots with AI (not only creatures, but eg. ENEMY_JEEP) will have this
flag. (Creatures with hardcoded animations - see emitter creatures or
wraiths - aren't included.)
4: I didn't find this flag in any of the
slots. Maybe doesn't the flag exist?
8: if an object slot doesn't
have this flag then its position won't be saved in a savegame file when
you save the game.
However, this is not the whole truth, because, eg.
LITTLE_BEETLE doesn't have the flag, in spite of (naturally) the
positions of the little beetles will be saved in the savegames.
16:
Paolone says maybe this flag means the slot is a 'Moveable of the
ground'. Well, flying and swimming creatures will also have the flag, so
I'd rather say if the object slot having this flag moves then its
position will be defined compared to the floor. (Or maybe it means the
gravitation will be calculated at these objects?)
32: almost all the
slots have this flag, but mostly the technical objects (LARA_SKIN, MIP
objects, AI objects, GUN_FLASH etc.) don't have. So I think the flag
means the slots with the flag are 'real' Moveable objects. (Though
LITTLE_BEETLE, BRIDGE objects and MINE also don't have the flag.)
64:
Paolone says maybe this flag has something to do with collisions. I
don't know what to say. I'd rather say this flag is on if the
(dis)appearance, working, animation, collision (?) of the object slot is
NOT controlled in a hardcoded way.
However, this is not the whole
truth, because, eg. some 'hardcoded type' object slots will have the
flag (FALLING_BLOCK, WRAITH, SMASHABLE_BIKE_FLOOR, PUZZLE_HOLE etc).
128: I didn't find this flag in any of the slots. Maybe doesn't the flag
exist?
256: only water creatures (see: CROCODILE, HAMMERHEAD) have
this flag - so they can move not (only) in 'air rooms' but in
water/quicksand rooms (as well).
512: I think this flag means the
object slot will look in the game as it looks in the Room Editor. I mean
they don't have the flag because the condition isn't true about them:
Lara is an 'ugly mesh pile' in Room Editor, nullmesh effects are 'small
red pyramids' there, the meshes of some object (RAISING_BLOCK,
EXPANDING_PLATFORM, TEETH_SPIKES, JOBY_SPIKES) will be extended in the
game, PLANET_EFFECT will glow in the game. (Self-created objects - such
as FLARE_ITEM, CROSSBOW_BOLT, GRENADE - will also not have the flag.)
1024: I think this flag has something to do with targeting and/or
hitting. I mean the creatures can be killed in the 'usual way' (i.e. can
be aimed in the automatic way and can be killed by pistols) have this
flag. But DEMIGOD2 or 3 don't have the flag. But eg. SPHINX or MUTANT
(immortal but can be aimed in the automatic way) also have the flag. But
eg. MUMMY or SKELETON (can be killed in the explosive way and can be
aimed in the automatic way) don't have the flag. And, on the top of all
that, MINE also has the flag.
2048: I think the object slot will have
the flag if the slot 'works like a creature, actually, but it's not a
usual creature'. I mean LARA_DOUBLE, MUMMY, KNIGHTS_TEMPLAR, ENEMY_JEEP,
SPHINX, MUTANT, DEMIGOD1, SENTRY_GUN, SKELETON and HORSEMAN has the
flag, and, anyway, MINE too. However, eg. DEMIGOD2, 3 and SETHA don't
have the flag.
4096: the immortal creatures (including ENEMY_JEEP and
SENTRY_GUN) have this flag. (HORSEMAN also has it. I think because while
he's riding the horse he can't be killed.)
8192: I suppose the object
slot will have this flag if one or more meshes of the slot can be
changed in the game (in a hardcoded way): PLANET_EFFECT will glow,
ELEMENT_PUZZLE will look according its OCB and will change when having
been filled, Mesh0 of SWITCH_TYPE7 can shatter, the head or the shield
of the skeleton can shatter, baddies or the guide has a meshswap.
Notes:
- If an object isn't present in a TR4 file then maybe
Flag 1 is not the only one it will not have. I mean, all the creatures
will always have only Flag 512 when not being in TR4 (including eg.
LITTLE_BEETLE), moreover, some other objects (eg. GAME_PIECE) will do
that as well.
- That 'position' of Flag 8 means if the X, Y or Z
coordinates of the object will change. So, for example, when the spikes
of a TEETH_SPIKES object will jump out and then jump back, then the
position of the object will remain the same the same, so the position of
the object doesn't need to be saved in the savegame - hence, eg.
TEETH_SPIKES doesn't have the flag.
(If you move an object without
Flag 8 by an ACTION trigger then the object won't have Flag 8 - though,
the changed X-Y-Z position will be saved now.)
- Defining the flags
it doesn't matter if how any 'secondary factor' is presented - i.e. for
example which skin Lara has, the creature has its meshswap, MIP etc. in
the WAD or not etc.
- It's always the actual slot that matters when
we're talking about an object. I mean, eg. if I place a SCORPION into an
ANIMATING slot to move it like an ANIMATING then the scorpion will drop
the flags of SCORPION slot and accept the flags of the ANIMATING slots.
And these are the flags (supposing the given object slot is present
in the TR4 file):
1 (1): LITTLE_BEETLE, DARTS, FLAME, LENS_FLARE
33 (32+1): RAISING_BLOCK, EXPANDING_PLATFORM, TEETH_SPIKES, JOBY_SPIKES,
some nullmeshes (LOCUST_EMITTER, FLAME_EMITTER, DART_EMITTER,
LIGHTING_CONDUCTOR, SMOKE/STEAM_EMITTER, EARTHQUAKE, LIGHT objects,
ROPE, TRIGGER_TRIGGERER)
41 (32+8+1): FLARE_ITEM, CROSSBOW_BOLT,
GRENADE
121 (64+32+16+8+1): LARA
513 (512+1): HORIZON, BRIDGE
objects, the most of the technical objects (LARA_SKIN, LARA_SCREAM,
CROSSBOW_ANIM, FLARE_ANIM, LARA_HOLSTERS, HAIR, VEHICLE_EXTRA,
SETHA_MIP, WATERSKIN1_1, MEMCARD_LOAD_INV_ITEM, BUBBLES, GUN_FLASH,
AI_GUARD, LARA_START_POS, MESHSWAP, BINOCULAR_GRAPHICS etc.)
545
(512+32+1): KEY_HOLE, POLEROPE, WATERFALL, SLICER_DICER,
SMASHABLE_BIKE_WALL
553 (512+32+8+1): ROLLINGBALL, PUSHABLE_OBJECT,
TWOBLOCK_PLATFORM, all the pickable items (including BINOCULARS_ITEM and
COMPASS_ITEM in the inventory at the game start), BURNING_FLOOR,
OBELISK, ENEMY_PIECE
569 (512+32+16+8+1): GAME_PIECE
609
(512+64+32+1): all the door types (DOOR_TYPE, PUSHPULL_DOOR, KICK_DOOR,
UNDERWATER_DOOR, DOUBLE_DOORS, any TRAPDOOR), the most of the traps
(CHAIN, PLOUGH, STARGATE, SPIKEBALL, HAMMER, COG, SQUISHY_BLOCK, BLADE
traps), PUZZLE_HOLE, PUZZLE_DONE, the most of the switches (SWITCH_TYPE
- except: 7 -, UNDERWATER_SWITCH, TURN_SWITCH, COG_SWITCH, LEVER_SWITCH,
JUMP_SWITCH, CROWBAR_SWITCH, PULLEY), SARCOPHAGUS, HORSE, SCALES,
FIREROPE, SMASH_OBJECT, WHEEL_OF_FORTUNE, MAPPER
617 (512+64+32+8+1):
FALLING_CEILING, FALLING_BLOCK, SMASHABLE_BIKE_FLOOR, JEAN_YVES,
SAS_DRAG_BLOKE
633 (512+64+32+16+8+1): MOTORBIKE, JEEP, WRAITH
635
(512+64+32+16+8+2+1): DEMIGOD2, 3
1659 (1024+512+64+32+16+8+2+1):
SCORPION, SMALL_SCORPION, TROOPS, BABOON, WILD_BOAR, HARPY, BIG_BEETLE,
BAT, DOG, SAS, AHMET
1915 (1024+512+256+64+32+16+8+2+1): CROCODILE,
HAMMERHEAD
3585 (2048+1024+512+1): MINE
3707
(2048+1024+512+64+32+16+8+2+1): LARA_DOUBLE
4731
(4096+512+64+32+16+8+2+1): SETHA
6779 (4096+2048+512+64+32+16+8+2+1):
MUMMY, KNIGHTS_TEMPLAR, ENEMY_JEEP
7803
(4096+2048+1024+512+64+32+16+8+2+1): SPHINX, MUTANT, DEMIGOD1,
SENTRY_GUN
8225 (8192+32+1): PLANET_EFFECT
8737 (8192+512+32+1):
ELEMENT_PUZZLE
8801 (8192+512+64+32+1): SWITCH_TYPE7
9851
(8192+1024+512+64+32+16+8+2+1): BADDY_1, 2
12923
(8192+4096+512+64+32+16+8+2+1): GUIDE, VON_CROY
14971
(8192+4096+2048+512+64+32+16+8+2+1): SKELETON
15995
(8192+4096+2048+1024+512+64+32+16+8+2+1): HORSEMAN
But be careful
with the new, TRNG object slots (that were transported into the Level
Editor by Paolone) because they could have weird flags. - For example,
some of them won't have Flag 1 even when they are present in the TR4
file:
33 (32+1): TIGHT_ROPE, FISH_EMITTER
96 (64+32):
PANEL_BORDER
104 (64+32+8): MOTOR_BOAT
513 (512+1): PARALLEL_BARS,
HYDRA_MISSILE, FROG_MAN_HARPOON
553 (512+32+8+1): SUB_MARINE_MISSILE
608 (512+64+32): LASER_HEAD_BASE/TENTACLE
617 (512+64+32+8+1): KAYAK
891 (512+256+64+32+16+8+2+1): FROG_MAN
7803
(4096+2048+1024+512+64+32+16+8+2+1): HYDRA
8059
(4096+2048+1024+512+256+64+32+16+8+2+1): ENEMY_SUB_MARINE
11897
(8192+2048+1024+512+64+32+16+8+1): LASER_HEAD
Attention! This
overview is not all-embracing so not all the object slots have been
studied.
Case A: forcing these values here will result nothing or
will be buggy. (It doesn't mean you can't solve a problem - when a flag
is missing - in some other way. For example, HORSE should be 617 and not
609, i.e. Flag 8 is missing here, the horse may disappear below the
horseman riding it when loading a savegame. Activate an A60 and the game
will save the coordinates of the horse.)
Case B: because you can't
use Case A now, then Case B can be used only in very special cases. For
example Value 1659 means an 'if the object slot is SCORPION,
SMALL_SCORPION, TROOPS, BABOON, WILD_BOAR, HARPY, BIG_BEETLE, BAT, DOG,
SAS or AHMET' condition - though there are other methods to identify a
slot (see eg. GT_COLLIDE_SLOT type GlobalTriggers).
FootStep
(Shadow below Lara or enemies) (Short)
This field contains the size
of the shadow below Lara or other creatures. (I mean, during the moves,
the shadow will change, naturally. So this field contains the maximum
size of the shadow in 'the default state'. I think this state is
Animation103 - 'standing and still' - at Lara, with Value 160. To
understand this 160, you must know that 1024 is - approximately - 1
square now.)
Case A: for example, if you put a bigger enemy in
BADDY_1 slot then you need a bigger shadow below him - so force the
proper value in this field.
(Or - thanks Titak for the information -
please note that the actual value of the collision box and the size of
the shadow are related. So try a bigger box for a bigger shadow or
remove the box if you don't want a shadow. - Though maybe those
operations will not always be successful to change the shadow.
So you
may use this Case A only if you can't change the shadow the way you want
by changing the collision box - or if you want a shadow size that is not
related to the collision box.)
Case B: this Case B could be useful,
eg. if you want to study if an enemy is too big or not. (I.e. a bigger
creature has a bigger shadow.) So, for example a 'Value is smaller than
250' means an 'if the size of the creature is average or little'
condition.
HP. Max Vitality at start (Short)
This field
contains the maximum life points of Lara or other creatures.
Case
A: these values cannot be forced. However, if you want to adjust a new
maximum life energy for a creature, then use Enemy Script command.
Case B: this Case B could be useful, eg. if you want to study if an
enemy (having all its power) is weak or strong. So, for example a 'Value
is smaller than 100' means an 'if the maximum life energy of the
creature is relatively low' condition.
Number of Meshes (Short)
This field contains the amount of the meshes of the slot. (For example,
the lowest mesh of LARA object is Mesh0 and the highest mesh is Mesh14,
so the value here at LARA is 15.)
Case A: it's worth forcing a
value here eg. if you want some meshes of all the placed objects of the
slot will be invisible from a given moment of the level. - Because:
Forcing 1 - only Mesh0 is visible
Forcing 2 - only Mesh0 and
Mesh1 is visible
Forcing 3 - only Mesh0, Mesh1 and Mesh2 is visible
Etc. (Forcing 0 will result nothing if you want all the meshes to be
invisible.)
Case B: for example, an object has 26 meshes, but you
forced 25 so Mesh25 is invisible. Now Value 25 here is a good condition
if you want to study if all the meshes of the objects of the slot are
visible or Mesh25 is not visible in the given moment.
Pointer for
Collision Procedure (Long)
Honestly, I don't really understand the
long value in this field, but I know if that value is 0 then the object
won't have the collision.
Please note forcing this 0 is not equal
with the 'disabled collision' situation. I mean, if you have a disabled
collision at the object then the object may keep its collision under
some circumstances. For example, if you want to push/pull a
PUSHABLE_OBJECT over a (burning or non-burning) flame or a pickable item
then the actual TRNG won't let you (though Lara can walk through the
flame or the item), because the pushable will collide with that small
object. (It seems some kind of new problem, perhaps will be removed from
the next TRNG.)
It doesn't help if you remove the collision box or
empty the mesh. Clicking on Clear Body button on the OCB panel of the
object will help - but the effect will be removed if you load a
savegame. Forcing 0 in this field will have the same effect as if you
click on Clear Body button - but, force continuously so you will remove
the saving bug. (Please note you can't force continuously if the
'obstacle' is a pickable item, because Lara can't pick up an item if
this value is 0. To solve a problem, I think there could be more good
choices, this must be one of them: you will force 0 just while Lara's
pushing/pulling the pushable over the item, and restore the long value
when she's not doing that.)
And one more thing: as an innovation
in the actual TRNG, the motorbike has the collision with the objects -
but only if they don't have Value 0 in this field.
(Though it is
peculiar. I mean, eg. if I turn a pickable item by A13 trigger into
invisible, not using Value 0 in this field, then Lara can't pick that
up, pushable can be pulled/pushed over it, and motorbike will collide
with it.)
Pointer for Draw Extra Procedure (used by jeep,
sidecar) (Long)
As Paolone says, this field has a (long) value if the
subject of the memory zone is JEEP or MOTORBIKE slot.
However, I
don't know what I can do with this value. And I tried but nothing will
happen (?) if I force 0 here.
Pointer for Emitter Procedure
(Long)
When I tried this field, all the Moveables (except nullmeshes
and Lara) produced the same long value (4519424).
The only number I
could force here successfully was 0. With 0 in this field, only the
emitted effects (eg. the beam of the motorbike headlight) were seeable,
the object itself was totally invisible.
Pointer for
Initialization Procedure (Long)
Each Moveable has some long value in
this field. Whatever that number means it's not worth trying to force to
change that.
Pointer for Main Control Procedure (Long)
Another
field with a long number for the Moveables. Force 0 here if you want to
'freeze' the animation of the subject slot - though A58 and A59 triggers
are more useable tools for that.
Pointer for Special Ceiling
Procedure (Long)
I studied more object slots here. But I found a
(long) value here only at TWOBLOCK_PLATFORM.
Then I forced 0 here -
and nothing happened (?).
Pointer for Special Floor Procedure
(Long)
I had similar experiences with this field to the previous one.
(This time forcing 0 'kills' the DUMMY trigger below TWOBLOCK_PLATFORM.)
Test Attack Lara (1=attack, 0 =ignore lara) (Short)
I found Value
1 only at BADDY_1 and BADDY_2. So, knowing the name of the field, I
suppose this flag means the enemy is able to deflect Lara's bullets.
(Though BADDY_1 doesn't use his deflecting animation.)
It's not
useful to force 0 or 1 because nothing (?) will happen. That's why it's
not worth studying the value of the field by a condition.
Unknown1 (Perhaps distance to enable the MIP version) (Short)
This
field is used for enemy and ANIMATING MIP objects. For example, the
value of BADDY_2 is 5120 here. It means if the distance between Lara and
the baddy is more than 20 squares (because 256=1 square now and
5120=20x256) then the BADDY_2 will be turned into his MIP version - if
there is a BADDY_2_MIP object in the WAD.
Case A: use this Case A
if you want to force a new value when the enemy will be turned into its
MIP version. (In the case of ANIMATING MIP's, use AnimatingMIP Script
command instead.) - It is a nice tool if you want to use a trick with
two totally different objects: 'if Lara is closer to the object then the
object will look as Object A, but if Lara is farther from the object
then the object will look as Object B'.
Case B: if you used Case A,
then it's worth using this Case B to know which 'MIP distance' is used
in the given moment.
Unknown2 (Usually it has value 50) (Short)
This field contains the horizontal distance in which the enemies will
detect Lara in front of them when attacking her. (Yes, it's usually 50,
and 1024 means 1 square.)
For example, force 1024 in this field at
BADDY_1 slot - and BADDY_1 will wield his sword to hit the air in 1
square distance from Lara, without hurting her.
Though I don't know
where it could be useful. (I mean, it's not the whole truth. I.e. with
that 1024 value an AI_GUARD type BADDY_1 will detect Lara in his post
when she comes toward his back only if she is really close to him.)
Unknown3 (It will be copied in Custom_B field of Item structure)
(Short)
The values in this field must be some kind of 'creature
flags'. I mean Lara, non-creatures, creatures with hardcoded animations
(wraith etc.) and creatures not in the TR4 file seem to have Value 10
(Flag 8+2). Baddy, SAS, troops and bat have Value 102 (Flag 64+32+4+2),
small scorpion, skeleton, Von Croy or the guide have Value 128 (Flag
128), mummy has Value 170 (Flag 128+32+8+2), dog, hammerhead and the
ahmet have Value 341 (Flag 256+64+16+4+1), crocodile, horseman have
Value 409 (Flag 256+128+16+8+1), scorpion has Value 512 (Flag 512). -
And I studied only some objects now.
I have no idea what those flags
are supposed to mean, so I didn't feel I had to dig myself into them to
analyze them.
However, it's not worth forcing them, because nothing
will happen then.
Unknown4 (Long)
I
tried a lot of slots here but whatever I did the value of this field was
always 0.
Absolute Index of first AnimCommand (Short)
You can also find some not too useful fields in Animation Memory Zone
and this is one of them. I mean, this field shows a so-called 'absolute
index of first AnimCommand'.
However, I don't really understand this
value. I mean, for example, studying Animation1 of LARA object, the
value here is 18. Either in absolute or in relative meaning, there is
only one animation before this animation: Animation0 of LARA. That
Animation0 has 6 AnimCommands, so the first AnimCommand index of
Animation1 must be 7.
By the way, you can find this value (as
'AnimCommandsInd') in the green window of NG Center\Tools\Animation
Watcher\Show Present Animations for Current Slot.
Absolute Index
of first State Change (Short)
For example, studying Animation1 of
LARA object, the value here is 7. Either in absolute or in relative
meaning, there is only one animation before this animation: Animation0
of LARA. That Animation0 has 13 state changes, using 7 State ID's. Each
State ID here has a 'change index' from 0 to 6, that's why the 'absolute
index of first State Change' in Animation1 is 7. - Though I don't know
where this value could be useful.
By the way, you can find this value
(as 'StateChangeIndex') in the green window of NG Center\Tools\Animation
Watcher\Show Present Animations for Current Slot.
First absolute
Frame index (Short)
For example, studying Animation1 of LARA object,
the value here is 22. Either in absolute or in relative meaning, there
is only one animation before this animation: Animation0 of LARA. That
has 22 frames from 0 to 21 - that's why the 'first absolute frame index'
in Animation1 is 22 (i.e. this is the absolute index of Frame0 of the
animation).
By the way, you can find this value (as 'FrameStart') in
the green window of NG Center\Tools\Animation Watcher\Show Present
Animations for Current Slot. - See more about it above in 'Frame Now
(warning it's an abs value) (Short)' field.
Frame Rate (Byte)
This field contains the FrameRate value (see: WADMerger Animation
Editor) of the animation.
Case A: using this Case A, you can
force a new FrameRate value for the animation, in the game. (Be careful
- some forcing could be buggy.)
Case B: if you used Case A, then it's
worth using this Case B to know which FrameRate is used in the given
moment.
Frame Size (Byte)
This is not a useful field, because,
as Paolone says, the field contains the byte/frame value of the
animation.
By the way, you can find this value (as 'FrameSize') in
the green window of NG Center\Tools\Animation Watcher\Show Present
Animations for Current Slot.
High Accelleration (Short)
This
field contains the Accel value (see: WADMerger Animation Editor) of the
animation.
Case A: using this Case A, you can force a new Accel
value for the animation, in the game.
Case B: if you used Case A,
then it's worth using this Case B to know which Accel is used in the
given moment.
Last absolute Frame index (Short)
If you
understood 'First absolute Frame index (Short)' field, then it's easy to
understand the present field:
So, for example if the first frame of
the animation (ID0) has 65 absolute ID then the last frame of that
animation (eg. ID25) has 90 (65+25) absolute ID. - Maybe it is a useful
base in some formulas if you want to define a given (other) frame of an
animation.
Low Accelleration (Short)
It is the value you can
see in the green window of NG Center\Tools\Animation Watcher\Show
Present Animations for Current Slot (as 'AccelerationLO'). It is mostly
0.
I don't know what this value means and where it could be useful.
Next Animation index (Short)
This field contains the Next
Animation value (see: WADMerger Animation Editor) of the animation.
Case A: forcing these values is buggy.
Case B: you can't use Case
A, so it's not worth using this Case B because the Next Animation value
of the given animation is always constant. (Maybe it is if you use a
'random' subject by the 'TRNG Index. Animation Index for Selected
Animation Memory (Short)' Savegame Memory Zone field.)
Next Frame
index (Short)
This field contains the Next Frame value (see:
WADMerger Animation Editor - but this time with the absolute ID of the
frame you can find as 'FrameNext' in that green window) of the
animation.
Case A: using this Case A, you can force a new Next
Frame value for the animation (with absolute frame ID!), in the game.
Case B: if you used Case A, then it's worth using this Case B to know
which Next Frame is used in the given moment.
Next High
Acceleration (Short)
This value is not the Accel value of the Next
Animation of the given animation.
Whatever value this is, you can
also (?) find it here: NG Center\Tools\Animation Watcher\Show Present
Animations for Current Slot (as 'InertAccelHI' (?)).
Next Low
Acceleration (Short)
Whatever value this is, you can also (?) find it
here: NG Center\Tools\Animation Watcher\Show Present Animations for
Current Slot (as 'InertAccelLO' (?)).
Next Speed (Short)
This
value is not the Speed value of the Next Animation of the given
animation.
Whatever value this is, you can also (?) find it here: NG
Center\Tools\Animation Watcher\Show Present Animations for Current Slot
(as 'InertSpeed' (?)).
Number of Animation Commands (Short)
This field counts the amount of the AnimCommands in the given animation.
- For example, Animation0 of LARA object has AnimCommands with ID 0, 1,
2, 3, 4 and 5 so the value of the field is 6 now.
Though I don't know
where this value could be useful.
Number of State Changes (Short)
This field counts the amount of the State Changes in the given animation
- counting every State ID only once. - For example, Animation0 of LARA
object has 13 state changes, using 7 State ID's so the value of the
field is 7 now.
Though I don't know where this value could be useful.
Speed (Short)
This field contains the Speed value (see: WADMerger
Animation Editor) of the animation.
If you want to know what we are
talking about now, then see 'Speed in horizontal movements (Short)'
field above. - But this time:
- the present field works with a
given animation and not always the actual animation,
- now you don't
need continuous forcing,
- this time probably you can't use the
'hardcoded animations' (but can the other ones).
State Id (Short)
This field contains the StateID value (see: WADMerger Animation Editor)
of the animation.
If you want to know what we are talking about now,
then see 'State Id Now (Short)' field above. - But this time the present
field works with a given animation and not always the actual animation.
Unknown1 (Short)
Unknown2 (Short)
I don't
know what these fields are (but you can also find them in that green
window).
Distance of Cam. {Little values bigger items and
vice-versa) (Short)
Let's suppose your eye is a camera that is
looking at the item in the inventory. This time the item is a big
medipack and you can see it 2 centimeters height if you type Value X in
this field.
But how should you know what that value is?
Well,
imagine that 'eye-camera' as a camera that is placed in the ground, in
the game. If the big medipack is X distance from that, then the
eye-camera will see the medipack 2 centimeters height.
In this Value
X 1024 means (supposedly) 1 square distance.
Note:
A lot of
pickable objects (key, puzzle item combo etc.) have their own Script
entries in which you can adjust this distance by a hexadecimal value. So
force a value into this field only if the pickable item (eg. ammo,
medipack, weapon etc.) has no Scipt entry to define its inventory
coordinates there.
Slot of Mesh to show in Inventory (Short)
This field contains the ID of the subject inventory item - see the ID's
in Slot Moveables indices list, in NG Center\Reference. (Forcing another
slot ID here - to see another item at the item name in the inventory and
not the item Lara picked up - is buggy. And useless.)
String
index of Name (Short)
When you want to rename a pickable item having
a Script entry (key, puzzle item combo etc.) then you type that new name
in that Script entry.
But if you want to rename a pickable item not
having a Script entry (eg. ammo, medipack, weapon etc.) then force a
string ID here in which you typed the new name. (That string must be an
unused string in [Strings] section of English.txt.)
Top Border in
2d plane. (Negative numbers move up the item) (Short)
This field
contains the vertical coordinate of the item in the inventory, in the
line of items.
If you want to understand that coordinate, then let's
define BLEP ('Blue Line End Point') first: open the item in Animation
Editor of WADMerger. See the item there in 'Animation0' state (at
Frame0). The BLEP of this item is where that long, blue line ends at the
item.
If the value of this field is 0 that means the BLEP of the item
is (approximately?) halfway between the upper edge of the screen and the
name of the item.
If you force a negative number here then the
object will move so many pixels upwards, compared to Level 0.
If you
force a positive number here then the object will move so many pixels
downwards, compared to Level 0.
Note:
In the case of pickable
items having a Script entry, use that Script entry instead of this
field.
Type Flags. (4 = USE, 32 = EXAMINE, $1000 = LOAD ect)
(Short)
This field contains the command and other text types (except
the name of the item) typed below the item in the inventory, using flags
to define the text types.
If you want to know the flags then know
them in Paolone's variables tutorial. I mean I don't really want to take
care about the flags, because:
- It is disturbing that the values
don't always have the same result. For example, forcing Flag 8 at
BIGMEDI_ITEM, there won't be command (!) below the item, but forcing
Flag 8 at CROSSBOW_ITEM, COMBINE command will appear there.
- It is
useless to force any flag to an item. So, for example, if you try to
force Flag 32 (the flag of EXAMINE text) to a PUZZLE_ITEM, that doesn't
result the PUZZLE_ITEM becomes an EXAMINE item.
Unknown. (It may
be only 1 or -1) (Long)
I don't know the meaning of this field.
View Flags. (2 = turn endless, $4000 = usable?) (Short)
This
field defines how the object will act when is just selected in the
inventory. - The used flags (values) from The Last Revelation:
2
($0002): the selected item is rotating around the vertical median axis
of the screen (that is just going through the BLEP of the item)
10=8+2 ($000A): this flag is equals with Flag 2 except you must use it
if Lara uses a crowbar to get the item so the item has an 'I've been
pried off the wall so I'm falling down now' animation. (My experience
with some other objects: using this flag, the object will be a bit lower
in the right bottom corner of the screen just after Lara has picked up
the item.)
And some special flags (using them, the item will work
in the inventory just as with Flag 2, but not using them, maybe the item
cannot be placed into its 'special receptacle'):
8194=8192+2
($2002): PUZZLE_ITEM8 Mine Detonator
16386=16384+2 ($4002):
PICKUP_ITEM2 Jerrycan
32770=32768+2 ($8002): PICKUP_ITEM1 Bag of Sand
If you don't add Flag 2 (so if you use Flag 0 instead Flag 2, Flag 8
instead of Flag 10 etc.) then the selected item will be still in the
inventory (as if it were non-selected).
Note:
In the case of
pickable items having a Script entry, use that Script entry instead of
forcing a value into this field.
X Facing about the cam view on X
Axis (Short)
Y Facing about the cam view on Y Axis (Short)
Z
Facing about the cam view on Z Axis (Short)
These fields define the
X, Y and Z position of the item in the inventory.
Please note when
you rotate the item around Axis X, Y or Z then the other axes will be
rotated with the item together. That's why it's not easy to define the
position of the axes. That's why I'll define the position of the axes
only in one position, i.e. in the default state of the object.
The definition of 'the default state': see the item in Animation Editor,
in 'Animation0' state (at Frame0). The item is at one end of the long,
blue line. Imagine a camera at the other end of the blue line. The
longitudinal axis of the camera is the blue line. - Now the camera sees
the item in the default state of the item.
If I say the camera is
your eye and the item you can see in the default state now is the item
in the inventory then you know what I'm talking about.
So, I can
define the axes now:
- Axis X position (in the default state of
the object): it's the vertical axis of the object. It's going through
the BLEP of the object.
- Axis Y position (in the default state of
the object): it's one of the horizontal axes of the object:
perpendicular to the longitudinal axis of the camera. It's going through
the BLEP of the object.
- Axis Z position (in the default state of
the object): it's one of the horizontal axes of the object: the extended
longitudinal axis of the camera.
When you rotate the item around
one of the axes then a whole circle (i.e. 360 degrees) means Value 65535
(i.e. $FFFF). So, for example, if you rotated them item 90 degrees from
the default state, then the value is 16384 ($4000), 180 degrees is 32768
($8000) and 270 degrees is 49152 ($C0000).
(The values must be meant
as clockwise rotations, seeing the axes - in the default state of the
item - this way:
- Axis X: from above
- Axis Y: from the left
hand side of the camera
- Axis Z: from the camera.)
Note:
In the case of pickable items having a Script entry, use that Script
entry instead of forcing a value into this field.
About: The values of a placed object from any
Moveable object slot in Custom_A, B, C or D fields (Item Memory Zone).
So some time has passed by since I've created the tutorial, so now I
examined all the (non-Lara) Moveable object slots (that can have
placeable objects) about what their values are in Custom_A, B, C and D
fields of Item Memory Zone.
Abbreviation:
A=Custom_A field
B=Custom_B field
C=Custom_C field
D=Custom_D field
ENEMY_JEEP
A: when the jeep starts from an AI_FOLLOW object then a
counter will start from 0. There is a point when the game 'jerks' the
moving jeep into the next AI_FOLLOW. Reaching that point, the counter
stops counting up, and starts a fast counting down, so the counter will
be 0 again when the jeep is at that new AI_FOLLOW. (From the start to
the 'jerking point', I think 1024 means 1 square. So eg. if the value is
4096 before the 'jerking point' that means the moving jeep has traveled
4 squares from the latest AI_FOLLOW.)
B: none
C: if the jeep is at
an AI_FOLLOW then a frame counter is running here, from 149 to 0, again
and again. If it reaches 0 then the jeep shoots a grenade. (Note: if the
jeep starts from an AI_FOLLOW, then the counter won't stop till reaches
0.)
D: the actual AI_FOLLOW ID (typed in the OCB window of the
AI_FOLLOW) is in here (at which the jeep is or for which the jeep is
heading).
GUIDE
A, C: none
B: I think it has something to
do with the 'state of his torch'. I mean when he starts, then the value
is 0. When he reaches for the torch to grab it then the value becomes 1
(and remains that). A bit later, when he ignites the torch
(successfully, at the second attempt) then the value becomes 2 (and
remains that).
D: the actual AI_FOLLOW ID (typed in the OCB window of
the AI_FOLLOW) is in here (at which the guide is or for which the guide
is heading). (Moreover, if he is performing a task at an AI_FOLLOW, then
the ID turns into the ID of the next AI_FOLLOW. - Note: if this
performance happens at the last AI_FOLLOW, then +1 will be added, but
only if that task is not the disappearance.)
BADDY_1, BADDY_2
A, D: none
B: -1: still not active. Other number: the room game
(tomb) index where he just is (dead or alive).
C: his actual Uzi ammo
(default BADDY_1 value even before getting alive: 24). Pulling the
trigger once means minus 7 bullets. (So, the default BADDY_1 is able to
shoot four times at Lara before his ammo is running out: 24 - 17 - 10 -
3 - -4.)
SETHA
A: a frame counter runs here from 0 to an end
value, several times. Each sequence is a shooting sequence, so if the
value starts running from 0 that means SETHA has just started a shooting
operation against Lara. (I think three operations exist, they are 151,
161 and 199 frames long. If the counter stops at the end value - 151,
161 or 199 - then the counter value won't change till starting the next
shooting operation.)
B, C, D: none
SPHINX
A, B: none
C:
it contains the actual X horizontal coordinate (i.e. the actual distance
from the north edge of the Room Editor Window) of the living SPHINX (in
'units', i.e. Value 1024 means 1 square distance).
D: it contains the
actual Z horizontal coordinate (i.e. the actual distance from the west
edge of the Room Editor Window) of the living SPHINX (in 'units', i.e.
Value 1024 means 1 square distance).
CROCODILE
A, C, D: none
B: if he's at an AI_GUARD object then he moves his tail to left or
right. When he is just moving it leftwards, then the value is -12.
Moving it rightwards, the value is 12. (Note: disturbing him when the
value is not 0 he leaves his post, keeping the actual value 'forever'.)
HORSEMAN
A: -1: still not active. Other number: active or dead.
(This 'other number' is probably 15, but maybe depends on the amount of
the AI_FOLLOW objects in the level.)
B: 0: not on the horse (either
still not or fallen down), 1: on the horse (or just getting on it).
C: none
D: it's the ID of his AI_FOLLOW written here. (If there are
other horse-horseman couples in the level then the horseman will be
riding to rest to their AI_FOLLOW's as well. In these cases this field
accepts the ID of those AI_FOLLOW's when the horseman is heading for
there, and, after that it keeps that value until he's riding for another
rest to another AI_FOLLOW.)
MUTANT
A, B, D: none
C: some
moments after the mutant has come to life, a frame counter starts here
from 0. It will stop when reaching 600. Until that, the mutant won't
care about Lara, only will be raging. Some moment after the counter has
reached 600, the value jumps to 999 suddenly (and remains that) - and
now the mutant notices Lara at last.
BABOON_NORMAL, BABOON_INV,
BABOON_SILENT
A: the horizontal coordinate is contained here in which
the baboon is placed in the Room Editor. Each square distance from the
west edge of the Room Editor Window means +256 value and each square
distance from the north edge of the Room Editor Window means +1 value.
(So, eg. if the baboon is in the 'most northwestern' square of the
level, then the value is 257=256+1.)
B, D: none
C: 0: still not
active or dead, 1: alive.
HARPY
A: the shooting operation
frame counter (see: SETHA) runs here from 0 to 118. (After shooting, the
counter turns back into 0.)
B, C, D: none
LITTLE_BEETLE
A:
the value is 1 if the beetles will be emitted from the floor (i.e. with
+1000 OCB value).
B: the value is 2 if the beetles will be emitted
from the ceiling (i.e. with +2000 OCB value).
C: the value is 4 if
the beetles will be emitted from the wall (i.e. with +4000 OCB value).
This value is not constant, will be decreased by 1 and 1 again and
again, till 0. (I think 1 will be subtracted if a smaller or bigger
'bunch' of beetles is just starting being emitted from the wall. When
the last 'bunch' comes out, then the value will turn from 1 to 0.)
D:
none
WRAITH1, WRAITH2, WRAITH3
A: none
B: if the fire
wraith collides with Lara then a newer value will be added to the actual
value of this field. The starting value is 0 and the 'newer values' are
about 3000 or less. (The 'newer value' is bigger if the collision is
'harder'. I think, at least.) If the field value is less than (about?)
10000 then the wraith won't ignite Lara at the collision. But, if
bigger, then each (either smaller or bigger) collision ignites her. (At
the same time, this field is a count-downing frame counter. So, if the
value is not 0, but there is no collision in this moment, then the field
value will decrease, 1 per frame.) - When the wraith dies in the water,
the value turns into -2 at once. (If the wraith is not a fire wraith
then only this last '-2' step happens with him.)
C: I'm not sure but
I think this is a frame counter that counts the two sequences of the
wraith:
- from 0 to a bigger positive value: the wraith (seeing
him from above) is just rotating clockwise,
- from 0 to a bigger
negative value: the wraith (seeing him from above) is just rotating
anti-clockwise.
Usually the game doesn't seem to let the counter
step over 1000, so the wraith always change his direction before 1000
frames (or sooner, or much sooner). Except: if the wraith starts
circling around Lara fast (always clockwise?), with less and less radius
(because eg. Lara's burning?).
(Note: the last value will be
'frozen', if
- the wraith dies, or
- probably, for a
shorter/longer time, if Lara is too fast - try it, fleeing from the
wraith in DOZY mode -, and the game can't - ? - count a correct radius.)
D: You can find positive and negative values in this field. It seems an
increasing positive value if the wraith is going farther from Lara and
seems an increasing (i.e. numbers farther from zero come after each
other) negative value if the wraith is coming closer to her. (Probably
the bigger numbers mean a bigger radius for the wraith. Usually the
biggest positive/negative numbers are between 300 and 400.) - When the
wraith dies the value will be 'frozen'.
(Note: till the first
collision between them, I think these rules are not quite true. For
example, it seems the signs are inverted till the wraith attacks at the
second time after the first collision.)
AHMET
A: it contains
the west-east row of squares in which the AHMET is placed. (So, for
example, if it is the 16th row of squares from the north edge of Room
Editor Window then the value is 16.)
B, D: none
C: it contains the
north-south row of squares in which the AHMET is placed. (So, for
example, if it is the 7th row of squares from the west edge of Room
Editor Window then the value is 7.)
WHEEL_OF_FORTUNE
A, B, C,
D: it seems all the four fields do the same:
After the 'wheel' having
been rolled, the field value is always 0 or -32768 but when the 'wheel'
is just rolling, positive or negative bits or aggregated bits (256, 512,
-384, 4096, -20864 etc.) appear and disappear fast in the field one
after another. (I suppose the bit value and sign depends on a plate
being just black or white and in which angle being just rotated.)
SCALES
A, C, D: none
B: 0: empty (not filled before or reset)
or filled by the right amount of water, 1: filled by the wrong amount of
water
FALLING_BLOCK
A: when it starts shivering (due to Lara
stepping on it but not due to triggering) then the value jumps from 0 to
60 and a frame counter starts counting down. Reaching 1 (keeping the
value) the block will fall down.
B, C, D: none
TRAPDOORs
A,
B: none
C: 0: opened/opening/closing, 1: closed
D: see this value
as a hexadecimal value. For example, $504A. Split it into two parts: $50
and $4A. Turn them into decimal values: $50=80 and $4A=74. Now 80 is the
tomb (game) index of the room just above the portal in which the
trapdoor is placed and 74 is the tomb (game) index of the room in which
the trapdoor is placed. (Note: the value is 0 if the trapdoor is not in
the right place, i.e. not in a vertical portal between rooms.) - Thanks
sapper for the information.
ROLLINGBALL
A: the game calculates
here how many length units the moving rollingball must 'travel' in the
north or south direction (Room Editor facing) in the given moment, until
that stops. (Negative numbers= moving northwards, positive numbers=
moving southwards.) I think (approximately?) 512 length units is 1
square now. (Naturally, the bigger the number is the more the speed of
the ball is.) - Don't forget: the length will be calculated again and
again, in every moment, according to the actual speed and direction.
B: the horizontal 'travel' of the moving rollingball eastwards (positive
numbers) or westwards (negative numbers), with the same units as above.
C: 0: the ball is on land, 1: the ball is in water (with OCB=32).
D:
none
TEETH_SPIKES
A: values are changing here when the spikes
are moving. Crucial values: 1024 when the spikes are totally drawn back
(even if they haven't been activated), and 0 if they are totally
extended.
B: values are changing here when the spikes are moving.
Crucial values: 0 when the spikes are totally drawn back (even if they
haven't been activated), and 5120 if they are totally extended.
C:
the spikes are 'bouncing' when being extended so they reach 'Position 0'
(see Custom_A value) twice during one extension. When they reach
Position 0 at the second time, then a frame counter will start. It's 64
now and counts down. The spikes will be drawn back, and remains there
until the counter reaches 0. Now the spikes jump out again.
D: none
JOBY_SPIKES
A: a counter starts from 0 (in an increasing
exponential way) when the spike has been triggered. It stops at 4149 - I
think this is the moment when the speed of rotation reaches its maximum
(very soon, the spike is only a bit expanded now).
(Note: it is very
interesting, but the sign of the counter will be inverted and the
counter will stop at -4135 if the frame/second rate of the game is just
- relatively - low.)
B: a counter (it seems Value 3 changes at each
frame) starts from 0 when the spike has been triggered. It stops at 6303
- I think this is the moment when the expansion of the spike reaches its
maximum. (So eg. forcing a constant Value 3150 here the length of the
spike will be standard, and the expansion of the spike will be the 50 %
of the maximum size, because this is the size that the spike will reach
at Value 3150=approximately 6303/2.)
C: sometimes I find Value 1 in
this field and not 0. But I can't find any logic in that. (I.e. when I
place a spike then convert the Script then that spike will have that 1.)
D: 6301 the default value - it is the length of the maximal extension,
in which probably 1024 means 1 square. (Naturally other Custom_D field
value means other Custom_B field maximum value automatically.)
SLICER_DICER
A: it contains the X horizontal coordinate (i.e. the
distance from the north edge of the Room Editor Window) in which this
trap is placed. The values start from 4. Each square is 4 values long
and the coordinate is calculated at the end of trap that faces south
just when it has been placed. (So if you place a trap on one of the
northest squares then the values could be between 4 and 8 on that
square. The concrete value will be 8 - because this is the value at the
south end of the square and the trap south end touches the square south
end now. If you rotate the trap by 45 degrees then the value will be 7,
and after newer 45 degrees that will be 6 etc.)
B: it contains the
vertical coordinate in which this trap is placed. Each value means a
distance in clicks from its Level 0. This Level 0 is at Floor=-18 level.
Negative values are above Level 0, positive values are below it.
C:
it contains the Z horizontal coordinate (i.e. the distance from the west
edge of the Room Editor Window) in which this trap is placed. The values
start from 4. Each square is 4 values long and the coordinate is
calculated at the end of trap that faces south just when it has been
placed.
D: the default value is 50. (I don't know what it is because
nothing will happen if I try to force another value here.)
CHAIN
A: 0: the chain is not active, 1920: the chain is active. (I suppose
there is some other meaning in Custom_A, B, C or D field for this kind
of strange constant values with traps as this 1920, for example. Maybe
is this the maximum length of the swinging of the chain? Or some kind of
bitcode of a feature? I don't know, nothing will happen if I try to
force another value here: the game will overwrite it with the original
values - even if I force the value by a GT_ALWAYS GlobalTrigger -, i.e.
I can't examine, for example, if a given, less value means a shorter
length or not.
So all we can do is to use these values in a basic
way. So, because this time the chain will accept 1920 only if it is
active, that's why this 0/1920 couple is a good possibility for a
deactive/active condition.)
B, C: none
D: 0: the chain hasn't been
activated before, 25: the chain is active, or deactive but has been
activated at least once.
PLOUGH
A: 0: the plough is not
active, -4096: the plough is active.
B: 0: the plough is not active,
3: the plough is active.
C: none
D: 0: the plough hasn't been
activated before, 50: the plough is active, or deactive but has been
activated at least once.
STARGATE
A: 0: the stargate is not
active, -18944: the stargate is active.
B: 0: the stargate is not
active, 877: the stargate is active.
C: none
D: 0: the stargate
hasn't been activated before, 50: the stargate is active, or deactive
but has been activated at least once.
HAMMER
A: 0: deactive,
or ascending, or has just (almost) finished the shivering after
striking, 2016: just striking or the first part of shivering after
striking
B: none
C: 0: the hammer (active or not) is just in the
starting (highest) position, 60: the hammer is active, or deactive but
has been activated at least once (except in both cases: if it is just in
the starting position). (This time there is an effect if you force a
number here continuously, but it's just disturbing the working of the
hammer.)
D: 0: the hammer hasn't been activated before, 150: the
hammer is active, or deactive but has been activated at least once.
BURNING_FLOOR
A: a counter starts from 0 (Value 4/frame) when the
floor starts firing (some short moments after the flaming torch has been
landed on it). When the fires reach their maximal intensity then the
counter will stop (at 255). A bit later, when the fires start
extinguishing then the counter starts again from 255, counting down
(Value 4/frame). When the fires are almost (!) totally extinguished, the
counter stops at 2, and remains that.
B: it's almost the same as
Custom_A field. But this time it counts Value 3/frame down, i.e. it
reaches Value 2 later. (I.e. when the counter stops at 2 that will be
closer to the total extinguishing than with Custom_A field.) (And one
more thing: it starts the counting-up from 0 a bit later, when the fires
are a bit burning.)
C: this is the same again, but this time the
counter counts Value 2/frame down, so reaches Value 2, actually, exactly
at the total extinguishing. (And one more thing: it counts up Value
8/frame that's why it starts from 0 when the fires are a bit burning -
but maybe a bit later, compared to Custom_B field.)
D: it's a frame
counter. It starts running from 0 when the floor starts firing, and
stops at 450 (and remains that) when the fires start extinguishing.
SPIKEBALL
A: -2048: the moment when the double doors of the
spikeball are opening or if the knives of the spikeball are extended, 0:
in any other cases.
B: 127: the moment when the double doors of the
spikeball are opening or if the knives of the spikeball are extended, 0:
in any other cases.
C: none
D: 0: the spikeball hasn't been
activated before, 50: the knives of the spikeball are extended or the
spikeball is antitriggered, 150: the spikeball is falling down or has
been fallen down but the knives aren't still extended.
FLAME_EMITTER (only blowing a horizontal or vertical flame)
A: a
frame counter starts from a bigger value to 0, then another frame
counter starts from a bigger value to 0, etc. This 'bigger value' seems
random (each sequence has its own one), chosen from an interval. (The
low and the high limit values of the interval depend on which number is
typed in the OCB window of the flame.) The first 'bigger value' is in
the field before the fire has been triggered. If that has been
triggered, the counter will start. If the counter reaches 0 (and remains
0), then the flame will start being blown. When the flame starts
stopping being blown then another 'bigger value' appears on the field,
and the counter starts at once. The flame stops being blown before the
counter reaches 0. If it reaches 0 then the flame will start being blown
again etc. (Antitriggering means a pause in the counter. Triggering the
flame again, the counter restarts from the value where it was
interrupted.)
B: when the emitter starts blowing a flame, then the
value starts running from 0 to -8192. When it starts stopping blowing a
flame, then the value starts running from -8192 to 0. - It's the actual
length of the flown flame. (-8192=2 squares long.) (Antitriggering the
flame, the actual value will be 'frozen' in the field.)
C: it's 256,
even if the emitter hasn't been activated before. When the emitter
starts blowing, then a counter (Value 8/frame) will count down to 0.
When the emitter starts stopping blowing, then it counts back (Value
8/frame) from 0 to 256. (Antitriggering means a pause in the counter.)
D: the starting value is 0. When the emitter starts blowing the flame
then it jumps to a bigger value, and a frame counter starts from this
value to 0: it is 0 when the emitter (almost) stopped blowing the flame.
Then the sequence will be repeated. (Each sequence has another value, in
a random way, because each flowing operation has a different length.)
(Antitriggering means a pause in the counter.)
FLAME_EMITTER2
(only with negative OCB number)
A: if you use it to trigger a flipmap
(see the Scales-puzzle from 'Temple of Horus'): 0: flipmap isn't
triggered, 1: flipmap is triggered. (The value won't be affected if you
trigger/antitrigger the flipmap in the 'usual ways'.)
If you use it
to divert the lightning (see the special Lightning conductor-setup from
the 'Street Bazaar'): 1: the pushable object is pushed/pulled to the
special place to divert the lightning, 0: before that.
B, C, D: none
FLAME_EMITTER3
A: as flames: when the flame object is triggered
then the Value 0 will jump to 11 (or 10) and as a frame counter, it
counts down to 0 - and the cycle will be repeated again and again. I
think each burst of flame is attached to one number, and if that number
shows up in the field than its burst of flame will be burst.
(Antitriggering means a pause in the counter.)
B: as flames: when the
flame object is triggered then numbers with one or two digits will show
up here one after the other. For example: 59, 62, 54, 3, 16, 45 etc. I
think they are codebits for which bursts are burst in the given moment.
(Antitriggering means a pause in the counter.)
C: as electric arches
towards ANIMATING3 objects (OCB=3): Custom_D field value minus the two
ANIMATING3 objects for the setup.
D: as electric arches towards
ANIMATING3 objects (OCB=3): the amount of the placed Moveable objects
(according to the TXT file of the level in graphics\wads folder), minus
Lara.
FIREROPE
A, C: none
B: two sequences run here. One
from 1 to 32 and the other one from 0 to 16. The default value is 0 that
will jump to 1 when the rope catches fire. The first sequence starts
increasing. (+1 per unit. One unit is more frames now.) Some moments
after it has stopped at 32, it jumps to 0 (when the rope starts
crumbling), and the second sequence (a frame counter) starts counting
the time while the flaming rope is crumbling (that ends at Value 16).
D: the default value is 0. A frame counter starts here from 150 when the
rope catches fire. Reaching 0, the rope starts crumbling.
TWOBLOCK_PLATFORM
A: usually there's a constant value here that
doesn't mean too much. But, if the platform will descend half a click if
Lara steps on it, then the point is this:
The number here means the
default position compared to Floor Level 0. ("Default": the position if
Lara is not on the platform.) 1024=1 square=4 clicks. Negative numbers
are above Level 0. So eg. -1536 means the default position of the
platform is 1,5 square (6 clicks) above Level 0.
- Force any number
here that means a higher position for the platform. Which causes the
platform will be ascending to that position right away, when triggered.
That ascended position will be the new, modified "default position". (So
eg. if you force -2048 when the "original" default value is -1536 then
the platform will ascend 2 clicks right away, when triggered, and, after
that, that will descend half a click when Lara steps on it. If Lara gets
off that then the platform will ascend half a click, as usual.)
-
Force any number here that means a lower position for the platform.
Which causes the platform will do nothing when triggered. But if Lara
steps on the platform after that, then the platform will descend to the
forced position - and the usual half a click after that. (So eg. if you
force -1024 when the "original" default value is -1536 then the platform
will descend 2,5 clicks, when Lara steps on it. If Lara gets off that
then the platform will ascend half a click, as usual.) If Lara gets off
the platform before that reaches the forced position then the platform
will be "frozen" in the actual position but continues descending when
Lara steps on that again.
B: if it will descend half a click if Lara
steps on it: 1: the platform is in the base (ascended) position, -1: the
platform is in the descended position. (Values will be refreshed only at
new positions.)
(This 1 is a constant value with the other types of
the platform, including an elevator.)
C, D: none
RAISING_BLOCK1, RAISING_BLOCK2
A, D: none
B: activating the block,
a counter starts here from 0. If the block is totally ascended, then the
counter will stop at 4096. The value remains that, but when
antitriggering the block, the counter will run back to 0. (So 4096 means
'1 square high' with BLOCK1 but '2 squares high' with BLOCK2.)
C: 0:
the block is totally descended, 1: in any other cases.
EXPANDING_PLATFORM
A, D: none
B: activating the platform, a
counter starts here from 0. If the platform is totally expanded, then
the counter will stop at 4096. The value remains that, but when
antitriggering the platform, the counter will run back to 0. (So 4096
means 'expanded the distance of 1 square'.)
C: 0: the platform is
totally drawn back, 1: in any other cases.
SQUISHY_BLOCK2
A:
activating the block, the level starts shaking, and a frame counter
starts from 0. Reaching Value 60, the shaking and the counter stops (and
remains 60), and the block falls down.
B, C, D: none
PUSHABLE_OBJECTs
A: I think this value is a horizontal position from
a west-east line (as a base), because when Lara's moving the pushable in
a north-south direction, the value jumps 1024 forth or back. But not
always. And sometimes (!) the value also jumps so much when she's moving
it in a west-east direction. And, top of all that some squares has more
values, depending on from which direction Lara will move the pushable
there. (The value of the square - whereto the move just happens - will
be refreshed in the field when Lara starts moving the pushable. The
default value - so if Lara hasn't moved that pushable at all - is always
0.)
B, D: none
C: the same thing as above but this time the game
counts west-east moves from a north-south base.
SENTRY_GUN
A:
Value 1 and 2 will change with each other fast if the gun is shooting
bullets. 0: in any other cases (even if it's throwing flames).
B:
There is always a 768 (this is the starting value) or a -768 value in
this field (so even if the gun isn't activated or has been exploded). It
depends on in which direction the radar of the gun is turned. If it is
turned exactly to the gun then the value turns into 768, or, if it is
turned exactly in the other direction then the value turns into -768.
C: there is a strange counter in this field. I.e. if the gun starts
shooting bullets at Lara then it starts increasing (per frame) this kind
of 'two steps ahead, one step back' way: 0, 224, 192, 416, 384, 608 etc.
(I suppose it's 'two sequences is one', i.e. 192, 384 etc. is a sequence
when Custom_A field is 1, and 224, 416 etc. is a sequence when Custom_A
field is 2.) When it reaches 6112 it can't increase any more, just
repeats the two last numbers: 5952, 5920, 5888, 6112, 6080, 6112, 6080,
6112, 6080, 6112 etc. When it stops shooting (including when it is
throwing flames on Lara) then the counter starts counting down (Value
32/frame) and stops if it reaches 0 again - or starts increasing again,
if the gun starts shooting at her again.
D: none
MINE (only to
blow it up by triggers, i.e. if OCB=1)
A: when a trigger ignites the
mine then a frame counter starts from 0. If it reaches 150 (and remains
that) the mine will explode.
B, C, D: none
OBELISK
A, B, C:
none
D: a frame counter runs here from 0 to 347 (and remains that)
while the electric arch (see the obelisk-puzzle in 'The Great Hypostyle
Hall') is coming from the obelisk. (It's about 260-270 when the
ANIMATING3 shatters.)
FLOOR_4BLADE, ROOF_4BLADE
A: 30: floor
blades move upwards, roof blades move downwards (both the first movement
and when the blades will clap together), 0: in any other cases.
B, C:
none
D: from 0, the value becomes 20 when the floor blades (moving
upwards) or the roof blades (moving downwards) stop first, and becomes
200 when they (moving up/downwards more) clap together. (It remains 200,
and repeats the sequence at newer activations: 20-200, 20-200 etc.)
BIRD_BLADE
A: 0: inactive/just opening, 6: just closing.
B, C:
none
D: 0: the blade hasn't been activated before, 100: the blade is
active, or deactive but has been activated at least once.
CATWALK_BLADE
A, B, C: none
D: the value is 100 when the blades
are just moving, in any other cases it's 0.
MOVING_BLADE
A, B,
C: none
D: 0: the blade hasn't been activated before, 50: the blade
is active, or deactive but has been activated at least once.
PLINTH_BLADE
A, B, C: none
D: from the start to the final stop the
value is 200, in any other cases it's 0.
SETH_BLADE
A: 0: the
blades are inactive or the double blades are moving upwards, -1: the
double blades are moving downwards, 448: the double blades just hit the
ground.
B: -1: the double blades are moving downwards, 0: in any
other cases.
C: the (positive or negative) number you typed in the
OCB window of the trap shows up in this field. (If you typed a negative
number the sign will be inverted in the field now.) When the trap has
been activated then a frame counter will start from this value. Reaching
0, the trap starts moving. When the blades have got back to its starting
position, then (only if you typed a positive number) that typed number
shows up here again, and the counter starts at once again.
(Antitriggering means a pause in the counter.)
D: 0: the blade hasn't
been activated before, 1000: the blade is active, or deactive but has
been activated at least once. (Till the counter of Custom_C field
reaches 0 at the very first activation of the trap, the value will
remain 0.)
LIGHTNING_CONDUCTOR
A: short frame counters run
here again and again if the conductor is active (starting from about a
4-7 interval randomly to 0). One or two frames after the counter has
been started, the lightning appears and hits the ground when the counter
reaches 0. (Though the value is 0 now you can see the lighting for
further some frames.)
B: the default value is 0 but a newer and newer
random (maximum three digits long), positive or negative number will
show up in this field (till the next lightning) if a newer and newer
lightning blasts. I think the numbers mean the coordinate wherefrom the
actual lightning comes towards the conductor object.
C: only with
OCB=2 (see the special setup in the 'Street Bazaar' level): a constant
four digits number is here (eg. 8968). I think it's some kind of code
number for the room in which this conductor is placed.
D: only with
OCB=2: if you've placed the pushable object to the proper place to
divert the lightning, then a frame counter will start running here from
0. It stops at 120 (and remains that) and now the lightning will blast
into the conductor with OCB=2 value to crash the ANIMATING8 object.
ELEMENT_PUZZLE
A: 0: the scale is not used, 1: the
water/petrol/dirt is poured in the scale, 2: Lara holds the torch to the
petrol, 3: the petrol is burning.
B, C, D: none
(PICKABLE
OBJECTS)
A, B, C: none
D: 1: the item has just activated a PICKUP
trigger, 0: in any other cases.
PUZZLE_HOLEs
A: 1: if Lara is
just placing the puzzle item here (including the 'taking it out of the
backpack' part), 0: in any other cases.
B, C, D: none
TURN_SWITCH
A: 0: the switch hasn't been used yet, 1: just moving
anti-clockwise (and after that), 2: just moving clockwise (and after
that).
B: 0: the switch hasn't been used yet or is just being turned,
2: the turning of the switch has just stopped (and after that).
C, D:
none
CROWBAR_SWITCH
A: 0: the switch is useable, 1: the switch
can't be used any more because a BABOON_NORMAL has been triggered in the
same room where the switch is.
B, C, D: none
PULLEY
A: none
B: (see the obelisk-puzzle from 'The Great Hypostyle Hall'): 1: the
pulley is forbidden ('Invisible'), 0: the pulley is useable
C: 0: the
pulley hasn't been used, 1: the pulley has been used at least once.
D: 1 - standard value, i.e. the number you must type into the OCB window
of the pulley.
DOOR_TYPEs (only with COG_SWITCH)
A: it is 0 if
Lara isn't moving the switch. Or if she is then a frame counter starts
here from 40 that ends at 0 exactly when Lara finishes the switch-using
move. (Each switch-using is a 40-0 sequence.) I mean, if the door has
ascended too high so that can't ascend all along when Lara is using the
switch, then (though Lara's still using the switch) the frame counter
will be interrupted and turns into 0.
B, C, D: none
SEQUENCE_DOOR1
A: 0: the door hasn't been opened yet, 1: the door has
been opened (and maybe is closed now).
B, C, D: none
SEQUENCE_SWITCH1/2/3
A: 0: the switch isn't pushed in, 1: the switch
is pushed in.
B, C, D: none
GOD_HEAD
A: 0: the head hasn't
been activated, or has but hasn't been expanded to its maximal size yet,
1: the head is at its maximal size or is being/has been drawn back after
that.
B: activating the head, a counter starts here from 0 (to
control how long the head has been expanded), in Value 128/frame rate.
If the head is totally expanded, then the counter will stop at 4096. The
value remains that, but while the head is being drawn back, the counter
will run back to 0 (in the same rate).
C: the default value is 0.
When the head reaches its maximal size, then a frame counter starts from
210. Reaching 0, the head starts drawing back.
D: none
STATUE_PLINTH (with OCB=0)
A: 0: the PUZZLE_ITEM5 isn't placed on
this pedestal, 1: that item is placed here.
B: 1: the inventory has
been opened automatically at PUZZLE_ITEM5 (and is still open) when you
hit CTRL at this pedestal, 0: in any other cases.
C, D: none
GRENADE (yes, it can be placed! See more about it in the tutorial
Pyrotechnics and Flame Emitter Special Effects)
A, C, D: none
B: the default value is 0. A short frame counter runs
here from 16 to 0 when the grenade is exploding (excluding the
'splitting flames' part after the exploding itself).
STEAM_EMITTER
A: as a horizontally blown steam: a non-0 number will
show up in this field if the emitter starts stopping blowing the steam.
This number depends on what you typed in the OCB window of the emitter.
(For example if you want 2 seconds pause between the blows, then this
number is 60, because 2x30=60 and 1 second is 30 frames.) A frame
counter starts from that value at once. While that is running, the
emitter stops blowing. When the counter reaches 0 the emitter will start
blowing again.
As a (non-continuous) bubble-emitter under water: the
default value is 0 but sometimes a number (randomly between 4 and 7)
will show up in the field, indicating now a bunch of bubbles will be
emitted that contains that 4-7 amount of bubbles. When the bubbles are
being emitted one by one then the value decreases to 0 one by one.
As
a (continuous) bubble-emitter under water: the default value is 20. A
frame counter will start from this value when the emitter has been
triggered. Reaching 0, nothing special will happen. (Newer activation
won't start the counter again.)
B: as a horizontally blown steam: a
random number (somewhere below 100) shows up in this field when the
emitter starts blowing the steam, starting a frame counter at once from
that value. When it reaches 0 the emitter will start stopping blowing.
As a (continuous) bubble-emitter under water: the default value is 1.
One or two moments after the emitter has been triggered (so when the
first bubbles comes out of the emitter) it turns into 0, and remains
that 'forever'. (I think that 'one or two moments' is the frame counter
that runs in Custom_A field now.)
C: as a horizontally blown steam:
when the emitter starts blowing, then it counts from 0 to 4096. When the
emitter starts stopping blowing, then it counts down from 4096 to 0. -
It's the actual length of the flown steam. 4096 is about 1 (1,5,
instead) square long.
D: none
EARTHQUAKE
A: numbers show up
here randomly above 0. (109 seems the biggest number.) - This is the
actual intensity of the earthquake.
B: the actual intensity of the
earthquake, but not as precise as in Custom_A. I mean, there are only
two values now: 20: low earthquake, 100: high earthquake. (Deactivating
the earthquake, the value is always 100 instead of 0.)
C: it's a
frame counter. It starts from a value, and, reaching 0, it will start
again from a different value. (The starting numbers are two or three
digits numbers below 200.) I think every phase from the start point to 0
means an intensity range. (So when the counter counts down the next
phase from the start to 0 then the earthquake will have another
intensity range, with bigger or smaller quakes as in the previous
phase.) - The default value is 0 but antitriggering means a pause in the
counter.
D: none
WATERFALLMIST (only if you customized it by
OCB)
A: with standard, low or fast emitting: 0: deactive
waterfallmist, -1: active waterfallmist.
With random emitting: two
random frame counters run here one after the other (from the default
Value 0 when the emitter has been activated): the starting values are
one or two digits long positive numbers, and the end point is 0. The
first sequence counts the time when the mist is being emitted, the
second sequence counts the time when there is in a pause in the
emitting. Then newer and newer first and second sequences are coming, of
course.
B: 0: the mist isn't active or there's just a pause in the
emitting, 1: the emitting just happens.
C: only with random emitting:
random numbers show up here, probably from a 1-14 interval. A newer
number will always show up at a start of a newer sequence. (So eg. at a
start of the first 'activity' sequence Value 11 will show up in the
field instead of the 0 there. Then, at a start of the first 'pause'
sequence Value 8 will show up in the field instead of the 11 there.) I
don't know what the exact meaning of these random numbers is, but be
careful, because two sequences after each other may have the same random
value.
D: none
SPRINKLER
A: a frame counter starts here
from 0 when the sprinkler has been activated. When the last drip has
come out of it, the counter will stop at 1200 (and remains that). (The
'shower part' stops at about 600.)
(Note: the usage of several
objects is limited because of this kind of frame counters 'tying' them.
- But you can use some tricks against that:
I mean, for example, this
sprinkler cannot be antitriggered and cannot be re-triggered. But it
doesn't mean you can't use the sprinkler more than one times: just force
Value 0 into this field after the dripping has stopped, and the counter
with the sprinkler will be active again. - Yes, we didn't antitrigger
the sprinkler that's why the counter continues running at once, from 0
to 1200 again, if we turn the value into 0.
Or an example for another
trick: force 1000 into the field when the counter reaches 200, so this
sprinkler will stop after only a short dripping, because it has been
'showering' before that only for a short time.)
B, C, D: none
AMBER_LIGHT
A: if this light is active then the value runs
continuously from -32768 to 32767, again and again. (So each value means
the actual degree of the pulsing intensity.) - It changes Value 2048
after each frame. So each cycle is 32 frames long. (The default value is
0 but antitriggering means a pause in the counter.)
If you want other
Value instead of 2048, then see the 'Time' field of the
CUST_LIGHT_OBJECT type Customize Script command. You can find Value 2048
here as '-2048'. Type another negative value here, for slower (closer to
0) or faster (farther from 0) changes.
(Note: activating the light at
the very first time, the counter always starts counting from 0, with the
difference value: 0, -2048, -4096 etc., or 0, -16, -32 etc. Reaching
minus thirty-thousand-whatever, it will turn into a
thirty-thousand-whatever positive number, and start counting down to 0.)
B, C, D: none
WHITE_LIGHT
A: a frame counter starts here from
0 when the object has been activated. When this 'neon light that starts
lighting in a blinking mode' lights continuously at last, then that
means the counter stops at 160, and remains that. (Antitriggering turns
the value back to 0.)
If you want other Value instead of 160, then
see the 'Time' field of the CUST_LIGHT_OBJECT type Customize Script
command. Type another value here, if you want. The smallest possible
value is 96. The largest value that doesn't seem to cause a malfunction
is about 200. ('Malfunction': some parts of the counter will be
repeated, eg. 160-230, 160-230, so the counter is stuck there - but
maybe for a while.)
B, C, D: none
(AI OBJECTS), LARA_START_POS
A, B, C, D: some of the fields have a constant 0, some of them have
another constant number. Whatever they all are, I don't know.
PLANET_EFFECT
A: the starting value is 50+OCB number-1. (So eg. if
Value 4 is typed in the OCB window, then the field value is 50+4-1=53.)
If the effect has been activated, the value turns into -1 ('forever').
B: none
C, D: I don't know the exact meaning of the constant
(positive) value here, but I know only OCB=1 effect has that value (the
one that will directly be linked to ANIMATING4 - see the globe-puzzle of
'The Lost Library), the other effects have Value 0 here.
LASER_HEAD
A: 0: the head hasn't been activated yet or it has, but
the head is still ascending i.e. isn't in a position to attack/search
for Lara, 1: the head is in attacking position (but isn't attacking) or
searching for Lara, 2: the head is attacking: getting energy or shooting
that, 3: the eyes are all shot (and after that, 'forever').
B: (some
negative number with four digits - let's call it Value A): the head
hasn't been activated yet or it has, but the head is still ascending,
Value A minus 5: after the head has ascended ('forever', so even if the
head has been exploded).
C: the default value is 0. Activating the
head, a counter starts from that (each value/2 or 3 frames). Reaching 8,
it stops (keeping the value). Some moments after that (so when the head
has ascended) the counter jumps to 2640 and starts a fast counting
(Value 546/frame): 2640, 3186, 3732 etc. Reaching 32 thousand-whatever
it turns into -32 thousand-whatever and continues running, counting
down. Reaching 0, it turns into positive numbers again, and starts the
counting up again etc.
Just when the two eyes has been shot, the
Value X in Value X/frame starts increasing fast, soon it reaches the
twenty-whatever-thousand value. When the head has just been exploded,
the last value remains in the counter, forever.
D: the default value
is 90. It starts a frame counter when the head reaches the starting
position. Only when the counter reaches 0, the head will start searching
for Lara.
After that, two types of frame counters will show up in the
field again and again:
One of them is if the head is searching for
Lara but can't find her. Now the starting value is between somewhere
20(?) and 100(?). The head will perform sudden head-movements always
when the counter reaches 0. (If the head notices Lara, then the counter
will be interrupted, keeping its last value, till the next type counter
starts.)
The other counter type works when the head notices Lara and
tries to hunt her down. It counts from 0 to 91. (This is the part when
the head is getting energy.) When he's shooting, the counter is 91
constantly. Each newer attacking operation means one newer 0-91
interval.
When the eyes are all shot the counters will be interrupted
and some other (even huger) numbers will show up here one after the
other. When the head has just been exploded, the last value remains in
the counter, forever.
HYDRA
A, B, C: none
D: when the hydra
starts shattering ('dying') then a counter starts here from 0. (I think
each value/2 or 3 frames.) When the shattering has been finished the
counter stops at 12 and remains that.
ENEMY_SUB_MARINE
A:
Positive (maximum 1984) numbers here mean how much the submarine is just
tilted right. Negative (maximum -1984) numbers here mean how much the
submarine is just tilted left. 0: the submarine isn't just tilted at
all.
B, C, D: none
FISH_EMITTER
A: the default value here
is the amount of fish that will be emitted. When the emitter has been
triggered, the emitter will emit the fishes one by one, decreasing the
amount here one by one. When the last fish has come out, the value is
naturally becomes 0.
B: the default value is 0. When the emitter has
been triggered, the emitter will emit the fishes one by one. If a fish
is just emitted, a random number will show up here, between 16 (?) and
1. A frame counter starts at once from that value. Reaching 0, the next
fish will be emitted. (When the last fish has been emitted, his random
number will 'freeze' in the field, not starting a counter.)
C: -1:
the emitter hasn't been triggered, 0: the emitter has been triggered.
D: when more types of fish will be emitted then the actual emitted
amount of that fish type is counted here. For example, this is the
sequence here, if you have 3 fishes in 3 fish types: 0, 1, 2, 3, 0, 1,
2, 3, 0, 1, 2, 3. (The last '3' value will remain in the field.)
Notes:
1. The Moveable object slots not mentioned above don't
have values either Custom_A or Custom_B or Custom_C or Custom_D field:
MOTORBIKE, JEEP, SKELETON, MUMMY, HORSE, SCORPION, TROOPS,
JEAN-YVES, KNIGHTS_TEMPLAR, WILD_BOAR, DEMIGOD1/2/3, BIG_BEETLE, BAT,
DOG, HAMMERHEAD, SAS, SAS_DRAG_BLOKE, LARA_DOUBLE, SMALL_SCORPION,
LOCUST_EMITTER, GAME_PIECE1/2/3, ENEMY_PIECE, DART_EMITTER,
FALLING_CEILING, SMASHABLE_BIKE_WALL/FLOOR, COG, FLAME, ROPE, POLEROPE,
SQUISHY_BLOCK1, MAPPER, KEY_HOLEs, SWITCH_TYPEs, UNDERWATER_SWITCH1/2,
COG/LEVER/JUMP_SWITCH, PUSHPULL/KICK/UNDERWATER_DOOR, DOUBLE_DOORS,
BRIDGEs, SARCOPHAGUS, SMOKE_EMITTER_WHITE/BLACK,
RED/GREEN/BLUE/BLINKING_LIGHT, LENS_FLARE, TRIGGER_TRIGGERER,
SMASH_OBJECTs, DEATH_SLIDE, CAMERA_TARGET, WATERFALLs, ANIMATINGs,
MOTOR/RUBBER_BOAT, PARALLEL_BARS, PANELs, TIGHT_ROPE,
LASER_HEAD_BASE/TENTACLE, FROG_MAN, KAYAK
2. I don't know if I
examined all the possible situations about a given object slot to know
the values in these fields. So maybe you'll encounter some cases when a
field contains non-0 values, though I wrote it's 'none'. Or maybe you'll
encounter some cases when a field also contains other values not only I
mentioned above.
(Moreover, I can't examine some situations because I
don't understand them. For example I don't know how the setup of the
GUIDE works in the 'Valley of the Kings'.)
3. Each Moveable
object slots that haven't been mentioned so far, that haven't been
studied (because of they are no placeable - see eg. LARA_SKIN, FLARE etc
- or its setup is too complicated or unknown - see eg. VON_CROY,
SPIKEY_FLOOR, SARCOPHAGUS_CUT, HORUS_STATUE etc. - or aren't useable -
see eg. MINE_DETECTOR or SECRET_MAP etc.).
4. Be careful! Some
fields of some object slot may have strange values in strange
situations. Or is it a bug? - See an example to understand what I'm
talking about:
As I said above, the value of PUSHABLE_OBJECTs in
Custom_D field is a constant 0. But in my 'dummy' level (i.e. the level
where I do the testing for the tutorials) once I countered a case when
that value became 1 ('forever') when Lara started pushing/pulling that
object at the very first time. However, I can't duplicate that case in
another level. Moreover, when I deleted all the objects from my test
level, rebuilt the WAD and loaded the objects again, and placed a newer
pushable object then the Custom_D field of that pushable was a constant
0.
So that 0/1 situation was a special situation that caused by a
special setup I couldn't duplicate - or that was just a bug.
Probably
(or perhaps?) we can't rule out that you will experience similar
situations with the values I mentioned above in this addendum.
5.
Please note some trap values in the tutorial seem random are probably
really random (sort of...). - See eg. 1920 at the description of CHAIN.
I don't want to really check them because they are pretty unuseful
values, probably nobody will ever use them.
So please check them if,
however, you will use them. (It is not as hard as it sounds. I mean, eg.
at that CHAIN parameter the value is 0 or 1920. So, you can treat 1920
as "not 0", i.e. your two values is not "0/1920" but "0/not 0".)
Made using TRNG 1.2.2.6