Gamedev:UnitDefs: Difference between revisions

From Spring
Jump to navigationJump to search
Flozi (talk | contribs)
Tags to highTrajectory (inclusive)
Flozi (talk | contribs)
tags to useSmoothMesh, velocity and accel units in elmo/frame
Line 172: Line 172:
* '''<code>canSelfRepair</code>''' - type: <code>bool</code> - default: <code>false</code>
* '''<code>canSelfRepair</code>''' - type: <code>bool</code> - default: <code>false</code>
: Can the builder repair itself?
: Can the builder repair itself?
* '''<code>showNanoSpray</code>''' - type: <code>bool</code> - default: <code>true</code>
: Does the builder emit OTA-style nanospray whilst constructing?
* '''<code>nanoColor</code>''' - type: <code>float[3]</code> - default: <code>{0.2, 0.7, 0.2}</code> aka green
: The RGB colour of a builders' emitted nano particles if <code>showNanoSpray</code> is <code>true</code>. Also controls the RBG colour of a unit's own nanoframe if <code>showNanoFrame</code> is <code>true</code>.
* '''<code>fullHealthFactory</code>''' - type: <code>bool</code> - default: <code>false</code>
* '''<code>fullHealthFactory</code>''' - type: <code>bool</code> - default: <code>false</code>
: If <code>true</code>, units are repaired before they are allowed to leave the factory i.e. units from this factory will be healed back to 100% health if they are damaged during construction.
: If <code>true</code>, units are repaired before they are allowed to leave the factory i.e. units from this factory will be healed back to 100% health if they are damaged during construction.


===Movement & Placement===
===Movement & Placement===
* '''<code>canHover</code>''' - type: <code>bool</code> - default: <code>false</code>
: Is the unit a hovercraft? Hovercraft can cross water of any depth without a speed penalty. Hover's must also have <code>HOVER</code> within the name of their <code>movementClass</code> (see [[Units:MoveTypes]]).
* '''<code>floater</code>''' - type: <code>bool</code> - default: <code>true</code> if the unit has the <code>waterline</code> tag, <code>false</code> otherwise
: When a mobile unit is crossing water, or a structure is placed on water, does it float on top of the water or crawl / lay on the sea bed?
* '''<code>upright</code>''' - type: <code>bool</code> - default: <code>false</code>
* '''<code>upright</code>''' - type: <code>bool</code> - default: <code>false</code>
: Does the unit follow the terrain or always remain upright? Generally used for walkers.
: Does the unit follow the terrain or always remain upright? Generally used for walkers.
Line 192: Line 200:
: Can the unit be issued Guard orders?
: Can the unit be issued Guard orders?
* '''<code>maxVelocity</code>''' - type: <code>float</code> - default: <code>0.0</code>
* '''<code>maxVelocity</code>''' - type: <code>float</code> - default: <code>0.0</code>
: The maximum speed attainable by the unit. Units are in map grids per second, where 1 map grid = 16 [[elmos]]. If the value is -ve, the absolute value is used.
: The maximum speed attainable by the unit in [[elmos]] per frame. If the value is -ve, the absolute value is used.
* '''<code>maxReverseVelocity</code>''' - type: <code>float</code> - default: <code>0.0</code>
* '''<code>maxReverseVelocity</code>''' - type: <code>float</code> - default: <code>0.0</code>
: The maximum speed attainable by the unit in reverse. Units are in map grids per second, where 1 map grid = 16 [[elmos]]. If the value is -ve, the absolute value is used.
: The maximum speed attainable by the unit in reverse in [[elmos]] per frame. If the value is -ve, the absolute value is used.
* '''<code>acceleration</code>''' - type: <code>float</code> - default: <code>0.5</code>
* '''<code>acceleration</code>''' - type: <code>float</code> - default: <code>0.5</code>
: The acceleration of the unit, in map grids per second<sup>2</sup>, where 1 map grid = 16 [[elmos]]. If the value is -ve, the absolute value is used.
: The acceleration of the unit, in [[elmos]] per frame<sup>2</sup>. If the value is -ve, the absolute value is used.
* '''<code>brakeRate</code>''' - type: <code>float</code> - default: <code>3.0 * acceleration</code>
* '''<code>brakeRate</code>''' - type: <code>float</code> - default: <code>3.0 * acceleration</code>
: The deceleration of the unit, in map grids per second<sup>2</sup>, where 1 map grid = 16 [[elmos]]. If the value is -ve, the absolute value is used. For units with <code>canFly</code> this is multiplied by <code>0.1</code>.
: The deceleration of the unit, in [[elmos]] per frame<sup>2</sup>. If the value is -ve, the absolute value is used. For units with <code>canFly</code> this is multiplied by <code>0.1</code>.
* '''<code>turnRate</code>''' - type: <code>float</code> - default: <code>0.0</code>
* '''<code>turnRate</code>''' - type: <code>float</code> - default: <code>0.0</code>
: How fast the unit can turn. ''degrees per seconds = 0.16 * <code>turnRate</code>''
: How fast the unit can turn. ''degrees per seconds = 0.16 * <code>turnRate</code>''
Line 229: Line 237:
* '''<code>collide</code>''' - type: <code>bool</code> - default: <code>true</code>
* '''<code>collide</code>''' - type: <code>bool</code> - default: <code>true</code>
: Does the unit collide with other aircraft, or can it occupy the same space?
: Does the unit collide with other aircraft, or can it occupy the same space?
* '''<code>hoverAttack</code>''' - type: <code>bool</code> - default: <code>false</code>
: Controls whether the aircraft flys and attacks like a fighter/bomber or a helicopter/gunship.
* '''<code>airStrafe</code>''' - type: <code>bool</code> - default: <code>true</code>
: For aircraft with <code>hoverAttack = true</code>, controls if the unit strafes side to side while attacking or remains stationary.
* '''<code>cruiseAlt</code>''' - type: <code>float</code> - default: <code>0.0</code>
: The altitude in [[elmos]] which the unit attempts to fly at while cruising.
* '''<code>airHoverFactor</code>''' - type: <code>float</code> - default: <code>-1.0</code>
: For aircraft with <code>hoverAttack = true</code>, less then <code>0</code> means it can land and >= <code>0</code> indicates how much the unit will move during hovering on the spot.
* '''<code>bankingAllowed</code>''' - type: <code>bool</code> - default: <code>true</code>
: For aircraft with <code>hoverAttack = true</code>, controls whether or not the unit banks when moving turning.
* '''<code>useSmoothMesh</code>''' - type: <code>bool</code> - default: <code>true</code>
: Does the aircraft follow the real map terrain or the special smoothed out navigation mesh generated by Spring specifically for aircraft?


===Transports===
===Transports===
Line 245: Line 265:
* '''<code>highTrajectory</code>''' - type: <code>int</code> - default: <code>0</code>
* '''<code>highTrajectory</code>''' - type: <code>int</code> - default: <code>0</code>
: Can the unit fire it's (ballistic) weapons in a high trajectory arc? Can be <code>0</code> - Low trajectory only, <code>1</code> - High trajectory only, or <code>2</code> - Toggle button.
: Can the unit fire it's (ballistic) weapons in a high trajectory arc? Can be <code>0</code> - Low trajectory only, <code>1</code> - High trajectory only, or <code>2</code> - Toggle button.
* '''<code>kamikaze</code>''' - type: <code>bool</code> - default: <code>false</code>
: Does the unit attack its target by blowing itself up?
* '''<code>kamikazeDistance</code>''' - type: <code>float</code> - default: <code>0.0</code>
: How close to the target, in [[elmos]], the unit must get before detonating. Measured in 3D, not 2D.
* '''<code>kamikazeUseLOS</code>''' - type: <code>bool</code> - default: <code>false</code>
: Does the target unit have to be in LOS when detonating or only within <code>kamikazeDistance</code>.


===Other===
===Other===
Line 261: Line 287:
* '''<code>showPlayerName</code>''' - type: <code>bool</code> - default: <code>false</code>
* '''<code>showPlayerName</code>''' - type: <code>bool</code> - default: <code>false</code>
: Should the unit display it's controlling player as its name instead of <code>name</code>. Generally used for commander or hero units.
: Should the unit display it's controlling player as its name instead of <code>name</code>. Generally used for commander or hero units.
* '''<code>showNanoFrame</code>''' - type: <code>bool</code> - default: <code>true</code>
: Does the unit show an OTA-style nanoframe whilst being constructed?


===Custom Params===
===Custom Params===

Revision as of 19:28, 13 June 2011

Location

UnitDef files are .lua files stored in the Units/ directory of a Spring Game.

Purpose

UnitDef files have one purpose; to define the properties of units. They are the main description file for what attributes your unit should have and how it should behave.

Source

The engine source code which loads the tags from these files is viewable here:

https://github.com/spring/spring/blob/master/rts/Sim/Units/UnitDef.cpp

Data Types

Tags may be one of the following data types:

  • int - An integer number
  • float - A number with decimals.
  • bool - A value which can be true or false.
  • string - Text, or more precisely a string of alphanumeric characters.
  • float[3] - A vector, with three float components, representing x, y and z axes (y is 'up').

Details

There follows a comprehensive (certain deprecated tags are not present) list of the tags available, their data type, default value and a brief description of what they do. Bear in mind that the source code linked above is the ultimate reference when dealing with these tags.

In lua tables keys (i.e. the tags) should be lower case, here they are represented in camelCase for readability. In your files you may use the lowerkeys function on your final table to ensure the keys are properly cased.

General

  • name - type: string - default: ""
This is simply the name of the unit as it appears to the player.
  • description - type: string - default: name
This is the tooltip description of the unit seen by the player. It defaults to the name of the unit.
  • buildPic - type: string - default: ""
The filename of of the image to be used as the build picture.
  • maxDamage - type: float - default: 0.0
The base 'hitpoints' the unit will have.
  • autoHeal - type: float - default: 0.0
How much health the unit will regain every second.
  • idleAutoHeal - type: float - default: 10.0
How much health the unit will regain every second whilst it is idle.
  • idleTime - type: int - default: 600
The time in gameframes taken until a unit is considered to be idle.
  • buildCostMetal - type: float - default: 0.0
The amount of metal resource the unit costs to build. Defaults to 0.0 but cannot actually be below 1.0.
  • buildCostEnergy - type: float - default: 0.0
The amount of energy resource the unit costs to build.
  • buildTime - type: float - default: 0.0
The time taken to build the unit, in conjunction with the workerTime of the constructor. Effectively, Time to build = unit buildTime / constructor workerTime. Defaults to 0.0 but cannot actually be below 1.0.
  • mass - type: float - default: buildCostMetal
The mass of the unit, used in weapon impulse calculations. Any value <= 0.0 will default to the buildCostMetal.
  • reclaimable - type: bool - default: true
Can the unit be reclaimed by a builder?
  • capturable - type: bool - default: true
Can a unit be stolen by a builder using the capture command?
  • repairable - type: bool - default: true
Can the unit be repaired by a builder?
  • maxRepairSpeed - type: float - default: 1e20
The maximum cumulative speed at which this unit can be repaired.

Resources

  • metalStorage - type: float - default: 0.0
The amount of the metal resource storage the unit contributes.
  • energyStorage - type: float - default: 0.0
The amount of the energy resource storage the unit contributes.
  • extractsMetal - type: float - default: 0.0
The amount of the metal resource the unit extracts from the ground. The amount extracted depends on the metal map defined in the map itself. Works only for structures.
  • windGenerator - type: float - default: 0.0
The amount of the energy resource the unit generates which is dependant on the map wind. Works only for structures.
  • tidalGenerator - type: float - default: 0.0
The amount of the energy resource the unit generates which is dependant on the maps tidal power. Clearly, this only works on water structures.
  • metalUse - type: float - default: 0.0
The amount of the metal resource the unit consumes per game 'tick'.
  • energyUse - type: float - default: 0.0
The amount of the energy resource the unit consumes per game 'tick'.
  • metalMake - type: float - default: 0.0
The amount of the metal resource the unit generates unconditionally per game 'tick'.
  • energyMake - type: float - default: 0.0
The amount of the energy resource the unit generates unconditionally per game 'tick'.
  • makesMetal - type: float - default: 0.0
The amount of the energy resource the unit turns into the metal resource per game 'tick'.

Sensors

  • onoffable - type: bool - default: false
Does the unit have an on/off button? Currently the activation status tied to this button also turns sensors (other than LOS) on and off.
  • sightDistance - type: float - default: 0.0
The radius of the units sight (LOS is circular in Spring)
  • airSightDistance - type: float - default: 1.5 * sightDistance
How far away the unit can see aircraft (and some FX).
  • losEmitHeight - type: float - default: 20.0 New in version 0.83.x
How high up the unit is the point used to calculate it's LOS vs. the terrain?
  • radarEmitHeight - type: float - default: 20.0 New in version 0.83.x
How high up the unit is the point used to calculate it's radar vs. the terrain?
  • radarDistance - type: int - default: 0
The radius of the units radar.
  • sonarDistance - type: int - default: 0
The radius of the units sonar.
  • radarDistanceJam - type: int - default: 0
The radius of the units radar jamming.
  • sonarDistance - type: int - default: 0
The radius of the units sonar jamming.
  • stealth - type: bool - default: false
Is the unit undetectable by radar?
  • sonarStealth - type: bool - default: false
Is the unit undetectable by sonar?
  • cloakCost - type: float - default: -1.0
The energy cost per tick to cloak the unit while it is stationary. Values < 0 means the unit cannot cloak.
  • cloakCostMoving - type: float - default: cloakCost
The energy cost per tick to cloak the unit while it is moving.
  • initCloaked - type: bool - default: false
Is the unit cloaked as soon as it is created?
  • minCloakDistance - type: float - default: 0.0
The minimum distance (radius) which the unit must be from any enemy units to remain cloaked.
  • decloakSpherical - type: bool - default: true
Does minCloakDistance apply in 3D or only 2D? i.e. can aircraft flying above the unit decloak it?
  • decloakOnFire - type: bool - default: true
Does the unit deloak when it fires a weapon?
  • cloakTimeout - type: int - default: 128
The minimum time, in frames, between a decloak and subsequent re-cloak.

Commands

  • canMove - type: bool - default: false
Can the unit be issued Move orders?
  • canAttack - type: bool - default: true
Can the unit be issued Attack orders?
  • canFight - type: bool - default: true
Can the unit be issued Fight orders?
  • canPatrol - type: bool - default: true
Can the unit be issued Patrol orders?
  • canGuard - type: bool - default: true
Can the unit be issued Guard orders?
  • canRepeat - type: bool - default: true
Can the unit be issued Guard orders?
  • canSelfDestruct - type: bool - default: true
Can the unit be issued a self destruct order?
  • canRestore - type: bool - default: builder
Can the unit be issued restore terrain commands? For builders only.
  • canRepair - type: bool - default: builder
Can the unit be issued repair commands? For builders only.
  • canReclaim - type: bool - default: builder
Can the unit be issued reclaim commands? For builders only.
  • canResurrect - type: bool - default: false
Can the unit be issued resurrection commands? For builders only.
  • canCapture - type: bool - default: false
Can the unit be issued capture commands? For builders only.
  • moveState - type: int - default: -1 for mobile units, 1 for structures
The initial movement state for the unit. Can be -1 - Inherits from factory, 0 - Hold Position, 1 - Manoeuvre or 2 - Roam.
  • fireState - type: int - default: -1 for units without noAutoFire, 2 otherwise
The initial firing state for the unit. Can be -1 - Inherits from factory, 0 - Hold Fire, 1 - Return Fire or 2 - Fire At Will.
  • noAutoFire - type: bool - default: false
Controls whether or not the unit has a fire state button.

Builder

  • builder - type: bool - default: false
Is the unit a builder?
  • buildDistance - type: float - default: 128.0
How far away from itself the unit can build, measured to the centre of the unit being built. The minimum value is 38.0.
  • buildRange3D - type: bool - default: false
Does the builders buildDistance apply in all 3 dimensions or only 2?
  • workerTime - type: float - default: 0.0
How fast the builder builds, used in conjunction with the buildTime of the unit being built. Effectively, Time to build = unit buildTime / constructor workerTime. If this value is <= 0.0 then builder is set to false.
  • repairSpeed - type: float - default: workerTime
How fast the builder can repair other units.
  • reclaimSpeed - type: float - default: workerTime
How fast the builder can reclaim other units and features.
  • resurrectSpeed - type: float - default: workerTime
How fast the builder can resurrect corpse features back into living units.
  • captureSpeed - type: float - default: workerTime
How fast the builder can capture other units.
  • terraformSpeed - type: float - default: workerTime
How fast the builder levels and restores terrain.
  • canAssist - type: bool - default: builder
Can the builder assist other constructions?
  • canBeAssisted - type: bool - default: true
Can the builder be assisted by other builders?
  • canSelfRepair - type: bool - default: false
Can the builder repair itself?
  • showNanoSpray - type: bool - default: true
Does the builder emit OTA-style nanospray whilst constructing?
  • nanoColor - type: float[3] - default: {0.2, 0.7, 0.2} aka green
The RGB colour of a builders' emitted nano particles if showNanoSpray is true. Also controls the RBG colour of a unit's own nanoframe if showNanoFrame is true.
  • fullHealthFactory - type: bool - default: false
If true, units are repaired before they are allowed to leave the factory i.e. units from this factory will be healed back to 100% health if they are damaged during construction.

Movement & Placement

  • canHover - type: bool - default: false
Is the unit a hovercraft? Hovercraft can cross water of any depth without a speed penalty. Hover's must also have HOVER within the name of their movementClass (see Units:MoveTypes).
  • floater - type: bool - default: true if the unit has the waterline tag, false otherwise
When a mobile unit is crossing water, or a structure is placed on water, does it float on top of the water or crawl / lay on the sea bed?
  • upright - type: bool - default: false
Does the unit follow the terrain or always remain upright? Generally used for walkers.
  • maxSlope - type: float - default: 0.0
The maximum slope a building can be placed on. Mobile unit's use the maxSlope set in their movementClass (see Units:MoveTypes). The value is in degrees and is clamped between 0.0 and 89.0. This value is converted to a "maximum allowed height difference" (call it M), which involves a hard-coded constant. When a building gets placed, the height of each of its footprint squares is compared to a reference height (calculated for the build position). If the difference exceeds M for any square, that build position is rejected.
  • minWaterDepth - type: float - default: -10e6
The minimum depth of water a building can be placed on. Mobile unit's use the minWaterDepth set in their movementClass (see Units:MoveTypes).
  • maxWaterDepth - type: float - default: 10e6
The maximum depth of water a building can be placed on. Mobile unit's use the maxWaterDepth set in their movementClass (see Units:MoveTypes).
  • waterline - type: float - default: 0.0
How low in the water does a ship sit? Higher values means the ship is lower in the water.
  • minCollisionSpeed - type: float - default: 1.0
The minimum net impact speed that will cause a unit to be damaged by collisions with another unit.
  • pushResistant - type: bool - default: false
Can the unit be pushed around by other units? Turning it on doesn't remove all pushing but is a marked improvement.
Can the unit be issued Guard orders?
  • maxVelocity - type: float - default: 0.0
The maximum speed attainable by the unit in elmos per frame. If the value is -ve, the absolute value is used.
  • maxReverseVelocity - type: float - default: 0.0
The maximum speed attainable by the unit in reverse in elmos per frame. If the value is -ve, the absolute value is used.
  • acceleration - type: float - default: 0.5
The acceleration of the unit, in elmos per frame2. If the value is -ve, the absolute value is used.
  • brakeRate - type: float - default: 3.0 * acceleration
The deceleration of the unit, in elmos per frame2. If the value is -ve, the absolute value is used. For units with canFly this is multiplied by 0.1.
  • turnRate - type: float - default: 0.0
How fast the unit can turn. degrees per seconds = 0.16 * turnRate
  • turnInPlace - type: bool - default: true
Does the unit turn on the spot (like a person or tank) or must it be moving forwards to turn (like a car).
  • turnInPlaceSpeedLimit - type: float - default: A complex formula based on turnRate and maxVelocity
For units with turnInPLace = false, this defines the minimum speed it will slow down to (the speed at which the turn is actually performed can be higher depending on the angular difference and turnRate).

Flanking

For a deeper explanation of these tags, see Units:FlankingBonus.

  • flankingBonusMode - type: int - default: flankingBonus.defaultMode set in Modrules.lua
The mode of operation of Spring's inbuilt flanking system. Can be 0 - No flanking bonus. Mode 1 builds up the ability to move over time, and swings to face attacks, but does not respect the way the unit is facing. Mode 2 also can swing, but moves with the unit as it turns. Mode 3 stays with the unit as it turns and otherwise doesn't move, the ideal mode to simulate something such as tank armour.
  • flankingBonusMax - type: float - default: 1.9
The maximum multiplier to the damage dealt, when a unit is hit from the opposite direction to flankingBonusDir.
  • flankingBonusMin - type: float - default: 0.9
The minimum multiplier to the damage dealt, when a unit is hit from the opposite direction to flankingBonusDir.
  • flankingBonusDir - type: float[3] - default: {0.0, 0.0, 1.0}
This is the direction vector where the armour is facing; i.e. where the least damage is applied. The default is straight forwards.
  • flankingBonusMobilityAdd - type: float - default: 0.01
This defines the ability of flankingBonusDir to move over time. Its value is added to the mobility every SlowUpdate. When the unit is attacked, the build up mobility value is multiplied by a vector facing the attack, which is added to flankingBonusDir.

Aircraft

  • canFly - type: bool - default: false
Can the unit fly, i.e. is it an aircraft?
  • canSubmerge - type: bool - default: false
Can the aircraft land underwater?
  • factoryHeadingTakeoff - type: bool - default: true
Controls the take-off behaviour of aircraft with hoverAttack. true means planes start matching their factory's heading right after taking off from the pad, false means they maintain the heading of the pad until reaching cruiseAlt.
  • collide - type: bool - default: true
Does the unit collide with other aircraft, or can it occupy the same space?
  • hoverAttack - type: bool - default: false
Controls whether the aircraft flys and attacks like a fighter/bomber or a helicopter/gunship.
  • airStrafe - type: bool - default: true
For aircraft with hoverAttack = true, controls if the unit strafes side to side while attacking or remains stationary.
  • cruiseAlt - type: float - default: 0.0
The altitude in elmos which the unit attempts to fly at while cruising.
  • airHoverFactor - type: float - default: -1.0
For aircraft with hoverAttack = true, less then 0 means it can land and >= 0 indicates how much the unit will move during hovering on the spot.
  • bankingAllowed - type: bool - default: true
For aircraft with hoverAttack = true, controls whether or not the unit banks when moving turning.
  • useSmoothMesh - type: bool - default: true
Does the aircraft follow the real map terrain or the special smoothed out navigation mesh generated by Spring specifically for aircraft?

Transports

Categories

Decals

Collision Volumes

For a deeper explanation of these tags, see Unit Collision Volumes.

Weapons

  • highTrajectory - type: int - default: 0
Can the unit fire it's (ballistic) weapons in a high trajectory arc? Can be 0 - Low trajectory only, 1 - High trajectory only, or 2 - Toggle button.
  • kamikaze - type: bool - default: false
Does the unit attack its target by blowing itself up?
  • kamikazeDistance - type: float - default: 0.0
How close to the target, in elmos, the unit must get before detonating. Measured in 3D, not 2D.
  • kamikazeUseLOS - type: bool - default: false
Does the target unit have to be in LOS when detonating or only within kamikazeDistance.

Other

  • decoyFor - type: string - default: ""
The unitdef name (not human name) which this unit is a decoy for.
  • selfDestructCountdown - type: int - default: 5
The length in seconds taken between issuing self destruct order and the unit exploding.
  • damageModifier - type: float - default: 1.0
The multiplier applied to weapon damage when the units ARMORED status (See Lua_ConstCOB) is turned on
  • isTargetingUpgrade - type: bool - default: false
Does the unit upgrade the targeting so that units shoot accurately at enemy units which are in radar but not in LOS.
  • isFeature - type: bool - default: false
Does the unit immediately die into it's corpse feature when built? Used mainly for making walls.
  • hideDamage - type: bool - default: false
Should the units current health be invisible to enemy players?
  • showPlayerName - type: bool - default: false
Should the unit display it's controlling player as its name instead of name. Generally used for commander or hero units.
  • showNanoFrame - type: bool - default: true
Does the unit show an OTA-style nanoframe whilst being constructed?

Custom Params

Examples