<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://springrts-wiki.p2004a.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Aegis</id>
	<title>Spring - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://springrts-wiki.p2004a.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Aegis"/>
	<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/wiki/Special:Contributions/Aegis"/>
	<updated>2026-11-08T22:17:25Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lobby_Development&amp;diff=10606</id>
		<title>Lobby Development</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lobby_Development&amp;diff=10606"/>
		<updated>2011-05-12T05:30:20Z</updated>

		<summary type="html">&lt;p&gt;Aegis: /* TASServer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
=Lobby client development=&lt;br /&gt;
There are currently three working public lobby clients available, and two in development.&lt;br /&gt;
&lt;br /&gt;
==SpringLobby==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;C++&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;BrainDamage&amp;lt;/font&amp;gt; &amp;amp;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;koshi&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SpringLobby is the official lobby client of spring and is bundled with the Spring engine in the installer. It uses the &#039;&#039;wxWidgets&#039;&#039; library. You can browse the sources and submit issues on its [http://springlobby.info/ website].&lt;br /&gt;
&lt;br /&gt;
==Zero-K==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;Windows&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;C#&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;Licho&amp;lt;/font&amp;gt; &amp;amp; &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;quantum&amp;lt;/font&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[https://code.google.com/p/zero-k/ Zero-K project page]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Alphalobby==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;Windows&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;C&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;Axiomatic&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alphalobby is still very much work in progress. If you still wish to use it, source available from the [http://code.google.com/p/alphalobby/source/checkout mercurial repository], binary available on the [http://springfiles.com/spring/lobby-clients/alphalobby springfiles page].&lt;br /&gt;
&lt;br /&gt;
==TASClient==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;Windows&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Delphi&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;Satirik&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can download the sources from the [http://springrts.com/svn/spring/Lobby/TASClient/ subversion repository] (svn://springrts.com/svn/spring/Lobby/TASClient/) and browse them on the [http://springrts.com/websvn/listing.php?repname=Spring&amp;amp;path=%2FLobby%2FTASClient%2F#_Lobby_TASClient_ websvn]. Latest binary version is always available here:&lt;br /&gt;
http://springrts.com/dl/tasclient/TASClientLatest.7z&lt;br /&gt;
&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=12&amp;amp;t=18999 How to compile TASClient]&lt;br /&gt;
&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;t=19014 How to customize TASClient]&lt;br /&gt;
&lt;br /&gt;
==QtLobby==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;C++&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;unmaintained&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Qt lobby is currently the fastest lobby available and is very stable. It uses the Qt library. Use its [http://code.google.com/p/qtlobby/ project page] to post issues, download or browse the sources.&lt;br /&gt;
&lt;br /&gt;
=Libraries and frameworks=&lt;br /&gt;
&lt;br /&gt;
==Spring-PythonBotFramework==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Python&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;unmaintained&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A bot framework written in python&lt;br /&gt;
[https://github.com/springlobby/spring_pythonbot_framework project page]&lt;br /&gt;
&lt;br /&gt;
==Go SpringLobbyClient==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Go&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A simple client implementation of the lobby protocol in Go.&lt;br /&gt;
[https://github.com/Agon/go-slc/ project page]&lt;br /&gt;
&lt;br /&gt;
=Lobby server development=&lt;br /&gt;
==Protocol==&lt;br /&gt;
* [http://springrts.com/dl/tasclient/ProtocolDescription.xml HTML] (may be out of date)&lt;br /&gt;
* [https://github.com/spring/LobbyProtocol/blob/master/ProtocolDescription.xml XML] (raw, always latest)&lt;br /&gt;
&lt;br /&gt;
==Download Systems==&lt;br /&gt;
* [http://springrts.com/wiki/Dev:LobbyDownloadSystems Lobby Download Systems]&lt;br /&gt;
&lt;br /&gt;
==TASServer==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Java&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;Betalord&amp;lt;/font&amp;gt; &amp;amp;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;hoijui&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The longest-running lobby server, created by Betalord, using PHP for the admin interface. You can fetch the sources through &#039;&#039;git&#039;&#039;. Details can be found on the [http://github.com/spring/TASServer development site].&lt;br /&gt;
&lt;br /&gt;
==UberServer==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Python&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;aegis&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The primary lobby server currently running on springrts.com. All protocol commands in the primary documentation should be fully-functional and compatible between both uberserver and TASServer. You can get more information and download uberserver at the [https://github.com/lunixbochs/uberserver github page]&lt;br /&gt;
&lt;br /&gt;
[[Category: Lobbies]]&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lobby_Development&amp;diff=10605</id>
		<title>Lobby Development</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lobby_Development&amp;diff=10605"/>
		<updated>2011-05-12T05:29:54Z</updated>

		<summary type="html">&lt;p&gt;Aegis: /* UberServer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
=Lobby client development=&lt;br /&gt;
There are currently three working public lobby clients available, and two in development.&lt;br /&gt;
&lt;br /&gt;
==SpringLobby==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;C++&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;BrainDamage&amp;lt;/font&amp;gt; &amp;amp;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;koshi&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SpringLobby is the official lobby client of spring and is bundled with the Spring engine in the installer. It uses the &#039;&#039;wxWidgets&#039;&#039; library. You can browse the sources and submit issues on its [http://springlobby.info/ website].&lt;br /&gt;
&lt;br /&gt;
==Zero-K==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;Windows&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;C#&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;Licho&amp;lt;/font&amp;gt; &amp;amp; &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;quantum&amp;lt;/font&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[https://code.google.com/p/zero-k/ Zero-K project page]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Alphalobby==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;Windows&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;C&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;Axiomatic&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alphalobby is still very much work in progress. If you still wish to use it, source available from the [http://code.google.com/p/alphalobby/source/checkout mercurial repository], binary available on the [http://springfiles.com/spring/lobby-clients/alphalobby springfiles page].&lt;br /&gt;
&lt;br /&gt;
==TASClient==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;Windows&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Delphi&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;Satirik&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can download the sources from the [http://springrts.com/svn/spring/Lobby/TASClient/ subversion repository] (svn://springrts.com/svn/spring/Lobby/TASClient/) and browse them on the [http://springrts.com/websvn/listing.php?repname=Spring&amp;amp;path=%2FLobby%2FTASClient%2F#_Lobby_TASClient_ websvn]. Latest binary version is always available here:&lt;br /&gt;
http://springrts.com/dl/tasclient/TASClientLatest.7z&lt;br /&gt;
&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=12&amp;amp;t=18999 How to compile TASClient]&lt;br /&gt;
&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;t=19014 How to customize TASClient]&lt;br /&gt;
&lt;br /&gt;
==QtLobby==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;C++&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;unmaintained&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Qt lobby is currently the fastest lobby available and is very stable. It uses the Qt library. Use its [http://code.google.com/p/qtlobby/ project page] to post issues, download or browse the sources.&lt;br /&gt;
&lt;br /&gt;
=Libraries and frameworks=&lt;br /&gt;
&lt;br /&gt;
==Spring-PythonBotFramework==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Python&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;unmaintained&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A bot framework written in python&lt;br /&gt;
[https://github.com/springlobby/spring_pythonbot_framework project page]&lt;br /&gt;
&lt;br /&gt;
==Go SpringLobbyClient==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Go&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A simple client implementation of the lobby protocol in Go.&lt;br /&gt;
[https://github.com/Agon/go-slc/ project page]&lt;br /&gt;
&lt;br /&gt;
=Lobby server development=&lt;br /&gt;
==Protocol==&lt;br /&gt;
* [http://springrts.com/dl/tasclient/ProtocolDescription.xml HTML] (may be out of date)&lt;br /&gt;
* [https://github.com/spring/LobbyProtocol/blob/master/ProtocolDescription.xml XML] (raw, always latest)&lt;br /&gt;
&lt;br /&gt;
==Download Systems==&lt;br /&gt;
* [http://springrts.com/wiki/Dev:LobbyDownloadSystems Lobby Download Systems]&lt;br /&gt;
&lt;br /&gt;
==TASServer==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Java&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;Betalord&amp;lt;/font&amp;gt; &amp;amp;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;hoijui&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The previous lobby server, created by Betalord, using PHP for the admin interface. You can fetch the sources through &#039;&#039;git&#039;&#039;. Details can be found on the [http://github.com/spring/TASServer development site].&lt;br /&gt;
&lt;br /&gt;
==UberServer==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Python&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;aegis&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The primary lobby server currently running on springrts.com. All protocol commands in the primary documentation should be fully-functional and compatible between both uberserver and TASServer. You can get more information and download uberserver at the [https://github.com/lunixbochs/uberserver github page]&lt;br /&gt;
&lt;br /&gt;
[[Category: Lobbies]]&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lobby_Development&amp;diff=10604</id>
		<title>Lobby Development</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lobby_Development&amp;diff=10604"/>
		<updated>2011-05-12T05:27:51Z</updated>

		<summary type="html">&lt;p&gt;Aegis: /* TASServer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
=Lobby client development=&lt;br /&gt;
There are currently three working public lobby clients available, and two in development.&lt;br /&gt;
&lt;br /&gt;
==SpringLobby==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;C++&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;BrainDamage&amp;lt;/font&amp;gt; &amp;amp;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;koshi&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SpringLobby is the official lobby client of spring and is bundled with the Spring engine in the installer. It uses the &#039;&#039;wxWidgets&#039;&#039; library. You can browse the sources and submit issues on its [http://springlobby.info/ website].&lt;br /&gt;
&lt;br /&gt;
==Zero-K==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;Windows&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;C#&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;Licho&amp;lt;/font&amp;gt; &amp;amp; &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;quantum&amp;lt;/font&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[https://code.google.com/p/zero-k/ Zero-K project page]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Alphalobby==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;Windows&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;C&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;Axiomatic&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alphalobby is still very much work in progress. If you still wish to use it, source available from the [http://code.google.com/p/alphalobby/source/checkout mercurial repository], binary available on the [http://springfiles.com/spring/lobby-clients/alphalobby springfiles page].&lt;br /&gt;
&lt;br /&gt;
==TASClient==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;Windows&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Delphi&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;Satirik&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can download the sources from the [http://springrts.com/svn/spring/Lobby/TASClient/ subversion repository] (svn://springrts.com/svn/spring/Lobby/TASClient/) and browse them on the [http://springrts.com/websvn/listing.php?repname=Spring&amp;amp;path=%2FLobby%2FTASClient%2F#_Lobby_TASClient_ websvn]. Latest binary version is always available here:&lt;br /&gt;
http://springrts.com/dl/tasclient/TASClientLatest.7z&lt;br /&gt;
&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=12&amp;amp;t=18999 How to compile TASClient]&lt;br /&gt;
&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;t=19014 How to customize TASClient]&lt;br /&gt;
&lt;br /&gt;
==QtLobby==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;C++&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;unmaintained&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Qt lobby is currently the fastest lobby available and is very stable. It uses the Qt library. Use its [http://code.google.com/p/qtlobby/ project page] to post issues, download or browse the sources.&lt;br /&gt;
&lt;br /&gt;
=Libraries and frameworks=&lt;br /&gt;
&lt;br /&gt;
==Spring-PythonBotFramework==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Python&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;unmaintained&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A bot framework written in python&lt;br /&gt;
[https://github.com/springlobby/spring_pythonbot_framework project page]&lt;br /&gt;
&lt;br /&gt;
==Go SpringLobbyClient==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Go&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A simple client implementation of the lobby protocol in Go.&lt;br /&gt;
[https://github.com/Agon/go-slc/ project page]&lt;br /&gt;
&lt;br /&gt;
=Lobby server development=&lt;br /&gt;
==Protocol==&lt;br /&gt;
* [http://springrts.com/dl/tasclient/ProtocolDescription.xml HTML] (may be out of date)&lt;br /&gt;
* [https://github.com/spring/LobbyProtocol/blob/master/ProtocolDescription.xml XML] (raw, always latest)&lt;br /&gt;
&lt;br /&gt;
==Download Systems==&lt;br /&gt;
* [http://springrts.com/wiki/Dev:LobbyDownloadSystems Lobby Download Systems]&lt;br /&gt;
&lt;br /&gt;
==TASServer==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Java&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;Betalord&amp;lt;/font&amp;gt; &amp;amp;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;hoijui&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The previous lobby server, created by Betalord, using PHP for the admin interface. You can fetch the sources through &#039;&#039;git&#039;&#039;. Details can be found on the [http://github.com/spring/TASServer development site].&lt;br /&gt;
&lt;br /&gt;
==UberServer==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Python&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;aegis&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can get more information and download it at the  [https://github.com/lunixbochs/uberserver github page]&lt;br /&gt;
&lt;br /&gt;
[[Category: Lobbies]]&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lobby_Development&amp;diff=10603</id>
		<title>Lobby Development</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lobby_Development&amp;diff=10603"/>
		<updated>2011-05-12T05:25:27Z</updated>

		<summary type="html">&lt;p&gt;Aegis: /* UberServer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
=Lobby client development=&lt;br /&gt;
There are currently three working public lobby clients available, and two in development.&lt;br /&gt;
&lt;br /&gt;
==SpringLobby==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;C++&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;BrainDamage&amp;lt;/font&amp;gt; &amp;amp;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;koshi&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SpringLobby is the official lobby client of spring and is bundled with the Spring engine in the installer. It uses the &#039;&#039;wxWidgets&#039;&#039; library. You can browse the sources and submit issues on its [http://springlobby.info/ website].&lt;br /&gt;
&lt;br /&gt;
==Zero-K==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;Windows&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;C#&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;Licho&amp;lt;/font&amp;gt; &amp;amp; &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;quantum&amp;lt;/font&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[https://code.google.com/p/zero-k/ Zero-K project page]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Alphalobby==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;Windows&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;C&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;Axiomatic&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alphalobby is still very much work in progress. If you still wish to use it, source available from the [http://code.google.com/p/alphalobby/source/checkout mercurial repository], binary available on the [http://springfiles.com/spring/lobby-clients/alphalobby springfiles page].&lt;br /&gt;
&lt;br /&gt;
==TASClient==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;Windows&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Delphi&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;Satirik&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can download the sources from the [http://springrts.com/svn/spring/Lobby/TASClient/ subversion repository] (svn://springrts.com/svn/spring/Lobby/TASClient/) and browse them on the [http://springrts.com/websvn/listing.php?repname=Spring&amp;amp;path=%2FLobby%2FTASClient%2F#_Lobby_TASClient_ websvn]. Latest binary version is always available here:&lt;br /&gt;
http://springrts.com/dl/tasclient/TASClientLatest.7z&lt;br /&gt;
&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=12&amp;amp;t=18999 How to compile TASClient]&lt;br /&gt;
&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;t=19014 How to customize TASClient]&lt;br /&gt;
&lt;br /&gt;
==QtLobby==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;C++&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;unmaintained&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Qt lobby is currently the fastest lobby available and is very stable. It uses the Qt library. Use its [http://code.google.com/p/qtlobby/ project page] to post issues, download or browse the sources.&lt;br /&gt;
&lt;br /&gt;
=Libraries and frameworks=&lt;br /&gt;
&lt;br /&gt;
==Spring-PythonBotFramework==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Python&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;unmaintained&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A bot framework written in python&lt;br /&gt;
[https://github.com/springlobby/spring_pythonbot_framework project page]&lt;br /&gt;
&lt;br /&gt;
==Go SpringLobbyClient==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Go&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A simple client implementation of the lobby protocol in Go.&lt;br /&gt;
[https://github.com/Agon/go-slc/ project page]&lt;br /&gt;
&lt;br /&gt;
=Lobby server development=&lt;br /&gt;
==Protocol==&lt;br /&gt;
* [http://springrts.com/dl/tasclient/ProtocolDescription.xml HTML] (may be out of date)&lt;br /&gt;
* [https://github.com/spring/LobbyProtocol/blob/master/ProtocolDescription.xml XML] (raw, always latest)&lt;br /&gt;
&lt;br /&gt;
==Download Systems==&lt;br /&gt;
* [http://springrts.com/wiki/Dev:LobbyDownloadSystems Lobby Download Systems]&lt;br /&gt;
&lt;br /&gt;
==TASServer==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Java&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;Betalord&amp;lt;/font&amp;gt; &amp;amp;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;hoijui&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The official lobby server, created by Betalord, using PHP for the admin interface. You can fetch the sources through &#039;&#039;git&#039;&#039;. Details can be found on the [http://github.com/spring/TASServer development site].&lt;br /&gt;
&lt;br /&gt;
==UberServer==&lt;br /&gt;
&amp;lt;font color=&amp;quot;orange&amp;quot;&amp;gt;cross-platform&amp;lt;/font&amp;gt;,&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AAFF&amp;quot;&amp;gt;Python&amp;lt;/font&amp;gt;,&lt;br /&gt;
by &amp;lt;font color=&amp;quot;#00CC00&amp;quot;&amp;gt;aegis&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can get more information and download it at the  [https://github.com/lunixbochs/uberserver github page]&lt;br /&gt;
&lt;br /&gt;
[[Category: Lobbies]]&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_UnsyncedRead&amp;diff=12365</id>
		<title>Lua UnsyncedRead</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_UnsyncedRead&amp;diff=12365"/>
		<updated>2011-01-05T23:23:08Z</updated>

		<summary type="html">&lt;p&gt;Aegis: TraceScreenRay includeSky&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
=Unsynced Read=&lt;br /&gt;
&lt;br /&gt;
== Replay/Spectating ==&lt;br /&gt;
&#039;&#039;&#039;Spring.IsReplay&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSpectatingState&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean spectating, boolean fullView, boolean fullSelect&lt;br /&gt;
&lt;br /&gt;
== ModUI ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetModUICtrl&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
== MyInfo ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMyAllyTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMyTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMyPlayerID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&lt;br /&gt;
== Local Player,Team,Ally ==&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Redundant same as the GetMyXYZ functions!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLocalPlayerID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number playerID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLocalTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLocalAllyTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number allyID&lt;br /&gt;
&lt;br /&gt;
== Team/Player Info ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerRoster&#039;&#039;&#039;&lt;br /&gt;
  ( [number sortType] ) -&amp;gt;&lt;br /&gt;
    nil | playerTable = {&lt;br /&gt;
            [1] = {&lt;br /&gt;
              string  name,&lt;br /&gt;
              number  playerID,&lt;br /&gt;
              number  teamID,&lt;br /&gt;
              number  allyTeamID,&lt;br /&gt;
              boolean spectator,&lt;br /&gt;
              number  cpuUsage,&lt;br /&gt;
              number  pingTime&lt;br /&gt;
            },&lt;br /&gt;
            etc...&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;  Sort codes:&lt;br /&gt;
     1 = Sort by allies  (the default)&lt;br /&gt;
     2 = Sort by teamID&lt;br /&gt;
     3 = Sort by playerName&lt;br /&gt;
     4 = Sort by CPU usage&lt;br /&gt;
     5 = Sort by ping time&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamColor&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number r, number g, number b,  number a&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamOrigColor&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number r, number g, number b,  number a&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerTraffic&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID [, number packetID] ) -&amp;gt; number&lt;br /&gt;
&lt;br /&gt;
== Sound ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSoundStreamTime&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number playedTime, number totalTime&lt;br /&gt;
&lt;br /&gt;
== Camera ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraNames&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [camName] = number camNum, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraState&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { &amp;quot;name&amp;quot; = string, &amp;quot;mode&amp;quot; = number camIdx, state1 = number, state2 = number, ... }&lt;br /&gt;
&lt;br /&gt;
See [[Lua_camState]] for details about Spring.GetCameraState output.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraPosition&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number x, number y, number z&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraDirection&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number forward_x, number forward_y, number forward_z&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraFOV&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number fov&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraVectors&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; vectorTable = {&lt;br /&gt;
    forward   = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    up        = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    right     = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    top       = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    bottom    = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    leftside  = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    rightside = { [1] = number x, [2] = number y, [3] = number z }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== Inview ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetVisibleUnits&#039;&#039;&#039;&lt;br /&gt;
  ( [number teamID = -1 [, number radius = 30 [, boolean Icons = true ]]] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetVisibleFeatures&#039;&#039;&#039;&lt;br /&gt;
  ( [number allyTeamID = -1 [, number radius = 30 [, boolean Icons = true [, boolean geos = true ]]]] )&lt;br /&gt;
    -&amp;gt; nil | featureTable = { [1] = number featureID, ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.IsAABBInView&#039;&#039;&#039;&lt;br /&gt;
  ( number minX, number minY, number minZ,&lt;br /&gt;
    number maxX, number maxY, number maxZ ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsSphereInView&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z [, number radius ] ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitIcon&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInView&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitVisible&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number radius [, boolean checkIcons] ] ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Screen Trace ===&lt;br /&gt;
&#039;&#039;&#039;Spring.WorldToScreenCoords&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z ) -&amp;gt; number x, number y, number z&lt;br /&gt;
&#039;&#039;&#039;Spring.TraceScreenRay&#039;&#039;&#039;&lt;br /&gt;
  ( number mouseX, number mouseY [, boolean onlyCoords [, boolean useMinimap, [boolean includeSky]] ] )&lt;br /&gt;
    -&amp;gt; nil |&lt;br /&gt;
    string &amp;quot;unit&amp;quot;,    number unitID    |&lt;br /&gt;
    string &amp;quot;feature&amp;quot;, number featureID |&lt;br /&gt;
    string &amp;quot;ground&amp;quot;,  { [1] = number x, [2] = number y, [3] = number z }&lt;br /&gt;
&lt;br /&gt;
=== Screen &amp;amp; Window Geometry ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetViewGeometry&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number viewSizeX, number viewSizeY, number viewPosX, number viewPosY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetWindowGeometry&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number winSizeX, number winSizeY, number winPosX, number winPosY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetScreenGeometry&#039;&#039;&#039; (is missing multiscreen support!)&lt;br /&gt;
  ( ) -&amp;gt; number screenSizeX, number screenSizeY, number ZERO, number ZERO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unit ==&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitAllied&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitViewPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, boolean extrapolated ] ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTransformMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, boolean invert = false] ) -&amp;gt; nil | number a11, number a12 ..., number a44    &amp;lt;span class=note&amp;gt;(4x4 matrix)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selected Units ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedUnits&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [1] = unitID, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedUnitsSorted&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [number unitDefID] = { [1] = [number unitID], etc...}, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedUnitsCounts&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [number unitDefID] = number count, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedUnitsCount&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number count&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitSelected&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Unit Groups ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitGroup&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupList&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | {&lt;br /&gt;
    [number] = number unitCount,&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedGroup&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupAIName&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; string aiName&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupAIList&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
    [1] = string aiName, ...&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupUnits&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = number unitID, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupUnitsSorted&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; nil | {&lt;br /&gt;
    [number unitDefID] = {number unitID, ...}, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupUnitsCounts&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; nil | {&lt;br /&gt;
    [number unitDefID] = number count, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupUnitsCount&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; nil | number count&lt;br /&gt;
&lt;br /&gt;
== UI ==&lt;br /&gt;
&lt;br /&gt;
=== GUI Settings ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsGUIHidden&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.HaveShadows&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.HaveAdvShading&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetWaterMode&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number mode, string &amp;quot;mode&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;  mode numbers:&lt;br /&gt;
      0 - basic&lt;br /&gt;
      1 - reflective&lt;br /&gt;
      2 - dynamic&lt;br /&gt;
      3 - refractive&lt;br /&gt;
      4 - bumpwater&lt;br /&gt;
      default - unknown&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMapDrawMode&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | &amp;quot;normal&amp;quot; | &amp;quot;height&amp;quot; | &amp;quot;metal&amp;quot; | &amp;quot;path&amp;quot; | &amp;quot;los&amp;quot;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetDrawSelectionInfo&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns whether &amp;amp;quot;Selected units&amp;amp;quot; text is displayed.&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
=== Unit GUI States ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLuaDraw&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNoDraw&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNoMinimap&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Minimap ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMiniMapGeometry&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number posX, number posY, number sizeX, number sizeY,&lt;br /&gt;
    boolean minimized, boolean maximized&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMiniMapDualScreen&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean false | string &amp;quot;left&amp;quot; | string &amp;quot;right&amp;quot;&lt;br /&gt;
&#039;&#039;&#039;Spring.IsAboveMiniMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== (Build-)Menu ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActiveCommand&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number index (, number cmd_id, number cmd_type, string cmd_name)&lt;br /&gt;
&#039;&#039;&#039;Spring.GetDefaultCommand&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number index (, number cmd_id, number cmd_type, string cmd_name)&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActiveCmdDescs&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = {&lt;br /&gt;
      id=number,&lt;br /&gt;
      type=number,&lt;br /&gt;
      name=string,&lt;br /&gt;
      action=string,&lt;br /&gt;
      tooltip=string,&lt;br /&gt;
      texture=string,&lt;br /&gt;
      cursor=string,&lt;br /&gt;
      hidden=boolean,&lt;br /&gt;
      disabled=boolean,&lt;br /&gt;
      showUnique=boolean,&lt;br /&gt;
      onlyTexture=boolean,&lt;br /&gt;
      params = { [1] = string, .. }&lt;br /&gt;
    }, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActiveCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number index ) -&amp;gt; nil | {&lt;br /&gt;
      id=number,&lt;br /&gt;
      type=number,&lt;br /&gt;
      name=string,&lt;br /&gt;
      action=string,&lt;br /&gt;
      tooltip=string,&lt;br /&gt;
      texture=string,&lt;br /&gt;
      cursor=string,&lt;br /&gt;
      hidden=boolean,&lt;br /&gt;
      disabled=boolean,&lt;br /&gt;
      showUnique=boolean,&lt;br /&gt;
      onlyTexture=boolean,&lt;br /&gt;
      params = { [1] = string, .. }&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCmdDescIndex&#039;&#039;&#039;&lt;br /&gt;
  ( number cmdID ) -&amp;gt; nil | number index&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActivePage&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number pageNum, number maxPages&lt;br /&gt;
&lt;br /&gt;
=== Build Facing ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetBuildFacing&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetBuildSpacing&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&lt;br /&gt;
=== GatherMode &amp;amp; InvertQueueKey ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGatherMode&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetInvertQueueKey&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Mouse States ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMouseState&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number X, number Y,&lt;br /&gt;
    boolean leftPressed, boolean middlePressed, boolean rightPressed&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMouseCursor&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; string name, number scale&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMouseStartPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number mouseButton ) -&amp;gt; nil | number pressedX, number pressedY,&lt;br /&gt;
    number camPosX, number camPosY, number camPosZ,&lt;br /&gt;
    number dirX, number dirY, number dirZ&lt;br /&gt;
&lt;br /&gt;
=== (Hot-)Keys ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeyState&#039;&#039;&#039;&lt;br /&gt;
  ( number key ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetModKeyState&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean alt, boolean ctrl, boolean meta, boolean shift&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPressedKeys&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
    [number] = boolean,&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeyCode&#039;&#039;&#039;&lt;br /&gt;
  ( string keysym ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeySymbol&#039;&#039;&#039;&lt;br /&gt;
  ( number key ) -&amp;gt; string &amp;quot;keysym1&amp;quot;, string &amp;quot;keysym2&amp;quot;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeyBindings&#039;&#039;&#039;&lt;br /&gt;
  ( string keyset ) -&amp;gt; nil | { [1] = {[string actionCmd] = string actionExtra}, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActionHotKeys&#039;&#039;&#039;&lt;br /&gt;
  ( string action ) -&amp;gt; nil | { [1] = string hotKey, ... }&lt;br /&gt;
&lt;br /&gt;
=== Console ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLastMessagePositions&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = { number X, number Y, number Z },&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetConsoleBuffer&#039;&#039;&#039;&lt;br /&gt;
  ( [number maxLines] ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = {&lt;br /&gt;
      text = string,&lt;br /&gt;
      priority = number&lt;br /&gt;
   }, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCurrentTooltip&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FPS &amp;amp; GetDrawFrame ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFPS&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetDrawFrame&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number low 16bit, number high 16bit&lt;br /&gt;
&lt;br /&gt;
== Time ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFrameTimeOffset&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLastUpdateSeconds&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetHasLag&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTimer&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; timer&lt;br /&gt;
&#039;&#039;&#039;Spring.DiffTimers&#039;&#039;&#039;&lt;br /&gt;
  ( timer cur, timer ago) -&amp;gt; number seconds&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedRead&amp;diff=11941</id>
		<title>Lua SyncedRead</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedRead&amp;diff=11941"/>
		<updated>2010-12-25T08:13:15Z</updated>

		<summary type="html">&lt;p&gt;Aegis: removed duplicate breadcrumbs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(those special TeamIDs are not supported by all functions)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.ALL_UNITS&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.MY_UNITS&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.ALLY_UNITS&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.ENEMY_UNITS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGaiaTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number teamID&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsGodModeEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsCheatingEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsDevLuaEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsEditDefsEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.AreHelperAIsEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.FixedAllies&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.IsGameOver&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
=== Rules ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Those functions allow to save data per Game,Team and Unit.&amp;lt;br&amp;gt;The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRulesInfoMap&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;REMOVED in 0.82!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; { [key1] = string value1, [key2] = string value2, ... }&lt;br /&gt;
  ( string &amp;quot;key&amp;quot; ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameRulesParam&#039;&#039;&#039;&lt;br /&gt;
  ( number ruleIndex | string ruleName ) -&amp;gt; number value&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameRulesParams&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | { [ruleIndex1] = {[ruleName1] = number value1},  [ruleIndex2] = {[ruleName2] = number value2}, ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamRulesParam&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number index | string ruleName ) -&amp;gt; nil | number value&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamRulesParams&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | { [ruleIndex1] = {[ruleName1] = number value1}, [ruleIndex2] = {[ruleName2] = number value2}, ... }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRulesParam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number index | string ruleName ) -&amp;gt; nil | number value&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRulesParams&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { [ruleIndex1] = {[ruleName1] = number value1}, [ruleIndex2] = {[ruleName2] = number value2}, ... }&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetModOptions&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {} | { &amp;quot;keyName1&amp;quot; = string &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = string &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMapOptions&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {} | { &amp;quot;keyName1&amp;quot; = string &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = string &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameSpeed&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number userSpeedFactor, number speedFactor, boolean paused&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameFrame&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number frameNum%dayFrames, number frameNum/dayFrames&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameSeconds&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number seconds&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetWind&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number dirX, number dirY, number dirZ, &lt;br /&gt;
         number strength,  number normDirX, number normDirY, number normDirZ&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetHeadingFromVector&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetVectorFromHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number heading ) -&amp;gt; number x, number z&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSideData&#039;&#039;&#039;&lt;br /&gt;
  ( string sideName ) -&amp;gt; nil | string startUnit, string caseSensitiveSideName&lt;br /&gt;
  ( number sideID ) -&amp;gt; nil | string sideName, string startUnit, string caseSensitiveSideName&lt;br /&gt;
  ( ) -&amp;gt; { [1] = { sideName=string,caseName=string,startUnit=string}, [2] = .., .. }&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllyTeamStartBox&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID ) -&amp;gt; nil | number xmin, number zmin, number xmax, number zmax&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamStartPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerList&#039;&#039;&#039;&lt;br /&gt;
  ( [number teamID = -1 | boolean onlyActive = false] [, number teamID | boolean onlyActive])&lt;br /&gt;
  -&amp;gt; nil | { [1] = number playerID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamList&#039;&#039;&#039;&lt;br /&gt;
  ( [number allyTeamID = -1] ) -&amp;gt; nil | { [1] = number teamID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllyTeamList&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [1] = number allyTeamID, etc... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID ) -&amp;gt; &lt;br /&gt;
    nil | string  &amp;quot;name&amp;quot;,  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(in synced code this is &amp;quot;SYNCED_NONAME&amp;quot;!)&amp;lt;/span&amp;gt;&lt;br /&gt;
          boolean active,&lt;br /&gt;
          boolean spectator,&lt;br /&gt;
          number  teamID,&lt;br /&gt;
          number  allyTeamID,&lt;br /&gt;
          number  pingTime,&lt;br /&gt;
          number  cpuUsage,&lt;br /&gt;
          string  country,&lt;br /&gt;
          number  rank&lt;br /&gt;
          table   customPlayerKeys&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerControlledUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAIInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; &lt;br /&gt;
          number  skirmishAIID,&lt;br /&gt;
          string  name,&lt;br /&gt;
          number  hostingPlayerID,&lt;br /&gt;
          string  shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&lt;br /&gt;
          string  version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&lt;br /&gt;
          table   options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllyTeamInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number allyteamID ) -&amp;gt; nil | table   customTeamKeys&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt;&lt;br /&gt;
    nil | number  teamID,&lt;br /&gt;
          number  leader, &amp;lt;span class=note&amp;gt;(:= a player id)&amp;lt;/span&amp;gt;&lt;br /&gt;
          boolean isDead,&lt;br /&gt;
          boolean isAiTeam,&lt;br /&gt;
          string  &amp;quot;side&amp;quot;,&lt;br /&gt;
          number  allyTeam,&lt;br /&gt;
          table   customTeamKeys,&lt;br /&gt;
          number  incomeMultiplier&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamResources&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot; ) -&amp;gt;&lt;br /&gt;
    nil | number currentLevel,&lt;br /&gt;
          number storage,&lt;br /&gt;
          number pull,&lt;br /&gt;
          number income,&lt;br /&gt;
          number expense,&lt;br /&gt;
          number share,&lt;br /&gt;
          number sent,&lt;br /&gt;
          number received&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitStats&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt;&lt;br /&gt;
    nil | number killed,&lt;br /&gt;
          number died,&lt;br /&gt;
          number capturedBy,&lt;br /&gt;
          number capturedFrom,&lt;br /&gt;
          number received,&lt;br /&gt;
          number sent&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamResourceStats&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;0.82 and later&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number teamID,  string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot; ) -&amp;gt;&lt;br /&gt;
    nil | number used,&lt;br /&gt;
          number produced,&lt;br /&gt;
          number excessed,&lt;br /&gt;
          number received,&lt;br /&gt;
          number sent&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamStatsHistory&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID [, number startIndex [, number endIndex = startIndex ]]) -&amp;gt;&lt;br /&gt;
    nil |&lt;br /&gt;
    number cur_max_index |&lt;br /&gt;
    {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;if called with just teamID as argument it returns the current possible range for startIndex/endIndex :={1..cur_max_index}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamLuaAI&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; string &amp;quot;luaAI&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&#039;&#039;&#039;Spring.AreTeamsAllied&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID1, number teamID2 ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.ArePlayersAllied&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID1, number playerID2 ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllUnits&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | unitTable = { [1] = number unitID, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnits&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitsSorted&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil |&lt;br /&gt;
    unitDefTable = {&lt;br /&gt;
      [number unitDefID] = { [1] = [number unitID], etc... },&lt;br /&gt;
      etc...&lt;br /&gt;
    }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitsCounts&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | countTable = { [number unitDefID] = count, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitsByDefs&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number unitDefID | { number unitDefID1, ... } )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitDefCount&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number unitDefID ) -&amp;gt; nil | number count&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitCount&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number count&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInRectangle&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number zmin, number xmax, number zmax [,number teamID] ) &lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInBox&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number ymin, number zmin,&lt;br /&gt;
    number xmax, number ymax, number zmax [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInSphere&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInCylinder&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, number radius [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInPlanes&#039;&#039;&#039;&lt;br /&gt;
  ( planes = { [1] = { number nx, number ny, number nz, number d }, etc... } )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  plane normals point towards accepted space,&lt;br /&gt;
  so the acceptance criteria for each plane is:&lt;br /&gt;
    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNearestAlly&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number range ] ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNearestEnemy&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number range [, bool useLOS]] ) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidUnitID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsDead&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTooltip&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | string tooltip&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLineage&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; Removed from version 0.83.x&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number lineage | number lineage, boolean lineageIsRoot&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNeutral&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean neutral&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number health, number maxHealth, number paralyzeDamage,&lt;br /&gt;
                             number captureProgress, number buildProgress&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitArmored&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;armorMultiple new in version 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean armored, number armorMultiple&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsStunned&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean stunned_or_inbuild, boolean stunned, boolean inbuild&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitResources&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number metalMake, number metalUse,&lt;br /&gt;
                             number energyMake, number energyUse&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMetalExtraction&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;0.82+ and later&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitExperience&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number experience&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitStates&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
    &amp;quot;firestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;movestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;repeat&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;cloak&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;active&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;trajectory&amp;quot; = boolean,&lt;br /&gt;
    [&amp;quot;autoland&amp;quot; = boolean,]&lt;br /&gt;
    [&amp;quot;autorepairlevel&amp;quot; = number,]&lt;br /&gt;
    [&amp;quot;loopbackattack&amp;quot; = boolean]&lt;br /&gt;
  } &lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsActive&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsCloaked&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSelfDTime&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitStockpile&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number numStockpiled, number numStockpileQued,&lt;br /&gt;
                             number buildPercent&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns the center position of the unit (midpos).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBasePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns the bottom of the unit.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number dx, number dy, number dz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number velx, number vely, number velz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBuildFacing&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsBuilding&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTransporter&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsTransporting&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitShieldState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number weaponID = -1] ) -&amp;gt; nil | number isEnabled, number curPower&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTravel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number travel, number travelPeriod&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFuel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFlanking&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;dir&amp;quot; ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
  ( number unitID, string &amp;quot;mode&amp;quot; | &amp;quot;moveFactor&amp;quot; | &amp;quot;minDamage&amp;quot; | &amp;quot;maxDamage&amp;quot; ) -&amp;gt; nil | number&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number mode, number modilityAdd,&lt;br /&gt;
    number minDamage, number maxDamage, number dirX, number dirY, number dirZ&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSensorRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string type ) -&amp;gt; nil | number radius&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;possible types are:&amp;lt;br&amp;gt;airLos, radar, sonar, seismic, radarJammer &amp;amp; sonarJammer&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLosState&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;raw is only available in gadgets&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID [, number allyTeamID [, boolean raw] ] ) -&amp;gt; nil |&lt;br /&gt;
  { [&amp;quot;los&amp;quot; = true] [, &amp;quot;radar&amp;quot; = true] [, &amp;quot;typed&amp;quot; = true] }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSeparation&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(returns the distance of 2 units)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID1, number unitID2 [, boolean 2D ] ) -&amp;gt; nil | number distance&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDefDimensions&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID ) -&amp;gt; nil |&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirY, number dirZ&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil |&lt;br /&gt;
    boolean angleGood, boolean loaded, number reloadFrame, number salvoLeft, number numStockpiled&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLastAttacker&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLastAttackedPiece&#039;&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | string pieceName, number gameframe&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMoveTypeData&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;new in version 0.80+&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { movetype data }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {frontX,frontY,frontZ}, {upX,upY,upZ}, {rightX,rightY,rightZ}&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number posx, number posy, number posz&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position in unit space&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number dirx, number diry, number dirz&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Consider this broken. It returns reverse direction in piece space (i.e. vertex(0)-vertex(1)) for pieces with &amp;gt;= 2 vertices and (1,1,1) for pieces with &amp;lt; 2 vertices)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; { [1] = number, ... , [16] = number }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceList&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { [1] = string &amp;quot;piecename&amp;quot;, ... , [pieceNumN] = string &amp;quot;piecename&amp;quot; }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMap&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { &amp;quot;piecename1&amp;quot; = pieceNum1, ... , &amp;quot;piecenameN&amp;quot; = pieceNumN }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z },    &lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptPiece&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number scriptPiece ] )&lt;br /&gt;
   -&amp;gt; nil | { scriptPieceNum = number modelPieceNum } | number modelPieceNum&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get via Cob2Lua a pieceID you have to translate it with this function. Btw the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptNames&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
   -&amp;gt; { &amp;quot;cobpiecename1&amp;quot; = ScriptPieceNum1, ... , &amp;quot;cobpiecenameN&amp;quot; = ScriptPieceNumN }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosDir&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirZ, number dirY&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCommands&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number count] ) -&amp;gt; nil | commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCommandQueue&#039;&#039;&#039;   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(same as Spring.GetUnitCommands)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID [, number count] ) -&amp;gt; nil | commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFullBuildQueue&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRealBuildQueue&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(cleans the buildqueue of things the unit can&#039;t build itself)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCommands&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number count] ) -&amp;gt; nil | commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCounts&#039;&#039;&#039; (used to get the buildqueue of a factory, seems screwed o_O)&lt;br /&gt;
  ( number unitID [, number count [, boolean addCMDs ] ] ) -&amp;gt; nil | commandQueueTable = {&lt;br /&gt;
     [2] = { [number unitDefID | number -cmdID] = number count }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCmdDescs&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number startIndex [, number endIndex ] ] ) -&amp;gt; nil | {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&#039;&#039;&#039;Spring.FindUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdID ) -&amp;gt; nil | number index&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInRectangle&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number zmin, number xmax, number zmax [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllFeatures&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | { [1] = number featureID, ... }&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidFeatureID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number featureDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number health, number maxHealth, number resurrectProgress&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number dirx, number diry, number dirz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResources&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number RemainingMetal, number maxMetal,&lt;br /&gt;
                                number RemainingEnergy, number maxEnergy, number reclaimLeft&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | boolean noSelect&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | string UnitDefName, number buildFacing&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBUnitVar&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBAllyTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBGlobalVar&#039;&#039;&#039;&lt;br /&gt;
  ( integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
=== Ground Informations ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundOrigHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundNormal&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number x, number y, number z&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; string &amp;quot;Type&amp;quot;, number metal, number hardness,&lt;br /&gt;
                            number tankSpeed, number kbotSpeed, number hoverSpeed,&lt;br /&gt;
                            number shipSpeed, boolean receiveTracks&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundBlocked&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z |&lt;br /&gt;
    number x1, number z1, number x2, number z2 )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;feature&amp;quot;, number featureID  |  string &amp;quot;unit&amp;quot;, number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundExtremes&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number minHeight, number maxHeight&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSmoothMeshHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&lt;br /&gt;
=== Test Building ===&lt;br /&gt;
&#039;&#039;&#039;Spring.TestBuildOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z, number facing)&lt;br /&gt;
    -&amp;gt; number blocking [,number featureID]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;blocking can be:&lt;br /&gt;
    0 - blocked&lt;br /&gt;
    1 - mobile unit in the way&lt;br /&gt;
    2 - free  (or if featureID is != 0 then with a blocking feature that can be reclaimed)&lt;br /&gt;
  facing can be:&lt;br /&gt;
    0, &amp;quot;s&amp;quot;, &amp;quot;south&amp;quot;&lt;br /&gt;
    1, &amp;quot;e&amp;quot;, &amp;quot;east&amp;quot;&lt;br /&gt;
    2, &amp;quot;n&amp;quot;, &amp;quot;north&amp;quot;&lt;br /&gt;
    3, &amp;quot;w&amp;quot;, &amp;quot;west&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.Pos2BuildPos&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitEstimatedPath&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
     [1] = { x,y,z }, ...&lt;br /&gt;
   },{&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;GetUnitEstimatedPath() returns 2 tables:&lt;br /&gt;
    1 table the waypoints and 1 table with indices (in the waypoint table)&lt;br /&gt;
    when a new (more lazy) pathfinding algorithm  begins.&lt;br /&gt;
    So the waypoint table contains 3 different levels of details.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInRadar&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInAirLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPositionLosState&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z [, number allyID] )&lt;br /&gt;
    -&amp;gt; boolean LosOrRadar, boolean inLos, boolean inRadar&lt;br /&gt;
&#039;&#039;&#039;Spring.GetClosestValidPosition&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;//NOT FINISHED YET&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number z, number r ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileName&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | string name&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileType&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean weapon, boolean piece&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number px, number py, number pz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number vx, number vy, number vz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileGravity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number gravity&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinAngle&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number angle&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinSpeed&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number spinSpeed&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinVec&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Download&amp;diff=5989</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Download&amp;diff=5989"/>
		<updated>2010-09-02T23:16:48Z</updated>

		<summary type="html">&lt;p&gt;Aegis: /* Spring Engine Updates */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#css:&lt;br /&gt;
  #content * {font-family: &#039;Bitstream Vera Sans&#039;,  &#039;Trebuchet MS&#039;, &#039;Arial&#039;, &#039;Myriad Pro&#039;, &#039;FreeSans&#039;;}&lt;br /&gt;
}}&lt;br /&gt;
= Downloads =&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{|style=&amp;quot;margin-top: 15px; padding: 10px; background:rgba(45,180,19,0.5); border: 1px solid rgba(0,0,0,0.5); border-radius: 6px 6px 6px 6px; box-shadow: 0 2px 6px rgba(0,0,0,0.3), inset 0 1px 2px rgba(255,255,255,0.5), inset 0 10px 8px rgba(255,255,255,0.3);&amp;quot; |&lt;br /&gt;
| If you just want to &amp;lt;u&amp;gt;get ready to play&amp;lt;/u&amp;gt;, you want this:&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;margin-top: 15px; text-align: center&amp;quot; | &amp;lt;span style=&amp;quot;font-size: 150%;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;[[GamesDownloads|Games Downloads]]&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Spring Engine Updates =&lt;br /&gt;
Latest stable version is: &#039;&#039;&#039;0.82&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;padding-right:10px&amp;quot;| [[Image:Window.png]]&lt;br /&gt;
| &#039;&#039;&#039;Installer: [http://sourceforge.net/projects/springrts/files/springrts/spring-0.82.5/spring_0.82.5.exe/download spring_0.82.5.exe ~18MB]&#039;&#039;&#039; - [http://springrts.com/dl/spring_0.82.5.exe {mirror}]&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;!-- &#039;&#039;&#039;Portable: [http://sourceforge.net/projects/springrts/files/springrts/spring-0.82.3/spring_0.82.3_portable.7z/download spring_0.82.3_portable.7z ~15MB]&#039;&#039;&#039; - [http://springrts.com/dl/spring_0.82.3_portable.7z {mirror}] --&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;padding-right:10px&amp;quot;| [[Image:Tux-G2.pngâ€Ž]]&lt;br /&gt;
| follow the &#039;&#039;&#039;[[SetupGuide|Linux Setup guide]]&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;padding-right:10px&amp;quot;| [[Image:Apple.png]]&lt;br /&gt;
| &#039;&#039;&#039; &#039;&#039;No download yet&#039;&#039; &#039;&#039;&#039;&lt;br /&gt;
The Mac OS X port is rough and unfinished. Help with its development would be greatly appreciated. More information on the current state of this port can be found &#039;&#039;&#039;[[Spring_on_MacOSX|&amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;here&amp;lt;/span&amp;gt;]]&#039;&#039;&#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Testing/Nightly Builds =&lt;br /&gt;
Used for testing latest engine developments.&lt;br /&gt;
[http://springrts.com/dl/buildbot/ list of all test builds]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Source Code =&lt;br /&gt;
== git ==&lt;br /&gt;
&#039;&#039;&#039;[http://github.com/spring/spring &amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;Spring project page at github&amp;lt;/span&amp;gt;]&#039;&#039;&#039; &amp;lt;small&amp;gt;[http://status.github.com (status page)]&amp;lt;/small&amp;gt;&lt;br /&gt;
=== Getting the Source ===&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;git clone git://github.com/spring/spring.git&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
This however gives you the bleeding edge, if you want to play online then run:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;git checkout 0.82.3&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
from within the source directory. This will provide the correct source code&lt;br /&gt;
=== Alternate git url ===&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;git://springrts.git.sourceforge.net/gitroot/springrts/springrts&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Latest Stable Snapshot ==&lt;br /&gt;
This tarball is the same as that used to build the last public release. See [[Building spring]] for build instructions.&lt;br /&gt;
&lt;br /&gt;
The packages below target Linux only and do not contain certain files required to compile using CMake on Windows.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://sourceforge.net/projects/springrts/files/springrts/spring-0.82.3/spring_0.82.3_src.tar.lzma/download Source .tar.lzma]&#039;&#039;&#039; - [http://springrts.com/dl/spring_0.82.3_src.tar.lzma {mirror}]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://sourceforge.net/projects/springrts/files/springrts/spring-0.82.3/spring_0.82.3_src.tar.gz/download Source .tar.gz]&#039;&#039;&#039; - [http://springrts.com/dl/spring_0.82.3_src.tar.gz {mirror}]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Other springrts.com hosted projects =&lt;br /&gt;
== TASClient ==&lt;br /&gt;
An alternative windows only lobby client.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://springrts.com/dl/tasclient/TASClientLatest.7z Download TASClient]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Lobby server==&lt;br /&gt;
If you do not want (or are unable) to use the public lobby server, you can download the server software here to run your own. See the readme &#039;&#039;&#039;[http://springrts.com/dl/tasserver_readme.txt here]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://springrts.com/dl/TASServer.jar Click here to download]&#039;&#039;&#039; 100.7kb, added 2008-03-02 (requires Java Runtime Environment)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SelectionEditor ==&lt;br /&gt;
Sources are in the [[#git|main git tree]] under &amp;quot;/tools/SelectionEditor/&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://springrts.com/dl/SelectionEditor.zip Click here to download (windows only)]&#039;&#039;&#039;&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Download&amp;diff=5988</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Download&amp;diff=5988"/>
		<updated>2010-09-02T22:47:41Z</updated>

		<summary type="html">&lt;p&gt;Aegis: /* Spring Engine Updates */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#css:&lt;br /&gt;
  #content * {font-family: &#039;Bitstream Vera Sans&#039;,  &#039;Trebuchet MS&#039;, &#039;Arial&#039;, &#039;Myriad Pro&#039;, &#039;FreeSans&#039;;}&lt;br /&gt;
}}&lt;br /&gt;
= Downloads =&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{|style=&amp;quot;margin-top: 15px; padding: 10px; background:rgba(45,180,19,0.5); border: 1px solid rgba(0,0,0,0.5); border-radius: 6px 6px 6px 6px; box-shadow: 0 2px 6px rgba(0,0,0,0.3), inset 0 1px 2px rgba(255,255,255,0.5), inset 0 10px 8px rgba(255,255,255,0.3);&amp;quot; |&lt;br /&gt;
| If you just want to &amp;lt;u&amp;gt;get ready to play&amp;lt;/u&amp;gt;, you want this:&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;margin-top: 15px; text-align: center&amp;quot; | &amp;lt;span style=&amp;quot;font-size: 150%;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;[[GamesDownloads|Games Downloads]]&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Spring Engine Updates =&lt;br /&gt;
Latest stable version is: &#039;&#039;&#039;0.82&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;padding-right:10px&amp;quot;| [[Image:Window.png]]&lt;br /&gt;
| &#039;&#039;&#039;Installer: [http://sourceforge.net/projects/springrts/files/springrts/spring-0.82.4/spring_0.82.4.exe/download spring_0.82.4.exe ~18MB]&#039;&#039;&#039; - [http://springrts.com/dl/spring_0.82.4.exe {mirror}]&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;!-- &#039;&#039;&#039;Portable: [http://sourceforge.net/projects/springrts/files/springrts/spring-0.82.3/spring_0.82.3_portable.7z/download spring_0.82.3_portable.7z ~15MB]&#039;&#039;&#039; - [http://springrts.com/dl/spring_0.82.3_portable.7z {mirror}] --&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;padding-right:10px&amp;quot;| [[Image:Tux-G2.pngâ€Ž]]&lt;br /&gt;
| follow the &#039;&#039;&#039;[[SetupGuide|Linux Setup guide]]&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;padding-right:10px&amp;quot;| [[Image:Apple.png]]&lt;br /&gt;
| &#039;&#039;&#039; &#039;&#039;No download yet&#039;&#039; &#039;&#039;&#039;&lt;br /&gt;
The Mac OS X port is rough and unfinished. Help with its development would be greatly appreciated. More information on the current state of this port can be found &#039;&#039;&#039;[[Spring_on_MacOSX|&amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;here&amp;lt;/span&amp;gt;]]&#039;&#039;&#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Testing/Nightly Builds =&lt;br /&gt;
Used for testing latest engine developments.&lt;br /&gt;
[http://springrts.com/dl/buildbot/ list of all test builds]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Source Code =&lt;br /&gt;
== git ==&lt;br /&gt;
&#039;&#039;&#039;[http://github.com/spring/spring &amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;Spring project page at github&amp;lt;/span&amp;gt;]&#039;&#039;&#039; &amp;lt;small&amp;gt;[http://status.github.com (status page)]&amp;lt;/small&amp;gt;&lt;br /&gt;
=== Getting the Source ===&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;git clone git://github.com/spring/spring.git&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
This however gives you the bleeding edge, if you want to play online then run:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;git checkout 0.82.3&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
from within the source directory. This will provide the correct source code&lt;br /&gt;
=== Alternate git url ===&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;git://springrts.git.sourceforge.net/gitroot/springrts/springrts&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Latest Stable Snapshot ==&lt;br /&gt;
This tarball is the same as that used to build the last public release. See [[Building spring]] for build instructions.&lt;br /&gt;
&lt;br /&gt;
The packages below target Linux only and do not contain certain files required to compile using CMake on Windows.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://sourceforge.net/projects/springrts/files/springrts/spring-0.82.3/spring_0.82.3_src.tar.lzma/download Source .tar.lzma]&#039;&#039;&#039; - [http://springrts.com/dl/spring_0.82.3_src.tar.lzma {mirror}]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://sourceforge.net/projects/springrts/files/springrts/spring-0.82.3/spring_0.82.3_src.tar.gz/download Source .tar.gz]&#039;&#039;&#039; - [http://springrts.com/dl/spring_0.82.3_src.tar.gz {mirror}]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Other springrts.com hosted projects =&lt;br /&gt;
== TASClient ==&lt;br /&gt;
An alternative windows only lobby client.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://springrts.com/dl/tasclient/TASClientLatest.7z Download TASClient]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Lobby server==&lt;br /&gt;
If you do not want (or are unable) to use the public lobby server, you can download the server software here to run your own. See the readme &#039;&#039;&#039;[http://springrts.com/dl/tasserver_readme.txt here]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://springrts.com/dl/TASServer.jar Click here to download]&#039;&#039;&#039; 100.7kb, added 2008-03-02 (requires Java Runtime Environment)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SelectionEditor ==&lt;br /&gt;
Sources are in the [[#git|main git tree]] under &amp;quot;/tools/SelectionEditor/&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://springrts.com/dl/SelectionEditor.zip Click here to download (windows only)]&#039;&#039;&#039;&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Download&amp;diff=5987</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Download&amp;diff=5987"/>
		<updated>2010-09-02T22:47:23Z</updated>

		<summary type="html">&lt;p&gt;Aegis: /* Spring Engine Updates */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#css:&lt;br /&gt;
  #content * {font-family: &#039;Bitstream Vera Sans&#039;,  &#039;Trebuchet MS&#039;, &#039;Arial&#039;, &#039;Myriad Pro&#039;, &#039;FreeSans&#039;;}&lt;br /&gt;
}}&lt;br /&gt;
= Downloads =&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{|style=&amp;quot;margin-top: 15px; padding: 10px; background:rgba(45,180,19,0.5); border: 1px solid rgba(0,0,0,0.5); border-radius: 6px 6px 6px 6px; box-shadow: 0 2px 6px rgba(0,0,0,0.3), inset 0 1px 2px rgba(255,255,255,0.5), inset 0 10px 8px rgba(255,255,255,0.3);&amp;quot; |&lt;br /&gt;
| If you just want to &amp;lt;u&amp;gt;get ready to play&amp;lt;/u&amp;gt;, you want this:&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;margin-top: 15px; text-align: center&amp;quot; | &amp;lt;span style=&amp;quot;font-size: 150%;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;[[GamesDownloads|Games Downloads]]&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Spring Engine Updates =&lt;br /&gt;
Latest stable version is: &#039;&#039;&#039;0.82&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;padding-right:10px&amp;quot;| [[Image:Window.png]]&lt;br /&gt;
| &#039;&#039;&#039;Installer: [http://sourceforge.net/projects/springrts/files/springrts/spring-0.82.3/spring_0.82.4.exe/download spring_0.82.4.exe ~18MB]&#039;&#039;&#039; - [http://springrts.com/dl/spring_0.82.4.exe {mirror}]&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;!-- &#039;&#039;&#039;Portable: [http://sourceforge.net/projects/springrts/files/springrts/spring-0.82.3/spring_0.82.3_portable.7z/download spring_0.82.3_portable.7z ~15MB]&#039;&#039;&#039; - [http://springrts.com/dl/spring_0.82.3_portable.7z {mirror}] --&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;padding-right:10px&amp;quot;| [[Image:Tux-G2.pngâ€Ž]]&lt;br /&gt;
| follow the &#039;&#039;&#039;[[SetupGuide|Linux Setup guide]]&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;padding-right:10px&amp;quot;| [[Image:Apple.png]]&lt;br /&gt;
| &#039;&#039;&#039; &#039;&#039;No download yet&#039;&#039; &#039;&#039;&#039;&lt;br /&gt;
The Mac OS X port is rough and unfinished. Help with its development would be greatly appreciated. More information on the current state of this port can be found &#039;&#039;&#039;[[Spring_on_MacOSX|&amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;here&amp;lt;/span&amp;gt;]]&#039;&#039;&#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Testing/Nightly Builds =&lt;br /&gt;
Used for testing latest engine developments.&lt;br /&gt;
[http://springrts.com/dl/buildbot/ list of all test builds]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Source Code =&lt;br /&gt;
== git ==&lt;br /&gt;
&#039;&#039;&#039;[http://github.com/spring/spring &amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;Spring project page at github&amp;lt;/span&amp;gt;]&#039;&#039;&#039; &amp;lt;small&amp;gt;[http://status.github.com (status page)]&amp;lt;/small&amp;gt;&lt;br /&gt;
=== Getting the Source ===&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;git clone git://github.com/spring/spring.git&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
This however gives you the bleeding edge, if you want to play online then run:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;git checkout 0.82.3&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
from within the source directory. This will provide the correct source code&lt;br /&gt;
=== Alternate git url ===&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;git://springrts.git.sourceforge.net/gitroot/springrts/springrts&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Latest Stable Snapshot ==&lt;br /&gt;
This tarball is the same as that used to build the last public release. See [[Building spring]] for build instructions.&lt;br /&gt;
&lt;br /&gt;
The packages below target Linux only and do not contain certain files required to compile using CMake on Windows.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://sourceforge.net/projects/springrts/files/springrts/spring-0.82.3/spring_0.82.3_src.tar.lzma/download Source .tar.lzma]&#039;&#039;&#039; - [http://springrts.com/dl/spring_0.82.3_src.tar.lzma {mirror}]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://sourceforge.net/projects/springrts/files/springrts/spring-0.82.3/spring_0.82.3_src.tar.gz/download Source .tar.gz]&#039;&#039;&#039; - [http://springrts.com/dl/spring_0.82.3_src.tar.gz {mirror}]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Other springrts.com hosted projects =&lt;br /&gt;
== TASClient ==&lt;br /&gt;
An alternative windows only lobby client.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://springrts.com/dl/tasclient/TASClientLatest.7z Download TASClient]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Lobby server==&lt;br /&gt;
If you do not want (or are unable) to use the public lobby server, you can download the server software here to run your own. See the readme &#039;&#039;&#039;[http://springrts.com/dl/tasserver_readme.txt here]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://springrts.com/dl/TASServer.jar Click here to download]&#039;&#039;&#039; 100.7kb, added 2008-03-02 (requires Java Runtime Environment)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SelectionEditor ==&lt;br /&gt;
Sources are in the [[#git|main git tree]] under &amp;quot;/tools/SelectionEditor/&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://springrts.com/dl/SelectionEditor.zip Click here to download (windows only)]&#039;&#039;&#039;&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lobby_Development&amp;diff=10587</id>
		<title>Lobby Development</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lobby_Development&amp;diff=10587"/>
		<updated>2010-07-10T07:48:29Z</updated>

		<summary type="html">&lt;p&gt;Aegis: /* UberServer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
=Lobby client development=&lt;br /&gt;
There are currently three working public lobby clients available, and two in development.&lt;br /&gt;
==Springlobby==&lt;br /&gt;
Springlobby is the official lobby client of spring and is bundled with the Spring engine in the installer. It is a cross platform C++ project and uses the wxWidgets library. You can browse the sources and submit issues on its [http://springlobby.info/ website].&lt;br /&gt;
==TASClient==&lt;br /&gt;
TASClient is a Windows-only project in Delphi. You can download the sources from the [http://springrts.com/svn/spring/Lobby/TASClient/ subversion repository] (svn://springrts.com/svn/spring/Lobby/TASClient/) and browse them on the [http://springrts.com/websvn/listing.php?repname=Spring&amp;amp;path=%2FLobby%2FTASClient%2F#_Lobby_TASClient_ websvn]. Latest binary version is always available here: http://springrts.com/dl/tasclient/TASClientLatest.7z Contact Satirik on the lobby itself or on the forum to get help.&lt;br /&gt;
&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=12&amp;amp;t=18999 How to compile TASClient]&lt;br /&gt;
&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;t=19014 How to customize TASClient]&lt;br /&gt;
&lt;br /&gt;
==QtLobby==&lt;br /&gt;
Qt lobby is currently the fastest lobby available and is very stable. It is cross platform, programmed in C++ and uses the Qt library. Use its [http://code.google.com/p/qtlobby/ project page] to post issues, download or browse the sources.&lt;br /&gt;
&lt;br /&gt;
=Lobby server development=&lt;br /&gt;
==Protocol==&lt;br /&gt;
[http://springrts.com/lobby/protocol/ProtocolDescription.xml Protocol Documentation]&lt;br /&gt;
==TASServer==&lt;br /&gt;
The current lobby server is old and only lightly maintained. It is a java project created by Betalord, using php for admin interface. You can fetch the sources through git. Details can be found on the [http://github.com/spring/TASServer development site].&lt;br /&gt;
&lt;br /&gt;
==UberServer==&lt;br /&gt;
UberServer is a Python project made by aegis. You can [http://cgit.springlobby.info/cgit/aegis/uberserver.git/ browse the sources] or download them using its git repository (git://springlobby.info/git/aegis/uberserver.git). You can also contact aegis on the forum or the lobby to get more information.&lt;br /&gt;
&lt;br /&gt;
[[Category: Lobbies]]&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lobby_Development&amp;diff=10586</id>
		<title>Lobby Development</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lobby_Development&amp;diff=10586"/>
		<updated>2010-06-22T00:46:15Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
=Lobby client development=&lt;br /&gt;
There are currently three working public lobby clients available, and two in development.&lt;br /&gt;
==Springlobby==&lt;br /&gt;
Springlobby is the official lobby client of spring and is bundled with the Spring engine in the installer. It is a cross platform C++ project and uses the wxWidgets library. You can browse the sources and submit issues on its [http://springlobby.info/ website].&lt;br /&gt;
==TASClient==&lt;br /&gt;
TASClient is a Windows-only project in Delphi. You can download the sources from the [http://springrts.com/svn/spring/Lobby/TASClient/ subversion repository] (svn://springrts.com/svn/spring/Lobby/TASClient/) and browse them on the [http://springrts.com/websvn/listing.php?repname=Spring&amp;amp;path=%2FLobby%2FTASClient%2F#_Lobby_TASClient_ websvn]. Latest binary version is always available here: http://springrts.com/dl/tasclient/TASClientLatest.7z Contact Satirik on the lobby itself or on the forum to get help.&lt;br /&gt;
&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=12&amp;amp;t=18999 How to compile TASClient]&lt;br /&gt;
&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;t=19014 How to customize TASClient]&lt;br /&gt;
&lt;br /&gt;
==QtLobby==&lt;br /&gt;
Qt lobby is currently the fastest lobby available and is very stable. It is cross platform, programmed in C++ and uses the Qt library. Use its [http://code.google.com/p/qtlobby/ project page] to post issues, download or browse the sources.&lt;br /&gt;
&lt;br /&gt;
=Lobby server development=&lt;br /&gt;
==Protocol==&lt;br /&gt;
[http://springrts.com/lobby/protocol/ProtocolDescription.xml Protocol Documentation]&lt;br /&gt;
==TASServer==&lt;br /&gt;
The current lobby server is old and only lightly maintained. It is a java project created by Betalord, using php for admin interface. You can fetch the sources through git. Details can be found on the [http://github.com/spring/TASServer development site].&lt;br /&gt;
&lt;br /&gt;
==UberServer==&lt;br /&gt;
UberServer is a Python project made by aegis. You can [http://cgit.springlobby.info/aegis/uberserver.git/ browse the sources] or download them using its git repository (git://springlobby.info/git/aegis/uberserver.git). You can also contact aegis on the forum or the lobby to get more information.&lt;br /&gt;
&lt;br /&gt;
[[Category: Lobbies]]&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=10952</id>
		<title>LuaCallinReturn</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=10952"/>
		<updated>2010-03-17T18:55:46Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
===Lua Call-Ins, with parameters===&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-size:90%&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;Here are the known reserved parameter values for all Lua Call-Ins.  If you add new Call-Ins to Spring, please document them here.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Commands, general-purpose:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Shutdown()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;LayoutButtons()&amp;lt;/font&amp;gt; --&amp;gt; unknown, please document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ConfigureLayout()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;command&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandNotify()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;id, params, options&amp;quot;, where id = the CommandID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;KeyPress()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;key, mods, isRepeat&amp;quot;, where key = keymap, mods = SHIFT, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;KeyRelease()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MouseMove()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, dx, dy, button&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MousePress()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, button&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MouseRelease()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, button&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;IsAbove()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y&amp;quot; where x,y = screen coordinates.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GetTooltip()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y&amp;quot; where x,y = screen coordinates.  Returns WorldTooltip.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AddConsoleLine()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;msg, priority&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowCommand()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag, synced&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandFallback()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandsChanged()&amp;lt;/font&amp;gt; --&amp;gt; unknown (none?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitCreation()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitDefID, builderID, builderTeam, x, y, z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitTransfer()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, oldTeam, newTeam, capture&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitBuildStep()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;builderID, builderTeam, unitID, unitDefID, part&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowFeatureCreation()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureDefID, teamID, x, y, z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowFeatureBuildStep()&amp;lt;/font&amp;gt; --&amp;gt; unknown, please document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowResourceLevel()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;teamID, res, level&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowResourceTransfer()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;teamID, res, level&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unit-Specific:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitPreDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, damage, paralyzer, weaponID, attackerID, attackerDefID, attackerTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, damage, paralyzer, weaponID, attackerID, attackerDefID, attackerTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot; ... I hope that&#039;s self-explanatory&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitFinished()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitFromFactory()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, factID, factDefID, userOrders&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID, attackerID?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitTaken()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, newTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitGiven()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, oldTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitIdle()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCommand()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdOpts, cmdParams&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitSeismicPing()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, z, strength&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredRadar()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredLos()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftRadar()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftLos()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLoaded()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, transportID, transportTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitUnloaded()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID, transportID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCloaked()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDecloaked)&amp;lt;/font&amp;gt;--&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitMoveFailed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;StockpileChanged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, weaponNum, oldCount, newCount&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredWater()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredAir()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftWater()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftAir()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Feature-Specific:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;FeatureCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureID, allyTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;FeatureDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureID, allyTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;TerraformComplete()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, buildUnitID, buildUnitDefID, buildUnitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCmdDone()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdTag&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Drawing:==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawGenesis()&amp;lt;/font&amp;gt; --&amp;gt; none.  Don&#039;t render here.&lt;br /&gt;
&lt;br /&gt;
* Spring draws the sky, the map, some water types, and unit selection.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawWorldPreUnit()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
* Spring draws units, features, some water types, cloaked units, and the sun.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawWorld()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
* Spring draws command queues, &#039;map stuff&#039;, and map marks.&lt;br /&gt;
&lt;br /&gt;
Each unit might also have a DrawUnit call, [[Lua_UnitRendering|enabled here.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawUnit(unitID,DrawMode)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
With enum DrawMode {&amp;lt;br&amp;gt;&lt;br /&gt;
	notDrawing     = 0,&amp;lt;br&amp;gt;&lt;br /&gt;
	normalDraw     = 1,&amp;lt;br&amp;gt;&lt;br /&gt;
	shadowDraw     = 2,&amp;lt;br&amp;gt;&lt;br /&gt;
	reflectionDraw = 3,&amp;lt;br&amp;gt;&lt;br /&gt;
	refractionDraw = 4&amp;lt;br&amp;gt;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawScreenEffects()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;vsx, vsy&amp;quot; where vsx, vsy are screen coords.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawScreen()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawInMiniMap()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;sx, sy&amp;quot; where sx,sy are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldShadow()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldReflection()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldRefraction()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
==Game Events:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Explosion()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;weaponID, px, py, pz, ownerID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ShockFront()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;power, dx, dy, dz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameFrame()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;frameNum&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CobCallback()&amp;lt;/font&amp;gt; --&amp;gt; unknown, marked FIXME.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GroupChanged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;groupID&amp;quot; where groupID is the value of Group whose table value changed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;WorldTooltip()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;ttType, data1, data2, data3&amp;quot; special, should be documented in detail.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GamePreload()&amp;lt;/font&amp;gt;  --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameStart()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameOver()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;TeamDied()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;TeamID&amp;quot; where TeamID = the team that has been eliminated.&lt;br /&gt;
&lt;br /&gt;
==Projectiles:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ProjectileCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;proID, proOwnerID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ProjectileDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;proID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Download&amp;diff=5953</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Download&amp;diff=5953"/>
		<updated>2009-09-05T09:24:35Z</updated>

		<summary type="html">&lt;p&gt;Aegis: /* Lobby server */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Spring RTS Engine=&lt;br /&gt;
&lt;br /&gt;
On this page you will find information on how to download the latest releases from the Spring project for various platforms. &lt;br /&gt;
&lt;br /&gt;
==Windows==&lt;br /&gt;
&lt;br /&gt;
=== Game installers (for players) ===&lt;br /&gt;
&lt;br /&gt;
As Spring itself is just an engine and does not contain game content, we advise you to go to the website of the game you want to play for an all inclusive installer, however, you can use the &amp;quot;Spring Engine + Module Updater&amp;quot; installer. This installer will install the Spring Engine and the Spring Module Updater which contains a menu that lists many of the games available for the Spring Engine. Simply select which game you would like to install and it will download and install the game for you:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://springinfo.info/moddownloads/SpringEngine-Installer.exe &amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;Spring Engine + Spring Module Updater&amp;lt;/span&amp;gt;]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://springinfo.info/moddownloads/SpringModuleUpdater.exe &amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;Spring Module Updater (Standalone Installer)&amp;lt;/span&amp;gt;]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Below are some of the download pages of games using the Spring engine:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://www.evolutionrts.info/wordpress/?page_id=16 &amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;Evolution RTS&amp;lt;/span&amp;gt;]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://springfiles.com/1683 &amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;Kernel Panic&amp;lt;/span&amp;gt;]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://spring1944.net/downloads.php &amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;Spring 1944&amp;lt;/span&amp;gt;]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more Spring games, check out the [[Games]] page. Please note that some of them will require you to have the engine installed in order to work, as they don&#039;t come with their own installer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Engine installer (Bare Bones Installer) ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://sourceforge.net/projects/springrts/files/springrts/spring-0.80.4.1/spring_0.80.4.1.exe/download &amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;Click here to download&amp;lt;/span&amp;gt; ]&#039;&#039;&#039; version 0.80.4.1 ~21MB, added 2009-09-04&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://springrts.com/dl/spring_0.80.4.1.exe &amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;Backup in case the above doesn&#039;t work&amp;lt;/span&amp;gt; ]&#039;&#039;&#039; version 0.80.4.1 ~21MB, added 2009-09-04&lt;br /&gt;
&lt;br /&gt;
As all Spring-based games don&#039;t have their own installer, the engine installer can also be used by players to play other games.&lt;br /&gt;
This installer provides the core files for Spring, the  multiplayer lobby client and the autodownloader. Use the autodownloader to get maps and games, or download them from some hosting sites (listed in the lobby #main channel).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&#039;&#039;&#039;[http://www.springfiles.com/show_file.php?id=2237 &amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;Experimental Multithreading executable&amp;lt;/span&amp;gt; ]&#039;&#039;&#039; version 0.80.2, added 2009-08-26 ~3MB. Unzip to your installation folder. Does not work with all mods.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;[http://springrts.com/dl/spring_0.80.4.7z &amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;Portable archive&amp;lt;/span&amp;gt;]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://buildbot.eat-peet.net/spring/executable/%5bMT%5d0.80.4-spring_exe_0.80.4-0-ga0534a8.zip &amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;Experimental Multithreading executable&amp;lt;/span&amp;gt; ]&#039;&#039;&#039; version 0.80.4, added 2009-08-31 ~3MB. Unzip to your installation folder. Does not work with all mods. &#039;&#039;&#039;[http://buildbot.eat-peet.net/spring/executable/%5bMTDEBUG%5d0.80.4-spring_exe_0.80.4-0-ga0534a8.zip &amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;Debug version&amp;lt;/span&amp;gt; ]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Release Candidate (for testing purposes) ===&lt;br /&gt;
&#039;&#039;&#039;[http://springrts.com/dl/spring_0.80.1.exe &amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;Release candidate installer&amp;lt;/span&amp;gt; ]&#039;&#039;&#039; version 0.80.1 ~20MB, added 2009-08-12&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nightly Builds (for developers/testers) ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://buildbot.eat-peet.net/spring/installer/ &amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;click here for a list of test builds (only for testing purposes)&amp;lt;/span&amp;gt;]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==[[image:200px-Tux.svg.png|Linux|30px]] Linux==&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;[[SetupGuide|&amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;Linux set up guide&amp;lt;/span&amp;gt;]]&#039;&#039;&#039; provides set up information for various Linux distributions.&lt;br /&gt;
&lt;br /&gt;
Please note that due to the amount of distributions out there, we cannot provide binary packages for each of them. If yours is not listed there, you most likely need to build it yourself. If you do so, please share your results with others.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Mac OS X==&lt;br /&gt;
&lt;br /&gt;
Sorry no download yet.&lt;br /&gt;
The Mac OS X port is rough and unfinished. Help with its development would be greatly appreciated. More information on the current state of this port can be found &#039;&#039;&#039;[[Spring_on_MacOSX|&amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;here&amp;lt;/span&amp;gt;]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=Source Code=&lt;br /&gt;
{{Obtaining_The_Source_Code}}&lt;br /&gt;
&lt;br /&gt;
=== Building instructions ===&lt;br /&gt;
If you want to compile it yourself, see [[Building_spring]] for some tips.&lt;br /&gt;
&lt;br /&gt;
=Lobby server=&lt;br /&gt;
&lt;br /&gt;
If you do not want (or are unable) to use the public lobby server, you can download the server software here to run your own. See the readme &#039;&#039;&#039;[http://springrts.com/dl/tasserver_readme.txt &amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;here&amp;lt;/span&amp;gt;]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://springrts.com/dl/TASServer.jar &amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;Click here to download&amp;lt;/span&amp;gt;]&#039;&#039;&#039; 100.7kb, added 2008-03-02 (requires Java Runtime Environment)&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:SMD&amp;diff=13572</id>
		<title>Mapdev:SMD</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:SMD&amp;diff=13572"/>
		<updated>2009-08-31T18:38:44Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SMD Syntax ==&lt;br /&gt;
The SMD, to work correctly, must be set out correctly. The following are a few of these requirements that you have to follow:&lt;br /&gt;
*All lines must end in a &#039;;&#039;. This is just like any C derived programming language&lt;br /&gt;
*Sections begin with a keyword wrapped in [Square brackets], and are wrapped in {Curly Brackets}&lt;br /&gt;
*Each different tag must be placed on a different line (?)&lt;br /&gt;
&lt;br /&gt;
The following are some recomendations to help other people read your SMD.&lt;br /&gt;
*Blank lines are allowed, and can be placed to help distinguish between different sections&lt;br /&gt;
*You may place comments in the SMD, and again like C programming languages, these are preceded by a &#039;//&#039;. Anything following a comment marker is ignored by the parser.&lt;br /&gt;
*You can tabulate your SMD to help the overall readability, and to show where sections begin and end.&lt;br /&gt;
&lt;br /&gt;
== Example SMD ==&lt;br /&gt;
&lt;br /&gt;
 [MAP]&lt;br /&gt;
 {&lt;br /&gt;
 	Description=Lot of metal in middle but look out for kbot walking over the mountains;&lt;br /&gt;
 	TidalStrength=20;&lt;br /&gt;
 	Gravity=130;&lt;br /&gt;
 	MaxMetal=0.03;&lt;br /&gt;
 &lt;br /&gt;
 	ExtractorRadius=400;&lt;br /&gt;
 	MapHardness=100;&lt;br /&gt;
 	&lt;br /&gt;
 	[SMF]&lt;br /&gt;
 	{&lt;br /&gt;
 	 	minheight = -135;&lt;br /&gt;
 	 	maxheight = 265;&lt;br /&gt;
 	}&lt;br /&gt;
 	[ATMOSPHERE]&lt;br /&gt;
 	{&lt;br /&gt;
 		FogColor=0.7 0.7 0.8;&lt;br /&gt;
 		FogStart=0.2;&lt;br /&gt;
 &lt;br /&gt;
 		CloudColor=0.9 0.9 0.9;&lt;br /&gt;
 		SkyColor=0.1 0.15 0.7;&lt;br /&gt;
 &lt;br /&gt;
 		SunColor=1.0 1.0 1.0;&lt;br /&gt;
 		CloudDensity=0.55;&lt;br /&gt;
 &lt;br /&gt;
 		MinWind=5;&lt;br /&gt;
 		MaxWind=20;&lt;br /&gt;
 	}&lt;br /&gt;
 	[WATER]&lt;br /&gt;
 	{&lt;br /&gt;
 		WaterBaseColor=0.4 0.6 0.8;&lt;br /&gt;
 		WaterAbsorb=0.004 0.004 0.002;&lt;br /&gt;
 &lt;br /&gt;
 		WaterMinColor=0.1 0.1 0.3;&lt;br /&gt;
 	}&lt;br /&gt;
 	[LIGHT]&lt;br /&gt;
 	{&lt;br /&gt;
 		SunDir=0 1 2;&lt;br /&gt;
 		&lt;br /&gt;
 		GroundAmbientColor=0.4 0.4 0.4;&lt;br /&gt;
 		GroundSunColor=0.7 0.7 0.7;&lt;br /&gt;
 &lt;br /&gt;
 		GroundShadowDensity=0.8;&lt;br /&gt;
 &lt;br /&gt;
 		UnitAmbientColor=0.3 0.3 0.3;&lt;br /&gt;
 		UnitSunColor=0.8 0.8 0.8;&lt;br /&gt;
 		UnitShadowDensity=0.8;&lt;br /&gt;
 &lt;br /&gt;
 	}&lt;br /&gt;
 	[TEAM0]&lt;br /&gt;
 	{&lt;br /&gt;
 		StartPosX=600;&lt;br /&gt;
 		StartPosZ=600;&lt;br /&gt;
 	}&lt;br /&gt;
 	[TEAM1]&lt;br /&gt;
 &lt;br /&gt;
 	{&lt;br /&gt;
 		StartPosX=3600;&lt;br /&gt;
 		StartPosZ=3600;&lt;br /&gt;
 	}&lt;br /&gt;
 	[TEAM2]&lt;br /&gt;
 	{&lt;br /&gt;
 		StartPosX=3600;&lt;br /&gt;
 		StartPosZ=600;&lt;br /&gt;
 	}&lt;br /&gt;
 	[TEAM3]&lt;br /&gt;
 	{&lt;br /&gt;
 		StartPosX=600;&lt;br /&gt;
 		StartPosZ=3600;&lt;br /&gt;
 &lt;br /&gt;
 	}&lt;br /&gt;
 	[TEAM4]&lt;br /&gt;
 	{&lt;br /&gt;
 		StartPosX=2000;&lt;br /&gt;
 		StartPosZ=600;&lt;br /&gt;
 	}&lt;br /&gt;
 	[TEAM5]&lt;br /&gt;
 &lt;br /&gt;
 	{&lt;br /&gt;
 		StartPosX=2000;&lt;br /&gt;
 		StartPosZ=3600;&lt;br /&gt;
 	}&lt;br /&gt;
 	//Up to [TEAM9]&lt;br /&gt;
 	[TERRAINTYPE0]&lt;br /&gt;
 	{&lt;br /&gt;
 		name=default;&lt;br /&gt;
 		hardness=1;&lt;br /&gt;
 		tankmovespeed=1;&lt;br /&gt;
 		kbotmovespeed=1;&lt;br /&gt;
 		hovermovespeed=1;&lt;br /&gt;
 		shipmovespeed=1;&lt;br /&gt;
 &lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== SMD Tags List ==&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;th valign=&amp;quot;top&amp;quot; bgcolor=&amp;quot;#C0C0C0&amp;quot;&amp;gt;Variable&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th valign=&amp;quot;top&amp;quot; bgcolor=&amp;quot;#C0C0C0&amp;quot;&amp;gt;Description&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th valign=&amp;quot;top&amp;quot; bgcolor=&amp;quot;#C0C0C0&amp;quot;&amp;gt;Examples&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;[TEAM&#039;&#039;X&#039;&#039;]&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The number of the team, starting at 0 for player 1 and going on up to 9 for player 10, where &#039;&#039;X&#039;&#039; is the player number&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;[TEAM3]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;[TERRAINTYPE&#039;&#039;X&#039;&#039;]&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Used to define different terrain types that exist on the map. The value starts at 0 and goes on for as many terrain types as you have, where &#039;&#039;X&#039;&#039; is the type number. Which terrain type goes where on the map is determined by the typemap when compiling the map. For example, if the typemap has an area of red 128, then the corresponding terraintype tag is [TERRAINTYPE128] &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;[TERRAINTYPE0]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;CloudColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The color of the clouds. The values are in the order Red, Green, Blue. For all intensive purposes, 0.0 is black and 1.0 is white; however, giving values higher than 1.0 will give brighter fog and less than 0.0 will give darker.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;CloudColor=0.9 0.9 0.9;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;CloudDensity&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The number of clouds in the sky. A percentage in decimal form, 0.0 to 1.0.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;CloudDensity=0.55;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;Description&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The description of the map that shows in the multiplayer battleroom.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Description=Strong wind, good for 2v2 team games;&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;ExtractorRadius&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The radius of effect that a single extractor will extract from. If two radii intersect, both extractors will suffer from reduced output.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;ExtractorRadius=400;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;GroundAmbientColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The ambient (non-sun-lit) color of ground, grass, trees and other features.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;GroundAmbientColor=0.4 0.4 0.4;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;GroundShadowDensity&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;How far from the non shadowed to the ambient color stuff in shadow will go.&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;GroundShadowDensity=0.8;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;GroundSunColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The color of ground where it is fully sun lit (added to &amp;lt;i&amp;gt;GroundAmbientColor&amp;lt;/i&amp;gt;).&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;GroundSunColor=0.7 0.7 0.7;&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;FogColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The color of the fog and the infinite plane below the world. The values are in the order Red, Green, Blue. For all intensive purposes, 0.0 is black and 1.0 is white; however, giving values higher than 1.0 will give brighter fog and less than 0.0 will give darker.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;FogColor=0.7 0.7 0.8;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;FogStart&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The distance from the camera at which the fog will start.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;FogStart=0.2;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;Hardness (terraintype)&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Used as a multiplier against the &amp;lt;i&amp;gt;MapHardness&amp;lt;/i&amp;gt; value. Can be used to make a particular terrain type softer or harder. A value of &#039;1&#039; will make it as hard as &amp;lt;i&amp;gt;MapHardness&amp;lt;/i&amp;gt;, and 0.5 will make it half as hard.&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;hardness=0.75;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;HoverNoveSpeed&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Speed multiplier for hovercraft when travelling on the parent terrain type. A value of &#039;1&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;hovermovespeed=1;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;KbotMoveSpeed&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Speed multiplier for Kbots when travelling on the parent terrain type. A value of &#039;1&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;kbotmovespeed=1;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;MapHardness&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Defines how much the terrain will deform due to explosions and weapons.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;MapHardness=100;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;MaxMetal&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;How much metal a map square with the maximum metal value gives. Unsure how this is calculated, but a value of around 0.03 will give OTA-esque levels of metal from metal extractors.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;MaxMetal=0.03;&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;MaxWind&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The maximum amount of energy the wind on the map will give.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;MaxWind=20;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;MinWind&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The minimum amount of energy the wind on the map will give.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;MinWind=5;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;Name (terraintype)&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Used to define the name of the type of terrain. &amp;quot;Snow&amp;quot; or &amp;quot;Rock&amp;quot; or whatever you want.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Name=default;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;ShipMoveSpeed&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Speed multiplier for Ship when travelling on the parent terrain type. A value of &#039;1&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;shipmovespeed=1;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;SkyColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The color of the sky itself. Works the same way as &amp;lt;i&amp;gt;CloudColor&amp;lt;/i&amp;gt; and &amp;lt;i&amp;gt;FogColor&amp;lt;/i&amp;gt;.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;SkyColor=0.1 0.15 0.7;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;StartPosX&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The X (east-west in the TA camera) coordinates on the map where the player will start.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;StartPosX=600;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;StartPosZ&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The Z (north-south in the TA camera) coordinates on the map where the player will start.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;StartPosZ=600;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;SunColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The color of the sun in the sky. This will also effect the size of the star. As the value increases (including over 1.0), the disc will get bigger; the inverse is also true.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;SunColor=1.0 1.0 1.0;&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;SunDir&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The direction of the sun, which is normalized by Spring. The Y-axis is up. Here&#039;s a basic chart for values:&lt;br /&gt;
      &amp;lt;center&amp;gt;&lt;br /&gt;
      &amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;210px&amp;quot; align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;tr height=&amp;quot;70px&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;td width=&amp;quot;70px&amp;quot;&amp;gt;1 .5 -1&amp;lt;/td&amp;gt;&amp;lt;td width=&amp;quot;70px&amp;quot;&amp;gt;0 .5 -1&amp;lt;/td&amp;gt;&amp;lt;td width=&amp;quot;70px&amp;quot;&amp;gt;-1 .5 -1&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;tr height=&amp;quot;70px&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;1 .5 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0 1 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1 .5 0&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;tr height=&amp;quot;70px&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;1 .5 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0 .5 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1 .5 1&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
      &amp;lt;/table&amp;gt;&lt;br /&gt;
      &amp;lt;/center&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;SunDir=0 1 2;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;TankMoveSpeed&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Speed multiplier for tanks when travelling on the parent terrain type. A value of &#039;1&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;tankmovespeed=1;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;TidalStrength&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The amount of energy which will be given by tidal generators.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;TidalStrength=30;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;UnitAmbientColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The ambient (non-sun-lit) color of units and corpses.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;UnitAmbientColor=0.3 0.3 0.3;&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;UnitShadowDensity&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;How far from the non shadowed to the ambient color stuff in shadow will go.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;UnitShadowDensity=0.8;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;UnitSunColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The color of units where they is fully sun lit (added to &amp;lt;i&amp;gt;UnitAmbientColor&amp;lt;/i&amp;gt;).&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;UnitSunColor=0.8 0.8 0.8;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterAbsorb&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;How fast different colors (RGB in order) are absorbed by the water. Can be used to make the water look murky at deeper sections and so on. How this works: the waterabsorb value for the color channel gets multiplied by the depth of the water at a point, and this product gets subtracted from &#039;&#039;WaterBaseColor&#039;&#039;, until &#039;&#039;WaterMinColor&#039;&#039; is reached. Example: &#039;&#039;WaterAbsorb&#039;&#039; is 0.01, for the red channel, and we want to know how much red will be left in the water at a Spring elevation of -100, since 0.01*100= 1 , at this depth, there will be no more red component in the water, unless &#039;&#039;WaterMinColor&#039;&#039; is higher than 0 on the red channel.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterAbsorb=0.004 0.004 0.002;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterBaseColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The color of the water just beneath the surface plane. This is the starting color from which deeper waters will absorb more color.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterBaseColor=0.4 0.6 0.8;&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterMinColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The smallest values the water will go down to due to &amp;lt;i&amp;gt;WaterAbsorb&amp;lt;/i&amp;gt;.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterMinColor=0.1 0.1 0.3;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterPlaneColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;This set the color of the groundplane under the water outside the map boundaries&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterPlaneColor = 0.75 0.8 0.85; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterSurfaceColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The color of the water surface. Mostly affects the colors of the reflections off the top of the water. Does&#039;&#039;&#039; NOT&#039;&#039;&#039; effect bumped water!&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterSurfaceColor = 0.75 0.8 0.85; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt; &lt;br /&gt;
    &amp;lt;td valign=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
== Bump mapped water SMD tags.==&lt;br /&gt;
&#039;&#039;&#039; These tags only affect bump mapped water and dont affect the other types. &#039;&#039;&#039;&lt;br /&gt;
 &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterSurfaceAlpha&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Transparency of the water surface. 0 meaning almost fully transparent water plane(low amount of reflections visible), and 1 being nearly opaque (massive amount of reflections). Default=0.55&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterSurfaceAlpha = 0.55; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterDiffuseColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;This specifies the diffuse color of the water body. &#039;&#039;&#039;WARNING&#039;&#039;&#039;: use of this tag disables the effect of &#039;&#039;WaterAbsorb&#039;&#039; , in fact, this tag does nothing but disable WaterAbsorb. Avoid.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterDiffuseColor = 0.55 0.4 0.3; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterSpecularColor &#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterSpecularColor = groundSunColor - Altering this tag does not seem to have any effect at all.-&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt; //WaterSpecularColor = 0.55 0.4 0.3; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterSpecularPower &#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt; -no clue-&#039;&#039;&#039;WARNING&#039;&#039;&#039;: use of this tag disables the effect of &#039;&#039;WaterAbsorb&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterSpecularPower = 2.0; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterSpecularFactor &#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt; -no clue-&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterSpecularFactor = 0.3; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterAmbientFactor &#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt; -no clue-&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterAmbientFactor = 1.3; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterDiffuseFactor &#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt; -no clue-&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterDiffuseFactor = 0.3; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterFresnelMin&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;I have no clue what the WaterFresnel tags do, someone with more knowlegde edit this page please.(0.0&amp;lt;x&amp;lt;=1.0)&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterFresnelMin = 0.3; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterFresnelMax&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;(&amp;lt;1-WaterFresnelMin)&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterFresnelMax = 0.8; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterFresnelPower&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;-no clue-&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterFresnelPower = 4; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterReflectionDistortion&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;How much the surface should distort reflections that are cause by waves not being level: ergo it adds more choppyness to your reflections sensible from 0 to 20&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterReflectionDistortion = 0.1; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterBlurBase&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Something to do with blur, but it just seems to cause banding with values under 2 and corruption with values above 10&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterBlurBase = 2; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterBlurExponent&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;How much reflections on water surface should be blurred together with the water surface, lower values meaning clearer reflections, (0.2-5) Warning: above 5 seems to cause water corruption&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterBlurExponent = 2; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterPerlinStartFreq&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Wave sizes, smaller = big waves, sensible: 1-20 (influence the wave sizes) default=8&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterPerlinStartFreq = 8; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterPerlinLacunarity&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;new, any float; seems to define the size of the perlin waves, small values being big waves (0.2-5 is sensible) default= 3&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterPerlinLacunarity = 3; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterPerlinAmplitude&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Base stillness of water surface, 0 is dead still, 1 is &#039;windy&#039; .This doesnt affect the bump texture depth, besides the fact that this disables the bump texture when set to 0   default=0.9 &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterPerlinAmplitude= 0.9; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:MapDesignHelp(IceXuick)&amp;diff=18675</id>
		<title>Tutorial:MapDesignHelp(IceXuick)</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:MapDesignHelp(IceXuick)&amp;diff=18675"/>
		<updated>2009-08-31T18:34:34Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;How to build a map&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Hello, welcome to the IceXuick map Design help. On this wiki page i will try to make a complete and organized &#039;topic&#039; how to build a map, from A-Z. Tips, add-ons or other suggestions are always welcome. OKAY.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;What do you need:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
First of all i&#039;ll sum up the thing you need:&lt;br /&gt;
&lt;br /&gt;
- Photoshop / Gimp (or other image editor)&amp;lt;br&amp;gt;&lt;br /&gt;
- Bryce / L3dT (optional, if you don&#039;t want a great looking texture)&amp;lt;br&amp;gt;&lt;br /&gt;
- Mothers MapConv (map converter program)&amp;lt;br&amp;gt;&lt;br /&gt;
- Patience &amp;amp; passion&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have most of these things, you can start thinking about the map you want to make. It is very smart to make sketches of your map, before creating it. Try to design the map, so that in your &#039;mind&#039; it could play well. Think of possible problems as porcing probabilities, turtling, strategic important places, but also metal layouts, geo-vent locations, and maybe even feature-placement.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;What are you going to make:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Well, how much different things you might have read, these are the things i use, and work very well, so i suggest you use this, and nothing else :). To know how big your map will be, the factor is 512 times the TA:S size: here are some (total)map sizes and corresponding dimensions:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TA Spring ---- Actual Pixels&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
32 x 24 ------ 16384 x 12288&amp;lt;br&amp;gt;&lt;br /&gt;
16 x 12 ------ 8192  x 6144&amp;lt;br&amp;gt;&lt;br /&gt;
8 x 4 -------- 4096  x 2048&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the best order in which you should work:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Heightmap&#039;&#039;&#039; ... bmp 24-bit - 1/8 +1 of Total map size&amp;lt;br&amp;gt;&lt;br /&gt;
- &#039;&#039;&#039;Metalmap&#039;&#039;&#039; ..... bmp 24-bit - 1/8 +1 of Total map size&amp;lt;br&amp;gt;&lt;br /&gt;
- &#039;&#039;&#039;Featuremap&#039;&#039;&#039; .. bmp 24-bit - 1/8 of Total map size&amp;lt;br&amp;gt;&lt;br /&gt;
- &#039;&#039;&#039;Typemap&#039;&#039;&#039; ...... bmp 24-bit - 1/16 of Total map size&amp;lt;br&amp;gt;&lt;br /&gt;
- &#039;&#039;&#039;TestTexture&#039;&#039;&#039; .. bmp 24-bit - Total map size&amp;lt;br&amp;gt;&lt;br /&gt;
- &#039;&#039;&#039;Compiling&#039;&#039;&#039; ..... your maps with Mothers MapConv&amp;lt;br&amp;gt;&lt;br /&gt;
- &#039;&#039;&#039;SMD file&#039;&#039;&#039; ........ script of all kinds of things, including atmosfear, colors of sky and water, fog settings, but more important, metaloutput, winds, tidal, start locations and terraintypes.&amp;lt;br&amp;gt;&lt;br /&gt;
- &#039;&#039;&#039;Test Phase&#039;&#039;&#039; ... debug your map a much as possible&amp;lt;br&amp;gt;&lt;br /&gt;
- &#039;&#039;&#039;Texturemap&#039;&#039;&#039; .. bmp 24-bit - Total map size&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The Heightmap:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here are in following order the things that are to be done:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- roughly outlining large mountains/valleys&amp;lt;br&amp;gt;&lt;br /&gt;
- go deeper into detail by lowering size of drawing brush&amp;lt;br&amp;gt;&lt;br /&gt;
- finalize details with 15px brush (in Photoshop)&amp;lt;br&amp;gt;&lt;br /&gt;
- make slopes/passages on your map with smudge/blur tools&amp;lt;br&amp;gt;&lt;br /&gt;
- Texturemap - bmp 24-bit - Total map size&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The heightmap is one the the most important things you make for a map, and therefor i always start with it. After you have drawn your concept of your map (sketches) you may want to digitize them (if you don&#039;t already have that) and you should think which mapsize would be best. If you want your map to be a 8x8 map you should (first) also make the heightmap this size. By doing so, you can use Bryce or L3dT to render your texture at the highest possible quality.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So you now are going to start working in Photoshop (or other image program). Try to remake your sketch by drawing different shades of grey. White is the highest (255) and black (0) is the lowest. You can start drawing roughly, to outline every hill or valley. After that, try and go deeper into detail, and finally use  a brush size of 15px in Photoshop for the final details.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To make your map work for all the units, it should have passable slopes and passages: use a &#039;Smudge&#039;-tool (optionally also Blur-tool). A lot of programs have this, so you should be able to figure it out. For every slope or passage that needs to be passable, the gradient from the lowest to the brightest color of that slope should be as smooth as possible. You need to get the feel of the smudge-tool in Photoshop, but after a while you&#039;ll get the hang of it. Also try to make slopes that have a big difference in highest and lowest point, long and smooth.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When you think everything is smooth and detailed, save that image as FullHeight.bmp, at the same size as the Total Map. After that, scale down this file to 1/8th of the size of the Total map, +1 pixel (x and y), and save this one as Height.bmp&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The Metalmap:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Okay, for playtesting value, you can now make your metal map. This is at first quite simple, and easily done, but the placement and balance is very hard. You can only try and think of good locations, and the output should be 15 metal per player (non-moho), if they have their part of the map (on a four player map, this would be 1/4th of the map)&lt;br /&gt;
&lt;br /&gt;
In Photoshop, make another layer onto your heightmap, and put metal places around the map. Use a 6 or 8px &#039;&#039;&#039;PENCIL&#039;&#039;&#039; for the metal patches, and paint with red 255 (make sure there is no antialiasing, so that every pixel is RED 255.&lt;br /&gt;
&lt;br /&gt;
When done, you can save this file as Metal.bmp (1/8th of Total map size +1).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The Featuremap:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the featuremap you can place Geo-vents, Trees, grass, and extra features like rocks,  palms, energy spires. You need to have these &#039;extra&#039; features, later to be compiled within the map. Geo&#039;s, tree&#039;s and grass will work automatically. For the extra features, you need to get the whole pack, which consists of a couple of maps with files for the model, the texture and the script. Check the &amp;quot;maps&amp;quot; forum for features that were created.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Geo&#039;s&#039;&#039;&#039; are represented by &#039;&#039;&#039;GREEN&#039;&#039;&#039; (255), single pixels. Every green (255), pixel will (most likely) be compiled as a geo-vent.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The shades 200-215 of GREEN are different &#039;&#039;&#039;Tree-types&#039;&#039;&#039;. Remember to use 1 single pixel for tree&#039;s as well. 200-206 seem to be coniferous tree, 207-215 seem to be decidious.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;BLUE&#039;&#039;&#039; represents the ammount of &#039;&#039;&#039;Grass&#039;&#039;&#039; to be placed, where black means none, and BLUE (255) means full spreading of grass)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Than Last but not least, &#039;&#039;&#039;RED&#039;&#039;&#039;, for the &#039;&#039;&#039;Features&#039;&#039;&#039;. In the FS.txt file (that comes with Mothers MapConv, you can list all your features, that you want to use. The first feature that is listed in this file, will be represented as RED 255. The second feature will be RED 254, the third RED 253, and so on. Also features will need only one pixel.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Try to make sure that no one of those pixel are next to each other within 4-5 pixels. This may crash during compiling, or gives strange results in-game.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The Typemap:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Okay, the Typemap, also known as the TerrainType map, let&#039;a you set the &#039;&#039;&#039;terrain name&#039;&#039;&#039;, the unit categories &#039;&#039;&#039;speed multipliers&#039;&#039;&#039;, and also the &#039;&#039;&#039;hardness multiplier&#039;&#039;&#039;. This map works again with RED only. Every Shade of RED can be set in the SMD file, on which i&#039;ll return later on. The Typemap that worked for me is &#039;&#039;&#039;NOT&#039;&#039;&#039; the same as the height- and metalmap, but is &#039;&#039;&#039;1/16th&#039;&#039;&#039; of the Total Map size.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
So an 8x8 map is Total 4096 x 4096 pixels. If we then do the math: 4096 /16 = 256. (otherwise there will be a default terraintype (that you did not set) between different terraintypes, and this can be very annoying)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Draw your &#039;terrain&#039; onto your heightmap (make sure you again use the &#039;&#039;&#039;PENCIL&#039;&#039;&#039; mode, without antialiasing around your pixels), and save it as a BMP in 1/16th of the Total Map size (Typemap.bmp).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Test Texture:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You need to have a &#039;test&#039;-texture in order to compile, so you can simply make a big grey image, that has the &#039;&#039;&#039;right dimensions&#039;&#039;&#039; (for 16x16 it will be 8192x8192). Save this as Texture.bmp&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Compiling your map:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before rendering your final, huge, super shweet texture, you want to know if your map plays okay, and that&#039;s why we first going to compile the map:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
- how is the heightmap, &#039;&#039;&#039;check it for all units&#039;&#039;&#039; if everything works&amp;lt;br&amp;gt;&lt;br /&gt;
- is the metal placing and spacing okay? are there spots on slopes or unbuildable terrain, or unreachable.&amp;lt;br&amp;gt;&lt;br /&gt;
- are the geo&#039;s working, and also well placed (no clusters of geo&#039;s?)&amp;lt;br&amp;gt;&lt;br /&gt;
- do units move quite right, or do they get stuck all the time&amp;lt;br&amp;gt;&lt;br /&gt;
- how is the water level (if there is any)&amp;lt;br&amp;gt;&lt;br /&gt;
- are the starting locations allright?&amp;lt;br&amp;gt;&lt;br /&gt;
- maybe you already want to check the other features, as grass, trees or extra&#039;s?&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Therefor, we are going to compile this thing first, to check all these things in-game. This will save you numerous re-renderings. And changes in the heightmap after the render, is &#039;&#039;&#039;NOT&#039;&#039;&#039; recommended. Esspecially for the people that play in &#039;&#039;&#039;TA-cam mode&#039;&#039;&#039;, because they have to be able to tell from above what the terrain is like.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Okay, if you did all of the above, and did it perfect, than this will be your first and second last compile... but trust me, you will compile a &#039;&#039;&#039;couple of times&#039;&#039;&#039; more, if you want the map to play well!&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Although there is a mapcompiler in the works as i type this, for now we need to do it the old fashioned way, by DOS.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unpack the files of &#039;&#039;&#039;Mothers MapConv&#039;&#039;&#039; into your directory with all your previously saved files. &#039;&#039;&#039;Make sure&#039;&#039;&#039; that all the (sub-)directories to this location &#039;&#039;&#039;DON&#039;T have SPACES&#039;&#039;&#039; in them! After this being said, you will need to go to DOS mode.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
In Windows, go to &amp;quot;start&amp;quot;, and then &amp;quot;run&amp;quot;, and type &#039;cmd&#039; (without the quotes). This will bring up the commandline prompt. Navigate to your directory in which all bmp&#039;s and Mothers Mapconv are located. I ain&#039;t gonna explain how you navigate is DOS, if you got this far, you probably know your way around with computers.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once in the right directory/folder, type &#039;MapConv --help&#039; for a explaination of all parameters. This is not nescesary if you use it as following:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MapConv -f Features.bmp -i -l -c 0.5 -x 300 -n -150 -o YourMapName.smf -y Typemap.bmp -m Metal.bmp -a Height.bmp -t Texture.bmp&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This line will compile your map will the above created files, and compresses it only half (normal compression is 0.8), what will leave a bit more of your original texture in tact, however your filesize will be higher.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* The -i -l commands are nescesary.&amp;lt;br&amp;gt;&lt;br /&gt;
* The 0.5 compression can be altered to 0.8 or for high quality to 0.2 or 0.3&amp;lt;br&amp;gt;&lt;br /&gt;
* the -x is the maximum height and -n the, yes, minimum&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get the water level right you can &#039;&#039;&#039;calculate the best values&#039;&#039;&#039; for the max. and min. height. Check your height.bmp and look which grey value you like to be the surface of the water (darker is submerged, higher is land). If this is grey 80, than you know that 80/(255/100) = 31.4% should be submerged. Depending on what total height you want to use, be sure that the zero-0-point (which is the water level) is at 31.4%. So if you want around 600 height difference in total, then you should use -x 412 -n -188 (you may do the math yourself). This should get near the water altitude that you want. Otherwise recompile and test again!&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If all went well, you should now have &#039;&#039;&#039;4 new files&#039;&#039;&#039; in that same directory.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;mini.bmp&#039;&#039;&#039; - absolete, you don&#039;t need this.&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;mini.dds&#039;&#039;&#039; - needed for minimap 1024x1024 (texture in DirectX format DTX1)&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;YourMapName.smf&#039;&#039;&#039; - Feature file&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;YourMapName.smt&#039;&#039;&#039; - Texture file&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you have the basic files that TA:Spring can read, BUT you need to &#039;&#039;&#039;&#039;sd7&#039;&#039;&#039;&#039; them. SD7-ing kind of &#039;zips&#039; these files into &#039;one map-zip-file-archive&#039;. How you do this, is quite important.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
First make a &#039;&#039;&#039;new&#039;&#039;&#039; sub-directory, i always name it after the version, so &#039;v01&#039; wil be right. In this directory, you need to make &#039;&#039;&#039;another sub-directory&#039;&#039;&#039; called &#039;maps&#039;. In THIS directory, you need to place your .dds, .smf and .smt files. If you have downloaded extra features (with directories included such as &#039;features&#039;, &#039;objects3d&#039; and &#039;unittextures&#039;) you need to copy them to the &#039;v01&#039; directory as well, so it&#039;s &#039;&#039;&#039;next&#039;&#039;&#039; to your &#039;maps&#039; subdirectory, not in the &#039;maps&#039; dir. Also do &#039;&#039;&#039;NOT forget&#039;&#039;&#039; to copy your &#039;&#039;&#039;fs.txt&#039;&#039;&#039; file from your &#039;edit&#039; directory, into the &#039;v01&#039; directory.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create or Edit an SMD file:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you have to create (or copy paste) a .smd file, that will be put next to the other files in the &#039;maps&#039; sub-directory. I will post the most important stuff needed. You may also use the &#039;&#039;&#039;SMD Creator&#039;&#039;&#039;, which is also available for download somewhere, and quite &#039;&#039;&#039;handy for sun direction and colors&#039;&#039;&#039;, but &#039;sometimes&#039; a bit buggy when opening and re-saving a file &#039;&#039;&#039;(crashes)&#039;&#039;&#039;. The most important stuff,&#039;&#039;&#039;--&#039;&#039;&#039; means that i&#039;ve deleted something, and the &#039;&#039;&#039;//&#039;&#039;&#039; + remarks are to be removed:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[MAP]&amp;lt;br&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
Description=Describe your map shortly, it can be seen in the lobby;&amp;lt;br&amp;gt;&lt;br /&gt;
TidalStrength=10; //Energy that Tidal generators will give. (10-30)&amp;lt;br&amp;gt;&lt;br /&gt;
Gravity=120; //variable, 120-150 is kinda standard, test on map&amp;lt;br&amp;gt;&lt;br /&gt;
MaxMetal=1.2; //metal output rate. &amp;lt;1 is more OTA, &amp;gt;1 is more XTA&amp;lt;br&amp;gt;&lt;br /&gt;
ExtractorRadius=100; // radius of mexxes, 40-50 tiny, &#039;&#039;&#039;100 desirable&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
MapHardness=100; // Global hardness of terrain 100 will deform from shots&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[ATMOSPHERE]&amp;lt;br&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
--&amp;lt;br&amp;gt;&lt;br /&gt;
MinWind=1; // minimum wind&amp;lt;br&amp;gt;&lt;br /&gt;
MaxWind=25; // max wind, know that a &#039;&#039;&#039;average of 10 is almost equal to solar&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
--&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[TERRAINTYPE50]&amp;lt;br&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
name=SoftTerrain; // name that will be shown in-game on mouse-hover&amp;lt;br&amp;gt;&lt;br /&gt;
hardness=2; // multiplier of Global MapHardness&amp;lt;br&amp;gt;&lt;br /&gt;
tankmovespeed=0.9; // The speed multiplier of the different units&amp;lt;br&amp;gt;&lt;br /&gt;
kbotmovespeed=1; &amp;lt;br&amp;gt;&lt;br /&gt;
hovermovespeed=1; &amp;lt;br&amp;gt;&lt;br /&gt;
shipmovespeed=0; // &#039;&#039;&#039;0 means impassable&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[TEAM0]&amp;lt;br&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
StartPosX=250; // start x-coord. of player 1&amp;lt;br&amp;gt;&lt;br /&gt;
StartPosZ=250; // start y-coord. of player 1&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
[TEAM1] // &#039;&#039;&#039;TEAM0 is player 1 and TEAM1 is player 2&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
StartPosX=4950;&amp;lt;br&amp;gt;&lt;br /&gt;
StartPosZ=4950;&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
etc..&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After you are satisfied with all the settings, you can then save this file as &#039;YourMapName.smd&#039;. PLace it &#039;&#039;&#039;next&#039;&#039;&#039; to the other YourMapName.* files, in the &#039;maps&#039; subdirectory, so that there are now &#039;&#039;&#039;4 files&#039;&#039;&#039; there.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assuming you have downloaded a &#039;&#039;&#039;7z zip program&#039;&#039;&#039; (which you can (re)name to .sd7) you then go into your &#039;v01&#039; directory, and zip all those directories, including the fs.txt file if you use extra features. Three important things:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* name your map &#039;YourMapName.sd7&#039; and &#039;&#039;&#039;NOT else&#039;&#039;&#039; (use &#039;&#039;&#039;exact&#039;&#039;&#039; same name as with compile)&amp;lt;br&amp;gt;&lt;br /&gt;
* Compression can be set to &#039;&#039;&#039;ultra&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Dictionary Size = 32 mb&amp;lt;br&amp;gt;&lt;br /&gt;
* Word size = 64 mb&amp;lt;br&amp;gt;&lt;br /&gt;
* do &#039;&#039;&#039;NOT&#039;&#039;&#039; make it an &#039;&#039;&#039;SOLID&#039;&#039;&#039; archive&amp;lt;br&amp;gt;&lt;br /&gt;
* Multi-threading, if you like&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When this is done, copy &#039;YourMapName.sd7&#039; into the maps folder of TA Spring, and off you go! &#039;&#039;&#039;You can now start your game from within TA:Spring!!&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The Testing Phase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Start up your map. If you did everything i told you to, &#039;&#039;&#039;it should work&#039;&#039;&#039;! The things i always do is build the following units to test the &#039;pathfinding&#039; and movement areas:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Peewee&#039;s&#039;&#039;&#039; - k-bot footprint - same movement for all k-bots&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Flashes&#039;&#039;&#039; - Tank footpring&amp;lt;br&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Hover Tank&#039;&#039;&#039; - Hover footpring&amp;lt;br&amp;gt;&lt;br /&gt;
* Build &#039;&#039;&#039;all metal spots&#039;&#039;&#039; with mexxes to check if their location is buildable&amp;lt;br&amp;gt;&lt;br /&gt;
* If watermap, build boats and subs&amp;lt;br&amp;gt;&lt;br /&gt;
* Optionally build exp. bots like Krogoth &amp;amp; Orcone&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When you&#039;ve build these units, select one, and &#039;&#039;&#039;press F2&#039;&#039;&#039;. You can now see where that unit can go (GREEN), where it will move slow (or fast downhill)(ORANGE), and where it &#039;&#039;&#039;CAN&#039;T move&#039;&#039;&#039;(RED). This last one is particulary important. Test all units this way, and check the whole map, if some type or more types of units can&#039;t go somewhere. If this is so, you need to &#039;&#039;&#039;smoothen out that slope&#039;&#039;&#039; in your heightmap (and make it probably longer as well, or change the &#039;&#039;&#039;heightdifference&#039;&#039;&#039;). It can also be that units &#039;&#039;&#039;CAN&#039;&#039;&#039; pass certain &#039;ridges&#039; that it weren&#039;t supposed to do. You can always do 2 things. &#039;&#039;&#039;OR&#039;&#039;&#039; you change the &#039;&#039;&#039;heightdifference&#039;&#039;&#039; (bigger is higher ridges), this is often the easiest way, &#039;&#039;&#039;OR&#039;&#039;&#039; you &#039;&#039;&#039;change your heightmap&#039;&#039;&#039;, and make it right, what very often is the way to do it best.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure you &#039;&#039;&#039;check&#039;&#039;&#039; these things as well:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* is the &#039;&#039;&#039;water level&#039;&#039;&#039; right?&amp;lt;br&amp;gt;&lt;br /&gt;
* How does the water look, do you need to change the colors?&amp;lt;br&amp;gt;&lt;br /&gt;
* How is the &#039;&#039;&#039;wind&#039;&#039;&#039;, do you like it, is it too much or too little&amp;lt;br&amp;gt;&lt;br /&gt;
* How is the &#039;&#039;&#039;sun&#039;&#039;&#039; working out (more on this after Final Texture)&amp;lt;br&amp;gt;&lt;br /&gt;
* Can &#039;&#039;&#039;hovercrafts&#039;&#039;&#039; go onto the water easily&lt;br /&gt;
* Do all the &#039;&#039;&#039;boats&#039;&#039;&#039; work fine (maybe water level too deep)&amp;lt;br&amp;gt;&lt;br /&gt;
* How does your map look in FPS or sort of view?&amp;lt;br&amp;gt;&lt;br /&gt;
* are the &#039;&#039;&#039;Geo&#039;s&#039;&#039;&#039; working?&amp;lt;br&amp;gt;&lt;br /&gt;
* Do all &#039;&#039;&#039;features&#039;&#039;&#039; work?&amp;lt;br&amp;gt;&lt;br /&gt;
* Is the &#039;&#039;&#039;metal output&#039;&#039;&#039; okay, too much, too little?&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You see, there is a &#039;&#039;&#039;LOT&#039;&#039;&#039; to test and check, So do play and test and play and test alot! &#039;&#039;&#039;If&#039;&#039;&#039; one or more of these things aren&#039;t working allright, you need to change it in the SMD or in your bmp&#039;s and recompile. If you are playing against AAI as a testing method, be &#039;&#039;&#039;SURE&#039;&#039;&#039; that if you recompile a &#039;&#039;&#039;changed height, metal or feature map&#039;&#039;&#039;, you need to &#039;&#039;&#039;delete all cached and cfg files&#039;&#039;&#039; in the AAI folders. Otherwise the AAI won&#039;t see the difference.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After multiple testrounds, you should have a good working map. If you like to &#039;organic-ize&#039; your map, you can/must do it now. If you make it too organic, the pathfinding and passable slopes could be distorted, and you don&#039;t want that! So you can heighten or lower certain parts, or even throw in a noize overlay, but be &#039;&#039;&#039;SURE&#039;&#039;&#039; that you check if the map still plays okay!&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ARE YOU READY??&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
OKay than you can start working on the looks!!&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The Texture:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remember the heightmap &amp;quot;fullHeight.bmp&amp;quot; we made bigger than we eventually will need? Well now you will see. Personally i use Bryce for rendering maps. I makes them nice and gives a perfect OTA feel to them. If you have Bryce, you must do the following steps:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- create a terrain&amp;lt;br&amp;gt;&lt;br /&gt;
- edit the terrain, go to the picture tab, and load &amp;quot;FullHeight.bmp&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
- optionally add some height- or slopenoise, but do not overdo this&amp;lt;br&amp;gt;&lt;br /&gt;
- set the material, choose one, alter it a bit, so you like it!&amp;lt;br&amp;gt;&lt;br /&gt;
- set the atmosfear, light angle, and play with the icons and colors&amp;lt;br&amp;gt;&lt;br /&gt;
- last but not least, make the camera settings right!&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To do this you need to enter camera mode (you&#039;ll a camera icon). Then you must click the grey triangle next to the round sphere thing. There you can click on &amp;quot;edit current camera&amp;quot;. In this menu, you must set the following where &#039;&#039;&#039;A&#039;&#039;&#039; an &#039;&#039;&#039;B&#039;&#039;&#039; are variables:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- - - - - &#039;&#039;&#039;x&#039;&#039;&#039; --- &#039;&#039;&#039;y&#039;&#039;&#039; --- &#039;&#039;&#039;z&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
origin -- 0 --- &#039;&#039;&#039;A&#039;&#039;&#039; --- 0&amp;lt;br&amp;gt;&lt;br /&gt;
pos - -- 0 --- &#039;&#039;&#039;A&#039;&#039;&#039; --- 0&amp;lt;br&amp;gt;&lt;br /&gt;
rotate - 90 -- 0 --- 0&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOV: 1 degree&lt;br /&gt;
Scale: &#039;&#039;&#039;B&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Only the first time, you need to tweak this, then you can save it as an template. The scale &#039;&#039;&#039;B&#039;&#039;&#039; should at least be 100% (but bigger ain&#039;t a problem).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
After that, you need to set the &#039;altitude&#039; of the camera with &#039;&#039;&#039;A&#039;&#039;&#039;. You need to tweak this, so that you terrain completely fills the map. It will be a &#039;&#039;&#039;large number&#039;&#039;&#039;, my template uses 25600. If you have a square map, set your document settings to square (800x800 for example). If it&#039;s not, make that change, just make sure the map fits the scene/screen.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When you are sure your map &#039;fits&#039; you can start your render. You must &amp;quot;Render to Disk&amp;quot; and you should also set the antialiasing to ultrafine for the best results (you can do this also in &amp;quot;document setup&amp;quot;).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If you are not sure the map fits 100% (in any case, don&#039;t make it TOO big, because you will &#039;&#039;&#039;loose map&#039;&#039;&#039; that way), than you should consider rendering a bit larger, let&#039;s say 3-5% bigger (for a render of 8192, render to 8500) and you can then later cut of the edges and change it to the desired size of your image in Photoshop. (Although this is &#039;&#039;&#039;NOT recommended&#039;&#039;&#039;)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Voila&#039;&#039;&#039;, after a couple of hours (depending on your system en scene settings) you&#039;ll probably have a nice render. (on which you can work later, to add more details...)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you can open this file again in Photoshop, and start working on the details. Most important of all, is that you add the metalspots. The best way to do this, is to open your Metal.bmp, scale it to you Total Map size (8192x8192 for example) and put this image in a layer on top of your final texture layer, and set the opacity to 30-50%. Now you can see where the metal is supposed to be, and you can start drawing these in the map. (You can also download the original TA Metal patches somewhere, and add these)&lt;br /&gt;
&lt;br /&gt;
After you have done all this, and are &#039;&#039;&#039;satisfied&#039;&#039;&#039; with the result, save your texture as Texture.bmp. You are now ready to compile it. You should use the settings that you now know (min. &amp;amp; max. height and compression setting). After Compiling, copy the files to your &#039;maps&#039; directory, SD7 them, and finally place the final &#039;YourMapName.sd7&#039; in your TA:Spring &#039;maps&#039; folder,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;you can now play it!!&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you also want to play it against other people, you should upload this sd7 file to Fileuniverse.com. Be sure to place it in the TA:Spring area, and also add a minimap (at least).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Hopefully you have enjoyed this tutorial. Question, tips and suggestion are always welcome!!&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Good Luck with mapping!!&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IceXuick&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:MapMaking(Runecrafter)&amp;diff=18737</id>
		<title>Tutorial:MapMaking(Runecrafter)</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:MapMaking(Runecrafter)&amp;diff=18737"/>
		<updated>2009-08-31T18:34:25Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
==Runecrafter&#039;s Map Tutorial==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Greetings, Myself (Runecrafter) and my fiancee (Moonchime) have been working on a map tutorial where we are going to try to teach you how to make maps quickly and easily.&lt;br /&gt;
&lt;br /&gt;
==A list of what you will require.==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Idea&#039;&#039;&#039;&lt;br /&gt;
**You will need to at least have an idea of what kind of map you&amp;lt;br&amp;gt;wish to make.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Art App&#039;&#039;&#039;&lt;br /&gt;
**Some kind of 2D art program, like [http://www.adobe.com/products/photoshop/main.html Photoshop], [http://www.corel.com/servlet/Satellite?pagename=Corel3/Products/Display&amp;amp;pfid=1047024307383&amp;amp;pid=1047025487586&amp;amp;cid=1047025488099&amp;amp;trkid=googlepsp&amp;amp;trkid=14679803 Paint Shop Pro], or [http://www.gimp.org/ The Gimp].&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;5 Images&#039;&#039;&#039;&lt;br /&gt;
**You will need to create 5 images: Height, Metal, Type, Featuremap, Texture&amp;lt;br&amp;gt;(Type is optional).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;[http://www.fileuniverse.com/?p=showitem&amp;amp;ID=1507 Mother&#039;s Mapconv]&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;[http://www.fileuniverse.com/?p=showitem&amp;amp;ID=1507 Mother&#039;s Mapconv &#039;Optimized&#039;]&#039;&#039;&#039;&lt;br /&gt;
**A program  to compile the 5 images into the map for Spring.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;[http://www.7-zip.org/ 7Zip]&#039;&#039;&#039;&lt;br /&gt;
**You will need this program (alot like WinZip) to compress the map&amp;lt;br&amp;gt;into a .sd7 or .sdz after you are done compiling with Mother&#039;s Mapconv.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ok Let&#039;s Get Started...==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Step 1: Size&#039;&#039;&#039;&lt;br /&gt;
**First we will need to determine the size that our map will be.Think of it this way,&amp;lt;br&amp;gt; a Spring map that is 2x2 in size will use a texture image that is 1024x1024&amp;lt;br&amp;gt;where a 4x4 map uses a texture image of 2048x2048 etc..&amp;lt;br&amp;gt;To get an idea of how big a map is,&amp;lt;br&amp;gt;10x10 or less is small&amp;lt;br&amp;gt;12x12 - 16x16 Medium&amp;lt;br&amp;gt;18x18 - 24x24 Large&amp;lt;br&amp;gt;26x26 - 30x30 Giant&amp;lt;br&amp;gt;32x32 and up OMG!&amp;lt;br&amp;gt;To my knowledge, 64x64 is the largest that Spring can take at this time.&amp;lt;br&amp;gt;For this tutorial we will make a 16x16 (Medium) Map.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Step 2: Height Map&#039;&#039;&#039;&lt;br /&gt;
**The Height map is the image that determines the shape of the map(i.e.- hills,&amp;lt;br&amp;gt; valleys, mountains, etc.). It is a &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Gray Scale&amp;lt;/font&amp;gt; image, that means that it only&amp;lt;br&amp;gt; uses the colors of Black and White. Where black is the lowest point on the map&amp;lt;br&amp;gt;and white is the highest point on the map.&amp;lt;br&amp;gt;There are 255 shades in the gray scale- where 0,0,0 is black and 255,255,255&amp;lt;br&amp;gt;is white.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;http://spring.clan-sy.com/w/images/3/34/Rune_Height.jpg&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
**Ok, now to make our Height map.&amp;lt;br&amp;gt;First, we need to determine the size that our Height map image needs to be.&amp;lt;br&amp;gt;Since our map is 16x16 that means that our Texture image will be 8192x8192,&amp;lt;br&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;the Height map is 1/8 the size of our Texture map +1&amp;lt;/font&amp;gt; pixel on both heighth&amp;lt;br&amp;gt;and width.&amp;lt;br&amp;gt;So with that in mind our Height map image should be 1025x1025. After you&amp;lt;br&amp;gt;are done creating your height map save it and leave the image open.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Step 3: Metal Map&#039;&#039;&#039;&lt;br /&gt;
**The Metal map is the image that determines metal placement on the map.&amp;lt;br&amp;gt;This map uses the &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Red Channel&amp;lt;/font&amp;gt;. The Red Channel consists solely of the&amp;lt;br&amp;gt;colors red and black. Black on the Red Channel is equivalent to zero or no&amp;lt;br&amp;gt;metal(in game). Pure red is equivalent to the maximum amount of metal.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;http://spring.clan-sy.com/w/images/3/3e/Rune_Metal.jpg&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
**&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;The Metal map should be the same size as your Height map.&amp;lt;/font&amp;gt; For example,&amp;lt;br&amp;gt;for our map the Height map is 1025x1025; therefore; the metal map should&amp;lt;br&amp;gt;also be 1025x1025.&lt;br /&gt;
**&#039;&#039;&#039;Some Advice&#039;&#039;&#039; Make sure to disperse the metal equally on all sides of the map&amp;lt;br&amp;gt;as people will be playing on all sides of the map. Also, take note that if you&amp;lt;br&amp;gt;place large amounts of metal in the center of the map or in any one location,&amp;lt;br&amp;gt;people will fight for that particular location above all others. While this might&amp;lt;br&amp;gt;make for interesting game play, the downfall to this is that whoever obtains it&amp;lt;br&amp;gt;will most surely be the victor. Therefore, if you are going to place a large amount&amp;lt;br&amp;gt;of metal in a certain location-make sure the amount is not so large that it destroys&amp;lt;br&amp;gt;game play.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Step 4: Type Map (Optional)&#039;&#039;&#039;&lt;br /&gt;
**The Type map is the image that determines the terrain properties (such as ground&amp;lt;br&amp;gt;hardness and unit movement speed). The Type map uses the &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Red Channel&amp;lt;/font&amp;gt;. The&amp;lt;br&amp;gt;color black or zero is the default terrain type.  The varying shades between black&amp;lt;br&amp;gt;and pure red (255 shades) determine other terrain types.  For example, 0,0,0 =&amp;lt;br&amp;gt;[TERRAINTYPE0] (default), 1,0,0 = [TERRAINTYPE1], and 2,0,0 = [TERRAINTYPE2].&amp;lt;br&amp;gt;You can have up to 255 different terrain types. The terrain types are defined in the&amp;lt;br&amp;gt;.SMD file.&lt;br /&gt;
**&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;The Type map should be the same size as your Height map.&amp;lt;/font&amp;gt; For example, for our map&amp;lt;br&amp;gt;the Height map is 1025x1025; therefore; the Type map should also be 1025x1025.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Step 5: Featuremap&#039;&#039;&#039;&lt;br /&gt;
**The Featuremap is the image that determines the placement of features such as:&amp;lt;br&amp;gt;trees, grass, geovents, and custom features (i.e.-rocks, buildings, crystals, etc.).&amp;lt;br&amp;gt;&lt;br /&gt;
**&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;The Feature map should be the same size as your Height map - 1 pixel&amp;lt;/font&amp;gt; on both&amp;lt;br&amp;gt;heighth and width. For example, for our map the Height map is 1025x1025; therefore;&amp;lt;br&amp;gt; the feature map should be 1024x1024.&amp;lt;br&amp;gt;&lt;br /&gt;
**To place a feature you simply place 1 pixel of the appropriate color on the featuremap&amp;lt;br&amp;gt;in the place where you wish it to appear on your map.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
**&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;Geovents - Green - 255&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
**&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;Trees - Green - 200-215&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
**&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Grass - Blue - 0-255&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
**&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Features - Red - 255-0&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
**&#039;&#039;&#039;Some Advice&#039;&#039;&#039; Open the height map, resize the height map the the size of your&amp;lt;br&amp;gt;featuremap, Make a new layer, on this layer place the pixels where you want&amp;lt;br&amp;gt;your features, under this layer make a new layer and fill it in with the color black&amp;lt;br&amp;gt;0,0,0 then flaten the image and save it as Featuremap.bmp&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Step 6: Texture Map&#039;&#039;&#039;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
**http://spring.clan-sy.com/w/images/b/b6/Rune_Texture.jpg&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;The End Result&#039;&#039;&#039;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
**http://spring.clan-sy.com/w/images/f/f3/Demo_screen001.jpg&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;http://spring.clan-sy.com/w/images/e/e1/Demo_screen002.jpg&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Map making]]&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:CompleteMapMaking(Wannes)&amp;diff=18479</id>
		<title>Tutorial:CompleteMapMaking(Wannes)</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:CompleteMapMaking(Wannes)&amp;diff=18479"/>
		<updated>2009-08-31T18:34:19Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Complete Map Making tutorial by Wannes == &lt;br /&gt;
&lt;br /&gt;
Hello everyone,&lt;br /&gt;
In this tutorial i&#039;m gonna try to teach you everything you need to know to make your first decent map.&lt;br /&gt;
&lt;br /&gt;
First i want to thank Maelstorm and aGorm for their tutorials, they tought me a lot. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Things You need: ===&lt;br /&gt;
&lt;br /&gt;
An image editing program like Photoshop (which I will use in the rest of this tutorial), Paintshop Pro, . . .&lt;br /&gt;
Or &#039;the Gimp&#039;: [ ftp://ftp.gimp.org/pub/gimp/v2.2/ ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mapconv: This is the program that converts the Bitmap files you will be making into something that Spring can use (meaning a .smf and .smt file)&lt;br /&gt;
This program comes in 2 versions, Mothers mapconv and the &amp;quot;normal&amp;quot; one&lt;br /&gt;
In the rest of this tutorial I will be using mothers Mapconv&lt;br /&gt;
[ http://www.fileuniverse.com/uploads/60b1MapConv.zip ]&lt;br /&gt;
&lt;br /&gt;
Map creation tools (optional): These programs help you making heightmaps, generate heightmaps, and apply textures to them.&lt;br /&gt;
Examples are: &lt;br /&gt;
* Terragen (Mars was made with the random terrain function in terragen by SJ)[ http://www.planetside.co.uk/terragen/download.shtml ]&lt;br /&gt;
* L3DT[ http://www.bundysoft.com/L3DT/downloads/standard.php ]&lt;br /&gt;
* World Machine.[ http://www.world-machine.com/download.html ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you are planning to make big maps 16x16 and more you really need a good cpu and alot of memory and HD space. Especially when you are going to make everything in Photoshop.&lt;br /&gt;
&lt;br /&gt;
=== The Parts of the Map ===&lt;br /&gt;
&lt;br /&gt;
Each map contains 4 parts (3 parts on the normal mapconv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The texture Map: ===&lt;br /&gt;
&lt;br /&gt;
This defines how the terrain for your map will look.&lt;br /&gt;
It needs to be a 24 bit bitmap, with dimensions that are a multiple of 1024.&lt;br /&gt;
A 16x16 map (you see this at spring lobby) equals a 8192x8192 pixels bitmap.&lt;br /&gt;
As you will soon notice these bitmaps have huge sizes. In order to compress these large bitmaps to a small mapfiles they created somethign named tiles.&lt;br /&gt;
&lt;br /&gt;
A tile is a a small picture of a terrain like grass or sand or water. when you fill up your whole map with 1 or more tiles, mapconv can see this and make good use of it to compress your map. So its important you use tiles because it makes the map sizes alot smalle but you should pay attention your maps don&#039;t get too boring because of the same tile you see everywhere.&lt;br /&gt;
&lt;br /&gt;
You can&#039;t just use tiles of any size. mapconv will check your map for tiles that are a multiple of 32 pixels. So you can use 32x32 64x64 . . .   bigger tiles will usually be nicer on your map because its harder to spot u repeat the same tile over and over, but this also makes you map bigger.&lt;br /&gt;
You can even use tiles like 32x64, as long as its a multiple of 32&lt;br /&gt;
&lt;br /&gt;
So it important that you find a good balance between the number of tiles you use and their size.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you want to use tiles in Photoshop, do this:&lt;br /&gt;
open the tile picture, resize it to a multiple of 32, do edit-&amp;gt;define pattern&lt;br /&gt;
then go to the terrain picture and use edit -&amp;gt; fill and select the wanted pattern. On large bitmaps this may take some time.&lt;br /&gt;
When you have applied a couple of tiles like this you can make them blend in to each other using the eraser on a low opacity.&lt;br /&gt;
&lt;br /&gt;
You can also use terragen to generate you a texture map, using an imported height map or one you made inside terragen. Although I can give you no further info about the use of terragen because I don&#039;t know alot about it either.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===The Heightmap===&lt;br /&gt;
&lt;br /&gt;
This is the key part of your map. It defines everything about the heights of your map (including water).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These are the basics: your heightmap must only contain black and white colors, and must be textmapsizeX/8  1   x  textmapsizeY/8 1   so if you have a 8192 x 8192 texture map you got to have a 1025 x 1025 heightmap.&lt;br /&gt;
The whiter something is, the higher it will be in spring and black is the lowest your map can be.&lt;br /&gt;
&lt;br /&gt;
so basically what you do is you paint your whole map grey (usually I take 127 127 127) and then add white and black where you want mountains and valleys&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I&#039;m not very good at making heightmaps myself so maybe someone else can write some things here.&lt;br /&gt;
The way I do it: I only use photoshop , take a white brush on very low opacity and start drawling a mountain on my map. It takes alot of time and patience making it very smooth. The blur tools helps alot and the surface blur filter helps alot too (or any other blur filter).   If you want to make your terrain more interesting you shouldn&#039;t leave it all perfectly flat. There are many ways of doing this, you can use the filter-&amp;gt;render-&amp;gt; clouds or some things in the filer-&amp;gt;noise menu (remember not to use colors!)&lt;br /&gt;
After applying these filers you can try to put opacity of that layer low or merge it with the other layers (don&#039;t use this, but might be better)&lt;br /&gt;
&lt;br /&gt;
===The Metal Map===&lt;br /&gt;
&lt;br /&gt;
Aah this is an easy one : )&lt;br /&gt;
it uses the same dimensions as the heightmap.&lt;br /&gt;
The normal mapconv uses this map to place the metal and geovents on, but mothers mapconv has a special feature layer for the geo&#039;s (see later) so the metal map just keeps track of all the metal on your map.&lt;br /&gt;
&lt;br /&gt;
It uses red to represent Metal , so you can use red going from 0 -255 to define your metal.&lt;br /&gt;
Remember that white = all colors so when you make a white map with red dots your whole map will be covered with metal. On the normal mapconv this will be even worse because white also contains green (which it uses for geo&#039;s) so the entire map wille be full of geo&#039;s. Because each green pixel represents a geo this will cause a big error when you start your map.&lt;br /&gt;
&lt;br /&gt;
So always paint your map black (love that song) first and then add red dots (unless you are making a metal map)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===The Feature Map===&lt;br /&gt;
&lt;br /&gt;
This is for Mothers mapconv only&lt;br /&gt;
It uses same dimensions as the height and metalmap.&lt;br /&gt;
&lt;br /&gt;
GEO&#039;s:&lt;br /&gt;
It uses green 255 to represent a geo   add 1 pixel to add one geo on your map   don&#039;t place alot of green pixels next to eachother because this will make spring crash.&lt;br /&gt;
&lt;br /&gt;
TREE&#039;s&lt;br /&gt;
It uses green color 200-215 to represent trees of 16 differant types&lt;br /&gt;
&lt;br /&gt;
GRASS:&lt;br /&gt;
&lt;br /&gt;
It uses blue color 0-255 0 = no grass 255 = full grass&lt;br /&gt;
&lt;br /&gt;
FEATURES:&lt;br /&gt;
***taken from mothers mapconv readme***&lt;br /&gt;
Red Channel:&lt;br /&gt;
255	- feature of type on first line of text file specified with&lt;br /&gt;
254	-     &amp;quot;		&amp;quot;    second &amp;quot;		&amp;quot;		&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ie.  fs.txt has armjeth_dead on the first line, so a pixel of 255 Blue places an armjeth_dead !&lt;br /&gt;
&lt;br /&gt;
Format is one feature type per line. &lt;br /&gt;
These features currently must be found in the .tdf files in the mods/&amp;lt;modname.sd7&amp;gt;/features filesystem.&lt;br /&gt;
*** taken from mothers mapconv readme ***&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Using Mapconv===&lt;br /&gt;
&lt;br /&gt;
ok now you have your 4 maps, copy them into mothersmapconv folder&lt;br /&gt;
&lt;br /&gt;
now you have to get mapconv to work. You can edit the .bat file or do this:&lt;br /&gt;
goto start-&amp;gt; run and type &amp;quot;cmd&amp;quot; this will open a dospromt&lt;br /&gt;
for those that don&#039;t knwo dos, use cd.. to go up one level cd &amp;quot;mapname&amp;quot; to change folder and &amp;quot;d:&amp;quot; to go to your D drive&lt;br /&gt;
navigate to the mapconv folder.&lt;br /&gt;
&lt;br /&gt;
Then you need to type &amp;quot;mapconv&amp;quot; follwoed by a list of parameters&lt;br /&gt;
&lt;br /&gt;
This is a list taken from mothers mapconv help:&lt;br /&gt;
&lt;br /&gt;
USAGE:&lt;br /&gt;
&lt;br /&gt;
  mapconv  [-l] [-i] [-c &amp;lt;compression&amp;gt;] -x &amp;lt;max height&amp;gt; -n &amp;lt;min height&amp;gt; [-o &lt;br /&gt;
  &amp;lt;Output file&amp;gt;] [-e &amp;lt;tile file&amp;gt;] [-y &amp;lt;Typemap file&amp;gt;] -m &amp;lt;Metalmap file&amp;gt; -a &lt;br /&gt;
  &amp;lt;Heightmap file&amp;gt; -t &amp;lt;Texture file&amp;gt; [--] [-v] [-h]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Where:&lt;br /&gt;
&lt;br /&gt;
  -l,  --lowpass&lt;br /&gt;
    Lowpass filters the heightmap&lt;br /&gt;
&lt;br /&gt;
  -i,  --invert&lt;br /&gt;
    Inverts the height map vertically (not the height values but the height map &lt;br /&gt;
    (uhm someone rewrite this))&lt;br /&gt;
&lt;br /&gt;
  -c &amp;lt;compression&amp;gt;,  --compress &amp;lt;compression&amp;gt;&lt;br /&gt;
    (value required)  How much we should try to compress the texture file. &lt;br /&gt;
    Default value 0.8 . (lower=higher quality, larger file)&lt;br /&gt;
&lt;br /&gt;
  -x &amp;lt;max height&amp;gt;,  --maxheight &amp;lt;max height&amp;gt;&lt;br /&gt;
    (required)  (value required)  What altitude in spring the max(0xffff) level &lt;br /&gt;
    of the height map should represent&lt;br /&gt;
&lt;br /&gt;
  -n &amp;lt;min height&amp;gt;,  --minheight &amp;lt;min height&amp;gt;&lt;br /&gt;
    (required)  (value required)  What altitude in spring the min(0) level of &lt;br /&gt;
    the height map should represent&lt;br /&gt;
&lt;br /&gt;
  -o &amp;lt;Output file&amp;gt;,  --outfile &amp;lt;Output file&amp;gt;&lt;br /&gt;
    (value required)  The name of the created map&lt;br /&gt;
&lt;br /&gt;
  -e &amp;lt;tile file&amp;gt;,  --externaltilefile &amp;lt;tile file&amp;gt;&lt;br /&gt;
    (value required)  External tile file that will be used for finding tiles, &lt;br /&gt;
    tiles not found in this will be added in a new tile file&lt;br /&gt;
&lt;br /&gt;
  -y &amp;lt;Typemap file&amp;gt;,  --typemap &amp;lt;Typemap file&amp;gt;&lt;br /&gt;
    (value required)  Type map to use, uses the red channel to decide type, &lt;br /&gt;
    types are defined in the .smd, if this argument is skipped the map will be &lt;br /&gt;
    all type 0&lt;br /&gt;
&lt;br /&gt;
  -m &amp;lt;Metalmap file&amp;gt;,  --metalmap &amp;lt;Metalmap file&amp;gt;&lt;br /&gt;
    (required)  (value required)  Metal map to use, red channel is amount of &lt;br /&gt;
    metal, green=255 is where to place geos (one pixel=one geo). Is resized to &lt;br /&gt;
    fit the mapsize&lt;br /&gt;
&lt;br /&gt;
  -a &amp;lt;Heightmap file&amp;gt;,  --heightmap &amp;lt;Heightmap file&amp;gt;&lt;br /&gt;
    (required)  (value required)  Input heightmap to use for the map, this &lt;br /&gt;
    should be in 16 bit raw format (.raw extension) or an image file. Must be &lt;br /&gt;
    xsize*128 1 x ysize*128 1 in size.&lt;br /&gt;
&lt;br /&gt;
  -t &amp;lt;Texture file&amp;gt;,  --intex &amp;lt;Texture file&amp;gt;&lt;br /&gt;
    (required)  (value required)  Input bitmap to use for the map. Must be &lt;br /&gt;
    xsize*1024 x ysize*1024 in size. (xsize,ysize integers determined from this &lt;br /&gt;
    file)&lt;br /&gt;
&lt;br /&gt;
  --,  --ignore_rest&lt;br /&gt;
    Ignores the rest of the labeled arguments following this flag.&lt;br /&gt;
&lt;br /&gt;
  -v,  --version&lt;br /&gt;
    Displays version information and exits.&lt;br /&gt;
&lt;br /&gt;
  -h,  --help&lt;br /&gt;
    Displays usage information and exits.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is an example of a command to convert your map (mame is crossroads)&lt;br /&gt;
I allways use the -i parameter else the texture map gets applied wrong&lt;br /&gt;
&lt;br /&gt;
mapconv.exe -i -f w_crossroadsf.bmp -x 300 -n 50 -m w_crossroadsm.bmp -a w_crossroadsh.bmp -t w_crossroads.bmp -o w_crossroads.smf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you run this you will see 2 new files in the mapconv folder   yourmapname.smf and yourmapname.smt  &lt;br /&gt;
You still need an extra file; yourmapname.smd&lt;br /&gt;
A smd file contains all things like wind speeds max metal sun direction map description, starting positions etc.&lt;br /&gt;
You can take a smd file from another map and edit or use Maelstorms SMD creator: &lt;br /&gt;
http://taspring.clan-sy.com/phpbb/viewtopic.php?t=2420&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now put these 3 files in a folder called &amp;quot;maps&amp;quot;, download 7-zip [http://www.7-zip.org here], open it and navigate to the maps folder then right-click on it and do add to archive. Just let it make a zip file, and later rename it to yourmapname.sd7 (you have to edit the extension)&lt;br /&gt;
&lt;br /&gt;
Put this file in your spring maps folder and you&#039;re ready to test it!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I&#039;m gonna cleanup this tutorial alter and add alot more stuff but if you aren&#039;t bothered too much because of all the typo&#039;s this should teach you how to make your first map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cheers!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Map making]]&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:BasicMapMaking(Maelstrom)&amp;diff=18449</id>
		<title>Tutorial:BasicMapMaking(Maelstrom)</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:BasicMapMaking(Maelstrom)&amp;diff=18449"/>
		<updated>2009-08-31T18:34:04Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Basic Map making ==&lt;br /&gt;
&lt;br /&gt;
This tutorial is designed to help people make a basic map in an image editor like Photoshop. Things covered in this tutorial include:&lt;br /&gt;
* Making a basic concept drawing&lt;br /&gt;
* Making and using tiles&lt;br /&gt;
* Placing major map features&lt;br /&gt;
* Making use of layers to easily design and modify the map&lt;br /&gt;
&lt;br /&gt;
First things first, we need to set up some folders and stuff to make all our lives easier. As the map compiler does not accept path names with spaces in them, it is easier if we just place the files in a folder straight on the C:\ drive. So, heres what folders to make:&lt;br /&gt;
&lt;br /&gt;
* C:\Maps\&lt;br /&gt;
** MapName\&lt;br /&gt;
*** Tiles\&lt;br /&gt;
*** Texture\&lt;br /&gt;
*** Metal\&lt;br /&gt;
*** Height\&lt;br /&gt;
&lt;br /&gt;
When we save each file, save them to the relevant folder. When we have finished that file, export it as a .bmp into the MapName folder for convinience. Remeber to save regularly, so as not to loose any work!&lt;br /&gt;
&lt;br /&gt;
Whenever you create another map, make the same folders again. It makes life just that little bit easier.&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Concept Drawing ===&lt;br /&gt;
&lt;br /&gt;
First things first, we need an idea of what the map will be about. For this map, I have made the following picture:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Image:Rough Design.jpg]]&lt;br /&gt;
&lt;br /&gt;
Green areas will be grass, Grey is mountains and Blue is water. This design does not need to be a major work of art, it just needs to convey the basic idea of the map, so that you have something to work off later.&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Making Tiles ===&lt;br /&gt;
&lt;br /&gt;
The secret to small file sizes for maps is tiles. A Tile is a small picture that is repeated on the texture many times. This texture is then tiled by the map converter, and a 400mb 10240x10240 pixel big bitmap is transformed into a 200kb map file. The tiling system is very powerfull and very handy, but we still need to give it a hand.&lt;br /&gt;
&lt;br /&gt;
Tiles in spring are based on 32x32 peices of the texture. Therefore, for our tiling to work correctly, our tile needs to be a size that is a multiple of 32. Sizes include:&lt;br /&gt;
* A basic, but boring looking 32x32 pixels&lt;br /&gt;
* A slightly better, but still slightly repetetive 64x64 pixels&lt;br /&gt;
* A good size of 128x128 pixels&lt;br /&gt;
* A large 256x256 pixels&lt;br /&gt;
&lt;br /&gt;
Tiles can also be rectangular, and can be anything between the numbers mentioned above, but still need to be multiples of 32. To look good, tiles also need to be seamless, so when they are repeated no obvious join can be seen between the tiles.&lt;br /&gt;
&lt;br /&gt;
For my map, as it has grass, mountains and a river I need three tiles.&lt;br /&gt;
* A green Grass Tile&lt;br /&gt;
[[Image:Grass.jpg]]&lt;br /&gt;
* A grey Mountain Tile&lt;br /&gt;
[[Image:Rock.jpg]]&lt;br /&gt;
* A blue River tile&lt;br /&gt;
[[Image:Water.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Setting up the Texture layers ===&lt;br /&gt;
&lt;br /&gt;
A textures needs to be a certain size for it to work in the Spring engine. Textures must always be a size that is a multiple of 1024 pixels. 1024 pixels will equal 2 map &#039;size units&#039; in the Spring engine, so a map of 5120x5120 pixels will be a 10x10 map. For a better description, go to one of the other pages.&lt;br /&gt;
&lt;br /&gt;
We will need 4 layers for our map texture. One layer for our Grass texture, one for our Mountains, one for the River and one for the Concept drawing. First things first, make 4 layers. Fill the very bottom layer with the Water texture. The next layer is for the mountain texture, and the next is for the grass layer. Then, over all that, you draw in your concept again, but this time only the borders of the area&#039;s. Doing all this will make your life alot easier, and will help out alot in the long run.&lt;br /&gt;
&lt;br /&gt;
Your texture should now look something like this, but just alot bigger:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Image:Texture1.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Placing the major features ===&lt;br /&gt;
&lt;br /&gt;
Now that you have your layers set up, you can start placing things like mountains and rivers. To do this, select the grass layer, and grab the eraser tool. Following the outline from your Concept design, rub out an area for the mountain to poke through.&amp;lt;br&amp;gt;&lt;br /&gt;
[[Image:Texture2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Then, do the other mountain:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Image:Texture3.jpg]]&lt;br /&gt;
&lt;br /&gt;
Now, we need to do the river. As the river layer is &#039;below&#039; the gras layer AND the mountain layer, we need to rub a hole in each of them. So, pull out the eraser again, and get rubbing!&amp;lt;br&amp;gt;&lt;br /&gt;
[[Image:Texture4.jpg]]&lt;br /&gt;
&lt;br /&gt;
After that, turn the concept drawing off, and there you have one tile base, small filesize texture! With a bit of playing around, blurring the edges, adding more layers, and little stuff like that you can make a really good looking map by just using an image editor. Just look at River Dale for an example!&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Making a height map ===&lt;br /&gt;
This is one of the tricker bits to get right. But without a good height map, your map is also no good. So, down to buisness!&lt;br /&gt;
&lt;br /&gt;
A height map is a picture that the Spring uses to work out the height of different bits of land. Hence, a height map. A height map looks a little strange at first, but you get the hang of the pretty quickly. A height map will be a greyscale image (an image made up of shades of grey, as opposed to colours), where white represents mountains, and black valleys, or water. &lt;br /&gt;
&lt;br /&gt;
First off, the height map needs to be a different size to the texture. The height map needs to be 1/8th of the size of the texture, plus one pixel. So, to make this easier, here is a nice formula!&lt;br /&gt;
 Height map size = (Texture size / 8)   1&lt;br /&gt;
For this tutorial my height map will be the same size as my texture, but thats just so I can show you how to make it easier.&lt;br /&gt;
&lt;br /&gt;
OK, now onto the height map! Make 2 layers. On the bottom layer, put your Texture, just resized to the right size. The top layer will be where we are going to draw our height map. To help us do this, we need to set the Opcaity (how transparent an image is) of the height map layer to around 50%. Some people like more, some people like less.&lt;br /&gt;
&lt;br /&gt;
Grab the paint bucket tool and fill the whole of the height map dark grey. This will be the flat, grassy bit of our map. Then, grab the paint brush tool, set it to White, make it big and make the edges soft. When you paint with this brush you should get a white dot in the middle, with a steady fall off towards the grey that you have as your grass. Use this brush to paint in some mountains, with the White in the center, slowly fading out to the grey grass on the out side. &lt;br /&gt;
&lt;br /&gt;
[[Image:Maelstrom-Height2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Then, make the same brush black, and draw a big long line for the river.&lt;br /&gt;
&lt;br /&gt;
[[Image:Maelstrom-Height3.jpg]]&lt;br /&gt;
&lt;br /&gt;
When this is done, make the Opacity of the Height map 100% again, and save the picture. The Height map is done! It may require some tweaking later, but its fine for now.&lt;br /&gt;
&lt;br /&gt;
[[Image:Maelstrom-Height.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Step 6: Metal Map ===&lt;br /&gt;
&lt;br /&gt;
The metal map is alot like the height map. It is 1/8th the size   one pixel. You can still underlay the texture for reference. It is still just a simple picture, like the height map. But this time, you need to do it in &#039;redscale&#039;, instead of greyscale. That is, using only red, and no green or blue. The more red the colour, the more metal is given. Depending on the style of map you want is how you make your metal map. For this map, we are going with an OTA style map with metal patches.&lt;br /&gt;
&lt;br /&gt;
Make 2 layers. On the bottom layer, we will have our texture. On the top layer we will draw in the metal. For now, we can leave the metal layer empty, with full opacity, unlike the metal map.&lt;br /&gt;
&lt;br /&gt;
Grab a brush. Make it about 3 pixels big and square. Make the colour about half red, with all the other colours all the way down. This will be some low metal patches for the starting positions. Place a couple of patches around the corners, enough to start with, like so:&lt;br /&gt;
&lt;br /&gt;
[[Image:Maelstrom-Metal1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Then, make the brush full red. Place some more patches in places like the mountains, and the middle of the map. Places that will be under constant attack. These will be the good spots for the players willing to risk it for the extra metal.&lt;br /&gt;
&lt;br /&gt;
[[Image:Maelstrom-Metal2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Now we need to hide the texture. To do this, grab the paint bucket tool and fill in the empty area black. You have now finished your metal map. Save the picture and your done!&lt;br /&gt;
&lt;br /&gt;
[[Image:Maelstrom-Metal.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Feature Map ===&lt;br /&gt;
A feature map is used to place Grass, Trees, Geovents and Features on a map. The tutorial will not cover how to make this, however the file is still needed. So we will just make a blank Feature map.&lt;br /&gt;
&lt;br /&gt;
Feature maps are a bit like the other maps, however instead of being one eighth of the texture   1 pixel, they are just one eighth of the texture. So, for example, instead of being 129x129 pixels, your Feature map will be 128x128 pixels. Create a picture that is the required size, and fill it black. If you fill it white, you will overload the game, and it will probably crash. Which is a bad thing.&lt;br /&gt;
&lt;br /&gt;
== Compiling ==&lt;br /&gt;
For compiling, see the [[Maps:Compiling|compiling tutorial]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Map making]]&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:CompleteMapMaking(Wannes)&amp;diff=18478</id>
		<title>Tutorial:CompleteMapMaking(Wannes)</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:CompleteMapMaking(Wannes)&amp;diff=18478"/>
		<updated>2009-08-31T18:28:39Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Building_spring|Building Spring]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Complete Map Making tutorial by Wannes == &lt;br /&gt;
&lt;br /&gt;
Hello everyone,&lt;br /&gt;
In this tutorial i&#039;m gonna try to teach you everything you need to know to make your first decent map.&lt;br /&gt;
&lt;br /&gt;
First i want to thank Maelstorm and aGorm for their tutorials, they tought me a lot. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Things You need: ===&lt;br /&gt;
&lt;br /&gt;
An image editing program like Photoshop (which I will use in the rest of this tutorial), Paintshop Pro, . . .&lt;br /&gt;
Or &#039;the Gimp&#039;: [ ftp://ftp.gimp.org/pub/gimp/v2.2/ ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mapconv: This is the program that converts the Bitmap files you will be making into something that Spring can use (meaning a .smf and .smt file)&lt;br /&gt;
This program comes in 2 versions, Mothers mapconv and the &amp;quot;normal&amp;quot; one&lt;br /&gt;
In the rest of this tutorial I will be using mothers Mapconv&lt;br /&gt;
[ http://www.fileuniverse.com/uploads/60b1MapConv.zip ]&lt;br /&gt;
&lt;br /&gt;
Map creation tools (optional): These programs help you making heightmaps, generate heightmaps, and apply textures to them.&lt;br /&gt;
Examples are: &lt;br /&gt;
* Terragen (Mars was made with the random terrain function in terragen by SJ)[ http://www.planetside.co.uk/terragen/download.shtml ]&lt;br /&gt;
* L3DT[ http://www.bundysoft.com/L3DT/downloads/standard.php ]&lt;br /&gt;
* World Machine.[ http://www.world-machine.com/download.html ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you are planning to make big maps 16x16 and more you really need a good cpu and alot of memory and HD space. Especially when you are going to make everything in Photoshop.&lt;br /&gt;
&lt;br /&gt;
=== The Parts of the Map ===&lt;br /&gt;
&lt;br /&gt;
Each map contains 4 parts (3 parts on the normal mapconv)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The texture Map: ===&lt;br /&gt;
&lt;br /&gt;
This defines how the terrain for your map will look.&lt;br /&gt;
It needs to be a 24 bit bitmap, with dimensions that are a multiple of 1024.&lt;br /&gt;
A 16x16 map (you see this at spring lobby) equals a 8192x8192 pixels bitmap.&lt;br /&gt;
As you will soon notice these bitmaps have huge sizes. In order to compress these large bitmaps to a small mapfiles they created somethign named tiles.&lt;br /&gt;
&lt;br /&gt;
A tile is a a small picture of a terrain like grass or sand or water. when you fill up your whole map with 1 or more tiles, mapconv can see this and make good use of it to compress your map. So its important you use tiles because it makes the map sizes alot smalle but you should pay attention your maps don&#039;t get too boring because of the same tile you see everywhere.&lt;br /&gt;
&lt;br /&gt;
You can&#039;t just use tiles of any size. mapconv will check your map for tiles that are a multiple of 32 pixels. So you can use 32x32 64x64 . . .   bigger tiles will usually be nicer on your map because its harder to spot u repeat the same tile over and over, but this also makes you map bigger.&lt;br /&gt;
You can even use tiles like 32x64, as long as its a multiple of 32&lt;br /&gt;
&lt;br /&gt;
So it important that you find a good balance between the number of tiles you use and their size.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you want to use tiles in Photoshop, do this:&lt;br /&gt;
open the tile picture, resize it to a multiple of 32, do edit-&amp;gt;define pattern&lt;br /&gt;
then go to the terrain picture and use edit -&amp;gt; fill and select the wanted pattern. On large bitmaps this may take some time.&lt;br /&gt;
When you have applied a couple of tiles like this you can make them blend in to each other using the eraser on a low opacity.&lt;br /&gt;
&lt;br /&gt;
You can also use terragen to generate you a texture map, using an imported height map or one you made inside terragen. Although I can give you no further info about the use of terragen because I don&#039;t know alot about it either.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===The Heightmap===&lt;br /&gt;
&lt;br /&gt;
This is the key part of your map. It defines everything about the heights of your map (including water).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These are the basics: your heightmap must only contain black and white colors, and must be textmapsizeX/8  1   x  textmapsizeY/8 1   so if you have a 8192 x 8192 texture map you got to have a 1025 x 1025 heightmap.&lt;br /&gt;
The whiter something is, the higher it will be in spring and black is the lowest your map can be.&lt;br /&gt;
&lt;br /&gt;
so basically what you do is you paint your whole map grey (usually I take 127 127 127) and then add white and black where you want mountains and valleys&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I&#039;m not very good at making heightmaps myself so maybe someone else can write some things here.&lt;br /&gt;
The way I do it: I only use photoshop , take a white brush on very low opacity and start drawling a mountain on my map. It takes alot of time and patience making it very smooth. The blur tools helps alot and the surface blur filter helps alot too (or any other blur filter).   If you want to make your terrain more interesting you shouldn&#039;t leave it all perfectly flat. There are many ways of doing this, you can use the filter-&amp;gt;render-&amp;gt; clouds or some things in the filer-&amp;gt;noise menu (remember not to use colors!)&lt;br /&gt;
After applying these filers you can try to put opacity of that layer low or merge it with the other layers (don&#039;t use this, but might be better)&lt;br /&gt;
&lt;br /&gt;
===The Metal Map===&lt;br /&gt;
&lt;br /&gt;
Aah this is an easy one : )&lt;br /&gt;
it uses the same dimensions as the heightmap.&lt;br /&gt;
The normal mapconv uses this map to place the metal and geovents on, but mothers mapconv has a special feature layer for the geo&#039;s (see later) so the metal map just keeps track of all the metal on your map.&lt;br /&gt;
&lt;br /&gt;
It uses red to represent Metal , so you can use red going from 0 -255 to define your metal.&lt;br /&gt;
Remember that white = all colors so when you make a white map with red dots your whole map will be covered with metal. On the normal mapconv this will be even worse because white also contains green (which it uses for geo&#039;s) so the entire map wille be full of geo&#039;s. Because each green pixel represents a geo this will cause a big error when you start your map.&lt;br /&gt;
&lt;br /&gt;
So always paint your map black (love that song) first and then add red dots (unless you are making a metal map)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===The Feature Map===&lt;br /&gt;
&lt;br /&gt;
This is for Mothers mapconv only&lt;br /&gt;
It uses same dimensions as the height and metalmap.&lt;br /&gt;
&lt;br /&gt;
GEO&#039;s:&lt;br /&gt;
It uses green 255 to represent a geo   add 1 pixel to add one geo on your map   don&#039;t place alot of green pixels next to eachother because this will make spring crash.&lt;br /&gt;
&lt;br /&gt;
TREE&#039;s&lt;br /&gt;
It uses green color 200-215 to represent trees of 16 differant types&lt;br /&gt;
&lt;br /&gt;
GRASS:&lt;br /&gt;
&lt;br /&gt;
It uses blue color 0-255 0 = no grass 255 = full grass&lt;br /&gt;
&lt;br /&gt;
FEATURES:&lt;br /&gt;
***taken from mothers mapconv readme***&lt;br /&gt;
Red Channel:&lt;br /&gt;
255	- feature of type on first line of text file specified with&lt;br /&gt;
254	-     &amp;quot;		&amp;quot;    second &amp;quot;		&amp;quot;		&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ie.  fs.txt has armjeth_dead on the first line, so a pixel of 255 Blue places an armjeth_dead !&lt;br /&gt;
&lt;br /&gt;
Format is one feature type per line. &lt;br /&gt;
These features currently must be found in the .tdf files in the mods/&amp;lt;modname.sd7&amp;gt;/features filesystem.&lt;br /&gt;
*** taken from mothers mapconv readme ***&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Using Mapconv===&lt;br /&gt;
&lt;br /&gt;
ok now you have your 4 maps, copy them into mothersmapconv folder&lt;br /&gt;
&lt;br /&gt;
now you have to get mapconv to work. You can edit the .bat file or do this:&lt;br /&gt;
goto start-&amp;gt; run and type &amp;quot;cmd&amp;quot; this will open a dospromt&lt;br /&gt;
for those that don&#039;t knwo dos, use cd.. to go up one level cd &amp;quot;mapname&amp;quot; to change folder and &amp;quot;d:&amp;quot; to go to your D drive&lt;br /&gt;
navigate to the mapconv folder.&lt;br /&gt;
&lt;br /&gt;
Then you need to type &amp;quot;mapconv&amp;quot; follwoed by a list of parameters&lt;br /&gt;
&lt;br /&gt;
This is a list taken from mothers mapconv help:&lt;br /&gt;
&lt;br /&gt;
USAGE:&lt;br /&gt;
&lt;br /&gt;
  mapconv  [-l] [-i] [-c &amp;lt;compression&amp;gt;] -x &amp;lt;max height&amp;gt; -n &amp;lt;min height&amp;gt; [-o &lt;br /&gt;
  &amp;lt;Output file&amp;gt;] [-e &amp;lt;tile file&amp;gt;] [-y &amp;lt;Typemap file&amp;gt;] -m &amp;lt;Metalmap file&amp;gt; -a &lt;br /&gt;
  &amp;lt;Heightmap file&amp;gt; -t &amp;lt;Texture file&amp;gt; [--] [-v] [-h]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Where:&lt;br /&gt;
&lt;br /&gt;
  -l,  --lowpass&lt;br /&gt;
    Lowpass filters the heightmap&lt;br /&gt;
&lt;br /&gt;
  -i,  --invert&lt;br /&gt;
    Inverts the height map vertically (not the height values but the height map &lt;br /&gt;
    (uhm someone rewrite this))&lt;br /&gt;
&lt;br /&gt;
  -c &amp;lt;compression&amp;gt;,  --compress &amp;lt;compression&amp;gt;&lt;br /&gt;
    (value required)  How much we should try to compress the texture file. &lt;br /&gt;
    Default value 0.8 . (lower=higher quality, larger file)&lt;br /&gt;
&lt;br /&gt;
  -x &amp;lt;max height&amp;gt;,  --maxheight &amp;lt;max height&amp;gt;&lt;br /&gt;
    (required)  (value required)  What altitude in spring the max(0xffff) level &lt;br /&gt;
    of the height map should represent&lt;br /&gt;
&lt;br /&gt;
  -n &amp;lt;min height&amp;gt;,  --minheight &amp;lt;min height&amp;gt;&lt;br /&gt;
    (required)  (value required)  What altitude in spring the min(0) level of &lt;br /&gt;
    the height map should represent&lt;br /&gt;
&lt;br /&gt;
  -o &amp;lt;Output file&amp;gt;,  --outfile &amp;lt;Output file&amp;gt;&lt;br /&gt;
    (value required)  The name of the created map&lt;br /&gt;
&lt;br /&gt;
  -e &amp;lt;tile file&amp;gt;,  --externaltilefile &amp;lt;tile file&amp;gt;&lt;br /&gt;
    (value required)  External tile file that will be used for finding tiles, &lt;br /&gt;
    tiles not found in this will be added in a new tile file&lt;br /&gt;
&lt;br /&gt;
  -y &amp;lt;Typemap file&amp;gt;,  --typemap &amp;lt;Typemap file&amp;gt;&lt;br /&gt;
    (value required)  Type map to use, uses the red channel to decide type, &lt;br /&gt;
    types are defined in the .smd, if this argument is skipped the map will be &lt;br /&gt;
    all type 0&lt;br /&gt;
&lt;br /&gt;
  -m &amp;lt;Metalmap file&amp;gt;,  --metalmap &amp;lt;Metalmap file&amp;gt;&lt;br /&gt;
    (required)  (value required)  Metal map to use, red channel is amount of &lt;br /&gt;
    metal, green=255 is where to place geos (one pixel=one geo). Is resized to &lt;br /&gt;
    fit the mapsize&lt;br /&gt;
&lt;br /&gt;
  -a &amp;lt;Heightmap file&amp;gt;,  --heightmap &amp;lt;Heightmap file&amp;gt;&lt;br /&gt;
    (required)  (value required)  Input heightmap to use for the map, this &lt;br /&gt;
    should be in 16 bit raw format (.raw extension) or an image file. Must be &lt;br /&gt;
    xsize*128 1 x ysize*128 1 in size.&lt;br /&gt;
&lt;br /&gt;
  -t &amp;lt;Texture file&amp;gt;,  --intex &amp;lt;Texture file&amp;gt;&lt;br /&gt;
    (required)  (value required)  Input bitmap to use for the map. Must be &lt;br /&gt;
    xsize*1024 x ysize*1024 in size. (xsize,ysize integers determined from this &lt;br /&gt;
    file)&lt;br /&gt;
&lt;br /&gt;
  --,  --ignore_rest&lt;br /&gt;
    Ignores the rest of the labeled arguments following this flag.&lt;br /&gt;
&lt;br /&gt;
  -v,  --version&lt;br /&gt;
    Displays version information and exits.&lt;br /&gt;
&lt;br /&gt;
  -h,  --help&lt;br /&gt;
    Displays usage information and exits.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is an example of a command to convert your map (mame is crossroads)&lt;br /&gt;
I allways use the -i parameter else the texture map gets applied wrong&lt;br /&gt;
&lt;br /&gt;
mapconv.exe -i -f w_crossroadsf.bmp -x 300 -n 50 -m w_crossroadsm.bmp -a w_crossroadsh.bmp -t w_crossroads.bmp -o w_crossroads.smf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you run this you will see 2 new files in the mapconv folder   yourmapname.smf and yourmapname.smt  &lt;br /&gt;
You still need an extra file; yourmapname.smd&lt;br /&gt;
A smd file contains all things like wind speeds max metal sun direction map description, starting positions etc.&lt;br /&gt;
You can take a smd file from another map and edit or use Maelstorms SMD creator: &lt;br /&gt;
http://taspring.clan-sy.com/phpbb/viewtopic.php?t=2420&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now put these 3 files in a folder called &amp;quot;maps&amp;quot;, download 7-zip [http://www.7-zip.org here], open it and navigate to the maps folder then right-click on it and do add to archive. Just let it make a zip file, and later rename it to yourmapname.sd7 (you have to edit the extension)&lt;br /&gt;
&lt;br /&gt;
Put this file in your spring maps folder and you&#039;re ready to test it!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I&#039;m gonna cleanup this tutorial alter and add alot more stuff but if you aren&#039;t bothered too much because of all the typo&#039;s this should teach you how to make your first map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cheers!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Map making]]&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:MapMakingGuide(aGorm)&amp;diff=18755</id>
		<title>Tutorial:MapMakingGuide(aGorm)</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:MapMakingGuide(aGorm)&amp;diff=18755"/>
		<updated>2009-08-31T18:18:05Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
This has been moved to a title with teh correct spelling...&lt;br /&gt;
&lt;br /&gt;
By the way, im currently making a map, thats why this isn&#039;t changing...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;aGorms Ultimate Map Making Guide:&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stage A Ã¢â‚¬â€œ Pre-Preparation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So you want to make a map? Want to give something back? Good! However there are several things youÃ¢â‚¬â„¢re going to have to make sure you know before you start. And thatÃ¢â‚¬â„¢s what this section is about.&lt;br /&gt;
&lt;br /&gt;
===Have you the Time?===&lt;br /&gt;
&lt;br /&gt;
Believe me when I say, making a map will take a lot of your time. Hours. Days. Some take weeks to finish. So make sure you want to commit yourself to it first (this isnÃ¢â‚¬â„¢t a StarCraft style, make a map in 5 minuets sort of situation)&lt;br /&gt;
&lt;br /&gt;
===Have you the Hardware?===&lt;br /&gt;
&lt;br /&gt;
Making a map unfortunately requires a computer better than that need to actually play spring. Sounds daft? YouÃ¢â‚¬â„¢re dealing with very large images, which take up a lot of ram. Seeing as Windows needs 512 just to run, youÃ¢â‚¬â„¢ll need at least a gig if you want any joy. Also youÃ¢â‚¬â„¢ll need a half decent processor, or compiling will take forever. Some people will disagree, but honestly, at least a 2 GHz and a gig of ram would be useful.&lt;br /&gt;
&lt;br /&gt;
===Have you the Software?===&lt;br /&gt;
&lt;br /&gt;
First off, you will need Several Different pieces of software.&lt;br /&gt;
&lt;br /&gt;
====Mapconv:====&lt;br /&gt;
There are actually two versions; however, I will strongly recommend that you use Mothers Mapconv program. All the advice given below will assume you will be using it. And whilst the vast majority of this will be relevant for the original one, there are a few vital differences in what does what etcÃ¢â‚¬Â¦&lt;br /&gt;
&lt;br /&gt;
====Art Program:====&lt;br /&gt;
You will need an art program. Paint will not be sufficient. You can use whatever you are comfortable with, but this guild is written with Photoshop in mind. However many of the options are the same, they all do the same thing in the end.&lt;br /&gt;
Suggestions of programs to use:&lt;br /&gt;
&lt;br /&gt;
* Photoshop&lt;br /&gt;
* Paint shop Pro&lt;br /&gt;
* GIMP&lt;br /&gt;
* Fireworks&lt;br /&gt;
&lt;br /&gt;
The following are not required, but are useful, or needed for more advanced maps.&lt;br /&gt;
&lt;br /&gt;
====Terrain Generators:====&lt;br /&gt;
Terragen / TerrTexGen Ã¢â‚¬â€œ both of these programs take a height map, and create a realistic render of terrain based of it, using values you input.&lt;br /&gt;
&lt;br /&gt;
====3D software:====&lt;br /&gt;
There are HUNDREDS of different 3D packages out there, any one of them can be used to make a feature for you map, however youÃ¢â‚¬â„¢ll only be able to finish the model off in ONE program, named 3DO Builder. In this program you can create the final file that spring can read.&lt;br /&gt;
&lt;br /&gt;
===Beverages:===&lt;br /&gt;
Making a map sucks you in; I suggest you keep [http://www.onebob.co.uk/darren/pics/water.jpg water handy] at all times, along with a light snack.&lt;br /&gt;
&lt;br /&gt;
===Music:===&lt;br /&gt;
I Suggest you put your favorit Music on, that way your doing two things at once. However If you gonna head bang put down the mouse first...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Stage B Ã¢â‚¬â€œ Preparation==&lt;br /&gt;
&lt;br /&gt;
Now you have prepared your self of the task ahead, its time to actually think about making the map. This section is about map concepts, ideas, and to help you decided what sections of this tutorial your going top want to read (After all, not all maps require the same things, most maps have no features, donÃ¢â‚¬â„¢t use a custom skybox, and may not make use of the terrain type mapÃ¢â‚¬Â¦ So you will not want to bother with those sections!)&lt;br /&gt;
&lt;br /&gt;
===Concepts:===&lt;br /&gt;
This is something all maps need in one degree or another. What purpose do you want your map to serve? This can be as simple as Ã¢â‚¬Å“I want the map to be really huge so that we can enjoy huge battlesÃ¯Â¿Â½? to something more conceptual like Ã¢â‚¬Å“I want to make a platform style map, with limited access and lots of cover, with most of the resources in the middleÃ¯Â¿Â½?. It doesnÃ¢â‚¬â„¢t matter too much what your concept is, as long as you have one. Maps made without a concept tend to be boring, dull, uneven, and unplayed. And you donÃ¢â‚¬â„¢t want thatÃ¢â‚¬Â¦ do you?&lt;br /&gt;
&lt;br /&gt;
===What makes it special:===&lt;br /&gt;
So what do you want your map to include? For instance, say I was going to take the first concept and just make a really huge map. What am I going to do to make it special? Shall I use custom features? Or a radical skybox? Maybe there should be reclaimable wreckages strewn over the battle field. There are many different things you can add to a map to make it unique, and often itÃ¢â‚¬â„¢s a case of striking a balance between them all. All the different things you can add to a map have there own section in this tutorial, so once you know what you want youÃ¢â‚¬â„¢ll be able to go and read up on how to make your dream a reality.&lt;br /&gt;
&lt;br /&gt;
===Very First Steps:===&lt;br /&gt;
No turning back now!! Befor we get to the nitty gritty, you need to make several key desisions:&lt;br /&gt;
* How Big is your map? A small map would be between 10 x 10 and 16 x 16. Medium maps are 16x 16 to 24 x 24, anything over that can be safly called big, and If you manage to make one over 32 x 32 then its Huge!&lt;br /&gt;
* Rough drawing. Which is self explanatory, make a rough drawing of what you are imagining. I can be as crap as you like, but belive me its much easier to map when you have a reference. Only people with a vivid imagination can skip this...&lt;br /&gt;
&lt;br /&gt;
==Stage C Ã¢â‚¬â€œ Height Map==&lt;br /&gt;
&lt;br /&gt;
Some people will be thinking, hold on, why is Height Map first! We&#039;ll, it&#039;s quite simple... textures may change, but heightmaps dont! Let me explane that... Two maps with the same heightmap will play exactly the same as each other, irrespective of what texture you use. For instance, when making a map I once made a snowy Mountain one. However while it played nicly, I decided it looked crap, so I changed it to being a sandy island. Lots of maps out there have had several revisions of texture map!&lt;br /&gt;
&lt;br /&gt;
Now Im going to explane the stages of making a heightmap (for which you&#039;ll need a graphics program, I use Photoshop, and an Idea of were your mountains and valleys are.)&lt;br /&gt;
&lt;br /&gt;
===Basic heightmap:===&lt;br /&gt;
First things first, make a black canvas with teh following dimentions:&lt;br /&gt;
X dimention: (map width) x 64   1&lt;br /&gt;
Y dimention: (map height) x 64   1&lt;br /&gt;
For instance a 16 x 16 map will need a 102&amp;lt;b&amp;gt;5&amp;lt;/b&amp;gt; x 102&amp;lt;b&amp;gt;5&amp;lt;/b&amp;gt; heightmap.&lt;br /&gt;
&lt;br /&gt;
[[Image:Height1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Black is the lowest point on the map. So valleys, or on water maps, water are going to be in these areas. &lt;br /&gt;
White is the heighest point on the map. So the top of a mountain will be white.&lt;br /&gt;
Greys are the levels in between, of which there are 256 levels.&lt;br /&gt;
&lt;br /&gt;
===Adding a mountain:===&lt;br /&gt;
To add a mountain (all be it, a very unnatural one) take a paint brush and put down a splodge of white were the mountain will be. Tada! In game that will already be a mountain! Now your probablie thinking, wait it can&#039;t be that easy... Well as I said early, that will make a mountain, but It won&#039;t look very natural. However we&#039;ll deal with taht later. For now, you want to paint on roughly were your heighest points are. If you want smaller hills, use a shade of grey to draw with.&lt;br /&gt;
&lt;br /&gt;
[[Image:Height2.jpg]]&lt;br /&gt;
&lt;br /&gt;
===Making Some Variation:===&lt;br /&gt;
So the land looks like a kids rendition of a landscape, with perfect hills, and smoth valleys. Not to realistic right? Well there are several techniques to add that bit of variation to the land. Bare in mind these steps will work in other software besides photoshop, but that you may have to go about them in a different way...&lt;br /&gt;
&lt;br /&gt;
====Noise:====&lt;br /&gt;
Create a New layer on top of your current heightmap and fill it black. Next, drop down the filters menu, go to noise, add noise, and it will open teh noise diolog box. Make sure you select &amp;quot;Monochromatic&amp;quot; (for black and white)and drag the slider till it looks about half and half. Click OK and you should have noise!&lt;br /&gt;
Now go to filters, blur, gausation blur. Set it to between 2 and 4 pixels and click OK again. Now you should have a greyish black mess.&lt;br /&gt;
Now mess around with the layer blending settings (in photoshop there in the drop down just above the layers, and start with normal) I normaly use somthing like a &amp;quot;linear dodge&amp;quot;, and set the opacity to 50% ish, but Its best to play around.&lt;br /&gt;
&lt;br /&gt;
[[Image:Height3.jpg]]&lt;br /&gt;
&lt;br /&gt;
What this will have done Is lightened small areas of your map by a small amount, causeing minor variations in the height, which means your land wont be entirly flat. And because its only a minor variation you can normaly still build on it (if you cant build on the land, drop the opacity a bit more, which of course means make sure you save with layers ON)&lt;br /&gt;
&lt;br /&gt;
====Sharpness:====&lt;br /&gt;
OK, so you got all that, but your still thinking that those mountains are a bit... odd? Well thats because most mountains are infact not perfectly rounded hills. They have steep sides, sharp transitions, sher drops, as well as the plesent rolling hills that you get.&lt;br /&gt;
To begin to get the effect, go to teh layer below the layer with your noise on it (else it will overwrite it!) and get a black brush. Make sure you turn the hardness up a bit (50% should do for a basic test). Then carve out a section on the hill. That makes a shear drop! But you may not want that, so turn down the opacity of that layer.&lt;br /&gt;
&lt;br /&gt;
[[Image:Height4.jpg]]&lt;br /&gt;
&lt;br /&gt;
I then genraly build up these layers (each with maybe 20%-40% opacity) till I have made the sort of hills Id like. Bear in mind this is all personal preference!&lt;br /&gt;
&lt;br /&gt;
[[Image:Height5.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Map making]]&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:SMD&amp;diff=13571</id>
		<title>Mapdev:SMD</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:SMD&amp;diff=13571"/>
		<updated>2009-08-31T18:17:37Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SMD Syntax ==&lt;br /&gt;
The SMD, to work correctly, must be set out correctly. The following are a few of these requirements that you have to follow:&lt;br /&gt;
*All lines must end in a &#039;;&#039;. This is just like any C derived programming language&lt;br /&gt;
*Sections begin with a keyword wrapped in [Square brackets], and are wrapped in {Curly Brackets}&lt;br /&gt;
*Each different tag must be placed on a different line (?)&lt;br /&gt;
&lt;br /&gt;
The following are some recomendations to help other people read your SMD.&lt;br /&gt;
*Blank lines are allowed, and can be placed to help distinguish between different sections&lt;br /&gt;
*You may place comments in the SMD, and again like C programming languages, these are preceded by a &#039;//&#039;. Anything following a comment marker is ignored by the parser.&lt;br /&gt;
*You can tabulate your SMD to help the overall readability, and to show where sections begin and end.&lt;br /&gt;
&lt;br /&gt;
== Example SMD ==&lt;br /&gt;
&lt;br /&gt;
 [MAP]&lt;br /&gt;
 {&lt;br /&gt;
 	Description=Lot of metal in middle but look out for kbot walking over the mountains;&lt;br /&gt;
 	TidalStrength=20;&lt;br /&gt;
 	Gravity=130;&lt;br /&gt;
 	MaxMetal=0.03;&lt;br /&gt;
 &lt;br /&gt;
 	ExtractorRadius=400;&lt;br /&gt;
 	MapHardness=100;&lt;br /&gt;
 	&lt;br /&gt;
 	[SMF]&lt;br /&gt;
 	{&lt;br /&gt;
 	 	minheight = -135;&lt;br /&gt;
 	 	maxheight = 265;&lt;br /&gt;
 	}&lt;br /&gt;
 	[ATMOSPHERE]&lt;br /&gt;
 	{&lt;br /&gt;
 		FogColor=0.7 0.7 0.8;&lt;br /&gt;
 		FogStart=0.2;&lt;br /&gt;
 &lt;br /&gt;
 		CloudColor=0.9 0.9 0.9;&lt;br /&gt;
 		SkyColor=0.1 0.15 0.7;&lt;br /&gt;
 &lt;br /&gt;
 		SunColor=1.0 1.0 1.0;&lt;br /&gt;
 		CloudDensity=0.55;&lt;br /&gt;
 &lt;br /&gt;
 		MinWind=5;&lt;br /&gt;
 		MaxWind=20;&lt;br /&gt;
 	}&lt;br /&gt;
 	[WATER]&lt;br /&gt;
 	{&lt;br /&gt;
 		WaterBaseColor=0.4 0.6 0.8;&lt;br /&gt;
 		WaterAbsorb=0.004 0.004 0.002;&lt;br /&gt;
 &lt;br /&gt;
 		WaterMinColor=0.1 0.1 0.3;&lt;br /&gt;
 	}&lt;br /&gt;
 	[LIGHT]&lt;br /&gt;
 	{&lt;br /&gt;
 		SunDir=0 1 2;&lt;br /&gt;
 		&lt;br /&gt;
 		GroundAmbientColor=0.4 0.4 0.4;&lt;br /&gt;
 		GroundSunColor=0.7 0.7 0.7;&lt;br /&gt;
 &lt;br /&gt;
 		GroundShadowDensity=0.8;&lt;br /&gt;
 &lt;br /&gt;
 		UnitAmbientColor=0.3 0.3 0.3;&lt;br /&gt;
 		UnitSunColor=0.8 0.8 0.8;&lt;br /&gt;
 		UnitShadowDensity=0.8;&lt;br /&gt;
 &lt;br /&gt;
 	}&lt;br /&gt;
 	[TEAM0]&lt;br /&gt;
 	{&lt;br /&gt;
 		StartPosX=600;&lt;br /&gt;
 		StartPosZ=600;&lt;br /&gt;
 	}&lt;br /&gt;
 	[TEAM1]&lt;br /&gt;
 &lt;br /&gt;
 	{&lt;br /&gt;
 		StartPosX=3600;&lt;br /&gt;
 		StartPosZ=3600;&lt;br /&gt;
 	}&lt;br /&gt;
 	[TEAM2]&lt;br /&gt;
 	{&lt;br /&gt;
 		StartPosX=3600;&lt;br /&gt;
 		StartPosZ=600;&lt;br /&gt;
 	}&lt;br /&gt;
 	[TEAM3]&lt;br /&gt;
 	{&lt;br /&gt;
 		StartPosX=600;&lt;br /&gt;
 		StartPosZ=3600;&lt;br /&gt;
 &lt;br /&gt;
 	}&lt;br /&gt;
 	[TEAM4]&lt;br /&gt;
 	{&lt;br /&gt;
 		StartPosX=2000;&lt;br /&gt;
 		StartPosZ=600;&lt;br /&gt;
 	}&lt;br /&gt;
 	[TEAM5]&lt;br /&gt;
 &lt;br /&gt;
 	{&lt;br /&gt;
 		StartPosX=2000;&lt;br /&gt;
 		StartPosZ=3600;&lt;br /&gt;
 	}&lt;br /&gt;
 	//Up to [TEAM9]&lt;br /&gt;
 	[TERRAINTYPE0]&lt;br /&gt;
 	{&lt;br /&gt;
 		name=default;&lt;br /&gt;
 		hardness=1;&lt;br /&gt;
 		tankmovespeed=1;&lt;br /&gt;
 		kbotmovespeed=1;&lt;br /&gt;
 		hovermovespeed=1;&lt;br /&gt;
 		shipmovespeed=1;&lt;br /&gt;
 &lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== SMD Tags List ==&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;th valign=&amp;quot;top&amp;quot; bgcolor=&amp;quot;#C0C0C0&amp;quot;&amp;gt;Variable&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th valign=&amp;quot;top&amp;quot; bgcolor=&amp;quot;#C0C0C0&amp;quot;&amp;gt;Description&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th valign=&amp;quot;top&amp;quot; bgcolor=&amp;quot;#C0C0C0&amp;quot;&amp;gt;Examples&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;[TEAM&#039;&#039;X&#039;&#039;]&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The number of the team, starting at 0 for player 1 and going on up to 9 for player 10, where &#039;&#039;X&#039;&#039; is the player number&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;[TEAM3]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;[TERRAINTYPE&#039;&#039;X&#039;&#039;]&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Used to define different terrain types that exist on the map. The value starts at 0 and goes on for as many terrain types as you have, where &#039;&#039;X&#039;&#039; is the type number. Which terrain type goes where on the map is determined by the typemap when compiling the map. For example, if the typemap has an area of red 128, then the corresponding terraintype tag is [TERRAINTYPE128] &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;[TERRAINTYPE0]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;CloudColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The color of the clouds. The values are in the order Red, Green, Blue. For all intensive purposes, 0.0 is black and 1.0 is white; however, giving values higher than 1.0 will give brighter fog and less than 0.0 will give darker.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;CloudColor=0.9 0.9 0.9;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;CloudDensity&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The number of clouds in the sky. A percentage in decimal form, 0.0 to 1.0.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;CloudDensity=0.55;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;Description&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The description of the map that shows in the multiplayer battleroom.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Description=Strong wind, good for 2v2 team games;&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;ExtractorRadius&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The radius of effect that a single extractor will extract from. If two radii intersect, both extractors will suffer from reduced output.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;ExtractorRadius=400;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;GroundAmbientColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The ambient (non-sun-lit) color of ground, grass, trees and other features.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;GroundAmbientColor=0.4 0.4 0.4;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;GroundShadowDensity&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;How far from the non shadowed to the ambient color stuff in shadow will go.&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;GroundShadowDensity=0.8;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;GroundSunColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The color of ground where it is fully sun lit (added to &amp;lt;i&amp;gt;GroundAmbientColor&amp;lt;/i&amp;gt;).&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;GroundSunColor=0.7 0.7 0.7;&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;FogColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The color of the fog and the infinite plane below the world. The values are in the order Red, Green, Blue. For all intensive purposes, 0.0 is black and 1.0 is white; however, giving values higher than 1.0 will give brighter fog and less than 0.0 will give darker.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;FogColor=0.7 0.7 0.8;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;FogStart&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The distance from the camera at which the fog will start.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;FogStart=0.2;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;Hardness (terraintype)&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Used as a multiplier against the &amp;lt;i&amp;gt;MapHardness&amp;lt;/i&amp;gt; value. Can be used to make a particular terrain type softer or harder. A value of &#039;1&#039; will make it as hard as &amp;lt;i&amp;gt;MapHardness&amp;lt;/i&amp;gt;, and 0.5 will make it half as hard.&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;hardness=0.75;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;HoverNoveSpeed&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Speed multiplier for hovercraft when travelling on the parent terrain type. A value of &#039;1&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;hovermovespeed=1;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;KbotMoveSpeed&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Speed multiplier for Kbots when travelling on the parent terrain type. A value of &#039;1&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;kbotmovespeed=1;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;MapHardness&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Defines how much the terrain will deform due to explosions and weapons.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;MapHardness=100;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;MaxMetal&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;How much metal a map square with the maximum metal value gives. Unsure how this is calculated, but a value of around 0.03 will give OTA-esque levels of metal from metal extractors.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;MaxMetal=0.03;&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;MaxWind&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The maximum amount of energy the wind on the map will give.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;MaxWind=20;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;MinWind&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The minimum amount of energy the wind on the map will give.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;MinWind=5;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;Name (terraintype)&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Used to define the name of the type of terrain. &amp;quot;Snow&amp;quot; or &amp;quot;Rock&amp;quot; or whatever you want.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Name=default;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;ShipMoveSpeed&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Speed multiplier for Ship when travelling on the parent terrain type. A value of &#039;1&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;shipmovespeed=1;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;SkyColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The color of the sky itself. Works the same way as &amp;lt;i&amp;gt;CloudColor&amp;lt;/i&amp;gt; and &amp;lt;i&amp;gt;FogColor&amp;lt;/i&amp;gt;.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;SkyColor=0.1 0.15 0.7;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;StartPosX&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The X (east-west in the TA camera) coordinates on the map where the player will start.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;StartPosX=600;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;StartPosZ&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The Z (north-south in the TA camera) coordinates on the map where the player will start.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;StartPosZ=600;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;SunColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The color of the sun in the sky. This will also effect the size of the star. As the value increases (including over 1.0), the disc will get bigger; the inverse is also true.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;SunColor=1.0 1.0 1.0;&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;SunDir&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The direction of the sun, which is normalized by Spring. The Y-axis is up. Here&#039;s a basic chart for values:&lt;br /&gt;
      &amp;lt;center&amp;gt;&lt;br /&gt;
      &amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;210px&amp;quot; align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;tr height=&amp;quot;70px&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;td width=&amp;quot;70px&amp;quot;&amp;gt;1 .5 -1&amp;lt;/td&amp;gt;&amp;lt;td width=&amp;quot;70px&amp;quot;&amp;gt;0 .5 -1&amp;lt;/td&amp;gt;&amp;lt;td width=&amp;quot;70px&amp;quot;&amp;gt;-1 .5 -1&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;tr height=&amp;quot;70px&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;1 .5 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0 1 0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1 .5 0&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;tr height=&amp;quot;70px&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;1 .5 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0 .5 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;-1 .5 1&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
      &amp;lt;/table&amp;gt;&lt;br /&gt;
      &amp;lt;/center&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;SunDir=0 1 2;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;TankMoveSpeed&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Speed multiplier for tanks when travelling on the parent terrain type. A value of &#039;1&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;tankmovespeed=1;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;TidalStrength&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The amount of energy which will be given by tidal generators.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;TidalStrength=30;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;UnitAmbientColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The ambient (non-sun-lit) color of units and corpses.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;UnitAmbientColor=0.3 0.3 0.3;&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;UnitShadowDensity&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;How far from the non shadowed to the ambient color stuff in shadow will go.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;UnitShadowDensity=0.8;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;UnitSunColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The color of units where they is fully sun lit (added to &amp;lt;i&amp;gt;UnitAmbientColor&amp;lt;/i&amp;gt;).&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;UnitSunColor=0.8 0.8 0.8;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterAbsorb&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;How fast different colors (RGB in order) are absorbed by the water. Can be used to make the water look murky at deeper sections and so on. How this works: the waterabsorb value for the color channel gets multiplied by the depth of the water at a point, and this product gets subtracted from &#039;&#039;WaterBaseColor&#039;&#039;, until &#039;&#039;WaterMinColor&#039;&#039; is reached. Example: &#039;&#039;WaterAbsorb&#039;&#039; is 0.01, for the red channel, and we want to know how much red will be left in the water at a Spring elevation of -100, since 0.01*100= 1 , at this depth, there will be no more red component in the water, unless &#039;&#039;WaterMinColor&#039;&#039; is higher than 0 on the red channel.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterAbsorb=0.004 0.004 0.002;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterBaseColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The color of the water just beneath the surface plane. This is the starting color from which deeper waters will absorb more color.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterBaseColor=0.4 0.6 0.8;&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterMinColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The smallest values the water will go down to due to &amp;lt;i&amp;gt;WaterAbsorb&amp;lt;/i&amp;gt;.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterMinColor=0.1 0.1 0.3;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterPlaneColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;This set the color of the groundplane under the water outside the map boundaries&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterPlaneColor = 0.75 0.8 0.85; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterSurfaceColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;The color of the water surface. Mostly affects the colors of the reflections off the top of the water. Does&#039;&#039;&#039; NOT&#039;&#039;&#039; effect bumped water!&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterSurfaceColor = 0.75 0.8 0.85; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt; &lt;br /&gt;
    &amp;lt;td valign=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
== Bump mapped water SMD tags. These tags only affect bump mapped water and dont affect the other types. ==&lt;br /&gt;
 &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterSurfaceAlpha&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Transparency of the water surface. 0 meaning almost fully transparent water plane(low amount of reflections visible), and 1 being nearly opaque (massive amount of reflections). Default=0.55&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterSurfaceAlpha = 0.55; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterDiffuseColor&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;This specifies the diffuse color of the water body. &#039;&#039;&#039;WARNING&#039;&#039;&#039;: use of this tag disables the effect of &#039;&#039;WaterAbsorb&#039;&#039; , in fact, this tag does nothing but disable WaterAbsorb. Avoid.&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterDiffuseColor = 0.55 0.4 0.3; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterSpecularColor &#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterSpecularColor = groundSunColor - Altering this tag does not seem to have any effect at all.-&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt; //WaterSpecularColor = 0.55 0.4 0.3; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterSpecularPower &#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt; -no clue-&#039;&#039;&#039;WARNING&#039;&#039;&#039;: use of this tag disables the effect of &#039;&#039;WaterAbsorb&#039;&#039; &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterSpecularPower = 2.0; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterSpecularFactor &#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt; -no clue-&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterSpecularFactor = 0.3; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterAmbientFactor &#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt; -no clue-&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterAmbientFactor = 1.3; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterDiffuseFactor &#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt; -no clue-&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterDiffuseFactor = 0.3; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterFresnelMin&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;I have no clue what the WaterFresnel tags do, someone with more knowlegde edit this page please.(0.0&amp;lt;x&amp;lt;=1.0)&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterFresnelMin = 0.3; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterFresnelMax&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;(&amp;lt;1-WaterFresnelMin)&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterFresnelMax = 0.8; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterFresnelPower&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;-no clue-&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterFresnelPower = 4; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterReflectionDistortion&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;How much the surface should distort reflections that are cause by waves not being level: ergo it adds more choppyness to your reflections sensible from 0 to 20&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterReflectionDistortion = 0.1; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterBlurBase&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Something to do with blur, but it just seems to cause banding with values under 2 and corruption with values above 10&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterBlurBase = 2; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterBlurExponent&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;How much reflections on water surface should be blurred together with the water surface, lower values meaning clearer reflections, (0.2-5) Warning: above 5 seems to cause water corruption&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterBlurExponent = 2; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterPerlinStartFreq&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Wave sizes, smaller = big waves, sensible: 1-20 (influence the wave sizes) default=8&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterPerlinStartFreq = 8; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterPerlinLacunarity&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;new, any float; seems to define the size of the perlin waves, small values being big waves (0.2-5 is sensible) default= 3&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterPerlinLacunarity = 3; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;&#039;&#039;&#039;WaterPerlinAmplitude&#039;&#039;&#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;Base stillness of water surface, 0 is dead still, 1 is &#039;windy&#039; .This doesnt affect the bump texture depth, besides the fact that this disables the bump texture when set to 0   default=0.9 &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;WaterPerlinAmplitude= 0.9; &amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Maps:Compiling&amp;diff=14175</id>
		<title>Maps:Compiling</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Maps:Compiling&amp;diff=14175"/>
		<updated>2009-08-31T17:57:14Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Compiling Spring Maps ==&lt;br /&gt;
&lt;br /&gt;
This is often the bit that scares a lot of people off, but it is really not that difficult. There are two different ways to compile a map, so you can choose which option suits you best. You can:&lt;br /&gt;
&lt;br /&gt;
*Compile through a DOS prompt, or&lt;br /&gt;
*Create and batch file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;**NOTE!** IF YOU EVER GET JUST A PINK TEXTURE AFTER COMPILING THE ISSUE IS THAT YOU EITHER RENAMED THE FILES AFTER COMPILING OR CHANGED THE DIRECTORY STRUCTURE! THE SMD, SMT, AND SMF FILES MUST BE ALL CONTAINED WITHIN A DIRECTORY INSIDE YOUR ARCHIVE NAMED &amp;quot;maps&amp;quot;!!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Before you start ===&lt;br /&gt;
&lt;br /&gt;
First off, download a map converter. These can be found on [http://spring.jobjol.nl/  spring.jobjol.nl]. There are two compilers that most people use:&lt;br /&gt;
* [http://spring.jobjol.nl/show_file.php?id=1745 mother&#039;s MapConv with &#039;optimization&#039;]&amp;lt;br&amp;gt;This version should work for everyone, it has the no scanlines hack included. Works just like its described below.&lt;br /&gt;
* [http://www.fileuniverse.com/?p=showitem&amp;amp;ID=1507 Users mapconv (link broken), without optimization]&amp;lt;br&amp;gt;Use this if you feel adventurous or need very special features.&lt;br /&gt;
&lt;br /&gt;
Place the compiler in to a directory on your computer somewhere. Because of a bug in the program, the path to the map converter can NOT contain ANY Spaces. A Path of &#039;&#039;&#039;C:\Maps\MapConv\&#039;&#039;&#039; is good, but a path of &#039;&#039;&#039;C:\Maps\Map Conv\&#039;&#039;&#039; is BAD.&lt;br /&gt;
&lt;br /&gt;
A good practice is to save all your source Pictures into seperate folders when making a map. However, this gets very tedious when compiling. So it is a good idea to make a copy of your source BMP files and place these in the same folder as the map  converter. This just makes things alot easier later on. You should have the following files in your MapConv folder:&lt;br /&gt;
&lt;br /&gt;
* Texture.bmp (mapsize*64*8 pixels)&lt;br /&gt;
* Height.bmp (mapsizesize*8+1 pixels)&lt;br /&gt;
* Metal.bmp (mapsize*8+1 pixels)&lt;br /&gt;
* Feature.bmp (mapsize*8 pixels)&lt;br /&gt;
&lt;br /&gt;
All .bmp files should be 24bit RGB bitmaps.&lt;br /&gt;
&lt;br /&gt;
You should also put, if you are using them, your type map (Type.bmp) and your tile&lt;br /&gt;
map (Tile.bmp). Most maps do not use these, so you do not usually need to worry about them.&lt;br /&gt;
&lt;br /&gt;
You need the 7-zip compression program to compress your map into a .sd7 map file.&lt;br /&gt;
* [http://www.7-zip.org 7-zip homepage]&lt;br /&gt;
* [http://prdownloads.sourceforge.net/sevenzip/7z431.exe?download Download Link]&lt;br /&gt;
&lt;br /&gt;
A .smd file. These can be made with [http://taspring.clan-sy.com/phpbb/viewtopic.php?t=2420 Maelstroms SMD creator].&lt;br /&gt;
It is recommended to actually try to learn how the different SMD values works though by looking at other maps .smd files. The SMD creator is also not completly bugfree, so you should preferably look it through once with a text editor anyway.&lt;br /&gt;
&lt;br /&gt;
You also need to know:&lt;br /&gt;
&lt;br /&gt;
*The minimum and maximum heights of your map.&lt;br /&gt;
*The name of your map.&lt;br /&gt;
*How much you want to compress your map.&lt;br /&gt;
&lt;br /&gt;
=== Command Line Options ===&lt;br /&gt;
&lt;br /&gt;
As the compiler runs off information entered into it as &#039;&#039;&#039;Command Line Parameters&#039;&#039;&#039; , you need to know a bit about them first. Command Line Parameters are really not difficult to understand. They look a bit like this: &lt;br /&gt;
&lt;br /&gt;
 ProgramName -Setting1 Value -Setting2 Value&lt;br /&gt;
&lt;br /&gt;
The first bit is how we launch the program. Windows will launch whatever program is specified by &#039;&#039;&#039;ProgramName&#039;&#039;&#039;. &#039;&#039;&#039;-Setting1 Value&#039;&#039;&#039; is also very simple. Windows basically says to the program &amp;quot;Setting1 is Value&amp;quot;. A better example would be -height 10, which basicly means &amp;quot;Height is 10&amp;quot;. These can be combined with as many settings as you want, as we can see with the &#039;&#039;&#039;Setting2 Value&#039;&#039;&#039; bit. In this way we can pass as much information to the compiler as we want. To compile a map, we need the following Command Line Parameters:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Map Compression&#039;&#039;&#039;&lt;br /&gt;
This takes the form of &#039;&#039;&#039;-c Compression&#039;&#039;&#039;, where Compression is a value. Typing &#039;&#039;&#039;-c 0&#039;&#039;&#039; will give a compression of 0. Range is 0-1, where 0 is no compression, and will make you final map file size very large. **NOTE** NEVER USE THE SMF COMPRESSION, IT IS UTTERLY USELESS! (Further note, its not useles, just ugly. If your making a map thats bigger than 16*16, then I advise you to use it to save on the file size and texture memory. Values of up to 0.6 wont cause too noticable loss in quality, while still reducing file size.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Max Height&#039;&#039;&#039;&lt;br /&gt;
This specifies the maximum height of the map. This option looks like &#039;&#039;&#039;-x Height&#039;&#039;&#039;, where Height is the maximum height of the map. Typing &#039;&#039;&#039;-x 300&#039;&#039;&#039; will give your map a maximum height of 300 map units.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Minimum Height&#039;&#039;&#039;&lt;br /&gt;
This specifies the minimum height of the map. This option looks like &#039;&#039;&#039;-n Height&#039;&#039;&#039;, where Height is the minimum height of the map. Typing &#039;&#039;&#039;-n -50&#039;&#039;&#039; will give your map a minimum height of -50 map units.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Texture&#039;&#039;&#039;&lt;br /&gt;
This specifies the location of your texture picture. This option looks like &#039;&#039;&#039;-t Location&#039;&#039;&#039;, where Location is the location of your texture image. Typing &#039;&#039;&#039;-t texture.bmp&#039;&#039;&#039; will make the compiler look in the same directory it is in for &#039;&#039;&#039;texture.bmp&#039;&#039;&#039;. Typing &#039;&#039;&#039;-t C:\Maps\HillMap\texture.bmp&#039;&#039;&#039; will make the compiler look in the &#039;&#039;&#039;C:\Maps\HillMap\&#039;&#039;&#039; for texture.bmp. This name cannot contain spaces.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Other Picture files&#039;&#039;&#039;&lt;br /&gt;
These work in basically the same way as the texture option works, with just a changed Setting name.&lt;br /&gt;
*&#039;&#039;&#039;-m metal.bmp&#039;&#039;&#039;: Specifies the location of the metal map.&lt;br /&gt;
*&#039;&#039;&#039;-a height.bmp&#039;&#039;&#039;: Specifies the location of the height map.&lt;br /&gt;
*&#039;&#039;&#039;-f feature.bmp&#039;&#039;&#039;: Specifies the location of the feature map.&lt;br /&gt;
*&#039;&#039;&#039;-y typemap.bmp&#039;&#039;&#039;: Specifies the location of the terrain type map.&lt;br /&gt;
Please note that these names cannot contain spaces.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Map Name&#039;&#039;&#039;&lt;br /&gt;
The Map Converter needs to know where to save your map, and what to call it. We use the &#039;&#039;&#039;-o Mapname.smf&#039;&#039;&#039; setting to do this. Of course, you replace Mapname with the name of your map, but you NEED to have the &#039;.smf&#039; bit on the end of it, otherwise the compiling wont work. An example would be &#039;&#039;&#039;-o HillMap.smf&#039;&#039;&#039;. This name cannot contain spaces.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Other Tags&#039;&#039;&#039;&lt;br /&gt;
Some of these tags are helpful, some are annoying and some are just a mystery. This is basically the mics tags settings.&lt;br /&gt;
*&#039;&#039;&#039;Low Pass&#039;&#039;&#039;: If you map has very steep slopes or rough areas that look ugly, this will smooth them a bit. Is activated just by typing &#039;&#039;&#039;-l&#039;&#039;&#039;. Very useful feature if your heightmap is a bit noisy but you dont want to lose detail by blurring/smoothing it in an image manipulation program&lt;br /&gt;
*&#039;&#039;&#039;Invert Height map&#039;&#039;&#039;: As the logical way to make a height map is the same way up as all the other maps, but the way the map is actually used is the inverted version of this. To make things easier, they included this option to invert the height map. Is activated just by typing &#039;-i&#039;. Most maps will use this. With invert option enabled, black areas on the heightmap will correspond do the lowest points on the map.&lt;br /&gt;
&lt;br /&gt;
=== Compiling through a batch file ===&lt;br /&gt;
&lt;br /&gt;
This is perhaps the easiest option. You just have to create a simple text file, rename it, and run.&lt;br /&gt;
&lt;br /&gt;
First, open up Notepad. Notepad can be found in Start &amp;gt; Program Files &amp;gt; Accessories &amp;gt; Notepad. In notepad, type or copy the following:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;mapconv -c 0 -x 500 -n 50 -o MapName.smf -t texture.bmp -m metal.bmp -a height.bmp -f feature.bmp -i &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Replace the relevant values with the values you need, as the settings here will not work for all the maps. Then, in Notepad click File &amp;gt; Save As. In the file name box, type &#039;&#039;&#039;&amp;quot;Compile.bat&amp;quot;&#039;&#039;&#039;, with the quotes. If you do not have the quotes, it will not work. Save the file in the same directory as your compiler.&lt;br /&gt;
&lt;br /&gt;
Go to the MapConv folder on your hard drive, and you should see a new file. This file will be called Compile.bat. Double click this file, and a black Dos window should pop up. After a few minutes the window should close. There will now be 2 extra files in that directory. &#039;&#039;&#039;MapName.smt&#039;&#039;&#039; and &#039;&#039;&#039;MapName.smf&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Compiling through DOS ===&lt;br /&gt;
&lt;br /&gt;
Use this option if you want to read the information that the MapConv outputs. If you are not familiar with how DOS works, then this way is not for you.&lt;br /&gt;
&lt;br /&gt;
All you need to do is navigate your way through DOS to the location of your map converter program. Then, type in the following:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;mapconv -c 0 -x 500 -n 50 -o MapName.smf -t texture.bmp -m metal.bmp -a height.bmp -f feature.bmp -i &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Replace the relevant values with the values you need, as the settings here will not work for all the maps.&lt;br /&gt;
&lt;br /&gt;
Once compiled, there will be 2 extra files in that directory. &#039;&#039;&#039;MapName.smt&#039;&#039;&#039; and &#039;&#039;&#039;MapName.smf&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Testing your map ===&lt;br /&gt;
&lt;br /&gt;
Most often, its very annoying to have to zip and replace your map files for them to work. There is a very simple workaround that allows you, for example, to edit your .smd file and not have to zip it all up again:&lt;br /&gt;
&lt;br /&gt;
Create a &#039;&#039;&#039;Mapname.sdd&#039;&#039;&#039; &#039;&#039;&#039;directory&#039;&#039;&#039; in your spring/maps folder, and copy the all the files you would normally place into the zipped map into it. This will allow Spring to load the map just as if it were 7zipped and renamed to .sd7&lt;br /&gt;
&lt;br /&gt;
Example file placing:&lt;br /&gt;
Spring/maps/Mapname.sdd/maps/Mapname.smd&lt;br /&gt;
&lt;br /&gt;
After you&#039;ve got everything fine tuned, you can 7zip the map for distribution.&lt;br /&gt;
&lt;br /&gt;
=== Compressing your map ===&lt;br /&gt;
&lt;br /&gt;
Your SMD file needs to have the same name as the .smt and .smf files. If your smt file is calles &#039;&#039;&#039;HillMap.smt&#039;&#039;&#039;, your .smd file needs to be called &#039;&#039;&#039;HillMap.smd&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Place the &#039;&#039;&#039;MapName.smd&#039;&#039;&#039;, &#039;&#039;&#039;MapName.smt&#039;&#039;&#039; and &#039;&#039;&#039;MapName.smf&#039;&#039;&#039; files into an empty folder called maps\. Eg: &#039;&#039;&#039;C:\maps\&#039;&#039;&#039;. Right click this folder, and a right click menu should appear. In that menu, there will be a 7-Zip&#039;&#039;&#039;&amp;gt;&#039;&#039;&#039; submenu. Open this menu, and click &#039;&#039;&#039;Add to Archive...&#039;&#039;&#039;. A 7-zip window will appear. Make sure the settings are identical to the following picture:&lt;br /&gt;
[[Image:7-zip_options.jpg]]&lt;br /&gt;
&lt;br /&gt;
Change the &#039;&#039;&#039;Archive&#039;&#039;&#039; box at the top to the name of your map, with .sd7 on the end. Eg: &#039;&#039;&#039;HillMap.sd7&#039;&#039;&#039;. Click the &#039;&#039;&#039;OK&#039;&#039;&#039; button. After the compression has completed, there will be a file called &#039;&#039;&#039;HillMap.sd7&#039;&#039;&#039; in the same directory as the folder was. In this example, the &#039;&#039;&#039;HillMap.sd7&#039;&#039;&#039; would be straight on the C:\ drive. Copy &#039;&#039;&#039;HillMap.sd7&#039;&#039;&#039; to your TASpring\Maps\ directory.&lt;br /&gt;
&lt;br /&gt;
NOiZE: The compresion can be set at ultra. but make sure you don&#039;t make it a solid archive!&lt;br /&gt;
&lt;br /&gt;
If all of this was done correctly, the map should now appear your maps list in the lobby, and you can go play it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Map making]]&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=MapsBalance&amp;diff=14255</id>
		<title>MapsBalance</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=MapsBalance&amp;diff=14255"/>
		<updated>2009-08-31T17:56:59Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Making properly balanced maps ==&lt;br /&gt;
So, you&#039;re making a map. But how much resources should it have?&lt;br /&gt;
&lt;br /&gt;
Don&#039;t regard this as of little relevance! This is very important!&lt;br /&gt;
&lt;br /&gt;
All units in unit sets are balanced assuming that, for example, metal is x harder to get than energy. If your map has, for example, too much metal, units that cost more onto the metal side than energy side become unbalancedly cheap.&lt;br /&gt;
&lt;br /&gt;
== Resource Standards ==&lt;br /&gt;
When making maps, these are the standards for resources:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Metal:&#039;&#039;&#039;&lt;br /&gt;
*The amount per normal metal extractor is between 0.7 and 2.5&lt;br /&gt;
*The amount of total metal in all patches, when beeing extracted by normal metal extractors, is about 5~15 per player, assuming each player is controlling about a quarter of the map.  It should be noted, though, that this metal should be SPREAD OUT, not all located at the start position.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Energy:&#039;&#039;&#039;&lt;br /&gt;
*The amount of tidal energy is almost always 20&lt;br /&gt;
*The amount of solar energy is almost always 20&lt;br /&gt;
*The amount of wind, is usually 1(min)~25(max) or some other min~max values &amp;lt;b&amp;gt;that average between 7 and 13&amp;lt;/b&amp;gt;&lt;br /&gt;
*The amount of geothermals available to each player generally varies widely depending on the map.  A good guideline is to usually have 1 geothermal for every 2 players as a minimum, or 2 geothermals per player as a maximum.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Standards are just that, standards, and you don&#039;t HAVE to follow them. But it&#039;s better not to go too overboard with resources or use diferent standards very frequently.  For example an  interesting variation may be to increase the amount of metal generated per extractor, but reduce the number of extractors, so that the total metal available is not changed significantly. &lt;br /&gt;
&lt;br /&gt;
In all cases, &amp;lt;B&amp;gt;less metal = more strategy&amp;lt;/B&amp;gt;.  Too little metal is &amp;lt;B&amp;gt;always&amp;lt;/B&amp;gt; better than too much.  This point cannot be stressed too much.&lt;br /&gt;
&lt;br /&gt;
== Gravity ==&lt;br /&gt;
When making maps, the standard gravity is &#039;&#039;&#039;140&#039;&#039;&#039;, or so some assume. No clear &amp;quot;default&amp;quot; value has actually be given by the developers, but it most likely lies somewhere between 100 and 150. If you decide to use a value much higher value, units that fire balistic projectiles (cannons) may not be able to fire their projectiles at the intended range. Be sure to test your map alot before releasing it if you are going to change the gravity drastically.&lt;br /&gt;
&lt;br /&gt;
== Resource Dynamics ==&lt;br /&gt;
This section is dedicated to a more throughout explanation of the workings of the resources in Spring so you can balance your map accordingly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Metal:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Additional info needed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Energy:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A somewhat edited quote from the map forum (thus not a true quote);&lt;br /&gt;
&lt;br /&gt;
&amp;quot;On the wind issue I belive somewhere around 0-20 or 0-30 is pretty reasonable for a map where you want wind to be the &amp;quot;best&amp;quot; option, which it wasn&#039;t on all TA maps. Although wind was viable on most maps with the expection of the moon maps.&lt;br /&gt;
Relying on wind for your energy needs has always been a risky move though, even on maps where it has proven to be useful, because you might just get stuck with all of your generators giving an output of  1, thus ruining your economy for the moment. I hope it stays this way in TA, and personally I find the suggestion that you&#039;d need 30-40 as an average output for wind to be viable quite odd, as online play in TA has shown that&#039;s not true.&lt;br /&gt;
Just for reference, two maps where almost only wind was used in TA are GoW and PD. In GoW I belive the wind varied between 3 to 27, while on PD it was between 1 (or 0, not sure) to 24.&lt;br /&gt;
&lt;br /&gt;
From what I&#039;ve discussed so far though (with old TA players), most seems to agree that once the average income goes to 7 or above, wind quickly becomes the better option. Some do favor having a few solars just as a backup, but overall wind quickly becomes the better option for your main source of energy income, the solars will at most get the postion of a small backup. It can lead to the added investment of energy storages though.&lt;br /&gt;
&lt;br /&gt;
From this you can easily come to your own conclusions, there are however some minor points that I would want to add. First of, you have to take into account that solars in XTA doesn&#039;t cost any energy at all, this is however something that mostly comes into play if your current source of energy is getting destroyed, so you lack energy.&lt;br /&gt;
The other thing I want to add is a short overview of the advantages of the two different sources of energy, ordered by (from my point of view and without taking into account the lack of energy cost for the XTA solar) importance;&lt;br /&gt;
1) The wind generator costs less, only 1/3 of a solar. An average income of 7 will thus already put it as the better choice theoretically.&lt;br /&gt;
2) The wind generator builds quicker, this means you will start to get your energy income faster too which might matter quite a bit.&lt;br /&gt;
3) The solar gives you a constant supply of energy that does not vary.&lt;br /&gt;
4) The solar is better armored than the wind generator. I&#039;m not sure if 3 wind generators have more health than a single solar though (you also have to take into account that they are often built next to each other, so when one goes it will damage the ones next to it).&lt;br /&gt;
5) A single solar takes less space than 3 wind generators. Once the average wind income from a single generator is 20 or above this points becomes moot though, but before that it can potentially be important on certain maps.&lt;br /&gt;
6) A solar usually leaves a &amp;quot;better&amp;quot; wreckage, thus yielding you more metal when you reclaim it. This of course means it was destroyed in the first place, which never is that good.&lt;br /&gt;
&lt;br /&gt;
This is all disregarding the tidal of course, but that&#039;s another matter entirely as it needs water to be built. It works by the same principle as the solar however, the difference being that the wind generator is only Ã‚Â½ the cost of the tidal. There are also some other differences compared to the solar of course (size, armor etc), but generally it should be pretty straightforward to decide if its worth the cost or not if you already understand the relation between solars and wind generators.&lt;br /&gt;
&lt;br /&gt;
One more note about wind, if I remember correctly. In OTA the wind was highest on the barren worlds (ice/desert etc), while it wasn&#039;t a real option on moon maps.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A short summary of this &amp;quot;quote&amp;quot; reads as follows;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wind generators starts to become the best choice as soon as the average energy income from a single generator goes above 7. As the average gets higher the wind generators quickly become the only real choice if you want to win.&lt;br /&gt;
If your map does have an average income of 7 or above, the only real benifits of a solar is more armor, constant supply, less space and finally it usually leaves wreckage behind.&lt;br /&gt;
A single solar costs 3 times that of a wind generator, a single tidal costs 2 times the amount of a wind generator.&lt;br /&gt;
&lt;br /&gt;
[[Category:Map making]]&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=MapSizes&amp;diff=13075</id>
		<title>MapSizes</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=MapSizes&amp;diff=13075"/>
		<updated>2009-08-31T17:56:44Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This table shows you how big the map is in pixels. And some other useless information.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=1&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;TASpring&amp;lt;br&amp;gt;Map size&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;Size&amp;lt;br&amp;gt;in pixels&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1/8 size&amp;lt;br&amp;gt;in pixels&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;(Square)&amp;lt;br&amp;gt;Mem usage&amp;lt;br&amp;gt;in MB (24bit)&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;(Square)&amp;lt;br&amp;gt;Mem usage&amp;lt;br&amp;gt;in MB (32bit)&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;(Square)&amp;lt;br&amp;gt;Saved&amp;lt;br&amp;gt;blocks&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;(Square)&amp;lt;br&amp;gt;Max&amp;lt;br&amp;gt;tile size&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1024&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;128&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1024&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2048&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;256&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;12&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;16&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;4096&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;6&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3072&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;384&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;27&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;36&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;9&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;9216&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;8&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;4096&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;512&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;48&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;64&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;16&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;16384&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;5120&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;640&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;75&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;100&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;25&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;25600&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;12&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;6144&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;768&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;108&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;144&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;36&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;36864&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;14&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;7168&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;896&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;147&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;196&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;49&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;50176&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;16&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;8192&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1024&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;192&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;256&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;64&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;65536&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;18&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;9216&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1152&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;243&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;324&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;81&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;82944&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;20&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;10240&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1280&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;300&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;400&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;100&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;102400&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;22&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;11264&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1408&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;363&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;484&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;121&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;123904&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;24&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;12288&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1536&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;432&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;576&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;144&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;147456&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;26&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;13312&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1664&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;507&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;676&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;169&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;173056&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;28&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;14336&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1792&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;588&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;784&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;196&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;200704&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;30&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;15360&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1920&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;675&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;900&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;225&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;230400&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;32&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;16384&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2048&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;768&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1024&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;256&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;262144&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;34&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;17408&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2176&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;867&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1156&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;289&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;295936&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;36&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;18432&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2304&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;972&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1296&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;324&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;331776&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;38&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;19456&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2432&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1083&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1444&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;361&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;369664&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;40&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;20480&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2560&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1200&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1600&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;400&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;409600&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;42&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;21504&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2688&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1323&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1764&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;441&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;451584&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;44&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;22528&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2816&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1452&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1936&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;484&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;495616&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;46&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;23552&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2944&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1587&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2116&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;529&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;541696&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;48&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;24576&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3072&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1728&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2304&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;576&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;589824&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;50&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;25600&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3200&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1875&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2500&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;625&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;640000&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;52&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;26624&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3328&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2028&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2704&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;676&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;692224&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;54&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;27648&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3456&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2187&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2916&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;729&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;746496&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;56&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;28672&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3584&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2352&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3136&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;784&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;802816&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;58&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;29696&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3712&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2523&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3364&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;841&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;861184&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;60&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;30720&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3840&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2700&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3600&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;900&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;921600&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;62&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;31744&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3968&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2883&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3844&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;961&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;984064&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;64&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;32768&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;4096&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3072&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;4096&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1024&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1048576&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=MapSizes&amp;diff=13074</id>
		<title>MapSizes</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=MapSizes&amp;diff=13074"/>
		<updated>2009-08-31T17:56:36Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
This table shows you how big the map is in pixels. And some other useless information.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=1&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;TASpring&amp;lt;br&amp;gt;Map size&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;Size&amp;lt;br&amp;gt;in pixels&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1/8 size&amp;lt;br&amp;gt;in pixels&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;(Square)&amp;lt;br&amp;gt;Mem usage&amp;lt;br&amp;gt;in MB (24bit)&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;(Square)&amp;lt;br&amp;gt;Mem usage&amp;lt;br&amp;gt;in MB (32bit)&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;(Square)&amp;lt;br&amp;gt;Saved&amp;lt;br&amp;gt;blocks&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;(Square)&amp;lt;br&amp;gt;Max&amp;lt;br&amp;gt;tile size&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1024&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;128&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1024&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2048&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;256&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;12&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;16&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;4096&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;6&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3072&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;384&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;27&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;36&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;9&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;9216&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;8&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;4096&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;512&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;48&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;64&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;16&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;16384&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;5120&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;640&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;75&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;100&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;25&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;25600&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;12&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;6144&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;768&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;108&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;144&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;36&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;36864&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;14&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;7168&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;896&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;147&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;196&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;49&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;50176&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;16&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;8192&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1024&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;192&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;256&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;64&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;65536&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;18&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;9216&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1152&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;243&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;324&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;81&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;82944&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;20&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;10240&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1280&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;300&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;400&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;100&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;102400&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;22&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;11264&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1408&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;363&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;484&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;121&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;123904&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;24&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;12288&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1536&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;432&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;576&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;144&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;147456&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;26&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;13312&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1664&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;507&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;676&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;169&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;173056&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;28&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;14336&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1792&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;588&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;784&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;196&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;200704&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;30&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;15360&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1920&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;675&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;900&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;225&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;230400&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;32&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;16384&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2048&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;768&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1024&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;256&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;262144&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;34&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;17408&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2176&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;867&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1156&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;289&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;295936&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;36&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;18432&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2304&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;972&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1296&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;324&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;331776&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;38&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;19456&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2432&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1083&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1444&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;361&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;369664&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;40&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;20480&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2560&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1200&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1600&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;400&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;409600&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;42&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;21504&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2688&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1323&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1764&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;441&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;451584&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;44&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;22528&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2816&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1452&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1936&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;484&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;495616&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;46&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;23552&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2944&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1587&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2116&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;529&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;541696&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;48&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;24576&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3072&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1728&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2304&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;576&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;589824&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;50&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;25600&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3200&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1875&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2500&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;625&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;640000&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;52&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;26624&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3328&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2028&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2704&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;676&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;692224&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;54&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;27648&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3456&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2187&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2916&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;729&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;746496&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;56&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;28672&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3584&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2352&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3136&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;784&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;802816&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;58&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;29696&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3712&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2523&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3364&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;841&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;861184&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;60&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;30720&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3840&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2700&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3600&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;900&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;921600&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;62&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;31744&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3968&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;2883&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3844&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;961&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;984064&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;64&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;32768&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;4096&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;3072&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;4096&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1024&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td&amp;gt;1048576&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:HeightMapWithPOVRay(RogerN)&amp;diff=18629</id>
		<title>Tutorial:HeightMapWithPOVRay(RogerN)</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:HeightMapWithPOVRay(RogerN)&amp;diff=18629"/>
		<updated>2009-08-31T17:56:27Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
&lt;br /&gt;
Most of the other Spring mapping tutorials focus primarily on the technical aspects of mapping related to compilation (e.g. how to compile your map, what size your height map should be, how to place features, etcÃ¢â‚¬Â¦). Consequently, this tutorial will not go into those details. Instead, this document will focus solely on some tips for creating height maps.&lt;br /&gt;
&lt;br /&gt;
==Required Tools==&lt;br /&gt;
&lt;br /&gt;
In order to make this tutorial accessible to everyone, the tools weÃ¢â‚¬â„¢ll be using are free, open source programs. WeÃ¢â‚¬â„¢re going to be using a generic painting / image processing program and a ray-tracer. These programs are:&lt;br /&gt;
&lt;br /&gt;
[http://www.gimp.org GIMP]: Best described as a Photoshop clone, this is an extremely useful image processing tool. It offers many of the same features as Adobe Photoshop at a much more reasonable price ($0).&lt;br /&gt;
&lt;br /&gt;
[http://www.povray.org POV-Ray]: As a ray-tracer, POV-Ray is primarily designed to render 3D images. WeÃ¢â‚¬â„¢ll be using it to preview our height map in 3D. However, the program also has some tricks we can use to tweak our height map directly. Eventually we can also use POV-Ray to render the final texture for our map (covered in a different tutorial).&lt;br /&gt;
&lt;br /&gt;
Once youÃ¢â‚¬â„¢ve installed the above programs (or Photoshop instead of GIMP), thereÃ¢â‚¬â„¢s one other file you ought to download and extract:&lt;br /&gt;
&lt;br /&gt;
[http://webpages.charter.net/kgnorris/HeightMapTut/HeightMapTutorialFiles.zip Tutorial POV-Ray files]: This archive contains some POV-Ray input files that weÃ¢â‚¬â„¢ll be using throughout the tutorial.&lt;br /&gt;
&lt;br /&gt;
==A Simple Hill==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
In this first section of the tutorial weÃ¢â‚¬â„¢ll be creating a height map for a 4x4 Spring map. This means that our height map needs to be 257 x 257 pixels. So, start up GIMP and create a new image by clicking &amp;quot;File &amp;gt; New&amp;quot;.&lt;br /&gt;
|[[Image:RogerNTut1_CreateImage.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[Image:RogerNTut1_BucketFill.png]]&lt;br /&gt;
|To get our image ready for use, fill the entire image with black. Select black as your foreground color and then use the bucket fill tool to paint the whole thing black.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[Image:RogerNTut1_Lasso.png]]&lt;br /&gt;
|Now we want to create a simple hill in the center of our map. Begin by selecting white as your foreground color. Next, we want to select the region which is going to be the top of our hill. Activate the lasso tool.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Use the lasso tool to outline a region in the center of the height map. This will be the top of our hill. DonÃ¢â‚¬â„¢t make your selection too close to any of the sides because weÃ¢â‚¬â„¢ll need some space around the edges later (the slopes going up our hill need space).&lt;br /&gt;
|[[Image:RogerNTut1_SelectRegion.png]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Before we fill our selected region we want to ensure that our hill has gradual slopes (rather than a sheer face). Right-click the image and click &amp;quot;Select &amp;gt; Feather...&amp;quot; WeÃ¢â‚¬â„¢re going to use 30 pixels here to give a very gradual slope.&lt;br /&gt;
|[[Image:RogerNTut1_Feather.png]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
Now weÃ¢â‚¬â„¢re ready to draw the hill. Select white as your foreground color. Then right-click the image and click &amp;quot;Edit &amp;gt; Fill with FG color.&amp;quot; Now we ought to have a hill in the center of our image with a nice gradient for the slopes.&lt;br /&gt;
|[[Image:RogerNTut1_Feathered.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Our relatively simple hill is complete for now, so save the image as a bitmap in the same folder as the tutorial files downloaded previously. Right-click the image and click &amp;quot;File &amp;gt; Save as...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Viewing in 3D==&lt;br /&gt;
&lt;br /&gt;
Before we continue to tweak our hill, weÃ¢â‚¬â„¢d like to know what it looks like in 3D. POV-Ray can help us quickly render the height map in 3D.&lt;br /&gt;
&lt;br /&gt;
Start up POV-Ray. Open the provided tutorial file, &amp;quot;Render3DHeight.pov&amp;quot;. We have a few settings we want to check before we click run.&lt;br /&gt;
&lt;br /&gt;
Near the top of the POV-Ray file you should see a section for Spring settings. We need to modify these settings for our current project. Specifically, we need to change the height map file name, the map size, and the altitude settings.&lt;br /&gt;
&lt;br /&gt;
Change the height map file to match the name of the bitmap we saved in step 1. The next setting, ViewAngle, is fine at the default for now. The altitude settings need to match what weÃ¢â‚¬â„¢ll eventually use for the map compiler Ã¢â‚¬â€œ for now, choose 100 for the min and 500 for the max. Our Spring map size should be set to 4 x 4.&lt;br /&gt;
&lt;br /&gt;
[[Image:RogerNTut1_SpringSettings1.png]]&lt;br /&gt;
&lt;br /&gt;
WeÃ¢â‚¬â„¢re almost ready to render the 3D image. The last thing to do is pick the render resolution. Either use the drop-down box in the toolbar to select one of the common resolutions, or use the adjacent text box to type the resolution options directly:&lt;br /&gt;
&lt;br /&gt;
[[Image:RogerNTut1_Resolution.png]]&lt;br /&gt;
&lt;br /&gt;
Now click the Run button on the tool bar. You ought to get a 3D picture of our simple hill.&lt;br /&gt;
&lt;br /&gt;
[[Image:RogerNTut1_SimpleHill3D.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Making it realistic==&lt;br /&gt;
&lt;br /&gt;
Unfortunately, our simple hill looks quite unrealistic at the moment. The slopes are too regular to be believable. There are many techniques we can use to spice it up a bit. In this step weÃ¢â‚¬â„¢ll be examining a simple POV-Ray trick for improving our height map.&lt;br /&gt;
&lt;br /&gt;
Using POV-Ray again, open the provided tutorial file &amp;quot;RenderTurbulence.pov&amp;quot;. This file will help us add some entropy to our height map to make it look more natural.&lt;br /&gt;
&lt;br /&gt;
Once again, we need to modify some settings near the top of the file. Locate the Spring settings near the top and modify them to match our current project. We need to set the name of our height map file, and the map size:&lt;br /&gt;
&lt;br /&gt;
[[Image:RogerNTut1_SpringSettings2.png]]&lt;br /&gt;
&lt;br /&gt;
Immediately below the map size are settings for turbulence and noise. These settings control the style and amount of randomness or distortion that will be added to our height map. The default values ought to work fine. However, feel free to play around with the settings to get results that you like.&lt;br /&gt;
&lt;br /&gt;
One important task remains before rendering a new height map. We need to ensure that POV-Ray is set to use the correct resolution! Remember that our height map needs to be 257 x 257 pixels. Use the text box in the POV-Ray tool bar to specify the output resolution:&lt;br /&gt;
&lt;br /&gt;
[[Image:RogerNTut1_OverrideRes.png]]&lt;br /&gt;
&lt;br /&gt;
When you click the Run button in the tool bar, you should see a new version of the height map for our simple hill. POV-Ray has taken our original height map as input and added some turbulence to the image:&lt;br /&gt;
&lt;br /&gt;
[[Image:RogerNTut1_Turbulence.jpg]]&lt;br /&gt;
&lt;br /&gt;
Note that POV-Ray has saved the new image as &amp;quot;RenderTurbulence.bmp&amp;quot;, and has not overwritten our original height map. Also, after applying turbulence in this fashion it is sometimes necessary to apply a small Gaussian blur to smooth out the rough edges (using GIMP, choose &amp;quot;Filters &amp;gt; Blur &amp;gt; Gaussian Blur...&amp;quot;, radius 2). If POV-Ray renders the height map in 3D with small holes in some areas then the height map ought to be smoothed / blurred.&lt;br /&gt;
&lt;br /&gt;
So what does our height map look like in 3D now that weÃ¢â‚¬â„¢ve added turbulence? Return to &amp;quot;Render3DHeight.pov&amp;quot; in order to find out. Remember that our original height map hasnÃ¢â‚¬â„¢t changed, so we need to update the file name to &amp;quot;RenderTurbulence.bmp&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The new height map looks something like this when rendered in 3D:&lt;br /&gt;
&lt;br /&gt;
[[Image:RogerNTut1_Turbulence3d.jpg]]&lt;br /&gt;
&lt;br /&gt;
Not bad! ItÃ¢â‚¬â„¢s definitely more realistic than our first attempt. At this point I recommend that you play around with the various turbulence / noise settings, to see how they affect the results. The default values use only turbulence; be sure to try increasing the NoiseAmplitude.&lt;br /&gt;
&lt;br /&gt;
==Create a mountain range==&lt;br /&gt;
&lt;br /&gt;
In creating the template for our simple hill (step #1) we used a feathered selection to generate a rounded hilltop. This section of the tutorial will demonstrate a slightly different approach which may yield better results for mountains (not hills). Mountains differ from hills in that they tend to be pointed at the top and more angular in shape.&lt;br /&gt;
&lt;br /&gt;
Start up GIMP and create another 257 x 257 height map. Fill the image with black, as before.&lt;br /&gt;
&lt;br /&gt;
Now, using the lasso tool, select a roughly triangular region:&lt;br /&gt;
&lt;br /&gt;
[[Image:RogerNTut1_Triangle.png]]&lt;br /&gt;
&lt;br /&gt;
Next we want to use the gradient tool to fill in our triangular region. First, select the gradient tool.&lt;br /&gt;
&lt;br /&gt;
[[Image:RogerNTut1_Gradient.png]]&lt;br /&gt;
&lt;br /&gt;
Ensure that the foreground color is set to white, and that the background color is set to black. With the gradient tool selected, ensure that the Shape is set to &amp;quot;Shaped (angular).&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Image:RogerNTut1_GradientSettings.png]]&lt;br /&gt;
&lt;br /&gt;
Click anywhere inside the selected region and drag the mouse a short distance. When you release the mouse button, the gradient tool will fill our selection:&lt;br /&gt;
&lt;br /&gt;
[[Image:RogerNTut1_FilledTriangle.png]]&lt;br /&gt;
&lt;br /&gt;
By itself this would be a pretty poor (and lonely) mountain, even with turbulence and noise added. But by repeating the process several times (with different shades of gray) we can make a nice mountain range. Use GIMP layers set to Screen in order to overlay mountains effectively.&lt;br /&gt;
&lt;br /&gt;
[[Image:RogerNTut1_mount1.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Image:RogerNTut1_mount2.jpg]]&lt;br /&gt;
&lt;br /&gt;
In the 3D screenshot note that weÃ¢â‚¬â„¢ve added some turbulence (settings were tweaked to get good results) and blurred the results a bit.&lt;br /&gt;
&lt;br /&gt;
[[Category:Map making]]&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:MapWithPOVRay(Tinnut)&amp;diff=18776</id>
		<title>Tutorial:MapWithPOVRay(Tinnut)</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:MapWithPOVRay(Tinnut)&amp;diff=18776"/>
		<updated>2009-08-31T17:54:14Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Howto ==&lt;br /&gt;
&#039;&#039;&#039;Create a map&#039;s texture using Povray to generate the texture&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!! This is currently a work in progress and make take some time to complete. !!&lt;br /&gt;
&lt;br /&gt;
=== Intro ===&lt;br /&gt;
This guide will take you through creating a texture for a Spring map using the freeware Povray program.  Povray is an excellent [http://en.wikipedia.org/wiki/Ray_tracing raytracing] application that generates &amp;quot;scene&amp;quot; images using a scene definition language in a text file.  We can use it to create a map&#039;s texture by creating a heightfield object, putting our &amp;quot;camera&amp;quot; directly over the object, setting the camera to orthographic, and rendering a bitmap at our map&#039;s dimension.  The steps below will give you an easy enough to follow process to generate a nice map, but if you want to create different maps you&#039;ll need to learn Povray&#039;s scene definition language.  This language is easy enough to follow, but depending on your tastes you could be better off using a tool that specialises in maps and map textures, such as the excellent [http://www.bundysoft.com/L3DT/ L3DT].  &lt;br /&gt;
&lt;br /&gt;
The guide does not cover other aspects of map creation (heighmaps, features, metal, compiling, etc), but there are a few excellent guides within the Wiki that already cover those steps.&lt;br /&gt;
&lt;br /&gt;
Povray is available for both Windows and Linux.  I have only tested these steps under Windows, but they should work under Linux.&lt;br /&gt;
&lt;br /&gt;
Please note that a lot of the maths used in the scene definition file has only been tested on a 16x16 map (8192x8192 pixels).&lt;br /&gt;
&lt;br /&gt;
Warning:  The base textures I use in this example are all mostly rubbish that I created in a couple of minutes.  I would suggest that you do not use them in your own maps :)&lt;br /&gt;
&lt;br /&gt;
=== Initial Steps ===&lt;br /&gt;
1) Download and install Povray: [http://www.povray.org/ Povray Site]&lt;br /&gt;
&lt;br /&gt;
2) Create a working folder for your map, for this example, we&#039;ll make C:\PovMap&lt;br /&gt;
&lt;br /&gt;
3) Create a heightmap using whatever program (I like [http://www.gimp.org/ The GIMP], which is good, and it&#039;s free).  Here is the one we&#039;ll use for our map (I created this in a hurry and it was quite a mistake that it ended up so similar to Altered Divide):&lt;br /&gt;
&lt;br /&gt;
[http://img441.imageshack.us/my.php?image=povmapheightbp9.png http://img441.imageshack.us/img441/8862/povmapheightbp9.th.png]&lt;br /&gt;
&lt;br /&gt;
Your map will need to be named povmap_height.png, but if you want to use another name, just update the pov script below to use your heightmap&#039;s actual name.&lt;br /&gt;
&lt;br /&gt;
4) For our example, we&#039;ll be defining three different elevation levels for which there are different terrain textures, these will be (each at 512x512):&lt;br /&gt;
&lt;br /&gt;
4.1) Lowest elevation (low lying areas):&lt;br /&gt;
&lt;br /&gt;
[http://img176.imageshack.us/my.php?image=level1zd7.png http://img176.imageshack.us/img176/953/level1zd7.th.png]&lt;br /&gt;
&lt;br /&gt;
4.2) Middle elevation (main map surface):&lt;br /&gt;
&lt;br /&gt;
[http://img170.imageshack.us/my.php?image=level2pf6.png http://img170.imageshack.us/img170/6473/level2pf6.th.png]&lt;br /&gt;
&lt;br /&gt;
4.3) Highest elevation (mountains):&lt;br /&gt;
&lt;br /&gt;
[http://img176.imageshack.us/my.php?image=level3wv7.png http://img176.imageshack.us/img176/6159/level3wv7.th.png]&lt;br /&gt;
&lt;br /&gt;
5) Now also for our example, we&#039;ll be defining two different textures to be used by sloping areas, one for slopes in the lower elevation areas of the map, and another for slopes in the higher elevations:&lt;br /&gt;
&lt;br /&gt;
5.1) Lower elevations:&lt;br /&gt;
&lt;br /&gt;
[http://img411.imageshack.us/my.php?image=slope1on6.png http://img411.imageshack.us/img411/2153/slope1on6.th.png]&lt;br /&gt;
&lt;br /&gt;
5.2) Higher elevations:&lt;br /&gt;
&lt;br /&gt;
[http://img411.imageshack.us/my.php?image=slope2fk7.png http://img411.imageshack.us/img411/8908/slope2fk7.th.png]&lt;br /&gt;
&lt;br /&gt;
6) Create an empty text file in your C:\Povmap folder named gen_pov_texture.pov&lt;br /&gt;
&lt;br /&gt;
7) Copy the following povray scene code into the above file:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Setup some parameters that we will use within the script&lt;br /&gt;
#declare MAP_WIDTH=8192;&lt;br /&gt;
#declare MAP_HEIGHT=8192;&lt;br /&gt;
#declare MAP_EL=600; // elevation&lt;br /&gt;
&lt;br /&gt;
global_settings { &lt;br /&gt;
  // ambient light level&lt;br /&gt;
  ambient_light rgb&amp;lt;1,1,1&amp;gt; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Set a directional light&lt;br /&gt;
light_source {&lt;br /&gt;
  &amp;lt;100,-100,100&amp;gt; * 20, color rgb 1&lt;br /&gt;
  parallel&lt;br /&gt;
  point_at &amp;lt;1, 0, 0&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Set the background colour&lt;br /&gt;
background {rgb&amp;lt;1,1,1&amp;gt;}&lt;br /&gt;
&lt;br /&gt;
// Define our camera position, and set it to &amp;quot;orthographic&amp;quot; (important :)&lt;br /&gt;
camera {&lt;br /&gt;
  orthographic&lt;br /&gt;
  location &amp;lt;0,0,MAP_EL + 90&amp;gt;    // position &amp;amp; direction of view&lt;br /&gt;
  look_at  &amp;lt;0,0,0&amp;gt;&lt;br /&gt;
  right MAP_WIDTH*x            // horizontal size of view&lt;br /&gt;
  up MAP_HEIGHT*z               // vertical size of view&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// ** Define our primary textures **&lt;br /&gt;
 &lt;br /&gt;
// lowest texture (512 x 512)&lt;br /&gt;
// Found in low lying areas of the heightfield&lt;br /&gt;
#declare level1_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;level1.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// middle texture (512 x 512)&lt;br /&gt;
// Found in the middle areas of the heightfield&lt;br /&gt;
#declare level2_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;level2.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// highest texture (512 x 512)&lt;br /&gt;
// Found in the peaks / hills / mountains of the heightfield&lt;br /&gt;
#declare level3_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;level3.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Define a texture that blends from one level&#039;s texture to the next, &lt;br /&gt;
// depending on elevation:&lt;br /&gt;
#declare levels_elevation_texture=&lt;br /&gt;
texture {&lt;br /&gt;
  gradient z&lt;br /&gt;
  &lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.00 level1_texture]  // from 0.0 to 0.1 we have just level1.png&lt;br /&gt;
    [0.10 level1_texture]&lt;br /&gt;
                    // from 0.1 to 0.2 we blend from level1.png to level2.png&lt;br /&gt;
    [0.30 level2_texture]  // from 0.2 to 0.5 we have just level2.png&lt;br /&gt;
    [0.40 level2_texture]&lt;br /&gt;
                    // from 0.5 to 0.6 we blend from level2.png to level3.png&lt;br /&gt;
    [0.60  level3_texture]  // from 0.6 to 1.0 we have just level2.png&lt;br /&gt;
    [1.00  level3_texture]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ** Define textures used on areas of slope&lt;br /&gt;
&lt;br /&gt;
// lower slope texture (512 x 512)&lt;br /&gt;
#declare slope1_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;slope1.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// upper slope texture (512 x 512)&lt;br /&gt;
#declare slope2_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;slope2.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Define a texture that blends from one slope&#039;s texture to the next, &lt;br /&gt;
// depending on elevation:&lt;br /&gt;
#declare slopes_elevation_texture=&lt;br /&gt;
texture {&lt;br /&gt;
  gradient z&lt;br /&gt;
  &lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.00 slope1_texture]&lt;br /&gt;
    [0.30 slope1_texture]&lt;br /&gt;
    &lt;br /&gt;
    [0.65  slope2_texture]&lt;br /&gt;
    [1.00  slope2_texture]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// ** Now define the final texture blending between the height textures &lt;br /&gt;
// and the slope textures:&lt;br /&gt;
#declare final_texture = &lt;br /&gt;
texture {&lt;br /&gt;
  slope {&lt;br /&gt;
    &amp;lt;0,0,-1&amp;gt;, 0, 0.5&lt;br /&gt;
  } &lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.00    levels_elevation_texture]&lt;br /&gt;
    [0.06    levels_elevation_texture]&lt;br /&gt;
    [0.40    slopes_elevation_texture]&lt;br /&gt;
    [1.00    slopes_elevation_texture]&lt;br /&gt;
  }&lt;br /&gt;
}  &lt;br /&gt;
&lt;br /&gt;
// ***!! Now we declare our heightfield object that uses this texture&lt;br /&gt;
#declare primaryHF=&lt;br /&gt;
height_field {&lt;br /&gt;
  png &amp;quot;povmap_height.png&amp;quot;                                  &lt;br /&gt;
  smooth              // smooth the heightfield&lt;br /&gt;
  no_shadow           // you may want to remove this&lt;br /&gt;
  translate &amp;lt;-.5, -.5, -.5&amp;gt;&lt;br /&gt;
  rotate &amp;lt;90,0,0&amp;gt;     // rotate it so that the projection of the texture is correct&lt;br /&gt;
  scale &amp;lt;1,-1,1&amp;gt;      // invert the y axis&lt;br /&gt;
  translate &amp;lt;0.5, 0.5, 0.5&amp;gt;&lt;br /&gt;
  texture {&lt;br /&gt;
    final_texture&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // now scale to the maps height x width&lt;br /&gt;
  scale &amp;lt;MAP_WIDTH, MAP_HEIGHT, MAP_EL&amp;gt;    &lt;br /&gt;
  // and center it for the camera&lt;br /&gt;
  translate &amp;lt;-MAP_WIDTH/2, -MAP_HEIGHT/2, -MAP_EL/2&amp;gt;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ** If you&#039;re going to add the metal placement stuff&lt;br /&gt;
// ** described below, you need to put it here!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
object {primaryHF}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What we&#039;re essentially doing above is:&lt;br /&gt;
&lt;br /&gt;
* Setting up scene parameters: lighting, the orthographic camera, etc.&lt;br /&gt;
&lt;br /&gt;
* Defining a set of textures to display at different elevations and different slopes; and&lt;br /&gt;
&lt;br /&gt;
* Defining a heightmap that uses our png image and applies our texture to this object&lt;br /&gt;
&lt;br /&gt;
8) Double click on your gen_pov_texture.pov file so that it opens up in Povray.&lt;br /&gt;
&lt;br /&gt;
9) Add a new render size (8192 x 8192):&lt;br /&gt;
&lt;br /&gt;
9.1)	Drop down menu &amp;quot;Render&amp;quot; &amp;gt; &amp;quot;Edit Settings/Render&amp;quot; &amp;gt; Click &amp;quot;Edit&amp;quot; button&lt;br /&gt;
&lt;br /&gt;
9.2)	Add text at bottom of file:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[8192x8192, No AA  Spring]&lt;br /&gt;
Width=8192&lt;br /&gt;
Height=8192&lt;br /&gt;
Antialias=Off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
9.3) Save file&lt;br /&gt;
&lt;br /&gt;
10) Restart Povray so that it re-reads the ini-file&lt;br /&gt;
&lt;br /&gt;
11) Select your new render size and click Render.  This creates a bitmap file: gen_pov_texture.bmp&lt;br /&gt;
&lt;br /&gt;
12) Convert to gen_pov_texture.bmp to a png file if you&#039;re using the new mapconv (it doesn&#039;t seem to like bitmaps).  I personally use [http://www.imagemagick.org/ imagemagick] to do this as it has a simple command line program &amp;quot;convert.exe&amp;quot; that will convert an image from one format to another and it works well with the very large bitmap image that comes out of the above steps.&lt;br /&gt;
&lt;br /&gt;
13) Do all the other map stuff: metal placement bitmap, feature placement bitmap, smd file&lt;br /&gt;
&lt;br /&gt;
14) Compile your map with mapconv&lt;br /&gt;
&lt;br /&gt;
15) Test it :)&lt;br /&gt;
&lt;br /&gt;
== Advanced stuff ==&lt;br /&gt;
Check out your help file that came with Povray.  There is a LOT that you can do!&lt;br /&gt;
&lt;br /&gt;
=== Complex Texture Map Combinations ===&lt;br /&gt;
As you can see from the pov code above, a &amp;quot;texture&amp;quot; declaration can be an image (called an &amp;quot;image_map&amp;quot;), but it can also be a definition of a blend between any number of earlier defined textures (called a &amp;quot;texture_map&amp;quot;), which is based on a function.  In the above example, it uses the &amp;quot;gradient&amp;quot; function for changes in elevation, and the &amp;quot;slope&amp;quot; function for changes in slope.  It is possible to define much more complex sets of textures than those defined above, such as mixing different combination of slope mapings with combinations of elevation mapings.&lt;br /&gt;
&lt;br /&gt;
Our blend function could actually be an image if you wanted finer control of a map&#039;s texture, by having sections of metal mixed with sections of wilderness, for example.  To do this, you would:&lt;br /&gt;
&lt;br /&gt;
1) Create a new png image the same size as your heightmap (although you could make it larger or smaller) and paint sections of the map that are to use your wilderness textures in white, and the sections that are to use your metal texture in black.  For effect you could do a slight blur on the image to create grey coloured transitions where the two sections meet.  For our example I created this:&lt;br /&gt;
&lt;br /&gt;
[http://img185.imageshack.us/my.php?image=texturedistributionpa8.png http://img185.imageshack.us/img185/2641/texturedistributionpa8.th.png]&lt;br /&gt;
&lt;br /&gt;
3) Change the &amp;quot;final_texture&amp;quot; texture name in your script to &amp;quot;final_nature_texture&amp;quot;&lt;br /&gt;
&lt;br /&gt;
4) Define a set of textures in a similar manner that define your metal textures (based on heights and slopes), with the final blended metal texture named &amp;quot;final_metal_texture&amp;quot;.  Don&#039;t forget to give them different names than the wilderness texture names are.&lt;br /&gt;
&lt;br /&gt;
5) Create a new &amp;quot;final_texture&amp;quot; that is:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#declare final_texture = &lt;br /&gt;
texture {&lt;br /&gt;
  image_pattern { png &amp;quot;texture_distribution.png&amp;quot; }&lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.00    final_metal_texture]&lt;br /&gt;
    [1.00    final_nature_texture]&lt;br /&gt;
  }&lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Here is a screen shot of our map using this:&lt;br /&gt;
&lt;br /&gt;
[http://img341.imageshack.us/my.php?image=screen000wd0.png http://img341.imageshack.us/img341/43/screen000wd0.th.png]&lt;br /&gt;
&lt;br /&gt;
=== Procedural Textures ===&lt;br /&gt;
It is also possible to use &amp;quot;procedural textures&amp;quot; instead of image_map textures.  These can be quite useful for areas on your map that have a high slope as they can create a better looking texture, including effects such as the layered rock textures - like &amp;quot;Painted Rock&amp;quot;.  Unfortunately these types of textures can result in larger map sizes, but if you just use them on the high slope areas of your map it should not be too bad.&lt;br /&gt;
&lt;br /&gt;
Some good examples used in terrains can be found at the [http://geomorph.sourceforge.net/povray/en/Geomorph%20-%20Predefined%20Povray%20Scripts.html Geomorph website].&lt;br /&gt;
&lt;br /&gt;
The povray install also includes a number of nice example procedural textures.&lt;br /&gt;
&lt;br /&gt;
=== Placing Metal Textures ===&lt;br /&gt;
There are quite a few posible ways to have Povray place metal textures for you.  One approach that I have used is:&lt;br /&gt;
&lt;br /&gt;
1) Define a function that will return the current metal locations in a pov kind of way:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  #declare getMetal = function {&lt;br /&gt;
    pigment {&lt;br /&gt;
      image_map {&lt;br /&gt;
        png &amp;quot;metallocations.png&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
      scale &amp;lt;1,-1,1&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
This function, when called for a given coordinate (0 to 1), returns a vector of the three colours for that point.&lt;br /&gt;
&lt;br /&gt;
2) We now define a texture that we&#039;ll use for our metal (this is made up of a number of subcomponent textures):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// A transparent texture&lt;br /&gt;
#declare Transparent_Texture=&lt;br /&gt;
texture {&lt;br /&gt;
	pigment {color rgbt&amp;lt;0,0,0,1&amp;gt;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// A simple brownish texture&lt;br /&gt;
#declare dirt_Texture=&lt;br /&gt;
texture {&lt;br /&gt;
  pigment { rgb &amp;lt;0.75,0.55,0.35&amp;gt;*0.7 }&lt;br /&gt;
  normal {&lt;br /&gt;
    granite 0.5  // for use with normal{} (0...1 or more)&lt;br /&gt;
    //scale MAP_WIDTH&lt;br /&gt;
  }&lt;br /&gt;
  finish {&lt;br /&gt;
    ambient 0.5&lt;br /&gt;
    diffuse .9&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// A shiny metalish texture&lt;br /&gt;
#declare metal_TextureBase = &lt;br /&gt;
texture { &lt;br /&gt;
  pigment {&lt;br /&gt;
    rgb&amp;lt;1,1,1&amp;gt;    &lt;br /&gt;
  }&lt;br /&gt;
  normal {&lt;br /&gt;
      granite 0.9  // for use with normal{} (0...1 or more)&lt;br /&gt;
    scale 80/5&lt;br /&gt;
  }&lt;br /&gt;
  finish {&lt;br /&gt;
    ambient 0.6&lt;br /&gt;
    brilliance 4&lt;br /&gt;
    diffuse 1&lt;br /&gt;
    specular 0.90&lt;br /&gt;
    roughness 1/80&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// A combination of the metal_TextureBase, the dirt_Texture and the&lt;br /&gt;
// Transparent_Texture&lt;br /&gt;
#declare metal_Texture=&lt;br /&gt;
texture {&lt;br /&gt;
  bozo              // very smooth, random noise function&lt;br /&gt;
  turbulence 0.3  // turbulence often useful&lt;br /&gt;
&lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.0  metal_TextureBase]  //T_Silver_3B&lt;br /&gt;
    [0.42  metal_TextureBase]&lt;br /&gt;
    [0.47  dirt_Texture]&lt;br /&gt;
    [0.50  dirt_Texture]&lt;br /&gt;
    [0.55  Transparent_Texture]&lt;br /&gt;
    [1.0  Transparent_Texture]&lt;br /&gt;
  }&lt;br /&gt;
  //scale &amp;lt;16, 16, 16&amp;gt; //even&lt;br /&gt;
  scale &amp;lt;7, 32, 16&amp;gt; //stretched &lt;br /&gt;
  rotate z*40  //set it at an angle so it looks betterer ;)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#declare blob_Texture=&lt;br /&gt;
texture {&lt;br /&gt;
  slope { z, 0.0, 0.5 }&lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.0  Transparent_Texture]&lt;br /&gt;
    [0.6  Transparent_Texture]&lt;br /&gt;
    [1.0  metal_Texture]&lt;br /&gt;
  }&lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
3) Finally, we define a &amp;quot;blob&amp;quot; object that adds a sphere object to the master blob object for each point in the metal map: &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;  #declare metalBlob=&lt;br /&gt;
  blob {&lt;br /&gt;
  #declare geos=0;&lt;br /&gt;
  #declare ix=4.0;&lt;br /&gt;
  #declare num=0;&lt;br /&gt;
  #while (ix &amp;lt; MAP_WIDTH)&lt;br /&gt;
    #declare iy=0.0;&lt;br /&gt;
    #while (iy &amp;lt; MAP_WIDTH)&lt;br /&gt;
      #declare metal=getMetal(ix/MAP_WIDTH, iy/MAP_WIDTH, 0);&lt;br /&gt;
      #if (metal.red)&lt;br /&gt;
        #declare Pos = trace(primaryHF,&amp;lt;ix-MAP_WIDTH/2, -iy+MAP_WIDTH/2, MAP_EL*2&amp;gt;,-z);&lt;br /&gt;
        sphere {&lt;br /&gt;
            //Pos-&amp;lt;0,0,5&amp;gt;, 8*6, 8  &lt;br /&gt;
            Pos-&amp;lt;0,0,5&amp;gt;, 8*2, 8  &lt;br /&gt;
        }&lt;br /&gt;
      #end &lt;br /&gt;
      #declare iy=iy+8;&lt;br /&gt;
    #end&lt;br /&gt;
    #declare ix=ix+8;&lt;br /&gt;
  #end&lt;br /&gt;
  &lt;br /&gt;
    texture {&lt;br /&gt;
      blob_Texture&lt;br /&gt;
    }&lt;br /&gt;
    scale &amp;lt;1,1,0.5&amp;gt;  &lt;br /&gt;
  }  //metalBlob&lt;br /&gt;
&lt;br /&gt;
  object {metalBlob}&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
This all adds some time to the rendering time, but seems to work well enough (although it could be nicer).&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:MapWithPOVRay(Tinnut)&amp;diff=18775</id>
		<title>Tutorial:MapWithPOVRay(Tinnut)</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:MapWithPOVRay(Tinnut)&amp;diff=18775"/>
		<updated>2009-08-31T17:54:01Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Howto ===&lt;br /&gt;
&#039;&#039;&#039;Create a map&#039;s texture using Povray to generate the texture&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!! This is currently a work in progress and make take some time to complete. !!&lt;br /&gt;
&lt;br /&gt;
=== Intro ===&lt;br /&gt;
This guide will take you through creating a texture for a Spring map using the freeware Povray program.  Povray is an excellent [http://en.wikipedia.org/wiki/Ray_tracing raytracing] application that generates &amp;quot;scene&amp;quot; images using a scene definition language in a text file.  We can use it to create a map&#039;s texture by creating a heightfield object, putting our &amp;quot;camera&amp;quot; directly over the object, setting the camera to orthographic, and rendering a bitmap at our map&#039;s dimension.  The steps below will give you an easy enough to follow process to generate a nice map, but if you want to create different maps you&#039;ll need to learn Povray&#039;s scene definition language.  This language is easy enough to follow, but depending on your tastes you could be better off using a tool that specialises in maps and map textures, such as the excellent [http://www.bundysoft.com/L3DT/ L3DT].  &lt;br /&gt;
&lt;br /&gt;
The guide does not cover other aspects of map creation (heighmaps, features, metal, compiling, etc), but there are a few excellent guides within the Wiki that already cover those steps.&lt;br /&gt;
&lt;br /&gt;
Povray is available for both Windows and Linux.  I have only tested these steps under Windows, but they should work under Linux.&lt;br /&gt;
&lt;br /&gt;
Please note that a lot of the maths used in the scene definition file has only been tested on a 16x16 map (8192x8192 pixels).&lt;br /&gt;
&lt;br /&gt;
Warning:  The base textures I use in this example are all mostly rubbish that I created in a couple of minutes.  I would suggest that you do not use them in your own maps :)&lt;br /&gt;
&lt;br /&gt;
=== Initial Steps ===&lt;br /&gt;
1) Download and install Povray: [http://www.povray.org/ Povray Site]&lt;br /&gt;
&lt;br /&gt;
2) Create a working folder for your map, for this example, we&#039;ll make C:\PovMap&lt;br /&gt;
&lt;br /&gt;
3) Create a heightmap using whatever program (I like [http://www.gimp.org/ The GIMP], which is good, and it&#039;s free).  Here is the one we&#039;ll use for our map (I created this in a hurry and it was quite a mistake that it ended up so similar to Altered Divide):&lt;br /&gt;
&lt;br /&gt;
[http://img441.imageshack.us/my.php?image=povmapheightbp9.png http://img441.imageshack.us/img441/8862/povmapheightbp9.th.png]&lt;br /&gt;
&lt;br /&gt;
Your map will need to be named povmap_height.png, but if you want to use another name, just update the pov script below to use your heightmap&#039;s actual name.&lt;br /&gt;
&lt;br /&gt;
4) For our example, we&#039;ll be defining three different elevation levels for which there are different terrain textures, these will be (each at 512x512):&lt;br /&gt;
&lt;br /&gt;
4.1) Lowest elevation (low lying areas):&lt;br /&gt;
&lt;br /&gt;
[http://img176.imageshack.us/my.php?image=level1zd7.png http://img176.imageshack.us/img176/953/level1zd7.th.png]&lt;br /&gt;
&lt;br /&gt;
4.2) Middle elevation (main map surface):&lt;br /&gt;
&lt;br /&gt;
[http://img170.imageshack.us/my.php?image=level2pf6.png http://img170.imageshack.us/img170/6473/level2pf6.th.png]&lt;br /&gt;
&lt;br /&gt;
4.3) Highest elevation (mountains):&lt;br /&gt;
&lt;br /&gt;
[http://img176.imageshack.us/my.php?image=level3wv7.png http://img176.imageshack.us/img176/6159/level3wv7.th.png]&lt;br /&gt;
&lt;br /&gt;
5) Now also for our example, we&#039;ll be defining two different textures to be used by sloping areas, one for slopes in the lower elevation areas of the map, and another for slopes in the higher elevations:&lt;br /&gt;
&lt;br /&gt;
5.1) Lower elevations:&lt;br /&gt;
&lt;br /&gt;
[http://img411.imageshack.us/my.php?image=slope1on6.png http://img411.imageshack.us/img411/2153/slope1on6.th.png]&lt;br /&gt;
&lt;br /&gt;
5.2) Higher elevations:&lt;br /&gt;
&lt;br /&gt;
[http://img411.imageshack.us/my.php?image=slope2fk7.png http://img411.imageshack.us/img411/8908/slope2fk7.th.png]&lt;br /&gt;
&lt;br /&gt;
6) Create an empty text file in your C:\Povmap folder named gen_pov_texture.pov&lt;br /&gt;
&lt;br /&gt;
7) Copy the following povray scene code into the above file:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Setup some parameters that we will use within the script&lt;br /&gt;
#declare MAP_WIDTH=8192;&lt;br /&gt;
#declare MAP_HEIGHT=8192;&lt;br /&gt;
#declare MAP_EL=600; // elevation&lt;br /&gt;
&lt;br /&gt;
global_settings { &lt;br /&gt;
  // ambient light level&lt;br /&gt;
  ambient_light rgb&amp;lt;1,1,1&amp;gt; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Set a directional light&lt;br /&gt;
light_source {&lt;br /&gt;
  &amp;lt;100,-100,100&amp;gt; * 20, color rgb 1&lt;br /&gt;
  parallel&lt;br /&gt;
  point_at &amp;lt;1, 0, 0&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Set the background colour&lt;br /&gt;
background {rgb&amp;lt;1,1,1&amp;gt;}&lt;br /&gt;
&lt;br /&gt;
// Define our camera position, and set it to &amp;quot;orthographic&amp;quot; (important :)&lt;br /&gt;
camera {&lt;br /&gt;
  orthographic&lt;br /&gt;
  location &amp;lt;0,0,MAP_EL + 90&amp;gt;    // position &amp;amp; direction of view&lt;br /&gt;
  look_at  &amp;lt;0,0,0&amp;gt;&lt;br /&gt;
  right MAP_WIDTH*x            // horizontal size of view&lt;br /&gt;
  up MAP_HEIGHT*z               // vertical size of view&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// ** Define our primary textures **&lt;br /&gt;
 &lt;br /&gt;
// lowest texture (512 x 512)&lt;br /&gt;
// Found in low lying areas of the heightfield&lt;br /&gt;
#declare level1_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;level1.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// middle texture (512 x 512)&lt;br /&gt;
// Found in the middle areas of the heightfield&lt;br /&gt;
#declare level2_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;level2.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// highest texture (512 x 512)&lt;br /&gt;
// Found in the peaks / hills / mountains of the heightfield&lt;br /&gt;
#declare level3_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;level3.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Define a texture that blends from one level&#039;s texture to the next, &lt;br /&gt;
// depending on elevation:&lt;br /&gt;
#declare levels_elevation_texture=&lt;br /&gt;
texture {&lt;br /&gt;
  gradient z&lt;br /&gt;
  &lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.00 level1_texture]  // from 0.0 to 0.1 we have just level1.png&lt;br /&gt;
    [0.10 level1_texture]&lt;br /&gt;
                    // from 0.1 to 0.2 we blend from level1.png to level2.png&lt;br /&gt;
    [0.30 level2_texture]  // from 0.2 to 0.5 we have just level2.png&lt;br /&gt;
    [0.40 level2_texture]&lt;br /&gt;
                    // from 0.5 to 0.6 we blend from level2.png to level3.png&lt;br /&gt;
    [0.60  level3_texture]  // from 0.6 to 1.0 we have just level2.png&lt;br /&gt;
    [1.00  level3_texture]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ** Define textures used on areas of slope&lt;br /&gt;
&lt;br /&gt;
// lower slope texture (512 x 512)&lt;br /&gt;
#declare slope1_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;slope1.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// upper slope texture (512 x 512)&lt;br /&gt;
#declare slope2_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;slope2.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Define a texture that blends from one slope&#039;s texture to the next, &lt;br /&gt;
// depending on elevation:&lt;br /&gt;
#declare slopes_elevation_texture=&lt;br /&gt;
texture {&lt;br /&gt;
  gradient z&lt;br /&gt;
  &lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.00 slope1_texture]&lt;br /&gt;
    [0.30 slope1_texture]&lt;br /&gt;
    &lt;br /&gt;
    [0.65  slope2_texture]&lt;br /&gt;
    [1.00  slope2_texture]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// ** Now define the final texture blending between the height textures &lt;br /&gt;
// and the slope textures:&lt;br /&gt;
#declare final_texture = &lt;br /&gt;
texture {&lt;br /&gt;
  slope {&lt;br /&gt;
    &amp;lt;0,0,-1&amp;gt;, 0, 0.5&lt;br /&gt;
  } &lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.00    levels_elevation_texture]&lt;br /&gt;
    [0.06    levels_elevation_texture]&lt;br /&gt;
    [0.40    slopes_elevation_texture]&lt;br /&gt;
    [1.00    slopes_elevation_texture]&lt;br /&gt;
  }&lt;br /&gt;
}  &lt;br /&gt;
&lt;br /&gt;
// ***!! Now we declare our heightfield object that uses this texture&lt;br /&gt;
#declare primaryHF=&lt;br /&gt;
height_field {&lt;br /&gt;
  png &amp;quot;povmap_height.png&amp;quot;                                  &lt;br /&gt;
  smooth              // smooth the heightfield&lt;br /&gt;
  no_shadow           // you may want to remove this&lt;br /&gt;
  translate &amp;lt;-.5, -.5, -.5&amp;gt;&lt;br /&gt;
  rotate &amp;lt;90,0,0&amp;gt;     // rotate it so that the projection of the texture is correct&lt;br /&gt;
  scale &amp;lt;1,-1,1&amp;gt;      // invert the y axis&lt;br /&gt;
  translate &amp;lt;0.5, 0.5, 0.5&amp;gt;&lt;br /&gt;
  texture {&lt;br /&gt;
    final_texture&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // now scale to the maps height x width&lt;br /&gt;
  scale &amp;lt;MAP_WIDTH, MAP_HEIGHT, MAP_EL&amp;gt;    &lt;br /&gt;
  // and center it for the camera&lt;br /&gt;
  translate &amp;lt;-MAP_WIDTH/2, -MAP_HEIGHT/2, -MAP_EL/2&amp;gt;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ** If you&#039;re going to add the metal placement stuff&lt;br /&gt;
// ** described below, you need to put it here!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
object {primaryHF}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What we&#039;re essentially doing above is:&lt;br /&gt;
&lt;br /&gt;
* Setting up scene parameters: lighting, the orthographic camera, etc.&lt;br /&gt;
&lt;br /&gt;
* Defining a set of textures to display at different elevations and different slopes; and&lt;br /&gt;
&lt;br /&gt;
* Defining a heightmap that uses our png image and applies our texture to this object&lt;br /&gt;
&lt;br /&gt;
8) Double click on your gen_pov_texture.pov file so that it opens up in Povray.&lt;br /&gt;
&lt;br /&gt;
9) Add a new render size (8192 x 8192):&lt;br /&gt;
&lt;br /&gt;
9.1)	Drop down menu &amp;quot;Render&amp;quot; &amp;gt; &amp;quot;Edit Settings/Render&amp;quot; &amp;gt; Click &amp;quot;Edit&amp;quot; button&lt;br /&gt;
&lt;br /&gt;
9.2)	Add text at bottom of file:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[8192x8192, No AA  Spring]&lt;br /&gt;
Width=8192&lt;br /&gt;
Height=8192&lt;br /&gt;
Antialias=Off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
9.3) Save file&lt;br /&gt;
&lt;br /&gt;
10) Restart Povray so that it re-reads the ini-file&lt;br /&gt;
&lt;br /&gt;
11) Select your new render size and click Render.  This creates a bitmap file: gen_pov_texture.bmp&lt;br /&gt;
&lt;br /&gt;
12) Convert to gen_pov_texture.bmp to a png file if you&#039;re using the new mapconv (it doesn&#039;t seem to like bitmaps).  I personally use [http://www.imagemagick.org/ imagemagick] to do this as it has a simple command line program &amp;quot;convert.exe&amp;quot; that will convert an image from one format to another and it works well with the very large bitmap image that comes out of the above steps.&lt;br /&gt;
&lt;br /&gt;
13) Do all the other map stuff: metal placement bitmap, feature placement bitmap, smd file&lt;br /&gt;
&lt;br /&gt;
14) Compile your map with mapconv&lt;br /&gt;
&lt;br /&gt;
15) Test it :)&lt;br /&gt;
&lt;br /&gt;
== Advanced stuff ==&lt;br /&gt;
Check out your help file that came with Povray.  There is a LOT that you can do!&lt;br /&gt;
&lt;br /&gt;
=== Complex Texture Map Combinations ===&lt;br /&gt;
As you can see from the pov code above, a &amp;quot;texture&amp;quot; declaration can be an image (called an &amp;quot;image_map&amp;quot;), but it can also be a definition of a blend between any number of earlier defined textures (called a &amp;quot;texture_map&amp;quot;), which is based on a function.  In the above example, it uses the &amp;quot;gradient&amp;quot; function for changes in elevation, and the &amp;quot;slope&amp;quot; function for changes in slope.  It is possible to define much more complex sets of textures than those defined above, such as mixing different combination of slope mapings with combinations of elevation mapings.&lt;br /&gt;
&lt;br /&gt;
Our blend function could actually be an image if you wanted finer control of a map&#039;s texture, by having sections of metal mixed with sections of wilderness, for example.  To do this, you would:&lt;br /&gt;
&lt;br /&gt;
1) Create a new png image the same size as your heightmap (although you could make it larger or smaller) and paint sections of the map that are to use your wilderness textures in white, and the sections that are to use your metal texture in black.  For effect you could do a slight blur on the image to create grey coloured transitions where the two sections meet.  For our example I created this:&lt;br /&gt;
&lt;br /&gt;
[http://img185.imageshack.us/my.php?image=texturedistributionpa8.png http://img185.imageshack.us/img185/2641/texturedistributionpa8.th.png]&lt;br /&gt;
&lt;br /&gt;
3) Change the &amp;quot;final_texture&amp;quot; texture name in your script to &amp;quot;final_nature_texture&amp;quot;&lt;br /&gt;
&lt;br /&gt;
4) Define a set of textures in a similar manner that define your metal textures (based on heights and slopes), with the final blended metal texture named &amp;quot;final_metal_texture&amp;quot;.  Don&#039;t forget to give them different names than the wilderness texture names are.&lt;br /&gt;
&lt;br /&gt;
5) Create a new &amp;quot;final_texture&amp;quot; that is:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#declare final_texture = &lt;br /&gt;
texture {&lt;br /&gt;
  image_pattern { png &amp;quot;texture_distribution.png&amp;quot; }&lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.00    final_metal_texture]&lt;br /&gt;
    [1.00    final_nature_texture]&lt;br /&gt;
  }&lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Here is a screen shot of our map using this:&lt;br /&gt;
&lt;br /&gt;
[http://img341.imageshack.us/my.php?image=screen000wd0.png http://img341.imageshack.us/img341/43/screen000wd0.th.png]&lt;br /&gt;
&lt;br /&gt;
=== Procedural Textures ===&lt;br /&gt;
It is also possible to use &amp;quot;procedural textures&amp;quot; instead of image_map textures.  These can be quite useful for areas on your map that have a high slope as they can create a better looking texture, including effects such as the layered rock textures - like &amp;quot;Painted Rock&amp;quot;.  Unfortunately these types of textures can result in larger map sizes, but if you just use them on the high slope areas of your map it should not be too bad.&lt;br /&gt;
&lt;br /&gt;
Some good examples used in terrains can be found at the [http://geomorph.sourceforge.net/povray/en/Geomorph%20-%20Predefined%20Povray%20Scripts.html Geomorph website].&lt;br /&gt;
&lt;br /&gt;
The povray install also includes a number of nice example procedural textures.&lt;br /&gt;
&lt;br /&gt;
=== Placing Metal Textures ===&lt;br /&gt;
There are quite a few posible ways to have Povray place metal textures for you.  One approach that I have used is:&lt;br /&gt;
&lt;br /&gt;
1) Define a function that will return the current metal locations in a pov kind of way:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  #declare getMetal = function {&lt;br /&gt;
    pigment {&lt;br /&gt;
      image_map {&lt;br /&gt;
        png &amp;quot;metallocations.png&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
      scale &amp;lt;1,-1,1&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
This function, when called for a given coordinate (0 to 1), returns a vector of the three colours for that point.&lt;br /&gt;
&lt;br /&gt;
2) We now define a texture that we&#039;ll use for our metal (this is made up of a number of subcomponent textures):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// A transparent texture&lt;br /&gt;
#declare Transparent_Texture=&lt;br /&gt;
texture {&lt;br /&gt;
	pigment {color rgbt&amp;lt;0,0,0,1&amp;gt;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// A simple brownish texture&lt;br /&gt;
#declare dirt_Texture=&lt;br /&gt;
texture {&lt;br /&gt;
  pigment { rgb &amp;lt;0.75,0.55,0.35&amp;gt;*0.7 }&lt;br /&gt;
  normal {&lt;br /&gt;
    granite 0.5  // for use with normal{} (0...1 or more)&lt;br /&gt;
    //scale MAP_WIDTH&lt;br /&gt;
  }&lt;br /&gt;
  finish {&lt;br /&gt;
    ambient 0.5&lt;br /&gt;
    diffuse .9&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// A shiny metalish texture&lt;br /&gt;
#declare metal_TextureBase = &lt;br /&gt;
texture { &lt;br /&gt;
  pigment {&lt;br /&gt;
    rgb&amp;lt;1,1,1&amp;gt;    &lt;br /&gt;
  }&lt;br /&gt;
  normal {&lt;br /&gt;
      granite 0.9  // for use with normal{} (0...1 or more)&lt;br /&gt;
    scale 80/5&lt;br /&gt;
  }&lt;br /&gt;
  finish {&lt;br /&gt;
    ambient 0.6&lt;br /&gt;
    brilliance 4&lt;br /&gt;
    diffuse 1&lt;br /&gt;
    specular 0.90&lt;br /&gt;
    roughness 1/80&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// A combination of the metal_TextureBase, the dirt_Texture and the&lt;br /&gt;
// Transparent_Texture&lt;br /&gt;
#declare metal_Texture=&lt;br /&gt;
texture {&lt;br /&gt;
  bozo              // very smooth, random noise function&lt;br /&gt;
  turbulence 0.3  // turbulence often useful&lt;br /&gt;
&lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.0  metal_TextureBase]  //T_Silver_3B&lt;br /&gt;
    [0.42  metal_TextureBase]&lt;br /&gt;
    [0.47  dirt_Texture]&lt;br /&gt;
    [0.50  dirt_Texture]&lt;br /&gt;
    [0.55  Transparent_Texture]&lt;br /&gt;
    [1.0  Transparent_Texture]&lt;br /&gt;
  }&lt;br /&gt;
  //scale &amp;lt;16, 16, 16&amp;gt; //even&lt;br /&gt;
  scale &amp;lt;7, 32, 16&amp;gt; //stretched &lt;br /&gt;
  rotate z*40  //set it at an angle so it looks betterer ;)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#declare blob_Texture=&lt;br /&gt;
texture {&lt;br /&gt;
  slope { z, 0.0, 0.5 }&lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.0  Transparent_Texture]&lt;br /&gt;
    [0.6  Transparent_Texture]&lt;br /&gt;
    [1.0  metal_Texture]&lt;br /&gt;
  }&lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
3) Finally, we define a &amp;quot;blob&amp;quot; object that adds a sphere object to the master blob object for each point in the metal map: &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;  #declare metalBlob=&lt;br /&gt;
  blob {&lt;br /&gt;
  #declare geos=0;&lt;br /&gt;
  #declare ix=4.0;&lt;br /&gt;
  #declare num=0;&lt;br /&gt;
  #while (ix &amp;lt; MAP_WIDTH)&lt;br /&gt;
    #declare iy=0.0;&lt;br /&gt;
    #while (iy &amp;lt; MAP_WIDTH)&lt;br /&gt;
      #declare metal=getMetal(ix/MAP_WIDTH, iy/MAP_WIDTH, 0);&lt;br /&gt;
      #if (metal.red)&lt;br /&gt;
        #declare Pos = trace(primaryHF,&amp;lt;ix-MAP_WIDTH/2, -iy+MAP_WIDTH/2, MAP_EL*2&amp;gt;,-z);&lt;br /&gt;
        sphere {&lt;br /&gt;
            //Pos-&amp;lt;0,0,5&amp;gt;, 8*6, 8  &lt;br /&gt;
            Pos-&amp;lt;0,0,5&amp;gt;, 8*2, 8  &lt;br /&gt;
        }&lt;br /&gt;
      #end &lt;br /&gt;
      #declare iy=iy+8;&lt;br /&gt;
    #end&lt;br /&gt;
    #declare ix=ix+8;&lt;br /&gt;
  #end&lt;br /&gt;
  &lt;br /&gt;
    texture {&lt;br /&gt;
      blob_Texture&lt;br /&gt;
    }&lt;br /&gt;
    scale &amp;lt;1,1,0.5&amp;gt;  &lt;br /&gt;
  }  //metalBlob&lt;br /&gt;
&lt;br /&gt;
  object {metalBlob}&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
This all adds some time to the rendering time, but seems to work well enough (although it could be nicer).&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:MapWithPOVRay(Tinnut)&amp;diff=18774</id>
		<title>Tutorial:MapWithPOVRay(Tinnut)</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:MapWithPOVRay(Tinnut)&amp;diff=18774"/>
		<updated>2009-08-31T17:53:42Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Howto: Create a map&#039;s texture using Povray to generate the texture ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!! This is currently a work in progress and make take some time to complete. !!&lt;br /&gt;
&lt;br /&gt;
=== Intro ===&lt;br /&gt;
This guide will take you through creating a texture for a Spring map using the freeware Povray program.  Povray is an excellent [http://en.wikipedia.org/wiki/Ray_tracing raytracing] application that generates &amp;quot;scene&amp;quot; images using a scene definition language in a text file.  We can use it to create a map&#039;s texture by creating a heightfield object, putting our &amp;quot;camera&amp;quot; directly over the object, setting the camera to orthographic, and rendering a bitmap at our map&#039;s dimension.  The steps below will give you an easy enough to follow process to generate a nice map, but if you want to create different maps you&#039;ll need to learn Povray&#039;s scene definition language.  This language is easy enough to follow, but depending on your tastes you could be better off using a tool that specialises in maps and map textures, such as the excellent [http://www.bundysoft.com/L3DT/ L3DT].  &lt;br /&gt;
&lt;br /&gt;
The guide does not cover other aspects of map creation (heighmaps, features, metal, compiling, etc), but there are a few excellent guides within the Wiki that already cover those steps.&lt;br /&gt;
&lt;br /&gt;
Povray is available for both Windows and Linux.  I have only tested these steps under Windows, but they should work under Linux.&lt;br /&gt;
&lt;br /&gt;
Please note that a lot of the maths used in the scene definition file has only been tested on a 16x16 map (8192x8192 pixels).&lt;br /&gt;
&lt;br /&gt;
Warning:  The base textures I use in this example are all mostly rubbish that I created in a couple of minutes.  I would suggest that you do not use them in your own maps :)&lt;br /&gt;
&lt;br /&gt;
=== Initial Steps ===&lt;br /&gt;
1) Download and install Povray: [http://www.povray.org/ Povray Site]&lt;br /&gt;
&lt;br /&gt;
2) Create a working folder for your map, for this example, we&#039;ll make C:\PovMap&lt;br /&gt;
&lt;br /&gt;
3) Create a heightmap using whatever program (I like [http://www.gimp.org/ The GIMP], which is good, and it&#039;s free).  Here is the one we&#039;ll use for our map (I created this in a hurry and it was quite a mistake that it ended up so similar to Altered Divide):&lt;br /&gt;
&lt;br /&gt;
[http://img441.imageshack.us/my.php?image=povmapheightbp9.png http://img441.imageshack.us/img441/8862/povmapheightbp9.th.png]&lt;br /&gt;
&lt;br /&gt;
Your map will need to be named povmap_height.png, but if you want to use another name, just update the pov script below to use your heightmap&#039;s actual name.&lt;br /&gt;
&lt;br /&gt;
4) For our example, we&#039;ll be defining three different elevation levels for which there are different terrain textures, these will be (each at 512x512):&lt;br /&gt;
&lt;br /&gt;
4.1) Lowest elevation (low lying areas):&lt;br /&gt;
&lt;br /&gt;
[http://img176.imageshack.us/my.php?image=level1zd7.png http://img176.imageshack.us/img176/953/level1zd7.th.png]&lt;br /&gt;
&lt;br /&gt;
4.2) Middle elevation (main map surface):&lt;br /&gt;
&lt;br /&gt;
[http://img170.imageshack.us/my.php?image=level2pf6.png http://img170.imageshack.us/img170/6473/level2pf6.th.png]&lt;br /&gt;
&lt;br /&gt;
4.3) Highest elevation (mountains):&lt;br /&gt;
&lt;br /&gt;
[http://img176.imageshack.us/my.php?image=level3wv7.png http://img176.imageshack.us/img176/6159/level3wv7.th.png]&lt;br /&gt;
&lt;br /&gt;
5) Now also for our example, we&#039;ll be defining two different textures to be used by sloping areas, one for slopes in the lower elevation areas of the map, and another for slopes in the higher elevations:&lt;br /&gt;
&lt;br /&gt;
5.1) Lower elevations:&lt;br /&gt;
&lt;br /&gt;
[http://img411.imageshack.us/my.php?image=slope1on6.png http://img411.imageshack.us/img411/2153/slope1on6.th.png]&lt;br /&gt;
&lt;br /&gt;
5.2) Higher elevations:&lt;br /&gt;
&lt;br /&gt;
[http://img411.imageshack.us/my.php?image=slope2fk7.png http://img411.imageshack.us/img411/8908/slope2fk7.th.png]&lt;br /&gt;
&lt;br /&gt;
6) Create an empty text file in your C:\Povmap folder named gen_pov_texture.pov&lt;br /&gt;
&lt;br /&gt;
7) Copy the following povray scene code into the above file:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Setup some parameters that we will use within the script&lt;br /&gt;
#declare MAP_WIDTH=8192;&lt;br /&gt;
#declare MAP_HEIGHT=8192;&lt;br /&gt;
#declare MAP_EL=600; // elevation&lt;br /&gt;
&lt;br /&gt;
global_settings { &lt;br /&gt;
  // ambient light level&lt;br /&gt;
  ambient_light rgb&amp;lt;1,1,1&amp;gt; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Set a directional light&lt;br /&gt;
light_source {&lt;br /&gt;
  &amp;lt;100,-100,100&amp;gt; * 20, color rgb 1&lt;br /&gt;
  parallel&lt;br /&gt;
  point_at &amp;lt;1, 0, 0&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Set the background colour&lt;br /&gt;
background {rgb&amp;lt;1,1,1&amp;gt;}&lt;br /&gt;
&lt;br /&gt;
// Define our camera position, and set it to &amp;quot;orthographic&amp;quot; (important :)&lt;br /&gt;
camera {&lt;br /&gt;
  orthographic&lt;br /&gt;
  location &amp;lt;0,0,MAP_EL + 90&amp;gt;    // position &amp;amp; direction of view&lt;br /&gt;
  look_at  &amp;lt;0,0,0&amp;gt;&lt;br /&gt;
  right MAP_WIDTH*x            // horizontal size of view&lt;br /&gt;
  up MAP_HEIGHT*z               // vertical size of view&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// ** Define our primary textures **&lt;br /&gt;
 &lt;br /&gt;
// lowest texture (512 x 512)&lt;br /&gt;
// Found in low lying areas of the heightfield&lt;br /&gt;
#declare level1_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;level1.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// middle texture (512 x 512)&lt;br /&gt;
// Found in the middle areas of the heightfield&lt;br /&gt;
#declare level2_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;level2.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// highest texture (512 x 512)&lt;br /&gt;
// Found in the peaks / hills / mountains of the heightfield&lt;br /&gt;
#declare level3_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;level3.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Define a texture that blends from one level&#039;s texture to the next, &lt;br /&gt;
// depending on elevation:&lt;br /&gt;
#declare levels_elevation_texture=&lt;br /&gt;
texture {&lt;br /&gt;
  gradient z&lt;br /&gt;
  &lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.00 level1_texture]  // from 0.0 to 0.1 we have just level1.png&lt;br /&gt;
    [0.10 level1_texture]&lt;br /&gt;
                    // from 0.1 to 0.2 we blend from level1.png to level2.png&lt;br /&gt;
    [0.30 level2_texture]  // from 0.2 to 0.5 we have just level2.png&lt;br /&gt;
    [0.40 level2_texture]&lt;br /&gt;
                    // from 0.5 to 0.6 we blend from level2.png to level3.png&lt;br /&gt;
    [0.60  level3_texture]  // from 0.6 to 1.0 we have just level2.png&lt;br /&gt;
    [1.00  level3_texture]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ** Define textures used on areas of slope&lt;br /&gt;
&lt;br /&gt;
// lower slope texture (512 x 512)&lt;br /&gt;
#declare slope1_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;slope1.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// upper slope texture (512 x 512)&lt;br /&gt;
#declare slope2_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;slope2.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Define a texture that blends from one slope&#039;s texture to the next, &lt;br /&gt;
// depending on elevation:&lt;br /&gt;
#declare slopes_elevation_texture=&lt;br /&gt;
texture {&lt;br /&gt;
  gradient z&lt;br /&gt;
  &lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.00 slope1_texture]&lt;br /&gt;
    [0.30 slope1_texture]&lt;br /&gt;
    &lt;br /&gt;
    [0.65  slope2_texture]&lt;br /&gt;
    [1.00  slope2_texture]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// ** Now define the final texture blending between the height textures &lt;br /&gt;
// and the slope textures:&lt;br /&gt;
#declare final_texture = &lt;br /&gt;
texture {&lt;br /&gt;
  slope {&lt;br /&gt;
    &amp;lt;0,0,-1&amp;gt;, 0, 0.5&lt;br /&gt;
  } &lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.00    levels_elevation_texture]&lt;br /&gt;
    [0.06    levels_elevation_texture]&lt;br /&gt;
    [0.40    slopes_elevation_texture]&lt;br /&gt;
    [1.00    slopes_elevation_texture]&lt;br /&gt;
  }&lt;br /&gt;
}  &lt;br /&gt;
&lt;br /&gt;
// ***!! Now we declare our heightfield object that uses this texture&lt;br /&gt;
#declare primaryHF=&lt;br /&gt;
height_field {&lt;br /&gt;
  png &amp;quot;povmap_height.png&amp;quot;                                  &lt;br /&gt;
  smooth              // smooth the heightfield&lt;br /&gt;
  no_shadow           // you may want to remove this&lt;br /&gt;
  translate &amp;lt;-.5, -.5, -.5&amp;gt;&lt;br /&gt;
  rotate &amp;lt;90,0,0&amp;gt;     // rotate it so that the projection of the texture is correct&lt;br /&gt;
  scale &amp;lt;1,-1,1&amp;gt;      // invert the y axis&lt;br /&gt;
  translate &amp;lt;0.5, 0.5, 0.5&amp;gt;&lt;br /&gt;
  texture {&lt;br /&gt;
    final_texture&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // now scale to the maps height x width&lt;br /&gt;
  scale &amp;lt;MAP_WIDTH, MAP_HEIGHT, MAP_EL&amp;gt;    &lt;br /&gt;
  // and center it for the camera&lt;br /&gt;
  translate &amp;lt;-MAP_WIDTH/2, -MAP_HEIGHT/2, -MAP_EL/2&amp;gt;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ** If you&#039;re going to add the metal placement stuff&lt;br /&gt;
// ** described below, you need to put it here!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
object {primaryHF}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What we&#039;re essentially doing above is:&lt;br /&gt;
&lt;br /&gt;
* Setting up scene parameters: lighting, the orthographic camera, etc.&lt;br /&gt;
&lt;br /&gt;
* Defining a set of textures to display at different elevations and different slopes; and&lt;br /&gt;
&lt;br /&gt;
* Defining a heightmap that uses our png image and applies our texture to this object&lt;br /&gt;
&lt;br /&gt;
8) Double click on your gen_pov_texture.pov file so that it opens up in Povray.&lt;br /&gt;
&lt;br /&gt;
9) Add a new render size (8192 x 8192):&lt;br /&gt;
&lt;br /&gt;
9.1)	Drop down menu &amp;quot;Render&amp;quot; &amp;gt; &amp;quot;Edit Settings/Render&amp;quot; &amp;gt; Click &amp;quot;Edit&amp;quot; button&lt;br /&gt;
&lt;br /&gt;
9.2)	Add text at bottom of file:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[8192x8192, No AA  Spring]&lt;br /&gt;
Width=8192&lt;br /&gt;
Height=8192&lt;br /&gt;
Antialias=Off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
9.3) Save file&lt;br /&gt;
&lt;br /&gt;
10) Restart Povray so that it re-reads the ini-file&lt;br /&gt;
&lt;br /&gt;
11) Select your new render size and click Render.  This creates a bitmap file: gen_pov_texture.bmp&lt;br /&gt;
&lt;br /&gt;
12) Convert to gen_pov_texture.bmp to a png file if you&#039;re using the new mapconv (it doesn&#039;t seem to like bitmaps).  I personally use [http://www.imagemagick.org/ imagemagick] to do this as it has a simple command line program &amp;quot;convert.exe&amp;quot; that will convert an image from one format to another and it works well with the very large bitmap image that comes out of the above steps.&lt;br /&gt;
&lt;br /&gt;
13) Do all the other map stuff: metal placement bitmap, feature placement bitmap, smd file&lt;br /&gt;
&lt;br /&gt;
14) Compile your map with mapconv&lt;br /&gt;
&lt;br /&gt;
15) Test it :)&lt;br /&gt;
&lt;br /&gt;
== Advanced stuff ==&lt;br /&gt;
Check out your help file that came with Povray.  There is a LOT that you can do!&lt;br /&gt;
&lt;br /&gt;
=== Complex Texture Map Combinations ===&lt;br /&gt;
As you can see from the pov code above, a &amp;quot;texture&amp;quot; declaration can be an image (called an &amp;quot;image_map&amp;quot;), but it can also be a definition of a blend between any number of earlier defined textures (called a &amp;quot;texture_map&amp;quot;), which is based on a function.  In the above example, it uses the &amp;quot;gradient&amp;quot; function for changes in elevation, and the &amp;quot;slope&amp;quot; function for changes in slope.  It is possible to define much more complex sets of textures than those defined above, such as mixing different combination of slope mapings with combinations of elevation mapings.&lt;br /&gt;
&lt;br /&gt;
Our blend function could actually be an image if you wanted finer control of a map&#039;s texture, by having sections of metal mixed with sections of wilderness, for example.  To do this, you would:&lt;br /&gt;
&lt;br /&gt;
1) Create a new png image the same size as your heightmap (although you could make it larger or smaller) and paint sections of the map that are to use your wilderness textures in white, and the sections that are to use your metal texture in black.  For effect you could do a slight blur on the image to create grey coloured transitions where the two sections meet.  For our example I created this:&lt;br /&gt;
&lt;br /&gt;
[http://img185.imageshack.us/my.php?image=texturedistributionpa8.png http://img185.imageshack.us/img185/2641/texturedistributionpa8.th.png]&lt;br /&gt;
&lt;br /&gt;
3) Change the &amp;quot;final_texture&amp;quot; texture name in your script to &amp;quot;final_nature_texture&amp;quot;&lt;br /&gt;
&lt;br /&gt;
4) Define a set of textures in a similar manner that define your metal textures (based on heights and slopes), with the final blended metal texture named &amp;quot;final_metal_texture&amp;quot;.  Don&#039;t forget to give them different names than the wilderness texture names are.&lt;br /&gt;
&lt;br /&gt;
5) Create a new &amp;quot;final_texture&amp;quot; that is:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#declare final_texture = &lt;br /&gt;
texture {&lt;br /&gt;
  image_pattern { png &amp;quot;texture_distribution.png&amp;quot; }&lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.00    final_metal_texture]&lt;br /&gt;
    [1.00    final_nature_texture]&lt;br /&gt;
  }&lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Here is a screen shot of our map using this:&lt;br /&gt;
&lt;br /&gt;
[http://img341.imageshack.us/my.php?image=screen000wd0.png http://img341.imageshack.us/img341/43/screen000wd0.th.png]&lt;br /&gt;
&lt;br /&gt;
=== Procedural Textures ===&lt;br /&gt;
It is also possible to use &amp;quot;procedural textures&amp;quot; instead of image_map textures.  These can be quite useful for areas on your map that have a high slope as they can create a better looking texture, including effects such as the layered rock textures - like &amp;quot;Painted Rock&amp;quot;.  Unfortunately these types of textures can result in larger map sizes, but if you just use them on the high slope areas of your map it should not be too bad.&lt;br /&gt;
&lt;br /&gt;
Some good examples used in terrains can be found at the [http://geomorph.sourceforge.net/povray/en/Geomorph%20-%20Predefined%20Povray%20Scripts.html Geomorph website].&lt;br /&gt;
&lt;br /&gt;
The povray install also includes a number of nice example procedural textures.&lt;br /&gt;
&lt;br /&gt;
=== Placing Metal Textures ===&lt;br /&gt;
There are quite a few posible ways to have Povray place metal textures for you.  One approach that I have used is:&lt;br /&gt;
&lt;br /&gt;
1) Define a function that will return the current metal locations in a pov kind of way:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  #declare getMetal = function {&lt;br /&gt;
    pigment {&lt;br /&gt;
      image_map {&lt;br /&gt;
        png &amp;quot;metallocations.png&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
      scale &amp;lt;1,-1,1&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
This function, when called for a given coordinate (0 to 1), returns a vector of the three colours for that point.&lt;br /&gt;
&lt;br /&gt;
2) We now define a texture that we&#039;ll use for our metal (this is made up of a number of subcomponent textures):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// A transparent texture&lt;br /&gt;
#declare Transparent_Texture=&lt;br /&gt;
texture {&lt;br /&gt;
	pigment {color rgbt&amp;lt;0,0,0,1&amp;gt;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// A simple brownish texture&lt;br /&gt;
#declare dirt_Texture=&lt;br /&gt;
texture {&lt;br /&gt;
  pigment { rgb &amp;lt;0.75,0.55,0.35&amp;gt;*0.7 }&lt;br /&gt;
  normal {&lt;br /&gt;
    granite 0.5  // for use with normal{} (0...1 or more)&lt;br /&gt;
    //scale MAP_WIDTH&lt;br /&gt;
  }&lt;br /&gt;
  finish {&lt;br /&gt;
    ambient 0.5&lt;br /&gt;
    diffuse .9&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// A shiny metalish texture&lt;br /&gt;
#declare metal_TextureBase = &lt;br /&gt;
texture { &lt;br /&gt;
  pigment {&lt;br /&gt;
    rgb&amp;lt;1,1,1&amp;gt;    &lt;br /&gt;
  }&lt;br /&gt;
  normal {&lt;br /&gt;
      granite 0.9  // for use with normal{} (0...1 or more)&lt;br /&gt;
    scale 80/5&lt;br /&gt;
  }&lt;br /&gt;
  finish {&lt;br /&gt;
    ambient 0.6&lt;br /&gt;
    brilliance 4&lt;br /&gt;
    diffuse 1&lt;br /&gt;
    specular 0.90&lt;br /&gt;
    roughness 1/80&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// A combination of the metal_TextureBase, the dirt_Texture and the&lt;br /&gt;
// Transparent_Texture&lt;br /&gt;
#declare metal_Texture=&lt;br /&gt;
texture {&lt;br /&gt;
  bozo              // very smooth, random noise function&lt;br /&gt;
  turbulence 0.3  // turbulence often useful&lt;br /&gt;
&lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.0  metal_TextureBase]  //T_Silver_3B&lt;br /&gt;
    [0.42  metal_TextureBase]&lt;br /&gt;
    [0.47  dirt_Texture]&lt;br /&gt;
    [0.50  dirt_Texture]&lt;br /&gt;
    [0.55  Transparent_Texture]&lt;br /&gt;
    [1.0  Transparent_Texture]&lt;br /&gt;
  }&lt;br /&gt;
  //scale &amp;lt;16, 16, 16&amp;gt; //even&lt;br /&gt;
  scale &amp;lt;7, 32, 16&amp;gt; //stretched &lt;br /&gt;
  rotate z*40  //set it at an angle so it looks betterer ;)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#declare blob_Texture=&lt;br /&gt;
texture {&lt;br /&gt;
  slope { z, 0.0, 0.5 }&lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.0  Transparent_Texture]&lt;br /&gt;
    [0.6  Transparent_Texture]&lt;br /&gt;
    [1.0  metal_Texture]&lt;br /&gt;
  }&lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
3) Finally, we define a &amp;quot;blob&amp;quot; object that adds a sphere object to the master blob object for each point in the metal map: &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;  #declare metalBlob=&lt;br /&gt;
  blob {&lt;br /&gt;
  #declare geos=0;&lt;br /&gt;
  #declare ix=4.0;&lt;br /&gt;
  #declare num=0;&lt;br /&gt;
  #while (ix &amp;lt; MAP_WIDTH)&lt;br /&gt;
    #declare iy=0.0;&lt;br /&gt;
    #while (iy &amp;lt; MAP_WIDTH)&lt;br /&gt;
      #declare metal=getMetal(ix/MAP_WIDTH, iy/MAP_WIDTH, 0);&lt;br /&gt;
      #if (metal.red)&lt;br /&gt;
        #declare Pos = trace(primaryHF,&amp;lt;ix-MAP_WIDTH/2, -iy+MAP_WIDTH/2, MAP_EL*2&amp;gt;,-z);&lt;br /&gt;
        sphere {&lt;br /&gt;
            //Pos-&amp;lt;0,0,5&amp;gt;, 8*6, 8  &lt;br /&gt;
            Pos-&amp;lt;0,0,5&amp;gt;, 8*2, 8  &lt;br /&gt;
        }&lt;br /&gt;
      #end &lt;br /&gt;
      #declare iy=iy+8;&lt;br /&gt;
    #end&lt;br /&gt;
    #declare ix=ix+8;&lt;br /&gt;
  #end&lt;br /&gt;
  &lt;br /&gt;
    texture {&lt;br /&gt;
      blob_Texture&lt;br /&gt;
    }&lt;br /&gt;
    scale &amp;lt;1,1,0.5&amp;gt;  &lt;br /&gt;
  }  //metalBlob&lt;br /&gt;
&lt;br /&gt;
  object {metalBlob}&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
This all adds some time to the rendering time, but seems to work well enough (although it could be nicer).&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:MapWithPOVRay(Tinnut)&amp;diff=18773</id>
		<title>Tutorial:MapWithPOVRay(Tinnut)</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:MapWithPOVRay(Tinnut)&amp;diff=18773"/>
		<updated>2009-08-31T17:53:18Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Howto: Create a map&#039;s texture using Povray to generate the texture ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!! This is currently a work in progress and make take some time to complete. !!&lt;br /&gt;
&lt;br /&gt;
=== Intro ===&lt;br /&gt;
This guide will take you through creating a texture for a Spring map using the freeware Povray program.  Povray is an excellent [http://en.wikipedia.org/wiki/Ray_tracing raytracing] application that generates &amp;quot;scene&amp;quot; images using a scene definition language in a text file.  We can use it to create a map&#039;s texture by creating a heightfield object, putting our &amp;quot;camera&amp;quot; directly over the object, setting the camera to orthographic, and rendering a bitmap at our map&#039;s dimension.  The steps below will give you an easy enough to follow process to generate a nice map, but if you want to create different maps you&#039;ll need to learn Povray&#039;s scene definition language.  This language is easy enough to follow, but depending on your tastes you could be better off using a tool that specialises in maps and map textures, such as the excellent [http://www.bundysoft.com/L3DT/ L3DT].  &lt;br /&gt;
&lt;br /&gt;
The guide does not cover other aspects of map creation (heighmaps, features, metal, compiling, etc), but there are a few excellent guides within the Wiki that already cover those steps.&lt;br /&gt;
&lt;br /&gt;
Povray is available for both Windows and Linux.  I have only tested these steps under Windows, but they should work under Linux.&lt;br /&gt;
&lt;br /&gt;
Please note that a lot of the maths used in the scene definition file has only been tested on a 16x16 map (8192x8192 pixels).&lt;br /&gt;
&lt;br /&gt;
Warning:  The base textures I use in this example are all mostly rubbish that I created in a couple of minutes.  I would suggest that you do not use them in your own maps :)&lt;br /&gt;
&lt;br /&gt;
=== Initial Steps ===&lt;br /&gt;
1) Download and install Povray: [http://www.povray.org/ Povray Site]&lt;br /&gt;
&lt;br /&gt;
2) Create a working folder for your map, for this example, we&#039;ll make C:\PovMap&lt;br /&gt;
&lt;br /&gt;
3) Create a heightmap using whatever program (I like [http://www.gimp.org/ The GIMP], which is good, and it&#039;s free).  Here is the one we&#039;ll use for our map (I created this in a hurry and it was quite a mistake that it ended up so similar to Altered Divide):&lt;br /&gt;
&lt;br /&gt;
[http://img441.imageshack.us/my.php?image=povmapheightbp9.png http://img441.imageshack.us/img441/8862/povmapheightbp9.th.png]&lt;br /&gt;
&lt;br /&gt;
Your map will need to be named povmap_height.png, but if you want to use another name, just update the pov script below to use your heightmap&#039;s actual name.&lt;br /&gt;
&lt;br /&gt;
4) For our example, we&#039;ll be defining three different elevation levels for which there are different terrain textures, these will be (each at 512x512):&lt;br /&gt;
&lt;br /&gt;
4.1) Lowest elevation (low lying areas):&lt;br /&gt;
&lt;br /&gt;
[http://img176.imageshack.us/my.php?image=level1zd7.png http://img176.imageshack.us/img176/953/level1zd7.th.png]&lt;br /&gt;
&lt;br /&gt;
4.2) Middle elevation (main map surface):&lt;br /&gt;
&lt;br /&gt;
[http://img170.imageshack.us/my.php?image=level2pf6.png http://img170.imageshack.us/img170/6473/level2pf6.th.png]&lt;br /&gt;
&lt;br /&gt;
4.3) Highest elevation (mountains):&lt;br /&gt;
&lt;br /&gt;
[http://img176.imageshack.us/my.php?image=level3wv7.png http://img176.imageshack.us/img176/6159/level3wv7.th.png]&lt;br /&gt;
&lt;br /&gt;
5) Now also for our example, we&#039;ll be defining two different textures to be used by sloping areas, one for slopes in the lower elevation areas of the map, and another for slopes in the higher elevations:&lt;br /&gt;
&lt;br /&gt;
5.1) Lower elevations:&lt;br /&gt;
&lt;br /&gt;
[http://img411.imageshack.us/my.php?image=slope1on6.png http://img411.imageshack.us/img411/2153/slope1on6.th.png]&lt;br /&gt;
&lt;br /&gt;
5.2) Higher elevations:&lt;br /&gt;
&lt;br /&gt;
[http://img411.imageshack.us/my.php?image=slope2fk7.png http://img411.imageshack.us/img411/8908/slope2fk7.th.png]&lt;br /&gt;
&lt;br /&gt;
6) Create an empty text file in your C:\Povmap folder named gen_pov_texture.pov&lt;br /&gt;
&lt;br /&gt;
7) Copy the following povray scene code into the above file:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Setup some parameters that we will use within the script&lt;br /&gt;
#declare MAP_WIDTH=8192;&lt;br /&gt;
#declare MAP_HEIGHT=8192;&lt;br /&gt;
#declare MAP_EL=600; // elevation&lt;br /&gt;
&lt;br /&gt;
global_settings { &lt;br /&gt;
  // ambient light level&lt;br /&gt;
  ambient_light rgb&amp;lt;1,1,1&amp;gt; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Set a directional light&lt;br /&gt;
light_source {&lt;br /&gt;
  &amp;lt;100,-100,100&amp;gt; * 20, color rgb 1&lt;br /&gt;
  parallel&lt;br /&gt;
  point_at &amp;lt;1, 0, 0&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Set the background colour&lt;br /&gt;
background {rgb&amp;lt;1,1,1&amp;gt;}&lt;br /&gt;
&lt;br /&gt;
// Define our camera position, and set it to &amp;quot;orthographic&amp;quot; (important :)&lt;br /&gt;
camera {&lt;br /&gt;
  orthographic&lt;br /&gt;
  location &amp;lt;0,0,MAP_EL + 90&amp;gt;    // position &amp;amp; direction of view&lt;br /&gt;
  look_at  &amp;lt;0,0,0&amp;gt;&lt;br /&gt;
  right MAP_WIDTH*x            // horizontal size of view&lt;br /&gt;
  up MAP_HEIGHT*z               // vertical size of view&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// ** Define our primary textures **&lt;br /&gt;
 &lt;br /&gt;
// lowest texture (512 x 512)&lt;br /&gt;
// Found in low lying areas of the heightfield&lt;br /&gt;
#declare level1_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;level1.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// middle texture (512 x 512)&lt;br /&gt;
// Found in the middle areas of the heightfield&lt;br /&gt;
#declare level2_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;level2.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// highest texture (512 x 512)&lt;br /&gt;
// Found in the peaks / hills / mountains of the heightfield&lt;br /&gt;
#declare level3_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;level3.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Define a texture that blends from one level&#039;s texture to the next, &lt;br /&gt;
// depending on elevation:&lt;br /&gt;
#declare levels_elevation_texture=&lt;br /&gt;
texture {&lt;br /&gt;
  gradient z&lt;br /&gt;
  &lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.00 level1_texture]  // from 0.0 to 0.1 we have just level1.png&lt;br /&gt;
    [0.10 level1_texture]&lt;br /&gt;
                    // from 0.1 to 0.2 we blend from level1.png to level2.png&lt;br /&gt;
    [0.30 level2_texture]  // from 0.2 to 0.5 we have just level2.png&lt;br /&gt;
    [0.40 level2_texture]&lt;br /&gt;
                    // from 0.5 to 0.6 we blend from level2.png to level3.png&lt;br /&gt;
    [0.60  level3_texture]  // from 0.6 to 1.0 we have just level2.png&lt;br /&gt;
    [1.00  level3_texture]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ** Define textures used on areas of slope&lt;br /&gt;
&lt;br /&gt;
// lower slope texture (512 x 512)&lt;br /&gt;
#declare slope1_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;slope1.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// upper slope texture (512 x 512)&lt;br /&gt;
#declare slope2_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;slope2.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Define a texture that blends from one slope&#039;s texture to the next, &lt;br /&gt;
// depending on elevation:&lt;br /&gt;
#declare slopes_elevation_texture=&lt;br /&gt;
texture {&lt;br /&gt;
  gradient z&lt;br /&gt;
  &lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.00 slope1_texture]&lt;br /&gt;
    [0.30 slope1_texture]&lt;br /&gt;
    &lt;br /&gt;
    [0.65  slope2_texture]&lt;br /&gt;
    [1.00  slope2_texture]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// ** Now define the final texture blending between the height textures &lt;br /&gt;
// and the slope textures:&lt;br /&gt;
#declare final_texture = &lt;br /&gt;
texture {&lt;br /&gt;
  slope {&lt;br /&gt;
    &amp;lt;0,0,-1&amp;gt;, 0, 0.5&lt;br /&gt;
  } &lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.00    levels_elevation_texture]&lt;br /&gt;
    [0.06    levels_elevation_texture]&lt;br /&gt;
    [0.40    slopes_elevation_texture]&lt;br /&gt;
    [1.00    slopes_elevation_texture]&lt;br /&gt;
  }&lt;br /&gt;
}  &lt;br /&gt;
&lt;br /&gt;
// ***!! Now we declare our heightfield object that uses this texture&lt;br /&gt;
#declare primaryHF=&lt;br /&gt;
height_field {&lt;br /&gt;
  png &amp;quot;povmap_height.png&amp;quot;                                  &lt;br /&gt;
  smooth              // smooth the heightfield&lt;br /&gt;
  no_shadow           // you may want to remove this&lt;br /&gt;
  translate &amp;lt;-.5, -.5, -.5&amp;gt;&lt;br /&gt;
  rotate &amp;lt;90,0,0&amp;gt;     // rotate it so that the projection of the texture is correct&lt;br /&gt;
  scale &amp;lt;1,-1,1&amp;gt;      // invert the y axis&lt;br /&gt;
  translate &amp;lt;0.5, 0.5, 0.5&amp;gt;&lt;br /&gt;
  texture {&lt;br /&gt;
    final_texture&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // now scale to the maps height x width&lt;br /&gt;
  scale &amp;lt;MAP_WIDTH, MAP_HEIGHT, MAP_EL&amp;gt;    &lt;br /&gt;
  // and center it for the camera&lt;br /&gt;
  translate &amp;lt;-MAP_WIDTH/2, -MAP_HEIGHT/2, -MAP_EL/2&amp;gt;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ** If you&#039;re going to add the metal placement stuff&lt;br /&gt;
// ** described below, you need to put it here!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
object {primaryHF}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What we&#039;re essentially doing above is:&lt;br /&gt;
&lt;br /&gt;
* Setting up scene parameters: lighting, the orthographic camera, etc.&lt;br /&gt;
&lt;br /&gt;
* Defining a set of textures to display at different elevations and different slopes; and&lt;br /&gt;
&lt;br /&gt;
* Defining a heightmap that uses our png image and applies our texture to this object&lt;br /&gt;
&lt;br /&gt;
8) Double click on your gen_pov_texture.pov file so that it opens up in Povray.&lt;br /&gt;
&lt;br /&gt;
9) Add a new render size (8192 x 8192):&lt;br /&gt;
&lt;br /&gt;
9.1)	Drop down menu &amp;quot;Render&amp;quot; &amp;gt; &amp;quot;Edit Settings/Render&amp;quot; &amp;gt; Click &amp;quot;Edit&amp;quot; button&lt;br /&gt;
&lt;br /&gt;
9.2)	Add text at bottom of file:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[8192x8192, No AA  Spring]&lt;br /&gt;
Width=8192&lt;br /&gt;
Height=8192&lt;br /&gt;
Antialias=Off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
9.3) Save file&lt;br /&gt;
&lt;br /&gt;
10) Restart Povray so that it re-reads the ini-file&lt;br /&gt;
&lt;br /&gt;
11) Select your new render size and click Render.  This creates a bitmap file: gen_pov_texture.bmp&lt;br /&gt;
&lt;br /&gt;
12) Convert to gen_pov_texture.bmp to a png file if you&#039;re using the new mapconv (it doesn&#039;t seem to like bitmaps).  I personally use [http://www.imagemagick.org/ imagemagick] to do this as it has a simple command line program &amp;quot;convert.exe&amp;quot; that will convert an image from one format to another and it works well with the very large bitmap image that comes out of the above steps.&lt;br /&gt;
&lt;br /&gt;
13) Do all the other map stuff: metal placement bitmap, feature placement bitmap, smd file&lt;br /&gt;
&lt;br /&gt;
14) Compile your map with mapconv&lt;br /&gt;
&lt;br /&gt;
15) Test it :)&lt;br /&gt;
&lt;br /&gt;
== Advanced stuff ==&lt;br /&gt;
Check out your help file that came with Povray.  There is a LOT that you can do!&lt;br /&gt;
&lt;br /&gt;
=== Complex Texture Map Combinations ===&lt;br /&gt;
As you can see from the pov code above, a &amp;quot;texture&amp;quot; declaration can be an image (called an &amp;quot;image_map&amp;quot;), but it can also be a definition of a blend between any number of earlier defined textures (called a &amp;quot;texture_map&amp;quot;), which is based on a function.  In the above example, it uses the &amp;quot;gradient&amp;quot; function for changes in elevation, and the &amp;quot;slope&amp;quot; function for changes in slope.  It is possible to define much more complex sets of textures than those defined above, such as mixing different combination of slope mapings with combinations of elevation mapings.&lt;br /&gt;
&lt;br /&gt;
Our blend function could actually be an image if you wanted finer control of a map&#039;s texture, by having sections of metal mixed with sections of wilderness, for example.  To do this, you would:&lt;br /&gt;
&lt;br /&gt;
1) Create a new png image the same size as your heightmap (although you could make it larger or smaller) and paint sections of the map that are to use your wilderness textures in white, and the sections that are to use your metal texture in black.  For effect you could do a slight blur on the image to create grey coloured transitions where the two sections meet.  For our example I created this:&lt;br /&gt;
&lt;br /&gt;
[http://img185.imageshack.us/my.php?image=texturedistributionpa8.png http://img185.imageshack.us/img185/2641/texturedistributionpa8.th.png]&lt;br /&gt;
&lt;br /&gt;
3) Change the &amp;quot;final_texture&amp;quot; texture name in your script to &amp;quot;final_nature_texture&amp;quot;&lt;br /&gt;
&lt;br /&gt;
4) Define a set of textures in a similar manner that define your metal textures (based on heights and slopes), with the final blended metal texture named &amp;quot;final_metal_texture&amp;quot;.  Don&#039;t forget to give them different names than the wilderness texture names are.&lt;br /&gt;
&lt;br /&gt;
5) Create a new &amp;quot;final_texture&amp;quot; that is:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#declare final_texture = &lt;br /&gt;
texture {&lt;br /&gt;
  image_pattern { png &amp;quot;texture_distribution.png&amp;quot; }&lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.00    final_metal_texture]&lt;br /&gt;
    [1.00    final_nature_texture]&lt;br /&gt;
  }&lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Here is a screen shot of our map using this:&lt;br /&gt;
&lt;br /&gt;
[http://img341.imageshack.us/my.php?image=screen000wd0.png http://img341.imageshack.us/img341/43/screen000wd0.th.png]&lt;br /&gt;
&lt;br /&gt;
=== Procedural Textures ===&lt;br /&gt;
It is also possible to use &amp;quot;procedural textures&amp;quot; instead of image_map textures.  These can be quite useful for areas on your map that have a high slope as they can create a better looking texture, including effects such as the layered rock textures - like &amp;quot;Painted Rock&amp;quot;.  Unfortunately these types of textures can result in larger map sizes, but if you just use them on the high slope areas of your map it should not be too bad.&lt;br /&gt;
&lt;br /&gt;
Some good examples used in terrains can be found at the [http://geomorph.sourceforge.net/povray/en/Geomorph%20-%20Predefined%20Povray%20Scripts.html Geomorph website].&lt;br /&gt;
&lt;br /&gt;
The povray install also includes a number of nice example procedural textures.&lt;br /&gt;
&lt;br /&gt;
=== Placing Metal Textures ===&lt;br /&gt;
There are quite a few posible ways to have Povray place metal textures for you.  One approach that I have used is:&lt;br /&gt;
&lt;br /&gt;
1) Define a function that will return the current metal locations in a pov kind of way:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  #declare getMetal = function {&lt;br /&gt;
    pigment {&lt;br /&gt;
      image_map {&lt;br /&gt;
        png &amp;quot;metallocations.png&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
      scale &amp;lt;1,-1,1&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
This function, when called for a given coordinate (0 to 1), returns a vector of the three colours for that point.&lt;br /&gt;
&lt;br /&gt;
2) We now define a texture that we&#039;ll use for our metal (this is made up of a number of subcomponent textures):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// A transparent texture&lt;br /&gt;
#declare Transparent_Texture=&lt;br /&gt;
texture {&lt;br /&gt;
	pigment {color rgbt&amp;lt;0,0,0,1&amp;gt;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// A simple brownish texture&lt;br /&gt;
#declare dirt_Texture=&lt;br /&gt;
texture {&lt;br /&gt;
  pigment { rgb &amp;lt;0.75,0.55,0.35&amp;gt;*0.7 }&lt;br /&gt;
  normal {&lt;br /&gt;
    granite 0.5  // for use with normal{} (0...1 or more)&lt;br /&gt;
    //scale MAP_WIDTH&lt;br /&gt;
  }&lt;br /&gt;
  finish {&lt;br /&gt;
    ambient 0.5&lt;br /&gt;
    diffuse .9&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// A shiny metalish texture&lt;br /&gt;
#declare metal_TextureBase = &lt;br /&gt;
texture { &lt;br /&gt;
  pigment {&lt;br /&gt;
    rgb&amp;lt;1,1,1&amp;gt;    &lt;br /&gt;
  }&lt;br /&gt;
  normal {&lt;br /&gt;
      granite 0.9  // for use with normal{} (0...1 or more)&lt;br /&gt;
    scale 80/5&lt;br /&gt;
  }&lt;br /&gt;
  finish {&lt;br /&gt;
    ambient 0.6&lt;br /&gt;
    brilliance 4&lt;br /&gt;
    diffuse 1&lt;br /&gt;
    specular 0.90&lt;br /&gt;
    roughness 1/80&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// A combination of the metal_TextureBase, the dirt_Texture and the&lt;br /&gt;
// Transparent_Texture&lt;br /&gt;
#declare metal_Texture=&lt;br /&gt;
texture {&lt;br /&gt;
  bozo              // very smooth, random noise function&lt;br /&gt;
  turbulence 0.3  // turbulence often useful&lt;br /&gt;
&lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.0  metal_TextureBase]  //T_Silver_3B&lt;br /&gt;
    [0.42  metal_TextureBase]&lt;br /&gt;
    [0.47  dirt_Texture]&lt;br /&gt;
    [0.50  dirt_Texture]&lt;br /&gt;
    [0.55  Transparent_Texture]&lt;br /&gt;
    [1.0  Transparent_Texture]&lt;br /&gt;
  }&lt;br /&gt;
  //scale &amp;lt;16, 16, 16&amp;gt; //even&lt;br /&gt;
  scale &amp;lt;7, 32, 16&amp;gt; //stretched &lt;br /&gt;
  rotate z*40  //set it at an angle so it looks betterer ;)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#declare blob_Texture=&lt;br /&gt;
texture {&lt;br /&gt;
  slope { z, 0.0, 0.5 }&lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.0  Transparent_Texture]&lt;br /&gt;
    [0.6  Transparent_Texture]&lt;br /&gt;
    [1.0  metal_Texture]&lt;br /&gt;
  }&lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
3) Finally, we define a &amp;quot;blob&amp;quot; object that adds a sphere object to the master blob object for each point in the metal map: &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed white; background-color: rgb(56, 70, 79);&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;  #declare metalBlob=&lt;br /&gt;
  blob {&lt;br /&gt;
  #declare geos=0;&lt;br /&gt;
  #declare ix=4.0;&lt;br /&gt;
  #declare num=0;&lt;br /&gt;
  #while (ix &amp;lt; MAP_WIDTH)&lt;br /&gt;
    #declare iy=0.0;&lt;br /&gt;
    #while (iy &amp;lt; MAP_WIDTH)&lt;br /&gt;
      #declare metal=getMetal(ix/MAP_WIDTH, iy/MAP_WIDTH, 0);&lt;br /&gt;
      #if (metal.red)&lt;br /&gt;
        #declare Pos = trace(primaryHF,&amp;lt;ix-MAP_WIDTH/2, -iy+MAP_WIDTH/2, MAP_EL*2&amp;gt;,-z);&lt;br /&gt;
        sphere {&lt;br /&gt;
            //Pos-&amp;lt;0,0,5&amp;gt;, 8*6, 8  &lt;br /&gt;
            Pos-&amp;lt;0,0,5&amp;gt;, 8*2, 8  &lt;br /&gt;
        }&lt;br /&gt;
      #end &lt;br /&gt;
      #declare iy=iy+8;&lt;br /&gt;
    #end&lt;br /&gt;
    #declare ix=ix+8;&lt;br /&gt;
  #end&lt;br /&gt;
  &lt;br /&gt;
    texture {&lt;br /&gt;
      blob_Texture&lt;br /&gt;
    }&lt;br /&gt;
    scale &amp;lt;1,1,0.5&amp;gt;  &lt;br /&gt;
  }  //metalBlob&lt;br /&gt;
&lt;br /&gt;
  object {metalBlob}&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
This all adds some time to the rendering time, but seems to work well enough (although it could be nicer).&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:MapWithPOVRay(Tinnut)&amp;diff=18772</id>
		<title>Tutorial:MapWithPOVRay(Tinnut)</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:MapWithPOVRay(Tinnut)&amp;diff=18772"/>
		<updated>2009-08-31T17:45:48Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Howto: Create a map&#039;s texture using Povray to generate the texture ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!! This is currently a work in progress and make take some time to complete. !!&lt;br /&gt;
&lt;br /&gt;
=== Intro ===&lt;br /&gt;
This guide will take you through creating a texture for a Spring map using the freeware Povray program.  Povray is an excellent [http://en.wikipedia.org/wiki/Ray_tracing raytracing] application that generates &amp;quot;scene&amp;quot; images using a scene definition language in a text file.  We can use it to create a map&#039;s texture by creating a heightfield object, putting our &amp;quot;camera&amp;quot; directly over the object, setting the camera to orthographic, and rendering a bitmap at our map&#039;s dimension.  The steps below will give you an easy enough to follow process to generate a nice map, but if you want to create different maps you&#039;ll need to learn Povray&#039;s scene definition language.  This language is easy enough to follow, but depending on your tastes you could be better off using a tool that specialises in maps and map textures, such as the excellent [http://www.bundysoft.com/L3DT/ L3DT].  &lt;br /&gt;
&lt;br /&gt;
The guide does not cover other aspects of map creation (heighmaps, features, metal, compiling, etc), but there are a few excellent guides within the Wiki that already cover those steps.&lt;br /&gt;
&lt;br /&gt;
Povray is available for both Windows and Linux.  I have only tested these steps under Windows, but they should work under Linux.&lt;br /&gt;
&lt;br /&gt;
Please note that a lot of the maths used in the scene definition file has only been tested on a 16x16 map (8192x8192 pixels).&lt;br /&gt;
&lt;br /&gt;
Warning:  The base textures I use in this example are all mostly rubbish that I created in a couple of minutes.  I would suggest that you do not use them in your own maps :)&lt;br /&gt;
&lt;br /&gt;
=== Initial Steps ===&lt;br /&gt;
1) Download and install Povray: [http://www.povray.org/ Povray Site]&lt;br /&gt;
&lt;br /&gt;
2) Create a working folder for your map, for this example, we&#039;ll make C:\PovMap&lt;br /&gt;
&lt;br /&gt;
3) Create a heightmap using whatever program (I like [http://www.gimp.org/ The GIMP], which is good, and it&#039;s free).  Here is the one we&#039;ll use for our map (I created this in a hurry and it was quite a mistake that it ended up so similar to Altered Divide):&lt;br /&gt;
&lt;br /&gt;
[http://img441.imageshack.us/my.php?image=povmapheightbp9.png http://img441.imageshack.us/img441/8862/povmapheightbp9.th.png]&lt;br /&gt;
&lt;br /&gt;
Your map will need to be named povmap_height.png, but if you want to use another name, just update the pov script below to use your heightmap&#039;s actual name.&lt;br /&gt;
&lt;br /&gt;
4) For our example, we&#039;ll be defining three different elevation levels for which there are different terrain textures, these will be (each at 512x512):&lt;br /&gt;
&lt;br /&gt;
4.1) Lowest elevation (low lying areas):&lt;br /&gt;
&lt;br /&gt;
[http://img176.imageshack.us/my.php?image=level1zd7.png http://img176.imageshack.us/img176/953/level1zd7.th.png]&lt;br /&gt;
&lt;br /&gt;
4.2) Middle elevation (main map surface):&lt;br /&gt;
&lt;br /&gt;
[http://img170.imageshack.us/my.php?image=level2pf6.png http://img170.imageshack.us/img170/6473/level2pf6.th.png]&lt;br /&gt;
&lt;br /&gt;
4.3) Highest elevation (mountains):&lt;br /&gt;
&lt;br /&gt;
[http://img176.imageshack.us/my.php?image=level3wv7.png http://img176.imageshack.us/img176/6159/level3wv7.th.png]&lt;br /&gt;
&lt;br /&gt;
5) Now also for our example, we&#039;ll be defining two different textures to be used by sloping areas, one for slopes in the lower elevation areas of the map, and another for slopes in the higher elevations:&lt;br /&gt;
&lt;br /&gt;
5.1) Lower elevations:&lt;br /&gt;
&lt;br /&gt;
[http://img411.imageshack.us/my.php?image=slope1on6.png http://img411.imageshack.us/img411/2153/slope1on6.th.png]&lt;br /&gt;
&lt;br /&gt;
5.2) Higher elevations:&lt;br /&gt;
&lt;br /&gt;
[http://img411.imageshack.us/my.php?image=slope2fk7.png http://img411.imageshack.us/img411/8908/slope2fk7.th.png]&lt;br /&gt;
&lt;br /&gt;
6) Create an empty text file in your C:\Povmap folder named gen_pov_texture.pov&lt;br /&gt;
&lt;br /&gt;
7) Copy the following povray scene code into the above file:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed red;background-color:white&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Setup some parameters that we will use within the script&lt;br /&gt;
#declare MAP_WIDTH=8192;&lt;br /&gt;
#declare MAP_HEIGHT=8192;&lt;br /&gt;
#declare MAP_EL=600; // elevation&lt;br /&gt;
&lt;br /&gt;
global_settings { &lt;br /&gt;
  // ambient light level&lt;br /&gt;
  ambient_light rgb&amp;lt;1,1,1&amp;gt; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Set a directional light&lt;br /&gt;
light_source {&lt;br /&gt;
  &amp;lt;100,-100,100&amp;gt; * 20, color rgb 1&lt;br /&gt;
  parallel&lt;br /&gt;
  point_at &amp;lt;1, 0, 0&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Set the background colour&lt;br /&gt;
background {rgb&amp;lt;1,1,1&amp;gt;}&lt;br /&gt;
&lt;br /&gt;
// Define our camera position, and set it to &amp;quot;orthographic&amp;quot; (important :)&lt;br /&gt;
camera {&lt;br /&gt;
  orthographic&lt;br /&gt;
  location &amp;lt;0,0,MAP_EL + 90&amp;gt;    // position &amp;amp; direction of view&lt;br /&gt;
  look_at  &amp;lt;0,0,0&amp;gt;&lt;br /&gt;
  right MAP_WIDTH*x            // horizontal size of view&lt;br /&gt;
  up MAP_HEIGHT*z               // vertical size of view&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// ** Define our primary textures **&lt;br /&gt;
 &lt;br /&gt;
// lowest texture (512 x 512)&lt;br /&gt;
// Found in low lying areas of the heightfield&lt;br /&gt;
#declare level1_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;level1.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// middle texture (512 x 512)&lt;br /&gt;
// Found in the middle areas of the heightfield&lt;br /&gt;
#declare level2_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;level2.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// highest texture (512 x 512)&lt;br /&gt;
// Found in the peaks / hills / mountains of the heightfield&lt;br /&gt;
#declare level3_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;level3.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Define a texture that blends from one level&#039;s texture to the next, &lt;br /&gt;
// depending on elevation:&lt;br /&gt;
#declare levels_elevation_texture=&lt;br /&gt;
texture {&lt;br /&gt;
  gradient z&lt;br /&gt;
  &lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.00 level1_texture]  // from 0.0 to 0.1 we have just level1.png&lt;br /&gt;
    [0.10 level1_texture]&lt;br /&gt;
                    // from 0.1 to 0.2 we blend from level1.png to level2.png&lt;br /&gt;
    [0.30 level2_texture]  // from 0.2 to 0.5 we have just level2.png&lt;br /&gt;
    [0.40 level2_texture]&lt;br /&gt;
                    // from 0.5 to 0.6 we blend from level2.png to level3.png&lt;br /&gt;
    [0.60  level3_texture]  // from 0.6 to 1.0 we have just level2.png&lt;br /&gt;
    [1.00  level3_texture]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ** Define textures used on areas of slope&lt;br /&gt;
&lt;br /&gt;
// lower slope texture (512 x 512)&lt;br /&gt;
#declare slope1_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;slope1.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// upper slope texture (512 x 512)&lt;br /&gt;
#declare slope2_texture =&lt;br /&gt;
texture {&lt;br /&gt;
  pigment {&lt;br /&gt;
    image_map {&lt;br /&gt;
      png &amp;quot;slope2.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  finish {ambient 1 diffuse 0}&lt;br /&gt;
  scale &amp;lt;512/MAP_WIDTH, 512/MAP_WIDTH, 512/MAP_WIDTH&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Define a texture that blends from one slope&#039;s texture to the next, &lt;br /&gt;
// depending on elevation:&lt;br /&gt;
#declare slopes_elevation_texture=&lt;br /&gt;
texture {&lt;br /&gt;
  gradient z&lt;br /&gt;
  &lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.00 slope1_texture]&lt;br /&gt;
    [0.30 slope1_texture]&lt;br /&gt;
    &lt;br /&gt;
    [0.65  slope2_texture]&lt;br /&gt;
    [1.00  slope2_texture]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// ** Now define the final texture blending between the height textures &lt;br /&gt;
// and the slope textures:&lt;br /&gt;
#declare final_texture = &lt;br /&gt;
texture {&lt;br /&gt;
  slope {&lt;br /&gt;
    &amp;lt;0,0,-1&amp;gt;, 0, 0.5&lt;br /&gt;
  } &lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.00    levels_elevation_texture]&lt;br /&gt;
    [0.06    levels_elevation_texture]&lt;br /&gt;
    [0.40    slopes_elevation_texture]&lt;br /&gt;
    [1.00    slopes_elevation_texture]&lt;br /&gt;
  }&lt;br /&gt;
}  &lt;br /&gt;
&lt;br /&gt;
// ***!! Now we declare our heightfield object that uses this texture&lt;br /&gt;
#declare primaryHF=&lt;br /&gt;
height_field {&lt;br /&gt;
  png &amp;quot;povmap_height.png&amp;quot;                                  &lt;br /&gt;
  smooth              // smooth the heightfield&lt;br /&gt;
  no_shadow           // you may want to remove this&lt;br /&gt;
  translate &amp;lt;-.5, -.5, -.5&amp;gt;&lt;br /&gt;
  rotate &amp;lt;90,0,0&amp;gt;     // rotate it so that the projection of the texture is correct&lt;br /&gt;
  scale &amp;lt;1,-1,1&amp;gt;      // invert the y axis&lt;br /&gt;
  translate &amp;lt;0.5, 0.5, 0.5&amp;gt;&lt;br /&gt;
  texture {&lt;br /&gt;
    final_texture&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // now scale to the maps height x width&lt;br /&gt;
  scale &amp;lt;MAP_WIDTH, MAP_HEIGHT, MAP_EL&amp;gt;    &lt;br /&gt;
  // and center it for the camera&lt;br /&gt;
  translate &amp;lt;-MAP_WIDTH/2, -MAP_HEIGHT/2, -MAP_EL/2&amp;gt;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ** If you&#039;re going to add the metal placement stuff&lt;br /&gt;
// ** described below, you need to put it here!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
object {primaryHF}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
What we&#039;re essentially doing above is:&lt;br /&gt;
&lt;br /&gt;
* Setting up scene parameters: lighting, the orthographic camera, etc.&lt;br /&gt;
&lt;br /&gt;
* Defining a set of textures to display at different elevations and different slopes; and&lt;br /&gt;
&lt;br /&gt;
* Defining a heightmap that uses our png image and applies our texture to this object&lt;br /&gt;
&lt;br /&gt;
8) Double click on your gen_pov_texture.pov file so that it opens up in Povray.&lt;br /&gt;
&lt;br /&gt;
9) Add a new render size (8192 x 8192):&lt;br /&gt;
&lt;br /&gt;
9.1)	Drop down menu &amp;quot;Render&amp;quot; &amp;gt; &amp;quot;Edit Settings/Render&amp;quot; &amp;gt; Click &amp;quot;Edit&amp;quot; button&lt;br /&gt;
&lt;br /&gt;
9.2)	Add text at bottom of file:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed red;background-color:white&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[8192x8192, No AA  Spring]&lt;br /&gt;
Width=8192&lt;br /&gt;
Height=8192&lt;br /&gt;
Antialias=Off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
9.3) Save file&lt;br /&gt;
&lt;br /&gt;
10) Restart Povray so that it re-reads the ini-file&lt;br /&gt;
&lt;br /&gt;
11) Select your new render size and click Render.  This creates a bitmap file: gen_pov_texture.bmp&lt;br /&gt;
&lt;br /&gt;
12) Convert to gen_pov_texture.bmp to a png file if you&#039;re using the new mapconv (it doesn&#039;t seem to like bitmaps).  I personally use [http://www.imagemagick.org/ imagemagick] to do this as it has a simple command line program &amp;quot;convert.exe&amp;quot; that will convert an image from one format to another and it works well with the very large bitmap image that comes out of the above steps.&lt;br /&gt;
&lt;br /&gt;
13) Do all the other map stuff: metal placement bitmap, feature placement bitmap, smd file&lt;br /&gt;
&lt;br /&gt;
14) Compile your map with mapconv&lt;br /&gt;
&lt;br /&gt;
15) Test it :)&lt;br /&gt;
&lt;br /&gt;
== Advanced stuff ==&lt;br /&gt;
Check out your help file that came with Povray.  There is a LOT that you can do!&lt;br /&gt;
&lt;br /&gt;
=== Complex Texture Map Combinations ===&lt;br /&gt;
As you can see from the pov code above, a &amp;quot;texture&amp;quot; declaration can be an image (called an &amp;quot;image_map&amp;quot;), but it can also be a definition of a blend between any number of earlier defined textures (called a &amp;quot;texture_map&amp;quot;), which is based on a function.  In the above example, it uses the &amp;quot;gradient&amp;quot; function for changes in elevation, and the &amp;quot;slope&amp;quot; function for changes in slope.  It is possible to define much more complex sets of textures than those defined above, such as mixing different combination of slope mapings with combinations of elevation mapings.&lt;br /&gt;
&lt;br /&gt;
Our blend function could actually be an image if you wanted finer control of a map&#039;s texture, by having sections of metal mixed with sections of wilderness, for example.  To do this, you would:&lt;br /&gt;
&lt;br /&gt;
1) Create a new png image the same size as your heightmap (although you could make it larger or smaller) and paint sections of the map that are to use your wilderness textures in white, and the sections that are to use your metal texture in black.  For effect you could do a slight blur on the image to create grey coloured transitions where the two sections meet.  For our example I created this:&lt;br /&gt;
&lt;br /&gt;
[http://img185.imageshack.us/my.php?image=texturedistributionpa8.png http://img185.imageshack.us/img185/2641/texturedistributionpa8.th.png]&lt;br /&gt;
&lt;br /&gt;
3) Change the &amp;quot;final_texture&amp;quot; texture name in your script to &amp;quot;final_nature_texture&amp;quot;&lt;br /&gt;
&lt;br /&gt;
4) Define a set of textures in a similar manner that define your metal textures (based on heights and slopes), with the final blended metal texture named &amp;quot;final_metal_texture&amp;quot;.  Don&#039;t forget to give them different names than the wilderness texture names are.&lt;br /&gt;
&lt;br /&gt;
5) Create a new &amp;quot;final_texture&amp;quot; that is:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed red;background-color:white&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#declare final_texture = &lt;br /&gt;
texture {&lt;br /&gt;
  image_pattern { png &amp;quot;texture_distribution.png&amp;quot; }&lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.00    final_metal_texture]&lt;br /&gt;
    [1.00    final_nature_texture]&lt;br /&gt;
  }&lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Here is a screen shot of our map using this:&lt;br /&gt;
&lt;br /&gt;
[http://img341.imageshack.us/my.php?image=screen000wd0.png http://img341.imageshack.us/img341/43/screen000wd0.th.png]&lt;br /&gt;
&lt;br /&gt;
=== Procedural Textures ===&lt;br /&gt;
It is also possible to use &amp;quot;procedural textures&amp;quot; instead of image_map textures.  These can be quite useful for areas on your map that have a high slope as they can create a better looking texture, including effects such as the layered rock textures - like &amp;quot;Painted Rock&amp;quot;.  Unfortunately these types of textures can result in larger map sizes, but if you just use them on the high slope areas of your map it should not be too bad.&lt;br /&gt;
&lt;br /&gt;
Some good examples used in terrains can be found at the [http://geomorph.sourceforge.net/povray/en/Geomorph%20-%20Predefined%20Povray%20Scripts.html Geomorph website].&lt;br /&gt;
&lt;br /&gt;
The povray install also includes a number of nice example procedural textures.&lt;br /&gt;
&lt;br /&gt;
=== Placing Metal Textures ===&lt;br /&gt;
There are quite a few posible ways to have Povray place metal textures for you.  One approach that I have used is:&lt;br /&gt;
&lt;br /&gt;
1) Define a function that will return the current metal locations in a pov kind of way:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed red;background-color:white&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  #declare getMetal = function {&lt;br /&gt;
    pigment {&lt;br /&gt;
      image_map {&lt;br /&gt;
        png &amp;quot;metallocations.png&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
      scale &amp;lt;1,-1,1&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
This function, when called for a given coordinate (0 to 1), returns a vector of the three colours for that point.&lt;br /&gt;
&lt;br /&gt;
2) We now define a texture that we&#039;ll use for our metal (this is made up of a number of subcomponent textures):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed red;background-color:white&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// A transparent texture&lt;br /&gt;
#declare Transparent_Texture=&lt;br /&gt;
texture {&lt;br /&gt;
	pigment {color rgbt&amp;lt;0,0,0,1&amp;gt;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// A simple brownish texture&lt;br /&gt;
#declare dirt_Texture=&lt;br /&gt;
texture {&lt;br /&gt;
  pigment { rgb &amp;lt;0.75,0.55,0.35&amp;gt;*0.7 }&lt;br /&gt;
  normal {&lt;br /&gt;
    granite 0.5  // for use with normal{} (0...1 or more)&lt;br /&gt;
    //scale MAP_WIDTH&lt;br /&gt;
  }&lt;br /&gt;
  finish {&lt;br /&gt;
    ambient 0.5&lt;br /&gt;
    diffuse .9&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// A shiny metalish texture&lt;br /&gt;
#declare metal_TextureBase = &lt;br /&gt;
texture { &lt;br /&gt;
  pigment {&lt;br /&gt;
    rgb&amp;lt;1,1,1&amp;gt;    &lt;br /&gt;
  }&lt;br /&gt;
  normal {&lt;br /&gt;
      granite 0.9  // for use with normal{} (0...1 or more)&lt;br /&gt;
    scale 80/5&lt;br /&gt;
  }&lt;br /&gt;
  finish {&lt;br /&gt;
    ambient 0.6&lt;br /&gt;
    brilliance 4&lt;br /&gt;
    diffuse 1&lt;br /&gt;
    specular 0.90&lt;br /&gt;
    roughness 1/80&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// A combination of the metal_TextureBase, the dirt_Texture and the&lt;br /&gt;
// Transparent_Texture&lt;br /&gt;
#declare metal_Texture=&lt;br /&gt;
texture {&lt;br /&gt;
  bozo              // very smooth, random noise function&lt;br /&gt;
  turbulence 0.3  // turbulence often useful&lt;br /&gt;
&lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.0  metal_TextureBase]  //T_Silver_3B&lt;br /&gt;
    [0.42  metal_TextureBase]&lt;br /&gt;
    [0.47  dirt_Texture]&lt;br /&gt;
    [0.50  dirt_Texture]&lt;br /&gt;
    [0.55  Transparent_Texture]&lt;br /&gt;
    [1.0  Transparent_Texture]&lt;br /&gt;
  }&lt;br /&gt;
  //scale &amp;lt;16, 16, 16&amp;gt; //even&lt;br /&gt;
  scale &amp;lt;7, 32, 16&amp;gt; //stretched &lt;br /&gt;
  rotate z*40  //set it at an angle so it looks betterer ;)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#declare blob_Texture=&lt;br /&gt;
texture {&lt;br /&gt;
  slope { z, 0.0, 0.5 }&lt;br /&gt;
  texture_map {&lt;br /&gt;
    [0.0  Transparent_Texture]&lt;br /&gt;
    [0.6  Transparent_Texture]&lt;br /&gt;
    [1.0  metal_Texture]&lt;br /&gt;
  }&lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
3) Finally, we define a &amp;quot;blob&amp;quot; object that adds a sphere object to the master blob object for each point in the metal map: &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-style:italic; font-size:90%; border:1px dashed red;background-color:white&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;pre&amp;gt;  #declare metalBlob=&lt;br /&gt;
  blob {&lt;br /&gt;
  #declare geos=0;&lt;br /&gt;
  #declare ix=4.0;&lt;br /&gt;
  #declare num=0;&lt;br /&gt;
  #while (ix &amp;lt; MAP_WIDTH)&lt;br /&gt;
    #declare iy=0.0;&lt;br /&gt;
    #while (iy &amp;lt; MAP_WIDTH)&lt;br /&gt;
      #declare metal=getMetal(ix/MAP_WIDTH, iy/MAP_WIDTH, 0);&lt;br /&gt;
      #if (metal.red)&lt;br /&gt;
        #declare Pos = trace(primaryHF,&amp;lt;ix-MAP_WIDTH/2, -iy+MAP_WIDTH/2, MAP_EL*2&amp;gt;,-z);&lt;br /&gt;
        sphere {&lt;br /&gt;
            //Pos-&amp;lt;0,0,5&amp;gt;, 8*6, 8  &lt;br /&gt;
            Pos-&amp;lt;0,0,5&amp;gt;, 8*2, 8  &lt;br /&gt;
        }&lt;br /&gt;
      #end &lt;br /&gt;
      #declare iy=iy+8;&lt;br /&gt;
    #end&lt;br /&gt;
    #declare ix=ix+8;&lt;br /&gt;
  #end&lt;br /&gt;
  &lt;br /&gt;
    texture {&lt;br /&gt;
      blob_Texture&lt;br /&gt;
    }&lt;br /&gt;
    scale &amp;lt;1,1,0.5&amp;gt;  &lt;br /&gt;
  }  //metalBlob&lt;br /&gt;
&lt;br /&gt;
  object {metalBlob}&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
This all adds some time to the rendering time, but seems to work well enough (although it could be nicer).&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Maps:Map_Designer&amp;diff=14194</id>
		<title>Maps:Map Designer</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Maps:Map_Designer&amp;diff=14194"/>
		<updated>2009-08-31T17:45:36Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== MapDesigner, by Hugh Perkins ==&lt;br /&gt;
&lt;br /&gt;
[http://manageddreams.com/csai/MapDesigner.zip Download]&lt;br /&gt;
&lt;br /&gt;
*Supports multipass texture splatting.  SM3 loader.&lt;br /&gt;
*Heightmap editor.  Left click to raise land, right click to lower&lt;br /&gt;
*Paint splatted texture.  Left click to paint texture, right click to erase&lt;br /&gt;
*Export heightmap, slopemap and blend maps&lt;br /&gt;
*Exported slopemap color-coded by movement area, eg infantry, vehicle and extreme (configurable)&lt;br /&gt;
&lt;br /&gt;
== User interface ==&lt;br /&gt;
&lt;br /&gt;
[[Media:http://manageddreams.com/csai/mapdesigner3small.JPG]]&lt;br /&gt;
&lt;br /&gt;
== Concepts ==&lt;br /&gt;
&lt;br /&gt;
MapDesigner is optimized for creating SM3 maps, which use texture splatting to provide high detail maps.&lt;br /&gt;
&lt;br /&gt;
For each texture, we need:&lt;br /&gt;
*the texture, which will be tiled according to the tilesize&lt;br /&gt;
*a blend map, which controls where the texture will be visible&lt;br /&gt;
&lt;br /&gt;
The blend map is essentially an alpha map.  The areas which are white will be splatted with our texture, and the other areas will be transparent.&lt;br /&gt;
&lt;br /&gt;
The textures are rendered in layers, one by one.  The later layers cover the earlier layers, according to each one&#039;s blend map texture.  Here&#039;s some pictures that illustrate how this works.  We are rendering each layer with a vertical offset so you can see each layer on its own.&lt;br /&gt;
&lt;br /&gt;
[[Media:http://manageddreams.com/csai/multitextureview1.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Media:http://manageddreams.com/csai/multitextureview2.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Media:http://manageddreams.com/csai/multitextureview3.JPG]]&lt;br /&gt;
&lt;br /&gt;
In reality, these layers are all rendered together, with no vertical offset, so they look like they are all part of the same single terrain.&lt;br /&gt;
&lt;br /&gt;
You can use any DevIL-compatible texture as your splat texture.  Select a texture stage and click &amp;quot;Load texture...&amp;quot; to load the texture into that texture stage.  You can change the tilesize to control how it is splatted in the visible areas.&lt;br /&gt;
&lt;br /&gt;
The blend texture works like an alpha texture, but the data is actually stored in the RGB channels, as a grey-level.  MapDesigner lets you paint or remove to and from the blend texture, which has the effect of painting splat texture on the map, or removing it.&lt;br /&gt;
&lt;br /&gt;
== Texture stages ==&lt;br /&gt;
&lt;br /&gt;
Multiple texture stages can be configured.  We use one texture stage for each splatted texture and set its operation to &amp;quot;Blend&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The first texture stage - texstage1 - should be set to &amp;quot;Replace&amp;quot;, and has no blend texture.  That&#039;s because it&#039;s the base texture for the map, on top of which the other textures are painted.&lt;br /&gt;
&lt;br /&gt;
Advanced:&lt;br /&gt;
*It&#039;s possible to set other operations on the texture stages.&lt;br /&gt;
&lt;br /&gt;
== Paint splatted texture ==&lt;br /&gt;
&lt;br /&gt;
*select &amp;quot;Paint texture&amp;quot;&lt;br /&gt;
*select a texture stage&lt;br /&gt;
*set texture stage operation to &amp;quot;Blend&amp;quot; and load a texture if necessary&lt;br /&gt;
*Left click map to paint texture, right click to erase&lt;br /&gt;
*You can click &amp;quot;Save blend texture&amp;quot; to export the blend texture map&lt;br /&gt;
&lt;br /&gt;
Note that texture stages are applied in order, first 1 then 2 then 3 etc.  The later layers cover the earlier ones.&lt;br /&gt;
&lt;br /&gt;
If you click the map and nothing happens, your changes may be being masked by later layers.  You can edit the later layers to uncover your changes, or click &amp;quot;move down&amp;quot; to move your edited layer later in the queue.&lt;br /&gt;
&lt;br /&gt;
[[Media:http://manageddreams.com/csai/mapdesignblendediting.JPG]]&lt;br /&gt;
&lt;br /&gt;
== Water ==&lt;br /&gt;
&lt;br /&gt;
Areas below zero height will be underwater:&lt;br /&gt;
&lt;br /&gt;
[[Media:http://manageddreams.com/csai/mapdesignwater.JPG]]&lt;br /&gt;
&lt;br /&gt;
== Exported Slopemap ==&lt;br /&gt;
&lt;br /&gt;
You can use File | Export slopemap... to export a slopemap for your map.&lt;br /&gt;
&lt;br /&gt;
Black means zero slope, green is vehicles, blue is infantry, red is extreme:&lt;br /&gt;
&lt;br /&gt;
[[Media:http://manageddreams.com/csai/slopemap2.JPG]]&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
Configuration is stored in config.xml ,which can be opened in notepad&lt;br /&gt;
*You can change height and width in the display section to change the window size on next startup&lt;br /&gt;
*You can configure key mappings, and mouse move configuration&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Map_Making_Guild&amp;diff=13132</id>
		<title>Map Making Guild</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Map_Making_Guild&amp;diff=13132"/>
		<updated>2009-08-31T17:44:34Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== The Map Making Guild! ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After a Typo on aGorm&#039;s &amp;quot;Map Making Guide&amp;quot; (guess the typo), he decided that all mappers that are unfortunate enough not to have a clan should surly have one. And maybe he wanted his own...&lt;br /&gt;
&lt;br /&gt;
So it was made, and there was much rejoicing! In aGorms room anyway!&lt;br /&gt;
&lt;br /&gt;
Currently I havn&#039;t got of my backside and got anyone to join, but feel free to. The only requirment is that you must have made 1 (one) half decent map! (And if you add yourself to teh list I&#039;ll be sure to check you out and take you off if your not a mapper... beside&#039;s I&#039;ll knock up a homepage soon and then you&#039;ll have to go through me! Ha ha ha ha... coff)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Current members: ==&lt;br /&gt;
===aGorm===&lt;br /&gt;
*Acid Bridge&lt;br /&gt;
*Acid Quadratic&lt;br /&gt;
*Desert Dunes&lt;br /&gt;
*Core Pyramid&lt;br /&gt;
*Volcano ISland&lt;br /&gt;
*Tree Screenshot (this surely counts?)&lt;br /&gt;
&lt;br /&gt;
===Weaver===&lt;br /&gt;
*Death Valley &lt;br /&gt;
*PCB &lt;br /&gt;
*Ashaf Plateau&lt;br /&gt;
*Little Brook&lt;br /&gt;
*Hell&#039;s Teeth&lt;br /&gt;
*Green Fields&lt;br /&gt;
&lt;br /&gt;
===WiREd===&lt;br /&gt;
*2 VaLLeys&lt;br /&gt;
*Rush Hour (OTA Port)&lt;br /&gt;
*more new maps in progress&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Map_Making_Guild&amp;diff=13131</id>
		<title>Map Making Guild</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Map_Making_Guild&amp;diff=13131"/>
		<updated>2009-08-31T17:43:52Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The Map Making Guild! ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After a Typo on aGorm&#039;s &amp;quot;Map Making Guide&amp;quot; (guess the typo), he decided that all mappers that are unfortunate enough not to have a clan should surly have one. And maybe he wanted his own...&lt;br /&gt;
&lt;br /&gt;
So it was made, and there was much rejoicing! In aGorms room anyway!&lt;br /&gt;
&lt;br /&gt;
Currently I havn&#039;t got of my backside and got anyone to join, but feel free to. The only requirment is that you must have made 1 (one) half decent map! (And if you add yourself to teh list I&#039;ll be sure to check you out and take you off if your not a mapper... beside&#039;s I&#039;ll knock up a homepage soon and then you&#039;ll have to go through me! Ha ha ha ha... coff)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Current members: ==&lt;br /&gt;
===aGorm===&lt;br /&gt;
*Acid Bridge&lt;br /&gt;
*Acid Quadratic&lt;br /&gt;
*Desert Dunes&lt;br /&gt;
*Core Pyramid&lt;br /&gt;
*Volcano ISland&lt;br /&gt;
*Tree Screenshot (this surely counts?)&lt;br /&gt;
&lt;br /&gt;
===Weaver===&lt;br /&gt;
*Death Valley &lt;br /&gt;
*PCB &lt;br /&gt;
*Ashaf Plateau&lt;br /&gt;
*Little Brook&lt;br /&gt;
*Hell&#039;s Teeth&lt;br /&gt;
*Green Fields&lt;br /&gt;
&lt;br /&gt;
===WiREd===&lt;br /&gt;
*2 VaLLeys&lt;br /&gt;
*Rush Hour (OTA Port)&lt;br /&gt;
*more new maps in progress&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Maps:Noob_Mistakes&amp;diff=14208</id>
		<title>Maps:Noob Mistakes</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Maps:Noob_Mistakes&amp;diff=14208"/>
		<updated>2009-08-31T17:43:40Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Everybody Keeps posting in the forum, and it&#039;s hard to figure out what exactly the n00b is doing wrong.&lt;br /&gt;
&lt;br /&gt;
=Map n00b FAQ=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If The Character Combination :/ is included in the compilation batch script it doesn&#039;t work.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=red&amp;gt;D:\TA_Editors\MapConv\MapConv.exe -c 0.5 -x 400 -n 100 -o D:\TA_Editors\MapConv\maps\metal-islands.smf -t D:\TA_Editors\MapConv\maps\metal-islands_texturemap.bmp -m D:\TA_Editors\MapConv\maps\metal-islands_metalmap.bmp -a D:\TA_Editors\MapConv\maps\metal-islands_heightmap.bmp -f D:\TA_Editors\MapConv\maps\metal-islands_featuremap.bmp -i&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IS BAD&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=green&amp;gt;MapConv.exe -c 0.5 -x 400 -n 100 -o metal-islands.smf -t metal-islands_texturemap.bmp -m metal-islands_metalmap.bmp -a metal-islands_heightmap.bmp -f metal-islands_featuremap.bmp -i&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IS GOOD&lt;br /&gt;
&lt;br /&gt;
===Do Not Rename Your SMT===&lt;br /&gt;
&lt;br /&gt;
MapConv takes the first part of the &amp;quot;-o mapname.smf&amp;quot; to determine the name of the smt file (namely mapname.smt), a reference to this &amp;quot;mapname.smt&amp;quot; is stored in the smf file as where to look for tile images.  This means you can rename you smf and smd files, but are unable to rename the tile file.&lt;br /&gt;
&lt;br /&gt;
===Put water low enough===&lt;br /&gt;
If you want to do a land only dry map, make sure your water isn&#039;t just below the ground, or else even the smallest crater will turn into a pond. Instead, use the &#039;&#039;&#039;-x&#039;&#039;&#039; and &#039;&#039;&#039;-n&#039;&#039;&#039; to put even your lowest ground far above water.&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Water_Height:_Mapconv_vs._Heightmap&amp;diff=19479</id>
		<title>Water Height: Mapconv vs. Heightmap</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Water_Height:_Mapconv_vs._Heightmap&amp;diff=19479"/>
		<updated>2009-08-31T17:43:11Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
===The Problem===&lt;br /&gt;
&lt;br /&gt;
It has come up as a source of confusion as to what shade of grey in your heightmap is water level. The simple answer is that there isn&#039;t a simple answer, but don&#039;t worry it really isn&#039;t all that hard. It is determined by your height input parameters to mapconv (Does none of this make sense? You probably want to stop here, go back and read some of the [http://taspring.clan-sy.com/wiki/Map_development tutorials]. ) &#039;&#039;Note this assumes you have both 0% and 100% grey (black and white, respectively) on your heightmap, which should be the case (this maximises the range of greys you can play with for your heightmap)&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
the &#039;&#039;&#039;-x&#039;&#039;&#039; value in mapconv is the altitude (in elmos?) of a 100% white surface &lt;br /&gt;
&lt;br /&gt;
the &#039;&#039;&#039;-n&#039;&#039;&#039; value is the altitude of a 0% white surface &lt;br /&gt;
&lt;br /&gt;
To find the altitude of an intermediate shade of grey, do this, &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;n+(y*(x-n)) = a&#039;&#039;&#039;   or, simplified,   &#039;&#039;&#039;y*x + (1-y)*n = a&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Where &#039;&#039;&#039;y&#039;&#039;&#039; is your value (in percent or in RGB value / 255) &lt;br /&gt;
&#039;&#039;&#039;x&#039;&#039;&#039; and &#039;&#039;&#039;n&#039;&#039;&#039; are the parameters from mapconv &lt;br /&gt;
and &#039;&#039;&#039;a&#039;&#039;&#039; is the altitude of that value&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The water level is always assumed to be 0 in mapconv&#039;&#039;&#039;, so anything with a negative &#039;&#039;&#039;a&#039;&#039;&#039; value will be underwater.&lt;br /&gt;
&lt;br /&gt;
===An Example===&lt;br /&gt;
&lt;br /&gt;
So to make 50% grey underwater, you could for example set your water line at 55% grey. Then, some values for mapconv that would work are: &lt;br /&gt;
&lt;br /&gt;
*this would produce very low mountains &lt;br /&gt;
: -x 82 -n -100&lt;br /&gt;
*this would probably be better&lt;br /&gt;
: -x 205 -n -250&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:CreateMaps(Fnordia_et_al)&amp;diff=18607</id>
		<title>Tutorial:CreateMaps(Fnordia et al)</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Tutorial:CreateMaps(Fnordia_et_al)&amp;diff=18607"/>
		<updated>2009-08-31T17:41:47Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Original by aGorm, with help from LathanStanley&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==The Idea==&lt;br /&gt;
First of all you need an idea. There is no point (OK, there is some point for test purposes) in making a map just like another one that already exists. You need to think of certain things before you make your map.&lt;br /&gt;
# Is this map idea different, not just a copy of someone else&#039;s?&lt;br /&gt;
# Does my map idea give each player a fair share of the cover and high ground?&lt;br /&gt;
# Is my map idea possible to make?&lt;br /&gt;
# Is it possible with the amount of time I&#039;m willing to spend?&lt;br /&gt;
&lt;br /&gt;
If you answered yes to the above, then you are 25% of the way towards making your map!&lt;br /&gt;
&lt;br /&gt;
You should probably doodle it on a piece of paper to act as a guide later.&lt;br /&gt;
&lt;br /&gt;
==The Tools==&lt;br /&gt;
With your idea hopefully sketched out, it&#039;s time to get the tools to make the map! (You can skip this if you already have them.)&lt;br /&gt;
&lt;br /&gt;
For all your map compiling needs you should first download the [http://fileuniverse.com/?p=showitem&amp;amp;ID=1234 newest MapConv program].&lt;br /&gt;
&lt;br /&gt;
You will also need some image editing software. Favorites are Photoshop, the [http://www.gimp.org/ GIMP], And Paintshop Pro.&lt;br /&gt;
The GIMP, however, is the only one that&#039;s free!&lt;br /&gt;
(I&#039;m going to have to assume you know how to use the program you choose. If you can&#039;t there are loads of tutorials on the net.)&lt;br /&gt;
&lt;br /&gt;
You may also want to check out [http://www.planetside.co.uk/terragen/ Terragen] for generating terrain. But as you have to pay to render anything of a good size, I won&#039;t mention it other than here.&lt;br /&gt;
&lt;br /&gt;
Another tool you might find useful is the freeware tool [http://www.delphigl.de/projects/terrtexgen/eng_index.html TerrTexGen].  It&#039;s useful for previewing your heightmap before compiling, but unless your texturemap is 4096 on both sides, you might find that the texturemaps that it creates are too small.&lt;br /&gt;
&lt;br /&gt;
Finally, there is tool called [http://www.bundysoft.com/L3DT/ L3DT] which you might also find useful.  It seems to be a program that is specificly designed for creating large height/texture maps.  The free version is capable of rendering a heightmap as big as 4096x4096, and can generate a texturemap that is proportional to the heightmap.  Of the mentioned packages, this seems the most useful and complete.&lt;br /&gt;
&lt;br /&gt;
==Preparing your map==&lt;br /&gt;
This is the fun part! And also, often, the longest part.&lt;br /&gt;
&lt;br /&gt;
For a map you will need several different things:&lt;br /&gt;
# a texture map&lt;br /&gt;
# a height map&lt;br /&gt;
# a metal map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
They all have certain needs! Read this bit carfully!&lt;br /&gt;
&lt;br /&gt;
===Texture Map===&lt;br /&gt;
All maps are based on a texture image. This image&#039;s width and height must be an exact multiple of 1024 pixels. So, for instance, you can have a &amp;quot;4096 by 8192&amp;quot; image, but not a &amp;quot;4096 by 4608&amp;quot; image, as 4608 does not divide by 1024. It, like  all three maps, must be saved as a 24 bit BMP. A 1024x1024 Texture will produce a map shown as &#039;2x2&#039; in the launcher.&lt;br /&gt;
&lt;br /&gt;
It may look like whatever you want! Find a texture (preferably, one that you can tile seamlessly) and fill your texture map with it. You could, for instance, fill the whole image with a sand texture. This would make your whole world look like sand. You could then decide to add a few patches of grass to it by finding a suitable grass texture and adding it on patches. So you&#039;d have a map that was mostly sand with a few patches of green.&lt;br /&gt;
&lt;br /&gt;
Because of the way the map compiler works, it will &#039;&#039;&#039;greatly&#039;&#039;&#039; reduce your map filesize if you use 32x32 tiles on your texture map. So, whenever you have to fill a large area with a repeating pattern, make sure the small square you&#039;re repeating is 32x32 (or a multiple of it).&lt;br /&gt;
&lt;br /&gt;
===Height Map===&lt;br /&gt;
Next is the height map. This must be exactly one eighth (1/8) of the size of the texture map &#039;&#039;&#039;+ 1 pixel!&#039;&#039;&#039; For instance, if the dimensions of your texture map are &amp;quot;4096 by 8192&amp;quot;, divide 4096 and 8192 each by 8 and add one to the result of each. The result for this example would be &amp;quot;513 by 1025&amp;quot;. The height map is a black and white BMP. Only use black and white, no colour! (well its better to work it as a greyscale image, and when saving to process, convert to rgb and save as bmp, that way you get a 24 bit bmp)&lt;br /&gt;
&lt;br /&gt;
White areas are the tops of mountains; black areas are the sea floor or the bottom of valleys. The shades of grey between are the different heights between! When you draw your heightmap, make sure the white blends into the black with greys. I suggest you use the blur tool. If you have a white splodge in a patch of black you will have a very tall pillar that won&#039;t look natural at all!&lt;br /&gt;
&lt;br /&gt;
===Metal Map===&lt;br /&gt;
Finally, you need a metal map. This is the same size as the height map, one eighth (1/8) of the size of the texture map &#039;&#039;&#039;+ 1 pixel.&#039;&#039;&#039; On this one you paint down red (in verying degrees) to represent metal. So a red spot that is RGB(50,0,0) will provide about a 5th of the metal patch of red RGB(255,0,0) will give.&lt;br /&gt;
&lt;br /&gt;
On this map you can also place green pixels. Each green pixel will create 1 geothermal vent. If you put down a green splodge you will get a cluster of geo vents! Only place 1 pixel.&lt;br /&gt;
&lt;br /&gt;
Ensure you have all three saved as 24 bit BMPs and you&#039;re ready to convert it all to a map!&lt;br /&gt;
&lt;br /&gt;
== MapConv.exe ==&lt;br /&gt;
&lt;br /&gt;
Instructions pulled from [http://fileuniverse.com/?p=showitem&amp;amp;ID=1234 the newest MapConv program]. If all goes well, the &amp;lt;code&amp;gt;MapConv.exe&amp;lt;/code&amp;gt; should create four new files: &amp;lt;code&amp;gt;mini.bmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mini.dds&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yourmapname.smf&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;yourmapname.smt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 USAGE:  &lt;br /&gt;
   &lt;br /&gt;
 mapconv [-l] [-i] [-c &amp;lt;compression&amp;gt;] -x &amp;lt;max height&amp;gt; -n &amp;lt;min height&amp;gt; [-o  &lt;br /&gt;
 &amp;lt;Output file&amp;gt;] [-e &amp;lt;tile file&amp;gt;] [-y &amp;lt;Typemap file&amp;gt;] -m &amp;lt;Metalmap file&amp;gt; -a  &lt;br /&gt;
 &amp;lt;Heightmap file&amp;gt; -t &amp;lt;Texture file&amp;gt; [--] [-v] [-h] &lt;br /&gt;
   &lt;br /&gt;
   &lt;br /&gt;
 Where:  &lt;br /&gt;
   &lt;br /&gt;
 -l, --lowpass &lt;br /&gt;
 Lowpass filters the heightmap &lt;br /&gt;
   &lt;br /&gt;
 -i, --invert &lt;br /&gt;
 Inverts the height map vertically (not the height values but the height map  &lt;br /&gt;
 (uhm someone rewrite this)) &lt;br /&gt;
   &lt;br /&gt;
 -c &amp;lt;compression&amp;gt;, --compress &amp;lt;compression&amp;gt; &lt;br /&gt;
 (value required) How much we should try to compress the texture file.  &lt;br /&gt;
 Default value 0.8 . (lower=higher quality, larger file) &lt;br /&gt;
   &lt;br /&gt;
 -x &amp;lt;max height&amp;gt;, --maxheight &amp;lt;max height&amp;gt; &lt;br /&gt;
 (required) (value required) What altitude in spring the max(0xffff) level  &lt;br /&gt;
 of the height map should represent &lt;br /&gt;
   &lt;br /&gt;
 -n &amp;lt;min height&amp;gt;, --minheight &amp;lt;min height&amp;gt; &lt;br /&gt;
 (required) (value required) What altitude in spring the min(0) level of  &lt;br /&gt;
 the height map should represent &lt;br /&gt;
   &lt;br /&gt;
 -o &amp;lt;Output file&amp;gt;, --outfile &amp;lt;Output file&amp;gt; &lt;br /&gt;
 (value required) The name of the created map &lt;br /&gt;
   &lt;br /&gt;
 -e &amp;lt;tile file&amp;gt;, --externaltilefile &amp;lt;tile file&amp;gt; &lt;br /&gt;
 (value required) External tile file that will be used for finding tiles,  &lt;br /&gt;
 tiles not found in this will be added in a new tile file &lt;br /&gt;
   &lt;br /&gt;
 -y &amp;lt;Typemap file&amp;gt;, --typemap &amp;lt;Typemap file&amp;gt; &lt;br /&gt;
 (value required) Type map to use, uses the red channel to decide type,  &lt;br /&gt;
 types are defined in the .smd, if this argument is skipped the map will be  &lt;br /&gt;
 all type 0 &lt;br /&gt;
   &lt;br /&gt;
 -m &amp;lt;Metalmap file&amp;gt;, --metalmap &amp;lt;Metalmap file&amp;gt; &lt;br /&gt;
 (required) (value required) Metal map to use, red channel is amount of  &lt;br /&gt;
 metal, green=255 is where to place geos (one pixel=one geo). Is resized to  &lt;br /&gt;
 fit the mapsize &lt;br /&gt;
   &lt;br /&gt;
 -a &amp;lt;Heightmap file&amp;gt;, --heightmap &amp;lt;Heightmap file&amp;gt; &lt;br /&gt;
 (required) (value required) Input heightmap to use for the map, this  &lt;br /&gt;
 should be in 16 bit raw format (.raw extension) or an image file. Must be  &lt;br /&gt;
 xsize*128+1 x ysize*128+1 in size. &lt;br /&gt;
   &lt;br /&gt;
 -t &amp;lt;Texture file&amp;gt;, --intex &amp;lt;Texture file&amp;gt; &lt;br /&gt;
 (required) (value required) Input bitmap to use for the map. Must be  &lt;br /&gt;
 xsize*1024 x ysize*1024 in size. (xsize,ysize integers determined from this  &lt;br /&gt;
 file) &lt;br /&gt;
   &lt;br /&gt;
 --, --ignore_rest &lt;br /&gt;
 Ignores the rest of the labeled arguments following this flag. &lt;br /&gt;
   &lt;br /&gt;
 -v, --version &lt;br /&gt;
 Displays version information and exits. &lt;br /&gt;
   &lt;br /&gt;
 -h, --help &lt;br /&gt;
 Displays usage information and exits. &lt;br /&gt;
   &lt;br /&gt;
   &lt;br /&gt;
Converts a series of .bmp/.raw files to a Spring map. This just creates the .smf file, you will also have to create a .smd file using a text editor or Maelstrom&#039;s SMD creator.&lt;br /&gt;
&lt;br /&gt;
==Mothers MapConv==&lt;br /&gt;
The usage is the same as above, with the following exceptions:&lt;br /&gt;
All features (including GeoVent/Tree/Grass) are now on their own FeatureMap.  This is a 24bit bmp specified with the -f &amp;lt;featuremapname.bmp&amp;gt; flag.&lt;br /&gt;
&#039;&#039;It should be 1/8th the resolution of your map.&#039;&#039; (i.e. 1 pixel smaller in each direction then your heightmap)&lt;br /&gt;
&lt;br /&gt;
Tree&#039;s and GeoVents are placed on the green layer.&lt;br /&gt;
*255 Places a GeoVent&lt;br /&gt;
*200-215 Places tree types 1-16&lt;br /&gt;
&lt;br /&gt;
MapConv will try to place these features in the exact spot you place them, it will then go into crackhead mode if it cannot.&lt;br /&gt;
&lt;br /&gt;
Grass is the blue layer.  The blue value  maps to a &#039;pseudo-density&#039; of the grass.  The &#039;grass&#039; map in the engine is very very low resolution,  so be aware that you will not get nice linear results.  255=full grass, 0=no grass.&lt;br /&gt;
&lt;br /&gt;
The red layer places &#039;Arbitrary Features,&#039; aka wreckages.  One pixel of red equals one feature.  Red &#039;255&#039; gives you a feature of the first arbitrary type, 254 the second, 253 the third, and so on.&lt;br /&gt;
&lt;br /&gt;
===But what are these &#039;Arbitrary Features,&#039; Im so confused!===&lt;br /&gt;
They are &#039;features&#039; found in the /features/All Worlds or /features/corpses filesystems.  Which feature is &#039;type 1&#039; is defined on a map-by-map basis via a new file called &#039;fs.txt&#039;.  This file should contain &amp;lt;cr&amp;gt; delimited feature names. The first line is the feature placed when a red=255 dot is found, etc.&lt;br /&gt;
&lt;br /&gt;
=== Ok, Now what do I do? ===&lt;br /&gt;
If you are using any custom features, and/or you want to mod-proof your map, you should include them in the sd7 that you package the map in.  The tree structure should look something like:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;mapname.sd7&amp;gt;&lt;br /&gt;
 -maps/&lt;br /&gt;
 -mapname.smf&lt;br /&gt;
 -mapname.smt&lt;br /&gt;
 -mapname.smd&lt;br /&gt;
 -Objects3d/&lt;br /&gt;
 -&amp;lt;featurename[s]&amp;gt;.3do(specified in the tdf)&lt;br /&gt;
 -features/&lt;br /&gt;
 -All Worlds/&lt;br /&gt;
 (and/or)&lt;br /&gt;
 -Corpses/&lt;br /&gt;
 -&amp;lt;featurename[s]&amp;gt;.tdf&lt;br /&gt;
 -textures/&lt;br /&gt;
 -tatex/&lt;br /&gt;
 -&amp;lt;texname[s]&amp;gt;00.bmp or .tga&lt;br /&gt;
&lt;br /&gt;
Without getting into modding/unit making I will say that the &amp;lt;code&amp;gt;.tdf&amp;lt;/code&amp;gt; tells you the name of the &amp;lt;code&amp;gt;.3do&amp;lt;/code&amp;gt; (&amp;quot;&amp;lt;code&amp;gt;Object=&amp;lt;/code&amp;gt;&amp;quot;), and the name of the &#039;feature&#039; is in the top brackets.  The &amp;lt;code&amp;gt;.3do&amp;lt;/code&amp;gt; specifies the texture names.  The engine looks for those texture names + 00 in either bmp or tga format in tatex. &lt;br /&gt;
&lt;br /&gt;
Examples of a built-in XTA wreckage name would be &amp;lt;code&amp;gt;armckfus_dead&amp;lt;/code&amp;gt; which would be looking for a tdf (likely &amp;lt;code&amp;gt;armckfus_dead.tdf&amp;lt;/code&amp;gt;) that has a &amp;lt;code&amp;gt;[armckfus_dead]&amp;lt;/code&amp;gt; section which then specified something like:&lt;br /&gt;
&amp;lt;code&amp;gt;Object=armckfus_dead&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;armckfus_dead.3do&amp;lt;/code&amp;gt; would then specify some texture like &amp;lt;code&amp;gt;wreck01b&amp;lt;/code&amp;gt; which would go looking for either a &amp;lt;code&amp;gt;wreck01b00.bmp&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;wreck01b00.tga&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
[http://fileuniverse.com/?p=showitem&amp;amp;ID=1421 Start with this version of MapConv]&lt;br /&gt;
or&lt;br /&gt;
[http://www.fileuniverse.com/?p=showitem&amp;amp;ID=1507 This one]&lt;br /&gt;
[I will clean this up and add more later --Mother]&lt;br /&gt;
&lt;br /&gt;
==Making your map work==&lt;br /&gt;
This is the final push. Once Sharp map has finshed it will spit out a .sm2 file. This needs to be copied to the MAPS folder in Spring. But you still need one more thing: an .smd file. Basically, this file tells the game things like the maximum metal, the light colours, the clouds, etc. (All the bits you were thinking that you hadn&#039;t done yet!)&lt;br /&gt;
&lt;br /&gt;
I would suggest you copy the .smd of another map and fiddle with the settings until you get what you want. smd&#039;s can be opened in notepad or similar. Look at all the .smd&#039;s so you can get a jist of what each option does. Make sure both the .sm2 and .smd have the same file name then start up Spring (not the client!) in [http://taspring.clan-sy.com/wiki/FAQ#People_talk_about_.27Single_Player.27._How_do_I_start_a_single_player_game.3F single-player mode] and run the commanders script. Choose your map and away you go!&lt;br /&gt;
&lt;br /&gt;
==SMD Rundown==&lt;br /&gt;
What follows is all that we (aGorm and LathanStanley) have figured out in the SMD&#039;s. Its by no means the be all and end all, but it&#039;s the next best thing.&lt;br /&gt;
&lt;br /&gt;
* Goto [[Maps:SMD]] for a more detailed listing&lt;br /&gt;
 &lt;br /&gt;
===General Map Information===&lt;br /&gt;
* Description is just a short description of your map. Keep it simple.&lt;br /&gt;
* TidalStrength determines how much energy tidal generators will produce. A normal figure is around 20.&lt;br /&gt;
* Gravity, as you would expect, affects ballisitcs and how far units fly after an explosion.&lt;br /&gt;
* MaxMetal is the maximum amount of metal you will gain from one game square in 1 second from an area of metal that had a red value of 255 in your metal map. If making an old style metal deposit map, then this will be quite high: maybe 2 or 3. If you are making a new style metal-all-over-the-place-map, then it will be low: perhaps 0.2. Also for old style maps, you&#039;ll have to fiddle with the...&lt;br /&gt;
* ExtractorRadius, which is the area that is harvested by 1 metal extractor. For old style maps make this very small, so as they only take from one deposit.&lt;br /&gt;
&lt;br /&gt;
=== Atmosphere, Water Colours ===&lt;br /&gt;
Each value (it would appear this bit is by no means gospel) is a representation of the [[RGB]] values for that parameter. It would appear to be relative, i.e. you can put in what ever numbers you like and the game will work out what you want. &lt;br /&gt;
&lt;br /&gt;
The best way to go about it is to look at it as percentages.&lt;br /&gt;
The numbers 1, 0.5, 0.2 refer to 100% red, 50% green and 20% blue. But 2, 1, 0.4, will get the same result. Using numbers below one for all the numbers will result in the colour being less bright.&lt;br /&gt;
&lt;br /&gt;
This is all a bit confusing so an example will be given:&lt;br /&gt;
&lt;br /&gt;
 SkyColor=0.2 0.1 0.5;&lt;br /&gt;
&lt;br /&gt;
In this example the sky is coloured with 20% red, 10% green, and 50% blue, approximatly RGB(51,25,127), resulting in a very deep night-time blue. Other colours are added to the initial sky colour. If you set your sun as being a pale yellow and it came out rather green, this is why. &lt;br /&gt;
&lt;br /&gt;
One helpful tip is &#039;&#039;negative&#039;&#039; colour. That&#039;s right: you can type in a negative number for a colour and it will remove it from the base sky colour. Just be careful not to go below the original values or you may get a surprise.&lt;br /&gt;
&lt;br /&gt;
===The Sun System/Shadow System===&lt;br /&gt;
The Sun System/Shadow System is quite a useful tool as well in making your maps look &#039;&#039;well done&#039;&#039;.  &lt;br /&gt;
Within the &amp;lt;code&amp;gt;.smd&amp;lt;/code&amp;gt; file there is a line: &lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;SunDir=-1 1 -.5;	//direction of sun&amp;lt;/code&amp;gt; &amp;lt;small&amp;gt;(The part after the &amp;quot;//&amp;quot; is a comment)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The numbers &amp;quot;-1&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;.5&amp;quot; determine the angle and elevation of the sunlight system. &lt;br /&gt;
&lt;br /&gt;
The first number is the X angle (East/West) (from -1 to 1) where any negative number means the sun is on the West (and therefore shadows will be cast east), and any positive number means the sun is on the East (and therefore shadows will be cast west), and if the number is 0 there are no east or west shadows, the sun is directly above you. &lt;br /&gt;
&lt;br /&gt;
The second is its elevation, (0 to 1), this number is how far from the horizion the sun is, ignoring it&#039;s angle. Thus, 1 puts the sun directly overhead (while still casting angular shadows) and 0 putting it directly on the horizion. &lt;br /&gt;
&lt;br /&gt;
The final number is the Z angle (North/South). (I know, I know, they wrote the engine with Y as elevation and Z as vertical. Don&#039;t blame me.) It is just like the East West positioning, where negative numbers put them on the North, and positive numbers put them on the South. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example Usage:&#039;&#039;&#039; If you want the shadows &#039;&#039;in&#039;&#039; one of the boxes (your shadow casting surface is in the middle), use the numbers provided, or start from them and tweak the angle and sun height as seen fit.&lt;br /&gt;
&lt;br /&gt;
[[Image:ShadowDirection.gif]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; on the current build, it &#039;&#039;will&#039;&#039; cast the shadows in the proper direction, etc. Negative direction numbers tend to make some maps unstable and cause crashes. The best solution would be to rotate or flip your map to where the shadows point up or right (North or West). I do believe these bugs are being worked on and will be fixed soon.&lt;br /&gt;
&lt;br /&gt;
We can only hope this has been helpful! Any questions, or things you think we have missed, please ask us in the maps section.&lt;br /&gt;
&lt;br /&gt;
[[Category:Map making]]&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:Howto_skybox&amp;diff=13469</id>
		<title>Mapdev:Howto skybox</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:Howto_skybox&amp;diff=13469"/>
		<updated>2009-08-31T17:41:22Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Skybox Information==&lt;br /&gt;
This is going to contain notes about the creation of skyboxes aka cubemaps. &lt;br /&gt;
&lt;br /&gt;
Skyboxes are created with a series of 6 separate images which form what we call a cube map. Below is an example of the skybox images that I created for a map.&lt;br /&gt;
&lt;br /&gt;
[[Image:Skyboxsimple.gif|center|this is what we call a cube cross]]&lt;br /&gt;
&lt;br /&gt;
Despite what you will see on many sites you do not need a cube cross for the creation of your skybox. You will be using six individual images. Each image represents a different face on an imaginary cube. Each face is applied to the cube that surrounds the map. &lt;br /&gt;
&lt;br /&gt;
[[Image:Sky1.gif|center|see how each side of the cube is it&#039;s own image]]&lt;br /&gt;
&lt;br /&gt;
Here an image is being applied to the cubemap. See how each side of the cube is an image?&lt;br /&gt;
&lt;br /&gt;
== Skybox creation ==&lt;br /&gt;
&lt;br /&gt;
=== Creating your 6 textures ===&lt;br /&gt;
You will need six images representing each side of your skybox. I will not go into any specific method of construction. There are tutorials out there for that. Just remember you will need 6 textures, front, back, left side, right side, top and bottom.&lt;br /&gt;
&lt;br /&gt;
=== Creating your dds using the nvidia dds utilities ===&lt;br /&gt;
You will need these utilities from Nvidia&#039;s website: [http://developer.nvidia.com/object/dds_utilities_legacy.html|NVIDIA Texture Tools]&lt;br /&gt;
&lt;br /&gt;
Once you have downloaded and installed the tools you will need to created 2 files:&lt;br /&gt;
* &#039;&#039;&#039;Compiledds.bat&#039;&#039;&#039;, and&lt;br /&gt;
* &#039;&#039;&#039;cubemapfile.lst&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Inside of &#039;&#039;&#039;compiledds.bat&#039;&#039;&#039; type in:&lt;br /&gt;
&lt;br /&gt;
 nvdxt -cubeMap -list cubemapfile.lst  -output cubemap.dds &lt;br /&gt;
 pause&lt;br /&gt;
&lt;br /&gt;
This will compile your skybox to the name &#039;&#039;&#039;cubemap.dds&#039;&#039;&#039;, feel free to change the name. Also, the pause command will stop the the batch file and force it to wait before it closes, this will allow you to see any errors that may or may not occur.&lt;br /&gt;
&lt;br /&gt;
Inside of &#039;&#039;&#039;cubemapfile.lst&#039;&#039;&#039; type in:&lt;br /&gt;
&lt;br /&gt;
 left.jpg&lt;br /&gt;
 right.jpg&lt;br /&gt;
 top.jpg&lt;br /&gt;
 bottom.jpg&lt;br /&gt;
 front.jpg&lt;br /&gt;
 back.jpg&lt;br /&gt;
&lt;br /&gt;
The .dds file created should be put in the &#039;&#039;&#039;maps/&#039;&#039;&#039; directory with your maps .smd, .smf and .smt files.&lt;br /&gt;
&lt;br /&gt;
== Skybox notes ==&lt;br /&gt;
&lt;br /&gt;
Do not do these:&lt;br /&gt;
&lt;br /&gt;
Sizes that are not to the power of two. ATI cards have problems with sizes that are not a power of two. Reccomended sizes are: &#039;&#039;&#039;256X256&#039;&#039;&#039;, &#039;&#039;&#039;512X512&#039;&#039;&#039; or &#039;&#039;&#039;1024x1024&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note: the batch will export a DXT5 or something like that and spring has an issue with the newest dds stuff. I will update the command for you gents soon. I thought I already had... my bad.&lt;br /&gt;
&lt;br /&gt;
--[[User:Smoth|Smoth]] 09:24, 25 Apr 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
If you have problems with nvdxt:&lt;br /&gt;
&lt;br /&gt;
You can also create dds textures using the Texture Tool found in the Microsoft DirectX SDK.&lt;br /&gt;
&lt;br /&gt;
Although it is quite a large download it is worth while if you are serioues about making decent maps.&lt;br /&gt;
&lt;br /&gt;
These instruction may not be the best however they have been proven to work with some success.&lt;br /&gt;
&lt;br /&gt;
To create your cube map first open the DirectX Texture Tool. Go to File and select New Texture. Select Cubemap texture. Set the Width and Height as a power of two and leave the MipMap Levels at 1.&lt;br /&gt;
&lt;br /&gt;
The Surface format should be 32bit X8R8G8B8. It may be possible to use other formats for example 24Bit and use less space. If you want to try that you will have to experiment. You can now press OK.&lt;br /&gt;
&lt;br /&gt;
Go to file and select Open Onto This Cubemap Face. Select the image file you want to use for that face. You can select most common image formats such as jpg, bmp, png, etc. The image that you open should be the same width and height as you entered when creating the cubemap.&lt;br /&gt;
&lt;br /&gt;
Now you have done one face and can do the next. To change face go to the View menu, the Cube Map View submenu and select the next face in the list. Open the image you want onto this face as you did before.&lt;br /&gt;
&lt;br /&gt;
Keep doing this until you have opened an image onto every face, then save the file.&lt;br /&gt;
&lt;br /&gt;
You now have a sky-box.&lt;br /&gt;
&lt;br /&gt;
-Orakio&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Map_development&amp;diff=13280</id>
		<title>Map development</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Map_development&amp;diff=13280"/>
		<updated>2009-08-31T17:41:06Z</updated>

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

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Frequently Asked Questions on SM3 =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What is DevIL ==&lt;br /&gt;
DevIL is the Image Loading library that spring uses.&lt;br /&gt;
http://openil.sf.net/&lt;br /&gt;
&lt;br /&gt;
DevIL supports loading of bmp, dds, gif, jpg, png, pcx, psd, psp, tga, raw, pal, tif, pal, sgi, hdr among others.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Map Size (x) should be equal to GameAreaW and GameAreaH&amp;quot;? ==&lt;br /&gt;
For the map to load you need to add these two variables to your .sm3:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	GameAreaW=xxx;&amp;lt;br&amp;gt;&lt;br /&gt;
	GameAreaH=xxx;&amp;lt;br&amp;gt;&lt;br /&gt;
The map size(note, not the heightmap size which is map 1 pixel) width/height goes here.&lt;br /&gt;
&lt;br /&gt;
== How do I use external textures? ==&lt;br /&gt;
Create a modinfo.tdf textfile in your mapname.sdd. It should contain:&lt;br /&gt;
&lt;br /&gt;
[MOD]&amp;lt;br&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
Name=mapname;&amp;lt;br&amp;gt;&lt;br /&gt;
Description=your description here;&amp;lt;br&amp;gt;&lt;br /&gt;
ModType=0;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
NumDependencies=1;&amp;lt;br&amp;gt;&lt;br /&gt;
Depend0=texturefilename.sd7;&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will tell Spring to look in the directory where your map is located(eg. \maps\) for the textures you have specified in the SM3. Example:&lt;br /&gt;
&lt;br /&gt;
[Rock]&amp;lt;br&amp;gt;&lt;br /&gt;
{&amp;lt;br&amp;gt;&lt;br /&gt;
TileSize=60;&amp;lt;br&amp;gt;&lt;br /&gt;
File=textures/rock/rock.jpg;&amp;lt;br&amp;gt;&lt;br /&gt;
Bumpmap=textures/rock/rock_normal.jpg;&amp;lt;br&amp;gt;&lt;br /&gt;
}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Which would tell Spring that your texture is at texturefilename.sd7/textures/rock/rock.jpg.&lt;br /&gt;
&lt;br /&gt;
[[Category:Map making]]&lt;br /&gt;
[[Category:SM3 map format]]&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=SM3_Map_Format&amp;diff=16109</id>
		<title>SM3 Map Format</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=SM3_Map_Format&amp;diff=16109"/>
		<updated>2009-08-31T17:39:58Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Map_development|Map Development]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
As opposed to the original SMF renderer, the SM3 map renderer allows multiple texture layers rendered on the terrain. This allows for higher texture resolutions and improved lighting such as bumpmapping/specular mapping.&lt;br /&gt;
&lt;br /&gt;
Hugh Perkins has been working on a SM3 map editor:&lt;br /&gt;
http://taspring.clan-sy.com/phpbb/viewtopic.php?t=8094&lt;br /&gt;
&lt;br /&gt;
== Map specification ==&lt;br /&gt;
&lt;br /&gt;
Instead of a binary SMF file and a SMD file, all map information is now stored in a text based .SM3 file. This has the same basic layout as the original .SMD file, but it includes a [TERRAIN] section and an [INFOMAPS] section. It also has  an extra tag in LIGHT (GroundSpecularColor):&lt;br /&gt;
&lt;br /&gt;
 [MAP]&lt;br /&gt;
 {&lt;br /&gt;
 		// regular smd information, such as start positions,&lt;br /&gt;
 		// [WATER] and [ATMOSPHERE] sections...&lt;br /&gt;
 &lt;br /&gt;
 	[LIGHT]&lt;br /&gt;
 	{&lt;br /&gt;
 			// specular color, defaults to 0.1 0.1 0.1&lt;br /&gt;
 		GroundSpecularColor=0.3 0.3 0.3;&lt;br /&gt;
 &lt;br /&gt;
 			// other standard tags shared with SMF (such as GroundSunColor)...&lt;br /&gt;
 &lt;br /&gt;
 	}&lt;br /&gt;
&lt;br /&gt;
 	[INFOMAPS]&lt;br /&gt;
 	{&lt;br /&gt;
 		metal=Maps/dry_data/metalmap.png;&lt;br /&gt;
 		type=Maps/dry_data/typemap.png;&lt;br /&gt;
 	}&lt;br /&gt;
 	[TERRAIN]&lt;br /&gt;
 	{&lt;br /&gt;
 		HeightScale=400.0;&lt;br /&gt;
 		HeightOffset=10.0;&lt;br /&gt;
 		Heightmap=Maps/dry_data/1026.png;&lt;br /&gt;
 		&lt;br /&gt;
 		NumTextureStages=2; // all texture stages are multiplied&lt;br /&gt;
 		SpecularExponent=16; // specular exponent AKA &lt;br /&gt;
 			//shininess or polishedness.  defaults to 8&lt;br /&gt;
 	&lt;br /&gt;
 		[texstage0]&lt;br /&gt;
 	 	{&lt;br /&gt;
 				// the first texture stage operation is ignored&lt;br /&gt;
 			source=Snow;&lt;br /&gt;
 		}&lt;br /&gt;
 		[texstage1]&lt;br /&gt;
 		{&lt;br /&gt;
 				// use the incoming alpha to blend between 2 textures&lt;br /&gt;
 			operation=blend; &lt;br /&gt;
 			source=CrackedDirt;&lt;br /&gt;
 			blender=RockBlender1026;&lt;br /&gt;
 		}&lt;br /&gt;
 			/* texture definitions */&lt;br /&gt;
 		[CrackedDirt]&lt;br /&gt;
 		{&lt;br /&gt;
 			File=Maps/dry_data/dirt2.jpg;&lt;br /&gt;
 			Bumpmap=Maps/dry_data/dirt2_bm.jpg;&lt;br /&gt;
 			TileSize=50;&lt;br /&gt;
 		}&lt;br /&gt;
 		[Snow]&lt;br /&gt;
 		{&lt;br /&gt;
 			File=Maps/dry_data/Snow_Sand.jpg;&lt;br /&gt;
 			TileSize=20;&lt;br /&gt;
 		}&lt;br /&gt;
 	&lt;br /&gt;
 			/* blender definition, all blenders have &amp;quot;Blendmap=1&amp;quot; */&lt;br /&gt;
 			// a rock blender loaded from file for a specific map&lt;br /&gt;
 		[RockBlender1026]&lt;br /&gt;
 		{&lt;br /&gt;
 			Blendmap=1;&lt;br /&gt;
 			File=Maps/dry_data/1026_bm_small.png;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Heightmap specification ==&lt;br /&gt;
&lt;br /&gt;
The heightmap is specified with 3 tags located in the [TERRAIN] section:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Heightmap:&#039;&#039;&#039; This should be either:&lt;br /&gt;
*An 8 or 16 bit image file readable by DevIL&lt;br /&gt;
*A 8 or 16 bit RAW file, such as generated by Terragen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HeightScale and HeightOffset:&#039;&#039;&#039; The actual height of a heightmap pixel is calculated scaled by HeightScale, after which HeightOffset is added to it (height = pixel * HeightScale + HeightOffset)&lt;br /&gt;
&lt;br /&gt;
== Texturing method specification (how are the textures applied) ==&lt;br /&gt;
&lt;br /&gt;
=== Texture stages/layers ===&lt;br /&gt;
&lt;br /&gt;
Texturing of SM3 terrains works by a series of texture layers that are applied on top of eachother. These layers are called &amp;quot;texture stages&amp;quot;. The stages can be added, multiplied, or alpha blended with the previous stage. This is defined by the stage operation. &lt;br /&gt;
&lt;br /&gt;
The number of stages is given with the tag NumTextureStages like:&lt;br /&gt;
&lt;br /&gt;
 NumTextureStages=2;&lt;br /&gt;
&lt;br /&gt;
Keep in mind that the stages are directly executed on your videocard. This means the more stages you make the slower the map will render. &lt;br /&gt;
 &lt;br /&gt;
The first stage never has an operation:&lt;br /&gt;
&lt;br /&gt;
 	[texstage0]&lt;br /&gt;
 	{&lt;br /&gt;
 		source=Snow;&lt;br /&gt;
 	}&lt;br /&gt;
&lt;br /&gt;
Following stages can have &amp;quot;operation=add&amp;quot;, &amp;quot;operation=mul&amp;quot;, &amp;quot;operation=blend&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Operation Add ====&lt;br /&gt;
&lt;br /&gt;
The add operation needs a texture to add to the previous stage, which is specified with the &amp;quot;source=TextureName&amp;quot; tag. The texture specification is explained below.&lt;br /&gt;
&lt;br /&gt;
 	[texstage1]&lt;br /&gt;
 	{&lt;br /&gt;
 		operation=add;&lt;br /&gt;
 		source=CrackedDirt;&lt;br /&gt;
 	}&lt;br /&gt;
&lt;br /&gt;
==== Operation Multiply ====&lt;br /&gt;
&lt;br /&gt;
Same as add, but with operation=mul&lt;br /&gt;
&lt;br /&gt;
 	[texstage1]&lt;br /&gt;
 	{&lt;br /&gt;
 		operation=mul;&lt;br /&gt;
 		source=CrackedDirt;&lt;br /&gt;
 	}&lt;br /&gt;
&lt;br /&gt;
==== Operation Blend ====&lt;br /&gt;
&lt;br /&gt;
The blend operation does alpha blending with an extra grayscale alpha texture. Specification of these alpha textures (&amp;quot;Blendmaps&amp;quot;) is explained later in this doc. The blend operation needs a &amp;quot;blender=BlenderName&amp;quot; tag to work. I&#039;m guessing most maps will only be using this operation. &lt;br /&gt;
&lt;br /&gt;
 	[texstage1]&lt;br /&gt;
 	{&lt;br /&gt;
 		operation=blend; &lt;br /&gt;
 		source=CrackedDirt;&lt;br /&gt;
 		blender=RockBlender1026;&lt;br /&gt;
 	}&lt;br /&gt;
&lt;br /&gt;
The avaiable operations are limited to add/mul/blend for techical reasons:&lt;br /&gt;
This way even the most complex maps can be executed with multipass operations on any card with at least 2 textures units. It would even work on a Riva TNT I think.&lt;br /&gt;
&lt;br /&gt;
Obviously because the first stage doesn&#039;t have any previous stage, the operation of the first stage is ignored&lt;br /&gt;
&lt;br /&gt;
=== Textures ===&lt;br /&gt;
&lt;br /&gt;
==== Tiled textures ====&lt;br /&gt;
&lt;br /&gt;
The operations usually have &amp;quot;source=texturename&amp;quot; in them, which points to the name of a tiled texture.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 	NumTextureStages=1;&lt;br /&gt;
 	[texstage0]&lt;br /&gt;
 	{&lt;br /&gt;
 		source=Snow;&lt;br /&gt;
 	}&lt;br /&gt;
&lt;br /&gt;
 	[Snow]&lt;br /&gt;
 	{&lt;br /&gt;
 		File=Maps/dry_data/Snow_Sand.jpg;&lt;br /&gt;
 		TileSize=20;&lt;br /&gt;
 	}&lt;br /&gt;
&lt;br /&gt;
Tilesize is how big a single tile is in the 3D spring world, when the texture is tiled across the map. Imagine a heightmap of 1025x1025 (In spring world space this is 1024*8= 8192x8192 units). &lt;br /&gt;
When you set tilesize=4096, you will see the complete texture 4 times on the map (2 by 2). Set it to 8192 and you&#039;ll see the map completely covered. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Blendmap specification ====&lt;br /&gt;
&lt;br /&gt;
Blendmaps can either be loaded from file or generated from the terrain. They are stretched across the full terrain, so in combination with the blend operation you can specify exactly where you want to see a specific texture on the terrain.&lt;br /&gt;
&lt;br /&gt;
===== Blendmaps from file =====&lt;br /&gt;
&lt;br /&gt;
Blendmaps can be loaded from any grayscale file that DevIL can load:&lt;br /&gt;
&lt;br /&gt;
 	[RockBlender]&lt;br /&gt;
 	{&lt;br /&gt;
 		Blendmap=1;&lt;br /&gt;
 		File=Maps/dry_data/1026_bm_small.png;&lt;br /&gt;
 	}&lt;br /&gt;
&lt;br /&gt;
===== Generated blendmaps =====&lt;br /&gt;
&lt;br /&gt;
Blendmaps can be generated from the heightmap. The final value is computed by&lt;br /&gt;
&lt;br /&gt;
 blendmap_value = SlopeTerm * HeightTerm * coverage * noise&lt;br /&gt;
&lt;br /&gt;
The slope of the terrain is a value between 0 and 1, with 0 being flat and 1 being completely steep. Ofcourse with a heightmap the slope can only be near 1 and not exactly 1&lt;br /&gt;
&lt;br /&gt;
The height of the terrain is between 0 and 1 (the minimum and maximum height value)&lt;br /&gt;
If the height is between minHeight and maxHeight, HeightTerm will be 1. maxHeightFuzzy and minHeightFuzzy determine the &amp;quot;border&amp;quot; size between having a HeightTerm of 0 and a HeightTerm of 1. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GeneratorLOD indicates at which resolution the blendmap should be generated. The blendmap size will be (heightmapsize-1) / (2 ^ generatorLOD). For example with a heightmap width of 1025 and a generatorlod of 2, the blendmap size will be 1024/4=256.&lt;br /&gt;
&lt;br /&gt;
(Images illustrating this will be added later)&lt;br /&gt;
&lt;br /&gt;
== Infomaps ==&lt;br /&gt;
&lt;br /&gt;
The infomaps section defines the metal map and typemap. Both should be 8 bit images in any format DevIL accepts.&lt;br /&gt;
&lt;br /&gt;
== Image file sizes ==&lt;br /&gt;
&lt;br /&gt;
* The heightmap has to be square and its dimensions have to be a power-of-two + 1, like 257x257, 513x513, 1025x1025&lt;br /&gt;
* The blendmaps have to be square too, with power-of-two dimensions like: 256x256, 512x512, 1024x1024.  They should be smaller than the heightmap.&lt;br /&gt;
* The tiled textures should have power-of-two dimensions, but don&#039;t have to be square&lt;br /&gt;
* The minimap can be anything, but it will be resized to an image of 1024x1024. Specifying a 1024x1024 will allow faster loading because no resizing is needed.&lt;br /&gt;
* Typemap and metalmaps dimensions should be (heightmapsize - 1) / 2, so when the heightmap is 1025x1025, the typemap is 512x512.&lt;br /&gt;
* The heightmap can be any [http://openil.sourceforge.net/features.php DevIL] supported format, or RAW such as exported by terragen. All the other maps/texture files can only be a DevIL format.&lt;br /&gt;
&lt;br /&gt;
== Feature placement ==&lt;br /&gt;
&lt;br /&gt;
The feature specification is done with a list of feature type names in the SM3 itself, and with a binary datafile that contains all the feature positions, orientations.&lt;br /&gt;
Feature types are specified like this:&lt;br /&gt;
&lt;br /&gt;
 	[FeatureTypes]&lt;br /&gt;
 	{&lt;br /&gt;
 		NumTypes=4;&lt;br /&gt;
 		type0=TreeType0;     // a tree&lt;br /&gt;
 		type1=MyFeature; &lt;br /&gt;
 		type2=MyOtherFeature;&lt;br /&gt;
 		type3=GeoVent;            // a geothermal	&lt;br /&gt;
 	}&lt;br /&gt;
&lt;br /&gt;
The feature binary file should be made with an editor. I&#039;m hoping Maelstrom will add feature placing to his startpoint editor, but until then there&#039;s only http://user.supradigital.org/jcnossen/FeaturePlacer.zip&lt;br /&gt;
&lt;br /&gt;
[[Image:Featureplacer.png]]&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Pos:&amp;quot; fields are ment to enter the feature X,Y,Z. You can use zero for Y because spring will automatically put the feature on the ground when it loads.&lt;br /&gt;
Type is the index into the feature type list specified in the SM3 file.&lt;br /&gt;
&lt;br /&gt;
The feature data file should be linked to the SM3 with:&lt;br /&gt;
&lt;br /&gt;
 [MAP]&lt;br /&gt;
 {&lt;br /&gt;
 		// other map tags ...&lt;br /&gt;
 	featuredata=FeatureDataFileName;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Minimap ==&lt;br /&gt;
&lt;br /&gt;
The minimap is loaded from an image file that you have to set in the MAP section of the sm3 file.&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 [MAP]&lt;br /&gt;
 {&lt;br /&gt;
 		// other map tags ...&lt;br /&gt;
 	minimap=maps/data/minimap.png;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
&lt;br /&gt;
* fix bugs&lt;br /&gt;
&lt;br /&gt;
[[Category:Map making]]&lt;br /&gt;
[[Category:SM3 map format]]&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_ConstGame&amp;diff=11212</id>
		<title>Lua ConstGame</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_ConstGame&amp;diff=11212"/>
		<updated>2009-08-31T17:28:47Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Engine =&lt;br /&gt;
string &#039;&#039;&#039;Game.version&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
number &#039;&#039;&#039;Game.gameID&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
number &#039;&#039;&#039;Game.maxUnits&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.maxTeams&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.maxPlayers&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.squareSize&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.gameSpeed&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Host =&lt;br /&gt;
number &#039;&#039;&#039;Game.gameMode&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.startPosType&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
boolean &#039;&#039;&#039;Game.commEnds&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
boolean &#039;&#039;&#039;Game.limitDGun&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
boolean &#039;&#039;&#039;Game.diminishingMetal&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
boolean &#039;&#039;&#039;Game.ghostedBuildings&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Checksums =&lt;br /&gt;
string &#039;&#039;&#039;Game.mapChecksum&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
string &#039;&#039;&#039;Game.modChecksum&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Map =&lt;br /&gt;
string &#039;&#039;&#039;Game.mapName&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
string &#039;&#039;&#039;Game.mapHumanName&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.mapX&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.mapY&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.mapSizeX&#039;&#039;&#039;  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;  in worldspace/opengl coords&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.mapSizeZ&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;  in worldspace/opengl coords&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.gravity&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.tidal&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.windMin&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.windMax&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.extractorRadius&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.waterDamage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Mod =&lt;br /&gt;
string &#039;&#039;&#039;Game.modName&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
string &#039;&#039;&#039;Game.modShortName&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
string &#039;&#039;&#039;Game.modVersion&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
string &#039;&#039;&#039;Game.modMutator&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
string &#039;&#039;&#039;Game.modDesc&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
boolean &#039;&#039;&#039;Game.allowTeamColors&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.transportAir&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.transportShip&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.transportHover&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.transportGround&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.fireAtKilled&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.fireAtCrashing&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
boolean &#039;&#039;&#039;Game.requireSonarUnderWater&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Constructor =&lt;br /&gt;
boolean &#039;&#039;&#039;Game.constructionDecay&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.constructionDecayTime&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.constructionDecaySpeed&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
number &#039;&#039;&#039;Game.multiReclaim&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.reclaimMethod&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.reclaimUnitMethod&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.reclaimUnitEnergyCostFactor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.reclaimUnitEfficiency&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.reclaimFeatureEnergyCostFactor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
boolean &#039;&#039;&#039;Game.reclaimAllowEnemies&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
boolean &#039;&#039;&#039;Game.reclaimAllowAllies&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.repairEnergyCostFactor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.resurrectEnergyCostFactor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.captureEnergyCostFactor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Categories =&lt;br /&gt;
table &#039;&#039;&#039;Game.springCategories&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  example: {&lt;br /&gt;
    [&amp;quot;vtol&amp;quot;]         = 0,  [&amp;quot;special&amp;quot;]      = 1,  [&amp;quot;noweapon&amp;quot;]     = 2,&lt;br /&gt;
    [&amp;quot;notair&amp;quot;]       = 3,  [&amp;quot;notsub&amp;quot;]       = 4,  [&amp;quot;all&amp;quot;]          = 5,&lt;br /&gt;
    [&amp;quot;weapon&amp;quot;]       = 6,  [&amp;quot;notship&amp;quot;]      = 7,  [&amp;quot;notland&amp;quot;]      = 8,&lt;br /&gt;
    [&amp;quot;mobile&amp;quot;]       = 9,  [&amp;quot;kbot&amp;quot;]         = 10, [&amp;quot;antigator&amp;quot;]    = 11,&lt;br /&gt;
    [&amp;quot;tank&amp;quot;]         = 12, [&amp;quot;plant&amp;quot;]        = 13, [&amp;quot;ship&amp;quot;]         = 14,&lt;br /&gt;
    [&amp;quot;antiemg&amp;quot;]      = 15, [&amp;quot;antilaser&amp;quot;]    = 16, [&amp;quot;antiflame&amp;quot;]    = 17,&lt;br /&gt;
    [&amp;quot;underwater&amp;quot;]   = 18, [&amp;quot;hover&amp;quot;]        = 19, [&amp;quot;phib&amp;quot;]         = 20,&lt;br /&gt;
    [&amp;quot;constr&amp;quot;]       = 21, [&amp;quot;strategic&amp;quot;]    = 22, [&amp;quot;commander&amp;quot;]    = 23,&lt;br /&gt;
    [&amp;quot;paral&amp;quot;]        = 24, [&amp;quot;jam&amp;quot;]          = 25, [&amp;quot;mine&amp;quot;]         = 26,&lt;br /&gt;
    [&amp;quot;kamikaze&amp;quot;]     = 27, [&amp;quot;minelayer&amp;quot;]    = 28, [&amp;quot;notstructure&amp;quot;] = 29,&lt;br /&gt;
    [&amp;quot;air&amp;quot;]          = 30&lt;br /&gt;
  }&amp;lt;/font&amp;gt;&lt;br /&gt;
table &#039;&#039;&#039;Game.armorTypes&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(bidirectional)&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  example: {&lt;br /&gt;
    [1]  = amphibious,   [2] = anniddm,     [3] = antibomber,&lt;br /&gt;
    [4]  = antifighter,  [5] = antiraider,  [6] = atl,&lt;br /&gt;
    [7]  = blackhydra,   [8] = bombers,     [9] = commanders,&lt;br /&gt;
    [10] = crawlingbombs, ...&lt;br /&gt;
&lt;br /&gt;
    [&amp;quot;amphibious&amp;quot;]   = 1, [&amp;quot;anniddm&amp;quot;]    = 2, [&amp;quot;antibomber&amp;quot;] = 3&lt;br /&gt;
    [&amp;quot;antifighter&amp;quot;]  = 4, [&amp;quot;antiraider&amp;quot;] = 5, [&amp;quot;atl&amp;quot;]        = 6&lt;br /&gt;
    [&amp;quot;blackhydra&amp;quot;]   = 7, [&amp;quot;bombers&amp;quot;]    = 8, [&amp;quot;commanders&amp;quot;] = 9&lt;br /&gt;
    [&amp;quot;crawlingbombs&amp;quot;]= 10, ...&lt;br /&gt;
  }&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Water Visuals =&lt;br /&gt;
boolean &#039;&#039;&#039;Game.waterVoid&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
boolean &#039;&#039;&#039;Game.waterPlane&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
string &#039;&#039;&#039;Game.waterTexture&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.waterRepeatX&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.waterRepeatY&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
string &#039;&#039;&#039;Game.waterFoamTexture&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
string &#039;&#039;&#039;Game.waterNormalTexture&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
table  &#039;&#039;&#039;Game.waterCausticTextures&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;= {&amp;quot;tex1&amp;quot;,&amp;quot;tex2&amp;quot;,..}&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
color  &#039;&#039;&#039;Game.waterAbsorb&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;= { number r, number g, number b}&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
color  &#039;&#039;&#039;Game.waterBaseColor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
color  &#039;&#039;&#039;Game.waterMinColor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
color  &#039;&#039;&#039;Game.waterSurfaceColor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.waterSurfaceAlpha&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
color  &#039;&#039;&#039;Game.waterSpecularColor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.waterSpecularFactor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
color  &#039;&#039;&#039;Game.waterPlaneColor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.waterFresnelMin&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.waterFresnelMax&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
number &#039;&#039;&#039;Game.waterFresnelPower&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
color  &#039;&#039;&#039;Game.fogColor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
color  &#039;&#039;&#039;Game.groundAmbientColor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
color  &#039;&#039;&#039;Game.groundSpecularColor&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
color  &#039;&#039;&#039;Game.groundSunColor&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua-LuaCOB&amp;diff=10696</id>
		<title>Lua-LuaCOB</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua-LuaCOB&amp;diff=10696"/>
		<updated>2009-08-31T17:20:12Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;font size=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;NOTE&amp;lt;/font&amp;gt; LuaCob will merged with LuaRules in 76b2&amp;lt;/font&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
To use Lua code in your BOS/COB files, you can either include the gadgetHandler (include it in the mod, see the CA mod or include it from the springcontent.sdz) or you create your own enviroment:&lt;br /&gt;
*create a mod-level directory LuaCOB/,&lt;br /&gt;
*make a LuaCOB/main.lua file. (Note: it&#039;s LuaRules/main.lua now)&lt;br /&gt;
Any additional files need to be included with a&lt;br /&gt;
&lt;br /&gt;
 include(&amp;quot;LuaCOB/additional_file.lua&amp;quot; [, fenvTable])&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t know what a fenvTable is, don&#039;t worry, you probably don&#039;t need it anyway.&lt;br /&gt;
More information can be found on [http://www.lua.org the Lua site]. It it highly recommended to read the manual and the tutorials found there. Note that Spring 76b1 used Lua version is 5.1.2, so please take note which version of the manual you&#039;re reading.&lt;br /&gt;
&lt;br /&gt;
Also note that the usual Lua functions for executing code in other files (&amp;lt;tt&amp;gt;dofiles()&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;require()&amp;lt;/tt&amp;gt;) are disabled for technical reasons.&lt;br /&gt;
&lt;br /&gt;
=Interfacing COB-&amp;gt;Lua=&lt;br /&gt;
All Lua functions that are called by COB are given three parameters:&lt;br /&gt;
*unitID - ID of the unit calling the function,&lt;br /&gt;
*unitDefID - ID of the unitDef,&lt;br /&gt;
*teamID - self-explanatory.&lt;br /&gt;
You can call scripts with any (enough for all practical purpouses) amount of additional arguments.&lt;br /&gt;
&lt;br /&gt;
Example functions:&lt;br /&gt;
&lt;br /&gt;
  function GetNearestEnemy(unitID, unitDefID, teamID, radius)&lt;br /&gt;
    local px, py, pz = Spring.GetUnitPosition(unitID)&lt;br /&gt;
    if (px == nil) then&lt;br /&gt;
      return&lt;br /&gt;
    end&lt;br /&gt;
       &lt;br /&gt;
    local nearDist = 1.0e20&lt;br /&gt;
    local nearUnit&lt;br /&gt;
    local units = Spring.GetUnitsInCylinder(px, pz, radius)&lt;br /&gt;
    for _,enemyID in ipairs(units) do&lt;br /&gt;
      if (not Sim.IsUnitAllied(enemyID)) then             &lt;br /&gt;
        local ex, ey, ez = Spring.GetUnitPosition(enemyID)&lt;br /&gt;
        if (ex ~= nil) then&lt;br /&gt;
          local dx, dy, dz = (px - ex), (py - ey), (pz - ez)&lt;br /&gt;
          local dist = (dx * dx) + (dy * dy) + (dz + dz)&lt;br /&gt;
          if (dist &amp;lt; nearDist) then&lt;br /&gt;
            nearUnit = enemyID&lt;br /&gt;
            nearDist = dist&lt;br /&gt;
          end&lt;br /&gt;
        end &lt;br /&gt;
      end   &lt;br /&gt;
    end   &lt;br /&gt;
&lt;br /&gt;
    if (nearUnit == nil) then&lt;br /&gt;
      return -1&lt;br /&gt;
    else&lt;br /&gt;
      return nearUnit&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
Please note that returning tables doesn&#039;t currently work as one could expect. &#039;&#039;(Description what it does here)&#039;&#039; If you want to return multiple values from a table, you need to do it like this:&lt;br /&gt;
&lt;br /&gt;
 function ReturnSomeValues(u, ud, t, ...)&lt;br /&gt;
     return arg[1], arg[2], arg[3]  -- instead of arg&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
==Calling Lua from BOS==&lt;br /&gt;
To call a Lua function from BOS code, you need to declare it first:&lt;br /&gt;
 // BOS&lt;br /&gt;
 lua_MyFunction() { return 0; }&lt;br /&gt;
Then just call this script. The &amp;lt;tt&amp;gt;lua_&amp;lt;/tt&amp;gt; prefix does its magic and routes the call to Lua code instead of calling the usual BOS code. Note that arguments don&#039;t matter, they are passed anyway:&lt;br /&gt;
 call-script lua_MyFunction(arg1, arg2);&lt;br /&gt;
===Getting output===&lt;br /&gt;
If you wish to print out some debugging info, please note that &amp;lt;tt&amp;gt;print&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;io.write&amp;lt;/tt&amp;gt; don&#039;t quite work in Windows versions of Spring, since stdout isn&#039;t availible (or is well-hidden.) Use &amp;lt;tt&amp;gt;Spring.Echo(&amp;quot;a string&amp;quot;)&amp;lt;/tt&amp;gt;, this will print a message to the Spring console and into the infolog.&lt;br /&gt;
&lt;br /&gt;
===LUA0..9===&lt;br /&gt;
 // the GET/SET constants&lt;br /&gt;
 #define LUA0 110&lt;br /&gt;
 #define LUA1 111&lt;br /&gt;
 #define LUA2 112&lt;br /&gt;
 #define LUA3 113&lt;br /&gt;
 #define LUA4 114&lt;br /&gt;
 #define LUA5 115&lt;br /&gt;
 #define LUA6 116&lt;br /&gt;
 #define LUA7 117&lt;br /&gt;
 #define LUA8 118&lt;br /&gt;
 #define LUA9 119&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;get LUA0&amp;lt;/tt&amp;gt; is used to check whether call succeeded (1 if true, 0 otherwise.) LUA1..9 store return values, e.g. &amp;lt;tt&amp;gt;lua_ReturnSomeValues&amp;lt;/tt&amp;gt; above would put its first argument into &amp;lt;tt&amp;gt;get LUA1&amp;lt;/tt&amp;gt;, second into &amp;lt;tt&amp;gt;get LUA2&amp;lt;/tt&amp;gt;, and so on.&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
Steps needed to call a Lua function in a BOS call-script call:&lt;br /&gt;
*define a Lua function &amp;lt;tt&amp;gt;MyFunction(unitID, unitDefID, teamID, ...)&amp;lt;/tt&amp;gt; in LuaCOB/main.lua or a file included by it&lt;br /&gt;
*define a BOS/COB script &amp;lt;tt&amp;gt;lua_MyFunction() { return 0; }&amp;lt;/tt&amp;gt; so the compiler knows about it&lt;br /&gt;
*call your function with &amp;lt;tt&amp;gt;call-script lua_MyFunction()&amp;lt;/tt&amp;gt;&lt;br /&gt;
*return values can be found in &amp;lt;tt&amp;gt;get LUA1..9&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;get LUA0&amp;lt;/tt&amp;gt; returns 1 when call was successful (regardless of its return values) and 0 in case of failure.&lt;br /&gt;
&lt;br /&gt;
===Examples of code===&lt;br /&gt;
*[http://neoteric.pl/~imbaczek/spring/messages_lua.zip Inter-unit communication]  &amp;lt;small&amp;gt;(shameless plug ;p)&amp;lt;/small&amp;gt; - a library that allows passing messages between units and reading/writing of public variables exposed by them.Included is a tech demo involving modified [[Nanoblobs]] 0.64. Patch, start the game, make a sheep and see for yourself.&lt;br /&gt;
* &amp;lt;big&amp;gt;Your own!&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Interfacing Lua-&amp;gt;COB=&lt;br /&gt;
&lt;br /&gt;
Lua:&lt;br /&gt;
 Spring.CallCOBScript(unitID, &amp;quot;CustomScript&amp;quot;, retArgCount, arg1, ..., argN)&lt;br /&gt;
 Spring.CallCOBScriptCB(unitID, &amp;quot;CustomScript&amp;quot;, retArgCount, callbackData, arg1, ..., argN)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;retArgCount:&#039;&#039;&#039;  the number of arguments expected to be returned&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;callbackData:&#039;&#039;&#039; number passed to CobCallback() when the cob call completes&lt;br /&gt;
&lt;br /&gt;
COB:&lt;br /&gt;
 CustomScript(arg1, ..., argN) { ... }&lt;br /&gt;
&lt;br /&gt;
One particularly useful COB script, since Lua doesn&#039;t seem to have a way of making &amp;lt;tt&amp;gt;get SOMETHING(args)&amp;lt;/tt&amp;gt; requests (but it may provide other ways of getting the same information):&lt;br /&gt;
 LuaGet(r, cmd, p1, p2, p3, p4)&lt;br /&gt;
 {&lt;br /&gt;
  if (r == 0) { r = get cmd;                 return r }&lt;br /&gt;
  if (r == 1) { r = get cmd(p1,  0,  0,  0); return r }&lt;br /&gt;
  if (r == 2) { r = get cmd(p1, p2,  0,  0); return r }&lt;br /&gt;
  if (r == 3) { r = get cmd(p1, p2, p3,  0); return r }&lt;br /&gt;
  if (r == 4) { r = get cmd(p1, p2, p3, p4); return r }&lt;br /&gt;
&lt;br /&gt;
  return 1234;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
#[http://spring.clan-sy.com/phpbb/viewforum.php?f=23 Spring Lua Scripts forum]&lt;br /&gt;
#[http://spring.clan-sy.com/phpbb/viewtopic.php?t=9329 trepan&#039;s description of Lua-COB interface] - a little bit outdated, but still worth a read&lt;br /&gt;
&lt;br /&gt;
=Thanks=&lt;br /&gt;
trepan for doing the hard work of integrating Lua into Spring!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTE from trepan:&lt;br /&gt;
  Thanks, but there were lua startscripts before I started doing&lt;br /&gt;
  any Spring coding. The benefits of the new LuaCob, LuaGaia, and&lt;br /&gt;
  LuaRules scripts are that they can be loaded from map/mod archives,&lt;br /&gt;
  and that they all use the same base libraries (as does LuaUI).&lt;br /&gt;
  They also have significantly more features then the current&lt;br /&gt;
  startscript code (ex: more call-ins and call-outs, the ability to&lt;br /&gt;
  render graphics in several different modes, play sounds, etc...)&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=UI_commands&amp;diff=18797</id>
		<title>UI commands</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=UI_commands&amp;diff=18797"/>
		<updated>2009-08-31T17:14:54Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
select&amp;lt;br&amp;gt;&lt;br /&gt;
selectunits&amp;lt;br&amp;gt;&lt;br /&gt;
deselect&amp;lt;br&amp;gt;&lt;br /&gt;
shadows&amp;lt;br&amp;gt;&lt;br /&gt;
water&amp;lt;br&amp;gt;&lt;br /&gt;
advshading&amp;lt;br&amp;gt;&lt;br /&gt;
say&amp;lt;br&amp;gt;&lt;br /&gt;
w&amp;lt;br&amp;gt;&lt;br /&gt;
echo&amp;lt;br&amp;gt;&lt;br /&gt;
setf&amp;lt;br&amp;gt;&lt;br /&gt;
seti&amp;lt;br&amp;gt;&lt;br /&gt;
sets&amp;lt;br&amp;gt;&lt;br /&gt;
drawinmap&amp;lt;br&amp;gt;&lt;br /&gt;
drawlabel&amp;lt;br&amp;gt;&lt;br /&gt;
mouse[1-5]&amp;lt;br&amp;gt;&lt;br /&gt;
viewselection&amp;lt;br&amp;gt;&lt;br /&gt;
move[forward, back, left, right, up, down, fast, slow]&amp;lt;br&amp;gt;&lt;br /&gt;
team&amp;lt;br&amp;gt;&lt;br /&gt;
spectator&amp;lt;br&amp;gt;&lt;br /&gt;
specteam&amp;lt;br&amp;gt;&lt;br /&gt;
specfullview&amp;lt;br&amp;gt;&lt;br /&gt;
ally&amp;lt;br&amp;gt;&lt;br /&gt;
group[0-9]&amp;lt;br&amp;gt;&lt;br /&gt;
lastmsgpos&amp;lt;br&amp;gt;&lt;br /&gt;
char[, all, ally, spec]&amp;lt;br&amp;gt;&lt;br /&gt;
track&amp;lt;br&amp;gt;&lt;br /&gt;
trackoff&amp;lt;br&amp;gt;&lt;br /&gt;
trackmode&amp;lt;br&amp;gt;&lt;br /&gt;
showhealthbars&amp;lt;br&amp;gt;&lt;br /&gt;
pause&amp;lt;br&amp;gt;&lt;br /&gt;
debug&amp;lt;br&amp;gt;&lt;br /&gt;
nosound&amp;lt;br&amp;gt;&lt;br /&gt;
volume&amp;lt;br&amp;gt;&lt;br /&gt;
unitreplyvolume&amp;lt;br&amp;gt;&lt;br /&gt;
savegame&amp;lt;br&amp;gt;&lt;br /&gt;
createvideo&amp;lt;br&amp;gt;&lt;br /&gt;
updatefov&amp;lt;br&amp;gt;&lt;br /&gt;
drawtrees&amp;lt;br&amp;gt;&lt;br /&gt;
dynamicsky&amp;lt;br&amp;gt;&lt;br /&gt;
gameinfo&amp;lt;br&amp;gt;&lt;br /&gt;
hideinterface&amp;lt;br&amp;gt;&lt;br /&gt;
hardwarecursor&amp;lt;br&amp;gt;&lt;br /&gt;
[increase, decrease]viewradius&amp;lt;br&amp;gt;&lt;br /&gt;
[more, less]trees&amp;lt;br&amp;gt;&lt;br /&gt;
[more, less]clouds&amp;lt;br&amp;gt;&lt;br /&gt;
speedup&amp;lt;br&amp;gt;&lt;br /&gt;
slowdown&amp;lt;br&amp;gt;&lt;br /&gt;
controlunit&amp;lt;br&amp;gt;&lt;br /&gt;
showshadowmap&amp;lt;br&amp;gt;&lt;br /&gt;
showstandard&amp;lt;br&amp;gt;&lt;br /&gt;
showelevation&amp;lt;br&amp;gt;&lt;br /&gt;
toggleradarandjammer&amp;lt;br&amp;gt;&lt;br /&gt;
showmetalmap&amp;lt;br&amp;gt;&lt;br /&gt;
showpathmap&amp;lt;br&amp;gt;&lt;br /&gt;
yardmap4 (does nothing)&amp;lt;br&amp;gt;&lt;br /&gt;
togglelos&amp;lt;br&amp;gt;&lt;br /&gt;
sharedialog&amp;lt;br&amp;gt;&lt;br /&gt;
quitwarn&amp;lt;br&amp;gt;&lt;br /&gt;
quit&amp;lt;br&amp;gt;&lt;br /&gt;
[inc, dec]guiopacity&amp;lt;br&amp;gt;&lt;br /&gt;
screenshot&amp;lt;br&amp;gt;&lt;br /&gt;
grabinput&amp;lt;br&amp;gt;&lt;br /&gt;
clock&amp;lt;br&amp;gt;&lt;br /&gt;
cross&amp;lt;br&amp;gt;&lt;br /&gt;
fps&amp;lt;br&amp;gt;&lt;br /&gt;
info&amp;lt;br&amp;gt;&lt;br /&gt;
techlevels&amp;lt;br&amp;gt;&lt;br /&gt;
cmdcolors&amp;lt;br&amp;gt;&lt;br /&gt;
ctrlpanel&amp;lt;br&amp;gt;&lt;br /&gt;
font&amp;lt;br&amp;gt;&lt;br /&gt;
aiselect&amp;lt;br&amp;gt;&lt;br /&gt;
vsync&amp;lt;br&amp;gt;&lt;br /&gt;
safegl&amp;lt;br&amp;gt;&lt;br /&gt;
resbar&amp;lt;br&amp;gt;&lt;br /&gt;
tooltip&amp;lt;br&amp;gt;&lt;br /&gt;
console&amp;lt;br&amp;gt;&lt;br /&gt;
endgraph&amp;lt;br&amp;gt;&lt;br /&gt;
fpshud&amp;lt;br&amp;gt;&lt;br /&gt;
mapmarks&amp;lt;br&amp;gt;&lt;br /&gt;
allmapmarks&amp;lt;br&amp;gt;&lt;br /&gt;
luaui&amp;lt;br&amp;gt;&lt;br /&gt;
minimap&amp;lt;br&amp;gt;&lt;br /&gt;
grounddecals&amp;lt;br&amp;gt;&lt;br /&gt;
maxparticles&amp;lt;br&amp;gt;&lt;br /&gt;
gathermode&amp;lt;br&amp;gt;&lt;br /&gt;
pastetext&amp;lt;br&amp;gt;&lt;br /&gt;
buffertext&amp;lt;br&amp;gt;&lt;br /&gt;
inputtextgeo&amp;lt;br&amp;gt;&lt;br /&gt;
lodscale&amp;lt;br&amp;gt;&lt;br /&gt;
wiremap&amp;lt;br&amp;gt;&lt;br /&gt;
setgamma&amp;lt;br&amp;gt;&lt;br /&gt;
crash&amp;lt;br&amp;gt;&lt;br /&gt;
exception&amp;lt;br&amp;gt;&lt;br /&gt;
divbyzero&amp;lt;br&amp;gt;&lt;br /&gt;
give&amp;lt;br&amp;gt;&lt;br /&gt;
send&amp;lt;br&amp;gt;&lt;br /&gt;
save&amp;lt;br&amp;gt;&lt;br /&gt;
atm&amp;lt;br&amp;gt;&lt;br /&gt;
desync (debug only)&amp;lt;br&amp;gt;&lt;br /&gt;
resync&amp;lt;br&amp;gt;&lt;br /&gt;
take&amp;lt;br&amp;gt;&lt;br /&gt;
luarules&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=10949</id>
		<title>LuaCallinReturn</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=10949"/>
		<updated>2009-08-31T17:10:48Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
===Lua Call-Ins, with parameters===&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-size:90%&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;Here are the known reserved parameter values for all Lua Call-Ins.  If you add new Call-Ins to Spring, please document them here.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Commands, general-purpose:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Shutdown()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;LayoutButtons()&amp;lt;/font&amp;gt; --&amp;gt; unknown, please document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ConfigureLayout()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;command&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandNotify()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;id, params, options&amp;quot;, where id = the CommandID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;KeyPress()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;key, mods, isRepeat&amp;quot;, where key = keymap, mods = SHIFT, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;KeyRelease()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MouseMove()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, dx, dy, button&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MousePress()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, button&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MouseRelease()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, button&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;IsAbove()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y&amp;quot; where x,y = screen coordinates.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GetTooltip()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y&amp;quot; where x,y = screen coordinates.  Returns WorldTooltip.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AddConsoleLine()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;msg, priority&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowCommand()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag, synced&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandFallback()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandsChanged()&amp;lt;/font&amp;gt; --&amp;gt; unknown (none?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitCreation()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitDefID, builderID, builderTeam, x, y, z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitTransfer()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, oldTeam, newTeam, capture&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitBuildStep()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;builderID, builderTeam, unitID, unitDefID, part&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowFeatureCreation()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureDefID, teamID, x, y, z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowFeatureBuildStep()&amp;lt;/font&amp;gt; --&amp;gt; unknown, please document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowResourceLevel()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;teamID, res, level&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowResourceTransfer()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;teamID, res, level&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unit-Specific:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitPreDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, damage, paralyzer, weaponID, attackerID, attackerDefID, attackerTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, damage, paralyzer, weaponID, attackerID, attackerDefID, attackerTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot; ... I hope that&#039;s self-explanatory&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitFinished()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitFromFactory()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, factID, factDefID, userOrders&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitTaken()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, newTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitGiven()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, oldTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitIdle()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCommand()&amp;lt;/font&amp;gt; --&amp;gt;  unknown, please document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitSeismicPing()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, z, strength&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredRadar()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredLos()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftRadar()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftLos()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLoaded()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, transportID, transportTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitUnloaded()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID, transportID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCloaked()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDecloaked)&amp;lt;/font&amp;gt;--&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitMoveFailed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;StockpileChanged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, weaponNum, oldCount, newCount&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredWater()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredAir()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftWater()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftAir()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Feature-Specific:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;FeatureCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureID, allyTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;FeatureDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureID, allyTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;TerraformComplete()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, buildUnitID, buildUnitDefID, buildUnitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCmdDone()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdTag&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Drawing:==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawGenesis()&amp;lt;/font&amp;gt; --&amp;gt; none.  Don&#039;t render here.&lt;br /&gt;
&lt;br /&gt;
* Spring draws the sky, the map, some water types, and unit selection.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawWorldPreUnit()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
* Spring draws units, features, some water types, cloaked units, and the sun.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawWorld()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
* Spring draws command queues, &#039;map stuff&#039;, and map marks.&lt;br /&gt;
&lt;br /&gt;
Each unit might also have a DrawUnit call, [[Lua_UnitRendering|enabled here.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawUnit(unitID,DrawMode)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
With enum DrawMode {&amp;lt;br&amp;gt;&lt;br /&gt;
	notDrawing     = 0,&amp;lt;br&amp;gt;&lt;br /&gt;
	normalDraw     = 1,&amp;lt;br&amp;gt;&lt;br /&gt;
	shadowDraw     = 2,&amp;lt;br&amp;gt;&lt;br /&gt;
	reflectionDraw = 3,&amp;lt;br&amp;gt;&lt;br /&gt;
	refractionDraw = 4&amp;lt;br&amp;gt;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawScreenEffects()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;vsx, vsy&amp;quot; where vsx, vsy are screen coords.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawScreen()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawInMiniMap()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;sx, sy&amp;quot; where sx,sy are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldShadow()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldReflection()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldRefraction()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
==Game Events:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Explosion()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;weaponID, px, py, pz, ownerID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ShockFront()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;power, dx, dy, dz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameFrame()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;frameNum&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CobCallback()&amp;lt;/font&amp;gt; --&amp;gt; unknown, marked FIXME.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GroupChanged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;groupID&amp;quot; where groupID is the value of Group whose table value changed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;WorldTooltip()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;ttType, data1, data2, data3&amp;quot; special, should be documented in detail.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GamePreload()&amp;lt;/font&amp;gt;  --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameStart()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameOver()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;TeamDied()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;TeamID&amp;quot; where TeamID = the team that has been eliminated.&lt;br /&gt;
&lt;br /&gt;
==Projectiles:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ProjectileCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;proID, proOwnerID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ProjectileDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;proID&amp;quot;&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=10948</id>
		<title>LuaCallinReturn</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=LuaCallinReturn&amp;diff=10948"/>
		<updated>2009-08-31T17:10:16Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-size:300%&amp;quot;&amp;gt;Lua Call-Ins, with parameters&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font style=&amp;quot;font-size:90%&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;Here are the known reserved parameter values for all Lua Call-Ins.  If you add new Call-Ins to Spring, please document them here.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Commands, general-purpose:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Shutdown()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;LayoutButtons()&amp;lt;/font&amp;gt; --&amp;gt; unknown, please document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ConfigureLayout()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;command&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandNotify()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;id, params, options&amp;quot;, where id = the CommandID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;KeyPress()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;key, mods, isRepeat&amp;quot;, where key = keymap, mods = SHIFT, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;KeyRelease()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MouseMove()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, dx, dy, button&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MousePress()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, button&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;MouseRelease()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, button&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;IsAbove()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y&amp;quot; where x,y = screen coordinates.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GetTooltip()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y&amp;quot; where x,y = screen coordinates.  Returns WorldTooltip.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AddConsoleLine()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;msg, priority&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowCommand()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag, synced&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandFallback()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CommandsChanged()&amp;lt;/font&amp;gt; --&amp;gt; unknown (none?)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitCreation()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitDefID, builderID, builderTeam, x, y, z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitTransfer()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, oldTeam, newTeam, capture&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowUnitBuildStep()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;builderID, builderTeam, unitID, unitDefID, part&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowFeatureCreation()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureDefID, teamID, x, y, z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowFeatureBuildStep()&amp;lt;/font&amp;gt; --&amp;gt; unknown, please document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowResourceLevel()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;teamID, res, level&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;AllowResourceTransfer()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;teamID, res, level&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unit-Specific:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitPreDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, damage, paralyzer, weaponID, attackerID, attackerDefID, attackerTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDamaged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, damage, paralyzer, weaponID, attackerID, attackerDefID, attackerTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot; ... I hope that&#039;s self-explanatory&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitFinished()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitFromFactory()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, factID, factDefID, userOrders&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitTaken()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, newTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitGiven()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, oldTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitIdle()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCommand()&amp;lt;/font&amp;gt; --&amp;gt;  unknown, please document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitSeismicPing()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;x, y, z, strength&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredRadar()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredLos()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftRadar()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftLos()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLoaded()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, transportID, transportTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitUnloaded()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID, transportID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCloaked()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitDecloaked)&amp;lt;/font&amp;gt;--&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitMoveFailed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;StockpileChanged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, weaponNum, oldCount, newCount&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredWater()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitEnteredAir()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftWater()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitLeftAir()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, teamID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Feature-Specific:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;FeatureCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureID, allyTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;FeatureDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;featureID, allyTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;TerraformComplete()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, buildUnitID, buildUnitDefID, buildUnitTeam&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;UnitCmdDone()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;unitID, unitDefID, unitTeam, cmdID, cmdTag&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Drawing:==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawGenesis()&amp;lt;/font&amp;gt; --&amp;gt; none.  Don&#039;t render here.&lt;br /&gt;
&lt;br /&gt;
* Spring draws the sky, the map, some water types, and unit selection.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawWorldPreUnit()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
* Spring draws units, features, some water types, cloaked units, and the sun.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;font color=#55ee99&amp;gt;DrawWorld()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
* Spring draws command queues, &#039;map stuff&#039;, and map marks.&lt;br /&gt;
&lt;br /&gt;
Each unit might also have a DrawUnit call, [[Lua_UnitRendering|enabled here.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawUnit(unitID,DrawMode)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
With enum DrawMode {&amp;lt;br&amp;gt;&lt;br /&gt;
	notDrawing     = 0,&amp;lt;br&amp;gt;&lt;br /&gt;
	normalDraw     = 1,&amp;lt;br&amp;gt;&lt;br /&gt;
	shadowDraw     = 2,&amp;lt;br&amp;gt;&lt;br /&gt;
	reflectionDraw = 3,&amp;lt;br&amp;gt;&lt;br /&gt;
	refractionDraw = 4&amp;lt;br&amp;gt;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawScreenEffects()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;vsx, vsy&amp;quot; where vsx, vsy are screen coords.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawScreen()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawInMiniMap()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;sx, sy&amp;quot; where sx,sy are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldShadow()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldReflection()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;DrawWorldRefraction()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
==Game Events:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;Explosion()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;weaponID, px, py, pz, ownerID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ShockFront()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;power, dx, dy, dz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameFrame()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;frameNum&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;CobCallback()&amp;lt;/font&amp;gt; --&amp;gt; unknown, marked FIXME.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GroupChanged()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;groupID&amp;quot; where groupID is the value of Group whose table value changed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;WorldTooltip()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;ttType, data1, data2, data3&amp;quot; special, should be documented in detail.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GamePreload()&amp;lt;/font&amp;gt;  --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameStart()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;GameOver()&amp;lt;/font&amp;gt; --&amp;gt; none.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;TeamDied()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;TeamID&amp;quot; where TeamID = the team that has been eliminated.&lt;br /&gt;
&lt;br /&gt;
==Projectiles:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ProjectileCreated()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;proID, proOwnerID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=#55ee99&amp;gt;ProjectileDestroyed()&amp;lt;/font&amp;gt; --&amp;gt; &amp;quot;proID&amp;quot;&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_BitOps&amp;diff=11128</id>
		<title>Lua BitOps</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_BitOps&amp;diff=11128"/>
		<updated>2009-08-31T17:10:07Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Bit Operators ==&lt;br /&gt;
&#039;&#039;&#039;math.bit_and&#039;&#039;&#039;&lt;br /&gt;
  ( int a1 [, int a2 [, ... ] ] ) -&amp;gt; int i&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;math.bit_or&#039;&#039;&#039;&lt;br /&gt;
  ( int a1 [, int a2 [, ... ] ] ) -&amp;gt; int i&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;math.bit_xor&#039;&#039;&#039;&lt;br /&gt;
  ( int a1 [, int a2 [, ... ] ] ) -&amp;gt; int i&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;math.bit_inv&#039;&#039;&#039;&lt;br /&gt;
  ( int a1 ) -&amp;gt; int i&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;math.bit_bits&#039;&#039;&#039; &amp;lt;font color=#55ee99&amp;gt; (result = result | (1 &amp;lt;&amp;lt; aX);)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( int a1 [, int a2 [, ... ] ] ) -&amp;gt; int i&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_Scream&amp;diff=11578</id>
		<title>Lua Scream</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_Scream&amp;diff=11578"/>
		<updated>2009-08-31T17:10:01Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Scream UserData Object ==&lt;br /&gt;
&#039;&#039;&#039;Script.CreateScream&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; userdata scream&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This creates an userdata object, which calls a special&lt;br /&gt;
  user-defined function, when the object gets destroyed&lt;br /&gt;
  (-&amp;gt;garbage collector).&lt;br /&gt;
  You use it like the follow:&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;local myScream = Script.CreateScream()&#039;&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;myScream.func  = function() Spring.Echo(&amp;quot;AHHHHHH&amp;quot;) end&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_VFS&amp;diff=12440</id>
		<title>Lua VFS</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_VFS&amp;diff=12440"/>
		<updated>2009-08-31T17:09:55Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Modes ==&lt;br /&gt;
&#039;&#039;&#039;VFS.RAW&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.MOD&#039;&#039;&#039; &amp;lt;font color=red&amp;gt;(unimplemented, acts like VFS.ZIP)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.MAP&#039;&#039;&#039; &amp;lt;font color=red&amp;gt;(unimplemented, acts like VFS.ZIP)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.BASE&#039;&#039;&#039; &amp;lt;font color=red&amp;gt;(unimplemented, acts like VFS.ZIP)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.ZIP&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.RAW_FIRST&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.ZIP_FIRST&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.RAW_ONLY&#039;&#039;&#039; &amp;lt;font color=#55ee99&amp;gt;(same as VFS.RAW)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.ZIP_ONLY&#039;&#039;&#039; &amp;lt;font color=#55ee99&amp;gt;(same as VFS.ZIP)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files ==&lt;br /&gt;
&#039;&#039;&#039;VFS.Include&#039;&#039;&#039; &amp;lt;font color=#55ee99&amp;gt;(if enviroment=nil then use current one)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, table enviroment [, number mode ] ] ) -&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;VFS.LoadFile&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; nil | lstring data&lt;br /&gt;
&#039;&#039;&#039;VFS.FileExists&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;VFS.DirList&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;directory&amp;quot; [, string &amp;quot;pattern&amp;quot;  [, number mode ] ] )&lt;br /&gt;
    -&amp;gt; { [1] = string filename, ... }&lt;br /&gt;
&#039;&#039;&#039;VFS.SubDirs&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;directory&amp;quot;, [, string &amp;quot;pattern&amp;quot; = &amp;quot;*&amp;quot;  [, number mode ] ] )&lt;br /&gt;
    -&amp;gt; { [1] = string subdir1, ... }&lt;br /&gt;
&#039;&#039;&#039;VFS.UseArchive&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;unsynced only!&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ], lua_function [, arg1 [,arg2 ]] )&lt;br /&gt;
    -&amp;gt; result1,result2,... of the given lua_function&lt;br /&gt;
&lt;br /&gt;
== Packing ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot; style=&amp;quot;font-size:110%&amp;quot;&amp;gt;The Pack- and Unpack-functions are used to convert numbers-&amp;gt;strings and strings-&amp;gt;numbers.&lt;br /&gt;
So you can read a binary file and then convert the received strings back to numbers and the other way around. Also you can use it in combination with the SendLuaXYZMsg-functions.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackU8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackU16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackU32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackS8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackS16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackS32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackF32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;arguments are:&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackX( number arg1, number arg2, number arg3, ... )&#039;&#039;&#039; -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackX( {[1]=number,[2]=number,..} )&#039;&#039;&#039; -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackU8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackU16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackU32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackS8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackS16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackS32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackF32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;arguments are:&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackX( string &amp;quot;binary&amp;quot; [, number offset ] [, number count] )&#039;&#039;&#039;&lt;br /&gt;
  -&amp;gt; number | table { [1]=number,[2]=number,.. }&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_PathFinder&amp;diff=11532</id>
		<title>Lua PathFinder</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_PathFinder&amp;diff=11532"/>
		<updated>2009-08-31T17:09:52Z</updated>

		<summary type="html">&lt;p&gt;Aegis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== PathFinder ==&lt;br /&gt;
&#039;&#039;&#039;Spring.RequestPath&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;MoveTypeName&amp;quot; | number moveID,&lt;br /&gt;
    number start_x, number start_y, number start_z,&lt;br /&gt;
    number end_x,   number end_y,   number end_z&lt;br /&gt;
    [, number radius = 8 ]&lt;br /&gt;
  ) -&amp;gt; nil | pathObject path &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(see bellow)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Path UserData Object ==&lt;br /&gt;
&#039;&#039;&#039;Path.GetEstimatedPath&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | {&lt;br /&gt;
     [1] = { x,y,z }, ...&lt;br /&gt;
   },{&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;GetUnitEstimatedPath() returns 2 tables:&lt;br /&gt;
    1 table with the waypoints and 1 table with 3 indices (in the waypoint table)&lt;br /&gt;
    when a new (more lazy) pathfinding algorithm  begins.&lt;br /&gt;
    So the waypoint table contains 3 different levels of details.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Path.Next&#039;&#039;&#039;&lt;br /&gt;
  ( number pos_x, number pos_y, number pos_z,&lt;br /&gt;
    [, number radius = 0 ]&lt;br /&gt;
  ) -&amp;gt; nil | number x, number y, number z&lt;/div&gt;</summary>
		<author><name>Aegis</name></author>
	</entry>
</feed>