<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-gb">
		<id>https://wiki.unvanquished.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Killing+time</id>
		<title>Unvanquished - User contributions [en-gb]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.unvanquished.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Killing+time"/>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/wiki/Special:Contributions/Killing_time"/>
		<updated>2026-04-26T00:42:20Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.25.3</generator>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=MacOS_Launch_Services_security_restrictions&amp;diff=9025</id>
		<title>MacOS Launch Services security restrictions</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=MacOS_Launch_Services_security_restrictions&amp;diff=9025"/>
				<updated>2026-03-07T07:25:17Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: menu option to bypass quarantine removed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quarantine restrictions ==&lt;br /&gt;
Applications downloaded with a browser may are subject to quarantine restrictions.&lt;br /&gt;
&lt;br /&gt;
=== Denying launch ===&lt;br /&gt;
If you double-click a quarantined app in Finder, it will refuse to run it. &amp;lt;s&amp;gt;This can be bypassed via Command+clicking on the application, selecting &amp;lt;b&amp;gt;Open&amp;lt;/b&amp;gt; in the context menu, and clicking through a warning dialog.&amp;lt;/s&amp;gt; In recent OS versions, there is no user-friendly way to bypass quarantine.&amp;lt;ref&amp;gt;https://developer.apple.com/news/?id=saqachfa&amp;lt;/ref&amp;gt; Instead see the file attribute discussion below.&lt;br /&gt;
&lt;br /&gt;
Not only applications, but also libraries can be denied launch. Sample text of an error popup:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
“SDL2.framework” cannot be opened because the developer cannot be verified.&lt;br /&gt;
&lt;br /&gt;
macOS cannot verify that this app is free from malware.&lt;br /&gt;
&lt;br /&gt;
Safari downloaded this file today at 06:18.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the terminal, the error looks as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt;% ./daemon    &lt;br /&gt;
dyld[8822]: Library not loaded: @rpath/SDL2.framework/Versions/A/SDL2&lt;br /&gt;
  Referenced from: &amp;lt;71DD614C-D95F-37DD-A29E-765DA0AEEE48&amp;gt; /Users/slipher/Unvanquished/build-newsdl/daemon&lt;br /&gt;
  Reason: tried: '/Users/slipher/Unvanquished/build-newsdl/SDL2.framework/Versions/A/SDL2' (code signature in &amp;lt;3E6D5145-6DE8-3734-95A7-AE31ED09A1A9&amp;gt; '/Users/slipher/Unvanquished/build-newsdl/SDL2.framework/Versions/A/SDL2' not valid for use in process: library load disallowed by system policy), '/Users/slipher/Unvanquished/build-newsdl/SDL2.framework/Versions/A/SDL2' (code signature in &amp;lt;3E6D5145-6DE8-3734-95A7-AE31ED09A1A9&amp;gt; '/Users/slipher/Unvanquished/build-newsdl/SDL2.framework/Versions/A/SDL2' not valid for use in process: library load disallowed by system policy), '/Library/Frameworks/SDL2.framework/Versions/A/SDL2' (no such file), '/System/Library/Frameworks/SDL2.framework/Versions/A/SDL2' (no such file, not in dyld cache)&lt;br /&gt;
zsh: abort      ./daemon&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== App Translocation ===&lt;br /&gt;
&lt;br /&gt;
For quarantined apps that are permitted to launch, there is another possible restriction called [https://lapcatsoftware.com/articles/app-translocation.html App Translocation].&lt;br /&gt;
If Unvanquished.app is started with app translocation, the beginning of the output looks as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt;cmdline: -pakpath /private/var/folders/37/cwhvzf2j3_ngll0kwst_3k540000gn/T/AppTranslocation/97281FCC-20CC-45CE-8386-D8DF691593C7/d/pkg&lt;br /&gt;
tty console mode disabled&lt;br /&gt;
^3Warn: [FS] Ignoring path /private/var/folders/37/cwhvzf2j3_ngll0kwst_3k540000gn/T/AppTranslocation/97281FCC-20CC-45CE-8386-D8DF691593C7/d/pkg: No such file or directory&lt;br /&gt;
[FS] Lib path: /private/var/folders/37/cwhvzf2j3_ngll0kwst_3k540000gn/T/AppTranslocation/97281FCC-20CC-45CE-8386-D8DF691593C7/d/Unvanquished.app/Contents/MacOS&lt;br /&gt;
[FS] Home path: /Users/slipher/Library/Application Support/Unvanquished&lt;br /&gt;
[FS] Pak search path: /Users/slipher/Library/Application Support/Unvanquished/pkg&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daemon is not capable of running under app translocation.&lt;br /&gt;
&lt;br /&gt;
=== The magic bits ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;com.apple.quarantine&amp;lt;/code&amp;gt; extended file attribute is the root cause of all quarantine restrictions. It is added by browsers to downloaded applications. When you download an auto-unzipped .app, it is recursively applied to all files and directories within. A file's extended attributes can be viewed with the command&amp;lt;code&amp;gt;xattr &amp;lt;path&amp;gt;&amp;lt;/code&amp;gt;. The quarantine attribute can be (recursively) removed using &amp;lt;code&amp;gt;xattr -d -r &amp;lt;path&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
There is a launch services database flag that prevents denying launch even in the presence of the quarantine attribute. &amp;lt;s&amp;gt;It can be set by clicking through the dialog to launch despite the danger, or by moving the application in Finder.&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is a launch services database flag that disables app translocation for a quarantined file that is allowed to launch. &amp;lt;s&amp;gt;It can be set by moving the application in the Finder.&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Launch services database info follows files across moves (whether by Finder or &amp;lt;code&amp;gt;mv&amp;lt;/code&amp;gt;). It might be possible to see these launch services database flags somewhere in the output of &amp;lt;code&amp;gt;/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -dump&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Directory permissions ==&lt;br /&gt;
&lt;br /&gt;
Sometimes you get a popup asking whether you want to allow the app to access, for example, Downloads or Documents. Example message: &amp;lt;b&amp;gt;&amp;quot;Unvanquished&amp;quot; would like to access files in your Downloads folder.&amp;lt;/b&amp;gt; The application's file operation blocks while waiting for the user to respond to the dialog. Not sure what relation this has to quarantine restrictions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Bug_reporting&amp;diff=9007</id>
		<title>Bug reporting</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Bug_reporting&amp;diff=9007"/>
				<updated>2026-01-26T17:10:33Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: Actually remove UnvanquishedAssets&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please file any bugs you find on GitHub issue tracker.&lt;br /&gt;
&lt;br /&gt;
{{note|content=&amp;lt;p&amp;gt;We have multiple issue trackers but don't worry if you don't know which one is the best for your specific need.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;In doubt, report the bug on [https://github.com/Unvanquished/Unvanquished/issues github.com/Unvanquished/Unvanquished/issues].&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&lt;br /&gt;
We can recreate more specific tickets in specific issue trackers and reword them once we know more about your problem.&amp;lt;/p&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
Before filing a bug report, please check the [[Troubleshooting]] page, browse the [https://forums.unvanquished.net/viewforum.php?f=6 support forums], and search the [https://github.com/Unvanquished/Unvanquished/issues default issue tracker] to see if your issue has been noticed or reported before.&lt;br /&gt;
&lt;br /&gt;
Some of the tips on the [[Testing]] page may be useful to produce good reports.&lt;br /&gt;
&lt;br /&gt;
==Issue trackers==&lt;br /&gt;
&lt;br /&gt;
There are separate issue trackers for separate parts of the game and the project:&lt;br /&gt;
&lt;br /&gt;
* '''Game''' (ℹ️ If in doubt, use this one):&amp;lt;br/&amp;gt;[https://github.com/Unvanquished/Unvanquished/issues github.com/Unvanquished/Unvanquished/issues]&amp;lt;br/&amp;gt;&lt;br /&gt;
* '''Official maps''':&amp;lt;br/&amp;gt;[https://github.com/UnvanquishedAssets/map-antares_src.dpkdir/issues Antares] [https://github.com/UnvanquishedAssets/map-chasm_src.dpkdir/issues Chasm] [https://github.com/UnvanquishedAssets/map-forlorn_src.dpkdir/issues Forlorn] [https://github.com/UnvanquishedAssets/map-parpax_src.dpkdir/issues Parpax] [https://github.com/UnvanquishedAssets/map-perseus_src.dpkdir/issues Perseus] [https://github.com/UnvanquishedAssets/map-plat23_src.dpkdir/issues Platform 23] [https://github.com/UnvanquishedAssets/map-spacetracks_src.dpkdir/issues Spacetracks] [https://github.com/UnvanquishedAssets/map-station15_src.dpkdir/issues Station 15] [https://github.com/UnvanquishedAssets/map-thunder_src.dpkdir/issues Thunder] [https://github.com/UnvanquishedAssets/map-vega_src.dpkdir/issues Vega] [https://github.com/UnvanquishedAssets/map-yocto_src.dpkdir/issues Yocto]&lt;br /&gt;
* '''Engine''' (rendering bugs…):&amp;lt;br/&amp;gt;[https://github.com/DaemonEngine/Daemon/issues github.com/DaemonEngine/Daemon/issues]&lt;br /&gt;
* '''Updater/launcher''':&amp;lt;br/&amp;gt;[https://github.com/Unvanquished/updater/issues github.com/Unvanquished/updater/issues]&lt;br /&gt;
* '''Master server''':&amp;lt;br/&amp;gt;[https://github.com/Unvanquished/unvanquished-master/issues github.com/Unvanquished/unvanquished-master/issues]&lt;br /&gt;
* '''Website''':&amp;lt;br/&amp;gt;[https://github.com/Unvanquished/unvanquished-infrastructure/issues github.com/Unvanquished/unvanquished-infrastructure/issues]&lt;br /&gt;
&lt;br /&gt;
==Reporting issues==&lt;br /&gt;
&lt;br /&gt;
Please try to do the following when writing a bug report:&lt;br /&gt;
&lt;br /&gt;
* Describe the problem in detail. Carefully note what actually happens and what you expected to happen.&lt;br /&gt;
* Describe how to reproduce the problem: i.e., steps that the developers can follow to cause it to happen.&lt;br /&gt;
* Do not post console logs or error messages without any other accompanying explanation with the expectation that the developers will solve your problem for you; you must provide details!&lt;br /&gt;
* If the problem is best explained with a picture or video, please, take a [[Taking_screenshots|screenshot]] and/or [[Recording_demos|record a demo]]!&lt;br /&gt;
&lt;br /&gt;
Please include hardware / software specs when you report your bug. Use the following template:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### Hardware / Software&lt;br /&gt;
&lt;br /&gt;
| Release | &lt;br /&gt;
|:--|:--&lt;br /&gt;
| Operating System | &lt;br /&gt;
| Video Card | &lt;br /&gt;
| Driver Type | &lt;br /&gt;
| Driver Version | &lt;br /&gt;
| OpenGL Version | &lt;br /&gt;
| Map tested | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are on Linux, please also include fields for your kernel version (which you can obtain from &amp;lt;code&amp;gt;uname&amp;lt;/code&amp;gt;) and driver type (i.e., proprietary or open source).&lt;br /&gt;
&lt;br /&gt;
For example, your information might look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### Hardware / Software&lt;br /&gt;
&lt;br /&gt;
| Release | v0.13.0&lt;br /&gt;
|:--|:--&lt;br /&gt;
| Operating System | Ubuntu 12.04 LTS&lt;br /&gt;
| Kernel Version | 3.2.0-38-generic&lt;br /&gt;
| Video Card | ATI Radeon HD 5670&lt;br /&gt;
| Driver Type | Proprietary (fglrx)&lt;br /&gt;
| Driver Version | 8.85-110419a118915C-ATI (Catalyst 11.5)&lt;br /&gt;
| OpenGL Version | 4.2.11903 Compatibility Profile&lt;br /&gt;
| Map tested | Star A.T.C.S.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which will produce a table like so:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Release !! style=&amp;quot;text-align:left;&amp;quot; | v0.13.0&lt;br /&gt;
|-&lt;br /&gt;
| Operating System || Ubuntu 12.04 LTS&lt;br /&gt;
|-&lt;br /&gt;
| Kernel Version || 3.2.0-38-generic&lt;br /&gt;
|-&lt;br /&gt;
| Video Card || ATI Radeon HD 5670&lt;br /&gt;
|-&lt;br /&gt;
| Driver Type || Proprietary (fglrx)&lt;br /&gt;
|-&lt;br /&gt;
| Driver Version || 8.85-110419a118915C-ATI (Catalyst 11.5)&lt;br /&gt;
|-&lt;br /&gt;
| OpenGL Version || 4.2.11903 Compatibility Profile&lt;br /&gt;
|-&lt;br /&gt;
| Map tested || Star A.T.C.S.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Do's and Don'ts==&lt;br /&gt;
&lt;br /&gt;
{{Note|content=Above all, try to make your report as concise as possible while still including all the necessary information!}}&lt;br /&gt;
&lt;br /&gt;
* '''Do''' include the requested information listed above.&lt;br /&gt;
* '''Do''' describe the issue with the bug title. A title of just &amp;quot;Console&amp;quot;, for example, does nothing to describe the issue at hand and, as such, makes the issue more difficult to return to for developers, as well as for developers to gauge the impact of the issue. Issues with titles such as &amp;quot;Opening the menu '''causes the game to crash'''&amp;quot; will be more likely to be read by a developer than the same issue titled &amp;quot;Menu bug&amp;quot;, for example.&lt;br /&gt;
* '''Do not''' refer to forum posts or similar anecdotally without providing a link.&lt;br /&gt;
* '''Do not''' include extraneous information.&lt;br /&gt;
* '''Do''' check to ensure that your grammar and spelling is correct.&lt;br /&gt;
* '''Do''' use Markdown headers (begin a line with some number of pound signs, e.g., &amp;lt;code&amp;gt;###&amp;lt;/code&amp;gt;) to delineate sections of your report.&lt;br /&gt;
&lt;br /&gt;
==Formatting Tips &amp;amp; Tricks==&lt;br /&gt;
&lt;br /&gt;
===Code Blocks===&lt;br /&gt;
&lt;br /&gt;
To delineate a block of code (and enable special formatting such as syntax highlighting), begin and end the code block with three backticks (`):&lt;br /&gt;
&lt;br /&gt;
 ```&lt;br /&gt;
 /* code */&lt;br /&gt;
 ```&lt;br /&gt;
&lt;br /&gt;
This makes reports with console output much easier to read and makes it unnecessary to rely on outside paste services.&lt;br /&gt;
&lt;br /&gt;
To enable syntax highlighting, you must specify a language following the first set of backticks:&lt;br /&gt;
&lt;br /&gt;
 ```c++&lt;br /&gt;
 /* code */&lt;br /&gt;
 ```&lt;br /&gt;
&lt;br /&gt;
The following language keywords are known to work:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;diff&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;javascript&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;c++&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;python&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Bug_reporting&amp;diff=9006</id>
		<title>Bug reporting</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Bug_reporting&amp;diff=9006"/>
				<updated>2026-01-26T17:08:32Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* Issue trackers */ don't encourage UnvanquishedAssets/issues; add maps&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please file any bugs you find on GitHub issue tracker.&lt;br /&gt;
&lt;br /&gt;
{{note|content=&amp;lt;p&amp;gt;We have multiple issue trackers but don't worry if you don't know which one is the best for your specific need.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;In doubt, report the bug on [https://github.com/Unvanquished/Unvanquished/issues github.com/Unvanquished/Unvanquished/issues].&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&lt;br /&gt;
We can recreate more specific tickets in specific issue trackers and reword them once we know more about your problem.&amp;lt;/p&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
Before filing a bug report, please check the [[Troubleshooting]] page, browse the [https://forums.unvanquished.net/viewforum.php?f=6 support forums], and search the [https://github.com/Unvanquished/Unvanquished/issues default issue tracker] to see if your issue has been noticed or reported before.&lt;br /&gt;
&lt;br /&gt;
Some of the tips on the [[Testing]] page may be useful to produce good reports.&lt;br /&gt;
&lt;br /&gt;
==Issue trackers==&lt;br /&gt;
&lt;br /&gt;
There are separate issue trackers for separate parts of the game and the project:&lt;br /&gt;
&lt;br /&gt;
* '''Game''' (ℹ️ If in doubt, use this one):&amp;lt;br/&amp;gt;[https://github.com/Unvanquished/Unvanquished/issues github.com/Unvanquished/Unvanquished/issues]&amp;lt;br/&amp;gt;&lt;br /&gt;
* '''Game data''' (map, texture, models, sound file…):&amp;lt;br/&amp;gt;[https://github.com/UnvanquishedAssets/UnvanquishedAssets/issues github.com/UnvanquishedAssets/UnvanquishedAssets/issues]&lt;br /&gt;
* '''Official maps''':&amp;lt;br/&amp;gt;[https://github.com/UnvanquishedAssets/map-antares_src.dpkdir/issues Antares] [https://github.com/UnvanquishedAssets/map-chasm_src.dpkdir/issues Chasm] [https://github.com/UnvanquishedAssets/map-forlorn_src.dpkdir/issues Forlorn] [https://github.com/UnvanquishedAssets/map-parpax_src.dpkdir/issues Parpax] [https://github.com/UnvanquishedAssets/map-perseus_src.dpkdir/issues Perseus] [https://github.com/UnvanquishedAssets/map-plat23_src.dpkdir/issues Platform 23] [https://github.com/UnvanquishedAssets/map-spacetracks_src.dpkdir/issues Spacetracks] [https://github.com/UnvanquishedAssets/map-station15_src.dpkdir/issues Station 15] [https://github.com/UnvanquishedAssets/map-thunder_src.dpkdir/issues Thunder] [https://github.com/UnvanquishedAssets/map-vega_src.dpkdir/issues Vega] [https://github.com/UnvanquishedAssets/map-yocto_src.dpkdir/issues Yocto]&lt;br /&gt;
* '''Engine''' (rendering bugs…):&amp;lt;br/&amp;gt;[https://github.com/DaemonEngine/Daemon/issues github.com/DaemonEngine/Daemon/issues]&lt;br /&gt;
* '''Updater/launcher''':&amp;lt;br/&amp;gt;[https://github.com/Unvanquished/updater/issues github.com/Unvanquished/updater/issues]&lt;br /&gt;
* '''Master server''':&amp;lt;br/&amp;gt;[https://github.com/Unvanquished/unvanquished-master/issues github.com/Unvanquished/unvanquished-master/issues]&lt;br /&gt;
* '''Website''':&amp;lt;br/&amp;gt;[https://github.com/Unvanquished/unvanquished-infrastructure/issues github.com/Unvanquished/unvanquished-infrastructure/issues]&lt;br /&gt;
&lt;br /&gt;
==Reporting issues==&lt;br /&gt;
&lt;br /&gt;
Please try to do the following when writing a bug report:&lt;br /&gt;
&lt;br /&gt;
* Describe the problem in detail. Carefully note what actually happens and what you expected to happen.&lt;br /&gt;
* Describe how to reproduce the problem: i.e., steps that the developers can follow to cause it to happen.&lt;br /&gt;
* Do not post console logs or error messages without any other accompanying explanation with the expectation that the developers will solve your problem for you; you must provide details!&lt;br /&gt;
* If the problem is best explained with a picture or video, please, take a [[Taking_screenshots|screenshot]] and/or [[Recording_demos|record a demo]]!&lt;br /&gt;
&lt;br /&gt;
Please include hardware / software specs when you report your bug. Use the following template:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### Hardware / Software&lt;br /&gt;
&lt;br /&gt;
| Release | &lt;br /&gt;
|:--|:--&lt;br /&gt;
| Operating System | &lt;br /&gt;
| Video Card | &lt;br /&gt;
| Driver Type | &lt;br /&gt;
| Driver Version | &lt;br /&gt;
| OpenGL Version | &lt;br /&gt;
| Map tested | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are on Linux, please also include fields for your kernel version (which you can obtain from &amp;lt;code&amp;gt;uname&amp;lt;/code&amp;gt;) and driver type (i.e., proprietary or open source).&lt;br /&gt;
&lt;br /&gt;
For example, your information might look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### Hardware / Software&lt;br /&gt;
&lt;br /&gt;
| Release | v0.13.0&lt;br /&gt;
|:--|:--&lt;br /&gt;
| Operating System | Ubuntu 12.04 LTS&lt;br /&gt;
| Kernel Version | 3.2.0-38-generic&lt;br /&gt;
| Video Card | ATI Radeon HD 5670&lt;br /&gt;
| Driver Type | Proprietary (fglrx)&lt;br /&gt;
| Driver Version | 8.85-110419a118915C-ATI (Catalyst 11.5)&lt;br /&gt;
| OpenGL Version | 4.2.11903 Compatibility Profile&lt;br /&gt;
| Map tested | Star A.T.C.S.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which will produce a table like so:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Release !! style=&amp;quot;text-align:left;&amp;quot; | v0.13.0&lt;br /&gt;
|-&lt;br /&gt;
| Operating System || Ubuntu 12.04 LTS&lt;br /&gt;
|-&lt;br /&gt;
| Kernel Version || 3.2.0-38-generic&lt;br /&gt;
|-&lt;br /&gt;
| Video Card || ATI Radeon HD 5670&lt;br /&gt;
|-&lt;br /&gt;
| Driver Type || Proprietary (fglrx)&lt;br /&gt;
|-&lt;br /&gt;
| Driver Version || 8.85-110419a118915C-ATI (Catalyst 11.5)&lt;br /&gt;
|-&lt;br /&gt;
| OpenGL Version || 4.2.11903 Compatibility Profile&lt;br /&gt;
|-&lt;br /&gt;
| Map tested || Star A.T.C.S.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Do's and Don'ts==&lt;br /&gt;
&lt;br /&gt;
{{Note|content=Above all, try to make your report as concise as possible while still including all the necessary information!}}&lt;br /&gt;
&lt;br /&gt;
* '''Do''' include the requested information listed above.&lt;br /&gt;
* '''Do''' describe the issue with the bug title. A title of just &amp;quot;Console&amp;quot;, for example, does nothing to describe the issue at hand and, as such, makes the issue more difficult to return to for developers, as well as for developers to gauge the impact of the issue. Issues with titles such as &amp;quot;Opening the menu '''causes the game to crash'''&amp;quot; will be more likely to be read by a developer than the same issue titled &amp;quot;Menu bug&amp;quot;, for example.&lt;br /&gt;
* '''Do not''' refer to forum posts or similar anecdotally without providing a link.&lt;br /&gt;
* '''Do not''' include extraneous information.&lt;br /&gt;
* '''Do''' check to ensure that your grammar and spelling is correct.&lt;br /&gt;
* '''Do''' use Markdown headers (begin a line with some number of pound signs, e.g., &amp;lt;code&amp;gt;###&amp;lt;/code&amp;gt;) to delineate sections of your report.&lt;br /&gt;
&lt;br /&gt;
==Formatting Tips &amp;amp; Tricks==&lt;br /&gt;
&lt;br /&gt;
===Code Blocks===&lt;br /&gt;
&lt;br /&gt;
To delineate a block of code (and enable special formatting such as syntax highlighting), begin and end the code block with three backticks (`):&lt;br /&gt;
&lt;br /&gt;
 ```&lt;br /&gt;
 /* code */&lt;br /&gt;
 ```&lt;br /&gt;
&lt;br /&gt;
This makes reports with console output much easier to read and makes it unnecessary to rely on outside paste services.&lt;br /&gt;
&lt;br /&gt;
To enable syntax highlighting, you must specify a language following the first set of backticks:&lt;br /&gt;
&lt;br /&gt;
 ```c++&lt;br /&gt;
 /* code */&lt;br /&gt;
 ```&lt;br /&gt;
&lt;br /&gt;
The following language keywords are known to work:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;diff&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;javascript&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;c++&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;python&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Main_Page&amp;diff=9005</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Main_Page&amp;diff=9005"/>
				<updated>2026-01-26T16:52:03Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Unvanquished wiki}}&lt;br /&gt;
* If you need help about the game or the wiki, jump on [https://unvanquished.net/chat/ IRC or Matrix or Discord] (see [[Chat#Channel_rules|rules]]) or the {{forums}}.&lt;br /&gt;
* If you are facing a bug in the game, report it on [https://github.com/Unvanquished/Unvanquished/issues GitHub].&lt;br /&gt;
* Build the wiki! Contribute guides, information, corrections and improvements.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainPageNewBox&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt; [[Install and play]] &amp;lt;/h2&amp;gt; &lt;br /&gt;
* [[Install and play#Getting the game|Getting the game]]&lt;br /&gt;
* [[Install and play#Running and configuration|Configuration]]&lt;br /&gt;
* [[Bug reporting]]&lt;br /&gt;
* [[Install and play#Getting in contact|Getting in contact]]&lt;br /&gt;
* [[Linux packages|Alternative Linux packages]]&lt;br /&gt;
* [[Server/Running|Running a server]]&lt;br /&gt;
* [[GPU compatibility matrix]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainPageNewBox&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt; [[Lore]] &amp;lt;/h2&amp;gt;&lt;br /&gt;
* [[Humans]], [[Aliens]], [[:Category:Buildables|Buildables]], [[:Category:Weapons|Weapons]]…&lt;br /&gt;
* [[Gameplay|Gameplay guides]]&lt;br /&gt;
* [[Lore#Stories|Stories]]&lt;br /&gt;
* [[Maps]] and [[Mods]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainPageNewBox&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt; [[Coding]] &amp;lt;/h2&amp;gt;&lt;br /&gt;
* [[Getting the source]]&lt;br /&gt;
* [[Compiling the source]]&lt;br /&gt;
* [[Contributing|Contributing guide]]&lt;br /&gt;
* [[Coding convention]]&lt;br /&gt;
* [[Dealing with submodules]]&lt;br /&gt;
* [[Continuous integration]]&lt;br /&gt;
* Reference materials&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainPageNewBox&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt; [[Making and modding]] &amp;lt;/h2&amp;gt;&lt;br /&gt;
* [[Mapping]], [[Modeling]], [[Texturing]]…&lt;br /&gt;
* [[Music and sounds]]&lt;br /&gt;
* [[Tutorials]], [[Formats]]&lt;br /&gt;
* [[Translation]]&lt;br /&gt;
* Gameplay modification&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainPageNewBox&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt; [[Projects|Tools and projects]] &amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[Wiki project resources]]&lt;br /&gt;
* [[Infrastructure]]&lt;br /&gt;
* [[Tools]]&lt;br /&gt;
* [[Projects#Unvanquished on the web|Unvanquished on the web]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainPageNewBox&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt; [[Install and play#Getting in contact|Getting in contact]] &amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[Chat]]&lt;br /&gt;
* [//forums.unvanquished.net Forums]&lt;br /&gt;
* [[Projects#Unvanquished on the social hubs|Social hubs]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;{{NUMBEROFEDITS}} edits to {{NUMBEROFPAGES}} pages with {{NUMBEROFFILES}} uploaded files&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;height: 150px; width: 100%; overflow:hidden; align:centre;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Dir inpackage.png|x150px]][[File:Egg concept.png|x150px]] [[File:Om concept.png|x150px]] [[File:Librocket test custom menuscreen.png|x150px]] [[File:NetRadiant texture browser common.png|x150px]] [[File:Colourgrade_2.png|x150px]] [[File:Parpax upper.png|x150px]] [[File:Niveus brushesSelected.jpeg|x150px]] [[File:Mgturret render 300x240.png|x150px]] [[File:Barricade.png|x150px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__NOTOC__  &amp;lt;!-- Disable table of contents.  See https://www.mediawiki.org/wiki/Help:Magic_words --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Formats/Skin&amp;diff=9004</id>
		<title>Formats/Skin</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Formats/Skin&amp;diff=9004"/>
				<updated>2026-01-17T20:50:11Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* Usage in Unvanquished */ fix link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A skin is used to display a [[Formats/Model|model]] with different textures than it was originally loaded with. Skin files conventionally have the suffix &amp;lt;code&amp;gt;.skin&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Usage in Unvanquished ==&lt;br /&gt;
&lt;br /&gt;
Skins are used with [https://github.com/UnvanquishedAssets/res-players_src.dpkdir/tree/master/models/players/ human player models] to swap armors or add the helmet.&lt;br /&gt;
&lt;br /&gt;
== Minimal .skin example ==&lt;br /&gt;
  foo,&amp;lt;texture name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For a model that has only a single texture, this skin file can be used to replace it with a different one. &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; is an arbitrary word that has no effect. &amp;lt;code&amp;gt;&amp;lt;texture name&amp;gt;&amp;lt;/code&amp;gt; should be replaced with the name of the desired [[Formats/Material|Q3 shader]] or an image path.&lt;br /&gt;
&lt;br /&gt;
== Source code keywords ==&lt;br /&gt;
* Engine: &amp;lt;code&amp;gt;skin_t&amp;lt;/code&amp;gt;&lt;br /&gt;
* Gamelogic: &amp;lt;code&amp;gt;trap_R_RegisterSkin&amp;lt;/code&amp;gt;&lt;br /&gt;
* Both: &amp;lt;code&amp;gt;customSkin&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;refEntity_t&amp;lt;/code&amp;gt; member)&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Main_Page&amp;diff=8994</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Main_Page&amp;diff=8994"/>
				<updated>2025-10-13T23:44:45Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: Linux packages link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Unvanquished wiki}}&lt;br /&gt;
* If you need help about the game or the wiki, jump on [https://unvanquished.net/chat/ IRC or Matrix or Discord] (ses [[Chat#Channel_rules|rules]]) or the {{forums}}.&lt;br /&gt;
* If you are facing a bug in the game, report it on [https://github.com/Unvanquished/Unvanquished/issues GitHub].&lt;br /&gt;
* Build the wiki! Contribute guides, information, corrections and improvements.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainPageNewBox&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt; [[Install and play]] &amp;lt;/h2&amp;gt; &lt;br /&gt;
* [[Install and play#Getting the game|Getting the game]]&lt;br /&gt;
* [[Install and play#Running and configuration|Configuration]]&lt;br /&gt;
* [[Bug reporting]]&lt;br /&gt;
* [[Install and play#Getting in contact|Getting in contact]]&lt;br /&gt;
* [[Linux packages|Alternative Linux packages]]&lt;br /&gt;
* [[Server/Running|Running a server]]&lt;br /&gt;
* [[GPU compatibility matrix]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainPageNewBox&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt; [[Lore]] &amp;lt;/h2&amp;gt;&lt;br /&gt;
* [[Humans]], [[Aliens]], [[:Category:Buildables|Buildables]], [[:Category:Weapons|Weapons]]…&lt;br /&gt;
* [[Gameplay|Gameplay guides]]&lt;br /&gt;
* [[Lore#Stories|Stories]]&lt;br /&gt;
* [[Maps]] and [[Mods]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainPageNewBox&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt; [[Coding]] &amp;lt;/h2&amp;gt;&lt;br /&gt;
* [[Getting the source]]&lt;br /&gt;
* [[Compiling the source]]&lt;br /&gt;
* [[Contributing|Contributing guide]]&lt;br /&gt;
* [[Coding convention]]&lt;br /&gt;
* [[Dealing with submodules]]&lt;br /&gt;
* [[Continuous integration]]&lt;br /&gt;
* Reference materials&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainPageNewBox&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt; [[Making and modding]] &amp;lt;/h2&amp;gt;&lt;br /&gt;
* [[Mapping]], [[Modeling]], [[Texturing]]…&lt;br /&gt;
* [[Music and sounds]]&lt;br /&gt;
* [[Tutorials]], [[Formats]]&lt;br /&gt;
* [[Translation]]&lt;br /&gt;
* Gameplay modification&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainPageNewBox&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt; [[Projects|Tools and projects]] &amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[Wiki project resources]]&lt;br /&gt;
* [[Infrastructure]]&lt;br /&gt;
* [[Tools]]&lt;br /&gt;
* [[Projects#Unvanquished on the web|Unvanquished on the web]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainPageNewBox&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt; [[Install and play#Getting in contact|Getting in contact]] &amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[Chat]]&lt;br /&gt;
* [//forums.unvanquished.net Forums]&lt;br /&gt;
* [[Projects#Unvanquished on the social hubs|Social hubs]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;{{NUMBEROFEDITS}} edits to {{NUMBEROFPAGES}} pages with {{NUMBEROFFILES}} uploaded files&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;height: 150px; width: 100%; overflow:hidden; align:centre;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Dir inpackage.png|x150px]][[File:Egg concept.png|x150px]] [[File:Om concept.png|x150px]] [[File:Librocket test custom menuscreen.png|x150px]] [[File:NetRadiant texture browser common.png|x150px]] [[File:Colourgrade_2.png|x150px]] [[File:Parpax upper.png|x150px]] [[File:Niveus brushesSelected.jpeg|x150px]] [[File:Mgturret render 300x240.png|x150px]] [[File:Barricade.png|x150px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__NOTOC__  &amp;lt;!-- Disable table of contents.  See https://www.mediawiki.org/wiki/Help:Magic_words --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Linux_packages&amp;diff=8989</id>
		<title>Linux packages</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Linux_packages&amp;diff=8989"/>
				<updated>2025-10-13T22:02:59Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: Created page with &amp;quot;Besides the launcher and universal zip, Unvanquished distributions can also be found in some Linux package managers. These are not officially supported by the Unvanquished pro...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Besides the launcher and universal zip, Unvanquished distributions can also be found in some Linux package managers. These are not officially supported by the Unvanquished project.&lt;br /&gt;
&lt;br /&gt;
== Unvanquished update policy ==&lt;br /&gt;
&lt;br /&gt;
The Unvanquished norm is that all players and server owners need to update at the same time when a new major version comes out (e.g. 0.54.x -&amp;gt; 0.55.0). Differing major versions are incompatible. So when using one of the packages below, you should double-check that it is up to date with the official release distributed by the [[launcher]].&lt;br /&gt;
&lt;br /&gt;
== Packages ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! System !! Package Name !! Package Manager !! Script !! Maintainer&lt;br /&gt;
|-&lt;br /&gt;
| Arch Linux || &amp;lt;code&amp;gt;unvanquished&amp;lt;/code&amp;gt; || [https://aur.archlinux.org/packages/unvanquished AUR] || [https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=unvanquished source] || Viech&lt;br /&gt;
|-&lt;br /&gt;
| Flatpak || &amp;lt;code&amp;gt;net.unvanquished.Unvanquished&amp;lt;/code&amp;gt; || [https://flathub.org/en/apps/net.unvanquished.Unvanquished Flathub] || [https://github.com/flathub/net.unvanquished.Unvanquished/blob/master/net.unvanquished.Unvanquished.yml source] || afontain, illwieckz&lt;br /&gt;
|-&lt;br /&gt;
| NixOS || &amp;lt;code&amp;gt;unvanquished&amp;lt;/code&amp;gt; || [https://mynixos.com/nixpkgs/package/unvanquished Nix] || [https://github.com/NixOS/nixpkgs/blob/master/pkgs/by-name/un/unvanquished/package.nix source] || afontain&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Packaging tips ==&lt;br /&gt;
* Due to the update policy, Unvanquished may not be suitable for package ecosystems such as Debian's where version stability is expected.&lt;br /&gt;
* Any .dpk file must be copied from the official release rather than built, because its hash must match when playing online.&lt;br /&gt;
* If you look at the universal zip, &amp;lt;code&amp;gt;pkg/*.dpk&amp;lt;/code&amp;gt; plus the contents of the platform-specific zip, minus possibly &amp;lt;code&amp;gt;crash_server&amp;lt;/code&amp;gt;, is the bare minimum for a usable install.&lt;br /&gt;
* Other nice-to-have bits are a desktop file, and server scripts from [https://github.com/Unvanquished/Unvanquished/tree/master/dist &amp;lt;code&amp;gt;dist/&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Supported architectures for Unvanquished are &amp;lt;code&amp;gt;amd64&amp;lt;/code&amp;gt; (x86-64), &amp;lt;code&amp;gt;i686&amp;lt;/code&amp;gt; (x86), &amp;lt;code&amp;gt;armhf&amp;lt;/code&amp;gt; (32-bit ARM with hard float), and &amp;lt;code&amp;gt;arm64&amp;lt;/code&amp;gt;.&lt;br /&gt;
* If downloads are discouraged/forbidden by the package system, you will need to bundle the NaCl runtime dependencies in the package. &lt;br /&gt;
* Besides the NaCl runtime and Unvanquished gamelogic, you probably want to avoid using pre-built binaries. Pass &amp;lt;code&amp;gt;-DUSE_EXTERNAL_DEPS_LIBS=0&amp;lt;/code&amp;gt; to CMake to avoid this.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Formats/IQM&amp;diff=8875</id>
		<title>Formats/IQM</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Formats/IQM&amp;diff=8875"/>
				<updated>2025-05-28T23:33:14Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* Specification */ fix outdated IQE spec&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Formats]]&lt;br /&gt;
[[Category:IQM]]&lt;br /&gt;
==Tools==&lt;br /&gt;
&lt;br /&gt;
See [[Tools/IQM]].&lt;br /&gt;
&lt;br /&gt;
==Inter-Quake Model==&lt;br /&gt;
&lt;br /&gt;
{{Note|content='''IQM''' is the recommended model and animation format for the [[Engine|Dæmon engine]] and the [https://unvanquished.net Unvanquished game].}}&lt;br /&gt;
&lt;br /&gt;
===Bone-based model and skeletal animation format===&lt;br /&gt;
&lt;br /&gt;
The [http://sauerbraten.org/iqm/ Inter-Quake Model] (IQM) format was developed by Lee Salzman (aka eihrul) as a more modern alternative to the formats popularly used in the open-source community prior to its introduction.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;.iqm&amp;lt;/code&amp;gt; files are binary files.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;.iqe&amp;lt;/code&amp;gt; files are text counterpart. Unvanquished stores &amp;lt;code&amp;gt;.iqe&amp;lt;/code&amp;gt; files in asset source repositories and ships &amp;lt;code&amp;gt;.iqm&amp;lt;/code&amp;gt; files in &amp;lt;code&amp;gt;.dpk&amp;lt;/code&amp;gt; archives.&lt;br /&gt;
&lt;br /&gt;
Both IQM and IQE files can embed models with bones and skeletal animations.&lt;br /&gt;
&lt;br /&gt;
===Adoption===&lt;br /&gt;
&lt;br /&gt;
IQM format is popular in free open source games, mods and free open source game engines like Cube 2: Sauerbraten, Red Eclipse/Blue Nebula, Xonotic (DarkPlaces), Alien Arena, Warsow/Warfork (QFusion), Unvanquished (Dæmon), Ya3dag, FTEQW, ioquake3, and others. It became a de-facto standard for such free open source gaming projects.&lt;br /&gt;
&lt;br /&gt;
IQM format is fully supported in Unvanquished workflow : in engine, asset build tools, level editor, map compiler, etc.&lt;br /&gt;
&lt;br /&gt;
===Advantages of IQM over MD5===&lt;br /&gt;
&lt;br /&gt;
MD5 format (&amp;lt;code&amp;gt;.md5mesh&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;.md5anim&amp;lt;/code&amp;gt;) was the skeletal model and animation format used by Doom 3, which is also supported by the [[Engine|Dæmon Engine]] alongside IQM (MD5 was implemented first in XreaL, then IQM was implemented in Dæmon).&lt;br /&gt;
&lt;br /&gt;
We recommend using IQM when possible. Advantages of IQM over MD5 are:&lt;br /&gt;
&lt;br /&gt;
* Triangle adjacency data;&lt;br /&gt;
* Non-uniform joint scaling;&lt;br /&gt;
* Variable vertex attributes:&lt;br /&gt;
** Position (equivalent to MD2 and MD3 style of animation);&lt;br /&gt;
** Texture coordinates;&lt;br /&gt;
** Normals;&lt;br /&gt;
** Tangents;&lt;br /&gt;
** Weights;&lt;br /&gt;
** Colors;&lt;br /&gt;
* Animation and model files may be combined (if desired);&lt;br /&gt;
* A binary (“compiled”) format is available (no text parsing at run time).&lt;br /&gt;
&lt;br /&gt;
===Specification===&lt;br /&gt;
&lt;br /&gt;
* IQM Homepage:&amp;lt;br/&amp;gt;http://sauerbraten.org/iqm/&lt;br /&gt;
* IQM Binary format specification:&amp;lt;br/&amp;gt;http://sauerbraten.org/iqm/iqm.txt&lt;br /&gt;
* IQE Plain-text format specification:&amp;lt;br/&amp;gt;https://github.com/lsalzman/iqm/blob/master/iqe.txt&lt;br /&gt;
* IQM development kit and reference implementation by Lee Salzman:&amp;lt;br/&amp;gt;https://github.com/lsalzman/iqm&lt;br /&gt;
&lt;br /&gt;
===Recommended tool===&lt;br /&gt;
&lt;br /&gt;
The recommended tool to convert models to IQM format is [[Tools/Iqmtool|Iqmtool]].&lt;br /&gt;
&lt;br /&gt;
===Implementation===&lt;br /&gt;
&lt;br /&gt;
{{Note|content=The {{engine}} loads binary IQM format, the text-based IQE format is used in [[UnvanquishedAssets]] source repositories.}}&lt;br /&gt;
&lt;br /&gt;
Dæmon developer gimhael [https://bugzilla.icculus.org/attachment.cgi?id=2673&amp;amp;action=diff submitted a patch] in 2011 to the [https://bugzilla.icculus.org/show_bug.cgi?id=4965 ioquake3 bug tracker]. Later in 2013, gimhael also [https://github.com/DaemonEngine/Daemon/commit/8b9a672024e97a793cea9f661c44a7b096936537 implemented] IQM in {{engine|link=no}} as well.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=MinGW&amp;diff=8857</id>
		<title>MinGW</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=MinGW&amp;diff=8857"/>
				<updated>2025-04-20T02:26:12Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* Installation */ Note that Debian packages changed exception flavor&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MinGW is a GCC-based compiler toolchain targeting Windows platforms. It is used to produce the Windows releases of Unvanquished. It can be quite complicated to use successfully, in part due to the existence of different compiler &amp;quot;flavors&amp;quot;, and confusing naming schemes. This page serves as a guide to both MinGW in general, and specifically in application to building Daemon and Unvanquished. Throughout this page, &amp;quot;MinGW&amp;quot; will be used to refer to the [http://mingw-w64.org/ mingw-w64] project, which is a fork of the (now long-moribund) &amp;quot;original MinGW&amp;quot; project aiming to support both 32- and 64-bit builds. So beware: something having &amp;quot;64&amp;quot; in its name does not at all imply it is for 64-bit binaries! Same goes for &amp;quot;32&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Flavors ==&lt;br /&gt;
&lt;br /&gt;
=== Bitness: 32-bit or 64-bit ===&lt;br /&gt;
&lt;br /&gt;
Whether to compile for 32-bit (&amp;quot;i686&amp;quot; in package names) or 64-bit (&amp;quot;x86-64&amp;quot; or &amp;quot;x86_64&amp;quot;) architecture. 64-bit Windows versions are capable of running 32-bit executables in a mode called WOW (Windows-on-Windows).&lt;br /&gt;
&lt;br /&gt;
=== Threading flavor ===&lt;br /&gt;
You can get &amp;lt;code&amp;gt;win32&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;posix&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;mcf&amp;lt;/code&amp;gt; thread models. Daemon must be built with the &amp;lt;code&amp;gt;posix&amp;lt;/code&amp;gt; flavor, because code that uses &amp;lt;code&amp;gt;std::thread&amp;lt;/code&amp;gt; does not compile with either of the other flavors. In general there is no reason to use &amp;lt;code&amp;gt;win32&amp;lt;/code&amp;gt;. However, it is unfortunately the default in the APT package manager. &amp;lt;code&amp;gt;mcf&amp;lt;/code&amp;gt; first appears in the MinGW-W64-builds installer for version 13.2.0. It is supposed to have improved performance, but requires use of the nonstandard [https://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_concurrency_impl.html gthread] interface.&lt;br /&gt;
&lt;br /&gt;
=== Exception handling flavor ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sjlj&amp;lt;/code&amp;gt; (setjmp/longjmp) is available for both 32- and 64-bit builds. It has the drawback of significant runtime cost.&lt;br /&gt;
* &amp;lt;code&amp;gt;dwarf&amp;lt;/code&amp;gt; is available only for 32-bit. It has good performance, but it is said to have a drawback that exceptions can't be propagated through code compiled with a different compiler (or C code?). However, propagating exceptions through C code shouldn't be needed for Daemon.&lt;br /&gt;
* &amp;lt;code&amp;gt;seh&amp;lt;/code&amp;gt; (Structured Exception Handling) is available only for 64-bit. It has good performance and always works correctly, so it should always be used for 64-bit.&lt;br /&gt;
&lt;br /&gt;
One way to identify which exception model code was built with is to check the libgcc dependency. You'll find for example &amp;lt;code&amp;gt;libgcc_s_seh-1.dll&amp;lt;/code&amp;gt; for SEH, &amp;lt;code&amp;gt;libgcc_s_dw2-1.dll&amp;lt;/code&amp;gt; for DWARF, or &amp;lt;code&amp;gt;libgcc_s_sjlj-1.dll&amp;lt;/code&amp;gt; for sjlj. An easy way to make a C++ test program emit a libgcc dependency is to add a try/catch block.&lt;br /&gt;
&lt;br /&gt;
=== Microsoft C runtime target ===&lt;br /&gt;
&lt;br /&gt;
You can choose which one of the C stdlib/runtime implementations that come with Windows to dynamically link against.&lt;br /&gt;
* &amp;lt;code&amp;gt;msvcrt&amp;lt;/code&amp;gt; is the traditional one.&lt;br /&gt;
* &amp;lt;code&amp;gt;ucrt&amp;lt;/code&amp;gt; is first available in the MinGW-W64-builds installer for version 12.2.0. The [https://learn.microsoft.com/en-us/cpp/porting/upgrade-your-code-to-the-universal-crt UCRT] is only available in Windows 10 or higher. &lt;br /&gt;
&lt;br /&gt;
For now, you can assume that everything uses &amp;lt;code&amp;gt;msvcrt&amp;lt;/code&amp;gt; for the rest of the article.&lt;br /&gt;
&lt;br /&gt;
=== Mixing flavors ===&lt;br /&gt;
&lt;br /&gt;
Mixing different thread or exception flavors can cause problems, such as missing DLL dependencies, or exception handling not working. (Mixing C runtime flavors is probably bad too.)&lt;br /&gt;
&lt;br /&gt;
For the &amp;lt;code&amp;gt;external_deps&amp;lt;/code&amp;gt; libraries, efforts have been made to avoid depending on any thread-flavor-specific or exception-flavor-specific libraries, so it should be possible to use them with any flavor of MinGW. Exception handling glitches shouldn't be an issue since the Windows dependencies are C-only.&lt;br /&gt;
&lt;br /&gt;
== Distributions ==&lt;br /&gt;
&lt;br /&gt;
=== Cross-compiling from Linux ===&lt;br /&gt;
&lt;br /&gt;
Most Linux package managers offer some form of MinGW package. Availability of different flavor combinations varies.&lt;br /&gt;
&lt;br /&gt;
==== Installation ====&lt;br /&gt;
APT (Debian Buster or older):&lt;br /&gt;
&amp;lt;pre&amp;gt;# 32-bit, sjlj. win32 threads are selected by default; switch it to posix&lt;br /&gt;
sudo apt install g++-mingw-w64-i686  &lt;br /&gt;
sudo update-alternatives --set i686-w64-mingw32-gcc /usr/bin/i686-w64-mingw32-gcc-posix&lt;br /&gt;
sudo update-alternatives --set i686-w64-mingw32-g++ /usr/bin/i686-w64-mingw32-g++-posix&lt;br /&gt;
&lt;br /&gt;
# 64-bit, SEH. win32 threads are selected by default; switch it to posix&lt;br /&gt;
sudo apt install g++-mingw-w64-x86-64  &lt;br /&gt;
sudo update-alternatives --set x86_64-w64-mingw32-gcc /usr/bin/x86_64-w64-mingw32-gcc-posix&lt;br /&gt;
sudo update-alternatives --set x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
APT (Debian Bullseye or newer):&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt install gcc-mingw-w64-i686-posix&amp;lt;/code&amp;gt; (32-bit; posix; sjlj in Bullseye, dwarf in Bookworm)&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt install gcc-mingw-w64-x86-64-posix&amp;lt;/code&amp;gt; (64-bit, posix, SEH)&lt;br /&gt;
&lt;br /&gt;
==== Usage ====&lt;br /&gt;
&lt;br /&gt;
To build a CMake project, you need a &amp;quot;toolchain file&amp;quot;. Sadly, there is no official toolchain file from MinGW or CMake. For Daemon and Unvanquished we use [https://github.com/DaemonEngine/Daemon/blob/master/cmake/cross-toolchain-mingw32.cmake this (32-bit)] and [https://github.com/DaemonEngine/Daemon/blob/master/cmake/cross-toolchain-mingw64.cmake this (64-bit)]. Use it by passing &amp;lt;code&amp;gt;-DCMAKE_TOOLCHAIN_FILE=&amp;lt;path&amp;gt;&amp;lt;/code&amp;gt; on the &amp;lt;code&amp;gt;cmake&amp;lt;/code&amp;gt; command line.&lt;br /&gt;
&lt;br /&gt;
=== MSYS2 ===&lt;br /&gt;
&lt;br /&gt;
MSYS2 runs on Windows hosts and provides up-to-date 32-bit/DWARF/posix and 64-bit/SEH/posix toolchains. Building is done from a Bash shell in a partial emulation of a Linux environment, similar to Cygwin.&lt;br /&gt;
&lt;br /&gt;
==== Installation ====&lt;br /&gt;
&lt;br /&gt;
Download from [https://www.msys2.org]. &lt;br /&gt;
&lt;br /&gt;
Install dependencies to build Daemon (can be done from any MSYS2 shell flavor):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# 32-bit&lt;br /&gt;
pacman -Sy mingw-w64-i686-gcc mingw64-i686-cmake make&lt;br /&gt;
# 64-bit&lt;br /&gt;
pacman -Sy mingw-w64-x86_64-gcc mingw64-x86_64-cmake make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Usage ====&lt;br /&gt;
You must open a different MSYS2 shell flavor according to which architecture you want to target: &amp;quot;MSYS2 MinGW 32-bit&amp;quot; or &amp;quot;MSYS2 MinGW 64-bit&amp;quot;. When invoking &amp;lt;code&amp;gt;cmake&amp;lt;/code&amp;gt;, you must pass the flag &amp;lt;code&amp;gt;-G&amp;quot;MSYS Makefiles&amp;quot;&amp;lt;/code&amp;gt;. When building Unvanquished, the flag &amp;lt;code&amp;gt;-DCBSE_PYTHON_PATH=&amp;lt;path&amp;gt;&amp;lt;/code&amp;gt; may be of interest, if you want to use a Python other than the one shipped with MSYS2. &amp;lt;code&amp;gt;&amp;lt;path&amp;gt;&amp;lt;/code&amp;gt; should be in the Unix-emulation format, e.g. &amp;lt;code&amp;gt;/c/Python/python.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;MinGW-W64-builds&amp;quot; (Standalone Windows version) ===&lt;br /&gt;
This distribution (see [https://github.com/niXman/mingw-builds-binaries Github]) provides a toolchain that can be used from the Windows command prompt, without needing a Unix emulation layer. The installer allows you to choose from every valid combination of flavors.&lt;br /&gt;
 &lt;br /&gt;
==== Usage ====&lt;br /&gt;
&lt;br /&gt;
Choose the &amp;lt;code&amp;gt;MinGW Makefiles&amp;lt;/code&amp;gt; generator in CMake. The location of the toolchain used is determined by finding the first one in your PATH environment variable. Relative to the installation root, the PATH entry should be at &amp;lt;code&amp;gt;mingw32\bin&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;mingw64\bin&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After running CMake, compile by running &amp;lt;code&amp;gt;mingw32-make&amp;lt;/code&amp;gt; in the build directory.&lt;br /&gt;
&lt;br /&gt;
== Built-in DLL dependencies ==&lt;br /&gt;
&lt;br /&gt;
There are a few DLLs shipped as part of MinGW that most programs will depend on. These are also available as static libraries (a fully static binary can be produced with the &amp;lt;code&amp;gt;-static&amp;lt;/code&amp;gt; flag), but dynamic is the default. These are:&lt;br /&gt;
* &amp;lt;code&amp;gt;libgcc&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;libstdc++&amp;lt;/code&amp;gt; (for C++ programs)&lt;br /&gt;
* &amp;lt;code&amp;gt;libssp&amp;lt;/code&amp;gt; (if stack protection is enabled)&lt;br /&gt;
* &amp;lt;code&amp;gt;libwinpthread&amp;lt;/code&amp;gt; (if threads are used)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;libstdc++&amp;lt;/code&amp;gt; is both thread- and exception-flavor-dependent, but unlike &amp;lt;code&amp;gt;libgcc&amp;lt;/code&amp;gt;, the DLL does not have the flavor written in the filename. This means that you can't easily tell if you have the right one (nor can the Windows executable loader). [https://github.com/lucasg/Dependencies Dependencies] is a good tool to investigate such issues.&lt;br /&gt;
&lt;br /&gt;
When distributing a binary release of Daemon, you must ship these DLLs alongside the executable, else you will run into [https://github.com/Unvanquished/Unvanquished/issues/716 this issue]. Note that unlike Daemon's other DLL dependencies (from the &amp;lt;code&amp;gt;external_deps&amp;lt;/code&amp;gt; package), the MinGW DLLs are not automatically copied to the build directory as part of the build process. See &amp;lt;code&amp;gt;extra_dll_list&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;findDll&amp;lt;/code&amp;gt; in the [https://github.com/Unvanquished/release-scripts/blob/master/build-release Unvanquished release script].&lt;br /&gt;
&lt;br /&gt;
== C ABI compability with MSVC ==&lt;br /&gt;
&lt;br /&gt;
On 32-bit x86, GCC has a different default stack alignment (16 bytes) than MSVC (4 bytes). This can cause problems when MSVC-compiled code calls into GCC-compiled code and the alignment is less than expected. One solution, which we use to build MSVC-compatible &amp;lt;code&amp;gt;external_deps&amp;lt;/code&amp;gt; DLLs, is to use a GCC flag (&amp;lt;code&amp;gt;-mpreferred-stack-boundary=&amp;lt;/code&amp;gt;) to change the presumed stack alignment. Another, which we use to handle jumps from 3rd-party binaries to our (MinGW-built) code, is to put the annotation &amp;lt;code&amp;gt;__attribute__((force_align_arg_pointer))&amp;lt;/code&amp;gt; on the functions which may be called with less alignment than expected, instructing the compiler to perform alignment when the function is called.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-mms-bitfields&amp;lt;/code&amp;gt; should be enabled to ensure that the layout of structs containing bitfields matches. This is on by default.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=MinGW&amp;diff=8856</id>
		<title>MinGW</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=MinGW&amp;diff=8856"/>
				<updated>2025-04-20T01:36:44Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* Flavors */ new flavors&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MinGW is a GCC-based compiler toolchain targeting Windows platforms. It is used to produce the Windows releases of Unvanquished. It can be quite complicated to use successfully, in part due to the existence of different compiler &amp;quot;flavors&amp;quot;, and confusing naming schemes. This page serves as a guide to both MinGW in general, and specifically in application to building Daemon and Unvanquished. Throughout this page, &amp;quot;MinGW&amp;quot; will be used to refer to the [http://mingw-w64.org/ mingw-w64] project, which is a fork of the (now long-moribund) &amp;quot;original MinGW&amp;quot; project aiming to support both 32- and 64-bit builds. So beware: something having &amp;quot;64&amp;quot; in its name does not at all imply it is for 64-bit binaries! Same goes for &amp;quot;32&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Flavors ==&lt;br /&gt;
&lt;br /&gt;
=== Bitness: 32-bit or 64-bit ===&lt;br /&gt;
&lt;br /&gt;
Whether to compile for 32-bit (&amp;quot;i686&amp;quot; in package names) or 64-bit (&amp;quot;x86-64&amp;quot; or &amp;quot;x86_64&amp;quot;) architecture. 64-bit Windows versions are capable of running 32-bit executables in a mode called WOW (Windows-on-Windows).&lt;br /&gt;
&lt;br /&gt;
=== Threading flavor ===&lt;br /&gt;
You can get &amp;lt;code&amp;gt;win32&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;posix&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;mcf&amp;lt;/code&amp;gt; thread models. Daemon must be built with the &amp;lt;code&amp;gt;posix&amp;lt;/code&amp;gt; flavor, because code that uses &amp;lt;code&amp;gt;std::thread&amp;lt;/code&amp;gt; does not compile with either of the other flavors. In general there is no reason to use &amp;lt;code&amp;gt;win32&amp;lt;/code&amp;gt;. However, it is unfortunately the default in the APT package manager. &amp;lt;code&amp;gt;mcf&amp;lt;/code&amp;gt; first appears in the MinGW-W64-builds installer for version 13.2.0. It is supposed to have improved performance, but requires use of the nonstandard [https://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_concurrency_impl.html gthread] interface.&lt;br /&gt;
&lt;br /&gt;
=== Exception handling flavor ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sjlj&amp;lt;/code&amp;gt; (setjmp/longjmp) is available for both 32- and 64-bit builds. It has the drawback of significant runtime cost.&lt;br /&gt;
* &amp;lt;code&amp;gt;dwarf&amp;lt;/code&amp;gt; is available only for 32-bit. It has good performance, but it is said to have a drawback that exceptions can't be propagated through code compiled with a different compiler (or C code?). However, propagating exceptions through C code shouldn't be needed for Daemon.&lt;br /&gt;
* &amp;lt;code&amp;gt;seh&amp;lt;/code&amp;gt; (Structured Exception Handling) is available only for 64-bit. It has good performance and always works correctly, so it should always be used for 64-bit.&lt;br /&gt;
&lt;br /&gt;
One way to identify which exception model code was built with is to check the libgcc dependency. You'll find for example &amp;lt;code&amp;gt;libgcc_s_seh-1.dll&amp;lt;/code&amp;gt; for SEH, &amp;lt;code&amp;gt;libgcc_s_dw2-1.dll&amp;lt;/code&amp;gt; for DWARF, or &amp;lt;code&amp;gt;libgcc_s_sjlj-1.dll&amp;lt;/code&amp;gt; for sjlj. An easy way to make a C++ test program emit a libgcc dependency is to add a try/catch block.&lt;br /&gt;
&lt;br /&gt;
=== Microsoft C runtime target ===&lt;br /&gt;
&lt;br /&gt;
You can choose which one of the C stdlib/runtime implementations that come with Windows to dynamically link against.&lt;br /&gt;
* &amp;lt;code&amp;gt;msvcrt&amp;lt;/code&amp;gt; is the traditional one.&lt;br /&gt;
* &amp;lt;code&amp;gt;ucrt&amp;lt;/code&amp;gt; is first available in the MinGW-W64-builds installer for version 12.2.0. The [https://learn.microsoft.com/en-us/cpp/porting/upgrade-your-code-to-the-universal-crt UCRT] is only available in Windows 10 or higher. &lt;br /&gt;
&lt;br /&gt;
For now, you can assume that everything uses &amp;lt;code&amp;gt;msvcrt&amp;lt;/code&amp;gt; for the rest of the article.&lt;br /&gt;
&lt;br /&gt;
=== Mixing flavors ===&lt;br /&gt;
&lt;br /&gt;
Mixing different thread or exception flavors can cause problems, such as missing DLL dependencies, or exception handling not working. (Mixing C runtime flavors is probably bad too.)&lt;br /&gt;
&lt;br /&gt;
For the &amp;lt;code&amp;gt;external_deps&amp;lt;/code&amp;gt; libraries, efforts have been made to avoid depending on any thread-flavor-specific or exception-flavor-specific libraries, so it should be possible to use them with any flavor of MinGW. Exception handling glitches shouldn't be an issue since the Windows dependencies are C-only.&lt;br /&gt;
&lt;br /&gt;
== Distributions ==&lt;br /&gt;
&lt;br /&gt;
=== Cross-compiling from Linux ===&lt;br /&gt;
&lt;br /&gt;
Most Linux package managers offer some form of MinGW package. Availability of different flavor combinations varies.&lt;br /&gt;
&lt;br /&gt;
==== Installation ====&lt;br /&gt;
APT (Debian Buster or older):&lt;br /&gt;
&amp;lt;pre&amp;gt;# 32-bit, sjlj. win32 threads are selected by default; switch it to posix&lt;br /&gt;
sudo apt install g++-mingw-w64-i686  &lt;br /&gt;
sudo update-alternatives --set i686-w64-mingw32-gcc /usr/bin/i686-w64-mingw32-gcc-posix&lt;br /&gt;
sudo update-alternatives --set i686-w64-mingw32-g++ /usr/bin/i686-w64-mingw32-g++-posix&lt;br /&gt;
&lt;br /&gt;
# 64-bit, SEH. win32 threads are selected by default; switch it to posix&lt;br /&gt;
sudo apt install g++-mingw-w64-x86-64  &lt;br /&gt;
sudo update-alternatives --set x86_64-w64-mingw32-gcc /usr/bin/x86_64-w64-mingw32-gcc-posix&lt;br /&gt;
sudo update-alternatives --set x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
APT (Debian Bullseye or newer):&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt install gcc-mingw-w64-i686-posix&amp;lt;/code&amp;gt; (32-bit, posix, sjlj)&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt install gcc-mingw-w64-x86-64-posix&amp;lt;/code&amp;gt; (64-bit, posix, SEH)&lt;br /&gt;
&lt;br /&gt;
==== Usage ====&lt;br /&gt;
&lt;br /&gt;
To build a CMake project, you need a &amp;quot;toolchain file&amp;quot;. Sadly, there is no official toolchain file from MinGW or CMake. For Daemon and Unvanquished we use [https://github.com/DaemonEngine/Daemon/blob/master/cmake/cross-toolchain-mingw32.cmake this (32-bit)] and [https://github.com/DaemonEngine/Daemon/blob/master/cmake/cross-toolchain-mingw64.cmake this (64-bit)]. Use it by passing &amp;lt;code&amp;gt;-DCMAKE_TOOLCHAIN_FILE=&amp;lt;path&amp;gt;&amp;lt;/code&amp;gt; on the &amp;lt;code&amp;gt;cmake&amp;lt;/code&amp;gt; command line.&lt;br /&gt;
&lt;br /&gt;
=== MSYS2 ===&lt;br /&gt;
&lt;br /&gt;
MSYS2 runs on Windows hosts and provides up-to-date 32-bit/DWARF/posix and 64-bit/SEH/posix toolchains. Building is done from a Bash shell in a partial emulation of a Linux environment, similar to Cygwin.&lt;br /&gt;
&lt;br /&gt;
==== Installation ====&lt;br /&gt;
&lt;br /&gt;
Download from [https://www.msys2.org]. &lt;br /&gt;
&lt;br /&gt;
Install dependencies to build Daemon (can be done from any MSYS2 shell flavor):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# 32-bit&lt;br /&gt;
pacman -Sy mingw-w64-i686-gcc mingw64-i686-cmake make&lt;br /&gt;
# 64-bit&lt;br /&gt;
pacman -Sy mingw-w64-x86_64-gcc mingw64-x86_64-cmake make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Usage ====&lt;br /&gt;
You must open a different MSYS2 shell flavor according to which architecture you want to target: &amp;quot;MSYS2 MinGW 32-bit&amp;quot; or &amp;quot;MSYS2 MinGW 64-bit&amp;quot;. When invoking &amp;lt;code&amp;gt;cmake&amp;lt;/code&amp;gt;, you must pass the flag &amp;lt;code&amp;gt;-G&amp;quot;MSYS Makefiles&amp;quot;&amp;lt;/code&amp;gt;. When building Unvanquished, the flag &amp;lt;code&amp;gt;-DCBSE_PYTHON_PATH=&amp;lt;path&amp;gt;&amp;lt;/code&amp;gt; may be of interest, if you want to use a Python other than the one shipped with MSYS2. &amp;lt;code&amp;gt;&amp;lt;path&amp;gt;&amp;lt;/code&amp;gt; should be in the Unix-emulation format, e.g. &amp;lt;code&amp;gt;/c/Python/python.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;MinGW-W64-builds&amp;quot; (Standalone Windows version) ===&lt;br /&gt;
This distribution (see [https://github.com/niXman/mingw-builds-binaries Github]) provides a toolchain that can be used from the Windows command prompt, without needing a Unix emulation layer. The installer allows you to choose from every valid combination of flavors.&lt;br /&gt;
 &lt;br /&gt;
==== Usage ====&lt;br /&gt;
&lt;br /&gt;
Choose the &amp;lt;code&amp;gt;MinGW Makefiles&amp;lt;/code&amp;gt; generator in CMake. The location of the toolchain used is determined by finding the first one in your PATH environment variable. Relative to the installation root, the PATH entry should be at &amp;lt;code&amp;gt;mingw32\bin&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;mingw64\bin&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After running CMake, compile by running &amp;lt;code&amp;gt;mingw32-make&amp;lt;/code&amp;gt; in the build directory.&lt;br /&gt;
&lt;br /&gt;
== Built-in DLL dependencies ==&lt;br /&gt;
&lt;br /&gt;
There are a few DLLs shipped as part of MinGW that most programs will depend on. These are also available as static libraries (a fully static binary can be produced with the &amp;lt;code&amp;gt;-static&amp;lt;/code&amp;gt; flag), but dynamic is the default. These are:&lt;br /&gt;
* &amp;lt;code&amp;gt;libgcc&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;libstdc++&amp;lt;/code&amp;gt; (for C++ programs)&lt;br /&gt;
* &amp;lt;code&amp;gt;libssp&amp;lt;/code&amp;gt; (if stack protection is enabled)&lt;br /&gt;
* &amp;lt;code&amp;gt;libwinpthread&amp;lt;/code&amp;gt; (if threads are used)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;libstdc++&amp;lt;/code&amp;gt; is both thread- and exception-flavor-dependent, but unlike &amp;lt;code&amp;gt;libgcc&amp;lt;/code&amp;gt;, the DLL does not have the flavor written in the filename. This means that you can't easily tell if you have the right one (nor can the Windows executable loader). [https://github.com/lucasg/Dependencies Dependencies] is a good tool to investigate such issues.&lt;br /&gt;
&lt;br /&gt;
When distributing a binary release of Daemon, you must ship these DLLs alongside the executable, else you will run into [https://github.com/Unvanquished/Unvanquished/issues/716 this issue]. Note that unlike Daemon's other DLL dependencies (from the &amp;lt;code&amp;gt;external_deps&amp;lt;/code&amp;gt; package), the MinGW DLLs are not automatically copied to the build directory as part of the build process. See &amp;lt;code&amp;gt;extra_dll_list&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;findDll&amp;lt;/code&amp;gt; in the [https://github.com/Unvanquished/release-scripts/blob/master/build-release Unvanquished release script].&lt;br /&gt;
&lt;br /&gt;
== C ABI compability with MSVC ==&lt;br /&gt;
&lt;br /&gt;
On 32-bit x86, GCC has a different default stack alignment (16 bytes) than MSVC (4 bytes). This can cause problems when MSVC-compiled code calls into GCC-compiled code and the alignment is less than expected. One solution, which we use to build MSVC-compatible &amp;lt;code&amp;gt;external_deps&amp;lt;/code&amp;gt; DLLs, is to use a GCC flag (&amp;lt;code&amp;gt;-mpreferred-stack-boundary=&amp;lt;/code&amp;gt;) to change the presumed stack alignment. Another, which we use to handle jumps from 3rd-party binaries to our (MinGW-built) code, is to put the annotation &amp;lt;code&amp;gt;__attribute__((force_align_arg_pointer))&amp;lt;/code&amp;gt; on the functions which may be called with less alignment than expected, instructing the compiler to perform alignment when the function is called.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-mms-bitfields&amp;lt;/code&amp;gt; should be enabled to ensure that the layout of structs containing bitfields matches. This is on by default.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Compiling_the_source&amp;diff=8854</id>
		<title>Compiling the source</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Compiling_the_source&amp;diff=8854"/>
				<updated>2025-03-30T17:58:42Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Dependencies==&lt;br /&gt;
&lt;br /&gt;
{{Note|content=In case this happens to become outdated, the up-to-date documentation can be found in the {{SourceFile|parameters=#unvanquished|README.md}} file in source repository.}}&lt;br /&gt;
&lt;br /&gt;
The game requires some dependencies to be built, which are the same on all systems:&lt;br /&gt;
&lt;br /&gt;
* cmake&lt;br /&gt;
* python3-yaml&lt;br /&gt;
* python3-jinja2&lt;br /&gt;
* A C++14 able compiler (those are known to work: clang (&amp;gt;= 3.5), gcc (&amp;gt;= 4.8), visual studio (&amp;gt;= 2019))&lt;br /&gt;
* zlib1g&lt;br /&gt;
* libgmp&lt;br /&gt;
* nettle&lt;br /&gt;
* libcurl4-gnutls&lt;br /&gt;
* libsdl2&lt;br /&gt;
* libglew&lt;br /&gt;
* libpng&lt;br /&gt;
* libjpeg-turbo8&lt;br /&gt;
* libwebp&lt;br /&gt;
* libfreetype6&lt;br /&gt;
* liblua5.3&lt;br /&gt;
* libopenal&lt;br /&gt;
* libogg&lt;br /&gt;
* libvorbis&lt;br /&gt;
* libopusfile&lt;br /&gt;
&lt;br /&gt;
Those are optional:&lt;br /&gt;
&lt;br /&gt;
* libncursesw5&lt;br /&gt;
&lt;br /&gt;
==macOS==&lt;br /&gt;
&lt;br /&gt;
First, you need to [[Getting_the_source|acquire the source code]].&lt;br /&gt;
&lt;br /&gt;
Regardless of what interface you may use to compile the source, you will need [http://www.cmake.org/cmake/resources/software.html CMake] to generate makefiles. You will also need to install [https://developer.apple.com/xcode/ Xcode]. At a minimum, you must install the &amp;quot;Xcode command-line tools&amp;quot; in order to compile anything. You may also install Xcode proper, if you wish to use that IDE.&lt;br /&gt;
&lt;br /&gt;
Once you have the source code and the tools installed, you may actually proceed to compile the source. You have several options:&lt;br /&gt;
* '''Compile the source at the command line'''. This is the easiest if you would just like to compile the game to use yourself and you do not intend to work on the code.&lt;br /&gt;
* '''Compile the source using an IDE'''. This is preferred if you intend on developing the source.&lt;br /&gt;
** Xcode is Apple's flagship IDE.&lt;br /&gt;
** [http://qt-project.org/downloads QtCreator] is cross-platform and provides real-time feedback of syntax errors, a Vim mode, as well as other features.&lt;br /&gt;
** [http://www.codeblocks.org/ Code::Blocks] is also cross-platform but lacks some of the features of Xcode and QtCreator.&lt;br /&gt;
&lt;br /&gt;
===Dependencies===&lt;br /&gt;
&lt;br /&gt;
Precompiled static libs are provided for all dependencies. CMake downloads them at configure time and extracts to &amp;lt;code&amp;gt;daemon/external_deps/macos-amd64-default_&amp;lt;i&amp;gt;&amp;amp;lt;version&amp;amp;gt;&amp;lt;/i&amp;gt;/&amp;lt;/code&amp;gt;. These were produced by the &amp;lt;code&amp;gt;external_deps/build.sh&amp;lt;/code&amp;gt; script, which you could also use to build them yourself if you want to for some reason.&lt;br /&gt;
&lt;br /&gt;
===Configuring with CMake===&lt;br /&gt;
&lt;br /&gt;
# Run CMake.&lt;br /&gt;
# Enter the location of the source code.&lt;br /&gt;
# Enter the location in which you would like to build the source code. This should be a different directory.&lt;br /&gt;
# Click &amp;quot;Configure&amp;quot;. You will be prompted as to which generator you would like to use. If you have Xcode installed, choose that. Wait while the configuration process runs. You may have to set the following:&lt;br /&gt;
## If you have selected to generate Xcode project files, make the &amp;lt;code&amp;gt;SDLMAIN_LIBRARY&amp;lt;/code&amp;gt; field blank. This option is not available if you have the generator set to Unix makefiles.&lt;br /&gt;
# Click &amp;quot;Generate&amp;quot;.&lt;br /&gt;
# You may now close CMake.&lt;br /&gt;
&lt;br /&gt;
===Compiling===&lt;br /&gt;
&lt;br /&gt;
====With Xcode====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Either start Xcode and open the project file (in the build directory you specified) or double-click the project file in Finder.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Open the project file created by CMake, which should be in the build directory you specified.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Change the active target to &amp;quot;ALL_BUILD&amp;quot; and click Product&amp;amp;rarr;Build.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====With Unix Makefiles====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Start Terminal (Applications &amp;amp;rarr; Utilities &amp;amp;rarr; Terminal).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Type the following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /path/to/Unvanquished-build&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If you are on a multi-core or multi-processor machine, you may speed up the process by passing the &amp;lt;code&amp;gt;-j&amp;lt;/code&amp;gt; argument followed by the number of available cores to &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;; e.g., &amp;lt;code&amp;gt;make -j4&amp;lt;/code&amp;gt;. Note that doing so makes reading error messages more difficult, as multiple instances of the compiler will print to the screen at once, causing information to appear out of order.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testing the build===&lt;br /&gt;
&lt;br /&gt;
====With Xcode 4====&lt;br /&gt;
&lt;br /&gt;
To test the game, select the &amp;quot;client&amp;quot; scheme from the combo box on the toolbar, and click the run button or press {{Hotkey|MacCommand}}{{Hotkey|R}}.&lt;br /&gt;
&lt;br /&gt;
=== Building for arm64 (Apple Silicon) architecture ===&lt;br /&gt;
&lt;br /&gt;
Our CMake scripts default to amd64 architecture, but you can also make a native build for the latest ARM-based Macs. Albeit while still relying on Rosetta to run amd64-based Native Client gamelogic binaries.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Install Daemon + Unvanquished dependencies (no pre-built ones for this architecture)&lt;br /&gt;
brew install nettle sdl2 libogg libvorbis opus opusfile web freetype glew openal-soft &lt;br /&gt;
&lt;br /&gt;
cmake path/to/source -DCMAKE_OSX_ARCHITECTURES=arm64 -DOpenAL_ROOT=$(brew --prefix openal-soft)&lt;br /&gt;
&lt;br /&gt;
# If you want to run NaCl (assumes you have built amd64 at least once to download its deps):&lt;br /&gt;
cp path/to/daemon/external_deps/macos-amd64-default_10/{nacl_loader,irt_core-amd64.nexe} .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Windows==&lt;br /&gt;
&lt;br /&gt;
===Visual Studio===&lt;br /&gt;
&lt;br /&gt;
CMake can generate Visual Studio projects for Unvanquished.&lt;br /&gt;
&lt;br /&gt;
# Add _NO_DEBUG_HEAP=1 to your environment variables otherwise performance under the debugger [http://www.massimpressionsprojects.com/dev/altdevblog/2011/07/27/the-unexpected-performance-of-debug-builds/ will be terrible]&lt;br /&gt;
# Run CMake with the source directory as the base directory of your source code (which should contain the directory &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;), and the build directory as a subdirectory of the source directory named &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Click the &amp;lt;b&amp;gt;Open Project&amp;lt;/b&amp;gt; button. Or if you used CMake from the command line, open &amp;lt;code&amp;gt;build/Unvanquished.sln&amp;lt;/code&amp;gt; in Visual Studio.&lt;br /&gt;
# In Visual Studio, choose your desired build type (default: &amp;lt;b&amp;gt;Debug&amp;lt;/b&amp;gt;) from the drop-down menu in the top bar. &amp;lt;b&amp;gt;Debug&amp;lt;/b&amp;gt; runs assertions and has complete debug information, but is slower. &amp;lt;b&amp;gt;RelWithDebInfo&amp;lt;/b&amp;gt; is fast and still fairly usable with the debugger, but assertions don't run and sometimes you can't see the value of a local variable.&lt;br /&gt;
# Use Build &amp;amp;rarr; Build Solution to compile the code. Or just press {{Hotkey|F5}} to build and run, but beware: this will not automatically build cgame or sgame! Only engine changes are automatically rebuilt when you run something from Visual Studio.&lt;br /&gt;
&lt;br /&gt;
====Important Notes====&lt;br /&gt;
&lt;br /&gt;
* Due to limitations with CMake, the startup project cannot be specified. This must be set manually to debug the client with Visual Studio:&lt;br /&gt;
** Right click on client and select &amp;quot;Set as Startup project&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===MinGW===&lt;br /&gt;
&lt;br /&gt;
It is possible to produce a Windows build of Unvanquished with [[MinGW]], as either a Windows or a Linux user. See [[MinGW#Distributions]] for detailed information about the toolchains available for installation.&lt;br /&gt;
&lt;br /&gt;
====Instructions for native Windows build with MSYS2====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Install MSYS2. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Open the ''MSYS2 MinGW 32-bit'' or ''MSYS2 MinGW 64-bit'' terminal, depending on which bitness you want to build. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; Install toolchain:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# For 32-bit replace x86_64 with i686&lt;br /&gt;
pacman -Sy &amp;amp;&amp;amp; pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake make&lt;br /&gt;
&amp;lt;/pre&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Run CMake. If you're building Unvanquished, you may want to use the &amp;lt;code&amp;gt;-DCBSE_PYTHON_PATH=&amp;lt;path&amp;gt;&amp;lt;/code&amp;gt; option in case you want to use a different Python rather than the one in MSYS2. &amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir mybuild &amp;amp;&amp;amp; cd mybuild&lt;br /&gt;
cmake -G &amp;quot;MSYS Makefiles&amp;quot; somepath/Unvanquished&lt;br /&gt;
&amp;lt;/pre&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Build:&lt;br /&gt;
&amp;lt;pre&amp;gt; make -j4 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you would like verbose output (useful to see compiler flags), set the &amp;lt;code&amp;gt;VERBOSE&amp;lt;/code&amp;gt; environment variable before running Make.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export VERBOSE=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may find that the game (or some part of the MSYS2 toolchain!) fails to start due to missing DLL dependencies. Two helpful tools are:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; The strace command in MSYS2, e.g. &amp;lt;code&amp;gt;strace ./daemon&amp;lt;/code&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://github.com/lucasg/Dependencies Dependencies] (a Windows GUI program) &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When distributing MinGW binaries, you need to distribute some additional DLLs besides the ones in the build folder. See [[MinGW#Built-in_DLL_dependencies]].&lt;br /&gt;
&lt;br /&gt;
====MSYS2 Clang====&lt;br /&gt;
In MSYS2, it is possible to build with Clang, rather than GCC as shown as in the above instructions. However, some of our pre-built libraries are incompatible. You need to use the ones from pacman instead.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Create a deps folder with incompatible packages removed. This assumes that the latest version of the prebuilt deps for the mingw package of the appropriate bitness has already been extracted to the &amp;lt;code&amp;gt;windows-${ARCH}-mingw_${VERSION}&amp;lt;/code&amp;gt; directory. In this example, we use &amp;lt;code&amp;gt;windows-amd64-mingw_8&amp;lt;/code&amp;gt;. &amp;lt;pre&amp;gt;&lt;br /&gt;
cd somepath/daemon/external_deps&lt;br /&gt;
mkdir msysclang&lt;br /&gt;
cp windows-amd64-mingw_8 -R msysclang&lt;br /&gt;
find msysclang -depth -name '*freetype*' -o -name '*png*' -o name '*curl*' -o -name '*lua*' | grep -v pnacl | xargs rm -r&lt;br /&gt;
&amp;lt;/pre&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Install those deps from Pacman: &amp;lt;pre&amp;gt;&lt;br /&gt;
# For Daemon&lt;br /&gt;
pacman -Sy &amp;amp;&amp;amp; pacman -S mingw-w64-clang-x86_64-freetype mingw-w64-clang-x86_64-curl mingw-w64-clang-x86_64-libpng&lt;br /&gt;
# For Unvanquished&lt;br /&gt;
pacman -Sy &amp;amp;&amp;amp; pacman -S mingw-w64-clang-x86_64-freetype mingw-w64-clang-x86_64-lua&lt;br /&gt;
&amp;lt;/pre&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Use the deps folder you made when configuring the build: &amp;lt;pre&amp;gt;&lt;br /&gt;
CC=clang CXX=clang++ cmake -G &amp;quot;MSYS Makefiles&amp;quot; -DEXTERNAL_DEPS_DIR=somepath/daemon/external_deps/msysclang /c/path/to/source&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If you see a download progress bar upon invoking CMake, you did the deps stuff wrong.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===QtCreator===&lt;br /&gt;
&lt;br /&gt;
# Install MinGW and follow the above instructions, except select Code::Blocks as the generator.&lt;br /&gt;
# Start QtCreator, and select &amp;quot;Open File or Project&amp;amp;hellip;&amp;quot; from the File menu.&lt;br /&gt;
# Navigate to your source directory and open CMakeLists.txt.&lt;br /&gt;
# At the CMake Wizard, select the same build directory you already configured using CMake. (If you did not chose Code::Blocks as the generator, you will have to start over again, as QtCreator requires a Code::Blocks project file in order to compile the source.)&lt;br /&gt;
# Ensure that a generator is selected in the combo box, and click &amp;quot;Run CMake&amp;quot;. If there is no generator listed, see the [[#Troubleshooting|troubleshooting]] section below.&lt;br /&gt;
# Click &amp;quot;Finish&amp;quot; to close the wizard.&lt;br /&gt;
&lt;br /&gt;
You should now be able to compile, run, and debug the code using QtCreator.&lt;br /&gt;
&lt;br /&gt;
====Troubleshooting====&lt;br /&gt;
&lt;br /&gt;
If at the &amp;quot;Run CMake&amp;quot; prompt of the the CMake Wizard, select &amp;quot;Run CMake&amp;quot; and are warned that no generator was selected, and notice that there are no generators in the combo box, you will likely have to [http://doc.qt.digia.com/qtcreator-2.4/creator-tool-chains.html manually configure your toolchain]. Select &amp;quot;Options&amp;amp;hellip;&amp;quot; from the &amp;quot;Tools&amp;quot; menu, then navigate to &amp;quot;Build &amp;amp;amp; Run&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
At the options window,&lt;br /&gt;
* Go to the &amp;quot;Kits&amp;quot; tab, and mouse over the &amp;quot;Desktop (default)&amp;quot; kit under &amp;quot;Manual&amp;quot;. If there were any errors in configuring this kit, they will be displayed in the tool tip. If there are problems, select the kit. You may need to manually specify the location of the MinGW debugger, for example, which is typically &amp;lt;code&amp;gt;C:\MinGW\bin\gdb.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Go to the &amp;quot;Compilers&amp;quot; tab, and ensure that MinGW is present. If not, you will need to add it manually.&lt;br /&gt;
&lt;br /&gt;
==Linux==&lt;br /&gt;
&lt;br /&gt;
===Dependencies===&lt;br /&gt;
&lt;br /&gt;
{{TODO|This may be incomplete.}}&lt;br /&gt;
&lt;br /&gt;
====Debian/Ubuntu====&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install build-essential cmake libcurl4-gnutls-dev \&lt;br /&gt;
  libglew-dev libgmp-dev nettle-dev zlib1g-dev libncursesw5-dev \&lt;br /&gt;
  libsdl2-dev libopenal-dev libjpeg-dev libpng-dev libwebp-dev \&lt;br /&gt;
  libogg-dev libvorbis-dev libopusfile-dev \&lt;br /&gt;
  libfreetype6-dev \&lt;br /&gt;
  liblua5.3-dev \&lt;br /&gt;
  python3-yaml python3-jinja2&lt;br /&gt;
&lt;br /&gt;
If the version of WebP supplied by your version of Debian or Ubuntu is older than v0.2.0, you will need to [https://code.google.com/p/webp/downloads/detail?name=libwebp-0.2.0.tar.gz download] and [https://developers.google.com/speed/webp/docs/compiling#unix compile it from source]. After compiling and installing with &amp;lt;code&amp;gt;sudo make install&amp;lt;/code&amp;gt;, in CMake, you'll need to set &amp;lt;code&amp;gt;WEBP_INCLUDE_DIR&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/usr/local/include/webp&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;WEBP_LIBRARY&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/usr/local/lib/libwebp.so&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Developpment package name may differs, for example &amp;lt;code&amp;gt;libgmp-dev&amp;lt;/code&amp;gt; may be named &amp;lt;code&amp;gt;libgmp3-dev&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;libglew-dev&amp;lt;/code&amp;gt; may be named &amp;lt;code&amp;gt;libglew1.7-dev&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We have a &amp;lt;code&amp;gt;debian&amp;lt;/code&amp;gt; directory in the source tree, you can check what's missing this way.&lt;br /&gt;
&lt;br /&gt;
 cd &amp;lt;var&amp;gt;path/to/unvanquished&amp;lt;/var&amp;gt;&lt;br /&gt;
 dpkg-checkbuilddeps&lt;br /&gt;
&lt;br /&gt;
Then install the listed packages this way:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install &amp;lt;var&amp;gt;package list&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;dpkg-checkbuilddeps&amp;lt;/code&amp;gt; command produces no output if you already have the required dependencies.&lt;br /&gt;
&lt;br /&gt;
Note that you only need &amp;lt;code&amp;gt;debhelper&amp;lt;/code&amp;gt; to build &amp;lt;code&amp;gt;.deb&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&lt;br /&gt;
====Fedora====&lt;br /&gt;
&lt;br /&gt;
Line 1 of the packages is basic dev tools. Lines 2-3 are Daemon dependencies. Line 4 is (additional) Unvanquished dependencies.&lt;br /&gt;
&lt;br /&gt;
 $ sudo dnf install \&lt;br /&gt;
   cmake gcc gcc-c++ \&lt;br /&gt;
   {freetype,glew,gmp,mesa-libGL,ncurses,nettle,openal-soft,opus,opusfile,SDL2}-devel \&lt;br /&gt;
   lib{curl,jpeg-turbo,png12,vorbis,webp}-devel \&lt;br /&gt;
   lua-devel python3-pyyaml python3-jinja2&lt;br /&gt;
&lt;br /&gt;
====Gentoo====&lt;br /&gt;
&lt;br /&gt;
 $ emerge curl freetype glew gmp jpeg ncurses media-sound/opus-tools libogg openal libpng libsdl libvorbis sys-libs/zlib&lt;br /&gt;
&lt;br /&gt;
====openSUSE====&lt;br /&gt;
&lt;br /&gt;
 $ sudo install zypper gcc gcc-c++ Mesa-libGL-devel SDL-devel libjpeg8-devel \&lt;br /&gt;
   libpng12-devel glew-devel webp-devel ncurses-devel gmp-devel libcurl-devel \&lt;br /&gt;
   libnettle-devel openal-soft-devel libvorbis-devel&lt;br /&gt;
&lt;br /&gt;
The latest version of WebP must be installed manually (FIXME: why, if there is webp-devel in the zypper package list?):&lt;br /&gt;
&lt;br /&gt;
 $ cd Unvanquished/daemon/external_deps&lt;br /&gt;
 $ ./build.sh linux-amd64-default webp naclsdk naclports&lt;br /&gt;
 $ ./build.sh linux-amd64-default install&lt;br /&gt;
&lt;br /&gt;
You must disable curses (set &amp;lt;code&amp;gt;USE_CURSES&amp;lt;/code&amp;gt; appropriately in CMake) as failing to do so will cause Unvanquished to crash on startup.&lt;br /&gt;
&lt;br /&gt;
===Configuring the code with CMake===&lt;br /&gt;
&lt;br /&gt;
After you have [[Getting the source|acquired the source code]], you can proceed to compile. Unvanquished uses CMake, so you must have that installed. &lt;br /&gt;
&lt;br /&gt;
====Using ccmake (curses-based front-end)====&lt;br /&gt;
&lt;br /&gt;
On Debian or Ubuntu:&lt;br /&gt;
&lt;br /&gt;
 $ sudo apt-get install cmake-curses-gui&lt;br /&gt;
&lt;br /&gt;
On Gentoo you should set the '''ncurses''' USE flag either globally or individually, just for cmake.&lt;br /&gt;
To add the USE flag globally, edit the USE array in /etc/make.conf for it to include '''ncurses'''.&lt;br /&gt;
To only install cmake with ncurses functionality, you could do the following:&lt;br /&gt;
&lt;br /&gt;
 $ echo 'dev-util/cmake ncurses' &amp;gt;&amp;gt; /etc/portage/package.use &amp;amp;&amp;amp; emerge cmake&lt;br /&gt;
&lt;br /&gt;
Note that in Ubuntu, &amp;lt;code&amp;gt;cmake-curses-gui&amp;lt;/code&amp;gt; is in Universe, which you may have to enable with &amp;lt;code&amp;gt;software-properties-gtk&amp;lt;/code&amp;gt;. Make sure to reload the software sources with &amp;lt;code&amp;gt;sudo apt-get update&amp;lt;/code&amp;gt; afterwards.&lt;br /&gt;
&lt;br /&gt;
Optionally: to use clang (rather than the default gcc and g++ compilers) export the CC and CXX variables before running cmake:&lt;br /&gt;
&lt;br /&gt;
 $ export CC=&amp;quot;clang&amp;quot;&lt;br /&gt;
 $ export CXX=&amp;quot;clang++ -stdlib=libc++ -lc++abi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Next, configure the codebase.&lt;br /&gt;
&lt;br /&gt;
 $ cd &amp;lt;var&amp;gt;/path/to/unvanquished&amp;lt;/var&amp;gt;&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ ccmake ..&lt;br /&gt;
&lt;br /&gt;
In Debian or Ubuntu you can build a package this way (you need &amp;lt;code&amp;gt;devscripts&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;fakeroot&amp;lt;/code&amp;gt; packages):&lt;br /&gt;
&lt;br /&gt;
 $ cd &amp;lt;var&amp;gt;/path/to/unvanquished&amp;lt;/var&amp;gt;&lt;br /&gt;
 $ fakeroot dpkg-buildpackage -b -uc&lt;br /&gt;
 $ sudo dpkg -i &amp;lt;var&amp;gt;../unvanquished_*.deb&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once in &amp;lt;code&amp;gt;ccmake&amp;lt;/code&amp;gt;, use the following keys:&lt;br /&gt;
&lt;br /&gt;
* Press {{Hotkey|c}} to configure. If an error occurs during this phase, make note of it and press {{Hotkey|e}} to dismiss it.&lt;br /&gt;
* Use the up and down arrow keys to navigate the compilation options.&lt;br /&gt;
* Press {{Hotkey|Enter}} to enable or disable boolean options (i.e., on/off) or to edit textual options.&lt;br /&gt;
** Press {{Hotkey|Esc}} when editing a textual option to cancel the change.&lt;br /&gt;
&lt;br /&gt;
Once you have finished the configuration process, press {{Hotkey|C}} again, then {{Hotkey|G}} to generate the makefile.&lt;br /&gt;
&lt;br /&gt;
====Using cmake-qt-gui (graphical front-end)====&lt;br /&gt;
&lt;br /&gt;
This graphical front end for cmake has its own package you must install:&lt;br /&gt;
&lt;br /&gt;
=====Debian/Ubuntu=====&lt;br /&gt;
&lt;br /&gt;
 $ sudo apt-get install cmake-qt-gui&lt;br /&gt;
&lt;br /&gt;
=====Gentoo=====&lt;br /&gt;
&lt;br /&gt;
With the '''qt4''' USE flag enabled:&lt;br /&gt;
&lt;br /&gt;
 $ emerge cmake&lt;br /&gt;
&lt;br /&gt;
Once installed, run with &amp;lt;code&amp;gt;cmake-gui&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cmake-qt-gui.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
# Set the path where you have the source code downloaded.&lt;br /&gt;
# Set the path where you would like to build the engine. This may be the same directory if you wish.&lt;br /&gt;
# Click 'Configure'.&lt;br /&gt;
# Click 'Generate'.&lt;br /&gt;
&lt;br /&gt;
====Unnecessary libraries====&lt;br /&gt;
&lt;br /&gt;
Regardless of which front-end to cmake you use, you may want to disable some libraries that are not strictly necessary:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;USE_BREAKPAD&amp;lt;/code&amp;gt; &amp;amp;mdash; Disabling this will cause the game to not produce crashdumps on failure.&lt;br /&gt;
* &amp;lt;code&amp;gt;USE_CURSES&amp;lt;/code&amp;gt; &amp;amp;mdash; Disabling this will cause the external (not in-game) console to not use curses; it will not be scrollable and will be similar to the console in the original Tremulous. This does in no way affect gameplay.&lt;br /&gt;
&lt;br /&gt;
===Compiling===&lt;br /&gt;
&lt;br /&gt;
 $ cd &amp;lt;var&amp;gt;path/to/unvanquished/build&amp;lt;/var&amp;gt;&lt;br /&gt;
 $ make -j4&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;-j&amp;lt;/code&amp;gt; switch to make allows you to speed up the compilation process by running it in multiple threads; set the number following this to the number of cores your processor(s) have.&lt;br /&gt;
&lt;br /&gt;
==FreeBSD==&lt;br /&gt;
&lt;br /&gt;
While building on FreeBSD is usually very similar to building on Linux, the PNaCl toolchain not being native to FreeBSD means not everything can be built on FreeBSD. See the [[Systems/FreeBSD]] page for details and dedicated instructions.&lt;br /&gt;
&lt;br /&gt;
==Acquiring the Game Files==&lt;br /&gt;
&lt;br /&gt;
===Acquiring mandatory game files===&lt;br /&gt;
&lt;br /&gt;
The game files are not in the Git repository, and must be downloaded separately. They must be saved to the [[Game locations|data location]] for your system.&lt;br /&gt;
&lt;br /&gt;
Linux users may use the &amp;lt;code&amp;gt;download-paks&amp;lt;/code&amp;gt; script that is distributed with the source code, which requires one of curl, wget or aria2 to be installed:&lt;br /&gt;
&lt;br /&gt;
 $ cd &amp;lt;var&amp;gt;path/to/unvanquished/build&amp;lt;/var&amp;gt;&lt;br /&gt;
 $ ../download-paks pkg&lt;br /&gt;
&lt;br /&gt;
Otherwise, the set of necessary packages can be extracted from the [https://github.com/Unvanquished/Unvanquished/releases latest release], or downloaded a la carte from the [http://dl.unvanquished.net/pkg/ package index].&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Testing&amp;diff=8820</id>
		<title>Testing</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Testing&amp;diff=8820"/>
				<updated>2025-01-28T15:33:10Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: new section: Testing old versions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Testing]]&lt;br /&gt;
==Reporting bugs==&lt;br /&gt;
&lt;br /&gt;
Please see the [[Bug_reporting|bug reporting]] page. This page is about helping modders and developers testing their changes.&lt;br /&gt;
&lt;br /&gt;
==Debugging==&lt;br /&gt;
&lt;br /&gt;
To create a debug build, change &amp;lt;code&amp;gt;CMAKE_BUILD_TYPE&amp;lt;/code&amp;gt; in CMake from &amp;lt;code&amp;gt;Release&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;Debug&amp;lt;/code&amp;gt;, then [[Compiling_the_source|compile]].&lt;br /&gt;
&lt;br /&gt;
You may find it necessary to set &amp;lt;code&amp;gt;in_nograb&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; to disable pointer grabbing so that you may use your debugger.&lt;br /&gt;
&lt;br /&gt;
===Debugging with gdb===&lt;br /&gt;
&lt;br /&gt;
Start gdb as follows:&lt;br /&gt;
&lt;br /&gt;
 $ gdb --args ./daemon +devmap chasm&lt;br /&gt;
&lt;br /&gt;
If the program segfaults, a backtrace is very useful to the developers in determining the source of the problem. At the debugger prompt, type &amp;lt;code&amp;gt;bt&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 (gdb) bt&lt;br /&gt;
&lt;br /&gt;
===Debugging with Xcode===&lt;br /&gt;
&lt;br /&gt;
With Xcode 4, even if you did not build the game with Xcode, you may still use its facilities for debugging.&lt;br /&gt;
&lt;br /&gt;
# Open any project. If necessary, create a new one. It may contain anything.&lt;br /&gt;
# Click &amp;quot;Product&amp;quot; on the menu bar and navigate to &amp;quot;Attach to Process&amp;quot;. Look for &amp;quot;daemon&amp;quot; listed under &amp;quot;Applications&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
After a moment, the application will be ready for debugging.&lt;br /&gt;
&lt;br /&gt;
See the [https://developer.apple.com/library/mac/#documentation/ToolsLanguages/Conceptual/Xcode4UserGuide/060-Debug_Your_App/debug_app.html#//apple_ref/doc/uid/TP40010215-CH3-SW1 Xcode 4 User Guide] for more information.&lt;br /&gt;
&lt;br /&gt;
==Live Testing==&lt;br /&gt;
&lt;br /&gt;
===Starting a testing session===&lt;br /&gt;
&lt;br /&gt;
Start the game, and enter the following command:&lt;br /&gt;
&lt;br /&gt;
 /devmap &amp;lt;var&amp;gt;map-name&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Adding bots===&lt;br /&gt;
&lt;br /&gt;
Like fish in a fish bowl, they can bring some activity in a map. &lt;br /&gt;
&lt;br /&gt;
 /bot fill 5   # add 5 bots&lt;br /&gt;
&lt;br /&gt;
You can also have a look at all the &amp;lt;code&amp;gt;g_bot_*&amp;lt;/code&amp;gt; cvars, they are quite interesting. There is even a graphical user interface for these!&lt;br /&gt;
&lt;br /&gt;
===Moving around with ease and spawning anywhere===&lt;br /&gt;
&lt;br /&gt;
You can pass through walls and fly around using &amp;lt;code&amp;gt;/noclip&amp;lt;/code&amp;gt;, and you can spawn anywhere you want using &amp;lt;code&amp;gt;/devteam h&amp;lt;/code&amp;gt; for humans or &amp;lt;code&amp;gt;/teamteam a&amp;lt;/code&amp;gt; for aliens. That's very practical and can allow you to start from an empty map.&lt;br /&gt;
&lt;br /&gt;
To load an empty map without having the game finishing immediately, you can use &amp;lt;code&amp;gt;g_neverEnd&amp;lt;/code&amp;gt;. This can help porting maps.&lt;br /&gt;
&lt;br /&gt;
===The &amp;lt;code&amp;gt;/give&amp;lt;/code&amp;gt; command===&lt;br /&gt;
&lt;br /&gt;
The /give will give you an easy way to test situations without being blocked by funds or team advancement.&lt;br /&gt;
&lt;br /&gt;
 /team a           # join aliens&lt;br /&gt;
 /give momentum    # give all the momentum you can to your team&lt;br /&gt;
 /give bp 100      # get 100 build points free&lt;br /&gt;
 /give funds       # get rich quick! I swear it's not a pyramid scheme!&lt;br /&gt;
 /give all         # get all personal things you can get, in addition to money (BP and momentum are independant)&lt;br /&gt;
&lt;br /&gt;
You can also combine several commands into one, for example you can test advanced dragoon really quickly&lt;br /&gt;
&lt;br /&gt;
=== Some misc useful cvars===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cg_drawSpeed&amp;lt;/code&amp;gt; to see how fast you are moving, &amp;lt;code&amp;gt;/set cg_drawSpeed 2&amp;lt;/code&amp;gt; even brings an histogram.&lt;br /&gt;
* &amp;lt;code&amp;gt;cg_drawBBOX&amp;lt;/code&amp;gt; to see how big or small the bounding box are&lt;br /&gt;
* &amp;lt;code&amp;gt;cg_drawDebugDistance&amp;lt;/code&amp;gt; to give you an idea of how far away of you a distance of &amp;quot;100 quake units&amp;quot; is&lt;br /&gt;
* &amp;lt;code&amp;gt;timescale&amp;lt;/code&amp;gt; setting this will make everything faster, or slower. Be careful that if you set it too low (say less than 0.1) the graphical console will take a lot of time to visibly appear, but you can still type in it. For example to do &amp;lt;code&amp;gt;/timescale 1&amp;lt;/code&amp;gt; again.&lt;br /&gt;
* &amp;lt;code&amp;gt;g_freeFundPeriod&amp;lt;/code&amp;gt; to change how often you and other clients are gifted money. This can be an alternative to making bots ignore limits that can give a bit more diversity in their choices and behaviours (rich bots will always rush, for example)&lt;br /&gt;
&lt;br /&gt;
==Debugging Graphics==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cg_draw2D&amp;lt;/code&amp;gt; can allow you to disable 2D drawing. It may be useful if you want to ignore 2D performances from your benchmarks.&lt;br /&gt;
&lt;br /&gt;
There probably exist proprietary tools for your platform. For example AMD used to have gDEBugger, and [https://gpuopen.com/archived/gpu-perfstudio/ GPU PerfStudio] proprietary debuggers.&lt;br /&gt;
&lt;br /&gt;
===apitrace===&lt;br /&gt;
&lt;br /&gt;
[https://apitrace.github.io/ apitrace] is an open-source tool that records every graphics API call made by an application. After the application has closed, you can step through individual calls to the graphics API, allowing you to&lt;br /&gt;
* see the result exactly as it would appear following each call,&lt;br /&gt;
* see graphs of API usage, and&lt;br /&gt;
* inspect buffers.&lt;br /&gt;
&lt;br /&gt;
Linux users can install it from their package manager, for example:&lt;br /&gt;
&lt;br /&gt;
 sudo apt install apitrace-tracers apitrace-gui&lt;br /&gt;
&lt;br /&gt;
Windows users can [http://people.freedesktop.org/~jrfonseca/apitrace/ download a build].&lt;br /&gt;
&lt;br /&gt;
==General Tips==&lt;br /&gt;
&lt;br /&gt;
===Miscellaneous===&lt;br /&gt;
&lt;br /&gt;
* To stress test the engine's ability to display a large number of buildables, you can tweak &amp;lt;code&amp;gt;g_BPInitialBudget&amp;lt;/code&amp;gt; and build as much as you wish.&lt;br /&gt;
* To determine what file was loaded for a particular asset (e.g., to determine if files are being read from a particular {{Formats|DPK}} archive) use the &amp;lt;code&amp;gt;/which&amp;lt;/code&amp;gt; command with the relative path to the asset as an argument. You can use tab-completion.&lt;br /&gt;
&lt;br /&gt;
For example, this means that you are effectively the new version of an UI file:&lt;br /&gt;
&lt;br /&gt;
 /which ui/shared/circlemenu.rcss&lt;br /&gt;
 File &amp;quot;ui/shared/circlemenu.rcss&amp;quot; found in &amp;quot;/home/me/unv/Unvanquished/pkg/unvanquished_src.dpkdir/&amp;quot; &lt;br /&gt;
&lt;br /&gt;
==Viewing Runtime Information==&lt;br /&gt;
&lt;br /&gt;
The engine and game logic provide a number of commands for viewing information about its current state.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Renderer===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;fbolist&amp;lt;/code&amp;gt; &amp;amp;mdash; List all frame buffer objects.&lt;br /&gt;
* &amp;lt;code&amp;gt;vbolist&amp;lt;/code&amp;gt; &amp;amp;mdash; List all vertex buffer objects.&lt;br /&gt;
&lt;br /&gt;
===Gamelogic===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;entityList&amp;lt;/code&amp;gt; &amp;amp;mdash; &lt;br /&gt;
* &amp;lt;code&amp;gt;sectorlist&amp;lt;/code&amp;gt; &amp;amp;mdash;&lt;br /&gt;
* &amp;lt;code&amp;gt;flaglist&amp;lt;/code&amp;gt; &amp;amp;mdash; List admin flags&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
==Testing materials and textures==&lt;br /&gt;
&lt;br /&gt;
See {{Subpage|Materials}}.&lt;br /&gt;
&lt;br /&gt;
==Testing maps==&lt;br /&gt;
&lt;br /&gt;
See {{Subpage|Maps}}.&lt;br /&gt;
&lt;br /&gt;
==Testing models==&lt;br /&gt;
&lt;br /&gt;
See {{Subpage|Models}}.&lt;br /&gt;
&lt;br /&gt;
==Testing old versions of Unvanquished==&lt;br /&gt;
&lt;br /&gt;
https://dl.unvanquished.net/release/ has universal zips of past releases. It is missing all versions before 0.17.&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/slipher/unvanquished-timemachine is a way to test multiple versions of Unvanquished more conveniently, without any unzipping or other install step. But it has only x86 Windows binaries. Some versions older than 0.17 are present.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Formats/Particle&amp;diff=8817</id>
		<title>Formats/Particle</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Formats/Particle&amp;diff=8817"/>
				<updated>2025-01-22T10:35:59Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: tools are not real&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Formats]]&lt;br /&gt;
[[Category:Mapping]]&lt;br /&gt;
Particle effects work differently than in Quake 3 but the same as Tremulous. Please see the [https://web.archive.org/web/20200416190204/http://tremulous.net/manual/#x1-130003.2 Tremulous documentation] ([https://dl.unvanquished.net/docs/20060317-000.tremulous-manual.pdf pdf]) for information on creating particle effects for now.&lt;br /&gt;
&lt;br /&gt;
Particle files must be located in the VFS at &amp;lt;code&amp;gt;scripts/*.particle&amp;lt;/code&amp;gt;. A particle file may specify any number of particle systems.&lt;br /&gt;
&lt;br /&gt;
Particle format is game-specific (mods may modify it).&lt;br /&gt;
&lt;br /&gt;
To look for examples of how some particle feature is used, you may use this [https://users.unvanquished.net/~slipher/particle-keyword-directory.txt particle keyword directory].&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
A particle renders as either a polygon with the specified texture(s), or a model.&lt;br /&gt;
&lt;br /&gt;
A texture-based particle is rendered as a square polygon oriented opposite to the view direction. The square may be rotated around the view axis, if specified in the particle file. Rotation means the corners of the square aren't aligned with the corners of the window.&lt;br /&gt;
&lt;br /&gt;
There is a correspondence between (texture-based) particles and [[Formats/Trail|trails]], and the two types of autosprite shaders: particles are to &amp;lt;code&amp;gt;deformVertex autosprite&amp;lt;/code&amp;gt; as trails are to &amp;lt;code&amp;gt;deformVertex autosprite2&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;deformVertex autosprite&amp;lt;/code&amp;gt; polygons can be placed in maps. They must be square and are automatically rotated so that, like particles, they are oriented opposite the view axis. Meanwhile trails and autosprite2 polygons rotate to face the viewer (NOT the view direction!), but only around a single axis.&lt;br /&gt;
&lt;br /&gt;
== Discouraged features in particle files ==&lt;br /&gt;
&amp;lt;code&amp;gt;realLight&amp;lt;/code&amp;gt; should not be used. This causes the particle to be lit using a sample from the lightgrid. This is a bad idea because it results in synchronous queries between the cgame and the renderer. Plus, it does not respond to realtime lights. Use a shader with light mapping enabled instead.&lt;br /&gt;
&lt;br /&gt;
== Tools (which do not actually deal with particle systems) ==&lt;br /&gt;
&lt;br /&gt;
There is a so-called [https://www.quake3world.com/forum/viewtopic.php?t=37893 particle effects editor] for Quake 3 that will likely need much modification to work with the Tremulous-style particle effects system. Source code is available from [https://github.com/FS-NulL/New-Quake-3-Particle-Studio GitHub]. A very brief tutorial on its usage by Frozen Sand (creators of Urban Terror) is [https://www.moddb.com/games/world-of-padman/downloads/frozen-sand-particle-studio-v10 also available]. But in fact &amp;quot;Quake 3 Arena has no support for 'real' particle systems. This program emulates them by using shader FX.&amp;quot;&amp;lt;ref&amp;gt;https://www.quake3stuff.com/freebrief/asp/viewpage.asp?url=../q3a/tools/ps/manual/basic/whatis.vp&amp;lt;/ref&amp;gt; Indeed, the quake3world.com forum post speaks of exporting to a &amp;lt;code&amp;gt;.shader&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
An older particle effects editor (not updated in many years) was also available. Dead link: &amp;lt;s&amp;gt;http://www.mods-r-us.net/freebrief/q3a/ps/index.html&amp;lt;/s&amp;gt;&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Formats/Particle&amp;diff=8816</id>
		<title>Formats/Particle</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Formats/Particle&amp;diff=8816"/>
				<updated>2025-01-21T11:26:38Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: how it works, discouraged reallight&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Formats]]&lt;br /&gt;
[[Category:Mapping]]&lt;br /&gt;
Particle effects work differently than in Quake 3 but the same as Tremulous. Please see the [https://web.archive.org/web/20200416190204/http://tremulous.net/manual/#x1-130003.2 Tremulous documentation] ([https://dl.unvanquished.net/docs/20060317-000.tremulous-manual.pdf pdf]) for information on creating particle effects for now.&lt;br /&gt;
&lt;br /&gt;
Particle files must be located in the VFS at &amp;lt;code&amp;gt;scripts/*.particle&amp;lt;/code&amp;gt;. A particle file may specify any number of particle systems.&lt;br /&gt;
&lt;br /&gt;
Particle format is game-specific (mods may modify it).&lt;br /&gt;
&lt;br /&gt;
To look for examples of how some particle feature is used, you may use this [https://users.unvanquished.net/~slipher/particle-keyword-directory.txt particle keyword directory].&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
A particle renders as either a polygon with the specified texture(s), or a model.&lt;br /&gt;
&lt;br /&gt;
A texture-based particle is rendered as a square polygon oriented opposite to the view direction. The square may be rotated around the view axis, if specified in the particle file. Rotation means the corners of the square aren't aligned with the corners of the window.&lt;br /&gt;
&lt;br /&gt;
There is a correspondence between (texture-based) particles and [[Formats/Trail|trails]], and the two types of autosprite shaders: particles are to &amp;lt;code&amp;gt;deformVertex autosprite&amp;lt;/code&amp;gt; as trails are to &amp;lt;code&amp;gt;deformVertex autosprite2&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;deformVertex autosprite&amp;lt;/code&amp;gt; polygons can be placed in maps. They must be square and are automatically rotated so that, like particles, they are oriented opposite the view axis. Meanwhile trails and autosprite2 polygons rotate to face the viewer (NOT the view direction!), but only around a single axis.&lt;br /&gt;
&lt;br /&gt;
== Discouraged features in particle files ==&lt;br /&gt;
&amp;lt;code&amp;gt;realLight&amp;lt;/code&amp;gt; should not be used. This causes the particle to be lit using a sample from the lightgrid. This is a bad idea because it results in synchronous queries between the cgame and the renderer. Plus, it does not respond to realtime lights. Use a shader with light mapping enabled instead.&lt;br /&gt;
&lt;br /&gt;
== Tools (outdated) ==&lt;br /&gt;
&lt;br /&gt;
There is a [https://www.quake3world.com/forum/viewtopic.php?t=37893 particle effects editor] for Quake 3 that will likely need much modification to work with the Tremulous-style particle effects system. Source code is available from [https://github.com/FS-NulL/New-Quake-3-Particle-Studio GitHub]. A very brief tutorial on its usage by Frozen Sand (creators of Urban Terror) is [https://www.moddb.com/games/world-of-padman/downloads/frozen-sand-particle-studio-v10 also available].&lt;br /&gt;
&lt;br /&gt;
An older particle effects editor (not updated in many years) was also available. Dead link: &amp;lt;s&amp;gt;http://www.mods-r-us.net/freebrief/q3a/ps/index.html&amp;lt;/s&amp;gt;&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Tools/Breakpad&amp;diff=8814</id>
		<title>Tools/Breakpad</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Tools/Breakpad&amp;diff=8814"/>
				<updated>2025-01-17T01:33:25Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: link Native CLient&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Breakpad is the technology for generating and analyzing crash dumps for the Daemon engine and [[Native Client|NaCl]] gamelogic modules. A crash dump is a file that is generated when the program crashes, which can be analyzed by developers to find out why the crash occurred. Breakpad is currently available in Daemon for the Windows (if built with MinGW) and Linux engine code, and the NaCl gamelogic on any platform.&lt;br /&gt;
&lt;br /&gt;
{{Note|content=Breakpad cannot be used for &amp;lt;i&amp;gt;native executable&amp;lt;/i&amp;gt; gamelogic modules. But (assuming a Linux server) you may use traditional core dumps instead. OR, you can use the &amp;lt;code&amp;gt;vm.cgame.type&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;vm.sgame.type&amp;lt;/code&amp;gt; cvars to start up gdbserver (TODO: explain how to use this). }}&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The USE_BREAKPAD CMake option controls whether Breakpad support is built into the engine. It is disabled by default because Breakpad is primarily useful for publicly distributed release binaries, not people who build and run the code themselves. Note that NaCl crash dump support is always built in, regardless of options.&lt;br /&gt;
&lt;br /&gt;
For an engine built with Breakpad support, the &amp;lt;code&amp;gt;common.breakpad.enabled&amp;lt;/code&amp;gt; cvar turns it on or off. The cvar can only be set via the command line, like &amp;lt;code&amp;gt;./daemon -set common.breakpad.enabled 0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== For users: reporting a crash ==&lt;br /&gt;
&lt;br /&gt;
The crash dumps are stored in the homepath under the &amp;lt;code&amp;gt;crashdump/&amp;lt;/code&amp;gt; directory. Sort by date to find the most recent one and make sure it matches the date/time when the crash occurred. Send the .dmp file to someone on the Unvanquished development team.&lt;br /&gt;
&lt;br /&gt;
== For developers: how to trace a crash ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Getting the tools ===&lt;br /&gt;
&lt;br /&gt;
The Breakpad repo for Daemon Engine is at https://github.com/DaemonEngine/breakpad. If you have already checked out Daemon, then it is located in the &amp;lt;code&amp;gt;libs/breakpad/&amp;lt;/code&amp;gt; submodule there. cd into this repo.&lt;br /&gt;
&lt;br /&gt;
Daemon's Breakpad fork is based on https://github.com/jon-turney/google-breakpad, with only minor changes. Jon Turney's version adds MinGW support. It is in turn a fork of Chromium's Breakpad https://chromium.googlesource.com/breakpad/breakpad.&lt;br /&gt;
&lt;br /&gt;
=== 2. Get symbols ===&lt;br /&gt;
&lt;br /&gt;
==== 2a. Symbols for an official Unvanquished release ====&lt;br /&gt;
&lt;br /&gt;
If you are debugging an official release binary, you don't need to (and can't) generate symbols yourself -- the Unvanquished release script handles this. In the Unvanquished unizip/torrent (or updater installation directory), symbol files are found in the &amp;lt;code&amp;gt;symbols_${VERSION}.zip&amp;lt;/code&amp;gt; archive. Simply extract the zip somewhere.&lt;br /&gt;
&lt;br /&gt;
==== 2b. Generating your own symbols ====&lt;br /&gt;
&lt;br /&gt;
To produce symbols, you need a binary with debug info. For MinGW, the binary additionally needs to have been built with the {{code|-Wl,--build-id}} flag so that it has a nonzero build ID.&lt;br /&gt;
&lt;br /&gt;
The first step is to build the dump_syms and/or dump_syms_dwarf executable using Make. Then you can use the &amp;lt;code&amp;gt;symbolize.py&amp;lt;/code&amp;gt; script in the root of Daemon's Breakpad repository to produce the symbols and store them in a symbol directory. Or if you want to know how to do it yourself, you can read the following paragraph which describes what the script does:&lt;br /&gt;
&lt;br /&gt;
You need to run the dump_syms tool (located at &amp;lt;code&amp;gt;src/tools/linux/dump_syms/dump_syms&amp;lt;/code&amp;gt; for Linux or NaCl targets or &amp;lt;code&amp;gt;src/tools/windows/dump_syms_dwarf/dump_syms&amp;lt;/code&amp;gt; for MinGW targets) on the binary(ies) where the crash occurred. Usage: &amp;lt;code&amp;gt;dump_syms &amp;lt;binary&amp;gt;&amp;lt;/code&amp;gt;. The output must be stored in a specific directory format. Pick a directory to be the symbol directory (&amp;lt;code&amp;gt;symbols&amp;lt;/code&amp;gt; in the following examples). The output must be stored at &amp;lt;code&amp;gt;symbols/$FILENAME/$BUILD_ID/$FILENAME.sym&amp;lt;/code&amp;gt; . For example, &amp;lt;code&amp;gt;symbols/cgame-native-dll.dll/1A74E057938E0BF10930C4F54740B2E21/cgame-native-dll.dll.sym&amp;lt;/code&amp;gt;. The build ID can be seen in the first few lines of dump_syms output in a line beginning with &amp;lt;code&amp;gt;MODULE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 3. Stack walk ===&lt;br /&gt;
Running the stack walk tool (located at &amp;lt;code&amp;gt;src/processor/minidump_stackwalk&amp;lt;/code&amp;gt;) will give the human-readable stack trace. Usage: &amp;lt;code&amp;gt;minidump_stackwalk &amp;lt;dump file&amp;gt; &amp;lt;symbol directory&amp;gt;&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Native_Client&amp;diff=8812</id>
		<title>Native Client</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Native_Client&amp;diff=8812"/>
				<updated>2025-01-16T09:29:39Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* Interactive Debugging */ breaking on crash actually works fine&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Native Client''' or '''NaCl''' is the current technology used for securely virtualizing the game code in the {{engine}}.&lt;br /&gt;
&lt;br /&gt;
It replaced the Q3VM (Quake3 Virtual Machine) in the engine.&lt;br /&gt;
&lt;br /&gt;
Unlike Q3VM for which the {{code|.qvm}} binaries were limited to be produced with the old C supported by the proprietary LCC compiler, the {{code|.nexe}} NaCl binaries can be compiled with Clang-based open source compilers supporting modern-enough C++ versions and allowing to reuse off-the-shelf C++ libraries that may even be shared between the engine and the game source code.&lt;br /&gt;
&lt;br /&gt;
Unlike QVMs, NaCl gamelogic runs in a secure sandbox. Native Client lets you run mods downloaded from the internet without giving them free reign on your computer. QVM was equivalent to running a DLL with no protection.&lt;br /&gt;
&lt;br /&gt;
The Native Client documentation can be found on [https://chrome.jscn.org/docs/native-client/welcome-to-native-client/ chrome.jscn.org/docs/native-client/welcome-to-native-client/].&lt;br /&gt;
&lt;br /&gt;
==Platforms==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Platform NaCl compatibility&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot; | Linux !! colspan=&amp;quot;2&amp;quot; | Windows !! colspan=&amp;quot;2&amp;quot; | macOS !! FreeBSD&lt;br /&gt;
|-&lt;br /&gt;
! amd64 || i686 || arm64 || armhf || amd64 || i686 || amd64 || arm64 || amd64&lt;br /&gt;
|-&lt;br /&gt;
| ✅️ native || ✅️ native || ☑️ through armhf&amp;lt;br/&amp;gt;compatibility || ✅️ native || ✅️ native || ✅️ native || ✅️ native || ☑️ through amd64&amp;lt;br/&amp;gt;compatibility || ☑️ through Linux&amp;lt;br/&amp;gt;compatibility&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The NaCl loader (the virtual machine running the virtualised code) is available for three systems: Linux, Windows and macOS. The supported architectures differs per system:&lt;br /&gt;
&lt;br /&gt;
* Linux: amd64, i686, armhf;&lt;br /&gt;
* Windows: amd64, i686;&lt;br /&gt;
* macOS: amd64.&lt;br /&gt;
&lt;br /&gt;
It is possible to run native engines with other platforms when there is a compatibility layer to run the NaCl loader:&lt;br /&gt;
&lt;br /&gt;
* Linux, arm64: running the armhf NaCl loader through built-in Linux 32-bit compatibility;&lt;br /&gt;
* macOS, arm64: running the amd64 NaCl loader through Rosetta2 compatibility;&lt;br /&gt;
* FreeBSD, amd64: running the Linux NaCl loader through built-in Linuxulator compatibility.&lt;br /&gt;
&lt;br /&gt;
The Linux armhf NaCl loader requires a 4k PageSize kernel:&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Unvanquished/Unvanquished/issues/3286&lt;br /&gt;
&lt;br /&gt;
The Linux i686 and armhf NaCl loaders may run on FreeBSD using Linuxulator but it is not tested.&lt;br /&gt;
&lt;br /&gt;
NaCl also supports 32-bit MIPS on Linux but this architecture is not supported by the {{engine}} and the {{game}} project.&lt;br /&gt;
&lt;br /&gt;
NaCl upstream development has slowed down since the competing solution [[WebAssembly]] became the industry standard, so it is very unlikely support for new systems and architecture would be added. To overcome this problem, we would have to switch to WebAssembly (that unfortunately also lacks support for some platforms NaCl supports, like i686 or armhf, but more importantly lacks support for exceptions or {{code|setjmp/longjmp}} and then isn't complete enough for our needs yet.&lt;br /&gt;
&lt;br /&gt;
==Compilers==&lt;br /&gt;
&lt;br /&gt;
===PNaCl Clang===&lt;br /&gt;
&lt;br /&gt;
PNaCl Clang is the current NaCl compiler we use to build the nexe game binaries. It is based on an old Clang 3.6 and does not support C++ above C++14. To overcome some of the related limitations we may switch to Saigo.&lt;br /&gt;
&lt;br /&gt;
The PNaCl compilation workflow is to build a single {{code|.pexe}} then to translate them to per-architecture {{code|.nexe}} (amd64, i686, armhf) using a specific translator tool.&lt;br /&gt;
&lt;br /&gt;
The PNaCl SDK consists on Python-based wrappers around Clang internals. It was initially using now-obsolete and hard-to-find Python2 but we ported it to Python3 to extend its lifespan.&lt;br /&gt;
&lt;br /&gt;
The provided PNaCl SDK runs on Linux, Windows and macOS systems, on amd64 architectures.&lt;br /&gt;
&lt;br /&gt;
While the {{code|.pexe}} compiler itself runs on FreeBSD with the Linuxulator, the translator does not, meaning it's not possible to build {{code|.nexe}} binaries on FreeBSD.&lt;br /&gt;
&lt;br /&gt;
PNaCl supports C++ exception. There exist newer PNaCl SDKs (from chromium canary releases) that do not support exceptions and may not provide more what we already have with latest stable PNaCl.&lt;br /&gt;
&lt;br /&gt;
===Saigo===&lt;br /&gt;
&lt;br /&gt;
Saigo is a new NaCl compiler based on latest Clang and supporting latest C++ standards. It compiles directly to {{code|.nexe}}.&lt;br /&gt;
&lt;br /&gt;
Unlike PNaCl, Saigo do not provide released binaries, meaning a switch to Saigo requires a convenient way to provide it to contributors.&lt;br /&gt;
&lt;br /&gt;
For now it has been successful to build an {{code|sgame.nexe}} (server game binary) with Saigo and run it, so with more efforts it may be possible to also build the {{code|cgame.exe}} (client game binary) as well and drop PNaCl.&lt;br /&gt;
&lt;br /&gt;
Google provides some nightly Linux amd64 Saigo toolchain snapshots that aren't easy to get without some Google scripts.&lt;br /&gt;
&lt;br /&gt;
The Saigo compiler and other related toolchain tools should build everywhere their upstream build, but only targeting the usual platforms, as the nacl_loader is basically the same: a more recent nacl_loader is also buildable but doesn't bring new platform supports.&lt;br /&gt;
&lt;br /&gt;
The Saigo compiler itself isn't hard to build (same as Clang itself), what is more complex is to get the toolchain and the libc/libc++ to build.&lt;br /&gt;
&lt;br /&gt;
Saigo may not support C++ exceptions as far as we know but supports {{code|setjmp/longjmp}}.&lt;br /&gt;
&lt;br /&gt;
Moving to Saigo is considered as a migration step that can be achievablebefore migrating to [[WebAssembly]], as it allows us to migrate to a new C++ standard and update libraries we use without waiting for the migration to WebAssembly.&lt;br /&gt;
&lt;br /&gt;
Some redesign of our CMake configuration for Saigo may help later when migrating to WebAssembly as it makes it more generic for different VM toolchains.&lt;br /&gt;
&lt;br /&gt;
Here is a GitHub issue about the ongoing efforts at migrating to Saigo:&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Unvanquished/Unvanquished/issues/3197&lt;br /&gt;
&lt;br /&gt;
The workspace for our attempt to rebuild and repackage Saigo is there:&lt;br /&gt;
&lt;br /&gt;
* https://github.com/DaemonEngine/DaemonSaigoNativeClientToolkit&lt;br /&gt;
&lt;br /&gt;
== Interactive Debugging ==&lt;br /&gt;
&lt;br /&gt;
Most of the time it is easiest to debug with a native DLL. But if you have a problem that cannot be reproduced outside of NaCl, you may be forced to resort to the following tutorial.&lt;br /&gt;
&lt;br /&gt;
These steps for attaching the NaCl debugger&amp;lt;ref&amp;gt;https://www.chromium.org/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/getting-started-with-debug-stub/&amp;lt;/ref&amp;gt; have been tested on Windows with a PNaCl toolchain. They should also work on binaries built with Saigo, using the old PNaCl GDB. On Linux or Mac you may experience more difficulties due to the lack of support for old binaries (meaning nacl-gdb). illwieckz reports that on amd64 Linux in 2025, using the old GDB which is a 32-bit binary, debugging an amd64 nexe does not work (despite the documentation's claims of debugger platform independence), but debugging an i686 nexe does.&lt;br /&gt;
&lt;br /&gt;
# Build the NaCl gamelogic with debugging symbols (build type Debug or RelWithDebInfo).&lt;br /&gt;
# Launch Daemon configured for NaCl debugging. For example, &amp;lt;code&amp;gt;./daemonded -set vm.sgame.type 1 -set vm.sgame.debug 1 +map chasm&amp;lt;/code&amp;gt; When the relevant gamelogic starts, the engine should pause and emit the message &amp;lt;code&amp;gt;Waiting for GDB connection on localhost:4014&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Start NaCl GDB, e.g. &amp;lt;code&amp;gt;daemon\external_deps\windows-amd64-mingw_10\nacl-gdb.exe&amp;lt;/code&amp;gt; This works better out of a command prompt rather than an MSYS window.&lt;br /&gt;
# Use the &amp;quot;file&amp;quot; command to tell the debugger where the binary with symbols is. For example, &amp;lt;code&amp;gt;file sgame-amd64.nexe&amp;lt;/code&amp;gt;&lt;br /&gt;
# OPTIONAL, probably a waste of time: load the IRT (Integrated Runtime) symbols: &amp;lt;code&amp;gt;nacl-irt irt_core-amd64.nexe&amp;lt;/code&amp;gt;&lt;br /&gt;
# Connect to the NaCl program with the command &amp;lt;code&amp;gt;target remote :4014&amp;lt;/code&amp;gt;&lt;br /&gt;
# You should see a message like &amp;lt;code&amp;gt;0x000000000ffc00a0 in ?? ()&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;0x000000000ffc00a0 in __pnacl_start ()&amp;lt;/code&amp;gt; if you did step 5). This means the program is paused at the beginning.&lt;br /&gt;
# Set some breakpoints, e.g. &amp;lt;code&amp;gt;b G_RunFrame&amp;lt;/code&amp;gt;. Alternatively, just wait for the debugger to break when the game crashes.&lt;br /&gt;
# Start the program by continuing (&amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Postmortem Debugging ==&lt;br /&gt;
&lt;br /&gt;
See [[Breakpad]].&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Native_Client&amp;diff=8811</id>
		<title>Native Client</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Native_Client&amp;diff=8811"/>
				<updated>2025-01-16T08:27:15Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: mention secure sandboxing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Native Client''' or '''NaCl''' is the current technology used for securely virtualizing the game code in the {{engine}}.&lt;br /&gt;
&lt;br /&gt;
It replaced the Q3VM (Quake3 Virtual Machine) in the engine.&lt;br /&gt;
&lt;br /&gt;
Unlike Q3VM for which the {{code|.qvm}} binaries were limited to be produced with the old C supported by the proprietary LCC compiler, the {{code|.nexe}} NaCl binaries can be compiled with Clang-based open source compilers supporting modern-enough C++ versions and allowing to reuse off-the-shelf C++ libraries that may even be shared between the engine and the game source code.&lt;br /&gt;
&lt;br /&gt;
Unlike QVMs, NaCl gamelogic runs in a secure sandbox. Native Client lets you run mods downloaded from the internet without giving them free reign on your computer. QVM was equivalent to running a DLL with no protection.&lt;br /&gt;
&lt;br /&gt;
The Native Client documentation can be found on [https://chrome.jscn.org/docs/native-client/welcome-to-native-client/ chrome.jscn.org/docs/native-client/welcome-to-native-client/].&lt;br /&gt;
&lt;br /&gt;
==Platforms==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Platform NaCl compatibility&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot; | Linux !! colspan=&amp;quot;2&amp;quot; | Windows !! colspan=&amp;quot;2&amp;quot; | macOS !! FreeBSD&lt;br /&gt;
|-&lt;br /&gt;
! amd64 || i686 || arm64 || armhf || amd64 || i686 || amd64 || arm64 || amd64&lt;br /&gt;
|-&lt;br /&gt;
| ✅️ native || ✅️ native || ☑️ through armhf&amp;lt;br/&amp;gt;compatibility || ✅️ native || ✅️ native || ✅️ native || ✅️ native || ☑️ through amd64&amp;lt;br/&amp;gt;compatibility || ☑️ through Linux&amp;lt;br/&amp;gt;compatibility&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The NaCl loader (the virtual machine running the virtualised code) is available for three systems: Linux, Windows and macOS. The supported architectures differs per system:&lt;br /&gt;
&lt;br /&gt;
* Linux: amd64, i686, armhf;&lt;br /&gt;
* Windows: amd64, i686;&lt;br /&gt;
* macOS: amd64.&lt;br /&gt;
&lt;br /&gt;
It is possible to run native engines with other platforms when there is a compatibility layer to run the NaCl loader:&lt;br /&gt;
&lt;br /&gt;
* Linux, arm64: running the armhf NaCl loader through built-in Linux 32-bit compatibility;&lt;br /&gt;
* macOS, arm64: running the amd64 NaCl loader through Rosetta2 compatibility;&lt;br /&gt;
* FreeBSD, amd64: running the Linux NaCl loader through built-in Linuxulator compatibility.&lt;br /&gt;
&lt;br /&gt;
The Linux armhf NaCl loader requires a 4k PageSize kernel:&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Unvanquished/Unvanquished/issues/3286&lt;br /&gt;
&lt;br /&gt;
The Linux i686 and armhf NaCl loaders may run on FreeBSD using Linuxulator but it is not tested.&lt;br /&gt;
&lt;br /&gt;
NaCl also supports 32-bit MIPS on Linux but this architecture is not supported by the {{engine}} and the {{game}} project.&lt;br /&gt;
&lt;br /&gt;
NaCl upstream development has slowed down since the competing solution [[WebAssembly]] became the industry standard, so it is very unlikely support for new systems and architecture would be added. To overcome this problem, we would have to switch to WebAssembly (that unfortunately also lacks support for some platforms NaCl supports, like i686 or armhf, but more importantly lacks support for exceptions or {{code|setjmp/longjmp}} and then isn't complete enough for our needs yet.&lt;br /&gt;
&lt;br /&gt;
==Compilers==&lt;br /&gt;
&lt;br /&gt;
===PNaCl Clang===&lt;br /&gt;
&lt;br /&gt;
PNaCl Clang is the current NaCl compiler we use to build the nexe game binaries. It is based on an old Clang 3.6 and does not support C++ above C++14. To overcome some of the related limitations we may switch to Saigo.&lt;br /&gt;
&lt;br /&gt;
The PNaCl compilation workflow is to build a single {{code|.pexe}} then to translate them to per-architecture {{code|.nexe}} (amd64, i686, armhf) using a specific translator tool.&lt;br /&gt;
&lt;br /&gt;
The PNaCl SDK consists on Python-based wrappers around Clang internals. It was initially using now-obsolete and hard-to-find Python2 but we ported it to Python3 to extend its lifespan.&lt;br /&gt;
&lt;br /&gt;
The provided PNaCl SDK runs on Linux, Windows and macOS systems, on amd64 architectures.&lt;br /&gt;
&lt;br /&gt;
While the {{code|.pexe}} compiler itself runs on FreeBSD with the Linuxulator, the translator does not, meaning it's not possible to build {{code|.nexe}} binaries on FreeBSD.&lt;br /&gt;
&lt;br /&gt;
PNaCl supports C++ exception. There exist newer PNaCl SDKs (from chromium canary releases) that do not support exceptions and may not provide more what we already have with latest stable PNaCl.&lt;br /&gt;
&lt;br /&gt;
===Saigo===&lt;br /&gt;
&lt;br /&gt;
Saigo is a new NaCl compiler based on latest Clang and supporting latest C++ standards. It compiles directly to {{code|.nexe}}.&lt;br /&gt;
&lt;br /&gt;
Unlike PNaCl, Saigo do not provide released binaries, meaning a switch to Saigo requires a convenient way to provide it to contributors.&lt;br /&gt;
&lt;br /&gt;
For now it has been successful to build an {{code|sgame.nexe}} (server game binary) with Saigo and run it, so with more efforts it may be possible to also build the {{code|cgame.exe}} (client game binary) as well and drop PNaCl.&lt;br /&gt;
&lt;br /&gt;
Google provides some nightly Linux amd64 Saigo toolchain snapshots that aren't easy to get without some Google scripts.&lt;br /&gt;
&lt;br /&gt;
The Saigo compiler and other related toolchain tools should build everywhere their upstream build, but only targeting the usual platforms, as the nacl_loader is basically the same: a more recent nacl_loader is also buildable but doesn't bring new platform supports.&lt;br /&gt;
&lt;br /&gt;
The Saigo compiler itself isn't hard to build (same as Clang itself), what is more complex is to get the toolchain and the libc/libc++ to build.&lt;br /&gt;
&lt;br /&gt;
Saigo may not support C++ exceptions as far as we know but supports {{code|setjmp/longjmp}}.&lt;br /&gt;
&lt;br /&gt;
Moving to Saigo is considered as a migration step that can be achievablebefore migrating to [[WebAssembly]], as it allows us to migrate to a new C++ standard and update libraries we use without waiting for the migration to WebAssembly.&lt;br /&gt;
&lt;br /&gt;
Some redesign of our CMake configuration for Saigo may help later when migrating to WebAssembly as it makes it more generic for different VM toolchains.&lt;br /&gt;
&lt;br /&gt;
Here is a GitHub issue about the ongoing efforts at migrating to Saigo:&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Unvanquished/Unvanquished/issues/3197&lt;br /&gt;
&lt;br /&gt;
The workspace for our attempt to rebuild and repackage Saigo is there:&lt;br /&gt;
&lt;br /&gt;
* https://github.com/DaemonEngine/DaemonSaigoNativeClientToolkit&lt;br /&gt;
&lt;br /&gt;
== Interactive Debugging ==&lt;br /&gt;
&lt;br /&gt;
Most of the time it is easiest to debug with a native DLL. But if you have a problem that cannot be reproduced outside of NaCl, you may be forced to resort to the following tutorial.&lt;br /&gt;
&lt;br /&gt;
These steps for attaching the NaCl debugger&amp;lt;ref&amp;gt;https://www.chromium.org/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/getting-started-with-debug-stub/&amp;lt;/ref&amp;gt; have been tested on Windows with a PNaCl toolchain. They should also work on binaries built with Saigo, using the old PNaCl GDB. On Linux or Mac you may experience more difficulties due to the lack of support for old binaries (meaning nacl-gdb). illwieckz reports that on amd64 Linux in 2025, using the old GDB which is a 32-bit binary, debugging an amd64 nexe does not work (despite the documentation's claims of debugger platform independence), but debugging an i686 nexe does.&lt;br /&gt;
&lt;br /&gt;
# Build the NaCl gamelogic with debugging symbols (build type Debug or RelWithDebInfo).&lt;br /&gt;
# Launch Daemon configured for NaCl debugging. For example, &amp;lt;code&amp;gt;./daemonded -set vm.sgame.type 1 -set vm.sgame.debug 1 +map chasm&amp;lt;/code&amp;gt; When the relevant gamelogic starts, the engine should pause and emit the message &amp;lt;code&amp;gt;Waiting for GDB connection on localhost:4014&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Start NaCl GDB, e.g. &amp;lt;code&amp;gt;daemon\external_deps\windows-amd64-mingw_10\nacl-gdb.exe&amp;lt;/code&amp;gt; This works better out of a command prompt rather than an MSYS window.&lt;br /&gt;
# Use the &amp;quot;file&amp;quot; command to tell the debugger where the binary with symbols is. For example, &amp;lt;code&amp;gt;file sgame-amd64.nexe&amp;lt;/code&amp;gt;&lt;br /&gt;
# OPTIONAL, probably a waste of time: load the IRT (Integrated Runtime) symbols: &amp;lt;code&amp;gt;nacl-irt irt_core-amd64.nexe&amp;lt;/code&amp;gt;&lt;br /&gt;
# Connect to the NaCl program with the command &amp;lt;code&amp;gt;target remote :4014&amp;lt;/code&amp;gt;&lt;br /&gt;
# You should see a message like &amp;lt;code&amp;gt;0x000000000ffc00a0 in ?? ()&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;0x000000000ffc00a0 in __pnacl_start ()&amp;lt;/code&amp;gt; if you did step 5). This means the program is paused at the beginning.&lt;br /&gt;
# Set some breakpoints, e.g. &amp;lt;code&amp;gt;b G_RunFrame&amp;lt;/code&amp;gt;&lt;br /&gt;
# Start the program by continuing (&amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Caveat: the debugger does NOT catch fatal errors like segmentation fault or division by 0. You will have to rely on postmortem debugging for that.&lt;br /&gt;
&lt;br /&gt;
== Postmortem Debugging ==&lt;br /&gt;
&lt;br /&gt;
See [[Breakpad]].&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Native_Client&amp;diff=8810</id>
		<title>Native Client</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Native_Client&amp;diff=8810"/>
				<updated>2025-01-16T08:21:36Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* Interactive Debugging */ update with illwieckz's findings&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Native Client''' or '''NaCl''' is the current technology used for virtualizing the game code in the {{engine}}.&lt;br /&gt;
&lt;br /&gt;
It replaced the Q3VM (Quake3 Virtual Machine) in the engine.&lt;br /&gt;
&lt;br /&gt;
Unlike Q3VM for which the {{code|.qvm}} binaries were limited to be produced with the old C supported by the proprietary LCC compiler, the {{code|.nexe}} NaCl binaries can be compiled with Clang-based open source compilers supporting modern-enough C++ versions and allowing to reuse off-the-shelf C++ libraries that may even be shared between the engine and the game source code.&lt;br /&gt;
&lt;br /&gt;
The Native Client documentation can be found on [https://chrome.jscn.org/docs/native-client/welcome-to-native-client/ chrome.jscn.org/docs/native-client/welcome-to-native-client/].&lt;br /&gt;
&lt;br /&gt;
==Platforms==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Platform NaCl compatibility&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot; | Linux !! colspan=&amp;quot;2&amp;quot; | Windows !! colspan=&amp;quot;2&amp;quot; | macOS !! FreeBSD&lt;br /&gt;
|-&lt;br /&gt;
! amd64 || i686 || arm64 || armhf || amd64 || i686 || amd64 || arm64 || amd64&lt;br /&gt;
|-&lt;br /&gt;
| ✅️ native || ✅️ native || ☑️ through armhf&amp;lt;br/&amp;gt;compatibility || ✅️ native || ✅️ native || ✅️ native || ✅️ native || ☑️ through amd64&amp;lt;br/&amp;gt;compatibility || ☑️ through Linux&amp;lt;br/&amp;gt;compatibility&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The NaCl loader (the virtual machine running the virtualised code) is available for three systems: Linux, Windows and macOS. The supported architectures differs per system:&lt;br /&gt;
&lt;br /&gt;
* Linux: amd64, i686, armhf;&lt;br /&gt;
* Windows: amd64, i686;&lt;br /&gt;
* macOS: amd64.&lt;br /&gt;
&lt;br /&gt;
It is possible to run native engines with other platforms when there is a compatibility layer to run the NaCl loader:&lt;br /&gt;
&lt;br /&gt;
* Linux, arm64: running the armhf NaCl loader through built-in Linux 32-bit compatibility;&lt;br /&gt;
* macOS, arm64: running the amd64 NaCl loader through Rosetta2 compatibility;&lt;br /&gt;
* FreeBSD, amd64: running the Linux NaCl loader through built-in Linuxulator compatibility.&lt;br /&gt;
&lt;br /&gt;
The Linux armhf NaCl loader requires a 4k PageSize kernel:&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Unvanquished/Unvanquished/issues/3286&lt;br /&gt;
&lt;br /&gt;
The Linux i686 and armhf NaCl loaders may run on FreeBSD using Linuxulator but it is not tested.&lt;br /&gt;
&lt;br /&gt;
NaCl also supports 32-bit MIPS on Linux but this architecture is not supported by the {{engine}} and the {{game}} project.&lt;br /&gt;
&lt;br /&gt;
NaCl upstream development has slowed down since the competing solution [[WebAssembly]] became the industry standard, so it is very unlikely support for new systems and architecture would be added. To overcome this problem, we would have to switch to WebAssembly (that unfortunately also lacks support for some platforms NaCl supports, like i686 or armhf, but more importantly lacks support for exceptions or {{code|setjmp/longjmp}} and then isn't complete enough for our needs yet.&lt;br /&gt;
&lt;br /&gt;
==Compilers==&lt;br /&gt;
&lt;br /&gt;
===PNaCl Clang===&lt;br /&gt;
&lt;br /&gt;
PNaCl Clang is the current NaCl compiler we use to build the nexe game binaries. It is based on an old Clang 3.6 and does not support C++ above C++14. To overcome some of the related limitations we may switch to Saigo.&lt;br /&gt;
&lt;br /&gt;
The PNaCl compilation workflow is to build a single {{code|.pexe}} then to translate them to per-architecture {{code|.nexe}} (amd64, i686, armhf) using a specific translator tool.&lt;br /&gt;
&lt;br /&gt;
The PNaCl SDK consists on Python-based wrappers around Clang internals. It was initially using now-obsolete and hard-to-find Python2 but we ported it to Python3 to extend its lifespan.&lt;br /&gt;
&lt;br /&gt;
The provided PNaCl SDK runs on Linux, Windows and macOS systems, on amd64 architectures.&lt;br /&gt;
&lt;br /&gt;
While the {{code|.pexe}} compiler itself runs on FreeBSD with the Linuxulator, the translator does not, meaning it's not possible to build {{code|.nexe}} binaries on FreeBSD.&lt;br /&gt;
&lt;br /&gt;
PNaCl supports C++ exception. There exist newer PNaCl SDKs (from chromium canary releases) that do not support exceptions and may not provide more what we already have with latest stable PNaCl.&lt;br /&gt;
&lt;br /&gt;
===Saigo===&lt;br /&gt;
&lt;br /&gt;
Saigo is a new NaCl compiler based on latest Clang and supporting latest C++ standards. It compiles directly to {{code|.nexe}}.&lt;br /&gt;
&lt;br /&gt;
Unlike PNaCl, Saigo do not provide released binaries, meaning a switch to Saigo requires a convenient way to provide it to contributors.&lt;br /&gt;
&lt;br /&gt;
For now it has been successful to build an {{code|sgame.nexe}} (server game binary) with Saigo and run it, so with more efforts it may be possible to also build the {{code|cgame.exe}} (client game binary) as well and drop PNaCl.&lt;br /&gt;
&lt;br /&gt;
Google provides some nightly Linux amd64 Saigo toolchain snapshots that aren't easy to get without some Google scripts.&lt;br /&gt;
&lt;br /&gt;
The Saigo compiler and other related toolchain tools should build everywhere their upstream build, but only targeting the usual platforms, as the nacl_loader is basically the same: a more recent nacl_loader is also buildable but doesn't bring new platform supports.&lt;br /&gt;
&lt;br /&gt;
The Saigo compiler itself isn't hard to build (same as Clang itself), what is more complex is to get the toolchain and the libc/libc++ to build.&lt;br /&gt;
&lt;br /&gt;
Saigo may not support C++ exceptions as far as we know but supports {{code|setjmp/longjmp}}.&lt;br /&gt;
&lt;br /&gt;
Moving to Saigo is considered as a migration step that can be achievablebefore migrating to [[WebAssembly]], as it allows us to migrate to a new C++ standard and update libraries we use without waiting for the migration to WebAssembly.&lt;br /&gt;
&lt;br /&gt;
Some redesign of our CMake configuration for Saigo may help later when migrating to WebAssembly as it makes it more generic for different VM toolchains.&lt;br /&gt;
&lt;br /&gt;
Here is a GitHub issue about the ongoing efforts at migrating to Saigo:&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Unvanquished/Unvanquished/issues/3197&lt;br /&gt;
&lt;br /&gt;
The workspace for our attempt to rebuild and repackage Saigo is there:&lt;br /&gt;
&lt;br /&gt;
* https://github.com/DaemonEngine/DaemonSaigoNativeClientToolkit&lt;br /&gt;
&lt;br /&gt;
== Interactive Debugging ==&lt;br /&gt;
&lt;br /&gt;
Most of the time it is easiest to debug with a native DLL. But if you have a problem that cannot be reproduced outside of NaCl, you may be forced to resort to the following tutorial.&lt;br /&gt;
&lt;br /&gt;
These steps for attaching the NaCl debugger&amp;lt;ref&amp;gt;https://www.chromium.org/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/getting-started-with-debug-stub/&amp;lt;/ref&amp;gt; have been tested on Windows with a PNaCl toolchain. They should also work on binaries built with Saigo, using the old PNaCl GDB. On Linux or Mac you may experience more difficulties due to the lack of support for old binaries (meaning nacl-gdb). illwieckz reports that on amd64 Linux in 2025, using the old GDB which is a 32-bit binary, debugging an amd64 nexe does not work (despite the documentation's claims of debugger platform independence), but debugging an i686 nexe does.&lt;br /&gt;
&lt;br /&gt;
# Build the NaCl gamelogic with debugging symbols (build type Debug or RelWithDebInfo).&lt;br /&gt;
# Launch Daemon configured for NaCl debugging. For example, &amp;lt;code&amp;gt;./daemonded -set vm.sgame.type 1 -set vm.sgame.debug 1 +map chasm&amp;lt;/code&amp;gt; When the relevant gamelogic starts, the engine should pause and emit the message &amp;lt;code&amp;gt;Waiting for GDB connection on localhost:4014&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Start NaCl GDB, e.g. &amp;lt;code&amp;gt;daemon\external_deps\windows-amd64-mingw_10\nacl-gdb.exe&amp;lt;/code&amp;gt; This works better out of a command prompt rather than an MSYS window.&lt;br /&gt;
# Use the &amp;quot;file&amp;quot; command to tell the debugger where the binary with symbols is. For example, &amp;lt;code&amp;gt;file sgame-amd64.nexe&amp;lt;/code&amp;gt;&lt;br /&gt;
# OPTIONAL, probably a waste of time: load the IRT (Integrated Runtime) symbols: &amp;lt;code&amp;gt;nacl-irt irt_core-amd64.nexe&amp;lt;/code&amp;gt;&lt;br /&gt;
# Connect to the NaCl program with the command &amp;lt;code&amp;gt;target remote :4014&amp;lt;/code&amp;gt;&lt;br /&gt;
# You should see a message like &amp;lt;code&amp;gt;0x000000000ffc00a0 in ?? ()&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;0x000000000ffc00a0 in __pnacl_start ()&amp;lt;/code&amp;gt; if you did step 5). This means the program is paused at the beginning.&lt;br /&gt;
# Set some breakpoints, e.g. &amp;lt;code&amp;gt;b G_RunFrame&amp;lt;/code&amp;gt;&lt;br /&gt;
# Start the program by continuing (&amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Caveat: the debugger does NOT catch fatal errors like segmentation fault or division by 0. You will have to rely on postmortem debugging for that.&lt;br /&gt;
&lt;br /&gt;
== Postmortem Debugging ==&lt;br /&gt;
&lt;br /&gt;
See [[Breakpad]].&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Native_Client&amp;diff=8807</id>
		<title>Native Client</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Native_Client&amp;diff=8807"/>
				<updated>2025-01-16T05:40:17Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: nacl debugging tutorial&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Native Client''' or '''NaCl''' is the current technology used for virtualizing the game code in the {{engine}}.&lt;br /&gt;
&lt;br /&gt;
It replaced the Q3VM (Quake3 Virtual Machine) in the engine.&lt;br /&gt;
&lt;br /&gt;
Unlike Q3VM for which the {{code|.qvm}} binaries were limited to be produced with the old C supported by the proprietary LCC compiler, the {{code|.nexe}} NaCl binaries can be compiled with Clang-based open source compilers supporting modern-enough C++ versions and allowing to reuse off-the-shelf C++ libraries that may even be shared between the engine and the game source code.&lt;br /&gt;
&lt;br /&gt;
The Native Client documentation can be found on [https://chrome.jscn.org/docs/native-client/welcome-to-native-client/ chrome.jscn.org/docs/native-client/welcome-to-native-client/].&lt;br /&gt;
&lt;br /&gt;
==Platforms==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Platform NaCl compatibility&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot; | Linux !! colspan=&amp;quot;2&amp;quot; | Windows !! colspan=&amp;quot;2&amp;quot; | macOS !! FreeBSD&lt;br /&gt;
|-&lt;br /&gt;
! amd64 || i686 || arm64 || armhf || amd64 || i686 || amd64 || arm64 || amd64&lt;br /&gt;
|-&lt;br /&gt;
| ✅️ native || ✅️ native || ☑️ through armhf&amp;lt;br/&amp;gt;compatibility || ✅️ native || ✅️ native || ✅️ native || ✅️ native || ☑️ through amd64&amp;lt;br/&amp;gt;compatibility || ☑️ through Linux&amp;lt;br/&amp;gt;compatibility&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The NaCl loader (the virtual machine running the virtualized code) is available for three systems: Linux, Windows and macOS. The supported architectures differs per system:&lt;br /&gt;
&lt;br /&gt;
* Linux:&lt;br /&gt;
** amd64,&lt;br /&gt;
** i686,&lt;br /&gt;
** armhf;&lt;br /&gt;
* Windows&lt;br /&gt;
** amd64,&lt;br /&gt;
** i686;&lt;br /&gt;
* macOS:&lt;br /&gt;
** amd64.&lt;br /&gt;
&lt;br /&gt;
It is possible to run native engines with other platforms when there is a compatibility layer to run the NaCl loader:&lt;br /&gt;
&lt;br /&gt;
* Linux:&lt;br /&gt;
** arm64, running the armhf NaCl loader through built-in Linux 32-bit compatibility;&lt;br /&gt;
* macOS:&lt;br /&gt;
** arm64, running the amd64 NaCl loader through Rosetta2 compatibility.&lt;br /&gt;
* FreeBSD:&lt;br /&gt;
** amd64, running the Linux NaCl loader through built-in Linuxulator compatibility.&lt;br /&gt;
&lt;br /&gt;
The Linux i686 and armhf NaCl loaders may run on FreeBSD using Linuxulator but it is not tested.&lt;br /&gt;
&lt;br /&gt;
NaCl upstream development has slowed down since the competing solution [[WebAssembly]] became the industry standard, so it is very unlikely support for new systems and architecture would be added. To overcome this problem, we would have to switch to WebAssembly (that unfortunately also lacks support for some platforms NaCl supports, like i686 or armhf).&lt;br /&gt;
&lt;br /&gt;
NaCl also supports 32-bit MIPS on Linux but this architecture is not supported by the {{engine}} and the {{game}} project.&lt;br /&gt;
&lt;br /&gt;
==Compilers==&lt;br /&gt;
&lt;br /&gt;
===PNaCl===&lt;br /&gt;
&lt;br /&gt;
PNaCl is the current NaCl compiler we use to build the nexe game binaries. It is based on an old Clang 3.6 and does not support C++ above C++14. To overcome some of the related limitations we may switch to Saigo.&lt;br /&gt;
&lt;br /&gt;
The PNaCl compilation workflow is to build a single {{code|.pexe}} then to translate them to per-architecture {{code|.nexe}} (amd64, i686, armhf) using a specific translator tool.&lt;br /&gt;
&lt;br /&gt;
The PNaCl SDK consists on Python-based wrappers around Clang internals. It was initially using now-obsolete and hard-to-find Python2 but we ported it to Python3 to extend its lifespan.&lt;br /&gt;
&lt;br /&gt;
The provided PNaCl SDK runs on Linux, Windows and macOS systems, on amd64 architectures.&lt;br /&gt;
&lt;br /&gt;
While the {{code|.pexe}} compiler itself runs on FreeBSD with the Linuxulator, the translator does not, meaning it's not possible to build {{code|.nexe}} binaries on FreeBSD.&lt;br /&gt;
&lt;br /&gt;
PNaCl supports C++ exception. There exist newer PNaCl SDKs (from chromium canary releases) that do not support exceptions and may not provide more what we already have with latest stable PNaCl.&lt;br /&gt;
&lt;br /&gt;
===Saigo===&lt;br /&gt;
&lt;br /&gt;
Saigo is a new NaCl compiler based on latest Clang and supporting latest C++ standards. It compiles directly to {{code|.nexe}}.&lt;br /&gt;
&lt;br /&gt;
Unlike PNaCl, Saigo do not provide released binaries, meaning a switch to Saigo requires a convenient way to provide it to contributors.&lt;br /&gt;
&lt;br /&gt;
For now it has been successful to build an {{code|sgame.nexe}} (server game binary) with Saigo and run it, so with more efforts it may be possible to also build the {{code|cgame.exe}} (client game binary) as well and drop PNaCl.&lt;br /&gt;
&lt;br /&gt;
Google provides some nightly Linux amd64 Saigo toolchain snapshots that aren't easy to get without some Google scripts.&lt;br /&gt;
&lt;br /&gt;
The Saigo compiler and other related toolchain tools should build everywhere their upstream build, but only targeting the usual platforms, as the nacl_loader is basically the same: a more recent nacl_loader is also buildable but doesn't bring new platform supports.&lt;br /&gt;
&lt;br /&gt;
The Saigo compiler itself isn't hard to build (same as Clang itself), what is more complex is to get the toolchain and the libc/libc++ to build.&lt;br /&gt;
&lt;br /&gt;
Saigo may not support C++ exceptions as far as we know.&lt;br /&gt;
&lt;br /&gt;
Moving to Saigo can be considered as a first step before migrating to [[WebAssembly]], as it would allow us to migrate to a new C++ standard before migrating to WebAssembly, and the redesign of our CMake configuration for Saigo may help later when migrating to WebAssembly.&lt;br /&gt;
&lt;br /&gt;
Here is a GitHub issue about the ongoing efforts at migrating to Saigo:&lt;br /&gt;
&lt;br /&gt;
* https://github.com/DaemonEngine/Daemon/issues/795&lt;br /&gt;
&lt;br /&gt;
== Interactive Debugging ==&lt;br /&gt;
&lt;br /&gt;
Most of the time it is easiest to debug with a native DLL. But if you have a problem that cannot be reproduced outside of NaCl, you may be forced to resort to the following tutorial.&lt;br /&gt;
&lt;br /&gt;
These steps for attaching the NaCl debugger&amp;lt;ref&amp;gt;https://www.chromium.org/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/getting-started-with-debug-stub/&amp;lt;/ref&amp;gt; have been tested on Windows with a PNaCl toolchain. It is not yet known whether the Saigo toolchain admits any interactive debugging. On Linux or Mac you may experience more difficulties due to the lack of support for old binaries (meaning nacl-gdb).&lt;br /&gt;
&lt;br /&gt;
# Build the NaCl gamelogic with debugging symbols (build type Debug or RelWithDebInfo).&lt;br /&gt;
# Launch Daemon configured for NaCl debugging. For example, &amp;lt;code&amp;gt;./daemonded -set vm.sgame.type 1 -set vm.sgame.debug 1 +map chasm&amp;lt;/code&amp;gt; When the relevant gamelogic starts, the engine should pause and emit the message &amp;lt;code&amp;gt;Waiting for GDB connection on localhost:4014&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Start NaCl GDB, e.g. &amp;lt;code&amp;gt;daemon\external_deps\windows-amd64-mingw_10\nacl-gdb.exe&amp;lt;/code&amp;gt; This works better out of a command prompt rather than an MSYS window.&lt;br /&gt;
# Use the &amp;quot;file&amp;quot; command to tell the debugger where the binary with symbols is. For example, &amp;lt;code&amp;gt;file sgame-amd64.nexe&amp;lt;/code&amp;gt;&lt;br /&gt;
# OPTIONAL, probably a waste of time: load the IRT (Integrated Runtime) symbols: &amp;lt;code&amp;gt;nacl-irt irt_core-amd64.nexe&amp;lt;/code&amp;gt;&lt;br /&gt;
# Connect to the NaCl program with the command &amp;lt;code&amp;gt;target remote :4014&amp;lt;/code&amp;gt;&lt;br /&gt;
# You should see a message like &amp;lt;code&amp;gt;0x000000000ffc00a0 in ?? ()&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;0x000000000ffc00a0 in __pnacl_start ()&amp;lt;/code&amp;gt; if you did step 5). This means the program is paused at the beginning.&lt;br /&gt;
# Set some breakpoints, e.g. &amp;lt;code&amp;gt;b G_RunFrame&amp;lt;/code&amp;gt;&lt;br /&gt;
# Start the program by continuing (&amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Caveat: the debugger does NOT catch fatal errors like segmentation fault or division by 0. You will have to rely on postmortem debugging for that.&lt;br /&gt;
&lt;br /&gt;
== Postmortem Debugging ==&lt;br /&gt;
&lt;br /&gt;
See [[Breakpad]].&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Formats/Trail&amp;diff=8806</id>
		<title>Formats/Trail</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Formats/Trail&amp;diff=8806"/>
				<updated>2025-01-09T04:29:39Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: link trail-keyword-directory&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Formats]]&lt;br /&gt;
[[Category:Mapping]]&lt;br /&gt;
Trail effects work the same as Tremulous. Please see the [https://web.archive.org/web/20200416190204/http://tremulous.net/manual/#x1-140003.3 Tremulous documentation] ([https://dl.unvanquished.net/docs/20060317-000.tremulous-manual.pdf pdf]) for information on creating particle effects for now.&lt;br /&gt;
&lt;br /&gt;
Trail format is game-specific (mods may modify it).&lt;br /&gt;
&lt;br /&gt;
To look for examples of how some trail feature is used, you may use this [https://users.unvanquished.net/~slipher/trail-keyword-directory.txt trail keyword directory].&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Formats/Particle&amp;diff=8805</id>
		<title>Formats/Particle</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Formats/Particle&amp;diff=8805"/>
				<updated>2025-01-09T04:27:50Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: link particle-keyword-directory&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Formats]]&lt;br /&gt;
[[Category:Mapping]]&lt;br /&gt;
Particle effects work differently than in Quake 3 but the same as Tremulous. Please see the [https://web.archive.org/web/20200416190204/http://tremulous.net/manual/#x1-130003.2 Tremulous documentation] ([https://dl.unvanquished.net/docs/20060317-000.tremulous-manual.pdf pdf]) for information on creating particle effects for now.&lt;br /&gt;
&lt;br /&gt;
Particle format is game-specific (mods may modify it).&lt;br /&gt;
&lt;br /&gt;
To look for examples of how some particle feature is used, you may use this [https://users.unvanquished.net/~slipher/particle-keyword-directory.txt particle keyword directory].&lt;br /&gt;
&lt;br /&gt;
There is a [https://www.quake3world.com/forum/viewtopic.php?t=37893 particle effects editor] for Quake 3 that will likely need much modification to work with the Tremulous-style particle effects system. Source code is available from [https://github.com/FS-NulL/New-Quake-3-Particle-Studio GitHub]. A very brief tutorial on its usage by Frozen Sand (creators of Urban Terror) is [https://www.moddb.com/games/world-of-padman/downloads/frozen-sand-particle-studio-v10 also available].&lt;br /&gt;
&lt;br /&gt;
An older particle effects editor (not updated in many years) was also available. Dead link: &amp;lt;s&amp;gt;http://www.mods-r-us.net/freebrief/q3a/ps/index.html&amp;lt;/s&amp;gt;&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Continuous_integration&amp;diff=8790</id>
		<title>Continuous integration</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Continuous_integration&amp;diff=8790"/>
				<updated>2024-11-19T12:14:35Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: macos image bump&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Infrastructure]]&lt;br /&gt;
Continuous integration (CI) refers to the automated builds that run each time someone opens or modifies a pull request against, or modifies the code of, the Unvanquished and Daemon source code repositories on GitHub.&lt;br /&gt;
&lt;br /&gt;
We use the following CI services:&lt;br /&gt;
* Appveyor, for building with MSVC on Windows. Its configuration is found in the file {{code|.appveyor.yml}} in the repository root.&lt;br /&gt;
* Azure Pipelines. Its configuration is found in the file {{code|azure-pipelines.yml}} in the repository root. It handles Mac native builds on [https://github.com/actions/virtual-environments/blob/main/images/macos/macos-14-Readme.md macOS 14.x] and Linux native and NaCl builds on [https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2004-Readme.md Ubuntu 20.04] (Focal).&lt;br /&gt;
* GitHub CodeQL. Its configuration is found in the file {{code|.github/workflows/codeql.yml}} in the repository. Its purpose is to scan the source code for vulnerabilities, and for that purpose it starts by building the source tree using the latest LTS Ubuntu distribution provided by the platform ([https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2004-Readme.md Ubuntu 22.04]) and the default compiler of this platform.&lt;br /&gt;
&lt;br /&gt;
In some Daemon builds, we run the unit tests. These builds have been configured to use the Release configuration so that the unit tests are closer to production builds. &lt;br /&gt;
&lt;br /&gt;
== Build matrix ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! colspan=&amp;quot;9&amp;quot; | {{engine}}&lt;br /&gt;
|-&lt;br /&gt;
! Service&lt;br /&gt;
! Host&lt;br /&gt;
! Target&lt;br /&gt;
! Compiler&lt;br /&gt;
! Generator&lt;br /&gt;
! Build Type&lt;br /&gt;
! WERROR&lt;br /&gt;
! PCH&lt;br /&gt;
! Unit tests&lt;br /&gt;
|-&lt;br /&gt;
| Appveyor || Windows amd64 || Windows amd64 || VS 2019 || Visual Studio || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Appveyor || Windows amd64 || Windows i686 || VS 2019 || Visual Studio || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Windows amd64 || MinGW 9.3 || Ninja || Debug || Yes || No || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 || GCC 9.4 || Ninja || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 || Clang 11.0 || Ninja || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || macOS-14 amd64 || macOS amd64 || AppleClang 15.0 || Make || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| GitHub Actions CodeQL || ubuntu-latest || Linux amd64 || GCC (floating) || Ninja || Release || No || Yes || No&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
! colspan=&amp;quot;8&amp;quot; | {{game}}&lt;br /&gt;
|-&lt;br /&gt;
! Service&lt;br /&gt;
! Host&lt;br /&gt;
! Target&lt;br /&gt;
! Compiler&lt;br /&gt;
! Generator&lt;br /&gt;
! Build Type&lt;br /&gt;
! WERROR&lt;br /&gt;
! PCH&lt;br /&gt;
|-&lt;br /&gt;
| Appveyor || Windows amd64 || Windows i686 DLL || VS 2019 || NMake || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 DLL || GCC 8.4 || Ninja || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 DLL || Clang 11.0 || Ninja || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || NaCl all NEXE || PNaCl Clang 3.6 || Ninja || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || macOS-14 amd64 || macOS amd64 DLL || AppleClang 15.0 || Make || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| GitHub Actions CodeQL || ubuntu-latest || Linux amd64 DLL+EXE || GCC (floating) || Ninja || Release || No || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
“WERROR” indicates whether the {{code|USE_WERROR}} option is on, which gives a failing building build status if there are warnings in our code. Note that {{code|USE_WERROR}} only applies to ”our” code in {{code|src/}}, so you may still see warnings from stuff in {{code|libs/}}.&lt;br /&gt;
&lt;br /&gt;
“PCH” indicates whether the precompiled header is enabled.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Continuous_integration&amp;diff=8789</id>
		<title>Continuous integration</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Continuous_integration&amp;diff=8789"/>
				<updated>2024-11-19T00:02:13Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* Build matrix */ Unvanquished macos bump&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Infrastructure]]&lt;br /&gt;
Continuous integration (CI) refers to the automated builds that run each time someone opens or modifies a pull request against, or modifies the code of, the Unvanquished and Daemon source code repositories on GitHub.&lt;br /&gt;
&lt;br /&gt;
We use the following CI services:&lt;br /&gt;
* Appveyor, for building with MSVC on Windows. Its configuration is found in the file {{code|.appveyor.yml}} in the repository root.&lt;br /&gt;
* Azure Pipelines. Its configuration is found in the file {{code|azure-pipelines.yml}} in the repository root. It handles Mac native builds on [https://github.com/actions/virtual-environments/blob/main/images/macos/macos-11-Readme.md macOS 11.x] and Linux native and NaCl builds on [https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2004-Readme.md Ubuntu 20.04] (Focal).&lt;br /&gt;
* GitHub CodeQL. Its configuration is found in the file {{code|.github/workflows/codeql.yml}} in the repository. Its purpose is to scan the source code for vulnerabilities, and for that purpose it starts by building the source tree using the latest LTS Ubuntu distribution provided by the platform ([https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2004-Readme.md Ubuntu 22.04]) and the default compiler of this platform.&lt;br /&gt;
&lt;br /&gt;
In some Daemon builds, we run the unit tests. These builds have been configured to use the Release configuration so that the unit tests are closer to production builds. &lt;br /&gt;
&lt;br /&gt;
== Build matrix ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! colspan=&amp;quot;9&amp;quot; | {{engine}}&lt;br /&gt;
|-&lt;br /&gt;
! Service&lt;br /&gt;
! Host&lt;br /&gt;
! Target&lt;br /&gt;
! Compiler&lt;br /&gt;
! Generator&lt;br /&gt;
! Build Type&lt;br /&gt;
! WERROR&lt;br /&gt;
! PCH&lt;br /&gt;
! Unit tests&lt;br /&gt;
|-&lt;br /&gt;
| Appveyor || Windows amd64 || Windows amd64 || VS 2019 || Visual Studio || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Appveyor || Windows amd64 || Windows i686 || VS 2019 || Visual Studio || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Windows amd64 || MinGW 9.3 || Ninja || Debug || Yes || No || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 || GCC 9.4 || Ninja || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 || Clang 11.0 || Ninja || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || macOS-11 amd64 || macOS amd64 || AppleClang 13.0 || Make || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| GitHub Actions CodeQL || ubuntu-latest || Linux amd64 || GCC (floating) || Ninja || Release || No || Yes || No&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
! colspan=&amp;quot;8&amp;quot; | {{game}}&lt;br /&gt;
|-&lt;br /&gt;
! Service&lt;br /&gt;
! Host&lt;br /&gt;
! Target&lt;br /&gt;
! Compiler&lt;br /&gt;
! Generator&lt;br /&gt;
! Build Type&lt;br /&gt;
! WERROR&lt;br /&gt;
! PCH&lt;br /&gt;
|-&lt;br /&gt;
| Appveyor || Windows amd64 || Windows i686 DLL || VS 2019 || NMake || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 DLL || GCC 8.4 || Ninja || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 DLL || Clang 11.0 || Ninja || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || NaCl all NEXE || PNaCl Clang 3.6 || Ninja || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || macOS-14 amd64 || macOS amd64 DLL || AppleClang 15.0 || Make || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| GitHub Actions CodeQL || ubuntu-latest || Linux amd64 DLL+EXE || GCC (floating) || Ninja || Release || No || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
“WERROR” indicates whether the {{code|USE_WERROR}} option is on, which gives a failing building build status if there are warnings in our code. Note that {{code|USE_WERROR}} only applies to ”our” code in {{code|src/}}, so you may still see warnings from stuff in {{code|libs/}}.&lt;br /&gt;
&lt;br /&gt;
“PCH” indicates whether the precompiled header is enabled.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Formats/Behavior_tree&amp;diff=8788</id>
		<title>Formats/Behavior tree</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Formats/Behavior_tree&amp;diff=8788"/>
				<updated>2024-11-14T12:08:23Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* Syntax Reference */ move concurrent after other branching nodes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Formats]]&lt;br /&gt;
[[Category:Bots]]&lt;br /&gt;
Behavior trees file format is game-specific (mods may modify it).&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Bot behaviors are decided individually, at each &amp;quot;frame&amp;quot; (read: server's main loop passage), starting from a root node. Evaluation stops at a node which returns STATUS_RUNNING, or when the root node returns success or failure. An overview can be found in the [https://en.wikipedia.org/wiki/Behavior_tree_(artificial_intelligence,_robotics_and_control) Wikipedia article].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Syntax Reference =&lt;br /&gt;
&lt;br /&gt;
Behavior trees use a specific syntax, which obey following rules (guessed from actual implementation and some C++ readings):&lt;br /&gt;
&lt;br /&gt;
* Each node or leaf returns either &amp;lt;code&amp;gt;STATUS_SUCCESS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;STATUS_FAILURE&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;STATUS_RUNNING&amp;lt;/code&amp;gt;.&lt;br /&gt;
* whitespace has no semantic meaning&lt;br /&gt;
* comments (C and C++-style) can either:&lt;br /&gt;
:* start with &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt; and go to the end of line&lt;br /&gt;
:* start with &amp;lt;code&amp;gt;/*&amp;lt;/code&amp;gt; and go to next &amp;lt;code&amp;gt;*/&amp;lt;/code&amp;gt;, including out of current line. These do not nest.&lt;br /&gt;
* actions and conditions taking parameters must enclose those withing parentheses, separated with commas (i.e. &amp;lt;code&amp;gt;roamInRadius( E_H_REACTOR, 500 )&amp;lt;/code&amp;gt;)&lt;br /&gt;
* if an action or a condition does not need parameters, parentheses are optional&lt;br /&gt;
* strings start and end with a double quote &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* values can't be stored or modified (additions, subtractions, multiplications, etc)&lt;br /&gt;
* no user-defined function (but files can be included, and C++ functions can be written in the game logic and be used in the behavior tree)&lt;br /&gt;
* each possible path should (TODO: verify, even if I fail to understand why one would break that willingly) end by one or more action&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
&lt;br /&gt;
It is not possible to do mathematical operations such as additions, multiplications, divisions, ...&lt;br /&gt;
&lt;br /&gt;
== Keywords ==&lt;br /&gt;
&lt;br /&gt;
There are several keywords:&lt;br /&gt;
&lt;br /&gt;
* behavior&lt;br /&gt;
* action&lt;br /&gt;
* sequence&lt;br /&gt;
* selector&lt;br /&gt;
* fallback&lt;br /&gt;
* concurrent&lt;br /&gt;
* decorator&lt;br /&gt;
* condition&lt;br /&gt;
&lt;br /&gt;
== The &amp;lt;code&amp;gt;behavior&amp;lt;/code&amp;gt; keyword ==&lt;br /&gt;
&lt;br /&gt;
 behavior NAME&lt;br /&gt;
&lt;br /&gt;
Include named behavior at current place. This does not make a new copy of the referenced tree, so if you include the same behavior more than once, node-specific state (e.g. timers) will be shared between the includes.&lt;br /&gt;
&lt;br /&gt;
== The &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; keyword ==&lt;br /&gt;
&lt;br /&gt;
 action NAME&lt;br /&gt;
&lt;br /&gt;
 action NAME()&lt;br /&gt;
&lt;br /&gt;
 action NAME( param )&lt;br /&gt;
&lt;br /&gt;
 action NAME( param1, param2, ..., paramN )&lt;br /&gt;
&lt;br /&gt;
Leaves of the tree, they trigger an action from the bot.&lt;br /&gt;
&lt;br /&gt;
=== List of actions ===&lt;br /&gt;
&lt;br /&gt;
Titles provide a link to more detailed pages.&lt;br /&gt;
TODO: have something more time-resilient (one page per call, with it's changelog, maybe?)&lt;br /&gt;
&lt;br /&gt;
==== 0.53.1 ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* activateUpgrade&lt;br /&gt;
* aimAtGoal&lt;br /&gt;
* alternateStrafe&lt;br /&gt;
* buy&lt;br /&gt;
* changeGoal&lt;br /&gt;
* classDodge&lt;br /&gt;
* deactivateUpgrade&lt;br /&gt;
* equip&lt;br /&gt;
* evolve&lt;br /&gt;
* evolveTo&lt;br /&gt;
* fight&lt;br /&gt;
* fireWeapon&lt;br /&gt;
* flee&lt;br /&gt;
* gesture&lt;br /&gt;
* heal&lt;br /&gt;
* jump&lt;br /&gt;
* moveInDir&lt;br /&gt;
* moveTo&lt;br /&gt;
* moveToGoal&lt;br /&gt;
* repair&lt;br /&gt;
* resetStuckTime&lt;br /&gt;
* roam&lt;br /&gt;
* roamInRadius&lt;br /&gt;
* rush&lt;br /&gt;
* say&lt;br /&gt;
* strafeDodge&lt;br /&gt;
* suicide&lt;br /&gt;
* teleport&lt;br /&gt;
&lt;br /&gt;
=== Creating new actions ===&lt;br /&gt;
&lt;br /&gt;
Actions are exported in the &amp;lt;code&amp;gt;AIActionMap_s AIActions[]&amp;lt;/code&amp;gt; C array.&lt;br /&gt;
Actions always return a status.&lt;br /&gt;
Actions can take a variable number of parameters (they have minimum and maximum parameter numbers).&lt;br /&gt;
Parameter types are not described by API.&lt;br /&gt;
&lt;br /&gt;
== The &amp;lt;code&amp;gt;sequence&amp;lt;/code&amp;gt; keyword ==&lt;br /&gt;
&lt;br /&gt;
 sequence&lt;br /&gt;
 {&lt;br /&gt;
 	NODE_1&lt;br /&gt;
 	NODE_2&lt;br /&gt;
 	...&lt;br /&gt;
  	NODE_N&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Sequential nodes evaluate each children one after the other, as long as they return &amp;lt;code&amp;gt;STATUS_SUCCESS&amp;lt;/code&amp;gt;.&lt;br /&gt;
Return last child's status.&lt;br /&gt;
&lt;br /&gt;
* Sequence breaks if a child returns &amp;lt;code&amp;gt;STATUS_RUNNING&amp;lt;/code&amp;gt;&lt;br /&gt;
* Starts at last &amp;lt;code&amp;gt;STATUS_RUNNING&amp;lt;/code&amp;gt;, if any. Nodes that completed successfully in a previous frame are not rerun, as long as the sequence is running continually.&lt;br /&gt;
&lt;br /&gt;
== The &amp;lt;code&amp;gt;selector&amp;lt;/code&amp;gt; keyword ==&lt;br /&gt;
&lt;br /&gt;
 selector&lt;br /&gt;
 {&lt;br /&gt;
 	NODE_1&lt;br /&gt;
 	NODE_2&lt;br /&gt;
 	...&lt;br /&gt;
 	NODE_N&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Selector nodes evaluate each children one after the other, as long as they return &amp;lt;code&amp;gt;STATUS_FAILURE&amp;lt;/code&amp;gt;.&lt;br /&gt;
Return last child's status.&lt;br /&gt;
Unlike sequence, this node is stateless: it does not restart from the last &amp;lt;code&amp;gt;STATUS_RUNNING&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== The &amp;lt;code&amp;gt;fallback&amp;lt;/code&amp;gt; keyword ==&lt;br /&gt;
&lt;br /&gt;
 fallback&lt;br /&gt;
 {&lt;br /&gt;
 	NODE_1&lt;br /&gt;
 	NODE_2&lt;br /&gt;
 	...&lt;br /&gt;
  	NODE_N&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Fallback nodes start by evaluating the first children, and switch to the next one if a child returns &amp;lt;code&amp;gt;STATUS_FAILURE&amp;lt;/code&amp;gt;. It will continue from the last &amp;lt;code&amp;gt;STATUS_RUNNING&amp;lt;/code&amp;gt; child.&lt;br /&gt;
Return last child's status.&lt;br /&gt;
&lt;br /&gt;
Difference with sequence:&lt;br /&gt;
&lt;br /&gt;
* Sequence switch to the next child on &amp;lt;code&amp;gt;STATUS_SUCCESS&amp;lt;/code&amp;gt;, while fallback switch to the next child on code&amp;gt;STATUS_SUCCESS&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Difference with selector:&lt;br /&gt;
* Starts at last &amp;lt;code&amp;gt;STATUS_RUNNING&amp;lt;/code&amp;gt;, if any&lt;br /&gt;
&lt;br /&gt;
== {{Discouraged}} The &amp;lt;code&amp;gt;concurrent&amp;lt;/code&amp;gt; keyword ==&lt;br /&gt;
&lt;br /&gt;
This is a very niche node type, for experts only! As of 0.55.1, the return value is wrong: it may return STATUS_SUCCESS while there are running nodes (should be fixed for 0.56).&lt;br /&gt;
&lt;br /&gt;
 concurrent&lt;br /&gt;
 {&lt;br /&gt;
 	NODE_1&lt;br /&gt;
 	NODE_2&lt;br /&gt;
 	...&lt;br /&gt;
 	NODE_N&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Concurrent nodes evaluate each children until one returns &amp;lt;code&amp;gt;STATUS_FAILURE&amp;lt;/code&amp;gt;. Along with &amp;lt;code&amp;gt;decorator return&amp;lt;/code&amp;gt;, it is one of two ways that BT evaluation can continue after a node evaluates to &amp;lt;code&amp;gt;STATUS_RUNNING&amp;lt;/code&amp;gt;. It is most similar to &amp;lt;code&amp;gt;sequence&amp;lt;/code&amp;gt;, except the different treatment of running nodes. It is much less useful than it sounds first, because the behavior tree can only remember one long-running action at a time. If you have two long-running actions in a concurrent node, they will NOT work correctly, constantly forgetting their goals. So usage of concurrent is limited to combining one-shot actions with a single long-running one. freem discovered the following use case:&lt;br /&gt;
&lt;br /&gt;
 concurrent&lt;br /&gt;
 {&lt;br /&gt;
 	action fight&lt;br /&gt;
 	decorator return( STATUS_SUCCESS )&lt;br /&gt;
 	{&lt;br /&gt;
 		condition goalType == ET_BUILDABLE &amp;amp;&amp;amp; goalTeam == TEAM_ALIENS &amp;amp;&amp;amp; inAttackRange( E_GOAL )&lt;br /&gt;
 		{&lt;br /&gt;
 			action moveInDir( MOVE_BACKWARD )&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== The &amp;lt;code&amp;gt;decorator&amp;lt;/code&amp;gt; keyword ==&lt;br /&gt;
&lt;br /&gt;
 decorator TYPE( VALUE )&lt;br /&gt;
 {&lt;br /&gt;
 	NODE_1&lt;br /&gt;
 	NODE_2&lt;br /&gt;
 	...&lt;br /&gt;
 	NODE_N&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Decorator nodes alters their children's behavior.&lt;br /&gt;
Decorator types:&lt;br /&gt;
&lt;br /&gt;
* return&lt;br /&gt;
* invert&lt;br /&gt;
* timer&lt;br /&gt;
&lt;br /&gt;
== The &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; decorator ==&lt;br /&gt;
&lt;br /&gt;
Force children nodes to return a specific value&lt;br /&gt;
&lt;br /&gt;
== The &amp;lt;code&amp;gt;invert&amp;lt;/code&amp;gt; decorator ==&lt;br /&gt;
&lt;br /&gt;
An &amp;lt;code&amp;gt;invert&amp;lt;/code&amp;gt; node will negate the return value of its node, &amp;lt;code&amp;gt;STATUS_SUCCESS&amp;lt;code&amp;gt; is turned into &amp;lt;code&amp;gt;STATUS_FAILURE&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;STATUS_FAILURE&amp;lt;/code&amp;gt; is turned into &amp;lt;code&amp;gt;STATUS_SUCCESS&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;STATUS_RUNNING&amp;lt;/code&amp;gt; is unaffected.&lt;br /&gt;
&lt;br /&gt;
== The &amp;lt;code&amp;gt;timer&amp;lt;/code&amp;gt; keyword ==&lt;br /&gt;
&lt;br /&gt;
On encountering a &amp;lt;code&amp;gt;timer( &amp;lt;i&amp;gt;N&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt; node, &amp;lt;code&amp;gt;STATUS_FAILURE&amp;lt;/code&amp;gt; is immediately returned if the timer's child node has already returned &amp;lt;code&amp;gt;STATUS_FAILURE&amp;lt;/code&amp;gt; within the last N milliseconds.&lt;br /&gt;
&lt;br /&gt;
The node may run more often than every N milliseconds if it keeps returning success.&lt;br /&gt;
&lt;br /&gt;
== The &amp;lt;code&amp;gt;condition&amp;lt;/code&amp;gt; keyword ==&lt;br /&gt;
&lt;br /&gt;
  condition EXPRESSION&lt;br /&gt;
&lt;br /&gt;
  condition EXPRESSION&lt;br /&gt;
  {&lt;br /&gt;
  	NODE&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
The first form immediately returns ''EXPRESSION'' as its status: &amp;lt;code&amp;gt;STATUS_SUCCESS&amp;lt;/code&amp;gt; for true and &amp;lt;code&amp;gt;STATUS_FAILURE&amp;lt;/code&amp;gt; for false.&lt;br /&gt;
&lt;br /&gt;
The second form returns &amp;lt;code&amp;gt;STATUS_FAILURE&amp;lt;/code&amp;gt; if the expression is false, or otherwise the child's status. Note that ''EXPRESSION'' is re-evaluated every frame. If it becomes false at any time during execution of the child node, the child subtree aborts and the condition node returns failure.&lt;br /&gt;
&lt;br /&gt;
The idiom&lt;br /&gt;
  sequence {&lt;br /&gt;
    condition EXPRESSION&lt;br /&gt;
    action myLongRunningAction&lt;br /&gt;
  }&lt;br /&gt;
is used to check a condition once before starting an action, but in subsequent continue doing the action without re-evaluating the condition.&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
&lt;br /&gt;
* only executes a single child.&lt;br /&gt;
* EXPRESSION can include function calls.&lt;br /&gt;
&lt;br /&gt;
== Operators ==&lt;br /&gt;
&lt;br /&gt;
Operators are listed in the &amp;lt;code&amp;gt;AIOpMap_s conditionOps[]&amp;lt;/code&amp;gt; array.&lt;br /&gt;
operators sorted by precedence (1st have higher priority):&lt;br /&gt;
* &amp;quot;!&amp;quot;&lt;br /&gt;
* &amp;quot;&amp;lt;&amp;quot;&lt;br /&gt;
* &amp;quot;&amp;lt;=&amp;quot;&lt;br /&gt;
* &amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
* &amp;quot;&amp;gt;=&amp;quot;&lt;br /&gt;
* &amp;quot;==&amp;quot;&lt;br /&gt;
* &amp;quot;!=&amp;quot;&lt;br /&gt;
* &amp;quot;&amp;amp;&amp;amp;&amp;quot;&lt;br /&gt;
* &amp;quot;||&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
&lt;br /&gt;
Return value is &amp;quot;boxed&amp;quot; (&amp;lt;code&amp;gt;AIBox&amp;lt;T&amp;gt;()&amp;lt;/code&amp;gt;) in the C++ code.&lt;br /&gt;
Conditions are exported in the &amp;lt;code&amp;gt;AIConditionMap_s conditionFuncs[]&amp;lt;/code&amp;gt; array.&lt;br /&gt;
&lt;br /&gt;
=== List of functions (as of 0.53.1) ===&lt;br /&gt;
&lt;br /&gt;
* alertedToEnemy&lt;br /&gt;
* aliveTime&lt;br /&gt;
* baseRushScore&lt;br /&gt;
* buildingIsDamaged&lt;br /&gt;
* canEvolveTo&lt;br /&gt;
* class&lt;br /&gt;
* cvar&lt;br /&gt;
* directPathTo&lt;br /&gt;
* distanceTo&lt;br /&gt;
* goalBuildingType&lt;br /&gt;
* goalIsDead&lt;br /&gt;
* goalTeam&lt;br /&gt;
* goalType&lt;br /&gt;
* haveUpgrade&lt;br /&gt;
* haveWeapon&lt;br /&gt;
* healScore&lt;br /&gt;
* inAttackRange&lt;br /&gt;
* isVisible&lt;br /&gt;
* matchTime&lt;br /&gt;
* momentum&lt;br /&gt;
* percentAmmo&lt;br /&gt;
* percentHealth&lt;br /&gt;
* random&lt;br /&gt;
* skill&lt;br /&gt;
* stuckTime&lt;br /&gt;
* team&lt;br /&gt;
* teamateHasWeapon&lt;br /&gt;
* weapon&lt;br /&gt;
&lt;br /&gt;
== Pre-defined symbols ==&lt;br /&gt;
&lt;br /&gt;
Some values are pre-defined and usable as action's or function's parameters.&lt;br /&gt;
&lt;br /&gt;
Those are exported by calling a macro named 'D' (yes, I know).&lt;br /&gt;
List of exported symbols:&lt;br /&gt;
&lt;br /&gt;
* human upgrades (including medkit)&lt;br /&gt;
* human weapons (excluding blaster)&lt;br /&gt;
* team names (aliens, humans, and none)&lt;br /&gt;
* alien buildings&lt;br /&gt;
* human buildings&lt;br /&gt;
* &amp;lt;code&amp;gt;E_GOAL&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;E_ENEMY&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;E_DAMAGEDBUILDING&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;E_SELF&amp;lt;/code&amp;gt;&lt;br /&gt;
* classes (human ones, alien ones, and &amp;lt;code&amp;gt;PCL_NONE&amp;lt;/code&amp;gt;)&lt;br /&gt;
* moves (forward, backward, right, left)&lt;br /&gt;
* some say commands (all, team, area, area_team)&lt;br /&gt;
* task/check status names (running, success, failure)&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
Parameters needs to be (un)wrapped in C++ before being accessed.&lt;br /&gt;
&lt;br /&gt;
Parameters can be of the following (C) types:&lt;br /&gt;
* float&lt;br /&gt;
* int (probably better assume 32 bit signed integers)&lt;br /&gt;
* string (probably better assume null-terminated)&lt;br /&gt;
&lt;br /&gt;
To provide a value to an action or check, the C++ code must UnBox (&amp;lt;code&amp;gt;AIUnBox&amp;lt;T&amp;gt;()&amp;lt;/code&amp;gt;) it.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Formats/Behavior_tree&amp;diff=8787</id>
		<title>Formats/Behavior tree</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Formats/Behavior_tree&amp;diff=8787"/>
				<updated>2024-11-14T09:54:29Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* {{Discouraged}} The concurrent keyword */ describe a valid use case&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Formats]]&lt;br /&gt;
[[Category:Bots]]&lt;br /&gt;
Behavior trees file format is game-specific (mods may modify it).&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Bot behaviors are decided individually, at each &amp;quot;frame&amp;quot; (read: server's main loop passage), starting from a root node. Evaluation stops at a node which returns STATUS_RUNNING, or when the root node returns success or failure. An overview can be found in the [https://en.wikipedia.org/wiki/Behavior_tree_(artificial_intelligence,_robotics_and_control) Wikipedia article].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Syntax Reference =&lt;br /&gt;
&lt;br /&gt;
Behavior trees use a specific syntax, which obey following rules (guessed from actual implementation and some C++ readings):&lt;br /&gt;
&lt;br /&gt;
* Each node or leaf returns either &amp;lt;code&amp;gt;STATUS_SUCCESS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;STATUS_FAILURE&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;STATUS_RUNNING&amp;lt;/code&amp;gt;.&lt;br /&gt;
* whitespace has no semantic meaning&lt;br /&gt;
* comments (C and C++-style) can either:&lt;br /&gt;
:* start with &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt; and go to the end of line&lt;br /&gt;
:* start with &amp;lt;code&amp;gt;/*&amp;lt;/code&amp;gt; and go to next &amp;lt;code&amp;gt;*/&amp;lt;/code&amp;gt;, including out of current line. These do not nest.&lt;br /&gt;
* actions and conditions taking parameters must enclose those withing parentheses, separated with commas (i.e. &amp;lt;code&amp;gt;roamInRadius( E_H_REACTOR, 500 )&amp;lt;/code&amp;gt;)&lt;br /&gt;
* if an action or a condition does not need parameters, parentheses are optional&lt;br /&gt;
* strings start and end with a double quote &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* values can't be stored or modified (additions, subtractions, multiplications, etc)&lt;br /&gt;
* no user-defined function (but files can be included, and C++ functions can be written in the game logic and be used in the behavior tree)&lt;br /&gt;
* each possible path should (TODO: verify, even if I fail to understand why one would break that willingly) end by one or more action&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
&lt;br /&gt;
It is not possible to do mathematical operations such as additions, multiplications, divisions, ...&lt;br /&gt;
&lt;br /&gt;
== Keywords ==&lt;br /&gt;
&lt;br /&gt;
There are several keywords:&lt;br /&gt;
&lt;br /&gt;
* behavior&lt;br /&gt;
* action&lt;br /&gt;
* sequence&lt;br /&gt;
* selector&lt;br /&gt;
* fallback&lt;br /&gt;
* concurrent&lt;br /&gt;
* decorator&lt;br /&gt;
* condition&lt;br /&gt;
&lt;br /&gt;
== The &amp;lt;code&amp;gt;behavior&amp;lt;/code&amp;gt; keyword ==&lt;br /&gt;
&lt;br /&gt;
 behavior NAME&lt;br /&gt;
&lt;br /&gt;
Include named behavior at current place. This does not make a new copy of the referenced tree, so if you include the same behavior more than once, node-specific state (e.g. timers) will be shared between the includes.&lt;br /&gt;
&lt;br /&gt;
== The &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; keyword ==&lt;br /&gt;
&lt;br /&gt;
 action NAME&lt;br /&gt;
&lt;br /&gt;
 action NAME()&lt;br /&gt;
&lt;br /&gt;
 action NAME( param )&lt;br /&gt;
&lt;br /&gt;
 action NAME( param1, param2, ..., paramN )&lt;br /&gt;
&lt;br /&gt;
Leaves of the tree, they trigger an action from the bot.&lt;br /&gt;
&lt;br /&gt;
=== List of actions ===&lt;br /&gt;
&lt;br /&gt;
Titles provide a link to more detailed pages.&lt;br /&gt;
TODO: have something more time-resilient (one page per call, with it's changelog, maybe?)&lt;br /&gt;
&lt;br /&gt;
==== 0.53.1 ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* activateUpgrade&lt;br /&gt;
* aimAtGoal&lt;br /&gt;
* alternateStrafe&lt;br /&gt;
* buy&lt;br /&gt;
* changeGoal&lt;br /&gt;
* classDodge&lt;br /&gt;
* deactivateUpgrade&lt;br /&gt;
* equip&lt;br /&gt;
* evolve&lt;br /&gt;
* evolveTo&lt;br /&gt;
* fight&lt;br /&gt;
* fireWeapon&lt;br /&gt;
* flee&lt;br /&gt;
* gesture&lt;br /&gt;
* heal&lt;br /&gt;
* jump&lt;br /&gt;
* moveInDir&lt;br /&gt;
* moveTo&lt;br /&gt;
* moveToGoal&lt;br /&gt;
* repair&lt;br /&gt;
* resetStuckTime&lt;br /&gt;
* roam&lt;br /&gt;
* roamInRadius&lt;br /&gt;
* rush&lt;br /&gt;
* say&lt;br /&gt;
* strafeDodge&lt;br /&gt;
* suicide&lt;br /&gt;
* teleport&lt;br /&gt;
&lt;br /&gt;
=== Creating new actions ===&lt;br /&gt;
&lt;br /&gt;
Actions are exported in the &amp;lt;code&amp;gt;AIActionMap_s AIActions[]&amp;lt;/code&amp;gt; C array.&lt;br /&gt;
Actions always return a status.&lt;br /&gt;
Actions can take a variable number of parameters (they have minimum and maximum parameter numbers).&lt;br /&gt;
Parameter types are not described by API.&lt;br /&gt;
&lt;br /&gt;
== {{Discouraged}} The &amp;lt;code&amp;gt;concurrent&amp;lt;/code&amp;gt; keyword ==&lt;br /&gt;
&lt;br /&gt;
This is a very niche node type, for experts only! As of 0.55.1, the return value is wrong: it may return STATUS_SUCCESS while there are running nodes (should be fixed for 0.56).&lt;br /&gt;
&lt;br /&gt;
 concurrent&lt;br /&gt;
 {&lt;br /&gt;
 	NODE_1&lt;br /&gt;
 	NODE_2&lt;br /&gt;
 	...&lt;br /&gt;
 	NODE_N&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Concurrent nodes evaluate each children until one returns &amp;lt;code&amp;gt;STATUS_FAILURE&amp;lt;/code&amp;gt;. Along with &amp;lt;code&amp;gt;decorator return&amp;lt;/code&amp;gt;, it is one of two ways that BT evaluation can continue after a node evaluates to &amp;lt;code&amp;gt;STATUS_RUNNING&amp;lt;/code&amp;gt;. It is most similar to &amp;lt;code&amp;gt;sequence&amp;lt;/code&amp;gt;, except the different treatment of running nodes. It is much less useful than it sounds first, because the behavior tree can only remember one long-running action at a time. If you have two long-running actions in a concurrent node, they will NOT work correctly, constantly forgetting their goals. So usage of concurrent is limited to combining one-shot actions with a single long-running one. freem discovered the following use case:&lt;br /&gt;
&lt;br /&gt;
 concurrent&lt;br /&gt;
 {&lt;br /&gt;
 	action fight&lt;br /&gt;
 	decorator return( STATUS_SUCCESS )&lt;br /&gt;
 	{&lt;br /&gt;
 		condition goalType == ET_BUILDABLE &amp;amp;&amp;amp; goalTeam == TEAM_ALIENS &amp;amp;&amp;amp; inAttackRange( E_GOAL )&lt;br /&gt;
 		{&lt;br /&gt;
 			action moveInDir( MOVE_BACKWARD )&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== The &amp;lt;code&amp;gt;sequence&amp;lt;/code&amp;gt; keyword ==&lt;br /&gt;
&lt;br /&gt;
 sequence&lt;br /&gt;
 {&lt;br /&gt;
 	NODE_1&lt;br /&gt;
 	NODE_2&lt;br /&gt;
 	...&lt;br /&gt;
  	NODE_N&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Sequential nodes evaluate each children one after the other, as long as they return &amp;lt;code&amp;gt;STATUS_SUCCESS&amp;lt;/code&amp;gt;.&lt;br /&gt;
Return last child's status.&lt;br /&gt;
&lt;br /&gt;
* Sequence breaks if a child returns &amp;lt;code&amp;gt;STATUS_RUNNING&amp;lt;/code&amp;gt;&lt;br /&gt;
* Starts at last &amp;lt;code&amp;gt;STATUS_RUNNING&amp;lt;/code&amp;gt;, if any. Nodes that completed successfully in a previous frame are not rerun, as long as the sequence is running continually.&lt;br /&gt;
&lt;br /&gt;
== The &amp;lt;code&amp;gt;selector&amp;lt;/code&amp;gt; keyword ==&lt;br /&gt;
&lt;br /&gt;
 selector&lt;br /&gt;
 {&lt;br /&gt;
 	NODE_1&lt;br /&gt;
 	NODE_2&lt;br /&gt;
 	...&lt;br /&gt;
 	NODE_N&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Selector nodes evaluate each children one after the other, as long as they return &amp;lt;code&amp;gt;STATUS_FAILURE&amp;lt;/code&amp;gt;.&lt;br /&gt;
Return last child's status.&lt;br /&gt;
Unlike sequence, this node is stateless: it does not restart from the last &amp;lt;code&amp;gt;STATUS_RUNNING&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== The &amp;lt;code&amp;gt;fallback&amp;lt;/code&amp;gt; keyword ==&lt;br /&gt;
&lt;br /&gt;
 fallback&lt;br /&gt;
 {&lt;br /&gt;
 	NODE_1&lt;br /&gt;
 	NODE_2&lt;br /&gt;
 	...&lt;br /&gt;
  	NODE_N&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Fallback nodes start by evaluating the first children, and switch to the next one if a child returns &amp;lt;code&amp;gt;STATUS_FAILURE&amp;lt;/code&amp;gt;. It will continue from the last &amp;lt;code&amp;gt;STATUS_RUNNING&amp;lt;/code&amp;gt; child.&lt;br /&gt;
Return last child's status.&lt;br /&gt;
&lt;br /&gt;
Difference with sequence:&lt;br /&gt;
&lt;br /&gt;
* Sequence switch to the next child on &amp;lt;code&amp;gt;STATUS_SUCCESS&amp;lt;/code&amp;gt;, while fallback switch to the next child on code&amp;gt;STATUS_SUCCESS&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Difference with selector:&lt;br /&gt;
* Starts at last &amp;lt;code&amp;gt;STATUS_RUNNING&amp;lt;/code&amp;gt;, if any&lt;br /&gt;
&lt;br /&gt;
== The &amp;lt;code&amp;gt;decorator&amp;lt;/code&amp;gt; keyword ==&lt;br /&gt;
&lt;br /&gt;
 decorator TYPE( VALUE )&lt;br /&gt;
 {&lt;br /&gt;
 	NODE_1&lt;br /&gt;
 	NODE_2&lt;br /&gt;
 	...&lt;br /&gt;
 	NODE_N&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Decorator nodes alters their children's behavior.&lt;br /&gt;
Decorator types:&lt;br /&gt;
&lt;br /&gt;
* return&lt;br /&gt;
* invert&lt;br /&gt;
* timer&lt;br /&gt;
&lt;br /&gt;
== The &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; decorator ==&lt;br /&gt;
&lt;br /&gt;
Force children nodes to return a specific value&lt;br /&gt;
&lt;br /&gt;
== The &amp;lt;code&amp;gt;invert&amp;lt;/code&amp;gt; decorator ==&lt;br /&gt;
&lt;br /&gt;
An &amp;lt;code&amp;gt;invert&amp;lt;/code&amp;gt; node will negate the return value of its node, &amp;lt;code&amp;gt;STATUS_SUCCESS&amp;lt;code&amp;gt; is turned into &amp;lt;code&amp;gt;STATUS_FAILURE&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;STATUS_FAILURE&amp;lt;/code&amp;gt; is turned into &amp;lt;code&amp;gt;STATUS_SUCCESS&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;STATUS_RUNNING&amp;lt;/code&amp;gt; is unaffected.&lt;br /&gt;
&lt;br /&gt;
== The &amp;lt;code&amp;gt;timer&amp;lt;/code&amp;gt; keyword ==&lt;br /&gt;
&lt;br /&gt;
On encountering a &amp;lt;code&amp;gt;timer( &amp;lt;i&amp;gt;N&amp;lt;/i&amp;gt; )&amp;lt;/code&amp;gt; node, &amp;lt;code&amp;gt;STATUS_FAILURE&amp;lt;/code&amp;gt; is immediately returned if the timer's child node has already returned &amp;lt;code&amp;gt;STATUS_FAILURE&amp;lt;/code&amp;gt; within the last N milliseconds.&lt;br /&gt;
&lt;br /&gt;
The node may run more often than every N milliseconds if it keeps returning success.&lt;br /&gt;
&lt;br /&gt;
== The &amp;lt;code&amp;gt;condition&amp;lt;/code&amp;gt; keyword ==&lt;br /&gt;
&lt;br /&gt;
  condition EXPRESSION&lt;br /&gt;
&lt;br /&gt;
  condition EXPRESSION&lt;br /&gt;
  {&lt;br /&gt;
  	NODE&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
The first form immediately returns ''EXPRESSION'' as its status: &amp;lt;code&amp;gt;STATUS_SUCCESS&amp;lt;/code&amp;gt; for true and &amp;lt;code&amp;gt;STATUS_FAILURE&amp;lt;/code&amp;gt; for false.&lt;br /&gt;
&lt;br /&gt;
The second form returns &amp;lt;code&amp;gt;STATUS_FAILURE&amp;lt;/code&amp;gt; if the expression is false, or otherwise the child's status. Note that ''EXPRESSION'' is re-evaluated every frame. If it becomes false at any time during execution of the child node, the child subtree aborts and the condition node returns failure.&lt;br /&gt;
&lt;br /&gt;
The idiom&lt;br /&gt;
  sequence {&lt;br /&gt;
    condition EXPRESSION&lt;br /&gt;
    action myLongRunningAction&lt;br /&gt;
  }&lt;br /&gt;
is used to check a condition once before starting an action, but in subsequent continue doing the action without re-evaluating the condition.&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
&lt;br /&gt;
* only executes a single child.&lt;br /&gt;
* EXPRESSION can include function calls.&lt;br /&gt;
&lt;br /&gt;
== Operators ==&lt;br /&gt;
&lt;br /&gt;
Operators are listed in the &amp;lt;code&amp;gt;AIOpMap_s conditionOps[]&amp;lt;/code&amp;gt; array.&lt;br /&gt;
operators sorted by precedence (1st have higher priority):&lt;br /&gt;
* &amp;quot;!&amp;quot;&lt;br /&gt;
* &amp;quot;&amp;lt;&amp;quot;&lt;br /&gt;
* &amp;quot;&amp;lt;=&amp;quot;&lt;br /&gt;
* &amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
* &amp;quot;&amp;gt;=&amp;quot;&lt;br /&gt;
* &amp;quot;==&amp;quot;&lt;br /&gt;
* &amp;quot;!=&amp;quot;&lt;br /&gt;
* &amp;quot;&amp;amp;&amp;amp;&amp;quot;&lt;br /&gt;
* &amp;quot;||&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
&lt;br /&gt;
Return value is &amp;quot;boxed&amp;quot; (&amp;lt;code&amp;gt;AIBox&amp;lt;T&amp;gt;()&amp;lt;/code&amp;gt;) in the C++ code.&lt;br /&gt;
Conditions are exported in the &amp;lt;code&amp;gt;AIConditionMap_s conditionFuncs[]&amp;lt;/code&amp;gt; array.&lt;br /&gt;
&lt;br /&gt;
=== List of functions (as of 0.53.1) ===&lt;br /&gt;
&lt;br /&gt;
* alertedToEnemy&lt;br /&gt;
* aliveTime&lt;br /&gt;
* baseRushScore&lt;br /&gt;
* buildingIsDamaged&lt;br /&gt;
* canEvolveTo&lt;br /&gt;
* class&lt;br /&gt;
* cvar&lt;br /&gt;
* directPathTo&lt;br /&gt;
* distanceTo&lt;br /&gt;
* goalBuildingType&lt;br /&gt;
* goalIsDead&lt;br /&gt;
* goalTeam&lt;br /&gt;
* goalType&lt;br /&gt;
* haveUpgrade&lt;br /&gt;
* haveWeapon&lt;br /&gt;
* healScore&lt;br /&gt;
* inAttackRange&lt;br /&gt;
* isVisible&lt;br /&gt;
* matchTime&lt;br /&gt;
* momentum&lt;br /&gt;
* percentAmmo&lt;br /&gt;
* percentHealth&lt;br /&gt;
* random&lt;br /&gt;
* skill&lt;br /&gt;
* stuckTime&lt;br /&gt;
* team&lt;br /&gt;
* teamateHasWeapon&lt;br /&gt;
* weapon&lt;br /&gt;
&lt;br /&gt;
== Pre-defined symbols ==&lt;br /&gt;
&lt;br /&gt;
Some values are pre-defined and usable as action's or function's parameters.&lt;br /&gt;
&lt;br /&gt;
Those are exported by calling a macro named 'D' (yes, I know).&lt;br /&gt;
List of exported symbols:&lt;br /&gt;
&lt;br /&gt;
* human upgrades (including medkit)&lt;br /&gt;
* human weapons (excluding blaster)&lt;br /&gt;
* team names (aliens, humans, and none)&lt;br /&gt;
* alien buildings&lt;br /&gt;
* human buildings&lt;br /&gt;
* &amp;lt;code&amp;gt;E_GOAL&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;E_ENEMY&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;E_DAMAGEDBUILDING&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;E_SELF&amp;lt;/code&amp;gt;&lt;br /&gt;
* classes (human ones, alien ones, and &amp;lt;code&amp;gt;PCL_NONE&amp;lt;/code&amp;gt;)&lt;br /&gt;
* moves (forward, backward, right, left)&lt;br /&gt;
* some say commands (all, team, area, area_team)&lt;br /&gt;
* task/check status names (running, success, failure)&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
Parameters needs to be (un)wrapped in C++ before being accessed.&lt;br /&gt;
&lt;br /&gt;
Parameters can be of the following (C) types:&lt;br /&gt;
* float&lt;br /&gt;
* int (probably better assume 32 bit signed integers)&lt;br /&gt;
* string (probably better assume null-terminated)&lt;br /&gt;
&lt;br /&gt;
To provide a value to an action or check, the C++ code must UnBox (&amp;lt;code&amp;gt;AIUnBox&amp;lt;T&amp;gt;()&amp;lt;/code&amp;gt;) it.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=GPU_compatibility_matrix&amp;diff=8783</id>
		<title>GPU compatibility matrix</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=GPU_compatibility_matrix&amp;diff=8783"/>
				<updated>2024-11-13T08:34:32Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* Comprehensive analysis */ update required extensions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{KnownGraphicalBugs}}&lt;br /&gt;
&lt;br /&gt;
This table gathers test results about various hardware and software configurations, &amp;lt;span style=&amp;quot;background-color: green !important; color: white !important; padding: .25em .5em;&amp;quot;&amp;gt;passed&amp;lt;/span&amp;gt; means nothing wrong is noticed and frame rate is at least &amp;lt;u&amp;gt;60 fps&amp;lt;/u&amp;gt; on common scene, &amp;lt;span style=&amp;quot;background-color: lightgreen !important; color: green !important; padding: .25em .5em;&amp;quot;&amp;gt;playable&amp;lt;/span&amp;gt; means at least &amp;lt;u&amp;gt;30 fps&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
All those tests were driven by Unvanquished developers or under Unvanquished developer supervision.&lt;br /&gt;
&lt;br /&gt;
See [[#Comprehensive_analysis|below]] for analysis, specific definitions and meanings.&lt;br /&gt;
{{GPU compatibility matrix}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;hr/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Comprehensive analysis ==&lt;br /&gt;
&lt;br /&gt;
The minimal configuration for the Unvanquished game is OpenGL 2.1. This includes cards like ATI R300 (Radeon X300, etc.), Nvidia NV40 (Curie, Geforce 6000 series), Intel GMA Gen 3 (3100) and 4 (X3100), etc. Unvanquished uses complex models and that may produce some slow-downs on such OpenGL 2.1 hardware. Such hardware is meant to be running with the {{code|lowest}} graphics preset on very low resolutions like {{code|640×480}}, with some high end cards from those generations it may be possible to use the {{code|low}} or even {{code|medium}} graphics preset and run some “HD Ready” {{code|1280×720}} or even “Full HD” {{code|1920×1080}} resolutions.&lt;br /&gt;
&lt;br /&gt;
Full performance (given advanced graphical effects are disabled) starts with OpenGL 3.2 devices, this includes AMD/ATI TeraScale GPU, Intel HD Graphics (HD 4000), and Nvidia Tesla-based GPUs. They are expected to sustain the {{code|high}} graphics preset with a “Full HD” {{code|1920×1080}} resolutions. Some high-end cards from this generation may even sustain the {{code|ultra}} graphics presets and/or a 2K resolution.&lt;br /&gt;
&lt;br /&gt;
To play at 4K resolution with an {{code|ultra}}, high-end AMD GCN/RDNA and devices from similar generations from other vendors are recommended. For example an AMD R9 390X from 2015 can handle &amp;lt;code&amp;gt;ultra&amp;lt;/code&amp;gt; preset with 4K resolution at 144Hz. An AMD R7 Embedded in R series APU can handle 2K resolution with &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; preset (no realtime light and relief mapping disabled) as well as Intel UHD.&lt;br /&gt;
&lt;br /&gt;
Minimal configuration to run the Dæmon engine is OpenGL 2.1 with &amp;lt;code&amp;gt;ARB_half_float_vertex&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EXT_framebuffer_object&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;EXT_framebuffer_blit&amp;lt;/code&amp;gt;. It includes ATI/AMD GPU starting with R300 (Radeon X300), Intel GPU starting with GMA965 (X3100) on Linux and macOS, HD Graphics on Windows, Nvidia starting with Curie (NV40, Geforce 6xxx). &lt;br /&gt;
&lt;br /&gt;
Speaking about OpenGL 2.1, Wikipedia says the GMA965 Windows driver only supports OpenGL 1.5 and then would not reach the requirements for running the Dæmon engine and then Unvanquished on this platform (it would only run on Linux). If you plan to make a game using the Damon engine and to support those older cards, it's better if your animated models don't have more than 41 bones (or you provide additional low quality models with less bones).&lt;br /&gt;
&lt;br /&gt;
== How to contribute ==&lt;br /&gt;
&lt;br /&gt;
This matrix is generated from a cell sheet. Do not edit it by hand, Please ask &amp;lt;code&amp;gt;illwieckz&amp;lt;/code&amp;gt; for access to the cell sheet.&lt;br /&gt;
&lt;br /&gt;
Please sort your contributions by brand (ATI/AMD, Intel, Nvidia, Via…) then by launch date (from newer to older).&lt;br /&gt;
&lt;br /&gt;
The table also documents who may be able to reproduce a special configuration, please put your nick name and tell how much it is easy for you to reproduce a test on it (see below for keywords to use).&lt;br /&gt;
&lt;br /&gt;
Please tell at least, brand, model, model launch date (look at Wikipedia), host, memory size, the operating system, the driver (kernel mode and user mode), OpenGL and GLSL version, Unvanquished version you tested, the status, the preset and the resolution you validated and eventual notes.&lt;br /&gt;
&lt;br /&gt;
If you find out the code name and related micro architecture, please note it, same with form factor and bus.&lt;br /&gt;
&lt;br /&gt;
Other data are less relevant for diagnostic and are only useful to get a better picture of the tested hardware, don't hesitate to write down as much info as you can.&lt;br /&gt;
&lt;br /&gt;
Append the &amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; character to version number if you're testing a preversion. For example use &amp;lt;code&amp;gt;0.52~&amp;lt;/code&amp;gt; to tell you tested against the to-be-released 0.52 version.&lt;br /&gt;
&lt;br /&gt;
Put a single &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; character in cell you don't have data for (do not leave empty cells). When you describe multiple configuration for the same piece of hardware, use the &amp;lt;code&amp;gt;↑&amp;lt;/code&amp;gt; character to tell the cell uses the same value as the previous line.&lt;br /&gt;
&lt;br /&gt;
== Definitions ==&lt;br /&gt;
&lt;br /&gt;
=== Status ===&lt;br /&gt;
&lt;br /&gt;
* '''hang''': the computer becomes unresponsive, requiring a hard reset;&lt;br /&gt;
* '''crash''': the game is terminated by the operating system on some unrecoverable failure;&lt;br /&gt;
* '''missing''': the game exits by itself because of some requirement not being met;&lt;br /&gt;
* '''broken''': the game loads maps but graphical bugs affecting gameplay are seen;&lt;br /&gt;
* '''glitchy''': the game loads maps but graphical bugs non-affecting gameplay are seen;&lt;br /&gt;
* '''slow''': the game is rendered properly but slowly with less than 30 fps;&lt;br /&gt;
* '''playable''': nothing wrong is noticed and frame rate is at least 30 fps but less than 60 fps;&lt;br /&gt;
* '''passed''': nothing wrong is noticed and frame rate is at least 60 fps.&lt;br /&gt;
&lt;br /&gt;
=== Availability ===&lt;br /&gt;
&lt;br /&gt;
* '''lost''': tester has lost access to the hardware;&lt;br /&gt;
* '''foreign''': tester has access to the hardware but does not own it;&lt;br /&gt;
* '''unplugged''': tester owns the hardware but testing requires to plug the hardware in a computer;&lt;br /&gt;
* '''unconfigured''': hardware is plugged in a computer but making use of it requires software changes;&lt;br /&gt;
* '''configured''': hardware and software are ready to use for testing.&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
&lt;br /&gt;
* '''extfbo''': this GPU provides {{code|EXT_framebuffer_object}} instead of {{code|ARB_framebuffer_object}};&lt;br /&gt;
* '''fakefps''': game displays high frame rate number but the experience is stuttering;&lt;br /&gt;
* '''hickups''': performance is globally correct, but sometimes the framerate drops a bit for a very short time;&lt;br /&gt;
* '''lowsky''': lowering texture size using at least &amp;lt;code&amp;gt;r_picmip 1&amp;lt;/code&amp;gt; is required to avoid skybox graphical glitches;&lt;br /&gt;
* '''lowtex''': lowering texture size using at least &amp;lt;code&amp;gt;r_picmip 1&amp;lt;/code&amp;gt; is required to avoid a computer hang;&lt;br /&gt;
* '''mesamain''': running the driver from Mesa {{code|main}} at the time of the test was required to get the game running or avoid major rendering bugs;&lt;br /&gt;
* '''noaccel''': no OpenGL hardware acceleration is implemented;&lt;br /&gt;
* '''nogather''': &amp;lt;code&amp;gt;GL_ARB_texture_gather&amp;lt;/code&amp;gt; is wrongly advertised by the driver to be supported by this hardware, making the engine crash at startup (Nvidia proprietary driver bug). The engine ships some workaround for this driver bug, if you experience the crash on version 0.52 and later but can properly start the game with &amp;lt;code&amp;gt;-set r_arb_texture_gather 0&amp;lt;/code&amp;gt; engine command line option, please reopen issue [https://github.com/DaemonEngine/Daemon/issues/368 Daemon#368];&lt;br /&gt;
* '''nohalfloatvertex''': missing &amp;lt;code&amp;gt;ARB_half_float_vertex&amp;lt;/code&amp;gt; OpenGL extension;&lt;br /&gt;
* '''nohyperz''': &amp;lt;code&amp;gt;R600_DEBUG=nohyperz&amp;lt;/code&amp;gt; environment variable is required to be set to avoid graphical glitches, see issues [https://github.com/DaemonEngine/Daemon/issues/343 Daemon#343] and [https://gitlab.freedesktop.org/mesa/mesa/-/issues/3290 Mesa#3290];&lt;br /&gt;
* '''norgtc''': &amp;lt;code&amp;gt;GL_ARB_texture_compression_rgtc&amp;lt;/code&amp;gt; extension is not supported on this hardware, some texture may be loaded with swapped channels, especially normal maps. Engine implements special algorithms to workaround this, see issue [https://github.com/DaemonEngine/Daemon/issues/375 Daemon#375];&lt;br /&gt;
* '''nvidiagarbage''': this driver is so bad you have to be very lucky to get at least a desktop drawn on screen before the computer hangs. With or without the game, after some screen freezes and display server crashes the kernel will complain about the card having disconnected itself from the PCIe bus. This issue was verified on multiple cards of this generations that are known to run for months without crashing when using free open source drivers instead;&lt;br /&gt;
* '''slowmodel''': models with a lot of bones are known to induce severe frame drop on such hardware, see issue [https://github.com/Unvanquished/Unvanquished/issues/1207 Unvanquished#1207];&lt;br /&gt;
* '''tinyalu''': this hardware has a very small ALU (arithmetic logic unit), dynamic lighting must be disabled with &amp;lt;code&amp;gt;r_dynamicLight 0&amp;lt;/code&amp;gt; to prevent the driver to abort GLSL shader compilation that may lead to an engine crash, see issue [https://github.com/DaemonEngine/Daemon/issues/344 Daemon#344].&lt;br /&gt;
&lt;br /&gt;
=== Bus ===&lt;br /&gt;
&lt;br /&gt;
* '''PCI''': [https://en.wikipedia.org/wiki/Peripheral_Component_Interconnect Peripheral Component Interconnect], slow multi-purpose bus for add-on cards, obsolete;&lt;br /&gt;
* '''PCI-X''': [https://en.wikipedia.org/wiki/PCI-X Peripheral Component Interconnect eXtended], enhanced version of PCI for servers and workstations, obsolete;&lt;br /&gt;
* '''AGP''': [https://en.wikipedia.org/wiki/Accelerated_Graphics_Port Accelerated Graphics Port], high-speed bus designed for graphic cards, obsolete;&lt;br /&gt;
* '''FSB''': [https://en.wikipedia.org/wiki/Front-side_bus Front-side bus], high-speed Intel system bus for CPUs, sometime used with onboard GPUs (example: GeForce 7050 + nForce 610i/630i);&lt;br /&gt;
* '''HT''': [https://en.wikipedia.org/wiki/HyperTransport HyperTransport], high-speed AMD system bus for CPUs, sometime used with onboard GPUs (example: GeForce 6150 LE + nForce 430);&lt;br /&gt;
* '''chip''': Internal bus of a [https://en.wikipedia.org/wiki/System_on_a_chip system on a chip] (SoC), the exact communication bus technology is usually poorly documented;&lt;br /&gt;
* '''PCIe''': [https://en.wikipedia.org/wiki/PCI_Express PCI Express], high-speed multi-purpose bus for add-on cards and on-board devices, recommended;&lt;br /&gt;
* '''CXL''': [https://en.wikipedia.org/wiki/Compute_Express_Link, Compute Express Link], high-speed multi-purpose bus for add-on cards;&lt;br /&gt;
* '''TB''': [https://fr.wikipedia.org/wiki/Thunderbolt_(interface) ThunderBolt], high speed cable combining PCI Express and DisplayPort or USB-C to connect external PCI Express cards like GPUs.&lt;br /&gt;
&lt;br /&gt;
=== Form factor ===&lt;br /&gt;
&lt;br /&gt;
* '''discrete''': full height workstation extension card, with dedicated graphics memory;&lt;br /&gt;
* '''lowprofile''': low profile workstation extension card, with dedicated graphics memory;&lt;br /&gt;
* '''MXM''': [https://en.wikipedia.org/wiki/Mobile_PCI_Express_Module Mobile PCI Express module], laptop extension card, with dedicated graphics memory;&lt;br /&gt;
* '''onboard''': dedicated GPU on motherboard, low end ones may share memory with the CPU;&lt;br /&gt;
* '''integrated''': GPU integrated in CPU package or chipset, likely sharing memory with the CPU;&lt;br /&gt;
* '''SoC''': System on a chip, with the GPU likely sharing memory with the CPU;&lt;br /&gt;
&lt;br /&gt;
=== Micro architecture ===&lt;br /&gt;
&lt;br /&gt;
* '''USSA''': ATi Unified Superscalar Shader Architecture;&lt;br /&gt;
* '''GCN''': AMD Graphics Core Next;&lt;br /&gt;
* '''RDNA''': AMD Radeon DNA;&lt;br /&gt;
* '''GMA''': Intel Graphics Media Accelerator;&lt;br /&gt;
* '''GT''': Intel Graphics Technology.&lt;br /&gt;
&lt;br /&gt;
=== Memory glossary ===&lt;br /&gt;
&lt;br /&gt;
* '''HM''': HyperMemory, ATi technology using main memory when GPU memory is full;&lt;br /&gt;
* '''TC''': TurboCache, Nvidia technology using main memory when GPU memory is full;&lt;br /&gt;
* '''AR''': AcceleRAM, S3 technology using main memory when GPU memory is full.&lt;br /&gt;
&lt;br /&gt;
== Useful resources ==&lt;br /&gt;
&lt;br /&gt;
* [https://mesamatrix.net/ Mesa Matrix]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/List_of_AMD_graphics_processing_units Wikipedia list of AMD graphics processing units]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/List_of_AMD_accelerated_processing_units Wikipedia list of AMD accelerated processing units]&lt;br /&gt;
* [https://www.x.org/wiki/RadeonFeature/ X.Org Radeon feature matrix and decoder ring]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/List_of_Intel_graphics_processing_units Wikipedia list of Intel graphics processing units]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/List_of_Nvidia_graphics_processing_units Wikipedia list of Nvidia graphics processing units]&lt;br /&gt;
* [https://nouveau.freedesktop.org/wiki/MesaDrivers/ Mesa Nouveau drivers]&lt;br /&gt;
* [https://nouveau.freedesktop.org/wiki/CodeNames/ Mesa Nouveau decoder ring]&lt;br /&gt;
* [https://opengl.gpuinfo.org/ User-submitted reports of OpenGL version and feature availability]&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Compiling_the_source&amp;diff=8769</id>
		<title>Compiling the source</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Compiling_the_source&amp;diff=8769"/>
				<updated>2024-10-27T14:38:22Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* macOS */ arm64 instructions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Dependencies==&lt;br /&gt;
&lt;br /&gt;
{{Note|content=In case this happens to become outdated, the up-to-date documentation can be found in the {{SourceFile|parameters=#unvanquished|README.md}} file in source repository.}}&lt;br /&gt;
&lt;br /&gt;
The game requires some dependencies to be built, which are the same on all systems:&lt;br /&gt;
&lt;br /&gt;
* cmake&lt;br /&gt;
* python3-yaml&lt;br /&gt;
* python3-jinja2&lt;br /&gt;
* A C++11 able compiler (those are known to work: clang (&amp;gt;= 3.5), gcc (&amp;gt;= 4.8), visual studio (&amp;gt;= 2019))&lt;br /&gt;
* zlib1g&lt;br /&gt;
* libgmp&lt;br /&gt;
* nettle&lt;br /&gt;
* libcurl4-gnutls&lt;br /&gt;
* libsdl2&lt;br /&gt;
* libglew&lt;br /&gt;
* libpng&lt;br /&gt;
* libjpeg-turbo8&lt;br /&gt;
* libwebp&lt;br /&gt;
* libfreetype6&lt;br /&gt;
* liblua5.3&lt;br /&gt;
* libopenal&lt;br /&gt;
* libogg&lt;br /&gt;
* libvorbis&lt;br /&gt;
* libopusfile&lt;br /&gt;
&lt;br /&gt;
Those are optional:&lt;br /&gt;
&lt;br /&gt;
* libncursesw5&lt;br /&gt;
&lt;br /&gt;
==macOS==&lt;br /&gt;
&lt;br /&gt;
First, you need to [[Getting_the_source|acquire the source code]].&lt;br /&gt;
&lt;br /&gt;
Regardless of what interface you may use to compile the source, you will need [http://www.cmake.org/cmake/resources/software.html CMake] to generate makefiles. You will also need to install [https://developer.apple.com/xcode/ Xcode]. At a minimum, you must install the &amp;quot;Xcode command-line tools&amp;quot; in order to compile anything. You may also install Xcode proper, if you wish to use that IDE.&lt;br /&gt;
&lt;br /&gt;
Once you have the source code and the tools installed, you may actually proceed to compile the source. You have several options:&lt;br /&gt;
* '''Compile the source at the command line'''. This is the easiest if you would just like to compile the game to use yourself and you do not intend to work on the code.&lt;br /&gt;
* '''Compile the source using an IDE'''. This is preferred if you intend on developing the source.&lt;br /&gt;
** Xcode is Apple's flagship IDE.&lt;br /&gt;
** [http://qt-project.org/downloads QtCreator] is cross-platform and provides real-time feedback of syntax errors, a Vim mode, as well as other features.&lt;br /&gt;
** [http://www.codeblocks.org/ Code::Blocks] is also cross-platform but lacks some of the features of Xcode and QtCreator.&lt;br /&gt;
&lt;br /&gt;
===Dependencies===&lt;br /&gt;
&lt;br /&gt;
Precompiled static libs are provided for all dependencies. CMake downloads them at configure time and extracts to &amp;lt;code&amp;gt;daemon/external_deps/macos-amd64-default_&amp;lt;i&amp;gt;&amp;amp;lt;version&amp;amp;gt;&amp;lt;/i&amp;gt;/&amp;lt;/code&amp;gt;. These were produced by the &amp;lt;code&amp;gt;external_deps/build.sh&amp;lt;/code&amp;gt; script, which you could also use to build them yourself if you want to for some reason.&lt;br /&gt;
&lt;br /&gt;
===Configuring with CMake===&lt;br /&gt;
&lt;br /&gt;
# Run CMake.&lt;br /&gt;
# Enter the location of the source code.&lt;br /&gt;
# Enter the location in which you would like to build the source code. This should be a different directory.&lt;br /&gt;
# Click &amp;quot;Configure&amp;quot;. You will be prompted as to which generator you would like to use. If you have Xcode installed, choose that. Wait while the configuration process runs. You may have to set the following:&lt;br /&gt;
## If you have selected to generate Xcode project files, make the &amp;lt;code&amp;gt;SDLMAIN_LIBRARY&amp;lt;/code&amp;gt; field blank. This option is not available if you have the generator set to Unix makefiles.&lt;br /&gt;
# Click &amp;quot;Generate&amp;quot;.&lt;br /&gt;
# You may now close CMake.&lt;br /&gt;
&lt;br /&gt;
===Compiling===&lt;br /&gt;
&lt;br /&gt;
====With Xcode====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Either start Xcode and open the project file (in the build directory you specified) or double-click the project file in Finder.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Open the project file created by CMake, which should be in the build directory you specified.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Change the active target to &amp;quot;ALL_BUILD&amp;quot; and click Product&amp;amp;rarr;Build.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====With Unix Makefiles====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Start Terminal (Applications &amp;amp;rarr; Utilities &amp;amp;rarr; Terminal).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Type the following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /path/to/Unvanquished-build&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If you are on a multi-core or multi-processor machine, you may speed up the process by passing the &amp;lt;code&amp;gt;-j&amp;lt;/code&amp;gt; argument followed by the number of available cores to &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;; e.g., &amp;lt;code&amp;gt;make -j4&amp;lt;/code&amp;gt;. Note that doing so makes reading error messages more difficult, as multiple instances of the compiler will print to the screen at once, causing information to appear out of order.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testing the build===&lt;br /&gt;
&lt;br /&gt;
====With Xcode 4====&lt;br /&gt;
&lt;br /&gt;
To test the game, select the &amp;quot;client&amp;quot; scheme from the combo box on the toolbar, and click the run button or press {{Hotkey|MacCommand}}{{Hotkey|R}}.&lt;br /&gt;
&lt;br /&gt;
=== Building for arm64 (Apple Silicon) architecture ===&lt;br /&gt;
&lt;br /&gt;
Our CMake scripts default to amd64 architecture, but you can also make a native build for the latest ARM-based Macs. Albeit while still relying on Rosetta to run amd64-based Native Client gamelogic binaries.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Install Daemon + Unvanquished dependencies (no pre-built ones for this architecture)&lt;br /&gt;
brew install nettle sdl2 libogg libvorbis opus opusfile web freetype glew openal-soft &lt;br /&gt;
&lt;br /&gt;
cmake path/to/source -DCMAKE_OSX_ARCHITECTURES=arm64 -DOpenAL_ROOT=$(brew --prefix openal-soft)&lt;br /&gt;
&lt;br /&gt;
# If you want to run NaCl (assumes you have built amd64 at least once to download its deps):&lt;br /&gt;
cp path/to/daemon/external_deps/macos-amd64-default_10/{nacl_loader,irt_core-amd64.nexe} .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Windows==&lt;br /&gt;
&lt;br /&gt;
===Visual Studio===&lt;br /&gt;
&lt;br /&gt;
CMake can generate Visual Studio projects for Unvanquished.&lt;br /&gt;
&lt;br /&gt;
# Add _NO_DEBUG_HEAP=1 to your environment variables otherwise performance under the debugger [http://www.massimpressionsprojects.com/dev/altdevblog/2011/07/27/the-unexpected-performance-of-debug-builds/ will be terrible]&lt;br /&gt;
# Run CMake with the source directory as the base directory of your source code (which should contain the directory &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;), and the build directory as a subdirectory of the source directory named &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Click the &amp;lt;b&amp;gt;Open Project&amp;lt;/b&amp;gt; button. Or if you used CMake from the command line, open &amp;lt;code&amp;gt;build/Unvanquished.sln&amp;lt;/code&amp;gt; in Visual Studio.&lt;br /&gt;
# In Visual Studio, choose your desired build type (default: &amp;lt;b&amp;gt;Debug&amp;lt;/b&amp;gt;) from the drop-down menu in the top bar. &amp;lt;b&amp;gt;Debug&amp;lt;/b&amp;gt; runs assertions and has complete debug information, but is slower. &amp;lt;b&amp;gt;RelWithDebInfo&amp;lt;/b&amp;gt; is fast and still fairly usable with the debugger, but assertions don't run and sometimes you can't see the value of a local variable.&lt;br /&gt;
# Use Build &amp;amp;rarr; Build Solution to compile the code. Or just press {{Hotkey|F5}} to build and run, but beware: this will not automatically build cgame or sgame! Only engine changes are automatically rebuilt when you run something from Visual Studio.&lt;br /&gt;
&lt;br /&gt;
====Important Notes====&lt;br /&gt;
&lt;br /&gt;
* Due to limitations with CMake, the startup project cannot be specified. This must be set manually to debug the client with Visual Studio:&lt;br /&gt;
** Right click on client and select &amp;quot;Set as Startup project&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===MinGW===&lt;br /&gt;
&lt;br /&gt;
It is possible to produce a Windows build of Unvanquished with [[MinGW]], as either a Windows or a Linux user. See [[MinGW#Distributions]] for detailed information about the toolchains available for installation.&lt;br /&gt;
&lt;br /&gt;
====Instructions for native Windows build with MSYS2====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Install MSYS2. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Open the ''MSYS2 MinGW 32-bit'' or ''MSYS2 MinGW 64-bit'' terminal, depending on which bitness you want to build. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; Install toolchain:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# For 32-bit replace x86_64 with i686&lt;br /&gt;
pacman -Sy &amp;amp;&amp;amp; pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake make&lt;br /&gt;
&amp;lt;/pre&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Run CMake. If you're building Unvanquished, you may want to use the &amp;lt;code&amp;gt;-DDAEMON_CBSE_PYTHON_PATH=&amp;lt;path&amp;gt;&amp;lt;/code&amp;gt; option in case you want to use a different Python rather than the one in MSYS2. &amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir mybuild &amp;amp;&amp;amp; cd mybuild&lt;br /&gt;
cmake -G &amp;quot;MSYS Makefiles&amp;quot; somepath/Unvanquished&lt;br /&gt;
&amp;lt;/pre&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Build:&lt;br /&gt;
&amp;lt;pre&amp;gt; make -j4 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you would like verbose output (useful to see compiler flags), set the &amp;lt;code&amp;gt;VERBOSE&amp;lt;/code&amp;gt; environment variable before running Make.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export VERBOSE=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may find that the game (or some part of the MSYS2 toolchain!) fails to start due to missing DLL dependencies. Two helpful tools are:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; The strace command in MSYS2, e.g. &amp;lt;code&amp;gt;strace ./daemon&amp;lt;/code&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://github.com/lucasg/Dependencies Dependencies] (a Windows GUI program) &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When distributing MinGW binaries, you need to distribute some additional DLLs besides the ones in the build folder. See [[MinGW#Built-in_DLL_dependencies]].&lt;br /&gt;
&lt;br /&gt;
====MSYS2 Clang====&lt;br /&gt;
In MSYS2, it is possible to build with Clang, rather than GCC as shown as in the above instructions. However, some of our pre-built libraries are incompatible. You need to use the ones from pacman instead.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Create a deps folder with incompatible packages removed. This assumes that the latest version of the prebuilt deps for the mingw package of the appropriate bitness has already been extracted to the &amp;lt;code&amp;gt;windows-${ARCH}-mingw_${VERSION}&amp;lt;/code&amp;gt; directory. In this example, we use &amp;lt;code&amp;gt;windows-amd64-mingw_8&amp;lt;/code&amp;gt;. &amp;lt;pre&amp;gt;&lt;br /&gt;
cd somepath/daemon/external_deps&lt;br /&gt;
mkdir msysclang&lt;br /&gt;
cp windows-amd64-mingw_8 -R msysclang&lt;br /&gt;
find msysclang -depth -name '*freetype*' -o -name '*png*' -o name '*curl*' -o -name '*lua*' | grep -v pnacl | xargs rm -r&lt;br /&gt;
&amp;lt;/pre&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Install those deps from Pacman: &amp;lt;pre&amp;gt;&lt;br /&gt;
# For Daemon&lt;br /&gt;
pacman -Sy &amp;amp;&amp;amp; pacman -S mingw-w64-clang-x86_64-freetype mingw-w64-clang-x86_64-curl mingw-w64-clang-x86_64-libpng&lt;br /&gt;
# For Unvanquished&lt;br /&gt;
pacman -Sy &amp;amp;&amp;amp; pacman -S mingw-w64-clang-x86_64-freetype mingw-w64-clang-x86_64-lua&lt;br /&gt;
&amp;lt;/pre&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Use the deps folder you made when configuring the build: &amp;lt;pre&amp;gt;&lt;br /&gt;
CC=clang CXX=clang++ cmake -G &amp;quot;MSYS Makefiles&amp;quot; -DEXTERNAL_DEPS_DIR=somepath/daemon/external_deps/msysclang /c/path/to/source&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If you see a download progress bar upon invoking CMake, you did the deps stuff wrong.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===QtCreator===&lt;br /&gt;
&lt;br /&gt;
# Install MinGW and follow the above instructions, except select Code::Blocks as the generator.&lt;br /&gt;
# Start QtCreator, and select &amp;quot;Open File or Project&amp;amp;hellip;&amp;quot; from the File menu.&lt;br /&gt;
# Navigate to your source directory and open CMakeLists.txt.&lt;br /&gt;
# At the CMake Wizard, select the same build directory you already configured using CMake. (If you did not chose Code::Blocks as the generator, you will have to start over again, as QtCreator requires a Code::Blocks project file in order to compile the source.)&lt;br /&gt;
# Ensure that a generator is selected in the combo box, and click &amp;quot;Run CMake&amp;quot;. If there is no generator listed, see the [[#Troubleshooting|troubleshooting]] section below.&lt;br /&gt;
# Click &amp;quot;Finish&amp;quot; to close the wizard.&lt;br /&gt;
&lt;br /&gt;
You should now be able to compile, run, and debug the code using QtCreator.&lt;br /&gt;
&lt;br /&gt;
====Troubleshooting====&lt;br /&gt;
&lt;br /&gt;
If at the &amp;quot;Run CMake&amp;quot; prompt of the the CMake Wizard, select &amp;quot;Run CMake&amp;quot; and are warned that no generator was selected, and notice that there are no generators in the combo box, you will likely have to [http://doc.qt.digia.com/qtcreator-2.4/creator-tool-chains.html manually configure your toolchain]. Select &amp;quot;Options&amp;amp;hellip;&amp;quot; from the &amp;quot;Tools&amp;quot; menu, then navigate to &amp;quot;Build &amp;amp;amp; Run&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
At the options window,&lt;br /&gt;
* Go to the &amp;quot;Kits&amp;quot; tab, and mouse over the &amp;quot;Desktop (default)&amp;quot; kit under &amp;quot;Manual&amp;quot;. If there were any errors in configuring this kit, they will be displayed in the tool tip. If there are problems, select the kit. You may need to manually specify the location of the MinGW debugger, for example, which is typically &amp;lt;code&amp;gt;C:\MinGW\bin\gdb.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Go to the &amp;quot;Compilers&amp;quot; tab, and ensure that MinGW is present. If not, you will need to add it manually.&lt;br /&gt;
&lt;br /&gt;
==Linux==&lt;br /&gt;
&lt;br /&gt;
===Dependencies===&lt;br /&gt;
&lt;br /&gt;
{{TODO|This may be incomplete.}}&lt;br /&gt;
&lt;br /&gt;
====Debian/Ubuntu====&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install build-essential cmake libcurl4-gnutls-dev \&lt;br /&gt;
  libglew-dev libgmp-dev nettle-dev zlib1g-dev libncursesw5-dev \&lt;br /&gt;
  libsdl2-dev libopenal-dev libjpeg-dev libpng-dev libwebp-dev \&lt;br /&gt;
  libogg-dev libvorbis-dev libopusfile-dev \&lt;br /&gt;
  libfreetype6-dev \&lt;br /&gt;
  liblua5.3-dev \&lt;br /&gt;
  python3-yaml python3-jinja2&lt;br /&gt;
&lt;br /&gt;
If the version of WebP supplied by your version of Debian or Ubuntu is older than v0.2.0, you will need to [https://code.google.com/p/webp/downloads/detail?name=libwebp-0.2.0.tar.gz download] and [https://developers.google.com/speed/webp/docs/compiling#unix compile it from source]. After compiling and installing with &amp;lt;code&amp;gt;sudo make install&amp;lt;/code&amp;gt;, in CMake, you'll need to set &amp;lt;code&amp;gt;WEBP_INCLUDE_DIR&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/usr/local/include/webp&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;WEBP_LIBRARY&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/usr/local/lib/libwebp.so&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Developpment package name may differs, for example &amp;lt;code&amp;gt;libgmp-dev&amp;lt;/code&amp;gt; may be named &amp;lt;code&amp;gt;libgmp3-dev&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;libglew-dev&amp;lt;/code&amp;gt; may be named &amp;lt;code&amp;gt;libglew1.7-dev&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We have a &amp;lt;code&amp;gt;debian&amp;lt;/code&amp;gt; directory in the source tree, you can check what's missing this way.&lt;br /&gt;
&lt;br /&gt;
 cd &amp;lt;var&amp;gt;path/to/unvanquished&amp;lt;/var&amp;gt;&lt;br /&gt;
 dpkg-checkbuilddeps&lt;br /&gt;
&lt;br /&gt;
Then install the listed packages this way:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install &amp;lt;var&amp;gt;package list&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;dpkg-checkbuilddeps&amp;lt;/code&amp;gt; command produces no output if you already have the required dependencies.&lt;br /&gt;
&lt;br /&gt;
Note that you only need &amp;lt;code&amp;gt;debhelper&amp;lt;/code&amp;gt; to build &amp;lt;code&amp;gt;.deb&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&lt;br /&gt;
====Fedora====&lt;br /&gt;
&lt;br /&gt;
Line 1 of the packages is basic dev tools. Lines 2-3 are Daemon dependencies. Line 4 is (additional) Unvanquished dependencies.&lt;br /&gt;
&lt;br /&gt;
 $ sudo dnf install \&lt;br /&gt;
   cmake gcc gcc-c++ \&lt;br /&gt;
   {freetype,glew,gmp,mesa-libGL,ncurses,nettle,openal-soft,opus,opusfile,SDL2}-devel \&lt;br /&gt;
   lib{curl,jpeg-turbo,png12,vorbis,webp}-devel \&lt;br /&gt;
   lua-devel python3-pyyaml python3-jinja2&lt;br /&gt;
&lt;br /&gt;
====Gentoo====&lt;br /&gt;
&lt;br /&gt;
 $ emerge curl freetype glew gmp jpeg ncurses media-sound/opus-tools libogg openal libpng libsdl libvorbis sys-libs/zlib&lt;br /&gt;
&lt;br /&gt;
====openSUSE====&lt;br /&gt;
&lt;br /&gt;
 $ sudo install zypper gcc gcc-c++ Mesa-libGL-devel SDL-devel libjpeg8-devel \&lt;br /&gt;
   libpng12-devel glew-devel webp-devel ncurses-devel gmp-devel libcurl-devel \&lt;br /&gt;
   libnettle-devel openal-soft-devel libvorbis-devel&lt;br /&gt;
&lt;br /&gt;
The latest version of WebP must be installed manually (FIXME: why, if there is webp-devel in the zypper package list?):&lt;br /&gt;
&lt;br /&gt;
 $ cd Unvanquished/daemon/external_deps&lt;br /&gt;
 $ ./build.sh linux-amd64-default webp naclsdk naclports&lt;br /&gt;
 $ ./build.sh linux-amd64-default install&lt;br /&gt;
&lt;br /&gt;
You must disable curses (set &amp;lt;code&amp;gt;USE_CURSES&amp;lt;/code&amp;gt; appropriately in CMake) as failing to do so will cause Unvanquished to crash on startup.&lt;br /&gt;
&lt;br /&gt;
===Configuring the code with CMake===&lt;br /&gt;
&lt;br /&gt;
After you have [[Getting the source|acquired the source code]], you can proceed to compile. Unvanquished uses CMake, so you must have that installed. &lt;br /&gt;
&lt;br /&gt;
====Using ccmake (curses-based front-end)====&lt;br /&gt;
&lt;br /&gt;
On Debian or Ubuntu:&lt;br /&gt;
&lt;br /&gt;
 $ sudo apt-get install cmake-curses-gui&lt;br /&gt;
&lt;br /&gt;
On Gentoo you should set the '''ncurses''' USE flag either globally or individually, just for cmake.&lt;br /&gt;
To add the USE flag globally, edit the USE array in /etc/make.conf for it to include '''ncurses'''.&lt;br /&gt;
To only install cmake with ncurses functionality, you could do the following:&lt;br /&gt;
&lt;br /&gt;
 $ echo 'dev-util/cmake ncurses' &amp;gt;&amp;gt; /etc/portage/package.use &amp;amp;&amp;amp; emerge cmake&lt;br /&gt;
&lt;br /&gt;
Note that in Ubuntu, &amp;lt;code&amp;gt;cmake-curses-gui&amp;lt;/code&amp;gt; is in Universe, which you may have to enable with &amp;lt;code&amp;gt;software-properties-gtk&amp;lt;/code&amp;gt;. Make sure to reload the software sources with &amp;lt;code&amp;gt;sudo apt-get update&amp;lt;/code&amp;gt; afterwards.&lt;br /&gt;
&lt;br /&gt;
Optionally: to use clang (rather than the default gcc and g++ compilers) export the CC and CXX variables before running cmake:&lt;br /&gt;
&lt;br /&gt;
 $ export CC=&amp;quot;clang&amp;quot;&lt;br /&gt;
 $ export CXX=&amp;quot;clang++ -stdlib=libc++ -lc++abi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Next, configure the codebase.&lt;br /&gt;
&lt;br /&gt;
 $ cd &amp;lt;var&amp;gt;/path/to/unvanquished&amp;lt;/var&amp;gt;&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ ccmake ..&lt;br /&gt;
&lt;br /&gt;
In Debian or Ubuntu you can build a package this way (you need &amp;lt;code&amp;gt;devscripts&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;fakeroot&amp;lt;/code&amp;gt; packages):&lt;br /&gt;
&lt;br /&gt;
 $ cd &amp;lt;var&amp;gt;/path/to/unvanquished&amp;lt;/var&amp;gt;&lt;br /&gt;
 $ fakeroot dpkg-buildpackage -b -uc&lt;br /&gt;
 $ sudo dpkg -i &amp;lt;var&amp;gt;../unvanquished_*.deb&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once in &amp;lt;code&amp;gt;ccmake&amp;lt;/code&amp;gt;, use the following keys:&lt;br /&gt;
&lt;br /&gt;
* Press {{Hotkey|c}} to configure. If an error occurs during this phase, make note of it and press {{Hotkey|e}} to dismiss it.&lt;br /&gt;
* Use the up and down arrow keys to navigate the compilation options.&lt;br /&gt;
* Press {{Hotkey|Enter}} to enable or disable boolean options (i.e., on/off) or to edit textual options.&lt;br /&gt;
** Press {{Hotkey|Esc}} when editing a textual option to cancel the change.&lt;br /&gt;
&lt;br /&gt;
Once you have finished the configuration process, press {{Hotkey|C}} again, then {{Hotkey|G}} to generate the makefile.&lt;br /&gt;
&lt;br /&gt;
====Using cmake-qt-gui (graphical front-end)====&lt;br /&gt;
&lt;br /&gt;
This graphical front end for cmake has its own package you must install:&lt;br /&gt;
&lt;br /&gt;
=====Debian/Ubuntu=====&lt;br /&gt;
&lt;br /&gt;
 $ sudo apt-get install cmake-qt-gui&lt;br /&gt;
&lt;br /&gt;
=====Gentoo=====&lt;br /&gt;
&lt;br /&gt;
With the '''qt4''' USE flag enabled:&lt;br /&gt;
&lt;br /&gt;
 $ emerge cmake&lt;br /&gt;
&lt;br /&gt;
Once installed, run with &amp;lt;code&amp;gt;cmake-gui&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cmake-qt-gui.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
# Set the path where you have the source code downloaded.&lt;br /&gt;
# Set the path where you would like to build the engine. This may be the same directory if you wish.&lt;br /&gt;
# Click 'Configure'.&lt;br /&gt;
# Click 'Generate'.&lt;br /&gt;
&lt;br /&gt;
====Unnecessary libraries====&lt;br /&gt;
&lt;br /&gt;
Regardless of which front-end to cmake you use, you may want to disable some libraries that are not strictly necessary:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;USE_BREAKPAD&amp;lt;/code&amp;gt; &amp;amp;mdash; Disabling this will cause the game to not produce crashdumps on failure.&lt;br /&gt;
* &amp;lt;code&amp;gt;USE_CURSES&amp;lt;/code&amp;gt; &amp;amp;mdash; Disabling this will cause the external (not in-game) console to not use curses; it will not be scrollable and will be similar to the console in the original Tremulous. This does in no way affect gameplay.&lt;br /&gt;
&lt;br /&gt;
===Compiling===&lt;br /&gt;
&lt;br /&gt;
 $ cd &amp;lt;var&amp;gt;path/to/unvanquished/build&amp;lt;/var&amp;gt;&lt;br /&gt;
 $ make -j4&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;-j&amp;lt;/code&amp;gt; switch to make allows you to speed up the compilation process by running it in multiple threads; set the number following this to the number of cores your processor(s) have.&lt;br /&gt;
&lt;br /&gt;
==FreeBSD==&lt;br /&gt;
&lt;br /&gt;
While building on FreeBSD is usually very similar to building on Linux, the PNaCl toolchain not being native to FreeBSD means not everything can be built on FreeBSD. See the [[Systems/FreeBSD]] page for details and dedicated instructions.&lt;br /&gt;
&lt;br /&gt;
==Acquiring the Game Files==&lt;br /&gt;
&lt;br /&gt;
===Acquiring mandatory game files===&lt;br /&gt;
&lt;br /&gt;
The game files are not in the Git repository, and must be downloaded separately. They must be saved to the [[Game locations|data location]] for your system.&lt;br /&gt;
&lt;br /&gt;
Linux users may use the &amp;lt;code&amp;gt;download-paks&amp;lt;/code&amp;gt; script that is distributed with the source code, which requires one of curl, wget or aria2 to be installed:&lt;br /&gt;
&lt;br /&gt;
 $ cd &amp;lt;var&amp;gt;path/to/unvanquished/build&amp;lt;/var&amp;gt;&lt;br /&gt;
 $ ../download-paks pkg&lt;br /&gt;
&lt;br /&gt;
Otherwise, the set of necessary packages can be extracted from the [https://github.com/Unvanquished/Unvanquished/releases latest release], or downloaded a la carte from the [http://dl.unvanquished.net/pkg/ package index].&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Compiling_the_source&amp;diff=8768</id>
		<title>Compiling the source</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Compiling_the_source&amp;diff=8768"/>
				<updated>2024-10-27T14:20:45Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* macOS - Bundling the Application */ NUKE NUKE NUKE&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Dependencies==&lt;br /&gt;
&lt;br /&gt;
{{Note|content=In case this happens to become outdated, the up-to-date documentation can be found in the {{SourceFile|parameters=#unvanquished|README.md}} file in source repository.}}&lt;br /&gt;
&lt;br /&gt;
The game requires some dependencies to be built, which are the same on all systems:&lt;br /&gt;
&lt;br /&gt;
* cmake&lt;br /&gt;
* python3-yaml&lt;br /&gt;
* python3-jinja2&lt;br /&gt;
* A C++11 able compiler (those are known to work: clang (&amp;gt;= 3.5), gcc (&amp;gt;= 4.8), visual studio (&amp;gt;= 2019))&lt;br /&gt;
* zlib1g&lt;br /&gt;
* libgmp&lt;br /&gt;
* nettle&lt;br /&gt;
* libcurl4-gnutls&lt;br /&gt;
* libsdl2&lt;br /&gt;
* libglew&lt;br /&gt;
* libpng&lt;br /&gt;
* libjpeg-turbo8&lt;br /&gt;
* libwebp&lt;br /&gt;
* libfreetype6&lt;br /&gt;
* liblua5.3&lt;br /&gt;
* libopenal&lt;br /&gt;
* libogg&lt;br /&gt;
* libvorbis&lt;br /&gt;
* libopusfile&lt;br /&gt;
&lt;br /&gt;
Those are optional:&lt;br /&gt;
&lt;br /&gt;
* libncursesw5&lt;br /&gt;
&lt;br /&gt;
==macOS==&lt;br /&gt;
&lt;br /&gt;
First, you need to [[Getting_the_source|acquire the source code]].&lt;br /&gt;
&lt;br /&gt;
Regardless of what interface you may use to compile the source, you will need [http://www.cmake.org/cmake/resources/software.html CMake] to generate makefiles. You will also need to install [https://developer.apple.com/xcode/ Xcode]. At a minimum, you must install the &amp;quot;Xcode command-line tools&amp;quot; in order to compile anything. You may also install Xcode proper, if you wish to use that IDE.&lt;br /&gt;
&lt;br /&gt;
Once you have the source code and the tools installed, you may actually proceed to compile the source. You have several options:&lt;br /&gt;
* '''Compile the source at the command line'''. This is the easiest if you would just like to compile the game to use yourself and you do not intend to work on the code.&lt;br /&gt;
* '''Compile the source using an IDE'''. This is preferred if you intend on developing the source.&lt;br /&gt;
** Xcode is Apple's flagship IDE.&lt;br /&gt;
** [http://qt-project.org/downloads QtCreator] is cross-platform and provides real-time feedback of syntax errors, a Vim mode, as well as other features.&lt;br /&gt;
** [http://www.codeblocks.org/ Code::Blocks] is also cross-platform but lacks some of the features of Xcode and QtCreator.&lt;br /&gt;
&lt;br /&gt;
===Dependencies===&lt;br /&gt;
&lt;br /&gt;
Precompiled static libs are provided for all dependencies. CMake downloads them at configure time and extracts to &amp;lt;code&amp;gt;daemon/external_deps/macos-amd64-default_&amp;lt;i&amp;gt;&amp;amp;lt;version&amp;amp;gt;&amp;lt;/i&amp;gt;/&amp;lt;/code&amp;gt;. These were produced by the &amp;lt;code&amp;gt;external_deps/build.sh&amp;lt;/code&amp;gt; script, which you could also use to build them yourself if you want to for some reason.&lt;br /&gt;
&lt;br /&gt;
===Configuring with CMake===&lt;br /&gt;
&lt;br /&gt;
# Run CMake.&lt;br /&gt;
# Enter the location of the source code.&lt;br /&gt;
# Enter the location in which you would like to build the source code. This should be a different directory.&lt;br /&gt;
# Click &amp;quot;Configure&amp;quot;. You will be prompted as to which generator you would like to use. If you have Xcode installed, choose that. Wait while the configuration process runs. You may have to set the following:&lt;br /&gt;
## If you have selected to generate Xcode project files, make the &amp;lt;code&amp;gt;SDLMAIN_LIBRARY&amp;lt;/code&amp;gt; field blank. This option is not available if you have the generator set to Unix makefiles.&lt;br /&gt;
# Click &amp;quot;Generate&amp;quot;.&lt;br /&gt;
# You may now close CMake.&lt;br /&gt;
&lt;br /&gt;
===Compiling===&lt;br /&gt;
&lt;br /&gt;
====With Xcode====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Either start Xcode and open the project file (in the build directory you specified) or double-click the project file in Finder.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Open the project file created by CMake, which should be in the build directory you specified.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Change the active target to &amp;quot;ALL_BUILD&amp;quot; and click Product&amp;amp;rarr;Build.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====With Unix Makefiles====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Start Terminal (Applications &amp;amp;rarr; Utilities &amp;amp;rarr; Terminal).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Type the following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /path/to/Unvanquished-build&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If you are on a multi-core or multi-processor machine, you may speed up the process by passing the &amp;lt;code&amp;gt;-j&amp;lt;/code&amp;gt; argument followed by the number of available cores to &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;; e.g., &amp;lt;code&amp;gt;make -j4&amp;lt;/code&amp;gt;. Note that doing so makes reading error messages more difficult, as multiple instances of the compiler will print to the screen at once, causing information to appear out of order.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testing the build===&lt;br /&gt;
&lt;br /&gt;
====With Xcode 4====&lt;br /&gt;
&lt;br /&gt;
To test the game, select the &amp;quot;client&amp;quot; scheme from the combo box on the toolbar, and click the run button or press {{Hotkey|MacCommand}}{{Hotkey|R}}.&lt;br /&gt;
&lt;br /&gt;
==Windows==&lt;br /&gt;
&lt;br /&gt;
===Visual Studio===&lt;br /&gt;
&lt;br /&gt;
CMake can generate Visual Studio projects for Unvanquished.&lt;br /&gt;
&lt;br /&gt;
# Add _NO_DEBUG_HEAP=1 to your environment variables otherwise performance under the debugger [http://www.massimpressionsprojects.com/dev/altdevblog/2011/07/27/the-unexpected-performance-of-debug-builds/ will be terrible]&lt;br /&gt;
# Run CMake with the source directory as the base directory of your source code (which should contain the directory &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;), and the build directory as a subdirectory of the source directory named &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Click the &amp;lt;b&amp;gt;Open Project&amp;lt;/b&amp;gt; button. Or if you used CMake from the command line, open &amp;lt;code&amp;gt;build/Unvanquished.sln&amp;lt;/code&amp;gt; in Visual Studio.&lt;br /&gt;
# In Visual Studio, choose your desired build type (default: &amp;lt;b&amp;gt;Debug&amp;lt;/b&amp;gt;) from the drop-down menu in the top bar. &amp;lt;b&amp;gt;Debug&amp;lt;/b&amp;gt; runs assertions and has complete debug information, but is slower. &amp;lt;b&amp;gt;RelWithDebInfo&amp;lt;/b&amp;gt; is fast and still fairly usable with the debugger, but assertions don't run and sometimes you can't see the value of a local variable.&lt;br /&gt;
# Use Build &amp;amp;rarr; Build Solution to compile the code. Or just press {{Hotkey|F5}} to build and run, but beware: this will not automatically build cgame or sgame! Only engine changes are automatically rebuilt when you run something from Visual Studio.&lt;br /&gt;
&lt;br /&gt;
====Important Notes====&lt;br /&gt;
&lt;br /&gt;
* Due to limitations with CMake, the startup project cannot be specified. This must be set manually to debug the client with Visual Studio:&lt;br /&gt;
** Right click on client and select &amp;quot;Set as Startup project&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===MinGW===&lt;br /&gt;
&lt;br /&gt;
It is possible to produce a Windows build of Unvanquished with [[MinGW]], as either a Windows or a Linux user. See [[MinGW#Distributions]] for detailed information about the toolchains available for installation.&lt;br /&gt;
&lt;br /&gt;
====Instructions for native Windows build with MSYS2====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Install MSYS2. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Open the ''MSYS2 MinGW 32-bit'' or ''MSYS2 MinGW 64-bit'' terminal, depending on which bitness you want to build. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; Install toolchain:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# For 32-bit replace x86_64 with i686&lt;br /&gt;
pacman -Sy &amp;amp;&amp;amp; pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake make&lt;br /&gt;
&amp;lt;/pre&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Run CMake. If you're building Unvanquished, you may want to use the &amp;lt;code&amp;gt;-DDAEMON_CBSE_PYTHON_PATH=&amp;lt;path&amp;gt;&amp;lt;/code&amp;gt; option in case you want to use a different Python rather than the one in MSYS2. &amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir mybuild &amp;amp;&amp;amp; cd mybuild&lt;br /&gt;
cmake -G &amp;quot;MSYS Makefiles&amp;quot; somepath/Unvanquished&lt;br /&gt;
&amp;lt;/pre&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Build:&lt;br /&gt;
&amp;lt;pre&amp;gt; make -j4 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you would like verbose output (useful to see compiler flags), set the &amp;lt;code&amp;gt;VERBOSE&amp;lt;/code&amp;gt; environment variable before running Make.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export VERBOSE=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may find that the game (or some part of the MSYS2 toolchain!) fails to start due to missing DLL dependencies. Two helpful tools are:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; The strace command in MSYS2, e.g. &amp;lt;code&amp;gt;strace ./daemon&amp;lt;/code&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://github.com/lucasg/Dependencies Dependencies] (a Windows GUI program) &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When distributing MinGW binaries, you need to distribute some additional DLLs besides the ones in the build folder. See [[MinGW#Built-in_DLL_dependencies]].&lt;br /&gt;
&lt;br /&gt;
====MSYS2 Clang====&lt;br /&gt;
In MSYS2, it is possible to build with Clang, rather than GCC as shown as in the above instructions. However, some of our pre-built libraries are incompatible. You need to use the ones from pacman instead.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Create a deps folder with incompatible packages removed. This assumes that the latest version of the prebuilt deps for the mingw package of the appropriate bitness has already been extracted to the &amp;lt;code&amp;gt;windows-${ARCH}-mingw_${VERSION}&amp;lt;/code&amp;gt; directory. In this example, we use &amp;lt;code&amp;gt;windows-amd64-mingw_8&amp;lt;/code&amp;gt;. &amp;lt;pre&amp;gt;&lt;br /&gt;
cd somepath/daemon/external_deps&lt;br /&gt;
mkdir msysclang&lt;br /&gt;
cp windows-amd64-mingw_8 -R msysclang&lt;br /&gt;
find msysclang -depth -name '*freetype*' -o -name '*png*' -o name '*curl*' -o -name '*lua*' | grep -v pnacl | xargs rm -r&lt;br /&gt;
&amp;lt;/pre&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Install those deps from Pacman: &amp;lt;pre&amp;gt;&lt;br /&gt;
# For Daemon&lt;br /&gt;
pacman -Sy &amp;amp;&amp;amp; pacman -S mingw-w64-clang-x86_64-freetype mingw-w64-clang-x86_64-curl mingw-w64-clang-x86_64-libpng&lt;br /&gt;
# For Unvanquished&lt;br /&gt;
pacman -Sy &amp;amp;&amp;amp; pacman -S mingw-w64-clang-x86_64-freetype mingw-w64-clang-x86_64-lua&lt;br /&gt;
&amp;lt;/pre&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Use the deps folder you made when configuring the build: &amp;lt;pre&amp;gt;&lt;br /&gt;
CC=clang CXX=clang++ cmake -G &amp;quot;MSYS Makefiles&amp;quot; -DEXTERNAL_DEPS_DIR=somepath/daemon/external_deps/msysclang /c/path/to/source&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If you see a download progress bar upon invoking CMake, you did the deps stuff wrong.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===QtCreator===&lt;br /&gt;
&lt;br /&gt;
# Install MinGW and follow the above instructions, except select Code::Blocks as the generator.&lt;br /&gt;
# Start QtCreator, and select &amp;quot;Open File or Project&amp;amp;hellip;&amp;quot; from the File menu.&lt;br /&gt;
# Navigate to your source directory and open CMakeLists.txt.&lt;br /&gt;
# At the CMake Wizard, select the same build directory you already configured using CMake. (If you did not chose Code::Blocks as the generator, you will have to start over again, as QtCreator requires a Code::Blocks project file in order to compile the source.)&lt;br /&gt;
# Ensure that a generator is selected in the combo box, and click &amp;quot;Run CMake&amp;quot;. If there is no generator listed, see the [[#Troubleshooting|troubleshooting]] section below.&lt;br /&gt;
# Click &amp;quot;Finish&amp;quot; to close the wizard.&lt;br /&gt;
&lt;br /&gt;
You should now be able to compile, run, and debug the code using QtCreator.&lt;br /&gt;
&lt;br /&gt;
====Troubleshooting====&lt;br /&gt;
&lt;br /&gt;
If at the &amp;quot;Run CMake&amp;quot; prompt of the the CMake Wizard, select &amp;quot;Run CMake&amp;quot; and are warned that no generator was selected, and notice that there are no generators in the combo box, you will likely have to [http://doc.qt.digia.com/qtcreator-2.4/creator-tool-chains.html manually configure your toolchain]. Select &amp;quot;Options&amp;amp;hellip;&amp;quot; from the &amp;quot;Tools&amp;quot; menu, then navigate to &amp;quot;Build &amp;amp;amp; Run&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
At the options window,&lt;br /&gt;
* Go to the &amp;quot;Kits&amp;quot; tab, and mouse over the &amp;quot;Desktop (default)&amp;quot; kit under &amp;quot;Manual&amp;quot;. If there were any errors in configuring this kit, they will be displayed in the tool tip. If there are problems, select the kit. You may need to manually specify the location of the MinGW debugger, for example, which is typically &amp;lt;code&amp;gt;C:\MinGW\bin\gdb.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Go to the &amp;quot;Compilers&amp;quot; tab, and ensure that MinGW is present. If not, you will need to add it manually.&lt;br /&gt;
&lt;br /&gt;
==Linux==&lt;br /&gt;
&lt;br /&gt;
===Dependencies===&lt;br /&gt;
&lt;br /&gt;
{{TODO|This may be incomplete.}}&lt;br /&gt;
&lt;br /&gt;
====Debian/Ubuntu====&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install build-essential cmake libcurl4-gnutls-dev \&lt;br /&gt;
  libglew-dev libgmp-dev nettle-dev zlib1g-dev libncursesw5-dev \&lt;br /&gt;
  libsdl2-dev libopenal-dev libjpeg-dev libpng-dev libwebp-dev \&lt;br /&gt;
  libogg-dev libvorbis-dev libopusfile-dev \&lt;br /&gt;
  libfreetype6-dev \&lt;br /&gt;
  liblua5.3-dev \&lt;br /&gt;
  python3-yaml python3-jinja2&lt;br /&gt;
&lt;br /&gt;
If the version of WebP supplied by your version of Debian or Ubuntu is older than v0.2.0, you will need to [https://code.google.com/p/webp/downloads/detail?name=libwebp-0.2.0.tar.gz download] and [https://developers.google.com/speed/webp/docs/compiling#unix compile it from source]. After compiling and installing with &amp;lt;code&amp;gt;sudo make install&amp;lt;/code&amp;gt;, in CMake, you'll need to set &amp;lt;code&amp;gt;WEBP_INCLUDE_DIR&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/usr/local/include/webp&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;WEBP_LIBRARY&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/usr/local/lib/libwebp.so&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Developpment package name may differs, for example &amp;lt;code&amp;gt;libgmp-dev&amp;lt;/code&amp;gt; may be named &amp;lt;code&amp;gt;libgmp3-dev&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;libglew-dev&amp;lt;/code&amp;gt; may be named &amp;lt;code&amp;gt;libglew1.7-dev&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We have a &amp;lt;code&amp;gt;debian&amp;lt;/code&amp;gt; directory in the source tree, you can check what's missing this way.&lt;br /&gt;
&lt;br /&gt;
 cd &amp;lt;var&amp;gt;path/to/unvanquished&amp;lt;/var&amp;gt;&lt;br /&gt;
 dpkg-checkbuilddeps&lt;br /&gt;
&lt;br /&gt;
Then install the listed packages this way:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install &amp;lt;var&amp;gt;package list&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;dpkg-checkbuilddeps&amp;lt;/code&amp;gt; command produces no output if you already have the required dependencies.&lt;br /&gt;
&lt;br /&gt;
Note that you only need &amp;lt;code&amp;gt;debhelper&amp;lt;/code&amp;gt; to build &amp;lt;code&amp;gt;.deb&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&lt;br /&gt;
====Fedora====&lt;br /&gt;
&lt;br /&gt;
Line 1 of the packages is basic dev tools. Lines 2-3 are Daemon dependencies. Line 4 is (additional) Unvanquished dependencies.&lt;br /&gt;
&lt;br /&gt;
 $ sudo dnf install \&lt;br /&gt;
   cmake gcc gcc-c++ \&lt;br /&gt;
   {freetype,glew,gmp,mesa-libGL,ncurses,nettle,openal-soft,opus,opusfile,SDL2}-devel \&lt;br /&gt;
   lib{curl,jpeg-turbo,png12,vorbis,webp}-devel \&lt;br /&gt;
   lua-devel python3-pyyaml python3-jinja2&lt;br /&gt;
&lt;br /&gt;
====Gentoo====&lt;br /&gt;
&lt;br /&gt;
 $ emerge curl freetype glew gmp jpeg ncurses media-sound/opus-tools libogg openal libpng libsdl libvorbis sys-libs/zlib&lt;br /&gt;
&lt;br /&gt;
====openSUSE====&lt;br /&gt;
&lt;br /&gt;
 $ sudo install zypper gcc gcc-c++ Mesa-libGL-devel SDL-devel libjpeg8-devel \&lt;br /&gt;
   libpng12-devel glew-devel webp-devel ncurses-devel gmp-devel libcurl-devel \&lt;br /&gt;
   libnettle-devel openal-soft-devel libvorbis-devel&lt;br /&gt;
&lt;br /&gt;
The latest version of WebP must be installed manually (FIXME: why, if there is webp-devel in the zypper package list?):&lt;br /&gt;
&lt;br /&gt;
 $ cd Unvanquished/daemon/external_deps&lt;br /&gt;
 $ ./build.sh linux-amd64-default webp naclsdk naclports&lt;br /&gt;
 $ ./build.sh linux-amd64-default install&lt;br /&gt;
&lt;br /&gt;
You must disable curses (set &amp;lt;code&amp;gt;USE_CURSES&amp;lt;/code&amp;gt; appropriately in CMake) as failing to do so will cause Unvanquished to crash on startup.&lt;br /&gt;
&lt;br /&gt;
===Configuring the code with CMake===&lt;br /&gt;
&lt;br /&gt;
After you have [[Getting the source|acquired the source code]], you can proceed to compile. Unvanquished uses CMake, so you must have that installed. &lt;br /&gt;
&lt;br /&gt;
====Using ccmake (curses-based front-end)====&lt;br /&gt;
&lt;br /&gt;
On Debian or Ubuntu:&lt;br /&gt;
&lt;br /&gt;
 $ sudo apt-get install cmake-curses-gui&lt;br /&gt;
&lt;br /&gt;
On Gentoo you should set the '''ncurses''' USE flag either globally or individually, just for cmake.&lt;br /&gt;
To add the USE flag globally, edit the USE array in /etc/make.conf for it to include '''ncurses'''.&lt;br /&gt;
To only install cmake with ncurses functionality, you could do the following:&lt;br /&gt;
&lt;br /&gt;
 $ echo 'dev-util/cmake ncurses' &amp;gt;&amp;gt; /etc/portage/package.use &amp;amp;&amp;amp; emerge cmake&lt;br /&gt;
&lt;br /&gt;
Note that in Ubuntu, &amp;lt;code&amp;gt;cmake-curses-gui&amp;lt;/code&amp;gt; is in Universe, which you may have to enable with &amp;lt;code&amp;gt;software-properties-gtk&amp;lt;/code&amp;gt;. Make sure to reload the software sources with &amp;lt;code&amp;gt;sudo apt-get update&amp;lt;/code&amp;gt; afterwards.&lt;br /&gt;
&lt;br /&gt;
Optionally: to use clang (rather than the default gcc and g++ compilers) export the CC and CXX variables before running cmake:&lt;br /&gt;
&lt;br /&gt;
 $ export CC=&amp;quot;clang&amp;quot;&lt;br /&gt;
 $ export CXX=&amp;quot;clang++ -stdlib=libc++ -lc++abi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Next, configure the codebase.&lt;br /&gt;
&lt;br /&gt;
 $ cd &amp;lt;var&amp;gt;/path/to/unvanquished&amp;lt;/var&amp;gt;&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ ccmake ..&lt;br /&gt;
&lt;br /&gt;
In Debian or Ubuntu you can build a package this way (you need &amp;lt;code&amp;gt;devscripts&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;fakeroot&amp;lt;/code&amp;gt; packages):&lt;br /&gt;
&lt;br /&gt;
 $ cd &amp;lt;var&amp;gt;/path/to/unvanquished&amp;lt;/var&amp;gt;&lt;br /&gt;
 $ fakeroot dpkg-buildpackage -b -uc&lt;br /&gt;
 $ sudo dpkg -i &amp;lt;var&amp;gt;../unvanquished_*.deb&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once in &amp;lt;code&amp;gt;ccmake&amp;lt;/code&amp;gt;, use the following keys:&lt;br /&gt;
&lt;br /&gt;
* Press {{Hotkey|c}} to configure. If an error occurs during this phase, make note of it and press {{Hotkey|e}} to dismiss it.&lt;br /&gt;
* Use the up and down arrow keys to navigate the compilation options.&lt;br /&gt;
* Press {{Hotkey|Enter}} to enable or disable boolean options (i.e., on/off) or to edit textual options.&lt;br /&gt;
** Press {{Hotkey|Esc}} when editing a textual option to cancel the change.&lt;br /&gt;
&lt;br /&gt;
Once you have finished the configuration process, press {{Hotkey|C}} again, then {{Hotkey|G}} to generate the makefile.&lt;br /&gt;
&lt;br /&gt;
====Using cmake-qt-gui (graphical front-end)====&lt;br /&gt;
&lt;br /&gt;
This graphical front end for cmake has its own package you must install:&lt;br /&gt;
&lt;br /&gt;
=====Debian/Ubuntu=====&lt;br /&gt;
&lt;br /&gt;
 $ sudo apt-get install cmake-qt-gui&lt;br /&gt;
&lt;br /&gt;
=====Gentoo=====&lt;br /&gt;
&lt;br /&gt;
With the '''qt4''' USE flag enabled:&lt;br /&gt;
&lt;br /&gt;
 $ emerge cmake&lt;br /&gt;
&lt;br /&gt;
Once installed, run with &amp;lt;code&amp;gt;cmake-gui&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cmake-qt-gui.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
# Set the path where you have the source code downloaded.&lt;br /&gt;
# Set the path where you would like to build the engine. This may be the same directory if you wish.&lt;br /&gt;
# Click 'Configure'.&lt;br /&gt;
# Click 'Generate'.&lt;br /&gt;
&lt;br /&gt;
====Unnecessary libraries====&lt;br /&gt;
&lt;br /&gt;
Regardless of which front-end to cmake you use, you may want to disable some libraries that are not strictly necessary:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;USE_BREAKPAD&amp;lt;/code&amp;gt; &amp;amp;mdash; Disabling this will cause the game to not produce crashdumps on failure.&lt;br /&gt;
* &amp;lt;code&amp;gt;USE_CURSES&amp;lt;/code&amp;gt; &amp;amp;mdash; Disabling this will cause the external (not in-game) console to not use curses; it will not be scrollable and will be similar to the console in the original Tremulous. This does in no way affect gameplay.&lt;br /&gt;
&lt;br /&gt;
===Compiling===&lt;br /&gt;
&lt;br /&gt;
 $ cd &amp;lt;var&amp;gt;path/to/unvanquished/build&amp;lt;/var&amp;gt;&lt;br /&gt;
 $ make -j4&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;-j&amp;lt;/code&amp;gt; switch to make allows you to speed up the compilation process by running it in multiple threads; set the number following this to the number of cores your processor(s) have.&lt;br /&gt;
&lt;br /&gt;
==FreeBSD==&lt;br /&gt;
&lt;br /&gt;
While building on FreeBSD is usually very similar to building on Linux, the PNaCl toolchain not being native to FreeBSD means not everything can be built on FreeBSD. See the [[Systems/FreeBSD]] page for details and dedicated instructions.&lt;br /&gt;
&lt;br /&gt;
==Acquiring the Game Files==&lt;br /&gt;
&lt;br /&gt;
===Acquiring mandatory game files===&lt;br /&gt;
&lt;br /&gt;
The game files are not in the Git repository, and must be downloaded separately. They must be saved to the [[Game locations|data location]] for your system.&lt;br /&gt;
&lt;br /&gt;
Linux users may use the &amp;lt;code&amp;gt;download-paks&amp;lt;/code&amp;gt; script that is distributed with the source code, which requires one of curl, wget or aria2 to be installed:&lt;br /&gt;
&lt;br /&gt;
 $ cd &amp;lt;var&amp;gt;path/to/unvanquished/build&amp;lt;/var&amp;gt;&lt;br /&gt;
 $ ../download-paks pkg&lt;br /&gt;
&lt;br /&gt;
Otherwise, the set of necessary packages can be extracted from the [https://github.com/Unvanquished/Unvanquished/releases latest release], or downloaded a la carte from the [http://dl.unvanquished.net/pkg/ package index].&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Continuous_integration&amp;diff=8762</id>
		<title>Continuous integration</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Continuous_integration&amp;diff=8762"/>
				<updated>2024-10-27T00:49:18Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* Build matrix */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Infrastructure]]&lt;br /&gt;
Continuous integration (CI) refers to the automated builds that run each time someone opens or modifies a pull request against, or modifies the code of, the Unvanquished and Daemon source code repositories on GitHub.&lt;br /&gt;
&lt;br /&gt;
We use the following CI services:&lt;br /&gt;
* Appveyor, for building with MSVC on Windows. Its configuration is found in the file {{code|.appveyor.yml}} in the repository root.&lt;br /&gt;
* Azure Pipelines. Its configuration is found in the file {{code|azure-pipelines.yml}} in the repository root. It handles Mac native builds on [https://github.com/actions/virtual-environments/blob/main/images/macos/macos-11-Readme.md macOS 11.x] and Linux native and NaCl builds on [https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2004-Readme.md Ubuntu 20.04] (Focal).&lt;br /&gt;
* GitHub CodeQL. Its configuration is found in the file {{code|.github/workflows/codeql.yml}} in the repository. Its purpose is to scan the source code for vulnerabilities, and for that purpose it starts by building the source tree using the latest LTS Ubuntu distribution provided by the platform ([https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2004-Readme.md Ubuntu 22.04]) and the default compiler of this platform.&lt;br /&gt;
&lt;br /&gt;
In some Daemon builds, we run the unit tests. These builds have been configured to use the Release configuration so that the unit tests are closer to production builds. &lt;br /&gt;
&lt;br /&gt;
== Build matrix ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! colspan=&amp;quot;9&amp;quot; | {{engine}}&lt;br /&gt;
|-&lt;br /&gt;
! Service&lt;br /&gt;
! Host&lt;br /&gt;
! Target&lt;br /&gt;
! Compiler&lt;br /&gt;
! Generator&lt;br /&gt;
! Build Type&lt;br /&gt;
! WERROR&lt;br /&gt;
! PCH&lt;br /&gt;
! Unit tests&lt;br /&gt;
|-&lt;br /&gt;
| Appveyor || Windows amd64 || Windows amd64 || VS 2019 || Visual Studio || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Appveyor || Windows amd64 || Windows i686 || VS 2019 || Visual Studio || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Windows amd64 || MinGW 9.3 || Ninja || Debug || Yes || No || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 || GCC 9.4 || Ninja || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 || Clang 11.0 || Ninja || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || macOS-11 amd64 || macOS amd64 || AppleClang 13.0 || Make || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| GitHub Actions CodeQL || ubuntu-latest || Linux amd64 || GCC (floating) || Ninja || Release || No || Yes || No&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
! colspan=&amp;quot;8&amp;quot; | {{game}}&lt;br /&gt;
|-&lt;br /&gt;
! Service&lt;br /&gt;
! Host&lt;br /&gt;
! Target&lt;br /&gt;
! Compiler&lt;br /&gt;
! Generator&lt;br /&gt;
! Build Type&lt;br /&gt;
! WERROR&lt;br /&gt;
! PCH&lt;br /&gt;
|-&lt;br /&gt;
| Appveyor || Windows amd64 || Windows i686 DLL || VS 2019 || NMake || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 DLL || GCC 8.4 || Ninja || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 DLL || Clang 11.0 || Ninja || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || NaCl all NEXE || PNaCl Clang 3.6 || Ninja || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || macOS-12 amd64 || macOS amd64 DLL || AppleClang 14.0 || Make || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| GitHub Actions CodeQL || ubuntu-latest || Linux amd64 DLL+EXE || GCC (floating) || Ninja || Release || No || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
“WERROR” indicates whether the {{code|USE_WERROR}} option is on, which gives a failing building build status if there are warnings in our code. Note that {{code|USE_WERROR}} only applies to ”our” code in {{code|src/}}, so you may still see warnings from stuff in {{code|libs/}}.&lt;br /&gt;
&lt;br /&gt;
“PCH” indicates whether the precompiled header is enabled.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Compiling_the_source&amp;diff=8761</id>
		<title>Compiling the source</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Compiling_the_source&amp;diff=8761"/>
				<updated>2024-10-22T08:55:54Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: fedora deps update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Dependencies==&lt;br /&gt;
&lt;br /&gt;
{{Note|content=In case this happens to become outdated, the up-to-date documentation can be found in the {{SourceFile|parameters=#unvanquished|README.md}} file in source repository.}}&lt;br /&gt;
&lt;br /&gt;
The game requires some dependencies to be built, which are the same on all systems:&lt;br /&gt;
&lt;br /&gt;
* cmake&lt;br /&gt;
* python3-yaml&lt;br /&gt;
* python3-jinja2&lt;br /&gt;
* A C++11 able compiler (those are known to work: clang (&amp;gt;= 3.5), gcc (&amp;gt;= 4.8), visual studio (&amp;gt;= 2019))&lt;br /&gt;
* zlib1g&lt;br /&gt;
* libgmp&lt;br /&gt;
* nettle&lt;br /&gt;
* libcurl4-gnutls&lt;br /&gt;
* libsdl2&lt;br /&gt;
* libglew&lt;br /&gt;
* libpng&lt;br /&gt;
* libjpeg-turbo8&lt;br /&gt;
* libwebp&lt;br /&gt;
* libfreetype6&lt;br /&gt;
* liblua5.3&lt;br /&gt;
* libopenal&lt;br /&gt;
* libogg&lt;br /&gt;
* libvorbis&lt;br /&gt;
* libopusfile&lt;br /&gt;
&lt;br /&gt;
Those are optional:&lt;br /&gt;
&lt;br /&gt;
* libncursesw5&lt;br /&gt;
&lt;br /&gt;
==macOS==&lt;br /&gt;
&lt;br /&gt;
First, you need to [[Getting_the_source|acquire the source code]].&lt;br /&gt;
&lt;br /&gt;
Regardless of what interface you may use to compile the source, you will need [http://www.cmake.org/cmake/resources/software.html CMake] to generate makefiles. You will also need to install [https://developer.apple.com/xcode/ Xcode]. At a minimum, you must install the &amp;quot;Xcode command-line tools&amp;quot; in order to compile anything. You may also install Xcode proper, if you wish to use that IDE.&lt;br /&gt;
&lt;br /&gt;
Once you have the source code and the tools installed, you may actually proceed to compile the source. You have several options:&lt;br /&gt;
* '''Compile the source at the command line'''. This is the easiest if you would just like to compile the game to use yourself and you do not intend to work on the code.&lt;br /&gt;
* '''Compile the source using an IDE'''. This is preferred if you intend on developing the source.&lt;br /&gt;
** Xcode is Apple's flagship IDE.&lt;br /&gt;
** [http://qt-project.org/downloads QtCreator] is cross-platform and provides real-time feedback of syntax errors, a Vim mode, as well as other features.&lt;br /&gt;
** [http://www.codeblocks.org/ Code::Blocks] is also cross-platform but lacks some of the features of Xcode and QtCreator.&lt;br /&gt;
&lt;br /&gt;
===Dependencies===&lt;br /&gt;
&lt;br /&gt;
Precompiled static libs are provided for all dependencies. CMake downloads them at configure time and extracts to &amp;lt;code&amp;gt;daemon/external_deps/macos-amd64-default_&amp;lt;i&amp;gt;&amp;amp;lt;version&amp;amp;gt;&amp;lt;/i&amp;gt;/&amp;lt;/code&amp;gt;. These were produced by the &amp;lt;code&amp;gt;external_deps/build.sh&amp;lt;/code&amp;gt; script, which you could also use to build them yourself if you want to for some reason.&lt;br /&gt;
&lt;br /&gt;
===Configuring with CMake===&lt;br /&gt;
&lt;br /&gt;
# Run CMake.&lt;br /&gt;
# Enter the location of the source code.&lt;br /&gt;
# Enter the location in which you would like to build the source code. This should be a different directory.&lt;br /&gt;
# Click &amp;quot;Configure&amp;quot;. You will be prompted as to which generator you would like to use. If you have Xcode installed, choose that. Wait while the configuration process runs. You may have to set the following:&lt;br /&gt;
## If you have selected to generate Xcode project files, make the &amp;lt;code&amp;gt;SDLMAIN_LIBRARY&amp;lt;/code&amp;gt; field blank. This option is not available if you have the generator set to Unix makefiles.&lt;br /&gt;
# Click &amp;quot;Generate&amp;quot;.&lt;br /&gt;
# You may now close CMake.&lt;br /&gt;
&lt;br /&gt;
===Compiling===&lt;br /&gt;
&lt;br /&gt;
====With Xcode====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Either start Xcode and open the project file (in the build directory you specified) or double-click the project file in Finder.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Open the project file created by CMake, which should be in the build directory you specified.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Change the active target to &amp;quot;ALL_BUILD&amp;quot; and click Product&amp;amp;rarr;Build.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====With Unix Makefiles====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Start Terminal (Applications &amp;amp;rarr; Utilities &amp;amp;rarr; Terminal).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Type the following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd /path/to/Unvanquished-build&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If you are on a multi-core or multi-processor machine, you may speed up the process by passing the &amp;lt;code&amp;gt;-j&amp;lt;/code&amp;gt; argument followed by the number of available cores to &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;; e.g., &amp;lt;code&amp;gt;make -j4&amp;lt;/code&amp;gt;. Note that doing so makes reading error messages more difficult, as multiple instances of the compiler will print to the screen at once, causing information to appear out of order.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testing the build===&lt;br /&gt;
&lt;br /&gt;
====With Xcode 4====&lt;br /&gt;
&lt;br /&gt;
To test the game, select the &amp;quot;client&amp;quot; scheme from the combo box on the toolbar, and click the run button or press {{Hotkey|MacCommand}}{{Hotkey|R}}.&lt;br /&gt;
&lt;br /&gt;
===Bundling the Application===&lt;br /&gt;
&lt;br /&gt;
====With CPack====&lt;br /&gt;
&lt;br /&gt;
CPack is able to create standalone bundles (as well as many other types of installers). However you must generate the files using Unix Makefiles instead of Xcode.&lt;br /&gt;
&lt;br /&gt;
 $ cd /path/to/Unvanquished-build&lt;br /&gt;
 $ cpack -G Bundle&lt;br /&gt;
&lt;br /&gt;
Some warnings will be printed however these can be safely ignored. There should be a file called Unvanquished.dmg in the Unvanquished-build folder.&lt;br /&gt;
&lt;br /&gt;
====Manually====&lt;br /&gt;
&lt;br /&gt;
{{Note|header=Important|content=&lt;br /&gt;
Please be aware that these instructions are very much out of date, and may not work. Also note that the dynamic library bundler does '''not''' work as intended and although you will be able to run your build on your machine, it will most likely not work on other machines. It is strongly suggested that you compile the source using Xcode.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
You'll find the Mac [http://macdylibbundler.sourceforge.net/ dynamic library bundler] to be quite useful (you must generate the files using Unix Makefiles instead of Xcode):&lt;br /&gt;
&lt;br /&gt;
 $ curl -L http://sourceforge.net/projects/macdylibbundler/files/macdylibbundler/0.4.1/dylibbundler0.4.1.zip/download &amp;gt; \&lt;br /&gt;
    dylibbundler0.4.1.zip&lt;br /&gt;
 $ unzip dylibbundler0.4.1.zip&lt;br /&gt;
 $ cd dylibbundler&lt;br /&gt;
 $ make&lt;br /&gt;
 $ sudo make install&lt;br /&gt;
&lt;br /&gt;
Once you've done that, you can proceed to create the application bundle. Note that these steps assume that you have downloaded the data files to &amp;lt;code&amp;gt;main/&amp;lt;/code&amp;gt; as shown above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ git=/path/to/Unvanquished-git-repo&lt;br /&gt;
$ build=/path/to/Unvanquished-build-dir&lt;br /&gt;
$ mkdir -pv Unvanquished.app/Contents/{libs,MacOS,Resources,Frameworks}&lt;br /&gt;
$ cp -r $build/main Unvanquished.app/Contents/MacOS&lt;br /&gt;
$ sips -s format tiff $git/debian/unvanquished.png --out temp.tiff&lt;br /&gt;
$ tiff2icns temp.tiff Unvanquished.app/Contents/Resources/Unvanquished.icns&lt;br /&gt;
$ rm temp.tiff&lt;br /&gt;
$ cp $build/daemon{,ded}.i386 $build/*.dylib Unvanquished.app/Contents/MacOS&lt;br /&gt;
$ cp -r /Library/Frameworks/SDL.framework Unvanquished.app/Contents/Frameworks&lt;br /&gt;
$ install_name_tool -id \&lt;br /&gt;
    @executable_path/../Frameworks/SDL.framework/Versions/A/SDL \&lt;br /&gt;
    Unvanquished.app/Contents/Frameworks/SDL.framework/Versions/A/SDL&lt;br /&gt;
$ install_name_tool -change @rpath/SDL.framework/Versions/A/SDL \&lt;br /&gt;
    @executable_path/../Frameworks/SDL.framework/Versions/A/SDL \&lt;br /&gt;
    Unvanquished.app/Contents/MacOS/daemon.i386&lt;br /&gt;
$ install_name_tool -change @rpath/SDL.framework/Versions/A/SDL \&lt;br /&gt;
    @executable_path/../Frameworks/SDL.framework/Versions/A/SDL \&lt;br /&gt;
    Unvanquished.app/Contents/MacOS/librendererGLi386.dylib&lt;br /&gt;
$ install_name_tool -change @rpath/SDL.framework/Versions/A/SDL \&lt;br /&gt;
    @executable_path/../Frameworks/SDL.framework/Versions/A/SDL \&lt;br /&gt;
    Unvanquished.app/Contents/MacOS/librendererGL3i386.dylib&lt;br /&gt;
$ for binary in Unvanquished.app/Contents/MacOS/*.{i386,dylib}; do&lt;br /&gt;
    dylibbundler -b -x $binary -d $dest/Unvanquished.app/Contents/libs/; done&lt;br /&gt;
$ cp /usr/lib/libGLEW.1.7.0.dylib ./Unvanquished.app/Contents/libs/libGLEW.1.7.0.dylib&lt;br /&gt;
$ chmod +w ./Unvanquished.app/Contents/libs/libGLEW.1.7.0.dylib&lt;br /&gt;
$ install_name_tool -id @executable_path/../libs/libGLEW.1.7.0.dylib \&lt;br /&gt;
    ./Unvanquished.app/Contents/libs/libGLEW.1.7.0.dylib&lt;br /&gt;
$ install_name_tool -change /usr/lib/libGLEW.1.7.0.dylib \&lt;br /&gt;
    @executable_path/../libs/libGLEW.1.7.0.dylib \&lt;br /&gt;
    ./Unvanquished.app/Contents/MacOS/daemon.i386&lt;br /&gt;
$ cat &amp;gt; Unvanquished.app/Contents/Info.plist &amp;lt;&amp;lt;\EOF&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE plist PUBLIC &amp;quot;-//Apple//DTD PLIST 1.0//EN&amp;quot;&lt;br /&gt;
          &amp;quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;plist version=&amp;quot;1.0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;dict&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleName&amp;lt;/key&amp;gt;&lt;br /&gt;
	&amp;lt;string&amp;gt;Unvanquished&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleDisplayName&amp;lt;/key&amp;gt;&lt;br /&gt;
	&amp;lt;string&amp;gt;Unvanquished&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleExecutable&amp;lt;/key&amp;gt;&lt;br /&gt;
	&amp;lt;string&amp;gt;daemon.i386&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleIconFile&amp;lt;/key&amp;gt;&lt;br /&gt;
	&amp;lt;string&amp;gt;Unvanquished.icns&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleIdentifier&amp;lt;/key&amp;gt;&lt;br /&gt;
	&amp;lt;string&amp;gt;net.Unvanquished&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleInfoDictionaryVersion&amp;lt;/key&amp;gt;&lt;br /&gt;
	&amp;lt;string&amp;gt;6.0&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundlePackageType&amp;lt;/key&amp;gt;&lt;br /&gt;
	&amp;lt;string&amp;gt;APPL&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleShortVersionString&amp;lt;/key&amp;gt;&lt;br /&gt;
	&amp;lt;string&amp;gt;0.4.0&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleVersion&amp;lt;/key&amp;gt;&lt;br /&gt;
	&amp;lt;string&amp;gt;0.4.0&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/dict&amp;gt;&lt;br /&gt;
&amp;lt;/plist&amp;gt;&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The contents of the completed application bundle should look like this:&lt;br /&gt;
&lt;br /&gt;
[[File:Bundle_dir_Mac_OS_X.png]]&lt;br /&gt;
&lt;br /&gt;
'''Note''': If you compiled SDL from source, you will not see a directory titled &amp;lt;code&amp;gt;SDL.framework&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Windows==&lt;br /&gt;
&lt;br /&gt;
===Visual Studio===&lt;br /&gt;
&lt;br /&gt;
CMake can generate Visual Studio projects for Unvanquished.&lt;br /&gt;
&lt;br /&gt;
# Add _NO_DEBUG_HEAP=1 to your environment variables otherwise performance under the debugger [http://www.massimpressionsprojects.com/dev/altdevblog/2011/07/27/the-unexpected-performance-of-debug-builds/ will be terrible]&lt;br /&gt;
# Run CMake with the source directory as the base directory of your source code (which should contain the directory &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;), and the build directory as a subdirectory of the source directory named &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Click the &amp;lt;b&amp;gt;Open Project&amp;lt;/b&amp;gt; button. Or if you used CMake from the command line, open &amp;lt;code&amp;gt;build/Unvanquished.sln&amp;lt;/code&amp;gt; in Visual Studio.&lt;br /&gt;
# In Visual Studio, choose your desired build type (default: &amp;lt;b&amp;gt;Debug&amp;lt;/b&amp;gt;) from the drop-down menu in the top bar. &amp;lt;b&amp;gt;Debug&amp;lt;/b&amp;gt; runs assertions and has complete debug information, but is slower. &amp;lt;b&amp;gt;RelWithDebInfo&amp;lt;/b&amp;gt; is fast and still fairly usable with the debugger, but assertions don't run and sometimes you can't see the value of a local variable.&lt;br /&gt;
# Use Build &amp;amp;rarr; Build Solution to compile the code. Or just press {{Hotkey|F5}} to build and run, but beware: this will not automatically build cgame or sgame! Only engine changes are automatically rebuilt when you run something from Visual Studio.&lt;br /&gt;
&lt;br /&gt;
====Important Notes====&lt;br /&gt;
&lt;br /&gt;
* Due to limitations with CMake, the startup project cannot be specified. This must be set manually to debug the client with Visual Studio:&lt;br /&gt;
** Right click on client and select &amp;quot;Set as Startup project&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===MinGW===&lt;br /&gt;
&lt;br /&gt;
It is possible to produce a Windows build of Unvanquished with [[MinGW]], as either a Windows or a Linux user. See [[MinGW#Distributions]] for detailed information about the toolchains available for installation.&lt;br /&gt;
&lt;br /&gt;
====Instructions for native Windows build with MSYS2====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Install MSYS2. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Open the ''MSYS2 MinGW 32-bit'' or ''MSYS2 MinGW 64-bit'' terminal, depending on which bitness you want to build. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; Install toolchain:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# For 32-bit replace x86_64 with i686&lt;br /&gt;
pacman -Sy &amp;amp;&amp;amp; pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake make&lt;br /&gt;
&amp;lt;/pre&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Run CMake. If you're building Unvanquished, you may want to use the &amp;lt;code&amp;gt;-DDAEMON_CBSE_PYTHON_PATH=&amp;lt;path&amp;gt;&amp;lt;/code&amp;gt; option in case you want to use a different Python rather than the one in MSYS2. &amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir mybuild &amp;amp;&amp;amp; cd mybuild&lt;br /&gt;
cmake -G &amp;quot;MSYS Makefiles&amp;quot; somepath/Unvanquished&lt;br /&gt;
&amp;lt;/pre&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Build:&lt;br /&gt;
&amp;lt;pre&amp;gt; make -j4 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you would like verbose output (useful to see compiler flags), set the &amp;lt;code&amp;gt;VERBOSE&amp;lt;/code&amp;gt; environment variable before running Make.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export VERBOSE=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may find that the game (or some part of the MSYS2 toolchain!) fails to start due to missing DLL dependencies. Two helpful tools are:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; The strace command in MSYS2, e.g. &amp;lt;code&amp;gt;strace ./daemon&amp;lt;/code&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; [https://github.com/lucasg/Dependencies Dependencies] (a Windows GUI program) &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When distributing MinGW binaries, you need to distribute some additional DLLs besides the ones in the build folder. See [[MinGW#Built-in_DLL_dependencies]].&lt;br /&gt;
&lt;br /&gt;
====MSYS2 Clang====&lt;br /&gt;
In MSYS2, it is possible to build with Clang, rather than GCC as shown as in the above instructions. However, some of our pre-built libraries are incompatible. You need to use the ones from pacman instead.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Create a deps folder with incompatible packages removed. This assumes that the latest version of the prebuilt deps for the mingw package of the appropriate bitness has already been extracted to the &amp;lt;code&amp;gt;windows-${ARCH}-mingw_${VERSION}&amp;lt;/code&amp;gt; directory. In this example, we use &amp;lt;code&amp;gt;windows-amd64-mingw_8&amp;lt;/code&amp;gt;. &amp;lt;pre&amp;gt;&lt;br /&gt;
cd somepath/daemon/external_deps&lt;br /&gt;
mkdir msysclang&lt;br /&gt;
cp windows-amd64-mingw_8 -R msysclang&lt;br /&gt;
find msysclang -depth -name '*freetype*' -o -name '*png*' -o name '*curl*' -o -name '*lua*' | grep -v pnacl | xargs rm -r&lt;br /&gt;
&amp;lt;/pre&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Install those deps from Pacman: &amp;lt;pre&amp;gt;&lt;br /&gt;
# For Daemon&lt;br /&gt;
pacman -Sy &amp;amp;&amp;amp; pacman -S mingw-w64-clang-x86_64-freetype mingw-w64-clang-x86_64-curl mingw-w64-clang-x86_64-libpng&lt;br /&gt;
# For Unvanquished&lt;br /&gt;
pacman -Sy &amp;amp;&amp;amp; pacman -S mingw-w64-clang-x86_64-freetype mingw-w64-clang-x86_64-lua&lt;br /&gt;
&amp;lt;/pre&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Use the deps folder you made when configuring the build: &amp;lt;pre&amp;gt;&lt;br /&gt;
CC=clang CXX=clang++ cmake -G &amp;quot;MSYS Makefiles&amp;quot; -DEXTERNAL_DEPS_DIR=somepath/daemon/external_deps/msysclang /c/path/to/source&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If you see a download progress bar upon invoking CMake, you did the deps stuff wrong.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===QtCreator===&lt;br /&gt;
&lt;br /&gt;
# Install MinGW and follow the above instructions, except select Code::Blocks as the generator.&lt;br /&gt;
# Start QtCreator, and select &amp;quot;Open File or Project&amp;amp;hellip;&amp;quot; from the File menu.&lt;br /&gt;
# Navigate to your source directory and open CMakeLists.txt.&lt;br /&gt;
# At the CMake Wizard, select the same build directory you already configured using CMake. (If you did not chose Code::Blocks as the generator, you will have to start over again, as QtCreator requires a Code::Blocks project file in order to compile the source.)&lt;br /&gt;
# Ensure that a generator is selected in the combo box, and click &amp;quot;Run CMake&amp;quot;. If there is no generator listed, see the [[#Troubleshooting|troubleshooting]] section below.&lt;br /&gt;
# Click &amp;quot;Finish&amp;quot; to close the wizard.&lt;br /&gt;
&lt;br /&gt;
You should now be able to compile, run, and debug the code using QtCreator.&lt;br /&gt;
&lt;br /&gt;
====Troubleshooting====&lt;br /&gt;
&lt;br /&gt;
If at the &amp;quot;Run CMake&amp;quot; prompt of the the CMake Wizard, select &amp;quot;Run CMake&amp;quot; and are warned that no generator was selected, and notice that there are no generators in the combo box, you will likely have to [http://doc.qt.digia.com/qtcreator-2.4/creator-tool-chains.html manually configure your toolchain]. Select &amp;quot;Options&amp;amp;hellip;&amp;quot; from the &amp;quot;Tools&amp;quot; menu, then navigate to &amp;quot;Build &amp;amp;amp; Run&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
At the options window,&lt;br /&gt;
* Go to the &amp;quot;Kits&amp;quot; tab, and mouse over the &amp;quot;Desktop (default)&amp;quot; kit under &amp;quot;Manual&amp;quot;. If there were any errors in configuring this kit, they will be displayed in the tool tip. If there are problems, select the kit. You may need to manually specify the location of the MinGW debugger, for example, which is typically &amp;lt;code&amp;gt;C:\MinGW\bin\gdb.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Go to the &amp;quot;Compilers&amp;quot; tab, and ensure that MinGW is present. If not, you will need to add it manually.&lt;br /&gt;
&lt;br /&gt;
==Linux==&lt;br /&gt;
&lt;br /&gt;
===Dependencies===&lt;br /&gt;
&lt;br /&gt;
{{TODO|This may be incomplete.}}&lt;br /&gt;
&lt;br /&gt;
====Debian/Ubuntu====&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install build-essential cmake libcurl4-gnutls-dev \&lt;br /&gt;
  libglew-dev libgmp-dev nettle-dev zlib1g-dev libncursesw5-dev \&lt;br /&gt;
  libsdl2-dev libopenal-dev libjpeg-dev libpng-dev libwebp-dev \&lt;br /&gt;
  libogg-dev libvorbis-dev libopusfile-dev \&lt;br /&gt;
  libfreetype6-dev \&lt;br /&gt;
  liblua5.3-dev \&lt;br /&gt;
  python3-yaml python3-jinja2&lt;br /&gt;
&lt;br /&gt;
If the version of WebP supplied by your version of Debian or Ubuntu is older than v0.2.0, you will need to [https://code.google.com/p/webp/downloads/detail?name=libwebp-0.2.0.tar.gz download] and [https://developers.google.com/speed/webp/docs/compiling#unix compile it from source]. After compiling and installing with &amp;lt;code&amp;gt;sudo make install&amp;lt;/code&amp;gt;, in CMake, you'll need to set &amp;lt;code&amp;gt;WEBP_INCLUDE_DIR&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/usr/local/include/webp&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;WEBP_LIBRARY&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/usr/local/lib/libwebp.so&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Developpment package name may differs, for example &amp;lt;code&amp;gt;libgmp-dev&amp;lt;/code&amp;gt; may be named &amp;lt;code&amp;gt;libgmp3-dev&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;libglew-dev&amp;lt;/code&amp;gt; may be named &amp;lt;code&amp;gt;libglew1.7-dev&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We have a &amp;lt;code&amp;gt;debian&amp;lt;/code&amp;gt; directory in the source tree, you can check what's missing this way.&lt;br /&gt;
&lt;br /&gt;
 cd &amp;lt;var&amp;gt;path/to/unvanquished&amp;lt;/var&amp;gt;&lt;br /&gt;
 dpkg-checkbuilddeps&lt;br /&gt;
&lt;br /&gt;
Then install the listed packages this way:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install &amp;lt;var&amp;gt;package list&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;dpkg-checkbuilddeps&amp;lt;/code&amp;gt; command produces no output if you already have the required dependencies.&lt;br /&gt;
&lt;br /&gt;
Note that you only need &amp;lt;code&amp;gt;debhelper&amp;lt;/code&amp;gt; to build &amp;lt;code&amp;gt;.deb&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&lt;br /&gt;
====Fedora====&lt;br /&gt;
&lt;br /&gt;
Line 1 of the packages is basic dev tools. Lines 2-3 are Daemon dependencies. Line 4 is (additional) Unvanquished dependencies.&lt;br /&gt;
&lt;br /&gt;
 $ sudo dnf install \&lt;br /&gt;
   cmake gcc gcc-c++ \&lt;br /&gt;
   {freetype,glew,gmp,mesa-libGL,ncurses,nettle,openal-soft,opus,opusfile,SDL2}-devel \&lt;br /&gt;
   lib{curl,jpeg-turbo,png12,vorbis,webp}-devel \&lt;br /&gt;
   lua-devel python3-pyyaml python3-jinja2&lt;br /&gt;
&lt;br /&gt;
====Gentoo====&lt;br /&gt;
&lt;br /&gt;
 $ emerge curl freetype glew gmp jpeg ncurses media-sound/opus-tools libogg openal libpng libsdl libvorbis sys-libs/zlib&lt;br /&gt;
&lt;br /&gt;
====openSUSE====&lt;br /&gt;
&lt;br /&gt;
 $ sudo install zypper gcc gcc-c++ Mesa-libGL-devel SDL-devel libjpeg8-devel \&lt;br /&gt;
   libpng12-devel glew-devel webp-devel ncurses-devel gmp-devel libcurl-devel \&lt;br /&gt;
   libnettle-devel openal-soft-devel libvorbis-devel&lt;br /&gt;
&lt;br /&gt;
The latest version of WebP must be installed manually (FIXME: why, if there is webp-devel in the zypper package list?):&lt;br /&gt;
&lt;br /&gt;
 $ cd Unvanquished/daemon/external_deps&lt;br /&gt;
 $ ./build.sh linux-amd64-default webp naclsdk naclports&lt;br /&gt;
 $ ./build.sh linux-amd64-default install&lt;br /&gt;
&lt;br /&gt;
You must disable curses (set &amp;lt;code&amp;gt;USE_CURSES&amp;lt;/code&amp;gt; appropriately in CMake) as failing to do so will cause Unvanquished to crash on startup.&lt;br /&gt;
&lt;br /&gt;
===Configuring the code with CMake===&lt;br /&gt;
&lt;br /&gt;
After you have [[Getting the source|acquired the source code]], you can proceed to compile. Unvanquished uses CMake, so you must have that installed. &lt;br /&gt;
&lt;br /&gt;
====Using ccmake (curses-based front-end)====&lt;br /&gt;
&lt;br /&gt;
On Debian or Ubuntu:&lt;br /&gt;
&lt;br /&gt;
 $ sudo apt-get install cmake-curses-gui&lt;br /&gt;
&lt;br /&gt;
On Gentoo you should set the '''ncurses''' USE flag either globally or individually, just for cmake.&lt;br /&gt;
To add the USE flag globally, edit the USE array in /etc/make.conf for it to include '''ncurses'''.&lt;br /&gt;
To only install cmake with ncurses functionality, you could do the following:&lt;br /&gt;
&lt;br /&gt;
 $ echo 'dev-util/cmake ncurses' &amp;gt;&amp;gt; /etc/portage/package.use &amp;amp;&amp;amp; emerge cmake&lt;br /&gt;
&lt;br /&gt;
Note that in Ubuntu, &amp;lt;code&amp;gt;cmake-curses-gui&amp;lt;/code&amp;gt; is in Universe, which you may have to enable with &amp;lt;code&amp;gt;software-properties-gtk&amp;lt;/code&amp;gt;. Make sure to reload the software sources with &amp;lt;code&amp;gt;sudo apt-get update&amp;lt;/code&amp;gt; afterwards.&lt;br /&gt;
&lt;br /&gt;
Optionally: to use clang (rather than the default gcc and g++ compilers) export the CC and CXX variables before running cmake:&lt;br /&gt;
&lt;br /&gt;
 $ export CC=&amp;quot;clang&amp;quot;&lt;br /&gt;
 $ export CXX=&amp;quot;clang++ -stdlib=libc++ -lc++abi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Next, configure the codebase.&lt;br /&gt;
&lt;br /&gt;
 $ cd &amp;lt;var&amp;gt;/path/to/unvanquished&amp;lt;/var&amp;gt;&lt;br /&gt;
 $ mkdir build&lt;br /&gt;
 $ cd build&lt;br /&gt;
 $ ccmake ..&lt;br /&gt;
&lt;br /&gt;
In Debian or Ubuntu you can build a package this way (you need &amp;lt;code&amp;gt;devscripts&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;fakeroot&amp;lt;/code&amp;gt; packages):&lt;br /&gt;
&lt;br /&gt;
 $ cd &amp;lt;var&amp;gt;/path/to/unvanquished&amp;lt;/var&amp;gt;&lt;br /&gt;
 $ fakeroot dpkg-buildpackage -b -uc&lt;br /&gt;
 $ sudo dpkg -i &amp;lt;var&amp;gt;../unvanquished_*.deb&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once in &amp;lt;code&amp;gt;ccmake&amp;lt;/code&amp;gt;, use the following keys:&lt;br /&gt;
&lt;br /&gt;
* Press {{Hotkey|c}} to configure. If an error occurs during this phase, make note of it and press {{Hotkey|e}} to dismiss it.&lt;br /&gt;
* Use the up and down arrow keys to navigate the compilation options.&lt;br /&gt;
* Press {{Hotkey|Enter}} to enable or disable boolean options (i.e., on/off) or to edit textual options.&lt;br /&gt;
** Press {{Hotkey|Esc}} when editing a textual option to cancel the change.&lt;br /&gt;
&lt;br /&gt;
Once you have finished the configuration process, press {{Hotkey|C}} again, then {{Hotkey|G}} to generate the makefile.&lt;br /&gt;
&lt;br /&gt;
====Using cmake-qt-gui (graphical front-end)====&lt;br /&gt;
&lt;br /&gt;
This graphical front end for cmake has its own package you must install:&lt;br /&gt;
&lt;br /&gt;
=====Debian/Ubuntu=====&lt;br /&gt;
&lt;br /&gt;
 $ sudo apt-get install cmake-qt-gui&lt;br /&gt;
&lt;br /&gt;
=====Gentoo=====&lt;br /&gt;
&lt;br /&gt;
With the '''qt4''' USE flag enabled:&lt;br /&gt;
&lt;br /&gt;
 $ emerge cmake&lt;br /&gt;
&lt;br /&gt;
Once installed, run with &amp;lt;code&amp;gt;cmake-gui&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cmake-qt-gui.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
# Set the path where you have the source code downloaded.&lt;br /&gt;
# Set the path where you would like to build the engine. This may be the same directory if you wish.&lt;br /&gt;
# Click 'Configure'.&lt;br /&gt;
# Click 'Generate'.&lt;br /&gt;
&lt;br /&gt;
====Unnecessary libraries====&lt;br /&gt;
&lt;br /&gt;
Regardless of which front-end to cmake you use, you may want to disable some libraries that are not strictly necessary:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;USE_BREAKPAD&amp;lt;/code&amp;gt; &amp;amp;mdash; Disabling this will cause the game to not produce crashdumps on failure.&lt;br /&gt;
* &amp;lt;code&amp;gt;USE_CURSES&amp;lt;/code&amp;gt; &amp;amp;mdash; Disabling this will cause the external (not in-game) console to not use curses; it will not be scrollable and will be similar to the console in the original Tremulous. This does in no way affect gameplay.&lt;br /&gt;
&lt;br /&gt;
===Compiling===&lt;br /&gt;
&lt;br /&gt;
 $ cd &amp;lt;var&amp;gt;path/to/unvanquished/build&amp;lt;/var&amp;gt;&lt;br /&gt;
 $ make -j4&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;-j&amp;lt;/code&amp;gt; switch to make allows you to speed up the compilation process by running it in multiple threads; set the number following this to the number of cores your processor(s) have.&lt;br /&gt;
&lt;br /&gt;
==FreeBSD==&lt;br /&gt;
&lt;br /&gt;
While building on FreeBSD is usually very similar to building on Linux, the PNaCl toolchain not being native to FreeBSD means not everything can be built on FreeBSD. See the [[Systems/FreeBSD]] page for details and dedicated instructions.&lt;br /&gt;
&lt;br /&gt;
==Acquiring the Game Files==&lt;br /&gt;
&lt;br /&gt;
===Acquiring mandatory game files===&lt;br /&gt;
&lt;br /&gt;
The game files are not in the Git repository, and must be downloaded separately. They must be saved to the [[Game locations|data location]] for your system.&lt;br /&gt;
&lt;br /&gt;
Linux users may use the &amp;lt;code&amp;gt;download-paks&amp;lt;/code&amp;gt; script that is distributed with the source code, which requires one of curl, wget or aria2 to be installed:&lt;br /&gt;
&lt;br /&gt;
 $ cd &amp;lt;var&amp;gt;path/to/unvanquished/build&amp;lt;/var&amp;gt;&lt;br /&gt;
 $ ../download-paks pkg&lt;br /&gt;
&lt;br /&gt;
Otherwise, the set of necessary packages can be extracted from the [https://github.com/Unvanquished/Unvanquished/releases latest release], or downloaded a la carte from the [http://dl.unvanquished.net/pkg/ package index].&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=MacOS_Launch_Services_security_restrictions&amp;diff=8760</id>
		<title>MacOS Launch Services security restrictions</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=MacOS_Launch_Services_security_restrictions&amp;diff=8760"/>
				<updated>2024-10-21T09:00:57Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: Created page with &amp;quot;== Quarantine restrictions == Applications downloaded with a browser may are subject to quarantine restrictions.  === Denying launch === If you double-click a quarantined app...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quarantine restrictions ==&lt;br /&gt;
Applications downloaded with a browser may are subject to quarantine restrictions.&lt;br /&gt;
&lt;br /&gt;
=== Denying launch ===&lt;br /&gt;
If you double-click a quarantined app in Finder, it will refuse to run it. This can be bypassed via Command+clicking on the application, selecting &amp;lt;b&amp;gt;Open&amp;lt;/b&amp;gt; in the context menu, and clicking through a warning dialog.&lt;br /&gt;
&lt;br /&gt;
Not only applications, but also libraries can be denied launch. Sample text of an error popup:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
“SDL2.framework” cannot be opened because the developer cannot be verified.&lt;br /&gt;
&lt;br /&gt;
macOS cannot verify that this app is free from malware.&lt;br /&gt;
&lt;br /&gt;
Safari downloaded this file today at 06:18.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the terminal, the error looks as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt;% ./daemon    &lt;br /&gt;
dyld[8822]: Library not loaded: @rpath/SDL2.framework/Versions/A/SDL2&lt;br /&gt;
  Referenced from: &amp;lt;71DD614C-D95F-37DD-A29E-765DA0AEEE48&amp;gt; /Users/slipher/Unvanquished/build-newsdl/daemon&lt;br /&gt;
  Reason: tried: '/Users/slipher/Unvanquished/build-newsdl/SDL2.framework/Versions/A/SDL2' (code signature in &amp;lt;3E6D5145-6DE8-3734-95A7-AE31ED09A1A9&amp;gt; '/Users/slipher/Unvanquished/build-newsdl/SDL2.framework/Versions/A/SDL2' not valid for use in process: library load disallowed by system policy), '/Users/slipher/Unvanquished/build-newsdl/SDL2.framework/Versions/A/SDL2' (code signature in &amp;lt;3E6D5145-6DE8-3734-95A7-AE31ED09A1A9&amp;gt; '/Users/slipher/Unvanquished/build-newsdl/SDL2.framework/Versions/A/SDL2' not valid for use in process: library load disallowed by system policy), '/Library/Frameworks/SDL2.framework/Versions/A/SDL2' (no such file), '/System/Library/Frameworks/SDL2.framework/Versions/A/SDL2' (no such file, not in dyld cache)&lt;br /&gt;
zsh: abort      ./daemon&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== App Translocation ===&lt;br /&gt;
&lt;br /&gt;
For quarantined apps that are permitted to launch, there is another possible restriction called [https://lapcatsoftware.com/articles/app-translocation.html App Translocation].&lt;br /&gt;
If Unvanquished.app is started with app translocation, the beginning of the output looks as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt;cmdline: -pakpath /private/var/folders/37/cwhvzf2j3_ngll0kwst_3k540000gn/T/AppTranslocation/97281FCC-20CC-45CE-8386-D8DF691593C7/d/pkg&lt;br /&gt;
tty console mode disabled&lt;br /&gt;
^3Warn: [FS] Ignoring path /private/var/folders/37/cwhvzf2j3_ngll0kwst_3k540000gn/T/AppTranslocation/97281FCC-20CC-45CE-8386-D8DF691593C7/d/pkg: No such file or directory&lt;br /&gt;
[FS] Lib path: /private/var/folders/37/cwhvzf2j3_ngll0kwst_3k540000gn/T/AppTranslocation/97281FCC-20CC-45CE-8386-D8DF691593C7/d/Unvanquished.app/Contents/MacOS&lt;br /&gt;
[FS] Home path: /Users/slipher/Library/Application Support/Unvanquished&lt;br /&gt;
[FS] Pak search path: /Users/slipher/Library/Application Support/Unvanquished/pkg&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daemon is not capable of running under app translocation.&lt;br /&gt;
&lt;br /&gt;
=== The magic bits ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;com.apple.quarantine&amp;lt;/code&amp;gt; extended file attribute is the root cause of all quarantine restrictions. It is added by browsers to downloaded applications. When you download an auto-unzipped .app, it is recursively applied to all files and directories within. A file's extended attributes can be viewed with the command&amp;lt;code&amp;gt;xattr &amp;lt;path&amp;gt;&amp;lt;/code&amp;gt;. The quarantine attribute can be (recursively) removed using &amp;lt;code&amp;gt;xattr -d -r &amp;lt;path&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
There is a launch services database flag that prevents denying launch even in the presence of the quarantine attribute. It can be set by clicking through the dialog to launch despite the danger, or by moving the application in Finder.&lt;br /&gt;
&lt;br /&gt;
There is a launch services database flag that disables app translocation for a quarantined file that is allowed to launch. It can be set by moving the application in the Finder.&lt;br /&gt;
&lt;br /&gt;
Launch services database info follows files across moves (whether by Finder or &amp;lt;code&amp;gt;mv&amp;lt;/code&amp;gt;). It might be possible to see these launch services database flags somewhere in the output of &amp;lt;code&amp;gt;/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -dump&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Directory permissions ==&lt;br /&gt;
&lt;br /&gt;
Sometimes you get a popup asking whether you want to allow the app to access, for example, Downloads or Documents. Example message: &amp;lt;b&amp;gt;&amp;quot;Unvanquished&amp;quot; would like to access files in your Downloads folder.&amp;lt;/b&amp;gt; The application's file operation blocks while waiting for the user to respond to the dialog. Not sure what relation this has to quarantine restrictions.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Compatibility&amp;diff=8738</id>
		<title>Compatibility</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Compatibility&amp;diff=8738"/>
				<updated>2024-10-05T13:21:49Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: More specific assets policy; misc edits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Inter-module compatibility =&lt;br /&gt;
&lt;br /&gt;
Unvanquished has many software components: engine binaries, based on the Daemon repository (client and server); gamelogic binaries, based on the Unvanquished repository (cgame and sgame); and various other files shipped in DPKs, which may be used by any of the binaries. Currently, all components are on a single release cycle. A given user normally has only one version of the client installed, but different servers may distribute differing versions of the other components via the auto-download mechanism. This means many different combinations of versions of the components are possible. It can be difficult to reason about which combinations will work correctly, and even which combinations ought to be allowed.&lt;br /&gt;
&lt;br /&gt;
In the rest of this article, &amp;quot;Unvanquished&amp;quot; refers to the eponymous Git repository, not the game.&lt;br /&gt;
&lt;br /&gt;
== Desired use cases ==&lt;br /&gt;
=== Use cases we want to support ===&lt;br /&gt;
* &amp;lt;b&amp;gt;Develop on next-release branch (e.g. &amp;lt;code&amp;gt;0.52.0/sync&amp;lt;/code&amp;gt;) of all repos (Daemon, Unvanquished)&amp;lt;/b&amp;gt;&lt;br /&gt;
* &amp;lt;b&amp;gt;Develop on master branch of all repos&amp;lt;/b&amp;gt;&lt;br /&gt;
* &amp;lt;b&amp;gt;Build client from latest master and connect to latest-release servers&amp;lt;/b&amp;gt; &amp;lt;br&amp;gt; We should be able to play with everyone on a client with the latest bug fixes.&lt;br /&gt;
* &amp;lt;b&amp;gt;Build server from latest master and host with latest-release DPKs&amp;lt;/b&amp;gt; &amp;lt;br&amp;gt; Likewise with a server.&lt;br /&gt;
* &amp;lt;b&amp;gt;Host a server with gamelogic and assets build from latest master.&amp;lt;/b&amp;gt;&lt;br /&gt;
* &amp;lt;b&amp;gt;Develop Unvanquished on master, using latest-release DPKs&amp;lt;/b&amp;gt; &amp;lt;br&amp;gt; Development for simple cases should be accessible, not requiring &amp;lt;code&amp;gt;-pakpath&amp;lt;/code&amp;gt; flags etc. Compatibility with the latest-release &amp;lt;code&amp;gt;unvanquished&amp;lt;/code&amp;gt; DPK doesn't need to be perfect; it's OK if there are a few warnings or slightly messed up things in the UI. But it should be usable for basic experimentation.&lt;br /&gt;
&lt;br /&gt;
=== Use cases we don't really care about ===&lt;br /&gt;
* &amp;lt;i&amp;gt;Using cgame and sgame built from different commits.&amp;lt;/i&amp;gt; &lt;br /&gt;
* &amp;lt;i&amp;gt;Asset development with latest-release gamelogic.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Per-repository guidance ==&lt;br /&gt;
&lt;br /&gt;
=== Daemon ===&lt;br /&gt;
&lt;br /&gt;
Adding, modifying, or removing an IPC call must be done on the next-release branch. Likewise for any changes to serialization procedures or structs passed through IPC.&lt;br /&gt;
&lt;br /&gt;
When developing Daemon master, you need to keep in mind compatibility with both the latest release and the current master of the gamelogic.&lt;br /&gt;
&lt;br /&gt;
=== Unvanquished ===&lt;br /&gt;
&lt;br /&gt;
Try to keep the submodule pointer to Daemon at a commits which is compatible with the Unvanquished commit containing them. We want to get a harmonious set of components when we do a recursive checkout of some Unvanquished commit.&lt;br /&gt;
&lt;br /&gt;
Changing the &amp;lt;code&amp;gt;playerState_t&amp;lt;/code&amp;gt; netcode is acceptable because the netcode table is stored in the gamelogic and we recommend always building cgame and sgame together.&lt;br /&gt;
&lt;br /&gt;
It's OK to put gameplay changes on master.&lt;br /&gt;
&lt;br /&gt;
=== *.dpkdir repos from UnvanquishedAssets ===&lt;br /&gt;
&lt;br /&gt;
Changes to the master branch should be compatible with the master gamelogic, but need not be compatible with the last-release gamelogic. The master branch of assets should be compatible with either the master engine or the latest-release engine. If an asset requires an engine newer than the last release to work, it should go in a next-release branch.&lt;br /&gt;
&lt;br /&gt;
If possible, we want to avoid any situation where developers are required to use any unreleased stuff from these to get a working setup.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=MinGW&amp;diff=8737</id>
		<title>MinGW</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=MinGW&amp;diff=8737"/>
				<updated>2024-09-30T00:40:45Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: CBSE_PYTHON_PATH&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MinGW is a GCC-based compiler toolchain targeting Windows platforms. It is used to produce the Windows releases of Unvanquished. It can be quite complicated to use successfully, in part due to the existence of different compiler &amp;quot;flavors&amp;quot;, and confusing naming schemes. This page serves as a guide to both MinGW in general, and specifically in application to building Daemon and Unvanquished. Throughout this page, &amp;quot;MinGW&amp;quot; will be used to refer to the [http://mingw-w64.org/ mingw-w64] project, which is a fork of the (now long-moribund) &amp;quot;original MinGW&amp;quot; project aiming to support both 32- and 64-bit builds. So beware: something having &amp;quot;64&amp;quot; in its name does not at all imply it is for 64-bit binaries! Same goes for &amp;quot;32&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Flavors ==&lt;br /&gt;
&lt;br /&gt;
=== Bitness: 32-bit or 64-bit ===&lt;br /&gt;
&lt;br /&gt;
Whether to compile for 32-bit (&amp;quot;i686&amp;quot; in package names) or 64-bit (&amp;quot;x86-64&amp;quot; or &amp;quot;x86_64&amp;quot;) architecture. 64-bit Windows versions are capable of running 32-bit executables in a mode called WOW (Windows-on-Windows).&lt;br /&gt;
&lt;br /&gt;
=== Threading flavor ===&lt;br /&gt;
You can get &amp;lt;code&amp;gt;win32&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;posix&amp;lt;/code&amp;gt; thread models. Daemon must be built with the &amp;lt;code&amp;gt;posix&amp;lt;/code&amp;gt; flavor, because code that uses &amp;lt;code&amp;gt;std::thread&amp;lt;/code&amp;gt; does not compile with &amp;lt;code&amp;gt;win32&amp;lt;/code&amp;gt;. In general there is no reason to use &amp;lt;code&amp;gt;win32&amp;lt;/code&amp;gt;. However, it is unfortunately the default in the APT package manager.&lt;br /&gt;
&lt;br /&gt;
=== Exception handling flavor ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sjlj&amp;lt;/code&amp;gt; (setjmp/longjmp) is available for both 32- and 64-bit builds. It has the drawback of significant runtime cost.&lt;br /&gt;
* &amp;lt;code&amp;gt;dwarf&amp;lt;/code&amp;gt; is available only for 32-bit. It has good performance, but it is said to have a drawback that exceptions can't be propagated through code compiled with a different compiler (or C code?). However, propagating exceptions through C code shouldn't be needed for Daemon.&lt;br /&gt;
* &amp;lt;code&amp;gt;seh&amp;lt;/code&amp;gt; (Structured Exception Handling) is available only for 64-bit. It has good performance and always works correctly, so it should always be used for 64-bit.&lt;br /&gt;
&lt;br /&gt;
One way to identify which exception model code was built with is to check the libgcc dependency. You'll find for example &amp;lt;code&amp;gt;libgcc_s_seh-1.dll&amp;lt;/code&amp;gt; for SEH, &amp;lt;code&amp;gt;libgcc_s_dw2-1.dll&amp;lt;/code&amp;gt; for DWARF, or &amp;lt;code&amp;gt;libgcc_s_sjlj-1.dll&amp;lt;/code&amp;gt; for sjlj. An easy way to make a C++ test program emit a libgcc dependency is to add a try/catch block.&lt;br /&gt;
&lt;br /&gt;
=== Mixing flavors ===&lt;br /&gt;
&lt;br /&gt;
Mixing different thread or exception flavors can cause problems, such as missing DLL dependencies, or exception handling not working.&lt;br /&gt;
&lt;br /&gt;
For the &amp;lt;code&amp;gt;external_deps&amp;lt;/code&amp;gt; libraries, efforts have been made to avoid depending on any thread-flavor-specific or exception-flavor-specific libraries, so it should be possible to use them with any flavor of MinGW. Exception handling glitches shouldn't be an issue since the Windows depencies are C-only.&lt;br /&gt;
&lt;br /&gt;
== Distributions ==&lt;br /&gt;
&lt;br /&gt;
=== Cross-compiling from Linux ===&lt;br /&gt;
&lt;br /&gt;
Most Linux package managers offer some form of MinGW package. Availability of different flavor combinations varies.&lt;br /&gt;
&lt;br /&gt;
==== Installation ====&lt;br /&gt;
APT (Debian Buster or older):&lt;br /&gt;
&amp;lt;pre&amp;gt;# 32-bit, sjlj. win32 threads are selected by default; switch it to posix&lt;br /&gt;
sudo apt install g++-mingw-w64-i686  &lt;br /&gt;
sudo update-alternatives --set i686-w64-mingw32-gcc /usr/bin/i686-w64-mingw32-gcc-posix&lt;br /&gt;
sudo update-alternatives --set i686-w64-mingw32-g++ /usr/bin/i686-w64-mingw32-g++-posix&lt;br /&gt;
&lt;br /&gt;
# 64-bit, SEH. win32 threads are selected by default; switch it to posix&lt;br /&gt;
sudo apt install g++-mingw-w64-x86-64  &lt;br /&gt;
sudo update-alternatives --set x86_64-w64-mingw32-gcc /usr/bin/x86_64-w64-mingw32-gcc-posix&lt;br /&gt;
sudo update-alternatives --set x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
APT (Debian Bullseye or newer):&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt install gcc-mingw-w64-i686-posix&amp;lt;/code&amp;gt; (32-bit, posix, sjlj)&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt install gcc-mingw-w64-x86-64-posix&amp;lt;/code&amp;gt; (64-bit, posix, SEH)&lt;br /&gt;
&lt;br /&gt;
==== Usage ====&lt;br /&gt;
&lt;br /&gt;
To build a CMake project, you need a &amp;quot;toolchain file&amp;quot;. Sadly, there is no official toolchain file from MinGW or CMake. For Daemon and Unvanquished we use [https://github.com/DaemonEngine/Daemon/blob/master/cmake/cross-toolchain-mingw32.cmake this (32-bit)] and [https://github.com/DaemonEngine/Daemon/blob/master/cmake/cross-toolchain-mingw64.cmake this (64-bit)]. Use it by passing &amp;lt;code&amp;gt;-DCMAKE_TOOLCHAIN_FILE=&amp;lt;path&amp;gt;&amp;lt;/code&amp;gt; on the &amp;lt;code&amp;gt;cmake&amp;lt;/code&amp;gt; command line.&lt;br /&gt;
&lt;br /&gt;
=== MSYS2 ===&lt;br /&gt;
&lt;br /&gt;
MSYS2 runs on Windows hosts and provides up-to-date 32-bit/DWARF/posix and 64-bit/SEH/posix toolchains. Building is done from a Bash shell in a partial emulation of a Linux environment, similar to Cygwin.&lt;br /&gt;
&lt;br /&gt;
==== Installation ====&lt;br /&gt;
&lt;br /&gt;
Download from [https://www.msys2.org]. &lt;br /&gt;
&lt;br /&gt;
Install dependencies to build Daemon (can be done from any MSYS2 shell flavor):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# 32-bit&lt;br /&gt;
pacman -Sy mingw-w64-i686-gcc mingw64-i686-cmake make&lt;br /&gt;
# 64-bit&lt;br /&gt;
pacman -Sy mingw-w64-x86_64-gcc mingw64-x86_64-cmake make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Usage ====&lt;br /&gt;
You must open a different MSYS2 shell flavor according to which architecture you want to target: &amp;quot;MSYS2 MinGW 32-bit&amp;quot; or &amp;quot;MSYS2 MinGW 64-bit&amp;quot;. When invoking &amp;lt;code&amp;gt;cmake&amp;lt;/code&amp;gt;, you must pass the flag &amp;lt;code&amp;gt;-G&amp;quot;MSYS Makefiles&amp;quot;&amp;lt;/code&amp;gt;. When building Unvanquished, the flag &amp;lt;code&amp;gt;-DCBSE_PYTHON_PATH=&amp;lt;path&amp;gt;&amp;lt;/code&amp;gt; may be of interest, if you want to use a Python other than the one shipped with MSYS2. &amp;lt;code&amp;gt;&amp;lt;path&amp;gt;&amp;lt;/code&amp;gt; should be in the Unix-emulation format, e.g. &amp;lt;code&amp;gt;/c/Python/python.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;MinGW-W64-builds&amp;quot; (Standalone Windows version) ===&lt;br /&gt;
This distribution (see [https://github.com/niXman/mingw-builds-binaries Github]) provides a toolchain that can be used from the Windows command prompt, without needing a Unix emulation layer. The installer allows you to choose from every valid combination of flavors.&lt;br /&gt;
 &lt;br /&gt;
==== Usage ====&lt;br /&gt;
&lt;br /&gt;
Choose the &amp;lt;code&amp;gt;MinGW Makefiles&amp;lt;/code&amp;gt; generator in CMake. The location of the toolchain used is determined by finding the first one in your PATH environment variable. Relative to the installation root, the PATH entry should be at &amp;lt;code&amp;gt;mingw32\bin&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;mingw64\bin&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After running CMake, compile by running &amp;lt;code&amp;gt;mingw32-make&amp;lt;/code&amp;gt; in the build directory.&lt;br /&gt;
&lt;br /&gt;
== Built-in DLL dependencies ==&lt;br /&gt;
&lt;br /&gt;
There are a few DLLs shipped as part of MinGW that most programs will depend on. These are also available as static libraries (a fully static binary can be produced with the &amp;lt;code&amp;gt;-static&amp;lt;/code&amp;gt; flag), but dynamic is the default. These are:&lt;br /&gt;
* &amp;lt;code&amp;gt;libgcc&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;libstdc++&amp;lt;/code&amp;gt; (for C++ programs)&lt;br /&gt;
* &amp;lt;code&amp;gt;libssp&amp;lt;/code&amp;gt; (if stack protection is enabled)&lt;br /&gt;
* &amp;lt;code&amp;gt;libwinpthread&amp;lt;/code&amp;gt; (if threads are used)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;libstdc++&amp;lt;/code&amp;gt; is both thread- and exception-flavor-dependent, but unlike &amp;lt;code&amp;gt;libgcc&amp;lt;/code&amp;gt;, the DLL does not have the flavor written in the filename. This means that you can't easily tell if you have the right one (nor can the Windows executable loader). [https://github.com/lucasg/Dependencies Dependencies] is a good tool to investigate such issues.&lt;br /&gt;
&lt;br /&gt;
When distributing a binary release of Daemon, you must ship these DLLs alongside the executable, else you will run into [https://github.com/Unvanquished/Unvanquished/issues/716 this issue]. Note that unlike Daemon's other DLL dependencies (from the &amp;lt;code&amp;gt;external_deps&amp;lt;/code&amp;gt; package), the MinGW DLLs are not automatically copied to the build directory as part of the build process. See &amp;lt;code&amp;gt;extra_dll_list&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;findDll&amp;lt;/code&amp;gt; in the [https://github.com/Unvanquished/release-scripts/blob/master/build-release Unvanquished release script].&lt;br /&gt;
&lt;br /&gt;
== C ABI compability with MSVC ==&lt;br /&gt;
&lt;br /&gt;
On 32-bit x86, GCC has a different default stack alignment (16 bytes) than MSVC (4 bytes). This can cause problems when MSVC-compiled code calls into GCC-compiled code and the alignment is less than expected. One solution, which we use to build MSVC-compatible &amp;lt;code&amp;gt;external_deps&amp;lt;/code&amp;gt; DLLs, is to use a GCC flag (&amp;lt;code&amp;gt;-mpreferred-stack-boundary=&amp;lt;/code&amp;gt;) to change the presumed stack alignment. Another, which we use to handle jumps from 3rd-party binaries to our (MinGW-built) code, is to put the annotation &amp;lt;code&amp;gt;__attribute__((force_align_arg_pointer))&amp;lt;/code&amp;gt; on the functions which may be called with less alignment than expected, instructing the compiler to perform alignment when the function is called.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-mms-bitfields&amp;lt;/code&amp;gt; should be enabled to ensure that the layout of structs containing bitfields matches. This is on by default.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Tools/Breakpad&amp;diff=8713</id>
		<title>Tools/Breakpad</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Tools/Breakpad&amp;diff=8713"/>
				<updated>2024-09-18T22:42:17Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: mention gdbserver cvar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Breakpad is the technology for generating and analyzing crash dumps for the Daemon engine and NaCl gamelogic modules. A crash dump is a file that is generated when the program crashes, which can be analyzed by developers to find out why the crash occurred. Breakpad is currently available in Daemon for the Windows (if built with MinGW) and Linux engine code, and the NaCl gamelogic on any platform.&lt;br /&gt;
&lt;br /&gt;
{{Note|content=Breakpad cannot be used for &amp;lt;i&amp;gt;native executable&amp;lt;/i&amp;gt; gamelogic modules. But (assuming a Linux server) you may use traditional core dumps instead. OR, you can use the &amp;lt;code&amp;gt;vm.cgame.type&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;vm.sgame.type&amp;lt;/code&amp;gt; cvars to start up gdbserver (TODO: explain how to use this). }}&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The USE_BREAKPAD CMake option controls whether Breakpad support is built into the engine. It is disabled by default because Breakpad is primarily useful for publicly distributed release binaries, not people who build and run the code themselves. Note that NaCl crash dump support is always built in, regardless of options.&lt;br /&gt;
&lt;br /&gt;
For an engine built with Breakpad support, the &amp;lt;code&amp;gt;common.breakpad.enabled&amp;lt;/code&amp;gt; cvar turns it on or off. The cvar can only be set via the command line, like &amp;lt;code&amp;gt;./daemon -set common.breakpad.enabled 0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== For users: reporting a crash ==&lt;br /&gt;
&lt;br /&gt;
The crash dumps are stored in the homepath under the &amp;lt;code&amp;gt;crashdump/&amp;lt;/code&amp;gt; directory. Sort by date to find the most recent one and make sure it matches the date/time when the crash occurred. Send the .dmp file to someone on the Unvanquished development team.&lt;br /&gt;
&lt;br /&gt;
== For developers: how to trace a crash ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Getting the tools ===&lt;br /&gt;
&lt;br /&gt;
The Breakpad repo for Daemon Engine is at https://github.com/DaemonEngine/breakpad. If you have already checked out Daemon, then it is located in the &amp;lt;code&amp;gt;libs/breakpad/&amp;lt;/code&amp;gt; submodule there. cd into this repo.&lt;br /&gt;
&lt;br /&gt;
Daemon's Breakpad fork is based on https://github.com/jon-turney/google-breakpad, with only minor changes. Jon Turney's version adds MinGW support. It is in turn a fork of Chromium's Breakpad https://chromium.googlesource.com/breakpad/breakpad.&lt;br /&gt;
&lt;br /&gt;
=== 2. Get symbols ===&lt;br /&gt;
&lt;br /&gt;
==== 2a. Symbols for an official Unvanquished release ====&lt;br /&gt;
&lt;br /&gt;
If you are debugging an official release binary, you don't need to (and can't) generate symbols yourself -- the Unvanquished release script handles this. In the Unvanquished unizip/torrent (or updater installation directory), symbol files are found in the &amp;lt;code&amp;gt;symbols_${VERSION}.zip&amp;lt;/code&amp;gt; archive. Simply extract the zip somewhere.&lt;br /&gt;
&lt;br /&gt;
==== 2b. Generating your own symbols ====&lt;br /&gt;
&lt;br /&gt;
To produce symbols, you need a binary with debug info. For MinGW, the binary additionally needs to have been built with the {{code|-Wl,--build-id}} flag so that it has a nonzero build ID.&lt;br /&gt;
&lt;br /&gt;
The first step is to build the dump_syms and/or dump_syms_dwarf executable using Make. Then you can use the &amp;lt;code&amp;gt;symbolize.py&amp;lt;/code&amp;gt; script in the root of Daemon's Breakpad repository to produce the symbols and store them in a symbol directory. Or if you want to know how to do it yourself, you can read the following paragraph which describes what the script does:&lt;br /&gt;
&lt;br /&gt;
You need to run the dump_syms tool (located at &amp;lt;code&amp;gt;src/tools/linux/dump_syms/dump_syms&amp;lt;/code&amp;gt; for Linux or NaCl targets or &amp;lt;code&amp;gt;src/tools/windows/dump_syms_dwarf/dump_syms&amp;lt;/code&amp;gt; for MinGW targets) on the binary(ies) where the crash occurred. Usage: &amp;lt;code&amp;gt;dump_syms &amp;lt;binary&amp;gt;&amp;lt;/code&amp;gt;. The output must be stored in a specific directory format. Pick a directory to be the symbol directory (&amp;lt;code&amp;gt;symbols&amp;lt;/code&amp;gt; in the following examples). The output must be stored at &amp;lt;code&amp;gt;symbols/$FILENAME/$BUILD_ID/$FILENAME.sym&amp;lt;/code&amp;gt; . For example, &amp;lt;code&amp;gt;symbols/cgame-native-dll.dll/1A74E057938E0BF10930C4F54740B2E21/cgame-native-dll.dll.sym&amp;lt;/code&amp;gt;. The build ID can be seen in the first few lines of dump_syms output in a line beginning with &amp;lt;code&amp;gt;MODULE&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 3. Stack walk ===&lt;br /&gt;
Running the stack walk tool (located at &amp;lt;code&amp;gt;src/processor/minidump_stackwalk&amp;lt;/code&amp;gt;) will give the human-readable stack trace. Usage: &amp;lt;code&amp;gt;minidump_stackwalk &amp;lt;dump file&amp;gt; &amp;lt;symbol directory&amp;gt;&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=MinGW&amp;diff=8666</id>
		<title>MinGW</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=MinGW&amp;diff=8666"/>
				<updated>2024-09-16T21:24:39Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* &amp;quot;MinGW-W64-builds&amp;quot; (Standalone Windows version) */ this distribution was resurrected yay&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MinGW is a GCC-based compiler toolchain targeting Windows platforms. It is used to produce the Windows releases of Unvanquished. It can be quite complicated to use successfully, in part due to the existence of different compiler &amp;quot;flavors&amp;quot;, and confusing naming schemes. This page serves as a guide to both MinGW in general, and specifically in application to building Daemon and Unvanquished. Throughout this page, &amp;quot;MinGW&amp;quot; will be used to refer to the [http://mingw-w64.org/ mingw-w64] project, which is a fork of the (now long-moribund) &amp;quot;original MinGW&amp;quot; project aiming to support both 32- and 64-bit builds. So beware: something having &amp;quot;64&amp;quot; in its name does not at all imply it is for 64-bit binaries! Same goes for &amp;quot;32&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Flavors ==&lt;br /&gt;
&lt;br /&gt;
=== Bitness: 32-bit or 64-bit ===&lt;br /&gt;
&lt;br /&gt;
Whether to compile for 32-bit (&amp;quot;i686&amp;quot; in package names) or 64-bit (&amp;quot;x86-64&amp;quot; or &amp;quot;x86_64&amp;quot;) architecture. 64-bit Windows versions are capable of running 32-bit executables in a mode called WOW (Windows-on-Windows).&lt;br /&gt;
&lt;br /&gt;
=== Threading flavor ===&lt;br /&gt;
You can get &amp;lt;code&amp;gt;win32&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;posix&amp;lt;/code&amp;gt; thread models. Daemon must be built with the &amp;lt;code&amp;gt;posix&amp;lt;/code&amp;gt; flavor, because code that uses &amp;lt;code&amp;gt;std::thread&amp;lt;/code&amp;gt; does not compile with &amp;lt;code&amp;gt;win32&amp;lt;/code&amp;gt;. In general there is no reason to use &amp;lt;code&amp;gt;win32&amp;lt;/code&amp;gt;. However, it is unfortunately the default in the APT package manager.&lt;br /&gt;
&lt;br /&gt;
=== Exception handling flavor ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sjlj&amp;lt;/code&amp;gt; (setjmp/longjmp) is available for both 32- and 64-bit builds. It has the drawback of significant runtime cost.&lt;br /&gt;
* &amp;lt;code&amp;gt;dwarf&amp;lt;/code&amp;gt; is available only for 32-bit. It has good performance, but it is said to have a drawback that exceptions can't be propagated through code compiled with a different compiler (or C code?). However, propagating exceptions through C code shouldn't be needed for Daemon.&lt;br /&gt;
* &amp;lt;code&amp;gt;seh&amp;lt;/code&amp;gt; (Structured Exception Handling) is available only for 64-bit. It has good performance and always works correctly, so it should always be used for 64-bit.&lt;br /&gt;
&lt;br /&gt;
One way to identify which exception model code was built with is to check the libgcc dependency. You'll find for example &amp;lt;code&amp;gt;libgcc_s_seh-1.dll&amp;lt;/code&amp;gt; for SEH, &amp;lt;code&amp;gt;libgcc_s_dw2-1.dll&amp;lt;/code&amp;gt; for DWARF, or &amp;lt;code&amp;gt;libgcc_s_sjlj-1.dll&amp;lt;/code&amp;gt; for sjlj. An easy way to make a C++ test program emit a libgcc dependency is to add a try/catch block.&lt;br /&gt;
&lt;br /&gt;
=== Mixing flavors ===&lt;br /&gt;
&lt;br /&gt;
Mixing different thread or exception flavors can cause problems, such as missing DLL dependencies, or exception handling not working.&lt;br /&gt;
&lt;br /&gt;
For the &amp;lt;code&amp;gt;external_deps&amp;lt;/code&amp;gt; libraries, efforts have been made to avoid depending on any thread-flavor-specific or exception-flavor-specific libraries, so it should be possible to use them with any flavor of MinGW. Exception handling glitches shouldn't be an issue since the Windows depencies are C-only.&lt;br /&gt;
&lt;br /&gt;
== Distributions ==&lt;br /&gt;
&lt;br /&gt;
=== Cross-compiling from Linux ===&lt;br /&gt;
&lt;br /&gt;
Most Linux package managers offer some form of MinGW package. Availability of different flavor combinations varies.&lt;br /&gt;
&lt;br /&gt;
==== Installation ====&lt;br /&gt;
APT (Debian Buster or older):&lt;br /&gt;
&amp;lt;pre&amp;gt;# 32-bit, sjlj. win32 threads are selected by default; switch it to posix&lt;br /&gt;
sudo apt install g++-mingw-w64-i686  &lt;br /&gt;
sudo update-alternatives --set i686-w64-mingw32-gcc /usr/bin/i686-w64-mingw32-gcc-posix&lt;br /&gt;
sudo update-alternatives --set i686-w64-mingw32-g++ /usr/bin/i686-w64-mingw32-g++-posix&lt;br /&gt;
&lt;br /&gt;
# 64-bit, SEH. win32 threads are selected by default; switch it to posix&lt;br /&gt;
sudo apt install g++-mingw-w64-x86-64  &lt;br /&gt;
sudo update-alternatives --set x86_64-w64-mingw32-gcc /usr/bin/x86_64-w64-mingw32-gcc-posix&lt;br /&gt;
sudo update-alternatives --set x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
APT (Debian Bullseye or newer):&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt install gcc-mingw-w64-i686-posix&amp;lt;/code&amp;gt; (32-bit, posix, sjlj)&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt install gcc-mingw-w64-x86-64-posix&amp;lt;/code&amp;gt; (64-bit, posix, SEH)&lt;br /&gt;
&lt;br /&gt;
==== Usage ====&lt;br /&gt;
&lt;br /&gt;
To build a CMake project, you need a &amp;quot;toolchain file&amp;quot;. Sadly, there is no official toolchain file from MinGW or CMake. For Daemon and Unvanquished we use [https://github.com/DaemonEngine/Daemon/blob/master/cmake/cross-toolchain-mingw32.cmake this (32-bit)] and [https://github.com/DaemonEngine/Daemon/blob/master/cmake/cross-toolchain-mingw64.cmake this (64-bit)]. Use it by passing &amp;lt;code&amp;gt;-DCMAKE_TOOLCHAIN_FILE=&amp;lt;path&amp;gt;&amp;lt;/code&amp;gt; on the &amp;lt;code&amp;gt;cmake&amp;lt;/code&amp;gt; command line.&lt;br /&gt;
&lt;br /&gt;
=== MSYS2 ===&lt;br /&gt;
&lt;br /&gt;
MSYS2 runs on Windows hosts and provides up-to-date 32-bit/DWARF/posix and 64-bit/SEH/posix toolchains. Building is done from a Bash shell in a partial emulation of a Linux environment, similar to Cygwin.&lt;br /&gt;
&lt;br /&gt;
==== Installation ====&lt;br /&gt;
&lt;br /&gt;
Download from [https://www.msys2.org]. &lt;br /&gt;
&lt;br /&gt;
Install dependencies to build Daemon (can be done from any MSYS2 shell flavor):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# 32-bit&lt;br /&gt;
pacman -Sy mingw-w64-i686-gcc mingw64-i686-cmake make&lt;br /&gt;
# 64-bit&lt;br /&gt;
pacman -Sy mingw-w64-x86_64-gcc mingw64-x86_64-cmake make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Usage ====&lt;br /&gt;
You must open a different MSYS2 shell flavor according to which architecture you want to target: &amp;quot;MSYS2 MinGW 32-bit&amp;quot; or &amp;quot;MSYS2 MinGW 64-bit&amp;quot;. When invoking &amp;lt;code&amp;gt;cmake&amp;lt;/code&amp;gt;, you must pass the flag &amp;lt;code&amp;gt;-G&amp;quot;MSYS Makefiles&amp;quot;&amp;lt;/code&amp;gt;. When building Unvanquished, the flag &amp;lt;code&amp;gt;-DDAEMON_CBSE_PYTHON_PATH=&amp;lt;path&amp;gt;&amp;lt;/code&amp;gt; may be of interest, if you want to use a Python other than the one shipped with MSYS2. &amp;lt;code&amp;gt;&amp;lt;path&amp;gt;&amp;lt;/code&amp;gt; should be in the Unix-emulation format, e.g. &amp;lt;code&amp;gt;/c/Python/python.exe&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;MinGW-W64-builds&amp;quot; (Standalone Windows version) ===&lt;br /&gt;
This distribution (see [https://github.com/niXman/mingw-builds-binaries Github]) provides a toolchain that can be used from the Windows command prompt, without needing a Unix emulation layer. The installer allows you to choose from every valid combination of flavors.&lt;br /&gt;
 &lt;br /&gt;
==== Usage ====&lt;br /&gt;
&lt;br /&gt;
Choose the &amp;lt;code&amp;gt;MinGW Makefiles&amp;lt;/code&amp;gt; generator in CMake. The location of the toolchain used is determined by finding the first one in your PATH environment variable. Relative to the installation root, the PATH entry should be at &amp;lt;code&amp;gt;mingw32\bin&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;mingw64\bin&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After running CMake, compile by running &amp;lt;code&amp;gt;mingw32-make&amp;lt;/code&amp;gt; in the build directory.&lt;br /&gt;
&lt;br /&gt;
== Built-in DLL dependencies ==&lt;br /&gt;
&lt;br /&gt;
There are a few DLLs shipped as part of MinGW that most programs will depend on. These are also available as static libraries (a fully static binary can be produced with the &amp;lt;code&amp;gt;-static&amp;lt;/code&amp;gt; flag), but dynamic is the default. These are:&lt;br /&gt;
* &amp;lt;code&amp;gt;libgcc&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;libstdc++&amp;lt;/code&amp;gt; (for C++ programs)&lt;br /&gt;
* &amp;lt;code&amp;gt;libssp&amp;lt;/code&amp;gt; (if stack protection is enabled)&lt;br /&gt;
* &amp;lt;code&amp;gt;libwinpthread&amp;lt;/code&amp;gt; (if threads are used)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;libstdc++&amp;lt;/code&amp;gt; is both thread- and exception-flavor-dependent, but unlike &amp;lt;code&amp;gt;libgcc&amp;lt;/code&amp;gt;, the DLL does not have the flavor written in the filename. This means that you can't easily tell if you have the right one (nor can the Windows executable loader). [https://github.com/lucasg/Dependencies Dependencies] is a good tool to investigate such issues.&lt;br /&gt;
&lt;br /&gt;
When distributing a binary release of Daemon, you must ship these DLLs alongside the executable, else you will run into [https://github.com/Unvanquished/Unvanquished/issues/716 this issue]. Note that unlike Daemon's other DLL dependencies (from the &amp;lt;code&amp;gt;external_deps&amp;lt;/code&amp;gt; package), the MinGW DLLs are not automatically copied to the build directory as part of the build process. See &amp;lt;code&amp;gt;extra_dll_list&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;findDll&amp;lt;/code&amp;gt; in the [https://github.com/Unvanquished/release-scripts/blob/master/build-release Unvanquished release script].&lt;br /&gt;
&lt;br /&gt;
== C ABI compability with MSVC ==&lt;br /&gt;
&lt;br /&gt;
On 32-bit x86, GCC has a different default stack alignment (16 bytes) than MSVC (4 bytes). This can cause problems when MSVC-compiled code calls into GCC-compiled code and the alignment is less than expected. One solution, which we use to build MSVC-compatible &amp;lt;code&amp;gt;external_deps&amp;lt;/code&amp;gt; DLLs, is to use a GCC flag (&amp;lt;code&amp;gt;-mpreferred-stack-boundary=&amp;lt;/code&amp;gt;) to change the presumed stack alignment. Another, which we use to handle jumps from 3rd-party binaries to our (MinGW-built) code, is to put the annotation &amp;lt;code&amp;gt;__attribute__((force_align_arg_pointer))&amp;lt;/code&amp;gt; on the functions which may be called with less alignment than expected, instructing the compiler to perform alignment when the function is called.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-mms-bitfields&amp;lt;/code&amp;gt; should be enabled to ensure that the layout of structs containing bitfields matches. This is on by default.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Continuous_integration&amp;diff=8662</id>
		<title>Continuous integration</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Continuous_integration&amp;diff=8662"/>
				<updated>2024-09-10T05:11:51Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* Build matrix */ fix unv appveyor generator&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Infrastructure]]&lt;br /&gt;
Continuous integration (CI) refers to the automated builds that run each time someone opens or modifies a pull request against, or modifies the code of, the Unvanquished and Daemon source code repositories on GitHub.&lt;br /&gt;
&lt;br /&gt;
We use the following CI services:&lt;br /&gt;
* Appveyor, for building with MSVC on Windows. Its configuration is found in the file {{code|.appveyor.yml}} in the repository root.&lt;br /&gt;
* Azure Pipelines. Its configuration is found in the file {{code|azure-pipelines.yml}} in the repository root. It handles Mac native builds on [https://github.com/actions/virtual-environments/blob/main/images/macos/macos-11-Readme.md macOS 11.x] and Linux native and NaCl builds on [https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2004-Readme.md Ubuntu 20.04] (Focal).&lt;br /&gt;
* GitHub CodeQL. Its configuration is found in the file {{code|.github/workflows/codeql.yml}} in the repository. Its purpose is to scan the source code for vulnerabilities, and for that purpose it starts by building the source tree using the latest LTS Ubuntu distribution provided by the platform ([https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2004-Readme.md Ubuntu 22.04]) and the default compiler of this platform.&lt;br /&gt;
&lt;br /&gt;
In some Daemon builds, we run the unit tests. These builds have been configured to use the Release configuration so that the unit tests are closer to production builds. &lt;br /&gt;
&lt;br /&gt;
== Build matrix ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! colspan=&amp;quot;9&amp;quot; | {{engine}}&lt;br /&gt;
|-&lt;br /&gt;
! Service&lt;br /&gt;
! Host&lt;br /&gt;
! Target&lt;br /&gt;
! Compiler&lt;br /&gt;
! Generator&lt;br /&gt;
! Build Type&lt;br /&gt;
! WERROR&lt;br /&gt;
! PCH&lt;br /&gt;
! Unit tests&lt;br /&gt;
|-&lt;br /&gt;
| Appveyor || Windows amd64 || Windows amd64 || VS 2019 || Visual Studio || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Appveyor || Windows amd64 || Windows i686 || VS 2019 || Visual Studio || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Windows amd64 || MinGW 9.3 || Ninja || Release || Yes || No || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 || GCC 9.4 || Ninja || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 || Clang 11.0 || Ninja || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || macOS-11 amd64 || macOS amd64 || AppleClang 13.0 || Make || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| GitHub Actions CodeQL || ubuntu-latest || Linux amd64 || GCC (floating) || Ninja || Release || No || Yes || No&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
! colspan=&amp;quot;8&amp;quot; | {{game}}&lt;br /&gt;
|-&lt;br /&gt;
! Service&lt;br /&gt;
! Host&lt;br /&gt;
! Target&lt;br /&gt;
! Compiler&lt;br /&gt;
! Generator&lt;br /&gt;
! Build Type&lt;br /&gt;
! WERROR&lt;br /&gt;
! PCH&lt;br /&gt;
|-&lt;br /&gt;
| Appveyor || Windows amd64 || Windows i686 DLL || VS 2019 || NMake || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 DLL || GCC 8.4 || Ninja || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 DLL || Clang 11.0 || Ninja || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || NaCl all NEXE || PNaCl Clang 3.6 || Ninja || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || macOS-12 amd64 || macOS amd64 DLL || AppleClang 14.0 || Make || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| GitHub Actions CodeQL || ubuntu-latest || Linux amd64 DLL+EXE || GCC (floating) || Ninja || Release || No || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
“WERROR” indicates whether the {{code|USE_WERROR}} option is on, which gives a failing building build status if there are warnings in our code. Note that {{code|USE_WERROR}} only applies to ”our” code in {{code|src/}}, so you may still see warnings from stuff in {{code|libs/}}.&lt;br /&gt;
&lt;br /&gt;
“PCH” indicates whether the precompiled header is enabled.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Testing/Maps&amp;diff=8660</id>
		<title>Testing/Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Testing/Maps&amp;diff=8660"/>
				<updated>2024-08-24T17:23:06Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: Greatly expand the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Testing]]&lt;br /&gt;
[[Category:Mapping]]&lt;br /&gt;
==Finding gameplay testers==&lt;br /&gt;
To publicly test your maps, make a thread [https://forums.unvanquished.net/viewforum.php?f=9 on forums] to share your work-in-progress work and some server admins will probably host it ;-).&lt;br /&gt;
&lt;br /&gt;
==Cheat commands and cvars==&lt;br /&gt;
* To fly around the map, use the &amp;lt;code&amp;gt;\noclip&amp;lt;/code&amp;gt; command.&amp;lt;br/&amp;gt;If you find that you are moving too slowly (or too fast), you may change the speed with &amp;lt;code&amp;gt;cg_flySpeed&amp;lt;/code&amp;gt;.&lt;br /&gt;
* To spawn as granger or ckit in your current location, use &amp;lt;code&amp;gt;/devteam a&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/devteam h&amp;lt;/code&amp;gt;.&lt;br /&gt;
* To make yourself invincible, use the &amp;lt;code&amp;gt;\god&amp;lt;/code&amp;gt; command.&lt;br /&gt;
* To stop buildables from attacking, use the &amp;lt;code&amp;gt;\notarget&amp;lt;/code&amp;gt; command.&lt;br /&gt;
* See [[Map Layouts]] for buildable layout management commands.&lt;br /&gt;
&lt;br /&gt;
===Some rendering debugging cvars===&lt;br /&gt;
* To lock the state of PVS, set &amp;lt;code&amp;gt;r_lockpvs&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Be aware of the difference between this and &amp;lt;code&amp;gt;r_novis&amp;lt;/code&amp;gt;: this disables any ''updates'' to the state of the PVS buffer &amp;lt;!-- FIXME: there's a better term for this but I can't think of it at the moment --&amp;gt; but PVS is still in effect; this can make flying outside of a map difficult.&lt;br /&gt;
* To disable PVS entirely, set &amp;lt;code&amp;gt;r_novis&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
* To disable PVS for entities, set &amp;lt;code&amp;gt;sv_novis&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Note|header=Developer Note|content=&lt;br /&gt;
The reason that enabling/disabling PVS for entities is controlled with a separate cvar from the world is that the server is responsible for determining when to send information about entities to the client. The server considers two things:&lt;br /&gt;
* if the entity is within radar range of the player, and&lt;br /&gt;
* if the entity is potentially visible to the player.&lt;br /&gt;
The server will send the position of an entity if it meets one or both of these conditions.}}&lt;br /&gt;
&lt;br /&gt;
* [Engine version 0.55+] If parts of the map seem too bright, try setting &amp;lt;code&amp;gt;r_forceLegacyOverbrightClamping 1&amp;lt;/code&amp;gt; to see if it looks better with this cvar that makes lighting more like older versions.&lt;br /&gt;
* If things are not being rendered that should be, try setting &amp;lt;code&amp;gt;r_nocull 1&amp;lt;/code&amp;gt; to disable CPU-side culling of surfaces.&lt;br /&gt;
&lt;br /&gt;
=== For debugging map entities ===&lt;br /&gt;
* Set &amp;lt;code&amp;gt;cg_drawEntityInfo 1&amp;lt;/code&amp;gt; to identify an entity's class and number by looking at it&lt;br /&gt;
* &amp;lt;code&amp;gt;/listEntities&amp;lt;/code&amp;gt; to print details of all entities in the console&lt;br /&gt;
* &amp;lt;code&amp;gt;/showEntity &amp;amp;lt;num&amp;gt;&amp;lt;/code&amp;gt; to print detailed information about a single entity&lt;br /&gt;
* Set &amp;lt;code&amp;gt;g_debugEntities&amp;lt;/code&amp;gt; to some value between 1 and 3 to get more logging&lt;br /&gt;
* &amp;lt;code&amp;gt;/entityFire &amp;amp;lt;num&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== For debugging bot navigation problems ===&lt;br /&gt;
* &amp;lt;code&amp;gt;/navedit enable &amp;lt;classname&amp;gt;&amp;lt;/code&amp;gt; to show the navigation mesh&lt;br /&gt;
&lt;br /&gt;
=== For toggling rendering of specific things ===&lt;br /&gt;
Disabling rendering of X may help to answer questions such as &amp;quot;Is this thing I'm looking at an X?&amp;quot; or &amp;quot;Is everything messed up because rendering of X is going haywire?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Set &amp;lt;code&amp;gt;r_drawWorld 0&amp;lt;/code&amp;gt; to disable rendering of the fixed part of the world&lt;br /&gt;
* Set &amp;lt;code&amp;gt;r_drawEntities 0&amp;lt;/code&amp;gt; to disable the complement of r_drawWorld?&lt;br /&gt;
* Set &amp;lt;code&amp;gt;r_noCurves 1&amp;lt;/code&amp;gt; to disable patches (SF_GRID surfaces)&lt;br /&gt;
* Set &amp;lt;code&amp;gt;r_noFog 1&amp;lt;/code&amp;gt; to disable fog&lt;br /&gt;
* Set &amp;lt;code&amp;gt;r_noportals 1&amp;lt;/code&amp;gt; to disable mirrors/portals&lt;br /&gt;
&lt;br /&gt;
=== For testing maps from games other than Unvanquished or Tremulous ===&lt;br /&gt;
* Set &amp;lt;code&amp;gt;g_neverEnd 1&amp;lt;/code&amp;gt; to avoid the game instantly ending due to lack of an Unvanquished layout.&lt;br /&gt;
* Set &amp;lt;code&amp;gt;fs_legacypaks 1&amp;lt;/code&amp;gt; to load .pk3 packages. The way this works is that all .pk3 packages in the pakpath are loaded -- there is no concept of dependencies.&lt;br /&gt;
* Set &amp;lt;code&amp;gt;r_dpMaterial 1&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;r_dpBlend 1&amp;lt;/code&amp;gt; for testing DarkPlaces engine (Xonotic) maps&lt;br /&gt;
&lt;br /&gt;
=== More obscure rendering debugging cvars ===&lt;br /&gt;
These can be difficult to interpret and are probably rarely useful.&lt;br /&gt;
* Set &amp;lt;code&amp;gt;r_showLightGrid 1&amp;lt;/code&amp;gt; to visualize the lightgrid.&lt;br /&gt;
* Set &amp;lt;code&amp;gt;r_showEntityTransforms 1&amp;lt;/code&amp;gt; to see bounding boxes of renderer &amp;quot;entities&amp;quot; (these do not necessarily to gamelogic/map entities)&lt;br /&gt;
* Set &amp;lt;code&amp;gt;r_showBspNodes&amp;lt;/code&amp;gt; between 1 and 3 to see BSP divisions.&lt;br /&gt;
* Set &amp;lt;code&amp;gt;r_showTris 1&amp;lt;/code&amp;gt; to see outlines of all triangles. Might want to combine with &amp;lt;code&amp;gt;cg_draw2d 0&amp;lt;/code&amp;gt; to reduce noise&lt;br /&gt;
* Set &amp;lt;code&amp;gt;r_showSky 1&amp;lt;/code&amp;gt; to draw the sky on top of everything else&lt;br /&gt;
&lt;br /&gt;
== Replacing the entity lump ==&lt;br /&gt;
You can put a file named &amp;lt;code&amp;gt;maps/$mapname$.ent&amp;lt;/code&amp;gt; in the VFS to override the entity lump in the BSP with one of your own choosing.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Maps&amp;diff=8659</id>
		<title>Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Maps&amp;diff=8659"/>
				<updated>2024-08-24T15:35:26Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* Map repositories */ add list of links to all paks on unvanquished.net&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Maps]]&lt;br /&gt;
&lt;br /&gt;
== Map repositories ==&lt;br /&gt;
&lt;br /&gt;
Places you can download DPKs or source repositories for various maps.&lt;br /&gt;
&lt;br /&gt;
=== Ready-to-play DPKs for Unvanquished ===&lt;br /&gt;
&lt;br /&gt;
All of the URLs here are HTTP servers used to provide automatic downloads when a player connects to a server but lacks a needed pak, so they will have other kinds of paks besides maps. You can find these URLs by setting &amp;lt;code&amp;gt;/logs.level.client.pakDownload debug&amp;lt;/code&amp;gt; in the console and connecting to a server while missing a pak, then looking for the console line starting &amp;lt;code&amp;gt;Debug: Checking for PAKSERVER in &amp;lt;/code&amp;gt;. The rest of the line is the download base URL.&lt;br /&gt;
&lt;br /&gt;
Excluding the &amp;quot;official&amp;quot; maps in the Unvanquished release, the vast majority of available maps were originally made for Tremulous or other games. The owners of servers mentioned here have generally done some testing and touch-ups to ensure the maps work correctly in Unvanquished, but not everything works 100%.&lt;br /&gt;
&lt;br /&gt;
* Official maps: https://dl.unvanquished.net/pkg/&lt;br /&gt;
* Maps from the server &amp;quot;Map&amp;amp;Bot Testing EU&amp;quot; run by Sweet: https://users.unvanquished.net/~sweet/pkg/. 350 maps as of November 2023.&lt;br /&gt;
* Maps from the server &amp;quot;deadbeef&amp;quot; run by bmorel: http://deadbeef.fr/unvanquished/. 313 maps as of November 2023. Has a directory with [[Levelshot|levelshots]].&lt;br /&gt;
&lt;br /&gt;
=== Tremulous maps in original form (.pk3) ===&lt;br /&gt;
&lt;br /&gt;
You can also find a bunch of maps from Tremulous: [https://dl.unvanquished.net/mercenaries-guild/public_html/maps/].&lt;br /&gt;
Despite this link being on official's Unvanquished's server, those are *not* officially supported and require modifications to be played. If you are lucky, you can get them working (locally) by simply renaming them in your own unvanquished/pkg folder like this: {{code|map-${name}_${version}.dpk}}.&lt;br /&gt;
And despite all this, there is no guarantee those will work, and even less that they'll be bug-free.&lt;br /&gt;
&lt;br /&gt;
Feel free to meet us on [https://unvanquished.net/chat/] to ask what needs to be done to have those more widely used by server owners!&lt;br /&gt;
&lt;br /&gt;
=== Complete list of paks available from unvanquished.net ===&lt;br /&gt;
&lt;br /&gt;
https://users.unvanquished.net/~slipher/pak-duplicate-report.txt contains links to all paks (maps and otherwise) that can be downloaded from any place on the unvanquished.net server. Includes both pk3 and dpk paks. Beware, this contains all sorts of junk, like invalid zip files or maps that don't work properly in any version of the game.&lt;br /&gt;
&lt;br /&gt;
=== Source repositories ===&lt;br /&gt;
&lt;br /&gt;
Git repositories with sources (.map files). For mappers and project maintainers. Must be built with NetRadiant or Urcheon to be playable.&lt;br /&gt;
&lt;br /&gt;
* Official maps are in the [https://github.com/UnvanquishedAssets UnvanquishedAssets] organization on Github. The map &amp;lt;code&amp;gt;$mapname$&amp;lt;/code&amp;gt; can be found at &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://github.com/UnvanquishedAssets/map-$mapname$_src.dpkdir&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* [https://github.com/InterstellarOasis/InterstellarOasis Interstellar Oasis] is a collection of &amp;quot;first-class&amp;quot; source ports by illwieckz of Tremulous maps. These are unofficial maps, but the work is done by one of the Unvanquished project heads.&lt;br /&gt;
* [https://github.com/Masmblr?tab=repositories Masmblr's Github] has source repositories for 26 Tremulous maps created by himself.&lt;br /&gt;
&lt;br /&gt;
==Official Unvanquished Maps==&lt;br /&gt;
&lt;br /&gt;
These maps are distributed with the default installation&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name and Description&lt;br /&gt;
! Levelshot&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| '''Antares'''&lt;br /&gt;
* Varied rooms and corridors&lt;br /&gt;
by Pevel&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Antares}}&lt;br /&gt;
|[[File:antares.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''Chasm'''&lt;br /&gt;
* Two route design&lt;br /&gt;
* Medium sized&lt;br /&gt;
* Outside area&lt;br /&gt;
by Supertanker&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Chasm}}&lt;br /&gt;
|[[File:Levelshots-Snowstation-b4.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| '''Forlorn'''&lt;br /&gt;
* Varied rooms and corridors&lt;br /&gt;
by EmperorJack&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Forlorn}}&lt;br /&gt;
|[[File:Forlorn.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| '''Parpax'''&lt;br /&gt;
* Medium sized&lt;br /&gt;
* Many branching paths&lt;br /&gt;
* Crawl spaces and piping&lt;br /&gt;
* Elevators&lt;br /&gt;
by Viech&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Parpax}}&lt;br /&gt;
|[[File:Levelshots-Parpax_compressed.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''Perseus'''&lt;br /&gt;
* Medium sized&lt;br /&gt;
by Pevel&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Perseus}}&lt;br /&gt;
|[[File:Perseus.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| '''Platform 23'''&lt;br /&gt;
* Symmetrical&lt;br /&gt;
* Replacement for ATCS&lt;br /&gt;
* Two route design&lt;br /&gt;
by EmperorJack&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Plat23}}&lt;br /&gt;
|[[File:Levelshots-Plat23-b11.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''Spacetracks'''&lt;br /&gt;
* Varied rooms, corridors and layers&lt;br /&gt;
* Many Elevators&lt;br /&gt;
* Crawl spaces&lt;br /&gt;
by Supertanker&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Spacetracks}}&lt;br /&gt;
|[[ File:Levelshots-Spacetracks-r1.jpg |400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| '''Station15'''&lt;br /&gt;
* Varied rooms and corridors&lt;br /&gt;
* Elevators&lt;br /&gt;
by Supertanker&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Station15}}&lt;br /&gt;
|[[File:Levelshots-Station15-r1.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| '''Thunder'''&lt;br /&gt;
* Very large&lt;br /&gt;
by EmperorJack&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Thunder}}&lt;br /&gt;
|[[File:Levelshot-thunder.jpeg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| '''Vega'''&lt;br /&gt;
* Large&lt;br /&gt;
by Ingar&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Vega}}&lt;br /&gt;
|[[File:vega.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| '''Yocto'''&lt;br /&gt;
* Vertical&lt;br /&gt;
by Pevel&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Yocto}}&lt;br /&gt;
|[[File:Levelshot-Yocto-b1a.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Gentrified Maps=&lt;br /&gt;
&lt;br /&gt;
Maps that were born in Tremulous.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name and Description&lt;br /&gt;
! Levelshot&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| '''.:U.T:C.S:.'''&lt;br /&gt;
* Symmetrical&lt;br /&gt;
* Two route design&lt;br /&gt;
* Small&lt;br /&gt;
&lt;br /&gt;
{{Subpage|UTCS}}&lt;br /&gt;
| [[File:Levelshot-Utcs.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| '''Arachnid 2'''&lt;br /&gt;
* Varied rooms, corridors and layers&lt;br /&gt;
* Crawl spaces and piping&lt;br /&gt;
* Medium sized&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Arachnid}}&lt;br /&gt;
| [[File:Levelshots-Arachnid2.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''Beyond Derelict'''&lt;br /&gt;
* Varied rooms, corridors and layers&lt;br /&gt;
* Crawl spaces&lt;br /&gt;
* Large&lt;br /&gt;
by Danny &amp;quot;Megabite&amp;quot; Marcus&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Derelict}}&lt;br /&gt;
|[[File:Levelshots-Derelict.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|'''Karith Station 2'''&lt;br /&gt;
* Varied rooms, corridors and layers&lt;br /&gt;
* Outside area&lt;br /&gt;
* Crawl spaces&lt;br /&gt;
* Large&lt;br /&gt;
* Elevators&lt;br /&gt;
by Godmil&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Karith}}&lt;br /&gt;
|[[File:Levelshots-Karith.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| '''Meep'''&lt;br /&gt;
* Varied rooms, corridors and layers&lt;br /&gt;
* Crawl spaces&lt;br /&gt;
* Medium sized&lt;br /&gt;
By Catalyc&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Meep}}&lt;br /&gt;
|[[File:Levelshots-Meep.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| '''Methane (beta 1)'''&lt;br /&gt;
* Large&lt;br /&gt;
* Vertically complex&lt;br /&gt;
by Ingar&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Methane}}&lt;br /&gt;
|[[File:Levelshots-Methane-beta1.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''Nano!'''&lt;br /&gt;
* Very Small&lt;br /&gt;
* Symmetrical&lt;br /&gt;
by Ingar&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Nano}}&lt;br /&gt;
|[[File:Levelshots-Nano.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''Nexus 6'''&lt;br /&gt;
* Varied rooms, corridors and layers&lt;br /&gt;
* Crawl spaces&lt;br /&gt;
* Medium sized&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Nexus}}&lt;br /&gt;
|[[File:Levelshots-Nexus6.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''Niveus : Outpost 652'''&lt;br /&gt;
* Varied rooms, corridors and layers&lt;br /&gt;
* Medium sized&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Niveus}}&lt;br /&gt;
|[[File:Levelshots-Niveus.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''Orion I - communication ship (beta 2)'''&lt;br /&gt;
* Varied rooms, corridors and layers with some vents&lt;br /&gt;
* Medium sized&lt;br /&gt;
by Xenom[GER]&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Orion}}&lt;br /&gt;
|[[File:Levelshots-Orion.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''Procyon - '''&lt;br /&gt;
* Varied rooms, corridors and layers and vents&lt;br /&gt;
* Large sized&lt;br /&gt;
by Ingar&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Procyon}}&lt;br /&gt;
|[[File:Levelshots-procyon.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|'''Sirius - '''&lt;br /&gt;
* Varied rooms, corridors and layers&lt;br /&gt;
* Large sized&lt;br /&gt;
by Ingar&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Sirius}}&lt;br /&gt;
|[[File:Levelshots-sirius.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|'''Tremor'''&lt;br /&gt;
* Medium sized&lt;br /&gt;
* Large rooms and corridors&lt;br /&gt;
* Crawl spaces (underground section)&lt;br /&gt;
by Vedacon&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Tremor}}&lt;br /&gt;
|[[File:Levelshots-Tremor.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''Uranium124 '''&lt;br /&gt;
* Varied rooms, corridors and layers&lt;br /&gt;
* Small sized&lt;br /&gt;
by CoderNem&lt;br /&gt;
&lt;br /&gt;
{{Subpage|Uranium124}}&lt;br /&gt;
|[[File:Levelshots-uranium124.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==community maps==&lt;br /&gt;
&lt;br /&gt;
Maps produced (and not already listed) by the community which are known to work for unvanquished, for both tremulous and unvanquished.&lt;br /&gt;
&lt;br /&gt;
Licences of images is the same as the map itself, this will be updated later.&lt;br /&gt;
This section have lot of things to do, including adding author's names, licencing informations, simple map descriptions, etc.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name and Description&lt;br /&gt;
! Levelshot&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|'''area3'''&lt;br /&gt;
|[[File:Levelshots-area3.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''atcshd'''&lt;br /&gt;
|[[File:Levelshots-atcshd.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''ctcs'''&lt;br /&gt;
|[[File:Levelshots-ctcs.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''dretchstorm'''&lt;br /&gt;
|[[File:Levelshots-dretchstorm.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''fortification'''&lt;br /&gt;
|[[File:Levelshots-fortification.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''hamunaptra'''&lt;br /&gt;
|[[File:Levelshots-hamunaptra.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''hangar28'''&lt;br /&gt;
|[[File:Levelshots-hangar28.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''jota'''&lt;br /&gt;
|[[File:Levelshots-jota.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''openfield'''&lt;br /&gt;
|[[File:Levelshots-openfield.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''peorongateb3'''&lt;br /&gt;
|[[File:Levelshots-peorongateb3.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''ptcs2'''&lt;br /&gt;
|[[File:Levelshots-ptcs2.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''rsmse'''&lt;br /&gt;
|[[File:Levelshots-rsmse.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''stahl'''&lt;br /&gt;
|[[File:Levelshots-stahl.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''terminus'''&lt;br /&gt;
|[[File:Levelshots-terminus.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''transit'''&lt;br /&gt;
|[[File:Levelshots-transit.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''uncreation'''&lt;br /&gt;
|[[File:Levelshots-uncreation.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''urbanp2'''&lt;br /&gt;
|[[File:Levelshots-urbanp2.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|'''usstremor'''&lt;br /&gt;
|[[File:Levelshots-usstremor.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Coding_convention&amp;diff=8658</id>
		<title>Coding convention</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Coding_convention&amp;diff=8658"/>
				<updated>2024-07-16T02:26:40Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: remove &amp;quot;(legacy)&amp;quot; from quake style&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the style guide for Unvanquished's and Daemon's source code.&lt;br /&gt;
&lt;br /&gt;
The first rule of style is to follow the style of the surrounding code. If there is a clear convention in the local region of code, continue to use it (with the possible exception of &amp;quot;Obsolete conventions&amp;quot; below). There are two broadly used style conventions, whose particularities are described in the &amp;quot;Quake style&amp;quot; and &amp;quot;New style&amp;quot; sections below.&lt;br /&gt;
&lt;br /&gt;
See also [[Reformatting the source]] and [[Coding with intrinsics]].&lt;br /&gt;
&lt;br /&gt;
== Spacing ==&lt;br /&gt;
&lt;br /&gt;
There is a space between a control structure keyword (e.g. &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;) and the following &amp;lt;code&amp;gt;(&amp;lt;/code&amp;gt;, if applicable.&lt;br /&gt;
&lt;br /&gt;
The curly braces surrounding class, struct, and function definitions go on their own lines.&lt;br /&gt;
&lt;br /&gt;
Consider adding breaking the line if the line is longer than 100 characters (assuming tab width 4?).&lt;br /&gt;
&lt;br /&gt;
Control blocks without braces are discouraged. If you need an if followed by only one line use something like that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
if ( foo )&lt;br /&gt;
{&lt;br /&gt;
    bar;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Naming conventions ==&lt;br /&gt;
&lt;br /&gt;
* Function names (including member functions) and class names are &amp;lt;code&amp;gt;CamelCase&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Variable and function argument names are &amp;lt;code&amp;gt;camelCase&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Struct data members are &amp;lt;code&amp;gt;camelCase&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Class data members are &amp;lt;code&amp;gt;camelCase_&amp;lt;/code&amp;gt; (with a trailing underscore).&lt;br /&gt;
&lt;br /&gt;
Functions that are used by other files have a &amp;quot;namespace&amp;quot; of some kind, either a C++ namespace, or a prefix like &amp;lt;code&amp;gt;G_&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;FS_&amp;lt;/code&amp;gt;. Follow the style of the surrounding code.&lt;br /&gt;
&lt;br /&gt;
Functions that are only used within the same file are marked &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt; and need not have a namespace.&lt;br /&gt;
&lt;br /&gt;
== Other trivialities ==&lt;br /&gt;
&lt;br /&gt;
* When defining a type alias, use &amp;lt;code class=&amp;quot;green&amp;quot;&amp;gt;using A = B;&amp;lt;/code&amp;gt;, not &amp;lt;code class=&amp;quot;red&amp;quot;&amp;gt;typedef B A;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Declare variables as close to the point of first use as possible.&lt;br /&gt;
&lt;br /&gt;
* Do not write &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; in the parentheses of functions that take zero arguments.&lt;br /&gt;
&lt;br /&gt;
* Always use &amp;lt;code&amp;gt;override&amp;lt;/code&amp;gt; for member functions that override a virtual member function.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt; is usually used for structures that have only public fields and no member functions. &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; is usually used for structures that have at least one private member and at least one member function. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Do not add member functions to structs that have a large number of fields and a poorly defined scope of responsibility.&lt;br /&gt;
&lt;br /&gt;
== Quake style ==&lt;br /&gt;
This style is found in files inherited from Tremulous (and often further from Quake 3).&lt;br /&gt;
&lt;br /&gt;
* There is always a space after &amp;lt;code&amp;gt;(&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;[&amp;lt;/code&amp;gt; and before &amp;lt;code&amp;gt;)&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;]&amp;lt;/code&amp;gt;, EXCEPT when the parentheses or brackets are empty.&lt;br /&gt;
* The curly braces &amp;lt;code&amp;gt;{ }&amp;lt;/code&amp;gt; of control structures always go on their own lines.&lt;br /&gt;
* File names are &amp;lt;code&amp;gt;snake_case.cpp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Obsolete conventions ===&lt;br /&gt;
These conventions are often found in Quake-style files, but are '''discouraged''' even for new code in those files.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Function banner comments, like this:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;red&amp;quot;&amp;gt;/*&lt;br /&gt;
================&lt;br /&gt;
GL_TextureMode&lt;br /&gt;
================&lt;br /&gt;
*/&amp;lt;/pre&amp;gt;&lt;br /&gt;
There is no need to write the name of a function in a comment preceding it. Documentation about what the function does or how it is implemented is of course welcome.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; All local variables declared at the beginning of the function. This exists because old C compilers required variables to be declared at the beginning.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Vertical alignment in lists of function declarations or variable declarations, e.g.&lt;br /&gt;
&amp;lt;pre class=&amp;quot;red&amp;quot;&amp;gt;foo    varName;&lt;br /&gt;
foobar varName2;&amp;lt;/pre&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== New style ==&lt;br /&gt;
This style is commonly found in the BSD-licensed files in Daemon (which are often more-recently created ones). Although it is &amp;quot;new&amp;quot;, that does not necessarily mean it is better; many contributors prefer the Quake style.&lt;br /&gt;
&lt;br /&gt;
* No space after &amp;lt;code&amp;gt;(&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;[&amp;lt;/code&amp;gt;, nor before &amp;lt;code&amp;gt;)&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The opening &amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt; of a control structure goes on the same line as the &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;else&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;/etc.&lt;br /&gt;
* File names are &amp;lt;code&amp;gt;CamelCase.cpp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Assertions, self-documentation and dependency reduction ==&lt;br /&gt;
&lt;br /&gt;
* When a function takes a pointer as parameter, if this pointer should never be NULL, use an assertion to test it. (Or use a reference instead?) It helps at debugging, but also to document the code.&lt;br /&gt;
* When a function takes a pointer to a struct for read-only access, please mark it as a const pointer.&lt;br /&gt;
* If a function only needs a subpart of a struct, pass only that subpart (by example, if you only use gentity_t-&amp;gt;playerState_t, only give it a playerState_t*)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Refactoring ==&lt;br /&gt;
&lt;br /&gt;
when refactoring, if you need to guarantee elements to be accessed together, move them in sub-class. This will help keep consistency with old code while allowing to progressively modernize codebase.&lt;br /&gt;
New classes should have theirs own headers and implementation files (explicitly listed in the CMakeLists.txt), except if small.&lt;br /&gt;
&lt;br /&gt;
=== Function and API evolutions ===&lt;br /&gt;
&lt;br /&gt;
Some changes are usually desired, but might have bad side effects like performance cost or different behaviors. Here is a small list of those:&lt;br /&gt;
&lt;br /&gt;
* prefer &amp;lt;code&amp;gt;Str::IsEqual&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Str::IsIEqual&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;Q_stricmp&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;strcmp&amp;lt;/code&amp;gt;. Those need to size of the strings though, which might impact performances in a non negligible (and bad) way.&lt;br /&gt;
* prefer to use glm instead of the old Quake vector API (vec3_t, VectorCopy, VectorMA&amp;lt;/code&amp;gt;, etc) when possible. But keep in mind that &amp;lt;code&amp;gt;glm::normalize( v )&amp;lt;/code&amp;gt; will not handle cases where v have components values of zero.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Continuous_integration&amp;diff=8653</id>
		<title>Continuous integration</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Continuous_integration&amp;diff=8653"/>
				<updated>2024-06-24T03:19:31Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* Build matrix */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Infrastructure]]&lt;br /&gt;
Continuous integration (CI) refers to the automated builds that run each time someone opens or modifies a pull request against, or modifies the code of, the Unvanquished and Daemon source code repositories on GitHub.&lt;br /&gt;
&lt;br /&gt;
We use the following CI services:&lt;br /&gt;
* Appveyor, for building with MSVC on Windows. Its configuration is found in the file {{code|.appveyor.yml}} in the repository root.&lt;br /&gt;
* Azure Pipelines. Its configuration is found in the file {{code|azure-pipelines.yml}} in the repository root. It handles Mac native builds on [https://github.com/actions/virtual-environments/blob/main/images/macos/macos-11-Readme.md macOS 11.x] and Linux native and NaCl builds on [https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2004-Readme.md Ubuntu 20.04] (Focal).&lt;br /&gt;
* GitHub CodeQL. Its configuration is found in the file {{code|.github/workflows/codeql.yml}} in the repository. Its purpose is to scan the source code for vulnerabilities, and for that purpose it starts by building the source tree using the latest LTS Ubuntu distribution provided by the platform ([https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2004-Readme.md Ubuntu 22.04]) and the default compiler of this platform.&lt;br /&gt;
&lt;br /&gt;
In some Daemon builds, we run the unit tests. These builds have been configured to use the Release configuration so that the unit tests are closer to production builds. &lt;br /&gt;
&lt;br /&gt;
== Build matrix ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! colspan=&amp;quot;9&amp;quot; | {{engine}}&lt;br /&gt;
|-&lt;br /&gt;
! Service&lt;br /&gt;
! Host&lt;br /&gt;
! Target&lt;br /&gt;
! Compiler&lt;br /&gt;
! Generator&lt;br /&gt;
! Build Type&lt;br /&gt;
! WERROR&lt;br /&gt;
! PCH&lt;br /&gt;
! Unit tests&lt;br /&gt;
|-&lt;br /&gt;
| Appveyor || Windows amd64 || Windows amd64 || VS 2019 || Visual Studio || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Appveyor || Windows amd64 || Windows i686 || VS 2019 || Visual Studio || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Windows amd64 || MinGW 9.3 || Ninja || Release || Yes || No || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 || GCC 9.4 || Ninja || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 || Clang 11.0 || Ninja || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || macOS-11 amd64 || macOS amd64 || AppleClang 13.0 || Make || Release || Yes || No || Yes&lt;br /&gt;
|-&lt;br /&gt;
| GitHub Actions CodeQL || ubuntu-latest || Linux amd64 || GCC (floating) || Ninja || Release || No || Yes || No&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
! colspan=&amp;quot;8&amp;quot; | {{game}}&lt;br /&gt;
|-&lt;br /&gt;
! Service&lt;br /&gt;
! Host&lt;br /&gt;
! Target&lt;br /&gt;
! Compiler&lt;br /&gt;
! Generator&lt;br /&gt;
! Build Type&lt;br /&gt;
! WERROR&lt;br /&gt;
! PCH&lt;br /&gt;
|-&lt;br /&gt;
| Appveyor || Windows amd64 || Windows i686 DLL || VS 2019 || Visual Studio || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 DLL || GCC 8.4 || Ninja || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 DLL || Clang 11.0 || Ninja || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || NaCl all NEXE || PNaCl Clang 3.6 || Ninja || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || macOS-12 amd64 || macOS amd64 DLL || AppleClang 14.0 || Make || Debug || Yes || No&lt;br /&gt;
|-&lt;br /&gt;
| GitHub Actions CodeQL || ubuntu-latest || Linux amd64 DLL+EXE || GCC (floating) || Ninja || Release || No || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
“WERROR” indicates whether the {{code|USE_WERROR}} option is on, which gives a failing building build status if there are warnings in our code. Note that {{code|USE_WERROR}} only applies to ”our” code in {{code|src/}}, so you may still see warnings from stuff in {{code|libs/}}.&lt;br /&gt;
&lt;br /&gt;
“PCH” indicates whether the precompiled header is enabled.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=UI/Lua_in_the_UI&amp;diff=8643</id>
		<title>UI/Lua in the UI</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=UI/Lua_in_the_UI&amp;diff=8643"/>
				<updated>2024-06-15T22:22:33Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: rocket vs rmlui updates&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:UI]]&lt;br /&gt;
Lua scripting can be used in the RmlUi-based UI, similar to how JavaScript can be used on a web page.&lt;br /&gt;
&lt;br /&gt;
Older versions of the RmlUi library were called libRocket, which explains the prevalence of the word &amp;quot;Rocket&amp;quot; in the code.&lt;br /&gt;
&lt;br /&gt;
= Documentation resources =&lt;br /&gt;
&lt;br /&gt;
The [https://mikke89.github.io/RmlUiDoc/pages/lua_manual.html RmlUi Lua Manual] is useful. Note that the version of RmlUi we are using is out of date.&lt;br /&gt;
&lt;br /&gt;
It's also possible to read the librocket.com documentation in the Internet Archive/Wayback Machine.&lt;br /&gt;
&lt;br /&gt;
Grepping for examples in the Samples folder (&amp;lt;code&amp;gt;libs/RmlUi/Samples&amp;lt;/code&amp;gt;) may be helpful.&lt;br /&gt;
&lt;br /&gt;
Note that these resources are all far from comprehensive. Many Lua facilities, it seems, can only be discovered by searching the RmlUi source.&lt;br /&gt;
&lt;br /&gt;
=Tips=&lt;br /&gt;
The cgame command &amp;lt;code&amp;gt;luarocket&amp;lt;/code&amp;gt; can be used to execute Lua snippets. Global variables set from any of the documents are accessible. You can print things with &amp;lt;code&amp;gt;print()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Pitfalls=&lt;br /&gt;
&lt;br /&gt;
==Bugs==&lt;br /&gt;
&lt;br /&gt;
Setting the &amp;lt;code&amp;gt;inner_rml&amp;lt;/code&amp;gt; attribute of an Element does not work if the string is longer than 1023 characters.&lt;br /&gt;
&lt;br /&gt;
==Other==&lt;br /&gt;
&lt;br /&gt;
All RML documents (or perhaps all documents in a context?) share a common set of global variables. This means that function names and global variable names need to be unique across the whole program. Also, importing a Lua script via &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;script src=&amp;quot;...&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; in one document imports it in all documents.&lt;br /&gt;
&lt;br /&gt;
Although Lua usually uses 1-based indexing for arrays, libRocket's Lua APIs are mostly 0-based. For functions that return a list, this has the consequence that the length operator &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; returns the wrong result.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Continuous_integration&amp;diff=8607</id>
		<title>Continuous integration</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Continuous_integration&amp;diff=8607"/>
				<updated>2024-04-21T20:22:53Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: it's vs not nmake&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Infrastructure]]&lt;br /&gt;
Continuous integration (CI) refers to the automated builds that run each time someone opens or modifies a pull request against, or modifies the code of, the Unvanquished and Daemon source code repositories on GitHub.&lt;br /&gt;
&lt;br /&gt;
We use the following CI services:&lt;br /&gt;
* Appveyor, for building with MSVC on Windows. Its configuration is found in the file {{code|.appveyor.yml}} in the repository root.&lt;br /&gt;
* Azure Pipelines. Its configuration is found in the file {{code|azure-pipelines.yml}} in the repository root. It handles Mac native builds on [https://github.com/actions/virtual-environments/blob/main/images/macos/macos-11-Readme.md macOS 11.x] and Linux native and NaCl builds on [https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-Readme.md Ubuntu 20.04] (Focal).&lt;br /&gt;
&lt;br /&gt;
In some Daemon builds, we run the unit tests. These builds have been configured to use the Release configuration so that the unit tests are closer to production builds. &lt;br /&gt;
&lt;br /&gt;
== Build matrix ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! colspan=&amp;quot;9&amp;quot; | {{engine}}&lt;br /&gt;
|-&lt;br /&gt;
! Service&lt;br /&gt;
! Host&lt;br /&gt;
! Target&lt;br /&gt;
! Compiler&lt;br /&gt;
! Generator&lt;br /&gt;
! Build Type&lt;br /&gt;
! WERROR&lt;br /&gt;
! PCH&lt;br /&gt;
! Unit tests&lt;br /&gt;
|-&lt;br /&gt;
| Appveyor || Windows amd64 || Windows amd64 || VS 2019 || Visual Studio || Release || Yes || off || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Appveyor || Windows amd64 || Windows i686 || VS 2019 || Visual Studio || Release || Yes || off || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Windows amd64 || Mingw 9.3 || Ninja || Release || Yes || off || No&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 || GCC 9.4 || Ninja || Release || Yes || off || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 || Clang 11.0 || Ninja || Release || Yes || off || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || macOS-11 amd64 || macOS amd64 || AppleClang 13.0 || Make || Release || Yes || No || Yes&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
! colspan=&amp;quot;8&amp;quot; | {{game}}&lt;br /&gt;
|-&lt;br /&gt;
! Service&lt;br /&gt;
! Host&lt;br /&gt;
! Target&lt;br /&gt;
! Compiler&lt;br /&gt;
! Generator&lt;br /&gt;
! Build Type&lt;br /&gt;
! WERROR&lt;br /&gt;
! PCH&lt;br /&gt;
|-&lt;br /&gt;
| Appveyor || Windows amd64 || Windows i686 DLL || VS 2019 || Visual Studio || Debug || Yes || off&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 DLL || GCC 8.4 || Ninja || Debug || Yes || off&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || Linux amd64 DLL || Clang 11.0 || Ninja || Debug || Yes || off&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || Ubuntu-20.04 amd64 || NaCl all NEXE || PNaCl Clang 3.6 || Ninja || Debug || Yes || off&lt;br /&gt;
|-&lt;br /&gt;
| Azure Pipelines || macOS-11 amd64 || macOS amd64 DLL || AppleClang 13.0 || Make || Debug || Yes || No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
“WERROR” indicates whether the {{code|USE_WERROR}} option is on, which gives a failing building build status if there are warnings in our code. Note that {{code|USE_WERROR}} only applies to ”our” code in {{code|src/}}, so you may still see warnings from stuff in {{code|libs/}}.&lt;br /&gt;
&lt;br /&gt;
“PCH” indicates whether the precompiled header is enabled.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Entities&amp;diff=8599</id>
		<title>Entities</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Entities&amp;diff=8599"/>
				<updated>2024-02-20T06:18:20Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: link entity directory&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
This page lists types of ''BSP entities'', sometimes known as ''map entities''. A BSP entity is defined by a list of key-value pairs in the entity lump of a BSP file.&lt;br /&gt;
&lt;br /&gt;
Entity keys with a preceding underscore (&amp;quot;_&amp;quot;) character are keys read by the compiler. Keys with no preceding underscore are read by both the compiler and the game. See the [http://en.wikibooks.org/wiki/Q3Map2/Entity_keys q3map2] documentation for more information. The worldspawn and &amp;lt;code&amp;gt;light&amp;lt;/code&amp;gt; entities are also read by the renderer.&lt;br /&gt;
&lt;br /&gt;
To find examples of maps where a particular entity is used, you can search for it [https://users.unvanquished.net/~slipher/map-entity-directory.txt here]. This list is generated by [https://github.com/slipher/source-tools/mapents.py a script].&lt;br /&gt;
&lt;br /&gt;
==General Entities==&lt;br /&gt;
&lt;br /&gt;
===Game Entities===&lt;br /&gt;
&lt;br /&gt;
* {{Subpage|worldspawn}}&lt;br /&gt;
* {{Subpage|Buildables}}&lt;br /&gt;
&lt;br /&gt;
===Compiler Entities===&lt;br /&gt;
&lt;br /&gt;
* {{Subpage|Lights}} &amp;amp;mdash; Might also be used by the renderer for dynamic lighting. &amp;lt;!-- FIXME: Aside from what? --&amp;gt;&lt;br /&gt;
* {{Subpage|info_null}} &amp;amp;mdash; Can be used for lights, but should not be used for anything else.&lt;br /&gt;
* {{Subpage|func_group}} &amp;amp;mdash; Used for grouping world brushes in the map editor.&lt;br /&gt;
* {{Subpage|misc_model}}&lt;br /&gt;
* {{Subpage|_decal}}&lt;br /&gt;
* {{Subpage|_skybox}}&lt;br /&gt;
&lt;br /&gt;
==Control Entities==&lt;br /&gt;
&lt;br /&gt;
{{EntityTableHeader}}&lt;br /&gt;
|-&lt;br /&gt;
|  || {{Subpage|ctrl_limited}} || || ET_GENERAL || testing || testing || testing&lt;br /&gt;
|-&lt;br /&gt;
|  || {{Subpage|ctrl_relay}} || || ET_GENERAL || testing || extending || extending&lt;br /&gt;
|-&lt;br /&gt;
|  || {{Subpage|ctrl_script}} || || ET_GENERAL || colspan=&amp;quot;3&amp;quot; | reserved for future use&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Environment Entities==&lt;br /&gt;
&lt;br /&gt;
{{EntityTableHeader|Scope}}&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_gfx}} || {{Subpage|env_animated_model}} || position ||&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_gfx}} || {{Subpage|env_lens_flare}} || position || ET_LIGHTFLARE  || testing || unclear || unclear&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_gfx}} || {{Subpage|env_particle_system}} || position || || testing || extending || extending&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_source_point}} || {{Subpage|env_portal_camera}} || position || &lt;br /&gt;
|-&lt;br /&gt;
| {{icon_gfx}} || {{Subpage|env_portal_surface}} || position || ET_PORTAL &lt;br /&gt;
|-&lt;br /&gt;
| {{icon_physics}} || {{Subpage|env_rumble}} || global || || testing || extending || extending&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_sound}} || {{Subpage|env_speaker}} || position || ET_SPEAKER || testing || extending || extending&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Functional Entities==&lt;br /&gt;
&lt;br /&gt;
{{EntityTableHeader}}&lt;br /&gt;
|-&lt;br /&gt;
|  || {{Subpage|func_bobbing}} || mover || || colspan=&amp;quot;3&amp;quot; | unclear&lt;br /&gt;
|- &lt;br /&gt;
|  || {{Subpage|func_button}} || trigger-mover || ET_MOVER || colspan=&amp;quot;3&amp;quot; | unclear&lt;br /&gt;
|-&lt;br /&gt;
|  || {{Subpage|func_destructable}} || (non) mover || || colspan=&amp;quot;3&amp;quot; | planning&lt;br /&gt;
|-&lt;br /&gt;
|  || {{Subpage|func_door}} || trigger-mover || ET_MOVER || colspan=&amp;quot;3&amp;quot; | unclear&lt;br /&gt;
|-&lt;br /&gt;
|  || {{Subpage|func_door_model}} || trigger-mover || || colspan=&amp;quot;3&amp;quot; | unclear&lt;br /&gt;
|-&lt;br /&gt;
|  || {{Subpage|func_door_rotating}} || trigger-mover || ET_MOVER || colspan=&amp;quot;3&amp;quot; | unclear&lt;br /&gt;
|-&lt;br /&gt;
|  || {{Subpage|func_dynamic}} || ? || || colspan=&amp;quot;3&amp;quot; | unclear&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_null}} || {{Subpage|func_group}} || NULL || NULL || colspan=&amp;quot;3&amp;quot; | mapeditor and mapcompiler domain&lt;br /&gt;
|-&lt;br /&gt;
|  || {{Subpage|func_pendulum}} || mover ||  || colspan=&amp;quot;3&amp;quot; | unclear&lt;br /&gt;
|-&lt;br /&gt;
|  || {{Subpage|func_plat}} || trigger-mover || || colspan=&amp;quot;3&amp;quot; | unclear&lt;br /&gt;
|-&lt;br /&gt;
|  || {{Subpage|func_rotating}} || mover || ET_MOVER || colspan=&amp;quot;3&amp;quot; | unclear&lt;br /&gt;
|-&lt;br /&gt;
|  || {{Subpage|func_spawn}} || (non) mover  || || colspan=&amp;quot;3&amp;quot; | planning&lt;br /&gt;
|-&lt;br /&gt;
|  || {{Subpage|func_static}} || (non) mover  || || colspan=&amp;quot;3&amp;quot; | unclear&lt;br /&gt;
|-&lt;br /&gt;
|  || {{Subpage|func_train}} || mover || ET_MOVER || colspan=&amp;quot;3&amp;quot; | unclear&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Game Entities==&lt;br /&gt;
&lt;br /&gt;
{{EntityTableHeader|Scope}}&lt;br /&gt;
|-&lt;br /&gt;
|  || {{Subpage|game_end}} || global || testing || testing || testing&lt;br /&gt;
|-&lt;br /&gt;
|  || {{Subpage|game_score}} || player || testing || testing || testin&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Information Entities==&lt;br /&gt;
&lt;br /&gt;
Info entities only provide positional information for things controlled by other processes. &amp;lt;!-- FIXME: processes is not the best word, I don't think. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{EntityTableHeader|Role}}&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_source_point}} || {{Subpage|info_alien_intermission}} || source point || ET_GENERAL || colspan=&amp;quot;3&amp;quot; | subject to change&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_source_point}} || {{Subpage|info_human_intermission}} || source point || ET_GENERAL || colspan=&amp;quot;3&amp;quot; | subject to change&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_null}} || {{Subpage|info_null}} || target point || NULL || colspan=&amp;quot;3&amp;quot; | mapcompiler domain&lt;br /&gt;
|-&lt;br /&gt;
|  || {{Subpage|info_player_deathmatch}} || point || || colspan=&amp;quot;3&amp;quot; | subject to change&lt;br /&gt;
|-&lt;br /&gt;
|  || {{Subpage|info_player_intermission}} || point || ET_GENERAL || colspan=&amp;quot;3&amp;quot; | subject to change&lt;br /&gt;
|-&lt;br /&gt;
|  || {{Subpage|info_player_start}} || point || || colspan=&amp;quot;3&amp;quot; | subject to change&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Light Entities==&lt;br /&gt;
Also see [[Light entities]]&lt;br /&gt;
&lt;br /&gt;
{{EntityTableHeader|Time}}&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_null}} || {{Subpage|light}} &lt;br /&gt;
|-&lt;br /&gt;
| {{icon_null}} || {{Subpage|lightJunior}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Pos Entities==&lt;br /&gt;
&lt;br /&gt;
{{EntityTableHeader}}&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_position}} || {{Subpage|path_corner}} || || ET_GENERAL || colspan=&amp;quot;3&amp;quot; | subject to change&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Sensor Entities==&lt;br /&gt;
Sensor fire an event (usually towards targets) when aware of another entity, event, or gamestate.&lt;br /&gt;
&lt;br /&gt;
Sensors often can be targeted to toggle, activate or deactivate their function of perceiving other entities.&lt;br /&gt;
&lt;br /&gt;
{{EntityTableHeader|Awareness}}&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_sensor_state}} || {{Subpage|sensor_end}}&lt;br /&gt;
| gamestate&lt;br /&gt;
| &lt;br /&gt;
| Testing || Extending ||| Extending&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_sensor_state}} || {{Subpage|sensor_stage}}&lt;br /&gt;
| gamestate&lt;br /&gt;
| &lt;br /&gt;
| Stable || Testing || Testing&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_sensor_state}} || {{Subpage|sensor_start}}&lt;br /&gt;
| gamestate&lt;br /&gt;
| &lt;br /&gt;
| Testing || Testing || Testing&lt;br /&gt;
|- &lt;br /&gt;
| {{icon_sensor_state}} || {{Subpage|sensor_timer}}&lt;br /&gt;
| gamestate&lt;br /&gt;
| &lt;br /&gt;
| Testing || Testing || Testing&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_sensor_area}} || {{Subpage|sensor_touch}}&lt;br /&gt;
| entity&lt;br /&gt;
| &lt;br /&gt;
| Testing || Extending ||| Extending&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Target Entities==&lt;br /&gt;
&lt;br /&gt;
Targets perform no action by themselves. Instead, they are targeted by other entities.&lt;br /&gt;
&lt;br /&gt;
{{EntityTableHeader|Scope}}&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_state}} || {{Subpage|target_hurt}} || activator || || colspan=&amp;quot;3&amp;quot; | subject to change&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_state}} || {{Subpage|target_kill}} || activator || ET_GENERAL || colspan=&amp;quot;3&amp;quot; | subject to change&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_position}} || {{Subpage|target_location}} || position || ET_LOCATION || colspan=&amp;quot;3&amp;quot; | subject to change&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_target_point}} || {{Subpage|target_position}} || position || ET_GENERAL || colspan=&amp;quot;3&amp;quot; | subject to change&lt;br /&gt;
|-&lt;br /&gt;
| ? || {{Subpage|target_print}} || configurable || ET_GENERAL || colspan=&amp;quot;3&amp;quot; | subject to change&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_physics}} || {{Subpage|target_push}} || activator || || colspan=&amp;quot;3&amp;quot; | subject to change&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_physics}} || {{Subpage|target_teleporter}} || activator || || colspan=&amp;quot;3&amp;quot; | subject to change&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Trigger Entities==&lt;br /&gt;
&lt;br /&gt;
Triggers cause a defined effect when aware of another entity, event, or gamestate.&lt;br /&gt;
&lt;br /&gt;
In that sense it's like an integration of a sensor and a target and might in some cases be modeled by a combination of them.&lt;br /&gt;
Triggers carry often the benefit of being predicted client-side (since no entity chains have to be resolved first) such as ({{Subpage|trigger_push}} and {{Subpage|trigger_teleport}}).&lt;br /&gt;
&lt;br /&gt;
{{EntityTableHeader}}&lt;br /&gt;
|- &lt;br /&gt;
| {{icon_reflect}} || {{Subpage|trigger_ammo}}&lt;br /&gt;
| || &lt;br /&gt;
|  colspan=&amp;quot;3&amp;quot; | Subject to change&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_physics}} || {{Subpage|trigger_gravity}}&lt;br /&gt;
| || &lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Subject to change&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_reflect}} || {{Subpage|trigger_heal}}&lt;br /&gt;
| || &lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Subject to change&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_reflect}} || {{Subpage|trigger_hurt}}&lt;br /&gt;
| &lt;br /&gt;
| ET_GENERAL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Subject to change&lt;br /&gt;
|-class=&amp;quot;deprecated&amp;quot;&lt;br /&gt;
| {{icon_deprecated|icon_sensor_area}} || {{Subpage|trigger_multiple}}&lt;br /&gt;
| &lt;br /&gt;
| ET_GENERAL&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Subject to change&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_physics}} || {{Subpage|trigger_push}}&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;code&amp;gt;ET_PUSH_TRIGGER&amp;lt;/code&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | unclear&lt;br /&gt;
|-&lt;br /&gt;
| {{icon_physics}} || {{Subpage|trigger_teleport}}&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;code&amp;gt;ET_TELEPORT_TRIGGER&amp;lt;/code&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | unclear&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Template:KnownGraphicalBugs&amp;diff=8586</id>
		<title>Template:KnownGraphicalBugs</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Template:KnownGraphicalBugs&amp;diff=8586"/>
				<updated>2023-12-08T14:52:26Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: update your graphics driver&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note|header=Known workarounds and fixes|content=&lt;br /&gt;
* {{ATI}}: If you run a very old Radeon HD 2000 or HD 3000 from 2007 or 2008 on Linux, you may have to set &amp;lt;code&amp;gt;R600_DEBUG=nohyperz&amp;lt;/code&amp;gt; environment variable, see ''nohyperz'' mention in [[#Notes|Notes]].}}&lt;br /&gt;
{{Note|header=Known bugs|content=&lt;br /&gt;
* {{Intel}}: People reported some [https://github.com/DaemonEngine/Daemon/issues/909 distorted textures] with Intel UHD on both Windows and Linux. We [https://gitlab.freedesktop.org/mesa/mesa/-/issues/10224 reported it] to driver developers.&lt;br /&gt;
&lt;br /&gt;
If you encounter a rendering bug, update your graphics driver. If the bug still occurs with the latest driver, please check [https://github.com/DaemonEngine/Daemon/issues?q=is%3Aopen+label%3AA-Renderer+label%3AT-Bug here] if it is already known and if yes, please tell us what graphic chip and operating system you use.&lt;br /&gt;
&lt;br /&gt;
The place to report new graphical bugs is [https://github.com/DaemonEngine/Daemon/issues/new here], see the [[Bug reporting]] page for advices.}}&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=GPU_compatibility_matrix&amp;diff=8585</id>
		<title>GPU compatibility matrix</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=GPU_compatibility_matrix&amp;diff=8585"/>
				<updated>2023-12-08T14:38:39Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* Useful resources */ gpuinfo.org&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{KnownGraphicalBugs}}&lt;br /&gt;
&lt;br /&gt;
This table gathers test results about various hardware and software configurations, &amp;lt;span style=&amp;quot;background-color: green !important; color: white !important; padding: .25em .5em;&amp;quot;&amp;gt;passed&amp;lt;/span&amp;gt; means nothing wrong is noticed and frame rate is at least &amp;lt;u&amp;gt;60 fps&amp;lt;/u&amp;gt; on common scene, &amp;lt;span style=&amp;quot;background-color: lightgreen !important; color: green !important; padding: .25em .5em;&amp;quot;&amp;gt;playable&amp;lt;/span&amp;gt; means at least &amp;lt;u&amp;gt;30 fps&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
All those tests were driven by Unvanquished developers or under Unvanquished developer supervision.&lt;br /&gt;
&lt;br /&gt;
See [[#Comprehensive_analysis|below]] for analysis, specific definitions and meanings.&lt;br /&gt;
{{GPU compatibility matrix}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;hr/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Comprehensive analysis ==&lt;br /&gt;
&lt;br /&gt;
Minimal configuration for the Unvanquished game is OpenGL 3.2. Unvanquished can run on OpenGL 2.1 hardware but this would not be playable because because we use models with more than 41 bones and OpenGL 2.1 cards can't accelerate them enough. It will run but it will be slow.&lt;br /&gt;
&lt;br /&gt;
Decent performance (given advanced graphical effects are disabled) starts with AMD/ATI TeraScale GPU, Intel HD Graphics (HD 4000), Nvidia Tesla-based GPUs. Though, it is strongly discouraged to buy GT218-based GPU like the Geforce 210 one as the proprietary driver for them is known to be buggy, requiring the engine to implement workarounds for it (save a game developer, do not buy this GPU!).&lt;br /&gt;
&lt;br /&gt;
To play at 4K resolutions, high-end AMD GCN/RDNA is recommended: AMD R9 390X from 2015 can handle &amp;lt;code&amp;gt;ultra&amp;lt;/code&amp;gt; preset with 4K resolution at 144Hz. AMD R7 Embedded in R series APU can handle 2K resolution with &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; preset (no realtime light and relief mapping disabled) as well as Intel UHD.&lt;br /&gt;
&lt;br /&gt;
Minimal configuration to run the Dæmon engine is OpenGL 2.1 with &amp;lt;code&amp;gt;ARB_half_float_vertex&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ARB_framebuffer_object&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;EXT_framebuffer_object&amp;lt;/code&amp;gt; is not enough). It includes ATI/AMD GPU starting with R300 (Radeon X300), Intel GPU starting with GMA965 (X3100) on Linux and macOS, HD Graphics on Windows, Nvidia starting with Curie (NV40, Geforce 6xxx). Wikipedia says the GMA965 Windows driver only supports OpenGL 1.5 and then would not reach the requirements for running Unvanquished on this platform. If you plan to make a game using Damon engine supporting those older cards, make sure your animated models don't have more than 41 bones.&lt;br /&gt;
&lt;br /&gt;
== How to contribute ==&lt;br /&gt;
&lt;br /&gt;
This matrix is generated from a cell sheet. Do not edit it by hand, Please ask &amp;lt;code&amp;gt;illwieckz&amp;lt;/code&amp;gt; for access to the cell sheet.&lt;br /&gt;
&lt;br /&gt;
Please sort your contributions by brand (ATI/AMD, Intel, Nvidia, Via…) then by launch date (from newer to older).&lt;br /&gt;
&lt;br /&gt;
The table also documents who may be able to reproduce a special configuration, please put your nick name and tell how much it is easy for you to reproduce a test on it (see below for keywords to use).&lt;br /&gt;
&lt;br /&gt;
Please tell at least, brand, model, model launch date (look at Wikipedia), host, memory size, the operating system, the driver (kernel mode and user mode), OpenGL and GLSL version, Unvanquished version you tested, the status, the preset and the resolution you validated and eventual notes.&lt;br /&gt;
&lt;br /&gt;
If you find out the code name and related micro architecture, please note it, same with form factor and bus.&lt;br /&gt;
&lt;br /&gt;
Other data are less relevant for diagnostic and are only useful to get a better picture of the tested hardware, don't hesitate to write down as much info as you can.&lt;br /&gt;
&lt;br /&gt;
Append the &amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; character to version number if you're testing a preversion. For example use &amp;lt;code&amp;gt;0.52~&amp;lt;/code&amp;gt; to tell you tested against the to-be-released 0.52 version.&lt;br /&gt;
&lt;br /&gt;
Put a single &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; character in cell you don't have data for (do not leave empty cells). When you describe multiple configuration for the same piece of hardware, use the &amp;lt;code&amp;gt;↑&amp;lt;/code&amp;gt; character to tell the cell uses the same value as the previous line.&lt;br /&gt;
&lt;br /&gt;
== Definitions ==&lt;br /&gt;
&lt;br /&gt;
=== Status ===&lt;br /&gt;
&lt;br /&gt;
* '''hang''': the computer becomes unresponsive, requiring a hard reset;&lt;br /&gt;
* '''crash''': the game is terminated by the operating system on some unrecoverable failure;&lt;br /&gt;
* '''missing''': the game exits by itself because of some requirement not being met;&lt;br /&gt;
* '''broken''': the game loads maps but graphical bugs affecting gameplay are seen;&lt;br /&gt;
* '''glitchy''': the game loads maps but graphical bugs non-affecting gameplay are seen;&lt;br /&gt;
* '''slow''': the game is rendered properly but slowly with less than 30 fps;&lt;br /&gt;
* '''playable''': nothing wrong is noticed and frame rate is at least 30 fps but less than 60 fps;&lt;br /&gt;
* '''passed''': nothing wrong is noticed and frame rate is at least 60 fps.&lt;br /&gt;
&lt;br /&gt;
=== Availability ===&lt;br /&gt;
&lt;br /&gt;
* '''lost''': tester has lost access to the hardware;&lt;br /&gt;
* '''foreign''': tester has access to the hardware but does not own it;&lt;br /&gt;
* '''unplugged''': tester owns the hardware but testing requires to plug the hardware in a computer;&lt;br /&gt;
* '''unconfigured''': hardware is plugged in a computer but making use of it requires software changes;&lt;br /&gt;
* '''configured''': hardware and software are ready to use for testing.&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
&lt;br /&gt;
* '''extfbo''': this GPU provides {{code|ARB_framebuffer_object}} instead of {{code|ARB_framebuffer_object}};&lt;br /&gt;
* '''fakefps''': game displays high frame rate number but the experience is stuttering;&lt;br /&gt;
* '''hickups''': performance is globally correct, but sometime the framerate drops a bit for a very short time;&lt;br /&gt;
* '''lowsky''': lowering texture size using at least &amp;lt;code&amp;gt;r_picmip 1&amp;lt;/code&amp;gt; is required to avoid skybox graphical glitches;&lt;br /&gt;
* '''lowtex''': lowering texture size using at least &amp;lt;code&amp;gt;r_picmip 1&amp;lt;/code&amp;gt; is required to avoid a computer hang;&lt;br /&gt;
* '''mesamain''': running the driver from Mesa {{code|main}} at the time of the test was required to get the game running or avoid major rendering bugs;&lt;br /&gt;
* '''noaccel''': no OpenGL hardware acceleration is implemented;&lt;br /&gt;
* '''nogather''': &amp;lt;code&amp;gt;GL_ARB_texture_gather&amp;lt;/code&amp;gt; is wrongly advertised by the driver to be supported by this hardware, making the engine crash at startup (Nvidia proprietary driver bug). The engine ships some workaround for this driver bug, if you experience the crash on version 0.52 and later but can properly start the game with &amp;lt;code&amp;gt;-set r_arb_texture_gather 0&amp;lt;/code&amp;gt; engine command line option, please reopen issue [https://github.com/DaemonEngine/Daemon/issues/368 Daemon#368];&lt;br /&gt;
* '''nohalfloatvertex''': missing &amp;lt;code&amp;gt;ARB_half_float_vertex&amp;lt;/code&amp;gt; OpenGL extension;&lt;br /&gt;
* '''nohyperz''': &amp;lt;code&amp;gt;R600_DEBUG=nohyperz&amp;lt;/code&amp;gt; environment variable is required to be set to avoid graphical glitches, see issues [https://github.com/DaemonEngine/Daemon/issues/343 Daemon#343] and [https://gitlab.freedesktop.org/mesa/mesa/-/issues/3290 Mesa#3290];&lt;br /&gt;
* '''norgtc''': &amp;lt;code&amp;gt;GL_ARB_texture_compression_rgtc&amp;lt;/code&amp;gt; extension is not supported on this hardware, some texture may be loaded with swapped channels, especially normal maps. Engine implements special algorithms to workaround this, see issue [https://github.com/DaemonEngine/Daemon/issues/375 Daemon#375];&lt;br /&gt;
* '''nvidiagarbage''': this driver is so bad you have to be very lucky to get at least a desktop drawn on screen before the computer hangs. With or without the game, after some screen freezes and display server crashes the kernel will complain about the card having disconnected itself from the PCIe bus. This issue was verified on multiple cards of this generations that are known to run for months without crashing when using free open source drivers instead;&lt;br /&gt;
* '''slowmodel''': models with a lot of bones are known to induce severe frame drop on such hardware, see issue [https://github.com/Unvanquished/Unvanquished/issues/1207 Unvanquished#1207];&lt;br /&gt;
* '''tinyalu''': this hardware has a very small ALU (arithmetic logic unit), dynamic lighting must be disabled with &amp;lt;code&amp;gt;r_dynamicLight 0&amp;lt;/code&amp;gt; to prevent the driver to abort GLSL shader compilation that may lead to an engine crash, see issue [https://github.com/DaemonEngine/Daemon/issues/344 Daemon#344].&lt;br /&gt;
&lt;br /&gt;
=== Bus ===&lt;br /&gt;
&lt;br /&gt;
* '''PCI''': [https://en.wikipedia.org/wiki/Peripheral_Component_Interconnect Peripheral Component Interconnect], slow multi-purpose bus for add-on cards, obsolete;&lt;br /&gt;
* '''PCI-X''': [https://en.wikipedia.org/wiki/PCI-X Peripheral Component Interconnect eXtended], enhanced version of PCI for servers and workstations, obsolete;&lt;br /&gt;
* '''AGP''': [https://en.wikipedia.org/wiki/Accelerated_Graphics_Port Accelerated Graphics Port], high-speed bus designed for graphic cards, obsolete;&lt;br /&gt;
* '''FSB''': [https://en.wikipedia.org/wiki/Front-side_bus Front-side bus], high-speed Intel system bus for CPUs, sometime used with onboard GPUs (example: GeForce 7050 + nForce 610i/630i);&lt;br /&gt;
* '''HT''': [https://en.wikipedia.org/wiki/HyperTransport HyperTransport], high-speed AMD system bus for CPUs, sometime used with onboard GPUs (example: GeForce 6150 LE + nForce 430);&lt;br /&gt;
* '''chip''': Internal bus of a [https://en.wikipedia.org/wiki/System_on_a_chip system on a chip] (SoC), the exact communication bus technology is usually poorly documented;&lt;br /&gt;
* '''PCIe''': [https://en.wikipedia.org/wiki/PCI_Express PCI Express], high-speed multi-purpose bus for add-on cards and on-board devices, recommended;&lt;br /&gt;
* '''CXL''': [https://en.wikipedia.org/wiki/Compute_Express_Link, Compute Express Link], high-speed multi-purpose bus for add-on cards;&lt;br /&gt;
* '''TB''': [https://fr.wikipedia.org/wiki/Thunderbolt_(interface) ThunderBolt], high speed cable combining PCI Express and DisplayPort or USB-C to connect external PCI Express cards like GPUs.&lt;br /&gt;
&lt;br /&gt;
=== Form factor ===&lt;br /&gt;
&lt;br /&gt;
* '''discrete''': full height workstation extension card, with dedicated graphics memory;&lt;br /&gt;
* '''lowprofile''': low profile workstation extension card, with dedicated graphics memory;&lt;br /&gt;
* '''MXM''': [https://en.wikipedia.org/wiki/Mobile_PCI_Express_Module Mobile PCI Express module], laptop extension card, with dedicated graphics memory;&lt;br /&gt;
* '''onboard''': dedicated GPU on motherboard, low end ones may share memory with the CPU;&lt;br /&gt;
* '''integrated''': GPU integrated in CPU package or chipset, likely sharing memory with the CPU;&lt;br /&gt;
* '''SoC''': System on a chip, with the GPU likely sharing memory with the CPU;&lt;br /&gt;
&lt;br /&gt;
=== Micro architecture ===&lt;br /&gt;
&lt;br /&gt;
* '''USSA''': ATi Unified Superscalar Shader Architecture;&lt;br /&gt;
* '''GCN''': AMD Graphics Core Next;&lt;br /&gt;
* '''RDNA''': AMD Radeon DNA;&lt;br /&gt;
* '''GMA''': Intel Graphics Media Accelerator;&lt;br /&gt;
* '''GT''': Intel Graphics Technology.&lt;br /&gt;
&lt;br /&gt;
=== Memory glossary ===&lt;br /&gt;
&lt;br /&gt;
* '''HM''': HyperMemory, ATi technology using main memory when GPU memory is full;&lt;br /&gt;
* '''TC''': TurboCache, Nvidia technology using main memory when GPU memory is full;&lt;br /&gt;
* '''AR''': AcceleRAM, S3 technology using main memory when GPU memory is full.&lt;br /&gt;
&lt;br /&gt;
== Useful resources ==&lt;br /&gt;
&lt;br /&gt;
* [https://mesamatrix.net/ Mesa Matrix]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/List_of_AMD_graphics_processing_units Wikipedia list of AMD graphics processing units]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/List_of_AMD_accelerated_processing_units Wikipedia list of AMD accelerated processing units]&lt;br /&gt;
* [https://www.x.org/wiki/RadeonFeature/ X.Org Radeon feature matrix and decoder ring]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/List_of_Intel_graphics_processing_units Wikipedia list of Intel graphics processing units]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/List_of_Nvidia_graphics_processing_units Wikipedia list of Nvidia graphics processing units]&lt;br /&gt;
* [https://nouveau.freedesktop.org/wiki/MesaDrivers/ Mesa Nouveau drivers]&lt;br /&gt;
* [https://nouveau.freedesktop.org/wiki/CodeNames/ Mesa Nouveau decoder ring]&lt;br /&gt;
* [https://opengl.gpuinfo.org/ User-submitted reports of OpenGL version and feature availability]&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Template:KnownGraphicalBugs&amp;diff=8584</id>
		<title>Template:KnownGraphicalBugs</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Template:KnownGraphicalBugs&amp;diff=8584"/>
				<updated>2023-12-08T14:30:42Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note|header=Known workarounds and fixes|content=&lt;br /&gt;
* {{ATI}}: If you run a very old Radeon HD 2000 or HD 3000 from 2007 or 2008 on Linux, you may have to set &amp;lt;code&amp;gt;R600_DEBUG=nohyperz&amp;lt;/code&amp;gt; environment variable, see ''nohyperz'' mention in [[#Notes|Notes]].}}&lt;br /&gt;
{{Note|header=Known bugs|content=&lt;br /&gt;
* {{Intel}}: People reported some [https://github.com/DaemonEngine/Daemon/issues/909 distorted textures] with Intel UHD on both Windows and Linux. We [https://gitlab.freedesktop.org/mesa/mesa/-/issues/10224 reported it] to driver developers.&lt;br /&gt;
&lt;br /&gt;
If you encounter a rendering bug, please check [https://github.com/DaemonEngine/Daemon/issues?q=is%3Aopen+label%3AA-Renderer+label%3AT-Bug here]  if it is already known and if yes, please tell us what graphic chip and operating system you use.&lt;br /&gt;
&lt;br /&gt;
The place to report new graphical bugs is [https://github.com/DaemonEngine/Daemon/issues/new here], see the [[Bug reporting]] page for advices.}}&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Template:KnownGraphicalBugs&amp;diff=8583</id>
		<title>Template:KnownGraphicalBugs</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Template:KnownGraphicalBugs&amp;diff=8583"/>
				<updated>2023-12-08T14:29:34Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: remove confetti bug (never affected anyone besides me)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note|header=Known workarounds and fixes|content=&lt;br /&gt;
* {{ATI}}: If you run a very old Radeon HD 2000 or HD 3000 from 2007 or 2008 on Linux, you may have to set &amp;lt;code&amp;gt;R600_DEBUG=nohyperz&amp;lt;/code&amp;gt; environment variable, see ''nohyperz'' mention in [[#Notes|Notes]].&lt;br /&gt;
{{Note|header=Known bugs|content=&lt;br /&gt;
* {{Intel}}: People reported some [https://github.com/DaemonEngine/Daemon/issues/909 distorted textures] with Intel UHD on both Windows and Linux. We [https://gitlab.freedesktop.org/mesa/mesa/-/issues/10224 reported it] to driver developers.&lt;br /&gt;
&lt;br /&gt;
If you encounter a rendering bug, please check [https://github.com/DaemonEngine/Daemon/issues?q=is%3Aopen+label%3AA-Renderer+label%3AT-Bug here]  if it is already known and if yes, please tell us what graphic chip and operating system you use.&lt;br /&gt;
&lt;br /&gt;
The place to report new graphical bugs is [https://github.com/DaemonEngine/Daemon/issues/new here], see the [[Bug reporting]] page for advices.}}&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Formats/Known_regressions_since_Tremulous&amp;diff=8578</id>
		<title>Formats/Known regressions since Tremulous</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Formats/Known_regressions_since_Tremulous&amp;diff=8578"/>
				<updated>2023-12-08T10:49:08Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* Regressions that don't make the game look broken */ lightingpsecular issue link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Formats]]&lt;br /&gt;
As a mapper or someone creating assets for the game, you may be aware of those pitfalls that can be considered as regressions when comparing with Tremulous or Quake Ⅲ.&lt;br /&gt;
&lt;br /&gt;
See also the [[Formats/Limitations that are not regressions|Limitations that are not regressions]] page for things that are not regressions.&lt;br /&gt;
&lt;br /&gt;
== Regressions that may make the game look broken ==&lt;br /&gt;
&lt;br /&gt;
=== Missing portal blending ===&lt;br /&gt;
&lt;br /&gt;
Portal blending is not implemented yet in the renderer.&lt;br /&gt;
&lt;br /&gt;
What happens is that the renderer that was used in Quake Ⅲ and Tremulous were OpenGL 1 renderers, and the Dæmon engine renderer is an OpenGL 3+ renderer. The difference between OpenGL 1 and OpenGL 3+ is similar to the difference between OpenGL 4.6 and Vulkan. Those renderers are different software. Everything from the OpenGL 1 renderer had to be re-implemented in OpenGL 3+ renderer with new code.&lt;br /&gt;
&lt;br /&gt;
So the lack of portable blending is not technically a regression as the code never existed in the renderer to begin with. It also means there is no bug in our code.&lt;br /&gt;
&lt;br /&gt;
Though, we fully agree this means a map ported from Tremulous that was using that feature will look broken and that then can be considered as a regression from a player or mapper point of view.&lt;br /&gt;
&lt;br /&gt;
From the code point of view, this is a feature request and we need someone to implement it. We are looking for renderer developers and OpenGL 3+ specialist to implement the feature in our engine.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Autosprite&amp;quot; shaders don't work ===&lt;br /&gt;
See [https://github.com/DaemonEngine/Daemon/issues/322 Daemon#322].&lt;br /&gt;
&lt;br /&gt;
== Regressions with fixes implemented but not released yet ==&lt;br /&gt;
&lt;br /&gt;
{{TODO|Remove this once Dæmon 0.54.1 is out.}}&lt;br /&gt;
&lt;br /&gt;
=== Missing RoQ video ===&lt;br /&gt;
&lt;br /&gt;
RoQ video support was removed long time ago as Unvanquished did not make use of it.&lt;br /&gt;
&lt;br /&gt;
Later the last remaining video format was removed, it was a format from an alternate reality that never happened : OGM with Vorbis and Theora. OGM with Vorbis and Theora is '''''not''''' OGG with Vorbis and Theora. The OGM format was a hack purposed for DivX piracy scene to mux XviD video with Vorbis audio, and while OGM with XviD was pretty popular, no one known tool can produce OGM with Vorbis and Theora. illwieckz tried a bunch of current and old software from the era and none was able to produce OGM with Theora and Vorbis. Neither oggenc from vorbis-tools, neither ogmtools, neither ffmpeg (recent and old), neither mencoder, neither OggMux, neither OGMMuxer, neither VirtualDubMod (modded VirtualDub for OGM support), neither ffdshow with OGM, Theora and Vorbis codecs. The only remaining thing untested is some obscure Visual Studio plugin that was mentioned in some places but for which no one file was found yet. We know something existed since Smokin' Guns game uses such OGM with Theora and Vorbis title video. That's all.&lt;br /&gt;
&lt;br /&gt;
Once that cursed OGM with Theora and Vorbis format was removed, the Theora codec was dead code and the Video support was dead code. This dead code was removed at some point because of being dead code.&lt;br /&gt;
&lt;br /&gt;
The removal of Video playing feature and the removal of RoQ support without alternative was controversial, and Dæmon 0.54.1 will bring back {{code|videoMap}} support with RoQ format.&lt;br /&gt;
&lt;br /&gt;
== Regressions that may make the game look broken, but with workaround ==&lt;br /&gt;
&lt;br /&gt;
=== Stereo sound effect not being positional ===&lt;br /&gt;
&lt;br /&gt;
Currently only mono sound files are played properly as positional audio, stereo sound files are played ''in your face''. We need to fix this.&lt;br /&gt;
&lt;br /&gt;
A simple workaround can be applied when repackaging the files: just convert the positional stereo sound as mono, this would make no difference to the player (stereo positional sound is meaningless anyway).&lt;br /&gt;
&lt;br /&gt;
== Regressions that don't make the game look broken ==&lt;br /&gt;
&lt;br /&gt;
=== Missing alphaGen lightingSpecular ===&lt;br /&gt;
&lt;br /&gt;
The {{code|alphaGen lightingSpecular}} was a subtle effect applied on some textures. This feature being missing doesn't break the rendering of the texture and if you look at the surface you may not notice something is wrong, unless you do comparative screenshots with Tremulous and Unvanquished. [https://github.com/DaemonEngine/Daemon/issues/213 Github issue]&lt;br /&gt;
&lt;br /&gt;
Implementing this feature has very low priority as there is no impact on gameplay and textures don't look bad without it. The game doesn't look broken without it and one cannot know the feature is missing just by playing the game, unless some warning tells it in log.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=Formats/Known_regressions_since_Tremulous&amp;diff=8577</id>
		<title>Formats/Known regressions since Tremulous</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=Formats/Known_regressions_since_Tremulous&amp;diff=8577"/>
				<updated>2023-12-07T18:18:52Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* Regressions that may make the game look broken */ autosprite&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Formats]]&lt;br /&gt;
As a mapper or someone creating assets for the game, you may be aware of those pitfalls that can be considered as regressions when comparing with Tremulous or Quake Ⅲ.&lt;br /&gt;
&lt;br /&gt;
See also the [[Formats/Limitations that are not regressions|Limitations that are not regressions]] page for things that are not regressions.&lt;br /&gt;
&lt;br /&gt;
== Regressions that may make the game look broken ==&lt;br /&gt;
&lt;br /&gt;
=== Missing portal blending ===&lt;br /&gt;
&lt;br /&gt;
Portal blending is not implemented yet in the renderer.&lt;br /&gt;
&lt;br /&gt;
What happens is that the renderer that was used in Quake Ⅲ and Tremulous were OpenGL 1 renderers, and the Dæmon engine renderer is an OpenGL 3+ renderer. The difference between OpenGL 1 and OpenGL 3+ is similar to the difference between OpenGL 4.6 and Vulkan. Those renderers are different software. Everything from the OpenGL 1 renderer had to be re-implemented in OpenGL 3+ renderer with new code.&lt;br /&gt;
&lt;br /&gt;
So the lack of portable blending is not technically a regression as the code never existed in the renderer to begin with. It also means there is no bug in our code.&lt;br /&gt;
&lt;br /&gt;
Though, we fully agree this means a map ported from Tremulous that was using that feature will look broken and that then can be considered as a regression from a player or mapper point of view.&lt;br /&gt;
&lt;br /&gt;
From the code point of view, this is a feature request and we need someone to implement it. We are looking for renderer developers and OpenGL 3+ specialist to implement the feature in our engine.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Autosprite&amp;quot; shaders don't work ===&lt;br /&gt;
See [https://github.com/DaemonEngine/Daemon/issues/322 Daemon#322].&lt;br /&gt;
&lt;br /&gt;
== Regressions with fixes implemented but not released yet ==&lt;br /&gt;
&lt;br /&gt;
{{TODO|Remove this once Dæmon 0.54.1 is out.}}&lt;br /&gt;
&lt;br /&gt;
=== Missing RoQ video ===&lt;br /&gt;
&lt;br /&gt;
RoQ video support was removed long time ago as Unvanquished did not make use of it.&lt;br /&gt;
&lt;br /&gt;
Later the last remaining video format was removed, it was a format from an alternate reality that never happened : OGM with Vorbis and Theora. OGM with Vorbis and Theora is '''''not''''' OGG with Vorbis and Theora. The OGM format was a hack purposed for DivX piracy scene to mux XviD video with Vorbis audio, and while OGM with XviD was pretty popular, no one known tool can produce OGM with Vorbis and Theora. illwieckz tried a bunch of current and old software from the era and none was able to produce OGM with Theora and Vorbis. Neither oggenc from vorbis-tools, neither ogmtools, neither ffmpeg (recent and old), neither mencoder, neither OggMux, neither OGMMuxer, neither VirtualDubMod (modded VirtualDub for OGM support), neither ffdshow with OGM, Theora and Vorbis codecs. The only remaining thing untested is some obscure Visual Studio plugin that was mentioned in some places but for which no one file was found yet. We know something existed since Smokin' Guns game uses such OGM with Theora and Vorbis title video. That's all.&lt;br /&gt;
&lt;br /&gt;
Once that cursed OGM with Theora and Vorbis format was removed, the Theora codec was dead code and the Video support was dead code. This dead code was removed at some point because of being dead code.&lt;br /&gt;
&lt;br /&gt;
The removal of Video playing feature and the removal of RoQ support without alternative was controversial, and Dæmon 0.54.1 will bring back {{code|videoMap}} support with RoQ format.&lt;br /&gt;
&lt;br /&gt;
== Regressions that may make the game look broken, but with workaround ==&lt;br /&gt;
&lt;br /&gt;
=== Stereo sound effect not being positional ===&lt;br /&gt;
&lt;br /&gt;
Currently only mono sound files are played properly as positional audio, stereo sound files are played ''in your face''. We need to fix this.&lt;br /&gt;
&lt;br /&gt;
A simple workaround can be applied when repackaging the files: just convert the positional stereo sound as mono, this would make no difference to the player (stereo positional sound is meaningless anyway).&lt;br /&gt;
&lt;br /&gt;
== Regressions that don't make the game look broken ==&lt;br /&gt;
&lt;br /&gt;
=== Missing alphaGen lightingSpecular ===&lt;br /&gt;
&lt;br /&gt;
The {{code|alphaGen lightingSpecular}} was a subtle effect applied on some textures. This feature being missing doesn't break the rendering of the texture and if you look at the surface you may not notice something is wrong, unless you do comparative screenshots with Tremulous and Unvanquished.&lt;br /&gt;
&lt;br /&gt;
Implementing this feature has very low priority as there is no impact on gameplay and textures don't look bad without it. The game don't look broken without it and one cannot know the feature is missing just by playing the game, unless some warning tells it in log.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	<entry>
		<id>https://wiki.unvanquished.net/index.php?title=MinGW&amp;diff=8575</id>
		<title>MinGW</title>
		<link rel="alternate" type="text/html" href="https://wiki.unvanquished.net/index.php?title=MinGW&amp;diff=8575"/>
				<updated>2023-12-06T14:28:39Z</updated>
		
		<summary type="html">&lt;p&gt;Killing time: /* C ABI compability with MSVC */ more detail&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MinGW is a GCC-based compiler toolchain targeting Windows platforms. It is used to produce the Windows releases of Unvanquished. It can be quite complicated to use successfully, in part due to the existence of different compiler &amp;quot;flavors&amp;quot;, and confusing naming schemes. This page serves as a guide to both MinGW in general, and specifically in application to building Daemon and Unvanquished. Throughout this page, &amp;quot;MinGW&amp;quot; will be used to refer to the [http://mingw-w64.org/ mingw-w64] project, which is a fork of the (now long-moribund) &amp;quot;original MinGW&amp;quot; project aiming to support both 32- and 64-bit builds. So beware: something having &amp;quot;64&amp;quot; in its name does not at all imply it is for 64-bit binaries! Same goes for &amp;quot;32&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Flavors ==&lt;br /&gt;
&lt;br /&gt;
=== Bitness: 32-bit or 64-bit ===&lt;br /&gt;
&lt;br /&gt;
Whether to compile for 32-bit (&amp;quot;i686&amp;quot; in package names) or 64-bit (&amp;quot;x86-64&amp;quot; or &amp;quot;x86_64&amp;quot;) architecture. 64-bit Windows versions are capable of running 32-bit executables in a mode called WOW (Windows-on-Windows).&lt;br /&gt;
&lt;br /&gt;
=== Threading flavor ===&lt;br /&gt;
You can get &amp;lt;code&amp;gt;win32&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;posix&amp;lt;/code&amp;gt; thread models. Daemon must be built with the &amp;lt;code&amp;gt;posix&amp;lt;/code&amp;gt; flavor, because code that uses &amp;lt;code&amp;gt;std::thread&amp;lt;/code&amp;gt; does not compile with &amp;lt;code&amp;gt;win32&amp;lt;/code&amp;gt;. In general there is no reason to use &amp;lt;code&amp;gt;win32&amp;lt;/code&amp;gt;. However, it is unfortunately the default in the APT package manager.&lt;br /&gt;
&lt;br /&gt;
=== Exception handling flavor ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sjlj&amp;lt;/code&amp;gt; (setjmp/longjmp) is available for both 32- and 64-bit builds. It has the drawback of significant runtime cost.&lt;br /&gt;
* &amp;lt;code&amp;gt;dwarf&amp;lt;/code&amp;gt; is available only for 32-bit. It has good performance, but it is said to have a drawback that exceptions can't be propagated through code compiled with a different compiler (or C code?). However, propagating exceptions through C code shouldn't be needed for Daemon.&lt;br /&gt;
* &amp;lt;code&amp;gt;seh&amp;lt;/code&amp;gt; (Structured Exception Handling) is available only for 64-bit. It has good performance and always works correctly, so it should always be used for 64-bit.&lt;br /&gt;
&lt;br /&gt;
One way to identify which exception model code was built with is to check the libgcc dependency. You'll find for example &amp;lt;code&amp;gt;libgcc_s_seh-1.dll&amp;lt;/code&amp;gt; for SEH, &amp;lt;code&amp;gt;libgcc_s_dw2-1.dll&amp;lt;/code&amp;gt; for DWARF, or &amp;lt;code&amp;gt;libgcc_s_sjlj-1.dll&amp;lt;/code&amp;gt; for sjlj. An easy way to make a C++ test program emit a libgcc dependency is to add a try/catch block.&lt;br /&gt;
&lt;br /&gt;
=== Mixing flavors ===&lt;br /&gt;
&lt;br /&gt;
Mixing different thread or exception flavors can cause problems, such as missing DLL dependencies, or exception handling not working.&lt;br /&gt;
&lt;br /&gt;
For the &amp;lt;code&amp;gt;external_deps&amp;lt;/code&amp;gt; libraries, efforts have been made to avoid depending on any thread-flavor-specific or exception-flavor-specific libraries, so it should be possible to use them with any flavor of MinGW. Exception handling glitches shouldn't be an issue since the Windows depencies are C-only.&lt;br /&gt;
&lt;br /&gt;
== Distributions ==&lt;br /&gt;
&lt;br /&gt;
=== Cross-compiling from Linux ===&lt;br /&gt;
&lt;br /&gt;
Most Linux package managers offer some form of MinGW package. Availability of different flavor combinations varies.&lt;br /&gt;
&lt;br /&gt;
==== Installation ====&lt;br /&gt;
APT (Debian Buster or older):&lt;br /&gt;
&amp;lt;pre&amp;gt;# 32-bit, sjlj. win32 threads are selected by default; switch it to posix&lt;br /&gt;
sudo apt install g++-mingw-w64-i686  &lt;br /&gt;
sudo update-alternatives --set i686-w64-mingw32-gcc /usr/bin/i686-w64-mingw32-gcc-posix&lt;br /&gt;
sudo update-alternatives --set i686-w64-mingw32-g++ /usr/bin/i686-w64-mingw32-g++-posix&lt;br /&gt;
&lt;br /&gt;
# 64-bit, SEH. win32 threads are selected by default; switch it to posix&lt;br /&gt;
sudo apt install g++-mingw-w64-x86-64  &lt;br /&gt;
sudo update-alternatives --set x86_64-w64-mingw32-gcc /usr/bin/x86_64-w64-mingw32-gcc-posix&lt;br /&gt;
sudo update-alternatives --set x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
APT (Debian Bullseye or newer):&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt install gcc-mingw-w64-i686-posix&amp;lt;/code&amp;gt; (32-bit, posix, sjlj)&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo apt install gcc-mingw-w64-x86-64-posix&amp;lt;/code&amp;gt; (64-bit, posix, SEH)&lt;br /&gt;
&lt;br /&gt;
==== Usage ====&lt;br /&gt;
&lt;br /&gt;
To build a CMake project, you need a &amp;quot;toolchain file&amp;quot;. Sadly, there is no official toolchain file from MinGW or CMake. For Daemon and Unvanquished we use [https://github.com/DaemonEngine/Daemon/blob/master/cmake/cross-toolchain-mingw32.cmake this (32-bit)] and [https://github.com/DaemonEngine/Daemon/blob/master/cmake/cross-toolchain-mingw64.cmake this (64-bit)]. Use it by passing &amp;lt;code&amp;gt;-DCMAKE_TOOLCHAIN_FILE=&amp;lt;path&amp;gt;&amp;lt;/code&amp;gt; on the &amp;lt;code&amp;gt;cmake&amp;lt;/code&amp;gt; command line.&lt;br /&gt;
&lt;br /&gt;
=== MSYS2 ===&lt;br /&gt;
&lt;br /&gt;
MSYS2 runs on Windows hosts and provides up-to-date 32-bit/DWARF/posix and 64-bit/SEH/posix toolchains. Building is done from a Bash shell in a partial emulation of a Linux environment, similar to Cygwin.&lt;br /&gt;
&lt;br /&gt;
==== Installation ====&lt;br /&gt;
&lt;br /&gt;
Download from [https://www.msys2.org]. &lt;br /&gt;
&lt;br /&gt;
Install dependencies to build Daemon (can be done from any MSYS2 shell flavor):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# 32-bit&lt;br /&gt;
pacman -Sy mingw-w64-i686-gcc mingw64-i686-cmake make&lt;br /&gt;
# 64-bit&lt;br /&gt;
pacman -Sy mingw-w64-x86_64-gcc mingw64-x86_64-cmake make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Usage ====&lt;br /&gt;
You must open a different MSYS2 shell flavor according to which architecture you want to target: &amp;quot;MSYS2 MinGW 32-bit&amp;quot; or &amp;quot;MSYS2 MinGW 64-bit&amp;quot;. When invoking &amp;lt;code&amp;gt;cmake&amp;lt;/code&amp;gt;, you must pass the flag &amp;lt;code&amp;gt;-G&amp;quot;MSYS Makefiles&amp;quot;&amp;lt;/code&amp;gt;. When building Unvanquished, the flag &amp;lt;code&amp;gt;-DDAEMON_CBSE_PYTHON_PATH=&amp;lt;path&amp;gt;&amp;lt;/code&amp;gt; may be of interest, if you want to use a Python other than the one shipped with MSYS2. &amp;lt;code&amp;gt;&amp;lt;path&amp;gt;&amp;lt;/code&amp;gt; should be in the Unix-emulation format, e.g. &amp;lt;code&amp;gt;/c/Python/python.exe&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;MinGW-W64-builds&amp;quot; (Standalone Windows version) ===&lt;br /&gt;
This distribution (see [https://sourceforge.net/projects/mingw-w64/ Sourceforge]) provides a toolchain that can be used from the Windows command prompt, without needing a Unix emulation layer. The installer allows you to choose from every valid combination of flavors. Caveat: the builds are currently somewhat outdated. At the time of writing (Febrary 2021), the newest available gcc version is 8.1.0.&lt;br /&gt;
 &lt;br /&gt;
==== Usage ====&lt;br /&gt;
&lt;br /&gt;
Choose the &amp;lt;code&amp;gt;MinGW Makefiles&amp;lt;/code&amp;gt; generator in CMake. The location of the toolchain used is determined by finding the first one in your PATH environment variable. Relative to the installation root, the PATH entry should be at &amp;lt;code&amp;gt;mingw32\bin&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;mingw64\bin&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After running CMake, compile by running &amp;lt;code&amp;gt;mingw32-make&amp;lt;/code&amp;gt; in the build directory.&lt;br /&gt;
&lt;br /&gt;
==== Work around linker error with &amp;lt;code&amp;gt;difftime&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
To build Unvanquished 0.52 or higher, a small hack is needed to avoid a linker error, because Lua depends on an MSVCRT function which was not added to MinGW's import lib yet as of 8.1.0. Since you are on Windows, you can link to mscvrt.dll directly. In the CMake GUI, check &amp;quot;Advanced&amp;quot; and find the variable &amp;lt;code&amp;gt;CMAKE_CXX_STANDARD_LIBRARIES&amp;lt;/code&amp;gt;. Add &amp;lt;code&amp;gt;&amp;amp;nbsp;C:/windows/system32/msvcrt.dll&amp;lt;/code&amp;gt; at the end of the list (or &amp;lt;code&amp;gt;&amp;amp;nbsp;C:/windows/syswow64/msvcrt.dll&amp;lt;/code&amp;gt; if you are building a 32-bit binary on a 64-bit system).&lt;br /&gt;
&lt;br /&gt;
== Built-in DLL dependencies ==&lt;br /&gt;
&lt;br /&gt;
There are a few DLLs shipped as part of MinGW that most programs will depend on. These are also available as static libraries (a fully static binary can be produced with the &amp;lt;code&amp;gt;-static&amp;lt;/code&amp;gt; flag), but dynamic is the default. These are:&lt;br /&gt;
* &amp;lt;code&amp;gt;libgcc&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;libstdc++&amp;lt;/code&amp;gt; (for C++ programs)&lt;br /&gt;
* &amp;lt;code&amp;gt;libssp&amp;lt;/code&amp;gt; (if stack protection is enabled)&lt;br /&gt;
* &amp;lt;code&amp;gt;libwinpthread&amp;lt;/code&amp;gt; (if threads are used)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;libstdc++&amp;lt;/code&amp;gt; is both thread- and exception-flavor-dependent, but unlike &amp;lt;code&amp;gt;libgcc&amp;lt;/code&amp;gt;, the DLL does not have the flavor written in the filename. This means that you can't easily tell if you have the right one (nor can the Windows executable loader). [https://github.com/lucasg/Dependencies Dependencies] is a good tool to investigate such issues.&lt;br /&gt;
&lt;br /&gt;
When distributing a binary release of Daemon, you must ship these DLLs alongside the executable, else you will run into [https://github.com/Unvanquished/Unvanquished/issues/716 this issue]. Note that unlike Daemon's other DLL dependencies (from the &amp;lt;code&amp;gt;external_deps&amp;lt;/code&amp;gt; package), the MinGW DLLs are not automatically copied to the build directory as part of the build process. See &amp;lt;code&amp;gt;extra_dll_list&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;findDll&amp;lt;/code&amp;gt; in the [https://github.com/Unvanquished/release-scripts/blob/master/build-release Unvanquished release script].&lt;br /&gt;
&lt;br /&gt;
== C ABI compability with MSVC ==&lt;br /&gt;
&lt;br /&gt;
On 32-bit x86, GCC has a different default stack alignment (16 bytes) than MSVC (4 bytes). This can cause problems when MSVC-compiled code calls into GCC-compiled code and the alignment is less than expected. One solution, which we use to build MSVC-compatible &amp;lt;code&amp;gt;external_deps&amp;lt;/code&amp;gt; DLLs, is to use a GCC flag (&amp;lt;code&amp;gt;-mpreferred-stack-boundary=&amp;lt;/code&amp;gt;) to change the presumed stack alignment. Another, which we use to handle jumps from 3rd-party binaries to our (MinGW-built) code, is to put the annotation &amp;lt;code&amp;gt;__attribute__((force_align_arg_pointer))&amp;lt;/code&amp;gt; on the functions which may be called with less alignment than expected, instructing the compiler to perform alignment when the function is called.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-mms-bitfields&amp;lt;/code&amp;gt; should be enabled to ensure that the layout of structs containing bitfields matches. This is on by default.&lt;/div&gt;</summary>
		<author><name>Killing time</name></author>	</entry>

	</feed>