ModdersGuide: Difference between revisions
Bonewhip58 (talk | contribs) No edit summary |
JYWLuca8269 (talk | contribs) No edit summary |
||
(8 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
==What is a Scenario? | {{DISPLAYTITLE:<span style="position: absolute; clip: rect(1px 1px 1px 1px); clip: rect(1px, 1px, 1px, 1px);">{{FULLPAGENAME}}</span>}} | ||
{{HeaderTemplate | |||
|welcome=Modder's Guide | |||
}} | |||
{{SectionTemplate | |||
|h=h1 | |||
|title=What is a Scenario? | |||
|content= | |||
A scenario is a mission that you can create and share with other players. At the simplest, you can create a new map (or use an existing map) and design your own waves of enemies. At its most complex you can use the scripting system in Siege to trigger a wide variety of actions and threats for the player. | A scenario is a mission that you can create and share with other players. At the simplest, you can create a new map (or use an existing map) and design your own waves of enemies. At its most complex you can use the scripting system in Siege to trigger a wide variety of actions and threats for the player. | ||
Scenarios can be easily uploaded and downloaded from the scenario workshop in Siege. | Scenarios can be easily uploaded and downloaded from the scenario workshop in Siege. | ||
}} | |||
{{SectionTemplate | |||
|h=h1 | |||
|title=Creating a Map | |||
|content= | |||
The map editor is accessible from the main menu of Siege of Centauri. | |||
}} | |||
'''Map Select'''<br> | |||
Select an existing map or select New Map. If you select New Map you will need to name the map, select a Map Size (I know everyone wants to pick the largest size, I recommend starting at 1536 for your first map) and a Terrain Type. | |||
[[File:MapEditor-03.png|frameless]] | |||
Once you have set those things you start with a blank map with your colony on it and lots of options. | |||
[[File:MapEditor-04.png|frameless]] | |||
'''Edit Terrain'''<br> | |||
This allows you to set the terrain you would like. | This allows you to set the terrain you would like for areas of your map. | ||
*Plains- This is the default ground enemies can travel on. | *Plains - This is the default flat ground enemies can travel on. | ||
*Plateau- This is where towers can be placed. | *Plateau - This is where towers can be placed. It is elevated above Plains. | ||
*Mountains- Mountains are impassable by ground units and can block shots from direct fire weapons. | *Mountains - Mountains are impassable by ground units and can block shots from direct fire weapons. | ||
*Basin- Basins are impassable by ground units. | *Basin - Basins are impassable by ground units. | ||
'''Edit Buildings'''<br> | |||
*Relay- Relay’s connect paths for unit movement. | *Relay - Relay’s connect paths for unit movement. | ||
*Metal Refinery- This produces metal for the player. | *Metal Refinery - This produces metal for the player. | ||
*Fission Reactor- This produces energy for the player. | *Fission Reactor - This produces energy for the player. | ||
*Outpost- Players get a score boost for each surviving Outpost when they complete the Mission. | *Outpost - Players get a score boost for each surviving Outpost when they complete the Mission. | ||
*Storage Cell- Storage cells explode when clicked on, but they can only be used once. | *Storage Cell - Storage cells explode when clicked on, but they can only be used once. | ||
*Dead Region- This marks an area that can’t be entered (to block relays from connecting over mountains, basins, etc). | *Dead Region - This marks an area that can’t be entered (to block relays from connecting over mountains, basins, etc). | ||
'''Edit Cosmetic'''<br> | |||
Depending on the environment different cosmetic layers may use different textures. For example on arctic one cosmetic layer is a snowy ground, while another is clear dirt. Play with the | Depending on the environment, different cosmetic layers may use different textures. For example, on arctic one cosmetic layer is a snowy ground, while another is clear dirt. Play with the layers to find the one you want. | ||
'''Edit Effects'''<br> | |||
Effect layer 1 is | Effect layer 1 is Ground Fog. Typically we use to fill in the basins and give them life, but you can use it anywhere if you want to create foggy paths. More advanced modders can edit their MapEffects.csv file to use any effect in Siege for these layers; but the default is just for ground fog. | ||
'''Brush Size'''<br> | |||
Set it large if you want to paint a wide area quickly, set it small if you want to get into the finer details. | Set it large if you want to paint a wide area quickly, set it small if you want to get into the finer details. | ||
'''Rebuild Terrain'''<br> | |||
This will cause the game to generate the map based on everything you have set. It may take a few minutes to do based on the size of your map and the power of your computer. | This will cause the game to generate the map based on everything you have set. It may take a few minutes to do based on the size of your map and the power of your computer. | ||
[[File:MapEditor-01.png]] | [[File:MapEditor-01.png|frameless]] | ||
'''Toggle Display Mode'''<br> | |||
After you “Rebuild Terrain” this toggle will let you switch between the graphical mode (seeing the map like you would in game), editor mode (seeing the regions clearly as when you start the map editor) and a mixed mode that blends them together. Personally, I stay in the data mode almost all of the time but it’s nice to switch over to the graphical view to see if a basin looks weird, if a path looks wide enough, etc. | After you “Rebuild Terrain” this toggle will let you switch between the graphical mode (seeing the map like you would in game), editor mode (seeing the regions clearly as when you start the map editor) and a mixed mode that blends them together. Personally, I stay in the data mode almost all of the time but it’s nice to switch over to the graphical view to see if a basin looks weird, if a path looks wide enough, etc. | ||
After rebuilding the terrain it will automatically switch to graphical mode so you will want to press this button to switch back to editor mode. | After rebuilding the terrain it will automatically switch to graphical mode so you will want to press this button to switch back to editor mode. | ||
'''Enable Symmetry'''<br> | |||
This allows you to select a wide variety of symmetrical options if you want to make sure whatever you are painting is perfectly symmetrical (for example if you want mirrored paths coming in from each side). | This allows you to select a wide variety of symmetrical options if you want to make sure whatever you are painting is perfectly symmetrical (for example if you want mirrored paths coming in from each side). | ||
'''Environment Toggle'''<br> | |||
This allows you to switch the environment of your map, from frozen, desert, volcanic, etc. This is most useful after rebuilding the terrain while you are in the Graphical Mode so you can see what the changed environment looks like. | This allows you to switch the environment of your map, from frozen, desert, volcanic, etc. This is most useful after rebuilding the terrain while you are in the Graphical Mode so you can see what the changed environment looks like. | ||
'''Toggle Mouse Position'''<br> | |||
This shows you the map coordinates of the cursor position. This is very important later on when we are making the mission. | This shows you the map coordinates of the cursor position. This is very important later on when we are making the mission.<blockquote>'''Pro Tip:''' Write down the coordinates of important locations so you have them ready when you go to make your mission. You will want the coordinates of the places you want enemies to enter from, the coordinates of the colony and other buildings, as well as any other special locations you might want to send enemies to, or trigger actions at.</blockquote> | ||
[[File:MapEditor-02.png|frameless]] | |||
==Creating a Mission | {{SectionTemplate | ||
|h=h1 | |||
|title=Creating a Mission | |||
|content= | |||
The best resource for creating your own mission are the missions that come with the game. They are all in exactly the format you need and will give you lots of examples of how the designers made all the campaign missions work. Check them all out in the ..\Siege of Centauri\Assets\Campaign\AtlasProject\ directory. | The best resource for creating your own mission are the missions that come with the game. They are all in exactly the format you need and will give you lots of examples of how the designers made all the campaign missions work. Check them all out in the ..\Siege of Centauri\Assets\Campaign\AtlasProject\ directory. | ||
}} | |||
'''The Mission File'''<br> | |||
This is an XML file and it can be made with any text editor, even notepad. I use [https://notepad-plus-plus.org/ Notepad++]. | |||
Create the file and save it in the ..\My Games\Siege of Centauri\Scenario\ directory. Name it the same as your scenario. In this example I’m creating a scenario called “Aberny”. Note I called my Map “Aberny”, my Mission “Aberny”, and the Scenario will be called “Aberny”. They don’t need to be the same - it was just convenient. | |||
Create the file and save it in the ..\My Games\Siege of Centauri\Scenario\ directory. Name it the same as your scenario. In this example I’m creating a scenario called “Aberny”. Note I called my Map “Aberny” my Mission “Aberny” and the Scenario will be called “Aberny”. | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<Mission | <Mission | ||
Line 85: | Line 102: | ||
'''Mission attributes:''' | '''Mission attributes:''' | ||
*ID - This needs to be unique. You may want to append your own name to it so you don’t have to worry about conflicting with someone else’s in the workshop. | |||
*Title - The name that people will see in the workshop. | |||
*Description - The detailed description that appears when someone clicks on this in the workshop. | |||
*Map - The name of the map you created for this mission. | |||
*PreviewImage - This is the picture that will be displayed in the workshop and in game. Later we will go through how to create it. | |||
Ignore the other mission attributes and the score element. In setting up the players, ''the human always has to be the first player listed.'' The first player listed is player 0, the second player listed is player 1, etc. | |||
'''Player attributes:''' | |||
*Name - Not used. | |||
*Faction - The Human player should always be “PHC”, the enemies should always be “ss”. | |||
*Team - Typically the human player is team “0” and the AI is team “1” but if you want to create multiple players you can make more teams or put them on teams together. | |||
*Color - Typically the human player is 2 (blue) and the AI is 4 (orange) though we do let the player change this a bit on some maps to make them more visible. | |||
*StartLocation - This should always be set to “0”. | |||
*AIType - The human player should be “Player” and the AI “Off”. | |||
*NoEngineer - Always set to “1”. | |||
*NoSeed - AI players should have this set to “1”. | |||
''Example: Warring Enemies''<br> | |||
By creating a third player we can spawn units on another side as follows: | By creating a third player we can spawn units on another side as follows: | ||
Line 114: | Line 133: | ||
Notice I gave the third player a new name (they have to be unique), a new team (so the Decius player isn’t allied with the human or with the AI and a new color (so the player can see that they are different from AI player “Agethon”. Now when we spawn units we can do it as either player 1 (Agethon) or player 2 (Decius) and these units will both attack the human player as well as fight with each other. | Notice I gave the third player a new name (they have to be unique), a new team (so the Decius player isn’t allied with the human or with the AI and a new color (so the player can see that they are different from AI player “Agethon”. Now when we spawn units we can do it as either player 1 (Agethon) or player 2 (Decius) and these units will both attack the human player as well as fight with each other. | ||
'''Setting Things Up'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<Trigger ID="Configure" Type="Timer" Timer="0" > | <Trigger ID="Configure" Type="Timer" Timer="0" > | ||
Line 142: | Line 161: | ||
Note that QueueWave puts the waves in order as they are called. In this example Wave2 won’t trigger until Wave1 is done. If you have a trigger that added QueueWave SurpriseAttack it would go at the end of all the other waves that were currently waiting in line (so in this example it would go after Wave15). | Note that QueueWave puts the waves in order as they are called. In this example Wave2 won’t trigger until Wave1 is done. If you have a trigger that added QueueWave SurpriseAttack it would go at the end of all the other waves that were currently waiting in line (so in this example it would go after Wave15). | ||
'''What is a Wave?'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<Wave Name="Wave1" Timer="10" PortraitUnit="Unit_Normal" Description="Unit_Normal_Name" Direction="Top"> | <Wave Name="Wave1" Timer="10" PortraitUnit="Unit_Normal" Description="Unit_Normal_Name" Direction="Top"> | ||
Line 157: | Line 176: | ||
'''Wave''' | '''Wave''' | ||
*Timer- How many second after this wave is triggered will it wait before spawning. This allows us to control the gap between waves. Do you want it to wait 90 seconds before sending the next army in, or 5 seconds? | |||
*PortraitUnit- This is the template name of the unit you want to represent this wave in the wave panel on the top of the screen. | *Timer - How many second after this wave is triggered will it wait before spawning. This allows us to control the gap between waves. Do you want it to wait 90 seconds before sending the next army in, or 5 seconds? | ||
*Description- This is the description that will go in the wave panel for this wave. | *PortraitUnit - This is the template name of the unit you want to represent this wave in the wave panel on the top of the screen. | ||
*Direction- This can be Top, Bottom, Right, Left or any combination of them. This is what is used to set the arrows | *Description - This is the description that will go in the wave panel for this wave. | ||
*RushBonus- The maximum amount of metal that can be gained by rushing this wave. Typically about 250 is good. | *Direction - This can be Top, Bottom, Right, Left or any combination of them. This is what is used to set the arrows when the player mouses over the wave panel icon. If multiples are used, put a comma between them. (ex: Direction=”Right,Left”) | ||
*RushCountdown- The countdown timer that | *RushBonus - The maximum amount of metal that can be gained by rushing this wave. Typically about 250 is good. | ||
*Repeat- If you want this wave to repeat you can put the amount of times here. If you want it to repeat forever set it equal to Repeat=”-1”. | *RushCountdown - The countdown timer that determines how quickly to reduce the metal bonus as a wave gets closer to the time it is going to spawn. Typically 70 is good. | ||
*RepeatTimer- If the wave is set to repeat this is the time before it repeats. Does it repeat every 300 seconds or every 30? | *Repeat - If you want this wave to repeat you can put the amount of times here. If you want it to repeat forever set it equal to Repeat=”-1”. | ||
*IsFinalWave- The last wave you have needs to have this set to IsFinalWave=”1”. This tells the game that no future waves are coming so it can award victory to the player if they kill all the enemies after this point. | *RepeatTimer - If the wave is set to repeat, this is the time before it repeats. Does it repeat every 300 seconds or every 30? | ||
*IsFinalWave - The last wave you have needs to have this set to IsFinalWave=”1”. This tells the game that no future waves are coming so it can award victory to the player if they kill all the enemies after this point. | |||
The Wave element has DoWaveSpawn sub-elements. This is what those do. | The Wave element has DoWaveSpawn sub-elements. This is what those do. | ||
'''DoWaveSpawn''' | '''DoWaveSpawn''' | ||
*Target - This is the trigger that the DoWaveSpawn calls (we will take a look at setting these up later) that actually generates the units. | |||
*Delay - If you want to have a delay between these DoWaveSpawns. In the above example it spawns a group of “Normal” then waits 1 second, then spawns another group. | |||
''The Ping Spawn''<br> | |||
One of the DoWaveSpawns listed above calls “Ping-North”. This is what the game uses to put the alert on the minimap and play the audio queue that a new wave is beginning. The ping spawn is simple and just consists of a PingPath with a Path set to the path the units will be called on. | One of the DoWaveSpawns listed above calls “Ping-North”. This is what the game uses to put the alert on the minimap and play the audio queue that a new wave is beginning. The ping spawn is simple and just consists of a PingPath with a Path set to the path the units will be called on. | ||
Line 182: | Line 203: | ||
</pre> | </pre> | ||
'''What is a Path?'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<WavePath Name="Path-North" ShowInScanMode="False"> | <WavePath Name="Path-North" ShowInScanMode="False"> | ||
Line 195: | Line 216: | ||
'''WavePath''' | '''WavePath''' | ||
*Name- This name has to be unique. It is what PingPath uses and the SpawnUnitOnPath trigger uses. | |||
*ShowInScanMode- This determines if this path is displayed when the player presses the Ctrl key. Typically we only set if for the paths of Air units (so the player can see the path air units will follow). | *Name - This name has to be unique. It is what PingPath uses and the SpawnUnitOnPath trigger uses. | ||
*ShowInScanMode - This determines if this path is displayed when the player presses the Ctrl key. Typically we only set if for the paths of Air units (so the player can see the path air units will follow). | |||
'''SpawnPoint''' | '''SpawnPoint''' | ||
*Position- This is the starting point of the path. This is where units will be initially spawned with a SpawnUnitOnPath trigger is used or where the Ping will happen on a PingPath. | |||
*Position - This is the starting point of the path. This is where units will be initially spawned with a SpawnUnitOnPath trigger is used or where the Ping will happen on a PingPath. | |||
'''Waypoint''' | '''Waypoint''' | ||
*Position - This is where the units will go after being spawned. They will go to each waypoint defined and attempt to reach that position before going on to the next. In most cases the only waypoint required is the colony location, but in some cases you might want to have more granular control over where they go. In the above example, the path leads to 2 other buildings before heading to the final waypoint, which is the Colony. | |||
'''Spawning Units'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<Trigger Name="Normal-Spawn" Type="WaveSpawn"> | <Trigger Name="Normal-Spawn" Type="WaveSpawn"> | ||
Line 216: | Line 240: | ||
'''Trigger''' | '''Trigger''' | ||
*Name- This is the name that is called from the DoWaveSpawn trigger. | |||
*Type- Always use “WaveSpawn” here. We will cover other types of triggers later. | *Name - This is the name that is called from the DoWaveSpawn trigger. | ||
*Type - Always use “WaveSpawn” here. We will cover other types of triggers later. | |||
'''SpawnUnitOnPath''' | '''SpawnUnitOnPath''' | ||
*Name- We typically use “Parent” for every unit name. The only time this really matters is when you are parenting other units to this unit or if you have a specific trigger setup (when this unit is destroyed or gets to a particular location). | |||
*Parent- This is only needed when you are building an army where you want the units to stay together. In the example above there are 3 “Unit_Normal_3” units being spawned and the second two are following the first. | *Name - We typically use “Parent” for every unit name. The only time this really matters is when you are parenting other units to this unit, or if you have a specific trigger setup (when this unit is destroyed or gets to a particular location). | ||
*Template- This is the unit template being used | *Parent - This is only needed when you are building an army where you want the units to stay together. In the example above there are 3 “Unit_Normal_3” units being spawned and the second two are following the first. | ||
*Player- Player 0 is always the human player (if you want to spawn some units on the | *Template - This is the unit template being used. There is a full list of the available units in Siege below. | ||
*Path- This the path that the units will be spawned and travel on. | *Player - Player 0 is always the human player (if you want to spawn some units on the player's side). Player 1 is the AI. If you add more players, they can also be referenced here. | ||
*Path - This the path that the units will be spawned and travel on. | |||
'''Available Units''' | '''Available Units''' | ||
*Unit_Air - Punisher, a medium strength flying unit. | |||
*Unit_Air_Carrier - Gliding Crane, air transport which drops units at a set location. | |||
*Unit_Air_Heavy - Harbinger, a powerful air unit that takes a lot to shoot down. | |||
*Unit_Air_Destruction - Vulture, a powerful air unit that can destroy towers. | |||
*Unit_Air_Swarm - Sparrow, a swarm of small flying units. | |||
*Unit_Bomb - Falling Star, a unit that explodes when destroyed and disables surrounding towers. | |||
*Unit_ClutchOfEggs - Clutch of Eggs, explodes and releases a swarm of Hatchlings when destroyed. | |||
*Unit_ClutchOfEggsBaby - Hatchlings, a swarm of small spiders. | |||
*Unit_Destructor - Destructor, a medium sized non-shielded unit. | |||
*Unit_Speed - Taskmaster, speeds up surrounding allies. | |||
*Unit_Fast - Capacitor, small and quick. | |||
*Unit_FastShielded - Hooded Turbine, medium sized fast and shielded unit. | |||
*Unit_Healer - Corrupted Healer, heals surrounding allies. | |||
*Unit_HeartOfThePhoenix - Heart of the Phoenix, juggernaut, transforms to an egg when destroyed. | |||
*Unit_HeartOfThePhoenix_Egg - Heart of the Phoenix egg, given enough time it will be reborn to a Heart of the Phoenix. | |||
*Unit_HeavySwarm - Scarab, slow swarm with a lot of hit points. | |||
*Unit_Hive - Rolling Hive, medium sized unit that produces small flying units as it goes. | |||
*Unit_Summoner - Floating Factory, medium sized unit that gathers a swarm of Scarabs as it goes. | |||
*Unit_Milton - Milton, everyone’s favorite death machine. | |||
*Unit_NestOfTheQueen - Nest of the Queen, juggernaut, produces Falling Stars as it goes. | |||
*Unit_Normal - Masochist, small, fast unit. | |||
*Unit_Normal_3 - A group of 3 Masochists. | |||
*Unit_Nullifier - Mobile Nullifier, medium unit that the player can’t use orbital abilities around. | |||
*Unit_Overmind - Overmind, dreadnought with low hit points and high shields. | |||
*Unit_Reinforcements - Reinforcements, good for soaking up some damage before being destroyed. | |||
*Unit_Retributor - Retributor, dreadnought with high hit points and low shields. | |||
*Unit_Shielded - Eradicator, slow unit with heavy shields. | |||
*Unit_Spider - Harridan, organic spiders in large, quick swarms. | |||
*Unit_Swarm - Reaper, a large group of small units. | |||
*Unit_SwarmShielded - Martyr, a swarm of small, shielded units. | |||
''Example: A Wave of Miltons''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<Trigger Name="Milton-Spawn" Type="WaveSpawn"> | <Trigger Name="Milton-Spawn" Type="WaveSpawn"> | ||
Line 266: | Line 293: | ||
The above trigger will spawn Milton (Template=”Unit_Milton”) on the players side (Player=”0”) that will spawn in and follow the Path-North, attacking any enemies he encounters along the way. | The above trigger will spawn Milton (Template=”Unit_Milton”) on the players side (Player=”0”) that will spawn in and follow the Path-North, attacking any enemies he encounters along the way. | ||
{{SectionTemplate | |||
= | |h=h2 | ||
|title=Triggers | |||
|content= | |||
There are a wide variety of triggers to cause things to happen, or respond to things that happen. Check out the existing missions to see lots of examples of them at work. | There are a wide variety of triggers to cause things to happen, or respond to things that happen. Check out the existing missions to see lots of examples of them at work. | ||
No triggers beyond those presented above (WaveSpawn) are required to make a great scenario | No triggers beyond those presented above (WaveSpawn) are required to make a great scenario, but they can allow you to make your scenario unique. | ||
}} | |||
'''Area'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<Trigger Name="Carrier-Drop" Type="Area" Template="Unit_Air_Carrier" Center="-2663,-1940" Size="100"> | <Trigger Name="Carrier-Drop" Type="Area" Template="Unit_Air_Carrier" Center="-2663,-1940" Size="100"> | ||
Line 279: | Line 308: | ||
</pre> | </pre> | ||
Area triggers when the specified unit type comes into range. The above waits for an air transport (“Unit_Air_Carrier”) to come into range (within 100 of the -2663,-1940 coordinates). If that happens it spawns a group of | Area triggers when the specified unit type comes into range. The above waits for an air transport (“Unit_Air_Carrier”) to come into range (within 100 of the -2663,-1940 coordinates). If that happens it spawns a group of Reapers (“Unit_Swarm”). | ||
*Name- Names need to be unique. | *Name - Names need to be unique. | ||
*Type- Area in this example. | *Type - Area in this example. | ||
*Template- The type of unit that causes this trigger to fire. | *Template - The type of unit that causes this trigger to fire. | ||
*Center- The area that is being monitored. | *Center - The area that is being monitored. | ||
*Size- | *Size - The size of the area being monitored. | ||
'''BuildingDestroyed'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<Trigger Name="OutpostDies" Type="BuildingDestroyed" Template="Building_Outpost"> | <Trigger Name="OutpostDies" Type="BuildingDestroyed" Template="Building_Outpost"> | ||
Line 296: | Line 325: | ||
</pre> | </pre> | ||
Triggered when a building of the specified type is destroyed. In the above example a dialog string plays when an outpost is destroyed. | Triggered when a building of the specified type is destroyed. In the above example, a dialog string plays when an outpost is destroyed. | ||
*Name- Names need to be unique. | *Name - Names need to be unique. | ||
*Type- BuildingDestroyed in this example. | *Type - BuildingDestroyed in this example. | ||
*Template- The type of building whose destruction will fire this trigger. Check BuildingTemplates.csv for a full list of all the building template | *Template - The type of building whose destruction will fire this trigger. Check BuildingTemplates.csv for a full list of all the building template types. | ||
'''BuildingStarted'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<Trigger Name="BuiltBomb2" Type="BuildingStarted" Template="Bomb_Seed2" IsBuilding="1"> | <Trigger Name="BuiltBomb2" Type="BuildingStarted" Template="Bomb_Seed2" IsBuilding="1"> | ||
Line 311: | Line 340: | ||
</pre> | </pre> | ||
Triggered when a building starts being built. In the above example it | Triggered when a building starts being built. In the above example it triggers a dialog when the player upgrades to Bomb_Seed2. | ||
*Name- Names need to be unique. | *Name - Names need to be unique. | ||
*Type- BuildingStarted in this example. | *Type - BuildingStarted in this example. | ||
*Template- The template name for the building being built. Check BuildingTemplates.csv for a full list of all the building template | *Template - The template name for the building being built. Check BuildingTemplates.csv for a full list of all the building template types. | ||
*IsBuilding- Set to 1 to force it to trigger on building. | *IsBuilding - Set to 1 to force it to trigger on building. | ||
'''DamageDealt'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<Trigger Name="SpiderEnemy" Type="DamageDealt" TargetTemplate="Unit_Spider"> | <Trigger Name="SpiderEnemy" Type="DamageDealt" TargetTemplate="Unit_Spider"> | ||
Line 326: | Line 355: | ||
</pre> | </pre> | ||
Triggered when the specified unit type is dealt damage. In this case if a Harridan (Unit_Spider) is damaged it causes them to attack position 0,4891 (the location of the colony). It also disables the trigger after it fires (so it won’t fire again). | Triggered when the specified unit type is dealt damage. In this case, if a Harridan (Unit_Spider) is damaged it causes them to attack position 0,4891 (the location of the colony). It also disables the trigger after it fires (so it won’t fire again). | ||
*Name- Names need to be unique. | *Name - Names need to be unique. | ||
*Type- DamageDealt in this example. | *Type - DamageDealt in this example. | ||
*TargetTemplate- The template name of the unit whose damage will fire this trigger. | *TargetTemplate - The template name of the unit whose damage will fire this trigger. | ||
'''GameplayTimerExpired'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<Trigger Name="Victory" Type="GameplayTimerExpired" Target="VictoryTimer"> | <Trigger Name="Victory" Type="GameplayTimerExpired" Target="VictoryTimer"> | ||
Line 339: | Line 368: | ||
</pre> | </pre> | ||
Used to respond to the CreateGameplayTimer. | Used to respond to the CreateGameplayTimer. In the above example, if the VictoryTimer runs out then the player wins the game. | ||
*Name- Names need to be unique. | *Name - Names need to be unique. | ||
*Type- GameplayTimerExpired in this example. | *Type - GameplayTimerExpired in this example. | ||
*Target- The name of the timer being monitored. | *Target - The name of the timer being monitored. | ||
'''SpecialAbility'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<Trigger Name="MiltonTrigger" Type="SpecialAbility" Template="Orbital_Milton" > | <Trigger Name="MiltonTrigger" Type="SpecialAbility" Template="Orbital_Milton" > | ||
Line 352: | Line 381: | ||
</pre> | </pre> | ||
Triggers when a special ability is used. In the above it deletes an AreaIndicator when the player uses the Milton orbital ability. | Triggers when a special ability is used. In the above, it deletes an AreaIndicator when the player uses the Milton orbital ability. | ||
*Name- Names need to be unique. | *Name - Names need to be unique. | ||
*Type- SpecialAbility in this example. | *Type - SpecialAbility in this example. | ||
*Template- The template name of the special ability | *Template - The template name of the special ability: ''Orbital_Lure, Orbital_EMP, Orbital_Milton, Orbital_Kill, Orbital_OrbitalStrike, Orbital_Overcharge, Orbital_Reinforce, Orbital_RushWave'' or ''Orbital_Teleport''. | ||
'''Timer'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<Trigger Name="HPBoost" Type="Timer" Timer="10" Inactive="1"> | <Trigger Name="HPBoost" Type="Timer" Timer="10" Inactive="1"> | ||
Line 366: | Line 395: | ||
</pre> | </pre> | ||
A timer trigger fires when the amount of | A timer trigger fires when the amount of seconds pass that are set in the Timer attribute. In the above example, the timer starts disabled (Inactive=”1”), so it has to be activated by another trigger before it will start its 10 second countdown (Timer=”10”). It then grants a HP boost to the AI player (Player=”1”) and calls itself. So it will continue to grant a HP boost to the AI player every 10 seconds until the mission ends. | ||
*Name- Names need to be unique. | *Name - Names need to be unique. | ||
*Type- Timer in this example. | *Type - Timer in this example. | ||
*Timer- The amount of seconds that need to pass before this trigger fires. | *Timer - The amount of seconds that need to pass before this trigger fires. | ||
*Inactive- Timer triggers start enabled by default, setting this to 1 means that another trigger needs to ActivateTrigger this one before it starts its countdown. | *Inactive - Timer triggers start enabled by default, setting this to 1 means that another trigger needs to ActivateTrigger this one before it starts its countdown. | ||
'''UnitDestroyed'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<Trigger Name="HeartDies" Type="UnitDestroyed" Template="Unit_HeartOfThePhoenix_Egg" > | <Trigger Name="HeartDies" Type="UnitDestroyed" Template="Unit_HeartOfThePhoenix_Egg" > | ||
Line 382: | Line 411: | ||
In the Timer description we saw a trigger that needed to be activated by another trigger. This trigger fires when the specified unit is destroyed, in this case a Heart of the Phoenix Egg (Template=”Unit_HeartOfThePhoenix_Egg”). Once it is destroyed it activates the HPBoost trigger. | In the Timer description we saw a trigger that needed to be activated by another trigger. This trigger fires when the specified unit is destroyed, in this case a Heart of the Phoenix Egg (Template=”Unit_HeartOfThePhoenix_Egg”). Once it is destroyed it activates the HPBoost trigger. | ||
*Name- Names need to be unique. | *Name - Names need to be unique. | ||
*Type- UnitDestroyed in this example. | *Type - UnitDestroyed in this example. | ||
*Template- The template type of unit that will cause this trigger to fire when it is destroyed. | *Template - The template type of unit that will cause this trigger to fire when it is destroyed. | ||
'''Var'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<Trigger Type="Var" Var="ReinforceCount" Value="3" Operator=">="> | <Trigger Type="Var" Var="ReinforceCount" Value="3" Operator=">="> | ||
Line 404: | Line 433: | ||
This SpecialAbility trigger increments the ReinforceTrigger count each time the player uses the Reinforce ability. | This SpecialAbility trigger increments the ReinforceTrigger count each time the player uses the Reinforce ability. | ||
Used together the counter goes up each time the player uses Reinforce. But when the player uses it for the 3rd time it disables the | Used together, the counter goes up each time the player uses Reinforce. But when the player uses it for the 3rd time, it disables the Reinforce ability for the rest of the mission (or at least until a script turns it back on). | ||
'''WaveStarted'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<Trigger Name="Wave2Started" Type="WaveStarted" Target="Wave2"> | <Trigger Name="Wave2Started" Type="WaveStarted" Target="Wave2"> | ||
<Dialog> | <Dialog> | ||
<Entry Character="Husk" Text=" | <Entry Character="Husk" Text="The tight pathways of this sector are ideal for the /color:EEBeige/Corrosion Mortar/endcolor/. It can fire over terrain and soften up the enemy with damage over time." /> | ||
</Dialog> | </Dialog> | ||
</Trigger> | </Trigger> | ||
</pre> | </pre> | ||
This trigger fires when the specified wave starts. In the example it | This trigger fires when the specified wave starts. In the example, it triggers a dialog when Wave2 (Target=”Wave2”) begins. | ||
*Name- Names need to be unique. | *Name - Names need to be unique. | ||
*Type- WaveStarted in this example. | *Type - WaveStarted in this example. | ||
*Target- The name of the Wave that will cause this trigger to fire. | *Target - The name of the Wave that will cause this trigger to fire. | ||
{{SectionTemplate | |||
= | |h=h2 | ||
|title=Actions | |||
|content= | |||
Actions are script commands that cause something to happen. Where a Trigger controls when it happens, an Action is the actual thing that affects the game. Actions are usually inside of triggers as in the following: | Actions are script commands that cause something to happen. Where a Trigger controls when it happens, an Action is the actual thing that affects the game. Actions are usually inside of triggers as in the following: | ||
}} | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<Trigger Name="Wave2Started" Type="WaveStarted" Target="Wave2"> | <Trigger Name="Wave2Started" Type="WaveStarted" Target="Wave2"> | ||
<Dialog> | <Dialog> | ||
<Entry Character="Husk" Text=" | <Entry Character="Husk" Text="The tight pathways of this sector are ideal for the /color:EEBeige/Corrosion Mortar/endcolor/. It can fire over terrain and soften up the enemy with damage over time." /> | ||
</Dialog> | </Dialog> | ||
</Trigger> | </Trigger> | ||
</pre> | </pre> | ||
The above reads as: when the “WaveStarted” trigger fires | The above reads as: when the “WaveStarted” trigger fires, the Dialog action occurs. | ||
Triggers can contain multiple actions such as: | Triggers can contain multiple actions such as: | ||
Line 443: | Line 474: | ||
</pre> | </pre> | ||
The above reads as: when the “ReinforceCount” variable gets to 3 or higher it will disable the | The above reads as: when the “ReinforceCount” variable gets to 3 or higher, it will disable the Reinforcements orbital ability and deactivate the “ReinforceTrigger” trigger. | ||
'''ActivateTrigger'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<ActivateTrigger Target="HPBoost" /> | <ActivateTrigger Target="HPBoost" /> | ||
Line 459: | Line 490: | ||
</pre> | </pre> | ||
Triggers also deactivate after firing. So if you have a timer trigger that goes off after 10 seconds it will fire after 10 seconds then mark itself as inactive. | Triggers also deactivate after firing. So if you have a timer trigger that goes off after 10 seconds, it will fire after 10 seconds then mark itself as inactive. | ||
The ActivateTrigger action marks these triggers as active again. It is commonly used to cause triggers to repeat, or to have other triggers start working after a certain condition has been met (for example, if you want to start spawning new waves after the player upgrades his colony). | The ActivateTrigger action marks these triggers as active again. It is commonly used to cause triggers to repeat, or to have other triggers start working after a certain condition has been met (for example, if you want to start spawning new waves after the player upgrades his colony). | ||
'''AreaIndicator'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<AreaIndicator Name="Milton_Highlight" Position="704,-128,0" Color="Blue" Size="100" Duration="-1" /> | <AreaIndicator Name="Milton_Highlight" Position="704,-128,0" Color="Blue" Size="100" Duration="-1" /> | ||
Line 470: | Line 501: | ||
This puts a UI element on the ground at the position indicated. We use it in one of the missions as a tutorial element to help the player know where there is a good place to put Milton. You can update the specific AreaIndicator by passing in new attributes with the same Name. Duration of -1 means that it will last forever. If you want to turn it off, pass in a Duration of 0. | This puts a UI element on the ground at the position indicated. We use it in one of the missions as a tutorial element to help the player know where there is a good place to put Milton. You can update the specific AreaIndicator by passing in new attributes with the same Name. Duration of -1 means that it will last forever. If you want to turn it off, pass in a Duration of 0. | ||
'''CreateGameplayTimer'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<CreateGameplayTimer Name="VictoryTimer" Time="600"/> | <CreateGameplayTimer Name="VictoryTimer" Time="600"/> | ||
Line 477: | Line 508: | ||
This creates a gameplay timer that you can trigger off of with the GameplayTimerExpired trigger. You could, for example, give the player 60 seconds to place towers and then disable all towers afterwards. | This creates a gameplay timer that you can trigger off of with the GameplayTimerExpired trigger. You could, for example, give the player 60 seconds to place towers and then disable all towers afterwards. | ||
This is also commonly used with the GameplayTimerExpired trigger and the EndMission action to allow the player to win if he survives for | This is also commonly used with the GameplayTimerExpired trigger and the EndMission action to allow the player to win if he survives for N minutes. | ||
'''DeactivateTrigger'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<DeactivateTrigger Target="ReinforceTrigger" /> | <DeactivateTrigger Target="ReinforceTrigger" /> | ||
</pre> | </pre> | ||
This is the opposite of the ActivateTrigger function | This is the opposite of the ActivateTrigger function; it can deactivate any trigger. For example, if you have a trigger that spawns an enemy wave every 15 seconds as long as an enemy building exists, you could have the destruction of that building deactivate the unit spawning trigger. | ||
'''Dialog'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<Trigger Name="OutpostDies" Type="BuildingDestroyed" Template="Building_Outpost"> | <Trigger Name="OutpostDies" Type="BuildingDestroyed" Template="Building_Outpost"> | ||
<Dialog> | <Dialog> | ||
<Entry Character="Husk" Text=" | <Entry Character="Husk" Text="The first Outpost has been destroyed. Expect them to focus on the other Outpost and the Colony next." /> | ||
</Dialog> | </Dialog> | ||
</Trigger> | </Trigger> | ||
Line 497: | Line 528: | ||
This creates a dialog popup. Entry characters can be “Husk”, “Zhukov”, “Milton”, “Persephone” or “Haalee”. | This creates a dialog popup. Entry characters can be “Husk”, “Zhukov”, “Milton”, “Persephone” or “Haalee”. | ||
'''EndMission'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<EndMission Victory="1" String="Mission_VictoryString"/> | <EndMission Victory="1" String="Mission_VictoryString"/> | ||
</pre> | </pre> | ||
Siege missions normally end when the game | Siege missions normally end when the game has processed a wave with the “IsFinalWave” attribute and all enemies have been killed. If you don’t want your scenario to end like that you don’t need to ever include a wave with the “IsFinalWave” attribute, and you can use this action to end the mission instead. | ||
You could have a trigger that requires the player to kill 1,000,000 reapers, and this EndMIssion trigger only grants victory when this is done. Or if the player has survived for 15 minutes. | You could have a trigger that requires the player to kill 1,000,000 reapers, and this EndMIssion trigger only grants victory when this is done. Or if the player has survived for 15 minutes. | ||
Line 512: | Line 543: | ||
The above use of the EndMission action forces a player loss. This can be used if you want to create a special situation where the player must not allow an Outpost to be destroyed, or not allow an enemy to reach a certain area. | The above use of the EndMission action forces a player loss. This can be used if you want to create a special situation where the player must not allow an Outpost to be destroyed, or not allow an enemy to reach a certain area. | ||
'''GrantStuff'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<GrantStuff Player="0" Metal="600" /> | <GrantStuff Player="0" Metal="600" /> | ||
Line 518: | Line 549: | ||
</pre> | </pre> | ||
GrantStuff provides free metal or energy (under the covers Energy is tracked as Radioactives). The | GrantStuff provides free metal or energy (under the covers Energy is tracked as Radioactives). The free metal is used at the beginning of every mission to determine how much metal the player starts with. You can have triggers give out additional metal or energy if a certain enemy is killed, if you want to help the player out when he is getting attacked, etc. | ||
'''GrantTech'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<GrantTech Player="0" Tech="Weapons" /> | <GrantTech Player="0" Tech="Weapons" /> | ||
Line 526: | Line 557: | ||
</pre> | </pre> | ||
GrantTech provides bonuses to the specified player. Remember Player 0 is the human player and Player 1 is the AI. Granting a “Weapons” tech to the player increases the amount of damage towers do. Granting a “HPs” tech to the | GrantTech provides bonuses to the specified player. Remember Player 0 is the human player and Player 1 is the AI. Granting a “Weapons” tech to the player increases the amount of damage towers do. Granting a “HPs” tech to the AI increases the hit points of enemy ships. | ||
Granting increased HP’s to enemy ships is used frequently on the difficulty level triggers, | Granting increased HP’s to enemy ships is used frequently on the difficulty level triggers, it's also used on Endless maps to make sure the enemy waves keep getting tougher. | ||
'''QueueWave'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<QueueWave Target="Wave1"/> | <QueueWave Target="Wave1"/> | ||
</pre> | </pre> | ||
QueueWave | QueueWave was discussed in the Waves section above but it can be called from any trigger. For example, it might be interesting if the waves queued were based on the towers the player placed. So the Script was adjusting the enemies it was sending based on what the player's towers were weak against. | ||
This is also used in special triggers on some of the timed missions so that special waves get triggered when there is only 5 minutes left of the 10 minutes the player needs to survive. | This is also used in special triggers on some of the timed missions so that special waves get triggered when there is only 5 minutes left of the 10 minutes the player needs to survive. | ||
'''Restrict'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<Restrict Type="Orbital" ID="Orbital_Milton" Enable="0" Hide="0" /> | <Restrict Type="Orbital" ID="Orbital_Milton" Enable="0" Hide="0" /> | ||
Line 545: | Line 576: | ||
</pre> | </pre> | ||
Restrict can be used to enable or disable | Restrict can be used to enable or disable orbitals or towers. Enable=”1” will enable the orbital or building; and Enable=”0” disables it. Hide=”0” means that the icon will still be visible (but disabled) while Hide=”1” hides the icon for that orbital or tower. | ||
This could also be used to disable all the towers and force the player to play a mission using only orbitals. | This could also be used to disable all the towers and force the player to play a mission using only orbitals. | ||
'''SpawnUnitOnPath'''<br> | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<SpawnUnitOnPath Name="Parent" Template="Unit_Normal" Player="1" Path="Path-South" /> | <SpawnUnitOnPath Name="Parent" Template="Unit_Normal" Player="1" Path="Path-South" /> | ||
Line 562: | Line 593: | ||
</pre> | </pre> | ||
The above trigger fires if the unit called “Egg10” is destroyed. This is one of the large eggs on Caina. If it is destroyed it will spawn a Harridan (“Unit_Spider”) and send it on Path-Egg10 (a route from the destroyed egg to the colony. | The above trigger fires if the unit called “Egg10” is destroyed. This is one of the large eggs on Caina. If it is destroyed it will spawn a Harridan (“Unit_Spider”) and send it on Path-Egg10 (a route from the destroyed egg to the colony). | ||
{{SectionTemplate | |||
= | |h=h2 | ||
|title=Putting It All Together | |||
|content= | |||
}} | |||
<pre style="color: blue"> | <pre style="color: blue"> | ||
<Mission ID="Aberny" Title="Mission_Aberny_Title" Description="Mission_Aberny_Description" Map="Aberny" | <Mission ID="Aberny" Title="Mission_Aberny_Title" Description="Mission_Aberny_Description" Map="Aberny" | ||
Line 948: | Line 981: | ||
</Mission> | </Mission> | ||
</pre> | </pre> | ||
{{SectionTemplate | |||
==Creating an Image | |h=h1 | ||
|title=Creating an Image | |||
|content= | |||
PreviewImage="Aberny.dds" | PreviewImage="Aberny.dds" | ||
Line 955: | Line 990: | ||
Preview images are .dds files. So you will need to convert the file into that format for Siege to be able to read and display it. The files go in your ../My Games/Siege of Centauri/Screenshots/ directory. I typically give them the same name as the scenario, but that isn’t required. Note that the name of the preview image is specified at the top of your mission file in the mission definition. | Preview images are .dds files. So you will need to convert the file into that format for Siege to be able to read and display it. The files go in your ../My Games/Siege of Centauri/Screenshots/ directory. I typically give them the same name as the scenario, but that isn’t required. Note that the name of the preview image is specified at the top of your mission file in the mission definition. | ||
}} | |||
Latest revision as of 20:09, 1 April 2022
Modder's Guide
|
What is a Scenario?
A scenario is a mission that you can create and share with other players. At the simplest, you can create a new map (or use an existing map) and design your own waves of enemies. At its most complex you can use the scripting system in Siege to trigger a wide variety of actions and threats for the player.
Scenarios can be easily uploaded and downloaded from the scenario workshop in Siege.
Creating a Map
The map editor is accessible from the main menu of Siege of Centauri.
Map Select
Select an existing map or select New Map. If you select New Map you will need to name the map, select a Map Size (I know everyone wants to pick the largest size, I recommend starting at 1536 for your first map) and a Terrain Type.
Once you have set those things you start with a blank map with your colony on it and lots of options.
Edit Terrain
This allows you to set the terrain you would like for areas of your map.
- Plains - This is the default flat ground enemies can travel on.
- Plateau - This is where towers can be placed. It is elevated above Plains.
- Mountains - Mountains are impassable by ground units and can block shots from direct fire weapons.
- Basin - Basins are impassable by ground units.
Edit Buildings
- Relay - Relay’s connect paths for unit movement.
- Metal Refinery - This produces metal for the player.
- Fission Reactor - This produces energy for the player.
- Outpost - Players get a score boost for each surviving Outpost when they complete the Mission.
- Storage Cell - Storage cells explode when clicked on, but they can only be used once.
- Dead Region - This marks an area that can’t be entered (to block relays from connecting over mountains, basins, etc).
Edit Cosmetic
Depending on the environment, different cosmetic layers may use different textures. For example, on arctic one cosmetic layer is a snowy ground, while another is clear dirt. Play with the layers to find the one you want.
Edit Effects
Effect layer 1 is Ground Fog. Typically we use to fill in the basins and give them life, but you can use it anywhere if you want to create foggy paths. More advanced modders can edit their MapEffects.csv file to use any effect in Siege for these layers; but the default is just for ground fog.
Brush Size
Set it large if you want to paint a wide area quickly, set it small if you want to get into the finer details.
Rebuild Terrain
This will cause the game to generate the map based on everything you have set. It may take a few minutes to do based on the size of your map and the power of your computer.
Toggle Display Mode
After you “Rebuild Terrain” this toggle will let you switch between the graphical mode (seeing the map like you would in game), editor mode (seeing the regions clearly as when you start the map editor) and a mixed mode that blends them together. Personally, I stay in the data mode almost all of the time but it’s nice to switch over to the graphical view to see if a basin looks weird, if a path looks wide enough, etc.
After rebuilding the terrain it will automatically switch to graphical mode so you will want to press this button to switch back to editor mode.
Enable Symmetry
This allows you to select a wide variety of symmetrical options if you want to make sure whatever you are painting is perfectly symmetrical (for example if you want mirrored paths coming in from each side).
Environment Toggle
This allows you to switch the environment of your map, from frozen, desert, volcanic, etc. This is most useful after rebuilding the terrain while you are in the Graphical Mode so you can see what the changed environment looks like.
Toggle Mouse Position
This shows you the map coordinates of the cursor position. This is very important later on when we are making the mission.
Pro Tip: Write down the coordinates of important locations so you have them ready when you go to make your mission. You will want the coordinates of the places you want enemies to enter from, the coordinates of the colony and other buildings, as well as any other special locations you might want to send enemies to, or trigger actions at.
Creating a Mission
The best resource for creating your own mission are the missions that come with the game. They are all in exactly the format you need and will give you lots of examples of how the designers made all the campaign missions work. Check them all out in the ..\Siege of Centauri\Assets\Campaign\AtlasProject\ directory.
The Mission File
This is an XML file and it can be made with any text editor, even notepad. I use Notepad++.
Create the file and save it in the ..\My Games\Siege of Centauri\Scenario\ directory. Name it the same as your scenario. In this example I’m creating a scenario called “Aberny”. Note I called my Map “Aberny”, my Mission “Aberny”, and the Scenario will be called “Aberny”. They don’t need to be the same - it was just convenient.
<Mission ID="Aberny" Title="Aberny" Description="An army approaches, but they do not target our colony." Map="Aberny" PreviewImage="Aberny.dds" NoVPVictory="1" NoSeedVictory="0" HideTerrain="0" HideDifficulty="0" HideUpgradePanel="1"> <Score Star1="0" Star2="15000" Star3="30000"/> <Player Name="You" Faction="PHC" Team="0" Color="2" StartLocation="0" AIType="Player" NoEngineer="1" /> <Player Name="Agethon" Faction="ss" Team="1" Color="4" AIType="Off" StartLocation="0" NoSeed="1" NoEngineer="1" /> </Mission>
The above is an example of a working mission (though it doesn’t do anything yet).
Mission attributes:
- ID - This needs to be unique. You may want to append your own name to it so you don’t have to worry about conflicting with someone else’s in the workshop.
- Title - The name that people will see in the workshop.
- Description - The detailed description that appears when someone clicks on this in the workshop.
- Map - The name of the map you created for this mission.
- PreviewImage - This is the picture that will be displayed in the workshop and in game. Later we will go through how to create it.
Ignore the other mission attributes and the score element. In setting up the players, the human always has to be the first player listed. The first player listed is player 0, the second player listed is player 1, etc.
Player attributes:
- Name - Not used.
- Faction - The Human player should always be “PHC”, the enemies should always be “ss”.
- Team - Typically the human player is team “0” and the AI is team “1” but if you want to create multiple players you can make more teams or put them on teams together.
- Color - Typically the human player is 2 (blue) and the AI is 4 (orange) though we do let the player change this a bit on some maps to make them more visible.
- StartLocation - This should always be set to “0”.
- AIType - The human player should be “Player” and the AI “Off”.
- NoEngineer - Always set to “1”.
- NoSeed - AI players should have this set to “1”.
Example: Warring Enemies
By creating a third player we can spawn units on another side as follows:
<Player Name="You" Faction="PHC" Team="0" Color="2" StartLocation="0" AIType="Player" NoEngineer="1" /> <Player Name="Agethon" Faction="ss" Team="1" Color="4" AIType="Off" StartLocation="0" NoSeed="1" NoEngineer="1" /> <Player Name="Decius" Faction="ss" Team="2" Color="15" AIType="Off" StartLocation="0" NoSeed="1" NoEngineer="1" />
Notice I gave the third player a new name (they have to be unique), a new team (so the Decius player isn’t allied with the human or with the AI and a new color (so the player can see that they are different from AI player “Agethon”. Now when we spawn units we can do it as either player 1 (Agethon) or player 2 (Decius) and these units will both attack the human player as well as fight with each other.
Setting Things Up
<Trigger ID="Configure" Type="Timer" Timer="0" > <HidePanel HideRank="1"/> <GrantStuff Player="0" Metal="200" /> <QueueWave Target="Wave1"/> <QueueWave Target="Wave2"/> <QueueWave Target="Wave3"/> <QueueWave Target="Wave4"/> <QueueWave Target="Wave5"/> <QueueWave Target="Wave6"/> <QueueWave Target="Wave7"/> <QueueWave Target="Wave8"/> <QueueWave Target="Wave9"/> <QueueWave Target="Wave10"/> <QueueWave Target="Wave11"/> <QueueWave Target="Wave12"/> <QueueWave Target="Wave13"/> <QueueWave Target="Wave14"/> <QueueWave Target="Wave15"/> </Trigger>
After the Mission setup we configure the starting information for the player. We will go through triggers in more detail later, but the short version is that this trigger starts the player with 200 Metal and loads in 15 waves.
Note that QueueWave puts the waves in order as they are called. In this example Wave2 won’t trigger until Wave1 is done. If you have a trigger that added QueueWave SurpriseAttack it would go at the end of all the other waves that were currently waiting in line (so in this example it would go after Wave15).
What is a Wave?
<Wave Name="Wave1" Timer="10" PortraitUnit="Unit_Normal" Description="Unit_Normal_Name" Direction="Top"> <DoWaveSpawn Target="Ping-North" /> <DoWaveSpawn Target="Normal-Spawn" /> <DoWaveSpawn Target="Normal-Spawn" Delay="1" /> <DoWaveSpawn Target="Normal-Spawn" Delay="1" /> <DoWaveSpawn Target="Normal-Spawn" Delay="1" /> <DoWaveSpawn Target="Normal-Spawn" Delay="1" /> </Wave>
The above is the definition for a wave. When the Configure trigger said to “QueueWave Target=”Wave1”, this is what it will run.
Wave
- Timer - How many second after this wave is triggered will it wait before spawning. This allows us to control the gap between waves. Do you want it to wait 90 seconds before sending the next army in, or 5 seconds?
- PortraitUnit - This is the template name of the unit you want to represent this wave in the wave panel on the top of the screen.
- Description - This is the description that will go in the wave panel for this wave.
- Direction - This can be Top, Bottom, Right, Left or any combination of them. This is what is used to set the arrows when the player mouses over the wave panel icon. If multiples are used, put a comma between them. (ex: Direction=”Right,Left”)
- RushBonus - The maximum amount of metal that can be gained by rushing this wave. Typically about 250 is good.
- RushCountdown - The countdown timer that determines how quickly to reduce the metal bonus as a wave gets closer to the time it is going to spawn. Typically 70 is good.
- Repeat - If you want this wave to repeat you can put the amount of times here. If you want it to repeat forever set it equal to Repeat=”-1”.
- RepeatTimer - If the wave is set to repeat, this is the time before it repeats. Does it repeat every 300 seconds or every 30?
- IsFinalWave - The last wave you have needs to have this set to IsFinalWave=”1”. This tells the game that no future waves are coming so it can award victory to the player if they kill all the enemies after this point.
The Wave element has DoWaveSpawn sub-elements. This is what those do.
DoWaveSpawn
- Target - This is the trigger that the DoWaveSpawn calls (we will take a look at setting these up later) that actually generates the units.
- Delay - If you want to have a delay between these DoWaveSpawns. In the above example it spawns a group of “Normal” then waits 1 second, then spawns another group.
The Ping Spawn
One of the DoWaveSpawns listed above calls “Ping-North”. This is what the game uses to put the alert on the minimap and play the audio queue that a new wave is beginning. The ping spawn is simple and just consists of a PingPath with a Path set to the path the units will be called on.
<Trigger Name="Ping-North" Type="WaveSpawn"> <PingPath Path="Path-North" /> </Trigger>
What is a Path?
<WavePath Name="Path-North" ShowInScanMode="False"> <SpawnPoint Position="64,-4032" /> <Waypoint Position="-2624,-192"/> <Waypoint Position="2752,-64"/> <Waypoint Position="-2048,2432"/> </WavePath>
A path is a set of coordinates armies will follow when they are spawned. You can setup as many paths as you would like. The above path definition has the following attributes:
WavePath
- Name - This name has to be unique. It is what PingPath uses and the SpawnUnitOnPath trigger uses.
- ShowInScanMode - This determines if this path is displayed when the player presses the Ctrl key. Typically we only set if for the paths of Air units (so the player can see the path air units will follow).
SpawnPoint
- Position - This is the starting point of the path. This is where units will be initially spawned with a SpawnUnitOnPath trigger is used or where the Ping will happen on a PingPath.
Waypoint
- Position - This is where the units will go after being spawned. They will go to each waypoint defined and attempt to reach that position before going on to the next. In most cases the only waypoint required is the colony location, but in some cases you might want to have more granular control over where they go. In the above example, the path leads to 2 other buildings before heading to the final waypoint, which is the Colony.
Spawning Units
<Trigger Name="Normal-Spawn" Type="WaveSpawn"> <SpawnUnitOnPath Name="Parent" Template="Unit_Normal_3" Player="1" Path="Path-North" /> <SpawnUnitOnPath Name="Unit" Parent="Parent" Template="Unit_Normal_3" Player="1" Path="Path-North" /> <SpawnUnitOnPath Name="Unit" Parent="Parent" Template="Unit_Normal_3" Player="1" Path="Path-North" /> </Trigger>
The above trigger is what is called from DoWaveSpawn. It is where the exact units are specified as well as the path they will travel on.
Trigger
- Name - This is the name that is called from the DoWaveSpawn trigger.
- Type - Always use “WaveSpawn” here. We will cover other types of triggers later.
SpawnUnitOnPath
- Name - We typically use “Parent” for every unit name. The only time this really matters is when you are parenting other units to this unit, or if you have a specific trigger setup (when this unit is destroyed or gets to a particular location).
- Parent - This is only needed when you are building an army where you want the units to stay together. In the example above there are 3 “Unit_Normal_3” units being spawned and the second two are following the first.
- Template - This is the unit template being used. There is a full list of the available units in Siege below.
- Player - Player 0 is always the human player (if you want to spawn some units on the player's side). Player 1 is the AI. If you add more players, they can also be referenced here.
- Path - This the path that the units will be spawned and travel on.
Available Units
- Unit_Air - Punisher, a medium strength flying unit.
- Unit_Air_Carrier - Gliding Crane, air transport which drops units at a set location.
- Unit_Air_Heavy - Harbinger, a powerful air unit that takes a lot to shoot down.
- Unit_Air_Destruction - Vulture, a powerful air unit that can destroy towers.
- Unit_Air_Swarm - Sparrow, a swarm of small flying units.
- Unit_Bomb - Falling Star, a unit that explodes when destroyed and disables surrounding towers.
- Unit_ClutchOfEggs - Clutch of Eggs, explodes and releases a swarm of Hatchlings when destroyed.
- Unit_ClutchOfEggsBaby - Hatchlings, a swarm of small spiders.
- Unit_Destructor - Destructor, a medium sized non-shielded unit.
- Unit_Speed - Taskmaster, speeds up surrounding allies.
- Unit_Fast - Capacitor, small and quick.
- Unit_FastShielded - Hooded Turbine, medium sized fast and shielded unit.
- Unit_Healer - Corrupted Healer, heals surrounding allies.
- Unit_HeartOfThePhoenix - Heart of the Phoenix, juggernaut, transforms to an egg when destroyed.
- Unit_HeartOfThePhoenix_Egg - Heart of the Phoenix egg, given enough time it will be reborn to a Heart of the Phoenix.
- Unit_HeavySwarm - Scarab, slow swarm with a lot of hit points.
- Unit_Hive - Rolling Hive, medium sized unit that produces small flying units as it goes.
- Unit_Summoner - Floating Factory, medium sized unit that gathers a swarm of Scarabs as it goes.
- Unit_Milton - Milton, everyone’s favorite death machine.
- Unit_NestOfTheQueen - Nest of the Queen, juggernaut, produces Falling Stars as it goes.
- Unit_Normal - Masochist, small, fast unit.
- Unit_Normal_3 - A group of 3 Masochists.
- Unit_Nullifier - Mobile Nullifier, medium unit that the player can’t use orbital abilities around.
- Unit_Overmind - Overmind, dreadnought with low hit points and high shields.
- Unit_Reinforcements - Reinforcements, good for soaking up some damage before being destroyed.
- Unit_Retributor - Retributor, dreadnought with high hit points and low shields.
- Unit_Shielded - Eradicator, slow unit with heavy shields.
- Unit_Spider - Harridan, organic spiders in large, quick swarms.
- Unit_Swarm - Reaper, a large group of small units.
- Unit_SwarmShielded - Martyr, a swarm of small, shielded units.
Example: A Wave of Miltons
<Trigger Name="Milton-Spawn" Type="WaveSpawn"> <SpawnUnitOnPath Name="Parent" Template="Unit_Milton" Player="0" Path="Path-North" /> </Trigger>
The above trigger will spawn Milton (Template=”Unit_Milton”) on the players side (Player=”0”) that will spawn in and follow the Path-North, attacking any enemies he encounters along the way.
Triggers
There are a wide variety of triggers to cause things to happen, or respond to things that happen. Check out the existing missions to see lots of examples of them at work.
No triggers beyond those presented above (WaveSpawn) are required to make a great scenario, but they can allow you to make your scenario unique.
Area
<Trigger Name="Carrier-Drop" Type="Area" Template="Unit_Air_Carrier" Center="-2663,-1940" Size="100"> <SpawnUnitOnPath Name="Parent" Template="Unit_Swarm" Player="1" Path=”CarrierDropPath" /> </Trigger>
Area triggers when the specified unit type comes into range. The above waits for an air transport (“Unit_Air_Carrier”) to come into range (within 100 of the -2663,-1940 coordinates). If that happens it spawns a group of Reapers (“Unit_Swarm”).
- Name - Names need to be unique.
- Type - Area in this example.
- Template - The type of unit that causes this trigger to fire.
- Center - The area that is being monitored.
- Size - The size of the area being monitored.
BuildingDestroyed
<Trigger Name="OutpostDies" Type="BuildingDestroyed" Template="Building_Outpost"> <Dialog> <Entry Character="Husk" Text="Dialog_Dule_OutpostDestroyed_Husk" /> </Dialog> </Trigger>
Triggered when a building of the specified type is destroyed. In the above example, a dialog string plays when an outpost is destroyed.
- Name - Names need to be unique.
- Type - BuildingDestroyed in this example.
- Template - The type of building whose destruction will fire this trigger. Check BuildingTemplates.csv for a full list of all the building template types.
BuildingStarted
<Trigger Name="BuiltBomb2" Type="BuildingStarted" Template="Bomb_Seed2" IsBuilding="1"> <Dialog> <Entry Character="Milton" Text="Dialog_Sedge_Bomb2_Milton" /> </Dialog> </Trigger>
Triggered when a building starts being built. In the above example it triggers a dialog when the player upgrades to Bomb_Seed2.
- Name - Names need to be unique.
- Type - BuildingStarted in this example.
- Template - The template name for the building being built. Check BuildingTemplates.csv for a full list of all the building template types.
- IsBuilding - Set to 1 to force it to trigger on building.
DamageDealt
<Trigger Name="SpiderEnemy" Type="DamageDealt" TargetTemplate="Unit_Spider"> <AttackAttackMove Name="Spider1" Position="0,4891"/> <DeactivateTrigger Target="SpiderAlly" /> </Trigger>
Triggered when the specified unit type is dealt damage. In this case, if a Harridan (Unit_Spider) is damaged it causes them to attack position 0,4891 (the location of the colony). It also disables the trigger after it fires (so it won’t fire again).
- Name - Names need to be unique.
- Type - DamageDealt in this example.
- TargetTemplate - The template name of the unit whose damage will fire this trigger.
GameplayTimerExpired
<Trigger Name="Victory" Type="GameplayTimerExpired" Target="VictoryTimer"> <EndMission Victory="1" String="Mission_VictoryString"/> </Trigger>
Used to respond to the CreateGameplayTimer. In the above example, if the VictoryTimer runs out then the player wins the game.
- Name - Names need to be unique.
- Type - GameplayTimerExpired in this example.
- Target - The name of the timer being monitored.
SpecialAbility
<Trigger Name="MiltonTrigger" Type="SpecialAbility" Template="Orbital_Milton" > <AreaIndicator Name="Milton_Highlight" Duration="0" /> </Trigger>
Triggers when a special ability is used. In the above, it deletes an AreaIndicator when the player uses the Milton orbital ability.
- Name - Names need to be unique.
- Type - SpecialAbility in this example.
- Template - The template name of the special ability: Orbital_Lure, Orbital_EMP, Orbital_Milton, Orbital_Kill, Orbital_OrbitalStrike, Orbital_Overcharge, Orbital_Reinforce, Orbital_RushWave or Orbital_Teleport.
Timer
<Trigger Name="HPBoost" Type="Timer" Timer="10" Inactive="1"> <GrantTech Player="1" Tech="HPs" /> <ActivateTrigger Target="HPBoost" /> </Trigger>
A timer trigger fires when the amount of seconds pass that are set in the Timer attribute. In the above example, the timer starts disabled (Inactive=”1”), so it has to be activated by another trigger before it will start its 10 second countdown (Timer=”10”). It then grants a HP boost to the AI player (Player=”1”) and calls itself. So it will continue to grant a HP boost to the AI player every 10 seconds until the mission ends.
- Name - Names need to be unique.
- Type - Timer in this example.
- Timer - The amount of seconds that need to pass before this trigger fires.
- Inactive - Timer triggers start enabled by default, setting this to 1 means that another trigger needs to ActivateTrigger this one before it starts its countdown.
UnitDestroyed
<Trigger Name="HeartDies" Type="UnitDestroyed" Template="Unit_HeartOfThePhoenix_Egg" > <ActivateTrigger Target="HPBoost"/> </Trigger>
In the Timer description we saw a trigger that needed to be activated by another trigger. This trigger fires when the specified unit is destroyed, in this case a Heart of the Phoenix Egg (Template=”Unit_HeartOfThePhoenix_Egg”). Once it is destroyed it activates the HPBoost trigger.
- Name - Names need to be unique.
- Type - UnitDestroyed in this example.
- Template - The template type of unit that will cause this trigger to fire when it is destroyed.
Var
<Trigger Type="Var" Var="ReinforceCount" Value="3" Operator=">="> <Restrict Type="Orbital" ID="Orbital_Reinforce" Enable="0" Hide="0" /> <DeactivateTrigger Target="ReinforceTrigger" /> </Trigger>
Var triggers fire when a variable meets the criteria. In the above example it triggers when the “ReinforceCount” variable gets to 3 (Value=”3”) or higher (Operator=”>=”). This doesn’t do much good unless we have a ReinforceCount variable and something that is incrementing it. Something like the following:
<Trigger Name="ReinforceTrigger" Type="SpecialAbility" Template="Orbital_Reinforce" > <Var Name="ReinforceCount" Operation="+" Value="1" /> </Trigger>
This SpecialAbility trigger increments the ReinforceTrigger count each time the player uses the Reinforce ability.
Used together, the counter goes up each time the player uses Reinforce. But when the player uses it for the 3rd time, it disables the Reinforce ability for the rest of the mission (or at least until a script turns it back on).
WaveStarted
<Trigger Name="Wave2Started" Type="WaveStarted" Target="Wave2"> <Dialog> <Entry Character="Husk" Text="The tight pathways of this sector are ideal for the /color:EEBeige/Corrosion Mortar/endcolor/. It can fire over terrain and soften up the enemy with damage over time." /> </Dialog> </Trigger>
This trigger fires when the specified wave starts. In the example, it triggers a dialog when Wave2 (Target=”Wave2”) begins.
- Name - Names need to be unique.
- Type - WaveStarted in this example.
- Target - The name of the Wave that will cause this trigger to fire.
Actions
Actions are script commands that cause something to happen. Where a Trigger controls when it happens, an Action is the actual thing that affects the game. Actions are usually inside of triggers as in the following:
<Trigger Name="Wave2Started" Type="WaveStarted" Target="Wave2"> <Dialog> <Entry Character="Husk" Text="The tight pathways of this sector are ideal for the /color:EEBeige/Corrosion Mortar/endcolor/. It can fire over terrain and soften up the enemy with damage over time." /> </Dialog> </Trigger>
The above reads as: when the “WaveStarted” trigger fires, the Dialog action occurs.
Triggers can contain multiple actions such as:
<Trigger Type="Var" Var="ReinforceCount" Value="3" Operator=">="> <Restrict Type="Orbital" ID="Orbital_Reinforce" Enable="0" Hide="0" /> <DeactivateTrigger Target="ReinforceTrigger" /> </Trigger>
The above reads as: when the “ReinforceCount” variable gets to 3 or higher, it will disable the Reinforcements orbital ability and deactivate the “ReinforceTrigger” trigger.
ActivateTrigger
<ActivateTrigger Target="HPBoost" />
Triggers can be scripted to be inactive such as with the following:
<Trigger Name="HPBoost" Type="Timer" Timer="10" Inactive="1"> <GrantTech Player="1" Tech="HPs" /> <ActivateTrigger Target="HPBoost" /> </Trigger>
Triggers also deactivate after firing. So if you have a timer trigger that goes off after 10 seconds, it will fire after 10 seconds then mark itself as inactive.
The ActivateTrigger action marks these triggers as active again. It is commonly used to cause triggers to repeat, or to have other triggers start working after a certain condition has been met (for example, if you want to start spawning new waves after the player upgrades his colony).
AreaIndicator
<AreaIndicator Name="Milton_Highlight" Position="704,-128,0" Color="Blue" Size="100" Duration="-1" />
This puts a UI element on the ground at the position indicated. We use it in one of the missions as a tutorial element to help the player know where there is a good place to put Milton. You can update the specific AreaIndicator by passing in new attributes with the same Name. Duration of -1 means that it will last forever. If you want to turn it off, pass in a Duration of 0.
CreateGameplayTimer
<CreateGameplayTimer Name="VictoryTimer" Time="600"/>
This creates a gameplay timer that you can trigger off of with the GameplayTimerExpired trigger. You could, for example, give the player 60 seconds to place towers and then disable all towers afterwards.
This is also commonly used with the GameplayTimerExpired trigger and the EndMission action to allow the player to win if he survives for N minutes.
DeactivateTrigger
<DeactivateTrigger Target="ReinforceTrigger" />
This is the opposite of the ActivateTrigger function; it can deactivate any trigger. For example, if you have a trigger that spawns an enemy wave every 15 seconds as long as an enemy building exists, you could have the destruction of that building deactivate the unit spawning trigger.
Dialog
<Trigger Name="OutpostDies" Type="BuildingDestroyed" Template="Building_Outpost"> <Dialog> <Entry Character="Husk" Text="The first Outpost has been destroyed. Expect them to focus on the other Outpost and the Colony next." /> </Dialog> </Trigger>
This creates a dialog popup. Entry characters can be “Husk”, “Zhukov”, “Milton”, “Persephone” or “Haalee”.
EndMission
<EndMission Victory="1" String="Mission_VictoryString"/>
Siege missions normally end when the game has processed a wave with the “IsFinalWave” attribute and all enemies have been killed. If you don’t want your scenario to end like that you don’t need to ever include a wave with the “IsFinalWave” attribute, and you can use this action to end the mission instead.
You could have a trigger that requires the player to kill 1,000,000 reapers, and this EndMIssion trigger only grants victory when this is done. Or if the player has survived for 15 minutes.
<EndMission Victory="0" String="EndGameResult_Seed_Lose" />
The above use of the EndMission action forces a player loss. This can be used if you want to create a special situation where the player must not allow an Outpost to be destroyed, or not allow an enemy to reach a certain area.
GrantStuff
<GrantStuff Player="0" Metal="600" /> <GrantStuff Player="0" Radioactives="100" />
GrantStuff provides free metal or energy (under the covers Energy is tracked as Radioactives). The free metal is used at the beginning of every mission to determine how much metal the player starts with. You can have triggers give out additional metal or energy if a certain enemy is killed, if you want to help the player out when he is getting attacked, etc.
GrantTech
<GrantTech Player="0" Tech="Weapons" /> <GrantTech Player="1" Tech="HPs" />
GrantTech provides bonuses to the specified player. Remember Player 0 is the human player and Player 1 is the AI. Granting a “Weapons” tech to the player increases the amount of damage towers do. Granting a “HPs” tech to the AI increases the hit points of enemy ships.
Granting increased HP’s to enemy ships is used frequently on the difficulty level triggers, it's also used on Endless maps to make sure the enemy waves keep getting tougher.
QueueWave
<QueueWave Target="Wave1"/>
QueueWave was discussed in the Waves section above but it can be called from any trigger. For example, it might be interesting if the waves queued were based on the towers the player placed. So the Script was adjusting the enemies it was sending based on what the player's towers were weak against.
This is also used in special triggers on some of the timed missions so that special waves get triggered when there is only 5 minutes left of the 10 minutes the player needs to survive.
Restrict
<Restrict Type="Orbital" ID="Orbital_Milton" Enable="0" Hide="0" /> <Restrict Type="Building" ID="Building_Lightning1" Enable="0" Hide="0" />
Restrict can be used to enable or disable orbitals or towers. Enable=”1” will enable the orbital or building; and Enable=”0” disables it. Hide=”0” means that the icon will still be visible (but disabled) while Hide=”1” hides the icon for that orbital or tower.
This could also be used to disable all the towers and force the player to play a mission using only orbitals.
SpawnUnitOnPath
<SpawnUnitOnPath Name="Parent" Template="Unit_Normal" Player="1" Path="Path-South" />
SpawnUnitOnPath was discussed in the Units section of this guide but it can also be called from special triggers.
<Trigger Name="Egg10Death" Type="UnitDestroyed" UnitName="Egg10"> <SpawnUnitOnPath Name="Parent" Template="Unit_Spider" Player="1" Path=”Path-Egg10” /> </Trigger>
The above trigger fires if the unit called “Egg10” is destroyed. This is one of the large eggs on Caina. If it is destroyed it will spawn a Harridan (“Unit_Spider”) and send it on Path-Egg10 (a route from the destroyed egg to the colony).
Putting It All Together
<Mission ID="Aberny" Title="Mission_Aberny_Title" Description="Mission_Aberny_Description" Map="Aberny" PreviewImage="Aberny.dds" NoVPVictory="1" NoSeedVictory="0" HideTerrain="0" HideDifficulty="0" HideUpgradePanel="1" > <Score Star1="0" Star2="15000" Star3="30000"/> <Player Name="You" Faction="PHC" Team="0" Color="2" StartLocation="0" AIType="Player" NoEngineer="1" /> <Player Name="Agethon" Faction="ss" Team="1" Color="4" AIType="Off" StartLocation="0" NoSeed="1" NoEngineer="1" /> <Trigger ID="Configure" Type="Timer" Timer="0" > <HidePanel HideRank="1"/> <GrantStuff Player="0" Metal="200" /> <QueueWave Target="Wave1"/> <QueueWave Target="Wave2"/> <QueueWave Target="Wave3"/> <QueueWave Target="Wave4"/> <QueueWave Target="Wave5"/> <QueueWave Target="Wave6"/> <QueueWave Target="Wave7"/> <QueueWave Target="Wave8"/> <QueueWave Target="Wave9"/> <QueueWave Target="Wave10"/> <QueueWave Target="Wave11"/> <QueueWave Target="Wave12"/> <QueueWave Target="Wave13"/> <QueueWave Target="Wave14"/> <QueueWave Target="Wave15"/> </Trigger> <Wave Name="Wave1" Timer="10" PortraitUnit="Unit_Normal" Description="Unit_Normal_Name" Direction="Top"> <DoWaveSpawn Target="Ping-North" /> <DoWaveSpawn Target="Normal-Spawn" /> <DoWaveSpawn Target="Normal-Spawn" Delay="1" /> <DoWaveSpawn Target="Normal-Spawn" Delay="1" /> <DoWaveSpawn Target="Normal-Spawn" Delay="1" /> <DoWaveSpawn Target="Normal-Spawn" Delay="1" /> </Wave> <Wave Name="Wave2" Timer="45" PortraitUnit="Unit_Bomb" Description="Unit_Bomb_Name" Direction="Top" RushBonus="250" RushCountdown="70"> <DoWaveSpawn Target="Ping-North" /> <DoWaveSpawn Target="Bomb-Spawn" /> </Wave> <Wave Name="Wave3" Timer="30" PortraitUnit="Unit_Destructor" Description="Unit_Destructor_Name" Direction="Top" RushBonus="350" RushCountdown="70"> <DoWaveSpawn Target="Ping-North" /> <DoWaveSpawn Target="Destructor-Spawn" /> <DoWaveSpawn Target="Destructor-Spawn" Delay="2" /> <DoWaveSpawn Target="Destructor-Spawn" Delay="2" /> <DoWaveSpawn Target="Destructor-Spawn" Delay="2" /> <DoWaveSpawn Target="Destructor-Spawn" Delay="2" /> </Wave> <Wave Name="Wave4" Timer="45" PortraitUnit="Unit_Healer" Description="Unit_Healer_Name" Direction="Top" RushBonus="350" RushCountdown="70"> <DoWaveSpawn Target="Ping-North" /> <DoWaveSpawn Target="Healer-Spawn" /> <DoWaveSpawn Target="Healer-Spawn" Delay="2" /> <DoWaveSpawn Target="Healer-Spawn" Delay="2" /> <DoWaveSpawn Target="Healer-Spawn" Delay="2" /> <DoWaveSpawn Target="Healer-Spawn" Delay="2" /> <DoWaveSpawn Target="Healer-Spawn" Delay="2" /> <DoWaveSpawn Target="Healer-Spawn" Delay="2" /> </Wave> <Wave Name="Wave5" Timer="60" PortraitUnit="Unit_Fast" Description="Unit_Fast_Name" Direction="Top" RushBonus="350" RushCountdown="70"> <DoWaveSpawn Target="Ping-North" /> <DoWaveSpawn Target="Fast-Spawn" /> <DoWaveSpawn Target="Fast-Spawn" Delay="2" /> <DoWaveSpawn Target="Fast-Spawn" Delay="2" /> <DoWaveSpawn Target="Fast-Spawn" Delay="2" /> <DoWaveSpawn Target="Fast-Spawn" Delay="2" /> <DoWaveSpawn Target="Fast-Spawn" Delay="2" /> <DoWaveSpawn Target="Fast-Spawn" Delay="2" /> </Wave> <Wave Name="Wave6" Timer="70" PortraitUnit="Unit_Summoner" Description="Unit_Summoner_Name" Direction="Top" RushBonus="350" RushCountdown="70"> <DoWaveSpawn Target="Ping-North" /> <DoWaveSpawn Target="Summoner-Spawn" /> <DoWaveSpawn Target="Summoner-Spawn" Delay="7" /> <DoWaveSpawn Target="Summoner-Spawn" Delay="7" /> </Wave> <Wave Name="Wave7" Timer="80" PortraitUnit="Unit_Bomb" Description="Unit_Bomb_Name" Direction="Top" RushBonus="350" RushCountdown="70"> <DoWaveSpawn Target="Ping-North" /> <DoWaveSpawn Target="Bomb-Spawn" /> <DoWaveSpawn Target="Bomb-Spawn" Delay="4" /> <DoWaveSpawn Target="Bomb-Spawn" Delay="4" /> <DoWaveSpawn Target="Bomb-Spawn" Delay="4" /> <DoWaveSpawn Target="Bomb-Spawn" Delay="4" /> </Wave> <Wave Name="Wave8" Timer="90" PortraitUnit="Unit_Shielded" Description="Unit_Shielded_Name" Direction="Top" RushBonus="350" RushCountdown="70"> <DoWaveSpawn Target="Ping-North" /> <DoWaveSpawn Target="Shielded-Spawn" /> <DoWaveSpawn Target="Normal-Spawn" /> <DoWaveSpawn Target="Shielded-Spawn" Delay="4" /> <DoWaveSpawn Target="Normal-Spawn" /> <DoWaveSpawn Target="Shielded-Spawn" Delay="4" /> <DoWaveSpawn Target="Normal-Spawn" /> <DoWaveSpawn Target="Shielded-Spawn" Delay="4" /> <DoWaveSpawn Target="Normal-Spawn" /> <DoWaveSpawn Target="Shielded-Spawn" Delay="4" /> </Wave> <Wave Name="Wave9" Timer="100" PortraitUnit="Unit_HeavySwarm" Description="Unit_HeavySwarm_Name" Direction="Top" RushBonus="350" RushCountdown="70"> <DoWaveSpawn Target="Ping-North" /> <DoWaveSpawn Target="HeavySwarm-Spawn" /> <DoWaveSpawn Target="HeavySwarm-Spawn" Delay="2" /> <DoWaveSpawn Target="HeavySwarm-Spawn" Delay="2" /> <DoWaveSpawn Target="HeavySwarm-Spawn" Delay="2" /> <DoWaveSpawn Target="HeavySwarm-Spawn" Delay="2" /> <DoWaveSpawn Target="HeavySwarm-Spawn" Delay="2" /> <DoWaveSpawn Target="HeavySwarm-Spawn" Delay="2" /> <DoWaveSpawn Target="HeavySwarm-Spawn" Delay="2" /> <DoWaveSpawn Target="HeavySwarm-Spawn" Delay="2" /> <DoWaveSpawn Target="HeavySwarm-Spawn" Delay="2" /> </Wave> <Wave Name="Wave9" Timer="100" PortraitUnit="Unit_SwarmShielded" Description="Unit_SwarmShielded_Name" Direction="Top" RushBonus="350" RushCountdown="70"> <DoWaveSpawn Target="Ping-North" /> <DoWaveSpawn Target="SwarmShielded-Spawn" /> <DoWaveSpawn Target="SwarmShielded-Spawn" Delay="2" /> <DoWaveSpawn Target="SwarmShielded-Spawn" Delay="2" /> <DoWaveSpawn Target="SwarmShielded-Spawn" Delay="2" /> <DoWaveSpawn Target="SwarmShielded-Spawn" Delay="2" /> <DoWaveSpawn Target="SwarmShielded-Spawn" Delay="2" /> <DoWaveSpawn Target="SwarmShielded-Spawn" Delay="2" /> <DoWaveSpawn Target="SwarmShielded-Spawn" Delay="2" /> <DoWaveSpawn Target="SwarmShielded-Spawn" Delay="2" /> <DoWaveSpawn Target="SwarmShielded-Spawn" Delay="2" /> </Wave> <Wave Name="Wave11" Timer="70" PortraitUnit="Unit_Summoner" Description="Unit_Summoner_Name" Direction="Top" RushBonus="350" RushCountdown="70"> <DoWaveSpawn Target="Ping-North" /> <DoWaveSpawn Target="Summoner-Spawn" /> <DoWaveSpawn Target="Summoner-Spawn" Delay="3" /> <DoWaveSpawn Target="Summoner-Spawn" Delay="3" /> <DoWaveSpawn Target="Summoner-Spawn" Delay="3" /> <DoWaveSpawn Target="Summoner-Spawn" Delay="3" /> <DoWaveSpawn Target="Summoner-Spawn" Delay="3" /> <DoWaveSpawn Target="Summoner-Spawn" Delay="3" /> <DoWaveSpawn Target="Summoner-Spawn" Delay="3" /> <DoWaveSpawn Target="Summoner-Spawn" Delay="3" /> <DoWaveSpawn Target="Summoner-Spawn" Delay="3" /> </Wave> <Wave Name="Wave12" Timer="90" PortraitUnit="Unit_Bomb" Description="Unit_Bomb_Name" Direction="Top" RushBonus="350" RushCountdown="70"> <DoWaveSpawn Target="Ping-North" /> <DoWaveSpawn Target="Bomb-Spawn" /> <DoWaveSpawn Target="Healer-Spawn" Delay="2" /> <DoWaveSpawn Target="Bomb-Spawn" Delay="3" /> <DoWaveSpawn Target="Healer-Spawn" Delay="2" /> <DoWaveSpawn Target="Bomb-Spawn" Delay="3" /> <DoWaveSpawn Target="Healer-Spawn" Delay="2" /> </Wave> <Wave Name="Wave13" Timer="110" PortraitUnit="Unit_FastShielded" Description="Unit_FastShielded_Name" Direction="Top" RushBonus="350" RushCountdown="70"> <DoWaveSpawn Target="Ping-North" /> <DoWaveSpawn Target="FastShielded-Spawn" /> <DoWaveSpawn Target="FastShielded-Spawn" Delay="2" /> <DoWaveSpawn Target="FastShielded-Spawn" Delay="2" /> <DoWaveSpawn Target="FastShielded-Spawn" Delay="2" /> <DoWaveSpawn Target="FastShielded-Spawn" Delay="2" /> <DoWaveSpawn Target="FastShielded-Spawn" Delay="2" /> <DoWaveSpawn Target="FastShielded-Spawn" Delay="2" /> <DoWaveSpawn Target="FastShielded-Spawn" Delay="2" /> <DoWaveSpawn Target="FastShielded-Spawn" Delay="2" /> <DoWaveSpawn Target="FastShielded-Spawn" Delay="2" /> <DoWaveSpawn Target="FastShielded-Spawn" Delay="2" /> <DoWaveSpawn Target="FastShielded-Spawn" Delay="2" /> <DoWaveSpawn Target="FastShielded-Spawn" Delay="2" /> <DoWaveSpawn Target="FastShielded-Spawn" Delay="2" /> <DoWaveSpawn Target="FastShielded-Spawn" Delay="2" /> </Wave> <Wave Name="Wave14" Timer="120" PortraitUnit="Unit_HeavySwarm" Description="Unit_HeavySwarm_Name" Direction="Top" RushBonus="350" RushCountdown="70"> <DoWaveSpawn Target="Ping-North" /> <DoWaveSpawn Target="HeavySwarm-Spawn" /> <DoWaveSpawn Target="HeavySwarm-Spawn" Delay="2"/> <DoWaveSpawn Target="HeavySwarm-Spawn" Delay="2"/> <DoWaveSpawn Target="Healer-Spawn" Delay="2" /> <DoWaveSpawn Target="HeavySwarm-Spawn" Delay="2"/> <DoWaveSpawn Target="HeavySwarm-Spawn" Delay="2"/> <DoWaveSpawn Target="Healer-Spawn" Delay="2" /> <DoWaveSpawn Target="HeavySwarm-Spawn" Delay="2"/> <DoWaveSpawn Target="HeavySwarm-Spawn" Delay="2"/> <DoWaveSpawn Target="HeavySwarm-Spawn" Delay="2"/> <DoWaveSpawn Target="Healer-Spawn" Delay="2" /> </Wave> <Wave Name="Wave15" Timer="130" PortraitUnit="Unit_Retributor" Description="Unit_Retributor_Name" Direction="Top" RushBonus="350" RushCountdown="70" IsFinalWave="1" > <DoWaveSpawn Target="Ping-North" /> <DoWaveSpawn Target="Retributor-Spawn" /> <DoWaveSpawn Target="Healer-Spawn" Delay="1"/> <DoWaveSpawn Target="Healer-Spawn" Delay="2"/> <DoWaveSpawn Target="Swarm-Spawn" Delay="1"/> <DoWaveSpawn Target="Swarm-Spawn" Delay="2"/> <DoWaveSpawn Target="Swarm-Spawn" Delay="2"/> <DoWaveSpawn Target="Swarm-Spawn" Delay="2"/> <DoWaveSpawn Target="Swarm-Spawn" Delay="2"/> <DoWaveSpawn Target="Swarm-Spawn" Delay="2"/> <DoWaveSpawn Target="Swarm-Spawn" Delay="2"/> </Wave> <!-- Wave Paths --> <WavePath Name="Path-North" ShowInScanMode="False"> <SpawnPoint Position="64,-4032" /> <Waypoint Position="-2624,-192"/> <Waypoint Position="2752,-64"/> <Waypoint Position="-2048,2432"/> </WavePath> <!-- Spawns --> <Trigger Name="Bomb-Spawn" Type="WaveSpawn"> <SpawnUnitOnPath Name="Parent" Template="Unit_Bomb" Player="1" Path="Path-North" /> </Trigger> <Trigger Name="Destructor-Spawn" Type="WaveSpawn"> <SpawnUnitOnPath Name="Parent" Template="Unit_Destructor" Player="1" Path="Path-North" /> </Trigger> <Trigger Name="Fast-Spawn" Type="WaveSpawn"> <SpawnUnitOnPath Name="Parent" Template="Unit_Fast" Player="1" Path="Path-North" /> </Trigger> <Trigger Name="FastShielded-Spawn" Type="WaveSpawn"> <SpawnUnitOnPath Name="Parent" Template="Unit_FastShielded" Player="1" Path="Path-North" /> </Trigger> <Trigger Name="Healer-Spawn" Type="WaveSpawn"> <SpawnUnitOnPath Name="Parent" Template="Unit_Destructor" Player="1" Path="Path-North" /> <SpawnUnitOnPath Name="Unit" Parent="Parent" Template="Unit_Healer" Player="1" Path="Path-North" /> </Trigger> <Trigger Name="HeavySwarm-Spawn" Type="WaveSpawn"> <SpawnUnitOnPath Name="Parent" Template="Unit_HeavySwarm" Player="1" Path="Path-North" /> </Trigger> <Trigger Name="Normal-Spawn" Type="WaveSpawn"> <SpawnUnitOnPath Name="Parent" Template="Unit_Normal_3" Player="1" Path="Path-North" /> <SpawnUnitOnPath Name="Unit" Parent="Parent" Template="Unit_Normal_3" Player="1" Path="Path-North" /> <SpawnUnitOnPath Name="Unit" Parent="Parent" Template="Unit_Normal_3" Player="1" Path="Path-North" /> </Trigger> <Trigger Name="Retributor-Spawn" Type="WaveSpawn"> <SpawnUnitOnPath Name="Parent" Template="Unit_Retributor" Player="1" Path="Path-North" /> </Trigger> <Trigger Name="Shielded-Spawn" Type="WaveSpawn"> <SpawnUnitOnPath Name="Parent" Template="Unit_Shielded" Player="1" Path="Path-North" /> </Trigger> <Trigger Name="Summoner-Spawn" Type="WaveSpawn"> <SpawnUnitOnPath Name="Parent" Template="Unit_Summoner" Player="1" Path="Path-North" /> </Trigger> <Trigger Name="Swarm-Spawn" Type="WaveSpawn"> <SpawnUnitOnPath Name="Parent" Template="Unit_Swarm" Player="1" Path="Path-North" /> </Trigger> <Trigger Name="SwarmShielded-Spawn" Type="WaveSpawn"> <SpawnUnitOnPath Name="Parent" Template="Unit_SwarmShielded" Player="1" Path="Path-North" /> </Trigger> <!--Ping Triggers--> <Trigger Name="Ping-North" Type="WaveSpawn"> <PingPath Path="Path-North" /> </Trigger> <!-- Difficulty Settings --> <Difficulty Name="MissionDifficulty_Difficulty0" Description="MissionDifficulty_Difficulty0_Desc" ScoreMultiplier="0.1f" ChronoRegenMultiplier="1.0f" ChronoDrainMultiplier="0.0f" SpawnCountLimit="16" /> <Difficulty Name="MissionDifficulty_Difficulty1" Description="MissionDifficulty_Difficulty1_Desc" ScoreMultiplier="0.25f" ChronoRegenMultiplier="1.0f" ChronoDrainMultiplier="0.25f" SpawnCountLimit="24" /> <Difficulty Name="MissionDifficulty_Difficulty2" Description="MissionDifficulty_Difficulty2_Desc" ScoreMultiplier="0.5f" ChronoRegenMultiplier="1.0f" ChronoDrainMultiplier="0.5f"/> <Difficulty Name="MissionDifficulty_Difficulty3" Description="MissionDifficulty_Difficulty3_Desc" ScoreMultiplier="0.75f" ChronoRegenMultiplier="1.0f" ChronoDrainMultiplier="1.0f"/> <Difficulty Name="MissionDifficulty_Difficulty4" Description="MissionDifficulty_Difficulty4_Desc" ScoreMultiplier="1.0f" ChronoRegenMultiplier="1.0f" ChronoDrainMultiplier="1.0f"/> <Difficulty Name="MissionDifficulty_Difficulty5" Description="MissionDifficulty_Difficulty5_Desc" ScoreMultiplier="1.25f" ChronoRegenMultiplier="1.0f" ChronoDrainMultiplier="1.0f"/> <Difficulty Name="MissionDifficulty_Difficulty6" Description="MissionDifficulty_Difficulty6_Desc" ScoreMultiplier="1.5f" ChronoRegenMultiplier="0.5f" ChronoDrainMultiplier="1.0f"/> <Difficulty Name="MissionDifficulty_Difficulty7" Description="MissionDifficulty_Difficulty7_Desc" ScoreMultiplier="1.75f" ChronoRegenMultiplier="0.25f" ChronoDrainMultiplier="1.0f"/> <Difficulty Name="MissionDifficulty_Difficulty8" Description="MissionDifficulty_Difficulty8_Desc" ScoreMultiplier="2.0f" ChronoRegenMultiplier="0.0f" ChronoDrainMultiplier="1.0f"/> <Trigger Name="Difficulty0" Type="Difficulty" Difficulty="0" > <GrantTech Player="0" Tech="Weapons" /> <GrantTech Player="0" Tech="Weapons" /> <GrantTech Player="0" Tech="Weapons" /> <GrantTech Player="0" Tech="Weapons" /> <GrantTech Player="0" Tech="Weapons" /> <GrantTech Player="0" Tech="Weapons" /> <GrantStuff Player="0" Metal="100" /> </Trigger> <Trigger Name="Difficulty1" Type="Difficulty" Difficulty="1" > <GrantTech Player="0" Tech="Weapons" /> <GrantTech Player="0" Tech="Weapons" /> <GrantTech Player="0" Tech="Weapons" /> <GrantTech Player="0" Tech="Weapons" /> <GrantTech Player="0" Tech="Weapons" /> <GrantStuff Player="0" Metal="50" /> </Trigger> <Trigger Name="Difficulty2" Type="Difficulty" Difficulty="2" > <GrantTech Player="0" Tech="Weapons" /> <GrantTech Player="0" Tech="Weapons" /> <GrantTech Player="0" Tech="Weapons" /> <GrantTech Player="0" Tech="Weapons" /> </Trigger> <Trigger Name="Difficulty3" Type="Difficulty" Difficulty="3" > <GrantTech Player="0" Tech="Weapons" /> <GrantTech Player="0" Tech="Weapons" /> </Trigger> <Trigger Name="Difficulty4" Type="Difficulty" Difficulty="4" > </Trigger> <Trigger Name="Difficulty5" Type="Difficulty" Difficulty="5" > <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> </Trigger> <Trigger Name="Difficulty6" Type="Difficulty" Difficulty="6" > <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> </Trigger> <Trigger Name="Difficulty7" Type="Difficulty" Difficulty="7" > <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> </Trigger> <Trigger Name="Difficulty8" Type="Difficulty" Difficulty="8" > <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> <GrantTech Player="1" Tech="HPs" /> </Trigger> <DefaultUpgrades > <Upgrade ID="Enable_Gun_Turret" Required="0"/> <Upgrade ID="Enable_Laser" Required="0"/> <Upgrade ID="Enable_Corrosion" Required="0"/> <Upgrade ID="Enable_Lightning_Tower" Required="0"/> <Upgrade ID="Enable_Cannon" Required="0"/> <Upgrade ID="Enable_Metal" Required="0"/> <Upgrade ID="Enable_Drone" Required="0"/> <Upgrade ID="Enable_Slow_Turret" Required="0"/> <Upgrade ID="Enable_Pulse_Cannon" Required="0"/> <Upgrade ID="Enable_Ion_Cannon" Required="0"/> <Upgrade ID="Enable_Battery" Required="0"/> <Upgrade ID="Enable_Meteor_Tower" Required="0"/> </DefaultUpgrades> </Mission>
Creating an Image
PreviewImage="Aberny.dds"
You will need to create an image for your scenario. This image will be displayed on the scenario workshop screen and on the mission screen when the player is starting your mod.
Preview images are .dds files. So you will need to convert the file into that format for Siege to be able to read and display it. The files go in your ../My Games/Siege of Centauri/Screenshots/ directory. I typically give them the same name as the scenario, but that isn’t required. Note that the name of the preview image is specified at the top of your mission file in the mission definition.