PDA

View Full Version : Cutscene tutorials dealing with actual ACTORS.


Dart Zaidyer
03-19-2003, 10:13 AM
I've read all sorts of tutorials on how to do cutscenes. That's great, I know now how to work the cameras... But there's just one problem.



A cutscene is nothing without actors.


No tutorial, not one, EVER mentions anything about how to get an actor into the cutscene and make it do things like gestures/run a sound effect/move/etc and so on. That's quite an oversight, don't you think?


Now, what I'm asking for is a decent tutorial about how to handle actors and scripting them to do various things. I'd greatly appreciate it.

lassev
03-19-2003, 10:34 AM
Although I know how to do those NPC (actor) controlling things you mentioned (and many you didn't), I won't be writing tutorials for it. I'll leave that to old master Kengo, whenever he's in mood for doing that.

However, to not let you all down, I suggest you take a good, intensive and long look at the Raven scripts provided with the Editing tools. In the Cinematics folder you'll find exact examles of almost everything you need to get a decent start (and a lot more). After that, it's only a matter of your imagination. And that's what really matters, in the end.

Dart Zaidyer
03-19-2003, 06:04 PM
Okaaayyy, I've formatted my script as good as I can figure, and I've got all the necessary entities in place, but the trouble is... The actor NPC doesn't do what it's told. Furthermore this grinds the script to a screeching halt, since it doesn't drop out of cinema mode after 10 seconds.

Here's the script, triggered from a target_scriptrunner:


//Generated by BehavEd

rem ( "Boba Fett- Intro Cutscene" );
camera ( /*@CAMERA_COMMANDS*/ ENABLE );
camera ( /*@CAMERA_COMMANDS*/ MOVE, $tag( "cin1cam1", ORIGIN)$, 0 );
camera ( /*@CAMERA_COMMANDS*/ PAN, $tag( "cin1cam1", ANGLES)$, < 0.000 0.000 0.000 >, 0 );

affect ( "bobacin1_boba", /*@AFFECT_TYPE*/ FLUSH )
{
set ( /*@SET_TYPES*/ "SET_MORELIGHT", /*@BOOL_TYPES*/ "true" );
set ( /*@SET_TYPES*/ "SET_WEAPON", /*@WEAPON_NAMES*/ "WP_NONE" );
set ( /*@SET_TYPES*/ "SET_ANIM_BOTH", /*@ANIM_NAMES*/ "BOTH_COCKPIT_CONSOLE1" );
set ( /*@SET_TYPES*/ "SET_ANIM_HOLDTIME_BOTH", "-1" );

task ( "boba_line1" )
{
sound ( /*@CHANNELS*/ CHAN_VOICE, "sound/chars/kyle/01bf001.wav" );
}

wait ( 1000.000 );
do ( "boba_line1" );
wait ( 5000.000 );
camera ( /*@CAMERA_COMMANDS*/ DISABLE );
}
remove ( "bobacin1_boba" );

lassev
03-20-2003, 03:14 AM
Okay. When your affect somebody, it means basically that you dumb the inside affect part of your script to be processed by that individual NPC. After that dumbing, the mother script ignores the affect part totally, and goes on. In your case, you dumb stuff to boba-dude, and then the mother script immediately tries to remove good, ol' boba, for the waitings inside the affect mean nothing to the mother script.

Although the script itself seems pretty okay to me, the fact that your cinematic never ends, that is, the camera command won't disable, tells us one crusial thing: the command camera ( /*@CAMERA_COMMANDS*/ DISABLE ); is never reached.

To put is simpler: the camera command is enabled before affecting, yet the camera is (or let's say should be, in your case) disabled inside the affect, that is, through boba-dude, whose not responding for perhaps reasons mentioned above.

Hmm. You might also want to convert your special sound files to .mp3 (and the extension in your script too). And make sure the sound files are OK. Faulty ones can interrupt your script processing.

Kengo
03-20-2003, 10:00 AM
There is an interesting thread here with general stuff on affecting NPCs, has some interesting points and details:

http://www.lucasforums.com/showthread.php?s=&threadid=94349

One thing I would say - you don't want the sound to be a task (this is kinda explainined in that other thread I just did the link for). You got the right idea with the animation for Boba, which is good. Just have it like this:

rem ( "Boba Fett- Intro Cutscene" );
camera ( /*@CAMERA_COMMANDS*/ ENABLE );
camera ( /*@CAMERA_COMMANDS*/ MOVE, $tag( "cin1cam1", ORIGIN)$, 0 );
camera ( /*@CAMERA_COMMANDS*/ PAN, $tag( "cin1cam1", ANGLES)$, < 0.000 0.000 0.000 >, 0 );
affect ( "bobacin1_boba", /*@AFFECT_TYPE*/ FLUSH )
{
set ( /*@SET_TYPES*/ "SET_MORELIGHT", /*@BOOL_TYPES*/ "true" );
set ( /*@SET_TYPES*/ "SET_WEAPON", /*@WEAPON_NAMES*/ "WP_NONE" );
set ( /*@SET_TYPES*/ "SET_ANIM_BOTH", /*@ANIM_NAMES*/ "BOTH_COCKPIT_CONSOLE1" );
set ( /*@SET_TYPES*/ "SET_ANIM_HOLDTIME_BOTH", "-1" );
sound ( /*@CHANNELS*/ CHAN_VOICE, "sound/chars/kyle/01bf001.wav" );
}
camera ( /*@CAMERA_COMMANDS*/ DISABLE );
}
remove ( "bobacin1_boba" );

I just cut a bit out there, the syntax is proabaly wrong...but you get the idea :) BTW, why is that sound file a wav? You might wana convert that to mp3.....

Lassev, I am NOT old! :D

Dart Zaidyer
03-20-2003, 01:39 PM
Ah, success.

When I fixed up the script as Kengo suggested, I made it the NPC's spawnscript and took out the redundant "affect myself" bit. After this the camera didn't actually go into camera mode, but the NPC would perform correctly and it would even disable the camera before removing itself.

So what I ended up doing was enabling the camera with a triggered target_scriptrunner and the cutscene displays just fine. Boba Fett appears in the cockpit of the Slave 1, says a line while typing at his console, and the game then switches to the player, as I planned.

Although, I'm not yet sure if this is the most streamlined way of doing it... But it still works.

lassev
03-21-2003, 02:42 AM
Oh, yes, sorry Kengo, but I must explain my actions carefully: I just called you old master, meaning you have been a master for a long time, yet I didn't mean old Kengo master...

And thus I must also correct you, master or not, a little bit. Zaidyer was using channel_voice, and there's no need to have it outside a task. What we saw in the other thread was some music playing, and that couldn't be WAITed. However, in many cases the control of a cinematic (or let's say it straight: control of conversation), definitively demands WAITing of some dude's channel_voice performance (if you don't want to measure the exact lenght of that .mp3 and use wait for seconds).

EDIT: This only shows that there are many ways to script. I personally think any way that works without even occasional bugs is the right way. Trying and trials are everything in this business, no matter what Yoda thinks...

Kengo
03-23-2003, 09:23 PM
Ah, well thats OK then Lassev :D

Like you guys say, I think there are more streamlined ways of scripting certain things, it's a case of constantly refining I guess. Trial and error is certainly my main method with scripting :)