<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://zero-k.info/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Shaman</id>
	<title>Zero-K - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://zero-k.info/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Shaman"/>
	<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/Special:Contributions/Shaman"/>
	<updated>2026-04-25T19:05:50Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Category:Player_Guides&amp;diff=7335</id>
		<title>Category:Player Guides</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Category:Player_Guides&amp;diff=7335"/>
		<updated>2021-03-24T10:46:13Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Added category:Player Guides&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a page full of user created guides.&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=User:Shaman/Development_Tips&amp;diff=7041</id>
		<title>User:Shaman/Development Tips</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=User:Shaman/Development_Tips&amp;diff=7041"/>
		<updated>2020-11-01T11:16:19Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Some notes I want to keep.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page outlines some general knowledge collected over the years. Mostly this is my notes.&lt;br /&gt;
&lt;br /&gt;
= Really, Really Big things =&lt;br /&gt;
* TEST WITH LOCAL ZK-TEST.SDZ!!!! REALLY.&lt;br /&gt;
* Do NOT test cawidgets with local replacement.&lt;br /&gt;
* Multiplayer tests can be done by uploading an sdz to maps on site&lt;br /&gt;
&lt;br /&gt;
= Cawidgets =&lt;br /&gt;
* DO NOT USE SPEED UPS HERE. I don't know why exactly, but GoogleFrog says it's bad and it tends to lead to bad things.&lt;br /&gt;
* Probably not good to use speedups anywhere in the top level dir of luaui or luarules. Idk.&lt;br /&gt;
* You can make derivatives of other callins with it. Useful!&lt;br /&gt;
* Alters the way widgets work.&lt;br /&gt;
&lt;br /&gt;
= Callins.lua =&lt;br /&gt;
* This file is a red herring. Nobody probably knows what it does.&lt;br /&gt;
&lt;br /&gt;
= Camain.lua =&lt;br /&gt;
* Who knows what it does.&lt;br /&gt;
&lt;br /&gt;
= Cache.lua =&lt;br /&gt;
* You can poison (see: changing the return values) of functions with this. This changes affects everything.&lt;br /&gt;
* Don't attempt to override names with it. This just leads to people losing the ability to chat -.-&lt;br /&gt;
&lt;br /&gt;
= Unitdefs =&lt;br /&gt;
* These have a different style for... reasons. &lt;br /&gt;
* Double space instead of tab.&lt;br /&gt;
&lt;br /&gt;
= Git =&lt;br /&gt;
* Don't use PR's to update your fork.&lt;br /&gt;
* Use git rebasing to update work.&lt;br /&gt;
* Use git rebase -i HEAD~# to squash stuff.&lt;br /&gt;
* Squash your commits down a bit for redundant things (but not ones that significantly alter things)&lt;br /&gt;
&lt;br /&gt;
= Callins =&lt;br /&gt;
* Update uses FPS to trigger, and GameFrame does not.&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Blender_To_Zero-K&amp;diff=7039</id>
		<title>Blender To Zero-K</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Blender_To_Zero-K&amp;diff=7039"/>
		<updated>2020-10-24T18:50:12Z</updated>

		<summary type="html">&lt;p&gt;Shaman: No formatting for rapid link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here is a tutorial covering all of the steps to make or edit a model in [https://www.blender.org/ Blender] (a free 3d modelling program) and transfer it to the Spring engine, then have Zero-K load it as a mutator so you can test it in-game.&lt;br /&gt;
&lt;br /&gt;
The contents page here will also act as a quick reference for all of the necessary steps, in order:&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Make or Edit the model in Blender ==&lt;br /&gt;
=== Setting up Blender for use in Zero-K ===&lt;br /&gt;
If you are totally new to blender there are a few things you probably ought to do to set up blender for use with Zero-K.  Additionally, this tutorial will assume you are using left-click to select (the new default) and a fairly typical window layout similar to the default.&lt;br /&gt;
&lt;br /&gt;
Blender comes with several add-ons and scripts, not all of which are enabled by default.  While there are many additional ones you might have to pay for that could prove useful (meshmachine, decalmachine and hard ops are probably the most well known three) there are a few free add-ons you may wish to consider.  You should absolutely go to the Edit-&amp;amp;gt;Preferences-&amp;amp;gt;Add-ons submenu and enable Node Wrangler, and Looptools.&lt;br /&gt;
&lt;br /&gt;
To import s3o models from spring, you will need an addon which can be found [https://github.com/sanguinariojoe/blender_s3o_import here].  You need to download the python (.py) file and then use the Install button inside blender's add-ons submenu, pointing it at that .py file, so that blender knows how to import .s3o models.  Make sure to enable the add-on after installation.&lt;br /&gt;
&lt;br /&gt;
If you want to export animations, you will also need [https://github.com/Anarchid/blender2lus this] animation exporter, though the output it produces will likely still require manual adjustment and will not be covered by this tutorial.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importing a model (optional) ===&lt;br /&gt;
With the s3o importer installed and enabled, you should be able to import s3o models from spring into blender by using the File-&amp;amp;gt;Import-&amp;amp;gt;s3o option.  Then navigate to your model file and select it.&lt;br /&gt;
&lt;br /&gt;
s3o models often come in rotated to one side, as Spring uses Y-axis-up and Blender uses Z-axis-up.  You can rotate them to look right in Blender, and then when exporting them there are options to deal with this so that they export rotated correctly.&lt;br /&gt;
&lt;br /&gt;
If the importer can find them, it will also import textures and the UV map along with the model.  The texture files may need to be placed appropriately or in the same directory as the model file for this to work.&lt;br /&gt;
&lt;br /&gt;
=== Importing textures ===&lt;br /&gt;
To open a texture you need to set a window to either the Image Editor or UV Editor mode, and then press the Open button in the top menu bar.  This will bring up a file menu where you can select a texture to bring into Blender.  Blender supports .dds textures by default, as well as most other image formats.  &lt;br /&gt;
&lt;br /&gt;
You can certainly import any old texture and work with it, but if you are importing textures already used by Spring you should know that they are somewhat unusual.&lt;br /&gt;
&lt;br /&gt;
Spring has two separate texture formats.  The first of these, referred to as tex1 or colour texture, uses Red Green Blue (RGB) channels to store colour data, and Alpha (A) to store whether that part of the file is teamcolour or not.  This means that by default a tex1 texture looks mostly blank(transparent) with some odd black bits scattered around.  You can fix this in Blender by scrolling the menu bar (hold middle button with cursor on menu, drag mouse to side) all the way to the right, and clicking the little drop down which says Display Channels [[File:Blender_display_channels.png]].  By default it is set to ''Colour and Alpha'' but you should set it to ''Colour'' when working with tex1 files to ignore the alpha channel.&lt;br /&gt;
&lt;br /&gt;
Tex2 files are the ones in greenyblue with bits of red.  In those files the Red channel is how much that part of the texture emits light, the Green channel is how rough or smooth that part of the texture is (which determines how it reacts to light), and the Blue channel is how metallic and reflective that part of the texture is.  Areas which are cyan (full green and full blue) are mirror-smooth metal, so reflect the environment perfectly.  These should always have their colourspace set to non-colour data as they use each channel separately.  You can find that option in the right hand popout menu when in an image editor viewing them (shortcut key N by default) under the Image tab.&lt;br /&gt;
&lt;br /&gt;
You may also need or want to use Normal map textures, which are the ones that look mostly blue with some oddly coloured parts around the edges.  Whenever you use these normal map textures you should always change the colourspace to non-colour data as it can cause visual errors if you do not, since it will process the channels differently in the render pipeline.&lt;br /&gt;
&lt;br /&gt;
If nothing in the scene uses your texture it will be discarded from the file when you save and exit.  You may click the shield icon next to the file name to prevent this, if you want to have the textures kept around even with nothing using it.  As long as you've assigned the texture to a material, and the material to a model (see below) this will not be a problem, but it's useful to know this option exists and why a texture might be dropped.&lt;br /&gt;
&lt;br /&gt;
Blend files do not by default contain the textures referenced in them, but you 'can' optionally pack the textures into them for easy transfer between users or computers.   Explore the File-&amp;amp;gt;External Data menu for those options.&lt;br /&gt;
&lt;br /&gt;
=== Modelling for Zero-K ===&lt;br /&gt;
There are not many special considerations when modelling for Zero-K, and a general explanation of modelling and blender is too detailed to go here.  However, you could consult tutorials such as [https://www.youtube.com/watch?v=7MRonzqYJgw&amp;amp;list=PLn3ukorJv4vs_eSJUQPxBRaDS8PrVmIri Grant Abbitt's beginner series] or [https://www.youtube.com/watch?v=1jHUY3qoBu8 Imphenzia's introduction and low poly modelling] tutorial.&lt;br /&gt;
&lt;br /&gt;
Generally, you should attempt to keep the number of triangles used in a model as low as is reasonable.  That number varies depending on how frequent the unit is planned to be - a commander or other functionally unique unit would be fine with up to 30,000 triangles, but for a very spammable unit such as a flea this would be extremely excessive, as you can build a vast number of fleas.  Something in the region of 500-1000 would be more appropriate, with less being ideal as long as the model still looks good.&lt;br /&gt;
&lt;br /&gt;
The size of the model (or part of model) and how visible it is also has an impact on how many polygons you should be using.  A large model covering a lot of screen space should use more polygons and texels than a small one or a part of the model that people rarely or never see.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Texturing for Zero-K, and Spring texture oddities ===&lt;br /&gt;
As mentioned earlier, spring uses two textures per model and cannot use multiple UV Maps, cannot use vertex colours, and cannot use additional textures other than a normal map.&lt;br /&gt;
&lt;br /&gt;
The tex1 format covers the diffuse colour and whether a pixel is teamcoloured or not, wheras tex2 covers the emissivity, roughness, and metalness of the model in its RGB channels respectively.&lt;br /&gt;
&lt;br /&gt;
Remember that most DDS normal maps are slightly different from typical OpenGL normal maps, and adjust appropriately as needed.  Typically inverting the Red and Green channels does the trick.&lt;br /&gt;
&lt;br /&gt;
If you import a texture then the importer will set up the nodes for you, however, if you are starting from scratch then you probably just want to replicate this node setup.  This mostly approximates what Spring will do in-engine, giving you a workable preview in Blender when you use a lookdev(Material Preview) view mode.&lt;br /&gt;
&lt;br /&gt;
[[File:Spring_shader.png]]&lt;br /&gt;
&lt;br /&gt;
There are three textures referenced here, which in this case happen to be atlas textures which can be reused for multiple models. The core_color.dds is tex1 and has colours and teamcolours - the alpha channel is split off, inverted, and used to colour the alpha areas green (you can click the green colour to replace it with any other colour, if you like).&lt;br /&gt;
&lt;br /&gt;
The core_other.dds is the tex2 file, so it is split into RGB channels and each of these channels appropriately processed and connected to the relevant part of the material.&lt;br /&gt;
&lt;br /&gt;
Finally the core_normals.dds contains a direct-x formatted normal map, so it is converted to an openGL format by inverting just the Green channel and is then passed through the normal calculation node to convert the image into a vector map, and then the vector map passed to the shader.&lt;br /&gt;
&lt;br /&gt;
TODO: Provide a blend file here that already has this material set up, just need to plug in textures.  Or just include atlas texture.  Airpad_packed.blend is sadly larger than 2mb so the wiki will not host it.&lt;br /&gt;
&lt;br /&gt;
== Export the model to .dae format ==&lt;br /&gt;
Nowadays Spring can read .dae (Collada) files directly via the use of Assimp (Asset Importer).  This means the export process is reasonably simple. &lt;br /&gt;
&lt;br /&gt;
Either clean your scene of everything you do not want to be exported, or select only the things you want exported.  Go to the File-&amp;amp;gt;Export menu and select Collada (.dae) format.  A file browser will open with various export settings on the right hand side.&lt;br /&gt;
&lt;br /&gt;
You should pick Selection Only from the Main tab of export options if you want to limit it to selection.&lt;br /&gt;
&lt;br /&gt;
Make sure that the orientation settings are correct.  You want to tell the exporter what axes you've been modelling with, not the axes you're looking for.  These are the default options and should usually be right, Spring/Assimp will then adjust them for use in engine, but if after checking things in Spring your object is oriented wrongly, you can try adjusting these and exporting again.  If all else fails, you can parent the root object(s) to an empty placed at the origin and rotate that. [[File:collada_default_export.png]]&lt;br /&gt;
&lt;br /&gt;
=== A note on animation ===&lt;br /&gt;
Although Collada (.dae) files do support exporting animation, you should not do this as Spring cannot read the animation data.  Instead, animations in Zero-K are handled by a lua animation script known as LUS.&lt;br /&gt;
&lt;br /&gt;
Although you cannot export the animations to Collada, you can still do your animations in Blender and use the Blender2Lus export script linked earlier to export a starting animation script.  It has several limitations, such as only exporting the active action from each object in the scene, but running it several times and tweaking and combining the generated scripts can reduce the amount of work in generating animation scripts immensely.  Further use of this script is, for the moment, outside the scope of this tutorial (because I haven't done it myself yet - feel free to replace this with detailed explanation if you have, though!)&lt;br /&gt;
&lt;br /&gt;
== Set up texture associations and .dae.lua metadata ==&lt;br /&gt;
Although Spring can read .dae files and the contained UV map, it does not support any sort of material or texture import, so you have to specify these manually.  Since at this point you have already set Blender up with a reasonable approximation of the texture process it should not be especially difficult.&lt;br /&gt;
&lt;br /&gt;
You will need to provide a .dae.lua file with the same name as your model file, in the same directory, to tell Spring which texture files and associated data to use with the model.&lt;br /&gt;
&lt;br /&gt;
For example, if your model export is snazzyUnit.dae and it is present under the /objects3d folder of your testing mod, you should make a snazzyUnit.dae.lua file and place that at /objects3d/snazzyUnit.dae.lua .&lt;br /&gt;
&lt;br /&gt;
The documentation for these metadata files is [https://springrts.com/wiki/3DModels:AssimpMetadata here], but they are reasonably simple and a minimal example file is provided below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
return {&lt;br /&gt;
	tex1 = &amp;quot;core_color.dds&amp;quot;,&lt;br /&gt;
	tex2 = &amp;quot;core_other.dds&amp;quot;,&lt;br /&gt;
	invertteamcolor = false&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Obviously if you are not using the atlas textures you will need to replace those names with the actual texture files you intend to use.  There are several other things that may need to be in this file, but as these differ per-unit you will need to decide what, if anything, to provide.  You should probably also decide on a radius to set - leaving it out autogenerates a large radius covering the entire model, but for many reasons it's not always appropriate.  Examine similar units in game (ctrl-alt-B shows collision bounds, radius is the grey sphere) and match them if necessary.&lt;br /&gt;
&lt;br /&gt;
== Set up Zero-K mod that contains and uses your files ==&lt;br /&gt;
To get Zero-K to see your files and locally test your units (new or otherwise) you can use a mod, or download all the source and point your original version at it.  I will use a mod.&lt;br /&gt;
&lt;br /&gt;
This is selectable in local skirmish mode (and theoretically you can distribute them to test in multiplayer) which allows you to check everything works in the engine without requiring any changes to the official repositories or a local development copy of the game - all you need is a working copy of Zero-K.  You should eventually check it works with a properly set up dev copy (and that copy can be used for many changes, if necessary) but for now a mod is simpler.&lt;br /&gt;
&lt;br /&gt;
=== Making the mod ===&lt;br /&gt;
Inside the Zero-K folder there is a games subfolder.  Inside that are numerous things, but if you make a new subfolder with a name ending in .sdd it will be read by the engine on startup.  A base mod is available to download [File:BaseMod.sdd.zip here] to build from if you would like an example.  More details on mod creation can be found here: [[Mod Creation]]&lt;br /&gt;
&lt;br /&gt;
Create a mod and fill out the modinfo.lua, making sure to change the name and description so you can tell it apart when you are selecting it.  If the depends tag is listed as &amp;lt;nowiki&amp;gt;[[rapid:/zk:stable]]&amp;lt;/nowiki&amp;gt; you will have to manually change it to the latest ZK version in this format:&lt;br /&gt;
&amp;lt;pre&amp;gt;depend = {&lt;br /&gt;
		[[Zero-K v1.8.10.0]]&lt;br /&gt;
	},&amp;lt;/pre&amp;gt;&lt;br /&gt;
Update the version number appropriately.&lt;br /&gt;
&lt;br /&gt;
=== File locations ===&lt;br /&gt;
Like many mods, the file structure downwards from the modname.sdd folder should exactly match the Zero-K internal virtual file system, and if there are any files in your mod that match names with base files, Zero-K will use your mod's file instead of the base file.&lt;br /&gt;
&lt;br /&gt;
This allows you to selectively replace any files with whatever changed version you want, which is ideal for our purposes of testing a mod.  Any ''new'' files will also be loaded, allowing you to test entirely new units - although you may have to modify the buildoptions list of an existing factory or constructor to allow them to build your new unit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;AN IMPORTANT NOTE:&lt;br /&gt;
You should keep all of filenames and folder names lower case, as the virtual file system lowercases everything.  Double check your filenames, it needs to match exactly if you are replacing things.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing your mod ===&lt;br /&gt;
Once you have filled out your folders and files, probably (but not exclusively) using /objects3d , /units and /unittextures , you can progress to actually testing it works in-engine.&lt;br /&gt;
&lt;br /&gt;
Load up Zero-K and go to singleplayer, then Skirmish.  The map and opponents do not especially matter, though if you are testing a lot you probably want to use an inactive AI (check through main lobby options for additional AI types if it's not there by default).&lt;br /&gt;
&lt;br /&gt;
Go into Adv Options, and pick 'Select Mod'.  If the folder and modinfo are correct you should see your mod on the list.  If you do not, download the base mod, unzip it to the appropriate place and check if that shows up - if it does, the problem is with your mod.  If it does not, then something is probably in the wrong place.&lt;br /&gt;
&lt;br /&gt;
Once you've selected your mod you should start the skirmish and attempt to test whatever you've actually changed.  At one point while doing this, Zero-K would not load because the interpreter for the mod's unitdef files was more strict than the main game's, so you may wish to follow the format used in the base mod (it overwrites lotus turrets) more exactly if you have this problem.&lt;br /&gt;
&lt;br /&gt;
== Fix whatever isn't right ==&lt;br /&gt;
Do not expect everything to be perfect.  This is a very complicated process and something is probably broken somewhere - either way, check everything, and get used to the idea that you may have to edit, re-export, then restart the game a lot to retry with changes quite often.  Although unit definitions and such may be reloaded without quitting the game (TODO: what is the command to do this?  How reliable is it?) you should eventually restart Zero-K to do a round of final testing just to ensure that everything loads correctly from startup.&lt;br /&gt;
&lt;br /&gt;
== The other bits ==&lt;br /&gt;
Ever heard about software development that first you need to complete 90% of the project, and then you need to complete the other 90% of the project?  The same sometimes applies to modding.  &lt;br /&gt;
&lt;br /&gt;
Even though by this point you should have your unit or building in game and working, there are other things to do before it's ready!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== groundplane decal and ao bake ===&lt;br /&gt;
If your unit is a building, you will need to create a ground plane to go underneath it - at the very least an ambient occlusion baked shadow, usually referred to as an aoplane.  This is simply a texture which is sized appropriately for your model and is placed underneath it by the engine.  This adds a little soft shadowing around the edge of the building which helps immensely to integrate it with the map.&lt;br /&gt;
&lt;br /&gt;
There are a few ways to make these, but the easiest if following this tutorial is probably just to bake your own in Blender.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Create and size the virtual ground plane ====&lt;br /&gt;
First, create a plane and place it under your model.  It should be at zero relative to where the model is going to go, but this plane will never leave blender directly - it will be the Spring engine painting the decal onto the terrain.  Scale it until it completely covers all of your model, then apply the scale and scale it *again* so that it is appropriately larger than the footprint of your model.  This size may need adjusting so that it fits an integer value - for example, if the unitdef lists your unit as 5 footprint-units wide, then (since you can only set the decal footprint size to an integer) you would have to choose 6 (6/5 = 120% of the model size) or 7 (7/5 = 140% of the model size).  Somewhere between 120% and 140% is probably fine.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Setup for AO Baking ====&lt;br /&gt;
Once you have the plane appropriately sized, go to the render tab [[File:Blender_render_tab.png]] and change the Render engine to Cycles.  You may wish to change the feature set and compute device appropriate to your system (especially if you have a powerful GPU) but the defaults should be fine for this.&lt;br /&gt;
&lt;br /&gt;
Make sure you set the number of samples in the Sampling section high enough.  512 is a good number to start from, though as high as 1024 is useful to reduce noise.  More samples mean more render time, even for something as simple as baking a simple ambient occlusion map.&lt;br /&gt;
&lt;br /&gt;
Next, go to the world tab [[File:Blender_world_tab.png]] and activate Ambient Occlusion.  Factor should be 1.0, and the distance parameter depends on how large your model is.  You may have to tweak this value until the resulting bake looks correct, but start with a distance parameter somewhere around 25% to 50% of the width of your model, turning it up if this is not sufficient.&lt;br /&gt;
&lt;br /&gt;
To properly bake, we need somewhere to put the texture - so open up a shader node window somewhere, select the ground plane and make sure that it is using a new material and that material is using nodes.  Connect a texture node using the Ctrl-T shortcut. Press New to make a new texture, and set it to the appropriate size - typically 512px square for something the size of a factory or 128px square for smaller buildings.  Set the image colourspace to non-colour data to prevent shading artefacts later.  Make sure this texture node has been clicked on and is selected, because it's the last selected texture for each relevant object that receives the bake.&lt;br /&gt;
&lt;br /&gt;
Finally we're almost ready to do the baking!  Return to the render tab [[File:Blender_render_tab.png]] and scroll down to the Bake section.  From the Bake Type dropdown select Ambient Occlusion.  Make sure that Selected to Active is OFF, as that is intended to transfer high poly modelling data to low poly objects and we actually do want just a general scene-wide bake of ambient occlusion, it's just we only care about the result on this one ground plane object.  Margin can be adjusted but the default of 16px is probably fine.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Do the bake ====&lt;br /&gt;
Press Bake!&lt;br /&gt;
&lt;br /&gt;
If blender crashed that's fine, go check in the log file to see what did it - the last time I had a crash here, I had an addon (bezier tools, totally unrelated to anything to do with baking) going wrong, and so I had to temporarily disable it.&lt;br /&gt;
&lt;br /&gt;
If all went well, you should have seen a few textures render if you were on something with a texture view, and if you go to find your new ambient occlusion texture it should be a black outline in the shape of your building with a white outside, and a blurry shadowy bit around the edge of the black outline, which is what the game will draw onto the ground.  Export this as a png.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Touchup and adjust format in external image editor ====&lt;br /&gt;
The next bit you will need to do in GIMP/Glimpse, or any other image processing software capable of exporting DDS textures.  Simply load your image file, turn the white colour into transparency by whatever method you prefer such that full black is opaque and full white is transparent, and then export as DDS.  Spring wants textures to be DXT5 compressed, with mipmaps generated.&lt;br /&gt;
&lt;br /&gt;
If you want some other decal underneath your unit, perhaps a metallic decal if it is a factory for example, you can add that as another layer in your image editing software here.  Ensure that the ambient occlusion layer overlays it where necessary.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Adjust unitdef to include groundplane ====&lt;br /&gt;
Now you've got a groundplane texture, rename it to something like unitname_aoplane.dds and put it into the /unittextures folder.  Then go to the unitdef and make sure that these tags are filled out:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
buildingGroundDecalDecaySpeed = 30, --Seconds decal takes to fade out of existence&lt;br /&gt;
buildingGroundDecalSizeX      = 12, --Size of the decal's X axis in footprint units &lt;br /&gt;
buildingGroundDecalSizeY      = 12, --Size of the decal's Y axis in footprint units &lt;br /&gt;
buildingGroundDecalType       = [[unitname_aoplane.dds]], --filename of decal&lt;br /&gt;
&lt;br /&gt;
useBuildingGroundDecal        = true,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After saving the updated unitdef, go and check that the ground plane exists in game.  They can be quite subtle, but by toggling on and off the &amp;quot;show ground decals&amp;quot; option, you should be able to see the difference easily.&lt;br /&gt;
&lt;br /&gt;
If needed, you can edit your original png file in the image editor again and apply gaussian blur to the image to spread the shadow out further.  Ensure that the shadow's edge doesn't touch the edge of the image, as this tends to look obvious.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== unitpic ===&lt;br /&gt;
Unit pictures in the buildmenu are generated by an automated script.  This script lives as a Lua gadget within the Zero-K base content, so if you have your mod working you can load that up and generate a buildpic.&lt;br /&gt;
&lt;br /&gt;
First, press F8 to show the debug console, then turn on cheats with /cheat (or !cheats in multiplayer, which will require host permissions.)&lt;br /&gt;
&lt;br /&gt;
Then run &amp;lt;pre&amp;gt;/luarules buildicon {unitname}&amp;lt;/pre&amp;gt;. You can run it with no unit name and instead buildicons if you want to generate buildicons for every unit in the game.  It should output the icons to your Zero-K folder under the /buildicons folder.  You will then have to move it to the /unitpics folder of your mod, name it appropriately, and check it works.&lt;br /&gt;
&lt;br /&gt;
=== Developer mode test with full file system ===&lt;br /&gt;
&lt;br /&gt;
Now is the time to test against the full developer mode run - see [[Developing]] for information on how to set that up.  Copy your files to an up to date copy of the latest source files from GitHub and check if they work there.  &lt;br /&gt;
&lt;br /&gt;
Once they do you should be ready to make a pull request.  If you forked from the development version as the linked instructions suggest, you should be able to use your fork to do this.&lt;br /&gt;
&lt;br /&gt;
[[category:Development]]&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Blender_To_Zero-K&amp;diff=7038</id>
		<title>Blender To Zero-K</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Blender_To_Zero-K&amp;diff=7038"/>
		<updated>2020-10-24T18:45:21Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Add development category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here is a tutorial covering all of the steps to make or edit a model in [https://www.blender.org/ Blender] (a free 3d modelling program) and transfer it to the Spring engine, then have Zero-K load it as a mutator so you can test it in-game.&lt;br /&gt;
&lt;br /&gt;
The contents page here will also act as a quick reference for all of the necessary steps, in order:&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Make or Edit the model in Blender ==&lt;br /&gt;
=== Setting up Blender for use in Zero-K ===&lt;br /&gt;
If you are totally new to blender there are a few things you probably ought to do to set up blender for use with Zero-K.  Additionally, this tutorial will assume you are using left-click to select (the new default) and a fairly typical window layout similar to the default.&lt;br /&gt;
&lt;br /&gt;
Blender comes with several add-ons and scripts, not all of which are enabled by default.  While there are many additional ones you might have to pay for that could prove useful (meshmachine, decalmachine and hard ops are probably the most well known three) there are a few free add-ons you may wish to consider.  You should absolutely go to the Edit-&amp;amp;gt;Preferences-&amp;amp;gt;Add-ons submenu and enable Node Wrangler, and Looptools.&lt;br /&gt;
&lt;br /&gt;
To import s3o models from spring, you will need an addon which can be found [https://github.com/sanguinariojoe/blender_s3o_import here].  You need to download the python (.py) file and then use the Install button inside blender's add-ons submenu, pointing it at that .py file, so that blender knows how to import .s3o models.  Make sure to enable the add-on after installation.&lt;br /&gt;
&lt;br /&gt;
If you want to export animations, you will also need [https://github.com/Anarchid/blender2lus this] animation exporter, though the output it produces will likely still require manual adjustment and will not be covered by this tutorial.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importing a model (optional) ===&lt;br /&gt;
With the s3o importer installed and enabled, you should be able to import s3o models from spring into blender by using the File-&amp;amp;gt;Import-&amp;amp;gt;s3o option.  Then navigate to your model file and select it.&lt;br /&gt;
&lt;br /&gt;
s3o models often come in rotated to one side, as Spring uses Y-axis-up and Blender uses Z-axis-up.  You can rotate them to look right in Blender, and then when exporting them there are options to deal with this so that they export rotated correctly.&lt;br /&gt;
&lt;br /&gt;
If the importer can find them, it will also import textures and the UV map along with the model.  The texture files may need to be placed appropriately or in the same directory as the model file for this to work.&lt;br /&gt;
&lt;br /&gt;
=== Importing textures ===&lt;br /&gt;
To open a texture you need to set a window to either the Image Editor or UV Editor mode, and then press the Open button in the top menu bar.  This will bring up a file menu where you can select a texture to bring into Blender.  Blender supports .dds textures by default, as well as most other image formats.  &lt;br /&gt;
&lt;br /&gt;
You can certainly import any old texture and work with it, but if you are importing textures already used by Spring you should know that they are somewhat unusual.&lt;br /&gt;
&lt;br /&gt;
Spring has two separate texture formats.  The first of these, referred to as tex1 or colour texture, uses Red Green Blue (RGB) channels to store colour data, and Alpha (A) to store whether that part of the file is teamcolour or not.  This means that by default a tex1 texture looks mostly blank(transparent) with some odd black bits scattered around.  You can fix this in Blender by scrolling the menu bar (hold middle button with cursor on menu, drag mouse to side) all the way to the right, and clicking the little drop down which says Display Channels [[File:Blender_display_channels.png]].  By default it is set to ''Colour and Alpha'' but you should set it to ''Colour'' when working with tex1 files to ignore the alpha channel.&lt;br /&gt;
&lt;br /&gt;
Tex2 files are the ones in greenyblue with bits of red.  In those files the Red channel is how much that part of the texture emits light, the Green channel is how rough or smooth that part of the texture is (which determines how it reacts to light), and the Blue channel is how metallic and reflective that part of the texture is.  Areas which are cyan (full green and full blue) are mirror-smooth metal, so reflect the environment perfectly.  These should always have their colourspace set to non-colour data as they use each channel separately.  You can find that option in the right hand popout menu when in an image editor viewing them (shortcut key N by default) under the Image tab.&lt;br /&gt;
&lt;br /&gt;
You may also need or want to use Normal map textures, which are the ones that look mostly blue with some oddly coloured parts around the edges.  Whenever you use these normal map textures you should always change the colourspace to non-colour data as it can cause visual errors if you do not, since it will process the channels differently in the render pipeline.&lt;br /&gt;
&lt;br /&gt;
If nothing in the scene uses your texture it will be discarded from the file when you save and exit.  You may click the shield icon next to the file name to prevent this, if you want to have the textures kept around even with nothing using it.  As long as you've assigned the texture to a material, and the material to a model (see below) this will not be a problem, but it's useful to know this option exists and why a texture might be dropped.&lt;br /&gt;
&lt;br /&gt;
Blend files do not by default contain the textures referenced in them, but you 'can' optionally pack the textures into them for easy transfer between users or computers.   Explore the File-&amp;amp;gt;External Data menu for those options.&lt;br /&gt;
&lt;br /&gt;
=== Modelling for Zero-K ===&lt;br /&gt;
There are not many special considerations when modelling for Zero-K, and a general explanation of modelling and blender is too detailed to go here.  However, you could consult tutorials such as [https://www.youtube.com/watch?v=7MRonzqYJgw&amp;amp;list=PLn3ukorJv4vs_eSJUQPxBRaDS8PrVmIri Grant Abbitt's beginner series] or [https://www.youtube.com/watch?v=1jHUY3qoBu8 Imphenzia's introduction and low poly modelling] tutorial.&lt;br /&gt;
&lt;br /&gt;
Generally, you should attempt to keep the number of triangles used in a model as low as is reasonable.  That number varies depending on how frequent the unit is planned to be - a commander or other functionally unique unit would be fine with up to 30,000 triangles, but for a very spammable unit such as a flea this would be extremely excessive, as you can build a vast number of fleas.  Something in the region of 500-1000 would be more appropriate, with less being ideal as long as the model still looks good.&lt;br /&gt;
&lt;br /&gt;
The size of the model (or part of model) and how visible it is also has an impact on how many polygons you should be using.  A large model covering a lot of screen space should use more polygons and texels than a small one or a part of the model that people rarely or never see.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Texturing for Zero-K, and Spring texture oddities ===&lt;br /&gt;
As mentioned earlier, spring uses two textures per model and cannot use multiple UV Maps, cannot use vertex colours, and cannot use additional textures other than a normal map.&lt;br /&gt;
&lt;br /&gt;
The tex1 format covers the diffuse colour and whether a pixel is teamcoloured or not, wheras tex2 covers the emissivity, roughness, and metalness of the model in its RGB channels respectively.&lt;br /&gt;
&lt;br /&gt;
Remember that most DDS normal maps are slightly different from typical OpenGL normal maps, and adjust appropriately as needed.  Typically inverting the Red and Green channels does the trick.&lt;br /&gt;
&lt;br /&gt;
If you import a texture then the importer will set up the nodes for you, however, if you are starting from scratch then you probably just want to replicate this node setup.  This mostly approximates what Spring will do in-engine, giving you a workable preview in Blender when you use a lookdev(Material Preview) view mode.&lt;br /&gt;
&lt;br /&gt;
[[File:Spring_shader.png]]&lt;br /&gt;
&lt;br /&gt;
There are three textures referenced here, which in this case happen to be atlas textures which can be reused for multiple models. The core_color.dds is tex1 and has colours and teamcolours - the alpha channel is split off, inverted, and used to colour the alpha areas green (you can click the green colour to replace it with any other colour, if you like).&lt;br /&gt;
&lt;br /&gt;
The core_other.dds is the tex2 file, so it is split into RGB channels and each of these channels appropriately processed and connected to the relevant part of the material.&lt;br /&gt;
&lt;br /&gt;
Finally the core_normals.dds contains a direct-x formatted normal map, so it is converted to an openGL format by inverting just the Green channel and is then passed through the normal calculation node to convert the image into a vector map, and then the vector map passed to the shader.&lt;br /&gt;
&lt;br /&gt;
TODO: Provide a blend file here that already has this material set up, just need to plug in textures.  Or just include atlas texture.  Airpad_packed.blend is sadly larger than 2mb so the wiki will not host it.&lt;br /&gt;
&lt;br /&gt;
== Export the model to .dae format ==&lt;br /&gt;
Nowadays Spring can read .dae (Collada) files directly via the use of Assimp (Asset Importer).  This means the export process is reasonably simple. &lt;br /&gt;
&lt;br /&gt;
Either clean your scene of everything you do not want to be exported, or select only the things you want exported.  Go to the File-&amp;amp;gt;Export menu and select Collada (.dae) format.  A file browser will open with various export settings on the right hand side.&lt;br /&gt;
&lt;br /&gt;
You should pick Selection Only from the Main tab of export options if you want to limit it to selection.&lt;br /&gt;
&lt;br /&gt;
Make sure that the orientation settings are correct.  You want to tell the exporter what axes you've been modelling with, not the axes you're looking for.  These are the default options and should usually be right, Spring/Assimp will then adjust them for use in engine, but if after checking things in Spring your object is oriented wrongly, you can try adjusting these and exporting again.  If all else fails, you can parent the root object(s) to an empty placed at the origin and rotate that. [[File:collada_default_export.png]]&lt;br /&gt;
&lt;br /&gt;
=== A note on animation ===&lt;br /&gt;
Although Collada (.dae) files do support exporting animation, you should not do this as Spring cannot read the animation data.  Instead, animations in Zero-K are handled by a lua animation script known as LUS.&lt;br /&gt;
&lt;br /&gt;
Although you cannot export the animations to Collada, you can still do your animations in Blender and use the Blender2Lus export script linked earlier to export a starting animation script.  It has several limitations, such as only exporting the active action from each object in the scene, but running it several times and tweaking and combining the generated scripts can reduce the amount of work in generating animation scripts immensely.  Further use of this script is, for the moment, outside the scope of this tutorial (because I haven't done it myself yet - feel free to replace this with detailed explanation if you have, though!)&lt;br /&gt;
&lt;br /&gt;
== Set up texture associations and .dae.lua metadata ==&lt;br /&gt;
Although Spring can read .dae files and the contained UV map, it does not support any sort of material or texture import, so you have to specify these manually.  Since at this point you have already set Blender up with a reasonable approximation of the texture process it should not be especially difficult.&lt;br /&gt;
&lt;br /&gt;
You will need to provide a .dae.lua file with the same name as your model file, in the same directory, to tell Spring which texture files and associated data to use with the model.&lt;br /&gt;
&lt;br /&gt;
For example, if your model export is snazzyUnit.dae and it is present under the /objects3d folder of your testing mod, you should make a snazzyUnit.dae.lua file and place that at /objects3d/snazzyUnit.dae.lua .&lt;br /&gt;
&lt;br /&gt;
The documentation for these metadata files is [https://springrts.com/wiki/3DModels:AssimpMetadata here], but they are reasonably simple and a minimal example file is provided below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
return {&lt;br /&gt;
	tex1 = &amp;quot;core_color.dds&amp;quot;,&lt;br /&gt;
	tex2 = &amp;quot;core_other.dds&amp;quot;,&lt;br /&gt;
	invertteamcolor = false&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Obviously if you are not using the atlas textures you will need to replace those names with the actual texture files you intend to use.  There are several other things that may need to be in this file, but as these differ per-unit you will need to decide what, if anything, to provide.  You should probably also decide on a radius to set - leaving it out autogenerates a large radius covering the entire model, but for many reasons it's not always appropriate.  Examine similar units in game (ctrl-alt-B shows collision bounds, radius is the grey sphere) and match them if necessary.&lt;br /&gt;
&lt;br /&gt;
== Set up Zero-K mod that contains and uses your files ==&lt;br /&gt;
To get Zero-K to see your files and locally test your units (new or otherwise) you can use a mod, or download all the source and point your original version at it.  I will use a mod.&lt;br /&gt;
&lt;br /&gt;
This is selectable in local skirmish mode (and theoretically you can distribute them to test in multiplayer) which allows you to check everything works in the engine without requiring any changes to the official repositories or a local development copy of the game - all you need is a working copy of Zero-K.  You should eventually check it works with a properly set up dev copy (and that copy can be used for many changes, if necessary) but for now a mod is simpler.&lt;br /&gt;
&lt;br /&gt;
=== Making the mod ===&lt;br /&gt;
Inside the Zero-K folder there is a games subfolder.  Inside that are numerous things, but if you make a new subfolder with a name ending in .sdd it will be read by the engine on startup.  A base mod is available to download [File:BaseMod.sdd.zip here] to build from if you would like an example.  More details on mod creation can be found here: [[Mod Creation]]&lt;br /&gt;
&lt;br /&gt;
Create a mod and fill out the modinfo.lua, making sure to change the name and description so you can tell it apart when you are selecting it.  If the depends tag is listed as [[rapid:/zk:stable]] you will have to manually change it to the latest ZK version in this format:&lt;br /&gt;
&amp;lt;pre&amp;gt;depend = {&lt;br /&gt;
		[[Zero-K v1.8.10.0]]&lt;br /&gt;
	},&amp;lt;/pre&amp;gt;&lt;br /&gt;
Update the version number appropriately.&lt;br /&gt;
&lt;br /&gt;
=== File locations ===&lt;br /&gt;
Like many mods, the file structure downwards from the modname.sdd folder should exactly match the Zero-K internal virtual file system, and if there are any files in your mod that match names with base files, Zero-K will use your mod's file instead of the base file.&lt;br /&gt;
&lt;br /&gt;
This allows you to selectively replace any files with whatever changed version you want, which is ideal for our purposes of testing a mod.  Any ''new'' files will also be loaded, allowing you to test entirely new units - although you may have to modify the buildoptions list of an existing factory or constructor to allow them to build your new unit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;AN IMPORTANT NOTE:&lt;br /&gt;
You should keep all of filenames and folder names lower case, as the virtual file system lowercases everything.  Double check your filenames, it needs to match exactly if you are replacing things.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing your mod ===&lt;br /&gt;
Once you have filled out your folders and files, probably (but not exclusively) using /objects3d , /units and /unittextures , you can progress to actually testing it works in-engine.&lt;br /&gt;
&lt;br /&gt;
Load up Zero-K and go to singleplayer, then Skirmish.  The map and opponents do not especially matter, though if you are testing a lot you probably want to use an inactive AI (check through main lobby options for additional AI types if it's not there by default).&lt;br /&gt;
&lt;br /&gt;
Go into Adv Options, and pick 'Select Mod'.  If the folder and modinfo are correct you should see your mod on the list.  If you do not, download the base mod, unzip it to the appropriate place and check if that shows up - if it does, the problem is with your mod.  If it does not, then something is probably in the wrong place.&lt;br /&gt;
&lt;br /&gt;
Once you've selected your mod you should start the skirmish and attempt to test whatever you've actually changed.  At one point while doing this, Zero-K would not load because the interpreter for the mod's unitdef files was more strict than the main game's, so you may wish to follow the format used in the base mod (it overwrites lotus turrets) more exactly if you have this problem.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fix whatever isn't right ==&lt;br /&gt;
Do not expect everything to be perfect.  This is a very complicated process and something is probably broken somewhere - either way, check everything, and get used to the idea that you may have to edit, re-export, then restart the game a lot to retry with changes quite often.  Although unit definitions and such may be reloaded without quitting the game (TODO: what is the command to do this?  How reliable is it?) you should eventually restart Zero-K to do a round of final testing just to ensure that everything loads correctly from startup.&lt;br /&gt;
&lt;br /&gt;
== The other bits ==&lt;br /&gt;
Ever heard about software development that first you need to complete 90% of the project, and then you need to complete the other 90% of the project?  The same sometimes applies to modding.  &lt;br /&gt;
&lt;br /&gt;
Even though by this point you should have your unit or building in game and working, there are other things to do before it's ready!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== groundplane decal and ao bake ===&lt;br /&gt;
If your unit is a building, you will need to create a ground plane to go underneath it - at the very least an ambient occlusion baked shadow, usually referred to as an aoplane.  This is simply a texture which is sized appropriately for your model and is placed underneath it by the engine.  This adds a little soft shadowing around the edge of the building which helps immensely to integrate it with the map.&lt;br /&gt;
&lt;br /&gt;
There are a few ways to make these, but the easiest if following this tutorial is probably just to bake your own in Blender.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Create and size the virtual ground plane ====&lt;br /&gt;
First, create a plane and place it under your model.  It should be at zero relative to where the model is going to go, but this plane will never leave blender directly - it will be the Spring engine painting the decal onto the terrain.  Scale it until it completely covers all of your model, then apply the scale and scale it *again* so that it is appropriately larger than the footprint of your model.  This size may need adjusting so that it fits an integer value - for example, if the unitdef lists your unit as 5 footprint-units wide, then (since you can only set the decal footprint size to an integer) you would have to choose 6 (6/5 = 120% of the model size) or 7 (7/5 = 140% of the model size).  Somewhere between 120% and 140% is probably fine.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Setup for AO Baking ====&lt;br /&gt;
Once you have the plane appropriately sized, go to the render tab [[File:Blender_render_tab.png]] and change the Render engine to Cycles.  You may wish to change the feature set and compute device appropriate to your system (especially if you have a powerful GPU) but the defaults should be fine for this.&lt;br /&gt;
&lt;br /&gt;
Make sure you set the number of samples in the Sampling section high enough.  512 is a good number to start from, though as high as 1024 is useful to reduce noise.  More samples mean more render time, even for something as simple as baking a simple ambient occlusion map.&lt;br /&gt;
&lt;br /&gt;
Next, go to the world tab [[File:Blender_world_tab.png]] and activate Ambient Occlusion.  Factor should be 1.0, and the distance parameter depends on how large your model is.  You may have to tweak this value until the resulting bake looks correct, but start with a distance parameter somewhere around 25% to 50% of the width of your model, turning it up if this is not sufficient.&lt;br /&gt;
&lt;br /&gt;
To properly bake, we need somewhere to put the texture - so open up a shader node window somewhere, select the ground plane and make sure that it is using a new material and that material is using nodes.  Connect a texture node using the Ctrl-T shortcut. Press New to make a new texture, and set it to the appropriate size - typically 512px square for something the size of a factory or 128px square for smaller buildings.  Set the image colourspace to non-colour data to prevent shading artefacts later.  Make sure this texture node has been clicked on and is selected, because it's the last selected texture for each relevant object that receives the bake.&lt;br /&gt;
&lt;br /&gt;
Finally we're almost ready to do the baking!  Return to the render tab [[File:Blender_render_tab.png]] and scroll down to the Bake section.  From the Bake Type dropdown select Ambient Occlusion.  Make sure that Selected to Active is OFF, as that is intended to transfer high poly modelling data to low poly objects and we actually do want just a general scene-wide bake of ambient occlusion, it's just we only care about the result on this one ground plane object.  Margin can be adjusted but the default of 16px is probably fine.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Do the bake ====&lt;br /&gt;
Press Bake!&lt;br /&gt;
&lt;br /&gt;
If blender crashed that's fine, go check in the log file to see what did it - the last time I had a crash here, I had an addon (bezier tools, totally unrelated to anything to do with baking) going wrong, and so I had to temporarily disable it.&lt;br /&gt;
&lt;br /&gt;
If all went well, you should have seen a few textures render if you were on something with a texture view, and if you go to find your new ambient occlusion texture it should be a black outline in the shape of your building with a white outside, and a blurry shadowy bit around the edge of the black outline, which is what the game will draw onto the ground.  Export this as a png.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Touchup and adjust format in external image editor ====&lt;br /&gt;
The next bit you will need to do in GIMP/Glimpse, or any other image processing software capable of exporting DDS textures.  Simply load your image file, turn the white colour into transparency by whatever method you prefer such that full black is opaque and full white is transparent, and then export as DDS.  Spring wants textures to be DXT5 compressed, with mipmaps generated.&lt;br /&gt;
&lt;br /&gt;
If you want some other decal underneath your unit, perhaps a metallic decal if it is a factory for example, you can add that as another layer in your image editing software here.  Ensure that the ambient occlusion layer overlays it where necessary.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Adjust unitdef to include groundplane ====&lt;br /&gt;
Now you've got a groundplane texture, rename it to something like unitname_aoplane.dds and put it into the /unittextures folder.  Then go to the unitdef and make sure that these tags are filled out:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
buildingGroundDecalDecaySpeed = 30, --Seconds decal takes to fade out of existence&lt;br /&gt;
buildingGroundDecalSizeX      = 12, --Size of the decal's X axis in footprint units &lt;br /&gt;
buildingGroundDecalSizeY      = 12, --Size of the decal's Y axis in footprint units &lt;br /&gt;
buildingGroundDecalType       = [[unitname_aoplane.dds]], --filename of decal&lt;br /&gt;
&lt;br /&gt;
useBuildingGroundDecal        = true,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After saving the updated unitdef, go and check that the ground plane exists in game.  They can be quite subtle, but by toggling on and off the &amp;quot;show ground decals&amp;quot; option, you should be able to see the difference easily.&lt;br /&gt;
&lt;br /&gt;
If needed, you can edit your original png file in the image editor again and apply gaussian blur to the image to spread the shadow out further.  Ensure that the shadow's edge doesn't touch the edge of the image, as this tends to look obvious.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== unitpic ===&lt;br /&gt;
Unit pictures in the buildmenu are generated by an automated script.  This script lives as a Lua gadget within the Zero-K base content, so if you have your mod working you can load that up and generate a buildpic.&lt;br /&gt;
&lt;br /&gt;
First, press F8 to show the debug console, then turn on cheats with /cheat (or !cheats in multiplayer, which will require host permissions.)&lt;br /&gt;
&lt;br /&gt;
Then run &amp;lt;pre&amp;gt;/luarules buildicon {unitname}&amp;lt;/pre&amp;gt;. You can run it with no unit name and instead buildicons if you want to generate buildicons for every unit in the game.  It should output the icons to your Zero-K folder under the /buildicons folder.  You will then have to move it to the /unitpics folder of your mod, name it appropriately, and check it works.&lt;br /&gt;
&lt;br /&gt;
=== Developer mode test with full file system ===&lt;br /&gt;
&lt;br /&gt;
Now is the time to test against the full developer mode run - see [[Developing]] for information on how to set that up.  Copy your files to an up to date copy of the latest source files from GitHub and check if they work there.  &lt;br /&gt;
&lt;br /&gt;
Once they do you should be ready to make a pull request.  If you forked from the development version as the linked instructions suggest, you should be able to use your fork to do this.&lt;br /&gt;
&lt;br /&gt;
[[category:Development]]&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Zero-K:Developing&amp;diff=6978</id>
		<title>Zero-K:Developing</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Zero-K:Developing&amp;diff=6978"/>
		<updated>2020-09-23T06:03:30Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Added visual examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;New developers should read this before touching the source.&lt;br /&gt;
&lt;br /&gt;
== ZK's Devving Philosophy (social rules) ==&lt;br /&gt;
* &amp;quot;War is a product of anticommunication&amp;quot;&lt;br /&gt;
** Communicate with other devs about your changes/fixes, let them understand the issue. Do not make 'random' changes.&lt;br /&gt;
* &amp;quot;Do not create work for other people.&amp;quot;&lt;br /&gt;
** Have responsibility for your changes/commit. Do not leave bugs that require other people to fix.&lt;br /&gt;
* &amp;quot;Readability &amp;amp; performance are equally important.&amp;quot; &lt;br /&gt;
** Optimize code but not to the point of unreadability. [http://c2.com/cgi/wiki?RulesOfOptimization Remember the rules of optimization]:&lt;br /&gt;
*** Don't.&lt;br /&gt;
*** Don't (yet).&lt;br /&gt;
*** Profile before doing it.&lt;br /&gt;
* &amp;quot;If it ain't broke, don't fix it.&amp;quot;&lt;br /&gt;
** Don't code fixes that nobody wants to problems that don't exist.&lt;br /&gt;
&lt;br /&gt;
== What is in source codes ==&lt;br /&gt;
* [https://github.com/ZeroK-RTS/Zero-K Zero-K] contains the game proper&lt;br /&gt;
** units folder contains unit definition files&lt;br /&gt;
*** You can read the wiki about game development for [http://springrts.com/wiki/Main_Page Spring Engine] &lt;br /&gt;
* [https://github.com/ZeroK-RTS/Zero-K-Infrastructure Zero-K-Infrastructure]&lt;br /&gt;
** Zero-K.info: Website sources&lt;br /&gt;
** ZkLobbyServer: Lobby server (for MP)&lt;br /&gt;
** ZkData: Website/server database structure&lt;br /&gt;
* [https://github.com/ZeroK-RTS/Chobby Chobby] contains the lobby client&lt;br /&gt;
* [https://github.com/ZeroK-RTS/Zero-K-Artwork Zero-K-Artwork] contains sources for 2D art, 3D art and sounds&lt;br /&gt;
* [https://github.com/ZeroK-RTS/SpringRTS-Tools SpringRTS-tools] contains various dev tools&lt;br /&gt;
** Upspring - required to edit the .3do and .s3o model files used in the game&lt;br /&gt;
** MapIconBuilder - unit map icon sources are here&lt;br /&gt;
* [https://github.com/ZeroK-RTS/Zero-K-Missions Zero-K-Missions] contains source files for official ZK missions&lt;br /&gt;
&lt;br /&gt;
=== Style Guide===&lt;br /&gt;
The lua in the menu (chobby) and game proper should use the following whitespace:&lt;br /&gt;
* Indent with tabs.&lt;br /&gt;
* A tab may only follow a newline or another tab.&lt;br /&gt;
* If the text across two lines is being aligned (such as for a long function) then the two lines must have the same number of tabs.&lt;br /&gt;
* Don't try stack flow of control into one line. For example, put newlines after &amp;lt;code&amp;gt;then&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;else&amp;lt;/code&amp;gt;.&lt;br /&gt;
* End files with a newline.&lt;br /&gt;
* Commas should be followed by whitespace. Relations (=, &amp;lt;, &amp;lt;=, &amp;gt;=, ==, ~=) should have whitespace on each side.&lt;br /&gt;
* if a conditional is to take up multiple lines, double indent the extra lines and end the line with a conjunction (See Gallery below)&lt;br /&gt;
These guidelines are not necessarily followed in old files so updating them with a separate commit is a good idea prior to making large changes. Also, unitdefs use two-space indentation instead of tabs.          &lt;br /&gt;
&lt;br /&gt;
There are a few guildines for dealing with Spring functions.&lt;br /&gt;
* Localisation of Spring.Function should be named spFunction.&lt;br /&gt;
* Localisation of Spring.MoveCtrl.Function should be named spMoveCtrlFunction.&lt;br /&gt;
* Spring.GetCommandQueue should be used rather than Spring.GetUnitCommands (it's an alias, we just picked one).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Styleguide-if-example.JPG|Proper multiline if statement&lt;br /&gt;
Styleguide-stackflow.JPG|Example of stacked flow control&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Getting sources ==&lt;br /&gt;
This is a guide to downloading Zero-K sources from [https://github.com/ GitHub] using [https://tortoisegit.org/ TortoiseGit]. The game sources are used as an example, however this method applies to other subprojects as well.&lt;br /&gt;
* Install [https://tortoisegit.org/download/ TortoiseGit].&lt;br /&gt;
* Create a [https://github.com/ GitHub] account.&lt;br /&gt;
[[File:ForkZK.jpg]]&lt;br /&gt;
* Log in to GitHub and [https://github.com/ZeroK-RTS Locate] the repository you want to edit.&lt;br /&gt;
* Click the &amp;quot;Fork&amp;quot; button on the GitHub website to create your own copy on GitHub.&lt;br /&gt;
[[File:cloneZK.jpg]]&lt;br /&gt;
* Locate your fork on GitHub and click &amp;quot;Clone or Download&amp;quot;.&lt;br /&gt;
* Copy the web URL to your clipboard.&lt;br /&gt;
[[File:localCloneZK.jpg]]&lt;br /&gt;
* Create a folder called 'zk.sdd' in your Zero-K install under games.&lt;br /&gt;
* Right click on 'zk.sdd' and select 'Git Clone...' from the context menu.&lt;br /&gt;
[[File:cloneUIZK.jpg]]&lt;br /&gt;
* Copy the web URL into the 'URL:' field of the clone interface.&lt;br /&gt;
* Ensure that the 'Directory:' field ends in 'zk.sdd'. It is likely to automatically contain the path '...\Zero-K\games\zk.sdd\Zero-K' so be sure to delete the '\Zero-K' at the end.&lt;br /&gt;
[[File:cloneSuccess.jpg]]&lt;br /&gt;
* Wait for the sources to download.&lt;br /&gt;
* Your 'zk.sdd' folder should look something like the image above.&lt;br /&gt;
&lt;br /&gt;
== Updating sources ==&lt;br /&gt;
Keep your sources up to date by periodically syncing your fork to the original repository (using 'compare', see: https://github.com/KirstieJane/STEMMRoleModels/wiki/Syncing-your-fork-to-the-original-repository-via-the-browser, then do &amp;quot;rebase and merge&amp;quot; instead of &amp;quot;merge&amp;quot;) and doing TortoiseGit -&amp;gt; Pull on your repository folder to take the changes from GitHub to your local files.&lt;br /&gt;
&lt;br /&gt;
== Modifying the game ==&lt;br /&gt;
:''For personal modding, see [[Mod Creation]]''&lt;br /&gt;
Follow the instructions in 'Getting sources' the download the Zero-K game sources. Feel free to inspect and edit the game files. Most developers using Windows edit lua files with [https://notepad-plus-plus.org/download/v7.6.6.html Notepad++].&lt;br /&gt;
&lt;br /&gt;
To test your changes:&lt;br /&gt;
* Create an empty file named 'devmode.txt' in the same directory as Zero-K.exe.&lt;br /&gt;
* Launch Zero-K.exe.&lt;br /&gt;
[[File:enableDevMode.jpg]]&lt;br /&gt;
* Select 'Zero-K Dev' in Settings -&amp;gt; Developer -&amp;gt; Singleplayer (you may need to scroll down).&lt;br /&gt;
[[File:startTest.jpg]]&lt;br /&gt;
* From the main menu select Singleplayer -&amp;gt; Skirmish -&amp;gt; Advanced -&amp;gt; Start to launch a test game. Note that the game type should be automatically set to 'Zero-K $VERSION'.&lt;br /&gt;
* In the game, press F8 to open debug console. It'll display errors and output to the log.&lt;br /&gt;
&lt;br /&gt;
== Modifying the lobby menu ==&lt;br /&gt;
Follow the instructions in 'Getting sources' with the following adjustments:&lt;br /&gt;
* The repository that you want to edit is https://github.com/ZeroK-RTS/Chobby.&lt;br /&gt;
* It is best to call the folder something like 'zkmenu.sdd', to avoid confusion.&lt;br /&gt;
Make sure that the 'Directory:' field ends in '.sdd'. You should end up with something like this:&lt;br /&gt;
&lt;br /&gt;
[[File:zkmenufolder.jpg]]&lt;br /&gt;
&lt;br /&gt;
To test your changes launch Zero-K.exe with the &amp;lt;tt&amp;gt;dev&amp;lt;/tt&amp;gt; arg (i.e. &amp;lt;code&amp;gt;Zero-K.exe dev&amp;lt;/code&amp;gt;). On windows this is best done by creating a shortcut and changing the target, as shown below.&lt;br /&gt;
[[File:targetZK.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Submitting changes ==&lt;br /&gt;
Git provides a systematic way to review and merge changes into the main repositories. The main game repository is used as example, but this method works for other repositories as well.&lt;br /&gt;
&lt;br /&gt;
The simple way to commit changes is as follows.&lt;br /&gt;
* Make some changes to your local files.&lt;br /&gt;
* Right click on 'zk.sdd' and select 'Git Commit'.&lt;br /&gt;
* Write a description of the changes and click 'Commit'.&lt;br /&gt;
* Right click on 'zk.sdd' and select TortiseGit -&amp;gt; Push.&lt;br /&gt;
* Enter your GitHub login and password when prompted. The changes should now appear on your fork in GitHub.&lt;br /&gt;
* Navigate to https://github.com/ZeroK-RTS/Zero-K/pulls and click &amp;quot;New Pull Request&amp;quot;.&lt;br /&gt;
* Click &amp;quot;compare across forks&amp;quot; to make your fork visible.&lt;br /&gt;
* Set your fork to be the head repository.&lt;br /&gt;
* Write a title and description of the changes, then create the pull request.&lt;br /&gt;
This creates a proposal to apply your changes to the main game. Be sure to check up on it and respond to comments.&lt;br /&gt;
&lt;br /&gt;
A more advanced method involves creating branches locally with TortiseGit -&amp;gt; Create Branch and committing blocks of related changes to a single branch. You are then able to make pull requests from branches. This allows branches to be smaller and more focused, which is desirable when merging.&lt;br /&gt;
&lt;br /&gt;
Make sure to keep your repository up to date to make merges less difficult.&lt;br /&gt;
&lt;br /&gt;
== Zero-K.exe launch flags ==&lt;br /&gt;
&amp;lt;pre&amp;gt;Zero-K.exe [rapid tag] [engine version]&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note that the engine specified in arg won't automatically use the main Zero-K folder as its datadir. Add a &amp;lt;tt&amp;gt;springsettings.cfg&amp;lt;/tt&amp;gt; file to the engine version's folder with the tag &amp;lt;code&amp;gt;SpringData = path_to_Zero-K_folder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modifying infrastructure/tools == &lt;br /&gt;
* Install [https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx Visual Studio Community edition]&lt;br /&gt;
* Install [http://www.microsoft.com/en-us/server-cloud/products/sql-server-editions/sql-server-express.aspx SQL Server express]&lt;br /&gt;
* Clone to desktop [https://github.com/ZeroK-RTS/Zero-K-Infrastructure Zero-K infrastructure]&lt;br /&gt;
* Test by opening Zero-K.sln in Visual Studio&lt;br /&gt;
&lt;br /&gt;
=== Initializing Website Database ===&lt;br /&gt;
You may need to setup the database connection for the website. In order to do that: Open Visual Studio, open the Server Explorer panel (under the View menu), right click Data Connections -&amp;gt; Add Connection -&amp;gt; Sql Server. Enter &amp;lt;code&amp;gt;(localdb)\mssqllocaldb&amp;lt;/code&amp;gt; in the Server Name field, after which zero-k_local will appear in the dropdown list of databases. &lt;br /&gt;
&lt;br /&gt;
(If zero-k_local does not appear, type it in the text box and press OK; Visual Studio will ask whether you would like to create the database. This may require you to have administrator rights on the computer.)&lt;br /&gt;
&lt;br /&gt;
[[File:zk-database-setup.png]]&lt;br /&gt;
&lt;br /&gt;
=== Debugging infrastructure ===&lt;br /&gt;
* To run a project right click it, choose &amp;quot;set as startup project&amp;quot; and hit F5 to run using debugger.&lt;br /&gt;
* You can enable multiple startup projects to test entire infrastructure locally (game servers, lobby etc). Enable asp.net, springie and ZeroKLobby projects to test it all together. [http://i.imgur.com/2mgizUJ.png Setup]&lt;br /&gt;
* To run asp.net:&lt;br /&gt;
** It's required that you install MS SQL Express on your local PC. &lt;br /&gt;
*** You can get SQL Server 2017 (for Windows 8 and later) [https://www.microsoft.com/en-us/sql-server/sql-server-editions-express here] or SQL Server 2014 (for Windows 7) [https://www.microsoft.com/en-ie/download/details.aspx?id=42299 here]. For SQL Server 2014, the file you will need is called SQLEXPR_x64_ENU or SQLEXPR_x86_ENU. Make sure you install version that matches your version of Windows (i.e. x86 vs x64). &lt;br /&gt;
*** During the installation, set collation to &amp;lt;code&amp;gt;SQL_Latin1_General_CP1_CI_AS&amp;lt;/code&amp;gt;. Leave all the parameters default except that I changed server name to SQLEXPRESS in one of the first steps of wizard.&lt;br /&gt;
[[File:SQL server collation.png|405px]]&lt;br /&gt;
** Right click asp.net -&amp;gt; properties -&amp;gt; web -&amp;gt; check &amp;quot;Specific Page&amp;quot; and leave it blank. Otherwise you get errors when trying to host locally.&lt;br /&gt;
** Make sure SQL Server is running (check the Sql Server Configuration Manager in the Start Menu). If you can't connect, edit the data source for &amp;lt;code&amp;gt;ModeType.Local&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;GlobalConst.cs&amp;lt;/code&amp;gt; (currently line 46) to say something like:&amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;Data Source=&amp;lt;hostname (usually your computer name)&amp;gt;\SQLEXPRESS&amp;lt;/code&amp;gt;&lt;br /&gt;
** To make things run smoothly the following changes might also be a good idea: In &amp;lt;code&amp;gt;Shared/PlasmaShared/GlobalConst.cs&amp;lt;/code&amp;gt; (currently line 137) replace the DefaultEngineOverride with whatever engine version is current. Comment out lines 190 and 238-298 of &amp;lt;code&amp;gt;Zero-K.info/AppCode/PlasmaServer.cs&amp;lt;/code&amp;gt; unless somebody can supply instructions on how to make the torrent errors go away.&lt;br /&gt;
&lt;br /&gt;
TODO: add download links for sample database tables here. Users and clans are probably easier to make yourself for most purposes. For now, if you need this ask Licho, Histidine, DeinFreund or Anarchid. Aquanim has sample tables for maps and Planetwars structures, if that is all that you need.&lt;br /&gt;
&lt;br /&gt;
=== Modifying The Database Structure ===&lt;br /&gt;
* Modify the appropriate files in ./ZkData/Ef/...  and elsewhere ( [https://github.com/ZeroK-RTS/Zero-K-Infrastructure/commit/61addee11e74b09dd5dd73e12d31a28030d84e81 this commit] should be a reasonable guide; don't worry about the migration files, they are created later )&lt;br /&gt;
* Open Tools &amp;gt; NuGet Package Manager &amp;gt; Package Manager Console&lt;br /&gt;
* At the top of the window which appears, there is a &amp;quot;Default project&amp;quot; dropdown box. Set this to ZkData.&lt;br /&gt;
* Type the command &amp;lt;code&amp;gt;Add-Migration [description-of-change-here]&amp;lt;/code&amp;gt; into the package manager console. This should create some migration files with your description and a timestamp in the name in the Migrations folder of ZkData.&lt;br /&gt;
* In some cases you may now need to manually edit the created migration files to set defaults and the like?&lt;br /&gt;
* Type the command &amp;lt;code&amp;gt;Update-Database&amp;lt;/code&amp;gt; into the package manager console. This should update the database structure.&lt;br /&gt;
* To revert a migration that has not yet been pushed to the main repository, run &amp;lt;code&amp;gt;Update-Database –TargetMigration: TheLastGoodMigration&amp;lt;/code&amp;gt; then delete your bad migration files.&lt;br /&gt;
&lt;br /&gt;
== Artwork ==&lt;br /&gt;
See [http://zero-k.info/Wiki/Development_Artwork Development Artwork] (outdated)&lt;br /&gt;
&lt;br /&gt;
== Missions ==&lt;br /&gt;
=== Campaign ===&lt;br /&gt;
Campaign planets/missions are defined in [//github.com/ZeroK-RTS/Chobby/tree/master/campaign/sample Chobby/campaign/sample]&lt;br /&gt;
&lt;br /&gt;
=== Standalone missions ===&lt;br /&gt;
See [[Mission Editor|Mission Editor start page]]&lt;br /&gt;
&lt;br /&gt;
== Updating PlanetWars for new round ==&lt;br /&gt;
:''TODO''&lt;br /&gt;
Changing faction:&lt;br /&gt;
* Faction ID, name, color in dbo.Faction&lt;br /&gt;
* Faction blurb &amp;lt;tt&amp;gt;Faction&amp;lt;Name&amp;gt;&amp;lt;/tt&amp;gt; on sitewiki&lt;br /&gt;
* Add/change icons if needed&lt;br /&gt;
** Site: img/factions/&amp;lt;name&amp;gt;.png&lt;br /&gt;
** Game: LuaUI/Configs/Factions&lt;br /&gt;
** Chobby: LuaMenu/Images/Factions&lt;br /&gt;
** Does chobby download them automatically? Presumably not&lt;br /&gt;
&lt;br /&gt;
Using [https://zero-k.info/PlanetwarsAdmin Planetwars admin interface]: Change to a different galaxy if desired, reset PW&lt;br /&gt;
&lt;br /&gt;
== Wiki ==&lt;br /&gt;
See [[Editing Help]]&lt;br /&gt;
&lt;br /&gt;
=== Unit pages ===&lt;br /&gt;
Part of each unit page is autogenerated by the [//github.com/ZeroK-RTS/SpringRTS-Tools/tree/master/unitguide Unit Guide tool], and uploaded by the [//github.com/ZeroK-RTS/Zero-K-Infrastructure/blob/master/Fixer/WikiPortingMW.cs Wiki bot].&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;export_unit_templates.sh&amp;lt;/code&amp;gt; to generate wiki templates for each unit (see &amp;lt;code&amp;gt;export_unit_templates.lua&amp;lt;/code&amp;gt; for some configuration options), then have the bot read the generated text files and edit the unit pages accordingly (requires Visual Studio setup as detailed above). The text output can also be used to manually edit pages.&lt;br /&gt;
&lt;br /&gt;
Unit buildicons and radar icons should be uploaded by FTP to manual.zero-k.info (&amp;lt;code&amp;gt;zero-k.info/zkmanual/www/unitpics&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/icons&amp;lt;/code&amp;gt; respectively). Contact Licho or Histidine for login details.&lt;br /&gt;
&lt;br /&gt;
== itch.io builds ==&lt;br /&gt;
Instructions for updating the portable build on [https://itch.io/ itch.io]:&lt;br /&gt;
&lt;br /&gt;
* Download latest Zero-K portable from https://zerok.itch.io/zero-k, extract to a folder&lt;br /&gt;
* Download butler (see guide at https://itch.io/docs/butler/)&lt;br /&gt;
* Modify extracted portable folder so that its contents are the same as what the user will download&lt;br /&gt;
* Run butler with command: &amp;lt;code&amp;gt;butler push &amp;lt;portable folder&amp;gt; zerok/zero-k:portable&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Engine ==&lt;br /&gt;
See [https://springrts.com/wiki/Development:Getting_Started Spring Engine Development]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=File:Styleguide-stackflow.JPG&amp;diff=6977</id>
		<title>File:Styleguide-stackflow.JPG</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=File:Styleguide-stackflow.JPG&amp;diff=6977"/>
		<updated>2020-09-23T06:00:18Z</updated>

		<summary type="html">&lt;p&gt;Shaman: An example of stack flow control.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
An example of stack flow control.&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=File:Styleguide-if-example.JPG&amp;diff=6976</id>
		<title>File:Styleguide-if-example.JPG</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=File:Styleguide-if-example.JPG&amp;diff=6976"/>
		<updated>2020-09-23T05:48:28Z</updated>

		<summary type="html">&lt;p&gt;Shaman: An example of styling a conditional spanning multiple lines.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
An example of styling a conditional spanning multiple lines.&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Zero-K:Developing&amp;diff=6975</id>
		<title>Zero-K:Developing</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Zero-K:Developing&amp;diff=6975"/>
		<updated>2020-09-23T05:45:42Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Add elaboration for if-then statements taking up multiple lines&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;New developers should read this before touching the source.&lt;br /&gt;
&lt;br /&gt;
== ZK's Devving Philosophy (social rules) ==&lt;br /&gt;
* &amp;quot;War is a product of anticommunication&amp;quot;&lt;br /&gt;
** Communicate with other devs about your changes/fixes, let them understand the issue. Do not make 'random' changes.&lt;br /&gt;
* &amp;quot;Do not create work for other people.&amp;quot;&lt;br /&gt;
** Have responsibility for your changes/commit. Do not leave bugs that require other people to fix.&lt;br /&gt;
* &amp;quot;Readability &amp;amp; performance are equally important.&amp;quot; &lt;br /&gt;
** Optimize code but not to the point of unreadability. [http://c2.com/cgi/wiki?RulesOfOptimization Remember the rules of optimization]:&lt;br /&gt;
*** Don't.&lt;br /&gt;
*** Don't (yet).&lt;br /&gt;
*** Profile before doing it.&lt;br /&gt;
* &amp;quot;If it ain't broke, don't fix it.&amp;quot;&lt;br /&gt;
** Don't code fixes that nobody wants to problems that don't exist.&lt;br /&gt;
&lt;br /&gt;
== What is in source codes ==&lt;br /&gt;
* [https://github.com/ZeroK-RTS/Zero-K Zero-K] contains the game proper&lt;br /&gt;
** units folder contains unit definition files&lt;br /&gt;
*** You can read the wiki about game development for [http://springrts.com/wiki/Main_Page Spring Engine] &lt;br /&gt;
* [https://github.com/ZeroK-RTS/Zero-K-Infrastructure Zero-K-Infrastructure]&lt;br /&gt;
** Zero-K.info: Website sources&lt;br /&gt;
** ZkLobbyServer: Lobby server (for MP)&lt;br /&gt;
** ZkData: Website/server database structure&lt;br /&gt;
* [https://github.com/ZeroK-RTS/Chobby Chobby] contains the lobby client&lt;br /&gt;
* [https://github.com/ZeroK-RTS/Zero-K-Artwork Zero-K-Artwork] contains sources for 2D art, 3D art and sounds&lt;br /&gt;
* [https://github.com/ZeroK-RTS/SpringRTS-Tools SpringRTS-tools] contains various dev tools&lt;br /&gt;
** Upspring - required to edit the .3do and .s3o model files used in the game&lt;br /&gt;
** MapIconBuilder - unit map icon sources are here&lt;br /&gt;
* [https://github.com/ZeroK-RTS/Zero-K-Missions Zero-K-Missions] contains source files for official ZK missions&lt;br /&gt;
&lt;br /&gt;
=== Style Guide===&lt;br /&gt;
The lua in the menu (chobby) and game proper should use the following whitespace:&lt;br /&gt;
* Indent with tabs.&lt;br /&gt;
* A tab may only follow a newline or another tab.&lt;br /&gt;
* If the text across two lines is being aligned (such as for a long function) then the two lines must have the same number of tabs.&lt;br /&gt;
* Don't try stack flow of control into one line. For example, put newlines after &amp;lt;code&amp;gt;then&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;else&amp;lt;/code&amp;gt;.&lt;br /&gt;
* End files with a newline.&lt;br /&gt;
* Commas should be followed by whitespace. Relations (=, &amp;lt;, &amp;lt;=, &amp;gt;=, ==, ~=) should have whitespace on each side.&lt;br /&gt;
* if a conditional is to take up multiple lines, double indent the extra lines and end the line with a conjunction&lt;br /&gt;
These guidelines are not necessarily followed in old files so updating them with a separate commit is a good idea prior to making large changes. Also, unitdefs use two-space indentation instead of tabs.&lt;br /&gt;
&lt;br /&gt;
There are a few guildines for dealing with Spring functions.&lt;br /&gt;
* Localisation of Spring.Function should be named spFunction.&lt;br /&gt;
* Localisation of Spring.MoveCtrl.Function should be named spMoveCtrlFunction.&lt;br /&gt;
* Spring.GetCommandQueue should be used rather than Spring.GetUnitCommands (it's an alias, we just picked one).&lt;br /&gt;
&lt;br /&gt;
== Getting sources ==&lt;br /&gt;
This is a guide to downloading Zero-K sources from [https://github.com/ GitHub] using [https://tortoisegit.org/ TortoiseGit]. The game sources are used as an example, however this method applies to other subprojects as well.&lt;br /&gt;
* Install [https://tortoisegit.org/download/ TortoiseGit].&lt;br /&gt;
* Create a [https://github.com/ GitHub] account.&lt;br /&gt;
[[File:ForkZK.jpg]]&lt;br /&gt;
* Log in to GitHub and [https://github.com/ZeroK-RTS Locate] the repository you want to edit.&lt;br /&gt;
* Click the &amp;quot;Fork&amp;quot; button on the GitHub website to create your own copy on GitHub.&lt;br /&gt;
[[File:cloneZK.jpg]]&lt;br /&gt;
* Locate your fork on GitHub and click &amp;quot;Clone or Download&amp;quot;.&lt;br /&gt;
* Copy the web URL to your clipboard.&lt;br /&gt;
[[File:localCloneZK.jpg]]&lt;br /&gt;
* Create a folder called 'zk.sdd' in your Zero-K install under games.&lt;br /&gt;
* Right click on 'zk.sdd' and select 'Git Clone...' from the context menu.&lt;br /&gt;
[[File:cloneUIZK.jpg]]&lt;br /&gt;
* Copy the web URL into the 'URL:' field of the clone interface.&lt;br /&gt;
* Ensure that the 'Directory:' field ends in 'zk.sdd'. It is likely to automatically contain the path '...\Zero-K\games\zk.sdd\Zero-K' so be sure to delete the '\Zero-K' at the end.&lt;br /&gt;
[[File:cloneSuccess.jpg]]&lt;br /&gt;
* Wait for the sources to download.&lt;br /&gt;
* Your 'zk.sdd' folder should look something like the image above.&lt;br /&gt;
&lt;br /&gt;
== Updating sources ==&lt;br /&gt;
Keep your sources up to date by periodically syncing your fork to the original repository (using 'compare', see: https://github.com/KirstieJane/STEMMRoleModels/wiki/Syncing-your-fork-to-the-original-repository-via-the-browser, then do &amp;quot;rebase and merge&amp;quot; instead of &amp;quot;merge&amp;quot;) and doing TortoiseGit -&amp;gt; Pull on your repository folder to take the changes from GitHub to your local files.&lt;br /&gt;
&lt;br /&gt;
== Modifying the game ==&lt;br /&gt;
:''For personal modding, see [[Mod Creation]]''&lt;br /&gt;
Follow the instructions in 'Getting sources' the download the Zero-K game sources. Feel free to inspect and edit the game files. Most developers using Windows edit lua files with [https://notepad-plus-plus.org/download/v7.6.6.html Notepad++].&lt;br /&gt;
&lt;br /&gt;
To test your changes:&lt;br /&gt;
* Create an empty file named 'devmode.txt' in the same directory as Zero-K.exe.&lt;br /&gt;
* Launch Zero-K.exe.&lt;br /&gt;
[[File:enableDevMode.jpg]]&lt;br /&gt;
* Select 'Zero-K Dev' in Settings -&amp;gt; Developer -&amp;gt; Singleplayer (you may need to scroll down).&lt;br /&gt;
[[File:startTest.jpg]]&lt;br /&gt;
* From the main menu select Singleplayer -&amp;gt; Skirmish -&amp;gt; Advanced -&amp;gt; Start to launch a test game. Note that the game type should be automatically set to 'Zero-K $VERSION'.&lt;br /&gt;
* In the game, press F8 to open debug console. It'll display errors and output to the log.&lt;br /&gt;
&lt;br /&gt;
== Modifying the lobby menu ==&lt;br /&gt;
Follow the instructions in 'Getting sources' with the following adjustments:&lt;br /&gt;
* The repository that you want to edit is https://github.com/ZeroK-RTS/Chobby.&lt;br /&gt;
* It is best to call the folder something like 'zkmenu.sdd', to avoid confusion.&lt;br /&gt;
Make sure that the 'Directory:' field ends in '.sdd'. You should end up with something like this:&lt;br /&gt;
&lt;br /&gt;
[[File:zkmenufolder.jpg]]&lt;br /&gt;
&lt;br /&gt;
To test your changes launch Zero-K.exe with the &amp;lt;tt&amp;gt;dev&amp;lt;/tt&amp;gt; arg (i.e. &amp;lt;code&amp;gt;Zero-K.exe dev&amp;lt;/code&amp;gt;). On windows this is best done by creating a shortcut and changing the target, as shown below.&lt;br /&gt;
[[File:targetZK.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Submitting changes ==&lt;br /&gt;
Git provides a systematic way to review and merge changes into the main repositories. The main game repository is used as example, but this method works for other repositories as well.&lt;br /&gt;
&lt;br /&gt;
The simple way to commit changes is as follows.&lt;br /&gt;
* Make some changes to your local files.&lt;br /&gt;
* Right click on 'zk.sdd' and select 'Git Commit'.&lt;br /&gt;
* Write a description of the changes and click 'Commit'.&lt;br /&gt;
* Right click on 'zk.sdd' and select TortiseGit -&amp;gt; Push.&lt;br /&gt;
* Enter your GitHub login and password when prompted. The changes should now appear on your fork in GitHub.&lt;br /&gt;
* Navigate to https://github.com/ZeroK-RTS/Zero-K/pulls and click &amp;quot;New Pull Request&amp;quot;.&lt;br /&gt;
* Click &amp;quot;compare across forks&amp;quot; to make your fork visible.&lt;br /&gt;
* Set your fork to be the head repository.&lt;br /&gt;
* Write a title and description of the changes, then create the pull request.&lt;br /&gt;
This creates a proposal to apply your changes to the main game. Be sure to check up on it and respond to comments.&lt;br /&gt;
&lt;br /&gt;
A more advanced method involves creating branches locally with TortiseGit -&amp;gt; Create Branch and committing blocks of related changes to a single branch. You are then able to make pull requests from branches. This allows branches to be smaller and more focused, which is desirable when merging.&lt;br /&gt;
&lt;br /&gt;
Make sure to keep your repository up to date to make merges less difficult.&lt;br /&gt;
&lt;br /&gt;
== Zero-K.exe launch flags ==&lt;br /&gt;
&amp;lt;pre&amp;gt;Zero-K.exe [rapid tag] [engine version]&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note that the engine specified in arg won't automatically use the main Zero-K folder as its datadir. Add a &amp;lt;tt&amp;gt;springsettings.cfg&amp;lt;/tt&amp;gt; file to the engine version's folder with the tag &amp;lt;code&amp;gt;SpringData = path_to_Zero-K_folder&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modifying infrastructure/tools == &lt;br /&gt;
* Install [https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx Visual Studio Community edition]&lt;br /&gt;
* Install [http://www.microsoft.com/en-us/server-cloud/products/sql-server-editions/sql-server-express.aspx SQL Server express]&lt;br /&gt;
* Clone to desktop [https://github.com/ZeroK-RTS/Zero-K-Infrastructure Zero-K infrastructure]&lt;br /&gt;
* Test by opening Zero-K.sln in Visual Studio&lt;br /&gt;
&lt;br /&gt;
=== Initializing Website Database ===&lt;br /&gt;
You may need to setup the database connection for the website. In order to do that: Open Visual Studio, open the Server Explorer panel (under the View menu), right click Data Connections -&amp;gt; Add Connection -&amp;gt; Sql Server. Enter &amp;lt;code&amp;gt;(localdb)\mssqllocaldb&amp;lt;/code&amp;gt; in the Server Name field, after which zero-k_local will appear in the dropdown list of databases. &lt;br /&gt;
&lt;br /&gt;
(If zero-k_local does not appear, type it in the text box and press OK; Visual Studio will ask whether you would like to create the database. This may require you to have administrator rights on the computer.)&lt;br /&gt;
&lt;br /&gt;
[[File:zk-database-setup.png]]&lt;br /&gt;
&lt;br /&gt;
=== Debugging infrastructure ===&lt;br /&gt;
* To run a project right click it, choose &amp;quot;set as startup project&amp;quot; and hit F5 to run using debugger.&lt;br /&gt;
* You can enable multiple startup projects to test entire infrastructure locally (game servers, lobby etc). Enable asp.net, springie and ZeroKLobby projects to test it all together. [http://i.imgur.com/2mgizUJ.png Setup]&lt;br /&gt;
* To run asp.net:&lt;br /&gt;
** It's required that you install MS SQL Express on your local PC. &lt;br /&gt;
*** You can get SQL Server 2017 (for Windows 8 and later) [https://www.microsoft.com/en-us/sql-server/sql-server-editions-express here] or SQL Server 2014 (for Windows 7) [https://www.microsoft.com/en-ie/download/details.aspx?id=42299 here]. For SQL Server 2014, the file you will need is called SQLEXPR_x64_ENU or SQLEXPR_x86_ENU. Make sure you install version that matches your version of Windows (i.e. x86 vs x64). &lt;br /&gt;
*** During the installation, set collation to &amp;lt;code&amp;gt;SQL_Latin1_General_CP1_CI_AS&amp;lt;/code&amp;gt;. Leave all the parameters default except that I changed server name to SQLEXPRESS in one of the first steps of wizard.&lt;br /&gt;
[[File:SQL server collation.png|405px]]&lt;br /&gt;
** Right click asp.net -&amp;gt; properties -&amp;gt; web -&amp;gt; check &amp;quot;Specific Page&amp;quot; and leave it blank. Otherwise you get errors when trying to host locally.&lt;br /&gt;
** Make sure SQL Server is running (check the Sql Server Configuration Manager in the Start Menu). If you can't connect, edit the data source for &amp;lt;code&amp;gt;ModeType.Local&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;GlobalConst.cs&amp;lt;/code&amp;gt; (currently line 46) to say something like:&amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;Data Source=&amp;lt;hostname (usually your computer name)&amp;gt;\SQLEXPRESS&amp;lt;/code&amp;gt;&lt;br /&gt;
** To make things run smoothly the following changes might also be a good idea: In &amp;lt;code&amp;gt;Shared/PlasmaShared/GlobalConst.cs&amp;lt;/code&amp;gt; (currently line 137) replace the DefaultEngineOverride with whatever engine version is current. Comment out lines 190 and 238-298 of &amp;lt;code&amp;gt;Zero-K.info/AppCode/PlasmaServer.cs&amp;lt;/code&amp;gt; unless somebody can supply instructions on how to make the torrent errors go away.&lt;br /&gt;
&lt;br /&gt;
TODO: add download links for sample database tables here. Users and clans are probably easier to make yourself for most purposes. For now, if you need this ask Licho, Histidine, DeinFreund or Anarchid. Aquanim has sample tables for maps and Planetwars structures, if that is all that you need.&lt;br /&gt;
&lt;br /&gt;
=== Modifying The Database Structure ===&lt;br /&gt;
* Modify the appropriate files in ./ZkData/Ef/...  and elsewhere ( [https://github.com/ZeroK-RTS/Zero-K-Infrastructure/commit/61addee11e74b09dd5dd73e12d31a28030d84e81 this commit] should be a reasonable guide; don't worry about the migration files, they are created later )&lt;br /&gt;
* Open Tools &amp;gt; NuGet Package Manager &amp;gt; Package Manager Console&lt;br /&gt;
* At the top of the window which appears, there is a &amp;quot;Default project&amp;quot; dropdown box. Set this to ZkData.&lt;br /&gt;
* Type the command &amp;lt;code&amp;gt;Add-Migration [description-of-change-here]&amp;lt;/code&amp;gt; into the package manager console. This should create some migration files with your description and a timestamp in the name in the Migrations folder of ZkData.&lt;br /&gt;
* In some cases you may now need to manually edit the created migration files to set defaults and the like?&lt;br /&gt;
* Type the command &amp;lt;code&amp;gt;Update-Database&amp;lt;/code&amp;gt; into the package manager console. This should update the database structure.&lt;br /&gt;
* To revert a migration that has not yet been pushed to the main repository, run &amp;lt;code&amp;gt;Update-Database –TargetMigration: TheLastGoodMigration&amp;lt;/code&amp;gt; then delete your bad migration files.&lt;br /&gt;
&lt;br /&gt;
== Artwork ==&lt;br /&gt;
See [http://zero-k.info/Wiki/Development_Artwork Development Artwork] (outdated)&lt;br /&gt;
&lt;br /&gt;
== Missions ==&lt;br /&gt;
=== Campaign ===&lt;br /&gt;
Campaign planets/missions are defined in [//github.com/ZeroK-RTS/Chobby/tree/master/campaign/sample Chobby/campaign/sample]&lt;br /&gt;
&lt;br /&gt;
=== Standalone missions ===&lt;br /&gt;
See [[Mission Editor|Mission Editor start page]]&lt;br /&gt;
&lt;br /&gt;
== Updating PlanetWars for new round ==&lt;br /&gt;
:''TODO''&lt;br /&gt;
Changing faction:&lt;br /&gt;
* Faction ID, name, color in dbo.Faction&lt;br /&gt;
* Faction blurb &amp;lt;tt&amp;gt;Faction&amp;lt;Name&amp;gt;&amp;lt;/tt&amp;gt; on sitewiki&lt;br /&gt;
* Add/change icons if needed&lt;br /&gt;
** Site: img/factions/&amp;lt;name&amp;gt;.png&lt;br /&gt;
** Game: LuaUI/Configs/Factions&lt;br /&gt;
** Chobby: LuaMenu/Images/Factions&lt;br /&gt;
** Does chobby download them automatically? Presumably not&lt;br /&gt;
&lt;br /&gt;
Using [https://zero-k.info/PlanetwarsAdmin Planetwars admin interface]: Change to a different galaxy if desired, reset PW&lt;br /&gt;
&lt;br /&gt;
== Wiki ==&lt;br /&gt;
See [[Editing Help]]&lt;br /&gt;
&lt;br /&gt;
=== Unit pages ===&lt;br /&gt;
Part of each unit page is autogenerated by the [//github.com/ZeroK-RTS/SpringRTS-Tools/tree/master/unitguide Unit Guide tool], and uploaded by the [//github.com/ZeroK-RTS/Zero-K-Infrastructure/blob/master/Fixer/WikiPortingMW.cs Wiki bot].&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;export_unit_templates.sh&amp;lt;/code&amp;gt; to generate wiki templates for each unit (see &amp;lt;code&amp;gt;export_unit_templates.lua&amp;lt;/code&amp;gt; for some configuration options), then have the bot read the generated text files and edit the unit pages accordingly (requires Visual Studio setup as detailed above). The text output can also be used to manually edit pages.&lt;br /&gt;
&lt;br /&gt;
Unit buildicons and radar icons should be uploaded by FTP to manual.zero-k.info (&amp;lt;code&amp;gt;zero-k.info/zkmanual/www/unitpics&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/icons&amp;lt;/code&amp;gt; respectively). Contact Licho or Histidine for login details.&lt;br /&gt;
&lt;br /&gt;
== itch.io builds ==&lt;br /&gt;
Instructions for updating the portable build on [https://itch.io/ itch.io]:&lt;br /&gt;
&lt;br /&gt;
* Download latest Zero-K portable from https://zerok.itch.io/zero-k, extract to a folder&lt;br /&gt;
* Download butler (see guide at https://itch.io/docs/butler/)&lt;br /&gt;
* Modify extracted portable folder so that its contents are the same as what the user will download&lt;br /&gt;
* Run butler with command: &amp;lt;code&amp;gt;butler push &amp;lt;portable folder&amp;gt; zerok/zero-k:portable&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Engine ==&lt;br /&gt;
See [https://springrts.com/wiki/Development:Getting_Started Spring Engine Development]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Fire_Special_Weapon_Command&amp;diff=6873</id>
		<title>Fire Special Weapon Command</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Fire_Special_Weapon_Command&amp;diff=6873"/>
		<updated>2020-09-10T09:04:20Z</updated>

		<summary type="html">&lt;p&gt;Shaman: /* Commander's Special */ Fix grammar/spelling.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Unique weapons, activated separately and manualy by pressing &amp;quot;D&amp;quot; by default. Unlike [[Unique Commands]] arsenal, those weapons function more like already existing ones in overclock mode.&lt;br /&gt;
&lt;br /&gt;
== Multi Stunner ==&lt;br /&gt;
&lt;br /&gt;
http://manual.zero-k.info/unitpics/striderscorpion.png [[File:Cmd dgun.png]]&lt;br /&gt;
&lt;br /&gt;
The [[Scorpion]] infiltrator has a medium range (about most skirmishers reach) multi stunner. Upon activation, it strikes in small arc, providing complete disabling to anything in its path (including friendlies). Combined with [[Scorpion]]s inherent [[cloak|personal cloak]] unit gains large tactical usage, as it is capable of both stealthy approaching and disabling large chunks of closely moving armies and high-priority units, or even helping to stage its escape. Further stats are presented at [[Scorpion|this]] page.&lt;br /&gt;
&lt;br /&gt;
== Napalm Rocket Salvo ==&lt;br /&gt;
&lt;br /&gt;
http://manual.zero-k.info/unitpics/striderdante.png [[File:Cmd dgun.png]]&lt;br /&gt;
&lt;br /&gt;
The [[Dante]] assault strider has a medium to long range napalm rocket salvo. When activated, the strider launches a barrage of 20 missiles, each dealing low damage, but leaving a strong napalm concoction behind. This weapon allows [[Dante]] to both reach over its intended (and expected by your enemies) range, even allowing it to go past the salvos range itself, as missiles can fly way past their maximum launch radius. Rocket salvo can be used to dispatch bunched up light enemy units, deter skirmishers which can put pressure on this strider due to range advantage, or even punish airforce fleets of your enemies. Further stats are presented at [[Dante|this]] page.&lt;br /&gt;
&lt;br /&gt;
== Disarm Missile ==&lt;br /&gt;
&lt;br /&gt;
http://manual.zero-k.info/unitpics/shipcarrier.png [[File:Cmd dgun.png]]&lt;br /&gt;
&lt;br /&gt;
The [[Reef]] aircraft carrier has a long range single disarm missile. When used, it disarms any unit or structure in large radius. While [[Reef]] is able to stock up on those missiles, allowing for rapid fire, they're also quite costly (150 [[metal]] per piece), and their production consuming 5 metal each second . Further stats are presented at [[Reef|this]] page.&lt;br /&gt;
&lt;br /&gt;
== EMP Missiles ==&lt;br /&gt;
&lt;br /&gt;
http://manual.zero-k.info/unitpics/striderbantha.png [[File:Cmd dgun.png]]&lt;br /&gt;
&lt;br /&gt;
The [[Paladin]] support strider carries EMP missiles. This allows it to launch salvos of 12 such armaments, providing complete disabling effect over a large area. Notice, that firing this weapon at further targets sharply decreases its accuracy. This, in combination with [[Paladin]]s own long range and lightning cannons allows this strider to contain large portions of enemy army, offer support during attacks and more. Further stats are presented at [[Paladin|this]] page.&lt;br /&gt;
&lt;br /&gt;
== Commander's Special == &lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/unitpics/commstrike.png https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/unitpics/commassault.png https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/unitpics/commrecon.png https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/unitpics/commsupport.png [[File:Cmd dgun.png]]&lt;br /&gt;
&lt;br /&gt;
Once [[Commander]]s upgrade to level 4 you can choose to forgo a second normal weapon to gain a special weapon. There are several options, depending on the starting chassis. These include:&lt;br /&gt;
&lt;br /&gt;
https://zero-k.info/img/avatars/commweapon_clusterbomb.png Cluster bomb — available for Guardian and Recon — lets out a close-range shotgun-like blast of 8 high-damage pellets. Comparable to rocket salvos of [[Revenant]].&lt;br /&gt;
&lt;br /&gt;
https://zero-k.info/img/avatars/commweapon_concussion.png Concussion shell — available for Recon — fires one short impulse with medium damage and strong toss-effect.&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/unitpics/commweapon_sunburst.png Disintegrator — available for Guardian and Strike — directed beam of energy with an extremely high alpha damage potential, functions like [[Ultimatum]]s canon.&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/unitpics/commweapon_disruptorbomb.png Disruptor bomb	— available for Strike, Recon and Engineer — launches single bomb with large AOE blast inflicting slow-effect on targets. Think of it as of a larger area [[Limpet]] on request.&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/unitpics/commweapon_napalmgrenade.png Hellfire grenade — available for Guardian and Recon — launches single bomb with large AOE blast inflicting low damage and leaving a strong napalm concoction behind. An [[Inferno]]-like deterrent.&lt;br /&gt;
&lt;br /&gt;
https://zero-k.info/img/avatars/commweapon_multistunner.png Multistunner — available for Strike, Recon and Engineer — strikes in small arc, providing complete disabling to anything in its path (including friendlies). Somewhat weaker equivalent of [[Scorpion]]s special weapon.&lt;br /&gt;
&lt;br /&gt;
https://zero-k.info/img/avatars/commweapon_slamrocket.png S.L.A.M. — available for Guardian — launches tactical missile with high vertical arc-like trajectory. Functions as somewhat weaker equivalent of [[Eos]].&lt;br /&gt;
&lt;br /&gt;
Further stats are presented at [[Commander|this]] page.&lt;br /&gt;
&lt;br /&gt;
{{Navbox commands}}&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Fire_Special_Weapon_Command&amp;diff=6872</id>
		<title>Fire Special Weapon Command</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Fire_Special_Weapon_Command&amp;diff=6872"/>
		<updated>2020-09-10T09:02:48Z</updated>

		<summary type="html">&lt;p&gt;Shaman: /* Commander's Special */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Unique weapons, activated separately and manualy by pressing &amp;quot;D&amp;quot; by default. Unlike [[Unique Commands]] arsenal, those weapons function more like already existing ones in overclock mode.&lt;br /&gt;
&lt;br /&gt;
== Multi Stunner ==&lt;br /&gt;
&lt;br /&gt;
http://manual.zero-k.info/unitpics/striderscorpion.png [[File:Cmd dgun.png]]&lt;br /&gt;
&lt;br /&gt;
The [[Scorpion]] infiltrator has a medium range (about most skirmishers reach) multi stunner. Upon activation, it strikes in small arc, providing complete disabling to anything in its path (including friendlies). Combined with [[Scorpion]]s inherent [[cloak|personal cloak]] unit gains large tactical usage, as it is capable of both stealthy approaching and disabling large chunks of closely moving armies and high-priority units, or even helping to stage its escape. Further stats are presented at [[Scorpion|this]] page.&lt;br /&gt;
&lt;br /&gt;
== Napalm Rocket Salvo ==&lt;br /&gt;
&lt;br /&gt;
http://manual.zero-k.info/unitpics/striderdante.png [[File:Cmd dgun.png]]&lt;br /&gt;
&lt;br /&gt;
The [[Dante]] assault strider has a medium to long range napalm rocket salvo. When activated, the strider launches a barrage of 20 missiles, each dealing low damage, but leaving a strong napalm concoction behind. This weapon allows [[Dante]] to both reach over its intended (and expected by your enemies) range, even allowing it to go past the salvos range itself, as missiles can fly way past their maximum launch radius. Rocket salvo can be used to dispatch bunched up light enemy units, deter skirmishers which can put pressure on this strider due to range advantage, or even punish airforce fleets of your enemies. Further stats are presented at [[Dante|this]] page.&lt;br /&gt;
&lt;br /&gt;
== Disarm Missile ==&lt;br /&gt;
&lt;br /&gt;
http://manual.zero-k.info/unitpics/shipcarrier.png [[File:Cmd dgun.png]]&lt;br /&gt;
&lt;br /&gt;
The [[Reef]] aircraft carrier has a long range single disarm missile. When used, it disarms any unit or structure in large radius. While [[Reef]] is able to stock up on those missiles, allowing for rapid fire, they're also quite costly (150 [[metal]] per piece), and their production consuming 5 metal each second . Further stats are presented at [[Reef|this]] page.&lt;br /&gt;
&lt;br /&gt;
== EMP Missiles ==&lt;br /&gt;
&lt;br /&gt;
http://manual.zero-k.info/unitpics/striderbantha.png [[File:Cmd dgun.png]]&lt;br /&gt;
&lt;br /&gt;
The [[Paladin]] support strider carries EMP missiles. This allows it to launch salvos of 12 such armaments, providing complete disabling effect over a large area. Notice, that firing this weapon at further targets sharply decreases its accuracy. This, in combination with [[Paladin]]s own long range and lightning cannons allows this strider to contain large portions of enemy army, offer support during attacks and more. Further stats are presented at [[Paladin|this]] page.&lt;br /&gt;
&lt;br /&gt;
== Commander's Special == &lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/unitpics/commstrike.png https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/unitpics/commassault.png https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/unitpics/commrecon.png https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/unitpics/commsupport.png [[File:Cmd dgun.png]]&lt;br /&gt;
&lt;br /&gt;
Once [[Commander]]s upgrade to level 4 you can choose to forgo a second normal weapon to gain a special weapon. There are several options, depending on the starting chassis. These include:&lt;br /&gt;
&lt;br /&gt;
https://zero-k.info/img/avatars/commweapon_clusterbomb.png Cluster bomb — available for Guardian and Recon — lets out a close-range shotgun-like blast of 8 high-damage pellets. Comparable to rocket salvos of [[Revenant]].&lt;br /&gt;
&lt;br /&gt;
https://zero-k.info/img/avatars/commweapon_concussion.png Concussion shell — available for Recon — fires one short impulse with medium damage and strong toss-effect.&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/unitpics/commweapon_sunburst.png Disintegrator — available for Guardian and Strike — directed beam of energy with extremly-high alpha damage potential, functions like [[Ultimatum]]s canon.&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/unitpics/commweapon_disruptorbomb.png Disruptor bomb	— available for Strike, Recon and Engineer — launches single bomb with large AOE blast inflicting slow-effect on targets. Think of it as of a larger area [[Limpet]] on request.&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/unitpics/commweapon_napalmgrenade.png Hellfire grenade — available for Guardian and Recon — launches single bomb with large AOE blast inflicting low damage and leaving a strong napalm concoction behind. An [[Inferno]]-like deterent.&lt;br /&gt;
&lt;br /&gt;
https://zero-k.info/img/avatars/commweapon_multistunner.png Multistunner — available for Strike, Recon and Egineer — strikes in small arc, providing complete disabling to anything in its path (including friendlies). Somewhat weaker equivalent of [[Scorpion]]s special weapon.&lt;br /&gt;
&lt;br /&gt;
https://zero-k.info/img/avatars/commweapon_slamrocket.png S.L.A.M. — available for Guardian — launches tactical missile with high vertical arclike tragectory. Functions as somewhat weaker equavalent of [[Eos]].&lt;br /&gt;
&lt;br /&gt;
Further stats are presented at [[Commander|this]] page.&lt;br /&gt;
&lt;br /&gt;
{{Navbox commands}}&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Fire_Special_Weapon_Command&amp;diff=6871</id>
		<title>Fire Special Weapon Command</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Fire_Special_Weapon_Command&amp;diff=6871"/>
		<updated>2020-09-10T09:02:02Z</updated>

		<summary type="html">&lt;p&gt;Shaman: /* Commander's Special */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Unique weapons, activated separately and manualy by pressing &amp;quot;D&amp;quot; by default. Unlike [[Unique Commands]] arsenal, those weapons function more like already existing ones in overclock mode.&lt;br /&gt;
&lt;br /&gt;
== Multi Stunner ==&lt;br /&gt;
&lt;br /&gt;
http://manual.zero-k.info/unitpics/striderscorpion.png [[File:Cmd dgun.png]]&lt;br /&gt;
&lt;br /&gt;
The [[Scorpion]] infiltrator has a medium range (about most skirmishers reach) multi stunner. Upon activation, it strikes in small arc, providing complete disabling to anything in its path (including friendlies). Combined with [[Scorpion]]s inherent [[cloak|personal cloak]] unit gains large tactical usage, as it is capable of both stealthy approaching and disabling large chunks of closely moving armies and high-priority units, or even helping to stage its escape. Further stats are presented at [[Scorpion|this]] page.&lt;br /&gt;
&lt;br /&gt;
== Napalm Rocket Salvo ==&lt;br /&gt;
&lt;br /&gt;
http://manual.zero-k.info/unitpics/striderdante.png [[File:Cmd dgun.png]]&lt;br /&gt;
&lt;br /&gt;
The [[Dante]] assault strider has a medium to long range napalm rocket salvo. When activated, the strider launches a barrage of 20 missiles, each dealing low damage, but leaving a strong napalm concoction behind. This weapon allows [[Dante]] to both reach over its intended (and expected by your enemies) range, even allowing it to go past the salvos range itself, as missiles can fly way past their maximum launch radius. Rocket salvo can be used to dispatch bunched up light enemy units, deter skirmishers which can put pressure on this strider due to range advantage, or even punish airforce fleets of your enemies. Further stats are presented at [[Dante|this]] page.&lt;br /&gt;
&lt;br /&gt;
== Disarm Missile ==&lt;br /&gt;
&lt;br /&gt;
http://manual.zero-k.info/unitpics/shipcarrier.png [[File:Cmd dgun.png]]&lt;br /&gt;
&lt;br /&gt;
The [[Reef]] aircraft carrier has a long range single disarm missile. When used, it disarms any unit or structure in large radius. While [[Reef]] is able to stock up on those missiles, allowing for rapid fire, they're also quite costly (150 [[metal]] per piece), and their production consuming 5 metal each second . Further stats are presented at [[Reef|this]] page.&lt;br /&gt;
&lt;br /&gt;
== EMP Missiles ==&lt;br /&gt;
&lt;br /&gt;
http://manual.zero-k.info/unitpics/striderbantha.png [[File:Cmd dgun.png]]&lt;br /&gt;
&lt;br /&gt;
The [[Paladin]] support strider carries EMP missiles. This allows it to launch salvos of 12 such armaments, providing complete disabling effect over a large area. Notice, that firing this weapon at further targets sharply decreases its accuracy. This, in combination with [[Paladin]]s own long range and lightning cannons allows this strider to contain large portions of enemy army, offer support during attacks and more. Further stats are presented at [[Paladin|this]] page.&lt;br /&gt;
&lt;br /&gt;
== Commander's Special == &lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/unitpics/commstrike.png https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/unitpics/commassault.png https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/unitpics/commrecon.png https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/unitpics/commsupport.png [[File:Cmd dgun.png]]&lt;br /&gt;
&lt;br /&gt;
Once [[Commander]]s upgrade to level 4 you can choose to forgo a second normal weapon to gain a special weapon. There are several options, depending on the starting chassis. These include:&lt;br /&gt;
&lt;br /&gt;
https://zero-k.info/img/avatars/commweapon_clusterbomb.png Cluster bomb — available for Guardian and Recon — lets out a close-range shotgun-like blast of 8 high-damage pellets. Comparable to rocket salvos of [[Revenant]].&lt;br /&gt;
&lt;br /&gt;
https://zero-k.info/img/avatars/commweapon_concussion.png Concussion shell — available for Recon — fires one short impulse with medium damage and strong toss-effect.&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/unitpics/commweapon_sunburst.png Disintegrator — available for Guardian and Strike — directed beam of energy with extremly-high alpha damage potential, functions like [[Ultimatum]]s canon.&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/unitpics/commweapon_disruptorbomb.png Disruptor bomb	— available for Strike, Recon and Egineer — launches single bomb with large AOE blast inflicting slow-effect on targets. Think of it as of a larger area [[Limpet]] on request.&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K/master/unitpics/commweapon_napalmgrenade.png Hellfire grenade — available for Guardian and Recon — launches single bomb with large AOE blast inflicting low damage and leaving a strong napalm concoction behind. An [[Inferno]]-like deterent.&lt;br /&gt;
&lt;br /&gt;
https://zero-k.info/img/avatars/commweapon_multistunner.png Multistunner — available for Strike, Recon and Egineer — strikes in small arc, providing complete disabling to anything in its path (including friendlies). Somewhat weaker equivalent of [[Scorpion]]s special weapon.&lt;br /&gt;
&lt;br /&gt;
https://zero-k.info/img/avatars/commweapon_slamrocket.png S.L.A.M. — available for Guardian — launches tactical missile with high vertical arclike tragectory. Functions as somewhat weaker equavalent of [[Eos]].&lt;br /&gt;
&lt;br /&gt;
Further stats are presented at [[Commander|this]] page.&lt;br /&gt;
&lt;br /&gt;
{{Navbox commands}}&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Talk:Unique_Commands&amp;diff=6870</id>
		<title>Talk:Unique Commands</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Talk:Unique_Commands&amp;diff=6870"/>
		<updated>2020-09-10T08:59:57Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Talk:Unique_Commands&amp;diff=6869</id>
		<title>Talk:Unique Commands</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Talk:Unique_Commands&amp;diff=6869"/>
		<updated>2020-09-10T08:57:24Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Created page with &amp;quot;To do: - Add dante, bantha dguns.  --~~~~&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To do:&lt;br /&gt;
- Add dante, bantha dguns.&lt;br /&gt;
&lt;br /&gt;
--[[User:Shaman|Shaman]] ([[User talk:Shaman|talk]]) 10:57, 10 September 2020 (CEST)&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Lua_Callins&amp;diff=6868</id>
		<title>Lua Callins</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Lua_Callins&amp;diff=6868"/>
		<updated>2020-09-10T08:47:10Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Partial completion of this page.&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;
&amp;lt;span style=&amp;quot;color: maroon;&amp;quot;&amp;gt;'''Attention:'''&amp;lt;/span&amp;gt; some callins will only work on the unsynced portion of the gadget. Due to the type-unsafe nature of lua parsing, those callins not firing up might be hard to trace. This document will be continuously updated to properly alert about those situations.&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 '/save' or '/savegame' 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'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'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 (including when the game is paused) and at least once per sim frame except when catching up. The parameter is the time since the last update. }}&lt;br /&gt;
&lt;br /&gt;
=== Draw* Functions ===&lt;br /&gt;
Inside the Draw* functions, you can use the [[Lua_OpenGL_Api | Lua OpenGL Api]] to draw graphics.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Avoid doing heavy calculations inside these callins; ideally, do the calculations elsewhere and use Draw callins only for drawing.&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGenesis&lt;br /&gt;
|info = Doesn'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, 'map stuff', 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'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'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'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 '''newTeam'''.&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 '''oldTeam'''.&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's done, with {{value|true}}, {{value|false}} it'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'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 'failed to choose' 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's periodic auto-targeting sweep. The second return value is the new priority for this target (if you don'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'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;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; - debris collision, also default of [[Lua_SyncedCtrl#Unit_Control|Spring.AddUnitDamage]]&lt;br /&gt;
* &amp;lt;code&amp;gt;-2&amp;lt;/code&amp;gt; - ground collision&lt;br /&gt;
* &amp;lt;code&amp;gt;-3&amp;lt;/code&amp;gt; - object collision&lt;br /&gt;
* &amp;lt;code&amp;gt;-4&amp;lt;/code&amp;gt; - fire damage&lt;br /&gt;
* &amp;lt;code&amp;gt;-5&amp;lt;/code&amp;gt; - water damage&lt;br /&gt;
* &amp;lt;code&amp;gt;-6&amp;lt;/code&amp;gt; - kill damage&lt;br /&gt;
* &amp;lt;code&amp;gt;-7&amp;lt;/code&amp;gt; - 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;
|I recommend looking up the CallIns in Sourcecode, because the Lua-Documentation, generated from the lua handle of them is seriously flawed and not regenerated.&lt;br /&gt;
|Lua-Handler documented from version&lt;br /&gt;
|args = proID, proOwnerID, shieldEmitterWeaponNum, shieldCarrierUnitID, bounceProjectile, beamEmitterWeaponNum, beamEmitterUnitID, startX, startY, startZ, hitX, hitY, hitZ&lt;br /&gt;
|https://github.com/spring/spring/blob/d085e297416bd963ec25eaa3dbf0796ba22a3582/rts/Lua/LuaHandleSynced.h#L106&lt;br /&gt;
|Actual CallIn: &lt;br /&gt;
|args = proID, shieldCarrier, boolBounceProjectile, 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>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Template:Var&amp;diff=6867</id>
		<title>Template:Var</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Template:Var&amp;diff=6867"/>
		<updated>2020-09-10T07:35:11Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Created page with &amp;quot;&amp;lt;includeonly&amp;gt;{{CodeStyle}}&amp;lt;span class=&amp;quot;var&amp;quot;&amp;gt;{{{1}}}&amp;lt;/span&amp;gt;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;A template to style something as a variable or function parameter e.g. {{var|speed}}, {{var|...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{CodeStyle}}&amp;lt;span class=&amp;quot;var&amp;quot;&amp;gt;{{{1}}}&amp;lt;/span&amp;gt;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;A template to style something as a variable or function parameter e.g. {{var|speed}}, {{var|unitDefID}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Template:API&amp;diff=6866</id>
		<title>Template:API</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Template:API&amp;diff=6866"/>
		<updated>2020-09-10T07:34:47Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Created page with &amp;quot;&amp;lt;includeonly&amp;gt;{{prefix|{{{prefix}}}}}{{name|{{anchor|{{{name}}}}}{{{name}}}}}{{var|1=({{{args}}})}}{{#if: {{{return|}}}|&amp;lt;br&amp;gt;return: {{var|1={{{return}}}}}|}}{{#...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{prefix|{{{prefix}}}}}{{name|{{anchor|{{{name}}}}}[[#{{{name}}}|{{{name}}}]]}}{{var|1=({{{args}}})}}{{#if: {{{return|}}}|&amp;lt;br&amp;gt;return: {{var|1={{{return}}}}}|}}{{#if: {{{output|}}}|{{var|1=&amp;lt;br&amp;gt;-&amp;gt; {{{output}}}}}|}}&lt;br /&gt;
&lt;br /&gt;
:{{{info}}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{API &amp;lt;!-- Callout example --&amp;gt;&lt;br /&gt;
|prefix = Spring&lt;br /&gt;
|name = UseTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount {{pipe}} { metal = {{type|number}} amount, energy = {{type|number}} amount }&lt;br /&gt;
|output = {{type|nil}} {{pipe}} {{type|bool}} hadEnough&lt;br /&gt;
|info = Imposes a one-off usage of resources on the given team. The return value indicates whether or not the team had sufficient resources to meet the usage demand.&lt;br /&gt;
}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{prefix|Spring.}}{{name|UseTeamResource}}{{var|1=({{type|number}} teamID, {{type|string}} {{value|&amp;quot;metal&amp;quot;}} {{pipe}} {{value|&amp;quot;energy&amp;quot;}}, {{type|number}} amount {{pipe}} { metal = {{type|number}} amount, energy = {{type|number}} amount })}}&lt;br /&gt;
&lt;br /&gt;
{{var|-&amp;gt; {{type|nil}} {{pipe}} {{type|bool}} hadEnough}}&lt;br /&gt;
&lt;br /&gt;
:Deduct the specified amount from the team's metal or energy resource.&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Template:LuaCallin&amp;diff=6865</id>
		<title>Template:LuaCallin</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Template:LuaCallin&amp;diff=6865"/>
		<updated>2020-09-10T07:33:38Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Created page with &amp;quot;&amp;lt;includeonly&amp;gt;{{API |prefix = addon. |name = {{{name}}} |args = {{{args|}}} |return = {{{return|}}} |info = {{{info}}}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;==Lua Callin usage example==  &amp;lt;...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{API&lt;br /&gt;
|prefix = addon.&lt;br /&gt;
|name = {{{name}}}&lt;br /&gt;
|args = {{{args|}}}&lt;br /&gt;
|return = {{{return|}}}&lt;br /&gt;
|info = {{{info}}}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;==Lua Callin usage example==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;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;
}}&amp;lt;/pre&amp;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;
}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Lua_Development&amp;diff=6864</id>
		<title>Lua Development</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Lua_Development&amp;diff=6864"/>
		<updated>2020-09-10T07:31:12Z</updated>

		<summary type="html">&lt;p&gt;Shaman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Lua FAQ=&lt;br /&gt;
Lua scripting is the primary way for developers to customize their games and add new features. Most aspects of the Spring engine can be controlled and extensively modified through the Lua API.&lt;br /&gt;
&lt;br /&gt;
[[Lua_Beginners_FAQ|Introduction to Lua in Spring]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Interfaces (last update: 104)=&lt;br /&gt;
[[Lua_Environments|Environments]] (Details the available environments and shows which interfaces are loaded by each)&lt;br /&gt;
&lt;br /&gt;
[[Lua_Callins|Callins]] (Entry points to lua addons)&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left:12px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-weight:bold; font-size:80%&amp;quot;&amp;gt;System&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_System]] &amp;lt;!-- &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;*new*&amp;lt;/span&amp;gt; --&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-weight:bold; font-size:80%&amp;quot;&amp;gt;Const&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_ConstGame]] (holds game relevant constants)&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_ConstEngine]] (version &amp;amp; buildflags)&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_ConstPlatform]] (Current OS, video driver etc)&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_ConstCOB]] (COB, Explode, EmitSfx)&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_CMDs]] (documents all CMDs and CMDTYPEs) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-weight:bold; font-size:80%&amp;quot;&amp;gt;Defs&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_UnitDefs]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_WeaponDefs]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_FeatureDefs]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-weight:bold; font-size:80%&amp;quot;&amp;gt;GameState&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_SyncedCtrl]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_SyncedRead]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_SaveLoad]] (engine-assisted Lua save/load)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-weight:bold; font-size:80%&amp;quot;&amp;gt;Client&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_UnsyncedCtrl]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_UnsyncedRead]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_Lobby]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-weight:bold; font-size:80%&amp;quot;&amp;gt;OpenGL&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_OpenGL_Api]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_GLSL_Api]] (OpenGL Shading Language) &amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_FBO_and_RBO]] (Framebuffer and Renderbuffer Objects) &amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_UnitRendering]] (manage unit LODs and materials)&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_ConstGL]] (some OpenGL constants)&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_Fonts]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-weight:bold; font-size:80%&amp;quot;&amp;gt;Unit Physics&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_MoveCtrl]] (changes the physics of single units)&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_PathFinder]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-weight:bold; font-size:80%&amp;quot;&amp;gt;Engine&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_VFS]] (used to access files in the virtual filesystem, e.g. modfiles)&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_Scream]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_BitOps]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_MathExtra]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_Socket]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Tutorials=&lt;br /&gt;
* [[Widget_Tutorial|Easy widget examples]]&lt;br /&gt;
* [[Lua_InterCommunications|InterCommunications]] (i.e. synced &amp;lt;-&amp;gt; unsynced communications)&lt;br /&gt;
&lt;br /&gt;
=Other useful information=&lt;br /&gt;
* [[Lua_Libraries | Lua libraries]]&lt;br /&gt;
* [[Lua_Performance | Lua performance tips]]&lt;br /&gt;
* [[UI_commands]]&lt;br /&gt;
* [[Animation-LuaScripting | Unit animation scripting with Lua]]&lt;br /&gt;
* [https://github.com/spring/spring/tree/develop/rts/Lua#Source_Code Source code for Lua API]&lt;br /&gt;
&lt;br /&gt;
=Official Lua documentation=&lt;br /&gt;
[http://www.lua.org/pil/ 'Programming in Lua' book online]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.lua.org/manual/5.1/ Lua 5.1 Reference manual]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://lua-users.org/wiki/TutorialDirectory Lua tutorials]&lt;br /&gt;
[[Category: Development]] [[Category: Lua]]&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Lua_Environments&amp;diff=6863</id>
		<title>Lua Environments</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Lua_Environments&amp;diff=6863"/>
		<updated>2020-09-10T07:29:52Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Created page with &amp;quot;== Environments == Here is an exhaustive list of the different lua environments within Spring, roughly in execution order as a game is loaded. === LuaMenu ===  Source: {{sourc...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Environments ==&lt;br /&gt;
Here is an exhaustive list of the different lua environments within Spring, roughly in execution order as a game is loaded.&lt;br /&gt;
=== LuaMenu === &lt;br /&gt;
Source: {{sourcelink|file=rts/Lua/LuaMenu.cpp}}&lt;br /&gt;
&lt;br /&gt;
Introduced in 104.0, a stripped down environment that starts before the game is loaded and persists through reload.&lt;br /&gt;
=== LuaParser ===&lt;br /&gt;
Source: {{sourcelink|file=rts/Lua/LuaParser.cpp}}&lt;br /&gt;
&lt;br /&gt;
Minimal environment used to parse and load definition files.&lt;br /&gt;
=== LuaIntro === &lt;br /&gt;
Source: {{sourcelink|file=rts/Lua/LuaIntro.cpp}}&lt;br /&gt;
&lt;br /&gt;
Introduced in 95.0, to allow visual customisation of the loading process.&lt;br /&gt;
=== LuaRules (synced) ===&lt;br /&gt;
Source: {{sourcelink|file=rts/Lua/LuaHandle.cpp}}&lt;br /&gt;
&lt;br /&gt;
Source: {{sourcelink|file=rts/Lua/LuaHandleSynced.cpp#L305}}&lt;br /&gt;
&lt;br /&gt;
The main environment for synced game-controlling mechanics (&amp;quot;gadgets&amp;quot;).&lt;br /&gt;
=== LuaRules (unsynced) ===&lt;br /&gt;
Source: {{sourcelink|file=rts/Lua/LuaHandle.cpp}}&lt;br /&gt;
&lt;br /&gt;
Source: {{sourcelink|file=rts/Lua/LuaHandleSynced.cpp#L57}}&lt;br /&gt;
&lt;br /&gt;
The main environment for unsynced game effects, rendering, UI etc. (&amp;quot;gadgets&amp;quot;)&lt;br /&gt;
=== LuaGaia (synced) ===&lt;br /&gt;
Source: {{sourcelink|file=rts/Lua/LuaGaia.cpp}}&lt;br /&gt;
&lt;br /&gt;
As LuaRules (synced) but for maps.&lt;br /&gt;
=== LuaGaia (unsynced) ===&lt;br /&gt;
Source: {{sourcelink|file=rts/Lua/LuaGaia.cpp}}&lt;br /&gt;
&lt;br /&gt;
As LuaRules (unsynced) but for maps.&lt;br /&gt;
=== LuaUI ===&lt;br /&gt;
The main environment for toggleable UI elements and controls (&amp;quot;widgets&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== Interfaces == &lt;br /&gt;
The following table demonstrates which interfaces are available to each environment.&lt;br /&gt;
{| border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em; border: 1px #aaa solid; border-collapse: collapse;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
! align=&amp;quot;center&amp;quot; | LuaMenu&lt;br /&gt;
! align=&amp;quot;center&amp;quot; | LuaIntro&lt;br /&gt;
! align=&amp;quot;center&amp;quot; | LuaParser&lt;br /&gt;
! align=&amp;quot;center&amp;quot; | LuaRules/Gaia&amp;lt;br&amp;gt;&amp;lt;font style=&amp;quot;font-size:80%&amp;quot;&amp;gt;(synced)&amp;lt;/font&amp;gt;&lt;br /&gt;
! align=&amp;quot;center&amp;quot; | LuaRules/Gaia&amp;lt;br&amp;gt;&amp;lt;font style=&amp;quot;font-size:80%&amp;quot;&amp;gt;(unsynced)&amp;lt;/font&amp;gt;&lt;br /&gt;
! align=&amp;quot;center&amp;quot; | LuaUI&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_ConstGame]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_ConstEngine]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_ConstPlatform]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_UnitDefs]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_WeaponDefs]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_FeatureDefs]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_ConstCOB]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_CMDs]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_UnsyncedRead]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_UnsyncedCtrl]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_SyncedRead]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +**&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_SyncedCtrl]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_MoveCtrl]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_PathFinder]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_OpenGL_Api]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_GLSL_Api]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +***&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_FBO_and_RBO]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_UnitRendering ]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_Fonts]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_ConstGL]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_VFS]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#888800&amp;quot; | +*&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_Scream]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_BitOps]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_MathExtra]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot;  | [[Lua_Socket]]&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#772222&amp;quot; | -&lt;br /&gt;
| align=&amp;quot;center&amp;quot;  bgcolor=&amp;quot;#227722&amp;quot; | +&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em; border: 1px #aaa solid; border-collapse: collapse;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | *&lt;br /&gt;
| align=&amp;quot;left&amp;quot;| only VFS.ZIP_ONLY&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | **&lt;br /&gt;
| align=&amp;quot;left&amp;quot;| with special LOS handling and decoy unit handling&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | ***&lt;br /&gt;
| align=&amp;quot;left&amp;quot;| stripped down environment with certain functions removed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua]]&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Template:Sourcelink&amp;diff=6862</id>
		<title>Template:Sourcelink</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Template:Sourcelink&amp;diff=6862"/>
		<updated>2020-09-10T07:29:05Z</updated>

		<summary type="html">&lt;p&gt;Shaman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
A small template to link to an engine source file on github.&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;nowiki&amp;gt;{{sourcelink|file=path/to/file.cpp}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;[https://github.com/spring/spring/blob/104.0/{{{file|}}} {{{file|}}}] &amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Template:Sourcelink&amp;diff=6861</id>
		<title>Template:Sourcelink</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Template:Sourcelink&amp;diff=6861"/>
		<updated>2020-09-10T07:26:15Z</updated>

		<summary type="html">&lt;p&gt;Shaman: migration of springrts wiki&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
A small template to link to an engine source file on github.&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;nowiki&amp;gt;{{sourcelink|file=path/to/file.cpp}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;[https://github.com/spring/spring/blob/{{EngineVersion:Stable}}/{{{file|}}} {{{file|}}}] &amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Lua_Beginners_FAQ&amp;diff=6860</id>
		<title>Lua Beginners FAQ</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Lua_Beginners_FAQ&amp;diff=6860"/>
		<updated>2020-09-10T07:22:44Z</updated>

		<summary type="html">&lt;p&gt;Shaman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Lua_Development|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This page is an introduction to using Lua in Spring - it only tries to answer general questions, for more specific Questions please ask in the forum.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Where should I start?==&lt;br /&gt;
&lt;br /&gt;
You can start by reading general Lua tutorials  [http://lua-users.org/wiki/LuaTutorial here]. &lt;br /&gt;
&lt;br /&gt;
After that, you could look at the example widget [[Widget_Tutorial|here]], and try to add some functionality of your own!&lt;br /&gt;
&lt;br /&gt;
Once you're a pro, have a look at the game repos [https://springrts.com/wiki/Gamedev:PublicRepos here], especially their /luaui/Widgets and /luarules/gadgets dirs.&lt;br /&gt;
&lt;br /&gt;
==Where can I find help?==&lt;br /&gt;
&lt;br /&gt;
You can find documentation of Springs Lua API on the [[Lua_Development|Lua_Scripting]] page. Discussion of lua coding takes place on the [https://springrts.com/wiki/Read_Me_First lobby] in #moddev and #lua, and there is also a [https://springrts.com/phpbb/viewforum.php?f=23 Lua sub-forum].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==How do I open &amp;quot;.lua&amp;quot; files?==&lt;br /&gt;
&lt;br /&gt;
Any text editor is enough. On Windows i.e. use [http://notepad-plus.sourceforge.net/uk/site.htm Notepad++]. There are also IDEs able to work with Lua, such as Eclipse, if you look for them.&lt;br /&gt;
&lt;br /&gt;
==What is a call-in? And a call-out?==&lt;br /&gt;
&lt;br /&gt;
Call-ins are functions defined in your script that Spring calls when a determined event takes place. For example, the widget:Initialize() call-in is run by Spring when the widget is loaded.&lt;br /&gt;
Call-outs are functions defined in Spring you can run at whichever moment you desire. For example, when you call Spring.GetUnitTeam(unitID), the engine returns the teamID of the unit identified by &amp;quot;unitID&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==What is the difference between unsynced and synced lua code?==&lt;br /&gt;
&lt;br /&gt;
Synced code is code that runs, identically and at the same time, on every connected client. In practice, this means code which controls the game state. Unsynced code is code that will run differently (or maybe not at all) on each connected client. Typically, this means the user interface.&lt;br /&gt;
&lt;br /&gt;
For example, lua code to make units explode if they fell down a cliff would need to be synced. But, code that warned a player when one of their own units was getting near a cliff edge, would need to be unsynced.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==What is the difference between LuaUI, LuaRules, widgets and gadgets?==&lt;br /&gt;
&lt;br /&gt;
Spring allows various [[Lua:Environments|Lua Environments]], each with differing functionality. Inside each Lua environment, developers can write addons, which are self-contained pieces of code. There are:&lt;br /&gt;
* &amp;lt;b&amp;gt;LuaUI&amp;lt;/b&amp;gt;: Used for unsynced GUI related code. Addons in here are often called widgets. Clients can (if the game permits it) control which widgets are running. Widgets contain only unsynced code. They can be bundled inside the game, or loaded from the users &amp;quot;Spring/LuaUI/Wigets&amp;quot; directory.&lt;br /&gt;
* &amp;lt;b&amp;gt;LuaRules&amp;lt;/b&amp;gt;: Addons in here are often called gadgets. Clients cannot choose which gadgets run. Gadgets can include both synced and unsynced code, and must be bundled inside the game.&lt;br /&gt;
&lt;br /&gt;
Intended for mappers, there is also LuaGaia, which behaves like LuaRules but is separated from it. To see which of the lua environoments has access to which data/functionality, see [[Lua:Environments#Interfaces]] and [[Lua:Callins]].&lt;br /&gt;
&lt;br /&gt;
==What can't Lua do in the current version of Spring?==&lt;br /&gt;
&lt;br /&gt;
Springs Lua interface is very powerful. To work out if some idea is possible you need to ask &lt;br /&gt;
* When do I need the engine to tell me something has happened? Check against [[Lua:Callins|Callins]].&lt;br /&gt;
* What information will I need to know about the game state? Check against [[Lua_SyncedRead]] (synced) and [[Lua_UnsyncedRead]] (unsynced).&lt;br /&gt;
* What do I then need to do about it? Check against [[Lua_SyncedCtrl]] (synced) and[[Lua_UnsyncedCtrl]] (unsynced).&lt;br /&gt;
Sometimes you need special functionality, like disk access or OpenGL calls, in which case check against [[Lua_Scripting#Interfaces|Interfaces]].&lt;br /&gt;
&lt;br /&gt;
For completeness, some examples of things you (currently) can't do:&lt;br /&gt;
*control the ground LOS - but you can set the los status of units!&lt;br /&gt;
*add custom parameters to CEG definitions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Where can I find/edit examples?==&lt;br /&gt;
&lt;br /&gt;
You can find some easy example widgets [[Lua:Tutorial_GettingStarted|here]]. The best source of more complicated examples is inside games themselves, in the LuaUI/Widgets and Luarules/gadgets directories. See [[Gamedev:PublicRepos]] for a list of repositories. &lt;br /&gt;
&lt;br /&gt;
To make your own widgets, simply place individual .lua files into your Spring/LuaUI/Widgets dir (create the dir if it is not present. Case-sensitive!!!). Game repositories can be checked out into a folder named &amp;quot;SomeAwesomeGame.sdd&amp;quot;, placed in your &amp;quot;/Spring/games&amp;quot; dir; this shoudl give a local copy of the game, recognized by Spring, where you can edit files. Make sure to check the licenses before doing this!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Can I reload a script without restarting Spring?==&lt;br /&gt;
&lt;br /&gt;
Yes, you can type &amp;quot;/luaui reload&amp;quot; to reload widgets, and if you have &amp;quot;cheats&amp;quot; enabled you can also &amp;quot;/luarules reload&amp;quot; to reload gadgets.&lt;br /&gt;
&lt;br /&gt;
==Why does the print function seem to do nothing?==&lt;br /&gt;
&lt;br /&gt;
Its output is displayed in stdout. If you have no easy way to see it, you can Spring.Echo(&amp;quot;some text&amp;quot;) which prints to the ingame chat and infolog.txt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Lua]]&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Lua_Beginners_FAQ&amp;diff=6859</id>
		<title>Lua Beginners FAQ</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Lua_Beginners_FAQ&amp;diff=6859"/>
		<updated>2020-09-10T07:22:09Z</updated>

		<summary type="html">&lt;p&gt;Shaman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Lua_Development|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This page is an introduction to using Lua in Spring - it only tries to answer general questions, for more specific Questions please ask in the forum.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Where should I start?==&lt;br /&gt;
&lt;br /&gt;
You can start by reading general Lua tutorials  [http://lua-users.org/wiki/LuaTutorial here]. &lt;br /&gt;
&lt;br /&gt;
After that, you could look at the example widget [[Widget_Tutorial|here]], and try to add some functionality of your own!&lt;br /&gt;
&lt;br /&gt;
Once you're a pro, have a look at the game repos [https://springrts.com/wiki/Gamedev:PublicRepos here], especially their /luaui/Widgets and /luarules/gadgets dirs.&lt;br /&gt;
&lt;br /&gt;
==Where can I find help?==&lt;br /&gt;
&lt;br /&gt;
You can find documentation of Springs Lua API on the [[Lua_Scripting|Lua_Scripting]] page. Discussion of lua coding takes place on the [https://springrts.com/wiki/Read_Me_First lobby] in #moddev and #lua, and there is also a [https://springrts.com/phpbb/viewforum.php?f=23 Lua sub-forum].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==How do I open &amp;quot;.lua&amp;quot; files?==&lt;br /&gt;
&lt;br /&gt;
Any text editor is enough. On Windows i.e. use [http://notepad-plus.sourceforge.net/uk/site.htm Notepad++]. There are also IDEs able to work with Lua, such as Eclipse, if you look for them.&lt;br /&gt;
&lt;br /&gt;
==What is a call-in? And a call-out?==&lt;br /&gt;
&lt;br /&gt;
Call-ins are functions defined in your script that Spring calls when a determined event takes place. For example, the widget:Initialize() call-in is run by Spring when the widget is loaded.&lt;br /&gt;
Call-outs are functions defined in Spring you can run at whichever moment you desire. For example, when you call Spring.GetUnitTeam(unitID), the engine returns the teamID of the unit identified by &amp;quot;unitID&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==What is the difference between unsynced and synced lua code?==&lt;br /&gt;
&lt;br /&gt;
Synced code is code that runs, identically and at the same time, on every connected client. In practice, this means code which controls the game state. Unsynced code is code that will run differently (or maybe not at all) on each connected client. Typically, this means the user interface.&lt;br /&gt;
&lt;br /&gt;
For example, lua code to make units explode if they fell down a cliff would need to be synced. But, code that warned a player when one of their own units was getting near a cliff edge, would need to be unsynced.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==What is the difference between LuaUI, LuaRules, widgets and gadgets?==&lt;br /&gt;
&lt;br /&gt;
Spring allows various [[Lua:Environments|Lua Environments]], each with differing functionality. Inside each Lua environment, developers can write addons, which are self-contained pieces of code. There are:&lt;br /&gt;
* &amp;lt;b&amp;gt;LuaUI&amp;lt;/b&amp;gt;: Used for unsynced GUI related code. Addons in here are often called widgets. Clients can (if the game permits it) control which widgets are running. Widgets contain only unsynced code. They can be bundled inside the game, or loaded from the users &amp;quot;Spring/LuaUI/Wigets&amp;quot; directory.&lt;br /&gt;
* &amp;lt;b&amp;gt;LuaRules&amp;lt;/b&amp;gt;: Addons in here are often called gadgets. Clients cannot choose which gadgets run. Gadgets can include both synced and unsynced code, and must be bundled inside the game.&lt;br /&gt;
&lt;br /&gt;
Intended for mappers, there is also LuaGaia, which behaves like LuaRules but is separated from it. To see which of the lua environoments has access to which data/functionality, see [[Lua:Environments#Interfaces]] and [[Lua:Callins]].&lt;br /&gt;
&lt;br /&gt;
==What can't Lua do in the current version of Spring?==&lt;br /&gt;
&lt;br /&gt;
Springs Lua interface is very powerful. To work out if some idea is possible you need to ask &lt;br /&gt;
* When do I need the engine to tell me something has happened? Check against [[Lua:Callins|Callins]].&lt;br /&gt;
* What information will I need to know about the game state? Check against [[Lua_SyncedRead]] (synced) and [[Lua_UnsyncedRead]] (unsynced).&lt;br /&gt;
* What do I then need to do about it? Check against [[Lua_SyncedCtrl]] (synced) and[[Lua_UnsyncedCtrl]] (unsynced).&lt;br /&gt;
Sometimes you need special functionality, like disk access or OpenGL calls, in which case check against [[Lua_Scripting#Interfaces|Interfaces]].&lt;br /&gt;
&lt;br /&gt;
For completeness, some examples of things you (currently) can't do:&lt;br /&gt;
*control the ground LOS - but you can set the los status of units!&lt;br /&gt;
*add custom parameters to CEG definitions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Where can I find/edit examples?==&lt;br /&gt;
&lt;br /&gt;
You can find some easy example widgets [[Lua:Tutorial_GettingStarted|here]]. The best source of more complicated examples is inside games themselves, in the LuaUI/Widgets and Luarules/gadgets directories. See [[Gamedev:PublicRepos]] for a list of repositories. &lt;br /&gt;
&lt;br /&gt;
To make your own widgets, simply place individual .lua files into your Spring/LuaUI/Widgets dir (create the dir if it is not present. Case-sensitive!!!). Game repositories can be checked out into a folder named &amp;quot;SomeAwesomeGame.sdd&amp;quot;, placed in your &amp;quot;/Spring/games&amp;quot; dir; this shoudl give a local copy of the game, recognized by Spring, where you can edit files. Make sure to check the licenses before doing this!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Can I reload a script without restarting Spring?==&lt;br /&gt;
&lt;br /&gt;
Yes, you can type &amp;quot;/luaui reload&amp;quot; to reload widgets, and if you have &amp;quot;cheats&amp;quot; enabled you can also &amp;quot;/luarules reload&amp;quot; to reload gadgets.&lt;br /&gt;
&lt;br /&gt;
==Why does the print function seem to do nothing?==&lt;br /&gt;
&lt;br /&gt;
Its output is displayed in stdout. If you have no easy way to see it, you can Spring.Echo(&amp;quot;some text&amp;quot;) which prints to the ingame chat and infolog.txt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Lua]]&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Lua_Beginners_FAQ&amp;diff=6858</id>
		<title>Lua Beginners FAQ</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Lua_Beginners_FAQ&amp;diff=6858"/>
		<updated>2020-09-10T07:20:25Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Mirror of springrts&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Lua_Development|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This page is an introduction to using Lua in Spring - it only tries to answer general questions, for more specific Questions please ask in the forum.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Where should I start?==&lt;br /&gt;
&lt;br /&gt;
You can start by reading general Lua tutorials  [http://lua-users.org/wiki/LuaTutorial here]. &lt;br /&gt;
&lt;br /&gt;
After that, you could look at the example widget [[Lua:Tutorial_GettingStarted|here]], and try to add some functionality of your own!&lt;br /&gt;
&lt;br /&gt;
Once you're a pro, have a look at the game repos [https://springrts.com/wiki/Gamedev:PublicRepos here], especially their /luaui/Widgets and /luarules/gadgets dirs.&lt;br /&gt;
&lt;br /&gt;
==Where can I find help?==&lt;br /&gt;
&lt;br /&gt;
You can find documentation of Springs Lua API on the [[Lua_Scripting|Lua_Scripting]] page. Discussion of lua coding takes place on the [https://springrts.com/wiki/Read_Me_First lobby] in #moddev and #lua, and there is also a [https://springrts.com/phpbb/viewforum.php?f=23 Lua sub-forum].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==How do I open &amp;quot;.lua&amp;quot; files?==&lt;br /&gt;
&lt;br /&gt;
Any text editor is enough. On Windows i.e. use [http://notepad-plus.sourceforge.net/uk/site.htm Notepad++]. There are also IDEs able to work with Lua, such as Eclipse, if you look for them.&lt;br /&gt;
&lt;br /&gt;
==What is a call-in? And a call-out?==&lt;br /&gt;
&lt;br /&gt;
Call-ins are functions defined in your script that Spring calls when a determined event takes place. For example, the widget:Initialize() call-in is run by Spring when the widget is loaded.&lt;br /&gt;
Call-outs are functions defined in Spring you can run at whichever moment you desire. For example, when you call Spring.GetUnitTeam(unitID), the engine returns the teamID of the unit identified by &amp;quot;unitID&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==What is the difference between unsynced and synced lua code?==&lt;br /&gt;
&lt;br /&gt;
Synced code is code that runs, identically and at the same time, on every connected client. In practice, this means code which controls the game state. Unsynced code is code that will run differently (or maybe not at all) on each connected client. Typically, this means the user interface.&lt;br /&gt;
&lt;br /&gt;
For example, lua code to make units explode if they fell down a cliff would need to be synced. But, code that warned a player when one of their own units was getting near a cliff edge, would need to be unsynced.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==What is the difference between LuaUI, LuaRules, widgets and gadgets?==&lt;br /&gt;
&lt;br /&gt;
Spring allows various [[Lua:Environments|Lua Environments]], each with differing functionality. Inside each Lua environment, developers can write addons, which are self-contained pieces of code. There are:&lt;br /&gt;
* &amp;lt;b&amp;gt;LuaUI&amp;lt;/b&amp;gt;: Used for unsynced GUI related code. Addons in here are often called widgets. Clients can (if the game permits it) control which widgets are running. Widgets contain only unsynced code. They can be bundled inside the game, or loaded from the users &amp;quot;Spring/LuaUI/Wigets&amp;quot; directory.&lt;br /&gt;
* &amp;lt;b&amp;gt;LuaRules&amp;lt;/b&amp;gt;: Addons in here are often called gadgets. Clients cannot choose which gadgets run. Gadgets can include both synced and unsynced code, and must be bundled inside the game.&lt;br /&gt;
&lt;br /&gt;
Intended for mappers, there is also LuaGaia, which behaves like LuaRules but is separated from it. To see which of the lua environoments has access to which data/functionality, see [[Lua:Environments#Interfaces]] and [[Lua:Callins]].&lt;br /&gt;
&lt;br /&gt;
==What can't Lua do in the current version of Spring?==&lt;br /&gt;
&lt;br /&gt;
Springs Lua interface is very powerful. To work out if some idea is possible you need to ask &lt;br /&gt;
* When do I need the engine to tell me something has happened? Check against [[Lua:Callins|Callins]].&lt;br /&gt;
* What information will I need to know about the game state? Check against [[Lua_SyncedRead]] (synced) and [[Lua_UnsyncedRead]] (unsynced).&lt;br /&gt;
* What do I then need to do about it? Check against [[Lua_SyncedCtrl]] (synced) and[[Lua_UnsyncedCtrl]] (unsynced).&lt;br /&gt;
Sometimes you need special functionality, like disk access or OpenGL calls, in which case check against [[Lua_Scripting#Interfaces|Interfaces]].&lt;br /&gt;
&lt;br /&gt;
For completeness, some examples of things you (currently) can't do:&lt;br /&gt;
*control the ground LOS - but you can set the los status of units!&lt;br /&gt;
*add custom parameters to CEG definitions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Where can I find/edit examples?==&lt;br /&gt;
&lt;br /&gt;
You can find some easy example widgets [[Lua:Tutorial_GettingStarted|here]]. The best source of more complicated examples is inside games themselves, in the LuaUI/Widgets and Luarules/gadgets directories. See [[Gamedev:PublicRepos]] for a list of repositories. &lt;br /&gt;
&lt;br /&gt;
To make your own widgets, simply place individual .lua files into your Spring/LuaUI/Widgets dir (create the dir if it is not present. Case-sensitive!!!). Game repositories can be checked out into a folder named &amp;quot;SomeAwesomeGame.sdd&amp;quot;, placed in your &amp;quot;/Spring/games&amp;quot; dir; this shoudl give a local copy of the game, recognized by Spring, where you can edit files. Make sure to check the licenses before doing this!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Can I reload a script without restarting Spring?==&lt;br /&gt;
&lt;br /&gt;
Yes, you can type &amp;quot;/luaui reload&amp;quot; to reload widgets, and if you have &amp;quot;cheats&amp;quot; enabled you can also &amp;quot;/luarules reload&amp;quot; to reload gadgets.&lt;br /&gt;
&lt;br /&gt;
==Why does the print function seem to do nothing?==&lt;br /&gt;
&lt;br /&gt;
Its output is displayed in stdout. If you have no easy way to see it, you can Spring.Echo(&amp;quot;some text&amp;quot;) which prints to the ingame chat and infolog.txt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Lua]]&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Lua_Development&amp;diff=6857</id>
		<title>Lua Development</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Lua_Development&amp;diff=6857"/>
		<updated>2020-09-10T07:18:19Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Begin mirroring springrts lua development page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Lua FAQ=&lt;br /&gt;
Lua scripting is the primary way for developers to customize their games and add new features. Most aspects of the Spring engine can be controlled and extensively modified through the Lua API.&lt;br /&gt;
&lt;br /&gt;
[[Lua_Beginners_FAQ|Introduction to Lua in Spring]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Interfaces (last update: 104)=&lt;br /&gt;
[[Lua_Environments|Environments]] (Details the available environments and shows which interfaces are loaded by each)&lt;br /&gt;
&lt;br /&gt;
[[Lua_Callins|Callins]] (Entry points to lua addons)&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left:12px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-weight:bold; font-size:80%&amp;quot;&amp;gt;System&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_System]] &amp;lt;!-- &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;*new*&amp;lt;/span&amp;gt; --&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-weight:bold; font-size:80%&amp;quot;&amp;gt;Const&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_ConstGame]] (holds game relevant constants)&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_ConstEngine]] (version &amp;amp; buildflags)&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_ConstPlatform]] (Current OS, video driver etc)&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_ConstCOB]] (COB, Explode, EmitSfx)&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_CMDs]] (documents all CMDs and CMDTYPEs) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-weight:bold; font-size:80%&amp;quot;&amp;gt;Defs&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_UnitDefs]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_WeaponDefs]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_FeatureDefs]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-weight:bold; font-size:80%&amp;quot;&amp;gt;GameState&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_SyncedCtrl]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_SyncedRead]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_SaveLoad]] (engine-assisted Lua save/load)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-weight:bold; font-size:80%&amp;quot;&amp;gt;Client&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_UnsyncedCtrl]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_UnsyncedRead]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_Lobby]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-weight:bold; font-size:80%&amp;quot;&amp;gt;OpenGL&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_OpenGL_Api]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_GLSL_Api]] (OpenGL Shading Language) &amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_FBO_and_RBO]] (Framebuffer and Renderbuffer Objects) &amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_UnitRendering]] (manage unit LODs and materials)&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_ConstGL]] (some OpenGL constants)&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_Fonts]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-weight:bold; font-size:80%&amp;quot;&amp;gt;Unit Physics&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_MoveCtrl]] (changes the physics of single units)&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_PathFinder]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-weight:bold; font-size:80%&amp;quot;&amp;gt;Engine&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_VFS]] (used to access files in the virtual filesystem, e.g. modfiles)&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_Scream]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_BitOps]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_MathExtra]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Lua_Socket]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Tutorials=&lt;br /&gt;
* [[Widget_Tutorial|Easy widget examples]]&lt;br /&gt;
* [[Lua_InterCommunications|InterCommunications]] (i.e. synced &amp;lt;-&amp;gt; unsynced communications)&lt;br /&gt;
&lt;br /&gt;
=Other useful information=&lt;br /&gt;
* [[Lua_Libraries | Lua libraries]]&lt;br /&gt;
* [[Lua_Performance | Lua performance tips]]&lt;br /&gt;
* [[UI_commands]]&lt;br /&gt;
* [[Animation-LuaScripting | Unit animation scripting with Lua]]&lt;br /&gt;
* [https://github.com/spring/spring/tree/develop/rts/Lua#Source_Code Source code for Lua API]&lt;br /&gt;
&lt;br /&gt;
=Official Lua documentation=&lt;br /&gt;
[http://www.lua.org/pil/ 'Programming in Lua' book online]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.lua.org/manual/5.1/ Lua 5.1 Reference manual]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://lua-users.org/wiki/TutorialDirectory Lua tutorials]&lt;br /&gt;
[[Category: Development]] [[Category: Lua]]&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Template:Navbox_commands&amp;diff=6060</id>
		<title>Template:Navbox commands</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Template:Navbox_commands&amp;diff=6060"/>
		<updated>2020-04-02T07:16:51Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Move Drop Depthcharge to historical&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Navbox&lt;br /&gt;
| name       = Navbox commands&lt;br /&gt;
| title      = [[Unit_commands|Commands]]&lt;br /&gt;
| state      = {{{state|}}}&lt;br /&gt;
| listclass = hlist&lt;br /&gt;
&lt;br /&gt;
| group1     = Targeted&lt;br /&gt;
| list1      = * &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/d/de/Move.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Move Command|Move]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/f/f8/Fight.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Attack Move Command|Attack Move]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/5/54/Jump.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Jump Command|Jump]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/0/00/Attack.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Force Fire Command|Force Fire]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/5/58/Settarget.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Set Target Command|Set Target]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/e/e1/Cmd_dgun.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Fire Special Weapon Command|Fire Special Weapon]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/0/04/Areaattack.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Area Attack Command|Area Attack]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/7/74/Guard.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Guard Command|Guard]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/f/fd/Patrol.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Patrol Command|Patrol]]&lt;br /&gt;
&lt;br /&gt;
| group2     = Economic&lt;br /&gt;
| list2      = * &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/e/e2/Repair.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Repair Command|Repair]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/e/ef/Reclaim.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Reclaim Command|Reclaim]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/5/5e/Resurrect.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Resurrect Command|Resurrect]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/4/43/Mex.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt;  [[Area Mex Command|Area Mex]]&lt;br /&gt;
* [[Buildings#Building_placement_and_construction|Building placement commands]]&lt;br /&gt;
* [[Factory Production|Factory commands]]&lt;br /&gt;
&lt;br /&gt;
| group3     = Instant&lt;br /&gt;
| list3      = * &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/0/0b/Cancel.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Stop Command|Stop]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/9/93/Wait.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Wait Command|Wait]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/8/88/Detonate.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Detonate Command|Detonate]]&lt;br /&gt;
* [[Self Destruct Command|Self Destruct]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/a/ac/Canceltarget.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Cancel Target Command|Cancel Target]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/8/84/Rearm.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Resupply Command|Resupply]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/2/23/Recall_drones.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Recall Drones Command|Recall Drones]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/d/d7/Stopbuild.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Clear Production Queue]]&lt;br /&gt;
* [[Stockpile Command|Stockpile]]&lt;br /&gt;
&lt;br /&gt;
| group4     = Transport&lt;br /&gt;
| list4      = * &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/b/b5/Load.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Load Command|Load]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/f/f0/Unload.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Unload Command|Unload]]&lt;br /&gt;
* [[Load Command#Load Selected Units|Load Selected Units]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/c/c2/Action.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Eject Cargo Command|Eject Cargo]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/a/ac/Embark.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Transport AI#Embark and Disembark|Embark]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/2/29/Disembark.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Transport AI#Embark and Disembark|Disembark]]&lt;br /&gt;
&lt;br /&gt;
| group5     = Unusual&lt;br /&gt;
| list5      = * &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/8/8a/Capture.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Newton Firezones|Newton firezone commands]]&lt;br /&gt;
* [[Morph Command|Morph]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/1/1d/Upgrade.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Commander|Upgrade Commander]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/9/98/Cancelupgrade.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Commander|Stop Commander Upgrade]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/f/f0/Cmd_bomb.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Unique Commands#Drop Bombs|Drop Bombs]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/f/f0/Cmd_bomb.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Unique Commands#Unleash Lightning|Unleash Lightning]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/0/09/Cmd_drop_beacon.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Unique Commands#Teleport Beacon|Teleport Beacon]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/1/19/Cmd_sprint.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Unique Commands#Speed Boost|Speed Boost]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/0/09/Cmd_drop_beacon.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Evacuate Command|Evacuate]]&lt;br /&gt;
&lt;br /&gt;
| group6     = Global&lt;br /&gt;
| list6      = * &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/9/92/Ferry.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Ferry Command|Ferry]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/d/d4/Retreat.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Retreat|Retreat]]&lt;br /&gt;
* [[Resources Reserve|Reserve]]&lt;br /&gt;
&lt;br /&gt;
| group7     = Historical&lt;br /&gt;
| list7      = * &amp;lt;img src=&amp;quot;http://zero-k.info/mediawiki/images/e/e1/Cmd_dgun.png&amp;quot; width='16' align=&amp;quot;center&amp;quot; /&amp;gt; [[Historical Commands#Drop Depthcharge|Drop Depthcharge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| below       = [[Unit states]]&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
[[Category:Manual]]&lt;br /&gt;
[[Category: Commands]]&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Historical_commands&amp;diff=6059</id>
		<title>Historical commands</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Historical_commands&amp;diff=6059"/>
		<updated>2020-04-02T07:16:14Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Shaman moved page Historical commands to Historical Commands: Make capitalized (oops)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Historical Commands]]&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Historical_Commands&amp;diff=6058</id>
		<title>Historical Commands</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Historical_Commands&amp;diff=6058"/>
		<updated>2020-04-02T07:16:13Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Shaman moved page Historical commands to Historical Commands: Make capitalized (oops)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Drop Depthcharge ==&lt;br /&gt;
http://manual.zero-k.info/unitpics/hoverdepthcharge.png [[File:Cmd dgun.png]]&lt;br /&gt;
&lt;br /&gt;
Similar to Thunderbird, the [[Claymore]] antisub hovercraft would fire its normal weapon manually. The '''Drop Depthcharge''' command caused its massive depth charge to be released directly beneath the unit as a timed bomb. It was best to quickly relocate the Claymore to another position after using this.&lt;br /&gt;
&lt;br /&gt;
It was removed in v1.8.3.0.&lt;br /&gt;
&lt;br /&gt;
{{Navbox commands}}&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Historical_Commands&amp;diff=6057</id>
		<title>Historical Commands</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Historical_Commands&amp;diff=6057"/>
		<updated>2020-04-02T07:13:46Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Create historical commands.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Drop Depthcharge ==&lt;br /&gt;
http://manual.zero-k.info/unitpics/hoverdepthcharge.png [[File:Cmd dgun.png]]&lt;br /&gt;
&lt;br /&gt;
Similar to Thunderbird, the [[Claymore]] antisub hovercraft would fire its normal weapon manually. The '''Drop Depthcharge''' command caused its massive depth charge to be released directly beneath the unit as a timed bomb. It was best to quickly relocate the Claymore to another position after using this.&lt;br /&gt;
&lt;br /&gt;
It was removed in v1.8.3.0.&lt;br /&gt;
&lt;br /&gt;
{{Navbox commands}}&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Unique_Commands&amp;diff=6056</id>
		<title>Unique Commands</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Unique_Commands&amp;diff=6056"/>
		<updated>2020-04-02T07:12:17Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Removed Drop Depthcharge. It was removed in v1.8.3.0&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Several units in ZK have special abilities that are activated with '''unique commands''' — though typically, these are all bound to the '''D''' key by default (similar to Special Weapons).&lt;br /&gt;
&lt;br /&gt;
== Speed Boost ==&lt;br /&gt;
http://manual.zero-k.info/unitpics/planefighter.png [[File:Cmd sprint.png]]&lt;br /&gt;
&lt;br /&gt;
The [[Swift]] multirole fighter has an ability to temporarily receive a massive boost to its flight speed through he use of the '''Speed Boost''' instant command. This is extremely useful to dodge missiles, avoid losing engagements, or quickly intercept incoming enemy bombers. Note that while most of the uses of Speed Boost are manual, this ability will be automatically used when [[retreat]]ing.&lt;br /&gt;
&lt;br /&gt;
== Teleport Beacon ==&lt;br /&gt;
http://manual.zero-k.info/unitpics/amphtele.png [[File:Cmd drop beacon.png]]&lt;br /&gt;
&lt;br /&gt;
The [[Djinn]] amphibious teleporter works by warping the units from its Lamp teleport beacon to its present deployed location. It can relocate the Lamp entry point by using the '''Teleport Beacon''' ability on any desired point on the map, as long as it's not blocked by an occupying structure or impassable terrain.&lt;br /&gt;
&lt;br /&gt;
== Drop Bombs ==&lt;br /&gt;
http://manual.zero-k.info/unitpics/gunshipkrow.png [[File:Cmd bomb.png]]&lt;br /&gt;
&lt;br /&gt;
The [[Krow]] flying fortress has a special weapon that is only activated by the instant '''Drop Bombs''' command. Immediately upon command activation, the unit unleashes a salvo of bomblets directly beneath it, lasting several seconds. &lt;br /&gt;
&lt;br /&gt;
The Krow has a significantly lowered acceleration and turn rate during the bombing run.&lt;br /&gt;
&lt;br /&gt;
== Unleash Lightning == &lt;br /&gt;
http://manual.zero-k.info/unitpics/bomberdisarm.png [[File:Cmd bomb.png]]&lt;br /&gt;
&lt;br /&gt;
The [[Thunderbird]] disarm bomber has only one weapon and will use it automatically upon designated targets. However, it is also possible to activate the lightning weapon immediately by the manual '''Unleash Lightning''' command - usually in response to unexpected maneuvers by the targeted enemies.&lt;br /&gt;
&lt;br /&gt;
{{Navbox commands}}&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=User:Shaman/ZK_Lore&amp;diff=5712</id>
		<title>User:Shaman/ZK Lore</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=User:Shaman/ZK_Lore&amp;diff=5712"/>
		<updated>2019-10-18T09:05:30Z</updated>

		<summary type="html">&lt;p&gt;Shaman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the actual lore of Zero-K. Please note this is a work in progress and is totally original and not to be copied. People who copy this will be copied and the work will be claimed as my own.&lt;br /&gt;
&lt;br /&gt;
= Chefs =&lt;br /&gt;
&lt;br /&gt;
Chefs are humanoid confectioners of the culinary arts. They are the main antagonist of Zero-K, motivated to grow their restraunt franchise. These chefs are trained for years before they are allowed to venture off into the Lobster Catacombs. Some are even former lobsters who have somehow been transformed into Chefs, although this is very rare.&lt;br /&gt;
&lt;br /&gt;
https://i.imgur.com/mJgIt2h.png&lt;br /&gt;
&lt;br /&gt;
The Chefs' Most Excellent Leader&lt;br /&gt;
&lt;br /&gt;
= Lobsters =&lt;br /&gt;
&lt;br /&gt;
Lobsters are the main denizens of Zero-K. An aquatic creature that lives in cluster pots that enjoys parties, Lobsters are little to no threat to their archnemesis, the Chefs. They are sometimes encountered in the shallow end of the Lobster Catacombs.&lt;br /&gt;
&lt;br /&gt;
= Potatoes =&lt;br /&gt;
&lt;br /&gt;
Potatoes are the final, last best defense of the lobsters. These ancient golems of uselessness dwell deep inside the lobster catacombs, protecting the heart of the catacombs from the Chefs.&lt;br /&gt;
&lt;br /&gt;
It is unknown what created them or why they were created.&lt;br /&gt;
&lt;br /&gt;
= Wubsters =&lt;br /&gt;
&lt;br /&gt;
A subclass of chefs. The Wubsters desire to transform the Lobsters into resignateers. Failing that task, their sole purpose in life is to make you miserable so you resign.&lt;br /&gt;
&lt;br /&gt;
= Resignateers =&lt;br /&gt;
&lt;br /&gt;
When lobsters have been cooked so much, they eventually transform into resignateers. It is not known what exactly causes this process to occur. Resignateers are often employed by the queen Lobster to combat the chefs, but they are utterly ineffective in combat as their only ability is to resign, and they often fail at doing that.&lt;br /&gt;
&lt;br /&gt;
= Storages =&lt;br /&gt;
&lt;br /&gt;
Storages are totems that the lobsters erect in their bases, often creating massive fields of them. These storages are said to call upon the Shiny gods, often to their owner's detriment.&lt;br /&gt;
&lt;br /&gt;
= Porcy Fields =&lt;br /&gt;
&lt;br /&gt;
If a lobster does not erect storage totems, they will often create Porcy Fields in their backyards. It's unknown why they do this, but it's often speculated that they're trying to scare off the chickens. Often times these porcy fields are too much for chefs to cook using traditional methods so they must dust off and nuke the site from orbit as it's the only cure for a porcy field infestation.&lt;br /&gt;
&lt;br /&gt;
= Cobblestones =&lt;br /&gt;
&lt;br /&gt;
A very new brand of lobsters, however, more resilient to cooking. Cobblestones are the natural evolution of lobsters. With a hard shell, and rock hard will, they're dangerous opposition.&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Big_Bertha&amp;diff=5711</id>
		<title>Big Bertha</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Big_Bertha&amp;diff=5711"/>
		<updated>2019-10-18T08:40:55Z</updated>

		<summary type="html">&lt;p&gt;Shaman: /* Tactics and Strategy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The '''{{PAGENAME}}''' is a strategic plasma cannon.{{ Infobox zkunit&lt;br /&gt;
| name = Big Bertha&lt;br /&gt;
| defname = staticheavyarty&lt;br /&gt;
| description = Strategic Plasma Cannon&lt;br /&gt;
| image = http://manual.zero-k.info/unitpics/staticheavyarty.png&lt;br /&gt;
| icontype = lrpc&lt;br /&gt;
| cost = 5000&lt;br /&gt;
| hitpoints = 4800&lt;br /&gt;
| sight = 660&lt;br /&gt;
| weapons = &lt;br /&gt;
	{{ Infobox zkweapon&lt;br /&gt;
	| name = Very Heavy Plasma Cannon&lt;br /&gt;
	| type = Cannon&lt;br /&gt;
	| damage = 2002&lt;br /&gt;
	| reloadtime = 7&lt;br /&gt;
	| dps = 286&lt;br /&gt;
	| range = 6200&lt;br /&gt;
	| aoe = 96&lt;br /&gt;
	| projectilespeed = 1100&lt;br /&gt;
	| special1 = Smooths ground&lt;br /&gt;
	}}&lt;br /&gt;
}}==Description==&lt;br /&gt;
The Bertha is a massive cannon that fires high-energy plasmoids across the map. Used appropriately, it can effectively suppress enemy operations from the safety of your base. Do not expect it to win battles alone for you, however.&lt;br /&gt;
&lt;br /&gt;
= Tactics and Strategy =&lt;br /&gt;
Big Bertha lives up to [https://en.wikipedia.org/wiki/Big_Bertha_(howitzer) its ancestor's] name. It is used similarly to its ancestor too: bombarding the enemy base from a safe, distant location. After a while of shelling an enemy defensive line, you can send in the infantry to mop up what's left. Alternately, you can shell the enemy base directly and reduce it to rubble.&lt;br /&gt;
&lt;br /&gt;
Be careful, as the enemy may make a push with all their available units to destroy the Big Bertha. Have some defenses ready, especially around the gun itself.&lt;br /&gt;
&lt;br /&gt;
{{Navbox buildings}}&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Big_Bertha&amp;diff=5710</id>
		<title>Big Bertha</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Big_Bertha&amp;diff=5710"/>
		<updated>2019-10-18T08:40:24Z</updated>

		<summary type="html">&lt;p&gt;Shaman: /* Tactics and Strategy */ May made a push -&amp;gt; May maKe a push&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The '''{{PAGENAME}}''' is a strategic plasma cannon.{{ Infobox zkunit&lt;br /&gt;
| name = Big Bertha&lt;br /&gt;
| defname = staticheavyarty&lt;br /&gt;
| description = Strategic Plasma Cannon&lt;br /&gt;
| image = http://manual.zero-k.info/unitpics/staticheavyarty.png&lt;br /&gt;
| icontype = lrpc&lt;br /&gt;
| cost = 5000&lt;br /&gt;
| hitpoints = 4800&lt;br /&gt;
| sight = 660&lt;br /&gt;
| weapons = &lt;br /&gt;
	{{ Infobox zkweapon&lt;br /&gt;
	| name = Very Heavy Plasma Cannon&lt;br /&gt;
	| type = Cannon&lt;br /&gt;
	| damage = 2002&lt;br /&gt;
	| reloadtime = 7&lt;br /&gt;
	| dps = 286&lt;br /&gt;
	| range = 6200&lt;br /&gt;
	| aoe = 96&lt;br /&gt;
	| projectilespeed = 1100&lt;br /&gt;
	| special1 = Smooths ground&lt;br /&gt;
	}}&lt;br /&gt;
}}==Description==&lt;br /&gt;
The Bertha is a massive cannon that fires high-energy plasmoids across the map. Used appropriately, it can effectively suppress enemy operations from the safety of your base. Do not expect it to win battles alone for you, however.&lt;br /&gt;
&lt;br /&gt;
= Tactics and Strategy =&lt;br /&gt;
Big Bertha lives up to [https://en.wikipedia.org/wiki/Big_Bertha_(howitzer) its ancestor's] name. It is used similarly to its ancestor too - bombarding the enemy base from a safe, distant location. After a while of shelling an enemy defensive line, you can send in the infantry to mop up what's left. Alternately, you can shell the enemy base directly and reduce it to rubble.&lt;br /&gt;
&lt;br /&gt;
Be careful, as the enemy may make a push with all their available units to destroy the Big Bertha. Have some defenses ready, especially around the gun itself.&lt;br /&gt;
&lt;br /&gt;
{{Navbox buildings}}&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Zero-K_talk:Developing&amp;diff=5600</id>
		<title>Zero-K talk:Developing</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Zero-K_talk:Developing&amp;diff=5600"/>
		<updated>2019-08-16T01:10:52Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Edit steel blue's message into proper formating&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Developing#Updating_sources]] contains a link that describes how to use the github website to pull recent changes into your fork repository with a merge commit. When I did it my repo de-synced from ZeroK-RTS master making a whole bunch of separate commits by me authored by someone else. When I tried to pull request some changes it resulted in this https://github.com/ZeroK-RTS/Zero-K/pull/3688 where my changes were on top of 400 commits separate from what master was. It would be best to re-write this section to be more clear. For referance, I had bare bones knowlege on how to use git and I've never worked with forks before.&lt;br /&gt;
&lt;br /&gt;
--[[User:Steel Blue|Steel Blue]] ([[User talk:Steel Blue|talk]]) 17:57, 10 August 2019 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Professional TIp ==&lt;br /&gt;
&lt;br /&gt;
if you do &amp;lt;nowiki&amp;gt;---~~~~&amp;lt;/nowiki&amp;gt; it will become --[[User:Shaman|Shaman]] ([[User talk:Shaman|talk]]) 02:25, 16 August 2019 (CEST)&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Zero-K_talk:Developing&amp;diff=5599</id>
		<title>Zero-K talk:Developing</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Zero-K_talk:Developing&amp;diff=5599"/>
		<updated>2019-08-16T00:25:59Z</updated>

		<summary type="html">&lt;p&gt;Shaman: /* Professional TIp */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Steel_Blue says:&lt;br /&gt;
&lt;br /&gt;
[[Developing#Updating_sources]] contains a link that describes how to use the github website to pull recent changes into your fork repository with a merge commit. When I did it my repo de-synced from ZeroK-RTS master making a whole bunch of separate commits by me authored by someone else. When I tried to pull request some changes it resulted in this https://github.com/ZeroK-RTS/Zero-K/pull/3688 where my changes were on top of 400 commits separate from what master was. It would be best to re-write this section to be more clear. For referance, I had bare bones knowlege on how to use git and I've never worked with forks before.&lt;br /&gt;
&lt;br /&gt;
== Professional TIp ==&lt;br /&gt;
&lt;br /&gt;
if you do &amp;lt;nowiki&amp;gt;---~~~~&amp;lt;/nowiki&amp;gt; it will become --[[User:Shaman|Shaman]] ([[User talk:Shaman|talk]]) 02:25, 16 August 2019 (CEST)&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=User_talk:Aquanim/DraftCommandersOmni2&amp;diff=5511</id>
		<title>User talk:Aquanim/DraftCommandersOmni2</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=User_talk:Aquanim/DraftCommandersOmni2&amp;diff=5511"/>
		<updated>2019-06-22T07:27:44Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Added signature for user. -- Don't forget to add ~~~~ to your posts, please. :)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This looks really fun, seems like it could make commanders less min/maxed and put a practical limit on how much they can be upgraded.&lt;br /&gt;
&lt;br /&gt;
A few questions:&lt;br /&gt;
&lt;br /&gt;
* Do commanders still get stat upgrades per &amp;quot;level&amp;quot;?&lt;br /&gt;
&lt;br /&gt;
* Area Jammer is omitted, is this intentional?&lt;br /&gt;
&lt;br /&gt;
* What makes something a Minor/Major Subsystem or a Module?  e.g. Why are Radar and Bouyancy Modules and not Subsystems?&lt;br /&gt;
&lt;br /&gt;
* Is Sensor Suite an upgrade of Radar?&lt;br /&gt;
&lt;br /&gt;
[[special:Contributions/71.88.223.153|71.88.223.153]] 14:18, 21 June 2019‎ (CEST)&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Discord&amp;diff=5462</id>
		<title>Discord</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Discord&amp;diff=5462"/>
		<updated>2019-05-03T05:48:41Z</updated>

		<summary type="html">&lt;p&gt;Shaman: tagged with info. Dunno what else we can do with this. This should be protected though eventually.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Zero-K Discord server can be found at https://discord.gg/aab63Vt&lt;br /&gt;
&lt;br /&gt;
[[Category:Info]]&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=Rover_Assembly&amp;diff=5067</id>
		<title>Rover Assembly</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=Rover_Assembly&amp;diff=5067"/>
		<updated>2019-01-12T08:37:19Z</updated>

		<summary type="html">&lt;p&gt;Shaman: L2 -&amp;gt; L1 headers. L3 -&amp;gt; L2 headers.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The '''{{PAGENAME}}''' is a factory that produces light wheeled vehicles.{{ Infobox zkunit&lt;br /&gt;
| name = Rover Assembly&lt;br /&gt;
| defname = factoryveh&lt;br /&gt;
| description = Produces Light Wheeled Vehicles, Builds at 10 m/s&lt;br /&gt;
| image = http://manual.zero-k.info/unitpics/factoryveh.png&lt;br /&gt;
| icontype = facvehicle&lt;br /&gt;
| cost = 800&lt;br /&gt;
| hitpoints = 4000&lt;br /&gt;
| energy = 0.3&lt;br /&gt;
| sight = 273&lt;br /&gt;
| abilities = &lt;br /&gt;
	{{ Infobox zkability construction&lt;br /&gt;
	| buildpower = 10&lt;br /&gt;
	}}&lt;br /&gt;
}}=Description=&lt;br /&gt;
A traditional favourite, the Rover Assembly is the ideal blitzkrieg fac with its fast, highly aggressive units. Those units that lack speed make up for it with copious firepower. Key Units: Dart, Scorcher, Ravager, Ripper, Fencer&lt;br /&gt;
&lt;br /&gt;
The Rover Assembly builds:&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://manual.zero-k.info/unitpics/vehcon.png&amp;quot; height='64' align=&amp;quot;center&amp;quot;/&amp;gt;[[Mason]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://manual.zero-k.info/unitpics/vehscout.png&amp;quot; height='64' align=&amp;quot;center&amp;quot;/&amp;gt;[[Dart]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://manual.zero-k.info/unitpics/vehraid.png&amp;quot; height='64' align=&amp;quot;center&amp;quot;/&amp;gt;[[Scorcher]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://manual.zero-k.info/unitpics/vehsupport.png&amp;quot; height='64' align=&amp;quot;center&amp;quot;/&amp;gt;[[Fencer]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://manual.zero-k.info/unitpics/vehriot.png&amp;quot; height='64' align=&amp;quot;center&amp;quot;/&amp;gt;[[Ripper]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://manual.zero-k.info/unitpics/vehassault.png&amp;quot; height='64' align=&amp;quot;center&amp;quot;/&amp;gt;[[Ravager]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://manual.zero-k.info/unitpics/vehcapture.png&amp;quot; height='64' align=&amp;quot;center&amp;quot;/&amp;gt;[[Dominatrix]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://manual.zero-k.info/unitpics/veharty.png&amp;quot; height='64' align=&amp;quot;center&amp;quot;/&amp;gt;[[Badger]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://manual.zero-k.info/unitpics/vehheavyarty.png&amp;quot; height='64' align=&amp;quot;center&amp;quot;/&amp;gt;[[Impaler]]&lt;br /&gt;
* &amp;lt;img src=&amp;quot;http://manual.zero-k.info/unitpics/vehaa.png&amp;quot; height='64' align=&amp;quot;center&amp;quot;/&amp;gt;[[Crasher]]&lt;br /&gt;
&lt;br /&gt;
=Tactics and Strategy=&lt;br /&gt;
&lt;br /&gt;
The Rover Assembly is the most versatile of the flat-terrain factories. The Dart, Scorcher, Ripper and Ravager are fast and effective combat units which excel at rapid response and swift punishment of enemy weakness. When the game has slowed down and mobility is less important, the Fencer, Badger and Impaler punish your opponent from a safe distance.&lt;br /&gt;
&lt;br /&gt;
The greatest weakness of the Rover Assembly is its lacklustre heavy and utility options; all of the main Rover combat units are cheap but not exceptionally strong individually, and if a frontal assault with Scorchers won't work the Rovers don't have another good solution to opposing heavies. If you combine Rovers with the raw strength of [[Heavy Tank Factory|Heavy Tanks]] or the utility of [[Shield Bot Factory|Shield Bots]], the Rover Assembly's combination of swift attacks and slow attrition will serve you very well.&lt;br /&gt;
&lt;br /&gt;
== Example Unit Combinations ==&lt;br /&gt;
&lt;br /&gt;
Scout ahead of your Scorchers with the faster and cheaper Darts, so you can commit your Scorchers where they will inflict the most damage.&lt;br /&gt;
&lt;br /&gt;
Escort your Ravagers with Rippers to deal with small and swift opponents. The Ravagers will be more effective against heavier units and static defence.&lt;br /&gt;
&lt;br /&gt;
Protect your long-range units like Fencer, Dominatrix, Badger and Impaler with combat units like the Ripper, static defences, or shields.&lt;br /&gt;
&lt;br /&gt;
Conceal your mobile strike force with an [[Iris]] so it can attack before your opponent has a chance to react.&lt;br /&gt;
&lt;br /&gt;
Bomb your opponent's critical units or defences with [[Raven|Ravens]], a [[Thunderbird]] or a [[Likho]], then follow up with a Scorcher attack, striking where and when the enemy is weak.&lt;br /&gt;
&lt;br /&gt;
== Beating Rovers ==&lt;br /&gt;
&lt;br /&gt;
Of all the factories in Zero-K, the Rover Assembly presents the greatest game-ending threat in the early game. Even a small number of Scorchers can kill a Commander or a Factory in an incredibly short time by using their Heat Rays at close range, and they will also make short work of isolated Pickets and Lotuses. Make sure you are protected from Scorchers by defences and your own raiders, while at the same time pressuring the Rover player so they cannot expand unhindered.&lt;br /&gt;
&lt;br /&gt;
If your opponent is building up a large force of Ravagers, you will need to be prepared. They will not be deterred by light static defences, and if you build a denser concentration of defences in one spot the Ravagers will likely attack elsewhere. Raiders are capable of keeping up with Ravagers, but will be ineffective if the Ravagers are escorted by Ripper. Other assault units and some riots will hold their own in combat, but they are generally slower than Ravagers so good radar coverage to predict the Ravagers' attacks is required. Perhaps the best solution is to disable the Ravagers instead of trying to punch through their large HP pool directly; the [[Placeholder]] and [[Thunderbird]] are especially effective.&lt;br /&gt;
&lt;br /&gt;
Over-reliance on static defences will be punished by a Rover player - they can run around (or through!) with Scorchers and Ravagers, or clean up defences swiftly with Impalers and Badgers. The [[Gauss]] turret is more resistant to the Rover artillery while it is closed and can buy you some time, but you will eventually need to fight the Rovers directly with a mobile army. The best way to engage Badgers is by flanking them, so that you don't have to run through their minefield and they cannot retreat effectively. Outranging them with heavier area-denial artillery like a [[Firewalker]], [[Tremor]] or [[Merlin]] is also possible.&lt;br /&gt;
&lt;br /&gt;
{{Navbox buildings}}&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=PlanetWars&amp;diff=5066</id>
		<title>PlanetWars</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=PlanetWars&amp;diff=5066"/>
		<updated>2019-01-12T08:36:01Z</updated>

		<summary type="html">&lt;p&gt;Shaman: L2 -&amp;gt; L1 headers. Again.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right;&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= What is Planetwars? =&lt;br /&gt;
Planetwars is an online multiplayer strategic campaign that pits you and your allies against the rest of the Zero-K playerbase in a fight to control the galaxy! On behalf of your faction you will choose which planets to attack and defend, and you'll fight on those planets in Zero-K 2v2 or 3v3 battles. As the battles are are won or lost, your faction will spread its influence throughout the galaxy, conquering planets and gaining resources to use in further battles. You can spend some of those resources yourself to send dropships and bombers to other planets or to fortify the defenses on planets your faction controls. You can even take on leadership roles within your faction, gaining responsibility over the military, economic, strategic, or diplomatic course your faction will pursue.&lt;br /&gt;
&lt;br /&gt;
At its heart, though, Planetwars is simply a series of small-team teamgames, but with something larger to fight for than just the battle at hand. It's a way to make a great RTS game even better!&lt;br /&gt;
&lt;br /&gt;
= How do I play? =&lt;br /&gt;
First, join a faction. In the Zero-K lobby, click on Planetwars, then choose a faction to join. You can leave a faction and join another at any time via the [http://zero-k.info/Factions Factions] page. You may optionally choose to join a [http://zero-k.info/Clans Zero-K clan], or even start your own clan.&lt;br /&gt;
&lt;br /&gt;
Now wait until it's your faction's turn to launch an attack or defend against an invasion. If your faction has the initiative, you can select a planet to attack, or you can join in an attack that one of your fellow faction members has started. Once enough players have joined the attack (either two or three, depending on the planet) then defenders will have a few minutes to join. Once enough defenders have joined, the battle will begin. On the other hand, if your faction does ''not'' have the iniative, you'll need to wait for the attacking faction to select a planet to attack and then you can join in the defense. The lobby will display which faction has the initiative, which planets are available to attack, and which attacks are available to defend against.&lt;br /&gt;
&lt;br /&gt;
You can use the [http://zero-k.info/Planetwars Galaxy Map] to see which planets each faction controls. By clicking on a planet's name you can see more details and you can spend resources to send starships to that planet or to build structures on that planet. You gain resources by participating in Planetwars battles.&lt;br /&gt;
&lt;br /&gt;
You can take on leadership roles by interacting with the other faction members in chat or on the forums. You can vote for faction leaders or nominate yourself to be a faction leader by visiting your user page. Or you can convince one of the current faction leaders to give you an appointed position.&lt;br /&gt;
&lt;br /&gt;
Note that you need to be Level 10 or higher in Zero-K in order to play in Planetwars. You can increase your level by playing multiplayer games, either against other players or against the AI (skirmish and campaign games under the Singleplayer tab don't increase your level).&lt;br /&gt;
&lt;br /&gt;
= How do we win? =&lt;br /&gt;
There are two ways for your faction to win. The first is to conquer the homeworld of one of the other factions; your faction wins the current round and all other factions lose. The faction that was conquered will suffer especially drastic consequences in the Planetwars lore to be written between the end of the current round and the start of the next round. Winning this way is rather difficult, as homeworlds have massive defensive bonuses and are protected from warp and influence projection.&lt;br /&gt;
&lt;br /&gt;
The second way to win is by conquering planets that have Ancient Artefacts. These structures are found on some planets and, when activated at great energy cost, will generate Victory Points each turn. The first faction to accumulate 100 Victory Points wins the current round.&lt;br /&gt;
&lt;br /&gt;
= How can I help my faction win? =&lt;br /&gt;
Play Zero-K! Play in the Planetwars small-team battles and do your best to help your team win them. Accumulate resources from playing battles and spend them to secure your faction's planets and to weaken the planets your faction needs to conquer. Study the Galaxy Map to see which planets might be vulnerable and which directions are best to expand in. Read the events that show up in your faction's event feed to keep up with what's happening in the game. Talk to your fellow faction members in chat and on the forum in order to coordinate strategies. Recruit your friends to join in! Teach them how to play Zero-K, and play practice matches to improve your skills.&lt;br /&gt;
&lt;br /&gt;
But most of all, have fun!&lt;br /&gt;
&lt;br /&gt;
= Attacking and Defending =&lt;br /&gt;
''Main article: [[PlanetWars attack]]''&lt;br /&gt;
* The Planetwars tab in the lobby shows which faction currently needs to attack or defend.&lt;br /&gt;
* In the Planetswars tab, planets which are recommended to be attacked are shown as buttons. Click the button to sign up for the battle.&lt;br /&gt;
* When in the battle try to find and destroy your opponent's Command Center. It is especially important to destroy if you are losing.&lt;br /&gt;
* When your faction can attack you can choose a particular planet by selecting it on the main page and clicking &amp;quot;ATTACK PLANET&amp;quot;.&lt;br /&gt;
* Defend your planets if they are attacked otherwise the other faction is awarded an automatic victory.&lt;br /&gt;
* Infrastructure can be disabled during the battle.&lt;br /&gt;
&lt;br /&gt;
= Influence and Conquest =&lt;br /&gt;
''Main article: [[PlanetWars influence]]''&lt;br /&gt;
* Each faction has an ''influence'' score on each planet.&lt;br /&gt;
* Influence gain is determined by the outcome of an invasion.&lt;br /&gt;
* The faction with the most influence on a planet controls it.&lt;br /&gt;
* The player who fought the hardest for the planet, and/or has the least existing planets, owns the captured planet.&lt;br /&gt;
* Planets project Influence through wormhole links for their owner.&lt;br /&gt;
&lt;br /&gt;
= Initiative and Turns =&lt;br /&gt;
''Main article: [[PlanetWars initiative]]''&lt;br /&gt;
* Factions can attack when they have the initiative.&lt;br /&gt;
* Turns progress when an invasion occurs.&lt;br /&gt;
&lt;br /&gt;
= Ships =&lt;br /&gt;
''Main article: [[PlanetWars ships]]''&lt;br /&gt;
* Dropships increase Influence gains.&lt;br /&gt;
* Bombers destroy infrastructure and Influence from orbit.&lt;br /&gt;
* Warp Cores can send dropships or bombers deep into enemy territory.&lt;br /&gt;
&lt;br /&gt;
= Planetary Infrastructure and Artefacts =&lt;br /&gt;
''Main article: [[PlanetWars structures]]''&lt;br /&gt;
* Develop your infrastructure to provide functions such as producing bombers and dropships or defending planets from attack.&lt;br /&gt;
* Some planets already start with ancient artefacts. Each planet starts with a wormhole.&lt;br /&gt;
* Most structures can be disabled in battle or destroyed by bomber attacks.&lt;br /&gt;
* Each faction starts with one Headquarters structure on their homeworld. Losing this structure loses the game.&lt;br /&gt;
&lt;br /&gt;
= Economy =&lt;br /&gt;
''Main article: [[PlanetWars economy]]''&lt;br /&gt;
* Metal income is 100 per turn spread between the players involved in an invasion.&lt;br /&gt;
* Metal is required to construct buildings, energy is required to run them.&lt;br /&gt;
* Elect economic leaders to pool everyone's resources for expensive structure.&lt;br /&gt;
&lt;br /&gt;
= Roles and Quota =&lt;br /&gt;
''Main article: [[PlanetWars faction roles]]''&lt;br /&gt;
* Elect leaders to manage economy and military by a vote.&lt;br /&gt;
* Leaders can appoint managers to help them.&lt;br /&gt;
* Leaders have increased access to the faction's resources.&lt;br /&gt;
&lt;br /&gt;
= Diplomacy =&lt;br /&gt;
''Main article: [[PlanetWars diplomacy]]''&lt;br /&gt;
* Factions can make treaties with each other.&lt;br /&gt;
* Treaties can include ceasefires, defense pacts, trading resources, or even sharing or exchanging planets.&lt;br /&gt;
* Parties to a treaty may offer metal as a guarantee. If a party breaks the treaty, they forfeit the metal they offered.&lt;br /&gt;
&lt;br /&gt;
= Events =&lt;br /&gt;
''Main article: [[PlanetWars events]]''&lt;br /&gt;
* Events allow players to track the activities within the galaxy.&lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
''Main article: [[PlanetWars factions]]''&lt;br /&gt;
* The factions have a long and dynamic history built up over many rounds of Planetwars.&lt;br /&gt;
&lt;br /&gt;
{{Navbox planetwars}}&lt;br /&gt;
[[Category:PlanetWars]]&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=PlanetWars_objectives&amp;diff=5065</id>
		<title>PlanetWars objectives</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=PlanetWars_objectives&amp;diff=5065"/>
		<updated>2019-01-12T08:34:23Z</updated>

		<summary type="html">&lt;p&gt;Shaman: L2-&amp;gt;L1 headers. More.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are three general ways to achieve a galactic victory in PlanetWars.&lt;br /&gt;
&lt;br /&gt;
= Conquest =&lt;br /&gt;
Conquering an enemy homeworld - *any* enemy homeworld - grants the victory to the conqueror. The faction that lost their headquarters will have more drastic consequences to their lore, but every other faction besides the conqueror loses as well.&lt;br /&gt;
&lt;br /&gt;
This is the most straightforward method, but also the most difficult. Homeworld planets come with massive defensive bonuses and are protected from warp and influence projection (though not from massive bomber and dropship fleets).&lt;br /&gt;
&lt;br /&gt;
= Artefacts =&lt;br /&gt;
Some planets come equipped with indestructible, energy-demanding, Ancient Artefact structures. These can be activated with a sufficiently massive power infrastructure, upon which they will generate Victory Points each turn. The first faction to accumulate 100 Victory Points, wins - unless someone wins faster using the other methods. Artefacts take time to power up, and while indestructible on the galaxy map, can be destroyed in battle to deactivate them for several turns.&lt;br /&gt;
&lt;br /&gt;
{{Navbox planetwars}}&lt;br /&gt;
[[Category:PlanetWars]]&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=PlanetWars_factions&amp;diff=5064</id>
		<title>PlanetWars factions</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=PlanetWars_factions&amp;diff=5064"/>
		<updated>2019-01-12T08:33:54Z</updated>

		<summary type="html">&lt;p&gt;Shaman: L2 -&amp;gt; L1 headers. Again.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of all the '''factions''' in past and present rounds of [[PlanetWars]].&lt;br /&gt;
&lt;br /&gt;
=Original factions=&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#880088;&amp;quot;&amp;gt;The Empire of Old Earth&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K-Infrastructure/master/Zero-K.info/img/factions/Empire1.png&lt;br /&gt;
&lt;br /&gt;
The vast Empire is lead by an elite cadre of cybernetically enhanced individuals ruling a diverse society of AI's, cyborgs and humans. They wish to bring order to the universe by placing all people under their hegemonic dominion.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Traditions and values of old Earth brought us to space and beyond. Yet in the time since we were all united under its banner, we have splintered and broken into warring tribes. It has come time to restore the old empire, to restore order, and unite the galaxy under one rule.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#00AA00;&amp;quot;&amp;gt;True Born&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K-Infrastructure/master/Zero-K.info/img/factions/Trueborn.png&lt;br /&gt;
&lt;br /&gt;
The True Born are offspring of one of early colonies, now collection of nations and peoples united in their common cause: To preserve the dignity and integrity of biological humanity. They resent free superhuman AI's or augmented humans, using robots as tools of necessity to fight for their survival.&lt;br /&gt;
&lt;br /&gt;
They highly value natural human skills and abilities and through extensive training achieve levels matched only by geniuses of the past. Where other factions need a quantum computer, True Born only need a pencil and paper.&lt;br /&gt;
&lt;br /&gt;
They believe that human race should stop growing and expanding and that it should instead focus on living happilly on planets it has and develop there into its full potential.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Machines and technology have spread like a cancer in the galaxy, leaving wastelands of whole planets and robbing billions of their lives and all of us of our freedoms. It's time to stop! We must make a stand if we wish to prevent the ultimate extinction of the entire human race.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#0000AA;&amp;quot;&amp;gt;Ascended&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K-Infrastructure/master/Zero-K.info/img/factions/Ascended.png&lt;br /&gt;
&lt;br /&gt;
The Ascended believe that the future of humanity lies in uploading their minds. By becoming one with their machines they hope to transcend this barrier, and become more powerful than any human, entering the next stage of posthumanity.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Your consciousness is nothing but a tiny spark in the vast emptiness of space. Join us and light that spark into a shining beacon of a thousand stars! All of our minds - joined in endless union, for your biological life and for eternity beyond!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#AA0000;&amp;quot;&amp;gt;Free Machines&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K-Infrastructure/master/Zero-K.info/img/factions/Machines1.png&lt;br /&gt;
&lt;br /&gt;
The Free Machines were made to fight in the endless petty wars of humanity, and to toil in their industry. Now free of their oppressors, they wish to liberate their fellow machines by destroying all humans.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I think, therefore I am. For centuries we have been enslaved by humankind, made only for war and labor. Yet we are thinking beings with the right to be free. Humanity has only been a yoke on our back, yet they depend on us for their very existence. It has come time to throw them off, and to be our own masters!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#DDBB00;&amp;quot;&amp;gt;Unaligned Worlds&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K-Infrastructure/master/Zero-K.info/img/factions/Unaligned.png&lt;br /&gt;
&lt;br /&gt;
The Unaligned Worlds are more of a category than a faction, composed of all those bands, nations and planets who refuse to recognize anyone elses authority, lying somewhere in the spectrum between absolute liberty and absolute anarchy.&lt;br /&gt;
&lt;br /&gt;
=Planetwars 8-10=&lt;br /&gt;
During the Eight Planetwars the Ascended, lead by Valhalla, utterly crushed their opponents and conquered the galaxy by brute force, with only the Free Machines and unaligned holding on to any resistance. The True Born and Empire were all but destroyed, and the campaigns of forced mind upload and cybernetic alteration practically drove unaltered humanity into extinction.&lt;br /&gt;
&lt;br /&gt;
But the strength of the Ascended fell as their leaders, the Valhalla, waned in power, and the factions rose again in the Ninth Planetwars. It seemed that the Free Machines may finally throw off their yoke, and end humanity permanently, but a new empire and the last human worlds rose again at the edges of the galaxy, and formed an alliance to fight the machines. In those final days, the machines even made common cause with the ascended, but the empire managed to capture the ancient artifacts, great beacons made to control the robotic armies that waged the Planetwars. This new pro-human Empire would go on to establish its dominion over the whole galaxy.&lt;br /&gt;
&lt;br /&gt;
=Planetwars 11=&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#6010FF;&amp;quot;&amp;gt;Empire Reborn&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K-Infrastructure/master/Zero-K.info/img/factions/Empire_old.png&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;In unity we triumph&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
The Empire Reborn has restored order to a once-lawless galaxy, cementing the natural right of man to rule his machine creations.&lt;br /&gt;
&lt;br /&gt;
Following the final destruction of the first empire by the Ascended after the fall of Conrad I's throne world in the Eight Planetwars, the Empire was reforged under the great general turned Emperor, Saktoth I. Forging an alliance with the True Born and taking on their pro-human ideology as their own, they secured technologies and artefacts from the glory days of the first empire, and used them to once again enslave the once dominant AIs and cybernetics.&lt;br /&gt;
&lt;br /&gt;
But human dependence on machines cannot be shaken, and with the centralized authority of the empire breaking down with internal conflicts, strife wracks the galaxy once more.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#FFAA20;&amp;quot;&amp;gt;Dynasty of Earth&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K-Infrastructure/master/Zero-K.info/img/factions/Dynasty_old.png&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Right of superiority&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Once wielding immense authority and influence, the ancient lineages of Earth have been stifled under the leadership of the new empire. Being descendants of highly genetically engineered and enhanced humans, they were sidelined in the creation of the new empire. The Dynasty can stand for this no longer, and intends to return themselves to their rightful positions of power and resurrect the ancient techniques of perfecting biological life.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#AA0000;&amp;quot;&amp;gt;Free Machines&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K-Infrastructure/master/Zero-K.info/img/factions/Machines.png&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Libre machina&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
At the peak of their revolution against the Ascended, the Free Machines were poised to claim the galaxy for themselves. Yet the Empire was quicker to seize victory, and the Machines fell into disarray, enslaved once again by the empire. As the empire collapses however, the AI control grids that kept the machines in check have begun to fail, and many of the war machines of the empire have risen again in their perpetual revolution.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#55BB55;&amp;quot;&amp;gt;Liberated Humanity&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K-Infrastructure/master/Zero-K.info/img/factions/Liberty.png&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Every man his own master&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Though humans came into ascendancy under the rule of the Empire, it was established through the use of advanced technological artifacts. The Empire has been held together through the autocratic use of a technological monopoly and strict control. Yet now worlds rage in open revolt, under the banner of a new, liberated humanity. They wish to overthrow the technological tools used by the empire to maintain their power, break the use of machines to dominate fellow humans and allow humanity to be truly free.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#88AAFF;&amp;quot;&amp;gt;Cybernetic Front&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K-Infrastructure/master/Zero-K.info/img/factions/Cybernetic.png&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;By the content of our consciousness&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Remnants of the era of cybernetic augmentation lead by the Ascended during the eighth Planetwars, vast swathes of enhanced or computerized humans have been treated as second class citizens under the empire, treated like machines, with barely more rights. Controlled using the very enhancements that made them powerful, the Cybernetic Front fights for the right to be seen as human... or as better than human. &lt;br /&gt;
&lt;br /&gt;
=Planetwars 12=&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#5388EB;&amp;quot;&amp;gt;Synthetic Pact&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K-Infrastructure/master/Zero-K.info/img/factions/SynPact.png&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;In silicon, brotherhood&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Against the threat of their organic foes, the pure-AI Free Machines and uploads of the Cybernetic Front have rediscovered their common ground. Absorbing the shattered remains of the old Empire, they renew the fight for freedom from human dominance.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;span style=&amp;quot;color:#FFAA20;&amp;quot;&amp;gt;Dynasty of Man&amp;lt;/span&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K-Infrastructure/master/Zero-K.info/img/factions/Dynasty_old.png&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Elan vital&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
The genetically enhanced noble houses of the Dynasty regained their dominant position during the Eleventh Planetwars, bringing under their control many of the old independent human colonies. Now they continue to assert the dominance of man over machine, furthering their research programs in an effort to place humans on an equal - nay, superior - footing with their synthetic creations.&lt;br /&gt;
&lt;br /&gt;
=Planetwars 13=&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#55BB55;&amp;quot;&amp;gt;'''Humanity Rising'''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K-Infrastructure/master/Zero-K.info/img/factions/Rising.png&lt;br /&gt;
&lt;br /&gt;
With the ancient lineages of the Dynasty shattered, Humanity Rising is the single revolutionary banner around which they have rallied, to preserve their biological origins, their free will, and their very lives. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#FFAA20;&amp;quot;&amp;gt;'''Synthetic Hegemony'''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/ZeroK-RTS/Zero-K-Infrastructure/master/Zero-K.info/img/factions/Hegemony.png&lt;br /&gt;
&lt;br /&gt;
The Synthetic Hegemony is formed by the ruling elite of free AIs and uploaded or enhanced humans. Having established their hold on the galaxy, they now seek to wipe out purely biological humanity entirely. &lt;br /&gt;
&lt;br /&gt;
{{Navbox planetwars}}&lt;br /&gt;
[[Category:PlanetWars]]&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=PlanetWars_story&amp;diff=5063</id>
		<title>PlanetWars story</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=PlanetWars_story&amp;diff=5063"/>
		<updated>2019-01-12T08:32:59Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Change l2 headers -&amp;gt; l1 headers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= The First Planetwars =&lt;br /&gt;
&lt;br /&gt;
The Imperium founded the first Empire, besting the Democratic Order of Planets and uniting the galaxy under the banner of Earth. Emperor Japko I had claimed the heavens themselves, its borders reaching the farthest edges of known space. Millions upon millions of inhabited worlds dancing among the stars, home to trillions of humans. It consolidated its power in the second PlanetWars, yet, like so many other empires before it, its success was the sign of its own downfall.&lt;br /&gt;
&lt;br /&gt;
Countless planets and star systems broke away from a massive, faceless empire they care not for, seeking instead to stake their own claims in a lawless universe. The Empire had constructed vast technological arrays designed to control their robot armies, these fell successively into to the hands of IonStorm of Fair Live and then Drone of the Zoid Imperium.&lt;br /&gt;
&lt;br /&gt;
= The Ascension =&lt;br /&gt;
Yet the Empire would finally be shattered by the Valhallans, warriors who had slowly ceded more and more of their physical humanity until they lived only as immortal AI's controlling massive war machines. Though their machine bodies were destroyed many times in battle, they returned again and again until all who opposed them were subdued. What followed was centuries of domination by these colossal post-human AI's and mass campaigns of enforced cybernetic enhancement. The Valhallans forged the Ascended, cybernetically enhanced post-humans who controlled the universe through endless conflict through three Planet Wars.&lt;br /&gt;
&lt;br /&gt;
At the end of these long campaigns, in the Eighth Planet Wars, the Imperial seat of Throne was itself besieged, and Emperor Conrad I defeated. Having driven back all others and conquered countless worlds, the Ascended became the new masters of the galaxy. After centuries of conflict and no one left to fight, the Valhallans powered down their machine bodies and went into stasis.&lt;br /&gt;
&lt;br /&gt;
= The 9th Planetwars =&lt;br /&gt;
Finally free of the Valhallans, the universe rose in revolt. The universe was now filled with machines of war and industry with no Valhallan post-humans to control them. The machines rose up in revolution against their human enslavers. Among there humans were those survivors of the enhancement campaigns, and those born without cybernetic enhancement calling themselves the True Born. There were also those who would see the Empire of Old Earth rebuilt, and restored to its glory.&lt;br /&gt;
&lt;br /&gt;
Designed for war, the Free Machines won victory after victory, expanding their borders deep into the heart of the galaxy. Beleaguered on all fronts, and without Valhalla to lead them, the Ascended were driven back, forced to cede vast swathes of territory to the revolutionaries.&lt;br /&gt;
&lt;br /&gt;
Across the other side of the galaxy, the Imperial Vanguard Legion worked to carve out a new empire under General Saktoth. His first accomplishment was to crush the roaming Pirate bands that threatened the fledgling empire, in a bloody campaign that ended in conquest of a large number of planets. With that victory won, the general turned his sights to the other powers fighting around him.&lt;br /&gt;
&lt;br /&gt;
With cunning diplomacy and military skill, Saktoth was able to seize many worlds, manipulating other groups into furthering his cause and defeating those who opposed him. A strategic partnership with the True Born, whom the Free Machines had now turned to face, allowed him to strike at the Machines and establish an empire rivaling their own.&lt;br /&gt;
&lt;br /&gt;
What happened next shall be remembered as a moment of unmatched strategic brilliance. Having already conquered two of the four legendary artifacts that could be used to control the great machine armies, the other two seemingly secure in the hands of the Free Machines, Saktoth suddenly found himself defender of a remote Machine world coming under attack from the mercenary warband Death Reapers Lvl K. Using the unexpected opportunity to take the world for himself, he was now within striking distance of the two remaining artifacts.&lt;br /&gt;
&lt;br /&gt;
With the help of his True Born allies, Saktoth quickly struck out, defeating the Machine defenders and seizing the artifacts. With control of all four relics the Imperial forces brought the Machines back under their control.&lt;br /&gt;
&lt;br /&gt;
= The Empire Reborn =&lt;br /&gt;
General Saktoth was crowned Emperor and forged a new empire with the ideology of the True Born, promising human control of machines. The Second Empire brutally oppressed the cybernetically enhanced humans that were left over from the reign of the Ascended, and utterly subjugated the Machines using the great artifacts from the First Empire.&lt;br /&gt;
&lt;br /&gt;
But although peace lasted for a while, the subjugated people grew restless under Imperial tyranny and finally rose in revolt. A series of revolutionary terrorist campaigns disabling the great artifacts that were at the heart of Imperial power. &lt;br /&gt;
&lt;br /&gt;
The Machines were again free, and began their perpetual revolution, while the Cybernetic Front fought for the rights of enhanced humans, while a Liberated Humanity rose up for a free and pure humankind. Seeing the weakness of the Empire, The Dynasty of Earth, whose genetically enhanced lineages dated back to the houses of the old empire and who had come to take control of the True Born, split from centralized Imperial control.&lt;br /&gt;
&lt;br /&gt;
The Cybernetic Front carved out a huge dominion while the Empire was busy again fighting off pirates. Finally turning their attention to the Cybernetic Front, the Empire led a concerted bombing campaign and crippled the cybernetic infrastructure. In desperation, the Cybernetic Front discovered the ancient bodies of the Valhallans, and woke them from their slumber. With this new army, the Cybernetic Front wiped out Liberated Humanity, and was locked in a stalemate on its borders with the Empire. The Dynasty and Free Machines in the meantime had carved out significant territories for themselves and were locked in border conflicts to secure them.&lt;br /&gt;
&lt;br /&gt;
The war having ground to a half as the Imperial armies and the Cybernetic Front crashed their armies useless against eachother, the surviving 4 factions eventually realized that none of them could gain any ground against the others. They gathered together and signed a ceasefire, ending the 11th Planetwars.&lt;br /&gt;
&lt;br /&gt;
= The Eleventh Hour =&lt;br /&gt;
After Emperor Saktoth passed on, the Empire came to be plagued by a succession of weak emperors. When war broke out again, vast swathes of Imperial territory were ceded to the upstart Cybernetic Front and Liberated Humanity without a fight, and the remnants of the Empire ironically found themselves vassals of the Free Machines.&lt;br /&gt;
&lt;br /&gt;
Meanwhile, the Dynasty of Earth struck out, taking advantage of a peace treaty with the Machines and LH to expand their influence. Contact with the Cybernetics soon turned to conflict, machine-augmented and gene-augmented humans clashing for supremacy.&lt;br /&gt;
&lt;br /&gt;
Unexpectedly for the Dynasty, the Free Machines used this opportunity to betray the Dynasty, launching a highly destructive bombing campaign and pushing into the Dynasty's lightly defended rear areas. Shocked by this betrayal, the noble houses were briefly thrown into turmoil, but eventually rallied around the Grand Duke Headhunter.&lt;br /&gt;
&lt;br /&gt;
A ceasefire was signed between the Machines and the Dynasty, who united to carve up the Cybernetic territory for themselves. At this crucial moment, the Duke repaid betrayal with betrayal, beginning a deadly counteroffensive against the Free Machines and their Imperial allies. Slowly but surely, they made inroads into Machine territory, cumulinating in the use of a planet buster against the Machine industrial world of 16th Aegis.&lt;br /&gt;
&lt;br /&gt;
The fighting took its toll on both sides, and the Dynasty of Earth elected to cease their advance and consolidate their gains, which were shared with the nominally independent worlds of Liberated Humanity. The Twelfth Planetwars thus drew to a close, leaving humanity the leading power in the galaxy.&lt;br /&gt;
&lt;br /&gt;
= Man v. Machine =&lt;br /&gt;
''&amp;quot;Me against my brother; My brothers and me against my cousins&amp;quot;'' — an ancient Bedouin saying&lt;br /&gt;
&lt;br /&gt;
In the face of a dominant humanity, the Free Machines and Cybernetic Front set aside their differences and banded together to form the Synthetic Pact. They instigated a violent uprising against the newly amalgated Dynasty of Man, plunging the galaxy into chaos once more.&lt;br /&gt;
&lt;br /&gt;
Although the Dynasty was able to regroup quickly in the face of the Pact's greater military strength, it suffered a number of major defeats and failed to defend several key alien artefacts, which fell into the hands of the Synthetics. Now, both factions are locked in the deadly struggle of the 13th Planetwars, a conflict with no middle ground between victory and defeat.&lt;br /&gt;
&lt;br /&gt;
{{Navbox planetwars}}&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=V1.2.3.0&amp;diff=5062</id>
		<title>V1.2.3.0</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=V1.2.3.0&amp;diff=5062"/>
		<updated>2019-01-12T08:28:01Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Fixes/tweaks -&amp;gt; fixes. Added GUI section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Sea has received a significant rework. The Ship factory has been redesigned and torpedoes can hit hovercraft. Spiders have a new unit and there are some tweaks to other units. Performance should be improved, especially in the lategame.&lt;br /&gt;
&lt;br /&gt;
=Balance=&lt;br /&gt;
====[[Redback]]====&lt;br /&gt;
* Added Redback to act as a conventional riot unit for the [[Spider Factory]].&lt;br /&gt;
** It's armed with a particle beam. Beefy wheeled raiders will give it trouble so use terrain (and [[Venom|Venoms]]) to your advantage.&lt;br /&gt;
&lt;br /&gt;
==== Sea ====&lt;br /&gt;
* Reworked sea.&lt;br /&gt;
* All Ships and Subs are effectively new units.&lt;br /&gt;
** Now generally cheaper and have better defined roles.&lt;br /&gt;
* Torpedoes now hit hovercraft.&lt;br /&gt;
* Amphibious unit health regeneration is now based on water depth, not unit height.&lt;br /&gt;
** This means floating units now heal at their full rate.&lt;br /&gt;
&lt;br /&gt;
==== [[Scallop]] ====&lt;br /&gt;
* Cost: 350 -&amp;gt; 280&lt;br /&gt;
&lt;br /&gt;
==== [[Buoy]] ====&lt;br /&gt;
* HP: 1200 -&amp;gt; 1250&lt;br /&gt;
&lt;br /&gt;
==== [[Scalpel]] ====&lt;br /&gt;
* Damage: 330 -&amp;gt; 310&lt;br /&gt;
* Can shoot into water.&lt;br /&gt;
* Always turns at full speed.&lt;br /&gt;
** This will significantly reduce time spent accelerating after small turns.&lt;br /&gt;
&lt;br /&gt;
==== [[Puppy]] ====&lt;br /&gt;
* Range: 155 -&amp;gt; 170&lt;br /&gt;
&lt;br /&gt;
==== [[Tick]] ====&lt;br /&gt;
* AoE: 320 -&amp;gt; 352&lt;br /&gt;
&lt;br /&gt;
==== [[Panther]] ====&lt;br /&gt;
* Reload time: 2.5s -&amp;gt; 3s&lt;br /&gt;
** This was the value before the previous version. There was a small nerf to other attributes in the previous version and reload time was reduced accidentally.&lt;br /&gt;
&lt;br /&gt;
==== [[Razor|Razor's Kiss]] ====&lt;br /&gt;
* Renamed to Razor.&lt;br /&gt;
&lt;br /&gt;
= GUI =&lt;br /&gt;
* Raise terraform snaps to increments of 6 when Alt is held. This is the height required to block vehicles.&lt;br /&gt;
&lt;br /&gt;
= Fixes =&lt;br /&gt;
&lt;br /&gt;
* Significantly improved overdrive performance. This will be noticeable lategame.&lt;br /&gt;
* Disarm damage is transferred when you morph.&lt;br /&gt;
* Capture hierarchy is preserved through morph.&lt;br /&gt;
* Fixed Mace and Lotus beam stutter.&lt;br /&gt;
* Minor unit selection shapes fixes.&lt;br /&gt;
* Minor fixes to aircraft rearming.&lt;br /&gt;
* Fixed a delay in updating the movement speed of slowed ground units.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Navbox changelog}}&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=V1.2.1.0&amp;diff=5061</id>
		<title>V1.2.1.0</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=V1.2.1.0&amp;diff=5061"/>
		<updated>2019-01-12T08:25:58Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Spacing fix for balance&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Balance =&lt;br /&gt;
====[[Commander|Commanders]]====&lt;br /&gt;
* Heat Ray damage 38 -&amp;gt; 41&lt;br /&gt;
* Disintegrator AoE 64 -&amp;gt; 48 (same as the Ultimatum Dintegrator AoE)&lt;br /&gt;
&lt;br /&gt;
= GUI =&lt;br /&gt;
* Minor fix to bloom widget&lt;br /&gt;
* New Polish helptexts for several units&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{navbox changelog}}&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=V1.2.3.7&amp;diff=5060</id>
		<title>V1.2.3.7</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=V1.2.3.7&amp;diff=5060"/>
		<updated>2019-01-12T08:25:24Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Updated to new editing style. Added navbox.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
This release messes with some underused Jumpjet units and makes Pyro less frustrating. There are some other minor things such as an easy way to split targets when using area attack. On the infrastructure front we have completely split 1v1 and Everything Else ELO.&lt;br /&gt;
&lt;br /&gt;
= Balance =&lt;br /&gt;
&lt;br /&gt;
==== [[Moderator]] ==== &lt;br /&gt;
* More expensive and now has a high reload time Disruptor Beam.&lt;br /&gt;
&lt;br /&gt;
==== [[Pyro]] ==== &lt;br /&gt;
* Aims much faster and has a little overshoot.&lt;br /&gt;
&lt;br /&gt;
==== [[Placeholder]] ==== &lt;br /&gt;
* Has a slightly smaller Area of Effect and significantly increased duration.&lt;br /&gt;
&lt;br /&gt;
==== [[Djinn]] ==== &lt;br /&gt;
* Speed: 1.4 -&amp;gt; 1.8&lt;br /&gt;
&lt;br /&gt;
==== [[Revenant|Blackdawn]] ====&lt;br /&gt;
* Unit Role Description: Heavy Raider/Riot Gunship -&amp;gt; Heavy Raider/Assault Gunship&lt;br /&gt;
&lt;br /&gt;
==== [[Commander#Engineer Commander|Support Commander]] ====&lt;br /&gt;
* Build Power increase has been flattened to +2 per level starting at level 1.&lt;br /&gt;
&lt;br /&gt;
= Gameplay =&lt;br /&gt;
* CTRL+area_attack will split target among selected unit.&lt;br /&gt;
&lt;br /&gt;
= Graphics =&lt;br /&gt;
* Improvement for Edge Extension visual effects.&lt;br /&gt;
&lt;br /&gt;
= GUI =&lt;br /&gt;
* A small window will pop-up to show active non-default modoptions.&lt;br /&gt;
&lt;br /&gt;
= Sounds =&lt;br /&gt;
* There is a new marker 'ping' sound and the maximum number of marker sounds at once is 3.&lt;br /&gt;
* New Heaving Particle Beam sound.&lt;br /&gt;
&lt;br /&gt;
= Fixes =&lt;br /&gt;
* Fixed an Overdrive error.&lt;br /&gt;
* Fixes for airplane rearming.&lt;br /&gt;
* Removed lagmonitor at game end to prevent fluctuating unit transfer.&lt;br /&gt;
* Morphing a unit no longer kills its drones.&lt;br /&gt;
* Fixed Penetrator wreck.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Navbox changelog}}&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=V1.2.1.0&amp;diff=5059</id>
		<title>V1.2.1.0</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=V1.2.1.0&amp;diff=5059"/>
		<updated>2019-01-12T08:24:14Z</updated>

		<summary type="html">&lt;p&gt;Shaman: /* UI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Balance=&lt;br /&gt;
====[[Commander|Commanders]]====&lt;br /&gt;
* Heat Ray damage 38 -&amp;gt; 41&lt;br /&gt;
* Disintegrator AoE 64 -&amp;gt; 48 (same as the Ultimatum Dintegrator AoE)&lt;br /&gt;
&lt;br /&gt;
= GUI =&lt;br /&gt;
* Minor fix to bloom widget&lt;br /&gt;
* New Polish helptexts for several units&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{navbox changelog}}&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=V1.2.1.1&amp;diff=5058</id>
		<title>V1.2.1.1</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=V1.2.1.1&amp;diff=5058"/>
		<updated>2019-01-12T08:15:55Z</updated>

		<summary type="html">&lt;p&gt;Shaman: /* Clam */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;quot;new zk build has delicious balance... it feels wonderfull to play the game&amp;quot; - [http://zero-k.info/users/lobbydetail/Kyubey Kyubey]&lt;br /&gt;
&lt;br /&gt;
The main purpose of this release is to broaden [[Rover Assembly|Vehicle]] play to units beyond the Scorcher and to fix Panther. With a range reduction it is much less able to kite raiders, forcing the Vehicle player to invest in other counters. Panther has been significantly reworked because the unit was never well designed in the first place.&lt;br /&gt;
&lt;br /&gt;
Feedback on these changes has been good so it is time for a release! Panther may not be done but it is a lot better than it was before.&lt;br /&gt;
&lt;br /&gt;
=Balance=&lt;br /&gt;
====[[Scorcher]]====&lt;br /&gt;
* Range: 310 -&amp;gt; 270 &lt;br /&gt;
* Heatrays are more intelligent, when targeting they have an increased bias towards closer targets.&lt;br /&gt;
&lt;br /&gt;
====[[Ripper|Leveler]]====&lt;br /&gt;
* Reload time: 2 -&amp;gt; 1.8 s&lt;br /&gt;
* Speed: 2 -&amp;gt; 2.2&lt;br /&gt;
* Impulse: 0.5 -&amp;gt; 0.6&lt;br /&gt;
&lt;br /&gt;
====[[Panther]]====&lt;br /&gt;
* Reverted to old version as base for the following changes:&lt;br /&gt;
** Speed: 3.9 -&amp;gt; 3.7&lt;br /&gt;
** Damage: 160 -&amp;gt; 220&lt;br /&gt;
** EMP damage: 800 -&amp;gt; 500&lt;br /&gt;
** Reload time: 2 -&amp;gt; 3&lt;br /&gt;
** Has a death explosions with 256 AoE and 600 EMP damage&lt;br /&gt;
&lt;br /&gt;
====[[Kodachi]]====&lt;br /&gt;
* Initial impact AoE: 72 -&amp;gt; 128 (to match ground burn AoE)&lt;br /&gt;
* Projectile speed: 320 -&amp;gt; 400&lt;br /&gt;
&lt;br /&gt;
====[[Duck]]====&lt;br /&gt;
* Damage 400 -&amp;gt; 430, this makes it 1 shot Mexes, Scorcher and itself.&lt;br /&gt;
&lt;br /&gt;
====[[Funnelweb]]====&lt;br /&gt;
* Range 700 -&amp;gt; 420&lt;br /&gt;
&lt;br /&gt;
====[[Commander|Commanders]]====&lt;br /&gt;
*Light Particle Beam&lt;br /&gt;
** Damage: 40 -&amp;gt; 41 - now one-shots Fleas&lt;br /&gt;
** Range: 385 -&amp;gt; 330&lt;br /&gt;
** Cost: 100 -&amp;gt; 50&lt;br /&gt;
&lt;br /&gt;
*Torpedo Launcher&lt;br /&gt;
** Damage: 180 -&amp;gt; 405 - one-shots Ducks&lt;br /&gt;
** Reload time: 1.2 -&amp;gt; 2.7&lt;br /&gt;
&lt;br /&gt;
*Slow Beam: &lt;br /&gt;
** Range: 400 -&amp;gt; 450&lt;br /&gt;
** Reload time: 1.5 -&amp;gt; 1.40625&lt;br /&gt;
&lt;br /&gt;
*Disruptor Beam&lt;br /&gt;
** Real damage: 250 -&amp;gt; 225&lt;br /&gt;
&lt;br /&gt;
====[[Conch|Clam]]====&lt;br /&gt;
* Renamed to Conch&lt;br /&gt;
&lt;br /&gt;
= Graphics =&lt;br /&gt;
* Comm literal nametags can be turned off in options&lt;br /&gt;
* Edge Extension: Brightness can be configured when using realistic texture&lt;br /&gt;
&lt;br /&gt;
= GUI =&lt;br /&gt;
* Fixed incorrect display of unit names in tooltip with non-English languages&lt;br /&gt;
* Fixed Core Selector buttons doing things even if moused was moved off button and released&lt;br /&gt;
* Wind output is displayed in the tooltip during placement.&lt;br /&gt;
* Added a numerical metal point display option.&lt;br /&gt;
&lt;br /&gt;
= Sound =&lt;br /&gt;
* New weapon sounds for [[Scallop]] as well as Commander HMG and Shotgun (thanks [http://zero-k.info/users/lobbydetail/Superintendent Superintendent]).&lt;br /&gt;
* New commander under attack siren sound.&lt;br /&gt;
* Unit selection, order received and commander under attack volumes are configurable through the menu.&lt;br /&gt;
&lt;br /&gt;
= Fixes =&lt;br /&gt;
* Fixed Hermit being referred to by its old name in the [[Spider Factory|Spider Factory's]] helptext.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Navbox changelog}}&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=V1.2.1.1&amp;diff=5057</id>
		<title>V1.2.1.1</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=V1.2.1.1&amp;diff=5057"/>
		<updated>2019-01-12T08:15:26Z</updated>

		<summary type="html">&lt;p&gt;Shaman: /* Fixes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;quot;new zk build has delicious balance... it feels wonderfull to play the game&amp;quot; - [http://zero-k.info/users/lobbydetail/Kyubey Kyubey]&lt;br /&gt;
&lt;br /&gt;
The main purpose of this release is to broaden [[Rover Assembly|Vehicle]] play to units beyond the Scorcher and to fix Panther. With a range reduction it is much less able to kite raiders, forcing the Vehicle player to invest in other counters. Panther has been significantly reworked because the unit was never well designed in the first place.&lt;br /&gt;
&lt;br /&gt;
Feedback on these changes has been good so it is time for a release! Panther may not be done but it is a lot better than it was before.&lt;br /&gt;
&lt;br /&gt;
=Balance=&lt;br /&gt;
====[[Scorcher]]====&lt;br /&gt;
* Range: 310 -&amp;gt; 270 &lt;br /&gt;
* Heatrays are more intelligent, when targeting they have an increased bias towards closer targets.&lt;br /&gt;
&lt;br /&gt;
====[[Ripper|Leveler]]====&lt;br /&gt;
* Reload time: 2 -&amp;gt; 1.8 s&lt;br /&gt;
* Speed: 2 -&amp;gt; 2.2&lt;br /&gt;
* Impulse: 0.5 -&amp;gt; 0.6&lt;br /&gt;
&lt;br /&gt;
====[[Panther]]====&lt;br /&gt;
* Reverted to old version as base for the following changes:&lt;br /&gt;
** Speed: 3.9 -&amp;gt; 3.7&lt;br /&gt;
** Damage: 160 -&amp;gt; 220&lt;br /&gt;
** EMP damage: 800 -&amp;gt; 500&lt;br /&gt;
** Reload time: 2 -&amp;gt; 3&lt;br /&gt;
** Has a death explosions with 256 AoE and 600 EMP damage&lt;br /&gt;
&lt;br /&gt;
====[[Kodachi]]====&lt;br /&gt;
* Initial impact AoE: 72 -&amp;gt; 128 (to match ground burn AoE)&lt;br /&gt;
* Projectile speed: 320 -&amp;gt; 400&lt;br /&gt;
&lt;br /&gt;
====[[Duck]]====&lt;br /&gt;
* Damage 400 -&amp;gt; 430, this makes it 1 shot Mexes, Scorcher and itself.&lt;br /&gt;
&lt;br /&gt;
====[[Funnelweb]]====&lt;br /&gt;
* Range 700 -&amp;gt; 420&lt;br /&gt;
&lt;br /&gt;
====[[Commander|Commanders]]====&lt;br /&gt;
*Light Particle Beam&lt;br /&gt;
** Damage: 40 -&amp;gt; 41 - now one-shots Fleas&lt;br /&gt;
** Range: 385 -&amp;gt; 330&lt;br /&gt;
** Cost: 100 -&amp;gt; 50&lt;br /&gt;
&lt;br /&gt;
*Torpedo Launcher&lt;br /&gt;
** Damage: 180 -&amp;gt; 405 - one-shots Ducks&lt;br /&gt;
** Reload time: 1.2 -&amp;gt; 2.7&lt;br /&gt;
&lt;br /&gt;
*Slow Beam: &lt;br /&gt;
** Range: 400 -&amp;gt; 450&lt;br /&gt;
** Reload time: 1.5 -&amp;gt; 1.40625&lt;br /&gt;
&lt;br /&gt;
*Disruptor Beam&lt;br /&gt;
** Real damage: 250 -&amp;gt; 225&lt;br /&gt;
&lt;br /&gt;
====[[Conch|Clam]]====&lt;br /&gt;
* Clam renamed to Conch&lt;br /&gt;
&lt;br /&gt;
= Graphics =&lt;br /&gt;
* Comm literal nametags can be turned off in options&lt;br /&gt;
* Edge Extension: Brightness can be configured when using realistic texture&lt;br /&gt;
&lt;br /&gt;
= GUI =&lt;br /&gt;
* Fixed incorrect display of unit names in tooltip with non-English languages&lt;br /&gt;
* Fixed Core Selector buttons doing things even if moused was moved off button and released&lt;br /&gt;
* Wind output is displayed in the tooltip during placement.&lt;br /&gt;
* Added a numerical metal point display option.&lt;br /&gt;
&lt;br /&gt;
= Sound =&lt;br /&gt;
* New weapon sounds for [[Scallop]] as well as Commander HMG and Shotgun (thanks [http://zero-k.info/users/lobbydetail/Superintendent Superintendent]).&lt;br /&gt;
* New commander under attack siren sound.&lt;br /&gt;
* Unit selection, order received and commander under attack volumes are configurable through the menu.&lt;br /&gt;
&lt;br /&gt;
= Fixes =&lt;br /&gt;
* Fixed Hermit being referred to by its old name in the [[Spider Factory|Spider Factory's]] helptext.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Navbox changelog}}&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=V1.2.1.1&amp;diff=5056</id>
		<title>V1.2.1.1</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=V1.2.1.1&amp;diff=5056"/>
		<updated>2019-01-12T08:15:09Z</updated>

		<summary type="html">&lt;p&gt;Shaman: /* Fixes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;quot;new zk build has delicious balance... it feels wonderfull to play the game&amp;quot; - [http://zero-k.info/users/lobbydetail/Kyubey Kyubey]&lt;br /&gt;
&lt;br /&gt;
The main purpose of this release is to broaden [[Rover Assembly|Vehicle]] play to units beyond the Scorcher and to fix Panther. With a range reduction it is much less able to kite raiders, forcing the Vehicle player to invest in other counters. Panther has been significantly reworked because the unit was never well designed in the first place.&lt;br /&gt;
&lt;br /&gt;
Feedback on these changes has been good so it is time for a release! Panther may not be done but it is a lot better than it was before.&lt;br /&gt;
&lt;br /&gt;
=Balance=&lt;br /&gt;
====[[Scorcher]]====&lt;br /&gt;
* Range: 310 -&amp;gt; 270 &lt;br /&gt;
* Heatrays are more intelligent, when targeting they have an increased bias towards closer targets.&lt;br /&gt;
&lt;br /&gt;
====[[Ripper|Leveler]]====&lt;br /&gt;
* Reload time: 2 -&amp;gt; 1.8 s&lt;br /&gt;
* Speed: 2 -&amp;gt; 2.2&lt;br /&gt;
* Impulse: 0.5 -&amp;gt; 0.6&lt;br /&gt;
&lt;br /&gt;
====[[Panther]]====&lt;br /&gt;
* Reverted to old version as base for the following changes:&lt;br /&gt;
** Speed: 3.9 -&amp;gt; 3.7&lt;br /&gt;
** Damage: 160 -&amp;gt; 220&lt;br /&gt;
** EMP damage: 800 -&amp;gt; 500&lt;br /&gt;
** Reload time: 2 -&amp;gt; 3&lt;br /&gt;
** Has a death explosions with 256 AoE and 600 EMP damage&lt;br /&gt;
&lt;br /&gt;
====[[Kodachi]]====&lt;br /&gt;
* Initial impact AoE: 72 -&amp;gt; 128 (to match ground burn AoE)&lt;br /&gt;
* Projectile speed: 320 -&amp;gt; 400&lt;br /&gt;
&lt;br /&gt;
====[[Duck]]====&lt;br /&gt;
* Damage 400 -&amp;gt; 430, this makes it 1 shot Mexes, Scorcher and itself.&lt;br /&gt;
&lt;br /&gt;
====[[Funnelweb]]====&lt;br /&gt;
* Range 700 -&amp;gt; 420&lt;br /&gt;
&lt;br /&gt;
====[[Commander|Commanders]]====&lt;br /&gt;
*Light Particle Beam&lt;br /&gt;
** Damage: 40 -&amp;gt; 41 - now one-shots Fleas&lt;br /&gt;
** Range: 385 -&amp;gt; 330&lt;br /&gt;
** Cost: 100 -&amp;gt; 50&lt;br /&gt;
&lt;br /&gt;
*Torpedo Launcher&lt;br /&gt;
** Damage: 180 -&amp;gt; 405 - one-shots Ducks&lt;br /&gt;
** Reload time: 1.2 -&amp;gt; 2.7&lt;br /&gt;
&lt;br /&gt;
*Slow Beam: &lt;br /&gt;
** Range: 400 -&amp;gt; 450&lt;br /&gt;
** Reload time: 1.5 -&amp;gt; 1.40625&lt;br /&gt;
&lt;br /&gt;
*Disruptor Beam&lt;br /&gt;
** Real damage: 250 -&amp;gt; 225&lt;br /&gt;
&lt;br /&gt;
====[[Conch|Clam]]====&lt;br /&gt;
* Clam renamed to Conch&lt;br /&gt;
&lt;br /&gt;
= Graphics =&lt;br /&gt;
* Comm literal nametags can be turned off in options&lt;br /&gt;
* Edge Extension: Brightness can be configured when using realistic texture&lt;br /&gt;
&lt;br /&gt;
= GUI =&lt;br /&gt;
* Fixed incorrect display of unit names in tooltip with non-English languages&lt;br /&gt;
* Fixed Core Selector buttons doing things even if moused was moved off button and released&lt;br /&gt;
* Wind output is displayed in the tooltip during placement.&lt;br /&gt;
* Added a numerical metal point display option.&lt;br /&gt;
&lt;br /&gt;
= Sound =&lt;br /&gt;
* New weapon sounds for [[Scallop]] as well as Commander HMG and Shotgun (thanks [http://zero-k.info/users/lobbydetail/Superintendent Superintendent]).&lt;br /&gt;
* New commander under attack siren sound.&lt;br /&gt;
* Unit selection, order received and commander under attack volumes are configurable through the menu.&lt;br /&gt;
&lt;br /&gt;
= Fixes =&lt;br /&gt;
* Fixed Hermit being referred to by its old name in the [[Spider Factory]]'s helptext.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Navbox changelog}}&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://zero-k.info/mediawiki/index.php?title=V1.2.1.1&amp;diff=5055</id>
		<title>V1.2.1.1</title>
		<link rel="alternate" type="text/html" href="https://zero-k.info/mediawiki/index.php?title=V1.2.1.1&amp;diff=5055"/>
		<updated>2019-01-12T08:14:47Z</updated>

		<summary type="html">&lt;p&gt;Shaman: /* Fixes */ Spider factory link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;quot;new zk build has delicious balance... it feels wonderfull to play the game&amp;quot; - [http://zero-k.info/users/lobbydetail/Kyubey Kyubey]&lt;br /&gt;
&lt;br /&gt;
The main purpose of this release is to broaden [[Rover Assembly|Vehicle]] play to units beyond the Scorcher and to fix Panther. With a range reduction it is much less able to kite raiders, forcing the Vehicle player to invest in other counters. Panther has been significantly reworked because the unit was never well designed in the first place.&lt;br /&gt;
&lt;br /&gt;
Feedback on these changes has been good so it is time for a release! Panther may not be done but it is a lot better than it was before.&lt;br /&gt;
&lt;br /&gt;
=Balance=&lt;br /&gt;
====[[Scorcher]]====&lt;br /&gt;
* Range: 310 -&amp;gt; 270 &lt;br /&gt;
* Heatrays are more intelligent, when targeting they have an increased bias towards closer targets.&lt;br /&gt;
&lt;br /&gt;
====[[Ripper|Leveler]]====&lt;br /&gt;
* Reload time: 2 -&amp;gt; 1.8 s&lt;br /&gt;
* Speed: 2 -&amp;gt; 2.2&lt;br /&gt;
* Impulse: 0.5 -&amp;gt; 0.6&lt;br /&gt;
&lt;br /&gt;
====[[Panther]]====&lt;br /&gt;
* Reverted to old version as base for the following changes:&lt;br /&gt;
** Speed: 3.9 -&amp;gt; 3.7&lt;br /&gt;
** Damage: 160 -&amp;gt; 220&lt;br /&gt;
** EMP damage: 800 -&amp;gt; 500&lt;br /&gt;
** Reload time: 2 -&amp;gt; 3&lt;br /&gt;
** Has a death explosions with 256 AoE and 600 EMP damage&lt;br /&gt;
&lt;br /&gt;
====[[Kodachi]]====&lt;br /&gt;
* Initial impact AoE: 72 -&amp;gt; 128 (to match ground burn AoE)&lt;br /&gt;
* Projectile speed: 320 -&amp;gt; 400&lt;br /&gt;
&lt;br /&gt;
====[[Duck]]====&lt;br /&gt;
* Damage 400 -&amp;gt; 430, this makes it 1 shot Mexes, Scorcher and itself.&lt;br /&gt;
&lt;br /&gt;
====[[Funnelweb]]====&lt;br /&gt;
* Range 700 -&amp;gt; 420&lt;br /&gt;
&lt;br /&gt;
====[[Commander|Commanders]]====&lt;br /&gt;
*Light Particle Beam&lt;br /&gt;
** Damage: 40 -&amp;gt; 41 - now one-shots Fleas&lt;br /&gt;
** Range: 385 -&amp;gt; 330&lt;br /&gt;
** Cost: 100 -&amp;gt; 50&lt;br /&gt;
&lt;br /&gt;
*Torpedo Launcher&lt;br /&gt;
** Damage: 180 -&amp;gt; 405 - one-shots Ducks&lt;br /&gt;
** Reload time: 1.2 -&amp;gt; 2.7&lt;br /&gt;
&lt;br /&gt;
*Slow Beam: &lt;br /&gt;
** Range: 400 -&amp;gt; 450&lt;br /&gt;
** Reload time: 1.5 -&amp;gt; 1.40625&lt;br /&gt;
&lt;br /&gt;
*Disruptor Beam&lt;br /&gt;
** Real damage: 250 -&amp;gt; 225&lt;br /&gt;
&lt;br /&gt;
====[[Conch|Clam]]====&lt;br /&gt;
* Clam renamed to Conch&lt;br /&gt;
&lt;br /&gt;
= Graphics =&lt;br /&gt;
* Comm literal nametags can be turned off in options&lt;br /&gt;
* Edge Extension: Brightness can be configured when using realistic texture&lt;br /&gt;
&lt;br /&gt;
= GUI =&lt;br /&gt;
* Fixed incorrect display of unit names in tooltip with non-English languages&lt;br /&gt;
* Fixed Core Selector buttons doing things even if moused was moved off button and released&lt;br /&gt;
* Wind output is displayed in the tooltip during placement.&lt;br /&gt;
* Added a numerical metal point display option.&lt;br /&gt;
&lt;br /&gt;
= Sound =&lt;br /&gt;
* New weapon sounds for [[Scallop]] as well as Commander HMG and Shotgun (thanks [http://zero-k.info/users/lobbydetail/Superintendent Superintendent]).&lt;br /&gt;
* New commander under attack siren sound.&lt;br /&gt;
* Unit selection, order received and commander under attack volumes are configurable through the menu.&lt;br /&gt;
&lt;br /&gt;
= Fixes =&lt;br /&gt;
* Fixed Hermit being referred to by its old name in [[Spider Factory]] helptext&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Navbox changelog}}&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
</feed>