<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.openclonk.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Isilkor</id>
	<title>OpenClonk Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.openclonk.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Isilkor"/>
	<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/w/Special:Contributions/Isilkor"/>
	<updated>2026-04-28T22:42:17Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.44.5</generator>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=1582</id>
		<title>Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=1582"/>
		<updated>2014-11-23T23:01:20Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: /* Line endings */ Mercurial is history&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document specifies the preferred source code style of files inside the&lt;br /&gt;
OpenClonk source tree. Some of the style rules are also stated implicitly&lt;br /&gt;
inside the examples.&lt;br /&gt;
&lt;br /&gt;
=== All-encompassing Guidelines ===&lt;br /&gt;
==== Line endings ====&lt;br /&gt;
Use a single line feed character (ASCII 10) for line endings.&lt;br /&gt;
&lt;br /&gt;
==== Indentation ====&lt;br /&gt;
Indent your code with tabs (ASCII 9). Use space (ASCII 32) for all other&lt;br /&gt;
formatting.&lt;br /&gt;
&lt;br /&gt;
==== Braces ====&lt;br /&gt;
Braces are on their own line, on the same level of indentation as the&lt;br /&gt;
structure they belong to. You may add braces around single statements in&lt;br /&gt;
&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements if the first block or an &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; block has them.&lt;br /&gt;
&lt;br /&gt;
 if (count &amp;lt; 10)&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;Too few thingies!&amp;quot;);&lt;br /&gt;
 	AddMore();&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;We have enough&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Spaces ====&lt;br /&gt;
Function names are not followed by space. Commas are. No space follows opening&lt;br /&gt;
brackets (&amp;quot;[&amp;quot;) or parentheses (&amp;quot;(&amp;quot;). Also no space preceeds closing brackets&lt;br /&gt;
(&amp;quot;]&amp;quot;) or parentheses (&amp;quot;)&amp;quot;), or commas. &amp;quot;::&amp;quot;, &amp;quot;-&amp;gt;&amp;quot;, &amp;quot;.&amp;quot; and unary operators do not&lt;br /&gt;
require spaces. Other binary operators do.&lt;br /&gt;
&lt;br /&gt;
Keywords (&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; etc.) are followed by a space.&lt;br /&gt;
&lt;br /&gt;
==== Parentheses ====&lt;br /&gt;
Do not use parentheses unless they are required for precedence or the code&lt;br /&gt;
gets confusing without them. Remember other people may have confusion&lt;br /&gt;
thresholds different from you.&lt;br /&gt;
&lt;br /&gt;
==== Control Structures ====&lt;br /&gt;
Control structures with a single statements are written without braces. If the&lt;br /&gt;
statement spans multiple lines, you may add braces for readability. Structures&lt;br /&gt;
without a statement contain a comment denoting this.&lt;br /&gt;
&lt;br /&gt;
 while (*dest++ = *src++)&lt;br /&gt;
 	/* empty */;&lt;br /&gt;
&lt;br /&gt;
Cascades in a &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; statement are marked by a FALLTHROUGH&lt;br /&gt;
comment. Code that cannot be reached has an assertion. &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt; elements&lt;br /&gt;
are not indented.&lt;br /&gt;
&lt;br /&gt;
 switch (foo)&lt;br /&gt;
 {&lt;br /&gt;
 case FOO_HEX:&lt;br /&gt;
 	accept_hex = true;&lt;br /&gt;
 	// FALLTHROUGH&lt;br /&gt;
 case FOO_DEC:&lt;br /&gt;
 	accept_num = true;&lt;br /&gt;
 	break;&lt;br /&gt;
 default:&lt;br /&gt;
 	assert(!&amp;quot;Invalid foo value&amp;quot;);&lt;br /&gt;
 	// Do something meaningful here anyway, if possible;&lt;br /&gt;
 	// try to not leave the program in an ill-defined state.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
 // Single-line comments look like this&lt;br /&gt;
&lt;br /&gt;
 // Multi-line comments look like this. Using C++-style comments&lt;br /&gt;
 // helps if you need to comment out large pieces of code later, or if the length of&lt;br /&gt;
 // the comment changes over time. Of course you could still use #if 0 ... #endif&lt;br /&gt;
 // to achieve that.&lt;br /&gt;
&lt;br /&gt;
 /* You may also write multi-line comments like this. Make sure you write enough&lt;br /&gt;
    text to warrant a multi-line comment. Also be sure to write in full sentences. */&lt;br /&gt;
&lt;br /&gt;
==== Type Casting ====&lt;br /&gt;
Do not use C-style or function style casts. Use a template cast instead.&lt;br /&gt;
&lt;br /&gt;
=== Source File Layout ===&lt;br /&gt;
==== Copyright Header ====&lt;br /&gt;
Every source file begins with a copyright header. If you make significant&lt;br /&gt;
changes to the code, you may (but are not required to) add your name to the&lt;br /&gt;
list of copyright holders in &amp;lt;tt&amp;gt;COPYING&amp;lt;/tt&amp;gt;. If you choose to add yourself, use your real name,&lt;br /&gt;
not a nickname. Legally recognized pseudonyms are accepted, as are names of&lt;br /&gt;
legal entities.&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * OpenClonk, http://www.openclonk.org&lt;br /&gt;
  *&lt;br /&gt;
  * Copyright (c) 2009-2014, The OpenClonk Team and contributors&lt;br /&gt;
  *&lt;br /&gt;
  * Other legalese goes here, but has been omitted for brevity. See an&lt;br /&gt;
  * existing file for a template.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
The copyright header is followed by an empty line. Put a comment explaining&lt;br /&gt;
the purpose of the file next, and leave another blank line after this.&lt;br /&gt;
&lt;br /&gt;
==== Inclusion Guards ====&lt;br /&gt;
If you are writing a header file, use #include guards. If your file is called&lt;br /&gt;
&#039;&#039;C4Foo.h&#039;&#039;, your guard should be &amp;lt;tt&amp;gt;INC_&#039;&#039;C4Foo&#039;&#039;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 #ifndef INC_C4Foo&lt;br /&gt;
 #define INC_C4Foo&lt;br /&gt;
 class C4Foo;&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO: Precompiled headers.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== #include Directives ====&lt;br /&gt;
Include local headers first. Put the filename in double quotes, and use&lt;br /&gt;
forward slashes as directory separators.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;Standard.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;StdBuf.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Leave a blank line before system headers. Use angle brackets to include these,&lt;br /&gt;
and sort them alphabetically.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;map&amp;gt;&lt;br /&gt;
 #include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Declarations ===&lt;br /&gt;
==== Preprocessor Macros ====&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; values in headers. Use &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; instead, or&lt;br /&gt;
&amp;lt;tt&amp;gt;enum&amp;lt;/tt&amp;gt; if you are declaring an enumeration.&lt;br /&gt;
&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; inline functions either, use &amp;lt;tt&amp;gt;inline&amp;lt;/tt&amp;gt;. If your&lt;br /&gt;
functions need to work on multiple data types, overload the function or write&lt;br /&gt;
a &amp;lt;tt&amp;gt;template&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If, despite of the above, you still need to write a macro, use an all-uppercase&lt;br /&gt;
name. If your macro contains a compound statement, enclose it in a &amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;&lt;br /&gt;
loop to allow its use in &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements. A terminating semicolon&lt;br /&gt;
should be provided at the place of invocation. This makes parsing the source&lt;br /&gt;
easier for pretty-printers and editors. Consider undefining your macro when&lt;br /&gt;
you are done using it.&lt;br /&gt;
&lt;br /&gt;
 #define FOO(a, b) do { \&lt;br /&gt;
 	bar += (a); \&lt;br /&gt;
 	bar /= (b); \&lt;br /&gt;
 } while(0)&lt;br /&gt;
&lt;br /&gt;
==== Data Types ====&lt;br /&gt;
Do not use the Win32 style integer declarations &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; and&lt;br /&gt;
&amp;lt;tt&amp;gt;BOOL&amp;lt;/tt&amp;gt; except when interfacing with the Windows API. If you need a guarantee about the size of your variables, use&lt;br /&gt;
the C99 types &amp;lt;tt&amp;gt;int&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;uint&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt;. If you don&#039;t&lt;br /&gt;
need that guarantee, use &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. If you need a variable that is large&lt;br /&gt;
enough to store a pointer on your current platform, use &amp;lt;tt&amp;gt;intptr_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you come across code that still uses Win32 types, consider changing it if&lt;br /&gt;
you are working on code in the vicinity. Don&#039;t commit changes that only&lt;br /&gt;
consist of replacing &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;uint32_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When declaring a pointer, put a space in front of the asterisk, and none&lt;br /&gt;
after. This saves some confusion when declaring multiple variables at once.&lt;br /&gt;
The same goes for references.&lt;br /&gt;
&lt;br /&gt;
 int *foo, *bar;&lt;br /&gt;
 char *Qux(const char *quux);&lt;br /&gt;
&lt;br /&gt;
==== Functions ====&lt;br /&gt;
Functions that are not used outside of the containing file are placed inside&lt;br /&gt;
of an anonymous namespace.&lt;br /&gt;
&lt;br /&gt;
 namespace&lt;br /&gt;
 {&lt;br /&gt;
 	int Frobnicate(const char *foo);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Functions that are used across multiple files are prototyped inside a common&lt;br /&gt;
header. The prototypes should be grouped where appropriate, and ordered&lt;br /&gt;
logically or, failing that, alphabetically.&lt;br /&gt;
&lt;br /&gt;
Function and class names begin with a capital letter, and use camel casing. If&lt;br /&gt;
you need to embed acronyms inside the name, pretend the acronym was all lower&lt;br /&gt;
case. Member variables use the same convention, but begin with a lower case&lt;br /&gt;
letter. Do not use hungarian prefixes.&lt;br /&gt;
&lt;br /&gt;
 XmlDocument *ParseXmlFile(const char *file);&lt;br /&gt;
&lt;br /&gt;
When passing arguments that may be changed by the called function, pass them&lt;br /&gt;
as pointers. This makes it obvious that they may be changed. Use constant&lt;br /&gt;
references for all other parameters, unless they are a primitive type.&lt;br /&gt;
&lt;br /&gt;
==== Class Members ====&lt;br /&gt;
No class member variable should be declared &amp;lt;tt&amp;gt;public&amp;lt;/tt&amp;gt; unless necessary.&lt;br /&gt;
Consider using &amp;lt;tt&amp;gt;GetFoo&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SetFoo&amp;lt;/tt&amp;gt; accessors. If you want to &lt;br /&gt;
declare a compound data type that allows direct access to its members, use&lt;br /&gt;
&amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;. Do not add more functions than constructors, destructors, and&lt;br /&gt;
assignment operators to &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
Mark all class members that do not change the visible state of the object&lt;br /&gt;
&amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt;. If you need to modify internal state that is not visible from&lt;br /&gt;
outside of the class, mark the state variable &amp;lt;tt&amp;gt;mutable&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=1581</id>
		<title>Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=1581"/>
		<updated>2014-11-23T23:00:22Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: /* Copyright Header */ Authors have been moved to the COPYING file&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document specifies the preferred source code style of files inside the&lt;br /&gt;
OpenClonk source tree. Some of the style rules are also stated implicitly&lt;br /&gt;
inside the examples.&lt;br /&gt;
&lt;br /&gt;
=== All-encompassing Guidelines ===&lt;br /&gt;
==== Line endings ====&lt;br /&gt;
Use a single line feed character (ASCII 10) for line endings. Mercurial provides&lt;br /&gt;
an extension named &#039;&#039;win32text&#039;&#039; you can use to auto-convert files from your&lt;br /&gt;
OS&#039;s native format to single LF and vice-versa.&lt;br /&gt;
&lt;br /&gt;
==== Indentation ====&lt;br /&gt;
Indent your code with tabs (ASCII 9). Use space (ASCII 32) for all other&lt;br /&gt;
formatting.&lt;br /&gt;
&lt;br /&gt;
==== Braces ====&lt;br /&gt;
Braces are on their own line, on the same level of indentation as the&lt;br /&gt;
structure they belong to. You may add braces around single statements in&lt;br /&gt;
&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements if the first block or an &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; block has them.&lt;br /&gt;
&lt;br /&gt;
 if (count &amp;lt; 10)&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;Too few thingies!&amp;quot;);&lt;br /&gt;
 	AddMore();&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;We have enough&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Spaces ====&lt;br /&gt;
Function names are not followed by space. Commas are. No space follows opening&lt;br /&gt;
brackets (&amp;quot;[&amp;quot;) or parentheses (&amp;quot;(&amp;quot;). Also no space preceeds closing brackets&lt;br /&gt;
(&amp;quot;]&amp;quot;) or parentheses (&amp;quot;)&amp;quot;), or commas. &amp;quot;::&amp;quot;, &amp;quot;-&amp;gt;&amp;quot;, &amp;quot;.&amp;quot; and unary operators do not&lt;br /&gt;
require spaces. Other binary operators do.&lt;br /&gt;
&lt;br /&gt;
Keywords (&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; etc.) are followed by a space.&lt;br /&gt;
&lt;br /&gt;
==== Parentheses ====&lt;br /&gt;
Do not use parentheses unless they are required for precedence or the code&lt;br /&gt;
gets confusing without them. Remember other people may have confusion&lt;br /&gt;
thresholds different from you.&lt;br /&gt;
&lt;br /&gt;
==== Control Structures ====&lt;br /&gt;
Control structures with a single statements are written without braces. If the&lt;br /&gt;
statement spans multiple lines, you may add braces for readability. Structures&lt;br /&gt;
without a statement contain a comment denoting this.&lt;br /&gt;
&lt;br /&gt;
 while (*dest++ = *src++)&lt;br /&gt;
 	/* empty */;&lt;br /&gt;
&lt;br /&gt;
Cascades in a &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; statement are marked by a FALLTHROUGH&lt;br /&gt;
comment. Code that cannot be reached has an assertion. &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt; elements&lt;br /&gt;
are not indented.&lt;br /&gt;
&lt;br /&gt;
 switch (foo)&lt;br /&gt;
 {&lt;br /&gt;
 case FOO_HEX:&lt;br /&gt;
 	accept_hex = true;&lt;br /&gt;
 	// FALLTHROUGH&lt;br /&gt;
 case FOO_DEC:&lt;br /&gt;
 	accept_num = true;&lt;br /&gt;
 	break;&lt;br /&gt;
 default:&lt;br /&gt;
 	assert(!&amp;quot;Invalid foo value&amp;quot;);&lt;br /&gt;
 	// Do something meaningful here anyway, if possible;&lt;br /&gt;
 	// try to not leave the program in an ill-defined state.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
 // Single-line comments look like this&lt;br /&gt;
&lt;br /&gt;
 // Multi-line comments look like this. Using C++-style comments&lt;br /&gt;
 // helps if you need to comment out large pieces of code later, or if the length of&lt;br /&gt;
 // the comment changes over time. Of course you could still use #if 0 ... #endif&lt;br /&gt;
 // to achieve that.&lt;br /&gt;
&lt;br /&gt;
 /* You may also write multi-line comments like this. Make sure you write enough&lt;br /&gt;
    text to warrant a multi-line comment. Also be sure to write in full sentences. */&lt;br /&gt;
&lt;br /&gt;
==== Type Casting ====&lt;br /&gt;
Do not use C-style or function style casts. Use a template cast instead.&lt;br /&gt;
&lt;br /&gt;
=== Source File Layout ===&lt;br /&gt;
==== Copyright Header ====&lt;br /&gt;
Every source file begins with a copyright header. If you make significant&lt;br /&gt;
changes to the code, you may (but are not required to) add your name to the&lt;br /&gt;
list of copyright holders in &amp;lt;tt&amp;gt;COPYING&amp;lt;/tt&amp;gt;. If you choose to add yourself, use your real name,&lt;br /&gt;
not a nickname. Legally recognized pseudonyms are accepted, as are names of&lt;br /&gt;
legal entities.&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * OpenClonk, http://www.openclonk.org&lt;br /&gt;
  *&lt;br /&gt;
  * Copyright (c) 2009-2014, The OpenClonk Team and contributors&lt;br /&gt;
  *&lt;br /&gt;
  * Other legalese goes here, but has been omitted for brevity. See an&lt;br /&gt;
  * existing file for a template.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
The copyright header is followed by an empty line. Put a comment explaining&lt;br /&gt;
the purpose of the file next, and leave another blank line after this.&lt;br /&gt;
&lt;br /&gt;
==== Inclusion Guards ====&lt;br /&gt;
If you are writing a header file, use #include guards. If your file is called&lt;br /&gt;
&#039;&#039;C4Foo.h&#039;&#039;, your guard should be &amp;lt;tt&amp;gt;INC_&#039;&#039;C4Foo&#039;&#039;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 #ifndef INC_C4Foo&lt;br /&gt;
 #define INC_C4Foo&lt;br /&gt;
 class C4Foo;&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO: Precompiled headers.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== #include Directives ====&lt;br /&gt;
Include local headers first. Put the filename in double quotes, and use&lt;br /&gt;
forward slashes as directory separators.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;Standard.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;StdBuf.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Leave a blank line before system headers. Use angle brackets to include these,&lt;br /&gt;
and sort them alphabetically.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;map&amp;gt;&lt;br /&gt;
 #include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Declarations ===&lt;br /&gt;
==== Preprocessor Macros ====&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; values in headers. Use &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; instead, or&lt;br /&gt;
&amp;lt;tt&amp;gt;enum&amp;lt;/tt&amp;gt; if you are declaring an enumeration.&lt;br /&gt;
&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; inline functions either, use &amp;lt;tt&amp;gt;inline&amp;lt;/tt&amp;gt;. If your&lt;br /&gt;
functions need to work on multiple data types, overload the function or write&lt;br /&gt;
a &amp;lt;tt&amp;gt;template&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If, despite of the above, you still need to write a macro, use an all-uppercase&lt;br /&gt;
name. If your macro contains a compound statement, enclose it in a &amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;&lt;br /&gt;
loop to allow its use in &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements. A terminating semicolon&lt;br /&gt;
should be provided at the place of invocation. This makes parsing the source&lt;br /&gt;
easier for pretty-printers and editors. Consider undefining your macro when&lt;br /&gt;
you are done using it.&lt;br /&gt;
&lt;br /&gt;
 #define FOO(a, b) do { \&lt;br /&gt;
 	bar += (a); \&lt;br /&gt;
 	bar /= (b); \&lt;br /&gt;
 } while(0)&lt;br /&gt;
&lt;br /&gt;
==== Data Types ====&lt;br /&gt;
Do not use the Win32 style integer declarations &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; and&lt;br /&gt;
&amp;lt;tt&amp;gt;BOOL&amp;lt;/tt&amp;gt; except when interfacing with the Windows API. If you need a guarantee about the size of your variables, use&lt;br /&gt;
the C99 types &amp;lt;tt&amp;gt;int&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;uint&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt;. If you don&#039;t&lt;br /&gt;
need that guarantee, use &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. If you need a variable that is large&lt;br /&gt;
enough to store a pointer on your current platform, use &amp;lt;tt&amp;gt;intptr_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you come across code that still uses Win32 types, consider changing it if&lt;br /&gt;
you are working on code in the vicinity. Don&#039;t commit changes that only&lt;br /&gt;
consist of replacing &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;uint32_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When declaring a pointer, put a space in front of the asterisk, and none&lt;br /&gt;
after. This saves some confusion when declaring multiple variables at once.&lt;br /&gt;
The same goes for references.&lt;br /&gt;
&lt;br /&gt;
 int *foo, *bar;&lt;br /&gt;
 char *Qux(const char *quux);&lt;br /&gt;
&lt;br /&gt;
==== Functions ====&lt;br /&gt;
Functions that are not used outside of the containing file are placed inside&lt;br /&gt;
of an anonymous namespace.&lt;br /&gt;
&lt;br /&gt;
 namespace&lt;br /&gt;
 {&lt;br /&gt;
 	int Frobnicate(const char *foo);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Functions that are used across multiple files are prototyped inside a common&lt;br /&gt;
header. The prototypes should be grouped where appropriate, and ordered&lt;br /&gt;
logically or, failing that, alphabetically.&lt;br /&gt;
&lt;br /&gt;
Function and class names begin with a capital letter, and use camel casing. If&lt;br /&gt;
you need to embed acronyms inside the name, pretend the acronym was all lower&lt;br /&gt;
case. Member variables use the same convention, but begin with a lower case&lt;br /&gt;
letter. Do not use hungarian prefixes.&lt;br /&gt;
&lt;br /&gt;
 XmlDocument *ParseXmlFile(const char *file);&lt;br /&gt;
&lt;br /&gt;
When passing arguments that may be changed by the called function, pass them&lt;br /&gt;
as pointers. This makes it obvious that they may be changed. Use constant&lt;br /&gt;
references for all other parameters, unless they are a primitive type.&lt;br /&gt;
&lt;br /&gt;
==== Class Members ====&lt;br /&gt;
No class member variable should be declared &amp;lt;tt&amp;gt;public&amp;lt;/tt&amp;gt; unless necessary.&lt;br /&gt;
Consider using &amp;lt;tt&amp;gt;GetFoo&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SetFoo&amp;lt;/tt&amp;gt; accessors. If you want to &lt;br /&gt;
declare a compound data type that allows direct access to its members, use&lt;br /&gt;
&amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;. Do not add more functions than constructors, destructors, and&lt;br /&gt;
assignment operators to &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
Mark all class members that do not change the visible state of the object&lt;br /&gt;
&amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt;. If you need to modify internal state that is not visible from&lt;br /&gt;
outside of the class, mark the state variable &amp;lt;tt&amp;gt;mutable&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=1415</id>
		<title>Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=1415"/>
		<updated>2013-11-11T14:52:19Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: /* Data Types */ Win32 typedefs are fine when interfacing with WinAPI&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document specifies the preferred source code style of files inside the&lt;br /&gt;
OpenClonk source tree. Some of the style rules are also stated implicitly&lt;br /&gt;
inside the examples.&lt;br /&gt;
&lt;br /&gt;
=== All-encompassing Guidelines ===&lt;br /&gt;
==== Line endings ====&lt;br /&gt;
Use a single line feed character (ASCII 10) for line endings. Mercurial provides&lt;br /&gt;
an extension named &#039;&#039;win32text&#039;&#039; you can use to auto-convert files from your&lt;br /&gt;
OS&#039;s native format to single LF and vice-versa.&lt;br /&gt;
&lt;br /&gt;
==== Indentation ====&lt;br /&gt;
Indent your code with tabs (ASCII 9). Use space (ASCII 32) for all other&lt;br /&gt;
formatting.&lt;br /&gt;
&lt;br /&gt;
==== Braces ====&lt;br /&gt;
Braces are on their own line, on the same level of indentation as the&lt;br /&gt;
structure they belong to. You may add braces around single statements in&lt;br /&gt;
&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements if the first block or an &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; block has them.&lt;br /&gt;
&lt;br /&gt;
 if (count &amp;lt; 10)&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;Too few thingies!&amp;quot;);&lt;br /&gt;
 	AddMore();&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;We have enough&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Spaces ====&lt;br /&gt;
Function names are not followed by space. Commas are. No space follows opening&lt;br /&gt;
brackets (&amp;quot;[&amp;quot;) or parentheses (&amp;quot;(&amp;quot;). Also no space preceeds closing brackets&lt;br /&gt;
(&amp;quot;]&amp;quot;) or parentheses (&amp;quot;)&amp;quot;), or commas. &amp;quot;::&amp;quot;, &amp;quot;-&amp;gt;&amp;quot;, &amp;quot;.&amp;quot; and unary operators do not&lt;br /&gt;
require spaces. Other binary operators do.&lt;br /&gt;
&lt;br /&gt;
Keywords (&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; etc.) are followed by a space.&lt;br /&gt;
&lt;br /&gt;
==== Parentheses ====&lt;br /&gt;
Do not use parentheses unless they are required for precedence or the code&lt;br /&gt;
gets confusing without them. Remember other people may have confusion&lt;br /&gt;
thresholds different from you.&lt;br /&gt;
&lt;br /&gt;
==== Control Structures ====&lt;br /&gt;
Control structures with a single statements are written without braces. If the&lt;br /&gt;
statement spans multiple lines, you may add braces for readability. Structures&lt;br /&gt;
without a statement contain a comment denoting this.&lt;br /&gt;
&lt;br /&gt;
 while (*dest++ = *src++)&lt;br /&gt;
 	/* empty */;&lt;br /&gt;
&lt;br /&gt;
Cascades in a &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; statement are marked by a FALLTHROUGH&lt;br /&gt;
comment. Code that cannot be reached has an assertion. &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt; elements&lt;br /&gt;
are not indented.&lt;br /&gt;
&lt;br /&gt;
 switch (foo)&lt;br /&gt;
 {&lt;br /&gt;
 case FOO_HEX:&lt;br /&gt;
 	accept_hex = true;&lt;br /&gt;
 	// FALLTHROUGH&lt;br /&gt;
 case FOO_DEC:&lt;br /&gt;
 	accept_num = true;&lt;br /&gt;
 	break;&lt;br /&gt;
 default:&lt;br /&gt;
 	assert(!&amp;quot;Invalid foo value&amp;quot;);&lt;br /&gt;
 	// Do something meaningful here anyway, if possible;&lt;br /&gt;
 	// try to not leave the program in an ill-defined state.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
 // Single-line comments look like this&lt;br /&gt;
&lt;br /&gt;
 // Multi-line comments look like this. Using C++-style comments&lt;br /&gt;
 // helps if you need to comment out large pieces of code later, or if the length of&lt;br /&gt;
 // the comment changes over time. Of course you could still use #if 0 ... #endif&lt;br /&gt;
 // to achieve that.&lt;br /&gt;
&lt;br /&gt;
 /* You may also write multi-line comments like this. Make sure you write enough&lt;br /&gt;
    text to warrant a multi-line comment. Also be sure to write in full sentences. */&lt;br /&gt;
&lt;br /&gt;
==== Type Casting ====&lt;br /&gt;
Do not use C-style or function style casts. Use a template cast instead.&lt;br /&gt;
&lt;br /&gt;
=== Source File Layout ===&lt;br /&gt;
==== Copyright Header ====&lt;br /&gt;
Every source file begins with a copyright header. If you make significant&lt;br /&gt;
changes to the code, you may (but are not required to) add your name to the&lt;br /&gt;
list of copyright holders. If you choose to add yourself, use your real name,&lt;br /&gt;
not a nickname. Legally recognized pseudonyms are accepted, as are names of&lt;br /&gt;
legal entities. If you don&#039;t want to add yourself, you may add the catch-all&lt;br /&gt;
copyright attribution phrase, if it does not already exist.&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * OpenClonk, http://www.openclonk.org&lt;br /&gt;
  *&lt;br /&gt;
  * Copyright (c) 2000-2009  John Doe&lt;br /&gt;
  * Copyright (c) 2005  Jane Q. Public&lt;br /&gt;
  *&lt;br /&gt;
  * Portions might be copyrighted by other authors who have contributed&lt;br /&gt;
  * to OpenClonk.&lt;br /&gt;
  *&lt;br /&gt;
  * Other legalese goes here, but has been omitted for brevity. See an&lt;br /&gt;
  * existing file for a template.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
The copyright header is followed by an empty line. Put a comment explaining&lt;br /&gt;
the purpose of the file next, and leave another blank line after this.&lt;br /&gt;
&lt;br /&gt;
==== Inclusion Guards ====&lt;br /&gt;
If you are writing a header file, use #include guards. If your file is called&lt;br /&gt;
&#039;&#039;C4Foo.h&#039;&#039;, your guard should be &amp;lt;tt&amp;gt;INC_&#039;&#039;C4Foo&#039;&#039;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 #ifndef INC_C4Foo&lt;br /&gt;
 #define INC_C4Foo&lt;br /&gt;
 class C4Foo;&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO: Precompiled headers.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== #include Directives ====&lt;br /&gt;
Include local headers first. Put the filename in double quotes, and use&lt;br /&gt;
forward slashes as directory separators.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;Standard.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;StdBuf.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Leave a blank line before system headers. Use angle brackets to include these,&lt;br /&gt;
and sort them alphabetically.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;map&amp;gt;&lt;br /&gt;
 #include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Declarations ===&lt;br /&gt;
==== Preprocessor Macros ====&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; values in headers. Use &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; instead, or&lt;br /&gt;
&amp;lt;tt&amp;gt;enum&amp;lt;/tt&amp;gt; if you are declaring an enumeration.&lt;br /&gt;
&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; inline functions either, use &amp;lt;tt&amp;gt;inline&amp;lt;/tt&amp;gt;. If your&lt;br /&gt;
functions need to work on multiple data types, overload the function or write&lt;br /&gt;
a &amp;lt;tt&amp;gt;template&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If, despite of the above, you still need to write a macro, use an all-uppercase&lt;br /&gt;
name. If your macro contains a compound statement, enclose it in a &amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;&lt;br /&gt;
loop to allow its use in &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements. A terminating semicolon&lt;br /&gt;
should be provided at the place of invocation. This makes parsing the source&lt;br /&gt;
easier for pretty-printers and editors. Consider undefining your macro when&lt;br /&gt;
you are done using it.&lt;br /&gt;
&lt;br /&gt;
 #define FOO(a, b) do { \&lt;br /&gt;
 	bar += (a); \&lt;br /&gt;
 	bar /= (b); \&lt;br /&gt;
 } while(0)&lt;br /&gt;
&lt;br /&gt;
==== Data Types ====&lt;br /&gt;
Do not use the Win32 style integer declarations &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; and&lt;br /&gt;
&amp;lt;tt&amp;gt;BOOL&amp;lt;/tt&amp;gt; except when interfacing with the Windows API. If you need a guarantee about the size of your variables, use&lt;br /&gt;
the C99 types &amp;lt;tt&amp;gt;int&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;uint&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt;. If you don&#039;t&lt;br /&gt;
need that guarantee, use &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. If you need a variable that is large&lt;br /&gt;
enough to store a pointer on your current platform, use &amp;lt;tt&amp;gt;intptr_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you come across code that still uses Win32 types, consider changing it if&lt;br /&gt;
you are working on code in the vicinity. Don&#039;t commit changes that only&lt;br /&gt;
consist of replacing &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;uint32_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When declaring a pointer, put a space in front of the asterisk, and none&lt;br /&gt;
after. This saves some confusion when declaring multiple variables at once.&lt;br /&gt;
The same goes for references.&lt;br /&gt;
&lt;br /&gt;
 int *foo, *bar;&lt;br /&gt;
 char *Qux(const char *quux);&lt;br /&gt;
&lt;br /&gt;
==== Functions ====&lt;br /&gt;
Functions that are not used outside of the containing file are placed inside&lt;br /&gt;
of an anonymous namespace.&lt;br /&gt;
&lt;br /&gt;
 namespace&lt;br /&gt;
 {&lt;br /&gt;
 	int Frobnicate(const char *foo);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Functions that are used across multiple files are prototyped inside a common&lt;br /&gt;
header. The prototypes should be grouped where appropriate, and ordered&lt;br /&gt;
logically or, failing that, alphabetically.&lt;br /&gt;
&lt;br /&gt;
Function and class names begin with a capital letter, and use camel casing. If&lt;br /&gt;
you need to embed acronyms inside the name, pretend the acronym was all lower&lt;br /&gt;
case. Member variables use the same convention, but begin with a lower case&lt;br /&gt;
letter. Do not use hungarian prefixes.&lt;br /&gt;
&lt;br /&gt;
 XmlDocument *ParseXmlFile(const char *file);&lt;br /&gt;
&lt;br /&gt;
When passing arguments that may be changed by the called function, pass them&lt;br /&gt;
as pointers. This makes it obvious that they may be changed. Use constant&lt;br /&gt;
references for all other parameters, unless they are a primitive type.&lt;br /&gt;
&lt;br /&gt;
==== Class Members ====&lt;br /&gt;
No class member variable should be declared &amp;lt;tt&amp;gt;public&amp;lt;/tt&amp;gt; unless necessary.&lt;br /&gt;
Consider using &amp;lt;tt&amp;gt;GetFoo&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SetFoo&amp;lt;/tt&amp;gt; accessors. If you want to &lt;br /&gt;
declare a compound data type that allows direct access to its members, use&lt;br /&gt;
&amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;. Do not add more functions than constructors, destructors, and&lt;br /&gt;
assignment operators to &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
Mark all class members that do not change the visible state of the object&lt;br /&gt;
&amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt;. If you need to modify internal state that is not visible from&lt;br /&gt;
outside of the class, mark the state variable &amp;lt;tt&amp;gt;mutable&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Code_Reviews&amp;diff=1394</id>
		<title>Code Reviews</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Code_Reviews&amp;diff=1394"/>
		<updated>2013-10-27T16:13:24Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: Add short &amp;quot;How to Crucible&amp;quot; overview&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The OpenClonk project is using [https://www.atlassian.com/software/crucible/overview Atlassian Crucible] to conduct code reviews. Code reviews help to improve the quality of our source code by having more than one set of eyes look at it.&lt;br /&gt;
&lt;br /&gt;
==Request a Code Review==&lt;br /&gt;
To start a code review, either as a reviewer or a reviewee, [http://crucible.openclonk.org/ log into Crucible] and click the &#039;&#039;Create Review&#039;&#039; button in your toolbar. You will be asked to select a project for the review; use the one that most closely fits the patch you want to review. If no project fits well, you can use the OpenClonk project (OC) as a fall-back choice. Afterwards, click the &#039;&#039;Create Review&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
Once you have created the review in a specific project, you will have to add content to the review. [[#Review an un-pushed patch|If your code has not yet been pushed, you will have to generate a patch file and upload that.]] [[#Review a pushed changeset|If the code is already contained in the master repository, you can select the changeset directly.]]&lt;br /&gt;
&lt;br /&gt;
===Review an un-pushed patch===&lt;br /&gt;
To review a patch that has not yet been pushed to the master repository, use the &#039;&#039;Pre-commit&#039;&#039; link. You will be asked to upload or paste a patch file. How to generate this file differs depending on the Git UI you&#039;re using; for the command line UI, it works as follows:&lt;br /&gt;
&lt;br /&gt;
If you have staged, but not committed your changes:&lt;br /&gt;
:&amp;lt;tt&amp;gt;$ git diff --cached &amp;gt; some-file-name.patch&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have already committed your changes:&lt;br /&gt;
:&amp;lt;tt&amp;gt;$ git diff HEAD~ &amp;gt; some-file-name.patch&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will emit a patch into the file &amp;lt;tt&amp;gt;some-file-name.patch&amp;lt;/tt&amp;gt;. This is the file you will want to upload to or paste into Crucible.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Note:&#039;&#039;&#039; Do not use the git format-patch command, as it will generate a file in mbox format instead of a plain patch.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Note:&#039;&#039;&#039; Crucible also offers a python script that promises easier review creation. Unfortunately it currently suffers from a bug that occasionally introduces a spurious whitespace change. As such we recommend you do not use it.&lt;br /&gt;
&lt;br /&gt;
Once uploaded, Crucible will try to anchor your patch to the OpenClonk repository. This will enable people reviewing the patch to see the complete source code of the files instead of just the changes. If this fails, it may mean that the patch does not cleanly apply to the most recent changeset on the master branch.&lt;br /&gt;
&lt;br /&gt;
If the patch successfully anchored to the repository, or you want to proceed regardless, click the &#039;&#039;Finish upload&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
===Review a pushed changeset===&lt;br /&gt;
To review a changeset that has already been pushed to the master repository, use the &#039;&#039;Browse Changesets&#039;&#039; link. You will be shown a list of your most recent changesets. Check the revision (or revisions) that you want to have reviewed.&lt;br /&gt;
&lt;br /&gt;
===Give the review a title===&lt;br /&gt;
Once you added the content to review, you should give the review a title so people know what to expect. To do this, click the &#039;&#039;Edit Details&#039;&#039; button.&lt;br /&gt;
If you added a changeset, the title will already be filled in with the title of the changeset. Otherwise, you&#039;ll have to enter one yourself. If you added a changeset, you can also change the author role of the review to the author of the changeset, so they know their code is being reviewed.&lt;br /&gt;
&lt;br /&gt;
Then, add some reviewers. If you are trying to review somebody else&#039;s code, this should include yourself. If you don&#039;t know who should review the code, you can have Crucible suggest somebody; you can also hop in the IRC channel and ask if somebody wants to do the review, or just leave it empty so people can join later. Make sure you leave the &#039;&#039;Allow anyone to join&#039;&#039; checkbox checked.&lt;br /&gt;
&lt;br /&gt;
Once that&#039;s all done, you can stop drafting the review and start it. To do that, click the &#039;&#039;Start Review&#039;&#039; button. If you did not specify any reviewers, you will get a warning message telling you so; confirm that you meant to do this and start handing out the review link. If you did specify reviewers, the people you chose will get an e-mail notification.&lt;br /&gt;
&lt;br /&gt;
==Mail settings==&lt;br /&gt;
By default, Crucible will send members of a review an e-mail notification about pretty much everything that happens. If you do not want to get your mailbox filled up, you should change your notification settings.&lt;br /&gt;
&lt;br /&gt;
To do that, click your profile picture in the top right corner of the screen and choose &#039;&#039;Profile settings&#039;&#039;. In there, go to the Review settings and switch some or all of the events to &#039;&#039;No&#039;&#039; or &#039;&#039;Batch&#039;&#039;. &#039;&#039;Batch&#039;&#039; will collect changes for about 30 minutes and then send an e-mail containing all changes that happened in the meantime.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Building_with_Windows&amp;diff=1347</id>
		<title>Building with Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Building_with_Windows&amp;diff=1347"/>
		<updated>2013-03-31T22:11:31Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: /* Get Dependencies */ How about I get the URLs right this time?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Get the sources =&lt;br /&gt;
&lt;br /&gt;
The source of OpenClonk is hold in a so-called version control system. Put simply, this is something that allows programmers to coordinate their work (see [[Git Workflow|the Git article]] for how that works). For the moment, it&#039;s just a couple of files you want to download.&lt;br /&gt;
&lt;br /&gt;
== Install TortoiseGit ==&lt;br /&gt;
&lt;br /&gt;
The notable difference to a simple download is that you need a special program to do it. Our version control system is Git, and we will use the [http://code.google.com/p/tortoisegit/ TortoiseGit] client. Follow that link and click &amp;quot;Download&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit.png|860px]]&lt;br /&gt;
&lt;br /&gt;
As the website tells you, the installation of TortoiseGit has two parts: TortoiseGit and msysGit. It also says that you should start with TortoiseGit, so let us get that installer first. Make sure to choose the right architecture for your version of Windows:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit2.png|860px]]&lt;br /&gt;
&lt;br /&gt;
And walk through the installation. Just selecting the default options should get you through alright.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;OpenClonk team members:&#039;&#039; If you want to use [http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html PuTTY] to push commits, make sure to select the appropriate option along the way. Do it again for the msysGit installation below.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit4.png]]&lt;br /&gt;
&lt;br /&gt;
Next, you need msysGit, which is what actually does all the work behind the scenes. Following the [http://code.google.com/p/msysgit/downloads/list?can=2&amp;amp;q=%22Full+installer+for+official+Git+for+Windows%22 &amp;quot;Full installer for official Git&amp;quot;] link will get you to another download page:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit3.png|860px]]&lt;br /&gt;
&lt;br /&gt;
This installation will ask even more confusing questions. But again default options won&#039;t cause anything to break, I would just recommend deactivating some GUI options, as TortoiseGit already offers them:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit5.png]]&lt;br /&gt;
&lt;br /&gt;
After a bit of waiting and (if you&#039;re lucky) not a single request to restart your computer, this should have given you a working TortoiseGit installation.&lt;br /&gt;
&lt;br /&gt;
== Clone ==&lt;br /&gt;
&lt;br /&gt;
Okay, now we are going to download the sources. Git calls this &amp;quot;cloning&amp;quot; because it&#039;s actually a lot more than just the sources you get. After you&#039;re done, you can check the [[Git Workflow]] page for how to work with your clone.&lt;br /&gt;
&lt;br /&gt;
For now, just find a place where you want the source to be, open the context menu by right-click and select &amp;quot;Git Clone...&amp;quot; from the TortoiseGit menu:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit6.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A dialog will appear asking for the repository URL and the destination path. In our case, we want the source to be the OpenClonk repository.  The URL you need is normally &amp;quot;git://git.openclonk.org/openclonk.git&amp;quot;.  Here&#039;s how it should look like:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;OpenClonk team members:&#039;&#039; Use &amp;quot;ssh://git@git.openclonk.org/openclonk.git&amp;quot; instead and activate the option to auto-load the PuTTY key for maximum convenience.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit_pub.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After pressing &amp;quot;OK&amp;quot;, TortoiseGit will work for a while. After watching a tortoise somersaulting for a while, it should finish. Congratulations, you now have the bleeding edge of OpenClonk development on your hard drive!&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit_finish.png]]&lt;br /&gt;
&lt;br /&gt;
This a lot of stuff and most likely you won&#039;t understand much of it. Here&#039;s a quick orientation guide of the actually important bits:&lt;br /&gt;
* &amp;quot;docs&amp;quot; - the sources of our [http://docs.openclonk.org/en/sdk/ documentation]&lt;br /&gt;
* &amp;quot;planet&amp;quot; - these are the game resources - scripts, graphics and everything to explain how to make a game out of them&lt;br /&gt;
* &amp;quot;src&amp;quot; - all the source code of the game engine. Lots of C++ ahead.&lt;br /&gt;
&lt;br /&gt;
= Get it to Compile =&lt;br /&gt;
&lt;br /&gt;
This is nice, but we are interested in seeing the game run, aren&#039;t we? For this, we need a program that will take all those C++ files and make an executable file out of it. Unfortunately, programming is complicated stuff so even setting up the tools and the environment has become a bit of science. But this won&#039;t stop us.&lt;br /&gt;
&lt;br /&gt;
== Get Microsoft Visual Studio ==&lt;br /&gt;
&lt;br /&gt;
You can say what you want about Microsoft, but they sure make nice development environments. And they are even giving a lot of it away for free. We will use [http://www.microsoft.com/visualstudio/eng/downloads#d-2012-express Visual Studio C++ 2012]. Follow that link, find the 2012 Express Edition &#039;&#039;&#039;for Windows Desktop&#039;&#039;&#039;, then download the [http://go.microsoft.com/?linkid=9816758 web installer]:&lt;br /&gt;
&lt;br /&gt;
[[File:msvc11_web_download.png|860px|Make extra sure you got the &amp;quot;Windows Desktop&amp;quot; variant.]]&lt;br /&gt;
&lt;br /&gt;
Run it, accept the licensing terms, click the big &amp;quot;Install&amp;quot; link and accept the UAC prompt.&lt;br /&gt;
&lt;br /&gt;
Then go make a coffee because the install will probably take a while. If the setup asks you to restart your computer, do so; it will continue when you log back in.&lt;br /&gt;
&lt;br /&gt;
== Get Dependencies ==&lt;br /&gt;
&lt;br /&gt;
Like most big programs, OpenClonk doesn&#039;t stand on its own. Some things (like opening PNG images) were already programmed by other programers far better than we could ever do. This is why we have to get a few so-called &amp;quot;libraries&amp;quot; before Clonk can be built.&lt;br /&gt;
&lt;br /&gt;
You could expend some effort try to find, download, and compile all those libraries by yourself, but that would take quite some time. Instead, just download one of the packages we&#039;ve provided for your convenience. If you&#039;re trying to build a 32-bit binary of OpenClonk or you don&#039;t really know what this is all about, use [http://www.nosebud.de/~nh/openclonk/openclonk-deps-vc110-i386.zip the x86 package]; for a 64-bit binary, use [http://www.nosebud.de/~nh/openclonk/openclonk-deps-vc110-amd64.zip the amd64 package]. Then unpack its contents into the same directory you put all the other files (but keep the &amp;quot;deps&amp;quot; folder intact).&lt;br /&gt;
&lt;br /&gt;
== Get CMake ==&lt;br /&gt;
&lt;br /&gt;
Before all this becomes useful, we still need something that tells the compiler &#039;&#039;how&#039;&#039; all those sources and libraries should be compiled together.&lt;br /&gt;
&lt;br /&gt;
For this, Visual C++ needs a project file. But there is none - we have to consult &#039;&#039;another&#039;&#039; program to generate it for us. This might seem confusing - but the point is that there are a lot of build environments besides Visual Studio, and having all those project files next to each other would become a problem in the long run.&lt;br /&gt;
&lt;br /&gt;
What we need is [http://www.cmake.org/cmake/resources/software.html#latest CMake]. Follow that link and download the installer:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake1.png|860px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You know what to do.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After the installation, start the CMake GUI from the start menu. Put the path you cloned the repository into the source code path field.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now click the &amp;quot;Configure&amp;quot; button in the lower left. It will ask what compiler we want to use. Select the compiler you want to use; either &amp;quot;Visual Studio 11&amp;quot; if you downloaded the 32-bit library package above, or &amp;quot;Visual Studio 11 Win64&amp;quot; if you got the 64-bit package.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake4.png]]&lt;br /&gt;
&lt;br /&gt;
If you get some error messages (in red), you&#039;re probably missing some dependencies. Don&#039;t worry if cmake complains about some missing paths, it shouldn&#039;t affect you.&lt;br /&gt;
&lt;br /&gt;
The last step is to click the &amp;quot;Generate&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Your First Build ==&lt;br /&gt;
&lt;br /&gt;
Okay, now we have everything needed to make OpenClonk run for the first time. Go into the source directory and double-click on the &amp;quot;openclonk.sln&amp;quot; file that should now have appeared:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_build1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Visual C++ should open and look similar to this:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_build2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We only want to build the engine, so select &amp;quot;openclonk&amp;quot; from the list, right-click and select &amp;quot;Set as Start-Up project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_build3.png]]&lt;br /&gt;
&lt;br /&gt;
Now press F5 (or, if you prefer, click the &amp;quot;Local Windows Debugger&amp;quot; button in the tool bar). Visual Studio will notice that you don&#039;t actually have a current compiled version of OpenClonk yet. Tell it to build one, and if you like also tell it to always just automatically build a new version using the check box.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_outofdate.png]]&lt;br /&gt;
&lt;br /&gt;
If all goes well, after a couple of minutes you&#039;ll be looking at the OpenClonk main menu.&lt;br /&gt;
&lt;br /&gt;
[[File:Openclonk_first_start.jpg]]&lt;br /&gt;
&lt;br /&gt;
In case you are wondering why OpenClonk suddenly starts in some kind of pseudo windowed mode: This is because we just built a debug build (note the &amp;quot;dbg&amp;quot; after the version?). This build is a bit slower but allows you to get a better look at the internals of the engine while it&#039;s running. Maybe we&#039;ll have another article about that soon.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Building_with_Windows&amp;diff=1346</id>
		<title>Building with Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Building_with_Windows&amp;diff=1346"/>
		<updated>2013-03-31T21:48:10Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: /* Get Dependencies */ Update packages for VS2012&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Get the sources =&lt;br /&gt;
&lt;br /&gt;
The source of OpenClonk is hold in a so-called version control system. Put simply, this is something that allows programmers to coordinate their work (see [[Git Workflow|the Git article]] for how that works). For the moment, it&#039;s just a couple of files you want to download.&lt;br /&gt;
&lt;br /&gt;
== Install TortoiseGit ==&lt;br /&gt;
&lt;br /&gt;
The notable difference to a simple download is that you need a special program to do it. Our version control system is Git, and we will use the [http://code.google.com/p/tortoisegit/ TortoiseGit] client. Follow that link and click &amp;quot;Download&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit.png|860px]]&lt;br /&gt;
&lt;br /&gt;
As the website tells you, the installation of TortoiseGit has two parts: TortoiseGit and msysGit. It also says that you should start with TortoiseGit, so let us get that installer first. Make sure to choose the right architecture for your version of Windows:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit2.png|860px]]&lt;br /&gt;
&lt;br /&gt;
And walk through the installation. Just selecting the default options should get you through alright.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;OpenClonk team members:&#039;&#039; If you want to use [http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html PuTTY] to push commits, make sure to select the appropriate option along the way. Do it again for the msysGit installation below.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit4.png]]&lt;br /&gt;
&lt;br /&gt;
Next, you need msysGit, which is what actually does all the work behind the scenes. Following the [http://code.google.com/p/msysgit/downloads/list?can=2&amp;amp;q=%22Full+installer+for+official+Git+for+Windows%22 &amp;quot;Full installer for official Git&amp;quot;] link will get you to another download page:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit3.png|860px]]&lt;br /&gt;
&lt;br /&gt;
This installation will ask even more confusing questions. But again default options won&#039;t cause anything to break, I would just recommend deactivating some GUI options, as TortoiseGit already offers them:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit5.png]]&lt;br /&gt;
&lt;br /&gt;
After a bit of waiting and (if you&#039;re lucky) not a single request to restart your computer, this should have given you a working TortoiseGit installation.&lt;br /&gt;
&lt;br /&gt;
== Clone ==&lt;br /&gt;
&lt;br /&gt;
Okay, now we are going to download the sources. Git calls this &amp;quot;cloning&amp;quot; because it&#039;s actually a lot more than just the sources you get. After you&#039;re done, you can check the [[Git Workflow]] page for how to work with your clone.&lt;br /&gt;
&lt;br /&gt;
For now, just find a place where you want the source to be, open the context menu by right-click and select &amp;quot;Git Clone...&amp;quot; from the TortoiseGit menu:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit6.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A dialog will appear asking for the repository URL and the destination path. In our case, we want the source to be the OpenClonk repository.  The URL you need is normally &amp;quot;git://git.openclonk.org/openclonk.git&amp;quot;.  Here&#039;s how it should look like:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;OpenClonk team members:&#039;&#039; Use &amp;quot;ssh://git@git.openclonk.org/openclonk.git&amp;quot; instead and activate the option to auto-load the PuTTY key for maximum convenience.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit_pub.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After pressing &amp;quot;OK&amp;quot;, TortoiseGit will work for a while. After watching a tortoise somersaulting for a while, it should finish. Congratulations, you now have the bleeding edge of OpenClonk development on your hard drive!&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit_finish.png]]&lt;br /&gt;
&lt;br /&gt;
This a lot of stuff and most likely you won&#039;t understand much of it. Here&#039;s a quick orientation guide of the actually important bits:&lt;br /&gt;
* &amp;quot;docs&amp;quot; - the sources of our [http://docs.openclonk.org/en/sdk/ documentation]&lt;br /&gt;
* &amp;quot;planet&amp;quot; - these are the game resources - scripts, graphics and everything to explain how to make a game out of them&lt;br /&gt;
* &amp;quot;src&amp;quot; - all the source code of the game engine. Lots of C++ ahead.&lt;br /&gt;
&lt;br /&gt;
= Get it to Compile =&lt;br /&gt;
&lt;br /&gt;
This is nice, but we are interested in seeing the game run, aren&#039;t we? For this, we need a program that will take all those C++ files and make an executable file out of it. Unfortunately, programming is complicated stuff so even setting up the tools and the environment has become a bit of science. But this won&#039;t stop us.&lt;br /&gt;
&lt;br /&gt;
== Get Microsoft Visual Studio ==&lt;br /&gt;
&lt;br /&gt;
You can say what you want about Microsoft, but they sure make nice development environments. And they are even giving a lot of it away for free. We will use [http://www.microsoft.com/visualstudio/eng/downloads#d-2012-express Visual Studio C++ 2012]. Follow that link, find the 2012 Express Edition &#039;&#039;&#039;for Windows Desktop&#039;&#039;&#039;, then download the [http://go.microsoft.com/?linkid=9816758 web installer]:&lt;br /&gt;
&lt;br /&gt;
[[File:msvc11_web_download.png|860px|Make extra sure you got the &amp;quot;Windows Desktop&amp;quot; variant.]]&lt;br /&gt;
&lt;br /&gt;
Run it, accept the licensing terms, click the big &amp;quot;Install&amp;quot; link and accept the UAC prompt.&lt;br /&gt;
&lt;br /&gt;
Then go make a coffee because the install will probably take a while. If the setup asks you to restart your computer, do so; it will continue when you log back in.&lt;br /&gt;
&lt;br /&gt;
== Get Dependencies ==&lt;br /&gt;
&lt;br /&gt;
Like most big programs, OpenClonk doesn&#039;t stand on its own. Some things (like opening PNG images) were already programmed by other programers far better than we could ever do. This is why we have to get a few so-called &amp;quot;libraries&amp;quot; before Clonk can be built.&lt;br /&gt;
&lt;br /&gt;
You could expend some effort try to find, download, and compile all those libraries by yourself, but that would take quite some time. Instead, just download one of the packages we&#039;ve provided for your convenience. If you&#039;re trying to build a 32-bit binary of OpenClonk or you don&#039;t really know what this is all about, use [http://www.nosebud.de/~nh/openclonk-deps-vc110-i386.zip the x86 package]; for a 64-bit binary, use [http://www.nosebud.de/~nh/openclonk-deps-vc110-amd64.zip the amd64 package]. Then unpack its contents into the same directory you put all the other files (but keep the &amp;quot;deps&amp;quot; folder intact).&lt;br /&gt;
&lt;br /&gt;
== Get CMake ==&lt;br /&gt;
&lt;br /&gt;
Before all this becomes useful, we still need something that tells the compiler &#039;&#039;how&#039;&#039; all those sources and libraries should be compiled together.&lt;br /&gt;
&lt;br /&gt;
For this, Visual C++ needs a project file. But there is none - we have to consult &#039;&#039;another&#039;&#039; program to generate it for us. This might seem confusing - but the point is that there are a lot of build environments besides Visual Studio, and having all those project files next to each other would become a problem in the long run.&lt;br /&gt;
&lt;br /&gt;
What we need is [http://www.cmake.org/cmake/resources/software.html#latest CMake]. Follow that link and download the installer:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake1.png|860px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You know what to do.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After the installation, start the CMake GUI from the start menu. Put the path you cloned the repository into the source code path field.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now click the &amp;quot;Configure&amp;quot; button in the lower left. It will ask what compiler we want to use. Select the compiler you want to use; either &amp;quot;Visual Studio 11&amp;quot; if you downloaded the 32-bit library package above, or &amp;quot;Visual Studio 11 Win64&amp;quot; if you got the 64-bit package.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake4.png]]&lt;br /&gt;
&lt;br /&gt;
If you get some error messages (in red), you&#039;re probably missing some dependencies. Don&#039;t worry if cmake complains about some missing paths, it shouldn&#039;t affect you.&lt;br /&gt;
&lt;br /&gt;
The last step is to click the &amp;quot;Generate&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Your First Build ==&lt;br /&gt;
&lt;br /&gt;
Okay, now we have everything needed to make OpenClonk run for the first time. Go into the source directory and double-click on the &amp;quot;openclonk.sln&amp;quot; file that should now have appeared:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_build1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Visual C++ should open and look similar to this:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_build2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We only want to build the engine, so select &amp;quot;openclonk&amp;quot; from the list, right-click and select &amp;quot;Set as Start-Up project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_build3.png]]&lt;br /&gt;
&lt;br /&gt;
Now press F5 (or, if you prefer, click the &amp;quot;Local Windows Debugger&amp;quot; button in the tool bar). Visual Studio will notice that you don&#039;t actually have a current compiled version of OpenClonk yet. Tell it to build one, and if you like also tell it to always just automatically build a new version using the check box.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_outofdate.png]]&lt;br /&gt;
&lt;br /&gt;
If all goes well, after a couple of minutes you&#039;ll be looking at the OpenClonk main menu.&lt;br /&gt;
&lt;br /&gt;
[[File:Openclonk_first_start.jpg]]&lt;br /&gt;
&lt;br /&gt;
In case you are wondering why OpenClonk suddenly starts in some kind of pseudo windowed mode: This is because we just built a debug build (note the &amp;quot;dbg&amp;quot; after the version?). This build is a bit slower but allows you to get a better look at the internals of the engine while it&#039;s running. Maybe we&#039;ll have another article about that soon.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=File:Build_windows_build1.png&amp;diff=1345</id>
		<title>File:Build windows build1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=File:Build_windows_build1.png&amp;diff=1345"/>
		<updated>2013-03-31T21:37:33Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: uploaded a new version of &amp;amp;quot;File:Build windows build1.png&amp;amp;quot;: Update to MSVS 2012&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=File:Build_windows_outofdate.png&amp;diff=1344</id>
		<title>File:Build windows outofdate.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=File:Build_windows_outofdate.png&amp;diff=1344"/>
		<updated>2013-03-31T21:36:16Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Building_with_Windows&amp;diff=1343</id>
		<title>Building with Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Building_with_Windows&amp;diff=1343"/>
		<updated>2013-03-31T21:35:57Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: /* Your First Build */ Update for 2012&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Get the sources =&lt;br /&gt;
&lt;br /&gt;
The source of OpenClonk is hold in a so-called version control system. Put simply, this is something that allows programmers to coordinate their work (see [[Git Workflow|the Git article]] for how that works). For the moment, it&#039;s just a couple of files you want to download.&lt;br /&gt;
&lt;br /&gt;
== Install TortoiseGit ==&lt;br /&gt;
&lt;br /&gt;
The notable difference to a simple download is that you need a special program to do it. Our version control system is Git, and we will use the [http://code.google.com/p/tortoisegit/ TortoiseGit] client. Follow that link and click &amp;quot;Download&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit.png|860px]]&lt;br /&gt;
&lt;br /&gt;
As the website tells you, the installation of TortoiseGit has two parts: TortoiseGit and msysGit. It also says that you should start with TortoiseGit, so let us get that installer first. Make sure to choose the right architecture for your version of Windows:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit2.png|860px]]&lt;br /&gt;
&lt;br /&gt;
And walk through the installation. Just selecting the default options should get you through alright.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;OpenClonk team members:&#039;&#039; If you want to use [http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html PuTTY] to push commits, make sure to select the appropriate option along the way. Do it again for the msysGit installation below.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit4.png]]&lt;br /&gt;
&lt;br /&gt;
Next, you need msysGit, which is what actually does all the work behind the scenes. Following the [http://code.google.com/p/msysgit/downloads/list?can=2&amp;amp;q=%22Full+installer+for+official+Git+for+Windows%22 &amp;quot;Full installer for official Git&amp;quot;] link will get you to another download page:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit3.png|860px]]&lt;br /&gt;
&lt;br /&gt;
This installation will ask even more confusing questions. But again default options won&#039;t cause anything to break, I would just recommend deactivating some GUI options, as TortoiseGit already offers them:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit5.png]]&lt;br /&gt;
&lt;br /&gt;
After a bit of waiting and (if you&#039;re lucky) not a single request to restart your computer, this should have given you a working TortoiseGit installation.&lt;br /&gt;
&lt;br /&gt;
== Clone ==&lt;br /&gt;
&lt;br /&gt;
Okay, now we are going to download the sources. Git calls this &amp;quot;cloning&amp;quot; because it&#039;s actually a lot more than just the sources you get. After you&#039;re done, you can check the [[Git Workflow]] page for how to work with your clone.&lt;br /&gt;
&lt;br /&gt;
For now, just find a place where you want the source to be, open the context menu by right-click and select &amp;quot;Git Clone...&amp;quot; from the TortoiseGit menu:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit6.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A dialog will appear asking for the repository URL and the destination path. In our case, we want the source to be the OpenClonk repository.  The URL you need is normally &amp;quot;git://git.openclonk.org/openclonk.git&amp;quot;.  Here&#039;s how it should look like:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;OpenClonk team members:&#039;&#039; Use &amp;quot;ssh://git@git.openclonk.org/openclonk.git&amp;quot; instead and activate the option to auto-load the PuTTY key for maximum convenience.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit_pub.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After pressing &amp;quot;OK&amp;quot;, TortoiseGit will work for a while. After watching a tortoise somersaulting for a while, it should finish. Congratulations, you now have the bleeding edge of OpenClonk development on your hard drive!&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit_finish.png]]&lt;br /&gt;
&lt;br /&gt;
This a lot of stuff and most likely you won&#039;t understand much of it. Here&#039;s a quick orientation guide of the actually important bits:&lt;br /&gt;
* &amp;quot;docs&amp;quot; - the sources of our [http://docs.openclonk.org/en/sdk/ documentation]&lt;br /&gt;
* &amp;quot;planet&amp;quot; - these are the game resources - scripts, graphics and everything to explain how to make a game out of them&lt;br /&gt;
* &amp;quot;src&amp;quot; - all the source code of the game engine. Lots of C++ ahead.&lt;br /&gt;
&lt;br /&gt;
= Get it to Compile =&lt;br /&gt;
&lt;br /&gt;
This is nice, but we are interested in seeing the game run, aren&#039;t we? For this, we need a program that will take all those C++ files and make an executable file out of it. Unfortunately, programming is complicated stuff so even setting up the tools and the environment has become a bit of science. But this won&#039;t stop us.&lt;br /&gt;
&lt;br /&gt;
== Get Microsoft Visual Studio ==&lt;br /&gt;
&lt;br /&gt;
You can say what you want about Microsoft, but they sure make nice development environments. And they are even giving a lot of it away for free. We will use [http://www.microsoft.com/visualstudio/eng/downloads#d-2012-express Visual Studio C++ 2012]. Follow that link, find the 2012 Express Edition &#039;&#039;&#039;for Windows Desktop&#039;&#039;&#039;, then download the [http://go.microsoft.com/?linkid=9816758 web installer]:&lt;br /&gt;
&lt;br /&gt;
[[File:msvc11_web_download.png|860px|Make extra sure you got the &amp;quot;Windows Desktop&amp;quot; variant.]]&lt;br /&gt;
&lt;br /&gt;
Run it, accept the licensing terms, click the big &amp;quot;Install&amp;quot; link and accept the UAC prompt.&lt;br /&gt;
&lt;br /&gt;
Then go make a coffee because the install will probably take a while. If the setup asks you to restart your computer, do so; it will continue when you log back in.&lt;br /&gt;
&lt;br /&gt;
== Get Dependencies ==&lt;br /&gt;
&lt;br /&gt;
Like most big programs, OpenClonk doesn&#039;t stand on its own. Some things (like opening PNG images) were already programmed by other programers far better than we could ever do. This is why we have to get a few so-called &amp;quot;libraries&amp;quot; before Clonk can be built.&lt;br /&gt;
&lt;br /&gt;
You could try to search and download all those libraries by hand, but that would be pretty boring. Instead, just download [http://www.openclonk.org/openclonk-deps-vc90.zip this package] that contains everything you need to build Clonk.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_deps.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Unpack both directories into the same path you put all the other files. Don&#039;t worry, nothing will get overwritten in &amp;quot;planet&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Get CMake ==&lt;br /&gt;
&lt;br /&gt;
Before all this becomes useful, we still need something that tells the compiler &#039;&#039;how&#039;&#039; all those sources and libraries should be compiled together.&lt;br /&gt;
&lt;br /&gt;
For this, Visual C++ needs a project file. But there is none - we have to consult &#039;&#039;another&#039;&#039; program to generate it for us. This might seem confusing - but the point is that there are a lot of build environments besides Visual Studio, and having all those project files next to each other would become a problem in the long run.&lt;br /&gt;
&lt;br /&gt;
What we need is [http://www.cmake.org/cmake/resources/software.html#latest CMake]. Follow that link and download the installer:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake1.png|860px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You know what to do.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After the installation, start the CMake GUI from the start menu. Put the path you cloned the repository into the source code path field.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now click the &amp;quot;Configure&amp;quot; button in the lower left. It will ask what compiler we want to use. Select the compiler you want to use; either &amp;quot;Visual Studio 11&amp;quot; if you downloaded the 32-bit library package above, or &amp;quot;Visual Studio 11 Win64&amp;quot; if you got the 64-bit package.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake4.png]]&lt;br /&gt;
&lt;br /&gt;
If you get some error messages (in red), you&#039;re probably missing some dependencies. Don&#039;t worry if cmake complains about some missing paths, it shouldn&#039;t affect you.&lt;br /&gt;
&lt;br /&gt;
The last step is to click the &amp;quot;Generate&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Your First Build ==&lt;br /&gt;
&lt;br /&gt;
Okay, now we have everything needed to make OpenClonk run for the first time. Go into the source directory and double-click on the &amp;quot;openclonk.sln&amp;quot; file that should now have appeared:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_build1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Visual C++ should open and look similar to this:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_build2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We only want to build the engine, so select &amp;quot;openclonk&amp;quot; from the list, right-click and select &amp;quot;Set as Start-Up project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_build3.png]]&lt;br /&gt;
&lt;br /&gt;
Now press F5 (or, if you prefer, click the &amp;quot;Local Windows Debugger&amp;quot; button in the tool bar). Visual Studio will notice that you don&#039;t actually have a current compiled version of OpenClonk yet. Tell it to build one, and if you like also tell it to always just automatically build a new version using the check box.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_outofdate.png]]&lt;br /&gt;
&lt;br /&gt;
If all goes well, after a couple of minutes you&#039;ll be looking at the OpenClonk main menu.&lt;br /&gt;
&lt;br /&gt;
[[File:Openclonk_first_start.jpg]]&lt;br /&gt;
&lt;br /&gt;
In case you are wondering why OpenClonk suddenly starts in some kind of pseudo windowed mode: This is because we just built a debug build (note the &amp;quot;dbg&amp;quot; after the version?). This build is a bit slower but allows you to get a better look at the internals of the engine while it&#039;s running. Maybe we&#039;ll have another article about that soon.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=File:Build_windows_build3.png&amp;diff=1342</id>
		<title>File:Build windows build3.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=File:Build_windows_build3.png&amp;diff=1342"/>
		<updated>2013-03-31T21:30:39Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: uploaded a new version of &amp;amp;quot;File:Build windows build3.png&amp;amp;quot;: Update to VS2012 UI&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=File:Build_windows_build2.png&amp;diff=1341</id>
		<title>File:Build windows build2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=File:Build_windows_build2.png&amp;diff=1341"/>
		<updated>2013-03-31T21:27:46Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: uploaded a new version of &amp;amp;quot;File:Build windows build2.png&amp;amp;quot;: Now with more Visual Studio 2012&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=File:Build_windows_cmake4.png&amp;diff=1340</id>
		<title>File:Build windows cmake4.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=File:Build_windows_cmake4.png&amp;diff=1340"/>
		<updated>2013-03-31T21:20:48Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: uploaded a new version of &amp;amp;quot;File:Build windows cmake4.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Building_with_Windows&amp;diff=1339</id>
		<title>Building with Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Building_with_Windows&amp;diff=1339"/>
		<updated>2013-03-31T21:20:20Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: /* Get CMake */ Update for 2012&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Get the sources =&lt;br /&gt;
&lt;br /&gt;
The source of OpenClonk is hold in a so-called version control system. Put simply, this is something that allows programmers to coordinate their work (see [[Git Workflow|the Git article]] for how that works). For the moment, it&#039;s just a couple of files you want to download.&lt;br /&gt;
&lt;br /&gt;
== Install TortoiseGit ==&lt;br /&gt;
&lt;br /&gt;
The notable difference to a simple download is that you need a special program to do it. Our version control system is Git, and we will use the [http://code.google.com/p/tortoisegit/ TortoiseGit] client. Follow that link and click &amp;quot;Download&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit.png|860px]]&lt;br /&gt;
&lt;br /&gt;
As the website tells you, the installation of TortoiseGit has two parts: TortoiseGit and msysGit. It also says that you should start with TortoiseGit, so let us get that installer first. Make sure to choose the right architecture for your version of Windows:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit2.png|860px]]&lt;br /&gt;
&lt;br /&gt;
And walk through the installation. Just selecting the default options should get you through alright.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;OpenClonk team members:&#039;&#039; If you want to use [http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html PuTTY] to push commits, make sure to select the appropriate option along the way. Do it again for the msysGit installation below.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit4.png]]&lt;br /&gt;
&lt;br /&gt;
Next, you need msysGit, which is what actually does all the work behind the scenes. Following the [http://code.google.com/p/msysgit/downloads/list?can=2&amp;amp;q=%22Full+installer+for+official+Git+for+Windows%22 &amp;quot;Full installer for official Git&amp;quot;] link will get you to another download page:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit3.png|860px]]&lt;br /&gt;
&lt;br /&gt;
This installation will ask even more confusing questions. But again default options won&#039;t cause anything to break, I would just recommend deactivating some GUI options, as TortoiseGit already offers them:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit5.png]]&lt;br /&gt;
&lt;br /&gt;
After a bit of waiting and (if you&#039;re lucky) not a single request to restart your computer, this should have given you a working TortoiseGit installation.&lt;br /&gt;
&lt;br /&gt;
== Clone ==&lt;br /&gt;
&lt;br /&gt;
Okay, now we are going to download the sources. Git calls this &amp;quot;cloning&amp;quot; because it&#039;s actually a lot more than just the sources you get. After you&#039;re done, you can check the [[Git Workflow]] page for how to work with your clone.&lt;br /&gt;
&lt;br /&gt;
For now, just find a place where you want the source to be, open the context menu by right-click and select &amp;quot;Git Clone...&amp;quot; from the TortoiseGit menu:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit6.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A dialog will appear asking for the repository URL and the destination path. In our case, we want the source to be the OpenClonk repository.  The URL you need is normally &amp;quot;git://git.openclonk.org/openclonk.git&amp;quot;.  Here&#039;s how it should look like:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;OpenClonk team members:&#039;&#039; Use &amp;quot;ssh://git@git.openclonk.org/openclonk.git&amp;quot; instead and activate the option to auto-load the PuTTY key for maximum convenience.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit_pub.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After pressing &amp;quot;OK&amp;quot;, TortoiseGit will work for a while. After watching a tortoise somersaulting for a while, it should finish. Congratulations, you now have the bleeding edge of OpenClonk development on your hard drive!&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit_finish.png]]&lt;br /&gt;
&lt;br /&gt;
This a lot of stuff and most likely you won&#039;t understand much of it. Here&#039;s a quick orientation guide of the actually important bits:&lt;br /&gt;
* &amp;quot;docs&amp;quot; - the sources of our [http://docs.openclonk.org/en/sdk/ documentation]&lt;br /&gt;
* &amp;quot;planet&amp;quot; - these are the game resources - scripts, graphics and everything to explain how to make a game out of them&lt;br /&gt;
* &amp;quot;src&amp;quot; - all the source code of the game engine. Lots of C++ ahead.&lt;br /&gt;
&lt;br /&gt;
= Get it to Compile =&lt;br /&gt;
&lt;br /&gt;
This is nice, but we are interested in seeing the game run, aren&#039;t we? For this, we need a program that will take all those C++ files and make an executable file out of it. Unfortunately, programming is complicated stuff so even setting up the tools and the environment has become a bit of science. But this won&#039;t stop us.&lt;br /&gt;
&lt;br /&gt;
== Get Microsoft Visual Studio ==&lt;br /&gt;
&lt;br /&gt;
You can say what you want about Microsoft, but they sure make nice development environments. And they are even giving a lot of it away for free. We will use [http://www.microsoft.com/visualstudio/eng/downloads#d-2012-express Visual Studio C++ 2012]. Follow that link, find the 2012 Express Edition &#039;&#039;&#039;for Windows Desktop&#039;&#039;&#039;, then download the [http://go.microsoft.com/?linkid=9816758 web installer]:&lt;br /&gt;
&lt;br /&gt;
[[File:msvc11_web_download.png|860px|Make extra sure you got the &amp;quot;Windows Desktop&amp;quot; variant.]]&lt;br /&gt;
&lt;br /&gt;
Run it, accept the licensing terms, click the big &amp;quot;Install&amp;quot; link and accept the UAC prompt.&lt;br /&gt;
&lt;br /&gt;
Then go make a coffee because the install will probably take a while. If the setup asks you to restart your computer, do so; it will continue when you log back in.&lt;br /&gt;
&lt;br /&gt;
== Get Dependencies ==&lt;br /&gt;
&lt;br /&gt;
Like most big programs, OpenClonk doesn&#039;t stand on its own. Some things (like opening PNG images) were already programmed by other programers far better than we could ever do. This is why we have to get a few so-called &amp;quot;libraries&amp;quot; before Clonk can be built.&lt;br /&gt;
&lt;br /&gt;
You could try to search and download all those libraries by hand, but that would be pretty boring. Instead, just download [http://www.openclonk.org/openclonk-deps-vc90.zip this package] that contains everything you need to build Clonk.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_deps.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Unpack both directories into the same path you put all the other files. Don&#039;t worry, nothing will get overwritten in &amp;quot;planet&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Get CMake ==&lt;br /&gt;
&lt;br /&gt;
Before all this becomes useful, we still need something that tells the compiler &#039;&#039;how&#039;&#039; all those sources and libraries should be compiled together.&lt;br /&gt;
&lt;br /&gt;
For this, Visual C++ needs a project file. But there is none - we have to consult &#039;&#039;another&#039;&#039; program to generate it for us. This might seem confusing - but the point is that there are a lot of build environments besides Visual Studio, and having all those project files next to each other would become a problem in the long run.&lt;br /&gt;
&lt;br /&gt;
What we need is [http://www.cmake.org/cmake/resources/software.html#latest CMake]. Follow that link and download the installer:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake1.png|860px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You know what to do.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After the installation, start the CMake GUI from the start menu. Put the path you cloned the repository into the source code path field.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now click the &amp;quot;Configure&amp;quot; button in the lower left. It will ask what compiler we want to use. Select the compiler you want to use; either &amp;quot;Visual Studio 11&amp;quot; if you downloaded the 32-bit library package above, or &amp;quot;Visual Studio 11 Win64&amp;quot; if you got the 64-bit package.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake4.png]]&lt;br /&gt;
&lt;br /&gt;
If you get some error messages (in red), you&#039;re probably missing some dependencies. Don&#039;t worry if cmake complains about some missing paths, it shouldn&#039;t affect you.&lt;br /&gt;
&lt;br /&gt;
The last step is to click the &amp;quot;Generate&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Your First Build ==&lt;br /&gt;
&lt;br /&gt;
Okay, now we have everything needed to make OpenClonk run for the first time. Go into the source directory and double-click on the &amp;quot;openclonk.sln&amp;quot; file that should now have appeared:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_build1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Visual C++ should open and look similar to this:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_build2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We only want to build the engine, so select &amp;quot;clonk&amp;quot; from the list, right-click and select &amp;quot;Set as Start-Up project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_build3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now select &amp;quot;Build Solution&amp;quot; from the &amp;quot;Build&amp;quot; menu (or just press F7). No, I don&#039;t know what &amp;quot;solution&amp;quot; means. Drink a cup of coffee or two while you wait for the compiler to do its job.&lt;br /&gt;
&lt;br /&gt;
Eventually, you will arrive at this screen.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_build4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nevertheless, you can now select &amp;quot;Start Debugging&amp;quot; from the &amp;quot;Debug&amp;quot; menu (or just press F5) and should be greeted by the startup screen of a fresh OpenClonk build!&lt;br /&gt;
&lt;br /&gt;
[[File:Openclonk_first_start.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In case you are wondering why OpenClonk suddenly starts in some kind of pseudo windowed mode: This is because we just built a debug build (note the &amp;quot;dbg&amp;quot; after the version?). This build is a bit slower but allows you to get a better look at the internals of the engine while it&#039;s running. Maybe we&#039;ll have another article about that soon.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Building_with_Windows&amp;diff=1338</id>
		<title>Building with Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Building_with_Windows&amp;diff=1338"/>
		<updated>2013-03-31T21:18:44Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: /* Get Microsoft Visual Studio */ Update for 2012&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Get the sources =&lt;br /&gt;
&lt;br /&gt;
The source of OpenClonk is hold in a so-called version control system. Put simply, this is something that allows programmers to coordinate their work (see [[Git Workflow|the Git article]] for how that works). For the moment, it&#039;s just a couple of files you want to download.&lt;br /&gt;
&lt;br /&gt;
== Install TortoiseGit ==&lt;br /&gt;
&lt;br /&gt;
The notable difference to a simple download is that you need a special program to do it. Our version control system is Git, and we will use the [http://code.google.com/p/tortoisegit/ TortoiseGit] client. Follow that link and click &amp;quot;Download&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit.png|860px]]&lt;br /&gt;
&lt;br /&gt;
As the website tells you, the installation of TortoiseGit has two parts: TortoiseGit and msysGit. It also says that you should start with TortoiseGit, so let us get that installer first. Make sure to choose the right architecture for your version of Windows:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit2.png|860px]]&lt;br /&gt;
&lt;br /&gt;
And walk through the installation. Just selecting the default options should get you through alright.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;OpenClonk team members:&#039;&#039; If you want to use [http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html PuTTY] to push commits, make sure to select the appropriate option along the way. Do it again for the msysGit installation below.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit4.png]]&lt;br /&gt;
&lt;br /&gt;
Next, you need msysGit, which is what actually does all the work behind the scenes. Following the [http://code.google.com/p/msysgit/downloads/list?can=2&amp;amp;q=%22Full+installer+for+official+Git+for+Windows%22 &amp;quot;Full installer for official Git&amp;quot;] link will get you to another download page:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit3.png|860px]]&lt;br /&gt;
&lt;br /&gt;
This installation will ask even more confusing questions. But again default options won&#039;t cause anything to break, I would just recommend deactivating some GUI options, as TortoiseGit already offers them:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit5.png]]&lt;br /&gt;
&lt;br /&gt;
After a bit of waiting and (if you&#039;re lucky) not a single request to restart your computer, this should have given you a working TortoiseGit installation.&lt;br /&gt;
&lt;br /&gt;
== Clone ==&lt;br /&gt;
&lt;br /&gt;
Okay, now we are going to download the sources. Git calls this &amp;quot;cloning&amp;quot; because it&#039;s actually a lot more than just the sources you get. After you&#039;re done, you can check the [[Git Workflow]] page for how to work with your clone.&lt;br /&gt;
&lt;br /&gt;
For now, just find a place where you want the source to be, open the context menu by right-click and select &amp;quot;Git Clone...&amp;quot; from the TortoiseGit menu:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit6.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A dialog will appear asking for the repository URL and the destination path. In our case, we want the source to be the OpenClonk repository.  The URL you need is normally &amp;quot;git://git.openclonk.org/openclonk.git&amp;quot;.  Here&#039;s how it should look like:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;OpenClonk team members:&#039;&#039; Use &amp;quot;ssh://git@git.openclonk.org/openclonk.git&amp;quot; instead and activate the option to auto-load the PuTTY key for maximum convenience.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit_pub.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After pressing &amp;quot;OK&amp;quot;, TortoiseGit will work for a while. After watching a tortoise somersaulting for a while, it should finish. Congratulations, you now have the bleeding edge of OpenClonk development on your hard drive!&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit_finish.png]]&lt;br /&gt;
&lt;br /&gt;
This a lot of stuff and most likely you won&#039;t understand much of it. Here&#039;s a quick orientation guide of the actually important bits:&lt;br /&gt;
* &amp;quot;docs&amp;quot; - the sources of our [http://docs.openclonk.org/en/sdk/ documentation]&lt;br /&gt;
* &amp;quot;planet&amp;quot; - these are the game resources - scripts, graphics and everything to explain how to make a game out of them&lt;br /&gt;
* &amp;quot;src&amp;quot; - all the source code of the game engine. Lots of C++ ahead.&lt;br /&gt;
&lt;br /&gt;
= Get it to Compile =&lt;br /&gt;
&lt;br /&gt;
This is nice, but we are interested in seeing the game run, aren&#039;t we? For this, we need a program that will take all those C++ files and make an executable file out of it. Unfortunately, programming is complicated stuff so even setting up the tools and the environment has become a bit of science. But this won&#039;t stop us.&lt;br /&gt;
&lt;br /&gt;
== Get Microsoft Visual Studio ==&lt;br /&gt;
&lt;br /&gt;
You can say what you want about Microsoft, but they sure make nice development environments. And they are even giving a lot of it away for free. We will use [http://www.microsoft.com/visualstudio/eng/downloads#d-2012-express Visual Studio C++ 2012]. Follow that link, find the 2012 Express Edition &#039;&#039;&#039;for Windows Desktop&#039;&#039;&#039;, then download the [http://go.microsoft.com/?linkid=9816758 web installer]:&lt;br /&gt;
&lt;br /&gt;
[[File:msvc11_web_download.png|860px|Make extra sure you got the &amp;quot;Windows Desktop&amp;quot; variant.]]&lt;br /&gt;
&lt;br /&gt;
Run it, accept the licensing terms, click the big &amp;quot;Install&amp;quot; link and accept the UAC prompt.&lt;br /&gt;
&lt;br /&gt;
Then go make a coffee because the install will probably take a while. If the setup asks you to restart your computer, do so; it will continue when you log back in.&lt;br /&gt;
&lt;br /&gt;
== Get Dependencies ==&lt;br /&gt;
&lt;br /&gt;
Like most big programs, OpenClonk doesn&#039;t stand on its own. Some things (like opening PNG images) were already programmed by other programers far better than we could ever do. This is why we have to get a few so-called &amp;quot;libraries&amp;quot; before Clonk can be built.&lt;br /&gt;
&lt;br /&gt;
You could try to search and download all those libraries by hand, but that would be pretty boring. Instead, just download [http://www.openclonk.org/openclonk-deps-vc90.zip this package] that contains everything you need to build Clonk.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_deps.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Unpack both directories into the same path you put all the other files. Don&#039;t worry, nothing will get overwritten in &amp;quot;planet&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Get CMake ==&lt;br /&gt;
&lt;br /&gt;
Before all this becomes useful, we still need something that tells the compiler &#039;&#039;how&#039;&#039; all those sources and libraries should be compiled together.&lt;br /&gt;
&lt;br /&gt;
For this, Visual C++ needs a project file. But there is none - we have to consult &#039;&#039;another&#039;&#039; program to generate it for us. This might seem confusing - but the point is that there are a lot of build environments besides Visual Studio, and having all those project files next to each other would become a problem in the long run.&lt;br /&gt;
&lt;br /&gt;
What we need is [http://www.cmake.org/cmake/resources/software.html#latest CMake]. Follow that link and download the installer:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake1.png|860px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You know what to do.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After the installation, start the CMake GUI from the start menu. Put the path you cloned the repository into the source code path field.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now click the &amp;quot;Configure&amp;quot; button in the lower left. It will ask what compiler we want to use. Select the compiler you want to use, for example &amp;quot;Visual Studio 10&amp;quot;. Do &#039;&#039;not&#039;&#039; pick the Win64 option, as the precompiled libraries are 32 bit.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake4.png]]&lt;br /&gt;
&lt;br /&gt;
If you get some error messages (in red), you&#039;re probably missing some dependencies. Don&#039;t worry if cmake complains about some missing paths, it shouldn&#039;t affect you.&lt;br /&gt;
&lt;br /&gt;
The last step is to click the &amp;quot;Generate&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Your First Build ==&lt;br /&gt;
&lt;br /&gt;
Okay, now we have everything needed to make OpenClonk run for the first time. Go into the source directory and double-click on the &amp;quot;openclonk.sln&amp;quot; file that should now have appeared:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_build1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Visual C++ should open and look similar to this:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_build2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We only want to build the engine, so select &amp;quot;clonk&amp;quot; from the list, right-click and select &amp;quot;Set as Start-Up project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_build3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now select &amp;quot;Build Solution&amp;quot; from the &amp;quot;Build&amp;quot; menu (or just press F7). No, I don&#039;t know what &amp;quot;solution&amp;quot; means. Drink a cup of coffee or two while you wait for the compiler to do its job.&lt;br /&gt;
&lt;br /&gt;
Eventually, you will arrive at this screen.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_build4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nevertheless, you can now select &amp;quot;Start Debugging&amp;quot; from the &amp;quot;Debug&amp;quot; menu (or just press F5) and should be greeted by the startup screen of a fresh OpenClonk build!&lt;br /&gt;
&lt;br /&gt;
[[File:Openclonk_first_start.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In case you are wondering why OpenClonk suddenly starts in some kind of pseudo windowed mode: This is because we just built a debug build (note the &amp;quot;dbg&amp;quot; after the version?). This build is a bit slower but allows you to get a better look at the internals of the engine while it&#039;s running. Maybe we&#039;ll have another article about that soon.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=File:Msvc11_web_download.png&amp;diff=1337</id>
		<title>File:Msvc11 web download.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=File:Msvc11_web_download.png&amp;diff=1337"/>
		<updated>2013-03-31T21:17:32Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Building_with_Windows&amp;diff=1336</id>
		<title>Building with Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Building_with_Windows&amp;diff=1336"/>
		<updated>2013-03-31T20:09:31Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: DirectX is horribly broken and obtaining FMOD3 isn&amp;#039;t trivial anymore&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Get the sources =&lt;br /&gt;
&lt;br /&gt;
The source of OpenClonk is hold in a so-called version control system. Put simply, this is something that allows programmers to coordinate their work (see [[Git Workflow|the Git article]] for how that works). For the moment, it&#039;s just a couple of files you want to download.&lt;br /&gt;
&lt;br /&gt;
== Install TortoiseGit ==&lt;br /&gt;
&lt;br /&gt;
The notable difference to a simple download is that you need a special program to do it. Our version control system is Git, and we will use the [http://code.google.com/p/tortoisegit/ TortoiseGit] client. Follow that link and click &amp;quot;Download&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit.png|860px]]&lt;br /&gt;
&lt;br /&gt;
As the website tells you, the installation of TortoiseGit has two parts: TortoiseGit and msysGit. It also says that you should start with TortoiseGit, so let us get that installer first. Make sure to choose the right architecture for your version of Windows:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit2.png|860px]]&lt;br /&gt;
&lt;br /&gt;
And walk through the installation. Just selecting the default options should get you through alright.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;OpenClonk team members:&#039;&#039; If you want to use [http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html PuTTY] to push commits, make sure to select the appropriate option along the way. Do it again for the msysGit installation below.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit4.png]]&lt;br /&gt;
&lt;br /&gt;
Next, you need msysGit, which is what actually does all the work behind the scenes. Following the [http://code.google.com/p/msysgit/downloads/list?can=2&amp;amp;q=%22Full+installer+for+official+Git+for+Windows%22 &amp;quot;Full installer for official Git&amp;quot;] link will get you to another download page:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit3.png|860px]]&lt;br /&gt;
&lt;br /&gt;
This installation will ask even more confusing questions. But again default options won&#039;t cause anything to break, I would just recommend deactivating some GUI options, as TortoiseGit already offers them:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit5.png]]&lt;br /&gt;
&lt;br /&gt;
After a bit of waiting and (if you&#039;re lucky) not a single request to restart your computer, this should have given you a working TortoiseGit installation.&lt;br /&gt;
&lt;br /&gt;
== Clone ==&lt;br /&gt;
&lt;br /&gt;
Okay, now we are going to download the sources. Git calls this &amp;quot;cloning&amp;quot; because it&#039;s actually a lot more than just the sources you get. After you&#039;re done, you can check the [[Git Workflow]] page for how to work with your clone.&lt;br /&gt;
&lt;br /&gt;
For now, just find a place where you want the source to be, open the context menu by right-click and select &amp;quot;Git Clone...&amp;quot; from the TortoiseGit menu:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit6.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A dialog will appear asking for the repository URL and the destination path. In our case, we want the source to be the OpenClonk repository.  The URL you need is normally &amp;quot;git://git.openclonk.org/openclonk.git&amp;quot;.  Here&#039;s how it should look like:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;OpenClonk team members:&#039;&#039; Use &amp;quot;ssh://git@git.openclonk.org/openclonk.git&amp;quot; instead and activate the option to auto-load the PuTTY key for maximum convenience.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit_pub.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After pressing &amp;quot;OK&amp;quot;, TortoiseGit will work for a while. After watching a tortoise somersaulting for a while, it should finish. Congratulations, you now have the bleeding edge of OpenClonk development on your hard drive!&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_tgit_finish.png]]&lt;br /&gt;
&lt;br /&gt;
This a lot of stuff and most likely you won&#039;t understand much of it. Here&#039;s a quick orientation guide of the actually important bits:&lt;br /&gt;
* &amp;quot;docs&amp;quot; - the sources of our [http://docs.openclonk.org/en/sdk/ documentation]&lt;br /&gt;
* &amp;quot;planet&amp;quot; - these are the game resources - scripts, graphics and everything to explain how to make a game out of them&lt;br /&gt;
* &amp;quot;src&amp;quot; - all the source code of the game engine. Lots of C++ ahead.&lt;br /&gt;
&lt;br /&gt;
= Get it to Compile =&lt;br /&gt;
&lt;br /&gt;
This is nice, but we are interested in seeing the game run, aren&#039;t we? For this, we need a program that will take all those C++ files and make an executable file out of it. Unfortunately, programming is complicated stuff so even setting up the tools and the environment has become a bit of science. But this won&#039;t stop us.&lt;br /&gt;
&lt;br /&gt;
== Get Microsoft Visual Studio ==&lt;br /&gt;
&lt;br /&gt;
You can say what you want about Microsoft, but they sure make nice development environments. And they are even giving a lot of it away for free. We will use[http://www.microsoft.com/express/vc/#webInstall Visual Studio C++ 2010]. Follow that link, click yourself through the ever-shifting Microsoft website to the 2010 Express Edition, until you arrive at something that ideally looks like follows:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_msvc1_new.png|860px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The installer will offer us a lot of stuff we don&#039;t really need for OpenClonk. You should uncheck it to make the installation faster.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_msvc2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You will most likely stare at the following screen for a bit. It won&#039;t take that long, and for me didn&#039;t even restart the computer like it suggested it would.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_msvc3.png]]&lt;br /&gt;
&lt;br /&gt;
=== In case you use the Express Edition ===&lt;br /&gt;
Since clonk can currently only be compiled for 32 bit, and the 2010 Express Edition doesn&#039;t allow 32 bit compilation, you will need additional files&lt;br /&gt;
&lt;br /&gt;
1. [http://www.microsoft.com/en-us/download/details.aspx?id=8279 Windows SDK 7.1]&lt;br /&gt;
&lt;br /&gt;
2. [http://www.microsoft.com/en-us/download/details.aspx?id=4422 Compiler Update for the Windows SDK 7.1]&lt;br /&gt;
&lt;br /&gt;
3. [http://www.microsoft.com/en-us/download/confirmation.aspx?id=23691 Visual Studio 2010 Service Pack 1]&lt;br /&gt;
&lt;br /&gt;
== Get Dependencies ==&lt;br /&gt;
&lt;br /&gt;
Like most big programs, OpenClonk doesn&#039;t stand on its own. Some things (like opening PNG images) were already programmed by other programers far better than we could ever do. This is why we have to get a few so-called &amp;quot;libraries&amp;quot; before Clonk can be built.&lt;br /&gt;
&lt;br /&gt;
You could try to search and download all those libraries by hand, but that would be pretty boring. Instead, just download [http://www.openclonk.org/openclonk-deps-vc90.zip this package] that contains everything you need to build Clonk.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_deps.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Unpack both directories into the same path you put all the other files. Don&#039;t worry, nothing will get overwritten in &amp;quot;planet&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Get CMake ==&lt;br /&gt;
&lt;br /&gt;
Before all this becomes useful, we still need something that tells the compiler &#039;&#039;how&#039;&#039; all those sources and libraries should be compiled together.&lt;br /&gt;
&lt;br /&gt;
For this, Visual C++ needs a project file. But there is none - we have to consult &#039;&#039;another&#039;&#039; program to generate it for us. This might seem confusing - but the point is that there are a lot of build environments besides Visual Studio, and having all those project files next to each other would become a problem in the long run.&lt;br /&gt;
&lt;br /&gt;
What we need is [http://www.cmake.org/cmake/resources/software.html#latest CMake]. Follow that link and download the installer:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake1.png|860px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You know what to do.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After the installation, start the CMake GUI from the start menu. Put the path you cloned the repository into the source code path field.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now click the &amp;quot;Configure&amp;quot; button in the lower left. It will ask what compiler we want to use. Select the compiler you want to use, for example &amp;quot;Visual Studio 10&amp;quot;. Do &#039;&#039;not&#039;&#039; pick the Win64 option, as the precompiled libraries are 32 bit.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_cmake4.png]]&lt;br /&gt;
&lt;br /&gt;
If you get some error messages (in red), you&#039;re probably missing some dependencies. Don&#039;t worry if cmake complains about some missing paths, it shouldn&#039;t affect you.&lt;br /&gt;
&lt;br /&gt;
The last step is to click the &amp;quot;Generate&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Your First Build ==&lt;br /&gt;
&lt;br /&gt;
Okay, now we have everything needed to make OpenClonk run for the first time. Go into the source directory and double-click on the &amp;quot;openclonk.sln&amp;quot; file that should now have appeared:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_build1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Visual C++ should open and look similar to this:&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_build2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We only want to build the engine, so select &amp;quot;clonk&amp;quot; from the list, right-click and select &amp;quot;Set as Start-Up project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_build3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now select &amp;quot;Build Solution&amp;quot; from the &amp;quot;Build&amp;quot; menu (or just press F7). No, I don&#039;t know what &amp;quot;solution&amp;quot; means. Drink a cup of coffee or two while you wait for the compiler to do its job.&lt;br /&gt;
&lt;br /&gt;
Eventually, you will arrive at this screen.&lt;br /&gt;
&lt;br /&gt;
[[File:build_windows_build4.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nevertheless, you can now select &amp;quot;Start Debugging&amp;quot; from the &amp;quot;Debug&amp;quot; menu (or just press F5) and should be greeted by the startup screen of a fresh OpenClonk build!&lt;br /&gt;
&lt;br /&gt;
[[File:Openclonk_first_start.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In case you are wondering why OpenClonk suddenly starts in some kind of pseudo windowed mode: This is because we just built a debug build (note the &amp;quot;dbg&amp;quot; after the version?). This build is a bit slower but allows you to get a better look at the internals of the engine while it&#039;s running. Maybe we&#039;ll have another article about that soon.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Development&amp;diff=1225</id>
		<title>Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Development&amp;diff=1225"/>
		<updated>2012-06-21T15:16:41Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: Changed repository URL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
OpenClonk is an open project. That means it depends on people coming in and helping out. People just like you! This page should give you an idea what you could do in order to get involved.&lt;br /&gt;
&lt;br /&gt;
=== Use Development Snapshots ===&lt;br /&gt;
&lt;br /&gt;
OpenClonk is continously in development. The &amp;quot;current&amp;quot; version can change daily! If you want to follow the development, it is a good idea to make sure you are able to run development versions. You will not need to build them yourself - just use the development snapshots linked below and you should be ready to go.&lt;br /&gt;
&lt;br /&gt;
* Development Snapshots - [http://www.openclonk.org/nightly-builds/ www.openclonk.org/nightly-builds/]&lt;br /&gt;
* Blog - [http://blog.openclonk.org blog.openclonk.org]&lt;br /&gt;
* Changelog - [http://hg.openclonk.org/openclonk/ hg.openclonk.org/openclonk/]&lt;br /&gt;
* Browse source - [http://hg.openclonk.org/openclonk/file/ hg.openclonk.org/openclonk/file/]&lt;br /&gt;
&lt;br /&gt;
=== Report Bugs ===&lt;br /&gt;
&lt;br /&gt;
We cannot possibly account for every possible configuration out there. If you see something that&#039;s wrong, we would really like to know about it. Especially if you are willing to actively work with us in finding a solution for the problem.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s how you can reach us:&lt;br /&gt;
&lt;br /&gt;
* IRC - [irc://irc.euirc.net/openclonk-dev/ #openclonk-dev] on irc.euirc.net (Problems connecting? Use irc.ham.de.euirc.net)&lt;br /&gt;
* Bugtracker - [http://bugs.openclonk.org bugs.openclonk.org]&lt;br /&gt;
* Forum - [http://forum.openclonk.org forum.openclonk.org]&lt;br /&gt;
&lt;br /&gt;
=== Contribute Scripts or Game Content ===&lt;br /&gt;
&lt;br /&gt;
Just like Clonk Rage before, most things in OpenClonk can be changed without touching the engine. Instead, we rely on a script language and a flexible game content system to make up our game content. This means that you can get involved easily - without having to learn C++ first! Traditionally, developing own objects and scenarios and sharing them with others has been how pretty much all of today&#039;s developers started out.&lt;br /&gt;
&lt;br /&gt;
* Developer Documentation [http://docs.openclonk.org/en/sdk/ docs.openclonk.org/en/sdk/]&lt;br /&gt;
* Forum - [http://forum.openclonk.org forum.openclonk.org]&lt;br /&gt;
* Style Guide - [http://wiki.openclonk.org/w/C4Script_Style_Guidelines wiki.openclonk.org/w/C4Script_Style_Guidelines]&lt;br /&gt;
&lt;br /&gt;
=== Build OpenClonk Yourself ===&lt;br /&gt;
&lt;br /&gt;
When delving deeper into OpenClonk, you will often find yourself in the situation that you need a closer look at what makes OpenClonk tick internally. At that point, it is a good idea to assume the perspective of developers - get the source code and build it in your own development environment.&lt;br /&gt;
&lt;br /&gt;
* Tutorial for Windows - [http://wiki.openclonk.org/w/Building_with_Windows wiki.openclonk.org/w/Building_with_Windows]&lt;br /&gt;
* General instructions - [http://wiki.openclonk.org/w/Build_OpenClonk wiki.openclonk.org/w/Build_OpenClonk]&lt;br /&gt;
* Mercurial Guide - [http://wiki.openclonk.org/w/Mercurial_Guide wiki.openclonk.org/w/Mercurial_Guide]&lt;br /&gt;
* Mercurial Repository - [http://hg.openclonk.org/openclonk/ hg.openclonk.org/openclonk/]&lt;br /&gt;
* Source Code Structure - [http://wiki.openclonk.org/w/Source_code_structure wiki.openclonk.org/w/Source_code_structure]&lt;br /&gt;
&lt;br /&gt;
=== Hack the OpenClonk Engine ===&lt;br /&gt;
&lt;br /&gt;
Maybe you already are well-versed in C++ and want to help out actually diagnosing problems? Or - even better - have your own ideas on engine improvements? We are always glad to look at patches.&lt;br /&gt;
&lt;br /&gt;
* Wondering where to start? - [[GSoC2011Ideas|Ideas page]]&lt;br /&gt;
* Debugging synchronization losses - [http://wiki.openclonk.org/w/Sync_losses wiki.openclonk.org/w/Sync_Losses]&lt;br /&gt;
* Style Guide - [http://wiki.openclonk.org/w/Style_Guidelines wiki.openclonk.org/w/Style_Guidelines]&lt;br /&gt;
* Forum, developers&#039; corner - [http://forum.openclonk.org/board_show.pl?bid=5 forum.openclonk.org]&lt;br /&gt;
&lt;br /&gt;
=== Legal Stuff ===&lt;br /&gt;
&lt;br /&gt;
OpenClonk uses the ISC license for code (engine and script) and CC-by for most other media. Read more about the [[License | license stuff]] here.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=428</id>
		<title>Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=428"/>
		<updated>2010-03-26T19:19:29Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: . and -&amp;gt; aren&amp;#039;t enclosed by spaces&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document specifies the preferred source code style of files inside the&lt;br /&gt;
OpenClonk source tree. Some of the style rules are also stated implicitly&lt;br /&gt;
inside the examples.&lt;br /&gt;
&lt;br /&gt;
=== All-encompassing Guidelines ===&lt;br /&gt;
==== Line endings ====&lt;br /&gt;
Use a single line feed character (ASCII 10) for line endings. Mercurial provides&lt;br /&gt;
an extension named &#039;&#039;win32text&#039;&#039; you can use to auto-convert files from your&lt;br /&gt;
OS&#039;s native format to single LF and vice-versa.&lt;br /&gt;
&lt;br /&gt;
==== Indentation ====&lt;br /&gt;
Indent your code with tabs (ASCII 9). Use space (ASCII 32) for all other&lt;br /&gt;
formatting.&lt;br /&gt;
&lt;br /&gt;
==== Braces ====&lt;br /&gt;
Braces are on their own line, on the same level of indentation as the&lt;br /&gt;
structure they belong to. You may add braces around single statements in&lt;br /&gt;
&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements if the first block or an &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; block has them.&lt;br /&gt;
&lt;br /&gt;
 if (count &amp;lt; 10)&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;Too few thingies!&amp;quot;);&lt;br /&gt;
 	AddMore();&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;We have enough&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Spaces ====&lt;br /&gt;
Function names are not followed by space. Commas are. No space follows opening&lt;br /&gt;
brackets (&amp;quot;[&amp;quot;) or parentheses (&amp;quot;(&amp;quot;). Also no space preceeds closing brackets&lt;br /&gt;
(&amp;quot;]&amp;quot;) or parentheses (&amp;quot;)&amp;quot;). Unary operators do not require spaces. Binary&lt;br /&gt;
operators (except for the member access operators &amp;quot;.&amp;quot; and &amp;quot;-&amp;gt;&amp;quot;) do.&lt;br /&gt;
&lt;br /&gt;
Keywords (&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; etc.) are followed by a space.&lt;br /&gt;
&lt;br /&gt;
==== Parentheses ====&lt;br /&gt;
Do not use parentheses unless they are required for precedence or the code&lt;br /&gt;
gets confusing without them. Remember other people may have confusion&lt;br /&gt;
thresholds different from you.&lt;br /&gt;
&lt;br /&gt;
==== Control Structures ====&lt;br /&gt;
Control structures with a single statements are written without braces. If the&lt;br /&gt;
statement spans multiple lines, you may add braces for readability. Structures&lt;br /&gt;
without a statement contain a comment denoting this.&lt;br /&gt;
&lt;br /&gt;
 while (*dest++ = *src++)&lt;br /&gt;
 	/* empty */;&lt;br /&gt;
&lt;br /&gt;
Cascades in a &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; statement are marked by a FALLTHROUGH&lt;br /&gt;
comment. Code that cannot be reached has an assertion. &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt; elements&lt;br /&gt;
are not indented.&lt;br /&gt;
&lt;br /&gt;
 switch (foo)&lt;br /&gt;
 {&lt;br /&gt;
 case FOO_HEX:&lt;br /&gt;
 	accept_hex = true;&lt;br /&gt;
 	// FALLTHROUGH&lt;br /&gt;
 case FOO_DEC:&lt;br /&gt;
 	accept_num = true;&lt;br /&gt;
 	break;&lt;br /&gt;
 default:&lt;br /&gt;
 	assert(!&amp;quot;Invalid foo value&amp;quot;);&lt;br /&gt;
 	// Do something meaningful here anyway, if possible;&lt;br /&gt;
 	// try to not leave the program in an ill-defined state.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
 // Single-line comments look like this&lt;br /&gt;
&lt;br /&gt;
 // Multi-line comments look like this. Using C++-style comments&lt;br /&gt;
 // helps if you need to comment out large pieces of code later, or if the length of&lt;br /&gt;
 // the comment changes over time. Of course you could still use #if 0 ... #endif&lt;br /&gt;
 // to achieve that.&lt;br /&gt;
&lt;br /&gt;
 /* You may also write multi-line comments like this. Make sure you write enough&lt;br /&gt;
    text to warrant a multi-line comment. Also be sure to write in full sentences. */&lt;br /&gt;
&lt;br /&gt;
==== Type Casting ====&lt;br /&gt;
Do not use C-style or function style casts. Use a template cast instead.&lt;br /&gt;
&lt;br /&gt;
=== Source File Layout ===&lt;br /&gt;
==== Copyright Header ====&lt;br /&gt;
Every source file begins with a copyright header. If you make significant&lt;br /&gt;
changes to the code, you may (but are not required to) add your name to the&lt;br /&gt;
list of copyright holders. If you choose to add yourself, use your real name,&lt;br /&gt;
not a nickname. Legally recognized pseudonyms are accepted, as are names of&lt;br /&gt;
legal entities. If you don&#039;t want to add yourself, you may add the catch-all&lt;br /&gt;
copyright attribution phrase, if it does not already exist.&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * OpenClonk, http://www.openclonk.org&lt;br /&gt;
  *&lt;br /&gt;
  * Copyright (c) 2000-2009  John Doe&lt;br /&gt;
  * Copyright (c) 2005  Jane Q. Public&lt;br /&gt;
  *&lt;br /&gt;
  * Portions might be copyrighted by other authors who have contributed&lt;br /&gt;
  * to OpenClonk.&lt;br /&gt;
  *&lt;br /&gt;
  * Other legalese goes here, but has been omitted for brevity. See an&lt;br /&gt;
  * existing file for a template.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
The copyright header is followed by an empty line. Put a comment explaining&lt;br /&gt;
the purpose of the file next, and leave another blank line after this.&lt;br /&gt;
&lt;br /&gt;
==== Inclusion Guards ====&lt;br /&gt;
If you are writing a header file, use #include guards. If your file is called&lt;br /&gt;
&#039;&#039;C4Foo.h&#039;&#039;, your guard should be &amp;lt;tt&amp;gt;INC_&#039;&#039;C4Foo&#039;&#039;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 #ifndef INC_C4Foo&lt;br /&gt;
 #define INC_C4Foo&lt;br /&gt;
 class C4Foo;&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO: Precompiled headers.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== #include Directives ====&lt;br /&gt;
Include local headers first. Put the filename in double quotes, and use&lt;br /&gt;
forward slashes as directory separators.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;Standard.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;StdBuf.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Leave a blank line before system headers. Use angle brackets to include these,&lt;br /&gt;
and sort them alphabetically.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;map&amp;gt;&lt;br /&gt;
 #include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Declarations ===&lt;br /&gt;
==== Preprocessor Macros ====&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; values in headers. Use &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; instead, or&lt;br /&gt;
&amp;lt;tt&amp;gt;enum&amp;lt;/tt&amp;gt; if you are declaring an enumeration.&lt;br /&gt;
&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; inline functions either, use &amp;lt;tt&amp;gt;inline&amp;lt;/tt&amp;gt;. If your&lt;br /&gt;
functions need to work on multiple data types, overload the function or write&lt;br /&gt;
a &amp;lt;tt&amp;gt;template&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If, despite of the above, you still need to write a macro, use an all-uppercase&lt;br /&gt;
name. If your macro contains a compound statement, enclose it in a &amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;&lt;br /&gt;
loop to allow its use in &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements. A terminating semicolon&lt;br /&gt;
should be provided at the place of invocation. This makes parsing the source&lt;br /&gt;
easier for pretty-printers and editors. Consider undefining your macro when&lt;br /&gt;
you are done using it.&lt;br /&gt;
&lt;br /&gt;
 #define FOO(a, b) do { \&lt;br /&gt;
 	bar += (a); \&lt;br /&gt;
 	bar /= (b); \&lt;br /&gt;
 } while(0)&lt;br /&gt;
&lt;br /&gt;
==== Data Types ====&lt;br /&gt;
Do not use the Win32 style integer declarations &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; and&lt;br /&gt;
&amp;lt;tt&amp;gt;BOOL&amp;lt;/tt&amp;gt;. If you need a guarantee about the size of your variables, use&lt;br /&gt;
the C99 types &amp;lt;tt&amp;gt;int&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;uint&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt;. If you don&#039;t&lt;br /&gt;
need that guarantee, use &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. If you need a variable that is large&lt;br /&gt;
enough to store a pointer on your current platform, use &amp;lt;tt&amp;gt;intptr_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you come across code that still uses Win32 types, consider changing it if&lt;br /&gt;
you are working on code in the vicinity. Don&#039;t commit changes that only&lt;br /&gt;
consist of replacing &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;uint32_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When declaring a pointer, put a space in front of the asterisk, and none&lt;br /&gt;
after. This saves some confusion when declaring multiple variables at once.&lt;br /&gt;
The same goes for references.&lt;br /&gt;
&lt;br /&gt;
 int *foo, *bar;&lt;br /&gt;
 char *Qux(const char *quux);&lt;br /&gt;
&lt;br /&gt;
==== Functions ====&lt;br /&gt;
Functions that are not used outside of the containing file are placed inside&lt;br /&gt;
of an anonymous namespace.&lt;br /&gt;
&lt;br /&gt;
 namespace&lt;br /&gt;
 {&lt;br /&gt;
 	int Frobnicate(const char *foo);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Functions that are used across multiple files are prototyped inside a common&lt;br /&gt;
header. The prototypes should be grouped where appropriate, and ordered&lt;br /&gt;
logically or, failing that, alphabetically.&lt;br /&gt;
&lt;br /&gt;
Function and class names begin with a capital letter, and use camel casing. If&lt;br /&gt;
you need to embed acronyms inside the name, pretend the acronym was all lower&lt;br /&gt;
case. Member variables use the same convention, but begin with a lower case&lt;br /&gt;
letter. Do not use hungarian prefixes.&lt;br /&gt;
&lt;br /&gt;
 XmlDocument *ParseXmlFile(const char *file);&lt;br /&gt;
&lt;br /&gt;
When passing arguments that may be changed by the called function, pass them&lt;br /&gt;
as pointers. This makes it obvious that they may be changed. Use constant&lt;br /&gt;
references for all other parameters, unless they are a primitive type.&lt;br /&gt;
&lt;br /&gt;
==== Class Members ====&lt;br /&gt;
No class member variable should be declared &amp;lt;tt&amp;gt;public&amp;lt;/tt&amp;gt; unless necessary.&lt;br /&gt;
Consider using &amp;lt;tt&amp;gt;GetFoo&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SetFoo&amp;lt;/tt&amp;gt; accessors. If you want to &lt;br /&gt;
declare a compound data type that allows direct access to its members, use&lt;br /&gt;
&amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;. Do not add more functions than constructors, destructors, and&lt;br /&gt;
assignment operators to &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
Mark all class members that do not change the visible state of the object&lt;br /&gt;
&amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt;. If you need to modify internal state that is not visible from&lt;br /&gt;
outside of the class, mark the state variable &amp;lt;tt&amp;gt;mutable&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=DevelopersGuide&amp;diff=359</id>
		<title>DevelopersGuide</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=DevelopersGuide&amp;diff=359"/>
		<updated>2010-02-27T15:58:13Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: moved DevelopersGuide to Developers Guide:&amp;amp;#32;Spacey titles preferred&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Developers Guide]]&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Developers_Guide&amp;diff=358</id>
		<title>Developers Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Developers_Guide&amp;diff=358"/>
		<updated>2010-02-27T15:58:13Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: moved DevelopersGuide to Developers Guide:&amp;amp;#32;Spacey titles preferred&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Build OpenClonk ==&lt;br /&gt;
&lt;br /&gt;
Windows users can check out this tutorial: [[Building_with_Windows|Building with Visual C++]]&lt;br /&gt;
&lt;br /&gt;
Otherwise, here is how you can build OpenClonk in three easy steps:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Get the source code&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
We use Mercurial as our version control system. The [http://bitbucket.org/tortoisehg/stable/wiki/install TortoiseHG website] describes how to install it. If you just want to download the OpenClonk source code, you can also install Mercurial without TortoiseHG.&lt;br /&gt;
TortoiseHG is a GUI for Mercurial which makes using Mercurial much more comfortable.&lt;br /&gt;
&lt;br /&gt;
Two tips for somebody new to Mercurial: Ignore the revision numbers, they are only there to mislead you. Pay attention to the changelog id. And activate the &amp;quot;Mercurial Queues&amp;quot; extension to get the &amp;quot;strip&amp;quot; command, with which one can delete changesets that are no longer needed.&lt;br /&gt;
&lt;br /&gt;
To get the source, you have to clone the repository. Use the TortoiseHG dialog to clone http://hg.openclonk.org/ or execute this command in a commandline shell:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;hg clone http://hg.openclonk.org/ openclonk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
If you already cloned the repository and only want to update your local repository, use the Synchronise dialog of TortoiseHG to pull the repository and update. Or execute in the commandline:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;hg pull --update&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Install Build tools and libraries&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
OpenClonk has a couple of dependencies on other libraries. Please refer to the Readme.*.txt in the freshly checked out source tree.&lt;br /&gt;
For windows, we provide prebuilt packages of libraries:&lt;br /&gt;
* [http://forum.openclonk.org/topic_show.pl?pid=1405#pid1405 for Microsoft C++ users]&lt;br /&gt;
* [http://forum.openclonk.org/topic_show.pl?pid=1522#pid1522 for GNU Compiler Collection users]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Compile the game&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Again, the Readme.*.txt has the details, as this step is highly platform dependent. But it&#039;s also comparatively uncomplicated: If you installed everything that&#039;s listed, and it doesn&#039;t build, you found a bug.&lt;br /&gt;
&lt;br /&gt;
== Get your changes into the openclonk.org repository ==&lt;br /&gt;
&lt;br /&gt;
First, make the changes on your local copy of the repository. Then commit it to your local Mercurial repository. After that, you can export the changes as a patch (if you only changed source code or text) or as a bundle (if you changed binary files). Then attach the file to a forum post.&lt;br /&gt;
&lt;br /&gt;
See also the [http://forum.openclonk.org/topic_show.pl?tid=226 topic in the developers corner].&lt;br /&gt;
&lt;br /&gt;
== Miscellanous notes ==&lt;br /&gt;
&lt;br /&gt;
We have [[SourceCodeReorganization|reorganized the source code]].&lt;br /&gt;
&lt;br /&gt;
=== Mercurial extensions you really need ===&lt;br /&gt;
&lt;br /&gt;
Add these to your ~/.hgrc:&lt;br /&gt;
&lt;br /&gt;
  hgext.mq=&lt;br /&gt;
This enables the &amp;quot;strip&amp;quot; command, with which you can remove a unwanted revision. Absolutely necessary, because the great thing about distributed revision control is that one can commit early and often and then go back and clean up, often creating new commits to replace the old ones. But the old ones do not disappear after being abandoned. Or maybe you want to try out some revision from somebody else, and get rid of it afterwards.&lt;br /&gt;
&lt;br /&gt;
  hgext.rebase=&lt;br /&gt;
  hgext.transplant=&lt;br /&gt;
These enable you to reorder history. Essential if you have an experimental feature followed by a bugfix and only want to push the bugfix to the public repository.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=C4Script_Style_Guidelines&amp;diff=302</id>
		<title>C4Script Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=C4Script_Style_Guidelines&amp;diff=302"/>
		<updated>2010-01-26T14:14:02Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: /* Control Structures */ Shortcut operators are right out&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Scripting policy ==&lt;br /&gt;
&lt;br /&gt;
Style guideline for coding C4Script in OpenClonk.&lt;br /&gt;
The development is based on exchange of scripts. Therefore it is necessary to define some styling rules, so that other developers can read your code more easily.&lt;br /&gt;
&lt;br /&gt;
=== Indentation ===&lt;br /&gt;
&lt;br /&gt;
Indent your code with tabs (ASCII 9). Use space (ASCII 32) for all other formatting.&lt;br /&gt;
&lt;br /&gt;
 public func foo()&lt;br /&gt;
 {&lt;br /&gt;
 	bar();&lt;br /&gt;
 	if (1)&lt;br /&gt;
 	{&lt;br /&gt;
 		bar2();&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Braces ===&lt;br /&gt;
&lt;br /&gt;
According to the [http://forum.openclonk.org/topic_show.pl?tid=208 poll] in the forum:&lt;br /&gt;
&lt;br /&gt;
Braces are on their own line, on the same level of indentation as the structure they belong to. You may add braces around single statements in if statements if the first block or an else block has them.&lt;br /&gt;
&lt;br /&gt;
 if (bar)&lt;br /&gt;
 {&lt;br /&gt;
 	foo();&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
 	foo2();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Spaces ===&lt;br /&gt;
&lt;br /&gt;
Keywords followed by a space: &amp;lt;tt&amp;gt;if, while, for&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Commas are followed by a space, function names not. &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;-&amp;gt;~&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;++&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;--&amp;lt;/tt&amp;gt; don&#039;t need spaces, other operators do. &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt; don&#039;t need spaces either when used as algebraic signs, otherwise they do.&lt;br /&gt;
&lt;br /&gt;
 var foo = 0;&lt;br /&gt;
 foo++;&lt;br /&gt;
 if (foo &amp;amp;&amp;amp; bar)&lt;br /&gt;
 {&lt;br /&gt;
 	foo = foo + 1;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Control Structures ===&lt;br /&gt;
&lt;br /&gt;
Control structures with a single statements are written without braces. You may add braces for readability. Don&#039;t use shortcut operators instead of if.&lt;br /&gt;
&lt;br /&gt;
Statements are written in a new line.&lt;br /&gt;
&lt;br /&gt;
=== Comments ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please comment your script where it&#039;s necessary.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You may format your comments as you wish:&lt;br /&gt;
 // single line comment&lt;br /&gt;
 &lt;br /&gt;
 // multiline&lt;br /&gt;
 // comment&lt;br /&gt;
 &lt;br /&gt;
 /* multiline&lt;br /&gt;
    comment 2 */&lt;br /&gt;
 &lt;br /&gt;
 // Unnecessary comment:&lt;br /&gt;
 // Increase i by one&lt;br /&gt;
 i++;&lt;br /&gt;
 &lt;br /&gt;
 // Necessary comment:&lt;br /&gt;
 // This starts the whole effect, casts particles and stuff&lt;br /&gt;
 CreateObject(BAR1, 0,0, GetOwner())-&amp;gt;foo();&lt;br /&gt;
&lt;br /&gt;
Especially for German scripters: &#039;&#039;&#039;comment in English please!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== IDs ==&lt;br /&gt;
&lt;br /&gt;
The difference with CR is that OC allowes for IDs to have more than four characters. The main OC content will use the namespace Core_, so use this as prefix for all your objects which go into the main object pack for OC.&lt;br /&gt;
&lt;br /&gt;
=== Objects.c4d/Libraries.c4d ===&lt;br /&gt;
&lt;br /&gt;
ID&#039;s can now have more than four characters, so in the future use: Core_Library_.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=IRCMeeting/20100118&amp;diff=289</id>
		<title>IRCMeeting/20100118</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=IRCMeeting/20100118&amp;diff=289"/>
		<updated>2010-01-19T18:39:38Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: +Summary&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
* Future meetings weekly at 18:00 UTC (19:00 CET, 13:00 EST)&lt;br /&gt;
** Rotating moderators&lt;br /&gt;
* ck: Mesh rendering on its way&lt;br /&gt;
** animation stack (http://forum.openclonk.org/topic_show.pl?pid=5302#pid5302)&lt;br /&gt;
** experimental features (perspective rendering)&lt;br /&gt;
* Isilkor: Long C4IDs&lt;br /&gt;
** need some polish, are usable&lt;br /&gt;
** namespaces?&lt;br /&gt;
* Maikel: Animal AI&lt;br /&gt;
* Newton: HUD complete except for some bugs and a few engine features&lt;br /&gt;
** Upcoming: Menus, Gamepad controls&lt;br /&gt;
* Blogs&lt;br /&gt;
** &amp;quot;news light&amp;quot;&lt;br /&gt;
** Newton will set one up&lt;br /&gt;
* Wiki&lt;br /&gt;
** to contain FAQs regarding OC dev, game&lt;br /&gt;
** clearer structure needed&lt;br /&gt;
* Roadmap&lt;br /&gt;
** We want something playable for OCM in April, see [[IRCMeeting/20100118-gobby|gobby log]]&lt;br /&gt;
&lt;br /&gt;
== Full Log ==&lt;br /&gt;
&amp;lt;pre&amp;gt;19:11:45&amp;lt;!Mimmo_O&amp;gt; i think newton forgot about the time&lt;br /&gt;
19:11:52&amp;lt;!Mimmo_O&amp;gt; or maybe hell join us in 48 minutes&lt;br /&gt;
19:11:53&amp;lt;!Isilkor&amp;gt; Well, this meeting is off to a great start&lt;br /&gt;
19:12:35&amp;lt;!Isilkor&amp;gt; Which means I&#039;ll wrest control from him and just use the agenda he posted on the forums&lt;br /&gt;
19:12:49&amp;lt;!Randrian&amp;gt; hmm I am sorry, but I have to join dinner now... I&#039;ll join later&lt;br /&gt;
19:13:20&amp;lt;!Isilkor&amp;gt; Welcome to the first OpenClonk developer IRC meeting. We&#039;re trying to be constructive here, so please don&#039;t disrupt the discussion (too much).&lt;br /&gt;
19:13:40&amp;lt;!Maikel&amp;gt; Ty :)&lt;br /&gt;
19:14:21&amp;lt; Asmageddon&amp;gt; So that eeting was meant to be IRC meeting?&lt;br /&gt;
19:14:24&amp;lt;!Isilkor&amp;gt; I&#039;ll be providing a short summary of the meeting afterwards.&lt;br /&gt;
19:14:44-!- Newton [~Miranda@euirc-93eb52c2.adsl.alicedsl.de] has joined #openclonk-dev&lt;br /&gt;
19:14:45-!- mode/#openclonk-dev [+ao Newton Newton] by ChanServ&lt;br /&gt;
19:14:45&amp;lt;!ck&amp;gt; I also suggest to put the logs online, accessible from the wiki&lt;br /&gt;
19:14:45&amp;lt;!Isilkor&amp;gt; Asmageddon: We&#039;re doing a short weekly meeting to steer the project in a general direction&lt;br /&gt;
19:14:48&amp;lt;!Zapper&amp;gt; yo newton&lt;br /&gt;
19:14:55&amp;lt;!Isilkor&amp;gt; As a first, I&#039;m going to assume that the time and place is acceptable for everyone. If there&#039;s any problems, please speak up now.&lt;br /&gt;
19:15:05&amp;lt;!Isilkor&amp;gt; ck: Can do.&lt;br /&gt;
19:15:06&amp;lt;!Newton&amp;gt; hey guys&lt;br /&gt;
19:15:16&amp;lt;!Maikel&amp;gt; hi&lt;br /&gt;
19:15:27&amp;lt;!Isilkor&amp;gt; Newton: We&#039;re just about to start, do you want to take the helm?&lt;br /&gt;
19:15:28&amp;lt; Asmageddon&amp;gt; hello!&lt;br /&gt;
19:15:28&amp;lt;!Newton&amp;gt; sorry for the lateness&lt;br /&gt;
19:15:58&amp;lt;!Newton&amp;gt; is everyone there?&lt;br /&gt;
19:16:10&amp;lt;!ck&amp;gt; I&#039;d prefer if we could start about an hour later in future, though 19:00 is also OK if anybody objects&lt;br /&gt;
19:16:11&amp;lt;!Zapper&amp;gt; Well, I am&lt;br /&gt;
19:16:36&amp;lt;!Isilkor&amp;gt; Randrian will join us later&lt;br /&gt;
19:17:01&amp;lt;!Newton&amp;gt; so do we start at 19:00 or 20:00 in the future?&lt;br /&gt;
19:17:11&amp;lt;!Mimmo_O&amp;gt; Newton!&lt;br /&gt;
19:17:18&amp;lt;!Newton&amp;gt; Isilkor: ok@helm&lt;br /&gt;
19:17:30&amp;lt;!Isilkor&amp;gt; I&#039;d prefer 19:00, but I&#039;d be willing to compromise ;)&lt;br /&gt;
19:17:34&amp;lt;!Newton&amp;gt; same here&lt;br /&gt;
19:17:41&amp;lt;!Maikel&amp;gt; I don&#039;t care.&lt;br /&gt;
19:17:58&amp;lt;!Maikel&amp;gt; dependent on the length of the meetings.&lt;br /&gt;
19:18:14&amp;lt;!Mimmo_O&amp;gt; yeh&lt;br /&gt;
19:18:15&amp;lt;!Newton&amp;gt; hm, then lets stick to 19:00 for now&lt;br /&gt;
19:18:47&amp;lt;!Newton&amp;gt; do you think we should keep some kind of protocol of the meetings?&lt;br /&gt;
19:19:15&amp;lt; Asmageddon&amp;gt; what for?&lt;br /&gt;
19:19:16&amp;lt;!ck&amp;gt; I think it&#039;s enough to put the IRC logs online, and maybe a short summary&lt;br /&gt;
19:19:17&amp;lt; s_m_w&amp;gt; Logs are usually enough for meetings held on IRC&lt;br /&gt;
19:19:35&amp;lt;!Mimmo_O&amp;gt; yop&lt;br /&gt;
19:19:37&amp;lt;!Newton&amp;gt; but then, we still need someone to do that&lt;br /&gt;
19:19:44&amp;lt;!Maikel&amp;gt; I&#039;ll&lt;br /&gt;
19:19:46&amp;lt;!Isilkor&amp;gt; I&#039;m doing it&lt;br /&gt;
19:19:49&amp;lt;!ck&amp;gt; Isilkor volunteered for today..&lt;br /&gt;
19:19:50&amp;lt;!Newton&amp;gt; fight for it&lt;br /&gt;
19:19:54&amp;lt;!Newton&amp;gt; ok&lt;br /&gt;
19:20:09&amp;lt;!Maikel&amp;gt; do&amp;gt;will&lt;br /&gt;
19:20:34&amp;lt;!Newton&amp;gt; I think its better if we have any additional TOPs, to mention them now even though we dont have to be that official&lt;br /&gt;
19:20:46&amp;lt;!Newton&amp;gt; anybody has something he wants to talk about?&lt;br /&gt;
19:21:03&amp;lt;!Mimmo_O&amp;gt; nothing really important&lt;br /&gt;
19:21:04&amp;lt; Asmageddon&amp;gt; I have&lt;br /&gt;
19:21:07&amp;lt;!Maikel&amp;gt; TOP = Topic?&lt;br /&gt;
19:21:12&amp;lt; Asmageddon&amp;gt; But nothing so important&lt;br /&gt;
19:21:16&amp;lt;!Newton&amp;gt; Maikel: yes, Agenda point&lt;br /&gt;
19:21:18&amp;lt;!Mimmo_O&amp;gt; TagesOrdnungsPunkte&lt;br /&gt;
19:21:25&amp;lt;!Newton&amp;gt; oh@TOP&lt;br /&gt;
19:21:27&amp;lt;!Newton&amp;gt; so its german&lt;br /&gt;
19:21:28&amp;lt;!Newton&amp;gt; anyway&lt;br /&gt;
19:21:37&amp;lt;!Newton&amp;gt; Asmageddon?&lt;br /&gt;
19:21:47&amp;lt;!Mimmo_O&amp;gt; i know that frm my german lessons :S we need to keep protocol of every hour.&lt;br /&gt;
19:21:49&amp;lt; Asmageddon&amp;gt; Wait a moment, I&#039;m eating :P&lt;br /&gt;
19:22:05&amp;lt;!Newton&amp;gt; err ok. Then I&#039;ll mention my point&lt;br /&gt;
19:22:22&amp;lt;!Maikel&amp;gt; Maybe we can end with topics suggested during discussion, and start with the predefined agenda.&lt;br /&gt;
19:22:39&amp;lt;!Newton&amp;gt; yes, that would be another option&lt;br /&gt;
19:22:56&amp;lt;!Newton&amp;gt; however i fear that later (at point 5), the whole meeting will start to dissolve a little&lt;br /&gt;
19:22:59&amp;lt;!Maikel&amp;gt; For the future, just start with your point for now&lt;br /&gt;
19:23:31&amp;lt; Asmageddon&amp;gt; Ok, I want lightning system, not neccesarily dynamic, can be precalculated and updated when terrain is modified or light added/removed&lt;br /&gt;
19:23:40&amp;lt; Asmageddon&amp;gt; If you want I have example images made in GIMP&lt;br /&gt;
19:23:42&amp;lt; Asmageddon&amp;gt; but they are a bit big&lt;br /&gt;
19:23:55&amp;lt; Asmageddon&amp;gt; And it will take some time to upload them with my internet&lt;br /&gt;
19:24:21&amp;lt;!Newton&amp;gt; Asmageddon: this is more of a feature request and does not belong here. You&#039;d better post that into the forum. We are now talking about more basic concepts&lt;br /&gt;
19:24:22&amp;lt; Ape&amp;gt; Make them JPEG and they will be small(?)&lt;br /&gt;
19:24:35&amp;lt; Asmageddon&amp;gt; Ok, forget that&lt;br /&gt;
19:24:46&amp;lt; Asmageddon&amp;gt; That is not feature request&lt;br /&gt;
19:24:49&amp;lt; Asmageddon&amp;gt; It is a suggestion&lt;br /&gt;
19:24:56&amp;lt; Asmageddon&amp;gt; it will make OC look WAY better&lt;br /&gt;
19:25:07&amp;lt;!Newton&amp;gt; ok&lt;br /&gt;
19:25:08&amp;lt;!Newton&amp;gt; anyway&lt;br /&gt;
19:25:08&amp;lt; Asmageddon&amp;gt; which can eventually make more people to play OC&lt;br /&gt;
19:25:28&amp;lt;!Isilkor&amp;gt; That is fine and all, but in the end it&#039;s still a feature request&lt;br /&gt;
19:25:32&amp;lt;!Newton&amp;gt; My agenda point: With property lists, effect vars, local vars and script constant callbacks (&amp;quot;IsArrow&amp;quot;), the whole design pattern of which goes where is a bit softened&lt;br /&gt;
19:25:47&amp;lt;+Matthi&amp;gt; (Asmageddon: As right as your point may be: please don&#039;t forget that currently, there isn&#039;t even a GAME one could play)&lt;br /&gt;
19:26:13&amp;lt; Asmageddon&amp;gt; ok :/&lt;br /&gt;
19:26:15&amp;lt;!Newton&amp;gt; + e.g. Visibility as a property, but not GetXDir&lt;br /&gt;
19:26:25&amp;lt;!Newton&amp;gt; I&#039;d like to talk about that later, before point 5 perhaps&lt;br /&gt;
19:26:50&amp;lt;!Zapper&amp;gt; and what to talk about now? :o&lt;br /&gt;
19:26:57&amp;lt;!Newton&amp;gt; except you would like to postpone that to a later session or rather discuss it in the forum&lt;br /&gt;
19:27:22&amp;lt;!Newton&amp;gt; Zapper: what do you mean?&lt;br /&gt;
19:27:32&amp;lt;+Matthi&amp;gt; &amp;quot;Where do we start&amp;quot;&lt;br /&gt;
19:27:37&amp;lt; Ape&amp;gt; Matthi brought up an important issue. We have to make this game playable as quickly as possible.&lt;br /&gt;
19:27:55&amp;lt;!Maikel&amp;gt; That&#039;s what this meeting is for.&lt;br /&gt;
19:28:14&amp;lt;!ck&amp;gt; For me it&#039;s OK to discuss it today I guess. Not sure I have a strong opinion though.&lt;br /&gt;
19:28:15&amp;lt;!Newton&amp;gt; hmm, its not optimal that only the devs know of the agenda while the meeting itself is not moderated (=non-devs can talk too)&lt;br /&gt;
19:28:31&amp;lt;!Isilkor&amp;gt; Newton: move the agenda to the open forums then&lt;br /&gt;
19:28:35&amp;lt;!Isilkor&amp;gt; announcements or something&lt;br /&gt;
19:28:49&amp;lt;!Isilkor&amp;gt; or just post it here&lt;br /&gt;
19:28:54&amp;lt;!Newton&amp;gt; Ape, Asmageddon: http://forum.openclonk.org/topic_show.pl?tid=328&lt;br /&gt;
19:29:04&amp;lt; Ape&amp;gt; Thanks&lt;br /&gt;
19:29:48&amp;lt;!Newton&amp;gt; okay, I think the organizational stuff is finished. I propose that next time, we&#039;ll just find another moderator, we dont need to define some specific order&lt;br /&gt;
19:29:53&amp;lt;!Newton&amp;gt; point 2, status updates&lt;br /&gt;
19:30:16&amp;lt;!Newton&amp;gt; lets take the turns from top to down from the nicklist&lt;br /&gt;
19:30:19&amp;lt;!Newton&amp;gt; ck?&lt;br /&gt;
19:30:31&amp;lt;!ck&amp;gt; I&#039;m busy with the mesh animation stuff&lt;br /&gt;
19:31:03&amp;lt;!ck&amp;gt; Turned out to be not as easy as I thought to provide a somewhat general mechanism with an easy-to-use (C4Script) API&lt;br /&gt;
19:31:18&amp;lt; Asmageddon&amp;gt; That gobby is a clone of another program like that&lt;br /&gt;
19:31:21&amp;lt; Asmageddon&amp;gt; But guess that is unimportant&lt;br /&gt;
19:31:23&amp;lt; Asmageddon&amp;gt; sorry :P&lt;br /&gt;
19:31:39&amp;lt;!ck&amp;gt; The goal is basically to get the swimming animation correct&lt;br /&gt;
19:31:56&amp;lt; Asmageddon&amp;gt; IMO swimming animation is good&lt;br /&gt;
19:32:03&amp;lt;!Newton&amp;gt; Asmageddon, please&lt;br /&gt;
19:32:04&amp;lt; Asmageddon&amp;gt; a &#039;bit&#039; strange, but good&lt;br /&gt;
19:32:05&amp;lt;!ck&amp;gt; It&#039;s displayed incorrect however&lt;br /&gt;
19:32:20&amp;lt; Asmageddon&amp;gt; Ok, sorry :(&lt;br /&gt;
19:32:42&amp;lt;!ck&amp;gt; I guess I&#039;ll end up with something similar to the Stack system I proposed in the forums&lt;br /&gt;
19:33:15&amp;lt;!ck&amp;gt; Where each node in the stack can again be a combination of multiple animations&lt;br /&gt;
19:33:41&amp;lt;!Newton&amp;gt; the stack system you posted in the forum is not implemented yet?&lt;br /&gt;
19:33:43&amp;lt;!ck&amp;gt; Probably this is not the right place to express my thoughts, but I&#039;ll add a documentation page once this is working as I want it&lt;br /&gt;
19:34:33&amp;lt;!ck&amp;gt; No, it isn&#039;t. It partly is on my computer only, but it turned out to be not as easy to use as I&#039;d like it to&lt;br /&gt;
19:34:49&amp;lt;!Newton&amp;gt; ok&lt;br /&gt;
19:35:16&amp;lt;!ck&amp;gt; And after that there is many more mesh stuff to keep me busy for quite a while ;)&lt;br /&gt;
19:36:11&amp;lt;!ck&amp;gt; (like trying out fixed point math or perspective rendering)&lt;br /&gt;
19:36:18&amp;lt;!Randrian&amp;gt; re&lt;br /&gt;
19:36:23-!- Irssi: #openclonk-dev: Total of 25 nicks [3 ops, 0 halfops, 2 voices, 20 normal]&lt;br /&gt;
19:36:28&amp;lt;!ck&amp;gt; Guess that&#039;s it from my side&lt;br /&gt;
19:36:53&amp;lt;!ck&amp;gt; So I think is it Isilkor&#039;s turn then&lt;br /&gt;
19:36:56&amp;lt;!Newton&amp;gt; .oO(wow, perspective rendering. Thats a feature I desire highly)&lt;br /&gt;
19:37:02&amp;lt;!Maikel&amp;gt; What about some models which use, UV,shaders(what do i know), is that hard to implement?&lt;br /&gt;
19:37:37&amp;lt;!ck&amp;gt; Maikel: not sure. I guess it&#039;s not hard, but requires some time&lt;br /&gt;
19:38:21&amp;lt;!ck&amp;gt; it&#039;s still on the agenda, just not with as much as priority as the ones I mentioned above&lt;br /&gt;
19:38:31&amp;lt; Ape&amp;gt; What is the point of perspective rendering if all the objects are on the same surface and has not much depth out of it?&lt;br /&gt;
19:38:59&amp;lt;!ck&amp;gt; The Clonk looks fine without, so it should be possible to get other (less complex?) model to do the same, right?&lt;br /&gt;
19:39:10&amp;lt;!ck&amp;gt; Ape: For ingame pictures basically&lt;br /&gt;
19:39:21&amp;lt;!Randrian&amp;gt; well the sprites for CR always were rendert orthogonally&lt;br /&gt;
19:39:32&amp;lt;!ck&amp;gt; As displayed for example in the HUD&lt;br /&gt;
19:39:46&amp;lt;!Newton&amp;gt; Ape: there has been already a discussion of that in the forum and it turned out that perspective rendering is applicable (and looks good) to a certain limit&lt;br /&gt;
19:39:50&amp;lt;!Isilkor&amp;gt; ck: The mesh rendering doesn&#039;t actually require fixpoint math, does it?&lt;br /&gt;
19:40:02&amp;lt;!Isilkor&amp;gt; It&#039;s just graphics anyway, so doesn&#039;t need to be in perfect sync&lt;br /&gt;
19:40:08&amp;lt;!Randrian&amp;gt; no, but attaching&lt;br /&gt;
19:40:14&amp;lt;!Randrian&amp;gt; attaching to bones needs that&lt;br /&gt;
19:40:17&amp;lt;!ck&amp;gt; Isilkor: No, but it is desirable to query vertex/bone positions in script&lt;br /&gt;
19:40:39&amp;lt;!ck&amp;gt; Randrian also suggested to make use of &amp;quot;ground bones&amp;quot; to aid in synchronizing the mesh animation with the object movement&lt;br /&gt;
19:41:11&amp;lt;!ck&amp;gt; That is, move an object according to a specific bone&#039;s position in the mesh&lt;br /&gt;
19:41:41&amp;lt;!ck&amp;gt; Of course the first step is to find out its impact on performance, and then we can still decide whether it&#039;s a good idea or not&lt;br /&gt;
19:42:54&amp;lt;!ck&amp;gt; (Another feature would be to mount a clonk correctly on a horse)&lt;br /&gt;
19:43:51&amp;lt;!Newton&amp;gt; as long as the bone position cant be queried but only certain meshes attached to it, the math doesnt have to be integer, no?&lt;br /&gt;
19:44:04&amp;lt;!Newton&amp;gt; (meshes, not objects)&lt;br /&gt;
19:44:30&amp;lt;!ck&amp;gt; Sure, but we might also want to put the Clonk as an object at the correct location&lt;br /&gt;
19:45:02&amp;lt;!ck&amp;gt; For collision detection to work correctly&lt;br /&gt;
19:45:06&amp;lt;!Newton&amp;gt; ah right, I was thinking of the sword in the hand of the clonk and such&lt;br /&gt;
19:45:31&amp;lt;!ck&amp;gt; In that case attaching just meshes should work (and that&#039;s even implemented already)&lt;br /&gt;
19:45:39&amp;lt;!Maikel&amp;gt; That&#039;s quite crucial.&lt;br /&gt;
19:46:55&amp;lt;!Newton&amp;gt; hm alright. I got some open items about mesh rendering too, but this doesnt belong here now. Ill get back to that later&lt;br /&gt;
19:47:07&amp;lt;!Newton&amp;gt; now, lets switch to Isilkor?&lt;br /&gt;
19:47:52&amp;lt;!Isilkor&amp;gt; My patch to implement &amp;gt;4 char C4IDs just needs some more polish, but otherwise seems quite solid&lt;br /&gt;
19:48:52&amp;lt;!Isilkor&amp;gt; There&#039;s obviously the problem of having optional definitions which would lead to syntax errors if they&#039;re used without checking&lt;br /&gt;
19:49:17&amp;lt;!Newton&amp;gt; optional defintions?&lt;br /&gt;
19:49:46&amp;lt;!ck&amp;gt; I think it&#039;s good to access those via C4Id, or a GetDefinition() loop, and to be able to rely on the required definitions to be available&lt;br /&gt;
19:49:50&amp;lt;!Isilkor&amp;gt; Stuff that you might want to check for, but isn&#039;t always loaded&lt;br /&gt;
19:49:54&amp;lt; Ape&amp;gt; Do we have a standard on the ID lenght? Should the names be as long as needed or should we prefer some a fixed lenght (like 4)?&lt;br /&gt;
19:49:58&amp;lt;!Maikel&amp;gt; Would that allow for C4IDs with variable length?&lt;br /&gt;
19:50:12&amp;lt;!Isilkor&amp;gt; They would allow for C4IDs of arbitrary identifiers&lt;br /&gt;
19:50:25&amp;lt;!Isilkor&amp;gt; so, things like OC_Library_Inventory&lt;br /&gt;
19:51:23&amp;lt;!Newton&amp;gt; I don&#039;t find the forum topic for that and I dont remember if this question has been discussed:&lt;br /&gt;
19:51:29&amp;lt;!Newton&amp;gt; are all C4IDs reserved words? In the sense that e.g. the C4ID of the clonk is &#039;Clonk&#039;: var Clonk = GetHiRank(0); Clonk-&amp;gt;GetCategory()&lt;br /&gt;
19:51:49&amp;lt;!Isilkor&amp;gt; no, they aren&#039;t. They&#039;re just global constants.&lt;br /&gt;
19:52:32&amp;lt;!Newton&amp;gt; so I should not name a variable &amp;quot;Clonk&amp;quot;, well but if I do, I can not access the global constant &#039;Clonk&#039; in the scope of the variable &#039;Clonk&#039;&lt;br /&gt;
19:52:38&amp;lt;!Newton&amp;gt; +?&lt;br /&gt;
19:52:55-!- Asmageddon [5570c416@euirc-c30e4972.mibbit.com] has quit [Quit: http://www.mibbit.com ajax IRC Client]&lt;br /&gt;
19:52:56&amp;lt;!Isilkor&amp;gt; yes, obviously. If you declare a local variable with the same name, it hides the constant.&lt;br /&gt;
19:53:09&amp;lt;!Isilkor&amp;gt; You can access it via C4Id(&amp;quot;Clonk&amp;quot;) though&lt;br /&gt;
19:53:26&amp;lt; Ape&amp;gt; I believe this is the forum topic for this: http://forum.openclonk.org/topic_show.pl?tid=195&lt;br /&gt;
19:53:41&amp;lt;!Newton&amp;gt; cool, then thats not an issue. I guess the standard will be to id objects with a big first letter (Clonk), variables are normally named with a small first letter (clonk)&lt;br /&gt;
19:54:36&amp;lt;!Maikel&amp;gt; We could also name everything OC_*, but some sort of ID-list in the wiki wouldn&#039;t be a bad thing, I guess.&lt;br /&gt;
19:55:02&amp;lt;!Isilkor&amp;gt; In the absence of namespaces, we should still name it OC_*, even with an ID list.&lt;br /&gt;
19:55:16&amp;lt;!Newton&amp;gt; at least we should agree on some naming scheme as soon as the feature is ~done&lt;br /&gt;
19:55:30&amp;lt;!ck&amp;gt; Do we have some C4Script style guidelines somewhere?&lt;br /&gt;
19:55:33&amp;lt; Ape&amp;gt; Can&#039;t it be ID-&amp;gt;Clonk or something like that?&lt;br /&gt;
19:56:03&amp;lt;!Zapper&amp;gt; Ape, that looks as if &amp;quot;ID&amp;quot; was an object&lt;br /&gt;
19:56:08&amp;lt;!Newton&amp;gt; ck: Clonkonaut started it once: http://forum.openclonk.org/topic_show.pl?pid=4221;hl=style%20guidelines&lt;br /&gt;
19:56:35&amp;lt; Ape&amp;gt; Well it could be an object that is used to get the objects for IDs&lt;br /&gt;
19:57:09&amp;lt; loriel&amp;gt; I think it should be &amp;quot;Core_&amp;quot; or something rather than OC_, so it indicates where the IDs are from rather than trademarking them.&lt;br /&gt;
19:57:31&amp;lt;!Zapper&amp;gt; agreed&lt;br /&gt;
19:57:52&amp;lt;!Newton&amp;gt; hmm&lt;br /&gt;
19:57:55&amp;lt;!Newton&amp;gt; Core_Clonk?&lt;br /&gt;
19:58:03&amp;lt;!Newton&amp;gt; sounds a bit unnecessary&lt;br /&gt;
19:58:16&amp;lt;!ck&amp;gt; As unnecessary as OC_Clonk would be...&lt;br /&gt;
19:58:21&amp;lt;!Isilkor&amp;gt; Newton: Some kind of namespacing is necessary&lt;br /&gt;
19:58:32&amp;lt;!Isilkor&amp;gt; otherwise we&#039;ll get collisions&lt;br /&gt;
19:59:00&amp;lt; loriel&amp;gt; I am not entirely happy with the &amp;quot;OC_&amp;quot; name because at some point someone is going to want to rename the whole thing like it happened between CP, CE and CR at the least, and then there are all those outdated OC_ prefixes stuck all over the project :)&lt;br /&gt;
19:59:06&amp;lt;!Newton&amp;gt; how would the namespaces look?@Syntax&lt;br /&gt;
19:59:09-!- pluto [~pluto@82.113.106.euirc-d8d72950] has joined #openclonk-dev&lt;br /&gt;
19:59:20&amp;lt;!Zapper&amp;gt; There are still people who don&#039;t like the name &amp;quot;OpenClonk&amp;quot;. I&#039;d prefer Core/anything else over OC_&lt;br /&gt;
19:59:46&amp;lt; Ape&amp;gt; object.core.flint and object.apepack.megabomb?&lt;br /&gt;
19:59:57&amp;lt;!Zapper&amp;gt; I like the C++ style&lt;br /&gt;
20:00:06&amp;lt;!Newton&amp;gt; Core::Clonk&lt;br /&gt;
20:00:17&amp;lt;!Zapper&amp;gt; I think a point/-&amp;gt; should be reserved for example for stuff with real objects&lt;br /&gt;
20:00:21&amp;lt; loriel&amp;gt; On the other hand, a name like &amp;quot;Core&amp;quot; kind of prevents stuff from being split into a separate package at a later point, if that would be desirable.&lt;br /&gt;
20:00:23&amp;lt;!Maikel&amp;gt; Whatever types the easiest.&lt;br /&gt;
20:00:45&amp;lt;!ck&amp;gt; Well, we don&#039;t need to agree on a name right now&lt;br /&gt;
20:01:21&amp;lt; loriel&amp;gt; (I was just trying to start an argument about the name, not the syntax. If I understand this right, the _ thing would work right now without messing with the parser.)&lt;br /&gt;
20:01:28&amp;lt;!Isilkor&amp;gt; loriel: yes&lt;br /&gt;
20:01:43&amp;lt;!Isilkor&amp;gt; but foo::C4ID-&amp;gt; doesn&#039;t work anyway, so we can use :: to separate namespaces&lt;br /&gt;
20:02:16&amp;lt;!ck&amp;gt; I guess you mean C4ID::foo-&amp;gt;? :)&lt;br /&gt;
20:02:29&amp;lt;!Isilkor&amp;gt; Uh... maybe ;)&lt;br /&gt;
20:02:55&amp;lt;!Newton&amp;gt; lets postpone that discussion of the name of the namespaces (and its syntax) to a later meeting. The feature is not finished yet anyway&lt;br /&gt;
20:03:08&amp;lt;!ck&amp;gt; I forum poll might also do it&lt;br /&gt;
20:03:18&amp;lt;!ck&amp;gt; once we have a few suggestions&lt;br /&gt;
20:03:28&amp;lt;!Maikel&amp;gt; C_&lt;br /&gt;
20:03:42&amp;lt;!Mimmo_O&amp;gt; or c.clonk&lt;br /&gt;
20:03:44&amp;lt;!Mimmo_O&amp;gt; c.hut&lt;br /&gt;
20:04:01-!- clonkine [~clonkine@euirc-0184f4a7.dynamic.qsc.de] has joined #openclonk-dev&lt;br /&gt;
20:04:09&amp;lt;!Newton&amp;gt; I&#039;d say, let Isilkor do his thing and after the commit, we already have one suggestion (the one of Isilkor) and based on that, we can perhaps discuss it&lt;br /&gt;
20:04:11&amp;lt;!Mimmo_O&amp;gt; hallo clonkine&lt;br /&gt;
20:04:14&amp;lt; clonkine&amp;gt; hi&lt;br /&gt;
20:04:19&amp;lt;!Newton&amp;gt; its nothing we can&#039;t change later&lt;br /&gt;
20:04:38&amp;lt;!Maikel&amp;gt; Ok, my turn(we need to speed this up)&lt;br /&gt;
20:05:42&amp;lt;!Maikel&amp;gt; I tried to C4Script Disasters and some Animals, but got stuck for now because of the animations, and the scenario.txt interface might be changed.&lt;br /&gt;
20:05:50&amp;lt;!Newton&amp;gt; (yes, the temptation to start a discussion over the update is very high. I&#039;ll try to cut the discussion if it gets too long)&lt;br /&gt;
20:06:18&amp;lt;!Newton&amp;gt; the scenario.txt interface might be changed?&lt;br /&gt;
20:06:29&amp;lt;!Maikel&amp;gt; Also the with Command() System is somewhat hard to implement, basic AI stuff&lt;br /&gt;
20:06:53&amp;lt;!Zapper&amp;gt; AI stuff? like movement in a landscape?&lt;br /&gt;
20:06:57&amp;lt;!Zapper&amp;gt; or other AI stuff?&lt;br /&gt;
20:07:00&amp;lt;!Maikel&amp;gt; http://forum.openclonk.org/topic_show.pl?tid=326#pid5330&lt;br /&gt;
20:07:15&amp;lt;!Maikel&amp;gt; Well &amp;quot;Call&amp;quot;is only called once&lt;br /&gt;
20:07:25&amp;lt;!ck&amp;gt; What&#039;s the problem with animations? You mean the models not be loaded entirely?&lt;br /&gt;
20:07:30&amp;lt;!Maikel&amp;gt; yes&lt;br /&gt;
20:07:34&amp;lt;!ck&amp;gt; OK&lt;br /&gt;
20:08:20&amp;lt;!Maikel&amp;gt; So I guess it is nearly impossible to implement something like &amp;quot;Energy&amp;quot; in C4Script&lt;br /&gt;
20:08:35&amp;lt;!Zapper&amp;gt; ?&lt;br /&gt;
20:08:52&amp;lt;!Zapper&amp;gt; I don&#039;t know why you need the Call-Command. For periodic timers?&lt;br /&gt;
20:09:26&amp;lt;!Maikel&amp;gt; Ok you could do anything with effects&lt;br /&gt;
20:09:39&amp;lt;!Mimmo_O&amp;gt; ill take a shower now. im back in about 20 minutes.&lt;br /&gt;
20:09:45&amp;lt;!ck&amp;gt; Can&#039;t you just schedule another Call command in your callback?&lt;br /&gt;
20:10:19&amp;lt;!Newton&amp;gt; hmm, I am not sure myself what the exact problem is, but to clarify this problem shouldnt be part of the status update&lt;br /&gt;
20:10:24&amp;lt;!Newton&amp;gt; lets do that later, shall we?&lt;br /&gt;
20:10:30&amp;lt;!Maikel&amp;gt; Yes next.&lt;br /&gt;
20:10:40&amp;lt;!Zapper&amp;gt; Mimmo is gone. So, newton?&lt;br /&gt;
20:10:45&amp;lt;!Newton&amp;gt; ok&lt;br /&gt;
20:11:21&amp;lt;!Newton&amp;gt; the last 2 months or so I have been working on the script side of new controls (together with Sven2)&lt;br /&gt;
20:11:34&amp;lt;!Newton&amp;gt; and the hud&lt;br /&gt;
20:12:09&amp;lt;!Newton&amp;gt; basically to finish what I wrote in the HUD Konzept: http://forum.openclonk.org/topic_show.pl?tid=297&lt;br /&gt;
20:12:36&amp;lt;!Newton&amp;gt; apart from few bugs and some missing engine features (in the bugtracker), its now done&lt;br /&gt;
20:12:48-!- Sven2 [_ve_2@goldwipf.de] has joined #openclonk-dev&lt;br /&gt;
20:12:51-!- mode/#openclonk-dev [+ao Sven2 Sven2] by ChanServ&lt;br /&gt;
20:13:11&amp;lt;!Newton&amp;gt; the weapons-system if one can call it like that, is done, too. Again a few engine features are missing&lt;br /&gt;
20:13:42&amp;lt;!Newton&amp;gt; next I wanted to focus on A) Gamepad controls and B) menus&lt;br /&gt;
20:13:47&amp;lt;!Sven2&amp;gt; Hey&lt;br /&gt;
20:14:01&amp;lt;!Zapper&amp;gt; Also the close combat weapons?&lt;br /&gt;
20:14:06&amp;lt;!Zapper&amp;gt; Or just the ranged ones?&lt;br /&gt;
20:14:21&amp;lt;!Newton&amp;gt; for B) I have to confess that I can&#039;t do so much script side, so I am waiting for - hi Sven2! - Sven2 to do something in that case ;-)&lt;br /&gt;
20:14:23-!- pluto [~pluto@82.113.106.euirc-d8d72950] has left #openclonk-dev []&lt;br /&gt;
20:14:51&amp;lt;!Zapper&amp;gt; Or, did you do the object-side (like, real weapons) or the interface in the Clonk for weapons?&lt;br /&gt;
20:14:53&amp;lt;!Newton&amp;gt; for A), i wanted to wait how the transfer-contents-with-menus ( B) ) turns out&lt;br /&gt;
20:15:14&amp;lt; clonkine&amp;gt; poor Sven2&lt;br /&gt;
20:15:19&amp;lt;!Newton&amp;gt; Zapper: if you look at the bow, there is not much of a &amp;quot;system&amp;quot; there, it is not needed either&lt;br /&gt;
20:15:44&amp;lt;!Zapper&amp;gt; Otherwise the &amp;quot;weapons system&amp;quot; (aka the templates) for close combat weapons would be what I would do next&lt;br /&gt;
20:15:55&amp;lt;!Randrian&amp;gt; well I started to implement a bit the sword and the animation side of it; the strike animation and so&lt;br /&gt;
20:15:55&amp;lt;!Newton&amp;gt; The ControlUse* commands are basically enough for weapons. A little procedure-check here, a delay there and done is the weapon script&lt;br /&gt;
20:16:49&amp;lt;!Zapper&amp;gt; Randrian, imo we should have it that way that we have one template and the weapons just have to implement some callbacks (like in hazard)&lt;br /&gt;
20:16:53&amp;lt;!Newton&amp;gt; Ringwaul actually tried to create such a template in the tradition of hte Hazard-weapons-template, but it didnt turn out to be too useful&lt;br /&gt;
20:17:04&amp;lt;!Maikel&amp;gt; Well it get&#039;s harder if for example two swords hit each other, or?&lt;br /&gt;
20:17:10&amp;lt;!Zapper&amp;gt; for example!&lt;br /&gt;
20:17:17&amp;lt;!Newton&amp;gt; Zapper: Have a look at the bow. There is no need for a system&lt;br /&gt;
20:17:31&amp;lt;!Randrian&amp;gt; well two swords that shall hit each other will be difficult.&lt;br /&gt;
20:17:37&amp;lt;!Randrian&amp;gt; I would pefere a blocking animation.&lt;br /&gt;
20:17:52&amp;lt;!Randrian&amp;gt; not just some random &amp;quot;hit&amp;quot; of two swords.&lt;br /&gt;
20:18:06&amp;lt;!Newton&amp;gt; but before we dive into some kind of discussion here if a basic object to include from is wise or not, let me just mention one more thing and then Randrian has the word:&lt;br /&gt;
20:18:23&amp;lt;!Randrian&amp;gt; ok sorry&lt;br /&gt;
20:18:58&amp;lt;!Newton&amp;gt; I created some kind of ammunition system, based on a includable library object named &amp;quot;Stackable&amp;quot; (also posted it in the forum) which is from the concept similar to arrows&lt;br /&gt;
20:19:01&amp;lt;!Zapper&amp;gt; Well, Newton. The ideal weaponscript would look like that: func IsAmmunition(obj){return obj-&amp;gt;~Isarrow();} func ShootingBehavior(){return STRAIGHT;} fiinished&lt;br /&gt;
20:19:35&amp;lt;!Newton&amp;gt; so the ammunition used for weapons and other stuff are actually still objects and also the objects which are shot (as opposed to hazard)&lt;br /&gt;
20:20:05&amp;lt;!Newton&amp;gt; I can tell you more abou the details later but for that, you should perhaps read the Bow- and Arrow-scripts first so that we are on the same level&lt;br /&gt;
20:20:08&amp;lt;!Newton&amp;gt; Randrian, your turn&lt;br /&gt;
20:20:13&amp;lt;!Zapper&amp;gt; I just read the bow script :&amp;lt;&lt;br /&gt;
20:20:54&amp;lt;!Randrian&amp;gt; well I have worked on the animations for the clonk.&lt;br /&gt;
20:21:16&amp;lt;!Randrian&amp;gt; for further progress it would be good to have ck&#039;s new animation system ready.&lt;br /&gt;
20:21:25&amp;lt;!Randrian&amp;gt; cause the script interface changes a lot with it.&lt;br /&gt;
20:21:39&amp;lt;!Mimmo_O&amp;gt; okay, re&lt;br /&gt;
20:22:25&amp;lt;!Randrian&amp;gt; I also think I have to change quite a bit about the rig, cause it isn&#039;t perfect for all types of animations yet.&lt;br /&gt;
20:22:39&amp;lt;!Randrian&amp;gt; well and all the animations still need some tweaks.&lt;br /&gt;
20:23:05&amp;lt;!Randrian&amp;gt; I also have made first steps with meshes attached to the clonk.&lt;br /&gt;
20:23:15&amp;lt;!Randrian&amp;gt; for example the clonk holding the sword and striking with it.&lt;br /&gt;
20:23:24&amp;lt;!Randrian&amp;gt; or the clonk holding the bow and animing with it.&lt;br /&gt;
20:23:42&amp;lt;!Newton&amp;gt; nice&lt;br /&gt;
20:23:53&amp;lt;!Randrian&amp;gt; its a bit difficult to get the orientation in Blender right, so the mesh is shown correct ingame&lt;br /&gt;
20:24:16&amp;lt;!ck&amp;gt; Let me know if there is something I can do in the engine to help you with that&lt;br /&gt;
20:24:32&amp;lt;!Randrian&amp;gt; the problem is, that when the mesh has a rotation in Blender (more precisly, the object of the mesh has a rotation assigned to it)&lt;br /&gt;
20:24:49&amp;lt;!Randrian&amp;gt; I think these rotations aren&#039;t shown ingame.&lt;br /&gt;
20:24:54&amp;lt;!Mimmo_O&amp;gt; ive done almost nothing :s i was just strawing around in the forum and posting smoe ideas, but nothing really special&lt;br /&gt;
20:25:14&amp;lt;!ck&amp;gt; Randrian: Would be cool if you can hand me a simple example object&lt;br /&gt;
20:25:20&amp;lt;!ck&amp;gt; I might have a look then&lt;br /&gt;
20:25:28&amp;lt;!Randrian&amp;gt; yes ok, I can make you an example.&lt;br /&gt;
20:25:56&amp;lt;!Randrian&amp;gt; I also got problems latly with exporting the female clonk, cause the animations somehow were wrong.&lt;br /&gt;
20:26:08&amp;lt;!Randrian&amp;gt; I don&#039;t quit know, if it was caused by Blender.&lt;br /&gt;
20:26:42&amp;lt;!Randrian&amp;gt; Blender can assign Armatures to meshes by parenting and also by using a modifier.&lt;br /&gt;
20:26:59&amp;lt;!Randrian&amp;gt; the female just had the armature parented, the male had both.&lt;br /&gt;
20:27:07&amp;lt;!Randrian&amp;gt; it was a bit strange.&lt;br /&gt;
20:27:45&amp;lt;!ck&amp;gt; maybe try whether it&#039;s also broken in an independant ogre mesh viewer. If so, make the model available to me and I&#039;ll see what I can do :)&lt;br /&gt;
20:27:46&amp;lt;!Zapper&amp;gt; As for me, I have not done much lately either. I started with an &amp;quot;animal&amp;quot; (mainly for experimenting with proplists and stuff) and thought I could do the close combat system next&lt;br /&gt;
20:28:15-!- Randrian_ [~randrian@euirc-a663a039.83.171.156.179.ip-pool.NEFkom.net] has joined #openclonk-dev&lt;br /&gt;
20:28:30&amp;lt; Randrian_&amp;gt; args internet...&lt;br /&gt;
20:28:32&amp;lt; Randrian_&amp;gt; &amp;lt;Randrian&amp;gt; yes ok, I can make you an example.&lt;br /&gt;
20:28:36&amp;lt; Randrian_&amp;gt; &amp;lt;Randrian&amp;gt; I also got problems latly with exporting the female clonk, cause the animations somehow were wrong.&lt;br /&gt;
20:28:38&amp;lt; Randrian_&amp;gt; &amp;lt;Randrian&amp;gt; I don&#039;t quit know, if it was caused by Blender.&lt;br /&gt;
20:28:40&amp;lt; Randrian_&amp;gt; &amp;lt;Randrian&amp;gt; Blender can assign Armatures to meshes by parenting and also by using a modifier.&lt;br /&gt;
20:28:42&amp;lt; Randrian_&amp;gt; &amp;lt;Randrian&amp;gt; the female just had the armature parented, the male had both.&lt;br /&gt;
20:28:44&amp;lt; Randrian_&amp;gt; &amp;lt;Randrian&amp;gt; it was a bit strange.&lt;br /&gt;
20:28:46&amp;lt; Randrian_&amp;gt; &amp;lt;Randrian&amp;gt; and I didn&#039;t manage to get the orientation of the bow right up till now.&lt;br /&gt;
20:29:09&amp;lt;!Newton&amp;gt; [20:28] Zapper: As for me, I have not done much lately either. I started with an &amp;quot;animal&amp;quot; (mainly for experimenting with proplists and stuff) and thought I could do the close combat system next&lt;br /&gt;
20:29:09&amp;lt;!Newton&amp;gt; [20:28] ck: maybe try whether it&#039;s also broken in an independant ogre mesh viewer. If so, make the model available to me and I&#039;ll see what I can do :)&lt;br /&gt;
20:29:45&amp;lt;!Mimmo_O&amp;gt; ive done almost nothing :s i was just strawing around in the forum and posting smoe ideas, but nothing certain for OC.&lt;br /&gt;
20:30:15&amp;lt; Randrian_&amp;gt; well the close combat system can be difficult, if it isn&#039;t done along with the animatiions.&lt;br /&gt;
20:30:47&amp;lt;!Newton&amp;gt; I also think that 90% of the close combat is animation-stuff as long as the system itself is not something elaborate&lt;br /&gt;
20:30:56&amp;lt; Randrian_&amp;gt; yes.&lt;br /&gt;
20:31:24&amp;lt;!Newton&amp;gt; (and with only one button=function available, it might be hard to do something elaborate ;-))&lt;br /&gt;
20:31:27&amp;lt;!Mimmo_O&amp;gt; will there be improvements in the close combat system?&lt;br /&gt;
20:31:31&amp;lt; Randrian_&amp;gt; well, the system can be more complex with the mouse move. Cliking and moving the mouse up could result in a strike up.&lt;br /&gt;
20:31:46&amp;lt;!Newton&amp;gt; yes, that would be possible&lt;br /&gt;
20:31:55&amp;lt;!Maikel&amp;gt; Someone else who wants to share what he/she was working on, I think we can end point 2&lt;br /&gt;
20:32:05&amp;lt;!Newton&amp;gt; Mimmo: I don&#039;t think that we stick in any way to the old system of &amp;quot;automatic fight&amp;quot;&lt;br /&gt;
20:32:11&amp;lt;!Zapper&amp;gt; &amp;lt;Newton&amp;gt; (and with only one button=function available, it might be hard to do something elaborate ;-)) &amp;lt;- well, I plan to use the acceleration of the clonk for stuff&lt;br /&gt;
20:32:12&amp;lt;!Mimmo_O&amp;gt; good&lt;br /&gt;
20:32:14&amp;lt;!Newton&amp;gt; well, there is still Sven2&lt;br /&gt;
20:32:16&amp;lt;!Mimmo_O&amp;gt; it was somehow terrible.&lt;br /&gt;
20:32:16&amp;lt;!Newton&amp;gt; @point 2&lt;br /&gt;
20:32:20&amp;lt;!Zapper&amp;gt; for example&lt;br /&gt;
20:32:30&amp;lt;!Maikel&amp;gt; Oh yes, Sry&lt;br /&gt;
20:32:36&amp;lt;!Newton&amp;gt; if he is still there&lt;br /&gt;
20:33:08-!- Randrian [~randrian@der.richard.im.euirc.net] has quit [Ping timeout]&lt;br /&gt;
20:33:09&amp;lt;!Maikel&amp;gt; A sword can also strike differently dependent on where you click relative to the clonk&lt;br /&gt;
20:33:12&amp;lt;!Zapper&amp;gt; Sven has no highlighting enabled as far as I know - will be quite hard to get him here :o&lt;br /&gt;
20:33:28&amp;lt;!Mimmo_O&amp;gt; hm, Maikel&lt;br /&gt;
20:33:30&amp;lt;!Newton&amp;gt; hmm, then perhaps later he returns&lt;br /&gt;
20:33:35&amp;lt;!Mimmo_O&amp;gt; that would result in just klicking and clicking&lt;br /&gt;
20:33:40&amp;lt;!Zapper&amp;gt; even later? :o&lt;br /&gt;
20:33:44&amp;lt;!Mimmo_O&amp;gt; then, suddenly, you stop fighting and accidently throw something away&lt;br /&gt;
20:33:53&amp;lt;!Newton&amp;gt; but well, I know what he was working on, so I can sum it up&lt;br /&gt;
20:34:04&amp;lt;!Zapper&amp;gt; I think throwing stuff away should _always_ be just on Shift+Click btw&lt;br /&gt;
20:34:08&amp;lt;!Zapper&amp;gt; Just to throw that in&lt;br /&gt;
20:34:15&amp;lt;!Mimmo_O&amp;gt; yes, same here&lt;br /&gt;
20:34:26&amp;lt;!Maikel&amp;gt; No, not for gold and rocks&lt;br /&gt;
20:34:47&amp;lt;!Maikel&amp;gt; Everything with ControlUse() { return true;} already does that&lt;br /&gt;
20:35:09&amp;lt;!Zapper&amp;gt; Gold and Rocks don&#039;t have ControlUse(){return true;}&lt;br /&gt;
20:35:19&amp;lt;!Zapper&amp;gt; I think we should have one behaviour everywhere&lt;br /&gt;
20:35:28&amp;lt;!Newton&amp;gt; okay, this shouldn&#039;t be discussed now&lt;br /&gt;
20:35:39&amp;lt;!Newton&amp;gt; I noted it down as something to discuss later&lt;br /&gt;
20:35:50&amp;lt;!Maikel&amp;gt; k&lt;br /&gt;
20:35:56&amp;lt;!Newton&amp;gt; I&#039;ll sum up really short was Sven has been working on well, during silvester&lt;br /&gt;
20:36:32&amp;lt;!Newton&amp;gt; The PlrControls are not quite finished yet.  Some features are missing, some features that have been documented already are also missing&lt;br /&gt;
20:36:32&amp;lt;!Sven2&amp;gt; Sorry, was afk&lt;br /&gt;
20:36:42&amp;lt;!Newton&amp;gt; but as you can see, most of it works...&lt;br /&gt;
20:36:48&amp;lt;!Newton&amp;gt; ah well, you have the word&lt;br /&gt;
20:36:50&amp;lt;!Sven2&amp;gt; Yes, menus are on the list&lt;br /&gt;
20:37:26&amp;lt;!Sven2&amp;gt; Well, I thought about re-implementing controls for classic menus (really just a few bugixes I think) and then allow custom dialogs&lt;br /&gt;
20:38:05&amp;lt;!Sven2&amp;gt; Custom dialogs should cover stuff like PeterW mentioned in the forum; the overhead building menus&lt;br /&gt;
20:38:50&amp;lt;!Sven2&amp;gt; Anyway, what kind of stuff is really missing in the engine right now?&lt;br /&gt;
20:39:10&amp;lt;!Sven2&amp;gt; I don&#039;t think it&#039;s menus, because those aren&#039;t used anywhere yet?&lt;br /&gt;
20:39:38&amp;lt;!Newton&amp;gt; how can I use menus if they are not implemented yet? I need non-modal menus ^^&lt;br /&gt;
20:40:12&amp;lt;!Sven2&amp;gt; Is that in the bugtracker yet?&lt;br /&gt;
20:40:35&amp;lt;!Sven2&amp;gt; I believe it can be done quite easily. Though getting multiple menus per viewport might be difficult&lt;br /&gt;
20:40:41&amp;lt;!Newton&amp;gt; the other stuff that is &#039;really&#039; missing are (from my side) a few single features that are all in the bugtracker&lt;br /&gt;
20:40:46&amp;lt;!Sven2&amp;gt; How are you supposed to control them by gamepad if they&#039;re not modal?&lt;br /&gt;
20:41:12&amp;lt;!Newton&amp;gt; the custom dialog stuff is not in the bugtracker though because I was thinking you have a concept for that&lt;br /&gt;
20:41:39&amp;lt;!Newton&amp;gt; Sven2: that is the question@how to control by gamepad&lt;br /&gt;
20:41:41&amp;lt;!Sven2&amp;gt; Basically, it&#039;s supposed to be a bunch of functions like CreateDialog, AddDialogItem, etc.&lt;br /&gt;
20:42:39&amp;lt;!Newton&amp;gt; (what we need is a concept for dialogs that work for mouse controls and non-mouse controls [gamepad] alike. I didnt think of anything yet)&lt;br /&gt;
20:42:47&amp;lt;!Sven2&amp;gt; Though I also thought about a different concept to have just CreateDialog(dlg) /UpdateDialog(handle, dlg) /DestroyDialog(handle) and have &amp;quot;dlg&amp;quot; be a proplist that contains all dialog information&lt;br /&gt;
20:45:31&amp;lt;!Newton&amp;gt; I am more concerned that a dialog-system that works good for mouse won&#039;t work with gamepad. I will start some topic to find how contents-transfer could work with gamepad (e.g. how it works in other console games with inventory and items)&lt;br /&gt;
20:45:46&amp;lt;!Newton&amp;gt; otherwise, I think we are done with point 2?&lt;br /&gt;
20:46:26&amp;lt;!Maikel&amp;gt; yes&lt;br /&gt;
20:46:27&amp;lt;!Sven2&amp;gt; You would need the concept of a &amp;quot;focused&amp;quot; dialog for gamepad control&lt;br /&gt;
20:46:55&amp;lt;!Newton&amp;gt; point 3, Website: Blog, Homepage, Wiki&lt;br /&gt;
20:46:56&amp;lt;!Sven2&amp;gt; Even if it&#039;s not &amp;quot;modal&amp;quot;, i.e. you could have seperate controls for dialog and Clonk control if your gamepad permits it&lt;br /&gt;
20:47:45&amp;lt;!Mimmo_O&amp;gt; (Sven2, stop)&lt;br /&gt;
20:47:53&amp;lt;!Zapper&amp;gt; I still think we can use the forum as a &amp;quot;blog&amp;quot;&lt;br /&gt;
20:48:18&amp;lt;!Mimmo_O&amp;gt; i think we should use something like a blog&lt;br /&gt;
20:48:19&amp;lt;!ck&amp;gt; Do you mean these blogs that are built in into mwf?&lt;br /&gt;
20:48:33&amp;lt;!ck&amp;gt; Like they were enabled in the english forums some time ago?&lt;br /&gt;
20:48:37&amp;lt;!Zapper&amp;gt; no, mawic disabled them&lt;br /&gt;
20:48:41&amp;lt;!Zapper&amp;gt; or, kicked them out&lt;br /&gt;
20:48:46&amp;lt;!ck&amp;gt; oh.&lt;br /&gt;
20:48:47&amp;lt;!Zapper&amp;gt; just make a subforum &amp;quot;blogs&amp;quot;&lt;br /&gt;
20:48:48&amp;lt;!Newton&amp;gt; yes@kicked them out&lt;br /&gt;
20:48:49&amp;lt;!Maikel&amp;gt; About the wiki: That should contain (now and in the future) all faqs regarding OpenClonk development, but for now it should be structured somewhat more clearer.&lt;br /&gt;
20:48:54&amp;lt;!Mimmo_O&amp;gt; if someone who is interested in OC comes to the site, he just sees some black/white page with a forum... nooone wants to read through it just to gather some informations&lt;br /&gt;
20:48:55&amp;lt;!Zapper&amp;gt; Where would be the difference to any other blog software?&lt;br /&gt;
20:49:08&amp;lt;!Newton&amp;gt; err, lets stick to the blog topic a few minutes, Maikel&lt;br /&gt;
20:49:38&amp;lt;!Newton&amp;gt; I agree to Mimmo actually. A subforum with forum topics, this is not a blog&lt;br /&gt;
20:49:45&amp;lt;!Mimmo_O&amp;gt; its Blog, Homepage, Wiki, not Wiki, blabla :p&lt;br /&gt;
20:49:47&amp;lt;!Newton&amp;gt; as much as Announcements is not a blog&lt;br /&gt;
20:49:50&amp;lt;!Sven2&amp;gt; If people want to start blogs, they will. Otherwise, they won&#039;t. I don&#039;t think a forum will change this&lt;br /&gt;
20:50:03&amp;lt;!ck&amp;gt; Zapper: Does mwf provide RSS feeds?&lt;br /&gt;
20:50:14&amp;lt;!ck&amp;gt; Trackbacks?&lt;br /&gt;
20:50:14&amp;lt;!Zapper&amp;gt; Uh, I dont know&lt;br /&gt;
20:50:35&amp;lt;!Newton&amp;gt; ck: yes, I tried to enable them a few times but it does only work properly if you have a proper server, not some CGI enabled webspace&lt;br /&gt;
20:50:53&amp;lt;!Maikel&amp;gt; Wouldn&#039;t be useful to establish that we have enough writers, to have at least one item a week?&lt;br /&gt;
20:51:08&amp;lt;!ck&amp;gt; I think the serendipity ones work on my shared hosting account&lt;br /&gt;
20:51:15&amp;lt;!Mimmo_O&amp;gt; i think we will come to at least 3 a week&lt;br /&gt;
20:51:31&amp;lt;!Newton&amp;gt; ck: can you post your serendipity blog link?&lt;br /&gt;
20:51:36&amp;lt;!Mimmo_O&amp;gt; if every developer has acces to write a new entry&lt;br /&gt;
20:51:41&amp;lt;!ck&amp;gt; Newton: http://arbur.net/serendipity&lt;br /&gt;
20:52:40&amp;lt;!Newton&amp;gt; why is serendipity &amp;gt; wordpress? For our use?&lt;br /&gt;
20:52:52&amp;lt;!ck&amp;gt; I didn&#039;t say that.&lt;br /&gt;
20:53:11&amp;lt;!ck&amp;gt; I just said its RSS feeds work on my (quite limited) webspace account.&lt;br /&gt;
20:53:13&amp;lt;!Newton&amp;gt; err, I didnt mean it that way&lt;br /&gt;
20:53:28&amp;lt;!ck&amp;gt; It&#039;s the only blog system I have experienced with, I can&#039;t say anything about wordpress&lt;br /&gt;
20:53:29&amp;lt;!Newton&amp;gt; but I want to set up a system and asking you (you in plural) which one to prefer&lt;br /&gt;
20:53:57&amp;lt;!Mimmo_O&amp;gt; i have no opinion to that, due to my lack of knowledge about them&lt;br /&gt;
20:54:05&amp;lt;!Mimmo_O&amp;gt; i would say &amp;quot;one which is easy to use&amp;quot;&lt;br /&gt;
20:54:11&amp;lt;!Sven2&amp;gt; So, this is like a more relaxed &amp;quot;news&amp;quot; column?&lt;br /&gt;
20:54:31&amp;lt;!Newton&amp;gt; ck: can one integrate the blog (or e.g. &amp;quot;the newest 3 items of the blog&amp;quot;) in the mediawiki or in some otherwise plain HTML file (e.g. the homepage)&lt;br /&gt;
20:54:58&amp;lt;!ck&amp;gt; Sven2: kind of... to keep interested partys informed in a structured way&lt;br /&gt;
20:55:10&amp;lt;!Newton&amp;gt; Sven2: a developers blog. Clonk.de didnt have this... well perhaps later with ClonkX, a little&lt;br /&gt;
20:55:27&amp;lt;!ck&amp;gt; Newton: I think so, with some scripting. My blog is aggregated on planet.gnome.org&lt;br /&gt;
20:55:46&amp;lt;!ck&amp;gt; which basically displays recent entries&lt;br /&gt;
20:55:49&amp;lt;!Maikel&amp;gt; Then the role of news, would just be to announce new versions and beta-test, etc.&lt;br /&gt;
20:56:26&amp;lt;!Newton&amp;gt; what i&#039;d like is that we all have a single login for the blog&lt;br /&gt;
20:56:52&amp;lt;!ck&amp;gt; oh, why that?&lt;br /&gt;
20:56:56&amp;lt;!Newton&amp;gt; (so that the devs don&#039;t need to register in 4 places for the website)&lt;br /&gt;
20:57:07&amp;lt;!Newton&amp;gt; already now, with bugtrack, wiki and forum its a bit much, dont you think?&lt;br /&gt;
20:57:30&amp;lt;!ck&amp;gt; It might be interesting who wrote a particular blog entry though...&lt;br /&gt;
20:57:39&amp;lt;!ck&amp;gt; +to know&lt;br /&gt;
20:57:47&amp;lt;!Maikel&amp;gt; Well we can sign it with our names&lt;br /&gt;
20:57:51&amp;lt;!Maikel&amp;gt; yes @ newton&lt;br /&gt;
20:58:31&amp;lt;!Newton&amp;gt; ok, Ill first install Serendipity and then we can play around with it a little before we finally settle with that&lt;br /&gt;
20:58:59&amp;lt;!Newton&amp;gt; next: wiki. Maikel?&lt;br /&gt;
20:59:27&amp;lt;!Maikel&amp;gt; About the wiki: That should contain (now and in the future) all faqs regarding OpenClonk development, but for now it should be structured somewhat more clearer.&lt;br /&gt;
20:59:40&amp;lt;!Maikel&amp;gt; A bit more structure would already do the job there.&lt;br /&gt;
21:00:02&amp;lt;!ck&amp;gt; Do you have something concrete in mind?&lt;br /&gt;
21:00:04&amp;lt;!Maikel&amp;gt; code style rules at the right place, etc.&lt;br /&gt;
21:00:25&amp;lt;!Maikel&amp;gt; Well there are numerous examples of opensource game sites&lt;br /&gt;
21:01:01&amp;lt;!Newton&amp;gt; hm, I dont see your ponit&lt;br /&gt;
21:01:04&amp;lt;!Newton&amp;gt; *point&lt;br /&gt;
21:01:17&amp;lt;!Maikel&amp;gt; I would separate the page in Getting started(to play clonk), Content development, Engine development&lt;br /&gt;
21:01:22&amp;lt;!Newton&amp;gt; the /Project page and everything below seems to be perfectly structured&lt;br /&gt;
21:01:38&amp;lt;!Newton&amp;gt; you mean the Home page?&lt;br /&gt;
21:02:04&amp;lt;!Maikel&amp;gt; No, for example the coding style stuff is missing&lt;br /&gt;
21:02:31&amp;lt;!Newton&amp;gt; hmm, right&lt;br /&gt;
21:02:38&amp;lt;!Newton&amp;gt; it was there somewhere though, no?&lt;br /&gt;
21:03:11&amp;lt;!Maikel&amp;gt; http://wiki.openclonk.org/w/Style_Guidelines&lt;br /&gt;
21:04:26&amp;lt;!Newton&amp;gt; hm anyway. I am not sure if we have to discuss this. The wiki was just grown how the people contributed it. Nobody will cry if you add some links and reorganize some pages&lt;br /&gt;
21:04:37&amp;lt;!Maikel&amp;gt; Indeed&lt;br /&gt;
21:06:00&amp;lt;!Newton&amp;gt; so, err. Go ahead ;-)&lt;br /&gt;
21:06:41&amp;lt;!Newton&amp;gt; Also, the links in the upper navigation are not out of concrete. If you want additional links or something, tell me&lt;br /&gt;
21:06:55&amp;lt;!Newton&amp;gt; which leads us to the homepage, I guess&lt;br /&gt;
21:07:03&amp;lt;!Maikel&amp;gt; I&#039;d rather go to point 4, and leave that for now( we can discuss it in some weeks)&lt;br /&gt;
21:07:08&amp;lt;!Newton&amp;gt; ok&lt;br /&gt;
21:07:27&amp;lt;!Newton&amp;gt; goals, yeah&lt;br /&gt;
21:07:32-!- Randrian__ [~randrian@euirc-06a781a2.83.171.170.113.ip-pool.NEFkom.net] has joined #openclonk-dev&lt;br /&gt;
21:07:37&amp;lt;!Newton&amp;gt; but this requires that everybody is still here, i think&lt;br /&gt;
21:07:47&amp;lt;!Newton&amp;gt; motivation check!&lt;br /&gt;
21:07:48&amp;lt;!Mimmo_O&amp;gt; .&lt;br /&gt;
21:07:48&amp;lt;!Maikel&amp;gt; Yes HL?&lt;br /&gt;
21:07:56 * ck &lt;br /&gt;
21:08:00-Mimmo_O:#openclonk-dev- everyone is here!&lt;br /&gt;
21:08:14&amp;lt;!Zapper&amp;gt; ill be afk soon&lt;br /&gt;
21:08:29&amp;lt;!Sven2&amp;gt; Yes&lt;br /&gt;
21:08:30&amp;lt; Randrian__&amp;gt; what is the question? I was just disconnected&lt;br /&gt;
21:08:43&amp;lt;!Newton&amp;gt; if all are stil lthere, because we move to point 5&lt;br /&gt;
21:08:44&amp;lt;!Newton&amp;gt; Goals&lt;br /&gt;
21:08:52&amp;lt; Randrian__&amp;gt; \me is here&lt;br /&gt;
21:09:02 * Ape is here&lt;br /&gt;
21:09:09&amp;lt;!Newton&amp;gt; Maikel mentioned in the forum, that we need to set reachable goals (and make them public)&lt;br /&gt;
21:09:12&amp;lt;!Mimmo_O&amp;gt; *point 4&lt;br /&gt;
21:09:13&amp;lt;!Isilkor&amp;gt; You want to go to point 4 if everyone is here, but then rather go to 5?&lt;br /&gt;
21:09:17&amp;lt;!Isilkor&amp;gt; I don&#039;t quite get it&lt;br /&gt;
21:09:24&amp;lt;!Newton&amp;gt; oops&lt;br /&gt;
21:09:27&amp;lt;!Newton&amp;gt; sorry, point 4&lt;br /&gt;
21:09:34&amp;lt;!Maikel&amp;gt; So I would like to have a somewhat playable game before the OCM in april. That is some melee scenario&#039;s where one can use some weapons, flints dynamite, catapult, and test the clonk&#039;s controls&lt;br /&gt;
21:09:59&amp;lt;!Sven2&amp;gt; Skyrace is playable ;)&lt;br /&gt;
21:10:12&amp;lt;!Mimmo_O&amp;gt; i want the catapult to be controllable like the on in CX&lt;br /&gt;
21:10:18&amp;lt;!Mimmo_O&amp;gt; with catapulting clonks.&lt;br /&gt;
21:10:26&amp;lt;!Mimmo_O&amp;gt; (i already have scripted something like this for CR)&lt;br /&gt;
21:10:31&amp;lt;!Newton&amp;gt; that means, focus on melee and race, tools and weapons rather than buildings and such (until the OCM), right?&lt;br /&gt;
21:10:48&amp;lt;!Maikel&amp;gt; Yes, but if we provide like 5-10 scenario&#039;s (Melee&#039;s &amp;amp; Races) we can have our first &amp;quot;release&amp;quot;&lt;br /&gt;
21:11:03&amp;lt;!Zapper&amp;gt; I am still eager to build the weapons system :]&lt;br /&gt;
21:11:16&amp;lt;!Maikel&amp;gt; Yes newton&lt;br /&gt;
21:11:27&amp;lt;!Mimmo_O&amp;gt; imo we need bows, muskets, swords, shields&lt;br /&gt;
21:11:29&amp;lt;!Sven2&amp;gt; Concerning Races: I thought about calling them &amp;quot;Parcour&amp;quot; instead&lt;br /&gt;
21:11:30&amp;lt;!Mimmo_O&amp;gt; maybe axes&lt;br /&gt;
21:11:32&amp;lt;!Maikel&amp;gt; Has anyone something against this plan?&lt;br /&gt;
21:11:33&amp;lt;!Sven2&amp;gt; So we&#039;d have a new name :)&lt;br /&gt;
21:11:39&amp;lt;!Mimmo_O&amp;gt; sven: good idea&lt;br /&gt;
21:11:42&amp;lt;!Zapper&amp;gt; I dont @maikel&lt;br /&gt;
21:11:51&amp;lt;!ck&amp;gt; Sounds reasonable. Might be good to be a bit more specific though.&lt;br /&gt;
21:11:54&amp;lt;!Mimmo_O&amp;gt; me neither&lt;br /&gt;
21:11:57&amp;lt;!Zapper&amp;gt; But we should also do the planned landscape improvements before the first &amp;quot;release&amp;quot;&lt;br /&gt;
21:12:03-!- Randrian_ [~randrian@euirc-a663a039.83.171.156.179.ip-pool.NEFkom.net] has quit [Ping timeout]&lt;br /&gt;
21:12:08&amp;lt;!Maikel&amp;gt; Yes that&#039;s what I&#039;d like to do now&lt;br /&gt;
21:12:10&amp;lt;!Zapper&amp;gt; Be it proper hiding of the pixels (as discussed) or the polygon stuff&lt;br /&gt;
21:12:22&amp;lt;!Newton&amp;gt; that goal is very reachable, I think. Too bad that this means that we dont do anything with production lines, buildings, mining etc. (until then at least). But the good thing is that we are not dependent on the dialog system up and running -&amp;gt; I can start with gamepad controls&lt;br /&gt;
21:12:48&amp;lt;!Newton&amp;gt; what landscape improvements, Zapper?&lt;br /&gt;
21:12:53&amp;lt;!Newton&amp;gt; ah&lt;br /&gt;
21:13:11&amp;lt;!Zapper&amp;gt; I mean, I zoomed in (to be able to see my Clonks!) and was like &amp;quot;:(&amp;quot;&lt;br /&gt;
21:13:14&amp;lt;!Maikel&amp;gt; Personally I prefer settling too, but well Melee&#039;s are played so much more.&lt;br /&gt;
21:13:20&amp;lt;!Sven2&amp;gt; I think, most importantly, the landscape shouldn&#039;t be a blurry mess when zoomed in&lt;br /&gt;
21:13:30&amp;lt;!Mimmo_O&amp;gt; agreed&lt;br /&gt;
21:13:51&amp;lt;!Newton&amp;gt; well, I have been working on the polygon stuff but it is now frozen. It&#039;s my bachelors work and needs more time now (needs to be scientific and stuff ;-) )&lt;br /&gt;
21:14:05&amp;lt;!ck&amp;gt; This basically requires higher resolved textures, right?&lt;br /&gt;
21:14:11&amp;lt;!Newton&amp;gt; I&#039;ll probably work on that after I finished gamepad controls and my exams are over&lt;br /&gt;
21:14:17&amp;lt;!Sven2&amp;gt; I think PeterW had a simple approach to use a 3x zooming algorithm&lt;br /&gt;
21:14:22&amp;lt;!Sven2&amp;gt; (gp3x?)&lt;br /&gt;
21:14:27&amp;lt;!Mimmo_O&amp;gt; (textures, i posted a link in the forum for cool ice-textures)&lt;br /&gt;
21:14:32&amp;lt;!Mimmo_O&amp;gt; (hahaha, &amp;quot;cool ice textures&amp;quot;)&lt;br /&gt;
21:15:00&amp;lt;!ck&amp;gt; Sven2: I think the straight-forward way turned out to be too slow performance-wise if I remember correctly&lt;br /&gt;
21:15:07-!- JC-weg is now known as JCaesar&lt;br /&gt;
21:15:24&amp;lt;!ck&amp;gt; I&#039;m not sure this was the end of the story though&lt;br /&gt;
21:15:29&amp;lt;!Sven2&amp;gt; Zooming the 8 bit landscape with some algorithm, then turn texture indices into textures in a shader?&lt;br /&gt;
21:17:13&amp;lt;!ck&amp;gt; Is there another way?&lt;br /&gt;
21:17:21&amp;lt;!Maikel&amp;gt; Should we start specifying what needs to be done to reach the goal(Etherpad?)&lt;br /&gt;
21:17:43&amp;lt;!Newton&amp;gt; mh&lt;br /&gt;
21:18:05&amp;lt;!Newton&amp;gt; I guess its clear whats our goal until the last week of march&lt;br /&gt;
21:18:26&amp;lt;!Newton&amp;gt; so yeah, I guess we can move to etherpad to do some concepts of what should be inside the &amp;quot;release&amp;quot;&lt;br /&gt;
21:18:33&amp;lt; Ape&amp;gt; Aren&#039;t we supposed to play with Gobby :D&lt;br /&gt;
21:18:47&amp;lt;!Newton&amp;gt; wait a moment&lt;br /&gt;
21:18:54&amp;lt;!Maikel&amp;gt; *shameredcheeks* I havn&#039;t installed it&lt;br /&gt;
21:19:02&amp;lt;!Maikel&amp;gt; afk 2min&lt;br /&gt;
21:19:06&amp;lt;!Newton&amp;gt; http://etherpad.com/Clonkpad&lt;br /&gt;
21:19:17&amp;lt;!Newton&amp;gt; hmm&lt;br /&gt;
21:19:22&amp;lt;!Newton&amp;gt; there is only one document in etherpad?&lt;br /&gt;
21:19:32&amp;lt;!ck&amp;gt; Yes, I think so&lt;br /&gt;
21:25:33&amp;lt;!Newton&amp;gt; I started a gobby session&lt;br /&gt;
21:25:41&amp;lt;!Newton&amp;gt; 92.224.25.239 port 11111 (version 0.4.12 stable)&lt;br /&gt;
21:25:43&amp;lt;!Maikel&amp;gt; 4.12?&lt;br /&gt;
21:25:46&amp;lt;!Newton&amp;gt; yes&lt;br /&gt;
21:25:51&amp;lt;!Maikel&amp;gt; reinstall&lt;br /&gt;
21:28:31&amp;lt;!Newton&amp;gt; hm whats that&lt;br /&gt;
21:28:38&amp;lt;!Newton&amp;gt; did gobby jsut crash?&lt;br /&gt;
21:28:43&amp;lt;!Newton&amp;gt; ah, it was just randrian&lt;br /&gt;
21:29:00&amp;lt;!Maikel&amp;gt; How can I see which colour is who?&lt;br /&gt;
21:29:27-!- Mortimer [~Martin@euirc-74bf8acf.extern.uni-duisburg-essen.de] has quit [Client exited]&lt;br /&gt;
21:29:31&amp;lt;!ck&amp;gt; Maikel: Klick the user list item in the toolbar&lt;br /&gt;
21:29:37-!- Randrian_ [~randrian@euirc-1ce9338b.83.171.188.109.ip-pool.NEFkom.net] has joined #openclonk-dev&lt;br /&gt;
21:30:11&amp;lt;!Sven2&amp;gt; I cant get into a document...&lt;br /&gt;
21:30:53&amp;lt;!ck&amp;gt; touble click an item in the document list, or select one and hit subscribe&lt;br /&gt;
21:31:26&amp;lt;!Sven2&amp;gt; Doesnt work&lt;br /&gt;
21:31:32&amp;lt;!Sven2&amp;gt; My chat doesnt seem to arrive either&lt;br /&gt;
21:32:02-!- Randrian__ [~randrian@euirc-06a781a2.83.171.170.113.ip-pool.NEFkom.net] has quit [Ping timeout]&lt;br /&gt;
21:32:08&amp;lt;!Sven2&amp;gt; And I lose connection after a while&lt;br /&gt;
21:32:23&amp;lt;!Newton&amp;gt; shit :o&lt;br /&gt;
21:34:02&amp;lt;!Sven2&amp;gt; Just changed my color&lt;br /&gt;
21:34:14&amp;lt;!Sven2&amp;gt; I can see your chat though&lt;br /&gt;
21:34:22&amp;lt;!ck&amp;gt; no idea. Does gobby.0x539.de:6522 work?&lt;br /&gt;
21:34:50&amp;lt;!Sven2&amp;gt; I installed the old over the new. Is that a problem?&lt;br /&gt;
21:35:35&amp;lt;!Sven2&amp;gt; Where is gobby.0x539.de:6522?&lt;br /&gt;
21:35:58&amp;lt;!ck&amp;gt; I can&#039;t think of any problems out of my head, but you might try reinstalling it into a clean directory&lt;br /&gt;
21:35:58&amp;lt;!Isilkor&amp;gt; newton&lt;br /&gt;
21:36:01&amp;lt;!Isilkor&amp;gt; the wiki is broken&lt;br /&gt;
21:36:02&amp;lt;!Isilkor&amp;gt; editing pages fails&lt;br /&gt;
21:36:21&amp;lt; s_m_w&amp;gt; I cannot get into any documents either. After double clicking, subscribe is greyed out but it still doesn&#039;t work&lt;br /&gt;
21:36:30&amp;lt;!ck&amp;gt; Use gobby.0x539.de as hostname and 6522 as port. It&#039;s another (public) server.&lt;br /&gt;
21:37:56&amp;lt;!Sven2&amp;gt; I reinstalled and got in now&lt;br /&gt;
21:41:56&amp;lt;!Sven2&amp;gt; Hm. Have to leave for the cinema now&lt;br /&gt;
21:43:21&amp;lt;!Maikel&amp;gt; We&#039;ll change stuff later I guess&lt;br /&gt;
21:43:29&amp;lt;!Maikel&amp;gt; on later occasions.&lt;br /&gt;
21:53:18&amp;lt;!Newton&amp;gt; Isilkor: whoa??&lt;br /&gt;
21:53:49&amp;lt;!Isilkor&amp;gt; &amp;quot;A database query syntax error has occurred. [...] 1146: Table &#039;db1144497-wiki.wiki_tag_summary&#039; doesn&#039;t exist (localhost)&amp;quot;&lt;br /&gt;
21:53:51&amp;lt;!Newton&amp;gt; what page exactly, Isilkor? For me it works&lt;br /&gt;
21:53:59&amp;lt;!Newton&amp;gt; hmm&lt;br /&gt;
21:54:01&amp;lt;!Isilkor&amp;gt; every page&lt;br /&gt;
21:54:19&amp;lt;!Newton&amp;gt; odd, for me it works&lt;br /&gt;
21:54:30&amp;lt;!Newton&amp;gt; ill be on that problem as soon as we are done in gobby&lt;br /&gt;
21:54:48&amp;lt;!Newton&amp;gt; i hope we can bring it to something substantial&lt;br /&gt;
21:55:42-!- Ape [~ape@euirc-7fdc53a9.dhcp.inet.fi] has quit [Client exited]&lt;br /&gt;
22:03:59-!- Phantomwipf is now known as Phanto^away&lt;br /&gt;
22:04:05-!- Randrian__ [~randrian@euirc-370b466d.83.171.161.68.ip-pool.NEFkom.net] has joined #openclonk-dev&lt;br /&gt;
22:06:04-!- Randrian_ [~randrian@euirc-1ce9338b.83.171.188.109.ip-pool.NEFkom.net] has quit [Ping timeout]&lt;br /&gt;
22:18:07&amp;lt;!Newton&amp;gt; shit&lt;br /&gt;
22:18:09&amp;lt;!Newton&amp;gt; gobby crashed&lt;br /&gt;
22:18:12&amp;lt;!Newton&amp;gt; someone save it&lt;br /&gt;
22:18:58&amp;lt;!ck&amp;gt; hrm&lt;br /&gt;
22:18:58&amp;lt;!ck&amp;gt; done&lt;br /&gt;
22:19:07&amp;lt;!Newton&amp;gt; can you reopen it?&lt;br /&gt;
22:19:09&amp;lt;!Mimmo_O&amp;gt; hab&lt;br /&gt;
22:19:24&amp;lt;!Mimmo_O&amp;gt; just reopen&lt;br /&gt;
22:19:45&amp;lt;!ck&amp;gt; on 0x539.de only, don&#039;t have access to the firewall here&lt;br /&gt;
22:20:02&amp;lt;!Newton&amp;gt; meaning you cant host?&lt;br /&gt;
22:20:06&amp;lt;!Mimmo_O&amp;gt; Newton, just rehost, ill paste everything&lt;br /&gt;
22:20:19&amp;lt;!ck&amp;gt; in that case all colors are lost&lt;br /&gt;
22:20:24&amp;lt;!Newton&amp;gt; oh, crashed again&lt;br /&gt;
22:20:26&amp;lt;!Newton&amp;gt; I&#039;ll reopen&lt;br /&gt;
22:20:45&amp;lt;!Newton&amp;gt; if you give me the session file&lt;br /&gt;
22:20:57&amp;lt;!Mimmo_O&amp;gt; they will also be lost if you save normally&lt;br /&gt;
22:21:16&amp;lt;!Newton&amp;gt; normally no&lt;br /&gt;
22:21:18&amp;lt;!Mimmo_O&amp;gt; i could only save the documents&lt;br /&gt;
22:21:23&amp;lt;!ck&amp;gt; mom&lt;br /&gt;
22:22:12&amp;lt;!Mimmo_O&amp;gt; whatever, i have to go&lt;br /&gt;
22:22:28&amp;lt;!Newton&amp;gt; yeah, it took really long&lt;br /&gt;
22:22:43&amp;lt;!ck&amp;gt; http://www-ekp.physik.uni-karlsruhe.de/~burgmeier/gobby.obby&lt;br /&gt;
22:22:46&amp;lt;!Newton&amp;gt; I want to try to get that meeting to an end too&lt;br /&gt;
22:23:23&amp;lt;!Newton&amp;gt; but the gobby session is the last point anyway&lt;br /&gt;
22:23:24&amp;lt;!Mimmo_O&amp;gt; if it does not work&lt;br /&gt;
22:23:28&amp;lt;!Mimmo_O&amp;gt; http://de.wiki.nosebud.de/paste/xlK44YJo.html&lt;br /&gt;
22:23:41&amp;lt;!Newton&amp;gt; because the distribution of work is already in the session&lt;br /&gt;
22:23:45&amp;lt;!Newton&amp;gt; reopen&lt;br /&gt;
22:24:05&amp;lt;!Mimmo_O&amp;gt; im off now&lt;br /&gt;
22:24:12&amp;lt;!Maikel&amp;gt; ok&lt;br /&gt;
22:24:18&amp;lt;!Maikel&amp;gt; cu&lt;br /&gt;
22:24:23&amp;lt;!Mimmo_O&amp;gt; good night&lt;br /&gt;
22:24:26&amp;lt;!ck&amp;gt; cya&lt;br /&gt;
22:24:35-!- Mimmo_O [~mimmoisgr@euirc-ae063962.dip0.t-ipconnect.de] has quit [Quit: ]&lt;br /&gt;
22:35:46&amp;lt;!Newton&amp;gt; err&lt;br /&gt;
22:35:51&amp;lt;!Newton&amp;gt; someone save the session please&lt;br /&gt;
22:36:01&amp;lt;!Newton&amp;gt; perhaps its just Randrian pinging out&lt;br /&gt;
22:36:38&amp;lt;!ck&amp;gt; it&#039;s still running, isn&#039;t it?&lt;br /&gt;
22:37:10-!- Randrian_ [~randrian@euirc-27f0becc.83.171.182.120.ip-pool.NEFkom.net] has joined #openclonk-dev&lt;br /&gt;
22:41:06-!- Randrian__ [~randrian@euirc-370b466d.83.171.161.68.ip-pool.NEFkom.net] has quit [Ping timeout]&lt;br /&gt;
22:44:32&amp;lt;!Newton&amp;gt; this meeting was even longer then I expected&lt;br /&gt;
22:44:41&amp;lt;!Newton&amp;gt; I&#039;ll summarize the Gobby session&lt;br /&gt;
22:45:14&amp;lt;!Maikel&amp;gt; Isolko-r would do the log&lt;br /&gt;
22:45:15&amp;lt;!Newton&amp;gt; and try to fix the wiki so that Isilkor can post the summary of the status updates (and point 3) in the wiki&lt;br /&gt;
22:45:27&amp;lt;!Newton&amp;gt; isilkor was not in the session&lt;br /&gt;
22:45:34&amp;lt;!Maikel&amp;gt; of irc&lt;br /&gt;
22:45:46&amp;lt;!ck&amp;gt; I can add the log of the gobby session&lt;br /&gt;
22:45:47&amp;lt;!Newton&amp;gt; thats what i said&lt;br /&gt;
22:46:21&amp;lt;!Newton&amp;gt; but first ill eat something. after that, wiki.&lt;br /&gt;
22:46:39&amp;lt;!Maikel&amp;gt; For next meetings anyone who is willing to contribute should be invited, and we should set up some guidelines to make the meetings shorter&lt;br /&gt;
22:48:48-!- stevi is now known as stevi`off&lt;br /&gt;
22:48:52&amp;lt;!ck&amp;gt; true. I still hope this was only so long because it was the first one&lt;br /&gt;
22:49:14&amp;lt;!ck&amp;gt; Maybe we&#039;ll also get some experience in constraining ourselves to the agenda :)&lt;br /&gt;
22:49:33&amp;lt;!Maikel&amp;gt; In our dreams maybe :P&lt;br /&gt;
22:49:44&amp;lt;!ck&amp;gt; Heh, give us a chance :)&lt;br /&gt;
22:49:51&amp;lt;!Newton&amp;gt; phew, by the way&lt;br /&gt;
22:50:04-!- Luchs^away is now known as Luchs&lt;br /&gt;
22:50:09&amp;lt;!Newton&amp;gt; i find a meeting over IRC a lot more tiresome then in real life&lt;br /&gt;
22:50:12&amp;lt;!Newton&amp;gt; but it was 4 hours too&lt;br /&gt;
22:50:31-!- Mortimer [~Mortimer@euirc-82816ebb.dip.t-dialin.net] has joined #openclonk-dev&lt;br /&gt;
22:51:26&amp;lt;!Maikel&amp;gt; You should do your thesis on teleportation ;)&lt;br /&gt;
22:51:48&amp;lt;!ck&amp;gt; we can try video conferencing next time :P&lt;br /&gt;
22:55:10&amp;lt;!Maikel&amp;gt; Got to go &amp;quot;The emergence of gravity through holographic scenario&amp;quot; is waiting for me at 9:00&lt;br /&gt;
22:55:13&amp;lt;!Maikel&amp;gt; Bye&lt;br /&gt;
22:56:51-!- Maikel [~maikeldev@euirc-49e109b6.speed.planet.nl] has quit [Life is too colorful...]&lt;br /&gt;
22:59:23&amp;lt;!Newton&amp;gt; ck, can you reproduce isilkors problem?&lt;br /&gt;
22:59:41&amp;lt;!ck&amp;gt; Newton: let me check. Just try to edit any page?&lt;br /&gt;
23:00:07&amp;lt;!Newton&amp;gt; yes&lt;br /&gt;
23:00:23&amp;lt;!Newton&amp;gt; for me, it  works. Thats why im puzzled&lt;br /&gt;
23:00:25&amp;lt;!Isilkor&amp;gt; for example http://wiki.openclonk.org/index.php?title=Main_Page&amp;amp;action=edit&lt;br /&gt;
23:00:31&amp;lt;!Isilkor&amp;gt; A database query syntax error has occurred. This may indicate a bug in the software. The last attempted database query was: &lt;br /&gt;
23:00:33&amp;lt;!Isilkor&amp;gt; (SQL query hidden)&lt;br /&gt;
23:00:35&amp;lt;!Isilkor&amp;gt; from within function &amp;quot;IndexPager::reallyDoQuery (LogPager)&amp;quot;. MySQL returned error &amp;quot;1146: Table &#039;db1144497-wiki.wiki_tag_summary&#039; doesn&#039;t exist (localhost)&amp;quot;.&lt;br /&gt;
23:00:51&amp;lt;!ck&amp;gt; Hm. Anybody knows my wiki password? %(&lt;br /&gt;
23:01:07&amp;lt;!ck&amp;gt; ah&lt;br /&gt;
23:01:08&amp;lt;!Newton&amp;gt; ah, right&lt;br /&gt;
23:01:16&amp;lt;!ck&amp;gt; yeah, same error&lt;br /&gt;
23:01:18&amp;lt;!Newton&amp;gt; for Project, it does not appear&lt;br /&gt;
23:01:21&amp;lt;!Newton&amp;gt; but for the homepage&lt;br /&gt;
23:01:32&amp;lt;!ck&amp;gt; by clicking Isilkor&#039;s link, that is&lt;br /&gt;
23:01:52&amp;lt;!ck&amp;gt; I can edit the page though when I navigate properly&lt;br /&gt;
23:02:01&amp;lt;!Isilkor&amp;gt; I got there by navigating properly :(&lt;br /&gt;
23:02:03&amp;lt;!ck&amp;gt; (I just added &amp;quot;This is a test&amp;quot; at the bottom of the main page)&lt;br /&gt;
23:02:27&amp;lt;!ck&amp;gt; ah&lt;br /&gt;
23:02:33&amp;lt;!ck&amp;gt; It only occurs for the Main Page for me&lt;br /&gt;
23:02:37&amp;lt;!Isilkor&amp;gt; Actually, I get this for History as ell&lt;br /&gt;
23:02:38&amp;lt;!ck&amp;gt; But I can edit the Project page for example&lt;br /&gt;
23:03:05&amp;lt;!Newton&amp;gt; well, yes the table does not exist&lt;br /&gt;
23:03:14&amp;lt;!Newton&amp;gt; the thing is&lt;br /&gt;
23:03:32&amp;lt;!Newton&amp;gt; the day before yesterday, i updated to the newest stable mediawiki&lt;br /&gt;
23:03:49&amp;lt;!Isilkor&amp;gt; http://wiki.openclonk.org/w/Special:RecentChanges does it too&lt;br /&gt;
23:03:51&amp;lt;!Newton&amp;gt; and during upload of the new files, I saw that I already had the newest update, I just forgot to write it down&lt;br /&gt;
23:03:55&amp;lt;!Isilkor&amp;gt; so something major is broken I think&lt;br /&gt;
23:04:17&amp;lt;!Newton&amp;gt; so I stopped replacing the files during the FTP upload (but not IN one file, after one file)&lt;br /&gt;
23:04:33&amp;lt;!Newton&amp;gt; because i assumed i could only have replaced the same files with the same files&lt;br /&gt;
23:04:37&amp;lt;!Newton&amp;gt; guess it wasnt the case&lt;br /&gt;
23:04:44&amp;lt;!Newton&amp;gt; so what ill do is reinstall the whole thing&lt;br /&gt;
23:04:54&amp;lt;!Newton&amp;gt; and the uploading via FTP takes ages&lt;br /&gt;
23:05:27-!- Kohlrabi [~Kohlrabi@euirc-621841f3.nosebud.de] has joined #openclonk-dev&lt;br /&gt;
23:05:37-!- Randrian__ [~randrian@euirc-be85727b.83.171.153.191.ip-pool.NEFkom.net] has joined #openclonk-dev&lt;br /&gt;
23:07:21&amp;lt;!Newton&amp;gt; during the upload I&#039;ll disable the wiki&lt;br /&gt;
23:09:32-!- Randrian_ [~randrian@euirc-27f0becc.83.171.182.120.ip-pool.NEFkom.net] has quit [Ping timeout]&lt;br /&gt;
23:12:16&amp;lt;!Newton&amp;gt; Zapper: till when are you still online?&lt;br /&gt;
23:12:26&amp;lt;!Zapper&amp;gt; till clonkine lets me go&lt;br /&gt;
23:12:46&amp;lt;!Newton&amp;gt; we wanted to talk about weapon systems and base objects&lt;br /&gt;
23:13:17&amp;lt;!Zapper&amp;gt; uh&lt;br /&gt;
23:13:18&amp;lt;!Zapper&amp;gt; mh&lt;br /&gt;
23:13:25&amp;lt; clonkine&amp;gt; she won&#039;T&lt;br /&gt;
23:14:24&amp;lt;!Zapper&amp;gt; hm&lt;br /&gt;
23:14:44&amp;lt;!Zapper&amp;gt; I think I am too tired right now - tomorrow maybe?&lt;br /&gt;
23:15:47-!- Icewing [~Icewing@euirc-d575d80d.pool.mediaWays.net] has quit [Client exited]&lt;br /&gt;
23:15:49&amp;lt;!Newton&amp;gt; ok, maybe&lt;br /&gt;
23:19:57-!- s_m_w is now known as smw&lt;br /&gt;
23:44:41&amp;lt;!Newton&amp;gt; ck?&lt;br /&gt;
23:48:35&amp;lt;!ck&amp;gt; Newton&lt;br /&gt;
23:48:46&amp;lt; clonkine&amp;gt; ck, newton?&lt;br /&gt;
23:48:49&amp;lt; clonkine&amp;gt; ;)&lt;br /&gt;
23:49:08&amp;lt;!Newton&amp;gt; you said during the status update that you are basically trying to get the swimming right&lt;br /&gt;
23:49:14&amp;lt;!Newton&amp;gt; with all these stack-changes&lt;br /&gt;
23:49:23&amp;lt;!ck&amp;gt; right&lt;br /&gt;
23:49:26&amp;lt;!Newton&amp;gt; but what about günthers proposal to just use SetObjDrawTransform?&lt;br /&gt;
23:50:03&amp;lt;!Newton&amp;gt; for rotation&lt;br /&gt;
23:50:07&amp;lt;!ck&amp;gt; I&#039;d like to avoid SetObjDrawTransform if possible&lt;br /&gt;
23:50:16&amp;lt;!ck&amp;gt; But that&#039;s not even the point&lt;br /&gt;
23:50:33&amp;lt;!ck&amp;gt; The problem is not only with the swimming but with the animation blending&lt;br /&gt;
23:50:48&amp;lt;!ck&amp;gt; so the same problem of incorrect blending might happen for other animations as well&lt;br /&gt;
23:51:17&amp;lt;!Newton&amp;gt; ah, well then&lt;br /&gt;
23:52:01&amp;lt;!Newton&amp;gt; I just think that providing 4 different swimming animations for every direction one seems to be the wrong approach&lt;br /&gt;
23:52:12&amp;lt;!Newton&amp;gt; better would be, to be able to set a rotation of the animation&lt;br /&gt;
23:52:33&amp;lt;!Newton&amp;gt; because i can really imagine that we want to rotate the clonk while climbing or hangling a little&lt;br /&gt;
23:52:39&amp;lt;!Newton&amp;gt; yeah even while running&lt;br /&gt;
23:53:05&amp;lt;!Newton&amp;gt; and partly really much while jumping and tumbling&lt;br /&gt;
23:53:45&amp;lt;!ck&amp;gt; that can also be done via an animation... i&#039;m not even sure it will look correct when just rotating one animation either&lt;br /&gt;
23:53:46&amp;lt;!Newton&amp;gt; having to create animations which are oriented slightly differently seems to be... err not the right way&lt;br /&gt;
23:54:22&amp;lt;!Newton&amp;gt; you mean a general &amp;quot;rotate&amp;quot; animation that is combineable with any other animation?&lt;br /&gt;
23:55:15&amp;lt;!ck&amp;gt; I had a different one for every possible animation in mind&lt;br /&gt;
23:55:26&amp;lt;!ck&amp;gt; Though I&#039;m not sure what makes most sense there from a modelling point of view&lt;br /&gt;
23:55:43&amp;lt;!ck&amp;gt; that is, whether there would be a difference in rotation for walking/climbing&lt;br /&gt;
23:56:04&amp;lt;!Newton&amp;gt; for walking and climbing... yeah for that you might be right&lt;br /&gt;
23:56:21&amp;lt;!Newton&amp;gt; but definitely not for jumping and not for hangling&lt;br /&gt;
23:58:07&amp;lt;!ck&amp;gt; Maybe let&#039;s just try out both ways and see which one works better&lt;br /&gt;
23:58:30&amp;lt;!ck&amp;gt; or try one, and switch if we encounter inherent problems&lt;br /&gt;
23:58:56&amp;lt;!ck&amp;gt; But I think these kind of problems can be solved by trying things out and experimenting rather than by thinking too much ;)&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=262</id>
		<title>Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=262"/>
		<updated>2009-11-08T14:41:51Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: Missing &amp;quot;you&amp;quot; added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document specifies the preferred source code style of files inside the&lt;br /&gt;
OpenClonk source tree. Some of the style rules are also stated implicitly&lt;br /&gt;
inside the examples.&lt;br /&gt;
&lt;br /&gt;
=== All-encompassing Guidelines ===&lt;br /&gt;
==== Line endings ====&lt;br /&gt;
Use a single line feed character (ASCII 10) for line endings. Mercurial provides&lt;br /&gt;
an extension named &#039;&#039;win32text&#039;&#039; you can use to auto-convert files from your&lt;br /&gt;
OS&#039;s native format to single LF and vice-versa.&lt;br /&gt;
&lt;br /&gt;
==== Indentation ====&lt;br /&gt;
Indent your code with tabs (ASCII 9). Use space (ASCII 32) for all other&lt;br /&gt;
formatting.&lt;br /&gt;
&lt;br /&gt;
==== Braces ====&lt;br /&gt;
Braces are on their own line, on the same level of indentation as the&lt;br /&gt;
structure they belong to. You may add braces around single statements in&lt;br /&gt;
&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements if the first block or an &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; block has them.&lt;br /&gt;
&lt;br /&gt;
 if (count &amp;lt; 10)&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;Too few thingies!&amp;quot;);&lt;br /&gt;
 	AddMore();&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;We have enough&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Spaces ====&lt;br /&gt;
Function names are not followed by space. Commas are. No space follows opening&lt;br /&gt;
brackets (&amp;quot;[&amp;quot;) or parentheses (&amp;quot;(&amp;quot;). Also no space preceeds closing brackets&lt;br /&gt;
(&amp;quot;]&amp;quot;) or parentheses (&amp;quot;)&amp;quot;). Unary operators do not require spaces. Binary&lt;br /&gt;
operators do.&lt;br /&gt;
&lt;br /&gt;
Keywords (&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; etc.) are followed by a space.&lt;br /&gt;
&lt;br /&gt;
==== Parentheses ====&lt;br /&gt;
Do not use parentheses unless they are required for precedence or the code&lt;br /&gt;
gets confusing without them. Remember other people may have confusion&lt;br /&gt;
thresholds different from you.&lt;br /&gt;
&lt;br /&gt;
==== Control Structures ====&lt;br /&gt;
Control structures with a single statements are written without braces. If the&lt;br /&gt;
statement spans multiple lines, you may add braces for readability. Structures&lt;br /&gt;
without a statement contain a comment denoting this.&lt;br /&gt;
&lt;br /&gt;
 while (*dest++ = *src++)&lt;br /&gt;
 	/* empty */;&lt;br /&gt;
&lt;br /&gt;
Cascades in a &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; statement are marked by a FALLTHROUGH&lt;br /&gt;
comment. Code that cannot be reached has an assertion. &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt; elements&lt;br /&gt;
are not indented.&lt;br /&gt;
&lt;br /&gt;
 switch (foo)&lt;br /&gt;
 {&lt;br /&gt;
 case FOO_HEX:&lt;br /&gt;
 	accept_hex = true;&lt;br /&gt;
 	// FALLTHROUGH&lt;br /&gt;
 case FOO_DEC:&lt;br /&gt;
 	accept_num = true;&lt;br /&gt;
 	break;&lt;br /&gt;
 default:&lt;br /&gt;
 	assert(!&amp;quot;Invalid foo value&amp;quot;);&lt;br /&gt;
 	// Do something meaningful here anyway, if possible;&lt;br /&gt;
 	// try to not leave the program in an ill-defined state.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
 // Single-line comments look like this&lt;br /&gt;
&lt;br /&gt;
 // Multi-line comments look like this. Using C++-style comments&lt;br /&gt;
 // helps if you need to comment out large pieces of code later, or if the length of&lt;br /&gt;
 // the comment changes over time. Of course you could still use #if 0 ... #endif&lt;br /&gt;
 // to achieve that.&lt;br /&gt;
&lt;br /&gt;
 /* You may also write multi-line comments like this. Make sure you write enough&lt;br /&gt;
    text to warrant a multi-line comment. Also be sure to write in full sentences. */&lt;br /&gt;
&lt;br /&gt;
==== Type Casting ====&lt;br /&gt;
Do not use C-style or function style casts. Use a template cast instead.&lt;br /&gt;
&lt;br /&gt;
=== Source File Layout ===&lt;br /&gt;
==== Copyright Header ====&lt;br /&gt;
Every source file begins with a copyright header. If you make significant&lt;br /&gt;
changes to the code, you may (but are not required to) add your name to the&lt;br /&gt;
list of copyright holders. If you choose to add yourself, use your real name,&lt;br /&gt;
not a nickname. Legally recognized pseudonyms are accepted, as are names of&lt;br /&gt;
legal entities. If you don&#039;t want to add yourself, you may add the catch-all&lt;br /&gt;
copyright attribution phrase, if it does not already exist.&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * OpenClonk, http://www.openclonk.org&lt;br /&gt;
  *&lt;br /&gt;
  * Copyright (c) 2000-2009  John Doe&lt;br /&gt;
  * Copyright (c) 2005  Jane Q. Public&lt;br /&gt;
  *&lt;br /&gt;
  * Portions might be copyrighted by other authors who have contributed&lt;br /&gt;
  * to OpenClonk.&lt;br /&gt;
  *&lt;br /&gt;
  * Other legalese goes here, but has been omitted for brevity. See an&lt;br /&gt;
  * existing file for a template.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
The copyright header is followed by an empty line. Put a comment explaining&lt;br /&gt;
the purpose of the file next, and leave another blank line after this.&lt;br /&gt;
&lt;br /&gt;
==== Inclusion Guards ====&lt;br /&gt;
If you are writing a header file, use #include guards. If your file is called&lt;br /&gt;
&#039;&#039;C4Foo.h&#039;&#039;, your guard should be &amp;lt;tt&amp;gt;INC_&#039;&#039;C4Foo&#039;&#039;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 #ifndef INC_C4Foo&lt;br /&gt;
 #define INC_C4Foo&lt;br /&gt;
 class C4Foo;&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO: Precompiled headers.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== #include Directives ====&lt;br /&gt;
Include local headers first. Put the filename in double quotes, and use&lt;br /&gt;
forward slashes as directory separators.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;Standard.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;StdBuf.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Leave a blank line before system headers. Use angle brackets to include these,&lt;br /&gt;
and sort them alphabetically.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;map&amp;gt;&lt;br /&gt;
 #include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Declarations ===&lt;br /&gt;
==== Preprocessor Macros ====&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; values in headers. Use &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; instead, or&lt;br /&gt;
&amp;lt;tt&amp;gt;enum&amp;lt;/tt&amp;gt; if you are declaring an enumeration.&lt;br /&gt;
&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; inline functions either, use &amp;lt;tt&amp;gt;inline&amp;lt;/tt&amp;gt;. If your&lt;br /&gt;
functions need to work on multiple data types, overload the function or write&lt;br /&gt;
a &amp;lt;tt&amp;gt;template&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If, despite of the above, you still need to write a macro, use an all-uppercase&lt;br /&gt;
name. If your macro contains a compound statement, enclose it in a &amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;&lt;br /&gt;
loop to allow its use in &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements. A terminating semicolon&lt;br /&gt;
should be provided at the place of invocation. This makes parsing the source&lt;br /&gt;
easier for pretty-printers and editors. Consider undefining your macro when&lt;br /&gt;
you are done using it.&lt;br /&gt;
&lt;br /&gt;
 #define FOO(a, b) do { \&lt;br /&gt;
 	bar += (a); \&lt;br /&gt;
 	bar /= (b); \&lt;br /&gt;
 } while(0)&lt;br /&gt;
&lt;br /&gt;
==== Data Types ====&lt;br /&gt;
Do not use the Win32 style integer declarations &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; and&lt;br /&gt;
&amp;lt;tt&amp;gt;BOOL&amp;lt;/tt&amp;gt;. If you need a guarantee about the size of your variables, use&lt;br /&gt;
the C99 types &amp;lt;tt&amp;gt;int&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;uint&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt;. If you don&#039;t&lt;br /&gt;
need that guarantee, use &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. If you need a variable that is large&lt;br /&gt;
enough to store a pointer on your current platform, use &amp;lt;tt&amp;gt;intptr_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you come across code that still uses Win32 types, consider changing it if&lt;br /&gt;
you are working on code in the vicinity. Don&#039;t commit changes that only&lt;br /&gt;
consist of replacing &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;uint32_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When declaring a pointer, put a space in front of the asterisk, and none&lt;br /&gt;
after. This saves some confusion when declaring multiple variables at once.&lt;br /&gt;
The same goes for references.&lt;br /&gt;
&lt;br /&gt;
 int *foo, *bar;&lt;br /&gt;
 char *Qux(const char *quux);&lt;br /&gt;
&lt;br /&gt;
==== Functions ====&lt;br /&gt;
Functions that are not used outside of the containing file are placed inside&lt;br /&gt;
of an anonymous namespace.&lt;br /&gt;
&lt;br /&gt;
 namespace&lt;br /&gt;
 {&lt;br /&gt;
 	int Frobnicate(const char *foo);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Functions that are used across multiple files are prototyped inside a common&lt;br /&gt;
header. The prototypes should be grouped where appropriate, and ordered&lt;br /&gt;
logically or, failing that, alphabetically.&lt;br /&gt;
&lt;br /&gt;
Function and class names begin with a capital letter, and use camel casing. If&lt;br /&gt;
you need to embed acronyms inside the name, pretend the acronym was all lower&lt;br /&gt;
case. Member variables use the same convention, but begin with a lower case&lt;br /&gt;
letter. Do not use hungarian prefixes.&lt;br /&gt;
&lt;br /&gt;
 XmlDocument *ParseXmlFile(const char *file);&lt;br /&gt;
&lt;br /&gt;
When passing arguments that may be changed by the called function, pass them&lt;br /&gt;
as pointers. This makes it obvious that they may be changed. Use constant&lt;br /&gt;
references for all other parameters, unless they are a primitive type.&lt;br /&gt;
&lt;br /&gt;
==== Class Members ====&lt;br /&gt;
No class member variable should be declared &amp;lt;tt&amp;gt;public&amp;lt;/tt&amp;gt; unless necessary.&lt;br /&gt;
Consider using &amp;lt;tt&amp;gt;GetFoo&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SetFoo&amp;lt;/tt&amp;gt; accessors. If you want to &lt;br /&gt;
declare a compound data type that allows direct access to its members, use&lt;br /&gt;
&amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;. Do not add more functions than constructors, destructors, and&lt;br /&gt;
assignment operators to &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
Mark all class members that do not change the visible state of the object&lt;br /&gt;
&amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt;. If you need to modify internal state that is not visible from&lt;br /&gt;
outside of the class, mark the state variable &amp;lt;tt&amp;gt;mutable&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=User_talk:Isilkor/Style_Guidelines&amp;diff=261</id>
		<title>User talk:Isilkor/Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=User_talk:Isilkor/Style_Guidelines&amp;diff=261"/>
		<updated>2009-10-24T16:56:30Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: moved User talk:Isilkor/Style Guidelines to Talk:Style Guidelines:&amp;amp;#32;These are now policy&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Talk:Style Guidelines]]&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Talk:Style_Guidelines&amp;diff=260</id>
		<title>Talk:Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Talk:Style_Guidelines&amp;diff=260"/>
		<updated>2009-10-24T16:56:30Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: moved User talk:Isilkor/Style Guidelines to Talk:Style Guidelines:&amp;amp;#32;These are now policy&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responses so far:&lt;br /&gt;
[[User:Günther|Günther]]:&lt;br /&gt;
* local headers before system headers&lt;br /&gt;
* don&#039;t forbid public data members&lt;br /&gt;
* &amp;lt;!Guenther&amp;gt; Demanding Doygen comments is also a very radical change&lt;br /&gt;
: &amp;lt;!Guenther&amp;gt; Doxygen is only really usefull if you are generating API docs that are intended to be read without looking at the source code&lt;br /&gt;
: &amp;lt;!Guenther&amp;gt; That&#039;s not a use case for us: our API is C4Script, not some C++ API&lt;br /&gt;
&lt;br /&gt;
PeterW:&lt;br /&gt;
* order switch members by numeric value&lt;br /&gt;
&lt;br /&gt;
Afterthoughts [[User:Isilkor|Isilkor]]:&lt;br /&gt;
* Use forward declarations instead of including the header inside other headers, if possible.&lt;br /&gt;
&lt;br /&gt;
Opinions:&lt;br /&gt;
* Use anonymous namespaces instead of static: &#039;&#039;&#039;In favor:&#039;&#039;&#039; ck, Isilkor; &#039;&#039;&#039;Against:&#039;&#039;&#039; Günther, PeterW&lt;br /&gt;
* Doxygen comments: &#039;&#039;&#039;In favor:&#039;&#039;&#039;; &#039;&#039;&#039;Against:&#039;&#039;&#039; Günther, PeterW&lt;br /&gt;
&lt;br /&gt;
The document should describe reality, not wishful thinking. Where reality is inconsistent, the document can describe which of several options is preferred, but it shouldn&#039;t contain anything that&#039;s not already in somewhat widespread use. That would mean changing the coding style, and that&#039;s not the job of a coding style document. --[[User:Günther|Günther]] 16:41, 4 August 2009 (UTC)&lt;br /&gt;
: The document is intended to describe guidelines for new code, and not the legacy code that&#039;s all over the place anyway. While it&#039;s probably preferable to change old code if you do work in the vicinity, I certainly don&#039;t expect the code to be changed/reformatted on its own. --[[User:Isilkor|Isilkor]] 17:35, 4 August 2009 (UTC)&lt;br /&gt;
:: I think the intention of a Coding Style document should be to ensure uniformity. For that, you have to describe what&#039;s already in use. And the Clonk source code really is not that much &amp;quot;all over the place&amp;quot;. For example, the majority of files use indented braces, thus the coding style has to prescribe that, however much we would want to have another brace style. --[[User:Günther|Günther]] 11:36, 5 August 2009 (UTC)&lt;br /&gt;
::: No, it really &#039;&#039;&#039;is&#039;&#039;&#039; all over the place. Just take a look at standard. It&#039;s not even uniform within single files. There&#039;s mixed brace styles, tabs and spaces are both used for indenting (sometimes interspersed in the same function), you have a healthy mix of formatting in &amp;quot;section heading&amp;quot; comments, and so on. --[[User:Isilkor|Isilkor]] 14:01, 5 August 2009 (UTC)&lt;br /&gt;
:::: I&#039;d argue that those are exceptions. Almost all new code uses tabs, only old code differs and when somebody configured their editor for two-space-tabs and I didn&#039;t notice the issue. (If you do configure your editor for two-space-tabs, the all-over-the-placeness vanishes from sight ;-), so I do not recommend that.) The brace style is a bigger issue because nobody tried to enforce uniformity there, but on the other hand I think the old code is more consistent in that regard, and overall there&#039;s a clear majority. Section heading comments are inconsistent, true, but they are also rare.--[[User:Günther|Günther]] 15:57, 5 August 2009 (UTC)&lt;br /&gt;
I would not restrict the order of case labels in a switch. But if we do, then I agree with PeterW that they should be ordered by numeric value (which, for enumeration values, is mostly the same as the order the enumerators are defined). Maybe we also want to note that for commenting out code, #if 0 is preferred. I am generally okay with these guidelines, though I&#039;m likely to have problems with a few I&#039;m not used to, especially the pointer asterisk position and the space following if/while/for. When I am writing code then I am paying attention to the code and not the style, and I often fall back to my own style without even noticing. So please don&#039;t punch me if I check in code that doesn&#039;t strictly obey the guidelines. --[[User:Clonk-Karl|Clonk-Karl]] 00:23, 5 August 2009 (UTC)&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=User:Isilkor/Style_Guidelines&amp;diff=259</id>
		<title>User:Isilkor/Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=User:Isilkor/Style_Guidelines&amp;diff=259"/>
		<updated>2009-10-24T16:56:30Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: moved User:Isilkor/Style Guidelines to Style Guidelines:&amp;amp;#32;These are now policy&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Style Guidelines]]&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=258</id>
		<title>Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=258"/>
		<updated>2009-10-24T16:56:30Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: moved User:Isilkor/Style Guidelines to Style Guidelines:&amp;amp;#32;These are now policy&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document specifies the preferred source code style of files inside the&lt;br /&gt;
OpenClonk source tree. Some of the style rules are also stated implicitly&lt;br /&gt;
inside the examples.&lt;br /&gt;
&lt;br /&gt;
=== All-encompassing Guidelines ===&lt;br /&gt;
==== Line endings ====&lt;br /&gt;
Use a single line feed character (ASCII 10) for line endings. Mercurial provides&lt;br /&gt;
an extension named &#039;&#039;win32text&#039;&#039; you can use to auto-convert files from your&lt;br /&gt;
OS&#039;s native format to single LF and vice-versa.&lt;br /&gt;
&lt;br /&gt;
==== Indentation ====&lt;br /&gt;
Indent your code with tabs (ASCII 9). Use space (ASCII 32) for all other&lt;br /&gt;
formatting.&lt;br /&gt;
&lt;br /&gt;
==== Braces ====&lt;br /&gt;
Braces are on their own line, on the same level of indentation as the&lt;br /&gt;
structure they belong to. You may add braces around single statements in&lt;br /&gt;
&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements if the first block or an &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; block has them.&lt;br /&gt;
&lt;br /&gt;
 if (count &amp;lt; 10)&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;Too few thingies!&amp;quot;);&lt;br /&gt;
 	AddMore();&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;We have enough&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Spaces ====&lt;br /&gt;
Function names are not followed by space. Commas are. No space follows opening&lt;br /&gt;
brackets (&amp;quot;[&amp;quot;) or parentheses (&amp;quot;(&amp;quot;). Also no space preceeds closing brackets&lt;br /&gt;
(&amp;quot;]&amp;quot;) or parentheses (&amp;quot;)&amp;quot;). Unary operators do not require spaces. Binary&lt;br /&gt;
operators do.&lt;br /&gt;
&lt;br /&gt;
Keywords (&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; etc.) are followed by a space.&lt;br /&gt;
&lt;br /&gt;
==== Parentheses ====&lt;br /&gt;
Do not use parentheses unless they are required for precedence or the code&lt;br /&gt;
gets confusing without them. Remember other people may have confusion&lt;br /&gt;
thresholds different from you.&lt;br /&gt;
&lt;br /&gt;
==== Control Structures ====&lt;br /&gt;
Control structures with a single statements are written without braces. If the&lt;br /&gt;
statement spans multiple lines, you may add braces for readability. Structures&lt;br /&gt;
without a statement contain a comment denoting this.&lt;br /&gt;
&lt;br /&gt;
 while (*dest++ = *src++)&lt;br /&gt;
 	/* empty */;&lt;br /&gt;
&lt;br /&gt;
Cascades in a &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; statement are marked by a FALLTHROUGH&lt;br /&gt;
comment. Code that cannot be reached has an assertion. &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt; elements&lt;br /&gt;
are not indented.&lt;br /&gt;
&lt;br /&gt;
 switch (foo)&lt;br /&gt;
 {&lt;br /&gt;
 case FOO_HEX:&lt;br /&gt;
 	accept_hex = true;&lt;br /&gt;
 	// FALLTHROUGH&lt;br /&gt;
 case FOO_DEC:&lt;br /&gt;
 	accept_num = true;&lt;br /&gt;
 	break;&lt;br /&gt;
 default:&lt;br /&gt;
 	assert(!&amp;quot;Invalid foo value&amp;quot;);&lt;br /&gt;
 	// Do something meaningful here anyway, if possible;&lt;br /&gt;
 	// try to not leave the program in an ill-defined state.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
 // Single-line comments look like this&lt;br /&gt;
&lt;br /&gt;
 // Multi-line comments look like this. Using C++-style comments&lt;br /&gt;
 // helps if you need to comment out large pieces of code later, or if the length of&lt;br /&gt;
 // the comment changes over time. Of course you could still use #if 0 ... #endif&lt;br /&gt;
 // to achieve that.&lt;br /&gt;
&lt;br /&gt;
 /* You may also write multi-line comments like this. Make sure you write enough&lt;br /&gt;
    text to warrant a multi-line comment. Also be sure to write in full sentences. */&lt;br /&gt;
&lt;br /&gt;
==== Type Casting ====&lt;br /&gt;
Do not use C-style or function style casts. Use a template cast instead.&lt;br /&gt;
&lt;br /&gt;
=== Source File Layout ===&lt;br /&gt;
==== Copyright Header ====&lt;br /&gt;
Every source file begins with a copyright header. If you make significant&lt;br /&gt;
changes to the code, you may (but are not required to) add your name to the&lt;br /&gt;
list of copyright holders. If you choose to add yourself, use your real name,&lt;br /&gt;
not a nickname. Legally recognized pseudonyms are accepted, as are names of&lt;br /&gt;
legal entities. If you don&#039;t want to add yourself, you may add the catch-all&lt;br /&gt;
copyright attribution phrase, if it does not already exist.&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * OpenClonk, http://www.openclonk.org&lt;br /&gt;
  *&lt;br /&gt;
  * Copyright (c) 2000-2009  John Doe&lt;br /&gt;
  * Copyright (c) 2005  Jane Q. Public&lt;br /&gt;
  *&lt;br /&gt;
  * Portions might be copyrighted by other authors who have contributed&lt;br /&gt;
  * to OpenClonk.&lt;br /&gt;
  *&lt;br /&gt;
  * Other legalese goes here, but has been omitted for brevity. See an&lt;br /&gt;
  * existing file for a template.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
The copyright header is followed by an empty line. Put a comment explaining&lt;br /&gt;
the purpose of the file next, and leave another blank line after this.&lt;br /&gt;
&lt;br /&gt;
==== Inclusion Guards ====&lt;br /&gt;
If you are writing a header file, use #include guards. If your file is called&lt;br /&gt;
&#039;&#039;C4Foo.h&#039;&#039;, your guard should be &amp;lt;tt&amp;gt;INC_&#039;&#039;C4Foo&#039;&#039;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 #ifndef INC_C4Foo&lt;br /&gt;
 #define INC_C4Foo&lt;br /&gt;
 class C4Foo;&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO: Precompiled headers.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== #include Directives ====&lt;br /&gt;
Include local headers first. Put the filename in double quotes, and use&lt;br /&gt;
forward slashes as directory separators.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;Standard.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;StdBuf.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Leave a blank line before system headers. Use angle brackets to include these,&lt;br /&gt;
and sort them alphabetically.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;map&amp;gt;&lt;br /&gt;
 #include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Declarations ===&lt;br /&gt;
==== Preprocessor Macros ====&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; values in headers. Use &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; instead, or&lt;br /&gt;
&amp;lt;tt&amp;gt;enum&amp;lt;/tt&amp;gt; if you are declaring an enumeration.&lt;br /&gt;
&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; inline functions either, use &amp;lt;tt&amp;gt;inline&amp;lt;/tt&amp;gt;. If your&lt;br /&gt;
functions need to work on multiple data types, overload the function or write&lt;br /&gt;
a &amp;lt;tt&amp;gt;template&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If, despite of the above, still need to write a macro, use an all-uppercase&lt;br /&gt;
name. If your macro contains a compound statement, enclose it in a &amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;&lt;br /&gt;
loop to allow its use in &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements. A terminating semicolon&lt;br /&gt;
should be provided at the place of invocation. This makes parsing the source&lt;br /&gt;
easier for pretty-printers and editors. Consider undefining your macro when&lt;br /&gt;
you are done using it.&lt;br /&gt;
&lt;br /&gt;
 #define FOO(a, b) do { \&lt;br /&gt;
 	bar += (a); \&lt;br /&gt;
 	bar /= (b); \&lt;br /&gt;
 } while(0)&lt;br /&gt;
&lt;br /&gt;
==== Data Types ====&lt;br /&gt;
Do not use the Win32 style integer declarations &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; and&lt;br /&gt;
&amp;lt;tt&amp;gt;BOOL&amp;lt;/tt&amp;gt;. If you need a guarantee about the size of your variables, use&lt;br /&gt;
the C99 types &amp;lt;tt&amp;gt;int&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;uint&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt;. If you don&#039;t&lt;br /&gt;
need that guarantee, use &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. If you need a variable that is large&lt;br /&gt;
enough to store a pointer on your current platform, use &amp;lt;tt&amp;gt;intptr_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you come across code that still uses Win32 types, consider changing it if&lt;br /&gt;
you are working on code in the vicinity. Don&#039;t commit changes that only&lt;br /&gt;
consist of replacing &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;uint32_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When declaring a pointer, put a space in front of the asterisk, and none&lt;br /&gt;
after. This saves some confusion when declaring multiple variables at once.&lt;br /&gt;
The same goes for references.&lt;br /&gt;
&lt;br /&gt;
 int *foo, *bar;&lt;br /&gt;
 char *Qux(const char *quux);&lt;br /&gt;
&lt;br /&gt;
==== Functions ====&lt;br /&gt;
Functions that are not used outside of the containing file are placed inside&lt;br /&gt;
of an anonymous namespace.&lt;br /&gt;
&lt;br /&gt;
 namespace&lt;br /&gt;
 {&lt;br /&gt;
 	int Frobnicate(const char *foo);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Functions that are used across multiple files are prototyped inside a common&lt;br /&gt;
header. The prototypes should be grouped where appropriate, and ordered&lt;br /&gt;
logically or, failing that, alphabetically.&lt;br /&gt;
&lt;br /&gt;
Function and class names begin with a capital letter, and use camel casing. If&lt;br /&gt;
you need to embed acronyms inside the name, pretend the acronym was all lower&lt;br /&gt;
case. Member variables use the same convention, but begin with a lower case&lt;br /&gt;
letter. Do not use hungarian prefixes.&lt;br /&gt;
&lt;br /&gt;
 XmlDocument *ParseXmlFile(const char *file);&lt;br /&gt;
&lt;br /&gt;
When passing arguments that may be changed by the called function, pass them&lt;br /&gt;
as pointers. This makes it obvious that they may be changed. Use constant&lt;br /&gt;
references for all other parameters, unless they are a primitive type.&lt;br /&gt;
&lt;br /&gt;
==== Class Members ====&lt;br /&gt;
No class member variable should be declared &amp;lt;tt&amp;gt;public&amp;lt;/tt&amp;gt; unless necessary.&lt;br /&gt;
Consider using &amp;lt;tt&amp;gt;GetFoo&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SetFoo&amp;lt;/tt&amp;gt; accessors. If you want to &lt;br /&gt;
declare a compound data type that allows direct access to its members, use&lt;br /&gt;
&amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;. Do not add more functions than constructors, destructors, and&lt;br /&gt;
assignment operators to &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
Mark all class members that do not change the visible state of the object&lt;br /&gt;
&amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt;. If you need to modify internal state that is not visible from&lt;br /&gt;
outside of the class, mark the state variable &amp;lt;tt&amp;gt;mutable&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=255</id>
		<title>Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=255"/>
		<updated>2009-10-14T16:24:12Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: Line endings&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document specifies the preferred source code style of files inside the&lt;br /&gt;
OpenClonk source tree. Some of the style rules are also stated implicitly&lt;br /&gt;
inside the examples.&lt;br /&gt;
&lt;br /&gt;
=== All-encompassing Guidelines ===&lt;br /&gt;
==== Line endings ====&lt;br /&gt;
Use a single line feed character (ASCII 10) for line endings. Mercurial provides&lt;br /&gt;
an extension named &#039;&#039;win32text&#039;&#039; you can use to auto-convert files from your&lt;br /&gt;
OS&#039;s native format to single LF and vice-versa.&lt;br /&gt;
&lt;br /&gt;
==== Indentation ====&lt;br /&gt;
Indent your code with tabs (ASCII 9). Use space (ASCII 32) for all other&lt;br /&gt;
formatting.&lt;br /&gt;
&lt;br /&gt;
==== Braces ====&lt;br /&gt;
Braces are on their own line, on the same level of indentation as the&lt;br /&gt;
structure they belong to. You may add braces around single statements in&lt;br /&gt;
&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements if the first block or an &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; block has them.&lt;br /&gt;
&lt;br /&gt;
 if (count &amp;lt; 10)&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;Too few thingies!&amp;quot;);&lt;br /&gt;
 	AddMore();&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;We have enough&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Spaces ====&lt;br /&gt;
Function names are not followed by space. Commas are. No space follows opening&lt;br /&gt;
brackets (&amp;quot;[&amp;quot;) or parentheses (&amp;quot;(&amp;quot;). Also no space preceeds closing brackets&lt;br /&gt;
(&amp;quot;]&amp;quot;) or parentheses (&amp;quot;)&amp;quot;). Unary operators do not require spaces. Binary&lt;br /&gt;
operators do.&lt;br /&gt;
&lt;br /&gt;
Keywords (&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; etc.) are followed by a space.&lt;br /&gt;
&lt;br /&gt;
==== Parentheses ====&lt;br /&gt;
Do not use parentheses unless they are required for precedence or the code&lt;br /&gt;
gets confusing without them. Remember other people may have confusion&lt;br /&gt;
thresholds different from you.&lt;br /&gt;
&lt;br /&gt;
==== Control Structures ====&lt;br /&gt;
Control structures with a single statements are written without braces. If the&lt;br /&gt;
statement spans multiple lines, you may add braces for readability. Structures&lt;br /&gt;
without a statement contain a comment denoting this.&lt;br /&gt;
&lt;br /&gt;
 while (*dest++ = *src++)&lt;br /&gt;
 	/* empty */;&lt;br /&gt;
&lt;br /&gt;
Cascades in a &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; statement are marked by a FALLTHROUGH&lt;br /&gt;
comment. Code that cannot be reached has an assertion. &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt; elements&lt;br /&gt;
are not indented.&lt;br /&gt;
&lt;br /&gt;
 switch (foo)&lt;br /&gt;
 {&lt;br /&gt;
 case FOO_HEX:&lt;br /&gt;
 	accept_hex = true;&lt;br /&gt;
 	// FALLTHROUGH&lt;br /&gt;
 case FOO_DEC:&lt;br /&gt;
 	accept_num = true;&lt;br /&gt;
 	break;&lt;br /&gt;
 default:&lt;br /&gt;
 	assert(!&amp;quot;Invalid foo value&amp;quot;);&lt;br /&gt;
 	// Do something meaningful here anyway, if possible;&lt;br /&gt;
 	// try to not leave the program in an ill-defined state.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
 // Single-line comments look like this&lt;br /&gt;
&lt;br /&gt;
 // Multi-line comments look like this. Using C++-style comments&lt;br /&gt;
 // helps if you need to comment out large pieces of code later, or if the length of&lt;br /&gt;
 // the comment changes over time. Of course you could still use #if 0 ... #endif&lt;br /&gt;
 // to achieve that.&lt;br /&gt;
&lt;br /&gt;
 /* You may also write multi-line comments like this. Make sure you write enough&lt;br /&gt;
    text to warrant a multi-line comment. Also be sure to write in full sentences. */&lt;br /&gt;
&lt;br /&gt;
==== Type Casting ====&lt;br /&gt;
Do not use C-style or function style casts. Use a template cast instead.&lt;br /&gt;
&lt;br /&gt;
=== Source File Layout ===&lt;br /&gt;
==== Copyright Header ====&lt;br /&gt;
Every source file begins with a copyright header. If you make significant&lt;br /&gt;
changes to the code, you may (but are not required to) add your name to the&lt;br /&gt;
list of copyright holders. If you choose to add yourself, use your real name,&lt;br /&gt;
not a nickname. Legally recognized pseudonyms are accepted, as are names of&lt;br /&gt;
legal entities. If you don&#039;t want to add yourself, you may add the catch-all&lt;br /&gt;
copyright attribution phrase, if it does not already exist.&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * OpenClonk, http://www.openclonk.org&lt;br /&gt;
  *&lt;br /&gt;
  * Copyright (c) 2000-2009  John Doe&lt;br /&gt;
  * Copyright (c) 2005  Jane Q. Public&lt;br /&gt;
  *&lt;br /&gt;
  * Portions might be copyrighted by other authors who have contributed&lt;br /&gt;
  * to OpenClonk.&lt;br /&gt;
  *&lt;br /&gt;
  * Other legalese goes here, but has been omitted for brevity. See an&lt;br /&gt;
  * existing file for a template.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
The copyright header is followed by an empty line. Put a comment explaining&lt;br /&gt;
the purpose of the file next, and leave another blank line after this.&lt;br /&gt;
&lt;br /&gt;
==== Inclusion Guards ====&lt;br /&gt;
If you are writing a header file, use #include guards. If your file is called&lt;br /&gt;
&#039;&#039;C4Foo.h&#039;&#039;, your guard should be &amp;lt;tt&amp;gt;INC_&#039;&#039;C4Foo&#039;&#039;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 #ifndef INC_C4Foo&lt;br /&gt;
 #define INC_C4Foo&lt;br /&gt;
 class C4Foo;&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO: Precompiled headers.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== #include Directives ====&lt;br /&gt;
Include local headers first. Put the filename in double quotes, and use&lt;br /&gt;
forward slashes as directory separators.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;Standard.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;StdBuf.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Leave a blank line before system headers. Use angle brackets to include these,&lt;br /&gt;
and sort them alphabetically.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;map&amp;gt;&lt;br /&gt;
 #include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Declarations ===&lt;br /&gt;
==== Preprocessor Macros ====&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; values in headers. Use &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; instead, or&lt;br /&gt;
&amp;lt;tt&amp;gt;enum&amp;lt;/tt&amp;gt; if you are declaring an enumeration.&lt;br /&gt;
&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; inline functions either, use &amp;lt;tt&amp;gt;inline&amp;lt;/tt&amp;gt;. If your&lt;br /&gt;
functions need to work on multiple data types, overload the function or write&lt;br /&gt;
a &amp;lt;tt&amp;gt;template&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If, despite of the above, still need to write a macro, use an all-uppercase&lt;br /&gt;
name. If your macro contains a compound statement, enclose it in a &amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;&lt;br /&gt;
loop to allow its use in &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements. A terminating semicolon&lt;br /&gt;
should be provided at the place of invocation. This makes parsing the source&lt;br /&gt;
easier for pretty-printers and editors. Consider undefining your macro when&lt;br /&gt;
you are done using it.&lt;br /&gt;
&lt;br /&gt;
 #define FOO(a, b) do { \&lt;br /&gt;
 	bar += (a); \&lt;br /&gt;
 	bar /= (b); \&lt;br /&gt;
 } while(0)&lt;br /&gt;
&lt;br /&gt;
==== Data Types ====&lt;br /&gt;
Do not use the Win32 style integer declarations &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; and&lt;br /&gt;
&amp;lt;tt&amp;gt;BOOL&amp;lt;/tt&amp;gt;. If you need a guarantee about the size of your variables, use&lt;br /&gt;
the C99 types &amp;lt;tt&amp;gt;int&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;uint&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt;. If you don&#039;t&lt;br /&gt;
need that guarantee, use &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. If you need a variable that is large&lt;br /&gt;
enough to store a pointer on your current platform, use &amp;lt;tt&amp;gt;intptr_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you come across code that still uses Win32 types, consider changing it if&lt;br /&gt;
you are working on code in the vicinity. Don&#039;t commit changes that only&lt;br /&gt;
consist of replacing &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;uint32_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When declaring a pointer, put a space in front of the asterisk, and none&lt;br /&gt;
after. This saves some confusion when declaring multiple variables at once.&lt;br /&gt;
The same goes for references.&lt;br /&gt;
&lt;br /&gt;
 int *foo, *bar;&lt;br /&gt;
 char *Qux(const char *quux);&lt;br /&gt;
&lt;br /&gt;
==== Functions ====&lt;br /&gt;
Functions that are not used outside of the containing file are placed inside&lt;br /&gt;
of an anonymous namespace.&lt;br /&gt;
&lt;br /&gt;
 namespace&lt;br /&gt;
 {&lt;br /&gt;
 	int Frobnicate(const char *foo);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Functions that are used across multiple files are prototyped inside a common&lt;br /&gt;
header. The prototypes should be grouped where appropriate, and ordered&lt;br /&gt;
logically or, failing that, alphabetically.&lt;br /&gt;
&lt;br /&gt;
Function and class names begin with a capital letter, and use camel casing. If&lt;br /&gt;
you need to embed acronyms inside the name, pretend the acronym was all lower&lt;br /&gt;
case. Member variables use the same convention, but begin with a lower case&lt;br /&gt;
letter. Do not use hungarian prefixes.&lt;br /&gt;
&lt;br /&gt;
 XmlDocument *ParseXmlFile(const char *file);&lt;br /&gt;
&lt;br /&gt;
When passing arguments that may be changed by the called function, pass them&lt;br /&gt;
as pointers. This makes it obvious that they may be changed. Use constant&lt;br /&gt;
references for all other parameters, unless they are a primitive type.&lt;br /&gt;
&lt;br /&gt;
==== Class Members ====&lt;br /&gt;
No class member variable should be declared &amp;lt;tt&amp;gt;public&amp;lt;/tt&amp;gt; unless necessary.&lt;br /&gt;
Consider using &amp;lt;tt&amp;gt;GetFoo&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SetFoo&amp;lt;/tt&amp;gt; accessors. If you want to &lt;br /&gt;
declare a compound data type that allows direct access to its members, use&lt;br /&gt;
&amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;. Do not add more functions than constructors, destructors, and&lt;br /&gt;
assignment operators to &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
Mark all class members that do not change the visible state of the object&lt;br /&gt;
&amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt;. If you need to modify internal state that is not visible from&lt;br /&gt;
outside of the class, mark the state variable &amp;lt;tt&amp;gt;mutable&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=254</id>
		<title>Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=254"/>
		<updated>2009-10-13T20:34:00Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: /* Preprocessor Macros */ Remove aligning of macro line continuations, since tab width may vary&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document specifies the preferred source code style of files inside the&lt;br /&gt;
OpenClonk source tree. Some of the style rules are also stated implicitly&lt;br /&gt;
inside the examples.&lt;br /&gt;
&lt;br /&gt;
=== All-encompassing Guidelines ===&lt;br /&gt;
==== Indentation ====&lt;br /&gt;
Indent your code with tabs (ASCII 9). Use space (ASCII 32) for all other&lt;br /&gt;
formatting.&lt;br /&gt;
&lt;br /&gt;
==== Braces ====&lt;br /&gt;
Braces are on their own line, on the same level of indentation as the&lt;br /&gt;
structure they belong to. You may add braces around single statements in&lt;br /&gt;
&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements if the first block or an &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; block has them.&lt;br /&gt;
&lt;br /&gt;
 if (count &amp;lt; 10)&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;Too few thingies!&amp;quot;);&lt;br /&gt;
 	AddMore();&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;We have enough&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Spaces ====&lt;br /&gt;
Function names are not followed by space. Commas are. No space follows opening&lt;br /&gt;
brackets (&amp;quot;[&amp;quot;) or parentheses (&amp;quot;(&amp;quot;). Also no space preceeds closing brackets&lt;br /&gt;
(&amp;quot;]&amp;quot;) or parentheses (&amp;quot;)&amp;quot;). Unary operators do not require spaces. Binary&lt;br /&gt;
operators do.&lt;br /&gt;
&lt;br /&gt;
Keywords (&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; etc.) are followed by a space.&lt;br /&gt;
&lt;br /&gt;
==== Parentheses ====&lt;br /&gt;
Do not use parentheses unless they are required for precedence or the code&lt;br /&gt;
gets confusing without them. Remember other people may have confusion&lt;br /&gt;
thresholds different from you.&lt;br /&gt;
&lt;br /&gt;
==== Control Structures ====&lt;br /&gt;
Control structures with a single statements are written without braces. If the&lt;br /&gt;
statement spans multiple lines, you may add braces for readability. Structures&lt;br /&gt;
without a statement contain a comment denoting this.&lt;br /&gt;
&lt;br /&gt;
 while (*dest++ = *src++)&lt;br /&gt;
 	/* empty */;&lt;br /&gt;
&lt;br /&gt;
Cascades in a &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; statement are marked by a FALLTHROUGH&lt;br /&gt;
comment. Code that cannot be reached has an assertion. &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt; elements&lt;br /&gt;
are not indented.&lt;br /&gt;
&lt;br /&gt;
 switch (foo)&lt;br /&gt;
 {&lt;br /&gt;
 case FOO_HEX:&lt;br /&gt;
 	accept_hex = true;&lt;br /&gt;
 	// FALLTHROUGH&lt;br /&gt;
 case FOO_DEC:&lt;br /&gt;
 	accept_num = true;&lt;br /&gt;
 	break;&lt;br /&gt;
 default:&lt;br /&gt;
 	assert(!&amp;quot;Invalid foo value&amp;quot;);&lt;br /&gt;
 	// Do something meaningful here anyway, if possible;&lt;br /&gt;
 	// try to not leave the program in an ill-defined state.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
 // Single-line comments look like this&lt;br /&gt;
&lt;br /&gt;
 // Multi-line comments look like this. Using C++-style comments&lt;br /&gt;
 // helps if you need to comment out large pieces of code later, or if the length of&lt;br /&gt;
 // the comment changes over time. Of course you could still use #if 0 ... #endif&lt;br /&gt;
 // to achieve that.&lt;br /&gt;
&lt;br /&gt;
 /* You may also write multi-line comments like this. Make sure you write enough&lt;br /&gt;
    text to warrant a multi-line comment. Also be sure to write in full sentences. */&lt;br /&gt;
&lt;br /&gt;
==== Type Casting ====&lt;br /&gt;
Do not use C-style or function style casts. Use a template cast instead.&lt;br /&gt;
&lt;br /&gt;
=== Source File Layout ===&lt;br /&gt;
==== Copyright Header ====&lt;br /&gt;
Every source file begins with a copyright header. If you make significant&lt;br /&gt;
changes to the code, you may (but are not required to) add your name to the&lt;br /&gt;
list of copyright holders. If you choose to add yourself, use your real name,&lt;br /&gt;
not a nickname. Legally recognized pseudonyms are accepted, as are names of&lt;br /&gt;
legal entities. If you don&#039;t want to add yourself, you may add the catch-all&lt;br /&gt;
copyright attribution phrase, if it does not already exist.&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * OpenClonk, http://www.openclonk.org&lt;br /&gt;
  *&lt;br /&gt;
  * Copyright (c) 2000-2009  John Doe&lt;br /&gt;
  * Copyright (c) 2005  Jane Q. Public&lt;br /&gt;
  *&lt;br /&gt;
  * Portions might be copyrighted by other authors who have contributed&lt;br /&gt;
  * to OpenClonk.&lt;br /&gt;
  *&lt;br /&gt;
  * Other legalese goes here, but has been omitted for brevity. See an&lt;br /&gt;
  * existing file for a template.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
The copyright header is followed by an empty line. Put a comment explaining&lt;br /&gt;
the purpose of the file next, and leave another blank line after this.&lt;br /&gt;
&lt;br /&gt;
==== Inclusion Guards ====&lt;br /&gt;
If you are writing a header file, use #include guards. If your file is called&lt;br /&gt;
&#039;&#039;C4Foo.h&#039;&#039;, your guard should be &amp;lt;tt&amp;gt;INC_&#039;&#039;C4Foo&#039;&#039;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 #ifndef INC_C4Foo&lt;br /&gt;
 #define INC_C4Foo&lt;br /&gt;
 class C4Foo;&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO: Precompiled headers.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== #include Directives ====&lt;br /&gt;
Include local headers first. Put the filename in double quotes, and use&lt;br /&gt;
forward slashes as directory separators.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;Standard.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;StdBuf.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Leave a blank line before system headers. Use angle brackets to include these,&lt;br /&gt;
and sort them alphabetically.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;map&amp;gt;&lt;br /&gt;
 #include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Declarations ===&lt;br /&gt;
==== Preprocessor Macros ====&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; values in headers. Use &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; instead, or&lt;br /&gt;
&amp;lt;tt&amp;gt;enum&amp;lt;/tt&amp;gt; if you are declaring an enumeration.&lt;br /&gt;
&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; inline functions either, use &amp;lt;tt&amp;gt;inline&amp;lt;/tt&amp;gt;. If your&lt;br /&gt;
functions need to work on multiple data types, overload the function or write&lt;br /&gt;
a &amp;lt;tt&amp;gt;template&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If, despite of the above, still need to write a macro, use an all-uppercase&lt;br /&gt;
name. If your macro contains a compound statement, enclose it in a &amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;&lt;br /&gt;
loop to allow its use in &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements. A terminating semicolon&lt;br /&gt;
should be provided at the place of invocation. This makes parsing the source&lt;br /&gt;
easier for pretty-printers and editors. Consider undefining your macro when&lt;br /&gt;
you are done using it.&lt;br /&gt;
&lt;br /&gt;
 #define FOO(a, b) do { \&lt;br /&gt;
 	bar += (a); \&lt;br /&gt;
 	bar /= (b); \&lt;br /&gt;
 } while(0)&lt;br /&gt;
&lt;br /&gt;
==== Data Types ====&lt;br /&gt;
Do not use the Win32 style integer declarations &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; and&lt;br /&gt;
&amp;lt;tt&amp;gt;BOOL&amp;lt;/tt&amp;gt;. If you need a guarantee about the size of your variables, use&lt;br /&gt;
the C99 types &amp;lt;tt&amp;gt;int&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;uint&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt;. If you don&#039;t&lt;br /&gt;
need that guarantee, use &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. If you need a variable that is large&lt;br /&gt;
enough to store a pointer on your current platform, use &amp;lt;tt&amp;gt;intptr_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you come across code that still uses Win32 types, consider changing it if&lt;br /&gt;
you are working on code in the vicinity. Don&#039;t commit changes that only&lt;br /&gt;
consist of replacing &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;uint32_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When declaring a pointer, put a space in front of the asterisk, and none&lt;br /&gt;
after. This saves some confusion when declaring multiple variables at once.&lt;br /&gt;
The same goes for references.&lt;br /&gt;
&lt;br /&gt;
 int *foo, *bar;&lt;br /&gt;
 char *Qux(const char *quux);&lt;br /&gt;
&lt;br /&gt;
==== Functions ====&lt;br /&gt;
Functions that are not used outside of the containing file are placed inside&lt;br /&gt;
of an anonymous namespace.&lt;br /&gt;
&lt;br /&gt;
 namespace&lt;br /&gt;
 {&lt;br /&gt;
 	int Frobnicate(const char *foo);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Functions that are used across multiple files are prototyped inside a common&lt;br /&gt;
header. The prototypes should be grouped where appropriate, and ordered&lt;br /&gt;
logically or, failing that, alphabetically.&lt;br /&gt;
&lt;br /&gt;
Function and class names begin with a capital letter, and use camel casing. If&lt;br /&gt;
you need to embed acronyms inside the name, pretend the acronym was all lower&lt;br /&gt;
case. Member variables use the same convention, but begin with a lower case&lt;br /&gt;
letter. Do not use hungarian prefixes.&lt;br /&gt;
&lt;br /&gt;
 XmlDocument *ParseXmlFile(const char *file);&lt;br /&gt;
&lt;br /&gt;
When passing arguments that may be changed by the called function, pass them&lt;br /&gt;
as pointers. This makes it obvious that they may be changed. Use constant&lt;br /&gt;
references for all other parameters, unless they are a primitive type.&lt;br /&gt;
&lt;br /&gt;
==== Class Members ====&lt;br /&gt;
No class member variable should be declared &amp;lt;tt&amp;gt;public&amp;lt;/tt&amp;gt; unless necessary.&lt;br /&gt;
Consider using &amp;lt;tt&amp;gt;GetFoo&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SetFoo&amp;lt;/tt&amp;gt; accessors. If you want to &lt;br /&gt;
declare a compound data type that allows direct access to its members, use&lt;br /&gt;
&amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;. Do not add more functions than constructors, destructors, and&lt;br /&gt;
assignment operators to &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
Mark all class members that do not change the visible state of the object&lt;br /&gt;
&amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt;. If you need to modify internal state that is not visible from&lt;br /&gt;
outside of the class, mark the state variable &amp;lt;tt&amp;gt;mutable&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=184</id>
		<title>Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=184"/>
		<updated>2009-08-15T14:04:35Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: /* Braces */ Amending brace style in accordance with the style poll (see forum for details)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document specifies the preferred source code style of files inside the&lt;br /&gt;
OpenClonk source tree. Some of the style rules are also stated implicitly&lt;br /&gt;
inside the examples.&lt;br /&gt;
&lt;br /&gt;
=== All-encompassing Guidelines ===&lt;br /&gt;
==== Indentation ====&lt;br /&gt;
Indent your code with tabs (ASCII 9). Use space (ASCII 32) for all other&lt;br /&gt;
formatting.&lt;br /&gt;
&lt;br /&gt;
==== Braces ====&lt;br /&gt;
Braces are on their own line, on the same level of indentation as the&lt;br /&gt;
structure they belong to. You may add braces around single statements in&lt;br /&gt;
&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements if the first block or an &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; block has them.&lt;br /&gt;
&lt;br /&gt;
 if (count &amp;lt; 10)&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;Too few thingies!&amp;quot;);&lt;br /&gt;
 	AddMore();&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;We have enough&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Spaces ====&lt;br /&gt;
Function names are not followed by space. Commas are. No space follows opening&lt;br /&gt;
brackets (&amp;quot;[&amp;quot;) or parentheses (&amp;quot;(&amp;quot;). Also no space preceeds closing brackets&lt;br /&gt;
(&amp;quot;]&amp;quot;) or parentheses (&amp;quot;)&amp;quot;). Unary operators do not require spaces. Binary&lt;br /&gt;
operators do.&lt;br /&gt;
&lt;br /&gt;
Keywords (&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; etc.) are followed by a space.&lt;br /&gt;
&lt;br /&gt;
==== Parentheses ====&lt;br /&gt;
Do not use parentheses unless they are required for precedence or the code&lt;br /&gt;
gets confusing without them. Remember other people may have confusion&lt;br /&gt;
thresholds different from you.&lt;br /&gt;
&lt;br /&gt;
==== Control Structures ====&lt;br /&gt;
Control structures with a single statements are written without braces. If the&lt;br /&gt;
statement spans multiple lines, you may add braces for readability. Structures&lt;br /&gt;
without a statement contain a comment denoting this.&lt;br /&gt;
&lt;br /&gt;
 while (*dest++ = *src++)&lt;br /&gt;
 	/* empty */;&lt;br /&gt;
&lt;br /&gt;
Cascades in a &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; statement are marked by a FALLTHROUGH&lt;br /&gt;
comment. Code that cannot be reached has an assertion. &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt; elements&lt;br /&gt;
are not indented.&lt;br /&gt;
&lt;br /&gt;
 switch (foo)&lt;br /&gt;
 {&lt;br /&gt;
 case FOO_HEX:&lt;br /&gt;
 	accept_hex = true;&lt;br /&gt;
 	// FALLTHROUGH&lt;br /&gt;
 case FOO_DEC:&lt;br /&gt;
 	accept_num = true;&lt;br /&gt;
 	break;&lt;br /&gt;
 default:&lt;br /&gt;
 	assert(!&amp;quot;Invalid foo value&amp;quot;);&lt;br /&gt;
 	// Do something meaningful here anyway, if possible;&lt;br /&gt;
 	// try to not leave the program in an ill-defined state.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
 // Single-line comments look like this&lt;br /&gt;
&lt;br /&gt;
 // Multi-line comments look like this. Using C++-style comments&lt;br /&gt;
 // helps if you need to comment out large pieces of code later, or if the length of&lt;br /&gt;
 // the comment changes over time. Of course you could still use #if 0 ... #endif&lt;br /&gt;
 // to achieve that.&lt;br /&gt;
&lt;br /&gt;
 /* You may also write multi-line comments like this. Make sure you write enough&lt;br /&gt;
    text to warrant a multi-line comment. Also be sure to write in full sentences. */&lt;br /&gt;
&lt;br /&gt;
==== Type Casting ====&lt;br /&gt;
Do not use C-style or function style casts. Use a template cast instead.&lt;br /&gt;
&lt;br /&gt;
=== Source File Layout ===&lt;br /&gt;
==== Copyright Header ====&lt;br /&gt;
Every source file begins with a copyright header. If you make significant&lt;br /&gt;
changes to the code, you may (but are not required to) add your name to the&lt;br /&gt;
list of copyright holders. If you choose to add yourself, use your real name,&lt;br /&gt;
not a nickname. Legally recognized pseudonyms are accepted, as are names of&lt;br /&gt;
legal entities. If you don&#039;t want to add yourself, you may add the catch-all&lt;br /&gt;
copyright attribution phrase, if it does not already exist.&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * OpenClonk, http://www.openclonk.org&lt;br /&gt;
  *&lt;br /&gt;
  * Copyright (c) 2000-2009  John Doe&lt;br /&gt;
  * Copyright (c) 2005  Jane Q. Public&lt;br /&gt;
  *&lt;br /&gt;
  * Portions might be copyrighted by other authors who have contributed&lt;br /&gt;
  * to OpenClonk.&lt;br /&gt;
  *&lt;br /&gt;
  * Other legalese goes here, but has been omitted for brevity. See an&lt;br /&gt;
  * existing file for a template.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
The copyright header is followed by an empty line. Put a comment explaining&lt;br /&gt;
the purpose of the file next, and leave another blank line after this.&lt;br /&gt;
&lt;br /&gt;
==== Inclusion Guards ====&lt;br /&gt;
If you are writing a header file, use #include guards. If your file is called&lt;br /&gt;
&#039;&#039;C4Foo.h&#039;&#039;, your guard should be &amp;lt;tt&amp;gt;INC_&#039;&#039;C4Foo&#039;&#039;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 #ifndef INC_C4Foo&lt;br /&gt;
 #define INC_C4Foo&lt;br /&gt;
 class C4Foo;&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO: Precompiled headers.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== #include Directives ====&lt;br /&gt;
Include local headers first. Put the filename in double quotes, and use&lt;br /&gt;
forward slashes as directory separators.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;Standard.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;StdBuf.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Leave a blank line before system headers. Use angle brackets to include these,&lt;br /&gt;
and sort them alphabetically.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;map&amp;gt;&lt;br /&gt;
 #include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Declarations ===&lt;br /&gt;
==== Preprocessor Macros ====&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; values in headers. Use &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; instead, or&lt;br /&gt;
&amp;lt;tt&amp;gt;enum&amp;lt;/tt&amp;gt; if you are declaring an enumeration.&lt;br /&gt;
&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; inline functions either, use &amp;lt;tt&amp;gt;inline&amp;lt;/tt&amp;gt;. If your&lt;br /&gt;
functions need to work on multiple data types, overload the function or write&lt;br /&gt;
a &amp;lt;tt&amp;gt;template&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If, despite of the above, still need to write a macro, use an all-uppercase&lt;br /&gt;
name. If your macro contains a compound statement, enclose it in a &amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;&lt;br /&gt;
loop to allow its use in &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements. A terminating semicolon&lt;br /&gt;
should be provided at the place of invocation. This makes parsing the source&lt;br /&gt;
easier for pretty-printers and editors. If your macro spans multiple lines,&lt;br /&gt;
align the backslashes. Consider undefining your macro when you are done using&lt;br /&gt;
it.&lt;br /&gt;
&lt;br /&gt;
 #define FOO(a, b) do { \&lt;br /&gt;
   bar += (a);          \&lt;br /&gt;
   bar /= (b);          \&lt;br /&gt;
 } while(0)&lt;br /&gt;
&lt;br /&gt;
==== Data Types ====&lt;br /&gt;
Do not use the Win32 style integer declarations &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; and&lt;br /&gt;
&amp;lt;tt&amp;gt;BOOL&amp;lt;/tt&amp;gt;. If you need a guarantee about the size of your variables, use&lt;br /&gt;
the C99 types &amp;lt;tt&amp;gt;int&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;uint&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt;. If you don&#039;t&lt;br /&gt;
need that guarantee, use &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. If you need a variable that is large&lt;br /&gt;
enough to store a pointer on your current platform, use &amp;lt;tt&amp;gt;intptr_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you come across code that still uses Win32 types, consider changing it if&lt;br /&gt;
you are working on code in the vicinity. Don&#039;t commit changes that only&lt;br /&gt;
consist of replacing &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;uint32_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When declaring a pointer, put a space in front of the asterisk, and none&lt;br /&gt;
after. This saves some confusion when declaring multiple variables at once.&lt;br /&gt;
The same goes for references.&lt;br /&gt;
&lt;br /&gt;
 int *foo, *bar;&lt;br /&gt;
 char *Qux(const char *quux);&lt;br /&gt;
&lt;br /&gt;
==== Functions ====&lt;br /&gt;
Functions that are not used outside of the containing file are placed inside&lt;br /&gt;
of an anonymous namespace.&lt;br /&gt;
&lt;br /&gt;
 namespace&lt;br /&gt;
 {&lt;br /&gt;
 	int Frobnicate(const char *foo);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Functions that are used across multiple files are prototyped inside a common&lt;br /&gt;
header. The prototypes should be grouped where appropriate, and ordered&lt;br /&gt;
logically or, failing that, alphabetically.&lt;br /&gt;
&lt;br /&gt;
Function and class names begin with a capital letter, and use camel casing. If&lt;br /&gt;
you need to embed acronyms inside the name, pretend the acronym was all lower&lt;br /&gt;
case. Member variables use the same convention, but begin with a lower case&lt;br /&gt;
letter. Do not use hungarian prefixes.&lt;br /&gt;
&lt;br /&gt;
 XmlDocument *ParseXmlFile(const char *file);&lt;br /&gt;
&lt;br /&gt;
When passing arguments that may be changed by the called function, pass them&lt;br /&gt;
as pointers. This makes it obvious that they may be changed. Use constant&lt;br /&gt;
references for all other parameters, unless they are a primitive type.&lt;br /&gt;
&lt;br /&gt;
==== Class Members ====&lt;br /&gt;
No class member variable should be declared &amp;lt;tt&amp;gt;public&amp;lt;/tt&amp;gt; unless necessary.&lt;br /&gt;
Consider using &amp;lt;tt&amp;gt;GetFoo&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SetFoo&amp;lt;/tt&amp;gt; accessors. If you want to &lt;br /&gt;
declare a compound data type that allows direct access to its members, use&lt;br /&gt;
&amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;. Do not add more functions than constructors, destructors, and&lt;br /&gt;
assignment operators to &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
Mark all class members that do not change the visible state of the object&lt;br /&gt;
&amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt;. If you need to modify internal state that is not visible from&lt;br /&gt;
outside of the class, mark the state variable &amp;lt;tt&amp;gt;mutable&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Talk:Style_Guidelines&amp;diff=181</id>
		<title>Talk:Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Talk:Style_Guidelines&amp;diff=181"/>
		<updated>2009-08-05T14:01:20Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responses so far:&lt;br /&gt;
[[User:Günther|Günther]]:&lt;br /&gt;
* local headers before system headers&lt;br /&gt;
* don&#039;t forbid public data members&lt;br /&gt;
* &amp;lt;!Guenther&amp;gt; Demanding Doygen comments is also a very radical change&lt;br /&gt;
: &amp;lt;!Guenther&amp;gt; Doxygen is only really usefull if you are generating API docs that are intended to be read without looking at the source code&lt;br /&gt;
: &amp;lt;!Guenther&amp;gt; That&#039;s not a use case for us: our API is C4Script, not some C++ API&lt;br /&gt;
&lt;br /&gt;
PeterW:&lt;br /&gt;
* order switch members by numeric value&lt;br /&gt;
&lt;br /&gt;
Afterthoughts [[User:Isilkor|Isilkor]]:&lt;br /&gt;
* Use forward declarations instead of including the header inside other headers, if possible.&lt;br /&gt;
&lt;br /&gt;
Opinions:&lt;br /&gt;
* Use anonymous namespaces instead of static: &#039;&#039;&#039;In favor:&#039;&#039;&#039; ck, Isilkor; &#039;&#039;&#039;Against:&#039;&#039;&#039; Günther, PeterW&lt;br /&gt;
* Doxygen comments: &#039;&#039;&#039;In favor:&#039;&#039;&#039;; &#039;&#039;&#039;Against:&#039;&#039;&#039; Günther, PeterW&lt;br /&gt;
&lt;br /&gt;
The document should describe reality, not wishful thinking. Where reality is inconsistent, the document can describe which of several options is preferred, but it shouldn&#039;t contain anything that&#039;s not already in somewhat widespread use. That would mean changing the coding style, and that&#039;s not the job of a coding style document. --[[User:Günther|Günther]] 16:41, 4 August 2009 (UTC)&lt;br /&gt;
: The document is intended to describe guidelines for new code, and not the legacy code that&#039;s all over the place anyway. While it&#039;s probably preferable to change old code if you do work in the vicinity, I certainly don&#039;t expect the code to be changed/reformatted on its own. --[[User:Isilkor|Isilkor]] 17:35, 4 August 2009 (UTC)&lt;br /&gt;
:: I think the intention of a Coding Style document should be to ensure uniformity. For that, you have to describe what&#039;s already in use. And the Clonk source code really is not that much &amp;quot;all over the place&amp;quot;. For example, the majority of files use indented braces, thus the coding style has to prescribe that, however much we would want to have another brace style. --[[User:Günther|Günther]] 11:36, 5 August 2009 (UTC)&lt;br /&gt;
::: No, it really &#039;&#039;&#039;is&#039;&#039;&#039; all over the place. Just take a look at standard. It&#039;s not even uniform within single files. There&#039;s mixed brace styles, tabs and spaces are both used for indenting (sometimes interspersed in the same function), you have a healthy mix of formatting in &amp;quot;section heading&amp;quot; comments, and so on. --[[User:Isilkor|Isilkor]] 14:01, 5 August 2009 (UTC)&lt;br /&gt;
I would not restrict the order of case labels in a switch. But if we do, then I agree with PeterW that they should be ordered by numeric value (which, for enumeration values, is mostly the same as the order the enumerators are defined). Maybe we also want to note that for commenting out code, #if 0 is preferred. I am generally okay with these guidelines, though I&#039;m likely to have problems with a few I&#039;m not used to, especially the pointer asterisk position and the space following if/while/for. When I am writing code then I am paying attention to the code and not the style, and I often fall back to my own style without even noticing. So please don&#039;t punch me if I check in code that doesn&#039;t strictly obey the guidelines. --[[User:Clonk-Karl|Clonk-Karl]] 00:23, 5 August 2009 (UTC)&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=178</id>
		<title>Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=178"/>
		<updated>2009-08-05T10:50:38Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: /* Comments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document specifies the preferred source code style of files inside the&lt;br /&gt;
OpenClonk source tree. Some of the style rules are also stated implicitly&lt;br /&gt;
inside the examples.&lt;br /&gt;
&lt;br /&gt;
=== All-encompassing Guidelines ===&lt;br /&gt;
==== Indentation ====&lt;br /&gt;
Indent your code with tabs (ASCII 9). Use space (ASCII 32) for all other&lt;br /&gt;
formatting.&lt;br /&gt;
&lt;br /&gt;
==== Braces ====&lt;br /&gt;
Braces are on their own line, on the same level of indentation as the&lt;br /&gt;
structure they belong to. Braces around &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; may stand on the same&lt;br /&gt;
line as the &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt;. You may add braces around single statements in&lt;br /&gt;
&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements if the first block or an &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; block has them.&lt;br /&gt;
&lt;br /&gt;
 if (count &amp;lt; 10)&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;Too few thingies!&amp;quot;);&lt;br /&gt;
 	AddMore();&lt;br /&gt;
 } else {&lt;br /&gt;
 	printf(&amp;quot;We have enough&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Spaces ====&lt;br /&gt;
Function names are not followed by space. Commas are. No space follows opening&lt;br /&gt;
brackets (&amp;quot;[&amp;quot;) or parentheses (&amp;quot;(&amp;quot;). Also no space preceeds closing brackets&lt;br /&gt;
(&amp;quot;]&amp;quot;) or parentheses (&amp;quot;)&amp;quot;). Unary operators do not require spaces. Binary&lt;br /&gt;
operators do.&lt;br /&gt;
&lt;br /&gt;
Keywords (&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; etc.) are followed by a space.&lt;br /&gt;
&lt;br /&gt;
==== Parentheses ====&lt;br /&gt;
Do not use parentheses unless they are required for precedence or the code&lt;br /&gt;
gets confusing without them. Remember other people may have confusion&lt;br /&gt;
thresholds different from you.&lt;br /&gt;
&lt;br /&gt;
==== Control Structures ====&lt;br /&gt;
Control structures with a single statements are written without braces. If the&lt;br /&gt;
statement spans multiple lines, you may add braces for readability. Structures&lt;br /&gt;
without a statement contain a comment denoting this.&lt;br /&gt;
&lt;br /&gt;
 while (*dest++ = *src++)&lt;br /&gt;
 	/* empty */;&lt;br /&gt;
&lt;br /&gt;
Cascades in a &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; statement are marked by a FALLTHROUGH&lt;br /&gt;
comment. Code that cannot be reached has an assertion. &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt; elements&lt;br /&gt;
are not indented.&lt;br /&gt;
&lt;br /&gt;
 switch (foo)&lt;br /&gt;
 {&lt;br /&gt;
 case FOO_HEX:&lt;br /&gt;
 	accept_hex = true;&lt;br /&gt;
 	// FALLTHROUGH&lt;br /&gt;
 case FOO_DEC:&lt;br /&gt;
 	accept_num = true;&lt;br /&gt;
 	break;&lt;br /&gt;
 default:&lt;br /&gt;
 	assert(!&amp;quot;Invalid foo value&amp;quot;);&lt;br /&gt;
 	// Do something meaningful here anyway, if possible;&lt;br /&gt;
 	// try to not leave the program in an ill-defined state.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
 // Single-line comments look like this&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * Multi-line comments look like this. Make sure you write enough text to&lt;br /&gt;
  * warrant a multi-line comment. Also be sure to write in full sentences.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
 //&lt;br /&gt;
 // You may also write multi-line comments like this. Using C++-style comments&lt;br /&gt;
 // helps if you need to comment out large pieces of code later. Of course you&lt;br /&gt;
 // could still use #if 0 ... #endif to achieve that.&lt;br /&gt;
 //&lt;br /&gt;
&lt;br /&gt;
==== Type Casting ====&lt;br /&gt;
Do not use C-style or function style casts. Use a template cast instead.&lt;br /&gt;
&lt;br /&gt;
=== Source File Layout ===&lt;br /&gt;
==== Copyright Header ====&lt;br /&gt;
Every source file begins with a copyright header. If you make significant&lt;br /&gt;
changes to the code, you may (but are not required to) add your name to the&lt;br /&gt;
list of copyright holders. If you choose to add yourself, use your real name,&lt;br /&gt;
not a nickname. Legally recognized pseudonyms are accepted, as are names of&lt;br /&gt;
legal entities. If you don&#039;t want to add yourself, you may add the catch-all&lt;br /&gt;
copyright attribution phrase, if it does not already exist.&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * OpenClonk, http://www.openclonk.org&lt;br /&gt;
  *&lt;br /&gt;
  * Copyright (c) 2000-2009  John Doe&lt;br /&gt;
  * Copyright (c) 2005  Jane Q. Public&lt;br /&gt;
  *&lt;br /&gt;
  * Portions might be copyrighted by other authors who have contributed&lt;br /&gt;
  * to OpenClonk.&lt;br /&gt;
  *&lt;br /&gt;
  * Other legalese goes here, but has been omitted for brevity. See an&lt;br /&gt;
  * existing file for a template.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
The copyright header is followed by an empty line. Put a comment explaining&lt;br /&gt;
the purpose of the file next, and leave another blank line after this.&lt;br /&gt;
&lt;br /&gt;
==== Inclusion Guards ====&lt;br /&gt;
If you are writing a header file, use #include guards. If your file is called&lt;br /&gt;
&#039;&#039;C4Foo.h&#039;&#039;, your guard should be &amp;lt;tt&amp;gt;INC_&#039;&#039;C4Foo&#039;&#039;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 #ifndef INC_C4Foo&lt;br /&gt;
 #define INC_C4Foo&lt;br /&gt;
 class C4Foo;&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO: Precompiled headers.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== #include Directives ====&lt;br /&gt;
Include local headers first. Put the filename in double quotes, and use&lt;br /&gt;
forward slashes as directory separators.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;Standard.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;StdBuf.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Leave a blank line before system headers. Use angle brackets to include these,&lt;br /&gt;
and sort them alphabetically.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;map&amp;gt;&lt;br /&gt;
 #include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Declarations ===&lt;br /&gt;
==== Preprocessor Macros ====&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; values in headers. Use &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; instead, or&lt;br /&gt;
&amp;lt;tt&amp;gt;enum&amp;lt;/tt&amp;gt; if you are declaring an enumeration.&lt;br /&gt;
&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; inline functions either, use &amp;lt;tt&amp;gt;inline&amp;lt;/tt&amp;gt;. If your&lt;br /&gt;
functions need to work on multiple data types, overload the function or write&lt;br /&gt;
a &amp;lt;tt&amp;gt;template&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If, despite of the above, still need to write a macro, use an all-uppercase&lt;br /&gt;
name. If your macro contains a compound statement, enclose it in a &amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;&lt;br /&gt;
loop to allow its use in &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements. A terminating semicolon&lt;br /&gt;
should be provided at the place of invocation. This makes parsing the source&lt;br /&gt;
easier for pretty-printers and editors. If your macro spans multiple lines,&lt;br /&gt;
align the backslashes. Consider undefining your macro when you are done using&lt;br /&gt;
it.&lt;br /&gt;
&lt;br /&gt;
 #define FOO(a, b) do { \&lt;br /&gt;
   bar += (a);          \&lt;br /&gt;
   bar /= (b);          \&lt;br /&gt;
 } while(0)&lt;br /&gt;
&lt;br /&gt;
==== Data Types ====&lt;br /&gt;
Do not use the Win32 style integer declarations &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; and&lt;br /&gt;
&amp;lt;tt&amp;gt;BOOL&amp;lt;/tt&amp;gt;. If you need a guarantee about the size of your variables, use&lt;br /&gt;
the C99 types &amp;lt;tt&amp;gt;int&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;uint&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt;. If you don&#039;t&lt;br /&gt;
need that guarantee, use &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. If you need a variable that is large&lt;br /&gt;
enough to store a pointer on your current platform, use &amp;lt;tt&amp;gt;intptr_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you come across code that still uses Win32 types, consider changing it if&lt;br /&gt;
you are working on code in the vicinity. Don&#039;t commit changes that only&lt;br /&gt;
consist of replacing &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;uint32_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When declaring a pointer, put a space in front of the asterisk, and none&lt;br /&gt;
after. This saves some confusion when declaring multiple variables at once.&lt;br /&gt;
The same goes for references.&lt;br /&gt;
&lt;br /&gt;
 int *foo, *bar;&lt;br /&gt;
 char *Qux(const char *quux);&lt;br /&gt;
&lt;br /&gt;
==== Functions ====&lt;br /&gt;
Functions that are not used outside of the containing file are placed inside&lt;br /&gt;
of an anonymous namespace.&lt;br /&gt;
&lt;br /&gt;
 namespace&lt;br /&gt;
 {&lt;br /&gt;
 	int Frobnicate(const char *foo);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Functions that are used across multiple files are prototyped inside a common&lt;br /&gt;
header. The prototypes should be grouped where appropriate, and ordered&lt;br /&gt;
logically or, failing that, alphabetically.&lt;br /&gt;
&lt;br /&gt;
Function and class names begin with a capital letter, and use camel casing. If&lt;br /&gt;
you need to embed acronyms inside the name, pretend the acronym was all lower&lt;br /&gt;
case. Member variables use the same convention, but begin with a lower case&lt;br /&gt;
letter. Do not use hungarian prefixes.&lt;br /&gt;
&lt;br /&gt;
 XmlDocument *ParseXmlFile(const char *file);&lt;br /&gt;
&lt;br /&gt;
When passing arguments that may be changed by the called function, pass them&lt;br /&gt;
as pointers. This makes it obvious that they may be changed. Use constant&lt;br /&gt;
references for all other parameters, unless they are a primitive type.&lt;br /&gt;
&lt;br /&gt;
==== Class Members ====&lt;br /&gt;
No class member variable should be declared &amp;lt;tt&amp;gt;public&amp;lt;/tt&amp;gt; unless necessary.&lt;br /&gt;
Consider using &amp;lt;tt&amp;gt;GetFoo&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SetFoo&amp;lt;/tt&amp;gt; accessors. If you want to &lt;br /&gt;
declare a compound data type that allows direct access to its members, use&lt;br /&gt;
&amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;. Do not add more functions than constructors, destructors, and&lt;br /&gt;
assignment operators to &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
Mark all class members that do not change the visible state of the object&lt;br /&gt;
&amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt;. If you need to modify internal state that is not visible from&lt;br /&gt;
outside of the class, mark the state variable &amp;lt;tt&amp;gt;mutable&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=177</id>
		<title>Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=177"/>
		<updated>2009-08-05T09:31:40Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: /* Comments */ C++ style comments okay for ML also&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document specifies the preferred source code style of files inside the&lt;br /&gt;
OpenClonk source tree. Some of the style rules are also stated implicitly&lt;br /&gt;
inside the examples.&lt;br /&gt;
&lt;br /&gt;
=== All-encompassing Guidelines ===&lt;br /&gt;
==== Indentation ====&lt;br /&gt;
Indent your code with tabs (ASCII 9). Use space (ASCII 32) for all other&lt;br /&gt;
formatting.&lt;br /&gt;
&lt;br /&gt;
==== Braces ====&lt;br /&gt;
Braces are on their own line, on the same level of indentation as the&lt;br /&gt;
structure they belong to. Braces around &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; may stand on the same&lt;br /&gt;
line as the &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt;. You may add braces around single statements in&lt;br /&gt;
&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements if the first block or an &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; block has them.&lt;br /&gt;
&lt;br /&gt;
 if (count &amp;lt; 10)&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;Too few thingies!&amp;quot;);&lt;br /&gt;
 	AddMore();&lt;br /&gt;
 } else {&lt;br /&gt;
 	printf(&amp;quot;We have enough&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Spaces ====&lt;br /&gt;
Function names are not followed by space. Commas are. No space follows opening&lt;br /&gt;
brackets (&amp;quot;[&amp;quot;) or parentheses (&amp;quot;(&amp;quot;). Also no space preceeds closing brackets&lt;br /&gt;
(&amp;quot;]&amp;quot;) or parentheses (&amp;quot;)&amp;quot;). Unary operators do not require spaces. Binary&lt;br /&gt;
operators do.&lt;br /&gt;
&lt;br /&gt;
Keywords (&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; etc.) are followed by a space.&lt;br /&gt;
&lt;br /&gt;
==== Parentheses ====&lt;br /&gt;
Do not use parentheses unless they are required for precedence or the code&lt;br /&gt;
gets confusing without them. Remember other people may have confusion&lt;br /&gt;
thresholds different from you.&lt;br /&gt;
&lt;br /&gt;
==== Control Structures ====&lt;br /&gt;
Control structures with a single statements are written without braces. If the&lt;br /&gt;
statement spans multiple lines, you may add braces for readability. Structures&lt;br /&gt;
without a statement contain a comment denoting this.&lt;br /&gt;
&lt;br /&gt;
 while (*dest++ = *src++)&lt;br /&gt;
 	/* empty */;&lt;br /&gt;
&lt;br /&gt;
Cascades in a &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; statement are marked by a FALLTHROUGH&lt;br /&gt;
comment. Code that cannot be reached has an assertion. &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt; elements&lt;br /&gt;
are not indented.&lt;br /&gt;
&lt;br /&gt;
 switch (foo)&lt;br /&gt;
 {&lt;br /&gt;
 case FOO_HEX:&lt;br /&gt;
 	accept_hex = true;&lt;br /&gt;
 	// FALLTHROUGH&lt;br /&gt;
 case FOO_DEC:&lt;br /&gt;
 	accept_num = true;&lt;br /&gt;
 	break;&lt;br /&gt;
 default:&lt;br /&gt;
 	assert(!&amp;quot;Invalid foo value&amp;quot;);&lt;br /&gt;
 	// Do something meaningful here anyway, if possible;&lt;br /&gt;
 	// try to not leave the program in an ill-defined state.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
 // Single-line comments look like this&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * Multi-line comments look like this. Make sure you write enough text to&lt;br /&gt;
  * warrant a multi-line comment. Also be sure to write in full sentences.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
 //&lt;br /&gt;
 // You may also write multi-line comments like this. Using C++-style comments&lt;br /&gt;
 // helps if you need to comment out large pieces of code. Of course you could&lt;br /&gt;
 // still use #if 0 ... #endif to achieve that.&lt;br /&gt;
 //&lt;br /&gt;
&lt;br /&gt;
==== Type Casting ====&lt;br /&gt;
Do not use C-style or function style casts. Use a template cast instead.&lt;br /&gt;
&lt;br /&gt;
=== Source File Layout ===&lt;br /&gt;
==== Copyright Header ====&lt;br /&gt;
Every source file begins with a copyright header. If you make significant&lt;br /&gt;
changes to the code, you may (but are not required to) add your name to the&lt;br /&gt;
list of copyright holders. If you choose to add yourself, use your real name,&lt;br /&gt;
not a nickname. Legally recognized pseudonyms are accepted, as are names of&lt;br /&gt;
legal entities. If you don&#039;t want to add yourself, you may add the catch-all&lt;br /&gt;
copyright attribution phrase, if it does not already exist.&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * OpenClonk, http://www.openclonk.org&lt;br /&gt;
  *&lt;br /&gt;
  * Copyright (c) 2000-2009  John Doe&lt;br /&gt;
  * Copyright (c) 2005  Jane Q. Public&lt;br /&gt;
  *&lt;br /&gt;
  * Portions might be copyrighted by other authors who have contributed&lt;br /&gt;
  * to OpenClonk.&lt;br /&gt;
  *&lt;br /&gt;
  * Other legalese goes here, but has been omitted for brevity. See an&lt;br /&gt;
  * existing file for a template.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
The copyright header is followed by an empty line. Put a comment explaining&lt;br /&gt;
the purpose of the file next, and leave another blank line after this.&lt;br /&gt;
&lt;br /&gt;
==== Inclusion Guards ====&lt;br /&gt;
If you are writing a header file, use #include guards. If your file is called&lt;br /&gt;
&#039;&#039;C4Foo.h&#039;&#039;, your guard should be &amp;lt;tt&amp;gt;INC_&#039;&#039;C4Foo&#039;&#039;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 #ifndef INC_C4Foo&lt;br /&gt;
 #define INC_C4Foo&lt;br /&gt;
 class C4Foo;&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO: Precompiled headers.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== #include Directives ====&lt;br /&gt;
Include local headers first. Put the filename in double quotes, and use&lt;br /&gt;
forward slashes as directory separators.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;Standard.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;StdBuf.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Leave a blank line before system headers. Use angle brackets to include these,&lt;br /&gt;
and sort them alphabetically.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;map&amp;gt;&lt;br /&gt;
 #include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Declarations ===&lt;br /&gt;
==== Preprocessor Macros ====&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; values in headers. Use &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; instead, or&lt;br /&gt;
&amp;lt;tt&amp;gt;enum&amp;lt;/tt&amp;gt; if you are declaring an enumeration.&lt;br /&gt;
&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; inline functions either, use &amp;lt;tt&amp;gt;inline&amp;lt;/tt&amp;gt;. If your&lt;br /&gt;
functions need to work on multiple data types, overload the function or write&lt;br /&gt;
a &amp;lt;tt&amp;gt;template&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If, despite of the above, still need to write a macro, use an all-uppercase&lt;br /&gt;
name. If your macro contains a compound statement, enclose it in a &amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;&lt;br /&gt;
loop to allow its use in &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements. A terminating semicolon&lt;br /&gt;
should be provided at the place of invocation. This makes parsing the source&lt;br /&gt;
easier for pretty-printers and editors. If your macro spans multiple lines,&lt;br /&gt;
align the backslashes. Consider undefining your macro when you are done using&lt;br /&gt;
it.&lt;br /&gt;
&lt;br /&gt;
 #define FOO(a, b) do { \&lt;br /&gt;
   bar += (a);          \&lt;br /&gt;
   bar /= (b);          \&lt;br /&gt;
 } while(0)&lt;br /&gt;
&lt;br /&gt;
==== Data Types ====&lt;br /&gt;
Do not use the Win32 style integer declarations &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; and&lt;br /&gt;
&amp;lt;tt&amp;gt;BOOL&amp;lt;/tt&amp;gt;. If you need a guarantee about the size of your variables, use&lt;br /&gt;
the C99 types &amp;lt;tt&amp;gt;int&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;uint&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt;. If you don&#039;t&lt;br /&gt;
need that guarantee, use &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. If you need a variable that is large&lt;br /&gt;
enough to store a pointer on your current platform, use &amp;lt;tt&amp;gt;intptr_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you come across code that still uses Win32 types, consider changing it if&lt;br /&gt;
you are working on code in the vicinity. Don&#039;t commit changes that only&lt;br /&gt;
consist of replacing &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;uint32_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When declaring a pointer, put a space in front of the asterisk, and none&lt;br /&gt;
after. This saves some confusion when declaring multiple variables at once.&lt;br /&gt;
The same goes for references.&lt;br /&gt;
&lt;br /&gt;
 int *foo, *bar;&lt;br /&gt;
 char *Qux(const char *quux);&lt;br /&gt;
&lt;br /&gt;
==== Functions ====&lt;br /&gt;
Functions that are not used outside of the containing file are placed inside&lt;br /&gt;
of an anonymous namespace.&lt;br /&gt;
&lt;br /&gt;
 namespace&lt;br /&gt;
 {&lt;br /&gt;
 	int Frobnicate(const char *foo);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Functions that are used across multiple files are prototyped inside a common&lt;br /&gt;
header. The prototypes should be grouped where appropriate, and ordered&lt;br /&gt;
logically or, failing that, alphabetically.&lt;br /&gt;
&lt;br /&gt;
Function and class names begin with a capital letter, and use camel casing. If&lt;br /&gt;
you need to embed acronyms inside the name, pretend the acronym was all lower&lt;br /&gt;
case. Member variables use the same convention, but begin with a lower case&lt;br /&gt;
letter. Do not use hungarian prefixes.&lt;br /&gt;
&lt;br /&gt;
 XmlDocument *ParseXmlFile(const char *file);&lt;br /&gt;
&lt;br /&gt;
When passing arguments that may be changed by the called function, pass them&lt;br /&gt;
as pointers. This makes it obvious that they may be changed. Use constant&lt;br /&gt;
references for all other parameters, unless they are a primitive type.&lt;br /&gt;
&lt;br /&gt;
==== Class Members ====&lt;br /&gt;
No class member variable should be declared &amp;lt;tt&amp;gt;public&amp;lt;/tt&amp;gt; unless necessary.&lt;br /&gt;
Consider using &amp;lt;tt&amp;gt;GetFoo&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SetFoo&amp;lt;/tt&amp;gt; accessors. If you want to &lt;br /&gt;
declare a compound data type that allows direct access to its members, use&lt;br /&gt;
&amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;. Do not add more functions than constructors, destructors, and&lt;br /&gt;
assignment operators to &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
Mark all class members that do not change the visible state of the object&lt;br /&gt;
&amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt;. If you need to modify internal state that is not visible from&lt;br /&gt;
outside of the class, mark the state variable &amp;lt;tt&amp;gt;mutable&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=176</id>
		<title>Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=176"/>
		<updated>2009-08-05T09:26:00Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: /* Preprocessor Macros */ Undefine macro after use&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document specifies the preferred source code style of files inside the&lt;br /&gt;
OpenClonk source tree. Some of the style rules are also stated implicitly&lt;br /&gt;
inside the examples.&lt;br /&gt;
&lt;br /&gt;
=== All-encompassing Guidelines ===&lt;br /&gt;
==== Indentation ====&lt;br /&gt;
Indent your code with tabs (ASCII 9). Use space (ASCII 32) for all other&lt;br /&gt;
formatting.&lt;br /&gt;
&lt;br /&gt;
==== Braces ====&lt;br /&gt;
Braces are on their own line, on the same level of indentation as the&lt;br /&gt;
structure they belong to. Braces around &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; may stand on the same&lt;br /&gt;
line as the &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt;. You may add braces around single statements in&lt;br /&gt;
&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements if the first block or an &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; block has them.&lt;br /&gt;
&lt;br /&gt;
 if (count &amp;lt; 10)&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;Too few thingies!&amp;quot;);&lt;br /&gt;
 	AddMore();&lt;br /&gt;
 } else {&lt;br /&gt;
 	printf(&amp;quot;We have enough&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Spaces ====&lt;br /&gt;
Function names are not followed by space. Commas are. No space follows opening&lt;br /&gt;
brackets (&amp;quot;[&amp;quot;) or parentheses (&amp;quot;(&amp;quot;). Also no space preceeds closing brackets&lt;br /&gt;
(&amp;quot;]&amp;quot;) or parentheses (&amp;quot;)&amp;quot;). Unary operators do not require spaces. Binary&lt;br /&gt;
operators do.&lt;br /&gt;
&lt;br /&gt;
Keywords (&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; etc.) are followed by a space.&lt;br /&gt;
&lt;br /&gt;
==== Parentheses ====&lt;br /&gt;
Do not use parentheses unless they are required for precedence or the code&lt;br /&gt;
gets confusing without them. Remember other people may have confusion&lt;br /&gt;
thresholds different from you.&lt;br /&gt;
&lt;br /&gt;
==== Control Structures ====&lt;br /&gt;
Control structures with a single statements are written without braces. If the&lt;br /&gt;
statement spans multiple lines, you may add braces for readability. Structures&lt;br /&gt;
without a statement contain a comment denoting this.&lt;br /&gt;
&lt;br /&gt;
 while (*dest++ = *src++)&lt;br /&gt;
 	/* empty */;&lt;br /&gt;
&lt;br /&gt;
Cascades in a &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; statement are marked by a FALLTHROUGH&lt;br /&gt;
comment. Code that cannot be reached has an assertion. &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt; elements&lt;br /&gt;
are not indented.&lt;br /&gt;
&lt;br /&gt;
 switch (foo)&lt;br /&gt;
 {&lt;br /&gt;
 case FOO_HEX:&lt;br /&gt;
 	accept_hex = true;&lt;br /&gt;
 	// FALLTHROUGH&lt;br /&gt;
 case FOO_DEC:&lt;br /&gt;
 	accept_num = true;&lt;br /&gt;
 	break;&lt;br /&gt;
 default:&lt;br /&gt;
 	assert(!&amp;quot;Invalid foo value&amp;quot;);&lt;br /&gt;
 	// Do something meaningful here anyway, if possible;&lt;br /&gt;
 	// try to not leave the program in an ill-defined state.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
 // Single-line comments look like this&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * Multi-line comments look like this. Make sure you write enough text to&lt;br /&gt;
  * warrant a multi-line comment. Also be sure to write in full sentences.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
==== Type Casting ====&lt;br /&gt;
Do not use C-style or function style casts. Use a template cast instead.&lt;br /&gt;
&lt;br /&gt;
=== Source File Layout ===&lt;br /&gt;
==== Copyright Header ====&lt;br /&gt;
Every source file begins with a copyright header. If you make significant&lt;br /&gt;
changes to the code, you may (but are not required to) add your name to the&lt;br /&gt;
list of copyright holders. If you choose to add yourself, use your real name,&lt;br /&gt;
not a nickname. Legally recognized pseudonyms are accepted, as are names of&lt;br /&gt;
legal entities. If you don&#039;t want to add yourself, you may add the catch-all&lt;br /&gt;
copyright attribution phrase, if it does not already exist.&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * OpenClonk, http://www.openclonk.org&lt;br /&gt;
  *&lt;br /&gt;
  * Copyright (c) 2000-2009  John Doe&lt;br /&gt;
  * Copyright (c) 2005  Jane Q. Public&lt;br /&gt;
  *&lt;br /&gt;
  * Portions might be copyrighted by other authors who have contributed&lt;br /&gt;
  * to OpenClonk.&lt;br /&gt;
  *&lt;br /&gt;
  * Other legalese goes here, but has been omitted for brevity. See an&lt;br /&gt;
  * existing file for a template.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
The copyright header is followed by an empty line. Put a comment explaining&lt;br /&gt;
the purpose of the file next, and leave another blank line after this.&lt;br /&gt;
&lt;br /&gt;
==== Inclusion Guards ====&lt;br /&gt;
If you are writing a header file, use #include guards. If your file is called&lt;br /&gt;
&#039;&#039;C4Foo.h&#039;&#039;, your guard should be &amp;lt;tt&amp;gt;INC_&#039;&#039;C4Foo&#039;&#039;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 #ifndef INC_C4Foo&lt;br /&gt;
 #define INC_C4Foo&lt;br /&gt;
 class C4Foo;&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO: Precompiled headers.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== #include Directives ====&lt;br /&gt;
Include local headers first. Put the filename in double quotes, and use&lt;br /&gt;
forward slashes as directory separators.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;Standard.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;StdBuf.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Leave a blank line before system headers. Use angle brackets to include these,&lt;br /&gt;
and sort them alphabetically.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;map&amp;gt;&lt;br /&gt;
 #include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Declarations ===&lt;br /&gt;
==== Preprocessor Macros ====&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; values in headers. Use &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; instead, or&lt;br /&gt;
&amp;lt;tt&amp;gt;enum&amp;lt;/tt&amp;gt; if you are declaring an enumeration.&lt;br /&gt;
&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; inline functions either, use &amp;lt;tt&amp;gt;inline&amp;lt;/tt&amp;gt;. If your&lt;br /&gt;
functions need to work on multiple data types, overload the function or write&lt;br /&gt;
a &amp;lt;tt&amp;gt;template&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If, despite of the above, still need to write a macro, use an all-uppercase&lt;br /&gt;
name. If your macro contains a compound statement, enclose it in a &amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;&lt;br /&gt;
loop to allow its use in &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements. A terminating semicolon&lt;br /&gt;
should be provided at the place of invocation. This makes parsing the source&lt;br /&gt;
easier for pretty-printers and editors. If your macro spans multiple lines,&lt;br /&gt;
align the backslashes. Consider undefining your macro when you are done using&lt;br /&gt;
it.&lt;br /&gt;
&lt;br /&gt;
 #define FOO(a, b) do { \&lt;br /&gt;
   bar += (a);          \&lt;br /&gt;
   bar /= (b);          \&lt;br /&gt;
 } while(0)&lt;br /&gt;
&lt;br /&gt;
==== Data Types ====&lt;br /&gt;
Do not use the Win32 style integer declarations &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; and&lt;br /&gt;
&amp;lt;tt&amp;gt;BOOL&amp;lt;/tt&amp;gt;. If you need a guarantee about the size of your variables, use&lt;br /&gt;
the C99 types &amp;lt;tt&amp;gt;int&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;uint&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt;. If you don&#039;t&lt;br /&gt;
need that guarantee, use &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. If you need a variable that is large&lt;br /&gt;
enough to store a pointer on your current platform, use &amp;lt;tt&amp;gt;intptr_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you come across code that still uses Win32 types, consider changing it if&lt;br /&gt;
you are working on code in the vicinity. Don&#039;t commit changes that only&lt;br /&gt;
consist of replacing &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;uint32_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When declaring a pointer, put a space in front of the asterisk, and none&lt;br /&gt;
after. This saves some confusion when declaring multiple variables at once.&lt;br /&gt;
The same goes for references.&lt;br /&gt;
&lt;br /&gt;
 int *foo, *bar;&lt;br /&gt;
 char *Qux(const char *quux);&lt;br /&gt;
&lt;br /&gt;
==== Functions ====&lt;br /&gt;
Functions that are not used outside of the containing file are placed inside&lt;br /&gt;
of an anonymous namespace.&lt;br /&gt;
&lt;br /&gt;
 namespace&lt;br /&gt;
 {&lt;br /&gt;
 	int Frobnicate(const char *foo);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Functions that are used across multiple files are prototyped inside a common&lt;br /&gt;
header. The prototypes should be grouped where appropriate, and ordered&lt;br /&gt;
logically or, failing that, alphabetically.&lt;br /&gt;
&lt;br /&gt;
Function and class names begin with a capital letter, and use camel casing. If&lt;br /&gt;
you need to embed acronyms inside the name, pretend the acronym was all lower&lt;br /&gt;
case. Member variables use the same convention, but begin with a lower case&lt;br /&gt;
letter. Do not use hungarian prefixes.&lt;br /&gt;
&lt;br /&gt;
 XmlDocument *ParseXmlFile(const char *file);&lt;br /&gt;
&lt;br /&gt;
When passing arguments that may be changed by the called function, pass them&lt;br /&gt;
as pointers. This makes it obvious that they may be changed. Use constant&lt;br /&gt;
references for all other parameters, unless they are a primitive type.&lt;br /&gt;
&lt;br /&gt;
==== Class Members ====&lt;br /&gt;
No class member variable should be declared &amp;lt;tt&amp;gt;public&amp;lt;/tt&amp;gt; unless necessary.&lt;br /&gt;
Consider using &amp;lt;tt&amp;gt;GetFoo&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SetFoo&amp;lt;/tt&amp;gt; accessors. If you want to &lt;br /&gt;
declare a compound data type that allows direct access to its members, use&lt;br /&gt;
&amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;. Do not add more functions than constructors, destructors, and&lt;br /&gt;
assignment operators to &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
Mark all class members that do not change the visible state of the object&lt;br /&gt;
&amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt;. If you need to modify internal state that is not visible from&lt;br /&gt;
outside of the class, mark the state variable &amp;lt;tt&amp;gt;mutable&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=175</id>
		<title>Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=175"/>
		<updated>2009-08-05T09:21:46Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: Change ordering, removed Doxygen requirement&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document specifies the preferred source code style of files inside the&lt;br /&gt;
OpenClonk source tree. Some of the style rules are also stated implicitly&lt;br /&gt;
inside the examples.&lt;br /&gt;
&lt;br /&gt;
=== All-encompassing Guidelines ===&lt;br /&gt;
==== Indentation ====&lt;br /&gt;
Indent your code with tabs (ASCII 9). Use space (ASCII 32) for all other&lt;br /&gt;
formatting.&lt;br /&gt;
&lt;br /&gt;
==== Braces ====&lt;br /&gt;
Braces are on their own line, on the same level of indentation as the&lt;br /&gt;
structure they belong to. Braces around &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; may stand on the same&lt;br /&gt;
line as the &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt;. You may add braces around single statements in&lt;br /&gt;
&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements if the first block or an &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; block has them.&lt;br /&gt;
&lt;br /&gt;
 if (count &amp;lt; 10)&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;Too few thingies!&amp;quot;);&lt;br /&gt;
 	AddMore();&lt;br /&gt;
 } else {&lt;br /&gt;
 	printf(&amp;quot;We have enough&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Spaces ====&lt;br /&gt;
Function names are not followed by space. Commas are. No space follows opening&lt;br /&gt;
brackets (&amp;quot;[&amp;quot;) or parentheses (&amp;quot;(&amp;quot;). Also no space preceeds closing brackets&lt;br /&gt;
(&amp;quot;]&amp;quot;) or parentheses (&amp;quot;)&amp;quot;). Unary operators do not require spaces. Binary&lt;br /&gt;
operators do.&lt;br /&gt;
&lt;br /&gt;
Keywords (&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; etc.) are followed by a space.&lt;br /&gt;
&lt;br /&gt;
==== Parentheses ====&lt;br /&gt;
Do not use parentheses unless they are required for precedence or the code&lt;br /&gt;
gets confusing without them. Remember other people may have confusion&lt;br /&gt;
thresholds different from you.&lt;br /&gt;
&lt;br /&gt;
==== Control Structures ====&lt;br /&gt;
Control structures with a single statements are written without braces. If the&lt;br /&gt;
statement spans multiple lines, you may add braces for readability. Structures&lt;br /&gt;
without a statement contain a comment denoting this.&lt;br /&gt;
&lt;br /&gt;
 while (*dest++ = *src++)&lt;br /&gt;
 	/* empty */;&lt;br /&gt;
&lt;br /&gt;
Cascades in a &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; statement are marked by a FALLTHROUGH&lt;br /&gt;
comment. Code that cannot be reached has an assertion. &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt; elements&lt;br /&gt;
are not indented.&lt;br /&gt;
&lt;br /&gt;
 switch (foo)&lt;br /&gt;
 {&lt;br /&gt;
 case FOO_HEX:&lt;br /&gt;
 	accept_hex = true;&lt;br /&gt;
 	// FALLTHROUGH&lt;br /&gt;
 case FOO_DEC:&lt;br /&gt;
 	accept_num = true;&lt;br /&gt;
 	break;&lt;br /&gt;
 default:&lt;br /&gt;
 	assert(!&amp;quot;Invalid foo value&amp;quot;);&lt;br /&gt;
 	// Do something meaningful here anyway, if possible;&lt;br /&gt;
 	// try to not leave the program in an ill-defined state.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Comments ====&lt;br /&gt;
 // Single-line comments look like this&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * Multi-line comments look like this. Make sure you write enough text to&lt;br /&gt;
  * warrant a multi-line comment. Also be sure to write in full sentences.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
==== Type Casting ====&lt;br /&gt;
Do not use C-style or function style casts. Use a template cast instead.&lt;br /&gt;
&lt;br /&gt;
=== Source File Layout ===&lt;br /&gt;
==== Copyright Header ====&lt;br /&gt;
Every source file begins with a copyright header. If you make significant&lt;br /&gt;
changes to the code, you may (but are not required to) add your name to the&lt;br /&gt;
list of copyright holders. If you choose to add yourself, use your real name,&lt;br /&gt;
not a nickname. Legally recognized pseudonyms are accepted, as are names of&lt;br /&gt;
legal entities. If you don&#039;t want to add yourself, you may add the catch-all&lt;br /&gt;
copyright attribution phrase, if it does not already exist.&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * OpenClonk, http://www.openclonk.org&lt;br /&gt;
  *&lt;br /&gt;
  * Copyright (c) 2000-2009  John Doe&lt;br /&gt;
  * Copyright (c) 2005  Jane Q. Public&lt;br /&gt;
  *&lt;br /&gt;
  * Portions might be copyrighted by other authors who have contributed&lt;br /&gt;
  * to OpenClonk.&lt;br /&gt;
  *&lt;br /&gt;
  * Other legalese goes here, but has been omitted for brevity. See an&lt;br /&gt;
  * existing file for a template.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
The copyright header is followed by an empty line. Put a comment explaining&lt;br /&gt;
the purpose of the file next, and leave another blank line after this.&lt;br /&gt;
&lt;br /&gt;
==== Inclusion Guards ====&lt;br /&gt;
If you are writing a header file, use #include guards. If your file is called&lt;br /&gt;
&#039;&#039;C4Foo.h&#039;&#039;, your guard should be &amp;lt;tt&amp;gt;INC_&#039;&#039;C4Foo&#039;&#039;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 #ifndef INC_C4Foo&lt;br /&gt;
 #define INC_C4Foo&lt;br /&gt;
 class C4Foo;&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO: Precompiled headers.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== #include Directives ====&lt;br /&gt;
Include local headers first. Put the filename in double quotes, and use&lt;br /&gt;
forward slashes as directory separators.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;Standard.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;StdBuf.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Leave a blank line before system headers. Use angle brackets to include these,&lt;br /&gt;
and sort them alphabetically.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;map&amp;gt;&lt;br /&gt;
 #include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Declarations ===&lt;br /&gt;
==== Preprocessor Macros ====&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; values in headers. Use &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; instead, or&lt;br /&gt;
&amp;lt;tt&amp;gt;enum&amp;lt;/tt&amp;gt; if you are declaring an enumeration.&lt;br /&gt;
&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; inline functions either, use &amp;lt;tt&amp;gt;inline&amp;lt;/tt&amp;gt;. If your&lt;br /&gt;
functions need to work on multiple data types, overload the function or write&lt;br /&gt;
a &amp;lt;tt&amp;gt;template&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If, despite of the above, still need to write a macro, use an all-uppercase&lt;br /&gt;
name. If your macro contains a compound statement, enclose it in a &amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;&lt;br /&gt;
loop to allow its use in &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements. A terminating semicolon&lt;br /&gt;
should be provided at the place of invocation. This makes parsing the source&lt;br /&gt;
easier for pretty-printers and editors. If your macro spans multiple lines,&lt;br /&gt;
align the backslashes.&lt;br /&gt;
&lt;br /&gt;
 #define FOO(a, b) do { \&lt;br /&gt;
   bar += (a);          \&lt;br /&gt;
   bar /= (b);          \&lt;br /&gt;
 } while(0)&lt;br /&gt;
&lt;br /&gt;
==== Data Types ====&lt;br /&gt;
Do not use the Win32 style integer declarations &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; and&lt;br /&gt;
&amp;lt;tt&amp;gt;BOOL&amp;lt;/tt&amp;gt;. If you need a guarantee about the size of your variables, use&lt;br /&gt;
the C99 types &amp;lt;tt&amp;gt;int&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;uint&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt;. If you don&#039;t&lt;br /&gt;
need that guarantee, use &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. If you need a variable that is large&lt;br /&gt;
enough to store a pointer on your current platform, use &amp;lt;tt&amp;gt;intptr_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you come across code that still uses Win32 types, consider changing it if&lt;br /&gt;
you are working on code in the vicinity. Don&#039;t commit changes that only&lt;br /&gt;
consist of replacing &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;uint32_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When declaring a pointer, put a space in front of the asterisk, and none&lt;br /&gt;
after. This saves some confusion when declaring multiple variables at once.&lt;br /&gt;
The same goes for references.&lt;br /&gt;
&lt;br /&gt;
 int *foo, *bar;&lt;br /&gt;
 char *Qux(const char *quux);&lt;br /&gt;
&lt;br /&gt;
==== Functions ====&lt;br /&gt;
Functions that are not used outside of the containing file are placed inside&lt;br /&gt;
of an anonymous namespace.&lt;br /&gt;
&lt;br /&gt;
 namespace&lt;br /&gt;
 {&lt;br /&gt;
 	int Frobnicate(const char *foo);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Functions that are used across multiple files are prototyped inside a common&lt;br /&gt;
header. The prototypes should be grouped where appropriate, and ordered&lt;br /&gt;
logically or, failing that, alphabetically.&lt;br /&gt;
&lt;br /&gt;
Function and class names begin with a capital letter, and use camel casing. If&lt;br /&gt;
you need to embed acronyms inside the name, pretend the acronym was all lower&lt;br /&gt;
case. Member variables use the same convention, but begin with a lower case&lt;br /&gt;
letter. Do not use hungarian prefixes.&lt;br /&gt;
&lt;br /&gt;
 XmlDocument *ParseXmlFile(const char *file);&lt;br /&gt;
&lt;br /&gt;
When passing arguments that may be changed by the called function, pass them&lt;br /&gt;
as pointers. This makes it obvious that they may be changed. Use constant&lt;br /&gt;
references for all other parameters, unless they are a primitive type.&lt;br /&gt;
&lt;br /&gt;
==== Class Members ====&lt;br /&gt;
No class member variable should be declared &amp;lt;tt&amp;gt;public&amp;lt;/tt&amp;gt; unless necessary.&lt;br /&gt;
Consider using &amp;lt;tt&amp;gt;GetFoo&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SetFoo&amp;lt;/tt&amp;gt; accessors. If you want to &lt;br /&gt;
declare a compound data type that allows direct access to its members, use&lt;br /&gt;
&amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;. Do not add more functions than constructors, destructors, and&lt;br /&gt;
assignment operators to &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
Mark all class members that do not change the visible state of the object&lt;br /&gt;
&amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt;. If you need to modify internal state that is not visible from&lt;br /&gt;
outside of the class, mark the state variable &amp;lt;tt&amp;gt;mutable&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=171</id>
		<title>Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=171"/>
		<updated>2009-08-04T19:04:46Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: Doxygen not in favor. ;)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document specifies the preferred source code style of files inside the&lt;br /&gt;
OpenClonk source tree. Some of the style rules are also stated implicitly&lt;br /&gt;
inside the examples.&lt;br /&gt;
&lt;br /&gt;
 // Single-line comments look like this&lt;br /&gt;
&lt;br /&gt;
 //&lt;br /&gt;
 // Very important single-line comments look like this&lt;br /&gt;
 //&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * Multi-line comments look like this. Make sure you write enough text to&lt;br /&gt;
  * warrant a multi-line comment. Also be sure to write in full sentences.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
Every source file begins with a copyright header. If you make significant&lt;br /&gt;
changes to the code, you may (but are not required to) add your name to the&lt;br /&gt;
list of copyright holders. If you choose to add yourself, use your real name,&lt;br /&gt;
not a nickname. Legally recognized pseudonyms are accepted, as are names of&lt;br /&gt;
legal entities. If you don&#039;t want to add yourself, you may add the catch-all&lt;br /&gt;
copyright attribution phrase, if it does not already exist.&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * OpenClonk, http://www.openclonk.org&lt;br /&gt;
  *&lt;br /&gt;
  * Copyright (c) 2000-2009  John Doe&lt;br /&gt;
  * Copyright (c) 2005  Jane Q. Public&lt;br /&gt;
  *&lt;br /&gt;
  * Portions might be copyrighted by other authors who have contributed&lt;br /&gt;
  * to OpenClonk.&lt;br /&gt;
  *&lt;br /&gt;
  * Other legalese goes here, but has been omitted for brevity. See an&lt;br /&gt;
  * existing file for a template.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
The copyright header is followed by an empty line. Put a comment explaining&lt;br /&gt;
the purpose of the file next, and leave another blank line after this.&lt;br /&gt;
&lt;br /&gt;
If you are writing a header file, use #include guards. If your file is called&lt;br /&gt;
&#039;&#039;C4Foo.h&#039;&#039;, your guard should be &amp;lt;tt&amp;gt;INC_&#039;&#039;C4Foo&#039;&#039;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 #ifndef INC_C4Foo&lt;br /&gt;
 #define INC_C4Foo&lt;br /&gt;
 class C4Foo;&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO: Precompiled headers.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Include system headers first. Put the filename in angle brackets, and use&lt;br /&gt;
forward slashes as directory separators.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave a blank line before local headers. Use double quotes to include these,&lt;br /&gt;
and sort them alphabetically.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;Standard.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;StdBuf.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; values in headers. Use &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; instead, or&lt;br /&gt;
&amp;lt;tt&amp;gt;enum&amp;lt;/tt&amp;gt; if you are declaring an enumeration.&lt;br /&gt;
&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; inline functions either, use &amp;lt;tt&amp;gt;inline&amp;lt;/tt&amp;gt;. If your&lt;br /&gt;
functions need to work on multiple data types, overload the function or write&lt;br /&gt;
a &amp;lt;tt&amp;gt;template&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If, despite of the above, still need to write a macro, use an all-uppercase&lt;br /&gt;
name. If your macro contains a compound statement, enclose it in a &amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;&lt;br /&gt;
loop to allow its use in &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements. A terminating semicolon&lt;br /&gt;
should be provided at the place of invocation. This makes parsing the source&lt;br /&gt;
easier for pretty-printers and editors. If your macro spans multiple lines,&lt;br /&gt;
align the backslashes.&lt;br /&gt;
&lt;br /&gt;
 #define FOO(a, b) do { \&lt;br /&gt;
   bar += (a);          \&lt;br /&gt;
   bar /= (b);          \&lt;br /&gt;
 } while(0)&lt;br /&gt;
&lt;br /&gt;
Do not use the Win32 style integer declarations &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; and&lt;br /&gt;
&amp;lt;tt&amp;gt;BOOL&amp;lt;/tt&amp;gt;. If you need a guarantee about the size of your variables, use&lt;br /&gt;
the C99 types &amp;lt;tt&amp;gt;int&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;uint&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt;. If you don&#039;t&lt;br /&gt;
need that guarantee, use &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. If you need a variable that is large&lt;br /&gt;
enough to store a pointer on your current platform, use &amp;lt;tt&amp;gt;intptr_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you come across code that still uses Win32 types, consider changing it if&lt;br /&gt;
you are working on code in the vicinity. Don&#039;t commit changes that only&lt;br /&gt;
consist of replacing &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;uint32_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When declaring a pointer, put a space in front of the asterisk, and none&lt;br /&gt;
after. This saves some confusion when declaring multiple variables at once.&lt;br /&gt;
The same goes for references.&lt;br /&gt;
&lt;br /&gt;
 int *foo, *bar;&lt;br /&gt;
 char *Qux(const char *quux);&lt;br /&gt;
&lt;br /&gt;
Functions that are not used outside of the containing file are placed inside&lt;br /&gt;
of an anonymous namespace.&lt;br /&gt;
&lt;br /&gt;
 namespace {&lt;br /&gt;
 	int Frobnicate(const char *foo);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Functions that are used across multiple files are prototyped inside a common&lt;br /&gt;
header. The prototypes should be grouped where appropriate, and ordered&lt;br /&gt;
logically or, failing that, alphabetically.&lt;br /&gt;
&lt;br /&gt;
Function and class names begin with a capital letter, and use camel casing. If&lt;br /&gt;
you need to embed acronyms inside the name, pretend the acronym was all lower&lt;br /&gt;
case. Member variables use the same convention, but begin with a lower case&lt;br /&gt;
letter. Do not use hungarian prefixes.&lt;br /&gt;
&lt;br /&gt;
 XmlDocument *ParseXmlFile(const char *file);&lt;br /&gt;
&lt;br /&gt;
No class member variable should be declared &amp;lt;tt&amp;gt;public&amp;lt;/tt&amp;gt;. Use&lt;br /&gt;
&amp;lt;tt&amp;gt;GetFoo&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SetFoo&amp;lt;/tt&amp;gt; accessors. If you want to declare a&lt;br /&gt;
compound data type that allows direct access to its members, use&lt;br /&gt;
&amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;. Do not add more functions than constructors, destructors, and&lt;br /&gt;
assignment operators to &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
When passing arguments that may be changed by the called function, pass them&lt;br /&gt;
as pointers. This makes it obvious that they may be changed. Use constant&lt;br /&gt;
references for all other parameters, unless they are a primitive type.&lt;br /&gt;
&lt;br /&gt;
Mark all class members that do not change the visible state of the object&lt;br /&gt;
&amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt;. If you need to modify internal state that is not visible from&lt;br /&gt;
outside of the class, mark the state variable &amp;lt;tt&amp;gt;mutable&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Do not use C-style casts. Use a template cast instead.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s&amp;gt;All classes and functions should have a comment explaining their purpose. This&lt;br /&gt;
comment is prepended to the prototype or class definition. If the function is&lt;br /&gt;
a local function without a prototype, it goes directly in front of the&lt;br /&gt;
definition. The comment uses [http://www.doxygen.org/ Doxygen] formatting.&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * Make light.&lt;br /&gt;
  * \param book Object to enlighten.&lt;br /&gt;
  */&lt;br /&gt;
 void Frotz(Spellbook *book);&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Elements in a &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; statement are ordered alphabetically unless&lt;br /&gt;
parts of the &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; cascade. Cascades are marked by a FALLTHROUGH&lt;br /&gt;
comment. Code that cannot be reached has an assertion. &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt; elements&lt;br /&gt;
are not indented.&lt;br /&gt;
&lt;br /&gt;
 switch (foo)&lt;br /&gt;
 {&lt;br /&gt;
 case FOO_HEX:&lt;br /&gt;
 	accept_hex = true;&lt;br /&gt;
 	// FALLTHROUGH&lt;br /&gt;
 case FOO_DEC:&lt;br /&gt;
 	accept_num = true;&lt;br /&gt;
 	break;&lt;br /&gt;
 default:&lt;br /&gt;
 	assert(!&amp;quot;Invalid foo value&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Keywords (&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; etc.) are followed by a space. Control&lt;br /&gt;
structures with a single statements are written without braces. If the&lt;br /&gt;
statement spans multiple lines, you may add braces for readability. Structures&lt;br /&gt;
without a statement contain a comment denoting this.&lt;br /&gt;
&lt;br /&gt;
 while (*dest++ = *src++)&lt;br /&gt;
 	/* empty */;&lt;br /&gt;
&lt;br /&gt;
Indent your code with tabs (ASCII 9). Use space (ASCII 32) for all other&lt;br /&gt;
formatting.&lt;br /&gt;
&lt;br /&gt;
Braces are on their own line, on the same level of indentation as the&lt;br /&gt;
structure they belong to. Braces around &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; may stand on the same&lt;br /&gt;
line as the &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt;. You may add braces around single statements in&lt;br /&gt;
&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements if the first block or an &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; block has them.&lt;br /&gt;
&lt;br /&gt;
 if (count &amp;lt; 10)&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;Too few thingies!&amp;quot;);&lt;br /&gt;
 	AddMore();&lt;br /&gt;
 } else {&lt;br /&gt;
 	printf(&amp;quot;We have enough&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Function names are not followed by space. Commas are. No space follows opening&lt;br /&gt;
brackets (&amp;quot;[&amp;quot;) or parentheses (&amp;quot;(&amp;quot;). Also no space preceeds closing brackets&lt;br /&gt;
(&amp;quot;]&amp;quot;) or parentheses (&amp;quot;)&amp;quot;). Unary operators do not require spaces. Binary&lt;br /&gt;
operators do.&lt;br /&gt;
&lt;br /&gt;
Do not use parentheses unless they are required for precedence or the code&lt;br /&gt;
gets confusing without them. Remember other people may have confusion&lt;br /&gt;
thresholds different from you.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Talk:Style_Guidelines&amp;diff=170</id>
		<title>Talk:Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Talk:Style_Guidelines&amp;diff=170"/>
		<updated>2009-08-04T17:35:42Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: Intended for new code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responses so far:&lt;br /&gt;
[[User:Günther|Günther]]:&lt;br /&gt;
* local headers before system headers&lt;br /&gt;
* don&#039;t forbid public data members&lt;br /&gt;
* &amp;lt;!Guenther&amp;gt; Demanding Doygen comments is also a very radical change&lt;br /&gt;
: &amp;lt;!Guenther&amp;gt; Doxygen is only really usefull if you are generating API docs that are intended to be read without looking at the source code&lt;br /&gt;
: &amp;lt;!Guenther&amp;gt; That&#039;s not a use case for us: our API is C4Script, not some C++ API&lt;br /&gt;
&lt;br /&gt;
PeterW:&lt;br /&gt;
* order switch members by numeric value&lt;br /&gt;
&lt;br /&gt;
Afterthoughts [[User:Isilkor|Isilkor]]:&lt;br /&gt;
* Use forward declarations instead of including the header inside other headers, if possible.&lt;br /&gt;
&lt;br /&gt;
Opinions:&lt;br /&gt;
* Use anonymous namespaces instead of static: &#039;&#039;&#039;In favor:&#039;&#039;&#039; ck?, Isilkor; &#039;&#039;&#039;Against:&#039;&#039;&#039; Günther, PeterW&lt;br /&gt;
* Doxygen comments: &#039;&#039;&#039;In favor:&#039;&#039;&#039;; &#039;&#039;&#039;Against:&#039;&#039;&#039; Günther, PeterW&lt;br /&gt;
&lt;br /&gt;
The document should describe reality, not wishful thinking. Where reality is inconsistent, the document can describe which of several options is preferred, but it shouldn&#039;t contain anything that&#039;s not already in somewhat widespread use. That would mean changing the coding style, and that&#039;s not the job of a coding style document. --[[User:Günther|Günther]] 16:41, 4 August 2009 (UTC)&lt;br /&gt;
: The document is intended to describe guidelines for new code, and not the legacy code that&#039;s all over the place anyway. While it&#039;s probably preferable to change old code if you do work in the vicinity, I certainly don&#039;t expect the code to be changed/reformatted on its own. --[[User:Isilkor|Isilkor]] 17:35, 4 August 2009 (UTC)&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Talk:Style_Guidelines&amp;diff=164</id>
		<title>Talk:Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Talk:Style_Guidelines&amp;diff=164"/>
		<updated>2009-08-04T15:34:01Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responses so far:&lt;br /&gt;
[[User:Günther|Günther]]:&lt;br /&gt;
* local headers before system headers&lt;br /&gt;
* don&#039;t forbid public data members&lt;br /&gt;
* &amp;lt;!Guenther&amp;gt; Demanding Doygen comments is also a very radical change&lt;br /&gt;
: &amp;lt;!Guenther&amp;gt; Doxygen is only really usefull if you are generating API docs that are intended to be read without looking at the source code&lt;br /&gt;
: &amp;lt;!Guenther&amp;gt; That&#039;s not a use case for us: our API is C4Script, not some C++ API&lt;br /&gt;
&lt;br /&gt;
PeterW:&lt;br /&gt;
* order switch members by numeric value&lt;br /&gt;
&lt;br /&gt;
Afterthoughts [[User:Isilkor|Isilkor]]:&lt;br /&gt;
* Use forward declarations instead of including the header inside other headers, if possible.&lt;br /&gt;
&lt;br /&gt;
Opinions:&lt;br /&gt;
* Use anonymous namespaces instead of static: &#039;&#039;&#039;In favor:&#039;&#039;&#039; ck?, Isilkor; &#039;&#039;&#039;Against:&#039;&#039;&#039; Günther, PeterW&lt;br /&gt;
* Doxygen comments: &#039;&#039;&#039;In favor:&#039;&#039;&#039;; &#039;&#039;&#039;Against:&#039;&#039;&#039; Günther, PeterW&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Talk:Style_Guidelines&amp;diff=163</id>
		<title>Talk:Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Talk:Style_Guidelines&amp;diff=163"/>
		<updated>2009-08-04T15:00:53Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: fwd decls&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responses so far:&lt;br /&gt;
[[User:Günther|Günther]]:&lt;br /&gt;
* local headers before system headers&lt;br /&gt;
* use static instead of anonymous namespaces&lt;br /&gt;
* don&#039;t forbid public data members&lt;br /&gt;
* &amp;lt;!Guenther&amp;gt; Demanding Doygen comments is also a very radical change&lt;br /&gt;
: &amp;lt;!Guenther&amp;gt; Doxygen is only really usefull if you are generating API docs that are intended to be read without looking at the source code&lt;br /&gt;
: &amp;lt;!Guenther&amp;gt; That&#039;s not a use case for us: our API is C4Script, not some C++ API&lt;br /&gt;
Afterthoughts [[User:Isilkor|Isilkor]]:&lt;br /&gt;
* Use forward declarations instead of including the header inside other headers, if possible.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Talk:Style_Guidelines&amp;diff=162</id>
		<title>Talk:Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Talk:Style_Guidelines&amp;diff=162"/>
		<updated>2009-08-04T00:17:28Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: Responses: Günther&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responses so far:&lt;br /&gt;
[[User:Günther|Günther]]:&lt;br /&gt;
* local headers before system headers&lt;br /&gt;
* use static instead of anonymous namespaces&lt;br /&gt;
* don&#039;t forbid public data members&lt;br /&gt;
* &amp;lt;!Guenther&amp;gt; Demanding Doygen comments is also a very radical change&lt;br /&gt;
: &amp;lt;!Guenther&amp;gt; Doxygen is only really usefull if you are generating API docs that are intended to be read without looking at the source code&lt;br /&gt;
: &amp;lt;!Guenther&amp;gt; That&#039;s not a use case for us: our API is C4Script, not some C++ API&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
	<entry>
		<id>https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=161</id>
		<title>Style Guidelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.openclonk.org/index.php?title=Style_Guidelines&amp;diff=161"/>
		<updated>2009-08-03T23:24:59Z</updated>

		<summary type="html">&lt;p&gt;Isilkor: Draft of style guidelines&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document specifies the preferred source code style of files inside the&lt;br /&gt;
OpenClonk source tree. Some of the style rules are also stated implicitly&lt;br /&gt;
inside the examples.&lt;br /&gt;
&lt;br /&gt;
 // Single-line comments look like this&lt;br /&gt;
&lt;br /&gt;
 //&lt;br /&gt;
 // Very important single-line comments look like this&lt;br /&gt;
 //&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * Multi-line comments look like this. Make sure you write enough text to&lt;br /&gt;
  * warrant a multi-line comment. Also be sure to write in full sentences.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
Every source file begins with a copyright header. If you make significant&lt;br /&gt;
changes to the code, you may (but are not required to) add your name to the&lt;br /&gt;
list of copyright holders. If you choose to add yourself, use your real name,&lt;br /&gt;
not a nickname. Legally recognized pseudonyms are accepted, as are names of&lt;br /&gt;
legal entities. If you don&#039;t want to add yourself, you may add the catch-all&lt;br /&gt;
copyright attribution phrase, if it does not already exist.&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * OpenClonk, http://www.openclonk.org&lt;br /&gt;
  *&lt;br /&gt;
  * Copyright (c) 2000-2009  John Doe&lt;br /&gt;
  * Copyright (c) 2005  Jane Q. Public&lt;br /&gt;
  *&lt;br /&gt;
  * Portions might be copyrighted by other authors who have contributed&lt;br /&gt;
  * to OpenClonk.&lt;br /&gt;
  *&lt;br /&gt;
  * Other legalese goes here, but has been omitted for brevity. See an&lt;br /&gt;
  * existing file for a template.&lt;br /&gt;
  */&lt;br /&gt;
&lt;br /&gt;
The copyright header is followed by an empty line. Put a comment explaining&lt;br /&gt;
the purpose of the file next, and leave another blank line after this.&lt;br /&gt;
&lt;br /&gt;
If you are writing a header file, use #include guards. If your file is called&lt;br /&gt;
&#039;&#039;C4Foo.h&#039;&#039;, your guard should be &amp;lt;tt&amp;gt;INC_&#039;&#039;C4Foo&#039;&#039;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 #ifndef INC_C4Foo&lt;br /&gt;
 #define INC_C4Foo&lt;br /&gt;
 class C4Foo;&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO: Precompiled headers.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Include system headers first. Put the filename in angle brackets, and use&lt;br /&gt;
forward slashes as directory separators.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave a blank line before local headers. Use double quotes to include these,&lt;br /&gt;
and sort them alphabetically.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;Standard.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;StdBuf.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; values in headers. Use &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; instead, or&lt;br /&gt;
&amp;lt;tt&amp;gt;enum&amp;lt;/tt&amp;gt; if you are declaring an enumeration.&lt;br /&gt;
&lt;br /&gt;
Do not &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; inline functions either, use &amp;lt;tt&amp;gt;inline&amp;lt;/tt&amp;gt;. If your&lt;br /&gt;
functions need to work on multiple data types, overload the function or write&lt;br /&gt;
a &amp;lt;tt&amp;gt;template&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If, despite of the above, still need to write a macro, use an all-uppercase&lt;br /&gt;
name. If your macro contains a compound statement, enclose it in a &amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;&lt;br /&gt;
loop to allow its use in &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements. A terminating semicolon&lt;br /&gt;
should be provided at the place of invocation. This makes parsing the source&lt;br /&gt;
easier for pretty-printers and editors. If your macro spans multiple lines,&lt;br /&gt;
align the backslashes.&lt;br /&gt;
&lt;br /&gt;
 #define FOO(a, b) do { \&lt;br /&gt;
   bar += (a);          \&lt;br /&gt;
   bar /= (b);          \&lt;br /&gt;
 } while(0)&lt;br /&gt;
&lt;br /&gt;
Do not use the Win32 style integer declarations &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; and&lt;br /&gt;
&amp;lt;tt&amp;gt;BOOL&amp;lt;/tt&amp;gt;. If you need a guarantee about the size of your variables, use&lt;br /&gt;
the C99 types &amp;lt;tt&amp;gt;int&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;uint&#039;&#039;XX&#039;&#039;_t&amp;lt;/tt&amp;gt;. If you don&#039;t&lt;br /&gt;
need that guarantee, use &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. If you need a variable that is large&lt;br /&gt;
enough to store a pointer on your current platform, use &amp;lt;tt&amp;gt;intptr_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you come across code that still uses Win32 types, consider changing it if&lt;br /&gt;
you are working on code in the vicinity. Don&#039;t commit changes that only&lt;br /&gt;
consist of replacing &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;uint32_t&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When declaring a pointer, put a space in front of the asterisk, and none&lt;br /&gt;
after. This saves some confusion when declaring multiple variables at once.&lt;br /&gt;
The same goes for references.&lt;br /&gt;
&lt;br /&gt;
 int *foo, *bar;&lt;br /&gt;
 char *Qux(const char *quux);&lt;br /&gt;
&lt;br /&gt;
Functions that are not used outside of the containing file are placed inside&lt;br /&gt;
of an anonymous namespace.&lt;br /&gt;
&lt;br /&gt;
 namespace {&lt;br /&gt;
 	int Frobnicate(const char *foo);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Functions that are used across multiple files are prototyped inside a common&lt;br /&gt;
header. The prototypes should be grouped where appropriate, and ordered&lt;br /&gt;
logically or, failing that, alphabetically.&lt;br /&gt;
&lt;br /&gt;
Function and class names begin with a capital letter, and use camel casing. If&lt;br /&gt;
you need to embed acronyms inside the name, pretend the acronym was all lower&lt;br /&gt;
case. Member variables use the same convention, but begin with a lower case&lt;br /&gt;
letter. Do not use hungarian prefixes.&lt;br /&gt;
&lt;br /&gt;
 XmlDocument *ParseXmlFile(const char *file);&lt;br /&gt;
&lt;br /&gt;
No class member variable should be declared &amp;lt;tt&amp;gt;public&amp;lt;/tt&amp;gt;. Use&lt;br /&gt;
&amp;lt;tt&amp;gt;GetFoo&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SetFoo&amp;lt;/tt&amp;gt; accessors. If you want to declare a&lt;br /&gt;
compound data type that allows direct access to its members, use&lt;br /&gt;
&amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;. Do not add more functions than constructors, destructors, and&lt;br /&gt;
assignment operators to &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;s.&lt;br /&gt;
&lt;br /&gt;
When passing arguments that may be changed by the called function, pass them&lt;br /&gt;
as pointers. This makes it obvious that they may be changed. Use constant&lt;br /&gt;
references for all other parameters, unless they are a primitive type.&lt;br /&gt;
&lt;br /&gt;
Mark all class members that do not change the visible state of the object&lt;br /&gt;
&amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt;. If you need to modify internal state that is not visible from&lt;br /&gt;
outside of the class, mark the state variable &amp;lt;tt&amp;gt;mutable&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Do not use C-style casts. Use a template cast instead.&lt;br /&gt;
&lt;br /&gt;
All classes and functions should have a comment explaining their purpose. This&lt;br /&gt;
comment is prepended to the prototype or class definition. If the function is&lt;br /&gt;
a local function without a prototype, it goes directly in front of the&lt;br /&gt;
definition. The comment uses [http://www.doxygen.org/ Doxygen] formatting.&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * Make light.&lt;br /&gt;
  * \param book Object to enlighten.&lt;br /&gt;
  */&lt;br /&gt;
 void Frotz(Spellbook *book);&lt;br /&gt;
&lt;br /&gt;
Elements in a &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; statement are ordered alphabetically unless&lt;br /&gt;
parts of the &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; cascade. Cascades are marked by a FALLTHROUGH&lt;br /&gt;
comment. Code that cannot be reached has an assertion. &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt; elements&lt;br /&gt;
are not indented.&lt;br /&gt;
&lt;br /&gt;
 switch (foo)&lt;br /&gt;
 {&lt;br /&gt;
 case FOO_HEX:&lt;br /&gt;
 	accept_hex = true;&lt;br /&gt;
 	// FALLTHROUGH&lt;br /&gt;
 case FOO_DEC:&lt;br /&gt;
 	accept_num = true;&lt;br /&gt;
 	break;&lt;br /&gt;
 default:&lt;br /&gt;
 	assert(!&amp;quot;Invalid foo value&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Keywords (&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; etc.) are followed by a space. Control&lt;br /&gt;
structures with a single statements are written without braces. If the&lt;br /&gt;
statement spans multiple lines, you may add braces for readability. Structures&lt;br /&gt;
without a statement contain a comment denoting this.&lt;br /&gt;
&lt;br /&gt;
 while (*dest++ = *src++)&lt;br /&gt;
 	/* empty */;&lt;br /&gt;
&lt;br /&gt;
Indent your code with tabs (ASCII 9). Use space (ASCII 32) for all other&lt;br /&gt;
formatting.&lt;br /&gt;
&lt;br /&gt;
Braces are on their own line, on the same level of indentation as the&lt;br /&gt;
structure they belong to. Braces around &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; may stand on the same&lt;br /&gt;
line as the &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt;. You may add braces around single statements in&lt;br /&gt;
&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; statements if the first block or an &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; block has them.&lt;br /&gt;
&lt;br /&gt;
 if (count &amp;lt; 10)&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;Too few thingies!&amp;quot;);&lt;br /&gt;
 	AddMore();&lt;br /&gt;
 } else {&lt;br /&gt;
 	printf(&amp;quot;We have enough&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Function names are not followed by space. Commas are. No space follows opening&lt;br /&gt;
brackets (&amp;quot;[&amp;quot;) or parentheses (&amp;quot;(&amp;quot;). Also no space preceeds closing brackets&lt;br /&gt;
(&amp;quot;]&amp;quot;) or parentheses (&amp;quot;)&amp;quot;). Unary operators do not require spaces. Binary&lt;br /&gt;
operators do.&lt;br /&gt;
&lt;br /&gt;
Do not use parentheses unless they are required for precedence or the code&lt;br /&gt;
gets confusing without them. Remember other people may have confusion&lt;br /&gt;
thresholds different from you.&lt;/div&gt;</summary>
		<author><name>Isilkor</name></author>
	</entry>
</feed>