• Register
Post tutorial Report RSS Fan Tutorial: Using the Cutscene system (As of update 0.2150)

Visual novels and exposition in my arcade flight sim? Why not.

Posted by on - Basic Design/Concepts

As of recent, Vector Thrust has integrated the first incarnation of a cutscene system into the game. Though it is very early for any widespread use, the cutscene system as of update 0.2150 is usable.

One of Ace Combat Infinity's members has documented and made a tutorial overviewing what he could find and do with it as it stands.



Wheaton wrote: Tutorial #001 for Vector Thrust ( Alpha Stage ):

Topic: Cutscenes ( Dialogue Type ).

------

// Please note this tutorial was made using only information deduced
from practical use, no official documentation can back it at the time I'm
writing this.

------

The cutscenes system for Vector Thrust is obviously inspired from
several Japanese games and works. The dialogues are greatly similar to the
story-telling segments of games such as Phoenix Wright, BlazBlue, Fire Emblem,
Valkyria Chronicles, and several other video games featuring scrolling texts
and artworks, as their way to represent characters and avoid the hassle of
using 3D models in full-fledged high-budget productions.

Because of that, it's relatively accessible to many people to make their
own cutscenes; even if one isn't a 2D artist, using existing characters allows
some flexibility to some extent and would allow for usermade, non-canon story
segments, campaigns or other events that can still feature Vector Thrust's
character roster.

This tutorial will mostly cover the dialogue/visual novel aspect of the
Cutscene system.

File Structure:

A cutscene file is normally located in a campaign folder. I haven't
tested out yet if it would work as a standalone file in the BattleScene ( battle
scenarios / single missions ) folder, but it likely won't.

A cutscene file is named with a ".CTS" ( CuTScene ) extension.
The files for cutscenes are actually text ( much like most of VT's moddable
data ) and are located in "Vector Thrust/Campaigns//Missions/".

The moment when and how a cutscene is triggered is dependent on a
mission file, and must be typed in there. It has to be indicated somewhere in
the mission file of your choice.

Anatomy of a Cutscene File ( dialogue-type ):

[CutscenesHeader]

numSequences = "1"

[Sequence_1]

num_Cutscenes = "1"

CallName = "baa"

[Seq_1_CutScene_1]

CutScene_Type = 3

BackGroundImg = "Cut_BG_Hangar.jpg"

BackGroundAlpha = 1

Num_Action = 2

Action_1_Type = 1

//phrase

Action_1_PhraseName = "Text"

Action_1_PhraseText = "Text Text Text Text Text
Text Text Text Text Text Text Text Text"

Action_1_PhrasePortrait = ""

Action_1_PhraseSpeed = 1

Action_2_Type = 1

//phrase

Action_2_PhraseName = ""

Action_2_PhraseText = "wooohooo"

Action_2_PhrasePortrait = ""

Action_2_PhraseSpeed = 1

Num_Characters = "1"

Char_1_CharName = ""

Char_1_TextColour = "1 1 1 1"

Char_1_StartInScene = "true"

Char_1_ImgColour = "1 1 1 1"

Char_1_ImgOpacity = "1"

Char_1_CharAlign = "8"

Char_1_CharOffset = "0 -50"

Char_1_BlendType = ""

Char_1_DefPose = "1"

Char_1_NumPoses = "1"

Char_1_Pose_1_Name = ""

Char_1_Pose_1_Img = "Char_Thrust_1.png"

Char_1_Pose_1_ImgSize = "330 600"

Char_1_Pose_1_ImgPivot = "150 516"

Char_1_Pose_1_DefExp=

Char_1_Pose_1_NumExp=

Char_1_Pose_1_Exp_1_Name = ""

Char_1_Pose_1_Exp_1_Img = ""

Char_1_Pose_1_Exp_1_ImgSize = ""

Char_1_Pose_1_Exp_1_ImgPivot = ""

Char_1_Pose_1_Exp_1_PosOffset = ""

------

[CutscenesHeader]

numSequences = "1"

The Header is always required for VT to remember at which part of the
file it is at.

numSequences indicates how many Sequences the movie will have. (
Example: Ace Combat Zero would have several sequences for an interview movie:
one where the character is seen first, talking; another sequence would be a
close up on a background decoration, a third sequence would decipt a flashback
battle against Cipher, while two last sequences wrap up the last segments of
the speech ).

The smaller elements of a cutscene are decipted below in a
biggest-to-smallest organization.

[Sequence_1]

num_Cutscenes = "1"

CallName = "baa"

Sequence_1 is important as it is the header which indicates the game
that the following will relate to the first sequence of the whole movie, until
the end of the file is met, or another sequence comes up.

num_Cutscenes tells how many cutscenes ( actually, cutscenes here is
redundant as a term, it would rather be a short segment, a few seconds until a
graphical element moves again. ( eg: A character changing emotion, as far as I
could deduce from tests as of now ) ) there are in the sequence.

[Seq_1_CutScene_1]

CutScene_Type = 3

BackGroundImg = "Cut_BG_Hangar.jpg"

BackGroundAlpha = 1

Num_Action = 2

Again, This header indicates we're working on Cutscene 1 of Sequence 1.

the CutScene Type is a value of currently undetermined meaning.

BackGroundImg indicates the path for the game to use in order to display
a background image ( example, hangar, airfield, mess hall, or any other
location to give atmosphere ). Supported formats are the same as most of VT's
file supports: PNG, JPG, DDS.

The file is set to be searched for in VectorThrust/media/ToCore/.

BackGroundAlpha is currently useless, it is usually to "1" but
its meaning is undetermined.

Num_Action indicates how many actions happen in the current Cutscene of
this Sequence, before we jump to the next Cutscene of the current Sequence. If
we've met the last cutscene of a sequence, then Vector Thrust will
automatically jump to the next sequence.

// Important note of warning! It is strongly advised to regularly check
the lines in the Sequences/Cutscenes headers indicating how many sub-headers
they have! If you made six actions in a cutscene and only three play, go check
the header of the failing cutscene and figure out if you didn't forget to
update "Num_Action" from three to six. This can happen everywhere
when programming in Vector Thrust and is the most frequent cause of programming
chaos, so be wary!

Action_1_Type = 1

The type of an Action is currently undetermined.

//phrase

Action_1_PhraseName = "Text"

Action_1_PhraseText = "Text Text Text Text Text Text Text Text Text
Text Text Text Text"

Action_1_PhrasePortrait = ""

Action_1_PhraseSpeed = 1

These fields are pretty self-explanatory. PhraseName indicates the name
of who's talking in the current action, something very reccurent in JRPGs and
alike ( from one Action to another, you have the posibility to change this
field, from, for example, "Alan" to "Alan?" while two
characters are talking on radio, to imply "Alan" is actually an imposter
being revealed, "?" implying doubt is cast on the identity of the
person on the other end. Reversely, it can be used for an unknown character
formerly named "???" to give his actual name on screen the moment he
reveals it ).

Portrait is likely used to add a portait of a character as an image file
on the dialog box. See the Breath Of Fire series for examples of this style.
-The portrait system hasn't been tested yet-.

The last field indicates how fast a speech can go for the current
action. It can be used in a comic manner to illustrate the
redundancy/boringness of a character speaking too fast/nonstop to the point of
scrolling ridiculously fast.

Num_Characters = "1"

Char_1_CharName = ""

Char_1_TextColour = "1 1 1 1"

Char_1_StartInScene = "true"

Char_1_ImgColour = "1 1 1 1"

Char_1_ImgOpacity = "1"

Char_1_CharAlign = "8"

Char_1_CharOffset = "0 -50"

Char_1_BlendType = ""

Char_1_DefPose = "1"

Char_1_NumPoses = "1"

This field is about the displayed characters on screen ( more underneath
this paragraph about characters).

Num_Characters indicates, obviously, how many characters are present in
the current Cutscene ( characters are dependent on Cutscenes, not Actions ).

Char_1_ and so on go according to the ammount of characters being used.

CharName is obviously the name of the character ( though, the reason of
this field being present while the speech bubble has its own entry makes this
field redudant as of now ).

Text Colour is a R G B A indication of the text's colour, similar to how
Vector Thrust works during flight: 1 is YES and 0 is NO; 1 0 0 1 would result
in bright "enemy" red, 0 0 1 1 would result in "ally blue"
and so on ( Red Green Blue Alpha ). The use of an Alpha ( transparency of text
) data is currently almost useless because setting it to zero would render the
text invisible, unless decimal values are used and supported by the game.

StartInScene is use for indicating if a character is there from the
begining, but due to the lack of documentation and/or actual game functions to
make characters appear or disappear, this is best left on "true".

ImgColour indicates if the picture of the character should be
recoloured. It works the same about the RGBA values of the text colour; it can
be used to make a character red out of anger for comic effect, or transparent
to simulate an hallucination or a ghost.

ImgOpacity is pretty much transparency again. Once again, the presence
of this field is strange.

CharAlign is an extremely complex value to handle. It indicates where on
the game screen ( relating to monitor edges ) the character will be placed.

The values range from Zero ( hidden ) to nine. It actually works like an
upside-down keypad, where 1 is top-left, 2 is top-centered, 3 is top-right, 4
is center-left, 5 is centered, 6 is center-right, seven is bottom-left, eight
is bottom-centered, and nine is bottom-right.

CharOffset is used to indicate manual shift of the character in case he
would need to be moved a little, or if his artwork should be hidden more behind
the edges of the screen. It can be used to make a character stand aside to
hide, for instance, or to make him look lower like a coward. You get the point.

Offsetting works with higher X sending the character more right than he
should start to with his Alignment, while upper Y values will send the
character upwards.

BlendType has currently zero information available on its working and
purpose.

DefPose indicates the default pose of a character to assume. Since as of
right now there is no documentation on how to change a character's pose, this
line is best left as "one".

NumPoses indicates how many poses a character is allowed to have in the
current Cutscene. As stated above, there is no known way ( as of the current VT
alpha ) to change poses, so leaving only one and setting the DefPose as one is
the best choice.

------

The following segment is about actual character sprites and more
graphical data.

Char_1_Pose_1_Name = ""

Char_1_Pose_1_Img = "Char_Thrust_1.png"

Char_1_Pose_1_ImgSize = "330 600"

Char_1_Pose_1_ImgPivot = "150 516"

Char_1_Pose_1_DefExp=

Char_1_Pose_1_NumExp=

Char_1_Pose_1_Exp_1_Name = ""

Char_1_Pose_1_Exp_1_Img = ""

Char_1_Pose_1_Exp_1_ImgSize = ""

Char_1_Pose_1_Exp_1_ImgPivot = ""

Char_1_Pose_1_Exp_1_PosOffset = ""

Name is currently redundant.

Img indicates the file to use for the character's image. The file is set
to be searched for in VectorThrust/media/ToCore/.

ImgSize indicates the size in width and height of the sprite to be used.
It is most advisable to enter the same value as the actual size of the sprite
image file.

Pivot is currently superfluous. It is likely used to indicate where the
"center" of the character's sprite should be, if it has a purpose
some day.

DefExp indicates the default Expression of a character to bear. Since
again, there is no known way to change expressions as of now, it's best to
leave it to one.

NumExp: see above, yep, again.

Exp_X_Name : the name of the expression. Useless as of now. See Above
once again.

Img : No use for it known yet. See above again.

Img Size / Pivot / Offset : See above.

Post comment Comments
MyHatismyFriend
MyHatismyFriend

Background Alpha may be for adjusting the transparency of the background. What it accomplishes I have no idea.

Reply Good karma Bad karma+2 votes
Wheaton_Adams
Wheaton_Adams

My sentiments exactly. Why bothering adding alpha control if what's behind the background image is a pitch black void? I believe this value is here as legacy for future uses.

Reply Good karma Bad karma+2 votes
Post a comment

Your comment will be anonymous unless you join the community. Or sign in with your social account: