# XML/Skills

Jump to: navigation, search
 This article documents Glest, GAE, and MegaGlest This is noted in the colored backgrounds, which denote lines as being engine specific. See the key below.[Editing help]

Skills define the abilities of a unit, and are generally used with commands to provide actions that the unit can perform, but sometimes mandate automated events too, such as the death skill, which fires every time the unit dies. There can be as many skills as you want (though there can only be one of some types of skills, such as the death or be_built skill).

## Common tags for skills

Stop skill only has base abilities so this is a good example:

<skill>
<type value="stop" />
<name value="stop_skill" />
<hp-cost value="0"/>
<ep-cost value="0" />
<speed value="100" />
<anim-speed value="35" />
<animation path="models/model.g3d" />
<animation-random-cycle-maxcount value="1" />
<sound enabled="true">
<sound-file path="sounds/sound-file.wav" />
</sound>
<particles value="true" start-time="0.0" end-time="1.0">
<particle-file path="unit_particle_system.xml"/>
</particles>
<damage-particles value="true">
<particle-file path="unit_particles.xml" minHp="0" maxHp="5000"/>
</damage-particles>
<shake enabled="true" intensity="10" duration="40" start-time="0.5">
<self enabled="true" visible="true" in-camera-view="true" camera-distance-affected="true"/>
<team enabled="true" visible="true" in-camera-view="true" camera-distance-affected="true"/>
<enemy enabled="true" visible="false" in-camera-view="false" camera-distance-affected="true"/>
</shake>
<attack-boost/>
</skill>

### type

This defines the type of the skill, e.g.: stop, move, be_built.

### name

The name the skill is referenced in commands by, can be any valid variable name (starts with a letter, can contain letters, numbers, dashes, or underscores).

### hp-cost

A MegaGlest feature which allows a certain amount of HP to be depleted each time this skill is used (per skill cycle). This is currently broken.

### ep-cost

How much EP the skill will require for each cycle. If there isn't enough EP, the skill cannot be executed.

- Exception for 'Stop' skill: NEVER use EP, because if there is no EP, the fallback is a stop skill, which just won't work.

### speed

The speed that skill cycles at. Higher numbers make the skill go faster. The time it takes to perform a standard skill cycle can be found via the skill cycle formula.

- Exception for 'Be built' skill: Speed is not used here, as the time to construct the building is actually the time value, in the unit XML.

- Exception for 'Produce', 'Upgrade', 'Morph' skills: The time it takes is dependant on the time parameter, and uses the formula below. $\text{World Frames} = \text{Time} \times floor\left(\frac{1}{\left(\frac{\text{speed}}{4000}\right)} + 1\right)$

### anim-speed

The speed to play the animation at. G3DHack is capable of setting an anim-speed for testing to find the perfect speed. Note that the anim-speed should generally be a lower number than the speed, otherwise the skill cycle will be repeated multiple times for a single animation.

- Exception for 'Repair' skill: If the anim-speed is a lower number than the speed, the skill cycle will be repeated multiple times for a single animation.

### animation

The path to the G3D model that will be used when the unit is performing the skill. In MegaGlest, there can be multiples of this tag, and one will be chosen at random. You can also force a certain animation to be used when the unit's HP is between certain values with the minHp and maxHp attributes. For example, <animation path="model.g3d" minHp="0" maxHp="100" /> would force the animation model.g3d to be used when the unit's HP is between zero and 100.

### animation-random-cycle-maxcount

This optional, MegaGlest node tells the engine to cycle through the maximum specified random models. This is useful for death animations, where it can pick a random one but won't switch to another after it finishes animating. If this node does not exist the engine assume no maximum. Generally, it's only used for "one time" skills such as death or morph, while other skills would not not use the tag at all.

NOTE:This does not work for particle models.

### shake

If enabled camera shakes if skill is used. You can specify the intensity and duration. Also, you can setup different options for the player, allies and enemys. You can enable and disable each group. If visible is true the camera only shakes if the unit is visible (not hidden in fog-of-war). If in-camera-view is true the camera only shakes if the unit is in camera view. If camera-distance-affected is true the shake intensity is affected by the distance between the unit and the camera position.

### sound

If true, randomly plays one of the listed sound files every time a skill cycle commences. There can be any number of sound files, and only one will be played each time, though the choice of which is random. The path is a relative path to the sound file, which can be either OGG or WAV.

### particles

In MegaGlest you can set particles. If true, the unit will emit particles via a unit particle system. This is applied on a per skill basis, so if you want them to always be emitting the same particles, give them the same tags on every skill, except possibly be_built and die. You could also change the particles to modify the unit's appearance while doing a certain skill. For example, black smoke might turn fiery when a building is producing. There can be as many particle systems on a skill as you want, and each is placed by giving a particle-file tag the relative path of a Unit Particle XML.

MegaGlest can additionally use the start-time and end-time parameters. These are as a percentage of the animation cycle, in decimal form, so a start-time of 0.5 would mean the particles start half way through the animation.

### damage-particles

If true, these particles are displayed when the unit is damaged. You can specify the maximum and minimum HP (ie, a range) to display those particles, so you may have one particle system displayed when it is over half health, and one when it is under half health. The path links to the Unit Particle XML, and there can be as many particle-file children elements as desired.

### animation

The path to the G3D model that will be used when the unit is performing the skill.

### attack-boosts

Attack boosts are an extender which allows boosts to be applied to units when attacking, such as increasing the attacker and units near the attack's stats.

## Stop

The stop skill is used for some commands where the unit would stand still, such as attack-stopped (hold position) or stop. Generally, when a unit isn't do any action, it performs the stop action, so it is necessary that all units have a stop skill, even if they don't have a stop command.

<skill>
<type value="stop" />
<name value="stop_skill" />
<hp-cost value="0"/>
<ep-cost value="0" />
<speed value="100" />
<anim-speed value="35" />
<animation path="models/model.g3d" />
<animation-random-cycle-maxcount value="1" />
<sound enabled="true">
<sound-file path="sounds/sound-file.wav" />
</sound>
<particles value="true" start-time="0.0" end-time="1.0">
<particle-file path="unit_particle_system.xml"/>
</particles>
<damage-particles value="true">
<particle-file path="unit_particles.xml" minHp="0" maxHp="5000"/>
</damage-particles>
<shake enabled="true" intensity="10" duration="40" start-time="0.5">
<self enabled="true" visible="true" in-camera-view="true" camera-distance-affected="true"/>
<team enabled="true" visible="true" in-camera-view="true" camera-distance-affected="true"/>
<enemy enabled="true" visible="false" in-camera-view="false" camera-distance-affected="true"/>
</shake>
</skill>

## Move

The move skill is the next most commonly used, used by mobile units to be able to move from place to place. It's used in commands like attack, move, patrol, and guard.

<skill>
<type value="move" />
<name value="move_skill" />
<hp-cost value="0"/>
<ep-cost value="0" />
<speed value="275" />
<anim-speed value="250" />
<animation path="models/model.g3d" />
<animation-random-cycle-maxcount value="1" />
<sound enabled="true">
<sound-file path="sounds/sound-file.wav" />
</sound>
<particles value="true" start-time="0.0" end-time="1.0">
<particle-file path="unit_particle_system.xml"/>
</particles>
<damage-particles value="true">
<particle-file path="unit_particles.xml" minHp="0" maxHp="5000"/>
</damage-particles>
</skill>

## Be built

The be_built skill is an autoskill, meaning that it is not called by a command, but is automatically used as needed. All buildings should have a be_built skill, and it will be used to display the model while the build process takes place.

<skill>
<type value="be_built" />
<name value="be_built_skill" />
<hp-cost value="0"/>
<ep-cost value="0" />
<speed value="300" />
<anim-speed value="300" />
<animation path="models/model.g3d" />
<animation-random-cycle-maxcount value="1" />
<anim-progress-bound value="true"/>
<sound enabled="true">
<sound-file path="sounds/sound-file.wav" />
</sound>
<particles value="true" start-time="0.0" end-time="1.0">
<particle-file path="unit_particle_system.xml"/>
</particles>
<damage-particles value="true">
<particle-file path="unit_particles.xml" minHp="0" maxHp="5000"/>
</damage-particles>
</skill>

### anim-progress-bound

A value that, if true, will lock the animation speed to the progress of the unit as it builds. Thus, when the unit is half built, the animation would be halfway through, etc. This will override any specified animation speed and if not used, the entire tag may be omitted.

## Repair

Repair is used to heal units and repair buildings.

<skill>
<type value="repair" />
<name value="repair_skill" />
<hp-cost value="0"/>
<ep-cost value="0" />
<speed value="80" />
<anim-speed value="100" />
<animation path="models/model.g3d" />
<animation-random-cycle-maxcount value="1" />
<sound enabled="true">
<sound-file path="sounds/sound-file.wav" />
</sound>
<particles value="true" start-time="0.0" end-time="1.0">
<particle-file path="unit_particle_system.xml"/>
</particles>
<damage-particles value="true">
<particle-file path="unit_particles.xml" minHp="0" maxHp="5000"/>
</damage-particles>
</skill>

## Build

The build skill is used to build buildings.

<skill>
<type value="build" />
<name value="build_skill" />
<hp-cost value="0"/>
<ep-cost value="0" />
<speed value="105" />
<anim-speed value="100" />
<animation path="models/model.g3d" />
<animation-random-cycle-maxcount value="1" />
<sound enabled="true">
<sound-file path="sounds/sound-file.wav" />
</sound>
<particles value="true" start-time="0.0" end-time="1.0">
<particle-file path="unit_particle_system.xml"/>
</particles>
<damage-particles value="true">
<particle-file path="unit_particles.xml" minHp="0" maxHp="5000"/>
</damage-particles>
</skill>

## Harvest

The harvest skill is used to gather tech- and tileset-type Resources. If the resources are meant to be harvested as different mediums, you may wish to use multiple harvest skills and commands to allow you to use different models and harvest speeds.

<skill>
<type value="harvest" />
<name value="harvest_skill" />
<hp-cost value="0"/>
<ep-cost value="0" />
<speed value="225" />
<anim-speed value="100" />
<animation path="models/model.g3d" />
<animation-random-cycle-maxcount value="1" />
<sound enabled="true">
<sound-file path="sounds/sound-file.wav" />
</sound>
<particles value="true" start-time="0.0" end-time="1.0">
<particle-file path="unit_particle_system.xml"/>
</particles>
<damage-particles value="true">
<particle-file path="unit_particles.xml" minHp="0" maxHp="5000"/>
</damage-particles>
</skill>

## Produce

The produce skill is used to produce units. This is most commonly done from a building, but can be done by mobile units too, such as how Magic's summoner works.

<skill>
<type value="produce" />
<name value="produce_skill" />
<hp-cost value="0"/>
<ep-cost value="0" />
<speed value="300" />
<anim-speed value="100" />
<animation path="models/model.g3d" />
<animation-random-cycle-maxcount value="1" />>
<anim-progress-bound value="true"/>
<sound enabled="true">
<sound-file path="sounds/sound-file.wav" />
</sound>
<particles value="true" start-time="0.0" end-time="1.0">
<particle-file path="unit_particle_system.xml"/>
</particles>
<damage-particles value="true">
<particle-file path="unit_particles.xml" minHp="0" maxHp="5000"/>
</damage-particles>
</skill>

### anim-progress-bound

A GAE and MegaGlest only value that, if true, will lock the animation speed to the progress of the production as it completes. Thus, when the production is half complete, the animation would be halfway through, etc. This will override any specified animation speed and if not used, the entire tag may be omitted.

## Upgrade

Skill used for the upgrade command. Unlike production, upgrades are one time events which can increase stats or unlock units (by having a unit use an upgrade-requirement).

<skill>
<type value="upgrade" />
<name value="upgrade_skill" />
<hp-cost value="0"/>
<ep-cost value="0" />
<speed value="300" />
<anim-speed value="300" />
<animation path="models/model.g3d" />
<animation-random-cycle-maxcount value="1" />
<anim-progress-bound value="true"/>
<sound enabled="true">
<sound-file path="sounds/sound-file.wav" />
</sound>
<particles value="true" start-time="0.0" end-time="1.0">
<particle-file path="unit_particle_system.xml"/>
</particles>
<damage-particles value="true">
<particle-file path="unit_particles.xml" minHp="0" maxHp="5000"/>
</damage-particles>
</skill>

### anim-progress-bound

A value that, if true, will lock the animation speed to the progress of the upgrade as it completes. Thus, when the upgrade is half complete, the animation would be halfway through, etc. This will override any specified animation speed and if not used, the entire tag may be omitted.

## Morph

Similar to the produce skill, but rather than creating a new unit, it turns the current unit into a new unit.

<skill>
<type value="morph" />
<name value="morph_skill" />
<hp-cost value="0"/>
<ep-cost value="0" />
<speed value="500" />
<anim-speed value="200" />
<animation path="models/model.g3d" />
<animation-random-cycle-maxcount value="1" />
<anim-progress-bound value="true"/>
<sound enabled="true">
<sound-file path="sounds/sound-file.wav" />
</sound>
<particles value="true" start-time="0.0" end-time="1.0">
<particle-file path="unit_particle_system.xml"/>
</particles>
<damage-particles value="true">
<particle-file path="unit_particles.xml" minHp="0" maxHp="5000"/>
</damage-particles>
</skill>

### anim-progress-bound

A value that, if true, will lock the animation speed to the progress of the unit as it morphs. Thus, when the unit is half morphed, the animation would be halfway through, etc. This will override any specified animation speed and if not used, the entire tag may be omitted.

## Attack

Attacks are the most complex skills, but also have the largest area of customizability. All types of attacks, long ranged, melee, splash attacks, etc all use the same attack skill and are defined via its elements.

<skill>
<type value="attack"/>
<name value="attack_skill"/>
<hp-cost value="0"/>
<ep-cost value="50"/>
<speed value="80"/>
<anim-speed value="80"/>
<animation path="models/model.g3d"/>
<animation-random-cycle-maxcount value="1" />
<sound enabled="true" start-time="0.5">
<sound-file path="sounds/sound-file.wav" />
</sound>
<unit value="unit_name" amount="1" spawnAtTarget="true"/>
<attack-strenght value="150"/>
<attack-var value="50"/>
<attack-range value="8"/>
<attack-type value="attack_type"/>
<attack-fields>
<field value="land"/>
</attack-fields>
<attack-start-time value="0"/>
<projectile value="true">
<particle value="true" path="particle_proj.xml"/>
<sound enabled="true">
<sound-file path="sound/sound.wav"/>
</sound>
</projectile>
<splash value="true">
<radius value="3"/>
<damage-all value="true"/>
<particle value="true" path="particle_splash.xml"/>
</splash>
<particles value="true" start-time="0.0" end-time="1.0">
<particle-file path="unit_particle_system.xml"/>
</particles>
<damage-particles value="true">
<particle-file path="unit_particles.xml" minHp="0" maxHp="5000"/>
</damage-particles>
</skill>

### Alternative way to handle multiple projectiles: ( Megaglest>3.9.1 )

<skill>
<type value="attack"/>
<name value="attack_skill"/>
<ep-cost value="0"/>
<speed value="100"/>
<anim-speed value="100"/>
<animation path="models/laserspider_attack.g3d"/>
<sound enabled="true" start-time="0.25">
<sound-file path="sounds/shot.ogg"/>
</sound>
<sound enabled="true" start-time="0.7">
<sound-file path="sounds/shot.ogg"/>
</sound>
<attack-strenght value="90"/>
<attack-var value="40"/>
<attack-range value="20"/>
<attack-type value="bite"/>
<attack-fields>
<field value="land"/>
</attack-fields>
<attack-start-time value="0.25"/>

<projectiles>
<projectile attack-start-time="0.25" damage-percentage="10">
<particle path="particle_proj2.xml"/>
<hitsound enabled="true">
<sound-file path="sounds/bug1.wav"/>
</hitsound>
<hitshake enabled="true" intensity="1000" duration="40" visible="true" in-camera-view="false" camera-distance-affected="false"/>
<unit value="unit_name" amount="1" spawnAtTarget="true"/>
</projectile>
<projectile attack-start-time="0.7" damage-percentage="90">
<particle value="true" path="particle_proj.xml"/>
<hitsound enabled="true">
<sound-file path="sounds/bug1.wav"/>
</hitsound>
</projectile>
</projectiles>
<splash value="true">
<radius value="3"/>
<damage-all value="false"/>
<particle value="true" path="particle_splash.xml"/>
</splash>
<hitsound enabled="true">
<sound-file path="sounds/daemon_die3.wav"/>
</hitsound>
</skill>

### unit

A MegaGlest only feature which spawns a unit of the specified name and quantity each time this attack is commenced. If this feature is not used, the tag should be excluded completely. Currently, it is not checked if the spawned units are dead before creating more. This feature is most useful for creating a custom unit such as a suicide bomb, or such which will destroy itself eventually. Include this in the projectile-tag to let the unit spawn when the projectile arrives at the target.

### attack-strenght

The base damage an attack will deal, in HP. Note the misspelling in the element tag, it must be spelled as "attack-strenght" in order for the tag to work.

### attack-var

This is the amount of variance that is added to the attack strenght. So if the base damage is 150, and the var is 50, it will do (150-50) - (150+50), or 100-200 damage each time. Thus, the variance creates a range of numbers from the attack-strenght variable to make the damage more random.

### attack-range

How many cell spaces away the unit can attack from. Generally, melee attacks would have a range of 1 (sometimes more for longer weapons), while range units can have as long as they like, though they can only attack enemies that are within a unit's sights.

### attack-type

The type that is assigned to the task, which must be defined in the techtree XML, and affects how the damage multiplier will impact the final damage dealt.

### attack-fields

The fields that the attack skill is capable of damaging. Either land or air, and depends on what the target unit has as their field. While GAE technically has additional fields such as any_water, they are not used for attack fields because attacks with the land field will hit such units.

### attack-start-time

Time, as a ratio of start to finish, to damage the foe after the animation has played or the attack has hit (if it's a ranged attack). This can prevent a foe from falling dead before your unit finishes his fancy back swing.

### projectiles

In MegaGlest ( version>3.9.1 ): You can have multiple projectiles and this tag surrounds them.

### projectile

If true, the attack is considered to be a ranged attack, which allows the usage of projectile particles, and effects how the foe is damaged by the attack (must be hit by either the projectile or a splash from the projectile, rather than being automatically considered hit, and the attack-start value is calculated based on the particle time rather than animation time).
MegaGlest ( version>3.9.1 ): you now can have multiple projectiles all with their own timing, individual particle system,hit sound and impact camera shake. Combined with multiple timed sounds this is good for multiple shots in oe skill. The shots damage can be given in percentage of the skill and those percents must all together sum up to 100%.

### particle

If true, the attack will use a particle system. The path is the relative path to the Projectile Particle XML. There is also a sound tag childed in here, which uses similar syntax to the other sound tag in this skill, but is the sound played when the particle hits, rather than when the attack is started (thus making it good for explosions, etc).

### splash

If true, the attack will have a splash, an area of affect when the projectile hits the area where its target was, eg: an explosion. The radius is the size, as a radius (thus, the diameter will be almost twice the size, the center is counted as part of the radius, so a 3 radius would have a 5 diameter). Damage all is a function which is meant to toggle whether or not all units (including friendly units) are hurt by the splash. Finally, a Splash Particle XML is linked to define how the splash will look.

## Die

Death is another autoskill which is executed when the unit's HP reaches zero. This is how the death animation is controlled.

<skill>
<type value="die" />
<name value="die_skill" />
<speed value="300" />
<anim-speed value="100" />
<animation path="models/model.g3d" />
<animation-random-cycle-maxcount value="1" />
<sound enabled="true">
<sound-file path="sounds/sound-file.wav" />
</sound>
<fade value="false" />
<particles value="true" start-time="0.0" end-time="1.0">
<particle-file path="unit_particle_system.xml"/>
</particles>
<damage-particles value="true">
<particle-file path="unit_particles.xml" minHp="0" maxHp="5000"/>
</damage-particles>
<spawn start-time="0.1">
<unit value="technician"/>
<amount value="1"/>
<health-percent min="80" max="100"/>
<probability value="100"/>
</spawn>
</skill>

### fade

If true, the unit's "corpse" will fade away at the end of the animation, rather than lying "dead" on the ground for a short period of time.

### spawn

If this tag exists the given number <amount> of units of type <unit> is spawned with a probability of <probability> and a predamage of <health-percent> at the given start-time ( related to the death animation playback.)