Difference between revisions of "Mission Making Tutorial"

From NexusWiki
Jump to: navigation, search
(Jimpaolo)
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
世人都知英语好,唯有钱途忘不了;A B C D E F G,雅思、托福、GRE.教材辅导一本本,十年辛苦为谁忙?心脑不能并用,举一不能反三,意识形态、思维方式依然故我,词汇只知数数量而不知计质量,只知滥用记忆力,不知要自行分析判断,还得时常反省,自我总结。只知表面现象做足表面文章去应景,而根本不愿探求本质、发展和变化。再就是患得患失,拔苗助长一日用心,奢求十日之效;一月用功,便冀一年之绩。长此以往,如何到达彻底解脱之彼岸?We are trapped in the unosavry learning mode which relies almost entirely on our faculties of memory alone, without independent thinking, without habitual classification of what we learned periodically. In fact, strategic thinking is such a rare commodity in this day and age that it demands a premium in the “market place”.Too often, we are so misconceived that we believed frequent exchanges of ideas with other fellow learners of English are so beneficial that they would make this trip or pilgrimage somehow faster and easier. While we may intuitively agree that the only way to learn English well is to closely mimic the process how native speakers learn and perfect their own language skills, few of us actually pursued that route to full fruition. At least in Mainland China, there is also a trend to place a disporportionate amount of emphasis on classic English literature and with the hope that this would somehow cultivate a refined English taste. What a waste of time. Not surprisingly, many have benefited from such grossly misplaced emphasis at the expanse of the whole nation: too much educational resources have been wasted or underutilized.The most important thing in the complete MASTERY of a language, at least in this author, is to put one’s heart and mind TOGETHER to wherever they need to be, whether in learning grammar, vocabulary, different modes of thinking or linguistic aesthetics. Additionally, a little knowledge on history, of the language in concern, is an absolute must.Just my two cents on language acquisition and retention.
+
='''''NEXUS TJI mission-making'''''=
 +
 
 +
As you probably know by now, thanks to Arparso's great tutorial about [[Nexus:TJI_Scripting_Structure|Nexus's scripting structure]], that every mission in this game is divided in MACHINES, STATES, and Rules. But that only deals with one part of the mission, the "body" of it, in a way.
 +
In order to illustrate this concepts I will be pasting here a [[Demo_mission|Demo mission]] I've made with this article in mind.
 +
 
 +
==''The main parts of the mission''==
 +
Here is a collection of the main parts a mission is divided into
 +
 
 +
 
 +
===The heading===
 +
----
 +
 
 +
Each mission starts, of course, with the basics of the mission: it's identity number, it's name, and where it'll take place (note that you can't change locations in a single mission):
 +
<pre>
 +
MISSION <num>
 +
name "<the name of the mission>"
 +
DefLocation "<name of the location>"
 +
</pre>
 +
The "name of the location" is a "navpoint" created with the Solar System editor, one you can find in the "universe\systems\" folder.
 +
Unlike the number, the name of the mission doesn't have to be unique, you can put anything in there, even the same title that some other mission, as long as the numbering is not the same (well... that's not entirely true... if you place a letter instead of a number, the game will treat it as a mission number "0" and it will never give you a conflict, even if you label two or more missions as "NUMBER A").
 +
Following that is a list of the current objective numbers, in this fashion:
 +
<pre>
 +
OBJECTIVE
 +
1
 +
2
 +
...
 +
END
 +
</pre>
 +
Finally, as an example, here's the [[Demo_mission#Heading|Demo mission's heading]] (note that everything after "//" and between "/* - */" is interpreted by the game as a comment):
 +
<pre>
 +
MISSION 1  //mission number
 +
Name "Demo Mission" //name of the mission
 +
DefLocation "NAV_CHAKRIS_IV"  //the location where the mission will take place
 +
 
 +
OBJECTIVES //in here we place the number of objectives that will be included in the mission
 +
1
 +
2
 +
3
 +
END
 +
</pre>
 +
===The SceneInit Rule===
 +
----
 +
 
 +
This is a very special rule, critical to any mission, and that is for the fact that this rule takes place '''before''' the mission starts. In this rule you can do pretty much anything you want, but there are a few things mandatory to do here.
 +
 
 +
*The radius of the mission, in meters, as defined by the [[SetSceneRadius]](<num>); command.
 +
*The setting of the variables associated to each of the ships that will appear on the mission (though critical for most missions, it's not mandatory), defined by the command <name of the variable> := [[GetSceneObj]]("<name of the ship>");
 +
 
 +
This rule is special also because it's the first link to any of the Machines you've written for this mission, in here you call the Machine (or Machines) you want your mission to start with.
 +
Unlike any other Rule, this one doesn't go inside a State, it only goes beneath the "RULES" block, as all the Machines in your mission do.
 +
Here's the [[Demo_mission#SceneInit|SceneInit]] rule of the [[Demo_mission|Demo mission]], as well as the start of the "RULES" block:
 +
<pre>
 +
RULES
 +
 
 +
RULE event sceneInit
 +
:action
 +
SetSceneRadius(100000); //this is, as the name suggests it, the radious in meters of the scene.
 +
 +
GuiSelect(0);  //this is required to start a cinematic scene
 +
 +
SetRelation(#race_player, #race_spacetech, 2);
 +
SetRelation(#race_player, #race_gorg, 2);
 +
SetRelation(#race_gorg, #race_player, 2);
 +
SetRelation(#race_spacetech, #race_player, 2);
 +
SetRelation(#race_player, #race_Human_E, 1);  //the relations between the races that will appear in
 +
                                                                              //the game. the "race_player" is the playable race,
 +
                                              //and the number mean what sort of relationship they
 +
                                                                              //share with other races, more info on that is
 +
      //located on the modding manual
 +
 +
sp := GetSceneObj("Mayflower");
 +
bs := GetSceneObj("Hawkeye");  //in here we define the "Scene Objects", the ships and other
 +
                                                                //interactive obects
 +
 
 +
drone := GetSceneObj("Nightingale");
 +
 +
gorg1 := GetSceneObj("Feral");
 +
gorg2 := GetSceneObj("Darkclaw");
 +
 +
Disappear(drone);
 +
Disappear(gorg1);
 +
Disappear(gorg2); //we disappear the ships that are bound to appear via ip drive
 +
 +
Playmusic(1);          //in here we set the number of the music track (as defined in the
 +
                                                      //mod_sound.ini file, in the universe\engine\ folder
 +
 +
GetMachine("Director"):ChangeState(IntroMovie, 0);
 +
GetMachine("Objectives"):ChangeState(monitor,0);    // with these commands we "call" the machines
 +
                                                                                    //that would define the game, and their given
 +
                                                                                    // state
 +
 +
FadeScreen(1, 0, 0);                      //we "fade" the screen, make it black
 +
:end
 +
END
 +
</pre>
 +
 
 +
===The body of the mission===
 +
---
 +
The sintax of this part has already been brilliantly explained by Arparso in his [[Nexus:TJI_Scripting_Structure|Tutorial]], so I will only offer some advices here. Always use different states when there's a remarkable change in the mission (arrival of ships, discovery of stuff, etc), and try to keep your mission as tidy as possible. Machines can run simultaneously, so having a lot of them is never a good idea. Try to divide them into clear, differenced tasks (one of the AI, one or two for the actual mission, etc).
 +
So, here's the body of the [[Demo_mission|Demo mission]]: [[Demo_mission#body|body]]
 +
Also, don't forget that once you've finished with all your machines, included all the files that you wanted to include (to include a file you have to do this: "#include "<name of the file" ", and it would be like you wrote the content of that file in the mission file, so keep a close watch on the mission syntax when including files!) you have to '''END''' the mission. Just add a final ''END'' on the bottom, after the last included file and just above the ''ENTITIES'' section.
 +
 
 +
===The ''ENTITIES'' section===
 +
---
 +
Here's defined the settings of each of the mission's ships, like name, class, race, location, heading, etc, in this fashion:
 +
<pre>
 +
SHIP
 +
<content>
 +
END
 +
</pre>
 +
Whereas the content may be:
 +
 
 +
*Name "<name of the ship>"
 +
 
 +
*Race #<race of the ship>
 +
 
 +
*ShipType #<ship type of the ship, as defined in the SHIPTYPE part of the tacticstypes.ini>
 +
or
 +
*Class #<class of the ship, as defined in the SHIPCLASS part of the tacticstypes.ini>
 +
 
 +
*Position <x y z coordinates of the ship>
 +
 
 +
*Orientation <pitch heading and bank of the ship>
 +
 
 +
*Devices #<dev 1> #<dev 2> ... #<dev n> ; Note that this is optional, every device you place here will be added to the ship, so ''BE CAREFUL'' with it.
 +
 
 +
You may also add NPC's here to the mission's ships:
 +
<pre>
 +
NPC
 +
<content>
 +
END
 +
</pre>
 +
with the content being:
 +
 
 +
*Name "<name>"
 +
*ID <num> The id is the way to link this NPC to each dialog
 +
*Face <num> If this line is not provided, then the game will use the ID number as face number
 +
* Rank <num 1-10>
 +
* Medals #<medal 1> ... #<medal n> ;
 +
* CrewLevel <num> The level of the crew
 +
* Skill 1 <num> The skill of this npc in the Military area
 +
* Skill 2 <num> idem but in the engineering area
 +
* Skill 3 <num> idem but in the scientific area
 +
* XP <num> The experience of this npc.
 +
 
 +
That pretty much covers it. Here's [[Demo_mission#Entities|Demo mission's ENTITIES]] area:
 +
 
 +
<pre>
 +
ENTITIES
 +
 
 +
SHIP
 +
Name "Hawkeye"
 +
Race #race_Player
 +
ShipType #styp_ep6_Siege_Battleship
 +
Position -1000 838 -8966
 +
Orientation 0 0 0
 +
 
 +
NPC
 +
Name "Johan Mastropiero"
 +
 
 +
ID 1
 +
Face 20
 +
Rank 3
 +
Medals ;
 +
CrewLevel 1
 +
Skill 1 0
 +
Skill 2 0
 +
Skill 3 0
 +
XP 0
 +
END
 +
END
 +
 
 +
SHIP
 +
Name "Nightingale"
 +
Race #race_SpaceTech
 +
ShipType #styp_Frigate
 +
Position 2441.14 -8877.7 2618.99
 +
Orientation 180 0 0
 +
END
 +
 
 +
SHIP
 +
Name "Mayflower"
 +
Race #race_Human_E
 +
ShipType #styp_Supportship
 +
Position -12843.8 -1399.87 -5833.99
 +
Orientation 0 0 0
 +
 
 +
NPC
 +
Name "James Carson"
 +
 
 +
ID 2
 +
Face 26
 +
Rank 2
 +
Medals ;
 +
CrewLevel 1
 +
Skill 1 0
 +
Skill 2 0
 +
Skill 3 0
 +
XP 0
 +
END
 +
END
 +
 
 +
SHIP
 +
Name "Feral"
 +
TechCat 31 20
 +
TechPointsScanned 0
 +
Race #race_Gorg
 +
ShipType #styp_ep6_gorg_escortcruiser
 +
Position -5890.52 -22.7949 7108.39
 +
Orientation -92.7069 -36.0036 47.6695
 +
END
 +
 
 +
SHIP
 +
Name "Darkclaw"
 +
TechCat 31 30
 +
TechPointsScanned 0
 +
Race #race_Gorg
 +
ShipType #styp_ep3_gorg_heavy_battleship
 +
Position -5892.08 769.904 6509.39
 +
Orientation -92.7069 -36.0036 47.6695
 +
END
 +
 
 +
END
 +
</pre>
 +
 
 +
==''Auxiliary parts of a mission''==
 +
---
 +
I'll now move to explain two other files linked to every mission. Although they're not critical to a mission, they're advised to be included, as they're the files that contain the dialogs and objectives.
 +
 
 +
===Dialogs===
 +
---
 +
The dialogs of each mission go into a file (any file, as long as it is a .ini file. Moreover, two or more mission's dialogs could go into one or more files, although that's not encouraged. Best to keep things nice and tidy) in the \universe\texts\dialogs\ folder.
 +
The dialog syntax is as follows:
 +
<pre>
 +
Dialog
 +
<content>
 +
END
 +
</pre>
 +
with the content being:
 +
 
 +
*name <identifier number of the dialog, the one that links the dialog to the mission>
 +
*Layout <where it's located on the screen, see the manual>
 +
*NPC <id number of the npc saying this>
 +
*distort <num ranging from -1 to 3> it's the level of interference in a dialog (with -1 being none whatsoever)
 +
*ExpireEvent <event to occur when the dialog ends (in the same state where the dialog was called, of course)>
 +
Here is the text build of each dialog:
 +
<pre>
 +
text
 +
{
 +
<language (0 for English, 2 for Spanish, 1 for Hungarian...)> "<content>"
 +
}
 +
</pre>
 +
Here are the dialogs corresponding to the [[Demo_mission|Demo mission]]: [[Demo_mission#Dialogs|Dialogs]]
 +
 
 +
 
 +
in case of being this a dialog with a choice system built-in, a few things are added:
 +
 
 +
*ChooseTime <num in seconds> the amount of time the dialog stays on the air by itself
 +
 
 +
and the text build will look something like this:
 +
<pre>
 +
text
 +
{
 +
<language1> "<text in language 1>"
 +
<language2> "<in language 2>"
 +
.........
 +
}
 +
options
 +
{
 +
<language1> "<1° choice in language 1>"
 +
<language2> "<in language 2>"
 +
 
 +
.........
 +
}
 +
<event generated by choice 1>
 +
{
 +
<language1> "<2° choice in language 1>"
 +
<language2> "<in language 2>"
 +
 
 +
.........
 +
}
 +
<event generated by choice 2>
 +
 
 +
............
 +
 
 +
{
 +
<language1> "<n� choice in language 1>"
 +
<language2> "<in language 2>"
 +
 
 +
.........
 +
}
 +
<event generated by choice n>
 +
END
 +
</pre>
 +
unfortunately, there aren't any dialogs with such choices in the [[Demo_mission|Demo mission]], but I can provid you with an example, taken from my mission "Consequences" available in the Stargate Mod: War Begins PB4, 5, 6 and 7 (at the time this article was written):
 +
 
 +
<pre>
 +
DIALOG
 +
name dialog_consequences_c2_4
 +
Layout 6
 +
ExpireEvent TimerFail
 +
NPC 9
 +
distort -1
 +
text
 +
{
 +
            0 "They aren't responding sir, and they are charging weapons. What do we do sir? Fight or flee?"
 +
}
 +
        options
 +
      {
 +
        0 "We fight. All hands to battle stations!"
 +
      }
 +
      Fight
 +
 
 +
      {
 +
        0 "We came here to fight the replicators, no the Lucians. Major, get us out of here."
 +
      }
 +
      Flee
 +
 
 +
    END  //we end the choices
 +
END
 +
</pre>

Latest revision as of 22:09, 15 August 2012

NEXUS TJI mission-making

As you probably know by now, thanks to Arparso's great tutorial about Nexus's scripting structure, that every mission in this game is divided in MACHINES, STATES, and Rules. But that only deals with one part of the mission, the "body" of it, in a way. In order to illustrate this concepts I will be pasting here a Demo mission I've made with this article in mind.

The main parts of the mission

Here is a collection of the main parts a mission is divided into


The heading


Each mission starts, of course, with the basics of the mission: it's identity number, it's name, and where it'll take place (note that you can't change locations in a single mission):

MISSION <num>
name "<the name of the mission>" 
DefLocation "<name of the location>"

The "name of the location" is a "navpoint" created with the Solar System editor, one you can find in the "universe\systems\" folder. Unlike the number, the name of the mission doesn't have to be unique, you can put anything in there, even the same title that some other mission, as long as the numbering is not the same (well... that's not entirely true... if you place a letter instead of a number, the game will treat it as a mission number "0" and it will never give you a conflict, even if you label two or more missions as "NUMBER A"). Following that is a list of the current objective numbers, in this fashion:

OBJECTIVE
	1
	2
	...
END

Finally, as an example, here's the Demo mission's heading (note that everything after "//" and between "/* - */" is interpreted by the game as a comment):

MISSION 1  //mission number
Name "Demo Mission" //name of the mission
DefLocation "NAV_CHAKRIS_IV"  //the location where the mission will take place

OBJECTIVES //in here we place the number of objectives that will be included in the mission
	1
	2
	3
END

The SceneInit Rule


This is a very special rule, critical to any mission, and that is for the fact that this rule takes place before the mission starts. In this rule you can do pretty much anything you want, but there are a few things mandatory to do here.

  • The radius of the mission, in meters, as defined by the SetSceneRadius(<num>); command.
  • The setting of the variables associated to each of the ships that will appear on the mission (though critical for most missions, it's not mandatory), defined by the command <name of the variable> := GetSceneObj("<name of the ship>");

This rule is special also because it's the first link to any of the Machines you've written for this mission, in here you call the Machine (or Machines) you want your mission to start with. Unlike any other Rule, this one doesn't go inside a State, it only goes beneath the "RULES" block, as all the Machines in your mission do. Here's the SceneInit rule of the Demo mission, as well as the start of the "RULES" block:

RULES

	RULE 	event sceneInit
			:action
				SetSceneRadius(100000);	//this is, as the name suggests it, the radious in meters of the scene.
		
				GuiSelect(0);   //this is required to start a cinematic scene
		
				SetRelation(#race_player, #race_spacetech, 2);
				SetRelation(#race_player, #race_gorg, 2);
				SetRelation(#race_gorg, #race_player, 2);
				SetRelation(#race_spacetech, #race_player, 2);
				SetRelation(#race_player, #race_Human_E, 1);  //the relations between the races that will appear in 
                                                                              //the game. the "race_player" is the playable race, 
				                                              //and the number mean what sort of relationship they 
                                                                              //share with other races, more info on that is 
									      //located on the modding manual
				
				sp := GetSceneObj("Mayflower");
				bs := GetSceneObj("Hawkeye");   //in here we define the "Scene Objects", the ships and other
                                                                //interactive obects

				drone := GetSceneObj("Nightingale");
				
				gorg1 := GetSceneObj("Feral");
				gorg2 := GetSceneObj("Darkclaw");
				
				Disappear(drone);
				Disappear(gorg1);
				Disappear(gorg2); //we disappear the ships that are bound to appear via ip drive
				
				Playmusic(1);          //in here we set the number of the music track (as defined in the
                                                       //mod_sound.ini file, in the universe\engine\ folder
				
				GetMachine("Director"):ChangeState(IntroMovie, 0);
				GetMachine("Objectives"):ChangeState(monitor,0);    // with these commands we "call" the machines 
                                                                                    //that would define the game, and their given
                                                                                    // state
				
				FadeScreen(1, 0, 0);                       //we "fade" the screen, make it black
			:end
	END

The body of the mission

--- The sintax of this part has already been brilliantly explained by Arparso in his Tutorial, so I will only offer some advices here. Always use different states when there's a remarkable change in the mission (arrival of ships, discovery of stuff, etc), and try to keep your mission as tidy as possible. Machines can run simultaneously, so having a lot of them is never a good idea. Try to divide them into clear, differenced tasks (one of the AI, one or two for the actual mission, etc). So, here's the body of the Demo mission: body Also, don't forget that once you've finished with all your machines, included all the files that you wanted to include (to include a file you have to do this: "#include "<name of the file" ", and it would be like you wrote the content of that file in the mission file, so keep a close watch on the mission syntax when including files!) you have to END the mission. Just add a final END on the bottom, after the last included file and just above the ENTITIES section.

The ENTITIES section

--- Here's defined the settings of each of the mission's ships, like name, class, race, location, heading, etc, in this fashion:

SHIP
	<content>
END

Whereas the content may be:

  • Name "<name of the ship>"
  • Race #<race of the ship>
  • ShipType #<ship type of the ship, as defined in the SHIPTYPE part of the tacticstypes.ini>

or

  • Class #<class of the ship, as defined in the SHIPCLASS part of the tacticstypes.ini>
  • Position <x y z coordinates of the ship>
  • Orientation <pitch heading and bank of the ship>
  • Devices #<dev 1> #<dev 2> ... #<dev n> ; Note that this is optional, every device you place here will be added to the ship, so BE CAREFUL with it.

You may also add NPC's here to the mission's ships:

NPC
	<content>
END

with the content being:

  • Name "<name>"
  • ID <num> The id is the way to link this NPC to each dialog
  • Face <num> If this line is not provided, then the game will use the ID number as face number
  • Rank <num 1-10>
  • Medals #<medal 1> ... #<medal n> ;
  • CrewLevel <num> The level of the crew
  • Skill 1 <num> The skill of this npc in the Military area
  • Skill 2 <num> idem but in the engineering area
  • Skill 3 <num> idem but in the scientific area
  • XP <num> The experience of this npc.

That pretty much covers it. Here's Demo mission's ENTITIES area:

ENTITIES

	SHIP
		Name "Hawkeye"
		Race #race_Player
		ShipType #styp_ep6_Siege_Battleship
		Position -1000 838 -8966
		Orientation 0 0 0

		NPC
			Name "Johan Mastropiero"

			ID 1
			Face 20
			Rank 3
			Medals ;
			CrewLevel 1
			Skill 1 0
			Skill 2 0
			Skill 3 0
			XP 0
		END
	END

	SHIP
		Name "Nightingale"
		Race #race_SpaceTech
		ShipType #styp_Frigate
		Position 2441.14 -8877.7 2618.99
		Orientation 180 0 0
	END

	SHIP
		Name "Mayflower"
		Race #race_Human_E
		ShipType #styp_Supportship
		Position -12843.8 -1399.87 -5833.99
		Orientation 0 0 0

		NPC
			Name "James Carson"

			ID 2
			Face 26
			Rank 2
			Medals ;
			CrewLevel 1
			Skill 1 0
			Skill 2 0
			Skill 3 0
			XP 0
		END
	END

	SHIP
		Name "Feral"
		TechCat 31 20
		TechPointsScanned 0
		Race #race_Gorg
		ShipType #styp_ep6_gorg_escortcruiser
		Position -5890.52 -22.7949 7108.39
		Orientation -92.7069 -36.0036 47.6695
	END

	SHIP
		Name "Darkclaw"
		TechCat 31 30
		TechPointsScanned 0
		Race #race_Gorg
		ShipType #styp_ep3_gorg_heavy_battleship
		Position -5892.08 769.904 6509.39
		Orientation -92.7069 -36.0036 47.6695
	END

END

Auxiliary parts of a mission

--- I'll now move to explain two other files linked to every mission. Although they're not critical to a mission, they're advised to be included, as they're the files that contain the dialogs and objectives.

Dialogs

--- The dialogs of each mission go into a file (any file, as long as it is a .ini file. Moreover, two or more mission's dialogs could go into one or more files, although that's not encouraged. Best to keep things nice and tidy) in the \universe\texts\dialogs\ folder. The dialog syntax is as follows:

Dialog
	<content>
END 

with the content being:

  • name <identifier number of the dialog, the one that links the dialog to the mission>
  • Layout <where it's located on the screen, see the manual>
  • NPC <id number of the npc saying this>
  • distort <num ranging from -1 to 3> it's the level of interference in a dialog (with -1 being none whatsoever)
  • ExpireEvent <event to occur when the dialog ends (in the same state where the dialog was called, of course)>

Here is the text build of each dialog:

	
	text
	{
				<language (0 for English, 2 for Spanish, 1 for Hungarian...)> "<content>"
	}

Here are the dialogs corresponding to the Demo mission: Dialogs


in case of being this a dialog with a choice system built-in, a few things are added:

  • ChooseTime <num in seconds> the amount of time the dialog stays on the air by itself

and the text build will look something like this:

	text
	{
		<language1> "<text in language 1>"
		<language2> "<in language 2>"
		.........
	}
	options
		{
			<language1> "<1° choice in language 1>"
			<language2> "<in language 2>"

			.........	
		}
		<event generated by choice 1>
		{
			<language1> "<2° choice in language 1>"
			<language2> "<in language 2>"

			.........
		}
		<event generated by choice 2>

		............

		{
			<language1> "<n� choice in language 1>"
			<language2> "<in language 2>"

			.........
		}
		<event generated by choice n>
	END

unfortunately, there aren't any dialogs with such choices in the Demo mission, but I can provid you with an example, taken from my mission "Consequences" available in the Stargate Mod: War Begins PB4, 5, 6 and 7 (at the time this article was written):

DIALOG
	name dialog_consequences_c2_4
	Layout 6
	ExpireEvent TimerFail
	NPC 9
	distort -1
	text
	{
            	0 "They aren't responding sir, and they are charging weapons. What do we do sir? Fight or flee?"
	}
        options
      {
         0 "We fight. All hands to battle stations!" 
      }
      Fight

      {
         0 "We came here to fight the replicators, no the Lucians. Major, get us out of here."
      }
      Flee

     END  //we end the choices
END