Gamedev:WeaponDefs
Location
WeaponDef files are .lua files stored in the Weapons/ directory of a Spring Game. Alternatively they can be integrated into UnitDefs.
Purpose
WeaponDef files have one purpose; to define the properties of weapons. They are the main description file for what attributes your weapon should have and how it should behave.
Source
The engine source code which loads the tags from these files is viewable here:rts/Sim/Weapons/WeaponDefHandler.cpp
Data Types
Tags may be one of the following data types:
int- An integer numberfloat- A number with decimals.bool- A value which can betrueorfalse.string- Text, or more precisely a string of alphanumeric characters.float[3]- A vector, with threefloatcomponents, 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.
It is usual to name the returned WeaponDef table the internal weaponName desired for the weapon.
WeaponTypes
Spring has 15 WeaponTypes which provide game developers with basic behaviours which they can customise to an extent with the WeaponDef tags. Some of these types are more useful, flexible and reliable than others; particularly Cannon, LaserCannon and MissileLauncher. Some tags are specific to certain WeaponTypes and not implemented for others, this two-way table indicates which tags work for which types.
AircraftBomb
- Drops a ballistic projectile at the same movement vector as the unit itself. Intended only for aircraft. By default the type automatically calculates its
burstandburstRatetags from itsreloadTimeand uses 5 as itsreloadTimeinstead. This is an OTAism and can be overridden with themanualBombSettingstag. Visually drawn as a billboarded sprite as used by theCannon, but more commonly used with a 3D model. See the #AircraftBomb section for tags specific to this type.
BeamLaser
- An instant-hit weapon which spawns a beam and does a portion of its total damage each frame. Cannot be script emitted if it has a
beamTimelonger than one frame. Visually drawn as a Star Trek Phaser-style laser weapon. ThelargeBeamLasertag allows changing the visual effect of the laser, such as using a tileable, scrolling texture without changing the behaviour. See the #BeamLaser section for tags specific to this type.
Cannon
- The default WeaponType. Fires a ballistic projectile, for the best result (without under/overshooting) the
weaponVelocityshould be set so as to give an elevation of 45° when firing at the maximumrange. Substituting the angle into the trajectory equation and rearranging, we get:whereweaponVelocity = √(range * g)
gis the map gravity, usually around120for most Spring maps (You can use themyGravitytag if you want to be exact). Visually drawn as a billboarded sprite or 3D model. See the #Cannon section for tags specific to this type.
DGun
- Fires a line-of-sight or ballistic projectile (selected via the
gravityAffectedtag). Visually represented by a fireball effect that cannot be customised, however it can be replaced by a 3D model. The name and visual effect are OTAisms. See the #DGun section for tags specific to this type.
EmgCannon
- A line-of-sight weapon. Visually drawn as a billboarded sprite very similar to that of the
Cannon, however not as customisable, or a 3D model. The name is another OTAism. See the #EmgCannon section for tags specific to this type.
Flame
- A line-of-sight weapon intended for use as a flamethrower or similar. Visually drawn as a stream of textured particles, the colour of which can be controlled very precisely using the
colorMaptag (see CColorMap). See the #Flame section for tags specific to this type.
LaserCannon
- A particularly versatile line-of-sight weapon. Visually drawn like a Star Wars Blaster-style laser weapon, or a 3D model. See the #LaserCannon section for tags specific to this type.
LightningCannon
- An instant-hit weapon similar to the
BeamLaser, but which does all its damage at once. Visually drawn like Star Wars 'Force Lightning' or CnC: Red Alert Tesla Coil weapons, the effect is not very customisable. See the #LightningCannon section for tags specific to this type.
Melee
- A weapon that always damages the target, no ifs or buts; unsurprisingly intended for use as a close quarters 'melee' weapon. It does not fire a projectile and does not care about the line of fire. See the #Melee section for tags specific to this type.
MissileLauncher
- A versatile weapon which can optionally track targets and accelerate from a low initial velocity. It can also use
trajectoryHeightto have the shot arc similar to a ballistic projectile. Visually represented by a 3D model, with an optionalsmokeTrail. See the #MissileLauncher section for tags specific to this type.
Rifle
- An instant hit weapon which does all its damage at once. Visually represented by a hardcoded tracer, firing and hitting effects. Rarely used. See the #Rifle section for tags specific to this type.
Shield
- As the name suggests, not a weapon but a defensive shield. Can absorb or reflect (
repulsor = true) projectiles. Individual weapons can be set to be intercepted or not by the shield using a bit mask (see Shield_Interception_Tag_Use). Visually represented as a translucent sphere, with control over colour and texture; by default the shield is invisible (visible = false). See the #shield sub-table section for tags specific to this type.
StarburstLauncher
- Fires a projectile that rises vertically for
weaponTimerseconds, then turns towards its target. It can optionally track targets and accelerate from a low initial velocity. This is the only weapon that can betargetableand act as aninterceptor. Visually represented by a 3D model, with an optionalsmokeTrail. See the #StarburstLauncher section for tags specific to this type.
TorpedoLauncher
- Fires a projectile that will behave ballistically out of water and like a missile in water. Usually used with
waterWeapon = trueso they can fire underwater and target underwater units. An aircraft carrying aTorpedoLauncheris a special case, the weapon turns into anAircraftBombprojectile that will spawn a torpedo projectile on impact with water. Visually represented by a pointed black cuboid, usually the default object is replaced by a 3D model. See the #TorpedoLauncher section for tags specific to this type.
NoWeapon
- Not actually a WeaponType, but an individual weapon requested by Spring to 'fill in the gaps' if a unit claims to have a weapon which isn't actually defined. There needs to be only one of these weapons and it is set by the
namebeing"NOWEAPON"rather than by theweaponTypetag.
General
float tagToCopyPaste default: 0.0
- Lorem ipsum dolor sit amet.
Sub Tables
damage
shield
textures
customParams
The customParams subtable of a WeaponDef allows the game designer to give their weapons custom attributes, which can then be accessed via lua gadgets and widgets. It is a map (key-value pair indexed table) of strings. When accessing these attributes in lua the strings can be turned back into numbers, bools or even tables. This gives great control to game designers to essentially implement their own behaviour tags.
There are no additional tags specific to this subtable
Examples
'Balanced Annihilation' WeaponDefs
'Conflict Terra' WeaponDefs (Most are integrated into their UnitDefs)
'Evolution RTS' WeaponDefs (Most are integrated into their UnitDefs)
'Spring: 1944' WeaponDefs (Implements an OOP paradigm with inheritance)