<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://springrts-wiki.p2004a.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jivvz</id>
	<title>Spring - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://springrts-wiki.p2004a.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jivvz"/>
	<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/wiki/Special:Contributions/Jivvz"/>
	<updated>2026-11-08T23:15:59Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:mapinfo.lua&amp;diff=13910</id>
		<title>Mapdev:mapinfo.lua</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:mapinfo.lua&amp;diff=13910"/>
		<updated>2018-11-30T17:21:17Z</updated>

		<summary type="html">&lt;p&gt;Jivvz: /* sound */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= mapinfo.lua Reference =&lt;br /&gt;
This file is the primary configuration file for maps, list many things including resources, attributes, ad properties.&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
The engine source code which reads this file from the map is viewable here:&lt;br /&gt;
* {{sourcelink|file=rts/Map/MapInfo.cpp}}&lt;br /&gt;
* {{sourcelink|file=rts/Map/MapParser.cpp}}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
Can be found in the [https://github.com/jk3064/Map-Blueprint/archive/master.zip map blueprint]&lt;br /&gt;
&lt;br /&gt;
= File Location =&lt;br /&gt;
relative to the root directory of the map&lt;br /&gt;
: ./mapinfo.lua&lt;br /&gt;
&lt;br /&gt;
= Formatting =&lt;br /&gt;
check [http://www.lua.org/docs.html Lua Documentation] for syntax etc.&lt;br /&gt;
&lt;br /&gt;
In this wiki page, variables are organised as such:&lt;br /&gt;
{{tag|name=VariableName|type=type|range=[valid range]|special=Required|default=value&lt;br /&gt;
|description=Description}}&lt;br /&gt;
&lt;br /&gt;
== Data Types ==&lt;br /&gt;
{{DataTypes}}&lt;br /&gt;
&lt;br /&gt;
= Sections =&lt;br /&gt;
== mapinfo ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   name        = &amp;quot;MyMap&amp;quot;,&lt;br /&gt;
   shortname   = &amp;quot;&amp;quot;,&lt;br /&gt;
   description = &amp;quot;&amp;quot;,&lt;br /&gt;
   author      = &amp;quot;&amp;quot;,&lt;br /&gt;
   version     = &amp;quot;1.0&amp;quot;,&lt;br /&gt;
   --mutator   = &amp;quot;deployment&amp;quot;;&lt;br /&gt;
   mapfile     = &amp;quot;maps/mymap.smf&amp;quot;, -- // location of smf/sm3 file&lt;br /&gt;
   modtype     = 3, --// 1=primary, 0=hidden, 3=map&lt;br /&gt;
   depend      = {&amp;quot;Map Helper v1&amp;quot;},&lt;br /&gt;
   replace     = {},&lt;br /&gt;
&lt;br /&gt;
   --startpic   = &amp;quot;&amp;quot;, --// deprecated&lt;br /&gt;
   --StartMusic = &amp;quot;&amp;quot;, --// deprecated&lt;br /&gt;
&lt;br /&gt;
   maphardness     = 100,&lt;br /&gt;
   notDeformable   = false,&lt;br /&gt;
   gravity         = 130,&lt;br /&gt;
   tidalStrength   = 0,&lt;br /&gt;
   maxMetal        = 0.02,&lt;br /&gt;
   extractorRadius = 500.0,&lt;br /&gt;
   voidWater       = false,&lt;br /&gt;
   voidGround      = false,&lt;br /&gt;
   autoShowMetal   = true,&lt;br /&gt;
&lt;br /&gt;
   smf = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   sound = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   resources = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   splats = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   atmosphere = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   grass = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   lighting = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   water = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   teams = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   terrainTypes = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   custom = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=name|type=string|special=Required|default=none&lt;br /&gt;
|description=Name of the map}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=shortname|type=string|special=Required&lt;br /&gt;
|description=maps will not show in the map list without a valid shortname(not sure on its requirements)}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=description|type=string|default=&amp;lt;span style=&amp;quot;color:#cccccc;text-shadow: #111 2px 2px 2px;&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt;&lt;br /&gt;
|description=The description of the map that shows in the multiplayer battleroom}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=author|type=string|default=&amp;quot;&amp;quot;&lt;br /&gt;
|description=Author of the map}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=version|type=string&lt;br /&gt;
|description=version, appended to name}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=mutator|type=string}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=mapfile|type=string&lt;br /&gt;
|description=location of smf/sm3 file}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=modtype|type=int|range=[013]|special=Required&lt;br /&gt;
|description=1=primary, 0=hidden, 3=map}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=depend|special=Required}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=replace}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maphardness|type=float|default=100.0&lt;br /&gt;
|description=Defines how much a map will deform from impacts. Higher values mean less deformation, negative values will result in negative deformation (really funny looking)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=notDeformable|type=bool|default=false&lt;br /&gt;
|description=Setting it to 1 means that no explosions can deform the map.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=gravity|type=float|range=[0.001-max]|default=130.0&lt;br /&gt;
|description=As you would expect, affects ballistics and how far units fly after an explosion. The force of gravity in units/sec^2}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=tidalStrength|type=float|range=[0.0-max]|default=0.0&lt;br /&gt;
|description=The amount of energy which will be given by tidal generators.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxMetal|type=float|range=[0.0-max]|default=0.02&lt;br /&gt;
|description=How much metal a map square with the maximum metal value gives.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=extractorRadius|type=float|range=[0.0-max]|default=500&lt;br /&gt;
|description=The radius of effect that a single extractor will extract from. If two radii intersect, both extractors will suffer from reduced output.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=voidWater|type=bool|default=false&lt;br /&gt;
|description=Voidwater means there will be no water plane, and all parts of the map under water will be completely transparent, to show the skybox through the map. For example, check [http://springrts.com/phpbb/viewtopic.php?f=13&amp;amp;t=20684&amp;amp;hilit=apophis Apophis_v2]}}. Additionally for this to work, the &amp;lt;code&amp;gt;mapinfo.water.planeColor&amp;lt;/code&amp;gt; variable must not be specified in the mapinfo.lua file, delete or comment it out if it exists.&lt;br /&gt;
&lt;br /&gt;
{{tag|name=voidGround|type=bool|default=false&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 92.0&amp;lt;/span&amp;gt;&lt;br /&gt;
|description=Allows portions of the ground to be invisible if the map was compiled with a diffuse image that has an alpha channel. The terrain still exists, its just transparent.}}. &lt;br /&gt;
&lt;br /&gt;
{{tag|name=autoShowMetal|type=bool|default=true&lt;br /&gt;
|description=Defines whether the metal map (F4 mode) is shown automatically when a mex is queued for placement.}}&lt;br /&gt;
&lt;br /&gt;
== smf ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   smf = {&lt;br /&gt;
      minHeight = 1000,&lt;br /&gt;
      maxHeight = -300,&lt;br /&gt;
      minimapTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileName0 = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileName1 = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileName.. = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileNameN = &amp;quot;&amp;quot;,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=minHeight|type=float|default=0.0&lt;br /&gt;
|description=Overrides the minimum map height specified while compiling. Compile time height used if undefined}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxHeight|type=float|default=0.0&lt;br /&gt;
|description=Overrides the maximum map height specified while compiling. Compile time height used if undefined}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=minimapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the minimap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=metalmapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the metalmap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=typemapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the typemap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=grassmapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the grassmap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=smtFileName[N]|type=string}}&lt;br /&gt;
&lt;br /&gt;
== sound ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   sound = {&lt;br /&gt;
      preset = &amp;quot;default&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      passfilter = {&lt;br /&gt;
         ...&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
      reverb = {&lt;br /&gt;
         ...&lt;br /&gt;
      },&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=preset|type=string|default=&amp;quot;default&amp;quot;&lt;br /&gt;
|description=Sets the _reverb_ preset (= echo parameters), passfilter (the direct sound) is unchanged. To get a list of all possible presets check: [https://github.com/spring/spring/blob/master/rts/System/Sound/OpenAL/EFXPresets.cpp EFXPresets.cpp]}}&lt;br /&gt;
&lt;br /&gt;
{{Tip|You can change the preset at runtime via:&lt;br /&gt;
* /tset UseEFX [1&amp;amp;#124;0]&lt;br /&gt;
* /tset snd_eaxpreset preset_name   (may change to a real cmd in the future)&lt;br /&gt;
* /tset snd_filter %gainlf %gainhf  (may    &amp;quot;   &amp;quot;  &amp;quot;  &amp;quot;    &amp;quot;  &amp;quot;   &amp;quot;    &amp;quot;   )}}&lt;br /&gt;
&lt;br /&gt;
=== passfilter ===&lt;br /&gt;
Note, you likely want to set these tags due to the fact that they are _not_ set by `preset`!  So if you want to create a muffled sound you need to use them.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   sound = {&lt;br /&gt;
      ...&lt;br /&gt;
      passfilter = {&lt;br /&gt;
         gainlf = 1.0,&lt;br /&gt;
         gainhf = 1.0,&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=gainlf|type=float}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=gainhf|type=float}}&lt;br /&gt;
&lt;br /&gt;
=== reverb ===&lt;br /&gt;
Normally you just want use the `preset` tag but you can use handtweak a preset if wanted with the following tags. To know their function &amp;amp; ranges check the official OpenAL1.1 SDK document.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   sound = {&lt;br /&gt;
      ...&lt;br /&gt;
      reverb = {         &lt;br /&gt;
         --density&lt;br /&gt;
         --diffusion&lt;br /&gt;
         --gain&lt;br /&gt;
         --gainhf&lt;br /&gt;
         --gainlf&lt;br /&gt;
         --decaytime&lt;br /&gt;
         --decayhflimit&lt;br /&gt;
         --decayhfratio&lt;br /&gt;
         --decaylfratio&lt;br /&gt;
         --reflectionsgain&lt;br /&gt;
         --reflectionsdelay&lt;br /&gt;
         --reflectionspan&lt;br /&gt;
         --latereverbgain&lt;br /&gt;
         --latereverbdelay&lt;br /&gt;
         --latereverbpan&lt;br /&gt;
         --echotime&lt;br /&gt;
         --echodepth&lt;br /&gt;
         --modtime&lt;br /&gt;
         --moddepth&lt;br /&gt;
         --airabsorptiongainhf&lt;br /&gt;
         --hfreference&lt;br /&gt;
         --lfreference&lt;br /&gt;
         --roomrollofffactor&lt;br /&gt;
      },&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== resources ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   resources = {&lt;br /&gt;
      grassBladeTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      grassShadingTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      detailTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      specularTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      splatDetailTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      splatDistrTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      skyReflectModTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      detailNormalTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      lightEmissionTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      parallaxHeightTex = &amp;quot;&amp;quot;,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=grassBladeTex|type=string&lt;br /&gt;
|description=Specifies the texture to be used on the grass blades themselves. Green-yellow gradients make for some interesting effects. Defaults to the internally generated blade texture. More Information: [[Mapdev:grass]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=grassShadingTex|type=string&lt;br /&gt;
|description=Specifies the color variation of the grass across the map. This defaults to the minimap, so the grass color can match the map color. More Information: [[Mapdev:grass]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=detailTex|type=string&lt;br /&gt;
|description=Specifies the detail texture for the map. More Information: [[Mapdev:detail]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:specular]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=splatDetailTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:splatdetail]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=splatDistrTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:splatdetail]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyReflectModTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:skyreflectmod]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=detailNormalTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:normal]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=lightEmissionTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:lightemission]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=parallaxHeightTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:parallax]]}}&lt;br /&gt;
&lt;br /&gt;
== splats ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   splats = {&lt;br /&gt;
      texScales = {0.02, 0.02, 0.02, 0.02},&lt;br /&gt;
      texMults  = {1.0, 1.0, 1.0, 1.0},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=texScales|type=float[4]&lt;br /&gt;
|default={0.2, 0.2, 0.2, 0.2}|description=Scale value for the splat texture in the RGBA channels respectively.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=texMults|type=float[4]&lt;br /&gt;
|default={1.0, 1.0, 1.0, 1.0}|description=Value for the splat texture in the RGBA channels respectively.}}&lt;br /&gt;
&lt;br /&gt;
== atmosphere ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   atmosphere = {&lt;br /&gt;
      minWind      = 5.0,&lt;br /&gt;
      maxWind      = 25.0,&lt;br /&gt;
&lt;br /&gt;
      fogStart     = 0.1,&lt;br /&gt;
      fogEnd       = 1.0,&lt;br /&gt;
      fogColor     = {0.7, 0.7, 0.8},&lt;br /&gt;
&lt;br /&gt;
      sunColor     = {1.0, 1.0, 1.0},&lt;br /&gt;
      skyColor     = {0.1, 0.15, 0.7},&lt;br /&gt;
      skyDir       = {0.0, 0.0, -1.0},&lt;br /&gt;
      skyBox       = &amp;quot;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      cloudDensity = 0.5,&lt;br /&gt;
      cloudColor   = {1.0, 1.0, 1.0},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=minWind|type=float|range=[0.0-max]|default=5.0|&lt;br /&gt;
description=The minimum amount of energy the wind on the map will give. is clamped to maxwind}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxWind|type=float|range=[0.0-max]|default=25.0&lt;br /&gt;
|description=The maximum amount of energy the wind on the map will give}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fogStart|type=float|default=0.1&lt;br /&gt;
|description=The distance from the camera at which the fog will start. &amp;lt;code&amp;gt;viewRange * fogStart&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fogEnd|type=float|default=1.0&lt;br /&gt;
|description=The distance from the camera that fog is opaque. &amp;lt;code&amp;gt;viewRange * fogEnd&amp;lt;/code&amp;gt; }}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fogColor|type=rgb|default={0.7, 0.7, 0.8}&lt;br /&gt;
|description=The color of the fog and the infinite plane below the world. The values are in the order Red, Green, Blue. However, giving values higher than 1.0 will give brighter fog and less than 0.0 will give darker}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=sunColor|type=rgb|default={1.0, 1.0, 1.0}&lt;br /&gt;
|description=The color of the sun in the sky. The values are in the order Red, Green, Blue. This will also effect the size of the star. As the values increase (including over 1.0), the disc will get bigger; the inverse is also true}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyColor|type=rgb|default={0.1, 0.15, 0.7}&lt;br /&gt;
|description=The color of the sky itself. The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyDir|type=float[3]|default={0.0, 0.0, -1.0}&lt;br /&gt;
|description=Is normalised vector}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyBox|type=string&lt;br /&gt;
|description=Specify a .dds skybox (also called skycube) for examples and resources see this [http://springrts.com/phpbb/viewtopic.php?f=56&amp;amp;t=11009 thread]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=cloudDensity|type=float|range=[0.0-max]|default=0.5&lt;br /&gt;
|description=The amount of clouds in the sky}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=cloudColor|type=rgb&lt;br /&gt;
|default={1.0, 1.0, 1.0}|description=The color of the clouds}}&lt;br /&gt;
&lt;br /&gt;
== grass ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   grass = {&lt;br /&gt;
      bladeWaveScale = 1.0,&lt;br /&gt;
      bladeWidth  = 0.32,&lt;br /&gt;
      bladeHeight = 4.0,&lt;br /&gt;
      bladeAngle  = 1.57,&lt;br /&gt;
      bladeColor  = {0.59, 0.81, 0.57},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=bladeWaveScale|type=float|default=1.0&lt;br /&gt;
|description=Specifies how much the wind should effect grass blade movement, as well as the amplitude of the grass motion. Setting it to 0 will stop grass animation}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeWidth|type=float|default=0.32&lt;br /&gt;
|description=Specifies the width of each blade of grass}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeHeight|type=float|default=4.0&lt;br /&gt;
|description=Specifies the length of each blade of grass}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeAngle|type=float|default=1.57&lt;br /&gt;
|description=Specifies the curvature of each blade of grass. Unit is radians. 0 means completely straight blades of grass}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeColor|type=rgb|default={0.59, 0.81, 0.57}&lt;br /&gt;
|description=does nothing when `grassBladeTex` is set}}&lt;br /&gt;
&lt;br /&gt;
== Lighting ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   lighting = {&lt;br /&gt;
      --// dynsun&lt;br /&gt;
      sunStartAngle = 0.0,&lt;br /&gt;
      sunOrbitTime  = 1440.0,&lt;br /&gt;
      sunDir        = {0.0, 1.0, 2.0, 1e9},&lt;br /&gt;
&lt;br /&gt;
      --// unit &amp;amp; ground lighting&lt;br /&gt;
      groundAmbientColor  = {0.5, 0.5, 0.5},&lt;br /&gt;
      groundDiffuseColor  = {0.5, 0.5, 0.5},&lt;br /&gt;
      groundSpecularColor = {0.1, 0.1, 0.1},&lt;br /&gt;
      groundShadowDensity = 0.8,&lt;br /&gt;
      unitAmbientColor    = {0.4, 0.4, 0.4},&lt;br /&gt;
      unitDiffuseColor    = {0.7, 0.7, 0.7},&lt;br /&gt;
      unitSpecularColor   = {0.7, 0.7, 0.7},&lt;br /&gt;
      unitShadowDensity   = 0.8,&lt;br /&gt;
      &lt;br /&gt;
      specularExponent    = 100.0,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=sunStartAngle|type=float|default=0.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=sunOrbitTime|type=float|default=1440.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=sunDir|type=float[3]|default={0.0, 1.0, 2.0}&lt;br /&gt;
|description=The direction of the sun, which is normalized by Spring. The Y-axis is up}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundAmbientColor|type=rgb|default={0.5, 0.5, 0.5}&lt;br /&gt;
|description=The ambient (non-sun-lit) color of ground, grass, trees and other features. The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundDiffuseColor|type=rgb|default={0.5, 05, 0.5}&lt;br /&gt;
|description=The color of ground where it is fully sun lit (added to GroundAmbientColor). The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundSpecularColor|type=rgb|default={0.1, 0.1, 0.1}&lt;br /&gt;
|description=and its effect when a specular map is present?}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundShadowDensity|type=float|default=0.8&lt;br /&gt;
|description=How far from the non shadowed to the ambient color stuff in shadow will go.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitAmbientColor|type=float|default={0.4, 0.4, 0.4}&lt;br /&gt;
|description=The ambient (non-sun-lit) color of units and corpses}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitDiffuseColor|type=rgb|default={0.7, 0.7, 0.7}&lt;br /&gt;
|description=The color of units where they is fully sun lit (added to UnitAmbientColor). The color of units where they is fully sun lit (added to UnitAmbientColor)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitSpecularColor|type=rgb|default=unitDiffuseColor}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitShadowDensity|type=float|default=0.8&lt;br /&gt;
|description=How far from the non shadowed to the ambient color stuff in shadow will go}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularExponent|type=float|default=100}}&lt;br /&gt;
&lt;br /&gt;
== water ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   water = {&lt;br /&gt;
      damage =  0.0,&lt;br /&gt;
&lt;br /&gt;
      repeatX = 0.0,&lt;br /&gt;
      repeatY = 0.0,&lt;br /&gt;
&lt;br /&gt;
      absorb    = {0.0, 0.0, 0.0},&lt;br /&gt;
      baseColor = {0.0, 0.0, 0.0},&lt;br /&gt;
      minColor  = {0.0, 0.0, 0.0},&lt;br /&gt;
&lt;br /&gt;
      ambientFactor  = 1.0,&lt;br /&gt;
      diffuseFactor  = 1.0,&lt;br /&gt;
      specularFactor = 1.0,&lt;br /&gt;
      specularPower  = 20.0,&lt;br /&gt;
&lt;br /&gt;
      planeColor = {0.0, 0.4, 0.0},&lt;br /&gt;
&lt;br /&gt;
      surfaceColor  = {0.75, 0.8, 0.85},&lt;br /&gt;
      surfaceAlpha  = 0.55,&lt;br /&gt;
      diffuseColor  = {1.0, 1.0, 1.0},&lt;br /&gt;
      specularColor = {0.5, 0.5, 0.5},&lt;br /&gt;
&lt;br /&gt;
      fresnelMin   = 0.2,&lt;br /&gt;
      fresnelMax   = 0.8,&lt;br /&gt;
      fresnelPower = 4.0,&lt;br /&gt;
&lt;br /&gt;
      reflectionDistortion = 1.0,&lt;br /&gt;
&lt;br /&gt;
      blurBase      = 2.0,&lt;br /&gt;
      blurExponent = 1.5,&lt;br /&gt;
&lt;br /&gt;
      perlinStartFreq  =  8.0,&lt;br /&gt;
      perlinLacunarity = 3.0,&lt;br /&gt;
      perlinAmplitude  =  0.9,&lt;br /&gt;
      windSpeed = 1.0, --// does nothing yet&lt;br /&gt;
&lt;br /&gt;
      shoreWaves = true,&lt;br /&gt;
      forceRendering = false,&lt;br /&gt;
&lt;br /&gt;
      --// undefined == load them from resources.lua!&lt;br /&gt;
      --texture =       &amp;quot;&amp;quot;,&lt;br /&gt;
      --foamTexture =   &amp;quot;&amp;quot;,&lt;br /&gt;
      --normalTexture = &amp;quot;&amp;quot;,&lt;br /&gt;
      --caustics = {&lt;br /&gt;
      --   &amp;quot;&amp;quot;,&lt;br /&gt;
      --   &amp;quot;&amp;quot;,&lt;br /&gt;
      --},&lt;br /&gt;
&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=damage|type=float|default=0.0&lt;br /&gt;
|description=Number of hit points per game frame (30 frames per second) a unit will be damaged if it is in the water. As of 95.0 by default damage is also applied to hovercraft units. i wonder if this can be made to give life...?}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=repeatX|type=float|default=0.0&lt;br /&gt;
|description=effects the filing frequency of the watertexture}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=repeatY|type=float|default=0.0&lt;br /&gt;
|description=effects the filing frequency of the watertexture}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=absorb|type=rgb|default={0.0, 0.0, 0.0}&lt;br /&gt;
|description=How fast different colors (RGB in order) are absorbed by the water. Can be used to make the water look murky at deeper sections and so on. How this works: the waterabsorb value for the color channel gets multiplied by the depth of the water at a point, and this product gets subtracted from WaterBaseColor, until WaterMinColor is reached. Example: WaterAbsorb is 0.01, for the red channel, and we want to know how much red will be left in the water at a Spring elevation of -100, since 0.01*100= 1 , at this depth, there will be no more red component in the water, unless WaterMinColor is higher than 0 on the red channel}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=baseColor|type=rgb|default={0.0, 0.0, 0.0}&lt;br /&gt;
|description=The color of the water just beneath the surface plane. This is the starting color from which deeper waters will absorb more color. The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=minColor|type=rgb|default={0.0, 0.0, 0.0}&lt;br /&gt;
|description=The smallest values the water will go down to due to WaterAbsorb}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=ambientFactor|type=float|default=1.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=diffuseFactor|type=float|default=1.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularFactor|type=float|default=1.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularPower|type=float|default=20.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=planeColor|type=rgb|default={0.0, 0.4, 0.0}&lt;br /&gt;
|description=This sets the color of the groundplane under the water outside the map boundaries}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=surfaceColor|type=rgb|default={0.75, 0.8, 0.85}&lt;br /&gt;
|description=The color of the water surface. Mostly affects the colors of the reflections off the top of the water. Has no effect on bump mapped water!}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=surfaceAlpha|type=float|default=0.55&lt;br /&gt;
|description= Transparency of the water surface. 0 meaning almost fully transparent water plane(low amount of reflections visible), and 1 being nearly opaque (massive amount of reflections)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=diffuseColor|type=rgb|default=value&lt;br /&gt;
|description=This specifies the diffuse color of the water body. WARNING: use of this tag disables the effect of WaterAbsorb , in fact, this tag does nothing but disable WaterAbsorb. Avoid}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularColor|type=rgb|default=lighting.groundDiffuseColor}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fresnelMin|type=float|default=0.2}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fresnelMax|type=float|default=0.8}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fresnelPower|type=float|default=4.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=reflectionDistortion|type=float|default=1.0&lt;br /&gt;
|description=How much the surface should distort reflections that are cause by waves not being level: ergo it adds more choppyness to your reflections sensible from 0 to 20}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=blurBase|type=float|default=2.0&lt;br /&gt;
|description=Something to do with blur, but it just seems to cause banding with values under 2 and corruption with values above 10}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=blurExponent|type=float|default=1.5&lt;br /&gt;
|description=How much reflections on water surface should be blurred together with the water surface, lower values meaning clearer reflections, (0.2-5) Warning: above 5 seems to cause water corruption}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=perlinStartFreq|type=float|default=8.0&lt;br /&gt;
|description=Wave sizes, smaller = big waves, sensible: [1,20] (influence the wave sizes)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=perlinLacunarity|type=float|default=3.0&lt;br /&gt;
|description=Defines the size of the perlin waves, small values being big waves ([0.2,5] is sensible)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=perlinAmplitude|type=float|default=0.9&lt;br /&gt;
|description=Base stillness of water surface, 0 is dead still, 1 is &#039;windy&#039; .This doesnt affect the bump texture depth, besides the fact that this disables the bump texture when set to 0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=windSpeed|type=float|default=1.0&lt;br /&gt;
|description=does nothing yet}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=shoreWaves|type=bool|default=true}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=forceRendering|type=bool|default=true}}&lt;br /&gt;
&lt;br /&gt;
will have to ask about those undefined tags&lt;br /&gt;
&lt;br /&gt;
== teams ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   teams = {&lt;br /&gt;
      [0] = {startPos = {x = 2033, z = 852}},&lt;br /&gt;
      [1] = {startPos = {x = 10134, z = 852}},&lt;br /&gt;
      [2] = {startPos = {x = 0, z = 0}},&lt;br /&gt;
      [3] = {startPos = {x = 0, z = 0}},&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Holds an array of start positions&lt;br /&gt;
&lt;br /&gt;
== terrainTypes ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   terrainTypes = {&lt;br /&gt;
      [0] = {&lt;br /&gt;
         name = &amp;quot;Default&amp;quot;,&lt;br /&gt;
         hardness = 1.0,&lt;br /&gt;
         receiveTracks = true,&lt;br /&gt;
         moveSpeeds = {&lt;br /&gt;
            tank  = 1.0,&lt;br /&gt;
            kbot  = 1.0,&lt;br /&gt;
            hover = 1.0,&lt;br /&gt;
            ship  = 1.0,&lt;br /&gt;
         },&lt;br /&gt;
      },&lt;br /&gt;
      [1]  = { &lt;br /&gt;
         ...&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Holds an array of start types where each element contains:&lt;br /&gt;
&lt;br /&gt;
{{tag|name=name|type=string&lt;br /&gt;
|description=A label for the terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=hardness|type=float|range=[0.001-max]|default=1.0&lt;br /&gt;
|description=Used as a multiplier against the mapinfo.mapHardness value. Can be used to make a particular terrain type softer or harder. A value of &#039;1&#039; will make it as hard as MapHardness, and 0.5 will make it half as hard}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=receiveTracks|type=bool|default=true&lt;br /&gt;
|description= Effects whether track decals will be placed on the ground from moving vehicles}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.tank|type=float|range=[0.0-max]|default=1.0&lt;br /&gt;
|description= Speed multiplier for tanks when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.kbot|type=float|range=[0.0-max]|default=1.0&lt;br /&gt;
|description= Speed multiplier for kbots when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.hover|type=float|range=[0.0-max]|default=1.0&lt;br /&gt;
|description= Speed multiplier for hovercraft when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.ship|type=float|range=[0.0-max]|default=1&lt;br /&gt;
|description= Speed multiplier for ships when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
== custom ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   custom = {&lt;br /&gt;
      fog = {&lt;br /&gt;
         color    = {0.26, 0.30, 0.41},&lt;br /&gt;
         height   = &amp;quot;80%&amp;quot;, --// allows either absolue sizes or in percent of map&#039;s MaxHeight&lt;br /&gt;
         fogatten = 0.003,&lt;br /&gt;
      },&lt;br /&gt;
      precipitation = {&lt;br /&gt;
         density   = 30000,&lt;br /&gt;
         size      = 1.5,&lt;br /&gt;
         speed     = 50,&lt;br /&gt;
         windscale = 1.2,&lt;br /&gt;
         texture   = &#039;LuaGaia/effects/snowflake.png&#039;,&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Map Dev]]&lt;/div&gt;</summary>
		<author><name>Jivvz</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:mapinfo.lua&amp;diff=13909</id>
		<title>Mapdev:mapinfo.lua</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:mapinfo.lua&amp;diff=13909"/>
		<updated>2018-11-30T17:20:10Z</updated>

		<summary type="html">&lt;p&gt;Jivvz: /* sound */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= mapinfo.lua Reference =&lt;br /&gt;
This file is the primary configuration file for maps, list many things including resources, attributes, ad properties.&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
The engine source code which reads this file from the map is viewable here:&lt;br /&gt;
* {{sourcelink|file=rts/Map/MapInfo.cpp}}&lt;br /&gt;
* {{sourcelink|file=rts/Map/MapParser.cpp}}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
Can be found in the [https://github.com/jk3064/Map-Blueprint/archive/master.zip map blueprint]&lt;br /&gt;
&lt;br /&gt;
= File Location =&lt;br /&gt;
relative to the root directory of the map&lt;br /&gt;
: ./mapinfo.lua&lt;br /&gt;
&lt;br /&gt;
= Formatting =&lt;br /&gt;
check [http://www.lua.org/docs.html Lua Documentation] for syntax etc.&lt;br /&gt;
&lt;br /&gt;
In this wiki page, variables are organised as such:&lt;br /&gt;
{{tag|name=VariableName|type=type|range=[valid range]|special=Required|default=value&lt;br /&gt;
|description=Description}}&lt;br /&gt;
&lt;br /&gt;
== Data Types ==&lt;br /&gt;
{{DataTypes}}&lt;br /&gt;
&lt;br /&gt;
= Sections =&lt;br /&gt;
== mapinfo ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   name        = &amp;quot;MyMap&amp;quot;,&lt;br /&gt;
   shortname   = &amp;quot;&amp;quot;,&lt;br /&gt;
   description = &amp;quot;&amp;quot;,&lt;br /&gt;
   author      = &amp;quot;&amp;quot;,&lt;br /&gt;
   version     = &amp;quot;1.0&amp;quot;,&lt;br /&gt;
   --mutator   = &amp;quot;deployment&amp;quot;;&lt;br /&gt;
   mapfile     = &amp;quot;maps/mymap.smf&amp;quot;, -- // location of smf/sm3 file&lt;br /&gt;
   modtype     = 3, --// 1=primary, 0=hidden, 3=map&lt;br /&gt;
   depend      = {&amp;quot;Map Helper v1&amp;quot;},&lt;br /&gt;
   replace     = {},&lt;br /&gt;
&lt;br /&gt;
   --startpic   = &amp;quot;&amp;quot;, --// deprecated&lt;br /&gt;
   --StartMusic = &amp;quot;&amp;quot;, --// deprecated&lt;br /&gt;
&lt;br /&gt;
   maphardness     = 100,&lt;br /&gt;
   notDeformable   = false,&lt;br /&gt;
   gravity         = 130,&lt;br /&gt;
   tidalStrength   = 0,&lt;br /&gt;
   maxMetal        = 0.02,&lt;br /&gt;
   extractorRadius = 500.0,&lt;br /&gt;
   voidWater       = false,&lt;br /&gt;
   voidGround      = false,&lt;br /&gt;
   autoShowMetal   = true,&lt;br /&gt;
&lt;br /&gt;
   smf = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   sound = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   resources = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   splats = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   atmosphere = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   grass = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   lighting = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   water = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   teams = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   terrainTypes = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   custom = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=name|type=string|special=Required|default=none&lt;br /&gt;
|description=Name of the map}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=shortname|type=string|special=Required&lt;br /&gt;
|description=maps will not show in the map list without a valid shortname(not sure on its requirements)}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=description|type=string|default=&amp;lt;span style=&amp;quot;color:#cccccc;text-shadow: #111 2px 2px 2px;&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt;&lt;br /&gt;
|description=The description of the map that shows in the multiplayer battleroom}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=author|type=string|default=&amp;quot;&amp;quot;&lt;br /&gt;
|description=Author of the map}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=version|type=string&lt;br /&gt;
|description=version, appended to name}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=mutator|type=string}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=mapfile|type=string&lt;br /&gt;
|description=location of smf/sm3 file}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=modtype|type=int|range=[013]|special=Required&lt;br /&gt;
|description=1=primary, 0=hidden, 3=map}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=depend|special=Required}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=replace}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maphardness|type=float|default=100.0&lt;br /&gt;
|description=Defines how much a map will deform from impacts. Higher values mean less deformation, negative values will result in negative deformation (really funny looking)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=notDeformable|type=bool|default=false&lt;br /&gt;
|description=Setting it to 1 means that no explosions can deform the map.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=gravity|type=float|range=[0.001-max]|default=130.0&lt;br /&gt;
|description=As you would expect, affects ballistics and how far units fly after an explosion. The force of gravity in units/sec^2}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=tidalStrength|type=float|range=[0.0-max]|default=0.0&lt;br /&gt;
|description=The amount of energy which will be given by tidal generators.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxMetal|type=float|range=[0.0-max]|default=0.02&lt;br /&gt;
|description=How much metal a map square with the maximum metal value gives.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=extractorRadius|type=float|range=[0.0-max]|default=500&lt;br /&gt;
|description=The radius of effect that a single extractor will extract from. If two radii intersect, both extractors will suffer from reduced output.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=voidWater|type=bool|default=false&lt;br /&gt;
|description=Voidwater means there will be no water plane, and all parts of the map under water will be completely transparent, to show the skybox through the map. For example, check [http://springrts.com/phpbb/viewtopic.php?f=13&amp;amp;t=20684&amp;amp;hilit=apophis Apophis_v2]}}. Additionally for this to work, the &amp;lt;code&amp;gt;mapinfo.water.planeColor&amp;lt;/code&amp;gt; variable must not be specified in the mapinfo.lua file, delete or comment it out if it exists.&lt;br /&gt;
&lt;br /&gt;
{{tag|name=voidGround|type=bool|default=false&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 92.0&amp;lt;/span&amp;gt;&lt;br /&gt;
|description=Allows portions of the ground to be invisible if the map was compiled with a diffuse image that has an alpha channel. The terrain still exists, its just transparent.}}. &lt;br /&gt;
&lt;br /&gt;
{{tag|name=autoShowMetal|type=bool|default=true&lt;br /&gt;
|description=Defines whether the metal map (F4 mode) is shown automatically when a mex is queued for placement.}}&lt;br /&gt;
&lt;br /&gt;
== smf ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   smf = {&lt;br /&gt;
      minHeight = 1000,&lt;br /&gt;
      maxHeight = -300,&lt;br /&gt;
      minimapTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileName0 = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileName1 = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileName.. = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileNameN = &amp;quot;&amp;quot;,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=minHeight|type=float|default=0.0&lt;br /&gt;
|description=Overrides the minimum map height specified while compiling. Compile time height used if undefined}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxHeight|type=float|default=0.0&lt;br /&gt;
|description=Overrides the maximum map height specified while compiling. Compile time height used if undefined}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=minimapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the minimap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=metalmapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the metalmap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=typemapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the typemap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=grassmapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the grassmap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=smtFileName[N]|type=string}}&lt;br /&gt;
&lt;br /&gt;
== sound ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   sound = {&lt;br /&gt;
      preset = &amp;quot;default&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      passfilter = {&lt;br /&gt;
         ...&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
      reverb = {&lt;br /&gt;
         ...&lt;br /&gt;
      },&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=preset|type=string|default=&amp;quot;default&amp;quot;&lt;br /&gt;
|description=Sets the _reverb_ preset (= echo parameters), passfilter (the direct sound) is unchanged. To get a list of all possible presets check: [https://github.com/spring/spring/blob/master/rts/System/Sound/OpenAL/EFXPresets.cpp]}}&lt;br /&gt;
&lt;br /&gt;
{{Tip|You can change the preset at runtime via:&lt;br /&gt;
* /tset UseEFX [1&amp;amp;#124;0]&lt;br /&gt;
* /tset snd_eaxpreset preset_name   (may change to a real cmd in the future)&lt;br /&gt;
* /tset snd_filter %gainlf %gainhf  (may    &amp;quot;   &amp;quot;  &amp;quot;  &amp;quot;    &amp;quot;  &amp;quot;   &amp;quot;    &amp;quot;   )}}&lt;br /&gt;
&lt;br /&gt;
=== passfilter ===&lt;br /&gt;
Note, you likely want to set these tags due to the fact that they are _not_ set by `preset`!  So if you want to create a muffled sound you need to use them.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   sound = {&lt;br /&gt;
      ...&lt;br /&gt;
      passfilter = {&lt;br /&gt;
         gainlf = 1.0,&lt;br /&gt;
         gainhf = 1.0,&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=gainlf|type=float}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=gainhf|type=float}}&lt;br /&gt;
&lt;br /&gt;
=== reverb ===&lt;br /&gt;
Normally you just want use the `preset` tag but you can use handtweak a preset if wanted with the following tags. To know their function &amp;amp; ranges check the official OpenAL1.1 SDK document.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   sound = {&lt;br /&gt;
      ...&lt;br /&gt;
      reverb = {         &lt;br /&gt;
         --density&lt;br /&gt;
         --diffusion&lt;br /&gt;
         --gain&lt;br /&gt;
         --gainhf&lt;br /&gt;
         --gainlf&lt;br /&gt;
         --decaytime&lt;br /&gt;
         --decayhflimit&lt;br /&gt;
         --decayhfratio&lt;br /&gt;
         --decaylfratio&lt;br /&gt;
         --reflectionsgain&lt;br /&gt;
         --reflectionsdelay&lt;br /&gt;
         --reflectionspan&lt;br /&gt;
         --latereverbgain&lt;br /&gt;
         --latereverbdelay&lt;br /&gt;
         --latereverbpan&lt;br /&gt;
         --echotime&lt;br /&gt;
         --echodepth&lt;br /&gt;
         --modtime&lt;br /&gt;
         --moddepth&lt;br /&gt;
         --airabsorptiongainhf&lt;br /&gt;
         --hfreference&lt;br /&gt;
         --lfreference&lt;br /&gt;
         --roomrollofffactor&lt;br /&gt;
      },&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== resources ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   resources = {&lt;br /&gt;
      grassBladeTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      grassShadingTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      detailTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      specularTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      splatDetailTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      splatDistrTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      skyReflectModTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      detailNormalTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      lightEmissionTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      parallaxHeightTex = &amp;quot;&amp;quot;,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=grassBladeTex|type=string&lt;br /&gt;
|description=Specifies the texture to be used on the grass blades themselves. Green-yellow gradients make for some interesting effects. Defaults to the internally generated blade texture. More Information: [[Mapdev:grass]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=grassShadingTex|type=string&lt;br /&gt;
|description=Specifies the color variation of the grass across the map. This defaults to the minimap, so the grass color can match the map color. More Information: [[Mapdev:grass]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=detailTex|type=string&lt;br /&gt;
|description=Specifies the detail texture for the map. More Information: [[Mapdev:detail]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:specular]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=splatDetailTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:splatdetail]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=splatDistrTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:splatdetail]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyReflectModTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:skyreflectmod]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=detailNormalTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:normal]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=lightEmissionTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:lightemission]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=parallaxHeightTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:parallax]]}}&lt;br /&gt;
&lt;br /&gt;
== splats ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   splats = {&lt;br /&gt;
      texScales = {0.02, 0.02, 0.02, 0.02},&lt;br /&gt;
      texMults  = {1.0, 1.0, 1.0, 1.0},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=texScales|type=float[4]&lt;br /&gt;
|default={0.2, 0.2, 0.2, 0.2}|description=Scale value for the splat texture in the RGBA channels respectively.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=texMults|type=float[4]&lt;br /&gt;
|default={1.0, 1.0, 1.0, 1.0}|description=Value for the splat texture in the RGBA channels respectively.}}&lt;br /&gt;
&lt;br /&gt;
== atmosphere ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   atmosphere = {&lt;br /&gt;
      minWind      = 5.0,&lt;br /&gt;
      maxWind      = 25.0,&lt;br /&gt;
&lt;br /&gt;
      fogStart     = 0.1,&lt;br /&gt;
      fogEnd       = 1.0,&lt;br /&gt;
      fogColor     = {0.7, 0.7, 0.8},&lt;br /&gt;
&lt;br /&gt;
      sunColor     = {1.0, 1.0, 1.0},&lt;br /&gt;
      skyColor     = {0.1, 0.15, 0.7},&lt;br /&gt;
      skyDir       = {0.0, 0.0, -1.0},&lt;br /&gt;
      skyBox       = &amp;quot;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      cloudDensity = 0.5,&lt;br /&gt;
      cloudColor   = {1.0, 1.0, 1.0},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=minWind|type=float|range=[0.0-max]|default=5.0|&lt;br /&gt;
description=The minimum amount of energy the wind on the map will give. is clamped to maxwind}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxWind|type=float|range=[0.0-max]|default=25.0&lt;br /&gt;
|description=The maximum amount of energy the wind on the map will give}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fogStart|type=float|default=0.1&lt;br /&gt;
|description=The distance from the camera at which the fog will start. &amp;lt;code&amp;gt;viewRange * fogStart&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fogEnd|type=float|default=1.0&lt;br /&gt;
|description=The distance from the camera that fog is opaque. &amp;lt;code&amp;gt;viewRange * fogEnd&amp;lt;/code&amp;gt; }}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fogColor|type=rgb|default={0.7, 0.7, 0.8}&lt;br /&gt;
|description=The color of the fog and the infinite plane below the world. The values are in the order Red, Green, Blue. However, giving values higher than 1.0 will give brighter fog and less than 0.0 will give darker}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=sunColor|type=rgb|default={1.0, 1.0, 1.0}&lt;br /&gt;
|description=The color of the sun in the sky. The values are in the order Red, Green, Blue. This will also effect the size of the star. As the values increase (including over 1.0), the disc will get bigger; the inverse is also true}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyColor|type=rgb|default={0.1, 0.15, 0.7}&lt;br /&gt;
|description=The color of the sky itself. The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyDir|type=float[3]|default={0.0, 0.0, -1.0}&lt;br /&gt;
|description=Is normalised vector}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyBox|type=string&lt;br /&gt;
|description=Specify a .dds skybox (also called skycube) for examples and resources see this [http://springrts.com/phpbb/viewtopic.php?f=56&amp;amp;t=11009 thread]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=cloudDensity|type=float|range=[0.0-max]|default=0.5&lt;br /&gt;
|description=The amount of clouds in the sky}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=cloudColor|type=rgb&lt;br /&gt;
|default={1.0, 1.0, 1.0}|description=The color of the clouds}}&lt;br /&gt;
&lt;br /&gt;
== grass ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   grass = {&lt;br /&gt;
      bladeWaveScale = 1.0,&lt;br /&gt;
      bladeWidth  = 0.32,&lt;br /&gt;
      bladeHeight = 4.0,&lt;br /&gt;
      bladeAngle  = 1.57,&lt;br /&gt;
      bladeColor  = {0.59, 0.81, 0.57},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=bladeWaveScale|type=float|default=1.0&lt;br /&gt;
|description=Specifies how much the wind should effect grass blade movement, as well as the amplitude of the grass motion. Setting it to 0 will stop grass animation}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeWidth|type=float|default=0.32&lt;br /&gt;
|description=Specifies the width of each blade of grass}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeHeight|type=float|default=4.0&lt;br /&gt;
|description=Specifies the length of each blade of grass}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeAngle|type=float|default=1.57&lt;br /&gt;
|description=Specifies the curvature of each blade of grass. Unit is radians. 0 means completely straight blades of grass}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeColor|type=rgb|default={0.59, 0.81, 0.57}&lt;br /&gt;
|description=does nothing when `grassBladeTex` is set}}&lt;br /&gt;
&lt;br /&gt;
== Lighting ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   lighting = {&lt;br /&gt;
      --// dynsun&lt;br /&gt;
      sunStartAngle = 0.0,&lt;br /&gt;
      sunOrbitTime  = 1440.0,&lt;br /&gt;
      sunDir        = {0.0, 1.0, 2.0, 1e9},&lt;br /&gt;
&lt;br /&gt;
      --// unit &amp;amp; ground lighting&lt;br /&gt;
      groundAmbientColor  = {0.5, 0.5, 0.5},&lt;br /&gt;
      groundDiffuseColor  = {0.5, 0.5, 0.5},&lt;br /&gt;
      groundSpecularColor = {0.1, 0.1, 0.1},&lt;br /&gt;
      groundShadowDensity = 0.8,&lt;br /&gt;
      unitAmbientColor    = {0.4, 0.4, 0.4},&lt;br /&gt;
      unitDiffuseColor    = {0.7, 0.7, 0.7},&lt;br /&gt;
      unitSpecularColor   = {0.7, 0.7, 0.7},&lt;br /&gt;
      unitShadowDensity   = 0.8,&lt;br /&gt;
      &lt;br /&gt;
      specularExponent    = 100.0,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=sunStartAngle|type=float|default=0.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=sunOrbitTime|type=float|default=1440.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=sunDir|type=float[3]|default={0.0, 1.0, 2.0}&lt;br /&gt;
|description=The direction of the sun, which is normalized by Spring. The Y-axis is up}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundAmbientColor|type=rgb|default={0.5, 0.5, 0.5}&lt;br /&gt;
|description=The ambient (non-sun-lit) color of ground, grass, trees and other features. The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundDiffuseColor|type=rgb|default={0.5, 05, 0.5}&lt;br /&gt;
|description=The color of ground where it is fully sun lit (added to GroundAmbientColor). The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundSpecularColor|type=rgb|default={0.1, 0.1, 0.1}&lt;br /&gt;
|description=and its effect when a specular map is present?}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundShadowDensity|type=float|default=0.8&lt;br /&gt;
|description=How far from the non shadowed to the ambient color stuff in shadow will go.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitAmbientColor|type=float|default={0.4, 0.4, 0.4}&lt;br /&gt;
|description=The ambient (non-sun-lit) color of units and corpses}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitDiffuseColor|type=rgb|default={0.7, 0.7, 0.7}&lt;br /&gt;
|description=The color of units where they is fully sun lit (added to UnitAmbientColor). The color of units where they is fully sun lit (added to UnitAmbientColor)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitSpecularColor|type=rgb|default=unitDiffuseColor}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitShadowDensity|type=float|default=0.8&lt;br /&gt;
|description=How far from the non shadowed to the ambient color stuff in shadow will go}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularExponent|type=float|default=100}}&lt;br /&gt;
&lt;br /&gt;
== water ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   water = {&lt;br /&gt;
      damage =  0.0,&lt;br /&gt;
&lt;br /&gt;
      repeatX = 0.0,&lt;br /&gt;
      repeatY = 0.0,&lt;br /&gt;
&lt;br /&gt;
      absorb    = {0.0, 0.0, 0.0},&lt;br /&gt;
      baseColor = {0.0, 0.0, 0.0},&lt;br /&gt;
      minColor  = {0.0, 0.0, 0.0},&lt;br /&gt;
&lt;br /&gt;
      ambientFactor  = 1.0,&lt;br /&gt;
      diffuseFactor  = 1.0,&lt;br /&gt;
      specularFactor = 1.0,&lt;br /&gt;
      specularPower  = 20.0,&lt;br /&gt;
&lt;br /&gt;
      planeColor = {0.0, 0.4, 0.0},&lt;br /&gt;
&lt;br /&gt;
      surfaceColor  = {0.75, 0.8, 0.85},&lt;br /&gt;
      surfaceAlpha  = 0.55,&lt;br /&gt;
      diffuseColor  = {1.0, 1.0, 1.0},&lt;br /&gt;
      specularColor = {0.5, 0.5, 0.5},&lt;br /&gt;
&lt;br /&gt;
      fresnelMin   = 0.2,&lt;br /&gt;
      fresnelMax   = 0.8,&lt;br /&gt;
      fresnelPower = 4.0,&lt;br /&gt;
&lt;br /&gt;
      reflectionDistortion = 1.0,&lt;br /&gt;
&lt;br /&gt;
      blurBase      = 2.0,&lt;br /&gt;
      blurExponent = 1.5,&lt;br /&gt;
&lt;br /&gt;
      perlinStartFreq  =  8.0,&lt;br /&gt;
      perlinLacunarity = 3.0,&lt;br /&gt;
      perlinAmplitude  =  0.9,&lt;br /&gt;
      windSpeed = 1.0, --// does nothing yet&lt;br /&gt;
&lt;br /&gt;
      shoreWaves = true,&lt;br /&gt;
      forceRendering = false,&lt;br /&gt;
&lt;br /&gt;
      --// undefined == load them from resources.lua!&lt;br /&gt;
      --texture =       &amp;quot;&amp;quot;,&lt;br /&gt;
      --foamTexture =   &amp;quot;&amp;quot;,&lt;br /&gt;
      --normalTexture = &amp;quot;&amp;quot;,&lt;br /&gt;
      --caustics = {&lt;br /&gt;
      --   &amp;quot;&amp;quot;,&lt;br /&gt;
      --   &amp;quot;&amp;quot;,&lt;br /&gt;
      --},&lt;br /&gt;
&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=damage|type=float|default=0.0&lt;br /&gt;
|description=Number of hit points per game frame (30 frames per second) a unit will be damaged if it is in the water. As of 95.0 by default damage is also applied to hovercraft units. i wonder if this can be made to give life...?}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=repeatX|type=float|default=0.0&lt;br /&gt;
|description=effects the filing frequency of the watertexture}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=repeatY|type=float|default=0.0&lt;br /&gt;
|description=effects the filing frequency of the watertexture}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=absorb|type=rgb|default={0.0, 0.0, 0.0}&lt;br /&gt;
|description=How fast different colors (RGB in order) are absorbed by the water. Can be used to make the water look murky at deeper sections and so on. How this works: the waterabsorb value for the color channel gets multiplied by the depth of the water at a point, and this product gets subtracted from WaterBaseColor, until WaterMinColor is reached. Example: WaterAbsorb is 0.01, for the red channel, and we want to know how much red will be left in the water at a Spring elevation of -100, since 0.01*100= 1 , at this depth, there will be no more red component in the water, unless WaterMinColor is higher than 0 on the red channel}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=baseColor|type=rgb|default={0.0, 0.0, 0.0}&lt;br /&gt;
|description=The color of the water just beneath the surface plane. This is the starting color from which deeper waters will absorb more color. The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=minColor|type=rgb|default={0.0, 0.0, 0.0}&lt;br /&gt;
|description=The smallest values the water will go down to due to WaterAbsorb}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=ambientFactor|type=float|default=1.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=diffuseFactor|type=float|default=1.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularFactor|type=float|default=1.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularPower|type=float|default=20.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=planeColor|type=rgb|default={0.0, 0.4, 0.0}&lt;br /&gt;
|description=This sets the color of the groundplane under the water outside the map boundaries}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=surfaceColor|type=rgb|default={0.75, 0.8, 0.85}&lt;br /&gt;
|description=The color of the water surface. Mostly affects the colors of the reflections off the top of the water. Has no effect on bump mapped water!}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=surfaceAlpha|type=float|default=0.55&lt;br /&gt;
|description= Transparency of the water surface. 0 meaning almost fully transparent water plane(low amount of reflections visible), and 1 being nearly opaque (massive amount of reflections)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=diffuseColor|type=rgb|default=value&lt;br /&gt;
|description=This specifies the diffuse color of the water body. WARNING: use of this tag disables the effect of WaterAbsorb , in fact, this tag does nothing but disable WaterAbsorb. Avoid}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularColor|type=rgb|default=lighting.groundDiffuseColor}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fresnelMin|type=float|default=0.2}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fresnelMax|type=float|default=0.8}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fresnelPower|type=float|default=4.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=reflectionDistortion|type=float|default=1.0&lt;br /&gt;
|description=How much the surface should distort reflections that are cause by waves not being level: ergo it adds more choppyness to your reflections sensible from 0 to 20}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=blurBase|type=float|default=2.0&lt;br /&gt;
|description=Something to do with blur, but it just seems to cause banding with values under 2 and corruption with values above 10}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=blurExponent|type=float|default=1.5&lt;br /&gt;
|description=How much reflections on water surface should be blurred together with the water surface, lower values meaning clearer reflections, (0.2-5) Warning: above 5 seems to cause water corruption}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=perlinStartFreq|type=float|default=8.0&lt;br /&gt;
|description=Wave sizes, smaller = big waves, sensible: [1,20] (influence the wave sizes)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=perlinLacunarity|type=float|default=3.0&lt;br /&gt;
|description=Defines the size of the perlin waves, small values being big waves ([0.2,5] is sensible)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=perlinAmplitude|type=float|default=0.9&lt;br /&gt;
|description=Base stillness of water surface, 0 is dead still, 1 is &#039;windy&#039; .This doesnt affect the bump texture depth, besides the fact that this disables the bump texture when set to 0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=windSpeed|type=float|default=1.0&lt;br /&gt;
|description=does nothing yet}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=shoreWaves|type=bool|default=true}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=forceRendering|type=bool|default=true}}&lt;br /&gt;
&lt;br /&gt;
will have to ask about those undefined tags&lt;br /&gt;
&lt;br /&gt;
== teams ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   teams = {&lt;br /&gt;
      [0] = {startPos = {x = 2033, z = 852}},&lt;br /&gt;
      [1] = {startPos = {x = 10134, z = 852}},&lt;br /&gt;
      [2] = {startPos = {x = 0, z = 0}},&lt;br /&gt;
      [3] = {startPos = {x = 0, z = 0}},&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Holds an array of start positions&lt;br /&gt;
&lt;br /&gt;
== terrainTypes ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   terrainTypes = {&lt;br /&gt;
      [0] = {&lt;br /&gt;
         name = &amp;quot;Default&amp;quot;,&lt;br /&gt;
         hardness = 1.0,&lt;br /&gt;
         receiveTracks = true,&lt;br /&gt;
         moveSpeeds = {&lt;br /&gt;
            tank  = 1.0,&lt;br /&gt;
            kbot  = 1.0,&lt;br /&gt;
            hover = 1.0,&lt;br /&gt;
            ship  = 1.0,&lt;br /&gt;
         },&lt;br /&gt;
      },&lt;br /&gt;
      [1]  = { &lt;br /&gt;
         ...&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Holds an array of start types where each element contains:&lt;br /&gt;
&lt;br /&gt;
{{tag|name=name|type=string&lt;br /&gt;
|description=A label for the terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=hardness|type=float|range=[0.001-max]|default=1.0&lt;br /&gt;
|description=Used as a multiplier against the mapinfo.mapHardness value. Can be used to make a particular terrain type softer or harder. A value of &#039;1&#039; will make it as hard as MapHardness, and 0.5 will make it half as hard}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=receiveTracks|type=bool|default=true&lt;br /&gt;
|description= Effects whether track decals will be placed on the ground from moving vehicles}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.tank|type=float|range=[0.0-max]|default=1.0&lt;br /&gt;
|description= Speed multiplier for tanks when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.kbot|type=float|range=[0.0-max]|default=1.0&lt;br /&gt;
|description= Speed multiplier for kbots when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.hover|type=float|range=[0.0-max]|default=1.0&lt;br /&gt;
|description= Speed multiplier for hovercraft when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.ship|type=float|range=[0.0-max]|default=1&lt;br /&gt;
|description= Speed multiplier for ships when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
== custom ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   custom = {&lt;br /&gt;
      fog = {&lt;br /&gt;
         color    = {0.26, 0.30, 0.41},&lt;br /&gt;
         height   = &amp;quot;80%&amp;quot;, --// allows either absolue sizes or in percent of map&#039;s MaxHeight&lt;br /&gt;
         fogatten = 0.003,&lt;br /&gt;
      },&lt;br /&gt;
      precipitation = {&lt;br /&gt;
         density   = 30000,&lt;br /&gt;
         size      = 1.5,&lt;br /&gt;
         speed     = 50,&lt;br /&gt;
         windscale = 1.2,&lt;br /&gt;
         texture   = &#039;LuaGaia/effects/snowflake.png&#039;,&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Map Dev]]&lt;/div&gt;</summary>
		<author><name>Jivvz</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua:Callins&amp;diff=10798</id>
		<title>Lua:Callins</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua:Callins&amp;diff=10798"/>
		<updated>2018-03-23T20:05:47Z</updated>

		<summary type="html">&lt;p&gt;Jivvz: /* Input */ added link to key code lookup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Lua Callins =&lt;br /&gt;
This page is future looking to unified widget/gadget (aka &amp;quot;addon&amp;quot;) handler, which may yet be some way off, c.f. the [https://github.com/spring/spring/blob/ebb704e008f6ea645947d07be1cfcc272af0428f/doc/changelog.txt#L71 changelog].&lt;br /&gt;
&lt;br /&gt;
Related Sourcecode :&lt;br /&gt;
[https://github.com/spring/spring/blob/d9b3927a528a876b9ab4042771e82b050267572a/rts/Lua/LuaHandle.cpp https://github.com/spring/spring/rts/Lua/LuaHandle.cpp]&lt;br /&gt;
&lt;br /&gt;
For now, to use these addons in a widget, replace addon with widget and, for a gadget, replace addon with gadget. For example,&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    function widget:UnitCreated(unitID, unitDefID, unitTeam, builderID)&lt;br /&gt;
        ...  &lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some functions may differ between (synced) gadget and widgets; those are in the [[#Synced_-_Unsynced_Shared]] section. Essentially the reason is that all information should be available to synced (game logic controlling) gadgets, but restricted to unsynced gadget/widget (e.g. information about an enemy unit only detected via radar and not yet in LOS). In such cases the full (synced) param list is documented.&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Initialize&lt;br /&gt;
|info = Called when the addon is (re)loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Shutdown&lt;br /&gt;
|info = Called when the addon or the game is shutdown.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsynced Only ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DefaultCommand&lt;br /&gt;
|args = type, id&lt;br /&gt;
|return = {{type|number}} cmdID&lt;br /&gt;
|info = Used to set the default command when a unit is selected. First parameter is the type of the object pointed at (either &amp;quot;unit or &amp;quot;feature&amp;quot;) and the second is its {{var|unitID}} or {{var|featureID}} respectively. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = CommandNotify&lt;br /&gt;
|args = cmdID, cmdParams, cmdOptions&lt;br /&gt;
|return = {{type|bool}} removeCmd&lt;br /&gt;
|info = Called when a command is issued. Returning {{value|true}} deletes the command and does not send it through the network.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = CommandsChanged&lt;br /&gt;
|args = None&lt;br /&gt;
|return = ?&lt;br /&gt;
|info = Called when the command descriptions changed, e.g. when selecting or deselecting a unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = WorldTooltip&lt;br /&gt;
|args = ttType, data1, data2, data3&lt;br /&gt;
|return = {{type|string}} newTooltip&lt;br /&gt;
|info = The parameters can be {{value|&amp;quot;unit&amp;quot;}}, {{var|unitID}}; {{value|&amp;quot;feature&amp;quot;}}, {{var|featureID}}; {{value|&amp;quot;ground&amp;quot;}}, {{var|posX}}, {{var|posY}}, {{var|posZ}} or {{value|&amp;quot;selection&amp;quot;}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnsyncedHeightMapUpdate&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = Called when the unsynced copy of the height-map is altered.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameProgress&lt;br /&gt;
|args = serverFrameNum&lt;br /&gt;
|info = Called every 60 frames, calculating delta between GameFrame and GameProgress. Can give an ETA about catching up with simulation for mid-game join players.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameSetup&lt;br /&gt;
|args =  state, ready, playerStates&lt;br /&gt;
|return = {{type|bool}} success, {{type|bool}} newReady&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = SunChanged&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AddConsoleLine&lt;br /&gt;
|args = msg, priority&lt;br /&gt;
|info = Called when text is entered into the console (e.g. Spring.Echo).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RecvSkirmishAIMessage&lt;br /&gt;
|args = aiTeam, dataStr&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RecvFromSynced&lt;br /&gt;
|args = ...&lt;br /&gt;
|info = Receives data sent via [[Lua_System#Synced|SendToUnsynced]] callout.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Save&lt;br /&gt;
|args = zip&lt;br /&gt;
|info = Called when a chat command &#039;/save&#039; or &#039;/savegame&#039; is received. The single argument is a userdatum representing the savegame zip file. See [[Lua_SaveLoad#Save_.28_zip_.29_-.3E_nil|Lua_SaveLoad]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = LoadProgress&lt;br /&gt;
|args = message, replaceLastLine&lt;br /&gt;
|info = Only available to LuaIntro.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GroupChanged&lt;br /&gt;
|args = groupID&lt;br /&gt;
|info = Called when a unit is added to or removed from a control group. Currently implemented for widgets only.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ConfigureLayout&lt;br /&gt;
|args = ???&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Input ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = IsAbove&lt;br /&gt;
|args = x, y&lt;br /&gt;
|return = {{type|bool}} isAbove&lt;br /&gt;
|info = Called every Update. Must return {{value|true}} for {{name|Mouse*}} events and {{name|GetToolTip}} to be called.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GetTooltip&lt;br /&gt;
|args = x, y&lt;br /&gt;
|return = {{type|string}} tooltip&lt;br /&gt;
|info = Called when {{name|IsAbove}} returns {{value|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = KeyPress&lt;br /&gt;
|args = key, mods, isRepeat&lt;br /&gt;
|return = {{type|bool}} becomeOwner&lt;br /&gt;
|info = Called repeatedly when a key is pressed down. If you want an action to occur only once check for {{var|1=isRepeat == {{value|false}}}}. The {{var|mods}} parameter is a {{type|table}}, with keys {{value|&amp;quot;alt&amp;quot;}}, {{value|&amp;quot;ctrl&amp;quot;}}, {{value|&amp;quot;meta&amp;quot;}} and {{value|&amp;quot;shift&amp;quot;}} each having a boolean value. Return {{value|true}} if you don&#039;t want other callins or the engine to also receive this keypress. A list of key codes can be seen at the [https://wiki.libsdl.org/SDLKeycodeLookup SDL wiki].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = KeyRelease&lt;br /&gt;
|args = key&lt;br /&gt;
|return = {{type|bool}}&lt;br /&gt;
|info = Called when the key is released.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TextInput&lt;br /&gt;
|args = utf8char&lt;br /&gt;
|info = Called whenever a key press results in text input. Introduced in 97.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = JoystickEvent&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MousePress&lt;br /&gt;
|args = x, y, button&lt;br /&gt;
|return = {{type|bool}} becomeMouseOwner&lt;br /&gt;
|info = Called when a mouse button is pressed. The {{var|button}} parameter supports up to 7 buttons. Must return {{value|true}} for {{name|MouseRelease}} and other functions to be called.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MouseRelease&lt;br /&gt;
|args = x, y, button&lt;br /&gt;
|return = bool becomeMouseOwner&lt;br /&gt;
|info = Called when a mouse button is released. Please note that in order to have Spring call {{name|MouseRelease}}, you need to have a {{name|MousePress}} call-in in the same addon that returns {{value|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MouseWheel&lt;br /&gt;
|args = up, value&lt;br /&gt;
|info = Called when the mouse wheel is moved. The parameters indicate the direction and amount of travel.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MouseMove&lt;br /&gt;
|args = x, y, dx, dy, button&lt;br /&gt;
|info = Called when the mouse is moved. The {{var|dx}} and {{var|dy}} parameters indicate the distance travelled, whereas the first two indicate the final position.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Players ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = PlayerChanged&lt;br /&gt;
|args = playerID&lt;br /&gt;
|info = Called whenever a player&#039;s status changes e.g. becoming a spectator.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = PlayerAdded&lt;br /&gt;
|args = playerID&lt;br /&gt;
|info = Called whenever a new player joins the game.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = PlayerRemoved&lt;br /&gt;
|args = playerID, reason&lt;br /&gt;
|info = Called whenever a player is removed from the game.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadStarted&lt;br /&gt;
|args = id&lt;br /&gt;
|info = Called when a [[Pr-downloader]] download is started via [[Lua_VFS#Archives|VFS.DownloadArchive]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadFinished&lt;br /&gt;
|args = id&lt;br /&gt;
|info = Called when a [[Pr-downloader]] download finishes successfully.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadFailed&lt;br /&gt;
|args = id, errorID&lt;br /&gt;
|info = Called when a [[Pr-downloader]] download fails to complete.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadProgress&lt;br /&gt;
|args = id, downloaded, total&lt;br /&gt;
|info = Called incrementally during a [[Pr-downloader]] download.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Drawing ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ViewResize&lt;br /&gt;
|args = viewSizeX, viewSizeY&lt;br /&gt;
|info = Called whenever the window is resized.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Update&lt;br /&gt;
|args = dt&lt;br /&gt;
|info = Called for every draw frame. The parameter is the time since the last update. Perform calculations in here and only drawing in Draw* callins.}}&lt;br /&gt;
&lt;br /&gt;
Inside the Draw* functions, you can use the [[Lua_OpenGL_Api | Lua OpenGL Api]] to draw graphics.&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGenesis&lt;br /&gt;
|info = Doesn&#039;t render to screen! Use this callin to update textures, shaders, etc. Also available to LuaMenu.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldPreParticles&lt;br /&gt;
|info = ??? {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldPreUnit&lt;br /&gt;
|info = Spring draws units, features, some water types, cloaked units, and the sun.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorld&lt;br /&gt;
|info = Spring draws command queues, &#039;map stuff&#039;, and map marks.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldShadow&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldReflection&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldRefraction&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGroundPreForward&lt;br /&gt;
|info = Runs at the start of the forward pass when a custom map shader has been assigned via [[Lua_UnsyncedCtrl#Map|{{name|Spring.SetMapShader}}]] (convenient for setting uniforms).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGroundPreDeferred&lt;br /&gt;
|info = Runs at the start of the deferred pass when a custom map shader has been assigned via [[Lua_UnsyncedCtrl#Map|{{name|Spring.SetMapShader}}]] (convenient for setting uniforms).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGroundPostDeferred&lt;br /&gt;
|info = This runs at the end of its respective deferred pass and allows proper frame compositing (with ground flashes/decals/foliage/etc, which are drawn between it and [[#API:DrawWorldPreUnit|{{name|DrawWorldPreUnit}}]]) via [[Lua_OpenGL_Api#Textures|{{name|gl.CopyToTexture}}]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawUnitsPostDeferred&lt;br /&gt;
|info = Runs at the end of the unit deferred pass to inform Lua code it should make use of the {{value|$model_gbuffer_*}} textures before another pass overwrites them (and to allow proper blending with e.g. cloaked objects which are drawn between these events and [[#API:DrawWorld|{{name|DrawWorld}}]] via [[Lua_OpenGL_Api#Textures|{{name|gl.CopyToTexture}}]]). N.B. The *PostDeferred events are only sent (and only have a real purpose) if forward drawing is disabled.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawFeaturesPostDeferred&lt;br /&gt;
|info = Runs at the end of the feature deferred pass to inform Lua code it should make use of the {{value|$model_gbuffer_*}} textures before another pass overwrites them (and to allow proper blending with e.g. cloaked objects which are drawn between these events and [[#API:DrawWorld|{{name|DrawWorld}}]] via [[Lua_OpenGL_Api#Textures|{{name|gl.CopyToTexture}}]]). N.B. The *PostDeferred events are only sent (and only have a real purpose) if forward drawing is disabled.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawScreen&lt;br /&gt;
|args = vsx, vsy&lt;br /&gt;
|info = ??? Also available to LuaMenu.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawScreenEffects&lt;br /&gt;
|args = vsx, vsy&lt;br /&gt;
|info = Where {{var|vsx}}, {{var|vsy}} are screen coordinates.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawScreenPost&lt;br /&gt;
|args = vsx, vsy&lt;br /&gt;
|info = {{new|104.0}} Similar to {{name|DrawScreenEffects}}, this can be used to alter the contents of a frame after it has been completely rendered (i.e. World, MiniMap, Menu, UI).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawLoadScreen&lt;br /&gt;
|info = {{new|95.0}} Only available to LuaIntro, draws custom load screens.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawInMinimap&lt;br /&gt;
|args = sx, sy&lt;br /&gt;
|info = Where {{var|sx}}, {{var|sy}} are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawInMinimapBackground&lt;br /&gt;
|args = sx, sy&lt;br /&gt;
|info = Where {{var|sx}}, {{var|sy}} are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Custom Object Rendering ===&lt;br /&gt;
For the following calls {{var|drawMode}} can be one of the following, {{var|1=notDrawing = {{value|0}}}}, {{var|1=normalDraw = {{value|1}}}}, {{var|1=shadowDraw = {{value|2}}}}, {{var|1=reflectionDraw = {{value|3}}}}, {{var|1=refractionDraw = {{value|4}}}}, and finally {{var|1=gameDeferredDraw = {{value|5}}}} which was added in 102.0.&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawUnit&lt;br /&gt;
|args = unitID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of units, [[Lua_UnitRendering#Lua.27s_DrawXYZ-Callin|enabled here]].	&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawFeature&lt;br /&gt;
|args = unitID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of features, [[Lua_UnitRendering#Lua.27s_DrawXYZ-Callin|enabled here]].	&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawShield&lt;br /&gt;
|args = unitID, weaponID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of [[Gamedev:WeaponDefs#Shield_(WeaponType)|shields]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawProjectile&lt;br /&gt;
|args = projectileID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of weapon (&amp;amp; other) projectiles.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unsynced Menu Only ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowDraw&lt;br /&gt;
|return = {{type|bool}} allowDraw&lt;br /&gt;
|info = Enables Draw{Genesis,Screen,ScreenPost} callins if {{value|true}} is returned, otherwise they are called once every 30 seconds. Only active when a game isn&#039;t running.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ActivateMenu&lt;br /&gt;
|info = Called whenever LuaMenu is on with no game loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ActivateGame&lt;br /&gt;
|info = Called whenever LuaMenu is on with a game loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Synced - Unsynced Shared ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GotChatMsg&lt;br /&gt;
|args = msg, player&lt;br /&gt;
|info = Called when a player issues a UI command e.g. types {{var|/foo}} or {{var|/luarules foo}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Game ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameID&lt;br /&gt;
|args = gameID&lt;br /&gt;
|info = Called once to deliver the {{var|gameID}}. As of 101.0+ the string is encoded in hex.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GamePaused&lt;br /&gt;
|info = Called when the game is paused.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameOver&lt;br /&gt;
|args = winningAllyTeams&lt;br /&gt;
|info = The parameter is a {{type|table}} list of winning allyTeams, if empty the game result was undecided (like when dropping from an host).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameFrame&lt;br /&gt;
|args = frame&lt;br /&gt;
|info = Called for every game simulation frame (30 per second). Starts at frame {{value|0}} in 101.0+ and {{value|1}} in previous versions.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GamePreload&lt;br /&gt;
|info = Called before the 0 gameframe. From 104.0 onwards, will not be called when a saved game is loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameStart&lt;br /&gt;
|info = Called upon the start of the game. From 104.0 onwards, will not be called when a saved game is loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TeamChanged&lt;br /&gt;
|args = teamID&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TeamDied&lt;br /&gt;
|args = teamID&lt;br /&gt;
|info = Called when a team dies (see [[Lua_SyncedCtrl#Game_End|Spring.KillTeam]]).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Units ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCreated&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, builderID&lt;br /&gt;
|info = Called at the moment the unit is created.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitFinished&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called at the moment the unit is completed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitFromFactory&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, factID, factDefID, userOrders&lt;br /&gt;
|info = Called when a factory finishes construction of a unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitReverseBuilt&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a living unit becomes a nanoframe again.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitGiven&lt;br /&gt;
|args = unitID, unitDefID, newTeam, oldTeam&lt;br /&gt;
|info = Called when a unit is transferred between teams. This is called after {{name|UnitTaken}} and in that moment unit is assigned to the &#039;&#039;&#039;newTeam&#039;&#039;&#039;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitTaken&lt;br /&gt;
|args = unitID, unitDefID, oldTeam, newTeam&lt;br /&gt;
|info = Called when a unit is transferred between teams. This is called before {{name|UnitGiven}} and in that moment unit is still assigned to the &#039;&#039;&#039;oldTeam&#039;&#039;&#039;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitDamaged&lt;br /&gt;
|args =  unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|info = Called when a unit is damaged (after {{name|UnitPreDamaged}}).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitDestroyed&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|info = Called when a unit is destroyed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RenderUnitDestroyed&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called just before a unit is invalid, after it finishes its death animation. {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitStunned&lt;br /&gt;
|args =  unitID, unitDefID, unitTeam, stunned&lt;br /&gt;
|info = Called when a unit changes its stun status. {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitUnitCollision&lt;br /&gt;
|args = colliderID, collideeID&lt;br /&gt;
|info = Called when two units collide. Both units must be registered with [[Lua_System#Synced|Script.SetWatchUnit]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitFeatureCollision&lt;br /&gt;
|args = colliderID, collideeID&lt;br /&gt;
|info = Called when a unit collides with a feature. The unit must be registered with [[Lua_System#Synced|Script.SetWatchUnit]] and the feature registered with [[Lua_System#Synced|Script.SetWatchFeature]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCommand&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOpts, cmdTag&lt;br /&gt;
|info = Called after when a unit accepts a command, after {{name|AllowCommand}} returns {{value|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCmdDone&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOpts, cmdTag&lt;br /&gt;
|info = Called when a unit completes a command.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLoaded&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, transportID, transportTeam&lt;br /&gt;
|info = Called when a unit is loaded by a transport.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitUnloaded&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, transportID, transportTeam&lt;br /&gt;
|info = Called when a unit is unloaded by a transport.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitExperience&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, experience, oldExperience&lt;br /&gt;
|info = Called when a unit gains experience greater or equal to the minimum limit set by calling [[Lua_SyncedCtrl#Other|Spring.SetExperienceGrade]]. Should be called more reliably with small values of experience grade in 104.0+.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitIdle&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit is idle (empty command queue).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCloaked&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit cloaks.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitDecloaked&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit decloaks.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitMoved&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented in base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitMoveFailed&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented in base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = StockpileChanged&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, weaponNum, oldCount, newCount&lt;br /&gt;
|info = Called when a units stockpile of weapons increases or decreases. See {{xtaglink|Gamedev:WeaponDefs|stockpile}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredLos&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit enters LOS of an allyteam.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftLos&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit leaves LOS of an allyteam.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredRadar&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit enters radar of an allyteam.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftRadar&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit leaves radar of an allyteam.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredAir&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftAir&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredWater&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftWater&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitSeismicPing&lt;br /&gt;
|args = x, y, z, strength, allyTeam, unitID, unitDefID&lt;br /&gt;
|info = Called when a unit emits a seismic ping. See {{xtaglink|Gamedev:UnitDefs|seismicSignature}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Features ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureCreated&lt;br /&gt;
|args = featureID, allyTeamID&lt;br /&gt;
|info = Called when a feature is created.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureDamaged&lt;br /&gt;
|args =  featureID, featureDefID, featureTeam, damage, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|info = Called when a feature is damaged.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureDestroyed&lt;br /&gt;
|args = featureID, allyTeamID&lt;br /&gt;
|info = Called when a feature is destroyed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureMoved&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Projectiles ===&lt;br /&gt;
The following Callins are only called for weaponDefIDs registered via [[Lua_System#Synced|Script.SetWatchWeapon]].&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ProjectileCreated&lt;br /&gt;
|args = proID, proOwnerID, weaponDefID&lt;br /&gt;
|info = Called when the projectile is created. Note that {{var|weaponDefID}} is missing if the projectile is spawned as part of a burst, but [[Lua_SyncedRead#Projectiles|Spring.GetProjectileDefID]] and [[Lua_SyncedRead#Projectiles|Spring.GetProjectileName]] still work in callin scope using {{var|proID}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ProjectileDestroyed&lt;br /&gt;
|args = proID&lt;br /&gt;
|info = Called when the projectile is destroyed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Synced Only ==&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = CommandFallback&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag&lt;br /&gt;
|return = {{type|bool}} used, {{type|bool}} finished&lt;br /&gt;
|info = Called when the unit reaches an unknown command in its queue (i.e. one not handled by the engine). If no addon returns {{var|used}} as {{value|true}} the command is dropped, if an addon returns {{value|true}}, {{value|true}} the command is removed because it&#039;s done, with {{value|true}}, {{value|false}} it&#039;s kept in the queue and {{name|CommandFallback}} gets called again on the next slowupdate.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowCommand&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag, synced&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called when the command is given, before the unit&#039;s queue is altered. The return value is whether it should be let into the queue. The queue remains untouched when a command is blocked, whether it would be queued or replace the queue.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowUnitCreation&lt;br /&gt;
|args = unitDefID, builderID, builderTeam, x, y, z, facing&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before unit is created, the boolean return value determines whether or not the creation is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowUnitTransfer&lt;br /&gt;
|args = unitID, unitDefID, oldTeam, newTeam, capture&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before a unit is transferred to a different team, the boolean return value determines whether or not the transfer is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowUnitBuildStep&lt;br /&gt;
|args = builderID, builderTeam, unitID, unitDefID, part&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before a unit progresses its build percentage, the boolean return value determines whether or not the build makes progress.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowFeatureCreation&lt;br /&gt;
|args = featureDefID, teamID, x, y, z&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before feature is created, the boolean return value determines whether or not the creation is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowFeatureBuildStep&lt;br /&gt;
|args = builderID, builderTeam, featureID, featureDefID, part&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before a feature progresses its build percentage, the boolean return value determines whether or not the progress change is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowResourceLevel&lt;br /&gt;
|args = teamID, res, level&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called when a team sets the sharing level of a resource, the boolean return value determines whether or not the sharing level is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowResourceTransfer&lt;br /&gt;
|args = oldTeamID, newTeamID, res, amount&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before resources are transferred between players, the boolean return value determines whether or not the transfer is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowStartPosition&lt;br /&gt;
|args = playerID, teamID, readyState, clampedX, clampedY, clampedZ, rawX, rawY, rawZ&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = {{var|clamped{X,Y,Z}}} are the coordinates clamped into start-boxes, {{var|raw}} is where player tried to place their marker. The {{var|readyState}} can be any one of &lt;br /&gt;
* {{value|0}} - player picked a position, &lt;br /&gt;
* {{value|1}} - player clicked ready, &lt;br /&gt;
* {{value|2}} - player pressed ready OR  the game was force-started (player did not click ready, but is now forcibly readied) or &lt;br /&gt;
* {{value|3}} - the player failed to load. &lt;br /&gt;
* {{new|95.0}} the default &#039;failed to choose&#039; start-position is the north-west point of their startbox, or (0,0,0) if they do not have a startbox. &lt;br /&gt;
NB: The order of the parameters changed with the addition of {{var|teamID}} in 104.0. Previouly it was:&lt;br /&gt;
{{var|clampedX, clampedY, clampedZ, playerID, readyState, rawX, rawY, rawZ}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowDirectUnitControl&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, playerID&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Determines if this unit can be controlled directly in FPS view.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowWeaponTargetCheck&lt;br /&gt;
|args = attackerID, attackerWeaponNum, attackerWeaponDefID&lt;br /&gt;
|return = {{type|bool}} allowCheck, {{type|bool}} ignoreCheck&lt;br /&gt;
|info = Determines if this weapon can automatically generate targets itself. See also {{xtaglink|Gamedev:WeaponDefs|commandFire}} weaponDef tag. The {{var|ignoreCheck}} return value was added in 99.0 to allow ignoring the callin i.e. running normal engine check for this weapon.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowWeaponTarget&lt;br /&gt;
|args = attackerID, targetID, attackerWeaponNum, attackerWeaponDefID, defPriority&lt;br /&gt;
|return = {{type|bool}} allowed, {{type|number}} newPriority&lt;br /&gt;
|info = Controls blocking of a specific target from being considered during a weapon&#039;s periodic auto-targeting sweep. The second return value is the new priority for this target (if you don&#039;t want to change it, return {{var|defPriority}}). Lower priority targets are targeted first.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowWeaponInterceptTarget&lt;br /&gt;
|args = interceptorUnitID, interceptorWeaponID, targetProjectileID&lt;br /&gt;
|return = {{type|bool}} allowed&lt;br /&gt;
|info = Controls blocking of a specific intercept target from being considered during an {{xtaglink|Gamedev:WeaponDefs|interceptor}} weapon&#039;s periodic auto-targeting sweep. Only called for {{var|weaponDefIDs}} registered via [[Lua_System#Synced|Script.SetWatchWeapon]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowBuilderHoldFire&lt;br /&gt;
|args = unitID, unitDefID, action&lt;br /&gt;
|return = {{type|bool}} actionAllowed&lt;br /&gt;
|info = {{new|98.0}} {{Sourcelinkhash|5a82d750b89e72024bb0bb62cf05ea257737e0ac}}   Called when a construction unit wants to &amp;quot;use his nano beams&amp;quot;.&amp;lt;br&amp;gt;{{var|action}} is one of following:&lt;br /&gt;
* {{value|-1}} Build&lt;br /&gt;
* {{value|CMD.REPAIR}} Repair&lt;br /&gt;
* {{value|CMD.RECLAIM}} Reclaim&lt;br /&gt;
* {{value|CMD.RESTORE}} Restore&lt;br /&gt;
* {{value|CMD.RESURRECT}} Resurrect&lt;br /&gt;
* {{value|CMD.CAPTURE}} Capture&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Explosion&lt;br /&gt;
|args = weaponDefID, px, py, pz, AttackerID, ProjectileID&lt;br /&gt;
|return = {{type|bool}} noGfx&lt;br /&gt;
|info = Called when an explosion occurs. If it returns {{value|true}} then no graphical effects are drawn by the engine for this explosion.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TerraformComplete&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, buildUnitID, buildUnitDefID, buildUnitTeam&lt;br /&gt;
|return = {{type|bool}} stop&lt;br /&gt;
|info = Called when pre-building terrain levelling terraforms are completed (c.f. {{xtaglink|Gamedev:UnitDefs|levelGround}}). If the return value is {{value|true}} the current build order is terminated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MoveCtrlNotify&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, data&lt;br /&gt;
|return = {{type|bool}} moveCtrlComplete&lt;br /&gt;
|info = Enable both [[Lua_MoveCtrl#Options|Spring.MoveCtrl.SetCollideStop]] and [[Lua_MoveCtrl#Options|Spring.MoveCtrl.SetTrackGround]] to enable this call-in, data was supposed to indicate the type of notification but currently never has a value other than {{value|1}} (&amp;quot;unit hit the ground&amp;quot;). The return value determines whether or not the unit should remain script-controlled ({{value|false}}) or return to engine controlled movement ({{value|true}}).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RecvLuaMsg&lt;br /&gt;
|args = msg, playerID&lt;br /&gt;
|info = Receives messages from unsynced sent via [[Lua_UnsyncedCtrl#SendLuaMessage|Spring.SendLuaRulesMsg]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Load&lt;br /&gt;
|args = zip&lt;br /&gt;
|info = Called after {{name|GamePreload}} and before {{name|GameStart}}. See [[Lua_SaveLoad#Load_.28_zip_.29_-.3E_nil|Lua_SaveLoad]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Damage Controllers ===&lt;br /&gt;
For the following callins, in addition to being a regular weapon, {{var|weaponDefID}} may be one of the following:&lt;br /&gt;
* {{value|-1}} - debris collision, also default of [[Lua_SyncedCtrl#Unit_Control|Spring.AddUnitDamage]]&lt;br /&gt;
* {{value|-2}} - ground collision&lt;br /&gt;
* {{value|-3}} - object collision&lt;br /&gt;
* {{value|-4}} - fire damage&lt;br /&gt;
* {{value|-5}} - water damage&lt;br /&gt;
* {{value|-6}} - kill damage&lt;br /&gt;
* {{value|-7}} - crush damage&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitPreDamaged&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|return = {{type|number}} newDamage, {{type|number}} impulseMult&lt;br /&gt;
|info = Called before damage is applied to the unit, allows fine control over how much damage and [http://en.wikipedia.org/wiki/Impulse_(physics) impulse] is applied.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ShieldPreDamaged&lt;br /&gt;
|args = proID, proOwnerID, shieldEmitterWeaponNum, shieldCarrierUnitID, bounceProjectile, beamEmitterWeaponNum, beamEmitterUnitID, startX, startY, startZ, hitX, hitY, hitZ&lt;br /&gt;
|return = {{type|bool}} handleCollision&lt;br /&gt;
|info = Called before any engine shield-vs-projectile logic executes. If the return value is {{value|true}} the gadget handles the collision event and the engine does not remove the projectile. If the weapon is a hitscan type ([[Gamedev:WeaponDefs#Tag:weaponType|BeamLaser]] or [[Gamedev:WeaponDefs#Tag:weaponType|LightningCanon]]) then {{var|proID}} is {{value|nil}} and {{var|beamEmitterWeaponNum}} and {{var|beamEmitterUnitID}} are populated instead. The start and hit position arguments are provided from 104.0 onwards.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeaturePreDamaged&lt;br /&gt;
|args = featureID, featureDefID, featureTeam, damage, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|return = {{type|number}} newDamage, {{type|number}} impulseMult&lt;br /&gt;
|info = Called before damage is applied to the feature, allows fine control over how much damage and [http://en.wikipedia.org/wiki/Impulse_(physics) impulse] is applied.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category: Lua]]&lt;/div&gt;</summary>
		<author><name>Jivvz</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Jivvz&amp;diff=20739</id>
		<title>User:Jivvz</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Jivvz&amp;diff=20739"/>
		<updated>2018-03-23T20:00:42Z</updated>

		<summary type="html">&lt;p&gt;Jivvz: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jivvz</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Jivvz&amp;diff=20738</id>
		<title>User:Jivvz</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Jivvz&amp;diff=20738"/>
		<updated>2018-03-23T19:58:52Z</updated>

		<summary type="html">&lt;p&gt;Jivvz: Created page with &amp;quot;aka his_face&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;aka his_face&lt;/div&gt;</summary>
		<author><name>Jivvz</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=RapidTools&amp;diff=15636</id>
		<title>RapidTools</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=RapidTools&amp;diff=15636"/>
		<updated>2017-03-04T20:18:56Z</updated>

		<summary type="html">&lt;p&gt;Jivvz: /* Compile */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RapidTools are for managing a [[rapid]] game/archive repository.&lt;br /&gt;
&lt;br /&gt;
Made by det&lt;br /&gt;
&lt;br /&gt;
=Source=&lt;br /&gt;
https://github.com/spring/RapidTools&lt;br /&gt;
&lt;br /&gt;
=Bugs=&lt;br /&gt;
https://github.com/spring/RapidTools/issues&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Compile=&lt;br /&gt;
to compile it on ubuntu:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/spring/RapidTools.git --recursive&lt;br /&gt;
sudo apt-get install liblua5.1-0-dev libzip-dev zlib1g-dev cmake libssl-dev&lt;br /&gt;
cmake .&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tool description=&lt;br /&gt;
==AddZip==&lt;br /&gt;
&lt;br /&gt;
takes a .zip and adds it to the repo with user specified tags:&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
AddZip &amp;lt;Store Path&amp;gt; &amp;lt;Zip Path&amp;gt; [Tag1] ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BuildGit==&lt;br /&gt;
&lt;br /&gt;
adds a git path to the repo and generates the tags automatically from the commit message, it also optimizes for incremental updates&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
BuildGit &amp;lt;Git Path&amp;gt; &amp;lt;Mod Root&amp;gt; &amp;lt;Modinfo&amp;gt; &amp;lt;Store Path&amp;gt; &amp;lt;Git Hash&amp;gt; &amp;lt;Prefix&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Streamer==&lt;br /&gt;
&lt;br /&gt;
is a cgi program to serve some specific files of a .sdp. This is the fastest and official way to fetch a rapid archive.&lt;br /&gt;
&lt;br /&gt;
at client side you have to http POST:&lt;br /&gt;
http://packages.springrts.com/streamer.cgi?&amp;lt;hash of sdp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
post data is binary 0/1 if a file of the specified sdp is needed or not.&lt;br /&gt;
&lt;br /&gt;
streamer.cgi then returns all files in a single stream in the same order than in the sdp. it has to be in the root of a [[rapid]] file structure.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Usage: ./Streamer&lt;br /&gt;
Expects environment variables DOCUMENT_ROOT and QUERY_STRING&lt;br /&gt;
Expects a gziped bitarray as stdin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for details see the source-code:&lt;br /&gt;
https://github.com/spring/RapidTools/blob/master/Tools/Streamer.cpp#L68&lt;br /&gt;
&lt;br /&gt;
==MakeZip==&lt;br /&gt;
&lt;br /&gt;
can create a zip from a .sdp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
MakeZip ~/.spring ba:stable ba.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Notes===&lt;br /&gt;
&lt;br /&gt;
If you get this error:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Error on unknown tag lookup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MakeZip doesn&#039;t find the tag specified in (for example) ~/.spring/versions.gz. To fix, copy the required versions.gz:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cp ~/.spring/rapid/packages.springrts.com/versions.gz ~/.spring/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: Download Systems]]&lt;/div&gt;</summary>
		<author><name>Jivvz</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Rapid&amp;diff=15606</id>
		<title>Rapid</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Rapid&amp;diff=15606"/>
		<updated>2017-02-21T08:40:23Z</updated>

		<summary type="html">&lt;p&gt;Jivvz: /* creating a release */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;quot;Rapid&amp;quot; is a concept for storing &amp;quot;archives&amp;quot; for spring. It consists of multiple indexes:&lt;br /&gt;
&lt;br /&gt;
* index of all known rapid repos: http://repos.springrts.com/repos.gz&lt;br /&gt;
* index of all known archives in a repo: http://packages.springrts.com/versions.gz, http://zk.repo.springrts.com/versions.gz, ...&lt;br /&gt;
* index of a single game/map/content archive: .sdp which lists all files inside the &amp;quot;pool&amp;quot; directory&lt;br /&gt;
&lt;br /&gt;
spring can directly read .sdp and the pool directory which contains the real files of an archive. multiple .sdp can share the same files in a pool which makes &amp;quot;rapid&amp;quot; so efficient in storage.&lt;br /&gt;
&lt;br /&gt;
Serverside [[RapidTools]] are used to manage the repository of all games.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Using rapid as Gamedev=&lt;br /&gt;
If a Gamedev wants to use rapid, he needs to use a git repository for his game where the game archive is in the .sdd format stored:&lt;br /&gt;
&lt;br /&gt;
The git repository needs to contains a folder which is in the structre of a .sdd. in modinfo.lua version has to be&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
version = &#039;$VERSION&#039;,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
$VERSION later on will be replaced by the git commit number or, when a release is made, the version number of the release.&lt;br /&gt;
&lt;br /&gt;
==Creating a release==&lt;br /&gt;
When the git repository is connected to rapid, a release can be made by making a git-commit with a commit message in the format:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
VERSION{x.xx}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where everything in the brackets will replace $VERSION in modinfo.lua.&lt;br /&gt;
&lt;br /&gt;
This will create a tag :stable for this commit and create an archive at http://&#039;&#039;gamename&#039;&#039;.repo.springrts.com/builds/, i.e. http://i18n.repo.springrts.com/builds/ which can be distributed/uploaded to different sites if needed.&lt;br /&gt;
It is also automatically published to upq at http://api.springfiles.com/ which all current download systems have access to; you can validate what happened there, too.&lt;br /&gt;
&lt;br /&gt;
===Adding your game to the rapid download system===&lt;br /&gt;
Please create a new issue at https://github.com/spring/RapidTools/issues and report the location of your git repository and the wanted rapid tag.&lt;br /&gt;
&lt;br /&gt;
To download you can use one of the [[Rapid_Tags]].&lt;br /&gt;
&lt;br /&gt;
=Files structures=&lt;br /&gt;
&lt;br /&gt;
file structure of rapid is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
/versions.gz&lt;br /&gt;
/repos.gz&lt;br /&gt;
/packages/&lt;br /&gt;
/pool/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==list of rapid repositories: repos.gz==&lt;br /&gt;
gziped text file which has a list of all rapid repositories.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
main,http://packages.springrts.com,,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for springrts it is:&lt;br /&gt;
http://repos.springrts.com/repos.gz&lt;br /&gt;
&lt;br /&gt;
==list of archives on a mirror: versions.gz==&lt;br /&gt;
gziped text file which has a list of all sdp archives in this repository.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ba-tronic:version:7.12-tronic1,baafb4fb215c60873e7d10e7ec600dc5,Balanced Annihilation V7.12,Balanced Annihilation V7.12-tronic1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
the md5 hash is the filename of the sdp of the archive. so for example:&lt;br /&gt;
&lt;br /&gt;
http://packages.springrts.com/packages/baafb4fb215c60873e7d10e7ec600dc5.sdp&lt;br /&gt;
&lt;br /&gt;
==folder with index archives: /packages/==&lt;br /&gt;
this folder contains all available packages (~games) in the rapid file structure.&lt;br /&gt;
&lt;br /&gt;
==an index archive: .sdp==&lt;br /&gt;
gziped index file with a list of all files in this archive. this is for example a game.&lt;br /&gt;
&lt;br /&gt;
Format of the .sdp (index) files:&lt;br /&gt;
* There is one entry per indexed file. These are repeated until EOF.&lt;br /&gt;
* The format of one such entry:&lt;br /&gt;
** 1 byte real file name length&lt;br /&gt;
** real file name&lt;br /&gt;
** 16 byte MD5 digest&lt;br /&gt;
** 4 byte CRC32&lt;br /&gt;
** 4 byte file size&lt;br /&gt;
* The 16 bytes MD5 digest is the reference to the 32 Hex char file name&lt;br /&gt;
* under pool, which contains the content.&lt;br /&gt;
&lt;br /&gt;
filename of the .sdp is:&lt;br /&gt;
&lt;br /&gt;
  md5(md5(filename1) + md5(content of file1) + md5(filename2) + md5(content of file2) ...)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
see also void PoolArchiveT::load(DigestT const &amp;amp; Digest):&lt;br /&gt;
&lt;br /&gt;
https://github.com/spring/RapidTools/blob/master/Rapid/PoolArchive.cpp#L35&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
https://github.com/spring/spring/blob/master/rts/System/FileSystem/Archives/PoolArchive.h&lt;br /&gt;
&lt;br /&gt;
==the pool folder==&lt;br /&gt;
this folder contains all files referenced by the .sdp&#039;s in gzipped form. the filename is the md5 of the file. this way files which are used by multiple archives can be shared.&lt;br /&gt;
&lt;br /&gt;
The pool system uses two directories, to be found in the root of a spring&lt;br /&gt;
data directory, pool and packages. They may look as follows:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
/pool/00/00756ec29fe8fc9d3da9b711e76bc9.gz&lt;br /&gt;
/pool/00/3427d26f419dabe74eaf7b865407b8.gz&lt;br /&gt;
...&lt;br /&gt;
/pool/01/&lt;br /&gt;
/pool/02/&lt;br /&gt;
...&lt;br /&gt;
/pool/ff/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
basicly its in this form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
/pool/&amp;lt;first 2 hex chars&amp;gt;/&amp;lt;last 30 hex chars&amp;gt;.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The splitting up into the 00 till ff sub-dirs is only to prevent possible&lt;br /&gt;
problems with file-system limits for maximum files per directory (eg. FAT32).&lt;br /&gt;
&lt;br /&gt;
[[Category: Download Systems]]&lt;/div&gt;</summary>
		<author><name>Jivvz</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=RapidTools&amp;diff=15635</id>
		<title>RapidTools</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=RapidTools&amp;diff=15635"/>
		<updated>2017-02-20T21:39:35Z</updated>

		<summary type="html">&lt;p&gt;Jivvz: /* Compile */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RapidTools are for managing a [[rapid]] game/archive repository.&lt;br /&gt;
&lt;br /&gt;
Made by det&lt;br /&gt;
&lt;br /&gt;
=Source=&lt;br /&gt;
https://github.com/spring/RapidTools&lt;br /&gt;
&lt;br /&gt;
=Bugs=&lt;br /&gt;
https://github.com/spring/RapidTools/issues&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Compile=&lt;br /&gt;
to compile it on ubuntu:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/spring/RapidTools.git --recursive&lt;br /&gt;
sudo apt-get install liblua5.1-0-dev libzip-dev zlib1g-dev cmake&lt;br /&gt;
cmake .&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tool description=&lt;br /&gt;
==AddZip==&lt;br /&gt;
&lt;br /&gt;
takes a .zip and adds it to the repo with user specified tags:&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
AddZip &amp;lt;Store Path&amp;gt; &amp;lt;Zip Path&amp;gt; [Tag1] ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BuildGit==&lt;br /&gt;
&lt;br /&gt;
adds a git path to the repo and generates the tags automatically from the commit message, it also optimizes for incremental updates&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
BuildGit &amp;lt;Git Path&amp;gt; &amp;lt;Mod Root&amp;gt; &amp;lt;Modinfo&amp;gt; &amp;lt;Store Path&amp;gt; &amp;lt;Git Hash&amp;gt; &amp;lt;Prefix&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Streamer==&lt;br /&gt;
&lt;br /&gt;
is a cgi program to serve some specific files of a .sdp. This is the fastest and official way to fetch a rapid archive.&lt;br /&gt;
&lt;br /&gt;
at client side you have to http POST:&lt;br /&gt;
http://packages.springrts.com/streamer.cgi?&amp;lt;hash of sdp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
post data is binary 0/1 if a file of the specified sdp is needed or not.&lt;br /&gt;
&lt;br /&gt;
streamer.cgi then returns all files in a single stream in the same order than in the sdp. it has to be in the root of a [[rapid]] file structure.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Usage: ./Streamer&lt;br /&gt;
Expects environment variables DOCUMENT_ROOT and QUERY_STRING&lt;br /&gt;
Expects a gziped bitarray as stdin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for details see the source-code:&lt;br /&gt;
https://github.com/spring/RapidTools/blob/master/Tools/Streamer.cpp#L68&lt;br /&gt;
&lt;br /&gt;
==MakeZip==&lt;br /&gt;
&lt;br /&gt;
can create a zip from a .sdp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
MakeZip ~/.spring ba:stable ba.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Notes===&lt;br /&gt;
&lt;br /&gt;
If you get this error:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Error on unknown tag lookup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MakeZip doesn&#039;t find the tag specified in (for example) ~/.spring/versions.gz. To fix, copy the required versions.gz:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cp ~/.spring/rapid/packages.springrts.com/versions.gz ~/.spring/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: Download Systems]]&lt;/div&gt;</summary>
		<author><name>Jivvz</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=RapidTools&amp;diff=15634</id>
		<title>RapidTools</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=RapidTools&amp;diff=15634"/>
		<updated>2017-02-20T21:34:43Z</updated>

		<summary type="html">&lt;p&gt;Jivvz: /* Compile */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RapidTools are for managing a [[rapid]] game/archive repository.&lt;br /&gt;
&lt;br /&gt;
Made by det&lt;br /&gt;
&lt;br /&gt;
=Source=&lt;br /&gt;
https://github.com/spring/RapidTools&lt;br /&gt;
&lt;br /&gt;
=Bugs=&lt;br /&gt;
https://github.com/spring/RapidTools/issues&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Compile=&lt;br /&gt;
to compile it on ubuntu:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/spring/RapidTools.git&lt;br /&gt;
sudo apt-get install liblua5.1-0-dev libzip-dev zlib1g-dev cmake&lt;br /&gt;
cmake .&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tool description=&lt;br /&gt;
==AddZip==&lt;br /&gt;
&lt;br /&gt;
takes a .zip and adds it to the repo with user specified tags:&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
AddZip &amp;lt;Store Path&amp;gt; &amp;lt;Zip Path&amp;gt; [Tag1] ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BuildGit==&lt;br /&gt;
&lt;br /&gt;
adds a git path to the repo and generates the tags automatically from the commit message, it also optimizes for incremental updates&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
BuildGit &amp;lt;Git Path&amp;gt; &amp;lt;Mod Root&amp;gt; &amp;lt;Modinfo&amp;gt; &amp;lt;Store Path&amp;gt; &amp;lt;Git Hash&amp;gt; &amp;lt;Prefix&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Streamer==&lt;br /&gt;
&lt;br /&gt;
is a cgi program to serve some specific files of a .sdp. This is the fastest and official way to fetch a rapid archive.&lt;br /&gt;
&lt;br /&gt;
at client side you have to http POST:&lt;br /&gt;
http://packages.springrts.com/streamer.cgi?&amp;lt;hash of sdp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
post data is binary 0/1 if a file of the specified sdp is needed or not.&lt;br /&gt;
&lt;br /&gt;
streamer.cgi then returns all files in a single stream in the same order than in the sdp. it has to be in the root of a [[rapid]] file structure.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Usage: ./Streamer&lt;br /&gt;
Expects environment variables DOCUMENT_ROOT and QUERY_STRING&lt;br /&gt;
Expects a gziped bitarray as stdin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for details see the source-code:&lt;br /&gt;
https://github.com/spring/RapidTools/blob/master/Tools/Streamer.cpp#L68&lt;br /&gt;
&lt;br /&gt;
==MakeZip==&lt;br /&gt;
&lt;br /&gt;
can create a zip from a .sdp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
MakeZip ~/.spring ba:stable ba.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Notes===&lt;br /&gt;
&lt;br /&gt;
If you get this error:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Error on unknown tag lookup&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MakeZip doesn&#039;t find the tag specified in (for example) ~/.spring/versions.gz. To fix, copy the required versions.gz:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cp ~/.spring/rapid/packages.springrts.com/versions.gz ~/.spring/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: Download Systems]]&lt;/div&gt;</summary>
		<author><name>Jivvz</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Gamedev:UnitDefs&amp;diff=8585</id>
		<title>Gamedev:UnitDefs</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Gamedev:UnitDefs&amp;diff=8585"/>
		<updated>2017-02-08T22:19:16Z</updated>

		<summary type="html">&lt;p&gt;Jivvz: character case&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Gamedev:Main|Development]] &amp;lt; [[Gamedev:Main]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
UnitDef files are .lua files stored in the &amp;lt;code&amp;gt;Units/&amp;lt;/code&amp;gt; directory of a Spring Game.&lt;br /&gt;
&lt;br /&gt;
==Purpose==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
The engine source code which loads the tags from these files is viewable here:&lt;br /&gt;
&lt;br /&gt;
* {{sourcelink|file=rts/Sim/Units/UnitDef.cpp}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The engine source which reads the [[#sounds]] subtable can be found here:&lt;br /&gt;
&lt;br /&gt;
* {{sourcelink|file=rts/Sim/Units/UnitDefHandler.cpp}}&lt;br /&gt;
&lt;br /&gt;
==Data Types==&lt;br /&gt;
{{DataTypes}}&lt;br /&gt;
&lt;br /&gt;
==Details==&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;lowerkeys&amp;lt;/code&amp;gt; function on your final table to ensure the keys are properly cased.&lt;br /&gt;
&lt;br /&gt;
It is usual to name the returned UnitDef table the internal &amp;lt;code&amp;gt;unitName&amp;lt;/code&amp;gt; desired for the unit.&lt;br /&gt;
&lt;br /&gt;
===General===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = name&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|lua = humanName&lt;br /&gt;
|description = This is simply the name of the unit as it appears to the player.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = description&lt;br /&gt;
|type = string&lt;br /&gt;
|default = name&lt;br /&gt;
|lua = tooltip&lt;br /&gt;
|description = This is the tooltip description of the unit seen by the player. It defaults to the {{taglink|name}} of the unit.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = buildPic&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|lua = buildPicName&lt;br /&gt;
|description = The filename of the image to be used as the build picture, assumes &amp;lt;code&amp;gt;Unitpics/&amp;lt;/code&amp;gt; directory (see [[Gamedev:Buildpics]]).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = objectName&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|lua = model.path&lt;br /&gt;
|description = The filename of the 3D model file for this unit, assumes &amp;lt;code&amp;gt;Objects3D/&amp;lt;/code&amp;gt; directory.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = script&lt;br /&gt;
|type = string&lt;br /&gt;
|default = unitName + &amp;quot;.cob&amp;quot;&lt;br /&gt;
|lua = scriptName&lt;br /&gt;
|description = The filename of the animation script file for this unit, assumes &amp;lt;code&amp;gt;Scripts/&amp;lt;/code&amp;gt; directory. Default assumes .cob file but [[Animation-LuaScripting | LUS]] should be preferred.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxDamage&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = health&lt;br /&gt;
|description = The base &#039;hitpoints&#039; the unit will have.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = autoHeal&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How much health the unit will regain every second.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = idleAutoHeal&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 10.0&lt;br /&gt;
|description = How much health the unit will regain every second whilst it is idle.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = idleTime&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 600&lt;br /&gt;
|description = The time in [[frames]] taken until a unit is considered to be idle.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = buildCostMetal&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|lua = metalCost&lt;br /&gt;
|description = The amount of metal resource the unit costs to build. Cannot be below &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = buildCostEnergy&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = energyCost&lt;br /&gt;
|description = The amount of energy resource the unit costs to build.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = buildTime&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The time taken to build the unit, in conjunction with the {{taglink|workerTime}} of the constructor. In [[Gamedev:UnitsOfMeasurement#Time|Resource Frames]], &amp;lt;code&amp;gt;Time to build = (buildTime / workerTime)&amp;lt;/code&amp;gt;. Defaults to &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; but cannot actually be below &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = mass&lt;br /&gt;
|type = float&lt;br /&gt;
|default = buildCostMetal&lt;br /&gt;
|description = The mass of the unit, used in weapon impulse calculations. Cannot be less than &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = reclaimable&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Can the unit be reclaimed by a builder?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = capturable&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Can a unit be stolen by a builder using the capture command?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = repairable&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Can the unit be repaired by a builder?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxRepairSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1e20&lt;br /&gt;
|description = The maximum cumulative speed at which this unit can be repaired.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = iconType&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;default&amp;quot;&lt;br /&gt;
|description = The name of the radar icon type this unit should use (see [[Icontypes.lua]]).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = corpse&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|lua = wreckName&lt;br /&gt;
|description = The name of the feature this unit should leave behind as a wreck when it dies (see [[Gamedev:FeatureDefs]]).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = explodeAs&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The name of the weapon this unit should explode as when it is killed (see [[Gamedev:WeaponDefs]]).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = selfDestructAs&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The name of the weapon this unit should explode as when it self destructs (see [[Gamedev:WeaponDefs]]). Also used as the {{taglink|kamikaze}} weapon.}}&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = harvestStorage&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|special = {{new|97.0}}&lt;br /&gt;
|description = How much of the metal resource a unit can store when used as an engine-assisted resource &#039;harvester&#039;. See also [[Lua:Callins#API:UnitHarvestStorageFull|UnitHarvestStorageFull callin]] and [[Lua_SyncedRead#Unit_Informations|Spring.GetUnitHarvestStorage]] and [[Lua_SyncedCtrl#Unit_Resourcing|Spring.SetUnitHarvestStorage]] callouts.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = metalStorage&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The amount of the metal resource storage the unit contributes.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = energyStorage&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The amount of the energy resource storage the unit contributes.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = extractsMetal&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = 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.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = windGenerator&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The amount of the energy resource the unit generates which is dependant on the map wind. Works only for structures.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = tidalGenerator&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The amount of the energy resource the unit generates which is dependant on the maps tidal power. Clearly, this only works on water structures.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = metalUse&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = metalUpkeep&lt;br /&gt;
|description = The amount of the metal resource the unit consumes per game &#039;tick&#039; when activated.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = energyUse&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = energyUpkeep&lt;br /&gt;
|description = The amount of the energy resource the unit consumes per game &#039;tick&#039; when activated.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = metalMake&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The amount of the metal resource the unit generates unconditionally per game &#039;tick&#039;.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = energyMake&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The amount of the energy resource the unit generates unconditionally per game &#039;tick&#039;.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = makesMetal&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The amount of the energy resource the unit turns into the metal resource per game &#039;tick&#039;.}}&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = onOffable&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = 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.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = activateWhenBuilt&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Should the unit&#039;s activation status be on or off when it is created?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = sightDistance&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = losRadius&lt;br /&gt;
|description = The radius of the units sight (LOS is circular in Spring). &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = airSightDistance&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.5 * sightDistance&lt;br /&gt;
|lua = airLosRadius&lt;br /&gt;
|description = How far away the unit can see aircraft (and some FX).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = losEmitHeight&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 20.0&lt;br /&gt;
|lua = losHeight &lt;br /&gt;
|special = {{new|83.0}}&lt;br /&gt;
|description = How high up the unit is the point used to calculate it&#039;s LOS vs. the terrain?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = radarEmitHeight&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 20.0&lt;br /&gt;
|lua = radarHeight&lt;br /&gt;
|special = {{new|83.0}}&lt;br /&gt;
|description = How high up the unit is the point used to calculate it&#039;s radar vs. the terrain?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = radarDistance&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|lua = radarRadius&lt;br /&gt;
|description = The radius of the units radar.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = sonarDistance&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|lua = sonarRadius&lt;br /&gt;
|description = The radius of the units sonar.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = radarDistanceJam&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|lua = jammerRadius&lt;br /&gt;
|description = The radius of the units radar jamming.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = sonarDistanceJam&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|lua = sonarJamRadius&lt;br /&gt;
|description = The radius of the units sonar jamming.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = stealth&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Is the unit undetectable by radar?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = sonarStealth&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Is the unit undetectable by sonar?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = seismicDistance&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|lua = seismicRadius&lt;br /&gt;
|description = The radius of the unit&#039;s seismic (movement) sensor.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = seismicSignature&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0 for units with {{taglink|floater}}, {{taglink|canHover}} or {{taglink|canFly}}, otherwise sqrt(mass / 100.0)&lt;br /&gt;
|description = How fast the seismic ring expands in [[elmo]]s per frame. Each ping always lasts 15 [[frames]], so this also determines the maximum radius of the seismic ring.}}&lt;br /&gt;
&lt;br /&gt;
====Cloaking====&lt;br /&gt;
For units with {{taglink|canCloak|true}}:&lt;br /&gt;
{{tag&lt;br /&gt;
|name = cloakCost&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The energy cost per tick to cloak the unit while it is stationary.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = cloakCostMoving&lt;br /&gt;
|type = float&lt;br /&gt;
|default = cloakCost&lt;br /&gt;
|description = The energy cost per tick to cloak the unit while it is moving.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = initCloaked&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|lua = startCloaked&lt;br /&gt;
|description = Is the unit cloaked as soon as it is created?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = minCloakDistance&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The minimum distance (radius) which the unit must be from any enemy units to remain cloaked.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = decloakSpherical&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does {{taglink|minCloakDistance}} apply in 3D or only 2D? i.e. can aircraft flying above the unit decloak it?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = decloakOnFire&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the unit decloak when it fires a weapon?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = cloakTimeout&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 128&lt;br /&gt;
|description = The minimum time, in [[frames]], between a decloak and subsequent re-cloak.}}&lt;br /&gt;
&lt;br /&gt;
===Commands===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canMove&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can the unit be issued Move orders?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canAttack&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Can the unit be issued Attack orders?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canFight&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Can the unit be issued Fight orders?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canPatrol&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Can the unit be issued Patrol orders?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canGuard&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Can the unit be issued Guard orders?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
| name = canCloak&lt;br /&gt;
| type = bool&lt;br /&gt;
| default = false&lt;br /&gt;
| description =&lt;br /&gt;
Can the unit be issued Cloak orders?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canRepeat&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Can the unit be issued Repeat orders?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canSelfDestruct&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|lua = canSelfD&lt;br /&gt;
|description = Can the unit be issued a self destruct order?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = moveState&lt;br /&gt;
|type = int&lt;br /&gt;
|default = -1 for mobile units, 1 for structures&lt;br /&gt;
|description = The initial movement state for the unit. Can be &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; - Inherits from factory, &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; - Hold Position, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; - Manoeuvre or &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; - Roam.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = fireState&lt;br /&gt;
|type = int&lt;br /&gt;
|default = -1 for units with {{taglink|noAutoFire|false}}, 2 otherwise&lt;br /&gt;
|description = The initial firing state for the unit. Can be &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; - Inherits from factory, &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; - Hold Fire, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; - Return Fire or &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; - Fire At Will.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = noAutoFire&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|lua = canFireControl&lt;br /&gt;
|description = Controls whether or not the unit has a fire state button.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canManualFire&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = description = Can the unit be issued ManualFire commands? A ManualFire command will fire any weapons with the {{xtaglink|Gamedev:WeaponDefs|commandfire}} tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Builder Commands====&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canRestore&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = builder &amp;amp;&amp;amp; {{taglink|terraformSpeed}} &amp;gt; 0&lt;br /&gt;
|description = Can the unit be issued restore terrain commands? For builders only.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canRepair&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = builder &amp;amp;&amp;amp; {{taglink|repairSpeed}} &amp;gt; 0&lt;br /&gt;
|description = Can the unit be issued repair commands? For builders only.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canReclaim&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = builder &amp;amp;&amp;amp; {{taglink|reclaimSpeed}} &amp;gt; 0&lt;br /&gt;
|description = Can the unit be issued reclaim commands? For builders only.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canResurrect&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = builder &amp;amp;&amp;amp; {{taglink|resurrectSpeed}} &amp;gt; 0&lt;br /&gt;
|description = Can the unit be issued resurrection commands? For builders only.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canCapture&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = builder &amp;amp;&amp;amp; {{taglink|captureSpeed}} &amp;gt; 0&lt;br /&gt;
|description = Can the unit be issued capture commands? For builders only.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Builder===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = builder&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|lua = isBuilder&lt;br /&gt;
|description = Is the unit a builder?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = buildDistance&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 128.0&lt;br /&gt;
|description = How far away from itself the unit can build, measured to the centre of the unit being built. The minimum value is &amp;lt;code&amp;gt;38.0&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = buildRange3D&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the builders {{taglink|buildDistance}} apply in all 3 dimensions or only 2?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = workerTime&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = buildSpeed&lt;br /&gt;
|description = How fast the builder builds, used in conjunction with the {{taglink|buildTime}} of the unit being built. Effectively, &amp;lt;code&amp;gt;Time to build = buildTime / workerTime&amp;lt;/code&amp;gt;. If this value is &amp;lt;= &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; then {{taglink|builder}} is set to false.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = repairSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = workerTime&lt;br /&gt;
|description = How fast the builder can repair other units.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = reclaimSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = workerTime&lt;br /&gt;
|description = How fast the builder can reclaim other units and features.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = resurrectSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = workerTime&lt;br /&gt;
|description = How fast the builder can resurrect corpse features back into living units.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = captureSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = workerTime&lt;br /&gt;
|description = How fast the builder can capture other units.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = terraformSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = workerTime&lt;br /&gt;
|description = How fast the builder levels and restores terrain.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canAssist&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = builder&lt;br /&gt;
|description = Can the builder assist other constructions?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canBeAssisted&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Can the builder be assisted by other builders?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canSelfRepair&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can the builder repair itself?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = showNanoSpray&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the builder emit OTA-style nanospray whilst constructing?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = nanoColor&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.2, 0.7, 0.2} aka green&lt;br /&gt;
|description = The RGB colour of a builders&#039; emitted nano particles if {{taglink|showNanoSpray|true}}. Also controls the RBG colour of a unit&#039;s own nanoframe if {{taglink|showNanoFrame|true}}.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = fullHealthFactory&lt;br /&gt;
|type = bool&lt;br /&gt;
|defaul[[elmo]]s&lt;br /&gt;
|description = If &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, 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.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = isAirbase&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|special = Removed in 101.0 in favour of more flexible lua custom commands&lt;br /&gt;
|description = Is this unit an airbase? Aircraft may land and repair on units which are airbases.}}&lt;br /&gt;
&lt;br /&gt;
===Movement &amp;amp; Placement===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = footprintX&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 1&lt;br /&gt;
|description = &lt;br /&gt;
How wide the unit is in footprint units, left to right. 1 footprint unit = 16 [[elmo]]s. Cannot be below &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. For mobile units this should be the same as the {{xtaglink|Movedefs.lua|footprintX}} of its {{taglink|movementClass}}. Also used for obstacle avoidance.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = footprintZ&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 1&lt;br /&gt;
|description = &lt;br /&gt;
How wide the unit is in footprint units, top to bottom. 1 footprint unit = 16 [[elmo]]s. Cannot be below &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. For mobile units this should be the same as the {{xtaglink|Movedefs.lua|footprintZ}} of its {{taglink|movementClass}}. Also used for obstacle avoidance.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = yardmap&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = &lt;br /&gt;
Used to determine a structure from a mobile unit. A string of characters which defines in detail each &#039;footprint square&#039; of the structure. Each footprint square may be: &lt;br /&gt;
:: &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; - &#039;Yard&#039; - Always open, unblocking, &lt;br /&gt;
:: &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; - &#039;Construction&#039; - Open and unblocking only while constructing (for factories, controlled via &amp;lt;code&amp;gt;COB.YARD_OPEN&amp;lt;/code&amp;gt; see [[Animation-LuaCallouts#Other]]), &lt;br /&gt;
:: &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; - &#039;Inversed Construction&#039; - Closed and blocking only while constructing (for factories, controlled via &amp;lt;code&amp;gt;COB.YARD_OPEN&amp;lt;/code&amp;gt; see [[Animation-LuaCallouts#Other]]) ({{new|89.0}}), &lt;br /&gt;
:: &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; - &#039;Geothermal&#039; - Flags that the unit must be placed over a {{xtaglink|Gamedev:FeatureDefs|geoThermal}} feature, does not actually count as a square, &lt;br /&gt;
:: &amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt; - &#039;High Resolution&#039; - Indicates that the yardmap will use double resolution with four times as many characters. Must be the &#039;&#039;&#039;first&#039;&#039;&#039; character, and does not count as a square itself ({{new|93.0}}),&lt;br /&gt;
::&amp;lt;code&amp;gt;o&amp;lt;/code&amp;gt; - &#039;Obstacle&#039; - Always closed, blocking, all other chars are treated the same way.&lt;br /&gt;
: Tip: &#039;Draw&#039; out the yardmap over multiple lines. As of &amp;lt;span class=warning&amp;gt;89.0&amp;lt;/span&amp;gt; all whitespace characters are ignored, including newlines.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = levelGround&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = For structures. Does the constructor have to level the ground underneath the build area before beginning to build the structure?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = movementClass&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|lua = moveDef.name&lt;br /&gt;
|description = The name of the movement type a mobile, non aircraft, unit should use. See [[Movedefs.lua]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canHover&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|special = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Removed in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
|description = Is the unit a hovercraft? Hovercraft can cross water of any depth without a speed penalty. Hover&#039;s must also have &amp;lt;code&amp;gt;HOVER&amp;lt;/code&amp;gt; within the name of their {{taglink|movementClass}} (see [[Movedefs.lua]]).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = floater&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true if {{taglink|waterline|true}}, false otherwise&lt;br /&gt;
|description = 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?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = upright&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the unit follow the terrain or always remain upright? Generally used for walkers.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxSlope&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = maxHeightDif&lt;br /&gt;
|description = The maximum slope a building can be placed on. Mobile unit&#039;s use the {{xtaglink|Movedefs.lua|maxSlope}} set in their {{taglink|movementClass}}. The value is in degrees and is clamped between &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;89.0&amp;lt;/code&amp;gt;. This value is converted to a &amp;quot;maximum allowed height difference&amp;quot; (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. The value readable from lua has been changed from that in the unitdef and reflects the internal engine value.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = minWaterDepth&lt;br /&gt;
|type = float&lt;br /&gt;
|default = -10e6&lt;br /&gt;
|description = The minimum depth of water a building can be placed on. Mobile unit&#039;s use the {{xtaglink|Movedefs.lua|minWaterDepth}} set in their {{taglink|movementClass}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxWaterDepth&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 10e6&lt;br /&gt;
|description = The maximum depth of water a building can be placed on. Mobile unit&#039;s use the {{xtaglink|Movedefs.lua|maxWaterDepth}} set in their {{taglink|movementClass}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = waterline&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How low in the water does a ship sit? Higher values means the ship is lower in the water.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = minCollisionSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = The minimum net impact speed that will cause a unit to be damaged by collisions with another unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = pushResistant&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can the unit be pushed around by other units? Turning it on doesn&#039;t remove all pushing but is a marked improvement.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxVelocity&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = speed&lt;br /&gt;
|description = The maximum speed attainable by the unit in [[elmo]]s per frame. If the value is -ve, the absolute value is used.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxReverseVelocity&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = rSpeed &lt;br /&gt;
|special = {{new|99.0}}&lt;br /&gt;
|description = The maximum speed attainable by the unit in reverse in [[elmo]]s per frame. If the value is -ve, the absolute value is used.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = acceleration&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.5&lt;br /&gt;
|lua = maxAcc&lt;br /&gt;
|description = The acceleration of the unit, in [[elmo]]s per frame&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;. If the value is -ve, the absolute value is used.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = brakeRate&lt;br /&gt;
|type = float&lt;br /&gt;
|default = acceleration&lt;br /&gt;
|lua = maxDec&lt;br /&gt;
|description = The deceleration of the unit, in [[elmo]]s per frame&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;. If the value is -ve, the absolute value is used. For units with {{taglink|canFly|true}} this is multiplied by &amp;lt;code&amp;gt;0.1&amp;lt;/code&amp;gt;. Prior to 95.0 this was scaled by 0.1 for aircraft and the default was 3x acceleration.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = myGravity&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.4&lt;br /&gt;
|description = As Spring aircraft are slower than real aircraft this tag allows to lower gravity to compensate. Multiplies against map gravity for aircraft, replaces map gravity for ground vehicles if non-zero.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = turnRate&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How fast the unit can turn. &amp;lt;code&amp;gt;degrees per seconds = 0.16 * turnRate&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = turnInPlace&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the unit turn on the spot (like a person or tank) or must it be moving forwards to turn (like a car).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = turnInPlaceSpeedLimit&lt;br /&gt;
|type = float&lt;br /&gt;
|default = A complex formula based on {{taglink|turnRate}} and {{taglink|maxVelocity}}&lt;br /&gt;
|description = For units with {{taglink|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 {{taglink|turnRate}}).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
| name = turnInPlaceAngleLimit&lt;br /&gt;
| type = float&lt;br /&gt;
| default = 0.0&lt;br /&gt;
| special = {{new|86.0}}&lt;br /&gt;
| description = For units with {{taglink|turnInPlace|true}}, defines the maximum angle (in degrees) of a turn above which it starts to brake.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = blocking&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the unit block the movement of other units? (Mines, i.e. non-mobile units with the {{taglink|kamikaze}} tag default to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = crushResistance&lt;br /&gt;
|type = float&lt;br /&gt;
|default = mass&lt;br /&gt;
|special = {{new|85.0}}&lt;br /&gt;
|description = How resistant is the unit to being crushed? Any [[Movedefs.lua|&#039;&#039;&#039;MoveClass&#039;&#039;&#039;]] with a {{xtaglink|Movedefs.lua|crushStrength}} greater than this will crush the unit - IFF this has been enabled via [[Lua_SyncedCtrl#Unit_Control|Spring.SetUnitBlocking]] and the collider impulse exceeds that of the colidee.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Flanking===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flankingBonusMode&lt;br /&gt;
|type = int&lt;br /&gt;
|default = flankingBonus.defaultMode set in [[Modrules.lua]]&lt;br /&gt;
|description = The mode of operation of Spring&#039;s inbuilt flanking system. Can be &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; - No flanking bonus. Mode &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; builds up the ability to move over time, and swings to face attacks, but does not respect the way the unit is facing. Mode &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; also can swing, but moves with the unit as it turns. Mode &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; stays with the unit as it turns and otherwise doesn&#039;t move, the ideal mode to simulate something such as tank armour.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flankingBonusDir&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.0, 0.0, 1.0}&lt;br /&gt;
|description = This is the direction vector where the armour is facing; i.e. where the least damage is applied. The default is straight forwards.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flankingBonusMax&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.9&lt;br /&gt;
|description = The maximum multiplier to the damage dealt, when a unit is hit from the opposite direction to {{taglink|flankingBonusDir}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flankingBonusMin&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.9&lt;br /&gt;
|description = The minimum multiplier to the damage dealt, when a unit is hit from the same direction as {{taglink|flankingBonusDir}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flankingBonusMobilityAdd&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.01&lt;br /&gt;
|description = This defines the ability of {{taglink|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 {{taglink|flankingBonusDir}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Aircraft===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canFly&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can the unit fly, i.e. is it an aircraft?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canSubmerge&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can the aircraft land underwater?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = factoryHeadingTakeoff&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Controls the take-off behaviour of aircraft with {{taglink|hoverAttack|true}}. &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; means planes start matching their heading right after taking off from the pad, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; means they maintain the heading of the pad until reaching {{taglink|cruiseAlt}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collide&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the unit collide with other aircraft, or can it occupy the same space?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = hoverAttack&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Controls whether the aircraft flys and attacks like a fighter/bomber or a helicopter/gunship.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = airStrafe&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = For aircraft with {{taglink|hoverAttack|true}}, controls if the unit strafes side to side while attacking or remains stationary.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = cruiseAlt&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = wantedHeight&lt;br /&gt;
|description = The altitude in [[elmo]]s which the unit attempts to fly at while cruising.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = airHoverFactor&lt;br /&gt;
|type = float&lt;br /&gt;
|default = -1.0&lt;br /&gt;
|lua = dlHoverFactor&lt;br /&gt;
|description = For aircraft with {{taglink|hoverAttack|true}}, less then &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; means it can land and &amp;gt;= &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; indicates how much the unit will move during hovering on the spot.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = bankingAllowed&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = For aircraft with {{taglink|hoverAttack|true}}, controls whether or not the unit banks when moving turning.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = useSmoothMesh&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the aircraft follow the real map terrain or the special smoothed out navigation mesh generated by Spring specifically for aircraft?} Can become problematic for construction aircrafts, building in canyons.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxFuel&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|special = Removed in 101.0 in favour of more flexible lua custom commands&lt;br /&gt;
|description = The maximum flight time in seconds before aircraft must return to an airbase to refuel.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = refuelTime&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 5.0&lt;br /&gt;
|special = Removed in 101.0 in favour of more flexible lua custom commands&lt;br /&gt;
|description = The time in seconds required to refuel the aircraft at an airbase.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = minAirbasePower&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|special = Removed in 101.0 in favour of more flexible lua custom commands&lt;br /&gt;
|description = The minimum {{taglink|workerTime}} an airbase must have to repair / refuel this aircraft.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canLoopbackAttack&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can the aircraft perform an [http://en.wikipedia.org/wiki/Immelmann_turn Immelmann turn]?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Advanced Air Tags====&lt;br /&gt;
The following set of tags are not well understood and using non-default values can lead to undesired flight behaviours.&lt;br /&gt;
{{tag&lt;br /&gt;
|name = wingDrag&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.07&lt;br /&gt;
|description = The drag caused by the aircraft&#039;s wing. Clamped between &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = wingAngle&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.08&lt;br /&gt;
|description = The angle between the front and the wing plane.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = frontToSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.1&lt;br /&gt;
|description = Fudge factor for lining up speed and front of plane.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = speedToFront&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.07&lt;br /&gt;
|description = Fudge factor for lining up speed and front of plane.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = crashDrag&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.005&lt;br /&gt;
|description = The drag used when crashing. Clamped between &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxBank&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.8&lt;br /&gt;
|description = The maximum roll (z-axis rotation) the aircraft can achieve.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxPitch&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.45&lt;br /&gt;
|description = The maximum pitch (x-axis rotation) the aircraft tries to keep.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = turnRadius&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 500.0&lt;br /&gt;
|description = Hint to Spring unit AI about the required turning radius.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = verticalSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 3.0&lt;br /&gt;
|description = The speed of takeoff and landing, at least for gunships ({{taglink|hoverAttack|true}}).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxAileron&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.015&lt;br /&gt;
|description =  The maximum turn speed around the roll (z) axis.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxElevator&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.01&lt;br /&gt;
|description = The maximum turn speed around the pitch (x) axis.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxRudder&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.004&lt;br /&gt;
|description = The maximum turn speed around the yaw (y) axis.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxAcc&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.065&lt;br /&gt;
|description = The maximum acceleration or &#039;engine power&#039; of the aircraft.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = attackSafetyDistance&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0&lt;br /&gt;
| special = Exists only in version 99.0&lt;br /&gt;
|description = Fighters abort dive toward target if within attackSafetyDistance and try to climb back to normal altitude while still moving toward target. It&#039;s disabled by default. Set to half of the minimum weapon range to avoid collisions, enemy fire, AOE damage. If set to greater than the weapon range, the unit will fly over the target like a bomber. This tag was removed in version 100.0 and changed to a [[Lua_MoveCtrl#MoveType-Controlling|Spring.SetMoveTypeData]] key.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Flares====&lt;br /&gt;
The following set of tags are rarely used and are hardcoded to only work vs. missile weapons. The texture is hardcoded to be &amp;lt;code&amp;gt;flareprojectiletexture&amp;lt;/code&amp;gt; defined in [[Resources.lua]].&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canDropFlare&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can this aircraft drop flares to distract missile weapons?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flareReload&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 5.0&lt;br /&gt;
|lua = flareReloadTime&lt;br /&gt;
|description = The time in seconds between successive flare drops.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flareDelay&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.3&lt;br /&gt;
|description = The delay between detecting an incoming missile and launching flares. Multiplied by a random number between 1 and 16.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flareEfficiency&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.5&lt;br /&gt;
|description = The probability that an incoming missile will target the flare instead of the aircraft.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flareDropVector&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.0, 0.0, 0.0}&lt;br /&gt;
|description = The direction vector which flares are emitted in.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flareTime&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 3&lt;br /&gt;
|description = The lifetime of a dropped flare in [[frames]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flareSalvoSize&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 4&lt;br /&gt;
|description = How many flares are dropped at once?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flareSalvoDelay&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|description = The delay in [[frames]] between the release of each individual flare in a burst.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Transports===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = transportSize&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|description = The size of units that the transport can pick up, in terms of the passengers {{taglink|footprintX}}.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = minTransportSize&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|description = The smallest size of unit that the transport can pick up, in terms of the passengers {{taglink|footprintX}}.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = transportCapacity&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|description = The total number of units that the transport can pick up, with each unit multiplied by it&#039;s {{taglink|footprintX}} size. Prior to 101.0 if this tag is not present, then any Script.AttachUnit and Script.DropUnit call in the animation script will be ignored (See [[Animation-LuaCallouts#Other]]), in successive versions all units can use [[Lua_SyncedCtrl#Unit_Control|Spring.UnitAttach]] et al regardless of this tag.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = transportMass&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 100000.0&lt;br /&gt;
|description = The total cumulative {{taglink|mass}} of passengers the transport can carry.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = minTransportMass&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The minimum {{taglink|mass}} passenger the transport can carry.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = loadingRadius&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 220.0&lt;br /&gt;
|description = How far away in [[elmo]]s can the transporter pick up and drop units?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = unloadSpread&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = How spread out the passengers are when unloaded. Is multiplied by the passengers radius.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = isFirePlatform&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can transported units still aim and shoot while loaded by this transport?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = holdSteady&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = If &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; - passengers are slaved to orientation of transporter attachment piece, if &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; - passengers are slaved to orientation of transporter body.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = releaseHeld&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the transporter unload it&#039;s passengers when it dies?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = cantBeTransported&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false for mobile units, true for structures&lt;br /&gt;
|description = Controls if a unit is transportable at all or not. If &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; it is overridden by [[Modrules.lua]] &amp;lt;code&amp;gt;transportability&amp;lt;/code&amp;gt; subtable tags.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = transportByEnemy&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Controls if a unit can be transported by an enemy transport. i.e. can it be kidnapped.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = transportUnloadMethod&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|description = For air transports. Can be &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; - Land to unload individually, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; - Flyover drop (i.e. Parachute), or &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; - Land and flood unload all passengers. Can be used on ground transports with mixed results.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = fallSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.2&lt;br /&gt;
|description = For air transports with {{taglink|transportUnloadMethod|1}}. The speed in [[elmo]]s per second which units will fall at when released from the transport.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = unitFallSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Allows you to override {{taglink|fallSpeed}} for an individual passenger.}}&lt;br /&gt;
&lt;br /&gt;
===Categories===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = category&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The category tag is a string of separate words, each representing a category of units. There is a maximum of 32 categories. The primary purpose of categories is weapon targeting (See [[#weapons]]).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = noChaseCategory&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The unit will still target enemies with a matching {{taglink|category}}, but will not chase after it if it moves out of weapon range.}}&lt;br /&gt;
&lt;br /&gt;
===Decals===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = leaveTracks&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the unit leave a track mark decal behind it when it moves? For mobile units.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = trackType&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;stdTank&amp;quot;&lt;br /&gt;
|description = The filename of the image, without extension, assumed to be in &amp;lt;code&amp;gt;Bitmaps/Tracks/&amp;lt;/code&amp;gt;, to be used as the track decal. The red channel of the image controls the brightness and the green channel the alpha (how visible it is) of the track. Blue channel is unused.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = trackWidth&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 32.0&lt;br /&gt;
|description = The width of the track decal left on the ground, in [[elmo]]s.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = trackOffset&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How far back in [[elmo]]s the track should be drawn from the centre of the unit.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = trackStrength&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 32.0&lt;br /&gt;
|description = How visible or &#039;deep&#039; the track mark should be. Also used to determine how long the decal should last.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = trackStretch&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = How much the track is stretched in the forward direction compared to the sides (i.e. used to change aspect ratio).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = useBuildingGroundDecal&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = For structures, do they display a ground decal on the terrain under their model?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = buildingGroundDecalType&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The filename of the image to be used as ground decal. Assumed to be in &amp;lt;code&amp;gt;Unittextures/&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = buildingGroundDecalSizeX&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 4&lt;br /&gt;
|description = How wide the decal is left to right, in footprint units.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = buildingGroundDecalSizeY&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 4&lt;br /&gt;
|description = How wide the decal is top to bottom, in footprint units.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = buildingGroundDecalDecaySpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.1&lt;br /&gt;
|description = A measure of how quickly the decal should fade out if the structure dies. Essentially this value is multiplied by the time since death and subtracted from the original alpha until the decal is fully transparent.}}&lt;br /&gt;
&lt;br /&gt;
===Collision Volumes===&lt;br /&gt;
For a deeper explanation of these tags, see [[Gamedev:CollisionVolumes]]. Note that all collision checks first do a pre-check with the unit &#039;&#039;radius&#039;&#039; before doing the colvol checks. Ergo the unit &#039;&#039;radius&#039;&#039; must be larger or equal to the colvol!&lt;br /&gt;
{{tag&lt;br /&gt;
|name = modelCenterOffset&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.0, 0.0, 0.0} &lt;br /&gt;
|special = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Removed in 89.0 (Now set via lua)&amp;lt;/span&amp;gt;&lt;br /&gt;
|description = How far from the model&#039;s defined centre should the centre of the unit be?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = usePieceCollisionVolumes&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|lua = collisionVolume.defaultToPieceTree&lt;br /&gt;
|description = When turned on the model and UnitDef collision volumes are ignored and Spring generates a bounding box volume for each piece of the unit model. These volumes can be manipulated or replaced by [[Lua_SyncedCtrl#Unit_Control | Spring.SetUnitPieceCollisionVolumeData]]. Increases the performance cost of collision calculations.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collisionVolumeType&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;ellipsoid&amp;quot;&lt;br /&gt;
|lua = collisionVolume.type&lt;br /&gt;
|description = What shape should the unit&#039;s collision volume be? Can be &amp;lt;code&amp;gt;box&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ellipsoid&amp;lt;/code&amp;gt; or a cylinder aligned to an axis; &amp;lt;code&amp;gt;cylX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cylY&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cylZ&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collisionVolumeScales&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.0, 0.0, 0.0}&lt;br /&gt;
|lua = collisionVolume.scale{X{{pipe}}Y{{pipe}}Z}&lt;br /&gt;
|description = The lengths of the collision volume in each of the three axes. Note that non-spherical ellipsoids and elliptical cylinders are not supported.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collisionVolumeOffsets&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.0, 0.0, 0.0}&lt;br /&gt;
|lua = collisionVolume.offset{X{{pipe}}Y{{pipe}}Z}&lt;br /&gt;
|description = The offset from the unit centre to the hit volume centre in each axis.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = useFootPrintCollisionVolume&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|special = {{new|92.0}}&lt;br /&gt;
|lua = .collisionVolume.defaultToFootprint&lt;br /&gt;
|description = Replaces any defined collision volume with a box with dimensions equal to the object&#039;s footprint (this also overrides any custom scaling and/or offsets).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collisionVolumeTest&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|special = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Removed in 90.0 (Now always continuous)&amp;lt;/span&amp;gt;&lt;br /&gt;
|description = The type of test used to detect collisions. Can be &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; (discrete) or &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (continuous). Use the latter for catching high speed projectiles which may otherwise &#039;skip through&#039; small collision volumes, but beware of the increased performance cost.}}&lt;br /&gt;
&lt;br /&gt;
===Attack Behaviours===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = highTrajectory&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|lua = highTrajectoryType&lt;br /&gt;
|description = Can the unit fire it&#039;s (ballistic) weapons in a high trajectory arc? Can be &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; - Low trajectory only, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; - High trajectory only, or &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; - Toggle button.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = kamikaze&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|lua = canKamikaze&lt;br /&gt;
|description = Does the unit attack its target by blowing itself up?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = kamikazeDistance&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = kamikazeDist&lt;br /&gt;
|description = How close to the target, in [[elmo]]s, the unit must get before detonating. Measured in 3D, not 2D.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = kamikazeUseLOS&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the target unit have to be in LOS when detonating or only within {{taglink|kamikazeDistance}}.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = strafeToAttack&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Should the unit move sideways when it can&#039;t shoot?}}&lt;br /&gt;
&lt;br /&gt;
===Other===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = decoyFor&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The UnitDef name (not human {{taglink|name}}) which this unit is a decoy for.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = selfDestructCountdown&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 5&lt;br /&gt;
|lua = selfDCountdown&lt;br /&gt;
|description = The length in seconds taken between issuing self destruct order and the unit exploding.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = damageModifier&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|lua = armoredMultiple&lt;br /&gt;
|description = The multiplier applied to weapon damage when the units ARMORED status (See [[Lua_ConstCOB]]) is turned on.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = isTargetingUpgrade&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|lua = targFac&lt;br /&gt;
|description = Does the unit upgrade the targeting so that units shoot accurately at enemy units which are in radar but not in LOS.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = isFeature&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the unit immediately die into it&#039;s {{taglink|corpse}} feature when built? Used mainly for making walls.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = hideDamage&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Should the units current health be invisible to enemy players?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = showPlayerName&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Should the unit display it&#039;s controlling player as its name instead of {{taglink|name}}. Generally used for commander or hero units.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = showNanoFrame&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the unit show an OTA-style nanoframe whilst being constructed?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = unitRestricted&lt;br /&gt;
|type = int&lt;br /&gt;
|default = MAX_UNITS&lt;br /&gt;
|lua = maxThisUnit&lt;br /&gt;
|description = How many of this unit type may a player control at once? Defaults to being the maximum amount of units controllable. Is overridden by lobby unit restrictions.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = power&lt;br /&gt;
|type = float&lt;br /&gt;
|default = {{taglink|buildCostMetal}} + ({{taglink|buildCostEnergy}} / 60.0)&lt;br /&gt;
|description = The relative power of the unit. Used in weapon targeting priority and experience gain calculations.}}&lt;br /&gt;
&lt;br /&gt;
==Sub Tables==&lt;br /&gt;
&lt;br /&gt;
===weapons===&lt;br /&gt;
The &amp;lt;code&amp;gt;weapons&amp;lt;/code&amp;gt; subtable of a UnitDef tells Spring which weapons the unit has. It is a simple array (number indexed table) of &amp;lt;code&amp;gt;weaponName&amp;lt;/code&amp;gt;s (not the human readable &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;!).&lt;br /&gt;
&lt;br /&gt;
The following additional tags are associated with this subtable:&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = name&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The &amp;lt;code&amp;gt;weaponName&amp;lt;/code&amp;gt; of the weapon (See [[Gamedev:WeaponDefs]]). If using the [[weapondefs_post.lua]] provided by [[springcontent.sdz]], you may include the WeaponDef tables within the UnitDef as the &amp;lt;code&amp;gt;weaponDefs&amp;lt;/code&amp;gt; subtable, and refer to them with &amp;lt;code&amp;gt;def&amp;lt;/code&amp;gt; rather than &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;. This can be a useful way to organise definitions if units do not generally share weapons.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = badTargetCategory&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = A string of unit {{taglink|category}} entries which this weapon prefers to avoid targeting. i.e. given two units which &#039;&#039;can&#039;&#039; be targeted, any unit whose {{taglink|category}} matches any entry in this tag, will be targeted last. (See [[#Categories]])}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = onlyTargetCategory&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = A string of unit {{taglink|category}} entries which this weapon can target. i.e. any unit whose {{taglink|category}} does not match any entry in this tag, cannot be targeted by this weapon. (See [[#Categories]])}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = slaveTo&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|description = The number of the weapon which this weapon is slaved to. A slaved weapon can only target what it&#039;s master is targeting. Weapon numbers start at &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; and correspond to the index of the weapon within the subtable.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = mainDir&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.0, 0.0, 1.0} i.e. forwards&lt;br /&gt;
|description = A vector representing the firing direction of this weapon if it has a limited firing arc. Used in conjunction with {{taglink|maxAngleDif}} (See [[Gamedev:WeaponMainDir]]).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxAngleDif&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 360.0&lt;br /&gt;
|description = How wide this weapons limited firing arc is in degrees. Symmetrical about {{taglink|mainDir}} i.e. &amp;lt;code&amp;gt;180.0&amp;lt;/code&amp;gt; is 90 degree freedom either way (See [[Gamedev:WeaponMainDir]]).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = fuelUsage&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How much fuel in seconds is deducted from the units initial {{taglink|maxFuel}} when this weapon fires.}}&lt;br /&gt;
&lt;br /&gt;
===buildOptions===&lt;br /&gt;
The &amp;lt;code&amp;gt;buildOptions&amp;lt;/code&amp;gt; subtable of a UnitDef tells Spring which other units the unit can build (in the case of a builder) or produce (in the case of a factory).&lt;br /&gt;
It is a simple array (number indexed table) of &amp;lt;code&amp;gt;unitName&amp;lt;/code&amp;gt;s (not the human readable {{taglink|name}}!).&lt;br /&gt;
&lt;br /&gt;
There are no additional tags specific to this subtable.&lt;br /&gt;
&lt;br /&gt;
===SFXTypes===&lt;br /&gt;
The &amp;lt;code&amp;gt;SFXTypes&amp;lt;/code&amp;gt; subtable of a UnitDef tells Spring which [[CEG]] effects are associated with the unit. It consists of two further subtables, with no additional tags specific to them.&lt;br /&gt;
&lt;br /&gt;
====explosionGenerators====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;explosionGenerators&amp;lt;/code&amp;gt; subtable of &amp;lt;code&amp;gt;SFXTypes&amp;lt;/code&amp;gt; tells Spring which [[CEG]]s the unit&#039;s script can call, via the &amp;lt;code&amp;gt;EmitSFX()&amp;lt;/code&amp;gt; callout (See [[Animation-LuaCallouts#Effects]]). It is a simple array (number indexed table) of CEG names, prefaced by the string &amp;lt;code&amp;gt;&amp;quot;custom:&amp;quot;&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
====pieceExplosionGenerators====&lt;br /&gt;
{{new|83.0}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;pieceExplosionGenerators&amp;lt;/code&amp;gt; subtable of &amp;lt;code&amp;gt;SFXTypes&amp;lt;/code&amp;gt; tells Spring which [[CEG]]s the unit&#039;s script can pick at random to attach to a flying unit piece, created from the &amp;lt;code&amp;gt;Explode()&amp;lt;/code&amp;gt; callout (See [[Animation-LuaCallouts#Effects]]). It is a simple array (number indexed table) of CEG names, with no prefix.&lt;br /&gt;
&lt;br /&gt;
Forum thread (with examples): {{forumlink|topic=27554|title=pieceExplosionGenerators}}&lt;br /&gt;
&lt;br /&gt;
===sounds===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;sounds&amp;lt;/code&amp;gt; subtable of a UnitDef tells Spring which sound files to play when the unit triggers various events.&lt;br /&gt;
&lt;br /&gt;
Files are assumed to be in the &amp;lt;code&amp;gt;Sounds/&amp;lt;/code&amp;gt; directory; accepted formats are .wav and .ogg, the former being assumed if no extension is given.&lt;br /&gt;
&lt;br /&gt;
Sounds can be defined in one of three ways:&lt;br /&gt;
&lt;br /&gt;
# Each event can be used as though it were a &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; tag referring to the filename.&lt;br /&gt;
# Each event can be the name of a subtable, which is a simple array containing the filenames. One sound is picked at random from the list each time the event occurs.&lt;br /&gt;
# Each event can be the name of a subtable, which is a simple array containing further tables, which contain the following tags:&lt;br /&gt;
{{tag&lt;br /&gt;
|name = file&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The filename of the sound to play.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = volume&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = The default volume of the sound.}}&lt;br /&gt;
&lt;br /&gt;
Spring checks any referenced sound filename to see if a SoundItem has been created, which allows greater control over how it is played (See [[Sounds.lua]]).&lt;br /&gt;
&lt;br /&gt;
====sounds Example====&lt;br /&gt;
&lt;br /&gt;
For clarification, here is an example of all three methods:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;sounds = {&lt;br /&gt;
  -- Method 1&lt;br /&gt;
  ok = &#039;oksound&#039;, -- .wav appended&lt;br /&gt;
  -- Method 2&lt;br /&gt;
  arrived = {&lt;br /&gt;
    &#039;arrived1.wav&#039;,&lt;br /&gt;
    &#039;arrived2.wav&#039;,&lt;br /&gt;
  },&lt;br /&gt;
  -- Method 3&lt;br /&gt;
  select = {&lt;br /&gt;
    { file = &#039;selsound1.ogg&#039;, volume = 2.0 },&lt;br /&gt;
    { file = &#039;selsound2.ogg&#039;, volume = 2.5 },&lt;br /&gt;
  },&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====sounds Events====&lt;br /&gt;
&lt;br /&gt;
The events called by the engine are as follows:&lt;br /&gt;
&lt;br /&gt;
{{ItemType&lt;br /&gt;
|name = ok&lt;br /&gt;
|description = Unit is issued a command.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ItemType&lt;br /&gt;
|name = select&lt;br /&gt;
|description = Unit is selected by the player.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ItemType&lt;br /&gt;
|name = arrived&lt;br /&gt;
|description = Unit has arrived at its destination. Mobile ground units only.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ItemType&lt;br /&gt;
|name = build&lt;br /&gt;
|description = Unit begins building. Called for both factories and mobile construction units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ItemType&lt;br /&gt;
|name = activate&lt;br /&gt;
|description = Unit is activated, i.e. Is turned on. Also called when a mobile ground unit starts moving.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ItemType&lt;br /&gt;
|name = deactivate&lt;br /&gt;
|description = Unit deactivates, i.e. Is turned off.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ItemType&lt;br /&gt;
|name = cant&lt;br /&gt;
|description = Unit cannot carry out this order. Loaded but not currently called by the engine.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ItemType&lt;br /&gt;
|name = underattack&lt;br /&gt;
|description = Unit gets attacked. Loaded but not currently called by the engine.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===customParams===&lt;br /&gt;
The &amp;lt;code&amp;gt;customParams&amp;lt;/code&amp;gt; subtable of a UnitDef allows the game designer to give their units 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.&lt;br /&gt;
&lt;br /&gt;
There are no additional tags specific to this subtable&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
MC:L implements OO with inheritance (base classes in [http://sourceforge.net/p/mwspring/code/HEAD/tree/Gamedata/unitdefs_pre.lua#l36 unitdefs_pre.lua])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{ExampleRepoLinks&lt;br /&gt;
|path = units/&lt;br /&gt;
|entity = UnitDefs&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category: Game Dev]]&lt;/div&gt;</summary>
		<author><name>Jivvz</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Map_development&amp;diff=13277</id>
		<title>Map development</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Map_development&amp;diff=13277"/>
		<updated>2009-07-09T08:49:05Z</updated>

		<summary type="html">&lt;p&gt;Jivvz: there -&amp;gt; their&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Map making SM3=&lt;br /&gt;
&lt;br /&gt;
SM3 (Spring Mapformat 3) is getting allong nicely and maps using this format can be made. The following is documented so far.&lt;br /&gt;
&lt;br /&gt;
*[[SM3_Map_Format|jcnossen&#039;s brief description on how this mapformat works.]]&lt;br /&gt;
*[[SM3_FAQ|The first FAQ for the new mapformat.]]&lt;br /&gt;
&lt;br /&gt;
[[Image:sm3-minimap-thumb.jpg]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;NOTE:&#039;&#039;&#039;&#039;&#039; SM3 format is broken at the moment, do not use it. It only renders at all if sm3 shaders are disabled in springsettings, and even then with very low fps. Software rendering is corrupted on nvidia cards, but not on ati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Map making, SMF=&lt;br /&gt;
Maps, are a complex mixture of heightmaps and textures.&lt;br /&gt;
Fortunately, there are several people who share their knowledge with us.&lt;br /&gt;
Their few tutorials will make your life as mapper a lot better.&lt;br /&gt;
&lt;br /&gt;
=Skyboxes=&lt;br /&gt;
*[[Skyboxcreation|Notes about skyboxes]] notes on a prerendered sky box or cube map.&lt;br /&gt;
&lt;br /&gt;
== Full Guides For Map Making ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[[Create_maps|aGorm&#039;s map creating Guide]]&lt;br /&gt;
*[[Map_Making_Guide|aGorms Ultimate Map Making Guide(unfinished)]]&lt;br /&gt;
*[[IceXuick_Map_Design_Help|IceXuicks Map creating Guide]]&lt;br /&gt;
*[http://taspring.clan-sy.com/phpbb/viewtopic.php?t=3941 Forboding Angel&#039;s map creating Tutorial]&lt;br /&gt;
*[[Maps:Tutorial|Another tutorial from a designing point of view]]&lt;br /&gt;
*[[A_Complete_Map_Making_Tutorial|A Complete Map Making Tutorial (under construction)]]&lt;br /&gt;
*[[Runecrafter|Runecrafter&#039;s Map Tutorial]]&lt;br /&gt;
*[http://modinfo.adune.nl/map_making_guide.php Simple map making guide]&lt;br /&gt;
&lt;br /&gt;
== Specific Guides ==&lt;br /&gt;
&lt;br /&gt;
*[[Quanto_OTAMAP_Guide|Quanto&#039;s Guide to OTA Porting and Small Maps]]&lt;br /&gt;
*[[Maps:SMD|Everything about .SMD]]&lt;br /&gt;
*[[Maps:Compiling|Everything about Compiling your map]]&lt;br /&gt;
*[[MapsBalance|Some things about map balance]]&lt;br /&gt;
*[[MapSizes|Map sizes in pixels]] and memory information about map sizes&lt;br /&gt;
*[[Height Map Tutorial|RogerN&#039;s height map tutorial]]&lt;br /&gt;
*[[Create_map_texture_with_povray|Basic howto: create map texture with Povray]]&lt;br /&gt;
&lt;br /&gt;
Features. Stones, rocks, trees, for your map can be found in [http://taspring.clan-sy.com/phpbb/viewtopic.php?t=4047 This thread]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
*[http://taspring.clan-sy.com/phpbb/viewtopic.php?t=2420 Maelstrom&#039;s SMD Generator]&lt;br /&gt;
*[http://www.fileuniverse.com/?p=show&amp;amp;a=it&amp;amp;id=1507 Mother&#039;s Mapconv]&lt;br /&gt;
*[http://user.supradigital.org/jcnossen/FeaturePlacer.zip Jnossen&#039;s SM3 feature placer]&lt;br /&gt;
*[[Maps:Map Designer]] Hugh&#039;s 3D map designer.  Splatting, heightmap editing, splat painting, SM3&lt;br /&gt;
*[http://modinfo.unknown-files.net/coord/mapcoords.php Online starting position creator(dead link)]&lt;br /&gt;
: You can always find out which x/y coordinates are good while starting spring and having a look at the mouse cursor coordinates.&lt;br /&gt;
*[[http://springrts.com/phpbb/viewtopic.php?f=13&amp;amp;t=16341]] Frostregen&#039;s SpringMapEdit. 3D editing, Compiles SM2 directly. Beginner friendly but still powerful.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mappers Clan ==&lt;br /&gt;
[[Map Making Guild]]: That weird fish aGorm set up a clan for poor mappers that can&#039;t get into a clan on there gaming merit... (Mainly for himself therefor...)&lt;br /&gt;
&lt;br /&gt;
== Reference and FAQs ==&lt;br /&gt;
&lt;br /&gt;
* [[Maps:Noob Mistakes]]&lt;br /&gt;
* [[Water Height: Mapconv vs. Heightmap]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
TIPS:&lt;br /&gt;
&lt;br /&gt;
A useful tip, on almost every map in a 1v1 you will start opposite your opponent unless you choose your position. this is because random order simply randomly distributes players at the default start points which in almost every map are opposite each other. One exception that I know of is flooded desert where you both start on the left hand island.&lt;br /&gt;
----&lt;br /&gt;
Make sure that your map&#039;s ideas and game-play is sound before you release it for good. Do a lot of beta testing and learn about good level design! You can learn about what makes a good map by playing on good maps, so play often and map well. -url00&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; [[Main_Page|&amp;lt;- Back to Main page]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:Map development]]&lt;/div&gt;</summary>
		<author><name>Jivvz</name></author>
	</entry>
</feed>