primeiro commit
This commit is contained in:
72
docs/HOWTO_compile_lang_files.txt
Normal file
72
docs/HOWTO_compile_lang_files.txt
Normal file
@@ -0,0 +1,72 @@
|
||||
OpenTTD and strgen
|
||||
Last updated: 2009-06-30
|
||||
------------------------------------------------------------------------
|
||||
|
||||
|
||||
Table of contents
|
||||
-----------------
|
||||
1.0) strgen usage
|
||||
* 1.1) Examples
|
||||
* 1.2) strgen command switches
|
||||
|
||||
|
||||
1.0) strgen usage
|
||||
---- ------------
|
||||
This guide is only interesting for people who want to alter something
|
||||
themselves without access to translator.openttd.org. Please note that
|
||||
your compiled language file will only be compatible with the OpenTTD version
|
||||
you have downloaded english.txt, the master language file, for. While this is
|
||||
not always true, namely when changes in the code have not touched language
|
||||
files, your safest bet is to assume this 'limitation'.
|
||||
As a first step you need to compile strgen. This is as easy as typing
|
||||
'make strgen'. You can download the precompile strgen from:
|
||||
http://www.openttd.org/download-strgen
|
||||
|
||||
strgen takes as argument a txt file and translates it to a lng file, allowing
|
||||
it to be used inside OpenTTD. strgen needs the master language file
|
||||
english.txt to work. Below are some examples of strgen usage.
|
||||
|
||||
1.1) Examples
|
||||
---- --------
|
||||
Example 1:
|
||||
if you are in the root of your working copy (svn code), you should type
|
||||
strgen/strgen -s lang lang/english.txt
|
||||
to compile englist.txt into english.lng. It will be placed in the lang dir
|
||||
|
||||
Example 2:
|
||||
you only have the strgen executable (no working copy) and you want to compile
|
||||
a txt file in the same directory. You should type
|
||||
./strgen english.txt
|
||||
and you will get and english.lng in the same dir
|
||||
|
||||
Example 3:
|
||||
you have strgen somewhere, english.txt in /usr/openttd/lang and you want the
|
||||
resulting language file to go to /tmp. Use
|
||||
./strgen -s /usr/openttd/lang -d /tmp english.txt
|
||||
|
||||
You can interchange english.txt to whichever language you want to generate a
|
||||
.lng file for.
|
||||
|
||||
1.2) strgen command switches
|
||||
---- -----------------------
|
||||
-v | --version
|
||||
strgen will tell what svn revision it was last modified
|
||||
|
||||
-t | --todo
|
||||
strgen will add <TODO> to any untranslated/missing strings and use the english
|
||||
strings while compiling the language file
|
||||
|
||||
-w | --warning
|
||||
strgen will print any missing strings or wrongly translated (bad format)
|
||||
to standard error output(stderr)
|
||||
|
||||
-h | --help | -?
|
||||
Print out a summarized help message explaining these switches
|
||||
|
||||
-s | --source_dir
|
||||
strgen will search for the master file english.txt in the directory specified
|
||||
by this switch instead of the current directory
|
||||
|
||||
-d | --dest_dir
|
||||
strgen will put <language>.lng in the directory specified by this switch; if
|
||||
no dest_dir is given, output is the same as source_dir
|
||||
139
docs/Readme_OS2.txt
Normal file
139
docs/Readme_OS2.txt
Normal file
@@ -0,0 +1,139 @@
|
||||
OpenTTD: OS/2 version
|
||||
=====================
|
||||
|
||||
OpenTTD has been ported to work on OS/2 4.x or later (including
|
||||
eComStation). The game should work as well as it does on Windows
|
||||
or other platforms: the main issues you may encounter are graphics
|
||||
card problems, but that is really the fault of SDL.
|
||||
|
||||
=========================
|
||||
USING OPENTTD FOR OS/2
|
||||
=========================
|
||||
|
||||
LIBRARIES REQUIRED FOR END USERS
|
||||
--------------------------------
|
||||
|
||||
SDL.DLL (SDL 1.2.7) and FSLib.dll are required to use this program:
|
||||
these can be downloaded from the Files section at
|
||||
http://sourceforge.net/projects/openttd/ - see "os2-useful-v1.1.zip".
|
||||
Version 20051222 of SDL or later is required. This can be found at
|
||||
http://sdl.netlabs.org/.
|
||||
|
||||
Please note that earlier SDL releases will probably NOT work with
|
||||
OpenTTD. If you experience problems with OpenTTD, please check
|
||||
your SDL and FSLib.dll versions (both must match).
|
||||
|
||||
Note that to actually play the game, I have found in my own
|
||||
experience that a version of the Scitech Display Drivers or its later
|
||||
incarnation (see www.scitech.com) are necessary for it to work. If
|
||||
you have trouble with your native drivers, try the Scitech drivers
|
||||
and see if they help the problem.
|
||||
|
||||
KNOWN ISSUES
|
||||
------------
|
||||
|
||||
- If an error occurs during loading, the OS/2 error message window
|
||||
is not always displayed.
|
||||
|
||||
A NOTE ABOUT MUSIC
|
||||
------------------
|
||||
|
||||
OpenTTD includes a music driver which uses the MCI MIDI system. Unfortunately,
|
||||
due to the lack of proper MIDI hardware myself, I have been unable to test it,
|
||||
but during testing, I found that when MIDI was enabled, I got no sound
|
||||
effects. I therefore decided to DISABLE music by default.
|
||||
|
||||
To enable music, start OpenTTD with the command line:
|
||||
|
||||
openttd -m os2
|
||||
|
||||
If I hear enough responses that both music and sound work together (it might
|
||||
just be my system), I'll have the defaults changed.
|
||||
|
||||
Please note also that the GCC version does not currently support the MCI MIDI
|
||||
system.
|
||||
|
||||
|
||||
A NOTE ABOUT DEDICATED MULTIPLAYER SERVERS
|
||||
------------------------------------------
|
||||
|
||||
To start a dedicated multiplayer server, you should run the dedicated.cmd
|
||||
file. This enables OpenTTD to open up a VIO console window to display
|
||||
its output and gather any necessary input. Running "openttd -D"
|
||||
directly will result in the console not being displayed. You may
|
||||
still pass any other parameters ('-D' is already passed) to
|
||||
dedicated.cmd.
|
||||
|
||||
You can find the dedicated.cmd file in the os/os2 directory.
|
||||
|
||||
=========================
|
||||
BUILDING THE OS/2 VERSION
|
||||
=========================
|
||||
|
||||
Compiler
|
||||
--------
|
||||
|
||||
Innotek GCC, an OS/2 port of the popular GCC compiler, was used to build OpenTTD.
|
||||
See www.innotek.de for more information. You WILL need a reasonably UNIX-like
|
||||
build environment in order to build OpenTTD successfully - the following link
|
||||
may help to set one up (although some of the links from that page are broken):
|
||||
|
||||
http://www.mozilla.org/ports/os2/gccsetup.html
|
||||
|
||||
Alternatively, Paul Smedley's ready-to-go GCC build environment has been known to
|
||||
successfully build the game:
|
||||
|
||||
http://www.smedley.info/os2ports/index.php?page=build-environment
|
||||
|
||||
To build, you should, if your environment is set up well enough, be able to just
|
||||
type `./configure' (or `sh configure' if you're using the OS/2 shell) and `make'.
|
||||
|
||||
You may have to manually specify `--os OS2' on the configure command line, as
|
||||
configure cannot always detect OS/2 correctly.
|
||||
|
||||
A note on Open Watcom
|
||||
---------------------
|
||||
|
||||
Open Watcom C/C++ was previously used to build OpenTTD (version 0.4.x and earlier).
|
||||
However, due to advanced C++ features used in the YAPF portion of OpenTTD 0.5
|
||||
in particular, the compiler is no longer able to build the game at the moment.
|
||||
Hopefully one day Open Watcom will be able to catch up and we will be able to build
|
||||
the game once again (it's easier than getting an OS/2 UNIX-like environment set up
|
||||
in my opinion!), but until then, OpenTTD 0.5 and later can only be built with GCC.
|
||||
|
||||
Libraries Required
|
||||
------------------
|
||||
|
||||
The following libraries are required. To build zlib and libpng, I
|
||||
simply added the required files (watch out for sample programs, etc)
|
||||
to an IDE project file and built a library. Do not use the makefiles
|
||||
provided, they are not designed for Watcom (apart from SDL):
|
||||
|
||||
- zlib
|
||||
http://www.zlib.org/
|
||||
|
||||
- libpng
|
||||
http://www.libpng.org/
|
||||
|
||||
- SDL for OS/2
|
||||
ftp://ftp.netlabs.org/pub/sdl/sdl-1.2.7-src-20051222.zip used for
|
||||
0.4.7
|
||||
|
||||
- Freetype
|
||||
http://freetype.sourceforge.net/
|
||||
|
||||
Currently, there are no pre-built libraries available for GCC. If you manage to get
|
||||
OpenTTD working on Watcom though (do let us know if this is the case!), pre-built
|
||||
versions can be downloaded from the Files section at
|
||||
http://sourceforge.net/projects/openttd/ - see "os2-useful-v1.1.zip".
|
||||
|
||||
Contact Information
|
||||
-------------------
|
||||
|
||||
If you have any questions regarding OS/2 issues, please contact me
|
||||
(owen@owenrudge.net) and I'll try to help you out. For general OpenTTD
|
||||
issues, see the Contacting section of readme.txt.
|
||||
|
||||
Thanks to Paul Smedley for his help with getting OpenTTD to compile under GCC on OS/2.
|
||||
|
||||
- Owen Rudge, 24th June 2007
|
||||
108
docs/Readme_Windows_MSVC.txt
Normal file
108
docs/Readme_Windows_MSVC.txt
Normal file
@@ -0,0 +1,108 @@
|
||||
Compiling OpenTTD using Microsoft Visual C++
|
||||
Last updated: 2010-01-03
|
||||
--------------------------------------------
|
||||
PLEASE READ THE ENTIRE DOCUMENT BEFORE DOING ANY ACTUAL CHANGES!!
|
||||
|
||||
|
||||
SUPPORTED MSVC COMPILERS
|
||||
------------------------
|
||||
OpenTTD includes projects for MSVC 2005.NET and MSVC 2008.NET. Both will
|
||||
compile out of the box, providing you have the required libraries/headers;
|
||||
which ones, see below. There is no support for VS6 or MSVC 2002, or
|
||||
MSVC 2003.NET. You are therefore strongly encouraged to either upgrade to
|
||||
MSVC 2008 Express (free) or use GCC.
|
||||
|
||||
|
||||
1) REQUIRED FILES
|
||||
-----------------
|
||||
You might already have some of the files already installed, so check before
|
||||
downloading; mostly because the DirectX SDK and Platform SDK are about
|
||||
500MB each.
|
||||
Download the following files:
|
||||
|
||||
* openttd-useful.zip (http://binaries.openttd.org/extra/openttd-useful/)
|
||||
* DirectX 8.1 SDK (http://neuron.tuke.sk/~mizanin/eng/Dx81sdk-include-lib.rar) (or alternatively the latest DirectX SDK from Microsoft)
|
||||
* MS Windows Platform SDK (http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en)
|
||||
* afxres.h (http://www-d0.fnal.gov/d0dist/dist/packages/d0ve/devel/windows/AFXRES.H)
|
||||
|
||||
...and of course the newest source from svn://svn.openttd.org/trunk
|
||||
|
||||
You need an SVN-client to download the source from subversion:
|
||||
|
||||
* CLI Subversion (http://subversion.tigris.org/)
|
||||
* GUI TortoiseSVN (http://tortoisesvn.tigris.org/)
|
||||
|
||||
|
||||
2) INCLUDES AND LIBRARIES
|
||||
-------------------------
|
||||
Put the newly downloaded files in the VC lib\ and include\ directories; where
|
||||
"C:\Program Files\Microsoft Visual Studio 9.0\VC" is your location of Visual C.
|
||||
If you are compiling for an x64 system, use the include\ and lib\ directories
|
||||
from the win64/ folder.
|
||||
|
||||
* openttd-useful.zip\include\*
|
||||
* afxresh.h
|
||||
to > C:\Program Files\Microsoft Visual Studio 9.0\VC\Include
|
||||
|
||||
* openttd-useful.zip\lib\*
|
||||
to > C:\Program Files\Microsoft Visual Studio 9.0\VC\Lib
|
||||
|
||||
Custom directories might be recommended, check 2.2)
|
||||
|
||||
|
||||
2.1) INCLUDES AND LIBRARIES - DIRECTX/PLATFORM SDK
|
||||
--------------------------------------------------
|
||||
Basically the same procedure as with the useful zip file, providing
|
||||
you are not using the Microsoft installer. Put the include files in the
|
||||
include\ directory and the library files to the Lib\ directory.
|
||||
|
||||
It is recommended to use custom directories so you don't overwrite any
|
||||
default header or library files.
|
||||
|
||||
|
||||
2.2) CUSTOM DIRECTORIES
|
||||
-----------------------
|
||||
If you have put the above include and/or library files into custom folders,
|
||||
MSVC will not find them by default. You need to add these paths to VC through:
|
||||
|
||||
Tools > Options > Projects and Solutions > VC++ Directories > show directories for
|
||||
|
||||
* Include files: Add the DirectX/Platform SDK include dir you've created
|
||||
* Library files: Add the path to the SDK custom lib dir
|
||||
|
||||
NOTE: make sure that the directory for the DirectX SDK is the first one in the
|
||||
list, above all others, otherwise compilation will most likely fail!!
|
||||
|
||||
|
||||
3) TTD GRAPHICS FILES
|
||||
---------------------
|
||||
See section 4.1 of readme.txt for the required 3rdparty files and how to install them.
|
||||
|
||||
|
||||
4) COMPILING
|
||||
------------
|
||||
Open trunk/openttd_vs[89]0.sln
|
||||
Set the build mode to 'Release' in
|
||||
Build > Configuration manager > Active solution configuration > select "Release"
|
||||
Compile...
|
||||
|
||||
If everything works well the binary should be in trunk/objs/Win[32|64]/Release/openttd.exe
|
||||
|
||||
|
||||
5) EDITING, CHANGING SOURCE CODE
|
||||
--------------------------------
|
||||
Set the build mode (back to) 'Debug'
|
||||
Change the startup project to openttd by right-clicking the 'openttd' project
|
||||
in the Solution Explorer and selecting 'Set as Startup Project'. The 'openttd'
|
||||
project should now show up bold instead of 'strgen'.
|
||||
|
||||
|
||||
6) PROBLEMS?
|
||||
------------
|
||||
If compilation fails, double-check that you are using the latest SVN (!)
|
||||
source. If it still doesn't work, check in on IRC (irc://irc.oftc.net/openttd),
|
||||
to ask about reasons; or just wait. The problem will most likely solve itself
|
||||
within a few days as the problem is noticed and fixed.
|
||||
|
||||
An up-to-date version of this README can be found on the wiki:
|
||||
http://wiki.openttd.org/Microsoft_Visual_C%2B%2B_2008_Express_Editions
|
||||
219
docs/admin_network.txt
Normal file
219
docs/admin_network.txt
Normal file
@@ -0,0 +1,219 @@
|
||||
OpenTTD's admin network
|
||||
Last updated: 2011-01-20
|
||||
------------------------------------------------------------------------
|
||||
|
||||
|
||||
Table of contents
|
||||
-----------------
|
||||
1.0) Preface
|
||||
2.0) Joining the network
|
||||
3.0) Asking for updates
|
||||
* 3.1) Polling manually
|
||||
4.0) Sending rcon commands
|
||||
5.0) Sending chat
|
||||
* 5.1) Receiving chat
|
||||
6.0) Disconnecting
|
||||
7.0) Certain packet information
|
||||
|
||||
|
||||
1.0) Preface
|
||||
---- -------
|
||||
The admin network provides a dedicated network protocol designed for other
|
||||
applications to communicate with OpenTTD. Connected applications can execute
|
||||
console commands remotely (rcon commands) with no further authentication.
|
||||
Furthermore information about clients and companies can be provided.
|
||||
|
||||
Admin applications remain connected when starting a new game or loading a saved
|
||||
game in contrast to normal OpenTTD clients that get disconnected.
|
||||
|
||||
This document describes the admin network and its protocol.
|
||||
|
||||
Please refer to the mentioned enums in src/network/core/tcp_admin.h
|
||||
|
||||
Please also note that further improvements to the admin protocol can mean that
|
||||
more packet types will be sent by the server. For forward compatibility it is
|
||||
therefore wise to ignore unknown packets. Future improvements might also add
|
||||
additional data to packets. This data should be ignored. Data will never be
|
||||
removed from packets in later versions, except the possibility that complete
|
||||
packets are dropped in favour of a new packet.
|
||||
This though will be reflected in the protocol version as announced in the
|
||||
ADMIN_PACKET_SERVER_PROTOCOL in section 2.0).
|
||||
|
||||
A reference implementation in Java for a client connecting to the admin interface
|
||||
can be found at: http://dev.openttdcoop.org/projects/joan
|
||||
|
||||
|
||||
2.0) Joining the network
|
||||
---- -------------------
|
||||
Create a TCP connection to the server on port 3977. The application is
|
||||
expected to authenticate within 10 seconds.
|
||||
|
||||
To authenticate send a ADMIN_PACKET_ADMIN_JOIN packet.
|
||||
|
||||
The server will reply with ADMIN_PACKET_SERVER_PROTOCOL followed directly by
|
||||
ADMIN_PACKET_SERVER_WELCOME.
|
||||
|
||||
ADMIN_PACKET_SERVER_PROTOCOL contains details about the protocol version.
|
||||
It is the job of your application to check this number and decide whether
|
||||
it will remain connected or not.
|
||||
Furthermore, this packet holds details on every AdminUpdateType and the
|
||||
supported AdminFrequencyTypes (bitwise representation).
|
||||
|
||||
ADMIN_PACKET_SERVER_WELCOME contains details on the server and the map,
|
||||
e.g. if the server is dedicated, its NetworkLanguage, size of the Map, etc.
|
||||
|
||||
Once you have received ADMIN_PACKET_SERVER_WELCOME you are connected and
|
||||
authorized to do your thing.
|
||||
The server will not provide any game related updates unless you ask for them.
|
||||
There are four packets the server will none the less send, if applicable:
|
||||
- ADMIN_PACKET_SERVER_ERROR
|
||||
- ADMIN_PACKET_SERVER_WELCOME
|
||||
- ADMIN_PACKET_SERVER_NEWGAME
|
||||
- ADMIN_PACKET_SERVER_SHUTDOWN
|
||||
|
||||
However, ADMIN_PACKET_SERVER_WELCOME only after a ADMIN_PACKET_SERVER_NEWGAME
|
||||
|
||||
|
||||
3.0) Asking for updates
|
||||
---- ------------------
|
||||
Asking for updates is done with ADMIN_PACKET_ADMIN_UPDATE_FREQUENCY.
|
||||
With this packet you define which update you wish to receive at which
|
||||
frequency.
|
||||
|
||||
Note: not every update type supports every frequency. If in doubt, you can
|
||||
verify against the data received in ADMIN_PACKET_SERVER_PROTOCOL.
|
||||
|
||||
The server will not confirm your registered update. However, asking for an
|
||||
invalid AdminUpdateType or a not supported AdminUpdateFrequency you will be
|
||||
disconnected from the server with NETWORK_ERROR_ILLEGAL_PACKET.
|
||||
|
||||
Additional debug information can be found with a debug level of net=3.
|
||||
|
||||
ADMIN_UPDATE_DATE results in the server sending:
|
||||
- ADMIN_PACKET_SERVER_DATE
|
||||
|
||||
ADMIN_UPDATE_CLIENT_INFO results in the server sending:
|
||||
- ADMIN_PACKET_SERVER_CLIENT_JOIN
|
||||
- ADMIN_PACKET_SERVER_CLIENT_INFO
|
||||
- ADMIN_PACKET_SERVER_CLIENT_UPDATE
|
||||
- ADMIN_PACKET_SERVER_CLIENT_QUIT
|
||||
- ADMIN_PACKET_SERVER_CLIENT_ERROR
|
||||
|
||||
ADMIN_UPDATE_COMPANY_INFO results in the server sending:
|
||||
- ADMIN_PACKET_SERVER_COMPANY_NEW
|
||||
- ADMIN_PACKET_SERVER_COMPANY_INFO
|
||||
- ADMIN_PACKET_SERVER_COMPANY_UPDATE
|
||||
- ADMIN_PACKET_SERVER_COMPANY_REMOVE
|
||||
|
||||
ADMIN_UPDATE_COMPANY_ECONOMY results in the server sending:
|
||||
- ADMIN_PACKET_SERVER_COMPANY_ECONOMY
|
||||
|
||||
ADMIN_UPDATE_COMPANY_STATS results in the server sending:
|
||||
- ADMIN_PACKET_SERVER_COMPANY_STATS
|
||||
|
||||
ADMIN_UPDATE_CHAT results in the server sending:
|
||||
- ADMIN_PACKET_SERVER_CHAT
|
||||
|
||||
ADMIN_UPDATE_CONSOLE results in the server sending:
|
||||
- ADMIN_PACKET_SERVER_CONSOLE
|
||||
|
||||
|
||||
ADMIN_UPDATE_CMD_LOGGING results in the server sending:
|
||||
- ADMIN_PACKET_SERVER_CMD_LOGGING
|
||||
|
||||
3.1) Polling manually
|
||||
---- ----------------
|
||||
Certain AdminUpdateTypes can also be polled:
|
||||
- ADMIN_UPDATE_DATE
|
||||
- ADMIN_UPDATE_CLIENT_INFO
|
||||
- ADMIN_UPDATE_COMPANY_INFO
|
||||
- ADMIN_UPDATE_COMPANY_ECONOMY
|
||||
- ADMIN_UPDATE_COMPANY_STATS
|
||||
- ADMIN_UPDATE_CMD_NAMES
|
||||
|
||||
ADMIN_UPDATE_CLIENT_INFO and ADMIN_UPDATE_COMPANY_INFO accept an additional
|
||||
parameter. This parameter is used to specify a certain client or company.
|
||||
Setting this parameter to UINT32_MAX (0xFFFFFFFF) will tell the server you
|
||||
want to receive updates for all clients or companies.
|
||||
|
||||
Not supported AdminUpdateType in the poll will result in the server
|
||||
disconnecting the application with NETWORK_ERROR_ILLEGAL_PACKET.
|
||||
|
||||
Additional debug information can be found with a debug level of net=3.
|
||||
|
||||
|
||||
4.0) Sending rcon commands
|
||||
---- ---------------------
|
||||
Rcon runs separate from the ADMIN_UPDATE_CONSOLE AdminUpdateType. Requesting
|
||||
the execution of a remote console command is done with the packet
|
||||
ADMIN_PACKET_ADMIN_RCON.
|
||||
|
||||
Note: No additional authentication is required for rcon commands.
|
||||
|
||||
The server will reply with one or more ADMIN_PACKET_SERVER_RCON packets.
|
||||
Finally an ADMIN_PACKET_ADMIN_RCON_END packet will be sent. Applications
|
||||
will not receive the answer twice if they have asked for the AdminUpdateType
|
||||
ADMIN_UPDATE_CONSOLE, as the result is not printed on the servers console
|
||||
(just like clients rcon commands).
|
||||
|
||||
Furthermore, sending a 'say' command (or any similar command) will not
|
||||
be sent back into the admin network.
|
||||
Chat from the server itself will only be sent to the admin network when it
|
||||
was not sent from the admin network.
|
||||
|
||||
Note that when content is queried or updated via rcon, the processing
|
||||
happens asynchronously. But the ADMIN_PACKET_ADMIN_RCON_END packet is sent
|
||||
already right after the content is requested as there's no immediate output.
|
||||
Thus other packages and the output of content rcon command may be sent at
|
||||
an arbitrary later time, mixing into the output of other console activity,
|
||||
e.g. also of possible subsequent other rcon commands sent.
|
||||
|
||||
|
||||
5.0) Sending chat
|
||||
---- ------------
|
||||
Sending a ADMIN_PACKET_ADMIN_CHAT results in chat originating from the server.
|
||||
|
||||
Currently four types of chat are supported:
|
||||
- NETWORK_ACTION_CHAT
|
||||
- NETWORK_ACTION_CHAT_CLIENT
|
||||
- NETWORK_ACTION_CHAT_COMPANY
|
||||
- NETWORK_ACTION_SERVER_MESSAGE
|
||||
|
||||
NETWORK_ACTION_SERVER_MESSAGE can be sent to a single client or company
|
||||
using the respective DestType and ID.
|
||||
This is a message prefixed with the 3 stars, e.g. *** foo has joined the game
|
||||
|
||||
5.1) Receiving chat
|
||||
---- -------------
|
||||
Register ADMIN_UPDATE_CHAT at ADMIN_FREQUENCY_AUTOMATIC to receive chat.
|
||||
The application will be able to receive all chat the server can see.
|
||||
|
||||
The configuration option network.server_admin_chat specifies whether
|
||||
private chat for to the server is distributed into the admin network.
|
||||
|
||||
|
||||
6.0) Disconnecting
|
||||
---- -------------
|
||||
It is a kind thing to say good bye before leaving. Do this by sending the
|
||||
ADMIN_PACKET_ADMIN_QUIT packet.
|
||||
|
||||
|
||||
7.0) Certain packet information
|
||||
---- --------------------------
|
||||
All ADMIN_PACKET_SERVER_* packets have an enum value greater 100.
|
||||
|
||||
ADMIN_PACKET_SERVER_WELCOME
|
||||
Either directly follows ADMIN_PACKET_SERVER_PROTOCOL or is sent
|
||||
after a new game has been started or a map loaded, i.e. also
|
||||
after ADMIN_PACKET_SERVER_NEWGAME.
|
||||
|
||||
ADMIN_PACKET_SERVER_CLIENT_JOIN and ADMIN_PACKET_SERVER_COMPANY_NEW
|
||||
These packets directly follow their respective INFO packets. If you receive
|
||||
a CLIENT_JOIN / COMPANY_NEW packet without having received the INFO packet
|
||||
it may be a good idea to POLL for the specific ID.
|
||||
|
||||
ADMIN_PACKET_SERVER_CMD_NAMES and ADMIN_PACKET_SERVER_CMD_LOGGING
|
||||
Data provided with these packets is not stable and will not be
|
||||
treated as such. Do not rely on IDs or names to be constant
|
||||
across different versions / revisions of OpenTTD.
|
||||
Data provided in this packet is for logging purposes only.
|
||||
268
docs/desync.txt
Normal file
268
docs/desync.txt
Normal file
@@ -0,0 +1,268 @@
|
||||
Some explanations about Desyncs
|
||||
Last updated: 2014-02-23
|
||||
------------------------------------------------------------------------
|
||||
|
||||
|
||||
Table of contents
|
||||
-----------------
|
||||
1.0) Desync theory
|
||||
* 1.1) OpenTTD multiplayer architecture
|
||||
* 1.2) What is a Desync and how is it detected
|
||||
* 1.3) Typical causes of Desyncs
|
||||
2.0) What to do in case of a Desync
|
||||
* 2.1) Cache debugging
|
||||
* 2.2) Desync recording
|
||||
3.0) Evaluating the Desync records
|
||||
* 3.1) Replaying
|
||||
* 3.2) Evaluation the replay
|
||||
* 3.3) Comparing savegames
|
||||
|
||||
|
||||
1.1) OpenTTD multiplayer architecture
|
||||
---- --------------------------------
|
||||
OpenTTD has a huge gamestate, which changes all of the time.
|
||||
The savegame contains the complete gamestate at a specific point
|
||||
in time. But this state changes completely each tick: Vehicles move
|
||||
and trees grow.
|
||||
|
||||
However, most of these changes in the gamestate are deterministic:
|
||||
Without a player interfering a vehicle follows its orders always
|
||||
in the same way, and trees always grow the same.
|
||||
|
||||
In OpenTTD multiplayer synchronisation works by creating a savegame
|
||||
when clients join, and then transfering that savegame to the client,
|
||||
so it has the complete gamestate at a fixed point in time.
|
||||
|
||||
Afterwards clients only receive 'commands', that is: Stuff which is
|
||||
not predictable, like
|
||||
- player actions
|
||||
- AI actions
|
||||
- GameScript actions
|
||||
- Admin Port command
|
||||
- rcon commands
|
||||
- ...
|
||||
|
||||
These commands contain the information on how to execute the command,
|
||||
and when to execute it. Time is measured in 'network frames'.
|
||||
Mind that network frames to not match ingame time. Network frames
|
||||
also run while the game is paused, to give a defined behaviour to
|
||||
stuff that is executing while the game is paused.
|
||||
|
||||
The deterministic part of the gamestate is run by the clients on
|
||||
their own. All they get from the server is the instruction to
|
||||
run the gamestate up to a certain network time, which basically
|
||||
says that there are no commands scheduled in that time.
|
||||
|
||||
When a client (which includes the server itself) wants to execute
|
||||
a command (i.e. a non-predictable action), it does this by
|
||||
- calling DoCommandP resp. DoCommandPInternal
|
||||
- These functions first do a local test-run of the command to
|
||||
check simple preconditions. (Just to give the client an
|
||||
immediate response without bothering the server and waiting for
|
||||
the response.) The test-run may not actually change the
|
||||
gamestate, all changes must be discarded.
|
||||
- If the local test-run succeeds the command is sent to the server.
|
||||
- The server inserts the command into the command queue, which
|
||||
assigns a network frame to the commands, i.e. when it shall be
|
||||
executed on all clients.
|
||||
- Enhanced with this specific timestamp, the command is send to all
|
||||
clients, which execute the command simultaneously in the same
|
||||
network frame in the same order.
|
||||
|
||||
1.2) What is a Desync and how is it detected
|
||||
---- ---------------------------------------
|
||||
In the ideal case all clients have the same gamestate as the server
|
||||
and run in sync. That is, vehicle movement is the same on all
|
||||
clients, and commands are executed the same everywhere and
|
||||
have the same results.
|
||||
|
||||
When a Desync happens, it means that the gamestates on the clients
|
||||
(including the server) are no longer the same. Just imagine
|
||||
that a vehicle picks the left line instead of the right line at
|
||||
a junction on one client.
|
||||
|
||||
The important thing here is, that noone notices when a Desync
|
||||
occurs. The desync client will continue to simulate the gamestate
|
||||
and execute commands from the server. Once the gamestate differs
|
||||
it will increasingly spiral out of control: If a vehicle picks a
|
||||
different route, it will arrive at a different time at a station,
|
||||
which will load different cargo, which causes other vehicles to
|
||||
load other stuff, which causes industries to notice different
|
||||
servicing, which causes industries to change production, ...
|
||||
the client could run all day in a different universe.
|
||||
|
||||
To limit how long a Desync can remain unnoticed, the server
|
||||
transfers some checksums every now and then for the gamestate.
|
||||
Currently this checksum is the state of the random number
|
||||
generator of the game logic. A lot of things in OpenTTD depend
|
||||
on the RNG, and if the gamestate differs, it is likely that the
|
||||
RNG is called at different times, and the state differs when
|
||||
checked.
|
||||
|
||||
The clients compare this 'checksum' with the checksum of their
|
||||
own gamestate at the specific network frame. If they differ,
|
||||
the client disconnects with a Desync error.
|
||||
|
||||
The important thing here is: The detection of the Desync is
|
||||
only an ultimate failure detection. It does not give any
|
||||
indication on when the Desync happened. The Desync may after
|
||||
all have occurred long ago, and just did not affect the checksum
|
||||
up to now. The checksum may have matched 10 times or more
|
||||
since the Desync happend, and only now the Desync has spiraled
|
||||
enough to finally affect the checksum. (There was once a desync
|
||||
which was only noticed by the checksum after 20 game years.)
|
||||
|
||||
1.3) Typical causes of Desyncs
|
||||
---- -------------------------
|
||||
Desyncs can be caused by the following scenarios:
|
||||
- The savegame does not describe the complete gamestate.
|
||||
- Some information which affects the progression of the
|
||||
gamestate is not saved in the savegame.
|
||||
- Some information which affects the progression of the
|
||||
gamestate is not loaded from the savegame.
|
||||
This includes the case that something is not completely
|
||||
reset before loading the savegame, so data from the
|
||||
previous game is carried over to the new one.
|
||||
- The gamestate does not behave deterministic.
|
||||
- Cache mismatch: The game logic depends on some cached
|
||||
values, which are not invalidated properly. This is
|
||||
the usual case for NewGRF-specific Desyncs.
|
||||
- Undefined behaviour: The game logic performs multiple
|
||||
things in an undefined order or with an undefined
|
||||
result. E.g. when sorting something with a key while
|
||||
some keys are equal. Or some computation that depends
|
||||
on the CPU architecture (32/64 bit, little/big endian).
|
||||
- The gamestate is modified when it shall not be modified.
|
||||
- The test-run of a command alters the gamestate.
|
||||
- The gamestate is altered by a player or script without
|
||||
using commands.
|
||||
|
||||
|
||||
2.1) Cache debugging
|
||||
---- ---------------
|
||||
Desyncs which are caused by inproper cache validation can
|
||||
often be found by enabling cache validation:
|
||||
- Start OpenTTD with '-d desync=2'.
|
||||
- This will enable validation of caches every tick.
|
||||
That is, cached values are recomputed every tick and compared
|
||||
to the cached value.
|
||||
- Differences are logged to 'commands-out.log' in the autosave
|
||||
folder.
|
||||
|
||||
Mind that this type of debugging can also be done in singleplayer.
|
||||
|
||||
2.2) Desync recording
|
||||
---- ----------------
|
||||
If you have a server, which happens to encounter Desyncs often,
|
||||
you can enable recording of the gamestate alterations. This
|
||||
will later allow the replay the gamestate and locate the Desync
|
||||
cause.
|
||||
|
||||
There are two levels of Desync recording, which are enabled
|
||||
via '-d desync=2' resp. '-d desync=3'. Both will record all
|
||||
commands to a file 'commands-out.log' in the autosave folder.
|
||||
|
||||
If you have the savegame from the start of the server, and
|
||||
this command log you can replay the whole game. (see Section 3.1)
|
||||
|
||||
If you do not start the server from a savegame, there will
|
||||
also be a savegame created just after a map has been generated.
|
||||
The savegame will be named 'dmp_cmds_*.sav' and be put into
|
||||
the autosave folder.
|
||||
|
||||
In addition to that '-d desync=3' also creates regular savegames
|
||||
at defined spots in network time. (more defined than regular
|
||||
autosaves). These will be created in the autosave folder
|
||||
and will also be named 'dmp_cmds_*.sav'.
|
||||
|
||||
These saves allow comparing the gamestate with the original
|
||||
gamestate during replaying, and thus greatly help debugging.
|
||||
However, they also take a lot of disk space.
|
||||
|
||||
|
||||
3.1) Replaying
|
||||
---- ---------
|
||||
To replay a Desync recording, you need these files:
|
||||
- The savegame from when the server was started, resp.
|
||||
the automatically created savegame from when the map
|
||||
was generated.
|
||||
- The 'commands-out.log' file.
|
||||
- Optionally the 'dmp_cmds_*.sav'.
|
||||
Put these files into a safe spot. (Not your autosave folder!)
|
||||
|
||||
Next, prepare your OpenTTD for replaying:
|
||||
- Get the same version of OpenTTD as the original server was running.
|
||||
- Uncomment/enable the define 'DEBUG_DUMP_COMMANDS' in
|
||||
'src/network/network_func.h'.
|
||||
(DEBUG_FAILED_DUMP_COMMANDS is explained later)
|
||||
- Put the 'commands-out.log' into the root save folder, and rename
|
||||
it to 'commands.log'.
|
||||
- Run 'openttd -D -d desync=3 -g startsavegame.sav'.
|
||||
This replays the server log and creates new 'commands-out.log'
|
||||
and 'dmp_cmds_*.sav' in your autosave folder.
|
||||
|
||||
3.2) Evaluation the replay
|
||||
---- ---------------------
|
||||
The replaying will also compare the checksums which are part of
|
||||
the 'commands-out.log' with the replayed gamestate.
|
||||
If they differ, it will trigger a 'NOT_REACHED'.
|
||||
|
||||
If the replay succeeds without mismatch, that is the replay reproduces
|
||||
the original server state:
|
||||
- Repeat the replay starting from incrementally later 'dmp_cmds_*.sav'
|
||||
while truncating the 'commands.log' at the beginning appropriately.
|
||||
The 'dmp_cmds_*.sav' can be your own ones from the first reply, or
|
||||
the ones from the original server (if you have them).
|
||||
(This simulates the view of joining clients during the game.)
|
||||
- If one of those replays fails, you have located the Desync between
|
||||
the last dmp_cmds that reproduces the replay and the first one
|
||||
that fails.
|
||||
|
||||
If the replay does not succeed without mismatch, you can check the logs
|
||||
whether there were failed commands. Then you may try to replay with
|
||||
DEBUG_FAILED_DUMP_COMMANDS enabled. If the replay then fails, the
|
||||
command test-run of the failed command modified the game state.
|
||||
|
||||
If you have the original 'dmp_cmds_*.sav', you can also compare those
|
||||
savegames with your own ones from the replay. You can also comment/disable
|
||||
the 'NOT_REACHED' mentioned above, to get another 'dmp_cmds_*.sav' from
|
||||
the replay after the mismatch has already been detected.
|
||||
See Section 3.2 on how to compare savegames.
|
||||
If the saves differ you have located the Desync between the last dmp_cmds
|
||||
that match and the first one that does not. The difference of the saves
|
||||
may point you in the direction of what causes it.
|
||||
|
||||
If the replay succeeds without mismatch, and you do not have any
|
||||
'dmp_cmd_*.sav' from the original server, it is a lost case.
|
||||
Enable creation of the 'dmp_cmd_*.sav' on the server, and wait for the
|
||||
next Desync.
|
||||
|
||||
Finally, you can also compare the 'commands-out.log' from the original
|
||||
server with the one from the replay. They will differ in stuff like
|
||||
dates, and the original log will contain the chat, but otherwise they
|
||||
should match.
|
||||
|
||||
3.2) Comparing savegames
|
||||
---- -------------------
|
||||
The binary form of the savegames from the original server and from
|
||||
your replay will always differ:
|
||||
- The savegame contains paths to used NewGRF files.
|
||||
- The gamelog will log your loading of the savegame.
|
||||
- The savegame data of AIs and the Gamescript will differ.
|
||||
Scripts are not run during the replay, only their recorded commands
|
||||
are replayed. Their internal state will thus not change in the
|
||||
replay and will differ.
|
||||
|
||||
To compare savegame more semantically, there exist some ugly hackish
|
||||
tools at:
|
||||
http://devs.openttd.org/~frosch/texts/zpipe.c
|
||||
http://devs.openttd.org/~frosch/texts/printhunk.c
|
||||
|
||||
The first one decompresses OpenTTD savegames. The second one creates
|
||||
a textual representation of an uncompressed savegame, by parsing hunks
|
||||
and arrays and such. With both tools you need to be a bit careful
|
||||
since they work on stdin and stdout, which may not deal well with
|
||||
binary data.
|
||||
|
||||
If you have the textual representation of the savegames, you can
|
||||
compare them with regular diff tools.
|
||||
1091
docs/elrail.svg
Normal file
1091
docs/elrail.svg
Normal file
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 62 KiB |
BIN
docs/elrail_tile.png
Normal file
BIN
docs/elrail_tile.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 46 KiB |
BIN
docs/elrail_track.png
Normal file
BIN
docs/elrail_track.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 46 KiB |
1619
docs/landscape.html
Normal file
1619
docs/landscape.html
Normal file
File diff suppressed because it is too large
Load Diff
616
docs/landscape_externals.html
Normal file
616
docs/landscape_externals.html
Normal file
@@ -0,0 +1,616 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta name="Author" content="Marcin Grzegorczyk">
|
||||
<meta name="Description" content="Structure of OpenTTD (OTTD) landscape arrays">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<title>OpenTTD Landscape externals</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h3><a name="Landscape">Landscape</a></h3>
|
||||
<p>
|
||||
These are the different house types available on standard game.<br>
|
||||
<small>Note: In the climate list, 'sub-arctic' means below the snow line, and 'snow' means above the snow line in the sub-arctic climate.</small>
|
||||
</p>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<th align=left>Type </th>
|
||||
<th align=left>Size </th>
|
||||
<th align=left>Climates </th>
|
||||
<th align=left>Description</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>00</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>tall office block</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>01</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>office block</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>02</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>small block of flats</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>03</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>church</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>04</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate, sub-arctic, sub-tropical</td>
|
||||
<td align=left>large office block</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>05</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>snow</td>
|
||||
<td align=left>large office block</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>06</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>town houses</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>07</tt>..<tt>08</tt> </td>
|
||||
<td>1×2</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>hotel</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>09</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate, sub-arctic, sub-tropical </td>
|
||||
<td align=left>statue</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>0A</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate, sub-arctic, sub-tropical</td>
|
||||
<td align=left>fountain</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>0B</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>park (with a pond)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>0C</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>park (with an alley)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>0D</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>office block</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>0E</tt>..<tt>10</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>various types of shops and offices</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>11</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate, sub-arctic, sub-tropical</td>
|
||||
<td align=left>modern office building</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>12</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>warehouse</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>13</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>office block (with spiral stairway on the side)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>14</tt>..<tt>17</tt> </td>
|
||||
<td>2×2</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>stadium</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>18</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>old houses</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>19</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>cottages</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>1A</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>houses</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>1B</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>flats</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>1C</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>tall office block</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>1D</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>shops and offices</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>1E</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate, sub-tropical</td>
|
||||
<td align=left>shops and offices</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>1F</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>theatre</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>20</tt>..<tt>23</tt> </td>
|
||||
<td>2×2</td>
|
||||
<td>temperate, sub-arctic, sub-tropical</td>
|
||||
<td align=left>stadium (modern style)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>24</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate, sub-arctic, sub-tropical</td>
|
||||
<td align=left>offices (the modern 'vertical tube' style)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>25</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-arctic</td>
|
||||
<td align=left>houses</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>26</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>snow</td>
|
||||
<td align=left>houses</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>27</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>cinema</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>28</tt>..<tt>2B</tt> </td>
|
||||
<td>2×2</td>
|
||||
<td>temperate</td>
|
||||
<td align=left>shopping mall</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>2C</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-arctic</td>
|
||||
<td align=left>flats</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>2D</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>snow</td>
|
||||
<td align=left>flats</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>2E</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-arctic</td>
|
||||
<td align=left>houses</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>2F</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>snow</td>
|
||||
<td align=left>houses</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>30</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-arctic</td>
|
||||
<td align=left>houses</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>31</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>snow</td>
|
||||
<td align=left>houses</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>32</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-arctic, sub-tropical</td>
|
||||
<td align=left>tall office block</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>33</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>snow</td>
|
||||
<td align=left>tall office block</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>34</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-arctic</td>
|
||||
<td align=left>tall office block</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>35</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>snow</td>
|
||||
<td align=left>tall office block</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>36</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-arctic, sub-tropical</td>
|
||||
<td align=left>tall office block</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>37</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>snow</td>
|
||||
<td align=left>tall office block</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>38</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-arctic</td>
|
||||
<td align=left>houses</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>39</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>snow</td>
|
||||
<td align=left>houses</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>3A</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-arctic</td>
|
||||
<td align=left>shops and offices</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>3B</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>snow</td>
|
||||
<td align=left>shops and offices</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>3C</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-arctic</td>
|
||||
<td align=left>church</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>3D</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>snow</td>
|
||||
<td align=left>church</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>3E</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-arctic</td>
|
||||
<td align=left>houses</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>3F</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>snow</td>
|
||||
<td align=left>houses</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>40</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-arctic</td>
|
||||
<td align=left>shops and offices</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>41</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>snow</td>
|
||||
<td align=left>shops and offices</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>42</tt>..<tt>43</tt> </td>
|
||||
<td>1×2</td>
|
||||
<td>sub-arctic</td>
|
||||
<td align=left>hotel</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>44</tt>..<tt>45</tt> </td>
|
||||
<td>1×2</td>
|
||||
<td>snow</td>
|
||||
<td align=left>hotel</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>46</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-arctic, sub-tropical</td>
|
||||
<td align=left>shops and offices</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>47</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>snow</td>
|
||||
<td align=left>shops and offices</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>48</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-arctic</td>
|
||||
<td align=left>tall office block</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>49</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>snow</td>
|
||||
<td align=left>tall office block</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>4A</tt>..<tt>4B</tt> </td>
|
||||
<td>2×1</td>
|
||||
<td>sub-arctic</td>
|
||||
<td align=left>tall office block</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>4C</tt>..<tt>4D</tt> </td>
|
||||
<td>2×1</td>
|
||||
<td>snow</td>
|
||||
<td align=left>tall office block</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>4E</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-tropical</td>
|
||||
<td align=left>houses (with a tree in a corner)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>4F</tt>, <tt>50</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-tropical</td>
|
||||
<td align=left>houses</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>51</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-tropical</td>
|
||||
<td align=left>houses (suburb-type)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>52</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-tropical</td>
|
||||
<td align=left>flats</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>53</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-tropical</td>
|
||||
<td align=left>church</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>54</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-tropical</td>
|
||||
<td align=left>houses (with two trees in front)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>55</tt>, <tt>56</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-tropical</td>
|
||||
<td align=left>flats</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>57</tt>..<tt>58</tt> </td>
|
||||
<td>2×1</td>
|
||||
<td>sub-tropical</td>
|
||||
<td align=left>tall office block</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>59</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-tropical</td>
|
||||
<td align=left>flats</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>5A</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>sub-tropical</td>
|
||||
<td align=left>tall office block</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>5B</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>toyland</td>
|
||||
<td align=left>church</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>5C</tt>..<tt>61</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>toyland</td>
|
||||
<td align=left>various types of toyland houses</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>62</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>toyland</td>
|
||||
<td align=left>tall office block</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>63</tt>..<tt>64</tt> </td>
|
||||
<td>1×2</td>
|
||||
<td>toyland</td>
|
||||
<td align=left>houses ('shoe' style)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>65</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>toyland</td>
|
||||
<td align=left>tall office block</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>66</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>toyland</td>
|
||||
<td align=left>igloo</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>67</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>toyland</td>
|
||||
<td align=left>tepees</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>68</tt>, <tt>69</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>toyland</td>
|
||||
<td align=left>shops and offices</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>6A</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>toyland</td>
|
||||
<td align=left>tall office block</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>6B</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>toyland</td>
|
||||
<td align=left>statue</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>6C</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>toyland</td>
|
||||
<td align=left>teapot-house</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td nowrap valign=top><tt>6D</tt> </td>
|
||||
<td>1×1</td>
|
||||
<td>toyland</td>
|
||||
<td align=left>piggy-bank</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
370
docs/landscape_grid.html
Normal file
370
docs/landscape_grid.html
Normal file
@@ -0,0 +1,370 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="Description" content="Structure of OpenTTD (OTTD) landscape arrays #2">
|
||||
<title>OpenTTD Landscape Internals - #2</title>
|
||||
<style type="text/css">
|
||||
span.abuse { font-family: "Courier New", Courier, mono; background-color: rgb(255, 58, 31); }
|
||||
span.option{ font-family: "Courier New", Courier, mono; background-color: rgb(255,255, 30); }
|
||||
span.free { font-family: "Courier New", Courier, mono; background-color: rgb(30, 178, 54); }
|
||||
span.used { font-family: "Courier New", Courier, mono; }
|
||||
td.bits { white-space: nowrap; text-align: center; font-family: "Courier New", Courier, mono; }
|
||||
td.caption { white-space: nowrap; text-align: left; }
|
||||
td li { white-space: nowrap; text-align: left; }
|
||||
th { white-space: nowrap; text-align: center; }
|
||||
</style>
|
||||
</head>
|
||||
<body style="direction: ltr;">
|
||||
<h3 style="font-weight: bold;">Landscape</h3>
|
||||
<span style="font-weight: bold;"></span>Six attributes hold the information about a tile.
|
||||
This can be seen in the <a href="landscape.html">Landscape</a> document. This page tries to give an overview of used and free bits of
|
||||
the array so you can quickly see what is used and what is not.
|
||||
<ul>
|
||||
<li><span style="font-weight: bold;"><span class="free">O</span></span> - bit is free</li>
|
||||
<li><span style="font-weight: bold;"><span class="used">X</span></span> - bit is used</li>
|
||||
<li><span style="font-weight: bold;"><span class="abuse"> </span></span> - bit of attribute is abused for different purposes, i.e. other bits define the actual meaning.</li>
|
||||
<li><span style="font-weight: bold;"><span class="option">~</span></span> - bit is accessed, but does not really have a meaning (e.g. owner of clear land is always OWNER_NONE)</li>
|
||||
</ul>
|
||||
<p>
|
||||
<ul>
|
||||
<li><span style="font-weight: bold;">type</span> - 8 bits in size, tile class (bits 4..7), bridge (bits 2..3) tropic zone (bits 0..1, only valid in tropic climate)</li>
|
||||
<li><span style="font-weight: bold;">height</span> - 8 bits in size, stores tile height</li>
|
||||
<li><span style="font-weight: bold;">m1</span> - 8 bits in size, used to identify the owner of that tile (eg piece of rail, bridge, etc.)</li>
|
||||
<li><span style="font-weight: bold;">m2</span> - 16 bits in size, used to identify the index of the given tile (object) in the (object-)array</li>
|
||||
<li><span style="font-weight: bold;">m3</span> - 8 bits in size, is used for general storage</li>
|
||||
<li><span style="font-weight: bold;">m4</span> - 8 bits in size, is used for general storage</li>
|
||||
<li><span style="font-weight: bold;">m5</span> - 8 bits in size, is used for general storage</li>
|
||||
<li><span style="font-weight: bold;">m6</span> - 8 bits in size, is used for general storage</li>
|
||||
<li><span style="font-weight: bold;">m7</span> - 8 bits in size, is used for general storage</li>
|
||||
</ul>
|
||||
|
||||
<table align=center border="1" cellpadding="2" cellspacing="2">
|
||||
<tbody>
|
||||
<tr>
|
||||
<th colspan=2>class</th>
|
||||
<th>type (8)</th>
|
||||
<th>height (8)</th>
|
||||
<th>m1 (8)</th>
|
||||
<th>m2 (16)</th>
|
||||
<th>m3 (8)</th>
|
||||
<th>m4 (8)</th>
|
||||
<th>m5 (8)</th>
|
||||
<th>m6 (8)</th>
|
||||
<th>m7 (8)</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan=2 class="caption">bits</td>
|
||||
<td class="bits">7654 3210</td>
|
||||
<td class="bits">7654 3210</td>
|
||||
<td class="bits">7654 3210</td>
|
||||
<td class="bits">FEDC BA98 7654 3210</td>
|
||||
<td class="bits">7654 3210</td>
|
||||
<td class="bits">7654 3210</td>
|
||||
<td class="bits">7654 3210</td>
|
||||
<td class="bits">7654 3210</td>
|
||||
<td class="bits">7654 3210</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan="2">0</td>
|
||||
<td class="caption">ground</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits"><span class="free">OOO</span><span class="option">~ ~~~~</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
|
||||
<td class="bits">XXXX <span class="free">OOOO</span></td>
|
||||
<td class="bits">XXXX XX<span class="free">OO</span></td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits"><span class="free">OOO</span>X XX<span class="free">OO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="caption">farmland</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">XXXX XXXX XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits"><span class="free">OOO</span>X XX<span class="free">OO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan=3>1</td>
|
||||
<td class="caption">rail</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits"><span class="free">OOO</span>X XXXX</td>
|
||||
<td class="bits"><span class="free">OOOO</span> XXXX <span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits"><span class="free">OOOO</span> XXXX</td>
|
||||
<td class="bits"><span class="free">OOOO</span> XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="caption">rail with signals</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits"><span class="free">OOOO</span> XXXX XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="caption">depot</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">XXXX XXXX XXXX XXXX</td>
|
||||
<td class="bits"><span class="free">OOOO</span> XXXX</td>
|
||||
<td class="bits"><span class="free">OOOO</span> XXXX</td>
|
||||
<td class="bits">XX<span class="free">O</span>X <span class="free">OO</span>XX</td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan=3>2</td>
|
||||
<td class="caption">road</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits"><span class="free">OOO</span>X XXXX</td>
|
||||
<td class="bits">XXXX XXXX XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits"><span class="free">OO</span>XX X<span class="free">OOO</span></td>
|
||||
<td class="bits">XXX<span class="free">O</span> XXXX</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="caption">level crossing</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">XXXX<span class="free"> OOO</span>X</td>
|
||||
<td class="bits"><span class="free">OO</span>XX X<span class="free">OOO</span></td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="caption">road depot</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">XXXX <span class="free">OOOO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits">XX<span class="free">OO OO</span>XX</td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits">XXX<span class="free">O</span> XXXX</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>3</td>
|
||||
<td class="caption">house</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX XXXX XXXX</td>
|
||||
<td class="bits">XX<span class="free">O</span><span class="option">~ ~~</span>XX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">XXX<span class="abuse">X XXXX</span></td>
|
||||
<td class="bits"><span class="abuse">XXXX XX</span><span class="free">OO</span></td>
|
||||
<td class="bits">XXXX <span class="abuse">XXXX</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>4</td>
|
||||
<td class="caption">trees</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits"><span class="free">OOO</span><span class="option">~ ~~~~</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOO</span>X XXXX XXXX</td>
|
||||
<td class="bits"><span class="option">~~</span>XX XXXX</td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits">XX<span class="free">OO O</span>XXX</td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan=7>5</td>
|
||||
<td class="caption">rail station</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits"><span class="free">O</span>XXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits"><span class="free">OO</span>XX XX<span class="free">OO</span></td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="caption">rail waypoint</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="caption">road stop</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">XXXX <span class="free">OOOO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits"><span class="option">~~~~ ~</span>XXX</td>
|
||||
<td class="bits"><span class="free">OO</span>XX X<span class="free">OOO</span></td>
|
||||
<td class="bits">XX<span class="free">O</span>X XXXX</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="caption">dock</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits"><span class="option">~~~~ ~</span>XXX</td>
|
||||
<td class="bits"><span class="free">OO</span>XX X<span class="free">OOO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="caption">airport</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">XXXX <span class="free">OOOO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits"><span class="free">OO</span>XX X<span class="free">OOO</span></td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="caption">buoy</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits"><span class="option">~~~~ ~~~~</span></td>
|
||||
<td class="bits"><span class="free">OO</span>XX X<span class="free">OOO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="caption">oilrig</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits"><span class="option">~~~~ ~~~~</span></td>
|
||||
<td class="bits"><span class="free">OO</span>XX X<span class="free">OOO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan=3>6</td>
|
||||
<td class="caption">sea, shore</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits"><span class="free">O</span>XXX XXXX</td>
|
||||
<td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits">X<span class="option">~~</span>X XXXX</td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="caption">canal, river</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="caption">shipdepot</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">XXXX XXXX XXXX XXXX</td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>8</td>
|
||||
<td class="caption">industry</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">XXX<span class="free">O</span> <span class="abuse">XXXX</span></td>
|
||||
<td class="bits">XXXX XXXX XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits"><span class="free">OO</span>XX XX<span class="free">OO</span></td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan=2>9</td>
|
||||
<td class="caption">tunnel entrance</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits"><span class="free">OOO</span>X XXXX</td>
|
||||
<td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits">X<span class="free">OO</span>X XXXX</td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>bridge ramp</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits">-inherit-</td>
|
||||
<td class="bits"><span class="free">OO</span>XX XX<span class="free">OO</span></td>
|
||||
<td class="bits">-inherit-</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan=2>A</td>
|
||||
<td class="caption">objects</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits"><span class="free">O</span>XXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX XXXX XXXX</td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
<td class="bits"><span class="free">OOOO OOOO</span></td>
|
||||
<td class="bits">XXXX XXXX</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
30
docs/linkgraph.txt
Normal file
30
docs/linkgraph.txt
Normal file
@@ -0,0 +1,30 @@
|
||||
Some clarifications about the link graph
|
||||
----------------------------------------
|
||||
|
||||
InitializeLinkGraphs joins all threads, so if the game is abandoned
|
||||
with some threads still running, they're joined as soon as the next game
|
||||
(possibly the title game) is started. See also InitializeGame.
|
||||
|
||||
The MCF (multi-commodity flow) algorithm can be quite CPU-hungry as it's
|
||||
NP-hard and takes exponential time (though with a very small constant
|
||||
factor) in the number of nodes.
|
||||
This is why it is run in a separate thread where possible. However after
|
||||
some time the thread is joined and if it hasn't finished by then the game
|
||||
will hang. This problem gets worse if we are running on a platform without
|
||||
threads. However, as those are usually the ones with less CPU power I
|
||||
assume the contention for the CPU would make the game hard to play even
|
||||
with threads or even without cargodist (autosave ...). I might be wrong,
|
||||
but I won't put any work into this before someone shows me some problem.
|
||||
|
||||
You can configure the link graph recalculation time. A link graph
|
||||
recalculation time of X days means that each link graph job has X days
|
||||
to run before it is joined. The downside is that the flow stats won't be
|
||||
updated before the job is finished and thus a high value means less
|
||||
updates and longer times until changes in capacities are accounted for.
|
||||
If you play a very large map with a complicated link graph you may want to
|
||||
raise the time setting to avoid lags. The same holds for systems with slow
|
||||
CPUs.
|
||||
|
||||
Another option to avoid excessive lags is to reduce the accuracy of link
|
||||
graph calculations. Generally the accuracy is inversely correlated to the
|
||||
CPU requirements of the MCF algorithm.
|
||||
219
docs/multiplayer.txt
Normal file
219
docs/multiplayer.txt
Normal file
@@ -0,0 +1,219 @@
|
||||
Multiplayer manual for OpenTTD
|
||||
Last updated: 2011-02-16
|
||||
------------------------------------------------------------------------
|
||||
|
||||
|
||||
Table of contents
|
||||
-----------------
|
||||
1.0) Starting a server
|
||||
2.0) Connecting to a server
|
||||
* 2.1) Connecting to a server over the console
|
||||
3.0) Playing internet games
|
||||
4.0) Tips for servers
|
||||
* 4.1) Imposing landscaping limits
|
||||
5.0) Some useful things
|
||||
6.0) Troubleshooting
|
||||
|
||||
|
||||
1.0) Starting a server
|
||||
---- -----------------
|
||||
- Make sure that you have your firewall of the computer as well as possible
|
||||
routers or modems of the server configured such that:
|
||||
* port 3979 is free for both UDP and TCP connections in- and outgoing
|
||||
* port 3978 is free outbound for UDP in order to advertise with the master
|
||||
server (if desired). Otherwise you'll have to tell players your IP.
|
||||
* port 3977 if use of the admin interface is desired (see admin_network.txt)
|
||||
- Click "multiplayer" on the startup screen
|
||||
- Click "start server"
|
||||
- Type in a game name
|
||||
- Select the type of game ('LAN/Internet' or 'Internet (advertise)'. With the
|
||||
last one other people are able to see you online. Else they need your IP and
|
||||
port to join)
|
||||
- Click "start game", "load game" or "load scenario"
|
||||
- Start playing
|
||||
|
||||
|
||||
2.0) Connecting to a server
|
||||
---- ----------------------
|
||||
- Click "multiplayer" on the startup screen
|
||||
|
||||
- If you want to connect to any network game in your LAN click on 'LAN', then
|
||||
on 'Find Server'
|
||||
- If you want to see which servers all online on the Internet, click on
|
||||
'Internet' and 'Find Server'
|
||||
|
||||
- If there were more than one server
|
||||
- select one in the list below the buttons
|
||||
- click on 'join game'
|
||||
|
||||
- If you want to play and you have the ip or hostname of the game server you
|
||||
want connect to.
|
||||
- click add server
|
||||
- type in the ip address or hostname
|
||||
- if you want to add a port use :<port>
|
||||
|
||||
- Now you can select a company and press: "Join company", to help that company
|
||||
- Or you can press "Spectate game", to spectate the game
|
||||
- Or you can press "New company", and start your own company (if there are
|
||||
slots free)
|
||||
|
||||
- You see a progressbar how far you are with joining the server.
|
||||
|
||||
- Happy playing
|
||||
|
||||
2.1) Connecting to a server over the console
|
||||
---- ---------------------------------------
|
||||
- Open the console and type in the following command:
|
||||
connect <ip/host>:<port>#<company-no>
|
||||
|
||||
|
||||
3.0) Playing internet games
|
||||
---- ----------------------
|
||||
- Servers with a red dot behind it have a different version then you have. You
|
||||
will not be able to join those servers.
|
||||
|
||||
- Servers with a yellow dot behind it have NewGRFs that you do not have. You
|
||||
will not be able to join those servers. However, via "NewGRF Settings" and
|
||||
"Find missing content online" you might be able to download the needed
|
||||
NewGRFs after which you can join the server.
|
||||
|
||||
- It can happen that a connection is that slow, or you have that many clients
|
||||
connected to your server, that your clients start to loose their connection.
|
||||
Some things you can do about it:
|
||||
- [network] frame_freq:
|
||||
change it in console with: 'set network.frame_freq <number>'
|
||||
the number should be between the 0 and 10, not much higher. It indicates
|
||||
the delay between clicking and showing up. The higher, the more you notice
|
||||
it, but the less bandwidth you use.
|
||||
A good value for Internet-games is 2 or 3.
|
||||
|
||||
- [network] sync_freq:
|
||||
change it in console with: 'set network.sync_freq <number>'
|
||||
the number should be between the 50 and 1000, not much lower, not much
|
||||
higer. It indicates the time between sync-frames. A sync-frame is a frame
|
||||
which checks if all clients are still in sync. When the value it too high,
|
||||
clients can desync in 1960, but the server detects it in 1970. Not really
|
||||
handy. The lower the value, the more bandwidth it uses.
|
||||
|
||||
NB: changing frame_freq has more effect on the bandwidth then sync_freq.
|
||||
|
||||
|
||||
4.0) Tips for servers
|
||||
---- ----------------
|
||||
- You can launch a dedicated server by adding -D as parameter.
|
||||
- In UNIX like systems, you can fork your dedicated server by adding -f as
|
||||
parameter.
|
||||
|
||||
- You can automaticly clean companies that do not have a client connected to
|
||||
them, for, let's say, 3 years. You can do this via: 'set autoclean_companies'
|
||||
and 'set autoclean_protected' and 'set autoclean_unprotected'. Unprotected
|
||||
removes a password from a company when it is not used for more then the
|
||||
defined amount of months. 'set autoclean_novehicles' can be used to remove
|
||||
companies without any vehicles quickly.
|
||||
|
||||
- You can also do this manually via the console: 'reset_company'.
|
||||
|
||||
- You can let your server automaticly restart a map when, let's say, year 2030
|
||||
is reached. See 'set restart_game_date' for detail.
|
||||
|
||||
- If you want to be on the server-list, enable Advertising. To do this, select
|
||||
'Internet (advertise)' in the Start Server menu, or type in console:
|
||||
'set server_advertise 1'.
|
||||
|
||||
- You can protect your server with a password via the console: 'set server_pw',
|
||||
or via the Start Server menu.
|
||||
|
||||
- When you have many clients connected to your server via Internet, watch your
|
||||
bandwidth (if you have any limit on it, set by your ISP). One client uses
|
||||
about 1.5 kilobytes per second up and down. To decrease this amount, setting
|
||||
'frame_freq' to 1 will reduce it to roughly 1 kilobyte per second per client.
|
||||
|
||||
- OpenTTD's default settings for maximum number of clients, and amount of data
|
||||
from clients to process are chosen to not influence the normal playing of
|
||||
people, but to prevent or at least make it less likely that someone can
|
||||
perform a (distributed) denial-of-service attack on your server by causing
|
||||
an out-of-memory event by flooding the server with data to send to all
|
||||
clients. The major factor in this is the maximum number of clients; with
|
||||
32 clients "only" sending one chat message causes 1024 messages to be
|
||||
distributed in total, with 64 clients that already quadruples to 4096. Given
|
||||
that upstream bandwidth is usually the limiting factor, a queue of packets
|
||||
that need to be sent will be created.
|
||||
To prevent clients from exploiting this "explosion" of packets to send we
|
||||
limit the number of incoming data, resulting in effectively limiting the
|
||||
amount of data that OpenTTD will send to the clients. Even with the default
|
||||
limits it is possible to generate about 70.000 packets per second, or about
|
||||
7 megabit per second of traffic.
|
||||
Given that OpenTTD kicks clients after they have not reacted within about 9
|
||||
seconds from sending a frame update packet it would be possible that OpenTTD
|
||||
keeps about 600.000 packets in memory, using about 50 megabytes of memory.
|
||||
Given that OpenTTD allows short bursts of packets, you can have slightly
|
||||
more packets in memory in case of a distributed denial of service attack.
|
||||
When increasing the amount of incoming data, or the maximum number of
|
||||
clients the amount of memory OpenTTD needs in case of a distributed denial
|
||||
of service attack is linearly related to the amount of incoming data and
|
||||
quadratic to the amount of clients. In short, a rule of thumb for, the
|
||||
maximum memory usage for packets is:
|
||||
#max_clients * #max_clients * bytes_per_frame * 10 KiB.
|
||||
|
||||
4.1) Imposing landscaping limits
|
||||
---- ---------------------------
|
||||
- You can impose limits on companies by the following 4 settings:
|
||||
- terraform_per_64k_frames
|
||||
- terraform_frame_burst
|
||||
- clear_per_64k_frames
|
||||
- clear_frame_burst
|
||||
|
||||
- Explaining 'per_64K_frames' and 'burst'
|
||||
- 'burst' defines 3 things, the maximum limit, the limit of a single action,
|
||||
and the initial value for the limit assigned to a new company.
|
||||
This setting is fairly simple and requires no math.
|
||||
|
||||
A value of 1 means a single tile can be affected by a single action.
|
||||
This results in having to click 400 times when wanting to cover an area
|
||||
of 20 x 20 tiles.
|
||||
|
||||
The default value 4096 covers an area of 64 x 64 tiles.
|
||||
|
||||
- 'per_64k_frames' defines the number of tiles added to each companies limit
|
||||
per frame (however not past the possible maximum value,the 'burst').
|
||||
64k rather resembles the exact number of 65536 frames. So setting this
|
||||
variable to 65536 means: 65536 / 65536 = 1 tile per frame.
|
||||
As a day consists of 74 frames, a company's limit is increased by 74
|
||||
tiles during the course of a single day (2.22 seconds).
|
||||
|
||||
To achieve a 1 tile per day increase the following calculation is needed:
|
||||
1 / 74 (frames per day) * 65536 (per_64k_frames) = 885.62...
|
||||
after rounding: a value of 886 means adding a bit over 1 tile per day.
|
||||
|
||||
There is still enough space to scale this value downwards:
|
||||
decreasing this value to 127 results in a bit over 1 tile added to the
|
||||
allowance per week (7 days).
|
||||
|
||||
To create a setup in which a company gets an initial allowance only,
|
||||
set the value to 0 - no increase of the allowance per frame.
|
||||
|
||||
- Even though construction actions include a clear tile action, they are not
|
||||
affected by the above settings.
|
||||
|
||||
|
||||
5.0) Some useful things
|
||||
---- ------------------
|
||||
- You can protect your company so nobody else can join uninvited. To do this,
|
||||
set a password in your Company Screen
|
||||
|
||||
- You can give other players some money via the ClientList (under the 'head'
|
||||
in the mainbar).
|
||||
|
||||
- You can chat with other players via ENTER or via SHIFT+T or via the ClientList
|
||||
|
||||
- Servers can now kick players, so don't make them use it!
|
||||
|
||||
|
||||
6.0) Troubleshooting
|
||||
---- ---------------
|
||||
- My advertising server does not show up in list at servers.openttd.org
|
||||
Run openttd with the '-d net=2' parameter. That will show which incoming
|
||||
communication is received, whether the replies from the master server or
|
||||
communication from an admin tool reach the programme. See section 1
|
||||
'Starting a server' further up for the ports and protocols used by OpenTTD.
|
||||
The ports can be configured in the config file.
|
||||
85
docs/obg_format.txt
Normal file
85
docs/obg_format.txt
Normal file
@@ -0,0 +1,85 @@
|
||||
;
|
||||
; Example file for the OpenTTD Base Graphics replacement sets.
|
||||
; This file consists of basically two different parts:
|
||||
; * metadata
|
||||
; * information about the files
|
||||
;
|
||||
; Metadata contains information about the name, version and palette
|
||||
; of the graphics set.
|
||||
;
|
||||
; == Getting started ==
|
||||
; - you can't add comments after values
|
||||
; - you have to fill the MD5 checksum for each file
|
||||
; - you may not miss any of the metadata or files items
|
||||
; - `openttd -h` lists all graphics replacements sets it found to be correct
|
||||
; - `openttd -d grf=1` shows warnings/errors when parsing an .obg file
|
||||
; - `openttd -I <name>` starts OpenTTD with the given set (case sensitive)
|
||||
; - adding `graphicsset = <name>` to the misc section of openttd.cfg makes
|
||||
; OpenTTD start with that graphics set by default
|
||||
; - there is a command line tool for all platforms called md5sum that can
|
||||
; create the MD5 checksum you need.
|
||||
; - all files specified in this file are search relatively to the path where
|
||||
; this file is found, i.e. if the graphics files are in a subdir you have
|
||||
; to add that subdir to the names in this file to! It will NOT search for
|
||||
; a file named like specified in here.
|
||||
|
||||
[metadata]
|
||||
; the name of the pack, preferably less than 16 characters
|
||||
name = example
|
||||
; the short name (4 characters), used to identify this set
|
||||
shortname = XMPL
|
||||
; the version of this graphics set (read as single integer)
|
||||
version = 0
|
||||
; a fairly short description of the set
|
||||
; By adding '.<iso code>' you can translate the description.
|
||||
; Note that OpenTTD first tries the full ISO code, then the first
|
||||
; two characters and then uses the fallback (no '.<iso code>').
|
||||
; The ISO code matching is case sensitive!
|
||||
; So en_US will be used for en_GB if no en_GB translation is added.
|
||||
; As a result the below example has 'howdie' for en_US and en_GB but
|
||||
; 'foo' for all other languages.
|
||||
description = foo
|
||||
description.en_US = howdie
|
||||
; palette used by the set; either DOS or Windows
|
||||
palette = DOS
|
||||
; preferred blitter, optional; either 8bpp (default) or 32bpp.
|
||||
blitter = 8bpp
|
||||
|
||||
; The files section lists the files that replace sprites.
|
||||
; The file names are case sensitive.
|
||||
[files]
|
||||
; GRF file with the base sprites
|
||||
base = TRG1.GRF
|
||||
; GRF file with logos, original terrain generator sprites
|
||||
logos = TRGI.GRF
|
||||
; GRF file with extra arctic sprites
|
||||
arctic = TRGC.GRF
|
||||
; GRF file with extra tropical sprites
|
||||
tropical = TRGH.GRF
|
||||
; GRF file with extra toyland sprites
|
||||
toyland = TRGT.GRF
|
||||
; NewGRF file using Actions 5, 7, 9 and A to replace sprites
|
||||
; Must use a GRF ID starting with FF so it cannot be selected from
|
||||
; the in-game NewGRF list and (thus) be loaded twice.
|
||||
extra = OPENTTDD.GRF
|
||||
|
||||
; The md5s section lists the MD5 checksum for the files that replace them.
|
||||
; Note that the list of files is case sensitive. Each GRF listed in the
|
||||
; files section must be listed here with it's MD5 checksum, otherwise you
|
||||
; will get a lot of warnings when starting OpenTTD.
|
||||
[md5s]
|
||||
TRG1.GRF = 9311676280e5b14077a8ee41c1b42192
|
||||
TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8
|
||||
TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9
|
||||
TRGC.GRF = ed446637e034104c5559b32c18afe78d
|
||||
TRGT.GRF = fcde1d7e8a74197d72a62695884b909e
|
||||
OPENTTDD.GRF = f829f62c137d6d7c6e272c481b796dd5
|
||||
|
||||
; The origin section provides the possibility to put and extra line into
|
||||
; the warning that a file is missing/corrupt. This can be used to tell
|
||||
; them where to find it. It works on the filename specified in the
|
||||
; files section and if that is not found it will fall back to the default
|
||||
; as shown below here.
|
||||
[origin]
|
||||
default = You can find it on your Transport Tycoon Deluxe CD-ROM.
|
||||
OPENTTDD.GRF = This file was part of your installation.
|
||||
106
docs/obm_format.txt
Normal file
106
docs/obm_format.txt
Normal file
@@ -0,0 +1,106 @@
|
||||
;
|
||||
; Example file for the OpenTTD Base Music replacement sets.
|
||||
; This file consists of basically two different parts:
|
||||
; * metadata
|
||||
; * information about the files/songs
|
||||
;
|
||||
; Metadata contains information about the name and version
|
||||
; of the music set.
|
||||
;
|
||||
; == Getting started ==
|
||||
; - you can't add comments after values
|
||||
; - you have to fill the MD5 checksum for each file
|
||||
; - you may not miss any of the metadata or files items
|
||||
; - `openttd -h` lists all music replacement sets it found to be correct
|
||||
; - `openttd -d grf=1` shows warnings/errors when parsing an .obm file
|
||||
; - `openttd -M <name>` starts OpenTTD with the given set (case sensitive)
|
||||
; - adding `musicset = <name>` to the misc section of openttd.cfg makes
|
||||
; OpenTTD start with that sound set by default
|
||||
; - there is a command line tool for all platforms called md5sum that can
|
||||
; create the MD5 checksum you need.
|
||||
; - all files specified in this file are search relatively to the path where
|
||||
; this file is found, i.e. if the sound files are in a subdir you have
|
||||
; to add that subdir to the names in this file to! It will NOT search for
|
||||
; a file named like specified in here.
|
||||
|
||||
[metadata]
|
||||
; the name of the pack, preferably less than 16 characters
|
||||
name = example
|
||||
; the short name (4 characters), used to identify this set
|
||||
shortname = XMPL
|
||||
; the version of this sound set (read as single integer)
|
||||
version = 0
|
||||
; a fairly short description of the set
|
||||
; By adding '.<iso code>' you can translate the description.
|
||||
; Note that OpenTTD first tries the full ISO code, then the first
|
||||
; two characters and then uses the fallback (no '.<iso code>').
|
||||
; The ISO code matching is case sensitive!
|
||||
; So en_US will be used for en_GB if no en_GB translation is added.
|
||||
; As a result the below example has 'howdie' for en_US and en_GB but
|
||||
; 'foo' for all other languages.
|
||||
description = foo
|
||||
description.en_US = howdie
|
||||
|
||||
; The files section lists the files that replace songs.
|
||||
; The file names are case sensitive.
|
||||
; You can have empty file names; in that case no song will be loaded
|
||||
; for that 'entry'.
|
||||
[files]
|
||||
; The theme song for OpenTTD
|
||||
theme = THEME_SONG.GM
|
||||
; The songs in the 'old style' category
|
||||
old_0 =
|
||||
old_1 =
|
||||
old_2 =
|
||||
old_3 =
|
||||
old_4 =
|
||||
old_5 =
|
||||
old_6 =
|
||||
old_7 =
|
||||
old_8 =
|
||||
old_9 =
|
||||
; The songs in the 'new style' category
|
||||
new_0 =
|
||||
new_1 =
|
||||
new_2 =
|
||||
new_3 =
|
||||
new_4 =
|
||||
new_5 =
|
||||
new_6 =
|
||||
new_7 =
|
||||
new_8 =
|
||||
new_9 =
|
||||
; The songs in the 'ezy street' category
|
||||
ezy_0 =
|
||||
ezy_1 =
|
||||
ezy_2 =
|
||||
ezy_3 =
|
||||
ezy_4 =
|
||||
ezy_5 =
|
||||
ezy_6 =
|
||||
ezy_7 =
|
||||
ezy_8 =
|
||||
ezy_9 =
|
||||
|
||||
; The names section lists the song names for the given file name.
|
||||
; Note that the list of files is case sensitive. Each file listed in the
|
||||
; files section must be listed here with it's song name, otherwise you
|
||||
; will get a lot of warnings when starting OpenTTD.
|
||||
[names]
|
||||
THEME_SONG.GM = Tycoon DELUXE Theme
|
||||
|
||||
; The md5s section lists the MD5 checksum for the files that replace them.
|
||||
; Note that the list of files is case sensitive. Each file listed in the
|
||||
; files section must be listed here with it's MD5 checksum, otherwise you
|
||||
; will get a lot of warnings when starting OpenTTD.
|
||||
[md5s]
|
||||
THEME_SONG.GM = 45cfec1b9d8c7a0ad45e755833cbf221
|
||||
|
||||
; The origin section provides the possibility to put and extra line into
|
||||
; the warning that a file is missing/corrupt. This can be used to tell
|
||||
; them where to find it. It works on the filename specified in the
|
||||
; files section and if that is not found it will fall back to the default
|
||||
; as shown below here.
|
||||
[origin]
|
||||
default = You can find it on your Transport Tycoon Deluxe CD-ROM.
|
||||
THEME_SONG.GM = You can find it also on your Transport Tycoon Deluxe CD-ROM.
|
||||
64
docs/obs_format.txt
Normal file
64
docs/obs_format.txt
Normal file
@@ -0,0 +1,64 @@
|
||||
;
|
||||
; Example file for the OpenTTD Base Sound replacement sets.
|
||||
; This file consists of basically two different parts:
|
||||
; * metadata
|
||||
; * information about the files
|
||||
;
|
||||
; Metadata contains information about the name and version
|
||||
; of the sound set.
|
||||
;
|
||||
; == Getting started ==
|
||||
; - you can't add comments after values
|
||||
; - you have to fill the MD5 checksum for each file
|
||||
; - you may not miss any of the metadata or files items
|
||||
; - `openttd -h` lists all sound replacements sets it found to be correct
|
||||
; - `openttd -d grf=1` shows warnings/errors when parsing an .obs file
|
||||
; - `openttd -S <name>` starts OpenTTD with the given set (case sensitive)
|
||||
; - adding `soundsset = <name>` to the misc section of openttd.cfg makes
|
||||
; OpenTTD start with that sound set by default
|
||||
; - there is a command line tool for all platforms called md5sum that can
|
||||
; create the MD5 checksum you need.
|
||||
; - all files specified in this file are search relatively to the path where
|
||||
; this file is found, i.e. if the sound files are in a subdir you have
|
||||
; to add that subdir to the names in this file to! It will NOT search for
|
||||
; a file named like specified in here.
|
||||
|
||||
[metadata]
|
||||
; the name of the pack, preferably less than 16 characters
|
||||
name = example
|
||||
; the short name (4 characters), used to identify this set
|
||||
shortname = XMPL
|
||||
; the version of this sound set (read as single integer)
|
||||
version = 0
|
||||
; a fairly short description of the set
|
||||
; By adding '.<iso code>' you can translate the description.
|
||||
; Note that OpenTTD first tries the full ISO code, then the first
|
||||
; two characters and then uses the fallback (no '.<iso code>').
|
||||
; The ISO code matching is case sensitive!
|
||||
; So en_US will be used for en_GB if no en_GB translation is added.
|
||||
; As a result the below example has 'howdie' for en_US and en_GB but
|
||||
; 'foo' for all other languages.
|
||||
description = foo
|
||||
description.en_US = howdie
|
||||
|
||||
; The files section lists the files that replace sprites.
|
||||
; The file names are case sensitive.
|
||||
[files]
|
||||
; The file with the samples. Must contain exactly 73 samples.
|
||||
samples = SAMPLES.CAT
|
||||
|
||||
; The md5s section lists the MD5 checksum for the files that replace them.
|
||||
; Note that the list of files is case sensitive. Each file listed in the
|
||||
; files section must be listed here with it's MD5 checksum, otherwise you
|
||||
; will get a lot of warnings when starting OpenTTD.
|
||||
[md5s]
|
||||
SAMPLES.CAT = 422ea3dd074d2859bb51639a6e0e85da
|
||||
|
||||
; The origin section provides the possibility to put and extra line into
|
||||
; the warning that a file is missing/corrupt. This can be used to tell
|
||||
; them where to find it. It works on the filename specified in the
|
||||
; files section and if that is not found it will fall back to the default
|
||||
; as shown below here.
|
||||
[origin]
|
||||
default = You can find it on your Transport Tycoon Deluxe CD-ROM.
|
||||
SAMPLES.CAT = You can find it also on your Transport Tycoon Deluxe CD-ROM.
|
||||
153
docs/openttd.6
Normal file
153
docs/openttd.6
Normal file
@@ -0,0 +1,153 @@
|
||||
.\" Hey, EMACS: -*- nroff -*-
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.Dd October 13, 2014
|
||||
.Dt OPENTTD 6
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm openttd
|
||||
.Nd open source clone of the Microprose game \(lqTransport Tycoon Deluxe\(rq
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl efhx
|
||||
.Op Fl b Ar blitter
|
||||
.Op Fl c Ar config_file
|
||||
.Op Fl d Op Ar level | Ar cat Ns = Ns Ar lvl Ns Op , Ns Ar ...
|
||||
.Op Fl D Oo Ar host Oc Ns Op : Ns Ar port
|
||||
.Op Fl g Op Ar savegame
|
||||
.Op Fl G Ar seed
|
||||
.Op Fl I Ar graphicsset
|
||||
.Op Fl l Ar host Ns Op : Ns Ar port
|
||||
.Op Fl m Ar driver
|
||||
.Op Fl M Ar musicset
|
||||
.Op Fl n Ar host Ns Oo : Ns Ar port Oc Ns Op # Ns Ar player
|
||||
.Op Fl p Ar password
|
||||
.Op Fl P Ar password
|
||||
.Op Fl q Ar savegame
|
||||
.Op Fl r Ar width Ns x Ns Ar height
|
||||
.Op Fl s Ar driver
|
||||
.Op Fl S Ar soundset
|
||||
.Op Fl t Ar year
|
||||
.Op Fl v Ar driver
|
||||
.Sh OPTIONS
|
||||
.Bl -tag -width "-n host[:port][#player]"
|
||||
.It Fl b Ar blitter
|
||||
Select the blitter
|
||||
.Ar blitter ;
|
||||
see
|
||||
.Fl h
|
||||
for a full list.
|
||||
.It Fl c Ar config_file
|
||||
Use
|
||||
.Ar config_file
|
||||
instead of
|
||||
.Pa openttd.cfg .
|
||||
.It Fl d Ar [level]
|
||||
Set debug verbosity for all categories to
|
||||
.Ar level ,
|
||||
or 1 if omitted.
|
||||
.It Fl d Ar cat Ns = Ns Ar lvl Ns Op , Ns Ar ...
|
||||
Set debug verbosity to
|
||||
.Ar lvl
|
||||
for a specific category
|
||||
.Ar cat .
|
||||
.It Fl D Oo Ar host Oc Ns Op : Ns Ar port
|
||||
Start a dedicated server.
|
||||
.Pp
|
||||
Network debug level will be set to 6.
|
||||
If you want to change this, set
|
||||
.Fl d
|
||||
after setting
|
||||
.Fl D .
|
||||
.It Fl e
|
||||
Start in world editor mode.
|
||||
.It Fl f
|
||||
Fork into background (dedicated server only, see
|
||||
.Fl D ) .
|
||||
.It Fl g Op Ar savegame
|
||||
Load
|
||||
.Ar savegame
|
||||
at start or start a new game if omitted.
|
||||
.Ar savegame
|
||||
must be either an absolute path or one relative to the current path or one of
|
||||
the search paths.
|
||||
.It Fl G Ar seed
|
||||
Seed the pseudo random number generator with
|
||||
.Ar seed .
|
||||
.It Fl h
|
||||
Display a summary of all options and list all the available AIs, blitters,
|
||||
sound, music and video drivers, graphics sets and sound sets.
|
||||
.It Fl I Ar graphicsset
|
||||
Select the graphics set
|
||||
.Ar graphicsset ;
|
||||
see
|
||||
.Fl h
|
||||
for a full list.
|
||||
.It Fl l Ar host Ns Op : Ns Ar port
|
||||
Redirect
|
||||
.Fn DEBUG
|
||||
output; see
|
||||
.Fl D .
|
||||
.It Fl m Ar driver
|
||||
Select the music driver
|
||||
.Ar driver ;
|
||||
see
|
||||
.Fl h
|
||||
for a full list.
|
||||
.It Fl M Ar musicset
|
||||
Select the music set
|
||||
.Ar musicset ;
|
||||
see
|
||||
.Fl h
|
||||
for a full list.
|
||||
.It Fl n Ar host Ns Oo : Ns Ar port Oc Ns Op # Ns Ar player
|
||||
Join a network game, optionally specifying a port to connect to and player to
|
||||
play as.
|
||||
.It Fl p Ar password
|
||||
Password used to join server.
|
||||
Only useful with
|
||||
.Fl n .
|
||||
.It Fl P Ar password
|
||||
Password used to join company.
|
||||
Only useful with
|
||||
.Fl n .
|
||||
.It Fl q Ar savegame
|
||||
Write some information about the specified savegame and exit.
|
||||
.It Fl r Ar width Ns x Ns Ar height
|
||||
Set the resolution to
|
||||
.Ar width
|
||||
\(mu
|
||||
.Ar height
|
||||
pixels.
|
||||
.It Fl s Ar driver
|
||||
Select the sound driver
|
||||
.Ar driver ;
|
||||
see
|
||||
.Fl h
|
||||
for a full list.
|
||||
.It Fl S Ar soundset
|
||||
Select the sound set
|
||||
.Ar soundset ;
|
||||
see
|
||||
.Fl h
|
||||
for a full list.
|
||||
.It Fl t Ar year
|
||||
Set the starting year to
|
||||
.Ar year .
|
||||
.It Fl v Ar driver
|
||||
Select the video driver
|
||||
.Ar driver ;
|
||||
see
|
||||
.Fl h
|
||||
for a full list.
|
||||
.It Fl x
|
||||
Do not automatically save to config file on exit.
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Lk https://wiki.openttd.org "Wiki"
|
||||
(includes community maintained manual),
|
||||
.Lk https://forum.openttd.org "Forum",
|
||||
.Lk https://www.openttd.org "News"
|
||||
.Sh HISTORY
|
||||
Transport Tycoon Deluxe was written by Chris Sawyer and published by Microprose.
|
||||
.Nm
|
||||
is a free reimplementation.
|
||||
BIN
docs/ottd-colourtext-palette.png
Normal file
BIN
docs/ottd-colourtext-palette.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.1 KiB |
260
docs/palettes/openttd.gpl
Normal file
260
docs/palettes/openttd.gpl
Normal file
@@ -0,0 +1,260 @@
|
||||
GIMP Palette
|
||||
Name: openttd
|
||||
Columns: 16
|
||||
#
|
||||
0 0 255 unnamed
|
||||
238 0 238 unnamed
|
||||
239 0 239 unnamed
|
||||
240 0 240 unnamed
|
||||
241 0 241 unnamed
|
||||
242 0 242 unnamed
|
||||
243 0 243 unnamed
|
||||
244 0 244 unnamed
|
||||
245 0 245 unnamed
|
||||
246 0 246 unnamed
|
||||
168 168 168 unnamed
|
||||
184 184 184 unnamed
|
||||
200 200 200 unnamed
|
||||
216 216 216 unnamed
|
||||
232 232 232 unnamed
|
||||
252 252 252 unnamed
|
||||
52 60 72 unnamed
|
||||
68 76 92 unnamed
|
||||
88 96 112 unnamed
|
||||
108 116 132 unnamed
|
||||
132 140 152 unnamed
|
||||
156 160 172 unnamed
|
||||
176 184 196 unnamed
|
||||
204 208 220 unnamed
|
||||
48 44 4 unnamed
|
||||
64 60 12 unnamed
|
||||
80 76 20 unnamed
|
||||
96 92 28 unnamed
|
||||
120 120 64 unnamed
|
||||
148 148 100 unnamed
|
||||
176 176 132 unnamed
|
||||
204 204 168 unnamed
|
||||
100 100 100 unnamed
|
||||
116 116 116 unnamed
|
||||
104 80 44 unnamed
|
||||
124 104 72 unnamed
|
||||
152 132 92 unnamed
|
||||
184 160 120 unnamed
|
||||
212 188 148 unnamed
|
||||
244 220 176 unnamed
|
||||
132 132 132 unnamed
|
||||
88 4 16 unnamed
|
||||
112 16 32 unnamed
|
||||
136 32 52 unnamed
|
||||
160 56 76 unnamed
|
||||
188 84 108 unnamed
|
||||
204 104 124 unnamed
|
||||
220 132 144 unnamed
|
||||
236 156 164 unnamed
|
||||
252 188 192 unnamed
|
||||
252 208 0 unnamed
|
||||
252 232 60 unnamed
|
||||
252 252 128 unnamed
|
||||
76 40 0 unnamed
|
||||
96 60 8 unnamed
|
||||
116 88 28 unnamed
|
||||
136 116 56 unnamed
|
||||
156 136 80 unnamed
|
||||
176 156 108 unnamed
|
||||
196 180 136 unnamed
|
||||
68 24 0 unnamed
|
||||
96 44 4 unnamed
|
||||
128 68 8 unnamed
|
||||
156 96 16 unnamed
|
||||
184 120 24 unnamed
|
||||
212 156 32 unnamed
|
||||
232 184 16 unnamed
|
||||
252 212 0 unnamed
|
||||
252 248 128 unnamed
|
||||
252 252 192 unnamed
|
||||
32 4 0 unnamed
|
||||
64 20 8 unnamed
|
||||
84 28 16 unnamed
|
||||
108 44 28 unnamed
|
||||
128 56 40 unnamed
|
||||
148 72 56 unnamed
|
||||
168 92 76 unnamed
|
||||
184 108 88 unnamed
|
||||
196 128 108 unnamed
|
||||
212 148 128 unnamed
|
||||
8 52 0 unnamed
|
||||
16 64 0 unnamed
|
||||
32 80 4 unnamed
|
||||
48 96 4 unnamed
|
||||
64 112 12 unnamed
|
||||
84 132 20 unnamed
|
||||
104 148 28 unnamed
|
||||
128 168 44 unnamed
|
||||
64 64 64 unnamed
|
||||
44 68 32 unnamed
|
||||
60 88 48 unnamed
|
||||
80 104 60 unnamed
|
||||
104 124 76 unnamed
|
||||
128 148 92 unnamed
|
||||
152 176 108 unnamed
|
||||
180 204 124 unnamed
|
||||
16 52 24 unnamed
|
||||
32 72 44 unnamed
|
||||
56 96 72 unnamed
|
||||
76 116 88 unnamed
|
||||
96 136 108 unnamed
|
||||
120 164 136 unnamed
|
||||
152 192 168 unnamed
|
||||
184 220 200 unnamed
|
||||
32 24 0 unnamed
|
||||
56 28 0 unnamed
|
||||
80 80 80 unnamed
|
||||
88 52 12 unnamed
|
||||
104 64 24 unnamed
|
||||
124 84 44 unnamed
|
||||
140 108 64 unnamed
|
||||
160 128 88 unnamed
|
||||
76 40 16 unnamed
|
||||
96 52 24 unnamed
|
||||
116 68 40 unnamed
|
||||
136 84 56 unnamed
|
||||
164 96 64 unnamed
|
||||
184 112 80 unnamed
|
||||
204 128 96 unnamed
|
||||
212 148 112 unnamed
|
||||
224 168 128 unnamed
|
||||
236 188 148 unnamed
|
||||
80 28 4 unnamed
|
||||
100 40 20 unnamed
|
||||
120 56 40 unnamed
|
||||
140 76 64 unnamed
|
||||
160 100 96 unnamed
|
||||
184 136 136 unnamed
|
||||
36 40 68 unnamed
|
||||
48 52 84 unnamed
|
||||
64 64 100 unnamed
|
||||
80 80 116 unnamed
|
||||
100 100 136 unnamed
|
||||
132 132 164 unnamed
|
||||
172 172 192 unnamed
|
||||
212 212 224 unnamed
|
||||
48 48 48 unnamed
|
||||
64 44 144 unnamed
|
||||
88 64 172 unnamed
|
||||
104 76 196 unnamed
|
||||
120 88 224 unnamed
|
||||
140 104 252 unnamed
|
||||
160 136 252 unnamed
|
||||
188 168 252 unnamed
|
||||
0 24 108 unnamed
|
||||
0 36 132 unnamed
|
||||
0 52 160 unnamed
|
||||
0 72 184 unnamed
|
||||
0 96 212 unnamed
|
||||
24 120 220 unnamed
|
||||
56 144 232 unnamed
|
||||
88 168 240 unnamed
|
||||
128 196 252 unnamed
|
||||
188 224 252 unnamed
|
||||
16 64 96 unnamed
|
||||
24 80 108 unnamed
|
||||
40 96 120 unnamed
|
||||
52 112 132 unnamed
|
||||
80 140 160 unnamed
|
||||
116 172 192 unnamed
|
||||
156 204 220 unnamed
|
||||
204 240 252 unnamed
|
||||
172 52 52 unnamed
|
||||
212 52 52 unnamed
|
||||
252 52 52 unnamed
|
||||
252 100 88 unnamed
|
||||
252 144 124 unnamed
|
||||
252 184 160 unnamed
|
||||
252 216 200 unnamed
|
||||
252 244 236 unnamed
|
||||
72 20 112 unnamed
|
||||
92 44 140 unnamed
|
||||
112 68 168 unnamed
|
||||
140 100 196 unnamed
|
||||
168 136 224 unnamed
|
||||
200 176 248 unnamed
|
||||
208 184 255 unnamed
|
||||
232 208 252 unnamed
|
||||
60 0 0 unnamed
|
||||
92 0 0 unnamed
|
||||
128 0 0 unnamed
|
||||
160 0 0 unnamed
|
||||
196 0 0 unnamed
|
||||
224 0 0 unnamed
|
||||
252 0 0 unnamed
|
||||
252 80 0 unnamed
|
||||
252 108 0 unnamed
|
||||
252 136 0 unnamed
|
||||
252 164 0 unnamed
|
||||
252 192 0 unnamed
|
||||
252 220 0 unnamed
|
||||
252 252 0 unnamed
|
||||
204 136 8 unnamed
|
||||
228 144 4 unnamed
|
||||
252 156 0 unnamed
|
||||
252 176 48 unnamed
|
||||
252 196 100 unnamed
|
||||
252 216 152 unnamed
|
||||
8 24 88 unnamed
|
||||
12 36 104 unnamed
|
||||
20 52 124 unnamed
|
||||
28 68 140 unnamed
|
||||
40 92 164 unnamed
|
||||
56 120 188 unnamed
|
||||
72 152 216 unnamed
|
||||
100 172 224 unnamed
|
||||
92 156 52 unnamed
|
||||
108 176 64 unnamed
|
||||
124 200 76 unnamed
|
||||
144 224 92 unnamed
|
||||
224 244 252 unnamed
|
||||
200 236 248 unnamed
|
||||
180 220 236 unnamed
|
||||
132 188 216 unnamed
|
||||
88 152 172 unnamed
|
||||
16 16 16 unnamed
|
||||
32 32 32 unnamed
|
||||
32 68 112 unnamed
|
||||
36 72 116 unnamed
|
||||
40 76 120 unnamed
|
||||
44 80 124 unnamed
|
||||
48 84 128 unnamed
|
||||
72 100 144 unnamed
|
||||
100 132 168 unnamed
|
||||
216 244 252 unnamed
|
||||
96 128 164 unnamed
|
||||
68 96 140 unnamed
|
||||
76 24 8 unnamed
|
||||
108 44 24 unnamed
|
||||
144 72 52 unnamed
|
||||
176 108 84 unnamed
|
||||
210 146 126 unnamed
|
||||
252 60 0 unnamed
|
||||
252 84 0 unnamed
|
||||
252 104 0 unnamed
|
||||
252 124 0 unnamed
|
||||
252 148 0 unnamed
|
||||
252 172 0 unnamed
|
||||
252 196 0 unnamed
|
||||
64 0 0 unnamed
|
||||
255 0 0 unnamed
|
||||
48 48 0 unnamed
|
||||
64 64 0 unnamed
|
||||
80 80 0 unnamed
|
||||
255 255 0 unnamed
|
||||
148 148 148 unnamed
|
||||
247 0 247 unnamed
|
||||
248 0 248 unnamed
|
||||
249 0 249 unnamed
|
||||
250 0 250 unnamed
|
||||
251 0 251 unnamed
|
||||
252 0 252 unnamed
|
||||
253 0 253 unnamed
|
||||
254 0 254 unnamed
|
||||
255 0 255 unnamed
|
||||
255 255 255 unnamed
|
||||
BIN
docs/palettes/palette.act
Normal file
BIN
docs/palettes/palette.act
Normal file
Binary file not shown.
BIN
docs/tileh.png
Normal file
BIN
docs/tileh.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
Reference in New Issue
Block a user