Pickups - Advanced
by
AkyV
Download a
project file illustrating this tutorial
When you want Lara to pick up an item then you place
the item in one of the ways below:
- directly on the ground -
Lara is standing/crouching on the ground or floating in deep water, and
reaching for the item.
- on a pedestal - Lara is standing on the
ground, and reaching for the item.
- tightly against a wall - Lara is
standing on the ground, and getting the item using crowbar.
- into a
hole in a wall - Lara is standing on the ground, and reaching into the
hole for the item.
See more about those methods in this tutorial:
Pickups - the Basics
But there
are other specific places where you can place an item so that Lara will
pick it up from them:
a, sarcophagus
b, box
c, drawer
d, cupboard
e, shelves
None of these specific methods
requires special OCB-numbers!
Sarcophagus
The method of the sarcophagus is the only
one of methods from a to e that you encounter in the original TR4 game
and Level Editor.
See this example in cleopal.prj Room111:
Lara goes to the sarcophagus. The player hits CTRL thereupon
the sarcophagus-using animation (439) starts: Lara pushes the lid of the
sarcophagus, leans in the sarcophagus and takes a small medipack out of
it:
The setup is easy:
Place the items Lara will get from the
sarcophagus, on a square. Then place the sarcophagus (it's FURNITURE5 in
cleopal.prj) on the same square to cover the pickable items. After that,
place the sarcophagus lid (you can find this object as SARCOPHAGUS) on
the sarcophagus. - Be aware: that side of the lid will be pushed by Lara
where you can see the two black patches.
(You can open each sarcophagus only once,
because the opened lid remains open 'forever'. - And be careful: Lara
puts something into her backpack at the end of her animation. So, if you
want to use non-empty and/or empty sarcophagi on a level then you must
re-edit the animation to make it useable for the empty ones as well.
For example, do that re-edition
with a move - replacing the 'putting into the backpack' part by that -
that seems ambiguous: 'Has Lara put anything into her backpack or has
she just been scratching?'
Or you activate some special
camera just in time so the player won't see the backpack part of the
animation when the sarcophagus is empty.)
Box
B, c, d and e methods are all from TR5.
So, if you want to use them in NGLE then you must make them compatible
with NGLE.
The compatibility-adjusting operation is easy: put the container object
into SARCOPHAGUS slot, then replace the sarcophagus-using animation by
the animation that's for using that container, in #439 animation slot of
LARA object.
For example, if you want Lara to pick up the item
from a box, then put a proper box object into SARCOPHAGUS slot, then
replace Lara's sarcophagus-using animation by her box-using animation,
in #439 animation slot.
Attention!
Check it: every special animation
of Lara that this tutorial cares about must always have Animation11 as
Next Animation.
You can find 'a proper box' for example in the WAD of TR5 Level 'Escape
with the Iris'. - After you've copied it into your WAD, don't forget to
adjust its own animation to work properly in NGLE:
a, The animation be must be in Animation#0 slot. If it's not, then copy
it there.
b, Check the values: StateID/Next Animation/Speed/Accel=0,
Next Frame=the last frame of this animation.
c, State Change Editor
must be empty.
d, Check AnimCommands: only the required sound
commands could be placed there. 'Die' and other special commands must be
deleted.
Lara's box-using TR5 animation is Animation472. - But
you don't need to do the 'usual replacing' by Animation Editor of
WADMerger. (However, you can find the animation in the above-mentioned
TR5 WAD, for example.)
Instead of that, open Switch Manager of
WADMerger. See the small SACROPHAGUS (!) window there. Choose 'Suitcase'
entry then click on 'Save' to close the panel of Switch Manager. - Now
you can see: the box-using animation has been put into Lara's
Animation439 slot of your WAD.
Every time
when you open WADMerger, the values of Switch Manager will be goes back
into their default states.
So, if you open WADMerger, and then open
Switch Manager to adjust something else there, then you also adjust
'Suitcase' again there everyway or else the box won't work properly if
you close the Switch Manager with clicking on Save.
So the box is in your WAD, with its and Lara's proper animations. Save
the WAD and refresh it in your project.
The setup is easy:
Place the items Lara will get from the box, on a square. Then place the
box (SARCOPHAGUS) on the same square to cover the pickable items.
And that will happen in the game:
Lara goes to the box. The player
hits CTRL thereupon the box-using animation (439) starts: Lara kneels to
the box, opens it, takes the item(s) out of it, then closes the box and
stands up.
(You can open/close each box only once. - And be careful: Lara puts something into her backpack at the end of her animation. So, if you want to use non-empty and/or empty boxes on a level then you must re-edit the animation to make it useable for the empty ones as well.)
Drawer
So you need a proper object in SARCOPHAGUS
slot. This object is a drawer now - you can find one for example in the
WAD of TR5 Level 'The Submarine'. (You also have to find here a chest
for the drawer. Place it into your WAD as well.) - Don't forget to
adjust Animation0 of the drawer, the same way as you would do with the
animation of the box above.
Lara's drawer-using TR5 animation is Animation465. Open Switch
Manager of WADMerger. See the small SACROPHAGUS window there. Choose
'Cupboard drawer' entry then click on 'Save' to close the panel of
Switch Manager. - Now you can see: the drawer-using animation has been
put into Lara's Animation439 slot of your WAD.
So the drawer is
in your WAD, with the chest and its and Lara's proper animations. (In
'The Submarine' the chest is a Moveable so you had to put it into an -
any - ANIMATING slot of your WAD. In other source WADs the chest could
be a Static, so you should put it into a - any - non-shatter Static slot
of your WAD.)
Save the WAD and refresh it in your project.
The setup seems easy:
Place the
items Lara will get from the drawer, on a square. Then place the chest
on the same square. After that, place the drawer (SARCOPHAGUS) 'into the
chest'.
But you'll discover a problem: the chest is thin so it
won't cover the pickable items on the middle of the square. And, if Lara
goes to the drawer, then she'll reach down for the items to pick them up
directly, and won't pull the drawer out.
That's why you make these
pickable items invisible in their OCB panel.
But the setup still
won't work: if Lara goes to the drawer, she won't pull it out.
The problem is preventable if Lara steps back
now one step and the player uses CTRL after that.
But it's
nonsense: requiring the stepping-back of the player so that the
pulling-out will work properly?
To
really prevent the problem, adjust the collision box of the chest (using
Fexanim for the ANIMATING chest or StrPix for the Static chest) to make
(increase) its length half-square (512 units) sized (approximately).
-In this case, Lara can't step to the chest because its collision
box will prevent her from doing this. But now Lara will be able to pull
out the drawer when she's been just stopped by the collision. She takes
the item(s) out of the drawer, then pushes it back. (You can push
out/pull back each drawer only once.
- But this time you don't
need to be careful: Lara doesn't put anything into her backpack at the
end of her animation. So, this animation is usable for both non-empty
and empty drawers.) No, it still isn't okay - the gap between Lara and
the chest is too big. It's ugly - it seems as if Lara were rummaging not
the drawer but the air before the drawer.
- Of course, if you're
not using a special camera then the chance only is little that the
player will notice that small bug:
Maybe you think it's a good prevention for the problem if you choose new
coordinates for the chest and the SARCOPHAGUS drawer on that square (for
example, by 'Move. Move , <#>animating for (E)units (one sector = 1024)'
ACTION triggers). Forget it. It's just a time-wasting.
Okay, I tell: the real reason for the problem must be (I think, at
least...) that the drawer doesn't have the proper pivot to be a proper
SARCOPHAGUS object. Because - as opposed to the drawer - the efficient
sarcophagus lid/box has its pivot in the middle of the object:
So, if you want, then edit (or get) a drawer having a proper pivot. (Or
you can search special solutions, for example, on TRSearch.) - That's
not what I did.
Instead of that I decided I would search for a new solution.
And why is it worth forcing a new method? Just think about it: for
example, you can use a box AND (!) a drawer in the same level - the box
will be used as SARCOPHAGUS and the drawer will be used by the new
method. (If you force SARCOPHAGUS method for the drawer then you can't
use the box as SARCOPHAGUS. But you can use the box by the new method,)
So, this is the new method for the drawer:
- Put the drawer-using TR5 Lara animation
(465) into a new animation slot of your WAD (for example, Animation480).
(Maybe after you've put it into Animation439 slot by Switch Manager. -
However, you can find the animation in the above-mentioned TR5 WAD, for
example.)
- Put the Moveable
chest into an - any - ANIMATING slot of your WAD (for example,
ANIMATING1) or the Static chest into a - any - non-shatter Static slot
of your WAD (for example, PLANT0).
- Put the drawer itself into an - any -
ANIMATING slot (for example, ANIMATING2). (Adjusted its Animation0 as if
it were in SARCOPHAGUS slot. - Except: this time the Next Frame must be
0!)
- Place the chest and the
drawer on a square - but don't place any pickable item there!
- Don't change any default collision now.
- Use the proper commands in Script. - See this example for
them (let's call it Setup X):
Animation= 480, KEY1_ACTION,
IGNORE, IGNORE, ENV_MULT_CONDITION, 1, IGNORE, -103
MultEnvCondition=
1, ENV_ITEM_TEST_POSITION, 1, IGNORE, ENV_FREE_HANDS, IGNORE, IGNORE
TestPosition= 1, IGNORE, ANIMATING2, -100, 100, -100, 100, -100, 100,
-1000, 1000, -200, 200, -200, 200
GlobalTrigger= 1,
FGT_SINGLE_SHOT_RESUMED, GT_CONDITION_GROUP, IGNORE, 1, 2, IGNORE
GlobalTrigger= 2, IGNORE, GT_CONDITION_GROUP, IGNORE, 1, 5, 6
TriggerGroup= 1, $8000, 480, $1E
TriggerGroup= 2, $2000, 127, $1
TriggerGroup= 3, $5000, 65, $2B
TriggerGroup= 4,
$2000+TGROUP_SINGLE_SHOT, 48, $15F, $2000, 48, $110
TriggerGroup= 5,
$2000, 51, $0
TriggerGroup= 6, $2000, 52, $0
Organizer= 1, IGNORE,
IGNORE, 0, 3, 3, 4
(See more about these Script commands in NG
Center\Reference.)
These things will
happen in the game with Setup X:
Lara goes to the drawer.
The player hits CTRL thereupon the drawer-using animation (480) starts:
Lara pulls out the drawer, takes the item(s) out of it, then pushes it
back. (You can push out/pull back each drawer ANY TIME YOU WANT, again
and again! - even if Lara has taken the items out or if the drawer was
empty in the first place.)
Why? Well, let's see the operation
step by step:
1. All the conditions - defined in Animation=480
command - must be true so that that (the drawer-using) animation will
start:
a, The player must hit CTRL.
(See: KEY1_ACTION - the constant for CTRL.)
b, Lara must be standing and still. (See: -103
- i.e. Animation103, the 'standing still' animation.)
c,
All the conditions in MultEnvCondition=1 command must be true. (See:
ENV_MULT_CONDITION, 1.)
These are the conditions in
MultEnvCondition=1 command:
a, Lara is
in a given position - defined in TestPosition=1 command -, compared to
the drawer. (See: ENV_ITEM_TEST_POSITION, 1.)
b, Lara's hands are empty. (See:
ENV_FREE_HANDS.) - This is the way to prevent Lara from pulling out the
drawer with a weapon or something else (except a flare) in her hands.
(The animation is obviously ugly without empty hands.)
(By
the way, if she's pulling the drawer out with a flare in her hand then
maybe it disturbs the flare-using operation, a bit later, once. - I.e.,
for example, Lara raises her left, empty hand as if there were a flare
in it. It's easy to fix it if you draw a weapon after that.)
TestPosition=1 command defines a position where Lara is very close to
the drawer and - more or less - facing exactly that.
2. So the
conditions for Lara are true and the player has just hit CTRL, causing
the start of Animation480. - In this case the condition (in
TriggerGroup#1) for GlobalTrigger#1 is true:
; Set Trigger Type - CONDITION 30
; Exporting: CONDITION(30:0) for
PARAMETER(480)
; <#> : Animation= 480
; <&> : Lara. (Animation) Lara is
performing <#>animation
; (E) :
; Values to add in script command:
$8000, 480, $1E
3. If the condition of GlobalTrigger#1 is true it means TriggerGroup#2
will happen, starting Organizer#1:
; Set Trigger Type - FLIPEFFECT
127
; Exporting: TRIGGER(1:0) for
FLIPEFFECT(127)
; <#> : Organizer. Enable
<&>Organizer
; <&> : Organizer= 1
; (E) :
; Values to add in script command:
$2000, 127, $1
4. Organizer#1 works this way:
a, it starts TriggerGroup#3 at once (see: 0, 3),
b, and, after 3
seconds it starts TriggerGroup#4 (see: 3, 4).
5. So
TriggerGroup#3 starts just when Animation#480 starts.
In
TriggerGroup#3 you can find this trigger:
; Set Trigger Type - ACTION 43
; Exporting: TRIGGER(43:0) for ACTION(65)
; <#> : ANIMATING2 ID 65
; <&> : Trigger. (Moveable) Activate
<#>Object with (E)Timer value
; (E) : Timer= +00
; Values to add in script command: $5000,
65, $2B
It means the animation (the 'pulling-pushing') of ANIMATING2 (the
drawer) starts just when Lara's drawer-pulling/pushing animation starts.
6. So 3 seconds after the pulling has started TriggerGroup#4 will be
executed, with these triggers in it:
; Set Trigger Type - FLIPEFFECT 48
; Exporting: TRIGGER(351:0) for
FLIPEFFECT(48)
; <#> : Inventory-Item. Increase (+1) in
(E)way the number of <&>inventory-item in inventory
; <&> : UZI_AMMO_ITEM Slot=352
; (E) : Show animation of item (like it
was picked up)
; Values to add in script command: $2000,
48, $15F
; Set Trigger Type - FLIPEFFECT 48
; Exporting: TRIGGER(272:0) for
FLIPEFFECT(48)
; <#> : Inventory-Item. Increase (+1) in
(E)way the number of <&>inventory-item in inventory
; <&> : PUZZLE_ITEM3_COMBO1 Slot=191
; (E) : Show animation of item (like it
was picked up)
; Values to add in script command: $2000,
48, $110
In the third second of Animation480
Lara's just rummaging the drawer. It means a clip of Uzi ammo and (after
that) a PUZZLE_ITEM3_COMBO1 will be added to inventory when Lara s just
rummaging the drawer 'to find something'.
When a pickable item 'has just been found in the drawer' (it happens in
the third second now, as you see), you'll see the item for some moments
in the lower right corner of the screen, indicating: 'I'm just rummaging
this drawer and look what I've found!'
7. Maybe the player forgets (s)he's opened
that drawer before so (s)he opens it again (and again) sooner or later.
(S)he's able to do that because of these things:
First of all, the Next Frame value for the
Animation0 of the drawer is 0 now. - But what is it supposed to mean?
Well, it means if the
pulling-pushing animation of the drawer has just ended then it won't
stop: the drawer will be pulled out then pushed back again and again, in
loop mode.
So it's doing that continuously even when
Lara's not doing pulling animation. Of course, it's not good for us. But
don't worry: we'll use some tools to regulate that uncontrolled move.
I mean, first of all, you need to export a trigger as an AnimCommand
into the last frame of Animation0 of the drawer. (Because of technical
reasons it's the frame just before the last one, actually.) This trigger
is to stop the actual animation (of course, it's Animation0) of the
drawer just when that has just been ended exactly:
; Set Trigger Type - ACTION 44
; Exporting: TRIGGER(44:0) for
ACTION(65)
; <#> : ANIMATING2 ID 65
; <&> : Trigger. (Moveable)
Untrigger <#>Object with (E)Timer value
; (E) : Timer= +00
; Values to add in script command:
$5000, 65, $2C
(When exporting, click on 'No' on 'What object' pop-up panel.)
As Animation0 of the drawer and Lara's
Animation480 have the same length (see the amount of frames) it means
Animation0 will be stopped in the proper moment: just when Lara's
animation has ended.
And, if Lara starts pulling out that drawer again, she starts the
animation of the drawer again - from its first frame exactly -,
activating TriggerGroup#3 again.
Notes for the new method:
1. You need a FGT_SINGLE_SHOT_RESUMED flag for Animation=480 command, or
else the 3 second counter will start only if the Animation480 has just
been ended.
(Not FGT_SINGLE_SHOT flag! If you use that then the
drawer won't be being pulled again when Lara's performing Animation480
again at that drawer.)
2. TGROUP_SINGLE_SHOT constant in
TriggerGroup#4 is necessary or else Lara would get the pickable items at
every pull of the drawer again and again.
3. The condition in
GlobalTrigger#2 is "when Lara's performing Animation#480". It means the
GlobalTrigger disables all the key commands (see TriggerGroup#5: $2000,
51, $0) when Lara's pulling/pushing a drawer, then enables them again
(see TriggerGroup#6: $2000, 52, $0), if she's just pushed the drawer
back.
; Set Trigger Type - FLIPEFFECT 51
; Exporting: TRIGGER(0:0) for
FLIPEFFECT(51)
; <#> : Keyboard. Disable
<&>keyboard command for (E) time
; <&> : All keyboard commands
; (E) : Forever (use other
action/effect to disable it)
; Values to add in script command:
$2000, 51, $0
; Set Trigger Type - FLIPEFFECT 52
; Exporting: TRIGGER(0:0) for
FLIPEFFECT(52)
; <#> : Keyboard. Enable newly
<&>keyboard command
; <&> : All keyboard commands
; (E) :
; Values to add in script command:
$2000, 52, $0
Why? Because, in spite of ENV_FREE_HANDS constant, the player could hit
SPACE to draw a weapon and CTRL to shoot with it, while Lara's
performing that animation, if you don't use that GlobalTrigger.
(Feel
free to make the GlobalTrigger more precise, so that it will work only
on SPACE and CTRL, if you want. - Practically, it doesn't necessary, I
think. You don't need to do that, except if you want something special
during Animation480 - for example, to abort a special camera view by
hitting the Look key.)
4. If you want the drawer to be empty at
the first pull then form Setup X this way:
a, You don't need
TriggerGroup#3, #4 and Organizer#1.
b, Write the same thing to
TriggerGroup#2 (instead of $2000, 127, $1) what you should write to
TriggerGroup#3 ($5000, 65, $2B).
5. Maybe you want to use more
drawers - used by the new method - in your level. Taking the example
where there are two non-empty drawers (both ANIMATING2) in the level, do
all these things, forming Setup X.
a, Not GlobalTrigger#1, but
another GlobalTrigger (#3) will work for the other drawer (or else, the
items she should find in the first drawer could go to her when Lara's
rummaging the second drawer first, and vice versa.). It means you have
to use 'GlobalTriggers. <&>Enable/Disable the (E)GlobalTrigger'
FLIPEFFECT triggers to locate the area where a Globaltrigger of a drawer
works, and each drawer must be in the area where its GlobalTrigger is
enabled. - Those areas are not allowed to be overlapped with each other!
(GlobalTrigger#2 of the weapons mustn't be located, it's a general
GlobalTrigger.)
b, GlobalTrigger#3 will also use TriggerGroup#1
as a condition but use TriggerGroup#7 as the executable trigger. In
TriggerGroup#7 you will place a trigger that enables Organizer#2:
GlobalTrigger= 3, FGT_SINGLE_SHOT_RESUMED, GT_CONDITION_GROUP,
IGNORE, 1, 7, IGNORE
TriggerGroup= 7, $2000, 127, $2
c, Attach
'TGROUP_USE_FOUND_ITEM_INDEX' to the trigger of TriggerGroup#3. It means
$5000, 65, $2B trigger will start both the first drawer (when Lara's
standing in front of that drawer) and the second drawer (when Lara's
standing in front of that drawer):
TriggerGroup= 3,
$5000+TGROUP_USE_FOUND_ITEM_INDEX, 65, $2B
(The condition that
makes the object index of the second drawer to become 'the found index'
must be the TestPosition.)
d, Define the content of the second drawer with another 'Inventory-Item.
Increase (+1) in (E)way the number of <&>inventory-item in inventory'
FLIPPEFFECT, in a new (#8) TriggerGroup - for example, a crossbow now:
TriggerGroup= 8, $2000+TGROUP_SINGLE_SHOT, 48, $163
e, Now
you can define Organizer#2:
Organizer= 2, IGNORE, IGNORE, 0, 3,
3, 8
f, When you export an AnimCommand, and that is an ACTION
trigger, then a panel will pop up (named 'what object'), asking you to
click on Yes or No. If you click on Yes, then the AnimCommand will work
as if we had attached a TGROUP_USE_FOUND_ITEM_INDEX constant to that.
And now, we want Yes, because we want the stopping to work on not only
the first drawer but also the second one.
So delete the formerly
exported AnimCommand from Animation0 and export the trigger again,
clicking on Yes this time.
(If all of your drawers are empty,
then the setup in Note#4 is just perfect - except: TriggerGroup#3 must
have a TGROUP_FOUND_ITEM_INDEX flag.
But, for example, what if the
first drawer is non-empty but second one is empty? - In that case you
must use Setup X, changing that this way:
First, copy
GlobalTrigger#1, giving a new ID to that.
In that new GlobalTrigger:
- delete RESUMED flag, and
- replace the ID of TriggerGroup#2 by
the ID of TriggerGroup#3.
But don't forget:
-
TriggerGroup#3 must have a TGROUP_FOUND_ITEM_INDEX flag.
- You have
to use the proper GlobalTrigger areas for the two drawers.
The
GlobalTrigger area of this empty drawer will work on all the empty
drawers of ANIMATING2.
So you don't need another setup if you use
more empty drawers now.)
6. If the setup doesn't work then check
the TestPosition values:
a, because the TestPosition values in
the example above just examples, and/or
b, because I experienced
sometimes (because of the position of the pivot?) the XDistanceMin/Max
and the ZDistanceMin/Max couples must be reversed with each other (so,
if you detect X values in the game then type them in Z fields of
TestPosition, and if you detect Z values in the game then type them in X
fields of TestPosition), and/or
c, because the difference between X
and Z values is (relatively) too big, and that maybe matters.
7.
Maybe you want to use more drawers - used by the new method - in your
level. Taking the example where there are three non-empty drawers (with
different looks, two in ANIMATING2, one in, for example, ANIMATING3
slot) in the level, use Setup X modified in Note#5 - except these
things:
You need its own TestPosition (for example, #2) for
ANIMATING3.
It means you can't use MultEnvCondition#1 for ANIMATING3,
because you must define a MultEnvCondition#2 with TestPosition#2.
You
need to create TriggerGroup#9. It contains two conditions: 'either all
the conditions in MultEnvCondition#1 are true (TestPosition#1+free hand:
$8000, 1, $10), or all the conditions in MultEnvCondition#2 are true
(TestPosition#2+free hand: $8000, 2, $10)':
TriggerGroup= 9, $8000, 1, $10, $8000+TGROUP_OR, 2, $10
; Set Trigger Type - CONDITION 16
; Exporting: CONDITION(16:62) for
PARAMETER(1)
; <#> : MultEnvCondition= 1
; <&> : Multiple condition of
<#>MultEnvCondition script command in (E)way
; (E) : In AND way. (All ENV
conditions have to be true)
; Values to add in script command:
$8000, 1, $10
; Set Trigger Type - CONDITION 16
; Exporting: CONDITION(16:62) for
PARAMETER(2)
; <#> : MultEnvCondition= 2
; <&> : Multiple condition of
<#>MultEnvCondition script command in (E)way
; (E) : In AND way. (All ENV
conditions have to be true)
; Values to add in script command:
$8000, 2, $10
Then, you have to change Animation=480 command:
Animation= 480,
KEY1_ACTION, IGNORE, IGNORE, ENV_CONDITION_TRIGGER_GROUP, 9, IGNORE,
-103
So, we've deleted MultEnvCondition=2 condition from
Animation=480. The new condition instead of that is if the conditions in
TriggerGroup#9 are true. So Animation480 will start either if Lara's
standing in front of an ANIMATING2 drawer, with free hands, or if she's
standing in front of an ANIMATING3 drawer, with free hands.
And,
lastly, use that 'Yes type' AnimCommand at both ANIMATING drawers, not
only ANIMATING2. (The operation is the same - i.e. stopping a Moveable
object-, so if ANIMATING3 will use that AnimCommand of ANIMATING2, it
doesn't matter, because the object ID of ANIMATING3 will be the 'found
index' when Lara wants to open an ANIMATING3 drawer.
And the 'Yes' is
useful because of other reasons as well: i.e. don't forget about the
cases when you use more ANIMATING2 and/or ANIMATING3 drawers.)
Cupboard
So you need a proper object in SARCOPHAGUS
slot. This object is a cupboard now - you can find one for example in
the WAD of TR5 Level 'Escape with the Iris'. - Don't forget adjust
Animation0 of the cupboard, the same way as you would do with the
animation of the box above.
Lara's cupboard-using TR5 animation is Animation464. Open Switch
Manager of WADMerger. See the small SACROPHAGUS window there. Choose
'Cupboard big doors' entry then click on 'Save' to close the panel of
Switch Manager. - Now you can see: the cupboard-using animation has been
put into Lara's Animation439 slot of your WAD.
So the cupboard is
in your WAD, with its and Lara's proper animations.
Save the WAD and
refresh it in your project.
The setup
seems easy:
Place the items Lara will get from the
cupboard, on a square. Then place the cupboard (SARCOPHAGUS) on the same
square.
But now you can discover the same problems just as you do
at the drawer: the items must be Invisible, Lara must take a step back,
you must increase the collision box of the cupboard. - And all of this
again because of the bad pivot. (This time Lara doesn't put anything
into her backpack at the end of her animation. So, this animation is
usable for both non-empty and empty cupboards.)
So, what shall you do?
Well, I
recommend you again a good pivot, this time for the cupboard, of course
- or see that new method, customized for the cupboard this time:
- Put the cupboard-using TR5 Lara animation
(464) into a new animation slot of your WAD (for example, Animation481).
(Maybe after you've put it into Animation439 slot by Switch Manager. -
However, you can find the animation in the above-mentioned TR5 WAD, for
example.)
- Put the cupboard
itself into an - any - ANIMATING slot (for example, ANIMATING4).
(Adjusted its Animation0 as if it were in SARCOPHAGUS slot. - Except:
this time the Next Frame must be 0!)
- Place the cupboard on a square - but don't
place any pickable item there!
-
Don't change any default collision now.
- Use the proper
commands in Script. - See this example for them (it's very similar to
the script of a drawer, but there is some difference, as you'll see):
Animation= 481, KEY1_ACTION, IGNORE, IGNORE, ENV_MULT_CONDITION, 3,
IGNORE, -103
MultEnvCondition= 3, ENV_ITEM_TEST_POSITION, 3, IGNORE,
ENV_FREE_HANDS, IGNORE, IGNORE
TestPosition= 3, IGNORE, ANIMATING4,
-100, 100, -100, 100, -100, 100, -1000, 1000, -200, 200, -200, 200
GlobalTrigger= 4, FGT_SINGLE_SHOT_RESUMED, GT_CONDITION_GROUP, IGNORE,
10, 11, IGNORE
GlobalTrigger= 5, IGNORE, GT_CONDITION_GROUP, IGNORE,
10, 5, 6
GlobalTrigger= 6, IGNORE, GT_CONDITION_GROUP, IGNORE, 14,
15, IGNORE
TriggerGroup= 5, $2000, 51, $0
TriggerGroup= 6, $2000,
52, $0
TriggerGroup= 10, $8000, 481, $1E
TriggerGroup= 11, $2000,
127, $3
TriggerGroup= 12, $5000, 36, $2B
TriggerGroup= 13,
$2000+TGROUP_SINGLE_SHOT, 48, $105
TriggerGroup= 14, $8000, 11, $1E
TriggerGroup= 15, $5000, 36, $2C
Organizer= 3, IGNORE, IGNORE, 0, 12,
7, 13
These things will happen in the game with the setup just above:
Lara goes to the cupboard. The player hits CTRL thereupon the
cupboard-using animation (481) starts: Lara open the door wings of the
cupboard, takes the item(s) out of it, then shuts the doors back. (You
can open/shut each cupboard any times. - So even if Lara has taken the
items out of that yet or if the cupboard was empty at the first use.)
I mean, Lara stands close to a cupboard
(having object index 36 now), facing that, according to TestPosition#3.
She's still and doesn't have anything (a flare, at most) in her hands.
The player hits CTRL so that Animation481 of hers ('looking through the
cupboard') will start. Synchronized with that (see Organizer#3, started
by TriggerGroup#11), Animation0 of the cupboard ('doors open then shut')
starts (see TriggerGroup#12), too. After seven seconds (see
Organizer#3), when Lara's just examining the shelves of the cupboard,
she 'finds' a PUZZLE_ITEM6 in the cupboard, thanks to TriggerGroup#13.
(GlobalTrigger#5 uses TriggerGroup#5 and #6 to prevent Lara's
weapon-using during the picking-up animation, using TriggerGroup#10 -
'when Lara's performing Animation481' - as a condition.)
And now let me speak about that part of the setup that differs from the
drawer:
It seems some exported AnimCommands - just as the one,
for example, we wanted to use to stop the animation of the cupboard -
don't work well if you attached them to a frame having bigger ID than
255. While the cupboard animation is 312 frames length, and that's why
we want to use Frame#311 now.
That's why we won't export AnimCommand
now, but put that (Animation0-stopping) trigger into TriggerGroup#15,
and put the TriggerGroup into GlobalTrigger#6. And, if Lara's just
performing Animation11 (see TriggerGroup#14) then the GlobalTrigger
activates TriggerGroup#15, stopping Animation0.
Why? Well, the
animation that follows Animation481 is (see: Animation Editor of
WADMerger) Animation11. So, if Lara has just ended Animation481 and
started Animation11 then Animation0 of the cupboard will stop. - And, if
Lara starts opening the cupboard doors again, she starts the animation
of the cupboard again - from its beginning -, activating TriggerGroup#12
again.
But, read carefully: the
animation of the cupboard won't start from its first frame exactly but
'only' from its beginning.
It's
because Animation0 stops JUST AFTER Animation481 has ended, i.e. when
Animation11 is just being performed. That's why the synchronization
between Lara's Animation481 and Animation0 of the cupboard isn't
perfect, there is one (?) frame slip. (No, ENV_ANIM_COMPLETE wouldn't
help: the result is the same. Moreover, the slip seems a bit bigger with
that tool.)
But it's only
important when Lara opens and shuts the doors again and again, because
much performance means 'many times one', i.e. many frames slip. - But
why would she do that?
(Many frames slip means not only
evident asynchronization between the animations but ugly stop as well,
of course. For example, Animation0 will stop not at the end but in the
middle: so you will see half-shut doors when Animation481 has just been
ended.)
Notes for the new method:
1. Lara's cupboard-using animation starts with
her trying to open the drawer under the cupboard doors. She opens the
doors only after that.
It's a bit lame if she's performing the
animation again: she tries the drawer before opening the doors. But now
she should know the drawer won't open, right? - This little imperfection
could be skipped easily with some imagination. For example, 'Lara's very
self-willed that's why she tries and tries again: she hopes the drawer
will open sooner or later'.
It's more interesting when she opens bigger cupboard doors, without a
drawer.
Because Lara uses the same animation. It means
her 'trying the drawer' deed is 'trying the lower part of the door' deed
in this case. So it looks this way again and again: 'she tries the lower
part of the doors before she opens the doors at their middle parts
successfully'.
Re-edit Lara's animation if it bothers you.
2. Lara performs
Animation11 in a lot of other cases, not only after Animation481. But it
doesn't matter now.
3. If you read the similar parts in the
section of the drawer carefully then you should be able to adjust the
similar setup for the cupboard in the cases below:
- empty
cupboard
- more cupboards
- different cupboards
4. You can
mix objects with new methods in your level. Practically, it means you
can use both drawer and cupboard in your level with that method, if you
want. (Naturally, that's not the drawer of the cupboard that I'm talking
about now.) - The two setups (drawer+cupboard) are compatible with each
other, if you use them simultaneously, but consider these things:
- For example, if you use one drawer and one cupboard, then you
don't need FLIPEFFECT triggers to locate the areas of the
GlobalTriggers, because both objects will use different Lara animations,
i.e. the conditions of the GlobalTriggers are not the same.
So the
areas can be overlapped now, if you want.
- You must use one
GlobalTrigger to disable/enable weapon-using for both cases. So the
condition of the GlobalTrigger is 'when Lara's performing Animation480
OR Animation481':
$8000, 480, $1E, $8000+TGROUP_OR, 481, $1E
- You can't use 'found index' for stopping the objects if you use
both AnimCommand (for the drawer) and TriggerGroup (for the cupboard).
You have to choose:
a, You will use
AnimCommand and TriggerGroup, but you use 'found index' nowhere for the
stops.
For example: you use one
drawer from ANIMATING2 slot, two drawers from ANIMATING3 slot and two
cupboards from ANIMATING4 slot. In this case you have to export an
AnimCommand (with 'No') of that ANIMANTING2 drawer to the Animation0 of
ANIMATING2, one AnimCommand (with 'No') of each ANIMATING3 drawer to the
Animation0 of ANIMATING3, deleting the stopping AnimCommands with 'Yes'
from those animations.
Then - see TriggerGroup#12 above -
you can't use TGROUP_USE_FOUND_ITEM_INDEX constant for the two
cupboards. - So, if you have those two cupboards with object ID 27 and
36, then you can't use this:
$5000+TGROUP_USE_FOUND_ITEM_INDEX,
36, $2B
Instead of that, you have to give both stopping triggers:
$5000, 36, $2B, $5000, 27, $2B
b, You use the original
version of TriggerGroup#12 (with one trigger and
TGROUP_USE_FOUND_ITEM_INDEX), but you don't use either 'Yes' or 'No'
stopping AnimCommands at all.
It seems the easier version but in this
case you will notice that slip problem at all the drawers.
Using
TGROUP_USE_FOUND_ITEM_INDEX at the starter TriggerGroups (see #3, #12)
couldn't be problematic now.
5. Feel free to develop a method
where you always stop the animation of the cupboard exactly at the last
frame, using an Organizer, to fix the slip. - As Lara won't open the
same cupboard a million times, then I think this experiment would be
only waste of your time.
Shelves
In fact, there is no way to use shelves with SARCOPHAGUS method.
(Naturally, that's not the shelves of a cupboard that I'm talking about
now.) I.e. we have to create a brand new method everyway if we want to
use this TR5 feature in our levels:
-
Put the shelf-using TR5 Lara animation (466, see, in the WAD of TR5
level 'Streets of Rome') into a new animation slot of your WAD (for
example, Animation482).
- Put
the shelf object (i.e. a rack of shelves, you can find one, for example,
in the above-mentioned WAD) itself into an - any - ANIMATING slot (for
example, ANIMATING5). - It doesn't have any animation so you don't have
to adjust anything in that now.
- Place the rack on a
square, then place the item(s) Lara will get from the shelves, 'on a
shelf'. (You can place and move the items - by Room Editor buttons - in
such a way that they will appear in different shelves in the rack in the
game, if you want.)
- Use the proper commands in Script. - It's
almost the same as the setup of the drawer or the cupboard. But this
time the Organizer won't start an animation for the shelves, so there
isn't TriggerGroup/AnimCommand to stop the shelf-animation either.
But now you can see something plus, about the pickable items. - See
this example:
Animation= 482, KEY1_ACTION, IGNORE, IGNORE,
ENV_MULT_CONDITION, 4, IGNORE, -103
MultEnvCondition= 4,
ENV_ITEM_TEST_POSITION, 4, IGNORE, ENV_FREE_HANDS, IGNORE, IGNORE
TestPosition= 4, TPOS_FOUR_HORIENT, ANIMATING5, -100, 100, -100, 100,
-650, -550, -1000, 1000, -200, 200, -200, 200
GlobalTrigger= 7,
FGT_SINGLE_SHOT_RESUMED, GT_CONDITION_GROUP, IGNORE, 16, 17, IGNORE
GlobalTrigger= 8, IGNORE, GT_CONDITION_GROUP, IGNORE, 16, 5, 6
TriggerGroup= 5, $2000, 51, $0
TriggerGroup= 6, $2000, 52, $0
TriggerGroup= 16, $8000, 482, $1E
TriggerGroup= 17, $2000, 127, $4
Organizer= 4, IGNORE, IGNORE, 2, 18, 1, 19
TriggerGroup= 18,
$5000+TGROUP_SINGLE_SHOT, 6, $150D, $2000, 48, $16D
TriggerGroup= 19,
$5000+TGROUP_SINGLE_SHOT, 4, $150D, $2000, 48, $16B
These things
will happen in the game with the setup just above:
Lara goes to the
shelves. The player hits CTRL thereupon the shelf-using animation (482)
starts: Lara looks through the shelves and takes the item(s) off them.
(You can look through each rack any times. - So even if Lara has taken
the items off that yet or if the rack was empty at the first use.)
I mean, Lara stands close to a rack of shelves, facing that,
according to TestPosition#4. She's still and doesn't have anything (a
flare, at most) in her hands. The player hits CTRL so that Animation482
of hers ('looking through the shelves') will start. After two seconds
(see Organizer#4), when Lara's just examining the middle shelf, she
finds a big medipack there, thanks to TriggerGroup#18. After newer one
second (see Organizer#4), when Lara's just examining the lower shelf,
she finds a revolver there, thanks to TriggerGroup#19. - After that she
also looks through the upper part.
But how will she get the items off the shelves?
Well, both TriggerGroup#18 and #19 contains one trigger to make the
items in them invisible just when Lara's looking through that shelf:
; Set Trigger Type - ACTION 13
; Exporting: TRIGGER(5389:0) for
ACTION(6)
; <#> : BIGMEDI_ITEM ID 6
; <&> : Perform (E) flipeffect on
<#>object
; (E) : 21: Hide object. Makes
#ANIMATING invisible
; Values to add in script command:
$5000, 6, $150D
; Set Trigger Type - ACTION 13
; Exporting: TRIGGER(5389:0) for
ACTION(4)
; <#> : SIXSHOOTER_ITEM ID 4
; <&> : Perform (E) flipeffect on
<#>object
; (E) : 21: Hide object. Makes
#ANIMATING invisible
; Values to add in script command:
$5000, 4, $150D
So, for example, when Lara's looking through the lower shelf then the
'One Shot' type TriggerGroup#19 will be activated. It means $5000, 4,
$150D trigger makes the revolver invisible then $2000, 48, $16B trigger
puts the revolver into the inventory - just as if Lara had been getting
that off the shelf.
Notes:
1. There isn't reaching into the backpack at the end of the animation.
2. The pickable item, after it's become invisible, still has its
collision, but it doesn't matter now.
3. TPOS_FOUR_HORIENT makes
possible that Lara can look through an equilateral (i.e. square-based)
rack at all the sides, and not only at the side where the TestPosition
is adjusted to. (It doesn't work for non-equilateral racks.
TPOS_DOUBLE_HORIENT - maybe because of the pivot? - either.)
4.
The placed pickable item will appear in the middle of its square. You
don't need to accept it, use 'Move. Move , <#>animating for (E)units
(one sector = 1024)' ACTION triggers to move them to the required place.
(So Lara will find it 'in the corner of the shelf', for example.)
Anyway, you have to use those ACTION triggers, for
example, if you use a non-equilateral rack that is placed at the side of
its square. - In the example just below Lara will get a normal shotgun
ammo pack off a rack like that:
5. If you want Lara to see the item she's just
getting from the cupboard, then place the item in one of the cupboard
shelves, and use a $5000, X, $150D trigger in TriggerGroup#13 (see
above).
Or, if you don't want Lara to see the item she's just getting off the
rack, then don't place any item there, and don't use $5000, X, $150D
triggers in the setup of the rack.
6. Making the script for an
empty rack is very easy - just delete some entries from the script
above. That's what remains now:
Animation= 482, KEY1_ACTION,
IGNORE, IGNORE, ENV_MULT_CONDITION, 4, IGNORE, -103
MultEnvCondition=
4, ENV_ITEM_TEST_POSITION, 4, IGNORE, ENV_FREE_HANDS, IGNORE, IGNORE
TestPosition= 4, TPOS_FOUR_HORIENT, ANIMATING5, -100, 100, -100, 100,
-650, -550, -1000, 1000, -200, 200, -200, 200
GlobalTrigger= 8,
IGNORE, GT_CONDITION_GROUP, IGNORE, 16, 5, 6
TriggerGroup= 5, $2000,
51, $0
TriggerGroup= 6, $2000, 52, $0
TriggerGroup= 16, $8000,
482, $1E
So there are no GlobalTrigger areas if you use more
empty racks. (GlobalTrigger#8 is not a GlobalTrigger of a rack, it's a
general GlobalTrigger for the weapons.) But if you use, for example, one
empty and one non-empty rack then you must locate the area of the
non-empty rack so that it won't be overlapped with the area of the empty
rack.
Seeing the script of the drawer, you should find out the
script for more or different racks.
And the script of the cupboard
will tell you about mixing the objects, if you want to use a rack, and a
drawer/cupboard.
Made using TRNG 1.2.2.6