Jump to content

how do you make your own cutscene


Recommended Posts

hello !

 

more details ?

 

what kind of cutscene ?

Ingame SP cutscenes ? => scripting http://jkhub.org/tutorials/article/148-icarus-scripting/

Cinematics => roq files http://jkhub.org/tutorials/article/158-creating-an-roq/ or http://jkhub.org/tutorials/article/26-creating-a-roq-video/

Ingame MP cutscene => not supported except some special mods.

 

I enjoy you to reas tutorial section of JKHUB : http://jkhub.org/tutorials/

One of the most complete tutorial librarie about JK.

 

:)

Cerez and NumberWan like this
Link to comment

i was playing some mods and i was haveing a felling if i can make one my self so can someone tell me how to make your own cutscene?

 

http://web.archive.org/web/20070531152314/http://www.geocities.com/kengomaps/tutorials.html

 

Its pretty much just the basics of setting one up and camera movement and whatnot but these are 3 really great tutorials that are easy to understand. Then, take a look at some scripts in JO or JA under "cinematics" which is where the cutscenes will be. You'll start seeing how things are broken up. I'll give you a real life example from my "Test Chamber" scene in my project. The colored text is just me pointing things out in this example....

 

*Edit.. The colored text didn't show up and underlining text didn't work, so, i'm just going to post an un-edited one below this.

Below I have 2 storm troopers in a room. To get them to be affected by the script I made, they need there own names. Otherwise, nothing will happen to them at all. In the entity window you give each NPC, in our case, 2 storm troopers, an NPC_targetname.

Key: NPC_Targetname
Value: trooper1  

Key: NPC_Targetname
Value: trooper2

Now, I wanted these troopers to stand not in attack position but casual. There are animations in BehaveED you pick. I chose my animations as seen below and each will hold that pose all the time (-1). If I used 5000 it would be 5 seconds. 10000 would be 10 seconds. It measures in miliseconds so that is why you need all the zeros.

affect ( "trooper1", $FLUSH$ )
{
	set ( /*@SET_TYPES*/ "SET_ANIM_BOTH", /*@ANIM_NAMES*/ "BOTH_STAND4" );
	set ( /*@SET_TYPES*/ "SET_ANIM_HOLDTIME_BOTH", -1 );
}


affect ( "trooper2", $FLUSH$ )
{
	set ( /*@SET_TYPES*/ "SET_ANIM_BOTH", /*@ANIM_NAMES*/ "BOTH_STAND5SHIFTWEIGHT" );
	set ( /*@SET_TYPES*/ "SET_ANIM_HOLDTIME_BOTH", -1 );
}

Now, my cutscene officially starts here. When you trigger the scene the camera gets enabled and is set up on the two troopers. They still hold their animation pose from earlier, however, now they have a short conversation. With stormtroopers, or droids for that matter, you do not have moving mouths to worry about so you can be pretty lazy w/ there conversations.

In this script only 1 trooper is assigned all 3 sound files. Again, no need for mouth movement or anything.

camera ( /*@CAMERA_COMMANDS*/ ENABLE );
camera ( /*@CAMERA_COMMANDS*/ MOVE, $tag( "cam1", ORIGIN)$, 0 );
camera ( /*@CAMERA_COMMANDS*/ PAN, $tag( "cam1", ANGLES)$, < 0.000 0.000 0.000 >, 0 );

affect ( "trooper1", $FLUSH$ )
{
        Each task below corresponds to the playing of a sound file.  

	task ( "Blaster Rifle" )
	{
		sound ( /*@CHANNELS*/ CHAN_VOICE, "sound/chars/st2/misc/31st2014.mp3" );
	}


	task ( "Works Fine" )
	{
		sound ( /*@CHANNELS*/ CHAN_VOICE, "sound/chars/st3/misc/31st3030.mp3" );
	}


	task ( "Blaster Carb" )
	{
		sound ( /*@CHANNELS*/ CHAN_VOICE, "sound/chars/st2/misc/31st2015.mp3" );
	}
           These 3 tasks are then run with a 1 second wait time between them.
	dowait ( "Blaster Rifle" );
	wait ( 1000.000 );
	dowait ( "Works Fine" );
	wait ( 1000.000 );
	dowait ( "Blaster Carb" );
}

wait ( 11000.000 );
This whole process takes 11 seconds, as seen by the wait time, and then we go to camera position 2 and another event happens. This is similar to what was done above.

Now, we see another camera aimed not at the troppers but at a speaker while the sound file plays.
rem ( "Part 2 Camera Aims towards Speakers" );
rem ( "Music plays in the background" );
camera ( /*@CAMERA_COMMANDS*/ MOVE, $tag( "cam2", ORIGIN)$, 0 );
camera ( /*@CAMERA_COMMANDS*/ PAN, $tag( "cam2", ANGLES)$, < 0.000 0.000 0.000 >, 0 );

task ( "Sound1" )
{
	sound ( /*@CHANNELS*/ CHAN_AUTO, "sound/labs/synth1.mp3" );
}

dowait ( "Sound1" );
wait ( 13000.000 );
Again, looks really familiar to what we did above.

Here, we are now at a different camera angle in which we see a wider shot of the troopers and they start walking to a specific point.
rem ( "Part 3" );
rem ( "Stormtroopers move to their shooting positions" );
camera ( /*@CAMERA_COMMANDS*/ MOVE, $tag( "cam3", ORIGIN)$, 0 );
camera ( /*@CAMERA_COMMANDS*/ PAN, $tag( "cam3", ANGLES)$, < 0.000 0.000 0.000 >, 0 );
rem ( "Move trooper 1 into position" );

affect ( "trooper1", /*@AFFECT_TYPE*/ FLUSH )
{
	set ( /*@SET_TYPES*/ "SET_ANIM_BOTH", /*@ANIM_NAMES*/ "BOTH_WALK1" );  To have them walk, the animation needs to be set
	set ( /*@SET_TYPES*/ "SET_WALKING", /*@BOOL_TYPES*/ "true" ); 
	set ( /*@SET_TYPES*/ "SET_WALKSPEED", 50 ); this is the speed in which the npc will move. 
	set ( /*@SET_TYPES*/ "SET_ANIM_HOLDTIME_BOTH", 10 ); This is how long the walking animation animated until it stops

	task ( "go1" )
	{
		set ( /*@SET_TYPES*/ "SET_NAVGOAL", "t1nav1" );
	}

         Both of these tasks tell the NPC where to go in the room. In Radiant, these a Nav_Goals with targetnames of t1nav1 and t1nav2. It is the same for each trooper, but with different Nav_Goal names.
	task ( "go2" )
	{
		set ( /*@SET_TYPES*/ "SET_NAVGOAL", "t1nav2" );
	}

	dowait ( "go1" );
	dowait ( "go2" );
}


affect ( "trooper2", /*@AFFECT_TYPE*/ FLUSH )
{
	set ( /*@SET_TYPES*/ "SET_ANIM_BOTH", /*@ANIM_NAMES*/ "BOTH_WALK1" );
	set ( /*@SET_TYPES*/ "SET_WALKING", /*@BOOL_TYPES*/ "true" );
	set ( /*@SET_TYPES*/ "SET_WALKSPEED", 58 );
	set ( /*@SET_TYPES*/ "SET_ANIM_HOLDTIME_BOTH", 10 );

	task ( "go1" )
	{
		set ( /*@SET_TYPES*/ "SET_NAVGOAL", "t2nav1" );
	}


	task ( "go2" )
	{
		set ( /*@SET_TYPES*/ "SET_NAVGOAL", "t2nav2" );
	}

	dowait ( "go1" );
	dowait ( "go2" );
}

There are MANY more steps after this that I wrote but its enough for an example. 

 

Here is the unedited one for you..

affect ( "trooper1", $FLUSH$ )
{
	set ( /*@SET_TYPES*/ "SET_ANIM_BOTH", /*@ANIM_NAMES*/ "BOTH_STAND4" );
	set ( /*@SET_TYPES*/ "SET_ANIM_HOLDTIME_BOTH", -1 );
}


affect ( "trooper2", $FLUSH$ )
{
	set ( /*@SET_TYPES*/ "SET_ANIM_BOTH", /*@ANIM_NAMES*/ "BOTH_STAND5SHIFTWEIGHT" );
	set ( /*@SET_TYPES*/ "SET_ANIM_HOLDTIME_BOTH", -1 );
}

camera ( /*@CAMERA_COMMANDS*/ ENABLE );
camera ( /*@CAMERA_COMMANDS*/ MOVE, $tag( "cam1", ORIGIN)$, 0 );
camera ( /*@CAMERA_COMMANDS*/ PAN, $tag( "cam1", ANGLES)$, < 0.000 0.000 0.000 >, 0 );

affect ( "trooper1", $FLUSH$ )
{

	task ( "Blaster Rifle" )
	{
		sound ( /*@CHANNELS*/ CHAN_VOICE, "sound/chars/st2/misc/31st2014.mp3" );
	}


	task ( "Works Fine" )
	{
		sound ( /*@CHANNELS*/ CHAN_VOICE, "sound/chars/st3/misc/31st3030.mp3" );
	}


	task ( "Blaster Carb" )
	{
		sound ( /*@CHANNELS*/ CHAN_VOICE, "sound/chars/st2/misc/31st2015.mp3" );
	}

	dowait ( "Blaster Rifle" );
	wait ( 1000.000 );
	dowait ( "Works Fine" );
	wait ( 1000.000 );
	dowait ( "Blaster Carb" );
}

wait ( 11000.000 );
rem ( "Part 2 Camera Aims towards Speakers" );
rem ( "Music plays in the background" );
camera ( /*@CAMERA_COMMANDS*/ MOVE, $tag( "cam2", ORIGIN)$, 0 );
camera ( /*@CAMERA_COMMANDS*/ PAN, $tag( "cam2", ANGLES)$, < 0.000 0.000 0.000 >, 0 );

task ( "Sound1" )
{
	sound ( /*@CHANNELS*/ CHAN_AUTO, "sound/labs/synth1.mp3" );
}

dowait ( "Sound1" );
wait ( 13000.000 );
rem ( "Part 3" );
rem ( "Stormtroopers move to their shooting positions" );
camera ( /*@CAMERA_COMMANDS*/ MOVE, $tag( "cam3", ORIGIN)$, 0 );
camera ( /*@CAMERA_COMMANDS*/ PAN, $tag( "cam3", ANGLES)$, < 0.000 0.000 0.000 >, 0 );
rem ( "Move trooper 1 into position" );

affect ( "trooper1", /*@AFFECT_TYPE*/ FLUSH )
{
	set ( /*@SET_TYPES*/ "SET_ANIM_BOTH", /*@ANIM_NAMES*/ "BOTH_WALK1" );
	set ( /*@SET_TYPES*/ "SET_WALKING", /*@BOOL_TYPES*/ "true" );
	set ( /*@SET_TYPES*/ "SET_WALKSPEED", 50 );
	set ( /*@SET_TYPES*/ "SET_ANIM_HOLDTIME_BOTH", 10 );

	task ( "go1" )
	{
		set ( /*@SET_TYPES*/ "SET_NAVGOAL", "t1nav1" );
	}


	task ( "go2" )
	{
		set ( /*@SET_TYPES*/ "SET_NAVGOAL", "t1nav2" );
	}

	dowait ( "go1" );
	dowait ( "go2" );
}


affect ( "trooper2", /*@AFFECT_TYPE*/ FLUSH )
{
	set ( /*@SET_TYPES*/ "SET_ANIM_BOTH", /*@ANIM_NAMES*/ "BOTH_WALK1" );
	set ( /*@SET_TYPES*/ "SET_WALKING", /*@BOOL_TYPES*/ "true" );
	set ( /*@SET_TYPES*/ "SET_WALKSPEED", 58 );
	set ( /*@SET_TYPES*/ "SET_ANIM_HOLDTIME_BOTH", 10 );

	task ( "go1" )
	{
		set ( /*@SET_TYPES*/ "SET_NAVGOAL", "t2nav1" );
	}


	task ( "go2" )
	{
		set ( /*@SET_TYPES*/ "SET_NAVGOAL", "t2nav2" );
	}

	dowait ( "go1" );
	dowait ( "go2" );
}
Cerez likes this
Link to comment
  • 3 weeks later...

Also, be sure to browse through the Icarus manual to understand the basics of the commands in the Icarus scripting language. The manual is included in the official SDK:

 

https://jkhub.org/files/file/389-jedi-academy-public-sdk/


I started my learning with @@GingerbreadNinja's excellent introductory tutorial:

 

http://jkhub.org/tutorials/article/71-gingerbreadninjas-behaved-scripting-series/
 
Also, have a look at @@MoonDog's tutorial on BehavEd and Icarus:
http://jkhub.org/tutorials/article/148-icarus-scripting/

 

Both are excellent introductory guides.

 

Though, I still recommend scripting with a text editor rather than using BehavEd, as soon as you grasp how it all works. It gives you more flexibility with your script, and the ability to copy-paste efficiently. BehavEd can sometimes be tedious to work with...

 

In short, creating a cutscene in JKA involves a bit of map design (adding cutscene elements and markers in GTKRadiant), and mostly script work.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...