[[TOC]] This page describes the structure of the game's source code, as found in the official SVN repository. For instructions on getting the code and building on your particular platform see [wiki:BuildInstructions Build Instructions]. = Finding your way around = After obtaining the game's source code, you will find the following base directories: * binaries : Contains the game's data, scripts, and Windows executables. * build : Tools for generating the workspaces needed to build the game. * docs : Placeholder for documentation. * libraries : Libraries (third-party software) needed to build the game. * source : Source code for the engine and associated tools. All these are covered in more depth below. == binaries == This directory contains everything that gets released to the end-user. This is the only part that an artist or designer needs to modify. The game is run from within this directory and it includes prebuilt executables for Windows users. Custom builds also end up here for Windows, Linux and OS X. In Windows, the game is run by opening `pyrogenesis.exe` and the Atlas scenario editor is with `Atlas.bat` (which invokes `"pyrogenesis.exe -editor"`). These files can be found in the `binaries\system\` directory and are regularly updated on SVN as the game engine changes. === data === This directory contains data distributed to all users of the game. However, data created during games is stored in separate locations, depending on the user's OS, see GameDataPaths for those locations. ==== config ==== Contains the default configuration file `default.cfg`, a simple text file containing pairs of `key = value` entries. To make changes to the configuration, use in-game options or create/modify `local.cfg` in the user data directory (see [wiki:Manual_Settings]). The presence of `dev.cfg` indicates a developer version of the game, not a release package, which changes how mods are handled. `keys.txt` is a list of hotkey definitions which can be used in the config system. ==== l10n ==== [wiki:Internationalization_and_Localization Internationalization and Localization] files for the engine. ==== mods ==== This contains the game data and is of primary interest to the game's artists, developers and the modding community. The official mod is in the `public` directory. Mods may be placed in a `.zip` archive or left as loose files. They can be selectively loaded by users, for a different game experience. See the [wiki:Mod_Layout mod layout] page for details. ==== tests ==== Contains some non-mod data and scripts used by the test suite. ==== tools ==== Some data associated with tools separate from the engine itself, like Atlas and font builder. === system === Binaries and required libraries for the game are found here. For Windows users, the game's executables (EXEs) and libraries (DLLs) can be found here along with the game's tools. Similarly for developers building the game themselves, the binaries will end up here. == build == This directory is most useful for developers wishing to build the game themselves. This section will briefly describe the directory, see [wiki:BuildInstructions Build Instructions] for more details on building the game for your OS. === bin === Some utilities for the build process. === coverage === TODO === errorlist === A tool for generating the error and exception codes used in the game. === premake === Building the game is eased by an automated tool called [http://industriousone.com/premake Premake], which creates platform-specific workspaces for developers. Premake uses scripts written in [http://www.lua.org/ Lua]. Windows, Linux, and OS X are the supported environments, as are a few major IDEs (namely Visual C++ and Xcode). === resources === Icons and data files for the game's installer. === svn_revision === Utility for outputting the current game build's revision number. === workspaces === Build workspaces and the scripts for generating them are found here. Windows users should run `update-workspaces.bat` while Linux/OS X users should run `update-workspaces.sh` (see BuildInstructions) == libraries == These are the third-party libraries currently stored in the repository, organized roughly by OS; they are not necessarily used in the final game. Here are some descriptions of the libraries and where they can be downloaded. === osx === Contains a script for building OS X dependencies, see BuildInstructions#OSX. === source === Source code of modified libraries and some that may not be available in package managers. It is shared for OS X, Windows, and *nix. * '''cxxtest-4.4''': !CxxTest is a JUnit/CppUnit/xUnit-like framework for C/C++. It is focused on being a lightweight framework that is well suited for integration into embedded systems development projects. http://cxxtest.com/ * '''fcollada''': FCollada is a C++ library which offers support for COLLADA interoperability. http://collada.org/mediawiki/index.php/FCollada * '''nvtt''': The NVIDIA Texture Tools is a collection of image processing and texture manipulation tools, designed to be integrated in game tools and asset conditioning pipelines. The primary features of the library are mipmap and normal map generation, format conversion and DXT compression. https://github.com/castano/nvidia-texture-tools * '''spidermonkey''': Mozilla's JavaScript engine written in C/C++. JavaScript is the game's scripting language of choice (game logic, AIs, random maps, etc). https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey * '''valgrind''': Valgrind is an instrumentation framework for building dynamic analysis tools. There are Valgrind tools that can automatically detect many memory management and threading bugs, and profile your programs in detail http://valgrind.org/ === win32 === Headers and prebuild static libs for win32 developers. Not used for *nix or OS X. * '''boost''': Boost provides free peer-reviewed portable C++ source libraries. The emphasis is on libraries which work well with the C++ Standard Library. http://www.boost.org/ * '''enet''': ENet's purpose is to provide a relatively thin, simple and robust network communication layer on top of UDP (User Datagram Protocol). The primary feature it provides is optional reliable, in-order delivery of packets. http://enet.bespin.org/ * '''gloox''': gloox is a rock-solid, full-featured Jabber/XMPP client library, written in clean ANSI C++. It makes writing spec-compliant clients easy and allows for hassle-free integration of Jabber/XMPP functionality into existing applications. http://camaya.net/gloox/ * '''iconv''': iconv is a computer program and a standardized application programming interface (API) used to convert between different character encodings. * '''icu''': ICU is a mature, widely used set of C/C++ and Java libraries providing Unicode and Globalization support for software applications. http://site.icu-project.org/ * '''libcurl''': curl is a command line tool for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP. curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, cookies, user+password authentication (Basic, Digest, NTLM, Negotiate, kerberos...), file transfer resume, proxy tunneling and a busload of other useful tricks. http://curl.haxx.se/ * '''libpng''': libpng is the official PNG (portable network graphics) reference library. It supports almost all PNG features, is extensible, and has been extensively tested for over 15 years. http://www.libpng.org/ * '''libxml2''': Libxml2 is the XML C parser and toolkit developed for the Gnome project (but usable outside of the Gnome platform), it is free software available under the MIT License. XML itself is a metalanguage to design markup languages, i.e. text language where semantic and structure are added to the content using extra "markup" information enclosed between angle brackets. http://xmlsoft.org/ * '''miniupnpc''': The MiniUPnP project offers software which supports the UPnP Internet Gateway Device (IGD) specifications. http://miniupnp.free.fr/ * '''openal''': Platform independent audio driver, equivalent to OpenGL in audio terms. OpenAL is a cross-platform 3D audio API appropriate for use with gaming applications and many other types of audio applications. http://www.openal.org/ * '''opengl''': OpenGL is an API for 2D and 3D graphics applications. OpenGL fosters innovation and speeds application development by incorporating a broad set of rendering, texture mapping, special effects, and other powerful visualization functions. Developers can leverage the power of OpenGL across all popular desktop and workstation platforms, ensuring wide application deployment. http://www.opengl.org/ * '''sdl2''': Simple Directmedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer. http://www.libsdl.org/ * '''vorbis''': Ogg Vorbis is a completely open, patent-free, professional audio encoding and streaming technology with all the benefits of Open Source. http://www.vorbis.com/ * '''wxwidgets''': (This directory is empty, as wxWidgets is not included in the SVN. It is only needed for developers who plan to build Atlas, according to the [wiki:BuildInstructions Build Instructions]) wxWidgets is a class library that allows you to compile graphical C++ programs on a range of different platforms. wxWidgets defines a common API across platforms, but uses the native graphical user interface (GUI) on each platform, so your program will take on the native 'look and feel' that users are familiar with. http://www.wxwidgets.org/ * '''zlib''': zlib is designed to be a free, general-purpose, legally unencumbered -- that is, not covered by any patents -- lossless data-compression library for use on virtually any computer hardware and operating system. http://zlib.net/ == source == This directory contains the source code of the engine and associated tools. It is almost exclusively written in C/C++. It should be noted that our convention is to place both header/include files (`.h`) and source files (`.c`/`.cpp`) in the same directory (see also: [wiki:Coding_Conventions Coding conventions]). As there are many subdirectories, they will not all be listed here. However this may serve as a brief introduction to the codebase. === collada === Libraries to convert COLLADA assets to the engine's proprietary format. COLLADA is the format for adding new 3D models and animations to the game and is supported by a number of free and commercial 3D modeling programs. See [http://trac.wildfiregames.com/wiki/ArtDesignDocument Art Design] for more details. === graphics === Defines classes for maintaining data about what the user sees in the game world, such as objects, textures, terrain, shaders, and particles. Also includes map handling. === gui === Defines GUI (graphical user interface) classes for 2D objects with which the user interacts during the game (buttons, text, lists, minimap, etc.) === i18n === [wiki:Internationalization_and_Localization Internationalization and Localization] support for the engine. === lib === Low-level code for the engine, including abstractions of specific systems by OS and architecture. === lobby === Contains code to support using the XmPP-based multiplayer lobby. === maths === Defines classes for typical mathematical operations. === mocks === Contains code related to the cxxtest suite. === network === Defines classes for supporting multiplayer, networked games with a server-client architecture. === pch === Precompiled headers for faster compilation of the game. === ps === Contains miscellaneous code, useful throughout the engine. (Short for "Pyrogenesis" - the name of the engine) === renderer === Defines classes for rendering 3D things during the game. These are the implementations used in the rendering loop. === scriptinterface === Parts of the C++ - JavaScript interface are defined here. === simulation2 === Defines classes used by the new [wiki:TDD_Simulation simulation]. Components that implement engine logic are included here, as well as serialization and helper classes. Note that some components are implemented in JavaScript and optionally define both JavaScript and C++ interfaces (those components are included by mods, within the `binaries\data` directory). === soundmanager === Contains code for the new sound manager, its helper classes and JavaScript interfaces. === third_party === Contains code from third party libraries that are built as part of 0 A.D. Unlike the rest of `source/` they are not written by WFG and may have different (but compatible) licensing. === [wiki:TDD_Tools tools] === This directory contains a number of tools which are to be considered largely separate of the game engine. Of these Atlas is the most useful to modders and developers. ==== atlas ==== Atlas is the name of the Scenario Editor used to create maps for the game. Atlas is not merely a data editor but uses the engine for rendering and simulation, to accurately reproduce the way maps will be handled in the game. As such the Atlas UI runs in a separate thread from the engine, messages are passed between threads to synchronize behavior. * '''!AtlasFrontends''': Contains a few stand-alone tools based on Atlas, the most useful of which is Actor Editor. * '''!AtlasObject''': Defines some helper classes for manipulating XML and JSON data in Atlas. * '''!AtlasScript''': Defines a minimal interface for scripting in Atlas, using SpiderMonkey. * '''AtlasUI''': Define classes for the Atlas UI, which will be run in its own thread. * '''DatafileIO''': Old code used by the AoE3Ed tool. * '''!GameInterface''': Defines the message passing and handling behavior of Atlas. ==== dist ==== Tools for packaging the game. ==== entity ==== Some entity tools, the most useful is [source:/ps/trunk/source/tools/entity/checkrefs.pl checkrefs.pl], which scans a lot of game data for duplicate and missing references. ==== [wiki:Font_Builder2 fontbuilder2] ==== This utility builds the font textures seen in the game's UI, from font style definitions and a list of characters to include. The source fonts are located in `binaries\data\tools\fontbuilder\`. ==== i18n ==== Tools for [wiki:Internationalization_and_Localization Internationalization and Localization]. ==== openlogsfolder ==== Scripts for opening the logs folder on Windows. ==== profiler2 ==== Web client for the game's built-in profiler. ==== replayprofile ==== Extracts profiling data from replays, for graphing purposes. See EngineProfiling. ==== selectiontexgen ==== Generates basic square and circle selection overlay textures by parsing all the entity XML files and reading their Footprint components (see script for details). ==== templatessorter ==== Utility to sort the component definitions of entity templates into alphabetical order.\\ For a more recent tool written in Python, see [https://code.wildfiregames.com/P238 Phabricator]. ==== XpartaMuPP ==== Scripts for the multiplayer lobby. TODO - DESCRIBE THE OTHERS