Compare commits

..

281 Commits

Author SHA1 Message Date
Charles Pigott
f30f4b6892 Doc: 1.11.0-beta2 changelog 2021-02-28 18:49:21 +00:00
Patric Stout
c3dc27e37e Add: settings to limit your fast-forward game speed
By default this setting is set to 2500% normal game speed.
2021-02-28 18:04:51 +00:00
dP
73fd634209 Fix #6266: Ugly lists in network lobby windows on double/quad interface sizes with custom fonts 2021-02-28 17:43:30 +00:00
Patric Stout
2d9062bfc1 Fix: [Network] don't desync if client leaves before you finish downloading map
When you are downloading a map, all the commands are queued up
for you. Clients joining/leaving is done by the network protocol,
and as such are processed immediately. This means that by the
time you are processing the commands, a client that triggered
it, might already have left.

So, all commands that do something with ClientID, shouldn't
error on an invalid ClientID when DC_EXEC is set, but
gracefully handle the command anyway, to make sure the
game-state is kept in sync with all the clients that did
execute the DoCommand while the now-gone client was still
there.

Additionally, in the small chance a client disconnects between
the server validating a DoCommand and the command being
executed, also just process the command as if the client was
still there. Otherwise, lag or latency can cause clients that
did not receive the disconnect yet to desync.
2021-02-28 12:27:04 +01:00
Patric Stout
13889b6554 Fix: [Network] don't show "server doesn't respond" while in queue
Send all clients in the queue every game-day a packet that they
are still in the queue.
2021-02-28 12:27:04 +01:00
Patric Stout
8d199b1bbc Fix: [Network] send map to next client if current client disconnects
Also terminate creating of the savegame, as the client is gone,
there really is no need for that anymore.
2021-02-28 12:27:04 +01:00
Patric Stout
3677418225 Fix: [Network] also count the person downloading the map in the queue
Strictly seen, there are "N" people -waiting- in front of you
in the queue, but it is nicer to show "N + 1" for the person that
is currently downloading the map. Avoids it showing:
"0 clients in front of you". That just feels a bit off.
2021-02-28 12:27:04 +01:00
Charles Pigott
6b8f9b50b9 Fix: Vehicle list windows did not update when this year's profit changed
Remove caching from vehicle group object. and recalculate it whenever
required instead.
2021-02-28 11:24:09 +00:00
Michael Lutz
d79398a1d5 Fix #8763: [OpenGL] Cursor sprite origin can be negative. 2021-02-28 11:12:13 +01:00
Pavel Stupnikov
4fd2eecb8b Change: Improve console warnings on invalid network commands (#8753) 2021-02-27 20:26:51 +01:00
translators
cd756e6f01 Update: Translations from eints
swedish: 60 changes by kustridaren
norwegian (bokmal): 12 changes by buzzCraft
czech: 82 changes by PatrikSamuelTauchim, 1 change by tomas-vl
italian: 86 changes by AlphaJack, 9 changes by federico1564S
german: 16 changes by ebla71
romanian: 10 changes by ALEX11BR
ukrainian: 3 changes by StepanIvasyn
spanish: 1 change by MontyMontana
2021-02-27 19:01:06 +00:00
Michael Lutz
77854d561b Fix: [OpenGL] Don't use OpenGL on MESA software renderers.
Performance in this case is worse than not using OpenGL, so just let
OTTD fall back to a different video driver.
2021-02-27 19:01:34 +01:00
Patric Stout
1b5d1d074e Fix: [SDL2] set GL attributes to get the best GL context possible (#8759) 2021-02-27 18:51:20 +01:00
frosch
dfa141818b Fix: OpenGL cursor did not consider sprite offsets of cursor sprites. 2021-02-27 14:52:11 +01:00
frosch
d236c57600 Fix: yet another place where the vehicle-cursor did not account for the interface zoom level. 2021-02-27 14:52:11 +01:00
Michael Lutz
ef4cec9382 Fix #8750: [OpenGL] Line drawing did not set proper RGB/mask colours. 2021-02-27 13:09:38 +01:00
glx22
54fb4c04e3 Fix: [CMake] libpng header/library mismatch for macos 2021-02-27 02:23:33 +01:00
Patric Stout
fe451b8dc7 Codechange: remove _realtime_tick variable 2021-02-27 00:36:14 +01:00
Patric Stout
853bfc3562 Codechange: replace _realtime_tick with std::chrono for mouse events 2021-02-27 00:36:14 +01:00
Patric Stout
53c28a8ec9 Codechange: [Network] replace _realtime_tick with std::chrono 2021-02-27 00:36:14 +01:00
Patric Stout
dc7ba33b51 Fix: don't link to OpenGL with SDL2 as backend; SDL2 dynamically loads it (#8745)
Although for developers this doesn't change anything, for our
linux-generic binary it changes everything. Without this, the
OpenGL dynamic library is dragged in as dependency, and as it
depends on X11, that will be dragged in too. This is not
something we prefer to have, as that won't run on as many
machines as it could.

SDL2 doesn't depend on OpenGL directly, as it tries to load it
in on runtime. If found, it would work in exactly the same way
as if we would link to OpenGL ourselves. As such, this is
the best of both worlds: our linux-generics have less linked
dependencies, and developers won't notice any difference.

As a side-effect, if someone uses linux-generic on a machine
that does not have any OpenGL package installed, it will
gracefully fall back to the default backend of SDL instead.
2021-02-27 00:34:41 +01:00
Patric Stout
d068d61f3c Fix bddfcaef: don't tell twice that a client left because of a timeout etc (#8746)
SendError() notifies all clients of the disconnect. This calls
CloseConnection() at the end, which also notified the clients
of the disconnect. Really no need to do it twice.

The status NETWORK_RECV_STATUS_SERVER_ERROR is only set by
SendError(), so in case that is the status, don't let
ClientConnection() send another notification.
2021-02-27 00:32:51 +01:00
translators
af326753a9 Update: Translations from eints
swedish: 1 change by kustridaren
english (us): 15 changes by 2TallTyler
catalan: 1 change by J0anJosep
dutch: 1 change by Afoklala
2021-02-26 19:01:33 +00:00
Michael Lutz
3cbbaa62db Change: Never auto-select an 8bpp blitter unless explicitly allowed by the 'support8bpp' setting. 2021-02-26 19:26:52 +01:00
Patric Stout
9a3dbf3122 Fix 02e770ff: allow estimating CloneVehicle if short on money (#8748)
CheckCompanyHasMoney() was also executed when not using DC_EXEC,
resulting in an error about shortage of money instead of the
estimation.
This mostly is a problem for AI players, as they will have no
way to know how much it would have cost.
2021-02-26 16:22:58 +01:00
Patric Stout
d4583fa64c Fix #8123: trams on half-tiles couldn't find depots (#8738)
Basically, follow_track.hpp contains a fix for half-tiles, but
this wasn't duplicated for when trying to find a depot and in
a few other places. This makes sure all places act the same.
2021-02-25 22:46:46 +01:00
translators
9209807d66 Update: Translations from eints
swedish: 19 changes by kustridaren
german: 1 change by Wuzzy2
slovak: 3 changes by FuryPapaya
2021-02-25 19:01:49 +00:00
Michael Lutz
311df31fb1 Codechange: [OpenGL] Load all OpenGL functions dynamically. 2021-02-25 00:34:49 +01:00
Michael Lutz
a0c1a3f736 Codechange: [OpenGL] Simplify loading OpenGL extension functions. 2021-02-25 00:34:49 +01:00
Michael Lutz
e1e8cc3851 Fix #8734: [OpenGL] Apply palette remap to cursor sprites. (#8742) 2021-02-24 22:10:25 +01:00
Patric Stout
6a8c461e38 Codechange: [OSX] GameLoop is really more like MainLoop
MainLoop() is used to bootstrap OSX, where later a callback is
done to GameLoop() to execute OpenTTD. All other video drivers
don't need that, so what is in GameLoop is in MainLoop for all
other drivers. This is rather confusing. So, instead, name
GameLoop MainLoopReal to be more in sync with the other drivers.
2021-02-24 21:58:47 +01:00
Patric Stout
67d3c6aa71 Codechange: [Video] move InteractiveRandom() to the VideoDriver 2021-02-24 21:58:47 +01:00
Patric Stout
c409f45ddd Codechange: [Video] make the prototype of PollEvent() the same for all drivers
Additionally, call it from the draw-tick.
2021-02-24 21:58:47 +01:00
glx22
70e4845915 Change: [Actions] Use only CMake, CTest and CPack 2021-02-24 17:54:24 +01:00
glx22
90adac8f09 Change: [Actions] stop using 'run-vcpkg' action for Release 2021-02-24 17:54:24 +01:00
glx22
58640824d1 Change: [Actions] stop using 'run-cmake' action for Release 2021-02-24 17:54:24 +01:00
glx22
2fd2950eb5 Change: [Actions] stop using 'run-vcpkg' action for CI 2021-02-24 17:54:24 +01:00
glx22
30ae019095 Change: [Actions] stop using 'run-cmake' action for CI 2021-02-24 17:54:24 +01:00
Tyler Trahan
8476f12432 Change: Improve graph period markings (#8732) 2021-02-24 09:18:15 +01:00
frosch
79c2b81ffd Fix: vehicle-cursor size-limit did not account for the interface zoom level. 2021-02-24 08:00:42 +00:00
Michael Lutz
46e13313e4 Fix #8731: Always use a 32bpp blitter if font anti-aliasing is enabled. 2021-02-23 22:15:03 +01:00
translators
c93c9c099e Update: Translations from eints
estonian: 7 changes by siimsoni
polish: 2 changes by yazalo
2021-02-23 18:59:47 +00:00
Niels Martin Hansen
cc465efa67 Change: [Win32] Use more modern way of getting free disk space 2021-02-23 11:25:39 +01:00
Niels Martin Hansen
b427ddce88 Codechange: Switch to explicit wide strings 2021-02-23 11:25:39 +01:00
Niels Martin Hansen
beeb9e0a1b Remove: [Win32] Last pretenses of being able to build for Windows 95 2021-02-23 11:25:39 +01:00
Niels Martin Hansen
4bc69fec62 Doc: Remove #5661 from known-bugs, fixed in 1.10 2021-02-22 23:25:16 +00:00
glx22
b67245d71e Fix: [CMake] CMake may use || at the end of custom commands 2021-02-22 23:17:45 +01:00
glx22
ec9d1a6b8f Fix: [CMake] CMAKE_SOURCE_DIR may contain regex commands 2021-02-22 23:17:45 +01:00
Michael Lutz
06ca147a82 Fix 8706c36f: Change RELEASE code, too. 2021-02-22 23:16:46 +01:00
Michael Lutz
7af1fd3ffb Add: [OSX] OpenGL video driver. 2021-02-22 22:16:07 +01:00
Michael Lutz
b4a3bc1ffe Codechange: [OpenGL] Separate context state setup from general init. 2021-02-22 22:16:07 +01:00
Michael Lutz
7f55f0a264 Codechange: [OSX] Add support for (un)locking the video buffer. 2021-02-22 22:16:07 +01:00
Michael Lutz
2f25e9bdf8 Codechange: [OSX] Separate video driver into a base and a Quartz implementation. 2021-02-22 22:16:07 +01:00
Michael Lutz
421b599541 Codechange: [SDL2] Split driver in base-part and default backend 2021-02-22 22:16:07 +01:00
Patric Stout
a303940372 Feature: [SDL2] OpenGL support 2021-02-22 22:16:07 +01:00
Michael Lutz
a77b202767 Codechange: [SDL] Move dirty_rect to class scope. 2021-02-22 22:16:07 +01:00
Patric Stout
e75858ce5e Codechange: [SDL2] Allow several places to hook into the SDL driver
This allows future subdrivers to use these to manage their
own flow.
2021-02-22 22:16:07 +01:00
Patric Stout
101e394475 Codechange: [SDL2] Move functions and variables to class-scope
This allows future subdrivers to override them.
2021-02-22 22:16:07 +01:00
Patric Stout
0d58bc9384 Codechange: [SDL2] Move SDLSurface code to its own function
This increases readability, and allow future subdrivers to not
use SDLSurface to draw.
2021-02-22 22:16:07 +01:00
Patric Stout
6098811b49 Codechange: [SDL2] Split Start() in a few more functions
This makes it a bit easier to follow what is going on, and
allow future subdrivers to hook into a few of these functions.

Reworked the code slighly while at it, to return early where
possible.
2021-02-22 22:16:07 +01:00
Michael Lutz
86c309ea75 Codechange: [OpenGL] Let OpenGL clear the pixel buffer if possible. 2021-02-22 22:16:07 +01:00
Michael Lutz
94d8acb7d0 Add: A 32 bpp blitter that uses the animation buffer from the video backend to speed up palette animation. 2021-02-22 22:16:07 +01:00
Michael Lutz
ae7c63cc35 Codechange: [OpenGL] Use persistently mapped pixel buffers when supported. 2021-02-22 22:16:07 +01:00
Michael Lutz
200be7d20c Add: [OpenGL] Support for a separate animation buffer that stores the palette values of the screen in addition to the colour buffer. 2021-02-22 22:16:07 +01:00
Michael Lutz
01ef44fa4f Codechange: Allow blitter factories to decide at runtime if the blitter is usable. 2021-02-22 22:16:07 +01:00
Michael Lutz
d62e302768 Change: [Win32] Prioritize the OpenGL video driver over the GDI one. 2021-02-22 22:16:07 +01:00
Michael Lutz
6bcc4884c2 Add: [OpenGL] Accelerated mouse cursor drawing. 2021-02-22 22:16:07 +01:00
Michael Lutz
d4dbb3f46e Fix: Don't trash video buffer alpha in SSE3/4 blitters. 2021-02-22 22:16:07 +01:00
Michael Lutz
bcd15b4dd2 Codechange: [OpenGL] Initialize backing store to opaque alpha to allow blending effects. 2021-02-22 22:16:07 +01:00
Michael Lutz
1e1a9f3999 Add: A simple, templated cache map that uses a least recently used eviction strategy. 2021-02-22 22:16:07 +01:00
Michael Lutz
3e49aff35c Codechange: Allow video drivers to handle the cursor themselves. 2021-02-22 22:16:07 +01:00
Michael Lutz
6776229047 Codechange: Make the simple Malloc sprite allocator globally usable. 2021-02-22 22:16:07 +01:00
Michael Lutz
70aa3b4011 Codechange: Give sprite encoders a hint which colour components of a sprite are filled with useful information. 2021-02-22 22:16:07 +01:00
Michael Lutz
e7e5316340 Add: Allow sprite encoders (blitters) to specify an alignment for sprite width and height. 2021-02-22 22:16:07 +01:00
Michael Lutz
02e8741457 Codechange: Allow for using a sprite encoder that is not the currently active blitter when loading a sprite. 2021-02-22 22:16:07 +01:00
Michael Lutz
f94b2e73e1 Codechange: [Win32] Use an OpenGL core context instead of a compatibility one. 2021-02-22 22:16:07 +01:00
Michael Lutz
e8fc050b6e Add: [OpenGL] Support for 8bpp blitters. 2021-02-22 22:16:07 +01:00
Michael Lutz
320072c8dc Codechange: [OpenGL] Explicitly assign which framebuffer target receives the colour values. 2021-02-22 22:16:07 +01:00
Michael Lutz
821f30f735 Codechange: [OpenGL] Use GLSL version 1.50 if available. 2021-02-22 22:16:07 +01:00
Michael Lutz
90fd8f8cda Codechange: [OpenGL] Use generic vertex attributes in the shader program. 2021-02-22 22:16:07 +01:00
Michael Lutz
acf59f6b68 Codechange: [OpenGL] Use shaders to display the video buffer on screen. 2021-02-22 22:16:07 +01:00
Michael Lutz
b181859629 Change: [Win32] Disable VSync for OpenGL by default. 2021-02-22 22:16:07 +01:00
Michael Lutz
9a069faa01 Codechange: [Win32] Try to get an OpenGL 3.2+ context if possible. 2021-02-22 22:16:07 +01:00
Michael Lutz
a990c497b5 Codechange: [OpenGL] Use a pixel buffer object to store the video buffer. 2021-02-22 22:16:07 +01:00
Michael Lutz
5af0cfd902 Codechange: [OpenGL] Use a vertex array object to store the vertex state for the video buffer. 2021-02-22 22:16:07 +01:00
Michael Lutz
acf2ce35f7 Codechange: [OpenGL] Use a vertex buffer object to store the vertex data for the video buffer. 2021-02-22 22:16:07 +01:00
Michael Lutz
8706c36fc0 Codechange: [Win32] Move remaing global _wnd variables into the video driver. 2021-02-22 22:16:07 +01:00
Michael Lutz
d6b6775888 Change: Lock the video buffer when drawing inside the game loop to properly account for threaded drawing. 2021-02-22 22:16:07 +01:00
Michael Lutz
73ed748deb Codechange: [Win32] Move the global video buffer pointer into the driver class. 2021-02-22 22:16:07 +01:00
Michael Lutz
5ad545dcc1 Codechange: [OpenGL] Only update the dirty parts of the video buffer texture. 2021-02-22 22:16:07 +01:00
Michael Lutz
3a77ade6b2 Codechange: [OpenGL] Enable driver debug messages if supported. 2021-02-22 22:16:07 +01:00
Michael Lutz
d7b96a424f Codechange: [OpenGL] Use new-style extension testing introduced with OpenGL 3.0. 2021-02-22 22:16:07 +01:00
Michael Lutz
ef478ade64 Add: [Win32] Video driver that uses OpenGL to transfer the video buffer to the screen. 2021-02-22 22:16:07 +01:00
Michael Lutz
af4d32357c Codechange: [Win32] Move common initialization and finalization to the video driver base class. 2021-02-22 22:16:07 +01:00
Michael Lutz
78b8fc3e4f Codechange: [Win32] Move GDI-specific variables and related functions into the GDI video driver class. 2021-02-22 22:16:07 +01:00
Michael Lutz
8b90d4abe0 Codechange: [Win32] Move GDI specific drawing code into the GDI video driver class. 2021-02-22 22:16:07 +01:00
Michael Lutz
59e0d9618b Codechange: [Win32] Split the video driver into a base class and a GDI backend class. 2021-02-22 22:16:07 +01:00
Patric Stout
78d96dad2a Fix #6319: [Win32] don't use clipping; draw whole screen every frame (#8726)
When we clip the region that is only been redrawn, something
weird happens on Windows. When pushing 60 frames per second on a
60Hz monitor, it appears that the clipped region is often shown
of another frame, instead of the current.

Examples of this are:
- pause the game, move your mouse to the left, and at the right
  speed it totally disappears.
- fast aircrafts seem to be in several places at once, weirdly
  lagging behind.
- in title screen, moving your mouse gives you the idea it is
  jumping places, instead of smooth movements.

In the end, if you do nothing, everything is correct, so it is
eventually consistent. Just when we are firing many BitBlt in
a clipped region, the in-between is not.

What goes wrong exactly, I honestly do not know. On every frame
that we push to the DC is a mouse painted, but visually it
sometimes appears like it is not. Recording with external software
shows it really is there.
It is also not our eyes playing tricks on us, as the first example
makes it really clear the mouse pointer really is not painted.

And to be clear, with the mouse this is easiest reproduceable,
as high-speed objects are influences by this most. But this happens
for all movement that redraws small regions.

Either way, not using clipped regions resolves the issue completely,
and there appears to be little to no penalty (I failed to measure
any impact of drawing the full screen). So better have a good game
than fast code, I guess?
2021-02-22 21:17:55 +01:00
translators
c136dd2b32 Update: Translations from eints
english (us): 78 changes by 2TallTyler
polish: 1 change by yazalo
2021-02-22 19:01:17 +00:00
Charles Pigott
6af49b7885 Fix #8724: Got wrong DepotID/StationID for airports, causing crash 2021-02-22 14:20:21 +00:00
Charles Pigott
80fb1c74f0 Change: Make pathfinder account for maximum order speed, if set 2021-02-22 00:25:47 +00:00
milek7
b749d6f1cb Fix: Allow building with Allegro and without SDL on Linux 2021-02-21 23:05:50 +00:00
translators
e74069e4c2 Update: Translations from eints
estonian: 19 changes by siimsoni
french: 3 changes by glx22
2021-02-21 19:00:19 +00:00
Charles Pigott
8157af6d68 Fix #8276: Crash when a NewGRF object's size was not set 2021-02-21 18:16:09 +00:00
Charles Pigott
3af407340e Fix #8349: Close depot vehicle list windows when closing the depot window 2021-02-21 17:58:19 +00:00
Patric Stout
88959f5595 Codechange: [OSX] remove final bits of old debugging code (#8714) 2021-02-21 15:58:26 +01:00
Charles Pigott
1d6a0c7b52 Fix: [YAPF] Road pathfinder did not account for length of tunnel/bridge in path cost
Copy calculations from the rail pathfinder
2021-02-21 10:53:25 +00:00
Charles Pigott
c461999b2b Fix #8594: [NRT] Road pathfinder did not account for roadtype speed limits 2021-02-21 10:53:25 +00:00
Patric Stout
e1b1608dc6 Fix ec1dd0bf: missing override causing compiler warnings (#8708) 2021-02-20 22:14:26 +01:00
Michael Lutz
d16dc22fdf Codechange: Use C++-ism for zeroing. 2021-02-20 21:14:44 +01:00
Michael Lutz
5ca979b1e2 Fix: [OSX] Don't wait on the event loop for drawing. 2021-02-20 21:14:44 +01:00
Michael Lutz
f3c192c63d Codechange: [OSX] Only keep a total dirty rect for drawing.
When drawing an 8bpp screen buffer, palette resolving was done for each
dirty rectangle. In areas with high activity, this would mean a pixel might
have been resolved multiple times. Also, if too many individual updates
were queued, the whole screen would be refreshed, even if unnecessary.

All other drivers only keep one overall dirty rect, so do it here as well.
2021-02-20 21:14:44 +01:00
translators
61275df7da Update: Translations from eints
estonian: 62 changes by siimsoni
korean: 1 change by telk5093
russian: 2 changes by Ln-Wolf
finnish: 2 changes by hpiirai
2021-02-20 19:00:44 +00:00
frosch
d9b4413bc9 Codechange: rename sound ids to make more sense. (#8701) 2021-02-20 19:01:04 +01:00
SamuXarick
cb95b1d2e7 Codechange: Apply coding style 2021-02-20 17:59:04 +00:00
Patric Stout
058f13bdf9 Remove: [SDL] SDL 1.3 never happened, so remove all the special code for it 2021-02-20 17:08:44 +01:00
Patric Stout
0e76d965f1 Codechange: deduplicate tick-handlers of all video drivers
They were all identical, so better put this in a single place
hoping it is less likely to break.
2021-02-20 17:08:44 +01:00
Patric Stout
7996fadb91 Change: [Win32] Remove force_full_redraw and display_hz settings
These were special settings only for the win32-drivers, and
introduced in the very first version we track.

Time kinda had caught up with those variables, so it is time to
say farewell.

force_full_redraw was most likely a debug functionality "in case
our dirty-rect fails". This should no longer be needed.

display_hz was cute, as it had a max of 120. That is kinda
out-dated information, but I also doubt anyone was really using
this.
2021-02-20 17:08:44 +01:00
Patric Stout
23d6f4eac9 Codechange: [Win32] simplify when/where GdiFlush() is called 2021-02-20 17:08:44 +01:00
Patric Stout
ec1dd0bf61 Codechange: be consistent in what CheckPaletteAnim() does and when it is called
Additionally, make sure this is a class method. Later commits
will make use of this.
2021-02-20 17:08:44 +01:00
Patric Stout
790fa7102e Codechange: be consistent in naming the paint function Paint()
Also move this function to be a class member. This to allow
further deduplicating of code in a later commit.
2021-02-20 17:08:44 +01:00
Patric Stout
761efbb457 Codechange: use (Un)LockVideoBuffer() to manage video buffer 2021-02-20 17:08:44 +01:00
Patric Stout
661eb39ecc Codechange: move all input-handling of video-drivers into InputLoop 2021-02-20 17:08:44 +01:00
Patric Stout
38b4ae1c0e Codechange: [Win32] make fast-forward check the same as with other drivers
It was of all the drivers the only one doing this slightly different.
When trying to unify more code, that was rather annoying.
2021-02-20 17:08:44 +01:00
Joe Stringer
d21442941c Fix: [Cygwin] Fix missing uint definition
In file included from src/settingsgen/../string_func.h:30,
                 from src/settingsgen/settingsgen.cpp:11:
src/settingsgen/../core/bitmath_func.hpp:34:15: error: 'uint' does not name a type; did you mean 'uint8'?
   34 | static inline uint GB(const T x, const uint8 s, const uint8 n)
      |               ^~~~
      |               uint8
2021-02-20 14:54:57 +00:00
Patric Stout
08821f82b6 Fix: [Win32] run InteractiveRandom() once every tick, not once every message
Win32 was the only video driver doing this. It is just a bit too
much random.
2021-02-20 14:25:56 +01:00
Patric Stout
19fdbac287 Fix: [Win32] now we are drawing on a tick, no longer use WM_PAINT
WM_PAINT hits when-ever Windows feels like, but always after we
marked the screen as dirty. In result, it was lagging behind,
giving a sub-60fps experience.

With the new draw-tick there is no longer a need to be driven by
WM_PAINT, so it is better anyway to drive the drawing ourself. As
an added bonus this makes the win32 driver more like the others.
2021-02-20 14:25:56 +01:00
translators
5fc983a1bb Update: Translations from eints
german: 1 change by Wuzzy2
russian: 11 changes by Ln-Wolf
catalan: 2 changes by J0anJosep
spanish: 14 changes by perezdidac
2021-02-19 19:01:10 +00:00
Patric Stout
b124c49ea4 Fix: [Actions] Also run CI against libsdl1.2 for every pull request 2021-02-19 19:56:40 +01:00
Patric Stout
8bf8c0f251 Fix d437445c: also use std::chrono for the GRFFileScanner modal window
For some reason I only converted one of the two modal windows we
have, and completely forgot the other.

While at it, synchronize the way those two modal windows work
in terms of "next_update".
2021-02-19 19:56:40 +01:00
Patric Stout
cb8e1706b2 Fix: [Actions] if SDL2 is installed, it is always picked over SDL1
So no need to install both SDL1 and SDL2, that gives a false idea
of reality.
2021-02-19 11:34:00 +01:00
Patric Stout
d3df4674f9 Fix: [Actions] build our allegro driver too in our CI
This prevents us breaking it without realising.
2021-02-19 11:34:00 +01:00
Patric Stout
932abe6d5c Fix fa170b9: [SDL2] forgot to use GetGameInterval where needed 2021-02-19 11:34:00 +01:00
Patric Stout
15a0ac2735 Fix cd4f0f95: [Allegro] driver failed to build because of missing include 2021-02-19 11:34:00 +01:00
Patric Stout
c4df0f95ae Fix: during switching of game-mode, drawing could show closed windows that shouldn't be closed yet
The higher your refresh-rate, the more likely this is. Mostly you
notice this when creating a new game or when abandoning a game.

This is a bit of a hack to keep the old behaviour, as before this
patch the game was already freezing your mouse while it was changing
game-mode, and it does this too after this patch. Just now it
freezes too a few frames earlier, to prevent not drawing windows
people still expect to see.
2021-02-19 10:43:15 +01:00
Patric Stout
fa170b9ace Feature: configurable refresh-rate and change default to 60fps
Most modern games run on 60 fps, and for good reason. This gives
a much smoother experiences.

As some people have monitors that can do 144Hz or even 240Hz, allow
people to configure the refresh rate. Of course, the higher you
set the value, the more time the game spends on drawing pixels
instead of simulating the game, which has an effect on simulation
speed.

The simulation will still always run at 33.33 fps, and is not
influences by this setting.
2021-02-19 10:43:15 +01:00
Patric Stout
eb9b1ad68d Change: sleep till the next tick in the main loop
Sleep for 1ms (which is always (a lot) more than 1ms) is just
randomly guessing and hoping you hit your deadline, give or take.

But given we can calculate when our next frame is happening, we
can just sleep for that exact amount. As these values are often
a bit larger, it is also more likely the OS can schedule us back
in close to our requested target. This means it is more likely we
hit our deadlines, which makes the FPS a lot more stable.
2021-02-19 10:43:15 +01:00
Patric Stout
ae7a2b9f02 Change: allow video-drivers to miss deadlines slightly
Before, every next frame was calculated from the current time.
If for some reason the current frame was drifting a bit, the
next would too, and the next more, etc etc. This meant we rarely
hit the targets we would like, like 33.33fps.

Instead, allow video-drivers to drift slightly, and schedule the
next frame based on the time the last should have happened. Only
if the drift gets too much, that deadlines are missed for longer
period of times, schedule the next frame based on the current
time.

This makes the FPS a lot smoother, as sleeps aren't as exact as
you might think.
2021-02-19 10:43:15 +01:00
Patric Stout
c81c6e5eb7 Add: draw the screen at a steady pace, also during fast-forward
During fast-forward, the game was drawing as fast as it could. This
means that the fast-forward was limited also by how fast we could
draw, something that people in general don't expect.

To give an extreme case, if you are fully zoomed out on a busy
map, fast-forward would be mostly limited because of the time it
takes to draw the screen.

By decoupling the draw-tick and game-tick, we can keep the pace
of the draw-tick the same while speeding up the game-tick. To use
the extreme case as example again, if you are fully zoomed out
now, the screen only redraws 33.33 times per second, fast-forwarding
or not. This means fast-forward is much more likely to go at the
same speed, no matter what you are looking at.
2021-02-19 10:43:15 +01:00
Patric Stout
5bfa014505 Codechange: track _realtime_tick more accurate
_realtime_tick was reset every time the diff was calculated. This
means if it would trigger, say, every N.9 milliseconds, it would
after two iterations already drift a millisecond. This adds up
pretty quick.
2021-02-19 10:43:15 +01:00
Patric Stout
25f6851ca1 Codechange: switch all video drivers to std::chrono for keeping time
On all OSes we tested the std::chrono::steady_clock is of a high
enough resolution to do millisecond measurements, which is all we
need.

By accident, this fixes a Win32 driver bug, where we would never
hit our targets, as the resolution of the clock was too low to
do accurate millisecond measurements with (it was ~16ms resolution
instead).
2021-02-19 10:43:15 +01:00
Patric Stout
d437445c67 Codechange: use std::chrono to track time in modal windows
Adding to _realtime_ticks in a random place is a bit of a hack,
and by using modern C++, we can avoid this hack.
2021-02-19 10:43:15 +01:00
Tegas Aziz
1f6fb8c290 Add: Indonesia Rupiah as in-game currency (#8616)
The exchange rate is actually more like 19,000, but OpenTTD
doesn't handle such high exchange rates kindly.
2021-02-19 10:27:41 +01:00
Didac Perez Parera
96990b2ea7 Feature: Object class selection string filtering (#8603) 2021-02-19 10:26:54 +01:00
SamuXarick
7577dfa575 Codechange: Apply coding style 2021-02-19 00:14:30 +00:00
translators
259c04f41c Update: Translations from eints
russian: 1 change by Ln-Wolf
polish: 2 changes by yazalo
2021-02-18 19:01:52 +00:00
Tyler Trahan
fa88cb62e1 Fix cc39fa9: New orders are non-stop by default (#8689) 2021-02-18 18:42:28 +01:00
Jonathan G Rennison
15b99f2e7a Fix: Whole status bar instead of money widget refreshed on money change (#8692)
This could result in the rest of the status bar being
redrawn unnecessarily frequently
2021-02-18 12:29:30 +01:00
Jonathan G Rennison
55ed7d16f7 Fix: Unnecessary status bar redraws when there is no news to show (#8691)
InvalidateWindowData with mode SBI_NEWS_DELETED was called on the
status bar when checking for a new item of news to be shown in the
ticker, even if there is no news queued and no change occurs.
2021-02-18 12:17:51 +01:00
Jonathan G Rennison
e059a88533 Fix: Autorenew failure advice due to bad refit being shown to all companies (#8681) 2021-02-18 10:50:33 +01:00
Tyler Trahan
d5e18feed9 Change: Darken graph grid lines for legibility (#8690) 2021-02-18 10:15:58 +01:00
Wuzzy
27b4d6390b Change: "(Business/Chair)man" to "...person" (#8659) 2021-02-17 21:34:31 +01:00
Patric Stout
8e0d48a0f6 Fix: [SDL2] simplify what to redraw to prevent tearing (#8685)
When there are a lot of rects to redraw, of which one of the last
ones is almost the full screen, visual tearing happens over the
vertical axis. This is most visible when scrolling the map.

This can be prevented by using less rects. To simplify the situation,
and as solutions like OpenGL need this anyway, keep a single rect
that shows the biggest size that updates everything correctly.

Although this means it needs a bit more time redrawing where it
is strictly seen not needed, it also means less commands have
to be executed in the backend. In the end, this is a trade-off,
and from experiments it seems the approach of this commit gives
a better result.
2021-02-17 21:19:32 +01:00
Michael Lutz
8bd2349ab6 Fix #8676, a2c3197f: GUI-visible settings may not be part of misc settings. 2021-02-17 21:01:21 +01:00
Michael Lutz
00c66e7096 Codechange: Allow early-load settings that are not misc settings. 2021-02-17 21:01:21 +01:00
translators
8f5b8fd769 Update: Translations from eints
german: 2 changes by Wuzzy2
slovak: 5 changes by FuryPapaya
dutch: 4 changes by LouisDeconinck
spanish: 1 change by MontyMontana
2021-02-17 18:54:08 +00:00
Patric Stout
6de188d025 Fix 52317bb7: [SDL2] ensure we don't try to blit out of bounds (#8684)
During resizing, there can still be dirty-rects ready to blit based
on the old dimensions. X11 with shared memory enabled crashes if
you try to do this. So, instead, if we resize, reset the dirty-rects.

This is fine, as moments later we mark the whole (new) screen as
dirty anyway.
2021-02-17 14:06:12 +01:00
Patric Stout
7bdb2e79ed Fix: framerate window showed a slightly higher rate than actually measured (#8682)
The first point was counted, but also initialized as "last". As
such, it didn't add to "total", but did add to "count", which made
the "count" 1 more than the total actually represents.
2021-02-16 20:37:58 +01:00
translators
c9bcc12265 Update: Translations from eints
korean: 2 changes by telk5093
indonesian: 11 changes by dimaspaf14
russian: 2 changes by Ln-Wolf
finnish: 3 changes by hpiirai
french: 4 changes by glx22
2021-02-16 19:01:08 +00:00
translators
db246b82ac Update: Translations from eints
korean: 2 changes by telk5093
german: 56 changes by Wuzzy2
finnish: 2 changes by hpiirai
catalan: 2 changes by J0anJosep
polish: 9 changes by yazalo
2021-02-15 19:01:52 +00:00
Owen Rudge
d3b50b9c47 Fix: [Actions] Use vcpkg to provide libpng on macOS 2021-02-15 12:10:11 +00:00
glx22
45e8b7a5bd Add: Allow translation of "(Directory)" and "(Parent directory)" 2021-02-15 00:08:37 +01:00
Tyler Trahan
ce06b03fac Fix: Stopped ships shouldn't block depots (#8578) 2021-02-14 23:42:29 +01:00
dP
91cc414588 Feature: [GS] Allow non-question type windows to have no buttons 2021-02-14 23:21:43 +01:00
milek7
751f595bb6 Fix: VkMapping declarations violated C++ ODR rule. 2021-02-14 23:19:50 +01:00
frosch
5a1fa18509 Change: move the 'road drive side' selection to settings tree, and give it the same 'basic' visibilty as 'signal side'. 2021-02-14 23:14:07 +01:00
frosch
c71d0f5e7f Change: move townname generator selection to mapgen GUI. 2021-02-14 23:14:07 +01:00
frosch
f513a807db Codechange: move non-GUI code to non-GUI source files. 2021-02-14 23:14:07 +01:00
frosch
4ce941bbc2 Codechange: turn a constant variable into a real constant. 2021-02-14 23:14:07 +01:00
frosch
d17226910d Codechange: minor rearrangement of settings in random map and heightmap GUI. 2021-02-14 23:14:07 +01:00
frosch
81e47277e7 Change: move the 'tree placer algorithm' selection to the settings tree window, and give it the same 'basic' visibility as 'in-game tree placement'. 2021-02-14 23:14:07 +01:00
Joan Josep
a18188ae90 Doc: Add labels to landscape grid description. (#8452) 2021-02-14 23:09:01 +01:00
translators
6b04b7cf18 Update: Translations from eints
slovak: 13 changes by FuryPapaya
catalan: 7 changes by J0anJosep
french: 1 change by arikover
2021-02-14 19:01:09 +00:00
Michael Lutz
8d780e0607 Add: [OSX] Automatic zoom level suggestion for Cocoa video driver. 2021-02-14 14:16:40 +01:00
Michael Lutz
f175e38666 Add: [Win32] Automatic zoom level suggestion for Win32 video driver.
The zoom level suggestion is based on the DPI scaling set in Windows.
We use 150% scaling as the threshold for 2X zoom and 300% scaling
as the threshold for 4X zoom.
2021-02-14 14:16:40 +01:00
Michael Lutz
f137b3057a Codechange: [Win32] Increase SDK version for 32-bit target.
Use the same Windows XP target as for 64-bit. Current MSVC version will
not produce a binary that works on anything earlier anyway.
2021-02-14 14:16:40 +01:00
Michael Lutz
33099355b8 Codechange: Re-init GUI zoom only when really changed. 2021-02-14 14:16:40 +01:00
Michael Lutz
22f5aeab07 Feature: Automatic UI and font zoom levels when supported by the OS. 2021-02-14 14:16:40 +01:00
Michael Lutz
a2c3197f42 Codechange: Make the settings for min/max zoom early load settings. 2021-02-14 14:16:40 +01:00
Michael Lutz
f5555a6d26 Fix 9c872192: [OSX] Clear mouse button emulation flag. 2021-02-14 12:58:45 +01:00
Michael Lutz
e5c3253642 Add: [OSX] Setting to disable HiDPI graphics rendering. 2021-02-14 11:50:18 +01:00
Michael Lutz
0fc763bc55 Change: [OSX] Render screen in full native resolution on HiDPI displays. 2021-02-14 11:50:18 +01:00
Michael Lutz
8906e9e0fd Codechange: Consistently use screen size and not driver resolution for determining window sizes. 2021-02-14 11:50:18 +01:00
Michael Lutz
b66e977acd Change: [OSX] When auto-detecting a font, try for sans-serif first.
On a display, especially with small fonts or low pixel sizes, sans-serif
fonts are usually easier to read than serif fonts.
2021-02-14 11:48:58 +01:00
Michael Lutz
6755ff63e1 Add: [OSX] Native font rendering without using FreeType. 2021-02-14 11:48:58 +01:00
Michael Lutz
21a2cd7bc3 Codechange: Replace magic numbers by constants. 2021-02-14 11:48:58 +01:00
Charles Pigott
8121706b89 Fix #8620: Scale spacing between date & news in history window according to font scaling 2021-02-13 22:15:25 +00:00
Charles Pigott
2b08f21625 Fix #8625: Wrong ending year was displayed in highscore table 2021-02-13 22:15:16 +00:00
Charles Pigott
f1fc083f2b Change: Make order window hotkeys toggle for load & unload variants 2021-02-13 22:14:58 +00:00
Michael Lutz
acca56b6a5 Cleanup: [OSX] Improve some comments. 2021-02-13 22:21:17 +01:00
Michael Lutz
c78e559e88 Codechange: [OSX] Remove unused 'app active' flag. 2021-02-13 22:21:17 +01:00
Michael Lutz
9c8721922b Fix: [OSX] An emulated right mouse down event has to be followed by right mouse up. 2021-02-13 22:21:17 +01:00
Michael Lutz
649ff5f9f9 Codechange: [OSX] Use relative mouse handling during scrolling. 2021-02-13 22:21:17 +01:00
Michael Lutz
43326d11d8 Change: [OSX] Use a layer-backed view to speed up drawing. 2021-02-13 22:21:17 +01:00
Michael Lutz
2a8c3a2cf6 Codechange: [OSX] Align backing buffer pitch for a tiny bit performance. 2021-02-13 22:21:17 +01:00
Michael Lutz
94b76ce9a4 Cleanup: [OSX] Move event loop into video driver file. 2021-02-13 22:21:17 +01:00
Michael Lutz
23389e9491 Remove: [OSX] Startup splash screen.
It wasn't displayed anyway as it was never copied to the bundle.
2021-02-13 22:21:17 +01:00
Michael Lutz
063b90b97d Codechange: [OSX] Move key event handling to our view. 2021-02-13 22:21:17 +01:00
Michael Lutz
f4bd54fedd Codechange: [OSX] Move mouse event handling to our NSView. 2021-02-13 22:21:17 +01:00
Michael Lutz
bd42fc94cc Codechange: [OSX] Move some things from video driver to our NSView. 2021-02-13 22:21:17 +01:00
Michael Lutz
965ce12947 Codechange: [OSX] Use newer mouse tracking API. 2021-02-13 22:21:17 +01:00
Michael Lutz
42af13c141 Codechange: [OSX] Split drawing into its own subview.
This allows the drawing backend code to be independent
of any event or command handling.
2021-02-13 22:21:17 +01:00
Michael Lutz
60f30036f1 Codechange: [OSX] Drain autoreleased objects in each game loop cycle. 2021-02-13 22:21:17 +01:00
Michael Lutz
8aaf4ea098 Codechange: [OSX] Split Window and back buffer creation in Cocoa video driver. 2021-02-13 22:21:17 +01:00
Michael Lutz
0eff7de659 Cleanup: [OSX] Doxygen comment style in video driver. 2021-02-13 22:21:17 +01:00
Michael Lutz
8ced72ab10 Codechange: [OSX] Inline some functions that are used in only one place. 2021-02-13 22:21:17 +01:00
Michael Lutz
13134f9d64 Codechange: [OSX] Replace #define with modern code. 2021-02-13 22:21:17 +01:00
Michael Lutz
88f6c7a9f3 Codechange: [OSX] Fold remaining Cocoa video subdriver into the main driver. 2021-02-13 22:21:17 +01:00
Michael Lutz
e6bea3961f Change: [OSX] Replace screen resolution list with suggested window sizes.
We never change the real screen resolution on OSX. As such, offering a list
of resolutions is pointless. Instead of that, offer the user a list of
commonly used window sizes up to the current screen size.
2021-02-13 22:21:17 +01:00
Michael Lutz
4db7837d06 Codechange: [OSX] There is only one subdriver left, remove virtual dispatch. 2021-02-13 22:21:17 +01:00
Michael Lutz
63ed3f3575 Codechange: Move Fontconfig-specific code to a seperate file. 2021-02-13 20:09:14 +01:00
Michael Lutz
f2294851e6 Codechange: [OSX] Move OSX-specific font code to a separate file. 2021-02-13 20:09:14 +01:00
Michael Lutz
c6af8f16f6 Codechange: [Win32] Move Win32-specific font code to a seperate file. 2021-02-13 20:09:14 +01:00
Michael Lutz
5ad1640984 Codechange: Make OS font handle of the FontCache read-only. 2021-02-13 20:09:14 +01:00
Michael Lutz
2b0200d429 Codechange: OS-specific data for font search is not used outside of searching. 2021-02-13 20:09:14 +01:00
Michael Lutz
84636fc2af Codechange: Remove all remaining uses of cpp_offset. 2021-02-13 20:08:53 +01:00
Michael Lutz
7845434270 Codechange: Don't use cpp_offsetof in the save/load code.
Many of the member variables that are used in save/load are inside types
that are not standard layout types. Using pointer arithmetics to determine
addresses of members inside types that are not standard layout is generally
undefined behaviour. If we'd use C++17, it is conditionally supported, which means
each compiler may or may not support it. And even then using it for individual
array elements is syntactically not supported the the standard offsetof function.

Unfortunately, the trickery employed for saving linkgraph settings causes quite some
clutter in the settings ini files.
2021-02-13 20:08:53 +01:00
Michael Lutz
9c9292949f Codechange: Don't use cpp_offsetof in the TTO/TTD savegame loader.
Many of the member variables that are used in the oldloader are inside types
that are not standard layout types. Using pointer arithmetics to determine
addresses of members inside types that are not standard layout is generally
undefined behaviour. If we'd use C++17, it is conditionally supported, which means
each compiler may or may not support it. And even then using it for individual
array elements is syntactically not supported the the standard offsetof function.
2021-02-13 20:08:53 +01:00
translators
0f621b4956 Update: Translations from eints
portuguese (brazilian): 36 changes by AKANexus
2021-02-13 18:59:59 +00:00
SamuXarick
36ab9c64ef Fix: Desert/rainforest data coordinate 'y' is off by 1 when their 'x' coordinate is negative 2021-02-13 19:18:41 +01:00
Charles Pigott
d9df20d102 Change: Use a more specific error message when attempting to bulldoze your own HQ 2021-02-13 18:10:13 +00:00
glx22
348f322df1 Fix f1f281b31: [Win32] MinGW doesn't know timeapi.h 2021-02-13 19:07:42 +01:00
glx22
f181037bed Change: [Actions] Also run CI for VS2017 2021-02-13 17:31:57 +01:00
glx22
5a4d5f03b0 Codechange: Implement a constructor for CurrencySpec 2021-02-13 17:31:57 +01:00
Johannes E. Krause
3ac43582c2 Codechange: [NewGRF] Make it more explicit which parts of the TTD vehicle structure (var 80+) are not implemented 2021-02-13 16:07:23 +00:00
translators
fa0704138d Update: Translations from eints
spanish (mexican): 7 changes by absay
dutch: 7 changes by Afoklala
french: 7 changes by arikover
2021-02-12 19:00:59 +00:00
Patric Stout
52317bb7df Change: [SDL2] Remove unneeded delay of redrawing the screen
In testing, I could find no reason why this statement is here.

The comment is rather unclear (it states what it does, but not
why it would be needed).

This line of code was introduced with f4f40448, which gives no
further insight on why it would be needed to have it here.

As such, let's remove it and see if anyone else reports any
problems with it. If so, this commit can be reverted and a more
clear comment should be added what this line of code is dealing
with (the WHY, not the WHAT).
2021-02-11 20:23:53 +01:00
Patric Stout
2e1535389a Codechange: [SDL2] Don't use globals if we can do with locals 2021-02-11 20:23:53 +01:00
Patric Stout
2bbef6b5cf Codechange: [SDL2] Name paint function Paint(), like other drivers do
This reduces confusion when reading different drivers.
2021-02-11 20:23:53 +01:00
Patric Stout
569ce6c7b4 Fix 30e69c51: palette was not marked dirty when creating a new
This means the code depended that the caller did this for us
before MakePalette() is executed, which is neither a
requirement nor a promise the code makes.
2021-02-11 20:23:53 +01:00
translators
64e2d6b672 Update: Translations from eints
korean: 7 changes by telk5093
russian: 11 changes by Ln-Wolf
finnish: 7 changes by hpiirai
2021-02-11 19:01:10 +00:00
Kuhnovic
83ddb1501f Feature: Remove all industries button in scenario editor (#8550) 2021-02-10 16:35:50 +01:00
Loïc Guilloux
f1f281b318 Fix: [Win32] Set minimum resolution for timers to 1ms. (#8660) 2021-02-09 21:21:57 +01:00
Owen Rudge
395e015282 Change: Convert .md to .rtf for Windows/Mac packages 2021-02-08 23:23:24 +00:00
embeddedt
6c8f2227cd Fix: [Emscripten] open links in browser (#8655) 2021-02-08 19:18:30 +01:00
Patric Stout
ac2b5e57cf Fix: mention our websites with https:// (instead of http://) (#8657)
It is 2021. Nobody should advertise http anymore. Not even us.
2021-02-08 19:07:34 +01:00
Owen Rudge
da4c404f3d Fix: [Actions] Use same vcpkg commit for CI on macOS as release builds 2021-02-08 16:13:03 +00:00
glx22
af0acc9a75 Update: Specify CMake minimum version in COMPILING.md
Also give some hints for MSVC users.
2021-02-07 16:21:13 +01:00
glx22
2cbfcd2327 Change: [CMake] Bump minimum version to 3.9 2021-02-07 16:21:13 +01:00
Loïc Guilloux
b927da73c1 Fix 81d335b081: Use non-pulsating red highlight for coverage (#8622) 2021-02-07 16:20:26 +01:00
Loïc Guilloux
f7ac2969ef Fix: [CMake] Restore 'games' as default install bindir (#8629) 2021-02-07 16:19:30 +01:00
Matt Kimber
2a6da319b2 Fix 0125892: Don't crash when towns upgrade road tiles during expansion (#8651) 2021-02-07 16:15:46 +01:00
Patric Stout
9322b40df1 Fix: [CMake] our allegro drivers use v4, so skip v5 if found (#8653)
On some distros allegro v5 is called allegro-5, but on some others
it is not. So this should fix for all distros that allegro v5 is
not being picked up, and only v4 is.
2021-02-07 12:54:02 +01:00
Patric Stout
2c9084d48c Fix #8029: [SDL2] disable draw-thread on wayland SDL video driver (#8648)
When the wayland SDL video driver is used, an EGL context is
created in the main thread. It is not allowed to update this
context from another thread, which is exactly what our draw-thread
is trying.

The other solution would be to move all of SDL into the
draw-thread, but that would introduce a whole scala of different
problems.

The wayland SDL backend is significantly faster than the
X11 SDL backend, but there is a performance hit nevertheless.
2021-02-06 14:09:45 +01:00
Patric Stout
4f0692c437 Codechange: [Actions] Document better why we build our own fluidsynth (#8646)
nielsmh nicely correct us in #8641, pointing out the old comment
is not telling a complete truth. The result is the same, but it
is better to not mislead future-us.
2021-02-05 23:56:44 +01:00
glx22
99448eedca Fix: [CMake] os/windows/openttd.manifest is not a generated file 2021-02-05 23:41:55 +01:00
Patric Stout
a667ed945f Add: [Actions] Automatically upload releases to Steam (#8644) 2021-02-05 20:58:15 +01:00
Patric Stout
05df7996a4 Feature: [Actions / CMake] support for generic linux builds (#8641)
These bundles can be opened on any "modern" Linux machine with
a driver that SDL2 supports.

Machines needs at least glibc 2.15, which was released 10 years ago.
It is build with CentOS 7 as base, and only assumes the following
libraries are available on the system:
- libc
- libdl
- libgcc_s
- libpthread
- librt
- libstdc++

All other libraries the game depends on are bundled together with
the game, so users don't need any library installed to use this
bundle. The downside of course is that this increases the binary
size a bit: 30 MiB of libraries are in this bundle.

RPATH is used to make ld-linux find the folder libraries are
stored in; however, system libraries are always used before these,
in the assumption libraries on the user system are more up-to-date.

Using -DOPTION_PACKAGE_DEPENDENCIES=ON switches on packaging
of libraries in the "lib" folder. This requires CMake 3.16 to
be installed; otherwise it will fail.
2021-02-05 12:31:27 +01:00
SamuXarick
a4035af337 Codechange: Apply coding style (#8640)
* Fix: Missing or needed spaces

* Codechange: Remove space

* Codechange: Remove space

* Codechange: More missing spaces

* Codechange: Missing spaces

* Codechange: Remove space

* Codechange: Remove space
2021-02-05 11:00:36 +01:00
translators
5b3fe4ae27 Update: Translations from eints
german: 4 changes by Wuzzy2
2021-02-02 18:17:17 +00:00
glx22
144991990e Fix: [CMake] Language files should depend on english.txt 2021-02-02 17:33:18 +01:00
translators
696b6990ea Update: Translations from eints
estonian: 110 changes by siimsoni
2021-02-01 18:17:06 +00:00
translators
069fb54253 Update: Translations from eints
estonian: 17 changes by siimsoni
german: 410 changes by Wuzzy2
2021-01-31 18:14:37 +00:00
embeddedt
76a279ef68 Fix: [Emscripten] Pin Dockerfile to emsdk:2.0.10 to prevent patch failure (#8628) 2021-01-31 15:27:17 +01:00
Patric Stout
7fbf705c41 Fix 2db88953: default Network Server List sorter put compatible servers in wrong order (#8626)
If a server is compatible, it falls back to sorting by clients.
This used to be in reverse, so full servers are on top. With
the codechange commit, this was removed by accident, and as
such empty servers were on top. This is silly.
2021-01-31 10:36:07 +01:00
Tyler Trahan
1dda7d6486 Fix: don't walk out of the map when trying to build tunnels (#8600) 2021-01-31 10:04:22 +01:00
Patric Stout
0e54c32452 Codechange: [SDL2] Use MakeDirty() to force a redraw
The original code is "strictly correct", but just reads really
weird, and we use MakeDirty() in several other places instead too.
2021-01-30 21:43:59 +01:00
Patric Stout
30e69c518b Codechange: [SDL2] Rework how palette is updated
It now follows more what the Win32 driver does, and has far less
exceptions and special casing.

MakePalette creates the Palette and prepares surface.
UpdatePalette updates the Palette.
CheckPaletteAnim checks if UpdatePalette needs to be called and
  marks the whole screen dirty so DrawSurfaceToScreen will do a
  full redraw.
2021-01-30 21:43:59 +01:00
Patric Stout
eb80fefd1d Fix: [SDL2] Display why SDL_CreateWindow() failed in case it does
All SDL_NNN errors print SDL_GetError, except for this one place.
2021-01-30 21:43:59 +01:00
Patric Stout
19345908cb Codechange: [SDL2] Split away CreateMainWindow from CreateMainSurface
This makes the code a bit more readable, as both intentions are
more clear, and there is less nesting in the main function.
2021-01-30 21:43:59 +01:00
Patric Stout
8c37e5c526 Codechange: [SDL2] reworked the different surfaces to make it more readable 2021-01-30 21:43:59 +01:00
Patric Stout
8de325f256 Codechange: [SDL2] Only prepare "caption" if you are going to us it 2021-01-30 21:43:59 +01:00
Patric Stout
e41ec5b42e Codechange: [SDL2] Minor code cleanup to remove silly variable 2021-01-30 21:43:59 +01:00
Patric Stout
678031f9b3 Codechange: [SDL2] Only set _cur_palette, never _local_palette 2021-01-30 21:43:59 +01:00
Patric Stout
f31b65825f Codechange: [SDL2] Move FindStartupDisplay to its own function 2021-01-30 21:43:59 +01:00
Patric Stout
6916fc76bd Codechange: [SDL2] reworked FindResolutions to be more like the rest
There was no default resolution fallback, and the code was different
from the win32 driver. It is now named the same and much more
similar.
2021-01-30 21:43:59 +01:00
Patric Stout
a52d716c88 Codechange: [SDL2] remove include-protection
This is already done by CMake: if SDL2 is not detected, this file
is not included.
2021-01-30 21:43:59 +01:00
translators
5ae2c1552b Update: Translations from eints
estonian: 353 changes by siimsoni
2021-01-30 18:14:36 +00:00
translators
48698403a8 Update: Translations from eints
estonian: 85 changes by siimsoni
korean: 30 changes by telk5093
portuguese: 24 changes by CheapWebdesign
2021-01-29 18:17:44 +00:00
Patric Stout
4831b4fa96 Codechange: [Actions] we no longer need xdg-basedir (#8615)
This was already removed from the "ci-build", but not yet from
"release".
2021-01-29 10:38:58 +01:00
Owen Rudge
1187dc3217 Feature: [Actions] Create .zip for macOS build 2021-01-28 19:15:36 +00:00
translators
3dac139b00 Update: Translations from eints
estonian: 5 changes by siimsoni
hungarian: 7 changes by andrejmoltok
2021-01-28 18:16:32 +00:00
translators
da78b5c130 Update: Translations from eints
estonian: 117 changes by siimsoni
german: 5 changes by Wuzzy2
slovak: 23 changes by FuryPapaya
2021-01-27 18:14:58 +00:00
translators
027452fef8 Update: Translations from eints
german: 11 changes by Wuzzy2
2021-01-26 18:14:06 +00:00
translators
67fa5a23b9 Update: Translations from eints
estonian: 7 changes by siimsoni
2021-01-25 18:42:15 +00:00
translators
b2d9a2dc79 Update: Translations from eints
estonian: 12 changes by siimsoni
finnish: 1 change by hpiirai
2021-01-23 18:39:34 +00:00
glx22
6b8ad5a9b1 Change: Apply some consistency to singleplayer related comments 2021-01-22 22:19:55 +01:00
glx22
07385c3662 Fix: Use the same safety checks as 'stop_ai' for 'reload_ai' 2021-01-22 22:19:55 +01:00
glx22
485aafc1b7 Fix: Never delete the last existing company in singleplayer mode 2021-01-22 22:19:55 +01:00
dP
b17177bd20 Fix: Center text and image in vehicle statusbar vertically 2021-01-22 22:18:17 +01:00
translators
8fe79e153d Update: Translations from eints
estonian: 8 changes by siimsoni
german: 89 changes by Wuzzy2
finnish: 2 changes by hpiirai
dutch: 27 changes by Afoklala
2021-01-22 18:43:56 +00:00
288 changed files with 26645 additions and 7683 deletions

View File

@@ -39,7 +39,7 @@ jobs:
echo "::group::Build"
echo "Running on $(nproc) cores"
make -j$(nproc) tools
cmake --build . -j $(nproc) --target tools
echo "::endgroup::"
- name: Install GCC problem matcher
@@ -56,7 +56,7 @@ jobs:
echo "::group::Build"
echo "Running on $(nproc) cores"
emmake make -j$(nproc)
cmake --build . -j $(nproc)
echo "::endgroup::"
linux:
@@ -66,10 +66,15 @@ jobs:
fail-fast: false
matrix:
include:
- compiler: clang
cxxcompiler: clang++
- compiler: gcc
cxxcompiler: g++
- compiler: clang
cxxcompiler: clang++
libsdl: libsdl2-dev
- compiler: gcc
cxxcompiler: g++
libsdl: libsdl2-dev
- compiler: gcc
cxxcompiler: g++
libsdl: libsdl1.2-dev
runs-on: ubuntu-20.04
env:
@@ -88,12 +93,12 @@ jobs:
echo "::group::Install dependencies"
sudo apt-get install -y --no-install-recommends \
liballegro4-dev \
libfontconfig-dev \
libicu-dev \
liblzma-dev \
liblzo2-dev \
libsdl1.2-dev \
libsdl2-dev \
${{ matrix.libsdl }} \
zlib1g-dev \
# EOF
echo "::endgroup::"
@@ -129,13 +134,13 @@ jobs:
echo "::group::Build"
echo "Running on $(nproc) cores"
make -j$(nproc)
cmake --build . -j $(nproc)
echo "::endgroup::"
- name: Test
run: |
cd build
make -j$(nproc) test
ctest -j $(nproc)
macos:
name: Mac OS
@@ -155,13 +160,25 @@ jobs:
- name: Checkout
uses: actions/checkout@v2
- name: Prepare vcpkg (with cache)
uses: lukka/run-vcpkg@v6
- name: Prepare cache key
id: key
run: |
echo "::set-output name=image::$ImageOS-$ImageVersion"
- name: Enable vcpkg cache
uses: actions/cache@v2
with:
vcpkgDirectory: '/usr/local/share/vcpkg'
doNotUpdateVcpkg: true
vcpkgArguments: 'freetype liblzma lzo'
vcpkgTriplet: '${{ matrix.arch }}-osx'
path: /usr/local/share/vcpkg/installed
key: ${{ steps.key.outputs.image }}-vcpkg-${{ matrix.arch }}
- name: Prepare vcpkg
run: |
vcpkg install --triplet=${{ matrix.arch }}-osx \
liblzma \
libpng \
lzo \
zlib \
# EOF
- name: Install OpenGFX
run: |
@@ -196,13 +213,13 @@ jobs:
echo "::group::Build"
echo "Running on $(sysctl -n hw.logicalcpu) cores"
make -j$(sysctl -n hw.logicalcpu)
cmake --build . -j $(sysctl -n hw.logicalcpu)
echo "::endgroup::"
- name: Test
run: |
cd build
make -j$(sysctl -n hw.logicalcpu) test
ctest -j $(sysctl -n hw.logicalcpu)
windows:
name: Windows
@@ -210,35 +227,39 @@ jobs:
strategy:
fail-fast: false
matrix:
include:
- arch: x86
- arch: x64
os: [windows-latest, windows-2016]
arch: [x86, x64]
runs-on: windows-latest
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v2
# "restore-cache" which is done by "run-vcpkg" uses Windows tar.
# A git clone on windows marks a few files as read-only; when Windows tar
# tries to extract the cache over this folder, it fails, despite the files
# being identical. This failure shows up as an warning in the logs. We
# avoid this by simply removing the read-only mark from the git folder.
# In other words: this is a hack!
# See: https://github.com/lukka/run-vcpkg/issues/61
- name: Remove read-only flag from vcpkg git folder
- name: Prepare cache key
id: key
shell: powershell
run: |
attrib -r "c:\vcpkg\.git\*.*" /s
# Work around caching failure with GNU tar
New-Item -Type Junction -Path vcpkg -Target c:\vcpkg
- name: Prepare vcpkg (with cache)
uses: lukka/run-vcpkg@v6
Write-Output "::set-output name=image::$env:ImageOS-$env:ImageVersion"
- name: Enable vcpkg cache
uses: actions/cache@v2
with:
vcpkgDirectory: 'c:/vcpkg'
doNotUpdateVcpkg: true
vcpkgArguments: 'liblzma libpng lzo zlib'
vcpkgTriplet: '${{ matrix.arch }}-windows-static'
path: vcpkg/installed
key: ${{ steps.key.outputs.image }}-vcpkg-${{ matrix.arch }}
- name: Prepare vcpkg
shell: bash
run: |
vcpkg install --triplet=${{ matrix.arch }}-windows-static \
liblzma \
libpng \
lzo \
zlib \
# EOF
- name: Install OpenGFX
shell: bash
@@ -259,16 +280,31 @@ jobs:
- name: Install MSVC problem matcher
uses: ammaraskar/msvc-problem-matcher@master
- name: Build
uses: lukka/run-cmake@v3
- name: Configure developer command prompt for ${{ matrix.arch }}
uses: ilammy/msvc-dev-cmd@v1
with:
cmakeListsOrSettingsJson: CMakeListsTxtAdvanced
useVcpkgToolchainFile: true
buildDirectory: '${{ github.workspace }}/build'
cmakeAppendedArgs: ' -GNinja'
arch: ${{ matrix.arch }}
- name: Build
shell: bash
run: |
mkdir build
cd build
echo "::group::CMake"
cmake .. \
-GNinja \
-DVCPKG_TARGET_TRIPLET=${{ matrix.arch }}-windows-static \
-DCMAKE_TOOLCHAIN_FILE="c:\vcpkg\scripts\buildsystems\vcpkg.cmake" \
# EOF
echo "::endgroup::"
echo "::group::Build"
cmake --build .
echo "::endgroup::"
- name: Test
shell: bash
run: |
cd ${GITHUB_WORKSPACE}/build
ctest -C Debug
ctest

View File

@@ -230,7 +230,7 @@ jobs:
echo "::endgroup::"
echo "::group::Build"
make docs
cmake --build . --target docs
echo "::endgroup::"
- name: Create bundles
@@ -265,7 +265,104 @@ jobs:
retention-days: 5
linux:
name: Linux
name: Linux (Generic)
needs: source
runs-on: ubuntu-20.04
container:
# manylinux2014 is based on CentOS 7, but already has a lot of things
# installed and preconfigured. It makes it easier to build OpenTTD.
image: quay.io/pypa/manylinux2014_x86_64
steps:
- name: Download source
uses: actions/download-artifact@v2
with:
name: internal-source
- name: Unpack source
run: |
tar -xf source.tar.gz --strip-components=1
- name: Install dependencies
run: |
echo "::group::Install dependencies"
yum install -y \
fontconfig-devel \
freetype-devel \
libicu-devel \
libpng-devel \
libpng-devel \
lzo-devel \
SDL2-devel \
wget \
xz-devel \
zlib-devel \
# EOF
echo "::endgroup::"
# The yum variant of fluidsynth depends on all possible audio drivers,
# like jack, ALSA, pulseaudio, etc. This is not really useful for us,
# as we route the output of fluidsynth back via our sound driver, and
# as such do not use these audio driver outputs at all. So instead,
# we compile fluidsynth ourselves, with as little dependencies as
# possible. This currently means it picks up SDL2, but this is fine,
# as we need SDL2 anyway.
echo "::group::Install fluidsynth"
wget https://github.com/FluidSynth/fluidsynth/archive/v2.1.6.tar.gz
tar xf v2.1.6.tar.gz
(
cd fluidsynth-2.1.6
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr
cmake --build . -j $(nproc)
cmake --install .
)
echo "::endgroup::"
- name: Install GCC problem matcher
uses: ammaraskar/gcc-problem-matcher@master
- name: Build
run: |
mkdir -p build
cd build
echo "::group::CMake"
cmake ${GITHUB_WORKSPACE} \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DOPTION_PACKAGE_DEPENDENCIES=ON \
# EOF
echo "::endgroup::"
echo "::group::Build"
echo "Running on $(nproc) cores"
cmake --build . -j $(nproc)
echo "::endgroup::"
- name: Create bundles
run: |
cd ${GITHUB_WORKSPACE}/build
echo "::group::Run CPack"
cpack
echo "::endgroup::"
echo "::group::Cleanup"
# Remove the sha256 files CPack generates; we will do this ourself at
# the end of this workflow.
rm -f bundles/*.sha256
echo "::endgroup::"
- name: Store bundles
uses: actions/upload-artifact@v2
with:
name: openttd-linux-generic
path: build/bundles
retention-days: 5
linux-distro:
name: Linux (Distros)
needs: source
if: needs.source.outputs.is_tag == 'true'
@@ -317,7 +414,6 @@ jobs:
liblzma-dev \
liblzo2-dev \
libsdl2-dev \
libxdg-basedir-dev \
lsb-release \
zlib1g-dev \
# EOF
@@ -342,12 +438,22 @@ jobs:
echo "::group::Build"
echo "Running on $(nproc) cores"
make -j$(nproc) package
# Ubuntu 18.04 cmake does not support -j so we pass the option to the native tool
cmake --build . -- -j $(nproc)
echo "::endgroup::"
- name: Create bundles
run: |
cd ${GITHUB_WORKSPACE}/build
echo "::group::Run CPack"
cpack
echo "::endgroup::"
echo "::group::Cleanup"
# Remove the sha256 files CPack generates; we will do this ourself at
# the end of this workflow.
rm -f bundles/*.sha256
echo "::endgroup::"
- name: Store bundles
uses: actions/upload-artifact@v2
@@ -374,21 +480,39 @@ jobs:
run: |
tar -xf source.tar.gz --strip-components=1
# The following step can be removed when the build VM is updated with a revision of
# vcpkg dating from roughly 01/01/2021 or later. At that point, `doNotUpdateVcpkg`
# can be set to `true` and the `vcpkgGitCommitId` can be removed.
- name: Update vcpkg
- name: Install dependencies
env:
HOMEBREW_NO_AUTO_UPDATE: 1
HOMEBREW_NO_INSTALL_CLEANUP: 1
run: |
cd /usr/local/share/vcpkg
git fetch --unshallow
brew install pandoc
- name: Prepare vcpkg (with cache)
uses: lukka/run-vcpkg@v6
- name: Prepare cache key
id: key
run: |
echo "::set-output name=image::$ImageOS-$ImageVersion"
- name: Enable vcpkg cache
uses: actions/cache@v2
with:
vcpkgDirectory: '/usr/local/share/vcpkg'
doNotUpdateVcpkg: false
vcpkgGitCommitId: 2a42024b53ebb512fb5dd63c523338bf26c8489c
vcpkgArguments: 'freetype:x64-osx liblzma:x64-osx lzo:x64-osx freetype:arm64-osx liblzma:arm64-osx lzo:arm64-osx'
path: /usr/local/share/vcpkg/installed
key: ${{ steps.key.outputs.image }}-vcpkg-release
- name: Prepare vcpkg
run: |
vcpkg install \
liblzma:x64-osx \
liblzma:arm64-osx \
libpng:x64-osx \
libpng:arm64-osx \
lzo:x64-osx \
lzo:arm64-osx \
zlib:x64-osx \
zlib:arm64-osx \
# EOF
- name: Install GCC problem matcher
uses: ammaraskar/gcc-problem-matcher@master
- name: Build tools
run: |
@@ -404,12 +528,9 @@ jobs:
echo "::group::Build tools"
echo "Running on $(sysctl -n hw.logicalcpu) cores"
make -j$(sysctl -n hw.logicalcpu) tools
cmake --build . -j $(sysctl -n hw.logicalcpu) --target tools
echo "::endgroup::"
- name: Install GCC problem matcher
uses: ammaraskar/gcc-problem-matcher@master
- name: Import code signing certificates
uses: Apple-Actions/import-codesign-certs@v1
with:
@@ -437,7 +558,7 @@ jobs:
echo "::group::Build"
echo "Running on $(sysctl -n hw.logicalcpu) cores"
make -j$(sysctl -n hw.logicalcpu)
cmake --build . -j $(sysctl -n hw.logicalcpu)
echo "::endgroup::"
- name: Build x64
@@ -460,25 +581,28 @@ jobs:
echo "::group::Build"
echo "Running on $(sysctl -n hw.logicalcpu) cores"
make -j$(sysctl -n hw.logicalcpu)
cmake --build . -j $(sysctl -n hw.logicalcpu)
echo "::endgroup::"
- name: Build package
- name: Create bundles
run: |
cd build-x64
echo "::group::Create universal binary"
# Combine the `openttd` binaries from each build into a single file
lipo -create -output openttd-universal ../build-*/openttd
mv openttd-universal openttd
echo "::group::Build"
echo "Running on $(sysctl -n hw.logicalcpu) cores"
make -j$(sysctl -n hw.logicalcpu) package
echo "::endgroup::"
echo "::group::Run CPack"
cpack
echo "::endgroup::"
echo "::group::Cleanup"
# Remove the sha256 files CPack generates; we will do this ourself at
# the end of this workflow.
rm -f bundles/*.sha256
echo "::endgroup::"
- name: Install gon
env:
@@ -496,6 +620,29 @@ jobs:
cd build-x64
../os/macosx/notarize.sh
- name: Build zip
run: |
cd build-x64
pushd _CPack_Packages/*/Bundle/openttd-*/
# Remove the Applications symlink from the staging folder
rm -f Applications
# Remove the original dmg built by CPack to avoid a conflict when resolving
# the zip_filename variable below
rm -f ../*.dmg
zip_filename=(../openttd-*)
# Package up the existing, notarised .app into a zip file
zip -r -9 ${zip_filename}.zip OpenTTD.app
popd
# Now move it into place to be uploaded
mv _CPack_Packages/*/Bundle/openttd-*.zip bundles/
- name: Store bundles
uses: actions/upload-artifact@v2
with:
@@ -512,8 +659,11 @@ jobs:
matrix:
include:
- arch: x86
host: x86
- arch: x64
host: x64
- arch: arm64
host: x64_arm64
runs-on: windows-latest
@@ -528,55 +678,109 @@ jobs:
run: |
tar -xf source.tar.gz --strip-components=1
# "restore-cache" which is done by "run-vcpkg" uses Windows tar.
# A git clone on windows marks a few files as read-only; when Windows tar
# tries to extract the cache over this folder, it fails, despite the files
# being identical. This failure shows up as an warning in the logs. We
# avoid this by simply removing the read-only mark from the git folder.
# In other words: this is a hack!
# See: https://github.com/lukka/run-vcpkg/issues/61
- name: Remove read-only flag from vcpkg git folder
- name: Install dependencies
shell: bash
run: |
choco install pandoc
- name: Prepare cache key
id: key
shell: powershell
run: |
attrib -r "c:\vcpkg\.git\*.*" /s
# Work around caching failure with GNU tar
New-Item -Type Junction -Path vcpkg -Target c:\vcpkg
- name: Prepare vcpkg (with cache)
uses: lukka/run-vcpkg@v6
with:
vcpkgDirectory: 'c:/vcpkg'
doNotUpdateVcpkg: true
vcpkgArguments: 'liblzma libpng lzo zlib'
vcpkgTriplet: '${{ matrix.arch }}-windows-static'
Write-Output "::set-output name=image::$env:ImageOS-$env:ImageVersion"
- name: Build tools
uses: lukka/run-cmake@v3
- name: Enable vcpkg cache
uses: actions/cache@v2
with:
cmakeListsOrSettingsJson: CMakeListsTxtAdvanced
useVcpkgToolchainFile: false
buildDirectory: '${{ github.workspace }}/build-host'
buildWithCMakeArgs: '--target tools'
cmakeAppendedArgs: ' -GNinja -DOPTION_TOOLS_ONLY=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo'
path: vcpkg/installed
key: ${{ steps.key.outputs.image }}-vcpkg-${{ matrix.arch }}
- name: Prepare vcpkg
shell: bash
run: |
vcpkg install --triplet=${{ matrix.arch }}-windows-static \
liblzma \
libpng \
lzo \
zlib \
# EOF
- name: Install MSVC problem matcher
uses: ammaraskar/msvc-problem-matcher@master
- name: Configure developer command prompt for tools
uses: ilammy/msvc-dev-cmd@v1
with:
arch: x64
- name: Build tools
shell: bash
run: |
mkdir build-host
cd build-host
echo "::group::CMake"
cmake ${GITHUB_WORKSPACE} \
-GNinja \
-DOPTION_TOOLS_ONLY=ON \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
# EOF
echo "::endgroup::"
echo "::group::Build"
cmake --build . --target tools
echo "::endgroup::"
- name: Configure developer command prompt for ${{ matrix.arch }}
uses: ilammy/msvc-dev-cmd@v1
with:
arch: ${{ matrix.host }}
- name: Build (with installer)
if: needs.source.outputs.is_tag == 'true'
uses: lukka/run-cmake@v3
with:
cmakeListsOrSettingsJson: CMakeListsTxtAdvanced
useVcpkgToolchainFile: true
buildDirectory: '${{ github.workspace }}/build'
cmakeAppendedArgs: ' -GNinja -DOPTION_USE_NSIS=ON -DHOST_BINARY_DIR=${{ github.workspace }}/build-host -DCMAKE_BUILD_TYPE=RelWithDebInfo'
shell: bash
run: |
mkdir build
cd build
echo "::group::CMake"
cmake ${GITHUB_WORKSPACE} \
-GNinja \
-DVCPKG_TARGET_TRIPLET=${{ matrix.arch }}-windows-static \
-DCMAKE_TOOLCHAIN_FILE="c:\vcpkg\scripts\buildsystems\vcpkg.cmake" \
-DOPTION_USE_NSIS=ON \
-DHOST_BINARY_DIR=${GITHUB_WORKSPACE}/build-host \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
# EOF
echo "::endgroup::"
echo "::group::Build"
cmake --build .
echo "::endgroup::"
- name: Build (without installer)
if: needs.source.outputs.is_tag != 'true'
uses: lukka/run-cmake@v3
with:
cmakeListsOrSettingsJson: CMakeListsTxtAdvanced
useVcpkgToolchainFile: true
buildDirectory: '${{ github.workspace }}/build'
cmakeAppendedArgs: ' -GNinja -DHOST_BINARY_DIR=${{ github.workspace }}/build-host -DCMAKE_BUILD_TYPE=RelWithDebInfo'
shell: bash
run: |
mkdir build
cd build
echo "::group::CMake"
cmake ${GITHUB_WORKSPACE} \
-GNinja \
-DVCPKG_TARGET_TRIPLET=${{ matrix.arch }}-windows-static \
-DCMAKE_TOOLCHAIN_FILE="c:\vcpkg\scripts\buildsystems\vcpkg.cmake" \
-DHOST_BINARY_DIR=${GITHUB_WORKSPACE}/build-host \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
# EOF
echo "::endgroup::"
echo "::group::Build"
cmake --build .
echo "::endgroup::"
- name: Create bundles
shell: bash
@@ -606,11 +810,12 @@ jobs:
retention-days: 5
upload:
name: Upload
name: Upload (AWS)
needs:
- source
- docs
- linux
- linux-distro
- macos
- windows
@@ -619,7 +824,7 @@ jobs:
# "always()" is important here, it is the keyword to use to stop skipping
# this job if any dependency is skipped. It looks a bit silly, but it is
# how GitHub Actions work ;)
if: always() && needs.source.result == 'success' && needs.docs.result == 'success' && (needs.linux.result == 'success' || needs.linux.result == 'skipped') && needs.macos.result == 'success' && needs.windows.result == 'success'
if: always() && needs.source.result == 'success' && needs.docs.result == 'success' && needs.linux.result == 'success' && (needs.linux-distro.result == 'success' || needs.linux-distro.result == 'skipped') && needs.macos.result == 'success' && needs.windows.result == 'success'
runs-on: ubuntu-20.04
@@ -663,3 +868,80 @@ jobs:
repository: OpenTTD/workflows
event-type: ${{ needs.source.outputs.trigger_type }}
client-payload: '{"version": "${{ needs.source.outputs.version }}", "folder": "${{ needs.source.outputs.folder }}"}'
upload-steam:
name: Upload (Steam)
needs:
- source
- linux
- macos
- windows
if: needs.source.outputs.trigger_type == 'new-master' || needs.source.outputs.trigger_type == 'new-tag'
runs-on: ubuntu-20.04
steps:
- name: Download all bundles
uses: actions/download-artifact@v2
- name: Setup steamcmd
uses: CyberAndrii/setup-steamcmd@v1
- name: Generate Steam auth code
id: steam-totp
uses: CyberAndrii/steam-totp@v1
with:
shared_secret: ${{ secrets.STEAM_SHARED_SECRET }}
- name: Upload to Steam
run: |
echo "::group::Extracting source"
mkdir source
(
cd source
tar -xf ../internal-source/source.tar.gz --strip-components=1
)
echo "::endgroup::"
mkdir steam
(
cd steam
echo "::group::Prepare Win32"
unzip ../openttd-windows-x86/openttd-*-windows-win32.zip
mv openttd-*-windows-win32 steam-win32
echo "::endgroup::"
echo "::group::Prepare Win64"
unzip ../openttd-windows-x64/openttd-*-windows-win64.zip
mv openttd-*-windows-win64 steam-win64
echo "::endgroup::"
echo "::group::Prepare macOS"
mkdir steam-macos
(
cd steam-macos
unzip ../../openttd-macos-universal/openttd-*-macos-universal.zip
)
echo "::endgroup::"
echo "::group::Prepare Linux"
tar xvf ../openttd-linux-generic/openttd-*-linux-generic-amd64.tar.xz
mv openttd-*-linux-generic-amd64 steam-linux
echo "::endgroup::"
echo "::group::Preparing build file"
if [ "${{ needs.source.outputs.trigger_type }}" = "new-tag" ]; then
BRANCH="testing"
else
BRANCH="nightly"
fi
cat ../source/os/steam/release.vdf | sed 's/@@DESCRIPTION@@/openttd-${{ needs.source.outputs.version }}/;s/@@BRANCH@@/'${BRANCH}'/' > release.vdf
cat release.vdf
echo "::endgroup::"
echo "::group::Upload to Steam"
steamcmd +login ${{ secrets.STEAM_USERNAME }} ${{ secrets.STEAM_PASSWORD }} ${{ steps.steam-totp.outputs.code }} +run_app_build $(pwd)/release.vdf +quit
echo "::endgroup::"
)

View File

@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.5)
cmake_minimum_required(VERSION 3.9)
if(NOT BINARY_NAME)
set(BINARY_NAME openttd)
@@ -23,10 +23,13 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9)
# Use GNUInstallDirs to allow customisation
# but set our own default data dir
# but set our own default data and bin dir
if(NOT CMAKE_INSTALL_DATADIR)
set(CMAKE_INSTALL_DATADIR "share/games")
endif()
if(NOT CMAKE_INSTALL_BINDIR)
set(CMAKE_INSTALL_BINDIR "games")
endif()
include(GNUInstallDirs)
include(Options)
@@ -101,6 +104,11 @@ if(OPTION_TOOLS_ONLY)
return()
endif()
if(APPLE)
# Avoid searching for headers in Frameworks, and libraries in LIBDIR.
set(CMAKE_FIND_FRAMEWORK LAST)
endif()
# Prefer -pthread over -lpthread, which is often the better option of the two.
set(CMAKE_THREAD_PREFER_PTHREAD YES)
# Make sure we have Threads available.
@@ -113,8 +121,8 @@ find_package(PNG)
if(NOT WIN32)
find_package(Allegro)
find_package(Freetype)
if(NOT APPLE)
find_package(Freetype)
find_package(SDL2)
if(NOT SDL2_FOUND)
find_package(SDL)
@@ -128,9 +136,14 @@ if(NOT WIN32)
find_library(AUDIOTOOLBOX_LIBRARY AudioToolbox)
find_library(AUDIOUNIT_LIBRARY AudioUnit)
find_library(COCOA_LIBRARY Cocoa)
find_library(QUARTZCORE_LIBRARY QuartzCore)
endif()
endif()
if(NOT EMSCRIPTEN)
find_package(OpenGL COMPONENTS OpenGL)
endif()
if(MSVC)
find_package(Editbin REQUIRED)
endif()
@@ -140,19 +153,14 @@ find_package(Xaudio2)
find_package(Grfcodec)
# IPO is only properly supported from CMake 3.9. Despite the fact we are
# CMake 3.5, still enable IPO if we detect we are 3.9+.
if(POLICY CMP0069)
cmake_policy(SET CMP0069 NEW)
include(CheckIPOSupported)
check_ipo_supported(RESULT IPO_FOUND)
endif()
include(CheckIPOSupported)
check_ipo_supported(RESULT IPO_FOUND)
show_options()
if(UNIX AND NOT APPLE AND NOT OPTION_DEDICATED)
if(NOT SDL_FOUND AND NOT SDL2_FOUND)
message(FATAL_ERROR "SDL or SDL2 is required for this platform")
if(NOT SDL_FOUND AND NOT SDL2_FOUND AND NOT ALLEGRO_FOUND)
message(FATAL_ERROR "SDL, SDL2 or Allegro is required for this platform")
endif()
endif()
if(APPLE)
@@ -165,6 +173,30 @@ if(APPLE)
if(NOT COCOA_LIBRARY)
message(FATAL_ERROR "Cocoa is required for this platform")
endif()
if(NOT QUARTZCORE_LIBRARY)
message(FATAL_ERROR "QuartzCore is required for this platform")
endif()
endif()
if(OPTION_PACKAGE_DEPENDENCIES)
if(NOT UNIX)
message(FATAL_ERROR "Can only package dependencies on Linux")
endif()
if(OPTION_INSTALL_FHS)
message(FATAL_ERROR "Cannot install in FHS folders when we are packaging dependencies")
endif()
if(${CMAKE_VERSION} VERSION_LESS "3.16.0")
message(FATAL_ERROR "OPTION_PACKAGE_DEPENDENCIES can only work with CMake 3.16+; you are using ${CMAKE_VERSION}")
endif()
# If we are packaging dependencies, we do two things:
# 1) set the RPATH to include $ORIGIN/lib; $ORIGIN (that literal string)
# is a Linux indicator for "path where application is". In CMake, we
# have to do this before add_executable() is executed.
# 2) copy the libraries that we compile against to the "lib" folder.
# This is done in InstallAndPackage.cmake.
set(CMAKE_INSTALL_RPATH "\$ORIGIN/lib")
set(CMAKE_BUILD_WITH_INSTALL_RPATH ON)
endif()
include(SourceList)
@@ -180,6 +212,11 @@ add_executable(openttd WIN32 ${GENERATED_SOURCE_FILES})
set_target_properties(openttd PROPERTIES OUTPUT_NAME "${BINARY_NAME}")
# All other files are added via target_sources()
if(MSVC)
# Add DPI manifest to project; other WIN32 targets get this via ottdres.rc
target_sources(openttd PRIVATE "${CMAKE_SOURCE_DIR}/os/windows/openttd.manifest")
endif()
add_subdirectory(${CMAKE_SOURCE_DIR}/src)
add_subdirectory(${CMAKE_SOURCE_DIR}/media/baseset)
@@ -217,6 +254,16 @@ if(NOT OPTION_DEDICATED)
link_package(Fontconfig TARGET Fontconfig::Fontconfig)
link_package(ICU_lx)
link_package(ICU_i18n)
if(SDL2_FOUND AND OPENGL_FOUND AND UNIX)
# SDL2 dynamically loads OpenGL if needed, so do not link to OpenGL when
# on Linux. For Windows, we need to link to OpenGL as we also have a win32
# driver using it.
add_definitions(-DWITH_OPENGL)
message(STATUS "OpenGL found -- -DWITH_OPENGL -- (via SDL2)")
else()
link_package(OpenGL TARGET OpenGL::GL)
endif()
endif()
if(APPLE)
@@ -226,6 +273,7 @@ if(APPLE)
${AUDIOTOOLBOX_LIBRARY}
${AUDIOUNIT_LIBRARY}
${COCOA_LIBRARY}
${QUARTZCORE_LIBRARY}
)
add_definitions(
@@ -313,4 +361,8 @@ endif()
include(CreateRegression)
create_regression()
if(APPLE OR WIN32)
find_package(Pandoc)
endif()
include(InstallAndPackage)

View File

@@ -57,6 +57,9 @@ To install both the x64 (64bit) and x86 (32bit) variants (though only one is nec
```
You can open the folder (as a CMake project). CMake will be detected, and you can compile from there.
If libraries are installed but not found, you need to set VCPKG_TARGET_TRIPLET in CMake parameters.
For Visual Studio 2017 you also need to set CMAKE_TOOLCHAIN_FILE.
(Typical values are shown in the MSVC project file command line example)
Alternatively, you can create a MSVC project file via CMake. For this
either download CMake from https://cmake.org/download/ or use the version
@@ -73,6 +76,7 @@ in the build folder are MSVC project files. MSVC can rebuild the project
files himself via the `ZERO_CHECK` project.
## All other platforms
Minimum required version of CMake is 3.9.
```bash
mkdir build

View File

@@ -1,3 +1,57 @@
1.11.0-beta2 (2021-02-28)
------------------------------------------------------------------------
Feature: Add setting to limit fast-forward speed (#8766)
Feature: Significant performance improvements to all video drivers (#8605, #8652, #8660, #8685, #8702, #8703, #8707, #8726, #8740)
Feature: Configurable display refresh-rate, default to 60fps (#8680)
Feature: Automatically upload releases to Steam (#8644)
Feature: Generic Linux builds (#8641)
Feature: [GS] Allow non-question type windows to have no buttons (#8638)
Feature: [macOS] ZIP build (#8614)
Feature: Object class selection string filtering (#8603)
Feature: 'Remove all industries' button in scenario editor (#8550)
Feature: Automatic UI and font zoom levels when supported by the OS (#8537)
Feature: [macOS] Render screen at native resolution by default for HiDPI screens (#8519)
Feature: OpenGL video driver (#7744)
Add: Indonesia Rupiah currency (#8616)
Change: Improve graph period markings (#8732)
Change: Make pathfinder account for maximum order speed, if set (#8722)
Change: Darken graph grid lines for legibility (#8690)
Change: Make order window hotkeys toggle for load & unload variants (#8669)
Change: Use a more specific error message when attempting to bulldoze your own HQ (#8667)
Change: Convert .md to .rtf for Windows/Mac packages (#8617)
Change: Move the 'tree placer algorithm' & 'road drive side' settings to the Settings window (#8566)
Change: Move town name generator selection to mapgen GUI (#8566)
Change: [macOS] Native font rendering (#8518)
Fix: Display of network lobby windows for different GUI sizes (#8765)
Fix: Don't desync if client leaves before you finish downloading map (#8755)
Fix: Allow estimating vehicle clone cost even if short on money (#8748)
Fix: Don't notify twice that a client left because of a timeout (#8746)
Fix: Vehicle cursor size did not account for the interface zoom level (#8739)
Fix #8123: Trams on half-tiles couldn't find depots (#8738)
Fix #8276: [NewGRF] Crash when an object's size was not set (#8719)
Fix #8349: Close depot vehicle list windows when closing the depot window (#8717)
Fix #8594: [NRT] Road pathfinder did not account for roadtype speed limits or lengths of tunnels/bridges (#8710)
Fix: Whole status bar instead of money widget refreshed on money change (#8692)
Fix: Unnecessary status bar redraws when there is no news to show (#8691)
Fix: New orders are non-stop by default (#8689)
Fix: Framerate window showed a slightly higher rate than actually measured (#8682)
Fix: Autorenew failure advice due to bad refit being shown to all companies (#8681)
Fix #8625: Wrong ending year was displayed in highscore table (#8672)
Fix #8620: Scale spacing between date & news in history window according to font scaling (#8671)
Fix: [Win32] Set minimum resolution for timers to 1ms (#8660)
Fix: Mention our websites with https:// (instead of http://) (#8657)
Fix: [Emscripten] Open links in browser (#8655)
Fix: Don't crash when towns upgrade road tiles during expansion (#8651)
Fix #8029: [SDL2] Blank display when under Wayland (#8648)
Fix: Default Network Server List sorter put compatible servers in wrong order (#8626)
Fix: Use non-pulsating red highlight for coverage (#8622)
Fix: Center text and image in vehicle statusbar vertically (#8602)
Fix: Don't walk out of the map when trying to build tunnels (#8600)
Fix: Off-by-one error in desert/rainforest positioning at world gen (#8588)
Fix #8037: Crash when restarting AI that is controlling the same company as the player (#8587)
Fix: Stopped ships shouldn't block depots (#8578)
1.11.0-beta1 (2021-01-22)
------------------------------------------------------------------------
Feature: [GS] Ability to set some extra text in the industry window (#8576)

View File

@@ -27,9 +27,6 @@ macro(compile_flags)
# Enable multi-threaded compilation.
add_compile_options(/MP)
endif()
# Add DPI manifest to project; other WIN32 targets get this via ottdres.rc
list(APPEND GENERATED_SOURCE_FILES "${CMAKE_SOURCE_DIR}/os/windows/openttd.manifest")
endif()
# Add some -D flags for Debug builds. We cannot use add_definitions(), because

View File

@@ -10,8 +10,8 @@ macro(create_regression)
# build folder before we can run the regression
file(GLOB_RECURSE REGRESSION_SOURCE_FILES ${CMAKE_SOURCE_DIR}/regression/*)
foreach(REGRESSION_SOURCE_FILE IN LISTS REGRESSION_SOURCE_FILES)
string(REGEX REPLACE "^${CMAKE_SOURCE_DIR}/regression/" "${CMAKE_BINARY_DIR}/ai/" REGRESSION_BINARY_FILE "${REGRESSION_SOURCE_FILE}")
string(REGEX REPLACE "^${CMAKE_SOURCE_DIR}/regression/" "" REGRESSION_SOURCE_FILE_NAME "${REGRESSION_SOURCE_FILE}")
string(REPLACE "${CMAKE_SOURCE_DIR}/regression/" "" REGRESSION_SOURCE_FILE_NAME "${REGRESSION_SOURCE_FILE}")
string(CONCAT REGRESSION_BINARY_FILE "${CMAKE_BINARY_DIR}/ai/" "${REGRESSION_SOURCE_FILE_NAME}")
if("${REGRESSION_SOURCE_FILE_NAME}" STREQUAL "regression.cfg")
continue()

View File

@@ -31,7 +31,7 @@ The following cache variables may also be set:
#]=======================================================================]
find_package(PkgConfig QUIET)
pkg_check_modules(PC_Allegro QUIET allegro)
pkg_check_modules(PC_Allegro QUIET allegro<5)
find_path(Allegro_INCLUDE_DIR
NAMES allegro.h

View File

@@ -1,3 +1,8 @@
# CMake provides a FindICU module since version 3.7.
# But it doesn't use pkgconfig, doesn't set expected variables,
# And it returns incomplete dependencies if only some modules are searched.
#[=======================================================================[.rst:
FindICU
-------

3
cmake/FindPandoc.cmake Normal file
View File

@@ -0,0 +1,3 @@
if(NOT EXISTS ${PANDOC_EXECUTABLE})
find_program(PANDOC_EXECUTABLE pandoc)
endif()

View File

@@ -95,7 +95,14 @@ set(CPACK_PACKAGE_HOMEPAGE_URL "https://www.openttd.org/")
set(CPACK_PACKAGE_CONTACT "OpenTTD <info@openttd.org>")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "OpenTTD")
set(CPACK_PACKAGE_CHECKSUM "SHA256")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING.md")
if((APPLE OR WIN32) AND EXISTS ${PANDOC_EXECUTABLE})
execute_process(COMMAND ${PANDOC_EXECUTABLE} "${CMAKE_SOURCE_DIR}/COPYING.md" -s -o "${CMAKE_BINARY_DIR}/COPYING.rtf")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_BINARY_DIR}/COPYING.rtf")
else()
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING.md")
endif()
set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md")
set(CPACK_MONOLITHIC_INSTALL YES)
set(CPACK_PACKAGE_EXECUTABLES "openttd;OpenTTD")
@@ -123,8 +130,12 @@ elseif(UNIX)
# With FHS, we can create deb/rpm/... Without it, they would be horribly broken
# and not work. The other way around is also true; with FHS they are not
# usable, and only flat formats work.
if(NOT OPTION_INSTALL_FHS)
if(OPTION_PACKAGE_DEPENDENCIES)
set(CPACK_GENERATOR "TXZ")
set(PLATFORM "generic")
elseif(NOT OPTION_INSTALL_FHS)
set(CPACK_GENERATOR "TXZ")
set(PLATFORM "unknown")
else()
find_program(LSB_RELEASE_EXEC lsb_release)
execute_process(COMMAND ${LSB_RELEASE_EXEC} -is
@@ -149,7 +160,7 @@ elseif(UNIX)
string(REGEX MATCH "ID=(.*)" _ ${OS_RELEASE_CONTENTS})
set(DISTRO_ID ${CMAKE_MATCH_1})
if(DISTRO_ID STREQUAL "arch")
set(PLATFORM "generic")
set(PLATFORM "arch")
set(CPACK_GENERATOR "TXZ")
else()
set(UNSUPPORTED_PLATFORM_NAME "Linux distribution '${DISTRO_ID}' from /etc/os-release")
@@ -163,12 +174,39 @@ elseif(UNIX)
set(CPACK_GENERATOR "TXZ")
message(WARNING "Unknown ${UNSUPPORTED_PLATFORM_NAME} found for packaging; can only pack to a txz. Please consider creating a Pull Request to add support for this distribution.")
endif()
set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-linux-${PLATFORM}-${CPACK_SYSTEM_NAME}")
endif()
set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-linux-${PLATFORM}-${CPACK_SYSTEM_NAME}")
else()
message(FATAL_ERROR "Unknown OS found for packaging; please consider creating a Pull Request to add support for this OS.")
endif()
include(CPack)
if(OPTION_PACKAGE_DEPENDENCIES)
# Install all dependencies we can resolve, with the exception of ones that
# every Linux machine should have. This should make this build as generic
# as possible, where it runs on any machine with the same or newer libc
# than the one this is compiled with.
# We copy these libraries into lib/ folder, so they can be found on game
# startup. See comment in root CMakeLists.txt for how this works exactly.
install(CODE [[
file(GET_RUNTIME_DEPENDENCIES
RESOLVED_DEPENDENCIES_VAR DEPENDENCIES
UNRESOLVED_DEPENDENCIES_VAR UNRESOLVED_DEPENDENCIES
EXECUTABLES openttd
POST_EXCLUDE_REGEXES "ld-linux|libc.so|libdl.so|libm.so|libgcc_s.so|libpthread.so|librt.so|libstdc...so")
file(INSTALL
DESTINATION "${CMAKE_INSTALL_PREFIX}/lib"
FILES ${DEPENDENCIES}
FOLLOW_SYMLINK_CHAIN)
# This should not be possible, but error out when a dependency cannot
# be resolved.
list(LENGTH UNRESOLVED_DEPENDENCIES UNRESOLVED_LENGTH)
if(${UNRESOLVED_LENGTH} GREATER 0)
message(FATAL_ERROR "Unresolved dependencies: ${UNRESOLVED_DEPENDENCIES}")
endif()
]])
endif()

View File

@@ -16,6 +16,7 @@ source_group("Sprite loaders" REGULAR_EXPRESSION "src/spriteloader/")
source_group("Squirrel" REGULAR_EXPRESSION "src/3rdparty/squirrel/squirrel/")
source_group("Tables" REGULAR_EXPRESSION "src/table/")
source_group("Video" REGULAR_EXPRESSION "src/video/")
source_group("Video/GL" REGULAR_EXPRESSION "src/3rdparty/opengl/")
source_group("Widgets" REGULAR_EXPRESSION "src/widgets/")
source_group("Windows files" REGULAR_EXPRESSION "src/os/windows/|\.rc$")

View File

@@ -44,7 +44,9 @@ endfunction()
# set_options()
#
function(set_options)
if(UNIX AND NOT APPLE)
option(OPTION_PACKAGE_DEPENDENCIES "Copy dependencies into lib/ for easy packaging (Linux only)" OFF)
if(UNIX AND NOT APPLE AND NOT OPTION_PACKAGE_DEPENDENCIES)
set(DEFAULT_OPTION_INSTALL_FHS ON)
else()
set(DEFAULT_OPTION_INSTALL_FHS OFF)
@@ -76,6 +78,7 @@ endfunction()
# show_options()
#
function(show_options)
message(STATUS "Option Package Dependencies - ${OPTION_PACKAGE_DEPENDENCIES}")
message(STATUS "Option Dedicated - ${OPTION_DEDICATED}")
message(STATUS "Option Install FHS - ${OPTION_INSTALL_FHS}")
message(STATUS "Option Use assert - ${OPTION_USE_ASSERTS}")

View File

@@ -16,11 +16,18 @@ endif()
set(ARGC 1)
set(ARG_READ NO)
# For MSVC CMake runs this script from a batch file using || to detect errors,
# depending on source path it may quote args, and cause cmd to not understand ||
# and pass it as argument to ourself.
# Read all the arguments given to CMake; we are looking for -- and everything
# that follows. Those are our api files.
# that follows, until ||. Those are our api files.
while(ARGC LESS CMAKE_ARGC)
set(ARG ${CMAKE_ARGV${ARGC}})
if(ARG STREQUAL "||")
set(ARG_READ NO)
endif()
if(ARG_READ)
list(APPEND SCRIPT_API_BINARY_FILES "${ARG}")
endif()

View File

@@ -5,10 +5,14 @@
<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; }
span.free { font-family: "Courier New", Courier, mono; background-color: rgb( 70, 190, 70); }
span.usable { font-family: "Courier New", Courier, mono; background-color: rgb( 50, 150, 150); }
span.used { font-family: "Courier New", Courier, mono; background-color: rgb(120, 120, 255); }
span.pool { font-family: "Courier New", Courier, mono; background-color: rgb(220, 120, 255); }
span.patch { font-family: "Courier New", Courier, mono; background-color: rgb(255, 165, 0); }
span.abuse { font-family: "Courier New", Courier, mono; background-color: rgb(255, 100, 100); }
span.rearrange{ font-family: "Courier New", Courier, mono; background-color: rgb(160, 160, 255); }
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; }
@@ -20,13 +24,7 @@
<span style="font-weight: bold;"></span>Nine 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">&nbsp;</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>
@@ -39,6 +37,16 @@ the array so you can quickly see what is used and what is not.
<li><span style="font-weight: bold;">m7</span> - 8 bits in size, is used for general storage</li>
<li><span style="font-weight: bold;">m8</span> - 16 bits in size, is used for general storage</li>
</ul>
<p>
<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="usable">X</span></span> - bit is used, but could be freed if needed</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="pool">X</span></span> - bit is used for an index on a pool</li>
<li><span style="font-weight: bold;"><span class="patch">X</span></span> - bit is introduced by a patch</li>
<li><span style="font-weight: bold;"><span class="abuse">X</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="rearrange">X</span></span> - bit is accessed, but a rearrangement of the map array could free some of these bits (probably not done for bit alignment)</li>
</ul>
<table align=center border="1" cellpadding="2" cellspacing="2">
<tbody>
@@ -71,134 +79,103 @@ the array so you can quickly see what is used and what is not.
<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>
<td class="bits" rowspan=27><span class="used" title="Tile type">XXXX</span> <span class="used" title="Presence and direction of bridge above">XX</span> <span class="used" title="Tropic Zone: only meaningfull in tropic climate. It contains the definition of the available zones">XX</span></td>
<td class="bits" rowspan=27><span class="used" title="Tile height">XXXX XXXX</span></td>
<td class="bits" rowspan=2><span class="free">OOO</span><span class="usable" title="Owner (always OWNER_NONE)">1 OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
<td class="bits"><span class="used" title="Type of hedge on NE border">XXX</span> <span class="used" title="Snow presence">X</span><span class="free">OOOO</span></td>
<td class="bits" rowspan=2><span class="used" title="Type of hedge on SW border">XXX</span> <span class="used" title="Type of hedge on SE border">XXX</span><span class="free">OO</span></td>
<td class="bits" rowspan=2><span class="used" title="Update counter">XXX</span> <span class="used" title="Type: grass, rough land, rocks, fields, snow, desert">XXX</span> <span class="used" title="Density">XX</span></td><td class="bits" rowspan=2><span class="free" >OOO</span><span class="used" title="Type of hedge on NW border">X XX</span><span class="free">OO</span></td>
<td class="bits" rowspan=2><span class="free">OOOO OOOO</span></td>
<td class="bits" rowspan=2><span class="free">OOOO OOOO 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>
<td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
<td class="bits"><span class="pool" title="Industry index on pool">XXXX XXXX XXXX XXXX</span></td>
<td class="bits"><span class="used" title="Type of hedge on NE border">XXX</span> <span class="used" title="Field production stage">XXXXX</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">X<span class="free">OO</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 OOOO</span></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>
<td class="bits"><span class="free">OOOO OOOO OO</span>XX XXXX</td>
<td class="bits" rowspan=3><span class="used" title="Ship docking tile status (for half-tile with water)">X</span><span class="free">OO</span><span class="used" title="Owner">X XXXX</span></td>
<td class="bits"><span class="free">OOOO</span> <span class="used" title="Reserved tracks">XXXX</span> <span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span> </td>
<td class="bits"><span class="free">OOOO</span> <span class="used" title="Ground type: fences, snow, desert">XXXX</span></td>
<td class="bits"><span class="used" title="Rail tile type: rail, rail with signals, depot">OO</span> <span class="used" title="Track pieces">XXXXXX</span></td>
<td class="bits" rowspan=3><span class="free">OOOO OOOO</span></td>
<td class="bits" rowspan=3><span class="free">OOOO OOOO</span></td>
<td class="bits" rowspan=3><span class="free">OOOO OOOO OO</span><span class="used" title="Railway type">XX XXXX</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 <span class="free">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>
<td class="bits">-inherit-</td>
<td class="bits"><span class="free">OOOO</span> <span class="used" title="Reserved tracks">XXXX</span> <span class="used" title="Signal types and sempahore/lights">XXXX XXXX</span></td>
<td class="bits"><span class="used" title="Signals present">XXXX</span> <span class="free">OOOO</span></td>
<td class="bits"><span class="used" title="Signals colors">XXXX</span> <span class="used" title="Ground type: fences, snow, desert">XXXX</span></td>
<td class="bits"><span class="used" title="Rail tile type: rail, rail with signals, depot">O1</span> <span class="used" title="Track pieces">XXXXXX</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">-inherit-</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>
<td class="bits">-inherit-</td>
<td class="bits"><span class="pool" title="Depot index on pool">XXXX XXXX XXXX XXXX</span></td>
<td class="bits"><span class="free">OOOO</span> <span class="free">OOOO</span></td>
<td class="bits"><span class="free">OOOO</span> <span class="used" title="Ground type: fences, snow, desert (fences on depot are not valid)">XXXX</span></td>
<td class="bits"><span class="used" title="Rail tile type: rail, rail with signals, depot">11</span><span class="free">O</span><span class="used" title="PBS reservation">X</span> <span class="free">OO</span><span class="used" title="Depot exit direction">XX</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">OO</span>XX XXXX</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"><span class="free">OO</span>X<span class="free">O</span> XXXX</td>
<td class="bits"><span class="free">OOOO</span> XXXX XX<span class="free">OO OOOO</span></td>
<td class="bits"><span class="free">OOO</span><span class="used" title="Owner of road">X XXXX</span></td>
<td class="bits" rowspan=2><span class="pool" title="Town index on pool">XXXX XXXX XXXX XXXX</span></td>
<td class="bits"><span class="used" title="Owner of tram">XXXX</span> <span class="used" title="Tram pieces">XXXX</span></td>
<td class="bits" rowspan=3><span class="free">OO</span><span class="used" title="Road type">XX XXXX</span></td>
<td class="bits"><span class="used" title="Tile type: simple road (00), level crossing (01), road depot (10)">OO</span> <span class="used" title="Disallow vehicles to go a specific direction">XX</span> <span class="used" title="Road pieces">XXXX</span></td>
<td class="bits"><span class="free">OO</span> <span class="used" title="Pavement type">XXX</span><span class="free">OOO</span></td>
<td class="bits"><span class="free">OO</span><span class="used" title="Snow/desert present">X</span> <span class="free">O</span><span class="used" title="Roadworks counter">XXXX</span></td>
<td class="bits" rowspan=1><span class="free">OOOO</span> <span class="used" title="Tram type">XXXX XX<span class="free">OO OOOO</span></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 <span class="free">OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></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"><span class="free">OO</span>XX XXXX</td>
<td class="bits"><span class="free">OOOO</span> XXXX XXXX XXXX</td>
<td class="bits"><span class="free">OOO</span><span class="used" title="Owner of rail track">X XXXX</span></td>
<td class="bits"><span class="used" title="Owner of tram">XXXX</span> <span class="free">OOOO</span></td>
<td class="bits"><span class="used" title="Tile type: simple road (00), level crossing (01), road depot (10)">O1</span> <span class="used" title="Lights are on">X</span> <span class="used" title="PBS reservation">X</span><span class="free">OOO</span><span class="used" title="Direction of the rail and roads">X</span></td>
<td class="bits"><span class="free">OO</span> <span class="used" title="Pavement type">XXX</span><span class="free">OOO</span></td>
<td class="bits"><span class="free">OO</span><span class="used" title="Snow/desert present">X</span> <span class="used" title="Owner of road">XXXXX</span></td>
<td class="bits" rowspan=1><span class="free">OOOO</span> <span class="used" title="Tram type">XXXX XX</span> <span class="used" title="Railway type">XXXXXX</span></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">-inherit-</td>
<td class="bits">XX<span class="free">OO OO</span>XX</td>
<td class="bits"><span class="free">OOO</span><span class="used" title="Owner of the depot">X XXXX</span></td>
<td class="bits"><span class="pool" title="Depot index on pool">XXXX XXXX XXXX XXXX</span></td>
<td class="bits"><span class="usable" title="Owner of tram depot">XXXX</span> <span class="free">OOOO</span></td>
<td class="bits"><span class="used" title="Tile type: simple road (00), level crossing (01), road depot (10)">1O</span><span class="free">OO OO</span><span class="used" title="Depot exit direction">XX</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="free">OO</span>X<span class="free">O</span> XXXX</td>
<td class="bits">-inherit-</td>
<td class="bits"><span class="free">OO</span><span class="used" title="Snow/desert present">X</span> <span class="usable" title="Owner of road depot">XXXXX</span></td>
<td class="bits" rowspan=1><span class="free">OOOO</span> <span class="used" title="Tram type">XXXX XX</span><span class="free">OO OOOO</span></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>
<td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
<td rowspan=2>3</td>
<td class="caption">finished house</td>
<td class="bits" rowspan=2><span class="used" title="House random bits">XXXX XXXX</span></td>
<td class="bits" rowspan=2><span class="pool" title="Town index on pool">XXXX XXXX XXXX XXXX</span></td>
<td class="bits"><span class="used" title="House is complete/in construction (see m5)">1</span> <span class="used" title="House type (m4 + m3[6])">X</span><span class="free">O</span><span class="usable" title="Activated triggers (bits 2..4 don't have a meaning)">XXX</span><span class="used" title="Activated triggers (bits 2..4 don't have a meaning)">XX</span></td>
<td class="bits" rowspan=2><span class="used" title="House type (m4 + m3[6])">XXXX XXXX</span></td>
<td class="bits"><span class="used" title="Age in years, clamped at 255">XXXX XXXX</span></td>
<td class="bits" rowspan=2><span class="abuse" title="Newhouses activated: periodic processing time remaining; if not, lift position for houses 04 and 05">XXXX XX</span><span class="free">OO</span></td>
<td class="bits" rowspan=2><span class="abuse" title="If newhouses active, m7 is the current animation frame">XXXX</span> <span class="abuse" title="If newhouses active, m7 is the current animantion frame; if not, lift behaviour for houses 04 and 05">XXXX</span></td>
<td class="bits" rowspan=2><span class="free">OOOO OOOO OOOO OOOO</span></td>
</tr>
<tr>
<td class="caption">house under construction</td>
<td class="bits"><span class="used" title="House is complete/in construction (see m5)">O</span> <span class="used" title="House type (m4 + m3[6])">X</span><span class="free">O</span><span class="usable" title="Activated triggers (bits 2..4 don't have a meaning)">XXX</span><span class="used" title="Activated triggers (bits 2..4 don't have a meaning)">XX</span></td>
<td class="bits"><span class="free">OOO</span><span class="used" title="Construction stage">XX</span> <span class="used" title="Construction counter">XXX</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">O</span>XX<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">O</span><span class="used" title="Water class">XX</span><span class="usable" title="Owner (always OWNER_NONE)">1 OOOO</span></td>
<td class="bits"><span class="free">OOOO OOO</span><span class="used" title="Tree ground">XXX</span> <span class="used" title="Tree density">XX</span> <span class="used" title="Tree counter">XXXX</span></td>
<td class="bits"><span class="usable" title="Tree type unused bits">XX</span><span class="used" title="Tree type">XX XXXX</span></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="used" title="Number of trees on tile (+1)">XX</span><span class="free">OO O</span><span class="used" title="Tree growth">XXX</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"><span class="free">OOOO OOOO OOOO OOOO</span></td>
@@ -206,189 +183,155 @@ the array so you can quickly see what is used and what is not.
<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">XXXX XXXX</td>
<td class="bits">XXXX XXXX XXXX XXXX</td>
<td class="bits">XXXX <span class="free">OOOO</span></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>
<td class="bits"><span class="free">OOOO OOOO OO</span>XX XXXX</td>
<td class="bits" rowspan=7><span class="free">O</span><span class="used" title="Water class">XX</span> <span class="used" title="Owner">XXXXX</span></td>
<td class="bits" rowspan=7><span class="pool" title="Station index on pool">XXXX XXXX XXXX XXXX</span></td>
<td class="bits" rowspan=2><span class="used" title="Random bits">XXXX</span> <span class="free">OOOO</span></td>
<td class="bits" rowspan=2><span class="used" title="Custom station specifications ID">XXXX XXXX</span></td>
<td class="bits"><span class="used" title="Graphics index">XXXX XXXX</span></td>
<td class="bits" rowspan=2><span class="free">OO</span><span class="used" title="Station type">XXX</span> <span class="used" title="Reserved track">X</span><span class="free">OO</span></td>
<td class="bits" rowspan=2><span class="used" title="Animation frame">XXXX XXXX</span></td>
<td class="bits" rowspan=2><span class="free">OOOO OOOO OO</span><span class="used" title="Railway type">XX XXXX</span></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>
<td class="bits">-inherit-</td>
<td class="bits"><span class="usable" title="Graphics index">OOOO OOO</span><span class="used" title="Graphics index">X</span></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">OO</span>XX XXXX</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">OOO</span>X XXXX</td>
<td class="bits"><span class="free">OOOO</span> XXXX XX<span class="free">OO OOOO</span></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>
<td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
<td class="bits"><span class="used" title="Owner of tram">XXXX</span> <span class="free">OOOO</span></td>
<td class="bits"><span class="free">OO</span><span class="used" title="Roadtype for road stop">XX XXXX</span></td>
<td class="bits"><span class="usable" title="Graphics index">OOOO O</span><span class="used" title="Graphics index: 00 (exit towards NE), 01 (exit towards SE), 02 (exit towards SW), 03 (exit towards NW), 04 (drive through X), 05 (drive through Y)">XXX</span></td>
<td class="bits" rowspan=5><span class="free">OO</span><span class="used" title="Station type">XX X</span><span class="free">OOO</span></td>
<td class="bits"><span class="free">OOO</span><span class="used" title="Owner of road">X XXXX</span></td>
<td class="bits"><span class="free">OOOO</span> <span class="used" title="Tram type">XXXX XX<span class="free">OO 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="used" title="Random bits">XXXX</span> <span class="free">OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="used" title="Graphics index">XXXX XXXX</span></td>
<td class="bits"><span class="used" title="Animation frame">XXXX XXXX</span></td>
<td class="bits" rowspan=4><span class="free">OOOO OOOO OOOO OOOO</span></td>
</tr>
<tr>
<td class="caption">dock</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="usable" title="Graphics index">OOOO </span><span class="usable" title="Graphics index">O</span><span class="used" title="Graphics index">XXX</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>
<td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></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="usable">OOOO OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO 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="usable">OOOO OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
</tr>
<tr>
<td rowspan=3>6</td>
<td rowspan=4>6</td>
<td class="caption">sea, shore</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">OOOO OOOO OOOO OOOO</span></td>
<td class="bits" rowspan=4><span class="used" title="Ship docking tile status">X</span> <span class="used" title="Water class">XX</span> <span class="used" title="Owner">XXXXX</span></td>
<td class="bits" rowspan=3><span class="free">OOOO OOOO OOOO OOOO</span></td>
<td class="bits" rowspan=4><span class="free">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>
<td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
<td class="bits"><span class="used" title="Water tile type: coast, clear, lock, depot">O<span class="usable">OO</span>O</span> <span class="free">OOO</span><span class="used" title="Sea shore flag">X</span></td>
<td class="bits" rowspan=4><span class="free">OOOO OOOO</span></td>
<td class="bits" rowspan=4><span class="free">OOOO OOOO</td>
<td class="bits" rowspan=4><span class="free">OOOO OOOO 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="used" title="Canal/river random bits">XXXX XXXX</span></td>
<td class="bits"><span class="used" title="Water tile type: coast, clear, lock, depot">O<span class="usable">OO</span>O</span> <span class="free">OOOO</span></td>
</tr>
<tr>
<td class="caption">lock</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>
<td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
<td class="bits"><span class="used" title="Water tile type: coast, clear, lock, depot">O<span class="usable">OO</span>1</span> <span class="used" title="Lock part">XX</span> <span class="used" title="Lock orientation m5[1..0]">XX</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="pool" title="Depot index on pool">XXXX XXXX XXXX XXXX</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">-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="free">OOOO OOOO OOOO OOOO</span></td>
<td class="bits"><span class="used" title="Water tile type: coast, clear, lock, depot">1<span class="usable">OOO</span></span> <span class="free">OO</span><span class="used" title="Depot axis">X</span> <span class="used" title="Depot part">X</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>
<td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
<td rowspan=2>8</td>
<td class="caption">finished industry</td>
<td class="bits"><span class="used" title="Completed industry">1</span> <span class="used" title="Water class">XX</span><span class="free">O</span> <span class="free">OOOO</span></td>
<td class="bits" rowspan=2><span class="pool" title="Industry index on pool">XXXX XXXX XXXX XXXX</span></td>
<td class="bits" rowspan=2><span class="used" title="Random bits">XXXX XXXX</span></td>
<td class="bits" rowspan=2><span class="used" title="Animation loop">XXXX XXXX</span></td>
<td class="bits" rowspan=2><span class="used" title="Industry graphics ID (m5 + m6[2])">XXXX XXXX</span></td>
<td class="bits" rowspan=2><span class="free">OO</span><span class="used" title="Random triggers (NewGRF)">XXX</span> <span class="used" title="Industry graphics ID (m5 + m6[2])">X</span><span class="free">OO</span></td>
<td class="bits" rowspan=2><span class="used" title="Animation frame">XXXX XXXX</span></td>
<td class="bits" rowspan=2><span class="free">OOOO OOOO OOOO OOOO</span></td>
</tr>
<tr>
<td class="caption">industry under construction</td>
<td class="bits"><span class="used" title="Completed industry">O</span> <span class="used" title="Water class">XX</span><span class="free">O</span> <span class="used" title="If under construction, construction counter and stage of construction">XXXX</span></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">X<span class="free">OO</span>X XXXX</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"><span class="free">OO</span>XX XXXX</td>
<td class="bits">X<span class="free">OO</span>X XXXX</td>
<td class="bits" rowspan=2><span class="used" title="Ship docking tile status (for aqueducts)">X</span><span class="free">OO</span> <span class="used" title="Owner">XXXXX</span></td>
<td class="bits" rowspan=2><span class="free">OOOO OOOO OOOO OOOO</span></td>
<td class="bits" rowspan=2><span class="rearrange" title="Owner of tram (road only; a rearrangement can free some of these bits)">XXXX</span> <span class="free">OOOO</span></td>
<td class="bits" rowspan=2><span class="free">OO</span><span class="used" title="Road type">XX XXXX</span></td>
<td class="bits"><span class="used" title="Bridge or tunnel bit">O</span><span class="free">OO</span><span class="rearrange" title="PBS reservation (rail; a rearrangement can free some of these bits)">X</span> <span class="used" title="Transport type">XX</span> <span class="used" title="Direction of the tunnel/bridge">XX</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="free">OO</span>XX XXXX</td>
<td class="bits"><span class="free">OOOO</span> XXXX XXXX XXXX</td>
<td class="bits" rowspan=2><span class="free">OO</span><span class="used" title="Snow/desert present">X</span><span class="rearrange" title="Owner of road (road only; a rearrangement can free some of these bits)">X XXXX</span></td>
<td class="bits" rowspan=2><span class="free">OOOO</span> <span class="used" title="Tram type">XXXX XX</span><span class="rearrange" title="Railway type (rail only; a rearrangement can free some of these bits)">XX XXXX</span></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"><span class="free">OOOO OOOO OOOO OOOO</span></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>
<td class="bits">-inherit-</td>
<td class="bits"><span class="used" title="Bridge or tunnel bit">1</span><span class="free">OO</span><span class="rearrange" title="PBS reservation (rail; a rearrangement can free some of these bits)">X</span> <span class="used" title="Transport type">XX</span> <span class="used" title="Direction of the tunnel/bridge">XX</span></td>
<td class="bits"><span class="free">OO</span><span class="used" title="Bridge type: wooden, steel,...">XX XX</span><span class="free">OO</span></td>
</tr>
<tr>
<td rowspan=2>A</td>
<td>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">O</span><span class="used" title="Water class">XX</span> <span class="used" title="Owner">XXXXX</span></td>
<td class="bits"><span class="pool" title="Object index on pool (m2 + m5)">XXXX XXXX XXXX XXXX</span></td>
<td class="bits"><span class="used" title="Random bits">XXXX XXXX</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits">XXXX XXXX</td>
<td class="bits"><span class="pool" title="Object index on pool (m2 + m5)">XXXX XXXX</span></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 OOOO OOOO</span></td>
<td class="bits"><span class="used" title="Animation counter">XXXX XXXX</span></td>
<td class="bits" rowspan=1><span class="free">OOOO OOOO OOOO OOOO</span></td>
</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>
<td class="bits">FEDC BA98 7654 3210</td>
</tr>
<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>
<th>m8 (16)</th>
</tr>
</tbody>
</table>

View File

@@ -1,6 +1,6 @@
OpenTTD's known bugs
Last updated: 2021-01-22
Release version: 1.11.0-beta1
Last updated: 2021-02-28
Release version: 1.11.0-beta2
------------------------------------------------------------------------
@@ -364,35 +364,6 @@ Trains might not stop at platforms that are currently being changed [#5553]:
list multiple times in a row or if there is only one station
in theorder list (see #5684).
Inconsistent catchment areas [#5661]:
Due to performance decisions the catchment area for cargo accepted by a
station for delivery to houses or industries differs from the catchment
area for cargo that is delivered to stations from houses or industries.
Conceptually they work the same, but the effect in game differs. They
work by finding the closest destination "around" the source which is
within a certain distance. This distance depends on the type of station,
e.g. road stops have a smaller catchment area than large airports.
In both cases the bounding box, the smallest rectangle that contains
all tiles of something, is searched for the target of the cargo,
and then spiraling outwards finding the closest tile of the target.
In the case of a station with two tiles spread far apart with a house
that is within the station's bounding box, it would be possible that
the spiraling search from the house does not reach one of the station
tiles before the search ends, i.e. all tiles within that distance
are searched. So the house does not deliver cargo to the station.
On the other hand, the station will deliver cargo because the house
falls within the bounding box, and thus search area.
It is possible to make these consistent, but then cargo from a house
to a station needs to search up to 32 tiles around itself, i.e. 64
by 64 tiles, to find all possible stations it could deliver to
instead of 10 by 10 tiles (40 times more tiles). Alternatively the
search from a station could be changed to use the actual tiles, but
that would require considering checking 10 by 10 tiles for each of
the tiles of a station, instead of just once.
Some houses and industries are not affected by transparency [#5817]:
Some of the default houses and industries (f.e. the iron ore mine) are
not affected by the transparency options. This is because the graphics
@@ -409,3 +380,12 @@ Involuntary cargo exchange with cargodist via neutral station [#6114]:
shared station make the order "no unload" and if you're unloading make
it "no load". Cargodist will then figure out that it should not create
such a route.
Incorrect ending year displayed in end of game newspaper [#8625]
The ending year of the game is configurable, but the date displayed in
the newspaper at the end of the game is part of the graphics, not text.
So to fix this would involve fixing the graphics in every baseset,
including the original. Additionally, basesets are free to put this
text in different positions (which they do), making a proper solution
to this infinitely more complex for a part of the game that fewer than
1% of players ever see.

View File

@@ -1,4 +1,4 @@
FROM emscripten/emsdk
FROM emscripten/emsdk:2.0.10
COPY emsdk-liblzma.patch /
RUN cd /emsdk/upstream/emscripten && patch -p1 < /emsdk-liblzma.patch

View File

@@ -71,6 +71,34 @@ Module.preRun.push(function() {
* add_server("localhost", 3979); */
}
var leftButtonDown = false;
document.addEventListener("mousedown", e => {
if (e.button == 0) {
leftButtonDown = true;
}
});
document.addEventListener("mouseup", e => {
if (e.button == 0) {
leftButtonDown = false;
}
});
window.openttd_open_url = function(url, url_len) {
const url_string = UTF8ToString(url, url_len);
function openWindow() {
document.removeEventListener("mouseup", openWindow);
window.open(url_string, '_blank');
}
/* Trying to open the URL while the mouse is down results in the button getting stuck, so wait for the
* mouse to be released before opening it. However, when OpenTTD is lagging, the mouse can get released
* before the button click even registers, so check for that, and open the URL immediately if that's the
* case. */
if (leftButtonDown) {
document.addEventListener("mouseup", openWindow);
} else {
openWindow();
}
}
/* https://github.com/emscripten-core/emscripten/pull/12995 implements this
* properly. Till that time, we use a polyfill. */
SOCKFS.websocket_sock_ops.createPeer_ = SOCKFS.websocket_sock_ops.createPeer;

View File

@@ -29,5 +29,7 @@
<string>Copyright 2004-${CURRENT_YEAR} The OpenTTD team</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSHighResolutionCapable</key>
<string>True</string>
</dict>
</plist>

View File

@@ -56,3 +56,13 @@ cat <<EOF > notarize.json
EOF
gon notarize.json
app_filename=(_CPack_Packages/*/Bundle/openttd-*/OpenTTD.app)
if [ "${app_filename}" = "_CPack_Packages/*/Bundle/openttd-*/OpenTTD.app" ]; then
echo "No .app found in the _CPack_Packages directory, skipping stapling."
exit 0
fi;
# Now staple the ticket to the .app
xcrun stapler staple "${app_filename[0]}"

57
os/steam/release.vdf Normal file
View File

@@ -0,0 +1,57 @@
"AppBuild"
{
"AppID" "1536610"
"Desc" "@@DESCRIPTION@@"
"SetLive" "@@BRANCH@@"
"ContentRoot" "./"
"BuildOutput" "build/"
"Depots"
{
"1536613"
{
"ContentRoot" "./steam-win32"
"FileMapping"
{
"LocalPath" "*"
"DepotPath" "."
"recursive" "1"
}
}
"1536612"
{
"ContentRoot" "./steam-win64"
"FileMapping"
{
"LocalPath" "*"
"DepotPath" "."
"recursive" "1"
}
}
"1536614"
{
"ContentRoot" "./steam-macos"
"FileMapping"
{
"LocalPath" "*"
"DepotPath" "."
"recursive" "1"
}
}
"1536615"
{
"ContentRoot" "./steam-linux"
"FileMapping"
{
"LocalPath" "*"
"DepotPath" "."
"recursive" "1"
}
}
}
}

View File

@@ -1,3 +1,4 @@
add_subdirectory(md5)
add_subdirectory(squirrel)
add_subdirectory(opengl)
add_subdirectory(os2)

10
src/3rdparty/opengl/CMakeLists.txt vendored Normal file
View File

@@ -0,0 +1,10 @@
add_files(
khrplatform.h
glext.h
CONDITION OPENGL_FOUND
)
add_files(
wglext.h
CONDITION WIN32 AND OPENGL_FOUND
)

12861
src/3rdparty/opengl/glext.h vendored Normal file

File diff suppressed because it is too large Load Diff

290
src/3rdparty/opengl/khrplatform.h vendored Normal file
View File

@@ -0,0 +1,290 @@
#ifndef __khrplatform_h_
#define __khrplatform_h_
/*
** Copyright (c) 2008-2018 The Khronos Group Inc.
**
** Permission is hereby granted, free of charge, to any person obtaining a
** copy of this software and/or associated documentation files (the
** "Materials"), to deal in the Materials without restriction, including
** without limitation the rights to use, copy, modify, merge, publish,
** distribute, sublicense, and/or sell copies of the Materials, and to
** permit persons to whom the Materials are furnished to do so, subject to
** the following conditions:
**
** The above copyright notice and this permission notice shall be included
** in all copies or substantial portions of the Materials.
**
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
*/
/* Khronos platform-specific types and definitions.
*
* The master copy of khrplatform.h is maintained in the Khronos EGL
* Registry repository at https://github.com/KhronosGroup/EGL-Registry
* The last semantic modification to khrplatform.h was at commit ID:
* 67a3e0864c2d75ea5287b9f3d2eb74a745936692
*
* Adopters may modify this file to suit their platform. Adopters are
* encouraged to submit platform specific modifications to the Khronos
* group so that they can be included in future versions of this file.
* Please submit changes by filing pull requests or issues on
* the EGL Registry repository linked above.
*
*
* See the Implementer's Guidelines for information about where this file
* should be located on your system and for more details of its use:
* http://www.khronos.org/registry/implementers_guide.pdf
*
* This file should be included as
* #include <KHR/khrplatform.h>
* by Khronos client API header files that use its types and defines.
*
* The types in khrplatform.h should only be used to define API-specific types.
*
* Types defined in khrplatform.h:
* khronos_int8_t signed 8 bit
* khronos_uint8_t unsigned 8 bit
* khronos_int16_t signed 16 bit
* khronos_uint16_t unsigned 16 bit
* khronos_int32_t signed 32 bit
* khronos_uint32_t unsigned 32 bit
* khronos_int64_t signed 64 bit
* khronos_uint64_t unsigned 64 bit
* khronos_intptr_t signed same number of bits as a pointer
* khronos_uintptr_t unsigned same number of bits as a pointer
* khronos_ssize_t signed size
* khronos_usize_t unsigned size
* khronos_float_t signed 32 bit floating point
* khronos_time_ns_t unsigned 64 bit time in nanoseconds
* khronos_utime_nanoseconds_t unsigned time interval or absolute time in
* nanoseconds
* khronos_stime_nanoseconds_t signed time interval in nanoseconds
* khronos_boolean_enum_t enumerated boolean type. This should
* only be used as a base type when a client API's boolean type is
* an enum. Client APIs which use an integer or other type for
* booleans cannot use this as the base type for their boolean.
*
* Tokens defined in khrplatform.h:
*
* KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values.
*
* KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0.
* KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0.
*
* Calling convention macros defined in this file:
* KHRONOS_APICALL
* KHRONOS_APIENTRY
* KHRONOS_APIATTRIBUTES
*
* These may be used in function prototypes as:
*
* KHRONOS_APICALL void KHRONOS_APIENTRY funcname(
* int arg1,
* int arg2) KHRONOS_APIATTRIBUTES;
*/
#if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC)
# define KHRONOS_STATIC 1
#endif
/*-------------------------------------------------------------------------
* Definition of KHRONOS_APICALL
*-------------------------------------------------------------------------
* This precedes the return type of the function in the function prototype.
*/
#if defined(KHRONOS_STATIC)
/* If the preprocessor constant KHRONOS_STATIC is defined, make the
* header compatible with static linking. */
# define KHRONOS_APICALL
#elif defined(_WIN32)
# define KHRONOS_APICALL __declspec(dllimport)
#elif defined (__SYMBIAN32__)
# define KHRONOS_APICALL IMPORT_C
#elif defined(__ANDROID__)
# define KHRONOS_APICALL __attribute__((visibility("default")))
#else
# define KHRONOS_APICALL
#endif
/*-------------------------------------------------------------------------
* Definition of KHRONOS_APIENTRY
*-------------------------------------------------------------------------
* This follows the return type of the function and precedes the function
* name in the function prototype.
*/
#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__)
/* Win32 but not WinCE */
# define KHRONOS_APIENTRY __stdcall
#else
# define KHRONOS_APIENTRY
#endif
/*-------------------------------------------------------------------------
* Definition of KHRONOS_APIATTRIBUTES
*-------------------------------------------------------------------------
* This follows the closing parenthesis of the function prototype arguments.
*/
#if defined (__ARMCC_2__)
#define KHRONOS_APIATTRIBUTES __softfp
#else
#define KHRONOS_APIATTRIBUTES
#endif
/*-------------------------------------------------------------------------
* basic type definitions
*-----------------------------------------------------------------------*/
#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__)
/*
* Using <stdint.h>
*/
#include <stdint.h>
typedef int32_t khronos_int32_t;
typedef uint32_t khronos_uint32_t;
typedef int64_t khronos_int64_t;
typedef uint64_t khronos_uint64_t;
#define KHRONOS_SUPPORT_INT64 1
#define KHRONOS_SUPPORT_FLOAT 1
#elif defined(__VMS ) || defined(__sgi)
/*
* Using <inttypes.h>
*/
#include <inttypes.h>
typedef int32_t khronos_int32_t;
typedef uint32_t khronos_uint32_t;
typedef int64_t khronos_int64_t;
typedef uint64_t khronos_uint64_t;
#define KHRONOS_SUPPORT_INT64 1
#define KHRONOS_SUPPORT_FLOAT 1
#elif defined(_WIN32) && !defined(__SCITECH_SNAP__)
/*
* Win32
*/
typedef __int32 khronos_int32_t;
typedef unsigned __int32 khronos_uint32_t;
typedef __int64 khronos_int64_t;
typedef unsigned __int64 khronos_uint64_t;
#define KHRONOS_SUPPORT_INT64 1
#define KHRONOS_SUPPORT_FLOAT 1
#elif defined(__sun__) || defined(__digital__)
/*
* Sun or Digital
*/
typedef int khronos_int32_t;
typedef unsigned int khronos_uint32_t;
#if defined(__arch64__) || defined(_LP64)
typedef long int khronos_int64_t;
typedef unsigned long int khronos_uint64_t;
#else
typedef long long int khronos_int64_t;
typedef unsigned long long int khronos_uint64_t;
#endif /* __arch64__ */
#define KHRONOS_SUPPORT_INT64 1
#define KHRONOS_SUPPORT_FLOAT 1
#elif 0
/*
* Hypothetical platform with no float or int64 support
*/
typedef int khronos_int32_t;
typedef unsigned int khronos_uint32_t;
#define KHRONOS_SUPPORT_INT64 0
#define KHRONOS_SUPPORT_FLOAT 0
#else
/*
* Generic fallback
*/
#include <stdint.h>
typedef int32_t khronos_int32_t;
typedef uint32_t khronos_uint32_t;
typedef int64_t khronos_int64_t;
typedef uint64_t khronos_uint64_t;
#define KHRONOS_SUPPORT_INT64 1
#define KHRONOS_SUPPORT_FLOAT 1
#endif
/*
* Types that are (so far) the same on all platforms
*/
typedef signed char khronos_int8_t;
typedef unsigned char khronos_uint8_t;
typedef signed short int khronos_int16_t;
typedef unsigned short int khronos_uint16_t;
/*
* Types that differ between LLP64 and LP64 architectures - in LLP64,
* pointers are 64 bits, but 'long' is still 32 bits. Win64 appears
* to be the only LLP64 architecture in current use.
*/
#ifdef _WIN64
typedef signed long long int khronos_intptr_t;
typedef unsigned long long int khronos_uintptr_t;
typedef signed long long int khronos_ssize_t;
typedef unsigned long long int khronos_usize_t;
#else
typedef signed long int khronos_intptr_t;
typedef unsigned long int khronos_uintptr_t;
typedef signed long int khronos_ssize_t;
typedef unsigned long int khronos_usize_t;
#endif
#if KHRONOS_SUPPORT_FLOAT
/*
* Float type
*/
typedef float khronos_float_t;
#endif
#if KHRONOS_SUPPORT_INT64
/* Time types
*
* These types can be used to represent a time interval in nanoseconds or
* an absolute Unadjusted System Time. Unadjusted System Time is the number
* of nanoseconds since some arbitrary system event (e.g. since the last
* time the system booted). The Unadjusted System Time is an unsigned
* 64 bit value that wraps back to 0 every 584 years. Time intervals
* may be either signed or unsigned.
*/
typedef khronos_uint64_t khronos_utime_nanoseconds_t;
typedef khronos_int64_t khronos_stime_nanoseconds_t;
#endif
/*
* Dummy value used to pad enum types to 32 bits.
*/
#ifndef KHRONOS_MAX_ENUM
#define KHRONOS_MAX_ENUM 0x7FFFFFFF
#endif
/*
* Enumerated boolean type
*
* Values other than zero should be considered to be true. Therefore
* comparisons should not be made against KHRONOS_TRUE.
*/
typedef enum {
KHRONOS_FALSE = 0,
KHRONOS_TRUE = 1,
KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM
} khronos_boolean_enum_t;
#endif /* __khrplatform_h_ */

845
src/3rdparty/opengl/wglext.h vendored Normal file
View File

@@ -0,0 +1,845 @@
#ifndef __wgl_wglext_h_
#define __wgl_wglext_h_ 1
#ifdef __cplusplus
extern "C" {
#endif
/*
** Copyright 2013-2020 The Khronos Group Inc.
** SPDX-License-Identifier: MIT
**
** This header is generated from the Khronos OpenGL / OpenGL ES XML
** API Registry. The current version of the Registry, generator scripts
** used to make the header, and the header can be found at
** https://github.com/KhronosGroup/OpenGL-Registry
*/
#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)
#define WIN32_LEAN_AND_MEAN 1
#include <windows.h>
#endif
#define WGL_WGLEXT_VERSION 20200813
/* Generated C header for:
* API: wgl
* Versions considered: .*
* Versions emitted: _nomatch_^
* Default extensions included: wgl
* Additional extensions included: _nomatch_^
* Extensions removed: _nomatch_^
*/
#ifndef WGL_ARB_buffer_region
#define WGL_ARB_buffer_region 1
#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001
#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002
#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004
#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008
typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType);
typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion);
typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height);
typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc);
#ifdef WGL_WGLEXT_PROTOTYPES
HANDLE WINAPI wglCreateBufferRegionARB (HDC hDC, int iLayerPlane, UINT uType);
VOID WINAPI wglDeleteBufferRegionARB (HANDLE hRegion);
BOOL WINAPI wglSaveBufferRegionARB (HANDLE hRegion, int x, int y, int width, int height);
BOOL WINAPI wglRestoreBufferRegionARB (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc);
#endif
#endif /* WGL_ARB_buffer_region */
#ifndef WGL_ARB_context_flush_control
#define WGL_ARB_context_flush_control 1
#define WGL_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097
#define WGL_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0
#define WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098
#endif /* WGL_ARB_context_flush_control */
#ifndef WGL_ARB_create_context
#define WGL_ARB_create_context 1
#define WGL_CONTEXT_DEBUG_BIT_ARB 0x00000001
#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002
#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091
#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092
#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093
#define WGL_CONTEXT_FLAGS_ARB 0x2094
#define ERROR_INVALID_VERSION_ARB 0x2095
typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int *attribList);
#ifdef WGL_WGLEXT_PROTOTYPES
HGLRC WINAPI wglCreateContextAttribsARB (HDC hDC, HGLRC hShareContext, const int *attribList);
#endif
#endif /* WGL_ARB_create_context */
#ifndef WGL_ARB_create_context_no_error
#define WGL_ARB_create_context_no_error 1
#define WGL_CONTEXT_OPENGL_NO_ERROR_ARB 0x31B3
#endif /* WGL_ARB_create_context_no_error */
#ifndef WGL_ARB_create_context_profile
#define WGL_ARB_create_context_profile 1
#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126
#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
#define ERROR_INVALID_PROFILE_ARB 0x2096
#endif /* WGL_ARB_create_context_profile */
#ifndef WGL_ARB_create_context_robustness
#define WGL_ARB_create_context_robustness 1
#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004
#define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252
#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
#define WGL_NO_RESET_NOTIFICATION_ARB 0x8261
#endif /* WGL_ARB_create_context_robustness */
#ifndef WGL_ARB_extensions_string
#define WGL_ARB_extensions_string 1
typedef const char *(WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc);
#ifdef WGL_WGLEXT_PROTOTYPES
const char *WINAPI wglGetExtensionsStringARB (HDC hdc);
#endif
#endif /* WGL_ARB_extensions_string */
#ifndef WGL_ARB_framebuffer_sRGB
#define WGL_ARB_framebuffer_sRGB 1
#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9
#endif /* WGL_ARB_framebuffer_sRGB */
#ifndef WGL_ARB_make_current_read
#define WGL_ARB_make_current_read 1
#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043
#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054
typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (void);
#ifdef WGL_WGLEXT_PROTOTYPES
BOOL WINAPI wglMakeContextCurrentARB (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
HDC WINAPI wglGetCurrentReadDCARB (void);
#endif
#endif /* WGL_ARB_make_current_read */
#ifndef WGL_ARB_multisample
#define WGL_ARB_multisample 1
#define WGL_SAMPLE_BUFFERS_ARB 0x2041
#define WGL_SAMPLES_ARB 0x2042
#endif /* WGL_ARB_multisample */
#ifndef WGL_ARB_pbuffer
#define WGL_ARB_pbuffer 1
DECLARE_HANDLE(HPBUFFERARB);
#define WGL_DRAW_TO_PBUFFER_ARB 0x202D
#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E
#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F
#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030
#define WGL_PBUFFER_LARGEST_ARB 0x2033
#define WGL_PBUFFER_WIDTH_ARB 0x2034
#define WGL_PBUFFER_HEIGHT_ARB 0x2035
#define WGL_PBUFFER_LOST_ARB 0x2036
typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList);
typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer);
typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC);
typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer);
typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue);
#ifdef WGL_WGLEXT_PROTOTYPES
HPBUFFERARB WINAPI wglCreatePbufferARB (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList);
HDC WINAPI wglGetPbufferDCARB (HPBUFFERARB hPbuffer);
int WINAPI wglReleasePbufferDCARB (HPBUFFERARB hPbuffer, HDC hDC);
BOOL WINAPI wglDestroyPbufferARB (HPBUFFERARB hPbuffer);
BOOL WINAPI wglQueryPbufferARB (HPBUFFERARB hPbuffer, int iAttribute, int *piValue);
#endif
#endif /* WGL_ARB_pbuffer */
#ifndef WGL_ARB_pixel_format
#define WGL_ARB_pixel_format 1
#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
#define WGL_DRAW_TO_WINDOW_ARB 0x2001
#define WGL_DRAW_TO_BITMAP_ARB 0x2002
#define WGL_ACCELERATION_ARB 0x2003
#define WGL_NEED_PALETTE_ARB 0x2004
#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005
#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006
#define WGL_SWAP_METHOD_ARB 0x2007
#define WGL_NUMBER_OVERLAYS_ARB 0x2008
#define WGL_NUMBER_UNDERLAYS_ARB 0x2009
#define WGL_TRANSPARENT_ARB 0x200A
#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037
#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038
#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039
#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A
#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B
#define WGL_SHARE_DEPTH_ARB 0x200C
#define WGL_SHARE_STENCIL_ARB 0x200D
#define WGL_SHARE_ACCUM_ARB 0x200E
#define WGL_SUPPORT_GDI_ARB 0x200F
#define WGL_SUPPORT_OPENGL_ARB 0x2010
#define WGL_DOUBLE_BUFFER_ARB 0x2011
#define WGL_STEREO_ARB 0x2012
#define WGL_PIXEL_TYPE_ARB 0x2013
#define WGL_COLOR_BITS_ARB 0x2014
#define WGL_RED_BITS_ARB 0x2015
#define WGL_RED_SHIFT_ARB 0x2016
#define WGL_GREEN_BITS_ARB 0x2017
#define WGL_GREEN_SHIFT_ARB 0x2018
#define WGL_BLUE_BITS_ARB 0x2019
#define WGL_BLUE_SHIFT_ARB 0x201A
#define WGL_ALPHA_BITS_ARB 0x201B
#define WGL_ALPHA_SHIFT_ARB 0x201C
#define WGL_ACCUM_BITS_ARB 0x201D
#define WGL_ACCUM_RED_BITS_ARB 0x201E
#define WGL_ACCUM_GREEN_BITS_ARB 0x201F
#define WGL_ACCUM_BLUE_BITS_ARB 0x2020
#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021
#define WGL_DEPTH_BITS_ARB 0x2022
#define WGL_STENCIL_BITS_ARB 0x2023
#define WGL_AUX_BUFFERS_ARB 0x2024
#define WGL_NO_ACCELERATION_ARB 0x2025
#define WGL_GENERIC_ACCELERATION_ARB 0x2026
#define WGL_FULL_ACCELERATION_ARB 0x2027
#define WGL_SWAP_EXCHANGE_ARB 0x2028
#define WGL_SWAP_COPY_ARB 0x2029
#define WGL_SWAP_UNDEFINED_ARB 0x202A
#define WGL_TYPE_RGBA_ARB 0x202B
#define WGL_TYPE_COLORINDEX_ARB 0x202C
typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues);
typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues);
typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
#ifdef WGL_WGLEXT_PROTOTYPES
BOOL WINAPI wglGetPixelFormatAttribivARB (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues);
BOOL WINAPI wglGetPixelFormatAttribfvARB (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues);
BOOL WINAPI wglChoosePixelFormatARB (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
#endif
#endif /* WGL_ARB_pixel_format */
#ifndef WGL_ARB_pixel_format_float
#define WGL_ARB_pixel_format_float 1
#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0
#endif /* WGL_ARB_pixel_format_float */
#ifndef WGL_ARB_render_texture
#define WGL_ARB_render_texture 1
#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070
#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071
#define WGL_TEXTURE_FORMAT_ARB 0x2072
#define WGL_TEXTURE_TARGET_ARB 0x2073
#define WGL_MIPMAP_TEXTURE_ARB 0x2074
#define WGL_TEXTURE_RGB_ARB 0x2075
#define WGL_TEXTURE_RGBA_ARB 0x2076
#define WGL_NO_TEXTURE_ARB 0x2077
#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078
#define WGL_TEXTURE_1D_ARB 0x2079
#define WGL_TEXTURE_2D_ARB 0x207A
#define WGL_MIPMAP_LEVEL_ARB 0x207B
#define WGL_CUBE_MAP_FACE_ARB 0x207C
#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D
#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E
#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F
#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080
#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081
#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082
#define WGL_FRONT_LEFT_ARB 0x2083
#define WGL_FRONT_RIGHT_ARB 0x2084
#define WGL_BACK_LEFT_ARB 0x2085
#define WGL_BACK_RIGHT_ARB 0x2086
#define WGL_AUX0_ARB 0x2087
#define WGL_AUX1_ARB 0x2088
#define WGL_AUX2_ARB 0x2089
#define WGL_AUX3_ARB 0x208A
#define WGL_AUX4_ARB 0x208B
#define WGL_AUX5_ARB 0x208C
#define WGL_AUX6_ARB 0x208D
#define WGL_AUX7_ARB 0x208E
#define WGL_AUX8_ARB 0x208F
#define WGL_AUX9_ARB 0x2090
typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);
typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);
typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int *piAttribList);
#ifdef WGL_WGLEXT_PROTOTYPES
BOOL WINAPI wglBindTexImageARB (HPBUFFERARB hPbuffer, int iBuffer);
BOOL WINAPI wglReleaseTexImageARB (HPBUFFERARB hPbuffer, int iBuffer);
BOOL WINAPI wglSetPbufferAttribARB (HPBUFFERARB hPbuffer, const int *piAttribList);
#endif
#endif /* WGL_ARB_render_texture */
#ifndef WGL_ARB_robustness_application_isolation
#define WGL_ARB_robustness_application_isolation 1
#define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008
#endif /* WGL_ARB_robustness_application_isolation */
#ifndef WGL_ARB_robustness_share_group_isolation
#define WGL_ARB_robustness_share_group_isolation 1
#endif /* WGL_ARB_robustness_share_group_isolation */
#ifndef WGL_3DFX_multisample
#define WGL_3DFX_multisample 1
#define WGL_SAMPLE_BUFFERS_3DFX 0x2060
#define WGL_SAMPLES_3DFX 0x2061
#endif /* WGL_3DFX_multisample */
#ifndef WGL_3DL_stereo_control
#define WGL_3DL_stereo_control 1
#define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055
#define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056
#define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057
#define WGL_STEREO_POLARITY_INVERT_3DL 0x2058
typedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState);
#ifdef WGL_WGLEXT_PROTOTYPES
BOOL WINAPI wglSetStereoEmitterState3DL (HDC hDC, UINT uState);
#endif
#endif /* WGL_3DL_stereo_control */
#ifndef WGL_AMD_gpu_association
#define WGL_AMD_gpu_association 1
#define WGL_GPU_VENDOR_AMD 0x1F00
#define WGL_GPU_RENDERER_STRING_AMD 0x1F01
#define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02
#define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2
#define WGL_GPU_RAM_AMD 0x21A3
#define WGL_GPU_CLOCK_AMD 0x21A4
#define WGL_GPU_NUM_PIPES_AMD 0x21A5
#define WGL_GPU_NUM_SIMD_AMD 0x21A6
#define WGL_GPU_NUM_RB_AMD 0x21A7
#define WGL_GPU_NUM_SPI_AMD 0x21A8
typedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT *ids);
typedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, INT property, GLenum dataType, UINT size, void *data);
typedef UINT (WINAPI * PFNWGLGETCONTEXTGPUIDAMDPROC) (HGLRC hglrc);
typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC) (UINT id);
typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (UINT id, HGLRC hShareContext, const int *attribList);
typedef BOOL (WINAPI * PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC) (HGLRC hglrc);
typedef BOOL (WINAPI * PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (HGLRC hglrc);
typedef HGLRC (WINAPI * PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void);
typedef VOID (WINAPI * PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC) (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
#ifdef WGL_WGLEXT_PROTOTYPES
UINT WINAPI wglGetGPUIDsAMD (UINT maxCount, UINT *ids);
INT WINAPI wglGetGPUInfoAMD (UINT id, INT property, GLenum dataType, UINT size, void *data);
UINT WINAPI wglGetContextGPUIDAMD (HGLRC hglrc);
HGLRC WINAPI wglCreateAssociatedContextAMD (UINT id);
HGLRC WINAPI wglCreateAssociatedContextAttribsAMD (UINT id, HGLRC hShareContext, const int *attribList);
BOOL WINAPI wglDeleteAssociatedContextAMD (HGLRC hglrc);
BOOL WINAPI wglMakeAssociatedContextCurrentAMD (HGLRC hglrc);
HGLRC WINAPI wglGetCurrentAssociatedContextAMD (void);
VOID WINAPI wglBlitContextFramebufferAMD (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
#endif
#endif /* WGL_AMD_gpu_association */
#ifndef WGL_ATI_pixel_format_float
#define WGL_ATI_pixel_format_float 1
#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0
#endif /* WGL_ATI_pixel_format_float */
#ifndef WGL_ATI_render_texture_rectangle
#define WGL_ATI_render_texture_rectangle 1
#define WGL_TEXTURE_RECTANGLE_ATI 0x21A5
#endif /* WGL_ATI_render_texture_rectangle */
#ifndef WGL_EXT_colorspace
#define WGL_EXT_colorspace 1
#define WGL_COLORSPACE_EXT 0x309D
#define WGL_COLORSPACE_SRGB_EXT 0x3089
#define WGL_COLORSPACE_LINEAR_EXT 0x308A
#endif /* WGL_EXT_colorspace */
#ifndef WGL_EXT_create_context_es2_profile
#define WGL_EXT_create_context_es2_profile 1
#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004
#endif /* WGL_EXT_create_context_es2_profile */
#ifndef WGL_EXT_create_context_es_profile
#define WGL_EXT_create_context_es_profile 1
#define WGL_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004
#endif /* WGL_EXT_create_context_es_profile */
#ifndef WGL_EXT_depth_float
#define WGL_EXT_depth_float 1
#define WGL_DEPTH_FLOAT_EXT 0x2040
#endif /* WGL_EXT_depth_float */
#ifndef WGL_EXT_display_color_table
#define WGL_EXT_display_color_table 1
typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id);
typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (const GLushort *table, GLuint length);
typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id);
typedef VOID (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id);
#ifdef WGL_WGLEXT_PROTOTYPES
GLboolean WINAPI wglCreateDisplayColorTableEXT (GLushort id);
GLboolean WINAPI wglLoadDisplayColorTableEXT (const GLushort *table, GLuint length);
GLboolean WINAPI wglBindDisplayColorTableEXT (GLushort id);
VOID WINAPI wglDestroyDisplayColorTableEXT (GLushort id);
#endif
#endif /* WGL_EXT_display_color_table */
#ifndef WGL_EXT_extensions_string
#define WGL_EXT_extensions_string 1
typedef const char *(WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void);
#ifdef WGL_WGLEXT_PROTOTYPES
const char *WINAPI wglGetExtensionsStringEXT (void);
#endif
#endif /* WGL_EXT_extensions_string */
#ifndef WGL_EXT_framebuffer_sRGB
#define WGL_EXT_framebuffer_sRGB 1
#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9
#endif /* WGL_EXT_framebuffer_sRGB */
#ifndef WGL_EXT_make_current_read
#define WGL_EXT_make_current_read 1
#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043
typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (void);
#ifdef WGL_WGLEXT_PROTOTYPES
BOOL WINAPI wglMakeContextCurrentEXT (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
HDC WINAPI wglGetCurrentReadDCEXT (void);
#endif
#endif /* WGL_EXT_make_current_read */
#ifndef WGL_EXT_multisample
#define WGL_EXT_multisample 1
#define WGL_SAMPLE_BUFFERS_EXT 0x2041
#define WGL_SAMPLES_EXT 0x2042
#endif /* WGL_EXT_multisample */
#ifndef WGL_EXT_pbuffer
#define WGL_EXT_pbuffer 1
DECLARE_HANDLE(HPBUFFEREXT);
#define WGL_DRAW_TO_PBUFFER_EXT 0x202D
#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E
#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F
#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030
#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031
#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032
#define WGL_PBUFFER_LARGEST_EXT 0x2033
#define WGL_PBUFFER_WIDTH_EXT 0x2034
#define WGL_PBUFFER_HEIGHT_EXT 0x2035
typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList);
typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer);
typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC);
typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer);
typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int *piValue);
#ifdef WGL_WGLEXT_PROTOTYPES
HPBUFFEREXT WINAPI wglCreatePbufferEXT (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList);
HDC WINAPI wglGetPbufferDCEXT (HPBUFFEREXT hPbuffer);
int WINAPI wglReleasePbufferDCEXT (HPBUFFEREXT hPbuffer, HDC hDC);
BOOL WINAPI wglDestroyPbufferEXT (HPBUFFEREXT hPbuffer);
BOOL WINAPI wglQueryPbufferEXT (HPBUFFEREXT hPbuffer, int iAttribute, int *piValue);
#endif
#endif /* WGL_EXT_pbuffer */
#ifndef WGL_EXT_pixel_format
#define WGL_EXT_pixel_format 1
#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000
#define WGL_DRAW_TO_WINDOW_EXT 0x2001
#define WGL_DRAW_TO_BITMAP_EXT 0x2002
#define WGL_ACCELERATION_EXT 0x2003
#define WGL_NEED_PALETTE_EXT 0x2004
#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005
#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006
#define WGL_SWAP_METHOD_EXT 0x2007
#define WGL_NUMBER_OVERLAYS_EXT 0x2008
#define WGL_NUMBER_UNDERLAYS_EXT 0x2009
#define WGL_TRANSPARENT_EXT 0x200A
#define WGL_TRANSPARENT_VALUE_EXT 0x200B
#define WGL_SHARE_DEPTH_EXT 0x200C
#define WGL_SHARE_STENCIL_EXT 0x200D
#define WGL_SHARE_ACCUM_EXT 0x200E
#define WGL_SUPPORT_GDI_EXT 0x200F
#define WGL_SUPPORT_OPENGL_EXT 0x2010
#define WGL_DOUBLE_BUFFER_EXT 0x2011
#define WGL_STEREO_EXT 0x2012
#define WGL_PIXEL_TYPE_EXT 0x2013
#define WGL_COLOR_BITS_EXT 0x2014
#define WGL_RED_BITS_EXT 0x2015
#define WGL_RED_SHIFT_EXT 0x2016
#define WGL_GREEN_BITS_EXT 0x2017
#define WGL_GREEN_SHIFT_EXT 0x2018
#define WGL_BLUE_BITS_EXT 0x2019
#define WGL_BLUE_SHIFT_EXT 0x201A
#define WGL_ALPHA_BITS_EXT 0x201B
#define WGL_ALPHA_SHIFT_EXT 0x201C
#define WGL_ACCUM_BITS_EXT 0x201D
#define WGL_ACCUM_RED_BITS_EXT 0x201E
#define WGL_ACCUM_GREEN_BITS_EXT 0x201F
#define WGL_ACCUM_BLUE_BITS_EXT 0x2020
#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021
#define WGL_DEPTH_BITS_EXT 0x2022
#define WGL_STENCIL_BITS_EXT 0x2023
#define WGL_AUX_BUFFERS_EXT 0x2024
#define WGL_NO_ACCELERATION_EXT 0x2025
#define WGL_GENERIC_ACCELERATION_EXT 0x2026
#define WGL_FULL_ACCELERATION_EXT 0x2027
#define WGL_SWAP_EXCHANGE_EXT 0x2028
#define WGL_SWAP_COPY_EXT 0x2029
#define WGL_SWAP_UNDEFINED_EXT 0x202A
#define WGL_TYPE_RGBA_EXT 0x202B
#define WGL_TYPE_COLORINDEX_EXT 0x202C
typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, int *piValues);
typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, FLOAT *pfValues);
typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
#ifdef WGL_WGLEXT_PROTOTYPES
BOOL WINAPI wglGetPixelFormatAttribivEXT (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, int *piValues);
BOOL WINAPI wglGetPixelFormatAttribfvEXT (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, FLOAT *pfValues);
BOOL WINAPI wglChoosePixelFormatEXT (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
#endif
#endif /* WGL_EXT_pixel_format */
#ifndef WGL_EXT_pixel_format_packed_float
#define WGL_EXT_pixel_format_packed_float 1
#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8
#endif /* WGL_EXT_pixel_format_packed_float */
#ifndef WGL_EXT_swap_control
#define WGL_EXT_swap_control 1
typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval);
typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void);
#ifdef WGL_WGLEXT_PROTOTYPES
BOOL WINAPI wglSwapIntervalEXT (int interval);
int WINAPI wglGetSwapIntervalEXT (void);
#endif
#endif /* WGL_EXT_swap_control */
#ifndef WGL_EXT_swap_control_tear
#define WGL_EXT_swap_control_tear 1
#endif /* WGL_EXT_swap_control_tear */
#ifndef WGL_I3D_digital_video_control
#define WGL_I3D_digital_video_control 1
#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050
#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051
#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052
#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053
typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int *piValue);
typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int *piValue);
#ifdef WGL_WGLEXT_PROTOTYPES
BOOL WINAPI wglGetDigitalVideoParametersI3D (HDC hDC, int iAttribute, int *piValue);
BOOL WINAPI wglSetDigitalVideoParametersI3D (HDC hDC, int iAttribute, const int *piValue);
#endif
#endif /* WGL_I3D_digital_video_control */
#ifndef WGL_I3D_gamma
#define WGL_I3D_gamma 1
#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E
#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F
typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int *piValue);
typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int *piValue);
typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT *puRed, USHORT *puGreen, USHORT *puBlue);
typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT *puRed, const USHORT *puGreen, const USHORT *puBlue);
#ifdef WGL_WGLEXT_PROTOTYPES
BOOL WINAPI wglGetGammaTableParametersI3D (HDC hDC, int iAttribute, int *piValue);
BOOL WINAPI wglSetGammaTableParametersI3D (HDC hDC, int iAttribute, const int *piValue);
BOOL WINAPI wglGetGammaTableI3D (HDC hDC, int iEntries, USHORT *puRed, USHORT *puGreen, USHORT *puBlue);
BOOL WINAPI wglSetGammaTableI3D (HDC hDC, int iEntries, const USHORT *puRed, const USHORT *puGreen, const USHORT *puBlue);
#endif
#endif /* WGL_I3D_gamma */
#ifndef WGL_I3D_genlock
#define WGL_I3D_genlock 1
#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044
#define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045
#define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046
#define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047
#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048
#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049
#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A
#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B
#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C
typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC);
typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC);
typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL *pFlag);
typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource);
typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT *uSource);
typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge);
typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT *uEdge);
typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate);
typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT *uRate);
typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay);
typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT *uDelay);
typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT *uMaxLineDelay, UINT *uMaxPixelDelay);
#ifdef WGL_WGLEXT_PROTOTYPES
BOOL WINAPI wglEnableGenlockI3D (HDC hDC);
BOOL WINAPI wglDisableGenlockI3D (HDC hDC);
BOOL WINAPI wglIsEnabledGenlockI3D (HDC hDC, BOOL *pFlag);
BOOL WINAPI wglGenlockSourceI3D (HDC hDC, UINT uSource);
BOOL WINAPI wglGetGenlockSourceI3D (HDC hDC, UINT *uSource);
BOOL WINAPI wglGenlockSourceEdgeI3D (HDC hDC, UINT uEdge);
BOOL WINAPI wglGetGenlockSourceEdgeI3D (HDC hDC, UINT *uEdge);
BOOL WINAPI wglGenlockSampleRateI3D (HDC hDC, UINT uRate);
BOOL WINAPI wglGetGenlockSampleRateI3D (HDC hDC, UINT *uRate);
BOOL WINAPI wglGenlockSourceDelayI3D (HDC hDC, UINT uDelay);
BOOL WINAPI wglGetGenlockSourceDelayI3D (HDC hDC, UINT *uDelay);
BOOL WINAPI wglQueryGenlockMaxSourceDelayI3D (HDC hDC, UINT *uMaxLineDelay, UINT *uMaxPixelDelay);
#endif
#endif /* WGL_I3D_genlock */
#ifndef WGL_I3D_image_buffer
#define WGL_I3D_image_buffer 1
#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001
#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002
typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags);
typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress);
typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const HANDLE *pEvent, const LPVOID *pAddress, const DWORD *pSize, UINT count);
typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const LPVOID *pAddress, UINT count);
#ifdef WGL_WGLEXT_PROTOTYPES
LPVOID WINAPI wglCreateImageBufferI3D (HDC hDC, DWORD dwSize, UINT uFlags);
BOOL WINAPI wglDestroyImageBufferI3D (HDC hDC, LPVOID pAddress);
BOOL WINAPI wglAssociateImageBufferEventsI3D (HDC hDC, const HANDLE *pEvent, const LPVOID *pAddress, const DWORD *pSize, UINT count);
BOOL WINAPI wglReleaseImageBufferEventsI3D (HDC hDC, const LPVOID *pAddress, UINT count);
#endif
#endif /* WGL_I3D_image_buffer */
#ifndef WGL_I3D_swap_frame_lock
#define WGL_I3D_swap_frame_lock 1
typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (void);
typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (void);
typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL *pFlag);
typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL *pFlag);
#ifdef WGL_WGLEXT_PROTOTYPES
BOOL WINAPI wglEnableFrameLockI3D (void);
BOOL WINAPI wglDisableFrameLockI3D (void);
BOOL WINAPI wglIsEnabledFrameLockI3D (BOOL *pFlag);
BOOL WINAPI wglQueryFrameLockMasterI3D (BOOL *pFlag);
#endif
#endif /* WGL_I3D_swap_frame_lock */
#ifndef WGL_I3D_swap_frame_usage
#define WGL_I3D_swap_frame_usage 1
typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float *pUsage);
typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void);
typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void);
typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD *pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage);
#ifdef WGL_WGLEXT_PROTOTYPES
BOOL WINAPI wglGetFrameUsageI3D (float *pUsage);
BOOL WINAPI wglBeginFrameTrackingI3D (void);
BOOL WINAPI wglEndFrameTrackingI3D (void);
BOOL WINAPI wglQueryFrameTrackingI3D (DWORD *pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage);
#endif
#endif /* WGL_I3D_swap_frame_usage */
#ifndef WGL_NV_DX_interop
#define WGL_NV_DX_interop 1
#define WGL_ACCESS_READ_ONLY_NV 0x00000000
#define WGL_ACCESS_READ_WRITE_NV 0x00000001
#define WGL_ACCESS_WRITE_DISCARD_NV 0x00000002
typedef BOOL (WINAPI * PFNWGLDXSETRESOURCESHAREHANDLENVPROC) (void *dxObject, HANDLE shareHandle);
typedef HANDLE (WINAPI * PFNWGLDXOPENDEVICENVPROC) (void *dxDevice);
typedef BOOL (WINAPI * PFNWGLDXCLOSEDEVICENVPROC) (HANDLE hDevice);
typedef HANDLE (WINAPI * PFNWGLDXREGISTEROBJECTNVPROC) (HANDLE hDevice, void *dxObject, GLuint name, GLenum type, GLenum access);
typedef BOOL (WINAPI * PFNWGLDXUNREGISTEROBJECTNVPROC) (HANDLE hDevice, HANDLE hObject);
typedef BOOL (WINAPI * PFNWGLDXOBJECTACCESSNVPROC) (HANDLE hObject, GLenum access);
typedef BOOL (WINAPI * PFNWGLDXLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE *hObjects);
typedef BOOL (WINAPI * PFNWGLDXUNLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE *hObjects);
#ifdef WGL_WGLEXT_PROTOTYPES
BOOL WINAPI wglDXSetResourceShareHandleNV (void *dxObject, HANDLE shareHandle);
HANDLE WINAPI wglDXOpenDeviceNV (void *dxDevice);
BOOL WINAPI wglDXCloseDeviceNV (HANDLE hDevice);
HANDLE WINAPI wglDXRegisterObjectNV (HANDLE hDevice, void *dxObject, GLuint name, GLenum type, GLenum access);
BOOL WINAPI wglDXUnregisterObjectNV (HANDLE hDevice, HANDLE hObject);
BOOL WINAPI wglDXObjectAccessNV (HANDLE hObject, GLenum access);
BOOL WINAPI wglDXLockObjectsNV (HANDLE hDevice, GLint count, HANDLE *hObjects);
BOOL WINAPI wglDXUnlockObjectsNV (HANDLE hDevice, GLint count, HANDLE *hObjects);
#endif
#endif /* WGL_NV_DX_interop */
#ifndef WGL_NV_DX_interop2
#define WGL_NV_DX_interop2 1
#endif /* WGL_NV_DX_interop2 */
#ifndef WGL_NV_copy_image
#define WGL_NV_copy_image 1
typedef BOOL (WINAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);
#ifdef WGL_WGLEXT_PROTOTYPES
BOOL WINAPI wglCopyImageSubDataNV (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);
#endif
#endif /* WGL_NV_copy_image */
#ifndef WGL_NV_delay_before_swap
#define WGL_NV_delay_before_swap 1
typedef BOOL (WINAPI * PFNWGLDELAYBEFORESWAPNVPROC) (HDC hDC, GLfloat seconds);
#ifdef WGL_WGLEXT_PROTOTYPES
BOOL WINAPI wglDelayBeforeSwapNV (HDC hDC, GLfloat seconds);
#endif
#endif /* WGL_NV_delay_before_swap */
#ifndef WGL_NV_float_buffer
#define WGL_NV_float_buffer 1
#define WGL_FLOAT_COMPONENTS_NV 0x20B0
#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1
#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2
#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3
#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4
#define WGL_TEXTURE_FLOAT_R_NV 0x20B5
#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6
#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7
#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8
#endif /* WGL_NV_float_buffer */
#ifndef WGL_NV_gpu_affinity
#define WGL_NV_gpu_affinity 1
DECLARE_HANDLE(HGPUNV);
struct _GPU_DEVICE {
DWORD cb;
CHAR DeviceName[32];
CHAR DeviceString[128];
DWORD Flags;
RECT rcVirtualScreen;
};
typedef struct _GPU_DEVICE *PGPU_DEVICE;
#define ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0
#define ERROR_MISSING_AFFINITY_MASK_NV 0x20D1
typedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu);
typedef BOOL (WINAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice);
typedef HDC (WINAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *phGpuList);
typedef BOOL (WINAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu);
typedef BOOL (WINAPI * PFNWGLDELETEDCNVPROC) (HDC hdc);
#ifdef WGL_WGLEXT_PROTOTYPES
BOOL WINAPI wglEnumGpusNV (UINT iGpuIndex, HGPUNV *phGpu);
BOOL WINAPI wglEnumGpuDevicesNV (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice);
HDC WINAPI wglCreateAffinityDCNV (const HGPUNV *phGpuList);
BOOL WINAPI wglEnumGpusFromAffinityDCNV (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu);
BOOL WINAPI wglDeleteDCNV (HDC hdc);
#endif
#endif /* WGL_NV_gpu_affinity */
#ifndef WGL_NV_multigpu_context
#define WGL_NV_multigpu_context 1
#define WGL_CONTEXT_MULTIGPU_ATTRIB_NV 0x20AA
#define WGL_CONTEXT_MULTIGPU_ATTRIB_SINGLE_NV 0x20AB
#define WGL_CONTEXT_MULTIGPU_ATTRIB_AFR_NV 0x20AC
#define WGL_CONTEXT_MULTIGPU_ATTRIB_MULTICAST_NV 0x20AD
#define WGL_CONTEXT_MULTIGPU_ATTRIB_MULTI_DISPLAY_MULTICAST_NV 0x20AE
#endif /* WGL_NV_multigpu_context */
#ifndef WGL_NV_multisample_coverage
#define WGL_NV_multisample_coverage 1
#define WGL_COVERAGE_SAMPLES_NV 0x2042
#define WGL_COLOR_SAMPLES_NV 0x20B9
#endif /* WGL_NV_multisample_coverage */
#ifndef WGL_NV_present_video
#define WGL_NV_present_video 1
DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV);
#define WGL_NUM_VIDEO_SLOTS_NV 0x20F0
typedef int (WINAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDc, HVIDEOOUTPUTDEVICENV *phDeviceList);
typedef BOOL (WINAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDc, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int *piAttribList);
typedef BOOL (WINAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int *piValue);
#ifdef WGL_WGLEXT_PROTOTYPES
int WINAPI wglEnumerateVideoDevicesNV (HDC hDc, HVIDEOOUTPUTDEVICENV *phDeviceList);
BOOL WINAPI wglBindVideoDeviceNV (HDC hDc, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int *piAttribList);
BOOL WINAPI wglQueryCurrentContextNV (int iAttribute, int *piValue);
#endif
#endif /* WGL_NV_present_video */
#ifndef WGL_NV_render_depth_texture
#define WGL_NV_render_depth_texture 1
#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3
#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4
#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5
#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6
#define WGL_DEPTH_COMPONENT_NV 0x20A7
#endif /* WGL_NV_render_depth_texture */
#ifndef WGL_NV_render_texture_rectangle
#define WGL_NV_render_texture_rectangle 1
#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0
#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1
#define WGL_TEXTURE_RECTANGLE_NV 0x20A2
#endif /* WGL_NV_render_texture_rectangle */
#ifndef WGL_NV_swap_group
#define WGL_NV_swap_group 1
typedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group);
typedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier);
typedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint *group, GLuint *barrier);
typedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint *maxGroups, GLuint *maxBarriers);
typedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint *count);
typedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC);
#ifdef WGL_WGLEXT_PROTOTYPES
BOOL WINAPI wglJoinSwapGroupNV (HDC hDC, GLuint group);
BOOL WINAPI wglBindSwapBarrierNV (GLuint group, GLuint barrier);
BOOL WINAPI wglQuerySwapGroupNV (HDC hDC, GLuint *group, GLuint *barrier);
BOOL WINAPI wglQueryMaxSwapGroupsNV (HDC hDC, GLuint *maxGroups, GLuint *maxBarriers);
BOOL WINAPI wglQueryFrameCountNV (HDC hDC, GLuint *count);
BOOL WINAPI wglResetFrameCountNV (HDC hDC);
#endif
#endif /* WGL_NV_swap_group */
#ifndef WGL_NV_vertex_array_range
#define WGL_NV_vertex_array_range 1
typedef void *(WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority);
typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer);
#ifdef WGL_WGLEXT_PROTOTYPES
void *WINAPI wglAllocateMemoryNV (GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority);
void WINAPI wglFreeMemoryNV (void *pointer);
#endif
#endif /* WGL_NV_vertex_array_range */
#ifndef WGL_NV_video_capture
#define WGL_NV_video_capture 1
DECLARE_HANDLE(HVIDEOINPUTDEVICENV);
#define WGL_UNIQUE_ID_NV 0x20CE
#define WGL_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF
typedef BOOL (WINAPI * PFNWGLBINDVIDEOCAPTUREDEVICENVPROC) (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice);
typedef UINT (WINAPI * PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV *phDeviceList);
typedef BOOL (WINAPI * PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice);
typedef BOOL (WINAPI * PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int *piValue);
typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice);
#ifdef WGL_WGLEXT_PROTOTYPES
BOOL WINAPI wglBindVideoCaptureDeviceNV (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice);
UINT WINAPI wglEnumerateVideoCaptureDevicesNV (HDC hDc, HVIDEOINPUTDEVICENV *phDeviceList);
BOOL WINAPI wglLockVideoCaptureDeviceNV (HDC hDc, HVIDEOINPUTDEVICENV hDevice);
BOOL WINAPI wglQueryVideoCaptureDeviceNV (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int *piValue);
BOOL WINAPI wglReleaseVideoCaptureDeviceNV (HDC hDc, HVIDEOINPUTDEVICENV hDevice);
#endif
#endif /* WGL_NV_video_capture */
#ifndef WGL_NV_video_output
#define WGL_NV_video_output 1
DECLARE_HANDLE(HPVIDEODEV);
#define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0
#define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1
#define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2
#define WGL_VIDEO_OUT_COLOR_NV 0x20C3
#define WGL_VIDEO_OUT_ALPHA_NV 0x20C4
#define WGL_VIDEO_OUT_DEPTH_NV 0x20C5
#define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6
#define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7
#define WGL_VIDEO_OUT_FRAME 0x20C8
#define WGL_VIDEO_OUT_FIELD_1 0x20C9
#define WGL_VIDEO_OUT_FIELD_2 0x20CA
#define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB
#define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC
typedef BOOL (WINAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV *hVideoDevice);
typedef BOOL (WINAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice);
typedef BOOL (WINAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer);
typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer);
typedef BOOL (WINAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long *pulCounterPbuffer, BOOL bBlock);
typedef BOOL (WINAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo);
#ifdef WGL_WGLEXT_PROTOTYPES
BOOL WINAPI wglGetVideoDeviceNV (HDC hDC, int numDevices, HPVIDEODEV *hVideoDevice);
BOOL WINAPI wglReleaseVideoDeviceNV (HPVIDEODEV hVideoDevice);
BOOL WINAPI wglBindVideoImageNV (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer);
BOOL WINAPI wglReleaseVideoImageNV (HPBUFFERARB hPbuffer, int iVideoBuffer);
BOOL WINAPI wglSendPbufferToVideoNV (HPBUFFERARB hPbuffer, int iBufferType, unsigned long *pulCounterPbuffer, BOOL bBlock);
BOOL WINAPI wglGetVideoInfoNV (HPVIDEODEV hpVideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo);
#endif
#endif /* WGL_NV_video_output */
#ifndef WGL_OML_sync_control
#define WGL_OML_sync_control 1
typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64 *ust, INT64 *msc, INT64 *sbc);
typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32 *numerator, INT32 *denominator);
typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder);
typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder);
typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 *ust, INT64 *msc, INT64 *sbc);
typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64 *ust, INT64 *msc, INT64 *sbc);
#ifdef WGL_WGLEXT_PROTOTYPES
BOOL WINAPI wglGetSyncValuesOML (HDC hdc, INT64 *ust, INT64 *msc, INT64 *sbc);
BOOL WINAPI wglGetMscRateOML (HDC hdc, INT32 *numerator, INT32 *denominator);
INT64 WINAPI wglSwapBuffersMscOML (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder);
INT64 WINAPI wglSwapLayerBuffersMscOML (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder);
BOOL WINAPI wglWaitForMscOML (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 *ust, INT64 *msc, INT64 *sbc);
BOOL WINAPI wglWaitForSbcOML (HDC hdc, INT64 target_sbc, INT64 *ust, INT64 *msc, INT64 *sbc);
#endif
#endif /* WGL_OML_sync_control */
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -155,7 +155,7 @@ add_files(
fios_gui.cpp
fontcache.cpp
fontcache.h
fontdetection.cpp
fontcache_internal.h
fontdetection.h
framerate_gui.cpp
framerate_type.h

View File

@@ -1406,7 +1406,8 @@ struct AIDebugWindow : public Window {
this->SetWidgetLoweredState(WID_AID_MATCH_CASE_BTN, this->case_sensitive_break_check);
this->SetWidgetDisabledState(WID_AID_SETTINGS, ai_debug_company == INVALID_COMPANY);
this->SetWidgetDisabledState(WID_AID_RELOAD_TOGGLE, ai_debug_company == INVALID_COMPANY || ai_debug_company == OWNER_DEITY);
extern CompanyID _local_company;
this->SetWidgetDisabledState(WID_AID_RELOAD_TOGGLE, ai_debug_company == INVALID_COMPANY || ai_debug_company == OWNER_DEITY || ai_debug_company == _local_company);
this->SetWidgetDisabledState(WID_AID_CONTINUE_BTN, ai_debug_company == INVALID_COMPANY ||
(ai_debug_company == OWNER_DEITY ? !Game::IsPaused() : !AI::IsPaused(ai_debug_company)));
}

View File

@@ -909,7 +909,7 @@ static bool AircraftController(Aircraft *v)
SoundID sfx = AircraftVehInfo(v->engine_type)->sfx;
/* For compatibility with old NewGRF we ignore the sfx property, unless a NewGRF-defined sound is used.
* The baseset has only one helicopter sound, so this only limits using plane or cow sounds. */
if (sfx < ORIGINAL_SAMPLE_COUNT) sfx = SND_18_HELICOPTER;
if (sfx < ORIGINAL_SAMPLE_COUNT) sfx = SND_18_TAKEOFF_HELICOPTER;
SndPlayVehicleFx(sfx, v);
}
}

View File

@@ -44,7 +44,7 @@ void CcBuildAirport(const CommandCost &result, TileIndex tile, uint32 p1, uint32
{
if (result.Failed()) return;
if (_settings_client.sound.confirm) SndPlayTileFx(SND_1F_SPLAT_OTHER, tile);
if (_settings_client.sound.confirm) SndPlayTileFx(SND_1F_CONSTRUCTION_OTHER, tile);
if (!_settings_client.gui.persistent_buildingtools) ResetObjectToPlace();
}

View File

@@ -319,6 +319,8 @@ static CommandCost BuildReplacementVehicle(Vehicle *old_veh, Vehicle **new_vehic
/* Does it need to be refitted */
CargoID refit_cargo = GetNewCargoTypeForReplace(old_veh, e, part_of_chain);
if (refit_cargo == CT_INVALID) {
if (!IsLocalCompany()) return CommandCost();
SetDParam(0, old_veh->index);
int order_id = GetIncompatibleRefitOrderIdForAutoreplace(old_veh, e);

View File

@@ -124,6 +124,18 @@ public:
return ((r * 13063) + (g * 25647) + (b * 4981)) / 65536;
}
/**
* Make a colour dark grey, for specialized 32bpp remapping.
* @param colour the colour to make dark.
* @return the new colour, now darker.
*/
static inline Colour MakeDark(Colour colour)
{
uint8 d = MakeDark(colour.r, colour.g, colour.b);
return Colour(d, d, d);
}
/**
* Make a colour grey - based.
* @param colour the colour to make grey.
@@ -154,6 +166,16 @@ public:
return ReallyAdjustBrightness(colour, brightness);
}
static inline uint8 GetColourBrightness(Colour colour)
{
uint8 rgb_max = std::max(colour.r, std::max(colour.g, colour.b));
/* Black pixel (8bpp or old 32bpp image), so use default value */
if (rgb_max == 0) rgb_max = DEFAULT_BRIGHTNESS;
return rgb_max;
}
};
#endif /* BLITTER_32BPP_BASE_HPP */

View File

@@ -252,7 +252,7 @@ void Blitter_32bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode,
}
}
Sprite *Blitter_32bppOptimized::Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator)
template <bool Tpal_to_rgb> Sprite *Blitter_32bppOptimized::EncodeInternal(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator)
{
/* streams of pixels (a, r, g, b channels)
*
@@ -322,7 +322,7 @@ Sprite *Blitter_32bppOptimized::Encode(const SpriteLoader::Sprite *sprite, Alloc
if (a != 0) {
dst_px->a = a;
*dst_n = src->m;
if (src->m != 0) {
if (Tpal_to_rgb && src->m != 0) {
/* Get brightest value */
uint8 rgb_max = std::max({src->r, src->g, src->b});
@@ -397,3 +397,11 @@ Sprite *Blitter_32bppOptimized::Encode(const SpriteLoader::Sprite *sprite, Alloc
return dest_sprite;
}
template Sprite *Blitter_32bppOptimized::EncodeInternal<true>(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator);
template Sprite *Blitter_32bppOptimized::EncodeInternal<false>(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator);
Sprite *Blitter_32bppOptimized::Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator)
{
return this->EncodeInternal<true>(sprite, allocator);
}

View File

@@ -27,6 +27,9 @@ public:
const char *GetName() override { return "32bpp-optimized"; }
template <BlitterMode mode> void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom);
protected:
template <bool Tpal_to_rgb> Sprite *EncodeInternal(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator);
};
/** Factory for the optimised 32 bpp blitter (without palette animation). */

View File

@@ -43,7 +43,7 @@ typedef union ALIGN(16) um128i {
#define CLEAR_HIGH_BYTE_MASK _mm_setr_epi8(-1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0)
#define ALPHA_CONTROL_MASK _mm_setr_epi8( 6, 7, 6, 7, 6, 7, -1, -1, 14, 15, 14, 15, 14, 15, -1, -1)
#define PACK_LOW_CONTROL_MASK _mm_setr_epi8( 0, 2, 4, -1, 8, 10, 12, -1, -1, -1, -1, -1, -1, -1, -1, -1)
#define PACK_LOW_CONTROL_MASK _mm_setr_epi8( 0, 2, 4, 6, 8, 10, 12, 14, -1, -1, -1, -1, -1, -1, -1, -1)
#define PACK_HIGH_CONTROL_MASK _mm_setr_epi8(-1, -1, -1, -1, -1, -1, -1, -1, 0, 2, 4, -1, 8, 10, 12, -1)
#define BRIGHTNESS_LOW_CONTROL_MASK _mm_setr_epi8( 1, 2, 1, 2, 1, 2, 0, 2, 3, 2, 3, 2, 3, 2, 0, 2)
#define BRIGHTNESS_DIV_CLEANER _mm_setr_epi8(-1, 1, -1, 1, -1, 1, -1, 0, -1, 1, -1, 1, -1, 1, -1, 0)

518
src/blitter/40bpp_anim.cpp Normal file
View File

@@ -0,0 +1,518 @@
/* $Id$ */
/*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file 40bpp_optimized.cpp Implementation of the optimized 40 bpp blitter. */
#include "../stdafx.h"
#include "../zoom_func.h"
#include "../settings_type.h"
#include "../video/video_driver.hpp"
#include "40bpp_anim.hpp"
#include "common.hpp"
#include "../table/sprites.h"
#include "../safeguards.h"
/** Instantiation of the 40bpp with animation blitter factory. */
static FBlitter_40bppAnim iFBlitter_40bppAnim;
/** Cached black value. */
static const Colour _black_colour(0, 0, 0);
void Blitter_40bppAnim::SetPixel(void *video, int x, int y, uint8 colour)
{
if (_screen_disable_anim) {
Blitter_32bppOptimized::SetPixel(video, x, y, colour);
} else {
*((Colour *)video + x + y * _screen.pitch) = _black_colour;
VideoDriver::GetInstance()->GetAnimBuffer()[((uint32 *)video - (uint32 *)_screen.dst_ptr) + x + y * _screen.pitch] = colour;
}
}
void Blitter_40bppAnim::DrawRect(void *video, int width, int height, uint8 colour)
{
if (_screen_disable_anim) {
/* This means our output is not to the screen, so we can't be doing any animation stuff, so use our parent DrawRect() */
Blitter_32bppOptimized::DrawRect(video, width, height, colour);
return;
}
assert(VideoDriver::GetInstance()->GetAnimBuffer() != nullptr);
uint8 *anim_line = ((uint32 *)video - (uint32 *)_screen.dst_ptr) + VideoDriver::GetInstance()->GetAnimBuffer();
do {
Colour *dst = (Colour *)video;
uint8 *anim = anim_line;
for (int i = width; i > 0; i--) {
*dst = _black_colour;
*anim = colour;
dst++;
anim++;
}
video = (uint32 *)video + _screen.pitch;
anim_line += _screen.pitch;
} while (--height);
}
void Blitter_40bppAnim::DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8 colour, int width, int dash)
{
if (_screen_disable_anim) {
/* This means our output is not to the screen, so we can't be doing any animation stuff, so use our parent DrawRect() */
Blitter_32bppOptimized::DrawLine(video, x, y, x2, y2, screen_width, screen_height, colour, width, dash);
return;
}
assert(VideoDriver::GetInstance()->GetAnimBuffer() != nullptr);
uint8 *anim = ((uint32 *)video - (uint32 *)_screen.dst_ptr) + VideoDriver::GetInstance()->GetAnimBuffer();
this->DrawLineGeneric(x, y, x2, y2, screen_width, screen_height, width, dash, [=](int x, int y) {
*((Colour *)video + x + y * _screen.pitch) = _black_colour;
*(anim + x + y * _screen.pitch) = colour;
});
}
/**
* Draws a sprite to a (screen) buffer. It is templated to allow faster operation.
*
* @tparam mode blitter mode
* @param bp further blitting parameters
* @param zoom zoom level at which we are drawing
*/
template <BlitterMode mode>
inline void Blitter_40bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom)
{
const SpriteData *src = (const SpriteData *)bp->sprite;
/* src_px : each line begins with uint32 n = 'number of bytes in this line',
* then n times is the Colour struct for this line */
const Colour *src_px = (const Colour *)(src->data + src->offset[zoom][0]);
/* src_n : each line begins with uint32 n = 'number of bytes in this line',
* then interleaved stream of 'm' and 'n' channels. 'm' is remap,
* 'n' is number of bytes with the same alpha channel class */
const uint16 *src_n = (const uint16 *)(src->data + src->offset[zoom][1]);
/* skip upper lines in src_px and src_n */
for (uint i = bp->skip_top; i != 0; i--) {
src_px = (const Colour *)((const byte *)src_px + *(const uint32 *)src_px);
src_n = (const uint16 *)((const byte *)src_n + *(const uint32 *)src_n);
}
/* skip lines in dst */
Colour *dst = (Colour *)bp->dst + bp->top * bp->pitch + bp->left;
assert(VideoDriver::GetInstance()->GetAnimBuffer() != nullptr);
uint8 *anim = VideoDriver::GetInstance()->GetAnimBuffer() + ((uint32 *)bp->dst - (uint32 *)_screen.dst_ptr) + bp->top * bp->pitch + bp->left;
/* store so we don't have to access it via bp everytime (compiler assumes pointer aliasing) */
const byte *remap = bp->remap;
for (int y = 0; y < bp->height; y++) {
/* next dst line begins here */
Colour *dst_ln = dst + bp->pitch;
uint8 *anim_ln = anim + bp->pitch;
/* next src line begins here */
const Colour *src_px_ln = (const Colour *)((const byte *)src_px + *(const uint32 *)src_px);
src_px++;
/* next src_n line begins here */
const uint16 *src_n_ln = (const uint16 *)((const byte *)src_n + *(const uint32 *)src_n);
src_n += 2;
/* we will end this line when we reach this point */
Colour *dst_end = dst + bp->skip_left;
/* number of pixels with the same alpha channel class */
uint n;
while (dst < dst_end) {
n = *src_n++;
if (src_px->a == 0) {
dst += n;
src_px++;
src_n++;
if (dst > dst_end) anim += dst - dst_end;
} else {
if (dst + n > dst_end) {
uint d = dst_end - dst;
src_px += d;
src_n += d;
dst = dst_end - bp->skip_left;
dst_end = dst + bp->width;
n = std::min<uint>(n - d, (uint)bp->width);
goto draw;
}
dst += n;
src_px += n;
src_n += n;
}
}
dst -= bp->skip_left;
dst_end -= bp->skip_left;
dst_end += bp->width;
while (dst < dst_end) {
n = std::min<uint>(*src_n++, (uint)(dst_end - dst));
if (src_px->a == 0) {
anim += n;
dst += n;
src_px++;
src_n++;
continue;
}
draw:;
switch (mode) {
case BM_COLOUR_REMAP:
case BM_CRASH_REMAP:
if (src_px->a == 255) {
do {
uint8 m = GB(*src_n, 0, 8);
/* In case the m-channel is zero, only apply the crash remap by darkening the RGB colour. */
if (m == 0) {
*dst = mode == BM_CRASH_REMAP ? this->MakeDark(*src_px) : *src_px;
*anim = 0;
} else {
uint r = remap[m];
if (r != 0) {
*dst = src_px->data;
*anim = r;
}
}
anim++;
dst++;
src_px++;
src_n++;
} while (--n != 0);
} else {
do {
uint8 m = GB(*src_n, 0, 8);
Colour b = this->RealizeBlendedColour(*anim, *dst);
if (m == 0) {
Colour c = mode == BM_CRASH_REMAP ? this->MakeDark(*src_px) : *src_px;
*dst = this->ComposeColourRGBANoCheck(c.r, c.g, c.b, src_px->a, b);
*anim = 0;
} else {
uint r = remap[m];
if (r != 0) {
*dst = this->ComposeColourPANoCheck(this->LookupColourInPalette(r), src_px->a, b);
*anim = 0; // Animation colours don't work with alpha-blending.
}
}
anim++;
dst++;
src_px++;
src_n++;
} while (--n != 0);
}
break;
case BM_BLACK_REMAP:
do {
*anim++ = 0;
*dst++ = _black_colour;
src_px++;
src_n++;
} while (--n != 0);
break;
case BM_TRANSPARENT:
/* TODO -- We make an assumption here that the remap in fact is transparency, not some colour.
* This is never a problem with the code we produce, but newgrfs can make it fail... or at least:
* we produce a result the newgrf maker didn't expect ;) */
/* Make the current colour a bit more black, so it looks like this image is transparent */
src_n += n;
if (src_px->a == 255) {
src_px += n;
do {
/* If the anim buffer contains a color value, the image composition will
* only look at the RGB brightness value. As such, we can simply darken the
* RGB value to darken the anim color. */
Colour b = *anim != 0 ? Colour(this->GetColourBrightness(*dst), 0, 0) : *dst;
*dst = this->MakeTransparent(b, 3, 4);
anim++;
dst++;
} while (--n != 0);
} else {
do {
Colour b = this->RealizeBlendedColour(*anim, *dst);
*dst = this->MakeTransparent(b, (256 * 4 - src_px->a), 256 * 4);
*anim = 0; // Animation colours don't work with alpha-blending.
anim++;
dst++;
src_px++;
} while (--n != 0);
}
break;
default:
if (src_px->a == 255) {
do {
*anim++ = GB(*src_n, 0, 8);
*dst++ = src_px->data;
src_px++;
src_n++;
} while (--n != 0);
break;
} else {
do {
uint8 m = GB(*src_n, 0, 8);
Colour b = this->RealizeBlendedColour(*anim, *dst);
if (m == 0) {
*dst = this->ComposeColourRGBANoCheck(src_px->r, src_px->g, src_px->b, src_px->a, b);
*anim = 0;
} else {
*dst = this->ComposeColourPANoCheck(this->LookupColourInPalette(m), src_px->a, b);
*anim = m;
}
anim++;
dst++;
src_px++;
src_n++;
} while (--n != 0);
}
}
}
dst = dst_ln;
anim = anim_ln;
src_px = src_px_ln;
src_n = src_n_ln;
}
}
/**
* Draws a sprite to a (screen) buffer. Calls adequate templated function.
*
* @param bp further blitting parameters
* @param mode blitter mode
* @param zoom zoom level at which we are drawing
*/
void Blitter_40bppAnim::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom)
{
assert(_screen.dst_ptr != nullptr);
if (_screen_disable_anim || VideoDriver::GetInstance()->GetAnimBuffer() == nullptr) {
/* This means our output is not to the screen, so we can't be doing any animation stuff, so use our parent Draw() */
Blitter_32bppOptimized::Draw(bp, mode, zoom);
return;
}
switch (mode) {
default: NOT_REACHED();
case BM_NORMAL: Draw<BM_NORMAL> (bp, zoom); return;
case BM_COLOUR_REMAP: Draw<BM_COLOUR_REMAP>(bp, zoom); return;
case BM_TRANSPARENT: Draw<BM_TRANSPARENT> (bp, zoom); return;
case BM_CRASH_REMAP: Draw<BM_CRASH_REMAP> (bp, zoom); return;
case BM_BLACK_REMAP: Draw<BM_BLACK_REMAP> (bp, zoom); return;
}
}
void Blitter_40bppAnim::DrawColourMappingRect(void *dst, int width, int height, PaletteID pal)
{
if (_screen_disable_anim) {
/* This means our output is not to the screen, so we can't be doing any animation stuff, so use our parent DrawColourMappingRect() */
Blitter_32bppOptimized::DrawColourMappingRect(dst, width, height, pal);
return;
}
Colour *udst = (Colour *)dst;
uint8 *anim = VideoDriver::GetInstance()->GetAnimBuffer() + ((uint32 *)dst - (uint32 *)_screen.dst_ptr);
if (pal == PALETTE_TO_TRANSPARENT) {
/* If the anim buffer contains a color value, the image composition will
* only look at the RGB brightness value. As such, we can simply darken the
* RGB value to darken the anim color. */
do {
for (int i = 0; i != width; i++) {
Colour b = *anim != 0 ? Colour(this->GetColourBrightness(*udst), 0, 0) : *udst;
*udst = MakeTransparent(b, 154);
udst++;
anim++;
}
udst = udst - width + _screen.pitch;
anim = anim - width + _screen.pitch;
} while (--height);
} else if (pal == PALETTE_NEWSPAPER) {
const uint8 *remap = GetNonSprite(pal, ST_RECOLOUR) + 1;
do {
for (int i = 0; i != width; i++) {
if (*anim == 0) *udst = MakeGrey(*udst);
*anim = remap[*anim];
udst++;
anim++;
}
udst = udst - width + _screen.pitch;
anim = anim - width + _screen.pitch;
} while (--height);
} else {
const uint8 *remap = GetNonSprite(pal, ST_RECOLOUR) + 1;
do {
for (int i = 0; i != width; i++) {
*anim = remap[*anim];
anim++;
}
anim = anim - width + _screen.pitch;
} while (--height);
}
}
Sprite *Blitter_40bppAnim::Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator)
{
return this->EncodeInternal<false>(sprite, allocator);
}
void Blitter_40bppAnim::CopyFromBuffer(void *video, const void *src, int width, int height)
{
assert(!_screen_disable_anim);
assert(video >= _screen.dst_ptr && video <= (uint32 *)_screen.dst_ptr + _screen.width + _screen.height * _screen.pitch);
uint32 *dst = (uint32 *)video;
const uint32 *usrc = (const uint32 *)src;
uint8 *anim_buf = VideoDriver::GetInstance()->GetAnimBuffer();
if (anim_buf == nullptr) return;
uint8 *anim_line = ((uint32 *)video - (uint32 *)_screen.dst_ptr) + anim_buf;
for (; height > 0; height--) {
memcpy(dst, usrc, width * sizeof(uint32));
usrc += width;
dst += _screen.pitch;
/* Copy back the anim-buffer */
memcpy(anim_line, usrc, width * sizeof(uint8));
usrc = (const uint32 *)((const uint8 *)usrc + width);
anim_line += _screen.pitch;
}
}
void Blitter_40bppAnim::CopyToBuffer(const void *video, void *dst, int width, int height)
{
assert(!_screen_disable_anim);
assert(video >= _screen.dst_ptr && video <= (uint32 *)_screen.dst_ptr + _screen.width + _screen.height * _screen.pitch);
uint32 *udst = (uint32 *)dst;
const uint32 *src = (const uint32 *)video;
uint8 *anim_buf = VideoDriver::GetInstance()->GetAnimBuffer();
if (anim_buf == nullptr) return;
const uint8 *anim_line = ((const uint32 *)video - (uint32 *)_screen.dst_ptr) + anim_buf;
for (; height > 0; height--) {
memcpy(udst, src, width * sizeof(uint32));
src += _screen.pitch;
udst += width;
/* Copy the anim-buffer */
memcpy(udst, anim_line, width * sizeof(uint8));
udst = (uint32 *)((uint8 *)udst + width);
anim_line += _screen.pitch;
}
}
void Blitter_40bppAnim::CopyImageToBuffer(const void *video, void *dst, int width, int height, int dst_pitch)
{
uint8 *anim_buf = VideoDriver::GetInstance()->GetAnimBuffer();
if (anim_buf == nullptr) {
Blitter_32bppOptimized::CopyImageToBuffer(video, dst, width, height, dst_pitch);
return;
}
uint32 *udst = (uint32 *)dst;
const uint32 *src = (const uint32 *)video;
const uint8 *anim_line = ((const uint32 *)video - (uint32 *)_screen.dst_ptr) + anim_buf;
for (; height > 0; height--) {
for (int x = 0; x < width; x++) {
udst[x] = this->RealizeBlendedColour(anim_line[x], src[x]).data;
}
src += _screen.pitch;
anim_line += _screen.pitch;
udst += dst_pitch;
}
}
void Blitter_40bppAnim::ScrollBuffer(void *video, int &left, int &top, int &width, int &height, int scroll_x, int scroll_y)
{
assert(!_screen_disable_anim);
assert(video >= _screen.dst_ptr && video <= (uint32 *)_screen.dst_ptr + _screen.width + _screen.height * _screen.pitch);
uint8 *anim_buf = VideoDriver::GetInstance()->GetAnimBuffer();
uint8 *dst, *src;
/* We need to scroll the anim-buffer too */
if (scroll_y > 0) {
dst = anim_buf + left + (top + height - 1) * _screen.pitch;
src = dst - scroll_y * _screen.pitch;
/* Adjust left & width */
if (scroll_x >= 0) {
dst += scroll_x;
} else {
src -= scroll_x;
}
uint tw = width + (scroll_x >= 0 ? -scroll_x : scroll_x);
uint th = height - scroll_y;
for (; th > 0; th--) {
memcpy(dst, src, tw * sizeof(uint8));
src -= _screen.pitch;
dst -= _screen.pitch;
}
} else {
/* Calculate pointers */
dst = anim_buf + left + top * _screen.pitch;
src = dst - scroll_y * _screen.pitch;
/* Adjust left & width */
if (scroll_x >= 0) {
dst += scroll_x;
} else {
src -= scroll_x;
}
/* the y-displacement may be 0 therefore we have to use memmove,
* because source and destination may overlap */
uint tw = width + (scroll_x >= 0 ? -scroll_x : scroll_x);
uint th = height + scroll_y;
for (; th > 0; th--) {
memmove(dst, src, tw * sizeof(uint8));
src += _screen.pitch;
dst += _screen.pitch;
}
}
Blitter_32bppBase::ScrollBuffer(video, left, top, width, height, scroll_x, scroll_y);
}
int Blitter_40bppAnim::BufferSize(int width, int height)
{
return width * height * (sizeof(uint32) + sizeof(uint8));
}
Blitter::PaletteAnimation Blitter_40bppAnim::UsePaletteAnimation()
{
return Blitter::PALETTE_ANIMATION_VIDEO_BACKEND;
}
bool Blitter_40bppAnim::NeedsAnimationBuffer()
{
return true;
}

View File

@@ -0,0 +1,64 @@
/* $Id$ */
/*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file 40bpp_optimized.hpp Optimized 40 bpp blitter. */
#ifndef BLITTER_40BPP_OPTIMIZED_HPP
#define BLITTER_40BPP_OPTIMIZED_HPP
#include "32bpp_optimized.hpp"
#include "../video/video_driver.hpp"
/** The optimized 40 bpp blitter (for OpenGL video driver). */
class Blitter_40bppAnim : public Blitter_32bppOptimized {
public:
// void *MoveTo(void *video, int x, int y) override;
void SetPixel(void *video, int x, int y, uint8 colour) override;
void DrawRect(void *video, int width, int height, uint8 colour) override;
void DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8 colour, int width, int dash) override;
void CopyFromBuffer(void *video, const void *src, int width, int height) override;
void CopyToBuffer(const void *video, void *dst, int width, int height) override;
void CopyImageToBuffer(const void *video, void *dst, int width, int height, int dst_pitch) override;
void ScrollBuffer(void *video, int &left, int &top, int &width, int &height, int scroll_x, int scroll_y) override;
void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) override;
void DrawColourMappingRect(void *dst, int width, int height, PaletteID pal) override;
Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) override;
int BufferSize(int width, int height) override;
Blitter::PaletteAnimation UsePaletteAnimation() override;
bool NeedsAnimationBuffer() override;
const char *GetName() override { return "40bpp-anim"; }
int GetBytesPerPixel() override { return 5; }
template <BlitterMode mode> void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom);
protected:
static inline Colour RealizeBlendedColour(uint8 anim, Colour c)
{
return anim != 0 ? AdjustBrightness(LookupColourInPalette(anim), GetColourBrightness(c)) : c;
}
};
/** Factory for the 40 bpp animated blitter (for OpenGL). */
class FBlitter_40bppAnim : public BlitterFactory {
protected:
bool IsUsable() const override
{
return VideoDriver::GetInstance() == nullptr || VideoDriver::GetInstance()->HasAnimBuffer();
}
public:
FBlitter_40bppAnim() : BlitterFactory("40bpp-anim", "40bpp Animation Blitter (OpenGL)") {}
Blitter *CreateInstance() override { return new Blitter_40bppAnim(); }
};
#endif /* BLITTER_40BPP_OPTIMIZED_HPP */

View File

@@ -32,6 +32,13 @@ add_files(
CONDITION NOT OPTION_DEDICATED AND SSE_FOUND
)
add_files(
40bpp_anim.cpp
40bpp_anim.hpp
CONDITION NOT OPTION_DEDICATED AND OPENGL_FOUND
)
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
set_compile_flags(
32bpp_anim_sse2.cpp

View File

@@ -25,7 +25,7 @@ enum BlitterMode {
/**
* How all blitters should look like. Extend this class to make your own.
*/
class Blitter {
class Blitter : public SpriteEncoder {
public:
/** Parameters related to blitting. */
struct BlitterParams {
@@ -58,6 +58,11 @@ public:
*/
virtual uint8 GetScreenDepth() = 0;
bool Is32BppSupported() override
{
return this->GetScreenDepth() > 8;
}
/**
* Draw an image to the screen, given an amount of params defined above.
*/
@@ -74,11 +79,6 @@ public:
*/
virtual void DrawColourMappingRect(void *dst, int width, int height, PaletteID pal) = 0;
/**
* Convert a sprite from the loader to our own format.
*/
virtual Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) = 0;
/**
* Move the destination pointer the requested amount x and y, keeping in mind
* any pitch and bpp of the renderer.
@@ -185,6 +185,14 @@ public:
*/
virtual Blitter::PaletteAnimation UsePaletteAnimation() = 0;
/**
* Does this blitter require a separate animation buffer from the video backend?
*/
virtual bool NeedsAnimationBuffer()
{
return false;
}
/**
* Get the name of the blitter, the same as the Factory-instance returns.
*/

View File

@@ -73,6 +73,15 @@ protected:
}
}
/**
* Is the blitter usable with the current drivers and hardware config?
* @return True if the blitter can be instantiated.
*/
virtual bool IsUsable() const
{
return true;
}
public:
virtual ~BlitterFactory()
{
@@ -119,7 +128,7 @@ public:
for (; it != GetBlitters().end(); it++) {
BlitterFactory *b = (*it).second;
if (strcasecmp(bname, b->name.c_str()) == 0) {
return b;
return b->IsUsable() ? b : nullptr;
}
}
return nullptr;

View File

@@ -11,7 +11,7 @@
#include "base_media_base.h"
#include "blitter/factory.hpp"
#if defined(WITH_FREETYPE) || defined(WITH_UNISCRIBE)
#if defined(WITH_FREETYPE) || defined(WITH_UNISCRIBE) || defined(WITH_COCOA)
#include "core/geometry_func.hpp"
#include "fontcache.h"
@@ -218,7 +218,7 @@ bool HandleBootstrap()
if (BlitterFactory::GetCurrentBlitter()->GetScreenDepth() == 0) goto failure;
/* If there is no network or no freetype, then there is nothing we can do. Go straight to failure. */
#if (defined(_WIN32) && defined(WITH_UNISCRIBE)) || (defined(WITH_FREETYPE) && (defined(WITH_FONTCONFIG) || defined(__APPLE__)))
#if (defined(_WIN32) && defined(WITH_UNISCRIBE)) || (defined(WITH_FREETYPE) && (defined(WITH_FONTCONFIG) || defined(__APPLE__))) || defined(WITH_COCOA)
if (!_network_available) goto failure;
/* First tell the game we're bootstrapping. */

View File

@@ -61,7 +61,7 @@ typedef GUIList<BuildBridgeData> GUIBridgeList; ///< List of bridges, used in #B
void CcBuildBridge(const CommandCost &result, TileIndex end_tile, uint32 p1, uint32 p2, uint32 cmd)
{
if (result.Failed()) return;
if (_settings_client.sound.confirm) SndPlayTileFx(SND_27_BLACKSMITH_ANVIL, end_tile);
if (_settings_client.sound.confirm) SndPlayTileFx(SND_27_CONSTRUCTION_BRIDGE, end_tile);
TransportType transport_type = Extract<TransportType, 15, 2>(p2);

View File

@@ -77,7 +77,7 @@ CommandCallback CcBuildBridge;
/* dock_gui.cpp */
CommandCallback CcBuildDocks;
CommandCallback CcPlaySound_SPLAT_WATER;
CommandCallback CcPlaySound_CONSTRUCTION_WATER;
/* depot_gui.cpp */
CommandCallback CcCloneVehicle;
@@ -98,13 +98,13 @@ CommandCallback CcPlaceSign;
CommandCallback CcTerraform;
/* rail_gui.cpp */
CommandCallback CcPlaySound_SPLAT_RAIL;
CommandCallback CcPlaySound_CONSTRUCTION_RAIL;
CommandCallback CcRailDepot;
CommandCallback CcStation;
CommandCallback CcBuildRailTunnel;
/* road_gui.cpp */
CommandCallback CcPlaySound_SPLAT_OTHER;
CommandCallback CcPlaySound_CONSTRUCTION_OTHER;
CommandCallback CcBuildRoadTunnel;
CommandCallback CcRoadDepot;
CommandCallback CcRoadStop;

View File

@@ -35,6 +35,7 @@
#include "game/game.hpp"
#include "goal_base.h"
#include "story_base.h"
#include "widgets/statusbar_widget.h"
#include "table/strings.h"
@@ -182,7 +183,7 @@ void InvalidateCompanyWindows(const Company *company)
{
CompanyID cid = company->index;
if (cid == _local_company) SetWindowDirty(WC_STATUS_BAR, 0);
if (cid == _local_company) SetWindowWidgetDirty(WC_STATUS_BAR, 0, WID_S_RIGHT);
SetWindowDirty(WC_FINANCES, cid);
}
@@ -821,13 +822,6 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
ClientID client_id = (ClientID)p2;
NetworkClientInfo *ci = NetworkClientInfo::GetByClientID(client_id);
#ifndef DEBUG_DUMP_COMMANDS
/* When replaying the client ID is not a valid client; there
* are actually no clients at all. However, the company has to
* be created, otherwise we cannot rerun the game properly.
* So only allow a nullptr client info in that case. */
if (ci == nullptr) return CommandCost();
#endif /* NOT DEBUG_DUMP_COMMANDS */
/* Delete multiplayer progress bar */
DeleteWindowById(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN);
@@ -836,7 +830,9 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
/* A new company could not be created, revert to being a spectator */
if (c == nullptr) {
if (_network_server) {
/* We check for "ci != nullptr" as a client could have left by
* the time we execute this command. */
if (_network_server && ci != nullptr) {
ci->client_playas = COMPANY_SPECTATOR;
NetworkUpdateClientInfo(ci->client_id);
}
@@ -863,9 +859,16 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
}
case CCA_NEW_AI: { // Make a new AI company
if (company_id != INVALID_COMPANY && company_id >= MAX_COMPANIES) return CMD_ERROR;
/* For network games, company deletion is delayed. */
if (!_networking && company_id != INVALID_COMPANY && Company::IsValidID(company_id)) return CMD_ERROR;
if (!(flags & DC_EXEC)) return CommandCost();
if (company_id != INVALID_COMPANY && (company_id >= MAX_COMPANIES || Company::IsValidID(company_id))) return CMD_ERROR;
/* For network game, just assume deletion happened. */
assert(company_id == INVALID_COMPANY || !Company::IsValidID(company_id));
Company *c = DoStartupNewCompany(true, company_id);
if (c != nullptr) NetworkServerNewCompany(c, nullptr);
break;
@@ -875,6 +878,9 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
CompanyRemoveReason reason = (CompanyRemoveReason)GB(p1, 24, 8);
if (reason >= CRR_END) return CMD_ERROR;
/* We can't delete the last existing company in singleplayer mode. */
if (!_networking && Company::GetNumItems() == 1) return CMD_ERROR;
Company *c = Company::GetIfValid(company_id);
if (c == nullptr) return CMD_ERROR;

View File

@@ -147,7 +147,7 @@ DEF_CONSOLE_HOOK(ConHookNeedNetwork)
}
/**
* Check whether we are in single player mode.
* Check whether we are in singleplayer mode.
* @return True when no network is active.
*/
DEF_CONSOLE_HOOK(ConHookNoNetwork)
@@ -1248,13 +1248,14 @@ DEF_CONSOLE_CMD(ConReloadAI)
return true;
}
if (Company::IsHumanID(company_id)) {
/* In singleplayer mode the player can be in an AI company, after cheating or loading network save with an AI in first slot. */
if (Company::IsHumanID(company_id) || company_id == _local_company) {
IConsoleWarning("Company is not controlled by an AI.");
return true;
}
/* First kill the company of the AI, then start a new one. This should start the current AI again */
DoCommandP(0, CCA_DELETE | company_id << 16 | CRR_MANUAL << 24, 0,CMD_COMPANY_CTRL);
DoCommandP(0, CCA_DELETE | company_id << 16 | CRR_MANUAL << 24, 0, CMD_COMPANY_CTRL);
DoCommandP(0, CCA_NEW_AI | company_id << 16, 0, CMD_COMPANY_CTRL);
IConsolePrint(CC_DEFAULT, "AI reloaded.");
@@ -1285,6 +1286,7 @@ DEF_CONSOLE_CMD(ConStopAI)
return true;
}
/* In singleplayer mode the player can be in an AI company, after cheating or loading network save with an AI in first slot. */
if (Company::IsHumanID(company_id) || company_id == _local_company) {
IConsoleWarning("Company is not controlled by an AI.");
return true;
@@ -2134,7 +2136,7 @@ static void ConDumpRoadTypes()
grfs.emplace(grfid, grf);
}
IConsolePrintF(CC_DEFAULT, " %02u %s %c%c%c%c, Flags: %c%c%c%c%c, GRF: %08X, %s",
(uint) rt,
(uint)rt,
RoadTypeIsTram(rt) ? "Tram" : "Road",
rti->label >> 24, rti->label >> 16, rti->label >> 8, rti->label,
HasBit(rti->flags, ROTF_CATENARY) ? 'c' : '-',
@@ -2172,7 +2174,7 @@ static void ConDumpRailTypes()
grfs.emplace(grfid, grf);
}
IConsolePrintF(CC_DEFAULT, " %02u %c%c%c%c, Flags: %c%c%c%c%c%c, GRF: %08X, %s",
(uint) rt,
(uint)rt,
rti->label >> 24, rti->label >> 16, rti->label >> 8, rti->label,
HasBit(rti->flags, RTF_CATENARY) ? 'c' : '-',
HasBit(rti->flags, RTF_NO_LEVEL_CROSSING) ? 'l' : '-',
@@ -2215,7 +2217,7 @@ static void ConDumpCargoTypes()
grfs.emplace(grfid, grf);
}
IConsolePrintF(CC_DEFAULT, " %02u Bit: %2u, Label: %c%c%c%c, Callback mask: 0x%02X, Cargo class: %c%c%c%c%c%c%c%c%c%c%c, GRF: %08X, %s",
(uint) i,
(uint)i,
spec->bitnum,
spec->label >> 24, spec->label >> 16, spec->label >> 8, spec->label,
spec->callback_mask,

View File

@@ -26,3 +26,25 @@ Dimension maxdim(const Dimension &d1, const Dimension &d2)
d.height = std::max(d1.height, d2.height);
return d;
}
/**
* Compute the bounding rectangle around two rectangles.
* @param r1 First rectangle.
* @param r2 Second rectangle.
* @return The bounding rectangle, the smallest rectangle that contains both arguments.
*/
Rect BoundingRect(const Rect &r1, const Rect &r2)
{
/* If either the first or the second is empty, return the other. */
if (IsEmptyRect(r1)) return r2;
if (IsEmptyRect(r2)) return r1;
Rect r;
r.top = std::min(r1.top, r2.top);
r.bottom = std::max(r1.bottom, r2.bottom);
r.left = std::min(r1.left, r2.left);
r.right = std::max(r1.right, r2.right);
return r;
}

View File

@@ -14,4 +14,16 @@
Dimension maxdim(const Dimension &d1, const Dimension &d2);
/**
* Check if a rectangle is empty.
* @param r Rectangle to check.
* @return True if and only if the rectangle doesn't define space.
*/
static inline bool IsEmptyRect(const Rect &r)
{
return (r.left | r.top | r.right | r.bottom) == 0;
}
Rect BoundingRect(const Rect &r1, const Rect &r2);
#endif /* GEOMETRY_FUNC_HPP */

View File

@@ -66,6 +66,7 @@ static const CurrencySpec origin_currency_specs[CURRENCY_END] = {
{ 8, "", CF_NOEURO, u8"\u00a5", "", 0, STR_GAME_OPTIONS_CURRENCY_CNY }, ///< chinese renminbi
{ 10, "", CF_NOEURO, "HKD" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_HKD }, ///< hong kong dollar
{ 90, "", CF_NOEURO, u8"\u20b9", "", 0, STR_GAME_OPTIONS_CURRENCY_INR }, ///< Indian Rupee
{ 19, "", CF_NOEURO, "Rp", "", 0, STR_GAME_OPTIONS_CURRENCY_IDR }, ///< Indonesian Rupiah
};
/** Array of currencies used by the system */

View File

@@ -11,6 +11,7 @@
#define CURRENCY_H
#include "date_type.h"
#include "string_func.h"
#include "strings_type.h"
static const int CF_NOEURO = 0; ///< Currency never switches to the Euro (as far as known).
@@ -62,6 +63,7 @@ enum Currencies {
CURRENCY_CNY, ///< Chinese Renminbi
CURRENCY_HKD, ///< Hong Kong Dollar
CURRENCY_INR, ///< Indian Rupee
CURRENCY_IDR, ///< Indonesian Rupiah
CURRENCY_END, ///< always the last item
};
@@ -83,6 +85,15 @@ struct CurrencySpec {
*/
byte symbol_pos;
StringID name;
CurrencySpec() = default;
CurrencySpec(uint16 rate, const char *separator, Year to_euro, const char *prefix, const char *suffix, byte symbol_pos, StringID name) : rate(rate), to_euro(to_euro), symbol_pos(symbol_pos), name(name)
{
strecpy(this->separator, separator, lastof(this->separator));
strecpy(this->prefix, prefix, lastof(this->prefix));
strecpy(this->suffix, suffix, lastof(this->suffix));
}
};
extern CurrencySpec _currency_specs[CURRENCY_END];

View File

@@ -19,6 +19,7 @@
#include "linkgraph/linkgraph.h"
#include "saveload/saveload.h"
#include "newgrf_profiling.h"
#include "widgets/statusbar_widget.h"
#include "safeguards.h"
@@ -255,7 +256,7 @@ static void OnNewDay()
DisasterDailyLoop();
IndustryDailyLoop();
SetWindowWidgetDirty(WC_STATUS_BAR, 0, 0);
SetWindowWidgetDirty(WC_STATUS_BAR, 0, WID_S_LEFT);
EnginesDailyLoop();
/* Refresh after possible snowline change */

View File

@@ -45,8 +45,6 @@ int _debug_console_level;
int _debug_random_level;
#endif
uint32 _realtime_tick = 0;
struct DebugLevel {
const char *name;
int *level;
@@ -134,7 +132,7 @@ static void debug_print(const char *dbg, const char *buf)
char buffer[512];
seprintf(buffer, lastof(buffer), "%sdbg: [%s] %s\n", GetLogPrefix(), dbg, buf);
#if defined(_WIN32)
TCHAR system_buf[512];
wchar_t system_buf[512];
convert_to_fs(buffer, system_buf, lengthof(system_buf), true);
_fputts(system_buf, stderr);
#else

View File

@@ -121,7 +121,4 @@ void CDECL ShowInfoF(const char *str, ...) WARN_FORMAT(1, 2);
const char *GetLogPrefix();
/** The real time in the game. */
extern uint32 _realtime_tick;
#endif /* DEBUG_H */

View File

@@ -294,6 +294,7 @@ struct DepotWindow : Window {
~DepotWindow()
{
DeleteWindowById(WC_BUILD_VEHICLE, this->window_number);
DeleteWindowById(GetWindowClassForVehicleType(this->type), VehicleListIdentifier(VL_DEPOT_LIST, this->type, this->owner, this->GetDepotIndex()).Pack(), false);
OrderBackup::Reset(this->window_number);
}
@@ -423,10 +424,8 @@ struct DepotWindow : Window {
{
if (widget != WID_D_CAPTION) return;
/* locate the depot struct */
TileIndex tile = this->window_number;
SetDParam(0, this->type);
SetDParam(1, (this->type == VEH_AIRCRAFT) ? GetStationIndex(tile) : GetDepotIndex(tile));
SetDParam(1, this->GetDepotIndex());
}
struct GetDepotVehiclePtData {
@@ -809,11 +808,8 @@ struct DepotWindow : Window {
case WID_D_SELL_ALL:
/* Only open the confirmation window if there are anything to sell */
if (this->vehicle_list.size() != 0 || this->wagon_list.size() != 0) {
TileIndex tile = this->window_number;
byte vehtype = this->type;
SetDParam(0, vehtype);
SetDParam(1, (vehtype == VEH_AIRCRAFT) ? GetStationIndex(tile) : GetDepotIndex(tile));
SetDParam(0, this->type);
SetDParam(1, this->GetDepotIndex());
ShowQuery(
STR_DEPOT_CAPTION,
STR_DEPOT_SELL_CONFIRMATION_TEXT,
@@ -839,7 +835,7 @@ struct DepotWindow : Window {
if (str == nullptr) return;
/* Do depot renaming */
DoCommandP(0, GetDepotIndex(this->window_number), 0, CMD_RENAME_DEPOT | CMD_MSG(STR_ERROR_CAN_T_RENAME_DEPOT), nullptr, str);
DoCommandP(0, this->GetDepotIndex(), 0, CMD_RENAME_DEPOT | CMD_MSG(STR_ERROR_CAN_T_RENAME_DEPOT), nullptr, str);
}
bool OnRightClick(Point pt, int widget) override
@@ -1076,6 +1072,16 @@ struct DepotWindow : Window {
return ES_NOT_HANDLED;
}
/**
* Gets the DepotID of the current window.
* In the case of airports, this is the station ID.
* @return Depot or station ID of this window.
*/
inline uint16 GetDepotIndex() const
{
return (this->type == VEH_AIRCRAFT) ? ::GetStationIndex(this->window_number) : ::GetDepotIndex(this->window_number);
}
};
static void DepotSellAllConfirmationCallback(Window *win, bool confirmed)

View File

@@ -42,13 +42,13 @@ void CcBuildDocks(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p
{
if (result.Failed()) return;
if (_settings_client.sound.confirm) SndPlayTileFx(SND_02_SPLAT_WATER, tile);
if (_settings_client.sound.confirm) SndPlayTileFx(SND_02_CONSTRUCTION_WATER, tile);
if (!_settings_client.gui.persistent_buildingtools) ResetObjectToPlace();
}
void CcPlaySound_SPLAT_WATER(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2, uint32 cmd)
void CcPlaySound_CONSTRUCTION_WATER(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2, uint32 cmd)
{
if (result.Succeeded() && _settings_client.sound.confirm) SndPlayTileFx(SND_02_SPLAT_WATER, tile);
if (result.Succeeded() && _settings_client.sound.confirm) SndPlayTileFx(SND_02_CONSTRUCTION_WATER, tile);
}
@@ -244,10 +244,10 @@ struct BuildDocksToolbarWindow : Window {
GUIPlaceProcDragXY(select_proc, start_tile, end_tile);
break;
case DDSP_CREATE_WATER:
DoCommandP(end_tile, start_tile, (_game_mode == GM_EDITOR && _ctrl_pressed) ? WATER_CLASS_SEA : WATER_CLASS_CANAL, CMD_BUILD_CANAL | CMD_MSG(STR_ERROR_CAN_T_BUILD_CANALS), CcPlaySound_SPLAT_WATER);
DoCommandP(end_tile, start_tile, (_game_mode == GM_EDITOR && _ctrl_pressed) ? WATER_CLASS_SEA : WATER_CLASS_CANAL, CMD_BUILD_CANAL | CMD_MSG(STR_ERROR_CAN_T_BUILD_CANALS), CcPlaySound_CONSTRUCTION_WATER);
break;
case DDSP_CREATE_RIVER:
DoCommandP(end_tile, start_tile, WATER_CLASS_RIVER, CMD_BUILD_CANAL | CMD_MSG(STR_ERROR_CAN_T_PLACE_RIVERS), CcPlaySound_SPLAT_WATER);
DoCommandP(end_tile, start_tile, WATER_CLASS_RIVER, CMD_BUILD_CANAL | CMD_MSG(STR_ERROR_CAN_T_PLACE_RIVERS), CcPlaySound_CONSTRUCTION_WATER);
break;
default: break;

View File

@@ -289,7 +289,7 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner)
if (_networking) NetworkClientsToSpectators(old_owner);
if (old_owner == _local_company) {
/* Single player cheated to AI company.
* There are no spectators in single player, so we must pick some other company. */
* There are no spectators in singleplayer mode, so we must pick some other company. */
assert(!_networking);
Backup<CompanyID> cur_company2(_current_company, FILE_LINE);
for (const Company *c : Company::Iterate()) {
@@ -605,7 +605,7 @@ static void CompanyCheckBankrupt(Company *c)
default:
case 10: {
if (!_networking && _local_company == c->index) {
/* If we are in offline mode, leave the company playing. Eg. there
/* If we are in singleplayer mode, leave the company playing. Eg. there
* is no THE-END, otherwise mark the client as spectator to make sure
* he/she is no long in control of this company. However... when you
* join another company (cheat) the "unowned" company can bankrupt. */
@@ -2114,7 +2114,7 @@ CommandCost CmdBuyCompany(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
/* Disable takeovers when not asked */
if (!HasBit(c->bankrupt_asked, _current_company)) return CMD_ERROR;
/* Disable taking over the local company in single player */
/* Disable taking over the local company in singleplayer mode */
if (!_networking && _local_company == c->index) return CMD_ERROR;
/* Do not allow companies to take over themselves */

View File

@@ -499,7 +499,7 @@ static bool BubbleTick(EffectVehicle *v)
if (b->y == 4 && b->x == 1) {
if (v->z_pos > 180 || Chance16I(1, 96, Random())) {
v->spritenum = 5;
if (_settings_client.sound.ambient) SndPlayVehicleFx(SND_2F_POP, v);
if (_settings_client.sound.ambient) SndPlayVehicleFx(SND_2F_BUBBLE_GENERATOR_FAIL, v);
}
anim_state = 0;
}
@@ -508,7 +508,7 @@ static bool BubbleTick(EffectVehicle *v)
TileIndex tile;
anim_state++;
if (_settings_client.sound.ambient) SndPlayVehicleFx(SND_31_EXTRACT, v);
if (_settings_client.sound.ambient) SndPlayVehicleFx(SND_31_BUBBLE_GENERATOR_SUCCESS, v);
tile = TileVirtXY(v->x_pos, v->y_pos);
if (IsTileType(tile, MP_INDUSTRY) && GetIndustryGfx(tile) == GFX_BUBBLE_CATCHER) AddAnimatedTile(tile);

View File

@@ -340,7 +340,7 @@ std::string FioFindDirectory(Subdirectory subdir)
static FILE *FioFOpenFileSp(const std::string &filename, const char *mode, Searchpath sp, Subdirectory subdir, size_t *filesize)
{
#if defined(_WIN32) && defined(UNICODE)
#if defined(_WIN32)
/* fopen is implemented as a define with ellipses for
* Unicode support (prepend an L). As we are not sending
* a string, but a variable, it 'renames' the variable,

View File

@@ -107,14 +107,14 @@ DECLARE_ENUM_AS_BIT_SET(TarScanner::Mode)
struct DIR;
struct dirent { // XXX - only d_name implemented
TCHAR *d_name; // name of found file
wchar_t *d_name; // name of found file
/* little hack which will point to parent DIR struct which will
* save us a call to GetFileAttributes if we want information
* about the file (for example in function fio_bla) */
DIR *dir;
};
DIR *opendir(const TCHAR *path);
DIR *opendir(const wchar_t *path);
struct dirent *readdir(DIR *d);
int closedir(DIR *d);
#else

View File

@@ -17,6 +17,7 @@
#include "network/network_content.h"
#include "screenshot.h"
#include "string_func.h"
#include "strings_func.h"
#include "tar_type.h"
#include <sys/stat.h>
#include <functional>
@@ -376,7 +377,8 @@ static void FiosGetFileList(SaveLoadOperation fop, fios_getlist_callback_proc *c
fios->type = FIOS_TYPE_PARENT;
fios->mtime = 0;
strecpy(fios->name, "..", lastof(fios->name));
strecpy(fios->title, ".. (Parent directory)", lastof(fios->title));
SetDParamStr(0, "..");
GetString(fios->title, STR_SAVELOAD_PARENT_DIRECTORY, lastof(fios->title));
}
/* Show subdirectories */
@@ -392,7 +394,9 @@ static void FiosGetFileList(SaveLoadOperation fop, fios_getlist_callback_proc *c
fios->type = FIOS_TYPE_DIR;
fios->mtime = 0;
strecpy(fios->name, d_name, lastof(fios->name));
seprintf(fios->title, lastof(fios->title), "%s" PATHSEP " (Directory)", d_name);
std::string dirname = std::string(d_name) + PATHSEP;
SetDParamStr(0, dirname.c_str());
GetString(fios->title, STR_SAVELOAD_DIRECTORY, lastof(fios->title));
str_validate(fios->title, lastof(fios->title));
}
}

View File

@@ -9,6 +9,7 @@
#include "stdafx.h"
#include "fontcache.h"
#include "fontcache_internal.h"
#include "fontdetection.h"
#include "blitter/factory.hpp"
#include "core/math_func.hpp"
@@ -31,6 +32,8 @@ static const int ASCII_LETTERSTART = 32; ///< First printable ASCII letter.
static const int _default_font_height[FS_END] = {10, 6, 18, 10};
static const int _default_font_ascender[FS_END] = { 8, 5, 15, 8};
FreeTypeSettings _freetype;
/**
* Create a new font cache.
* @param fs The size of the font.
@@ -52,6 +55,11 @@ FontCache::~FontCache()
Layouter::ResetFontCache(this->fs);
}
int FontCache::GetDefaultFontHeight(FontSize fs)
{
return _default_font_height[fs];
}
/**
* Get height of a character for a given font size.
@@ -197,66 +205,6 @@ bool SpriteFontCache::GetDrawGlyphShadow()
/* static */ FontCache *FontCache::caches[FS_END] = { new SpriteFontCache(FS_NORMAL), new SpriteFontCache(FS_SMALL), new SpriteFontCache(FS_LARGE), new SpriteFontCache(FS_MONO) };
#if defined(WITH_FREETYPE) || defined(_WIN32)
FreeTypeSettings _freetype;
static const int MAX_FONT_SIZE = 72; ///< Maximum font size.
static const byte FACE_COLOUR = 1;
static const byte SHADOW_COLOUR = 2;
/** Font cache for fonts that are based on a TrueType font. */
class TrueTypeFontCache : public FontCache {
protected:
int req_size; ///< Requested font size.
int used_size; ///< Used font size.
typedef SmallMap<uint32, std::pair<size_t, const void*> > FontTable; ///< Table with font table cache
FontTable font_tables; ///< Cached font tables.
/** Container for information about a glyph. */
struct GlyphEntry {
Sprite *sprite; ///< The loaded sprite.
byte width; ///< The width of the glyph.
bool duplicate; ///< Whether this glyph entry is a duplicate, i.e. may this be freed?
};
/**
* The glyph cache. This is structured to reduce memory consumption.
* 1) There is a 'segment' table for each font size.
* 2) Each segment table is a discrete block of characters.
* 3) Each block contains 256 (aligned) characters sequential characters.
*
* The cache is accessed in the following way:
* For character 0x0041 ('A'): glyph_to_sprite[0x00][0x41]
* For character 0x20AC (Euro): glyph_to_sprite[0x20][0xAC]
*
* Currently only 256 segments are allocated, "limiting" us to 65536 characters.
* This can be simply changed in the two functions Get & SetGlyphPtr.
*/
GlyphEntry **glyph_to_sprite;
GlyphEntry *GetGlyphPtr(GlyphID key);
void SetGlyphPtr(GlyphID key, const GlyphEntry *glyph, bool duplicate = false);
virtual const void *InternalGetFontTable(uint32 tag, size_t &length) = 0;
virtual const Sprite *InternalGetGlyph(GlyphID key, bool aa) = 0;
public:
TrueTypeFontCache(FontSize fs, int pixels);
virtual ~TrueTypeFontCache();
virtual int GetFontSize() const { return this->used_size; }
virtual SpriteID GetUnicodeGlyph(WChar key) { return this->parent->GetUnicodeGlyph(key); }
virtual void SetUnicodeGlyph(WChar key, SpriteID sprite) { this->parent->SetUnicodeGlyph(key, sprite); }
virtual void InitializeUnicodeGlyphMap() { this->parent->InitializeUnicodeGlyphMap(); }
virtual const Sprite *GetGlyph(GlyphID key);
virtual const void *GetFontTable(uint32 tag, size_t &length);
virtual void ClearFontCache();
virtual uint GetGlyphWidth(GlyphID key);
virtual bool GetDrawGlyphShadow();
virtual bool IsBuiltInFont() { return false; }
};
/**
* Create a new TrueTypeFontCache.
@@ -329,17 +277,12 @@ void TrueTypeFontCache::SetGlyphPtr(GlyphID key, const GlyphEntry *glyph, bool d
this->glyph_to_sprite[GB(key, 8, 8)][GB(key, 0, 8)].duplicate = duplicate;
}
static void *AllocateFont(size_t size)
{
return MallocT<byte>(size);
}
/* Check if a glyph should be rendered with anti-aliasing. */
static bool GetFontAAState(FontSize size)
static bool GetFontAAState(FontSize size, bool check_blitter = true)
{
/* AA is only supported for 32 bpp */
if (BlitterFactory::GetCurrentBlitter()->GetScreenDepth() != 32) return false;
if (check_blitter && BlitterFactory::GetCurrentBlitter()->GetScreenDepth() != 32) return false;
switch (size) {
default: NOT_REACHED();
@@ -403,10 +346,11 @@ const Sprite *TrueTypeFontCache::GetGlyph(GlyphID key)
0, // x_offs
0, // y_offs
ST_FONT,
SCC_PAL,
builtin_questionmark_data
};
Sprite *spr = BlitterFactory::GetCurrentBlitter()->Encode(&builtin_questionmark, AllocateFont);
Sprite *spr = BlitterFactory::GetCurrentBlitter()->Encode(&builtin_questionmark, SimpleSpriteAlloc);
assert(spr != nullptr);
GlyphEntry new_glyph;
new_glyph.sprite = spr;
@@ -492,7 +436,7 @@ void FreeTypeFontCache::SetFontSize(FontSize fs, FT_Face face, int pixels)
/* Font height is minimum height plus the difference between the default
* height for this font size and the small size. */
int diff = scaled_height - ScaleFontTrad(_default_font_height[FS_SMALL]);
pixels = Clamp(std::min<uint>(head->Lowest_Rec_PPEM, 20u) + diff, scaled_height, MAX_FONT_SIZE);
pixels = Clamp(std::min<uint>(head->Lowest_Rec_PPEM, MAX_FONT_MIN_REC_SIZE) + diff, scaled_height, MAX_FONT_SIZE);
}
} else {
pixels = ScaleFontTrad(pixels);
@@ -660,12 +604,13 @@ const Sprite *FreeTypeFontCache::InternalGetGlyph(GlyphID key, bool aa)
uint height = std::max(1U, (uint)slot->bitmap.rows + (this->fs == FS_NORMAL));
/* Limit glyph size to prevent overflows later on. */
if (width > 256 || height > 256) usererror("Font glyph is too large");
if (width > MAX_GLYPH_DIM || height > MAX_GLYPH_DIM) usererror("Font glyph is too large");
/* FreeType has rendered the glyph, now we allocate a sprite and copy the image into it */
SpriteLoader::Sprite sprite;
sprite.AllocateData(ZOOM_LVL_NORMAL, width * height);
sprite.type = ST_FONT;
sprite.colours = (aa ? SCC_PAL | SCC_ALPHA : SCC_PAL);
sprite.width = width;
sprite.height = height;
sprite.x_offs = slot->bitmap_left;
@@ -693,7 +638,7 @@ const Sprite *FreeTypeFontCache::InternalGetGlyph(GlyphID key, bool aa)
}
GlyphEntry new_glyph;
new_glyph.sprite = BlitterFactory::GetCurrentBlitter()->Encode(&sprite, AllocateFont);
new_glyph.sprite = BlitterFactory::GetCurrentBlitter()->Encode(&sprite, SimpleSpriteAlloc);
new_glyph.width = slot->advance.x >> 6;
this->SetGlyphPtr(key, &new_glyph);
@@ -728,337 +673,8 @@ const void *FreeTypeFontCache::InternalGetFontTable(uint32 tag, size_t &length)
length = len;
return result;
}
#elif defined(_WIN32)
#include "os/windows/win32.h"
#ifndef ANTIALIASED_QUALITY
#define ANTIALIASED_QUALITY 4
#endif
/** Font cache for fonts that are based on a Win32 font. */
class Win32FontCache : public TrueTypeFontCache {
private:
LOGFONT logfont; ///< Logical font information for selecting the font face.
HFONT font = nullptr; ///< The font face associated with this font.
HDC dc = nullptr; ///< Cached GDI device context.
HGDIOBJ old_font; ///< Old font selected into the GDI context.
SIZE glyph_size; ///< Maximum size of regular glyphs.
void SetFontSize(FontSize fs, int pixels);
virtual const void *InternalGetFontTable(uint32 tag, size_t &length);
virtual const Sprite *InternalGetGlyph(GlyphID key, bool aa);
public:
Win32FontCache(FontSize fs, const LOGFONT &logfont, int pixels);
~Win32FontCache();
virtual void ClearFontCache();
virtual GlyphID MapCharToGlyph(WChar key);
virtual const char *GetFontName() { return WIDE_TO_MB(this->logfont.lfFaceName); }
virtual bool IsBuiltInFont() { return false; }
virtual void *GetOSHandle() { return &this->logfont; }
};
/**
* Create a new Win32FontCache.
* @param fs The font size that is going to be cached.
* @param logfont The font that has to be loaded.
* @param pixels The number of pixels this font should be high.
*/
Win32FontCache::Win32FontCache(FontSize fs, const LOGFONT &logfont, int pixels) : TrueTypeFontCache(fs, pixels), logfont(logfont)
{
this->dc = CreateCompatibleDC(nullptr);
this->SetFontSize(fs, pixels);
}
Win32FontCache::~Win32FontCache()
{
this->ClearFontCache();
DeleteDC(this->dc);
DeleteObject(this->font);
}
void Win32FontCache::SetFontSize(FontSize fs, int pixels)
{
if (pixels == 0) {
/* Try to determine a good height based on the minimal height recommended by the font. */
int scaled_height = ScaleFontTrad(_default_font_height[this->fs]);
pixels = scaled_height;
HFONT temp = CreateFontIndirect(&this->logfont);
if (temp != nullptr) {
HGDIOBJ old = SelectObject(this->dc, temp);
UINT size = GetOutlineTextMetrics(this->dc, 0, nullptr);
LPOUTLINETEXTMETRIC otm = (LPOUTLINETEXTMETRIC)AllocaM(BYTE, size);
GetOutlineTextMetrics(this->dc, size, otm);
/* Font height is minimum height plus the difference between the default
* height for this font size and the small size. */
int diff = scaled_height - ScaleFontTrad(_default_font_height[FS_SMALL]);
pixels = Clamp(std::min(otm->otmusMinimumPPEM, 20u) + diff, scaled_height, MAX_FONT_SIZE);
SelectObject(dc, old);
DeleteObject(temp);
}
} else {
pixels = ScaleFontTrad(pixels);
}
this->used_size = pixels;
/* Create GDI font handle. */
this->logfont.lfHeight = -pixels;
this->logfont.lfWidth = 0;
this->logfont.lfOutPrecision = ANTIALIASED_QUALITY;
if (this->font != nullptr) {
SelectObject(dc, this->old_font);
DeleteObject(this->font);
}
this->font = CreateFontIndirect(&this->logfont);
this->old_font = SelectObject(this->dc, this->font);
/* Query the font metrics we needed. */
UINT otmSize = GetOutlineTextMetrics(this->dc, 0, nullptr);
POUTLINETEXTMETRIC otm = (POUTLINETEXTMETRIC)AllocaM(BYTE, otmSize);
GetOutlineTextMetrics(this->dc, otmSize, otm);
this->units_per_em = otm->otmEMSquare;
this->ascender = otm->otmTextMetrics.tmAscent;
this->descender = otm->otmTextMetrics.tmDescent;
this->height = this->ascender + this->descender;
this->glyph_size.cx = otm->otmTextMetrics.tmMaxCharWidth;
this->glyph_size.cy = otm->otmTextMetrics.tmHeight;
DEBUG(freetype, 2, "Loaded font '%s' with size %d", FS2OTTD((LPTSTR)((BYTE *)otm + (ptrdiff_t)otm->otmpFullName)), pixels);
}
/**
* Reset cached glyphs.
*/
void Win32FontCache::ClearFontCache()
{
/* GUI scaling might have changed, determine font size anew if it was automatically selected. */
if (this->font != nullptr) this->SetFontSize(this->fs, this->req_size);
this->TrueTypeFontCache::ClearFontCache();
}
/* virtual */ const Sprite *Win32FontCache::InternalGetGlyph(GlyphID key, bool aa)
{
GLYPHMETRICS gm;
MAT2 mat = { {0, 1}, {0, 0}, {0, 0}, {0, 1} };
/* Make a guess for the needed memory size. */
DWORD size = this->glyph_size.cy * Align(aa ? this->glyph_size.cx : std::max(this->glyph_size.cx / 8l, 1l), 4); // Bitmap data is DWORD-aligned rows.
byte *bmp = AllocaM(byte, size);
size = GetGlyphOutline(this->dc, key, GGO_GLYPH_INDEX | (aa ? GGO_GRAY8_BITMAP : GGO_BITMAP), &gm, size, bmp, &mat);
if (size == GDI_ERROR) {
/* No dice with the guess. First query size of needed glyph memory, then allocate the
* memory and query again. This dance is necessary as some glyphs will only render with
* the exact matching size; e.g. the space glyph has no pixels and must be requested
* with size == 0, anything else fails. Unfortunately, a failed call doesn't return any
* info about the size and thus the triple GetGlyphOutline()-call. */
size = GetGlyphOutline(this->dc, key, GGO_GLYPH_INDEX | (aa ? GGO_GRAY8_BITMAP : GGO_BITMAP), &gm, 0, nullptr, &mat);
if (size == GDI_ERROR) usererror("Unable to render font glyph");
bmp = AllocaM(byte, size);
GetGlyphOutline(this->dc, key, GGO_GLYPH_INDEX | (aa ? GGO_GRAY8_BITMAP : GGO_BITMAP), &gm, size, bmp, &mat);
}
/* Add 1 pixel for the shadow on the medium font. Our sprite must be at least 1x1 pixel. */
uint width = std::max(1U, (uint)gm.gmBlackBoxX + (this->fs == FS_NORMAL));
uint height = std::max(1U, (uint)gm.gmBlackBoxY + (this->fs == FS_NORMAL));
/* Limit glyph size to prevent overflows later on. */
if (width > 256 || height > 256) usererror("Font glyph is too large");
/* GDI has rendered the glyph, now we allocate a sprite and copy the image into it. */
SpriteLoader::Sprite sprite;
sprite.AllocateData(ZOOM_LVL_NORMAL, width * height);
sprite.type = ST_FONT;
sprite.width = width;
sprite.height = height;
sprite.x_offs = gm.gmptGlyphOrigin.x;
sprite.y_offs = this->ascender - gm.gmptGlyphOrigin.y;
if (size > 0) {
/* All pixel data returned by GDI is in the form of DWORD-aligned rows.
* For a non anti-aliased glyph, the returned bitmap has one bit per pixel.
* For anti-aliased rendering, GDI uses the strange value range of 0 to 64,
* inclusively. To map this to 0 to 255, we shift left by two and then
* subtract one. */
uint pitch = Align(aa ? gm.gmBlackBoxX : std::max(gm.gmBlackBoxX / 8u, 1u), 4);
/* Draw shadow for medium size. */
if (this->fs == FS_NORMAL && !aa) {
for (uint y = 0; y < gm.gmBlackBoxY; y++) {
for (uint x = 0; x < gm.gmBlackBoxX; x++) {
if (aa ? (bmp[x + y * pitch] > 0) : HasBit(bmp[(x / 8) + y * pitch], 7 - (x % 8))) {
sprite.data[1 + x + (1 + y) * sprite.width].m = SHADOW_COLOUR;
sprite.data[1 + x + (1 + y) * sprite.width].a = aa ? (bmp[x + y * pitch] << 2) - 1 : 0xFF;
}
}
}
}
for (uint y = 0; y < gm.gmBlackBoxY; y++) {
for (uint x = 0; x < gm.gmBlackBoxX; x++) {
if (aa ? (bmp[x + y * pitch] > 0) : HasBit(bmp[(x / 8) + y * pitch], 7 - (x % 8))) {
sprite.data[x + y * sprite.width].m = FACE_COLOUR;
sprite.data[x + y * sprite.width].a = aa ? (bmp[x + y * pitch] << 2) - 1 : 0xFF;
}
}
}
}
GlyphEntry new_glyph;
new_glyph.sprite = BlitterFactory::GetCurrentBlitter()->Encode(&sprite, AllocateFont);
new_glyph.width = gm.gmCellIncX;
this->SetGlyphPtr(key, &new_glyph);
return new_glyph.sprite;
}
/* virtual */ GlyphID Win32FontCache::MapCharToGlyph(WChar key)
{
assert(IsPrintable(key));
if (key >= SCC_SPRITE_START && key <= SCC_SPRITE_END) {
return this->parent->MapCharToGlyph(key);
}
/* Convert characters outside of the BMP into surrogate pairs. */
WCHAR chars[2];
if (key >= 0x010000U) {
chars[0] = (WCHAR)(((key - 0x010000U) >> 10) + 0xD800);
chars[1] = (WCHAR)(((key - 0x010000U) & 0x3FF) + 0xDC00);
} else {
chars[0] = (WCHAR)(key & 0xFFFF);
}
WORD glyphs[2] = {0, 0};
GetGlyphIndicesW(this->dc, chars, key >= 0x010000U ? 2 : 1, glyphs, GGI_MARK_NONEXISTING_GLYPHS);
return glyphs[0] != 0xFFFF ? glyphs[0] : 0;
}
/* virtual */ const void *Win32FontCache::InternalGetFontTable(uint32 tag, size_t &length)
{
DWORD len = GetFontData(this->dc, tag, 0, nullptr, 0);
void *result = nullptr;
if (len != GDI_ERROR && len > 0) {
result = MallocT<BYTE>(len);
GetFontData(this->dc, tag, 0, result, len);
}
length = len;
return result;
}
/**
* Loads the GDI font.
* If a GDI font description is present, e.g. from the automatic font
* fallback search, use it. Otherwise, try to resolve it by font name.
* @param fs The font size to load.
*/
static void LoadWin32Font(FontSize fs)
{
static const char *SIZE_TO_NAME[] = { "medium", "small", "large", "mono" };
FreeTypeSubSetting *settings = nullptr;
switch (fs) {
default: NOT_REACHED();
case FS_SMALL: settings = &_freetype.small; break;
case FS_NORMAL: settings = &_freetype.medium; break;
case FS_LARGE: settings = &_freetype.large; break;
case FS_MONO: settings = &_freetype.mono; break;
}
if (StrEmpty(settings->font)) return;
LOGFONT logfont;
MemSetT(&logfont, 0);
logfont.lfPitchAndFamily = fs == FS_MONO ? FIXED_PITCH : VARIABLE_PITCH;
logfont.lfCharSet = DEFAULT_CHARSET;
logfont.lfOutPrecision = OUT_OUTLINE_PRECIS;
logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
if (settings->os_handle != nullptr) {
logfont = *(const LOGFONT *)settings->os_handle;
} else if (strchr(settings->font, '.') != nullptr) {
/* Might be a font file name, try load it. */
TCHAR fontPath[MAX_PATH] = {};
/* See if this is an absolute path. */
if (FileExists(settings->font)) {
convert_to_fs(settings->font, fontPath, lengthof(fontPath), false);
} else {
/* Scan the search-paths to see if it can be found. */
std::string full_font = FioFindFullPath(BASE_DIR, settings->font);
if (!full_font.empty()) {
convert_to_fs(full_font.c_str(), fontPath, lengthof(fontPath), false);
}
}
if (fontPath[0] != 0) {
if (AddFontResourceEx(fontPath, FR_PRIVATE, 0) != 0) {
/* Try a nice little undocumented function first for getting the internal font name.
* Some documentation is found at: http://www.undocprint.org/winspool/getfontresourceinfo */
typedef BOOL(WINAPI * PFNGETFONTRESOURCEINFO)(LPCTSTR, LPDWORD, LPVOID, DWORD);
#ifdef UNICODE
static PFNGETFONTRESOURCEINFO GetFontResourceInfo = (PFNGETFONTRESOURCEINFO)GetProcAddress(GetModuleHandle(_T("Gdi32")), "GetFontResourceInfoW");
#else
static PFNGETFONTRESOURCEINFO GetFontResourceInfo = (PFNGETFONTRESOURCEINFO)GetProcAddress(GetModuleHandle(_T("Gdi32")), "GetFontResourceInfoA");
#endif
if (GetFontResourceInfo != nullptr) {
/* Try to query an array of LOGFONTs that describe the file. */
DWORD len = 0;
if (GetFontResourceInfo(fontPath, &len, nullptr, 2) && len >= sizeof(LOGFONT)) {
LOGFONT *buf = (LOGFONT *)AllocaM(byte, len);
if (GetFontResourceInfo(fontPath, &len, buf, 2)) {
logfont = *buf; // Just use first entry.
}
}
}
/* No dice yet. Use the file name as the font face name, hoping it matches. */
if (logfont.lfFaceName[0] == 0) {
TCHAR fname[_MAX_FNAME];
_tsplitpath(fontPath, nullptr, nullptr, fname, nullptr);
_tcsncpy_s(logfont.lfFaceName, lengthof(logfont.lfFaceName), fname, _TRUNCATE);
logfont.lfWeight = strcasestr(settings->font, " bold") != nullptr || strcasestr(settings->font, "-bold") != nullptr ? FW_BOLD : FW_NORMAL; // Poor man's way to allow selecting bold fonts.
}
} else {
ShowInfoF("Unable to load file '%s' for %s font, using default windows font selection instead", settings->font, SIZE_TO_NAME[fs]);
}
}
}
if (logfont.lfFaceName[0] == 0) {
logfont.lfWeight = strcasestr(settings->font, " bold") != nullptr ? FW_BOLD : FW_NORMAL; // Poor man's way to allow selecting bold fonts.
convert_to_fs(settings->font, logfont.lfFaceName, lengthof(logfont.lfFaceName), false);
}
HFONT font = CreateFontIndirect(&logfont);
if (font == nullptr) {
ShowInfoF("Unable to use '%s' for %s font, Win32 reported error 0x%lX, using sprite font instead", settings->font, SIZE_TO_NAME[fs], GetLastError());
return;
}
DeleteObject(font);
new Win32FontCache(fs, logfont, settings->size);
}
#endif /* WITH_FREETYPE */
#endif /* defined(WITH_FREETYPE) || defined(_WIN32) */
/**
* (Re)initialize the freetype related things, i.e. load the non-sprite fonts.
@@ -1075,7 +691,11 @@ void InitFreeType(bool monospace)
#ifdef WITH_FREETYPE
LoadFreeTypeFont(fs);
#elif defined(_WIN32)
extern void LoadWin32Font(FontSize fs);
LoadWin32Font(fs);
#elif defined(WITH_COCOA)
extern void LoadCoreTextFont(FontSize fs);
LoadCoreTextFont(fs);
#endif
}
}
@@ -1095,3 +715,25 @@ void UninitFreeType()
_library = nullptr;
#endif /* WITH_FREETYPE */
}
/**
* Should any of the active fonts be anti-aliased?
* @return True if any of the loaded fonts want anti-aliased drawing.
*/
bool HasAntialiasedFonts()
{
for (FontSize fs = FS_BEGIN; fs < FS_END; fs++) {
if (!FontCache::Get(fs)->IsBuiltInFont() && GetFontAAState(fs, false)) return true;
}
return false;
}
#if !defined(_WIN32) && !defined(__APPLE__) && !defined(WITH_FONTCONFIG) && !defined(WITH_COCOA)
#ifdef WITH_FREETYPE
FT_Error GetFontByFaceName(const char *font_name, FT_Face *face) { return FT_Err_Cannot_Open_Resource; }
#endif /* WITH_FREETYPE */
bool SetFallbackFont(FreeTypeSettings *settings, const char *language_isocode, int winlangid, MissingGlyphSearcher *callback) { return false; }
#endif /* !defined(_WIN32) && !defined(__APPLE__) && !defined(WITH_FONTCONFIG) && !defined(WITH_COCOA) */

View File

@@ -28,6 +28,9 @@ protected:
int ascender; ///< The ascender value of the font.
int descender; ///< The descender value of the font.
int units_per_em; ///< The units per EM value of the font.
static int GetDefaultFontHeight(FontSize fs);
public:
FontCache(FontSize fs);
virtual ~FontCache();
@@ -127,7 +130,7 @@ public:
* Get the native OS font handle, if there is one.
* @return Opaque OS font handle.
*/
virtual void *GetOSHandle()
virtual const void *GetOSHandle()
{
return nullptr;
}
@@ -209,15 +212,13 @@ static inline bool GetDrawGlyphShadow(FontSize size)
return FontCache::Get(size)->GetDrawGlyphShadow();
}
#if defined(WITH_FREETYPE) || defined(_WIN32)
/** Settings for a single freetype font. */
struct FreeTypeSubSetting {
char font[MAX_PATH]; ///< The name of the font, or path to the font.
uint size; ///< The (requested) size of the font.
bool aa; ///< Whether to do anti aliasing or not.
const void *os_handle = nullptr; ///< Optional native OS font info.
const void *os_handle = nullptr; ///< Optional native OS font info. Only valid during font search.
};
/** Settings for the freetype fonts. */
@@ -230,9 +231,8 @@ struct FreeTypeSettings {
extern FreeTypeSettings _freetype;
#endif /* defined(WITH_FREETYPE) || defined(_WIN32) */
void InitFreeType(bool monospace);
void UninitFreeType();
bool HasAntialiasedFonts();
#endif /* FONTCACHE_H */

77
src/fontcache_internal.h Normal file
View File

@@ -0,0 +1,77 @@
/*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file fontcache_internal.h Support types and functions for platform-specific font support. */
#ifndef FONTCACHE_INTERNAL_H
#define FONTCACHE_INTERNAL_H
#include "core/smallmap_type.hpp"
#include "fontcache.h"
static const int MAX_FONT_SIZE = 72; ///< Maximum font size.
static const byte FACE_COLOUR = 1;
static const byte SHADOW_COLOUR = 2;
/** Font cache for fonts that are based on a TrueType font. */
class TrueTypeFontCache : public FontCache {
protected:
static constexpr int MAX_GLYPH_DIM = 256; ///< Maximum glyph dimensions.
static constexpr uint MAX_FONT_MIN_REC_SIZE = 20u; ///< Upper limit for the recommended font size in case a font file contains nonsensical values.
int req_size; ///< Requested font size.
int used_size; ///< Used font size.
typedef SmallMap<uint32, std::pair<size_t, const void *> > FontTable; ///< Table with font table cache
FontTable font_tables; ///< Cached font tables.
/** Container for information about a glyph. */
struct GlyphEntry {
Sprite *sprite; ///< The loaded sprite.
byte width; ///< The width of the glyph.
bool duplicate; ///< Whether this glyph entry is a duplicate, i.e. may this be freed?
};
/**
* The glyph cache. This is structured to reduce memory consumption.
* 1) There is a 'segment' table for each font size.
* 2) Each segment table is a discrete block of characters.
* 3) Each block contains 256 (aligned) characters sequential characters.
*
* The cache is accessed in the following way:
* For character 0x0041 ('A'): glyph_to_sprite[0x00][0x41]
* For character 0x20AC (Euro): glyph_to_sprite[0x20][0xAC]
*
* Currently only 256 segments are allocated, "limiting" us to 65536 characters.
* This can be simply changed in the two functions Get & SetGlyphPtr.
*/
GlyphEntry **glyph_to_sprite;
GlyphEntry *GetGlyphPtr(GlyphID key);
void SetGlyphPtr(GlyphID key, const GlyphEntry *glyph, bool duplicate = false);
virtual const void *InternalGetFontTable(uint32 tag, size_t &length) = 0;
virtual const Sprite *InternalGetGlyph(GlyphID key, bool aa) = 0;
public:
TrueTypeFontCache(FontSize fs, int pixels);
virtual ~TrueTypeFontCache();
int GetFontSize() const override { return this->used_size; }
SpriteID GetUnicodeGlyph(WChar key) override { return this->parent->GetUnicodeGlyph(key); }
void SetUnicodeGlyph(WChar key, SpriteID sprite) override { this->parent->SetUnicodeGlyph(key, sprite); }
void InitializeUnicodeGlyphMap() override { this->parent->InitializeUnicodeGlyphMap(); }
const Sprite *GetGlyph(GlyphID key) override;
const void *GetFontTable(uint32 tag, size_t &length) override;
void ClearFontCache() override;
uint GetGlyphWidth(GlyphID key) override;
bool GetDrawGlyphShadow() override;
bool IsBuiltInFont() override { return false; }
};
#endif /* FONTCACHE_INTERNAL_H */

View File

@@ -1,654 +0,0 @@
/*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file fontdetection.cpp Detection of the right font. */
#if defined(WITH_FREETYPE) || defined(_WIN32)
#include "stdafx.h"
#include "debug.h"
#include "fontdetection.h"
#include "string_func.h"
#include "strings_func.h"
#ifdef WITH_FREETYPE
extern FT_Library _library;
#endif /* WITH_FREETYPE */
/**
* Get the font loaded into a Freetype face by using a font-name.
* If no appropriate font is found, the function returns an error
*/
/* ========================================================================================
* Windows support
* ======================================================================================== */
#ifdef _WIN32
#include "core/alloc_func.hpp"
#include "core/math_func.hpp"
#include <windows.h>
#include <shlobj.h> /* SHGetFolderPath */
#include "os/windows/win32.h"
#include "safeguards.h"
#ifdef WITH_FREETYPE
/**
* Get the short DOS 8.3 format for paths.
* FreeType doesn't support Unicode filenames and Windows' fopen (as used
* by FreeType) doesn't support UTF-8 filenames. So we have to convert the
* filename into something that isn't UTF-8 but represents the Unicode file
* name. This is the short DOS 8.3 format. This does not contain any
* characters that fopen doesn't support.
* @param long_path the path in system encoding.
* @return the short path in ANSI (ASCII).
*/
const char *GetShortPath(const TCHAR *long_path)
{
static char short_path[MAX_PATH];
#ifdef UNICODE
WCHAR short_path_w[MAX_PATH];
GetShortPathName(long_path, short_path_w, lengthof(short_path_w));
WideCharToMultiByte(CP_ACP, 0, short_path_w, -1, short_path, lengthof(short_path), nullptr, nullptr);
#else
/* Technically not needed, but do it for consistency. */
GetShortPathName(long_path, short_path, lengthof(short_path));
#endif
return short_path;
}
/* Get the font file to be loaded into Freetype by looping the registry
* location where windows lists all installed fonts. Not very nice, will
* surely break if the registry path changes, but it works. Much better
* solution would be to use CreateFont, and extract the font data from it
* by GetFontData. The problem with this is that the font file needs to be
* kept in memory then until the font is no longer needed. This could mean
* an additional memory usage of 30MB (just for fonts!) when using an eastern
* font for all font sizes */
#define FONT_DIR_NT "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"
#define FONT_DIR_9X "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Fonts"
FT_Error GetFontByFaceName(const char *font_name, FT_Face *face)
{
FT_Error err = FT_Err_Cannot_Open_Resource;
HKEY hKey;
LONG ret;
TCHAR vbuffer[MAX_PATH], dbuffer[256];
TCHAR *pathbuf;
const char *font_path;
uint index;
size_t path_len;
/* On windows NT (2000, NT3.5, XP, etc.) the fonts are stored in the
* "Windows NT" key, on Windows 9x in the Windows key. To save us having
* to retrieve the windows version, we'll just query both */
ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T(FONT_DIR_NT), 0, KEY_READ, &hKey);
if (ret != ERROR_SUCCESS) ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T(FONT_DIR_9X), 0, KEY_READ, &hKey);
if (ret != ERROR_SUCCESS) {
DEBUG(freetype, 0, "Cannot open registry key HKLM\\SOFTWARE\\Microsoft\\Windows (NT)\\CurrentVersion\\Fonts");
return err;
}
/* Convert font name to file system encoding. */
TCHAR *font_namep = _tcsdup(OTTD2FS(font_name));
for (index = 0;; index++) {
TCHAR *s;
DWORD vbuflen = lengthof(vbuffer);
DWORD dbuflen = lengthof(dbuffer);
ret = RegEnumValue(hKey, index, vbuffer, &vbuflen, nullptr, nullptr, (byte*)dbuffer, &dbuflen);
if (ret != ERROR_SUCCESS) goto registry_no_font_found;
/* The font names in the registry are of the following 3 forms:
* - ADMUI3.fon
* - Book Antiqua Bold (TrueType)
* - Batang & BatangChe & Gungsuh & GungsuhChe (TrueType)
* We will strip the font-type '()' if any and work with the font name
* itself, which must match exactly; if...
* TTC files, font files which contain more than one font are separated
* by '&'. Our best bet will be to do substr match for the fontname
* and then let FreeType figure out which index to load */
s = _tcschr(vbuffer, _T('('));
if (s != nullptr) s[-1] = '\0';
if (_tcschr(vbuffer, _T('&')) == nullptr) {
if (_tcsicmp(vbuffer, font_namep) == 0) break;
} else {
if (_tcsstr(vbuffer, font_namep) != nullptr) break;
}
}
if (!SUCCEEDED(OTTDSHGetFolderPath(nullptr, CSIDL_FONTS, nullptr, SHGFP_TYPE_CURRENT, vbuffer))) {
DEBUG(freetype, 0, "SHGetFolderPath cannot return fonts directory");
goto folder_error;
}
/* Some fonts are contained in .ttc files, TrueType Collection fonts. These
* contain multiple fonts inside this single file. GetFontData however
* returns the whole file, so we need to check each font inside to get the
* proper font. */
path_len = _tcslen(vbuffer) + _tcslen(dbuffer) + 2; // '\' and terminating nul.
pathbuf = AllocaM(TCHAR, path_len);
_sntprintf(pathbuf, path_len, _T("%s\\%s"), vbuffer, dbuffer);
/* Convert the path into something that FreeType understands. */
font_path = GetShortPath(pathbuf);
index = 0;
do {
err = FT_New_Face(_library, font_path, index, face);
if (err != FT_Err_Ok) break;
if (strncasecmp(font_name, (*face)->family_name, strlen((*face)->family_name)) == 0) break;
/* Try english name if font name failed */
if (strncasecmp(font_name + strlen(font_name) + 1, (*face)->family_name, strlen((*face)->family_name)) == 0) break;
err = FT_Err_Cannot_Open_Resource;
} while ((FT_Long)++index != (*face)->num_faces);
folder_error:
registry_no_font_found:
free(font_namep);
RegCloseKey(hKey);
return err;
}
/**
* Fonts can have localised names and when the system locale is the same as
* one of those localised names Windows will always return that localised name
* instead of allowing to get the non-localised (English US) name of the font.
* This will later on give problems as freetype uses the non-localised name of
* the font and we need to compare based on that name.
* Windows furthermore DOES NOT have an API to get the non-localised name nor
* can we override the system locale. This means that we have to actually read
* the font itself to gather the font name we want.
* Based on: http://blogs.msdn.com/michkap/archive/2006/02/13/530814.aspx
* @param logfont the font information to get the english name of.
* @return the English name (if it could be found).
*/
static const char *GetEnglishFontName(const ENUMLOGFONTEX *logfont)
{
static char font_name[MAX_PATH];
const char *ret_font_name = nullptr;
uint pos = 0;
HDC dc;
HGDIOBJ oldfont;
byte *buf;
DWORD dw;
uint16 format, count, stringOffset, platformId, encodingId, languageId, nameId, length, offset;
HFONT font = CreateFontIndirect(&logfont->elfLogFont);
if (font == nullptr) goto err1;
dc = GetDC(nullptr);
oldfont = SelectObject(dc, font);
dw = GetFontData(dc, 'eman', 0, nullptr, 0);
if (dw == GDI_ERROR) goto err2;
buf = MallocT<byte>(dw);
dw = GetFontData(dc, 'eman', 0, buf, dw);
if (dw == GDI_ERROR) goto err3;
format = buf[pos++] << 8;
format += buf[pos++];
assert(format == 0);
count = buf[pos++] << 8;
count += buf[pos++];
stringOffset = buf[pos++] << 8;
stringOffset += buf[pos++];
for (uint i = 0; i < count; i++) {
platformId = buf[pos++] << 8;
platformId += buf[pos++];
encodingId = buf[pos++] << 8;
encodingId += buf[pos++];
languageId = buf[pos++] << 8;
languageId += buf[pos++];
nameId = buf[pos++] << 8;
nameId += buf[pos++];
if (nameId != 1) {
pos += 4; // skip length and offset
continue;
}
length = buf[pos++] << 8;
length += buf[pos++];
offset = buf[pos++] << 8;
offset += buf[pos++];
/* Don't buffer overflow */
length = std::min(length, MAX_PATH - 1);
for (uint j = 0; j < length; j++) font_name[j] = buf[stringOffset + offset + j];
font_name[length] = '\0';
if ((platformId == 1 && languageId == 0) || // Macintosh English
(platformId == 3 && languageId == 0x0409)) { // Microsoft English (US)
ret_font_name = font_name;
break;
}
}
err3:
free(buf);
err2:
SelectObject(dc, oldfont);
ReleaseDC(nullptr, dc);
DeleteObject(font);
err1:
return ret_font_name == nullptr ? WIDE_TO_MB((const TCHAR*)logfont->elfFullName) : ret_font_name;
}
#endif /* WITH_FREETYPE */
class FontList {
protected:
TCHAR **fonts;
uint items;
uint capacity;
public:
FontList() : fonts(nullptr), items(0), capacity(0) { };
~FontList() {
if (this->fonts == nullptr) return;
for (uint i = 0; i < this->items; i++) {
free(this->fonts[i]);
}
free(this->fonts);
}
bool Add(const TCHAR *font) {
for (uint i = 0; i < this->items; i++) {
if (_tcscmp(this->fonts[i], font) == 0) return false;
}
if (this->items == this->capacity) {
this->capacity += 10;
this->fonts = ReallocT(this->fonts, this->capacity);
}
this->fonts[this->items++] = _tcsdup(font);
return true;
}
};
struct EFCParam {
FreeTypeSettings *settings;
LOCALESIGNATURE locale;
MissingGlyphSearcher *callback;
FontList fonts;
};
static int CALLBACK EnumFontCallback(const ENUMLOGFONTEX *logfont, const NEWTEXTMETRICEX *metric, DWORD type, LPARAM lParam)
{
EFCParam *info = (EFCParam *)lParam;
/* Skip duplicates */
if (!info->fonts.Add((const TCHAR*)logfont->elfFullName)) return 1;
/* Only use TrueType fonts */
if (!(type & TRUETYPE_FONTTYPE)) return 1;
/* Don't use SYMBOL fonts */
if (logfont->elfLogFont.lfCharSet == SYMBOL_CHARSET) return 1;
/* Use monospaced fonts when asked for it. */
if (info->callback->Monospace() && (logfont->elfLogFont.lfPitchAndFamily & (FF_MODERN | FIXED_PITCH)) != (FF_MODERN | FIXED_PITCH)) return 1;
/* The font has to have at least one of the supported locales to be usable. */
if ((metric->ntmFontSig.fsCsb[0] & info->locale.lsCsbSupported[0]) == 0 && (metric->ntmFontSig.fsCsb[1] & info->locale.lsCsbSupported[1]) == 0) {
/* On win9x metric->ntmFontSig seems to contain garbage. */
FONTSIGNATURE fs;
memset(&fs, 0, sizeof(fs));
HFONT font = CreateFontIndirect(&logfont->elfLogFont);
if (font != nullptr) {
HDC dc = GetDC(nullptr);
HGDIOBJ oldfont = SelectObject(dc, font);
GetTextCharsetInfo(dc, &fs, 0);
SelectObject(dc, oldfont);
ReleaseDC(nullptr, dc);
DeleteObject(font);
}
if ((fs.fsCsb[0] & info->locale.lsCsbSupported[0]) == 0 && (fs.fsCsb[1] & info->locale.lsCsbSupported[1]) == 0) return 1;
}
char font_name[MAX_PATH];
convert_from_fs((const TCHAR *)logfont->elfFullName, font_name, lengthof(font_name));
#ifdef WITH_FREETYPE
/* Add english name after font name */
const char *english_name = GetEnglishFontName(logfont);
strecpy(font_name + strlen(font_name) + 1, english_name, lastof(font_name));
/* Check whether we can actually load the font. */
bool ft_init = _library != nullptr;
bool found = false;
FT_Face face;
/* Init FreeType if needed. */
if ((ft_init || FT_Init_FreeType(&_library) == FT_Err_Ok) && GetFontByFaceName(font_name, &face) == FT_Err_Ok) {
FT_Done_Face(face);
found = true;
}
if (!ft_init) {
/* Uninit FreeType if we did the init. */
FT_Done_FreeType(_library);
_library = nullptr;
}
if (!found) return 1;
#else
const char *english_name = font_name;
#endif /* WITH_FREETYPE */
PLOGFONT os_data = MallocT<LOGFONT>(1);
*os_data = logfont->elfLogFont;
info->callback->SetFontNames(info->settings, font_name, os_data);
if (info->callback->FindMissingGlyphs()) return 1;
DEBUG(freetype, 1, "Fallback font: %s (%s)", font_name, english_name);
return 0; // stop enumerating
}
bool SetFallbackFont(FreeTypeSettings *settings, const char *language_isocode, int winlangid, MissingGlyphSearcher *callback)
{
DEBUG(freetype, 1, "Trying fallback fonts");
EFCParam langInfo;
if (GetLocaleInfo(MAKELCID(winlangid, SORT_DEFAULT), LOCALE_FONTSIGNATURE, (LPTSTR)&langInfo.locale, sizeof(langInfo.locale) / sizeof(TCHAR)) == 0) {
/* Invalid langid or some other mysterious error, can't determine fallback font. */
DEBUG(freetype, 1, "Can't get locale info for fallback font (langid=0x%x)", winlangid);
return false;
}
langInfo.settings = settings;
langInfo.callback = callback;
LOGFONT font;
/* Enumerate all fonts. */
font.lfCharSet = DEFAULT_CHARSET;
font.lfFaceName[0] = '\0';
font.lfPitchAndFamily = 0;
HDC dc = GetDC(nullptr);
int ret = EnumFontFamiliesEx(dc, &font, (FONTENUMPROC)&EnumFontCallback, (LPARAM)&langInfo, 0);
ReleaseDC(nullptr, dc);
return ret == 0;
}
#elif defined(__APPLE__) /* end ifdef Win32 */
/* ========================================================================================
* OSX support
* ======================================================================================== */
#include "os/macosx/macos.h"
#include "safeguards.h"
FT_Error GetFontByFaceName(const char *font_name, FT_Face *face)
{
FT_Error err = FT_Err_Cannot_Open_Resource;
/* Get font reference from name. */
UInt8 file_path[PATH_MAX];
OSStatus os_err = -1;
CFAutoRelease<CFStringRef> name(CFStringCreateWithCString(kCFAllocatorDefault, font_name, kCFStringEncodingUTF8));
/* Simply creating the font using CTFontCreateWithNameAndSize will *always* return
* something, no matter the name. As such, we can't use it to check for existence.
* We instead query the list of all font descriptors that match the given name which
* does not do this stupid name fallback. */
CFAutoRelease<CTFontDescriptorRef> name_desc(CTFontDescriptorCreateWithNameAndSize(name.get(), 0.0));
CFAutoRelease<CFSetRef> mandatory_attribs(CFSetCreate(kCFAllocatorDefault, const_cast<const void **>(reinterpret_cast<const void * const *>(&kCTFontNameAttribute)), 1, &kCFTypeSetCallBacks));
CFAutoRelease<CFArrayRef> descs(CTFontDescriptorCreateMatchingFontDescriptors(name_desc.get(), mandatory_attribs.get()));
/* Loop over all matches until we can get a path for one of them. */
for (CFIndex i = 0; descs.get() != nullptr && i < CFArrayGetCount(descs.get()) && os_err != noErr; i++) {
CFAutoRelease<CTFontRef> font(CTFontCreateWithFontDescriptor((CTFontDescriptorRef)CFArrayGetValueAtIndex(descs.get(), i), 0.0, nullptr));
CFAutoRelease<CFURLRef> fontURL((CFURLRef)CTFontCopyAttribute(font.get(), kCTFontURLAttribute));
if (CFURLGetFileSystemRepresentation(fontURL.get(), true, file_path, lengthof(file_path))) os_err = noErr;
}
if (os_err == noErr) {
DEBUG(freetype, 3, "Font path for %s: %s", font_name, file_path);
err = FT_New_Face(_library, (const char *)file_path, 0, face);
}
return err;
}
bool SetFallbackFont(FreeTypeSettings *settings, const char *language_isocode, int winlangid, MissingGlyphSearcher *callback)
{
/* Determine fallback font using CoreText. This uses the language isocode
* to find a suitable font. CoreText is available from 10.5 onwards. */
char lang[16];
if (strcmp(language_isocode, "zh_TW") == 0) {
/* Traditional Chinese */
strecpy(lang, "zh-Hant", lastof(lang));
} else if (strcmp(language_isocode, "zh_CN") == 0) {
/* Simplified Chinese */
strecpy(lang, "zh-Hans", lastof(lang));
} else {
/* Just copy the first part of the isocode. */
strecpy(lang, language_isocode, lastof(lang));
char *sep = strchr(lang, '_');
if (sep != nullptr) *sep = '\0';
}
/* Create a font descriptor matching the wanted language and latin (english) glyphs.
* Can't use CFAutoRelease here for everything due to the way the dictionary has to be created. */
CFStringRef lang_codes[2];
lang_codes[0] = CFStringCreateWithCString(kCFAllocatorDefault, lang, kCFStringEncodingUTF8);
lang_codes[1] = CFSTR("en");
CFArrayRef lang_arr = CFArrayCreate(kCFAllocatorDefault, (const void **)lang_codes, lengthof(lang_codes), &kCFTypeArrayCallBacks);
CFAutoRelease<CFDictionaryRef> lang_attribs(CFDictionaryCreate(kCFAllocatorDefault, const_cast<const void **>(reinterpret_cast<const void * const *>(&kCTFontLanguagesAttribute)), (const void **)&lang_arr, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
CFAutoRelease<CTFontDescriptorRef> lang_desc(CTFontDescriptorCreateWithAttributes(lang_attribs.get()));
CFRelease(lang_arr);
CFRelease(lang_codes[0]);
/* Get array of all font descriptors for the wanted language. */
CFAutoRelease<CFSetRef> mandatory_attribs(CFSetCreate(kCFAllocatorDefault, const_cast<const void **>(reinterpret_cast<const void * const *>(&kCTFontLanguagesAttribute)), 1, &kCFTypeSetCallBacks));
CFAutoRelease<CFArrayRef> descs(CTFontDescriptorCreateMatchingFontDescriptors(lang_desc.get(), mandatory_attribs.get()));
bool result = false;
for (CFIndex i = 0; descs.get() != nullptr && i < CFArrayGetCount(descs.get()); i++) {
CTFontDescriptorRef font = (CTFontDescriptorRef)CFArrayGetValueAtIndex(descs.get(), i);
/* Get font traits. */
CFAutoRelease<CFDictionaryRef> traits((CFDictionaryRef)CTFontDescriptorCopyAttribute(font, kCTFontTraitsAttribute));
CTFontSymbolicTraits symbolic_traits;
CFNumberGetValue((CFNumberRef)CFDictionaryGetValue(traits.get(), kCTFontSymbolicTrait), kCFNumberIntType, &symbolic_traits);
/* Skip symbol fonts and vertical fonts. */
if ((symbolic_traits & kCTFontClassMaskTrait) == (CTFontStylisticClass)kCTFontSymbolicClass || (symbolic_traits & kCTFontVerticalTrait)) continue;
/* Skip bold fonts (especially Arial Bold, which looks worse than regular Arial). */
if (symbolic_traits & kCTFontBoldTrait) continue;
/* Select monospaced fonts if asked for. */
if (((symbolic_traits & kCTFontMonoSpaceTrait) == kCTFontMonoSpaceTrait) != callback->Monospace()) continue;
/* Get font name. */
char name[128];
CFAutoRelease<CFStringRef> font_name((CFStringRef)CTFontDescriptorCopyAttribute(font, kCTFontDisplayNameAttribute));
CFStringGetCString(font_name.get(), name, lengthof(name), kCFStringEncodingUTF8);
/* There are some special fonts starting with an '.' and the last
* resort font that aren't usable. Skip them. */
if (name[0] == '.' || strncmp(name, "LastResort", 10) == 0) continue;
/* Save result. */
callback->SetFontNames(settings, name);
if (!callback->FindMissingGlyphs()) {
DEBUG(freetype, 2, "CT-Font for %s: %s", language_isocode, name);
result = true;
break;
}
}
if (!result) {
/* For some OS versions, the font 'Arial Unicode MS' does not report all languages it
* supports. If we didn't find any other font, just try it, maybe we get lucky. */
callback->SetFontNames(settings, "Arial Unicode MS");
result = !callback->FindMissingGlyphs();
}
callback->FindMissingGlyphs();
return result;
}
#elif defined(WITH_FONTCONFIG) /* end ifdef __APPLE__ */
#include <fontconfig/fontconfig.h>
#include "safeguards.h"
/* ========================================================================================
* FontConfig (unix) support
* ======================================================================================== */
FT_Error GetFontByFaceName(const char *font_name, FT_Face *face)
{
FT_Error err = FT_Err_Cannot_Open_Resource;
if (!FcInit()) {
ShowInfoF("Unable to load font configuration");
} else {
FcPattern *match;
FcPattern *pat;
FcFontSet *fs;
FcResult result;
char *font_style;
char *font_family;
/* Split & strip the font's style */
font_family = stredup(font_name);
font_style = strchr(font_family, ',');
if (font_style != nullptr) {
font_style[0] = '\0';
font_style++;
while (*font_style == ' ' || *font_style == '\t') font_style++;
}
/* Resolve the name and populate the information structure */
pat = FcNameParse((FcChar8*)font_family);
if (font_style != nullptr) FcPatternAddString(pat, FC_STYLE, (FcChar8*)font_style);
FcConfigSubstitute(0, pat, FcMatchPattern);
FcDefaultSubstitute(pat);
fs = FcFontSetCreate();
match = FcFontMatch(0, pat, &result);
if (fs != nullptr && match != nullptr) {
int i;
FcChar8 *family;
FcChar8 *style;
FcChar8 *file;
FcFontSetAdd(fs, match);
for (i = 0; err != FT_Err_Ok && i < fs->nfont; i++) {
/* Try the new filename */
if (FcPatternGetString(fs->fonts[i], FC_FILE, 0, &file) == FcResultMatch &&
FcPatternGetString(fs->fonts[i], FC_FAMILY, 0, &family) == FcResultMatch &&
FcPatternGetString(fs->fonts[i], FC_STYLE, 0, &style) == FcResultMatch) {
/* The correct style? */
if (font_style != nullptr && strcasecmp(font_style, (char*)style) != 0) continue;
/* Font config takes the best shot, which, if the family name is spelled
* wrongly a 'random' font, so check whether the family name is the
* same as the supplied name */
if (strcasecmp(font_family, (char*)family) == 0) {
err = FT_New_Face(_library, (char *)file, 0, face);
}
}
}
}
free(font_family);
FcPatternDestroy(pat);
FcFontSetDestroy(fs);
FcFini();
}
return err;
}
bool SetFallbackFont(FreeTypeSettings *settings, const char *language_isocode, int winlangid, MissingGlyphSearcher *callback)
{
if (!FcInit()) return false;
bool ret = false;
/* Fontconfig doesn't handle full language isocodes, only the part
* before the _ of e.g. en_GB is used, so "remove" everything after
* the _. */
char lang[16];
seprintf(lang, lastof(lang), ":lang=%s", language_isocode);
char *split = strchr(lang, '_');
if (split != nullptr) *split = '\0';
/* First create a pattern to match the wanted language. */
FcPattern *pat = FcNameParse((FcChar8*)lang);
/* We only want to know the filename. */
FcObjectSet *os = FcObjectSetBuild(FC_FILE, FC_SPACING, FC_SLANT, FC_WEIGHT, nullptr);
/* Get the list of filenames matching the wanted language. */
FcFontSet *fs = FcFontList(nullptr, pat, os);
/* We don't need these anymore. */
FcObjectSetDestroy(os);
FcPatternDestroy(pat);
if (fs != nullptr) {
int best_weight = -1;
const char *best_font = nullptr;
for (int i = 0; i < fs->nfont; i++) {
FcPattern *font = fs->fonts[i];
FcChar8 *file = nullptr;
FcResult res = FcPatternGetString(font, FC_FILE, 0, &file);
if (res != FcResultMatch || file == nullptr) {
continue;
}
/* Get a font with the right spacing .*/
int value = 0;
FcPatternGetInteger(font, FC_SPACING, 0, &value);
if (callback->Monospace() != (value == FC_MONO) && value != FC_DUAL) continue;
/* Do not use those that explicitly say they're slanted. */
FcPatternGetInteger(font, FC_SLANT, 0, &value);
if (value != 0) continue;
/* We want the fatter font as they look better at small sizes. */
FcPatternGetInteger(font, FC_WEIGHT, 0, &value);
if (value <= best_weight) continue;
callback->SetFontNames(settings, (const char*)file);
bool missing = callback->FindMissingGlyphs();
DEBUG(freetype, 1, "Font \"%s\" misses%s glyphs", file, missing ? "" : " no");
if (!missing) {
best_weight = value;
best_font = (const char *)file;
}
}
if (best_font != nullptr) {
ret = true;
callback->SetFontNames(settings, best_font);
InitFreeType(callback->Monospace());
}
/* Clean up the list of filenames. */
FcFontSetDestroy(fs);
}
FcFini();
return ret;
}
#else /* without WITH_FONTCONFIG */
FT_Error GetFontByFaceName(const char *font_name, FT_Face *face) {return FT_Err_Cannot_Open_Resource;}
bool SetFallbackFont(FreeTypeSettings *settings, const char *language_isocode, int winlangid, MissingGlyphSearcher *callback) { return false; }
#endif /* WITH_FONTCONFIG */
#endif /* WITH_FREETYPE */

View File

@@ -27,7 +27,6 @@ FT_Error GetFontByFaceName(const char *font_name, FT_Face *face);
#endif /* WITH_FREETYPE */
#if defined(WITH_FREETYPE) || defined(_WIN32)
/**
* We would like to have a fallback font as the current one
* doesn't contain all characters we need.
@@ -38,8 +37,6 @@ FT_Error GetFontByFaceName(const char *font_name, FT_Face *face);
* @param callback The function to call to check for missing glyphs.
* @return true if a font has been set, false otherwise.
*/
bool SetFallbackFont(FreeTypeSettings *settings, const char *language_isocode, int winlangid, class MissingGlyphSearcher *callback);
#endif /* defined(WITH_FREETYPE) || defined(WIN32)*/
bool SetFallbackFont(struct FreeTypeSettings *settings, const char *language_isocode, int winlangid, class MissingGlyphSearcher *callback);
#endif

View File

@@ -151,6 +151,10 @@ namespace {
/* Total duration covered by collected points */
TimingMeasurement total = 0;
/* We have nothing to compare the first point against */
point--;
if (point < 0) point = NUM_FRAMERATE_POINTS - 1;
while (point != last_point) {
/* Only record valid data points, but pretend the gaps in measurements aren't there */
if (this->durations[point] != INVALID_DURATION) {
@@ -185,7 +189,7 @@ namespace {
PerformanceData(1), // PFE_ACC_GL_AIRCRAFT
PerformanceData(1), // PFE_GL_LANDSCAPE
PerformanceData(1), // PFE_GL_LINKGRAPH
PerformanceData(GL_RATE), // PFE_DRAWING
PerformanceData(1000.0 / 30), // PFE_DRAWING
PerformanceData(1), // PFE_ACC_DRAWWORLD
PerformanceData(60.0), // PFE_VIDEO
PerformanceData(1000.0 * 8192 / 44100), // PFE_SOUND
@@ -464,7 +468,7 @@ struct FramerateWindow : Window {
this->speed_gameloop.SetRate(gl_rate / _pf_data[PFE_GAMELOOP].expected_rate, 1.0);
if (this->small) return; // in small mode, this is everything needed
this->rate_drawing.SetRate(_pf_data[PFE_DRAWING].GetRate(), _pf_data[PFE_DRAWING].expected_rate);
this->rate_drawing.SetRate(_pf_data[PFE_DRAWING].GetRate(), _settings_client.gui.refresh_rate);
int new_active = 0;
for (PerformanceElement e = PFE_FIRST; e < PFE_MAX; e++) {

View File

@@ -27,6 +27,8 @@
#include "saveload/saveload.h"
#include "progress.h"
#include "error.h"
#include "newgrf_townname.h"
#include "townname_type.h"
#include "widgets/genworld_widget.h"
@@ -80,11 +82,11 @@ static const NWidgetPart _nested_generate_landscape_widgets[] = {
NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_MAPSIZE, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_LAND_GENERATOR, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_TOWNS, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_TERRAIN_TYPE, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_VARIETY, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_QUANTITY_OF_SEA_LAKES, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_TREE_PLACER, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_TOWNS, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_INDUSTRIES, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_BORDER_TYPE, STR_NULL), SetFill(1, 1),
EndContainer(),
/* Widgets at the right of the labels. */
@@ -96,11 +98,11 @@ static const NWidgetPart _nested_generate_landscape_widgets[] = {
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_Y_PULLDOWN), SetDataTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 0),
EndContainer(),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_LANDSCAPE_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWN_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TERRAIN_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_VARIETY_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_WATER_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TREE_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWN_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_INDUSTRY_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_BORDERS_RANDOM), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
EndContainer(),
EndContainer(),
@@ -110,9 +112,9 @@ static const NWidgetPart _nested_generate_landscape_widgets[] = {
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_MAX_HEIGHTLEVEL, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SNOW_LINE_HEIGHT, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DATE, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_INDUSTRIES, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SMOOTHNESS, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_QUANTITY_OF_RIVERS, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_GAME_OPTIONS_TOWN_NAMES_FRAME, STR_NULL), SetFill(1, 1),
EndContainer(),
NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0),
/* Max. heightlevel. */
@@ -133,9 +135,9 @@ static const NWidgetPart _nested_generate_landscape_widgets[] = {
NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_START_DATE_TEXT), SetDataTip(STR_BLACK_DATE_LONG, STR_NULL), SetFill(1, 0),
NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_START_DATE_UP), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD), SetFill(0, 1),
EndContainer(),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_INDUSTRY_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_SMOOTHNESS_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_RIVER_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWNNAME_DROPDOWN), SetDataTip(STR_BLACK_STRING, STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP), SetFill(1, 0),
EndContainer(),
EndContainer(),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREEN, WID_GL_GENERATE_BUTTON), SetMinimalSize(84, 0), SetDataTip(STR_MAPGEN_GENERATE, STR_NULL), SetFill(1, 1),
@@ -197,18 +199,19 @@ static const NWidgetPart _nested_heightmap_load_widgets[] = {
/* Labels at the left side. */
NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_NAME, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_SIZE_LABEL, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_MAPSIZE, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_ROTATION, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_TOWNS, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_INDUSTRIES, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_QUANTITY_OF_RIVERS, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_TREE_PLACER, STR_NULL), SetFill(1, 1),
EndContainer(),
/* Widgets at the right of the labels. */
NWidget(NWID_VERTICAL), SetPIP(0, 4, 0),
NWidget(WWT_EMPTY, COLOUR_ORANGE, WID_GL_HEIGHTMAP_NAME_TEXT), SetFill(1, 0),
NWidget(NWID_HORIZONTAL), SetPIP(0, 5, 0),
NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0),
NWidget(WWT_TEXT, COLOUR_ORANGE, WID_GL_HEIGHTMAP_SIZE_TEXT), SetDataTip(STR_MAPGEN_HEIGHTMAP_SIZE, STR_NULL), SetFill(1, 0),
/* Mapsize X * Y. */
NWidget(NWID_HORIZONTAL), SetPIP(0, 4, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_X_PULLDOWN), SetDataTip(STR_JUST_INT, STR_NULL), SetFill(1, 0),
@@ -219,33 +222,32 @@ static const NWidgetPart _nested_heightmap_load_widgets[] = {
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWN_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_INDUSTRY_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_RIVER_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TREE_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
EndContainer(),
NWidget(NWID_VERTICAL), SetPIP(0, 4, 0),
NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0),
NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_SIZE_LABEL, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SNOW_LINE_HEIGHT, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_MAX_HEIGHTLEVEL, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SNOW_LINE_HEIGHT, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DATE, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_GAME_OPTIONS_TOWN_NAMES_FRAME, STR_NULL), SetFill(1, 1),
EndContainer(),
NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0),
NWidget(WWT_TEXT, COLOUR_ORANGE, WID_GL_HEIGHTMAP_SIZE_TEXT), SetDataTip(STR_MAPGEN_HEIGHTMAP_SIZE, STR_NULL), SetFill(1, 0),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_SNOW_LEVEL_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_MAPGEN_SNOW_LINE_DOWN), SetFill(0, 1),
NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_SNOW_LEVEL_TEXT), SetDataTip(STR_BLACK_INT, STR_NULL), SetFill(1, 0),
NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_SNOW_LEVEL_UP), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_SNOW_LINE_UP), SetFill(0, 1),
EndContainer(),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_MAX_HEIGHTLEVEL_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_MAPGEN_MAX_HEIGHTLEVEL_DOWN), SetFill(0, 1),
NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_MAX_HEIGHTLEVEL_TEXT), SetDataTip(STR_BLACK_INT, STR_NULL), SetFill(1, 0),
NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_MAX_HEIGHTLEVEL_UP), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_MAX_HEIGHTLEVEL_UP), SetFill(0, 1),
EndContainer(),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_SNOW_LEVEL_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_MAPGEN_SNOW_LINE_DOWN), SetFill(0, 1),
NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_SNOW_LEVEL_TEXT), SetDataTip(STR_BLACK_INT, STR_NULL), SetFill(1, 0),
NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_SNOW_LEVEL_UP), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_SNOW_LINE_UP), SetFill(0, 1),
EndContainer(),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_START_DATE_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD), SetFill(0, 1),
NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_START_DATE_TEXT), SetDataTip(STR_BLACK_DATE_LONG, STR_NULL), SetFill(1, 0),
NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_START_DATE_UP), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD), SetFill(0, 1),
EndContainer(),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWNNAME_DROPDOWN), SetDataTip(STR_BLACK_STRING, STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP), SetFill(1, 0),
EndContainer(),
EndContainer(),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREEN, WID_GL_GENERATE_BUTTON), SetMinimalSize(84, 0), SetDataTip(STR_MAPGEN_GENERATE, STR_NULL), SetFill(1, 1),
@@ -293,11 +295,38 @@ static DropDownList BuildMapsizeDropDown()
return list;
}
static DropDownList BuildTownNameDropDown()
{
DropDownList list;
/* Add and sort newgrf townnames generators */
const auto &grf_names = GetGRFTownNameList();
for (uint i = 0; i < grf_names.size(); i++) {
list.emplace_back(new DropDownListStringItem(grf_names[i], BUILTIN_TOWNNAME_GENERATOR_COUNT + i, false));
}
std::sort(list.begin(), list.end(), DropDownListStringItem::NatSortFunc);
size_t newgrf_size = list.size();
/* Insert newgrf_names at the top of the list */
if (newgrf_size > 0) {
list.emplace_back(new DropDownListItem(-1, false)); // separator line
newgrf_size++;
}
/* Add and sort original townnames generators */
for (uint i = 0; i < BUILTIN_TOWNNAME_GENERATOR_COUNT; i++) {
list.emplace_back(new DropDownListStringItem(STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH + i, i, false));
}
std::sort(list.begin() + newgrf_size, list.end(), DropDownListStringItem::NatSortFunc);
return list;
}
static const StringID _elevations[] = {STR_TERRAIN_TYPE_VERY_FLAT, STR_TERRAIN_TYPE_FLAT, STR_TERRAIN_TYPE_HILLY, STR_TERRAIN_TYPE_MOUNTAINOUS, STR_TERRAIN_TYPE_ALPINIST, INVALID_STRING_ID};
static const StringID _sea_lakes[] = {STR_SEA_LEVEL_VERY_LOW, STR_SEA_LEVEL_LOW, STR_SEA_LEVEL_MEDIUM, STR_SEA_LEVEL_HIGH, STR_SEA_LEVEL_CUSTOM, INVALID_STRING_ID};
static const StringID _rivers[] = {STR_RIVERS_NONE, STR_RIVERS_FEW, STR_RIVERS_MODERATE, STR_RIVERS_LOT, INVALID_STRING_ID};
static const StringID _smoothness[] = {STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH, STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH, STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH, STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH, INVALID_STRING_ID};
static const StringID _tree_placer[] = {STR_CONFIG_SETTING_TREE_PLACER_NONE, STR_CONFIG_SETTING_TREE_PLACER_ORIGINAL, STR_CONFIG_SETTING_TREE_PLACER_IMPROVED, INVALID_STRING_ID};
static const StringID _rotation[] = {STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE, STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE, INVALID_STRING_ID};
static const StringID _landscape[] = {STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL, STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS, INVALID_STRING_ID};
static const StringID _num_towns[] = {STR_NUM_VERY_LOW, STR_NUM_LOW, STR_NUM_NORMAL, STR_NUM_HIGH, STR_NUM_CUSTOM, INVALID_STRING_ID};
@@ -321,10 +350,9 @@ struct GenerateLandscapeWindow : public Window {
this->mode = (GenerateLandscapeWindowMode)this->window_number;
/* Disable town, industry and trees in SE */
/* Disable town and industry in SE */
this->SetWidgetDisabledState(WID_GL_TOWN_PULLDOWN, _game_mode == GM_EDITOR);
this->SetWidgetDisabledState(WID_GL_INDUSTRY_PULLDOWN, _game_mode == GM_EDITOR);
this->SetWidgetDisabledState(WID_GL_TREE_PULLDOWN, _game_mode == GM_EDITOR);
this->OnInvalidateData();
}
@@ -350,9 +378,17 @@ struct GenerateLandscapeWindow : public Window {
}
break;
case WID_GL_TOWNNAME_DROPDOWN: {
uint gen = _settings_newgame.game_creation.town_name;
StringID name = gen < BUILTIN_TOWNNAME_GENERATOR_COUNT ?
STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH + gen :
GetGRFTownNameName(gen - BUILTIN_TOWNNAME_GENERATOR_COUNT);
SetDParam(0, name);
break;
}
case WID_GL_INDUSTRY_PULLDOWN: SetDParam(0, _game_mode == GM_EDITOR ? STR_CONFIG_SETTING_OFF : _num_inds[_settings_newgame.difficulty.industry_density]); break;
case WID_GL_LANDSCAPE_PULLDOWN: SetDParam(0, _landscape[_settings_newgame.game_creation.land_generator]); break;
case WID_GL_TREE_PULLDOWN: SetDParam(0, _tree_placer[_settings_newgame.game_creation.tree_placer]); break;
case WID_GL_TERRAIN_PULLDOWN: SetDParam(0, _elevations[_settings_newgame.difficulty.terrain_type]); break;
case WID_GL_WATER_PULLDOWN:
@@ -477,7 +513,6 @@ struct GenerateLandscapeWindow : public Window {
case WID_GL_INDUSTRY_PULLDOWN: strs = _num_inds; break;
case WID_GL_LANDSCAPE_PULLDOWN: strs = _landscape; break;
case WID_GL_TREE_PULLDOWN: strs = _tree_placer; break;
case WID_GL_TERRAIN_PULLDOWN: strs = _elevations; break;
case WID_GL_WATER_PULLDOWN:
strs = _sea_lakes;
@@ -548,6 +583,10 @@ struct GenerateLandscapeWindow : public Window {
ShowDropDownMenu(this, _num_towns, _settings_newgame.difficulty.number_towns, WID_GL_TOWN_PULLDOWN, 0, 0);
break;
case WID_GL_TOWNNAME_DROPDOWN: // Townname generator
ShowDropDownList(this, BuildTownNameDropDown(), _settings_newgame.game_creation.town_name, WID_GL_TOWNNAME_DROPDOWN);
break;
case WID_GL_INDUSTRY_PULLDOWN: // Number of industries
ShowDropDownMenu(this, _num_inds, _settings_newgame.difficulty.industry_density, WID_GL_INDUSTRY_PULLDOWN, 0, 0);
break;
@@ -634,10 +673,6 @@ struct GenerateLandscapeWindow : public Window {
ShowQueryString(STR_JUST_INT, STR_MAPGEN_SNOW_LINE_QUERY_CAPT, 4, this, CS_NUMERAL, QSF_ENABLE_DEFAULT);
break;
case WID_GL_TREE_PULLDOWN: // Tree placer
ShowDropDownMenu(this, _tree_placer, _settings_newgame.game_creation.tree_placer, WID_GL_TREE_PULLDOWN, 0, 0);
break;
case WID_GL_LANDSCAPE_PULLDOWN: // Landscape generator
ShowDropDownMenu(this, _landscape, _settings_newgame.game_creation.land_generator, WID_GL_LANDSCAPE_PULLDOWN, 0, 0);
break;
@@ -717,7 +752,6 @@ struct GenerateLandscapeWindow : public Window {
switch (widget) {
case WID_GL_MAPSIZE_X_PULLDOWN: _settings_newgame.game_creation.map_x = index; break;
case WID_GL_MAPSIZE_Y_PULLDOWN: _settings_newgame.game_creation.map_y = index; break;
case WID_GL_TREE_PULLDOWN: _settings_newgame.game_creation.tree_placer = index; break;
case WID_GL_RIVER_PULLDOWN: _settings_newgame.game_creation.amount_of_rivers = index; break;
case WID_GL_SMOOTHNESS_PULLDOWN: _settings_newgame.game_creation.tgen_smoothness = index; break;
case WID_GL_VARIETY_PULLDOWN: _settings_newgame.game_creation.variety = index; break;
@@ -740,6 +774,13 @@ struct GenerateLandscapeWindow : public Window {
_settings_newgame.difficulty.number_towns = index;
break;
case WID_GL_TOWNNAME_DROPDOWN: // Town names
if (_game_mode == GM_MENU || Town::GetNumItems() == 0) {
_settings_newgame.game_creation.town_name = index;
SetWindowDirty(WC_GAME_OPTIONS, WN_GAME_OPTIONS_GAME_OPTIONS);
}
break;
case WID_GL_INDUSTRY_PULLDOWN: _settings_newgame.difficulty.industry_density = index; break;
case WID_GL_TERRAIN_PULLDOWN: _settings_newgame.difficulty.terrain_type = index; break;
@@ -1147,7 +1188,7 @@ struct GenWorldStatus {
StringID cls;
uint current;
uint total;
int timer;
std::chrono::steady_clock::time_point next_update;
};
static GenWorldStatus _gws;
@@ -1249,11 +1290,11 @@ struct GenerateProgressWindow : public Window {
*/
void PrepareGenerateWorldProgress()
{
_gws.cls = STR_GENERATION_WORLD_GENERATION;
_gws.cls = STR_GENERATION_WORLD_GENERATION;
_gws.current = 0;
_gws.total = 0;
_gws.total = 0;
_gws.percent = 0;
_gws.timer = 0; // Forces to paint the progress window immediately
_gws.next_update = std::chrono::steady_clock::now();
}
/**
@@ -1288,7 +1329,8 @@ static void _SetGeneratingWorldProgress(GenWorldProgress cls, uint progress, uin
}
/* Don't update the screen too often. So update it once in every once in a while... */
if (!_network_dedicated && _gws.timer != 0 && _realtime_tick - _gws.timer < MODAL_PROGRESS_REDRAW_TIMEOUT) return;
if (!_network_dedicated && std::chrono::steady_clock::now() < _gws.next_update) return;
_gws.next_update = std::chrono::steady_clock::now() + std::chrono::milliseconds(MODAL_PROGRESS_REDRAW_TIMEOUT);
/* Percentage is about the number of completed tasks, so 'current - 1' */
_gws.percent = percent_table[cls] + (percent_table[cls + 1] - percent_table[cls]) * (_gws.current == 0 ? 0 : _gws.current - 1) / _gws.total;
@@ -1323,8 +1365,6 @@ static void _SetGeneratingWorldProgress(GenWorldProgress cls, uint progress, uin
_modal_progress_paint_mutex.lock();
_modal_progress_work_mutex.lock();
_modal_progress_paint_mutex.unlock();
_gws.timer = _realtime_tick;
}
/**

View File

@@ -34,7 +34,7 @@ byte _support8bpp;
CursorVars _cursor;
bool _ctrl_pressed; ///< Is Ctrl pressed?
bool _shift_pressed; ///< Is Shift pressed?
byte _fast_forward;
uint16 _game_speed = 100; ///< Current game-speed; 100 is 1x, 0 is infinite.
bool _left_button_down; ///< Is left mouse button pressed?
bool _left_button_clicked; ///< Is left mouse button clicked?
bool _right_button_down; ///< Is right mouse button pressed?
@@ -59,6 +59,10 @@ static ReusableBuffer<uint8> _cursor_backup;
ZoomLevel _gui_zoom; ///< GUI Zoom level
ZoomLevel _font_zoom; ///< Font Zoom level
int8 _gui_zoom_cfg; ///< GUI zoom level in config.
int8 _font_zoom_cfg; ///< Font zoom level in config.
/**
* The rect for repaint.
*
@@ -1344,6 +1348,9 @@ void ScreenSizeChanged()
void UndrawMouseCursor()
{
/* Don't undraw mouse cursor if it is handled by the video driver. */
if (VideoDriver::GetInstance()->UseSystemCursor()) return;
/* Don't undraw the mouse cursor if the screen is not ready */
if (_screen.dst_ptr == nullptr) return;
@@ -1357,6 +1364,9 @@ void UndrawMouseCursor()
void DrawMouseCursor()
{
/* Don't draw mouse cursor if it is handled by the video driver. */
if (VideoDriver::GetInstance()->UseSystemCursor()) return;
/* Don't draw the mouse cursor if the screen is not ready */
if (_screen.dst_ptr == nullptr) return;
@@ -1466,9 +1476,8 @@ void DrawDirtyBlocks()
_modal_progress_paint_mutex.unlock();
_modal_progress_work_mutex.unlock();
/* Wait a while and update _realtime_tick so we are given the rights */
/* Wait a while and hope the modal gives us a bit of time to draw the GUI. */
if (!IsFirstModalProgressLoop()) CSleep(MODAL_PROGRESS_REDRAW_TIMEOUT);
_realtime_tick += MODAL_PROGRESS_REDRAW_TIMEOUT;
/* Modal progress thread may need blitter access while we are waiting for it. */
VideoDriver::GetInstance()->ReleaseBlitterLock();
@@ -1876,3 +1885,32 @@ void SortResolutions()
{
std::sort(_resolutions.begin(), _resolutions.end());
}
/**
* Resolve GUI zoom level, if auto-suggestion is requested.
*/
void UpdateGUIZoom()
{
/* Determine real GUI zoom to use. */
if (_gui_zoom_cfg == ZOOM_LVL_CFG_AUTO) {
_gui_zoom = static_cast<ZoomLevel>(Clamp(VideoDriver::GetInstance()->GetSuggestedUIZoom(), _settings_client.gui.zoom_min, _settings_client.gui.zoom_max));
} else {
_gui_zoom = static_cast<ZoomLevel>(_gui_zoom_cfg);
}
/* Determine real font zoom to use. */
if (_font_zoom_cfg == ZOOM_LVL_CFG_AUTO) {
_font_zoom = static_cast<ZoomLevel>(VideoDriver::GetInstance()->GetSuggestedUIZoom());
} else {
_font_zoom = static_cast<ZoomLevel>(_font_zoom_cfg);
}
}
void ChangeGameSpeed(bool enable_fast_forward)
{
if (enable_fast_forward) {
_game_speed = _settings_client.gui.fast_forward_speed_limit;
} else {
_game_speed = 100;
}
}

View File

@@ -54,7 +54,7 @@ extern byte _support8bpp;
extern CursorVars _cursor;
extern bool _ctrl_pressed; ///< Is Ctrl pressed?
extern bool _shift_pressed; ///< Is Shift pressed?
extern byte _fast_forward;
extern uint16 _game_speed;
extern bool _left_button_down;
extern bool _left_button_clicked;
@@ -73,10 +73,12 @@ void HandleTextInput(const char *str, bool marked = false, const char *caret = n
void HandleCtrlChanged();
void HandleMouseEvents();
void UpdateWindows();
void ChangeGameSpeed(bool enable_fast_forward);
void DrawMouseCursor();
void ScreenSizeChanged();
void GameSizeChanged();
void UpdateGUIZoom();
void UndrawMouseCursor();
/** Size of the buffer used for drawing strings. */

View File

@@ -263,11 +263,13 @@ static bool SwitchNewGRFBlitter()
* between multiple 32bpp blitters, which perform differently with 8bpp sprites.
*/
uint depth_wanted_by_base = BaseGraphics::GetUsedSet()->blitter == BLT_32BPP ? 32 : 8;
uint depth_wanted_by_grf = _support8bpp == S8BPP_NONE ? 32 : 8;
uint depth_wanted_by_grf = _support8bpp != S8BPP_NONE ? 8 : 32;
for (GRFConfig *c = _grfconfig; c != nullptr; c = c->next) {
if (c->status == GCS_DISABLED || c->status == GCS_NOT_FOUND || HasBit(c->flags, GCF_INIT_ONLY)) continue;
if (c->palette & GRFP_BLT_32BPP) depth_wanted_by_grf = 32;
}
/* We need a 32bpp blitter for font anti-alias. */
if (HasAntialiasedFonts()) depth_wanted_by_grf = 32;
/* Search the best blitter. */
static const struct {
@@ -275,13 +277,14 @@ static bool SwitchNewGRFBlitter()
uint animation; ///< 0: no support, 1: do support, 2: both
uint min_base_depth, max_base_depth, min_grf_depth, max_grf_depth;
} replacement_blitters[] = {
{ "8bpp-optimized", 2, 8, 8, 8, 8 },
{ "40bpp-anim", 2, 8, 32, 8, 32 },
#ifdef WITH_SSE
{ "32bpp-sse4", 0, 32, 32, 8, 32 },
{ "32bpp-ssse3", 0, 32, 32, 8, 32 },
{ "32bpp-sse2", 0, 32, 32, 8, 32 },
{ "32bpp-sse4-anim", 1, 32, 32, 8, 32 },
#endif
{ "8bpp-optimized", 2, 8, 8, 8, 8 },
{ "32bpp-optimized", 0, 8, 32, 8, 32 },
#ifdef WITH_SSE
{ "32bpp-sse2-anim", 1, 8, 32, 8, 32 },
@@ -341,6 +344,7 @@ void GfxLoadSprites()
DEBUG(sprite, 2, "Loading sprite set %d", _settings_game.game_creation.landscape);
SwitchNewGRFBlitter();
VideoDriver::GetInstance()->ClearSystemSprites();
ClearFontCache();
GfxInitSpriteMem();
LoadSpriteTables();

View File

@@ -256,12 +256,16 @@ CommandCost CmdGoalQuestion(TileIndex tile, DoCommandFlag flags, uint32 p1, uint
if (_current_company != OWNER_DEITY) return CMD_ERROR;
if (StrEmpty(text)) return CMD_ERROR;
if (is_client) {
if (NetworkClientInfo::GetByClientID(client) == nullptr) return CMD_ERROR;
/* Only check during pre-flight; the client might have left between
* testing and executing. In that case it is fine to just ignore the
* fact the client is no longer here. */
if (!(flags & DC_EXEC) && _network_server && NetworkClientInfo::GetByClientID(client) == nullptr) return CMD_ERROR;
} else {
if (company != INVALID_COMPANY && !Company::IsValidID(company)) return CMD_ERROR;
}
if (CountBits(button_mask) < 1 || CountBits(button_mask) > 3) return CMD_ERROR;
if (type >= GOAL_QUESTION_TYPE_COUNT) return CMD_ERROR;
uint min_buttons = (type == GQT_QUESTION ? 1 : 0);
if (CountBits(button_mask) < min_buttons || CountBits(button_mask) > 3) return CMD_ERROR;
if (type >= GQT_END) return CMD_ERROR;
if (flags & DC_EXEC) {
if (is_client) {

View File

@@ -375,10 +375,16 @@ struct GoalQuestionWindow : public Window {
if (n == 3) break;
}
this->buttons = n;
assert(this->buttons > 0 && this->buttons < 4);
assert(this->buttons < 4);
this->CreateNestedTree();
this->GetWidget<NWidgetStacked>(WID_GQ_BUTTONS)->SetDisplayedPlane(this->buttons - 1);
if (this->buttons == 0) {
this->GetWidget<NWidgetStacked>(WID_GQ_BUTTONS)->SetDisplayedPlane(SZSP_HORIZONTAL);
this->GetWidget<NWidgetStacked>(WID_GQ_BUTTON_SPACER)->SetDisplayedPlane(SZSP_HORIZONTAL);
} else {
this->GetWidget<NWidgetStacked>(WID_GQ_BUTTONS)->SetDisplayedPlane(this->buttons - 1);
this->GetWidget<NWidgetStacked>(WID_GQ_BUTTON_SPACER)->SetDisplayedPlane(0);
}
this->FinishInitNested(window_number);
}
@@ -463,7 +469,9 @@ static const NWidgetPart _nested_goal_question_widgets_question[] = {
NWidget(WWT_PUSHTXTBTN, COLOUR_LIGHT_BLUE, WID_GQ_BUTTON_3), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
EndContainer(),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 8),
NWidget(NWID_SELECTION, INVALID_COLOUR, WID_GQ_BUTTON_SPACER),
NWidget(NWID_SPACER), SetMinimalSize(0, 8),
EndContainer(),
EndContainer(),
};
@@ -488,7 +496,9 @@ static const NWidgetPart _nested_goal_question_widgets_info[] = {
NWidget(WWT_PUSHTXTBTN, COLOUR_LIGHT_BLUE, WID_GQ_BUTTON_3), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
EndContainer(),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 8),
NWidget(NWID_SELECTION, INVALID_COLOUR, WID_GQ_BUTTON_SPACER),
NWidget(NWID_SPACER), SetMinimalSize(0, 8),
EndContainer(),
EndContainer(),
};
@@ -513,7 +523,9 @@ static const NWidgetPart _nested_goal_question_widgets_warning[] = {
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GQ_BUTTON_3), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
EndContainer(),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 8),
NWidget(NWID_SELECTION, INVALID_COLOUR, WID_GQ_BUTTON_SPACER),
NWidget(NWID_SPACER), SetMinimalSize(0, 8),
EndContainer(),
EndContainer(),
};
@@ -538,7 +550,9 @@ static const NWidgetPart _nested_goal_question_widgets_error[] = {
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_GQ_BUTTON_3), SetDataTip(STR_BLACK_STRING, STR_NULL), SetFill(1, 0),
EndContainer(),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 8),
NWidget(NWID_SELECTION, INVALID_COLOUR, WID_GQ_BUTTON_SPACER),
NWidget(NWID_SPACER), SetMinimalSize(0, 8),
EndContainer(),
EndContainer(),
};
@@ -578,6 +592,6 @@ static WindowDesc _goal_question_list_desc[] = {
*/
void ShowGoalQuestion(uint16 id, byte type, uint32 button_mask, const char *question)
{
assert(type < GOAL_QUESTION_TYPE_COUNT);
assert(type < GQT_END);
new GoalQuestionWindow(&_goal_question_list_desc[type], id, type == 3 ? TC_WHITE : TC_BLACK, button_mask, question);
}

View File

@@ -13,7 +13,14 @@
#include "core/enum_type.hpp"
static const uint32 GOAL_QUESTION_BUTTON_COUNT = 18; ///< Amount of buttons available.
static const byte GOAL_QUESTION_TYPE_COUNT = 4; ///< Amount of question types.
enum GoalQuestionType : byte {
GQT_QUESTION = 0,
GQT_INFORMATION = 1,
GQT_WARNING = 2,
GQT_ERROR = 3,
GQT_END = 4,
};
/** Types of goal destinations */
enum GoalType : byte {

View File

@@ -165,9 +165,15 @@ struct ValuesInterval {
struct BaseGraphWindow : Window {
protected:
static const int GRAPH_MAX_DATASETS = 64;
static const int GRAPH_AXIS_LINE_COLOUR = PC_BLACK;
static const int GRAPH_BASE_COLOUR = GREY_SCALE(2);
static const int GRAPH_GRID_COLOUR = GREY_SCALE(3);
static const int GRAPH_AXIS_LINE_COLOUR = GREY_SCALE(1);
static const int GRAPH_ZERO_LINE_COLOUR = GREY_SCALE(8);
static const int GRAPH_YEAR_LINE_COLOUR = GREY_SCALE(5);
static const int GRAPH_NUM_MONTHS = 24; ///< Number of months displayed in the graph.
static const TextColour GRAPH_AXIS_LABEL_COLOUR = TC_BLACK; ///< colour of the graph axis label.
static const int MIN_GRAPH_NUM_LINES_Y = 9; ///< Minimal number of horizontal lines to draw.
static const int MIN_GRID_PIXEL_SIZE = 20; ///< Minimum distance between graph lines.
@@ -175,7 +181,6 @@ protected:
byte num_dataset;
byte num_on_x_axis;
byte num_vert_lines;
static const TextColour graph_axis_label_colour = TC_BLACK; ///< colour of the graph axis label.
/* The starting month and year that values are plotted against. If month is
* 0xFF, use x_values_start and x_values_increment below instead. */
@@ -292,12 +297,10 @@ protected:
static_assert(GRAPH_MAX_DATASETS >= (int)NUM_CARGO && GRAPH_MAX_DATASETS >= (int)MAX_COMPANIES);
assert(this->num_vert_lines > 0);
byte grid_colour = _colour_gradient[COLOUR_GREY][4];
/* Rect r will be adjusted to contain just the graph, with labels being
* placed outside the area. */
r.top += 5 + GetCharacterHeight(FS_SMALL) / 2;
r.bottom -= (this->month == 0xFF ? 1 : 3) * GetCharacterHeight(FS_SMALL) + 4;
r.bottom -= (this->month == 0xFF ? 1 : 2) * GetCharacterHeight(FS_SMALL) + 4;
r.left += 9;
r.right -= 5;
@@ -326,7 +329,7 @@ protected:
x_axis_offset = (int)((r.bottom - r.top) * (double)interval.highest / (double)interval_size);
/* Draw the background of the graph itself. */
GfxFillRect(r.left, r.top, r.right, r.bottom, GREY_SCALE(2));
GfxFillRect(r.left, r.top, r.right, r.bottom, GRAPH_BASE_COLOUR);
/* Draw the vertical grid lines. */
@@ -334,7 +337,7 @@ protected:
x = r.left + x_sep;
for (int i = 0; i < this->num_vert_lines; i++) {
GfxFillRect(x, r.top, x, r.bottom, grid_colour);
GfxFillRect(x, r.top, x, r.bottom, GRAPH_GRID_COLOUR);
x += x_sep;
}
@@ -343,7 +346,7 @@ protected:
for (int i = 0; i < (num_hori_lines + 1); i++) {
GfxFillRect(r.left - 3, y, r.left - 1, y, GRAPH_AXIS_LINE_COLOUR);
GfxFillRect(r.left, y, r.right, y, grid_colour);
GfxFillRect(r.left, y, r.right, y, GRAPH_GRID_COLOUR);
y -= y_sep;
}
@@ -352,7 +355,7 @@ protected:
/* Draw the x axis. */
y = x_axis_offset + r.top;
GfxFillRect(r.left, y, r.right, y, GRAPH_AXIS_LINE_COLOUR);
GfxFillRect(r.left, y, r.right, y, GRAPH_ZERO_LINE_COLOUR);
/* Find the largest value that will be drawn. */
if (this->num_on_x_axis == 0) return;
@@ -369,13 +372,13 @@ protected:
for (int i = 0; i < (num_hori_lines + 1); i++) {
SetDParam(0, this->format_str_y_axis);
SetDParam(1, y_label);
DrawString(r.left - label_width - 4, r.left - 4, y, STR_GRAPH_Y_LABEL, graph_axis_label_colour, SA_RIGHT);
DrawString(r.left - label_width - 4, r.left - 4, y, STR_GRAPH_Y_LABEL, GRAPH_AXIS_LABEL_COLOUR, SA_RIGHT);
y_label -= y_label_separation;
y += y_sep;
}
/* draw strings on the x axis */
/* Draw x-axis labels and markings for graphs based on financial quarters and years. */
if (this->month != 0xFF) {
x = r.left;
y = r.bottom + 2;
@@ -383,26 +386,28 @@ protected:
Year year = this->year;
for (int i = 0; i < this->num_on_x_axis; i++) {
SetDParam(0, month + STR_MONTH_ABBREV_JAN);
SetDParam(1, month + STR_MONTH_ABBREV_JAN + 2);
SetDParam(2, year);
DrawStringMultiLine(x, x + x_sep, y, this->height, month == 0 ? STR_GRAPH_X_LABEL_MONTH_YEAR : STR_GRAPH_X_LABEL_MONTH, graph_axis_label_colour);
SetDParam(1, year);
DrawStringMultiLine(x, x + x_sep, y, this->height, month == 0 ? STR_GRAPH_X_LABEL_MONTH_YEAR : STR_GRAPH_X_LABEL_MONTH, GRAPH_AXIS_LABEL_COLOUR, SA_LEFT);
month += 3;
if (month >= 12) {
month = 0;
year++;
/* Draw a lighter grid line between years. Top and bottom adjustments ensure we don't draw over top and bottom horizontal grid lines. */
GfxFillRect(x + x_sep, r.top + 1, x + x_sep, r.bottom - 1, GRAPH_YEAR_LINE_COLOUR);
}
x += x_sep;
}
} else {
/* Draw the label under the data point rather than on the grid line. */
/* Draw x-axis labels for graphs not based on quarterly performance (cargo payment rates). */
x = r.left;
y = r.bottom + 2;
uint16 label = this->x_values_start;
for (int i = 0; i < this->num_on_x_axis; i++) {
SetDParam(0, label);
DrawString(x + 1, x + x_sep - 1, y, STR_GRAPH_Y_LABEL_NUMBER, graph_axis_label_colour, SA_HOR_CENTER);
DrawString(x + 1, x + x_sep - 1, y, STR_GRAPH_Y_LABEL_NUMBER, GRAPH_AXIS_LABEL_COLOUR, SA_HOR_CENTER);
label += this->x_values_increment;
x += x_sep;
@@ -492,13 +497,13 @@ public:
uint x_label_width = 0;
/* Draw x-axis labels and markings for graphs based on financial quarters and years. */
if (this->month != 0xFF) {
byte month = this->month;
Year year = this->year;
for (int i = 0; i < this->num_on_x_axis; i++) {
SetDParam(0, month + STR_MONTH_ABBREV_JAN);
SetDParam(1, month + STR_MONTH_ABBREV_JAN + 2);
SetDParam(2, year);
SetDParam(1, year);
x_label_width = std::max(x_label_width, GetStringBoundingBox(month == 0 ? STR_GRAPH_X_LABEL_MONTH_YEAR : STR_GRAPH_X_LABEL_MONTH).width);
month += 3;
@@ -508,7 +513,7 @@ public:
}
}
} else {
/* Draw the label under the data point rather than on the grid line. */
/* Draw x-axis labels for graphs not based on quarterly performance (cargo payment rates). */
SetDParamMaxValue(0, this->x_values_start + this->num_on_x_axis * this->x_values_increment, 0, FS_SMALL);
x_label_width = GetStringBoundingBox(STR_GRAPH_Y_LABEL_NUMBER).width;
}

View File

@@ -741,9 +741,9 @@ public:
assert(vehgroup.NumVehicles() > 0);
v = vehgroup.vehicles_begin[0];
/*
No VehicleClicked(v) support for now, because don't want
to enable any contextual actions except perhaps clicking/ctrl-clicking to clone orders.
*/
* No VehicleClicked(v) support for now, because don't want
* to enable any contextual actions except perhaps clicking/ctrl-clicking to clone orders.
*/
break;
}

View File

@@ -113,7 +113,7 @@ struct EndGameWindow : EndGameHighScoreBaseWindow {
this->window_number = SP_MULTIPLAYER;
this->rank = SaveHighScoreValueNetwork();
} else {
/* in single player _local company is always valid */
/* in singleplayer mode _local company is always valid */
const Company *c = Company::Get(_local_company);
this->window_number = SP_CUSTOM;
this->rank = SaveHighScoreValue(c);
@@ -183,7 +183,7 @@ struct HighScoreWindow : EndGameHighScoreBaseWindow {
this->SetupHighScoreEndWindow();
Point pt = this->GetTopLeft(ScaleGUITrad(640), ScaleGUITrad(480));
SetDParam(0, ORIGINAL_END_YEAR);
SetDParam(0, _settings_game.game_creation.ending_year);
DrawStringMultiLine(pt.x + ScaleGUITrad(70), pt.x + ScaleGUITrad(570), pt.y, pt.y + ScaleGUITrad(140), !_networking ? STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED : STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME, TC_FROMSTRING, SA_CENTER);
/* Draw Highscore peepz */

View File

@@ -569,8 +569,8 @@ static void AnimateTile_Industry(TileIndex tile)
if (_settings_client.sound.ambient) {
switch (m & 7) {
case 2: SndPlayTileFx(SND_2D_RIP_2, tile); break;
case 6: SndPlayTileFx(SND_29_RIP, tile); break;
case 2: SndPlayTileFx(SND_2D_SUGAR_MINE_1, tile); break;
case 6: SndPlayTileFx(SND_29_SUGAR_MINE_2, tile); break;
}
}
@@ -589,7 +589,7 @@ static void AnimateTile_Industry(TileIndex tile)
byte m = GetAnimationFrame(tile);
if (_industry_anim_offs_toffee[m] == 0xFF && _settings_client.sound.ambient) {
SndPlayTileFx(SND_30_CARTOON_SOUND, tile);
SndPlayTileFx(SND_30_TOFFEE_QUARRY, tile);
}
if (++m >= 70) {
@@ -635,9 +635,9 @@ static void AnimateTile_Industry(TileIndex tile)
byte m = GetAnimationFrame(tile) + 1;
switch (m) {
case 1: if (_settings_client.sound.ambient) SndPlayTileFx(SND_2C_MACHINERY, tile); break;
case 23: if (_settings_client.sound.ambient) SndPlayTileFx(SND_2B_COMEDY_HIT, tile); break;
case 28: if (_settings_client.sound.ambient) SndPlayTileFx(SND_2A_EXTRACT_AND_POP, tile); break;
case 1: if (_settings_client.sound.ambient) SndPlayTileFx(SND_2C_TOY_FACTORY_1, tile); break;
case 23: if (_settings_client.sound.ambient) SndPlayTileFx(SND_2B_TOY_FACTORY_2, tile); break;
case 28: if (_settings_client.sound.ambient) SndPlayTileFx(SND_2A_TOY_FACTORY_3, tile); break;
default:
if (m >= 50) {
int n = GetIndustryAnimationLoop(tile) + 1;
@@ -700,7 +700,7 @@ static void AnimateTile_Industry(TileIndex tile)
byte m = GetAnimationFrame(tile);
if (!(m & 0x40)) {
SetAnimationFrame(tile, m | 0x40);
if (_settings_client.sound.ambient) SndPlayTileFx(SND_0B_MINING_MACHINERY, tile);
if (_settings_client.sound.ambient) SndPlayTileFx(SND_0B_MINE, tile);
}
if (state & 7) return;
} else {
@@ -801,7 +801,7 @@ static void TileLoopIndustry_BubbleGenerator(TileIndex tile)
{ 49, 59, 60, 65 },
};
if (_settings_client.sound.ambient) SndPlayTileFx(SND_2E_EXTRACT_AND_POP, tile);
if (_settings_client.sound.ambient) SndPlayTileFx(SND_2E_BUBBLE_GENERATOR, tile);
int dir = Random() & 3;
@@ -899,7 +899,7 @@ static void TileLoop_Industry(TileIndex tile)
case GFX_POWERPLANT_SPARKS:
if (Chance16(1, 3)) {
if (_settings_client.sound.ambient) SndPlayTileFx(SND_0C_ELECTRIC_SPARK, tile);
if (_settings_client.sound.ambient) SndPlayTileFx(SND_0C_POWER_STATION, tile);
AddAnimatedTile(tile);
}
break;
@@ -1098,7 +1098,7 @@ static bool SearchLumberMillTrees(TileIndex tile, void *user_data)
_industry_sound_ctr = 1;
_industry_sound_tile = tile;
if (_settings_client.sound.ambient) SndPlayTileFx(SND_38_CHAINSAW, tile);
if (_settings_client.sound.ambient) SndPlayTileFx(SND_38_LUMBER_MILL_1, tile);
DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
@@ -1200,10 +1200,10 @@ void OnTick_Industry()
_industry_sound_ctr++;
if (_industry_sound_ctr == 75) {
if (_settings_client.sound.ambient) SndPlayTileFx(SND_37_BALLOON_SQUEAK, _industry_sound_tile);
if (_settings_client.sound.ambient) SndPlayTileFx(SND_37_LUMBER_MILL_2, _industry_sound_tile);
} else if (_industry_sound_ctr == 160) {
_industry_sound_ctr = 0;
if (_settings_client.sound.ambient) SndPlayTileFx(SND_36_CARTOON_CRASH, _industry_sound_tile);
if (_settings_client.sound.ambient) SndPlayTileFx(SND_36_LUMBER_MILL_3, _industry_sound_tile);
}
}

View File

@@ -37,6 +37,7 @@
#include "smallmap_gui.h"
#include "widgets/dropdown_type.h"
#include "widgets/industry_widget.h"
#include "clear_map.h"
#include "table/strings.h"
@@ -244,6 +245,14 @@ static const NWidgetPart _nested_build_industry_widgets[] = {
NWidget(WWT_DEFSIZEBOX, COLOUR_DARK_GREEN),
NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
EndContainer(),
NWidget(NWID_SELECTION, COLOUR_DARK_GREEN, WID_DPI_SCENARIO_EDITOR_PANE),
NWidget(NWID_VERTICAL),
NWidget(WWT_TEXTBTN, COLOUR_DARK_GREEN, WID_DPI_CREATE_RANDOM_INDUSTRIES_WIDGET), SetMinimalSize(0, 12), SetFill(1, 0), SetResize(1, 0),
SetDataTip(STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES, STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP),
NWidget(WWT_TEXTBTN, COLOUR_DARK_GREEN, WID_DPI_REMOVE_ALL_INDUSTRIES_WIDGET), SetMinimalSize(0, 12), SetFill(1, 0), SetResize(1, 0),
SetDataTip(STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES, STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_TOOLTIP),
EndContainer(),
EndContainer(),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_MATRIX, COLOUR_DARK_GREEN, WID_DPI_MATRIX_WIDGET), SetMatrixDataTip(1, 0, STR_FUND_INDUSTRY_SELECTION_TOOLTIP), SetFill(1, 0), SetResize(1, 1), SetScrollbar(WID_DPI_SCROLLBAR),
NWidget(NWID_VSCROLLBAR, COLOUR_DARK_GREEN, WID_DPI_SCROLLBAR),
@@ -289,11 +298,6 @@ class BuildIndustryWindow : public Window {
this->enabled[i] = false;
}
if (_game_mode == GM_EDITOR) { // give room for the Many Random "button"
this->index[this->count] = INVALID_INDUSTRYTYPE;
this->enabled[this->count] = true;
this->count++;
}
/* Fill the arrays with industries.
* The tests performed after the enabled allow to load the industries
* In the same way they are inserted by grf (if any)
@@ -392,6 +396,13 @@ public:
this->FinishInitNested(0);
this->SetButtons();
/* Show scenario editor tools in editor. */
if (_game_mode != GM_EDITOR) {
auto *se_tools = this->GetWidget<NWidgetStacked>(WID_DPI_SCENARIO_EDITOR_PANE);
se_tools->SetDisplayedPlane(SZSP_HORIZONTAL);
this->ReInit();
}
}
void OnInit() override
@@ -578,9 +589,53 @@ public:
}
}
static void AskManyRandomIndustriesCallback(Window *w, bool confirmed)
{
if (!confirmed) return;
if (Town::GetNumItems() == 0) {
ShowErrorMessage(STR_ERROR_CAN_T_GENERATE_INDUSTRIES, STR_ERROR_MUST_FOUND_TOWN_FIRST, WL_INFO);
} else {
extern void GenerateIndustries();
_generating_world = true;
GenerateIndustries();
_generating_world = false;
}
}
static void AskRemoveAllIndustriesCallback(Window *w, bool confirmed)
{
if (!confirmed) return;
for (Industry *industry : Industry::Iterate()) delete industry;
/* Clear farmland. */
for (TileIndex tile = 0; tile < MapSize(); tile++) {
if (IsTileType(tile, MP_CLEAR) && GetRawClearGround(tile) == CLEAR_FIELDS) {
MakeClear(tile, CLEAR_GRASS, 3);
}
}
MarkWholeScreenDirty();
}
void OnClick(Point pt, int widget, int click_count) override
{
switch (widget) {
case WID_DPI_CREATE_RANDOM_INDUSTRIES_WIDGET: {
assert(_game_mode == GM_EDITOR);
this->HandleButtonClick(WID_DPI_CREATE_RANDOM_INDUSTRIES_WIDGET);
ShowQuery(STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_CAPTION, STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_QUERY, nullptr, AskManyRandomIndustriesCallback);
break;
}
case WID_DPI_REMOVE_ALL_INDUSTRIES_WIDGET: {
assert(_game_mode == GM_EDITOR);
this->HandleButtonClick(WID_DPI_REMOVE_ALL_INDUSTRIES_WIDGET);
ShowQuery(STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION, STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY, nullptr, AskRemoveAllIndustriesCallback);
break;
}
case WID_DPI_MATRIX_WIDGET: {
int y = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_DPI_MATRIX_WIDGET);
if (y < this->count) { // Is it within the boundaries of available data?
@@ -610,22 +665,13 @@ public:
break;
case WID_DPI_FUND_WIDGET: {
if (this->selected_type == INVALID_INDUSTRYTYPE) {
this->HandleButtonClick(WID_DPI_FUND_WIDGET);
if (Town::GetNumItems() == 0) {
ShowErrorMessage(STR_ERROR_CAN_T_GENERATE_INDUSTRIES, STR_ERROR_MUST_FOUND_TOWN_FIRST, WL_INFO);
if (this->selected_type != INVALID_INDUSTRYTYPE) {
if (_game_mode != GM_EDITOR && _settings_game.construction.raw_industry_construction == 2 && GetIndustrySpec(this->selected_type)->IsRawIndustry()) {
DoCommandP(0, this->selected_type, InteractiveRandom(), CMD_BUILD_INDUSTRY | CMD_MSG(STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY));
this->HandleButtonClick(WID_DPI_FUND_WIDGET);
} else {
extern void GenerateIndustries();
_generating_world = true;
GenerateIndustries();
_generating_world = false;
HandlePlacePushButton(this, WID_DPI_FUND_WIDGET, SPR_CURSOR_INDUSTRY, HT_RECT);
}
} else if (_game_mode != GM_EDITOR && _settings_game.construction.raw_industry_construction == 2 && GetIndustrySpec(this->selected_type)->IsRawIndustry()) {
DoCommandP(0, this->selected_type, InteractiveRandom(), CMD_BUILD_INDUSTRY | CMD_MSG(STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY));
this->HandleButtonClick(WID_DPI_FUND_WIDGET);
} else {
HandlePlacePushButton(this, WID_DPI_FUND_WIDGET, SPR_CURSOR_INDUSTRY, HT_RECT);
}
break;
}

View File

@@ -92,17 +92,15 @@ bool IniFile::SaveToDisk(const std::string &filename)
#endif
#if defined(_WIN32)
/* _tcsncpy = strcpy is TCHAR is char, but isn't when TCHAR is wchar. */
# undef strncpy
/* Allocate space for one more \0 character. */
TCHAR tfilename[MAX_PATH + 1], tfile_new[MAX_PATH + 1];
_tcsncpy(tfilename, OTTD2FS(filename.c_str()), MAX_PATH);
_tcsncpy(tfile_new, OTTD2FS(file_new.c_str()), MAX_PATH);
wchar_t tfilename[MAX_PATH + 1], tfile_new[MAX_PATH + 1];
wcsncpy(tfilename, OTTD2FS(filename.c_str()), MAX_PATH);
wcsncpy(tfile_new, OTTD2FS(file_new.c_str()), MAX_PATH);
/* SHFileOperation wants a double '\0' terminated string. */
tfilename[MAX_PATH - 1] = '\0';
tfile_new[MAX_PATH - 1] = '\0';
tfilename[_tcslen(tfilename) + 1] = '\0';
tfile_new[_tcslen(tfile_new) + 1] = '\0';
tfilename[wcslen(tfilename) + 1] = '\0';
tfile_new[wcslen(tfile_new) + 1] = '\0';
/* Rename file without any user confirmation. */
SHFILEOPSTRUCT shfopt;

View File

@@ -1,4 +1,9 @@
set(MASTER_LANG_FILE
${CMAKE_CURRENT_SOURCE_DIR}/english.txt
)
set(LANG_SOURCE_FILES
${MASTER_LANG_FILE}
${CMAKE_CURRENT_SOURCE_DIR}/afrikaans.txt
${CMAKE_CURRENT_SOURCE_DIR}/arabic_egypt.txt
${CMAKE_CURRENT_SOURCE_DIR}/basque.txt
@@ -10,7 +15,6 @@ set(LANG_SOURCE_FILES
${CMAKE_CURRENT_SOURCE_DIR}/czech.txt
${CMAKE_CURRENT_SOURCE_DIR}/danish.txt
${CMAKE_CURRENT_SOURCE_DIR}/dutch.txt
${CMAKE_CURRENT_SOURCE_DIR}/english.txt
${CMAKE_CURRENT_SOURCE_DIR}/english_AU.txt
${CMAKE_CURRENT_SOURCE_DIR}/english_US.txt
${CMAKE_CURRENT_SOURCE_DIR}/esperanto.txt
@@ -75,7 +79,7 @@ foreach(LANG_SOURCE_FILE IN LISTS LANG_SOURCE_FILES)
-s ${CMAKE_CURRENT_SOURCE_DIR}
-d ${LANG_BINARY_DIR}
${LANG_SOURCE_FILE}
DEPENDS strgen
DEPENDS strgen ${MASTER_LANG_FILE}
MAIN_DEPENDENCY ${LANG_SOURCE_FILE}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Compiling language ${LANG_SOURCE_FILE_NAME_WE}"
@@ -103,7 +107,7 @@ add_custom_command_timestamp(OUTPUT ${TABLE_BINARY_DIR}/strings.h
COMMAND strgen
-s ${CMAKE_CURRENT_SOURCE_DIR}
-d ${TABLE_BINARY_DIR}
DEPENDS strgen ${LANG_SOURCE_FILES}
DEPENDS strgen ${MASTER_LANG_FILE}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Generating table/strings.h"
)

View File

@@ -569,8 +569,8 @@ STR_MONTH_DEC :Desember
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}Sleutel
STR_GRAPH_KEY_TOOLTIP :{BLACK}Wys sleutel van grafieke
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{}{NUM}
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM}
STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING}
STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA}
@@ -938,8 +938,6 @@ STR_GAME_OPTIONS_CURRENCY_CNY :Chinese Renminb
STR_GAME_OPTIONS_CURRENCY_HKD :Hong Kong Dollar (HKD)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Pad voertuie
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Kies kant van pad waarop voertuie ry
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Bestuur aan linkerkant
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Bestuur aan regterkant
@@ -2793,7 +2791,6 @@ STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Sneeu ly
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Beweeg die sneeu lyn een op
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Beweeg die sneeu lyn een af
STR_MAPGEN_LAND_GENERATOR :{BLACK}Land genereerder:
STR_MAPGEN_TREE_PLACER :{BLACK}Boom algoritme:
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terrein tipe:
STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Seevlak:
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Riviere:

View File

@@ -538,8 +538,8 @@ STR_MONTH_DEC :ديسمبر
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}مفتاح
STR_GRAPH_KEY_TOOLTIP :{BLACK}اظهار مفتاح الرسم البياني
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{}{NUM}
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM}
STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING}
STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA}
@@ -885,8 +885,6 @@ STR_GAME_OPTIONS_CURRENCY_ZAR :راند جنو
STR_GAME_OPTIONS_CURRENCY_CUSTOM :مخصص ...
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}العربات البرية
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}اختار الجانب الذي تسير فيه المركبات
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :القيادة على اليسار
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :القيادة على اليمين
@@ -2362,7 +2360,6 @@ STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK} ارت
STR_MAPGEN_SNOW_LINE_UP :{BLACK}ارفع خط الثلج مستوى واحد
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}خفض خط الثلج مستوى واحد
STR_MAPGEN_LAND_GENERATOR :{BLACK}مولد الخريطة:
STR_MAPGEN_TREE_PLACER :{BLACK} لوغاريثم الشجر:
STR_MAPGEN_TERRAIN_TYPE :{BLACK} نوع التضاريس
STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}مستوى البحر
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}انهار:

View File

@@ -555,8 +555,8 @@ STR_MONTH_DEC :Abendua
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}Giltza
STR_GRAPH_KEY_TOOLTIP :{BLACK}Erakutsi giltza grafikoetan
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{}{NUM}
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM}
STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING}
STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA}
@@ -909,8 +909,6 @@ STR_GAME_OPTIONS_CURRENCY_GEL :Lari Georgiarra
STR_GAME_OPTIONS_CURRENCY_IRR :Rial Iraniarra (IRR)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Errepideko garraioak
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Aukeratu ibilgailuen gidatzeko norabidea
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Ezkerretik gidatu
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Eskuinetik gidatu
@@ -2612,7 +2610,6 @@ STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Elur gar
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Igo puntu batean elur garaiera
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Jeitsi puntu batean elur garaiera
STR_MAPGEN_LAND_GENERATOR :{BLACK}Paisaia sortzailea:
STR_MAPGEN_TREE_PLACER :{BLACK}Zuhaitz algoritmoa:
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Lur mota:
STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Itsaso kopurua:
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Errekak:

View File

@@ -878,8 +878,8 @@ STR_MONTH_DEC :Сьнежан
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}Леґенда
STR_GRAPH_KEY_TOOLTIP :{BLACK}Паказаць леґенду да ґрафікаў
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{}{NUM}
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM}
STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING}
STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA}
@@ -1247,8 +1247,6 @@ STR_GAME_OPTIONS_CURRENCY_HKD :Ганконс
STR_GAME_OPTIONS_CURRENCY_INR :Індыйская рупія (INR)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Дарожны рух
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Па якім баку дарогі рухаецца аўтатранспарт
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Езьдзіць леваруч
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Езьдзіць праваруч
@@ -3114,7 +3112,6 @@ STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Вышы
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Падняць сьнегавую лінію
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Апусьціць сьнегавую лінію
STR_MAPGEN_LAND_GENERATOR :{BLACK}Ґенэратар ляндшафту:
STR_MAPGEN_TREE_PLACER :{BLACK}Альґарытм дрэваў:
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Тып ляндшафту:
STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Колькасьць азёраў/мораў:
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Колькасьць рэк:

View File

@@ -569,8 +569,8 @@ STR_MONTH_DEC :Dezembro
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}Chave
STR_GRAPH_KEY_TOOLTIP :{BLACK}Exibir chave aos gráficos
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{} {NUM}
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM}
STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING}
STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA}
@@ -740,6 +740,7 @@ STR_SMALLMAP_LEGENDA_DOCK :{TINY_FONT}{BLA
STR_SMALLMAP_LEGENDA_ROUGH_LAND :{TINY_FONT}{BLACK}Terreno Irregular
STR_SMALLMAP_LEGENDA_GRASS_LAND :{TINY_FONT}{BLACK}Gramado
STR_SMALLMAP_LEGENDA_BARE_LAND :{TINY_FONT}{BLACK}Terreno Descoberto
STR_SMALLMAP_LEGENDA_RAINFOREST :{TINY_FONT}{BLACK}Floresta Tropical
STR_SMALLMAP_LEGENDA_FIELDS :{TINY_FONT}{BLACK}Campos
STR_SMALLMAP_LEGENDA_TREES :{TINY_FONT}{BLACK}Árvores
STR_SMALLMAP_LEGENDA_ROCKS :{TINY_FONT}{BLACK}Rochas
@@ -939,8 +940,6 @@ STR_GAME_OPTIONS_CURRENCY_HKD :Dólar de Hong
STR_GAME_OPTIONS_CURRENCY_INR :Rúpia Indiana (INR)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Automóveis
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Selecionar lado da rodovia para automóveis dirigirem
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Dirigem na esquerda
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Dirigem na direita
@@ -1607,6 +1606,7 @@ STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Linear
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Posicionamento de árvores: {STRING}
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Controla o nascimento aleatório de árvores durante o jogo. Isso pode afetar indústrias que dependem do crescimento de árvores, como serrarias
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD :Crescer sem espalhar {RED}(afeta serrarias)
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_GROWTH_NO_SPREAD :Não crescer, não espalhar {RED}(afeta serrarias)
STR_CONFIG_SETTING_TOOLBAR_POS :Posição da barra de ferramentas principal: {STRING}
STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Posição horizontal da barra de ferramentas principal no topo da tela
@@ -1673,6 +1673,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Sempre que uma
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Imperial (mph)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Métrico (km/h)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS :Unidades de jogo (quadr./dia)
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Unidade de potência veicular: {STRING}
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Sempre que a potência de um veículo for exibida na interface de usuário, será exibida na unidade selecionada
@@ -1805,12 +1806,13 @@ STR_INTRO_TRANSLATION :{BLACK}Faltam {
# Quit window
STR_QUIT_CAPTION :{WHITE}Sair
STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD :{YELLOW}Tem a certeza que quer sair do OpenTTD?
STR_QUIT_YES :{BLACK}Sim
STR_QUIT_NO :{BLACK}Não
# Abandon game
STR_ABANDON_GAME_CAPTION :{WHITE}Abandonar jogo
STR_ABANDON_GAME_QUERY :{YELLOW}Você tem certeza que deseja abandonar este jogo?
STR_ABANDON_GAME_QUERY :{YELLOW}Você tem certeza que quer abandonar este jogo?
STR_ABANDON_SCENARIO_QUERY :{YELLOW}Você tem certeza que quer abandonar este cenário?
# Cheat window
@@ -1968,6 +1970,7 @@ STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}Atualiza
STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Atualiza as informações sobre o servidor
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET :{BLACK}Procurar na internet
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN :{BLACK}Buscar na LAN
STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Adicionar servidor
STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Adiciona um servidor à lista que será sempre verificada se existem jogos ocorrendo
STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Iniciar servidor
@@ -2198,6 +2201,7 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :número de joga
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :clientes conectando-se
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :manual
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :{G=m}script do jogo
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :aguardando atualização do gráfico de links
############ End of leave-in-this-order
STR_NETWORK_MESSAGE_CLIENT_LEAVING :saindo
STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} entrou no jogo
@@ -2326,6 +2330,7 @@ STR_JOIN_WAYPOINT_CAPTION :{WHITE}Unir pon
STR_JOIN_WAYPOINT_CREATE_SPLITTED_WAYPOINT :{YELLOW}Construir um ponto de controle separado
# Generic toolbar
STR_TOOLBAR_DISABLED_NO_VEHICLE_AVAILABLE :{BLACK}Desativado pois não há nenhum veículo disponível para essa infraestrutura
# Rail construction toolbar
STR_RAIL_TOOLBAR_RAILROAD_CONSTRUCTION_CAPTION :Construir ferrovias
@@ -2521,6 +2526,10 @@ STR_TREES_RANDOM_TYPE :{BLACK}Árvores
STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Plantar árvores de tipo aleatório, Shift alterna entre construção/preço estimado
STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Plantar Aleatoriamente
STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Planta árvores aleatoriamente pelo terreno
STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Normal
STR_TREES_MODE_FOREST_SM_BUTTON :{BLACK}Bosque
STR_TREES_MODE_FOREST_SM_TOOLTIP :{BLACK}Planta pequenas florestas ao arrastar pelo terreno.
STR_TREES_MODE_FOREST_LG_BUTTON :{BLACK}Floresta
STR_TREES_MODE_FOREST_LG_TOOLTIP :{BLACK}Planta florestas grandes ao arrastar pelo terreno.
# Land generation window (SE)
@@ -2532,10 +2541,10 @@ STR_TERRAFORM_TOOLTIP_DECREASE_SIZE_OF_LAND_AREA :{BLACK}Diminui
STR_TERRAFORM_TOOLTIP_GENERATE_RANDOM_LAND :{BLACK}Gera terreno aleatório
STR_TERRAFORM_SE_NEW_WORLD :{BLACK}Criar novo cenário
STR_TERRAFORM_RESET_LANDSCAPE :{BLACK}Limpar terreno
STR_TERRAFORM_RESET_LANDSCAPE_TOOLTIP :{BLACK}Remover todas as propriedades da companhia do mapa
STR_TERRAFORM_RESET_LANDSCAPE_TOOLTIP :{BLACK}Remove todas as propriedades da empresa do mapa
STR_QUERY_RESET_LANDSCAPE_CAPTION :{WHITE}Limpar Terreno
STR_RESET_LANDSCAPE_CONFIRMATION_TEXT :{WHITE}Tem certeza que deseja remover todas as propriedades da companhia?
STR_RESET_LANDSCAPE_CONFIRMATION_TEXT :{WHITE}Tem certeza que quer remover todas as propriedades da empresa?
# Town generation window (SE)
STR_FOUND_TOWN_CAPTION :{WHITE}Gerar Cidades
@@ -2574,10 +2583,14 @@ STR_FUND_INDUSTRY_CAPTION :{WHITE}Financia
STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}Escolha a indústria apropriada
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :Várias indústrias aleatórias
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}Cobrir o mapa com indústrias colocadas aleatoriamente
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_CAPTION :{WHITE}Criar indústrias aleatórias
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_QUERY :{YELLOW}Você tem certeza que quer criar várias indústrias aleatoriamente?
STR_FUND_INDUSTRY_INDUSTRY_BUILD_COST :{BLACK}Custo: {YELLOW}{CURRENCY_LONG}
STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}Prosperir
STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY :{BLACK}Construir
STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}Fundar
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES :{BLACK}Remover todas as indústrias
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION :{WHITE}Remover todas as indústrias
# Industry cargoes window
STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Cadeia de indústrias para a indústria: {STRING}
@@ -2825,7 +2838,6 @@ STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Linha da
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Aumentar a linha da neve em um ponto
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Diminuir a linha da neve em um ponto
STR_MAPGEN_LAND_GENERATOR :{BLACK}Gerador de terra
STR_MAPGEN_TREE_PLACER :{BLACK}Algorítimo de árvores
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Tipo de terreno
STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Nível do mar:
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rios:
@@ -3068,6 +3080,7 @@ STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Ativa/De
# Sign window
STR_EDIT_SIGN_CAPTION :{WHITE}Editar texto da placa
STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Centraliza janela no local da placa. Ctrl+Clique abre uma nova janela no local da placa
STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Próxima Placa
STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Placa anterior
@@ -3279,7 +3292,7 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Impedir
STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT}
STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visão no local do ponto de caminho. Ctrl+Clique abre uma nova janela no local do ponto de caminho
STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Renomear ponto de controle
STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visão no local da bóia. Ctrl+Clique abre uma nova janela no local da bóia
STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centraliza janela no local da bóia. Ctrl+Clique abre uma nova janela no local da bóia
STR_BUOY_VIEW_CHANGE_BUOY_NAME :{BLACK}Renomear bóia
STR_EDIT_WAYPOINT_NAME :{WHITE}Editar nome do ponto de controle
@@ -3344,6 +3357,7 @@ STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Mover se
STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Reconstruir sede da empresa em outro local por 1% do valor da empresa. Shift+Clique mostra o preço estimado sem reconstruir a sede
STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}Detalhes
STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Ver informações detalhadas de infraestrutura
STR_COMPANY_VIEW_GIVE_MONEY_TOOLTIP :{BLACK}Dá dinheiro a essa empresa
STR_COMPANY_VIEW_NEW_FACE_BUTTON :{BLACK}Novo Rosto
STR_COMPANY_VIEW_NEW_FACE_TOOLTIP :{BLACK}Selecionar novo rosto para o presidente
@@ -3466,7 +3480,7 @@ STR_GROUP_LIVERY_TOOLTIP :{BLACK}Alterar
STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Clique para excluir esse grupo da substituição automática
STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Remover grupo
STR_GROUP_DELETE_QUERY_TEXT :{WHITE}Tem certeza que deseja remover esse grupo e seus descendentes?
STR_GROUP_DELETE_QUERY_TEXT :{WHITE}Tem certeza que quer remover esse grupo e seus descendentes?
STR_GROUP_ADD_SHARED_VEHICLE :Adicionar veículos compartilhados
STR_GROUP_REMOVE_ALL_VEHICLES :Remover todos os veículos
@@ -3531,19 +3545,19 @@ STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Comprar
STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Comprar Aeronave
STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e reequipar veículo
STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e Trocar Veículos
STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e Reequipar Veículo
STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e Repor Navio
STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e reequipar aeronaves
STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Compra o veículo ferroviário selecionado. Shift+Clique mostra preço estimado sem a compra
STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Compra o veículo selecionado. Shift+Clique mostra preço estimado sem a compra
STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Compra o veículo ferroviário selecionado. Shift+Clique mostra preço estimado
STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Compra o veículo selecionado. Shift+Clique mostra preço estimado
STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Compra a embarcação selecionada. Shift+Clique mostra preço estimado sem a compra
STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Compra a aeronave selecionada. Shift+Clique mostra o preço estimado sem a compra
STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Compre e troque o trem destacado. Shift+Click mostra os custos estimados sem comprar
STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Compra e troque o trem destacado. Shift+Click mostra o custo estimado
STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Compre e troque o veículo terrestre destacado. Shift+Clique mostra o custo estimado sem comprá-lo
STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :Compre e reponha o navio em destaque. Shift+Clique mostra o custo estimado sem comprar
STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e repor a aeronave destacada. Shift+Clique mostra o custo estimado sem comprar
STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :Compre e reequipa o navio selecionado. Shift+Clique mostra o custo estimado
STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Compra e reequipa a aeronave selecionada. Shift+Clique mostra o custo estimado
STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Renomear
STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_BUTTON :{BLACK}Renomear
@@ -3629,9 +3643,9 @@ STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Isso ir
STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Isso irá comprar uma cópia de uma aeronave. Clique nesse botão e depois em uma aeronave dentro ou fora do hangar. Ctrl+Clique compartilhará as ordens. Shift+Clique mostra o preço estimado sem a compra
STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Centrar visão no local de um depósito ferroviário. Ctrl+Clique abre uma nova janela no local do depósito de trem
STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Centralizar visualização na localização da garagem. Ctrl+Clique abre uma nova janela de visualização
STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Centrar visão no local do depósito naval. Ctrl+Clique abre uma nova janela no local do depósito naval
STR_DEPOT_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Centrar visão no local do hangar. Ctrl+Clique abre uma nova janela no local do hangar
STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Centraliza a janela na localização da garagem. Ctrl+Clique abre uma nova janela na localização da garagem.
STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Centraliza visão no local do depósito naval. Ctrl+Clique abre uma nova janela no local do depósito naval
STR_DEPOT_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Centraliza a janela no local do hangar. Ctrl+Clique abre uma nova janela no local do hangar
STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TOOLTIP :{BLACK}Obtém uma lista de todos os trens com este depósito em suas ordens
STR_DEPOT_VEHICLE_ORDER_LIST_ROAD_VEHICLE_TOOLTIP :{BLACK}Obtém uma lista de todos os automóveis com esta garagem em suas ordens
@@ -3721,6 +3735,9 @@ STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Faz auto
# Vehicle view
STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE}
STR_VEHICLE_VIEW_ROAD_VEHICLE_CENTER_TOOLTIP :{BLACK}Centraliza a janela na localização do veículo. Clique duplo para seguir o veículo. Ctrl+Clique abre uma nova janela na localização do veículo.
STR_VEHICLE_VIEW_SHIP_CENTER_TOOLTIP :{BLACK}Centraliza a janela na localização do navio. Clique duplo para seguir o navio. Ctrl+Clique para abrir uma nova janela na localização do navio.
STR_VEHICLE_VIEW_AIRCRAFT_CENTER_TOOLTIP :{BLACK}Centraliza a janela na localização da aeronave. Clique duplo para seguir a aeronave. Ctrl+Clique abre uma nova janela na localização da aeronave.
STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Enviar trem para o depósito
STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}Enviar veículo para a garagem. CTRL+clique irá apenas reparar
@@ -4333,7 +4350,7 @@ STR_ERROR_INDUSTRY_TOO_CLOSE :{WHITE}... muit
STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}... deve construir uma cidade antes
STR_ERROR_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}... só é permitido uma por cidade
STR_ERROR_CAN_ONLY_BE_BUILT_IN_TOWNS_WITH_POPULATION_OF_1200 :{WHITE}... só pode ser construído em cidades com pelo menos 1200 habitantes
STR_ERROR_CAN_ONLY_BE_BUILT_IN_RAINFOREST :{WHITE}... só pode ser construído em zonas florestais
STR_ERROR_CAN_ONLY_BE_BUILT_IN_RAINFOREST :{WHITE}... só pode ser construído em florestas tropicais
STR_ERROR_CAN_ONLY_BE_BUILT_IN_DESERT :{WHITE}... só pode ser construído em áreas desérticas
STR_ERROR_CAN_ONLY_BE_BUILT_IN_TOWNS :{WHITE}... só se pode ser construído em cidades (substituindo casas)
STR_ERROR_CAN_ONLY_BE_BUILT_NEAR_TOWN_CENTER :{WHITE}... só pode ser construído próximo aos centros de cidades
@@ -4430,6 +4447,7 @@ STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Tipo de depósi
STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} fica grande demais para ser substituído
STR_ERROR_AUTOREPLACE_NOTHING_TO_DO :{WHITE}Regras de autosubstituição/renovação não estão ativadas
STR_ERROR_AUTOREPLACE_MONEY_LIMIT :(limite de dinheiro)
STR_ERROR_AUTOREPLACE_INCOMPATIBLE_REFIT :{WHITE}Novo veículo não pode ser reequipado na ordem {NUM}
# Rail construction errors
STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION :{WHITE}Impossível combinação de linhas

View File

@@ -561,8 +561,8 @@ STR_MONTH_DEC :Декемвр
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}Легенда
STR_GRAPH_KEY_TOOLTIP :{BLACK}Покажи легендата на графиката
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{}{NUM}
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM}
STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING}
STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA}
@@ -917,8 +917,6 @@ STR_GAME_OPTIONS_CURRENCY_NTD :Нов тайв
STR_GAME_OPTIONS_CURRENCY_HKD :Хонгконгски долар (HKD)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Движение по пътищата
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Избор посоката на движение по пътищата
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :ляво
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :дясно
@@ -2674,7 +2672,6 @@ STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Снеж
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Преместване снежната линия нагоре
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Преместване снежната линия надолу
STR_MAPGEN_LAND_GENERATOR :{BLACK}Земегенератор:
STR_MAPGEN_TREE_PLACER :{BLACK}Дърворазсад:
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Тип на терен:
STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Морско ниво:
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Реки:

View File

@@ -577,8 +577,8 @@ STR_MONTH_DEC :Desembre
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}Llegenda
STR_GRAPH_KEY_TOOLTIP :{BLACK}Mostra la llegenda dels gràfics
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{}{NUM}
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM}
STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING}
STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA}
@@ -947,10 +947,9 @@ STR_GAME_OPTIONS_CURRENCY_NTD :Nou dòlar taiw
STR_GAME_OPTIONS_CURRENCY_CNY :Renminbi xinès (CNY)
STR_GAME_OPTIONS_CURRENCY_HKD :Dòlar de Hong Kong (HKD)
STR_GAME_OPTIONS_CURRENCY_INR :Rúpia índia (INR)
STR_GAME_OPTIONS_CURRENCY_IDR :Rupia indonèsia (IDR)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Vehicles de carretera
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Escull el sentit de circulació dels automòbils
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Conducció per l'esquerra
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Conducció per la dreta
@@ -1005,6 +1004,7 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :altres
STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Mida de la interfície
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Escull la mida dels elements de la interfície
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(detecta automàticament)
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Doble
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Quàdruple
@@ -1012,6 +1012,7 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Quàdruple
STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Mida de la lletra
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Seleccioneu la mida de les fonts de la interfície.
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(detecta automàticament)
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Doble
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Quàdruple
@@ -2606,12 +2607,18 @@ STR_FOUND_TOWN_SELECT_LAYOUT_RANDOM :{BLACK}Aleatori
# Fund new industry window
STR_FUND_INDUSTRY_CAPTION :{WHITE}Finança una nova indústria
STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}Escolleix el tipus d'indústria adequada d'aquesta llista
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :Moltes indústries aleatòries
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :{BLACK}Crea indústries aleatòries
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}Omple el mapa amb indústries situades aleatòriament
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_CAPTION :{WHITE}Crea indústries aleatòries
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_QUERY :{YELLOW}Esteu segur que voleu crear moltes indústries aleatòries?
STR_FUND_INDUSTRY_INDUSTRY_BUILD_COST :{BLACK}Cost: {YELLOW}{CURRENCY_LONG}
STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}Prospecciona
STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY :{BLACK}Construeix
STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}Finança
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES :{BLACK}Treu totes les indústries
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_TOOLTIP :{BLACK}Treu totes les indústries que hi ha actualment al mapa.
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION :{WHITE}Treu totes les indústries
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Esteu segur que voleu treure totes les indústries?
# Industry cargoes window
STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Cadena industrial per la indústria {STRING}
@@ -2842,6 +2849,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF:
STR_SAVELOAD_FILTER_TITLE :{BLACK}Cadena de filtre:
STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Sobreescriu fitxer
STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Esteu segur que voleu sobreescriure el fitxer?
STR_SAVELOAD_DIRECTORY :{STRING} (carpeta)
STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (carpeta superior)
STR_SAVELOAD_OSKTITLE :{BLACK}Posa el nom amb què desar la partida actual
@@ -2860,7 +2869,6 @@ STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Alçada
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Mou els estatges amb neu un pas amunt
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Mou els estatges amb neu un pas avall
STR_MAPGEN_LAND_GENERATOR :{BLACK}Generació de terrenys:
STR_MAPGEN_TREE_PLACER :{BLACK}Algoritme d'arbres:
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Tipus de terreny:
STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Nivell de mar:
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Quantitat de rius:

View File

@@ -664,8 +664,8 @@ STR_MONTH_DEC :Prosinac
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}Ključ
STR_GRAPH_KEY_TOOLTIP :{BLACK}Pokaži ključeve na grafikonima
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{}{NUM}
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM}
STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING}
STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA}
@@ -1034,8 +1034,6 @@ STR_GAME_OPTIONS_CURRENCY_HKD :Hongkonški Dol
STR_GAME_OPTIONS_CURRENCY_INR :Indijska Rupija (INR)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Cestovna vozila
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Odaberi na kojoj će strani ceste vozila prometovati
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Vozi na lijevoj strani
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Vozi na desnoj strani
@@ -2916,7 +2914,6 @@ STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Visina l
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Pomakni visinu linije snijega za jedan gore
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Pomakni visinu linije snijega za jedan dolje
STR_MAPGEN_LAND_GENERATOR :{BLACK}Izrađivač zemljišta:
STR_MAPGEN_TREE_PLACER :{BLACK} Algoritam za drveće:
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Vrsta terena:
STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Razina mora:
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rijeke:

View File

@@ -269,6 +269,7 @@ STR_COLOUR_DEFAULT :Výchozí
STR_UNITS_VELOCITY_IMPERIAL :{COMMA}{NBSP}m{P íle íle il}/h
STR_UNITS_VELOCITY_METRIC :{COMMA}{NBSP}km/h
STR_UNITS_VELOCITY_SI :{COMMA}{NBSP}m/s
STR_UNITS_VELOCITY_GAMEUNITS :{DECIMAL}{NBSP}políčka/den
STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp
STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hp
@@ -360,7 +361,7 @@ STR_SORT_BY_PRODUCTION :produkce
STR_SORT_BY_TYPE :typu
STR_SORT_BY_TRANSPORTED :přepravy
STR_SORT_BY_NUMBER :čísla
STR_SORT_BY_PROFIT_LAST_YEAR :hrubého zisku minulý rok
STR_SORT_BY_PROFIT_LAST_YEAR :hrubého zisku loňský rok
STR_SORT_BY_PROFIT_THIS_YEAR :hrubého zisku za tento rok
STR_SORT_BY_AGE :stáří
STR_SORT_BY_RELIABILITY :spolehlivosti
@@ -387,8 +388,15 @@ STR_SORT_BY_CARGO_CAPACITY :přepravní kap
STR_SORT_BY_RANGE :dosah
STR_SORT_BY_POPULATION :Podle populace
STR_SORT_BY_RATING :Hodnocení
STR_SORT_BY_NUM_VEHICLES :Počet vozidel
STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Letošní celkový zisk
STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Celkový letošní zisk
STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Loňský průměrný zisk
STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Průměrný letošní zisk
# Group by options for vehicle list
STR_GROUP_BY_NONE :Neseskupovat
STR_GROUP_BY_SHARED_ORDERS :Sdílené příkazy
# Tooltips for the main toolbar
STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Pauza
@@ -655,8 +663,8 @@ STR_MONTH_DEC.gen :prosince
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}Legenda
STR_GRAPH_KEY_TOOLTIP :{BLACK}Zobrazit legendu ke grafům
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{}{NUM}
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM}
STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING}
STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA}
@@ -826,6 +834,7 @@ STR_SMALLMAP_LEGENDA_DOCK :{TINY_FONT}{BLA
STR_SMALLMAP_LEGENDA_ROUGH_LAND :{TINY_FONT}{BLACK}Hrbolatá zem
STR_SMALLMAP_LEGENDA_GRASS_LAND :{TINY_FONT}{BLACK}Travnatá zem
STR_SMALLMAP_LEGENDA_BARE_LAND :{TINY_FONT}{BLACK}Holá zem
STR_SMALLMAP_LEGENDA_RAINFOREST :{TINY_FONT}{BLACK}Deštný prales
STR_SMALLMAP_LEGENDA_FIELDS :{TINY_FONT}{BLACK}Pole
STR_SMALLMAP_LEGENDA_TREES :{TINY_FONT}{BLACK}Stromy
STR_SMALLMAP_LEGENDA_ROCKS :{TINY_FONT}{BLACK}Kameny
@@ -857,6 +866,7 @@ STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Zobraz v
STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Ukázat poslední zprávu nebo článek
STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - -
STR_STATUSBAR_PAUSED :{YELLOW}* * PAUZA * *
STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * POZASTAVENO (čekám na aktualizaci grafu spojení) * *
STR_STATUSBAR_AUTOSAVE :{RED}Automatické ukládání
STR_STATUSBAR_SAVING_GAME :{RED}* * HRA SE UKLÁDÁ * *
@@ -1023,10 +1033,9 @@ STR_GAME_OPTIONS_CURRENCY_NTD :Nový taiwansk
STR_GAME_OPTIONS_CURRENCY_CNY :Čínský renminbi (CNY)
STR_GAME_OPTIONS_CURRENCY_HKD :Hongkongský dolar (HKD)
STR_GAME_OPTIONS_CURRENCY_INR :Indická rupie (INR)
STR_GAME_OPTIONS_CURRENCY_IDR :Indonéská rupie (IDR)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Silniční vozidla jezdí
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Výběr strany, na které jezdí silnični vozidla
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Vlevo
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Vpravo
@@ -1081,6 +1090,7 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :jiné
STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Velikost rozhraní
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Zvolit velikost prvků uživatelského rozhraní
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(zjistit automaticky)
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normální
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dvojnásobná velikost
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Čtyřnásobná velikost
@@ -1088,6 +1098,7 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Čtyřnásobná
STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Velikost písma
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Zvolit velikost písma
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(zjistit automaticky)
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Běžné
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Dvojnásobná velikost
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Čtyřnásobná velikost
@@ -1527,6 +1538,8 @@ STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Nevypínat po p
STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT :Nechat nástroje pro stavbu mostů, tunelů, atd. po použití otevřené
STR_CONFIG_SETTING_EXPENSES_LAYOUT :Zobrazovat odděleně příjmy a výdaje v přehledu financí: {STRING}
STR_CONFIG_SETTING_EXPENSES_LAYOUT_HELPTEXT :Určuje rozložení okna s firemními výdaji
STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS :Automaticky odstraňovat návěstidla během výstavby železnice: {STRING}
STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS_HELPTEXT :Automaticky odstraňovat návěstidla, pokud překáží během výstavby železnice. Poznámka: Může způsobit kolize vlaků.
STR_CONFIG_SETTING_SOUND_TICKER :Noviny - shrnutí: {STRING}
STR_CONFIG_SETTING_SOUND_TICKER_HELPTEXT :Přehrávat zvuk při zobrazení shrnutí zprávy
@@ -1640,6 +1653,11 @@ STR_CONFIG_SETTING_ENDING_YEAR :Rok vyhodnocen
STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Rok, kdy je ve hře uzavřeno hodnocení společností. Na konci tohoto roku je zaznamenáno skóre společností a je zobrazena tabulka nejlepších společností, ale ve hře je možné pokračovat i dál.{}Pokud je nastaven rok před rokem počátku hry, tabulka s hodnocením nebude zobrazena nikdy.
STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM}
STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Nikdy
STR_CONFIG_SETTING_ECONOMY_TYPE :Druh ekonomiky: {STRING}
STR_CONFIG_SETTING_ECONOMY_TYPE_HELPTEXT :Plynulá ekonomika dělá změny produkce častěji, ale v menších krocích. Zmražená ekonomika zastaví změny v produkci a zavírání průmyslu. Toto nastavení nemusí mít vliv na typy průmyslu vycházející z "NewGRF".
STR_CONFIG_SETTING_ECONOMY_TYPE_ORIGINAL :Původní
STR_CONFIG_SETTING_ECONOMY_TYPE_SMOOTH :Plynulá
STR_CONFIG_SETTING_ECONOMY_TYPE_FROZEN :Zmražená
STR_CONFIG_SETTING_ALLOW_SHARES :Povolit kupování podílu z ostatních společností: {STRING}
STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Pokud je zapnuto, umožní kupovaní akcií ve společnostech. Akcie jsou k dispozici pouze u společností od určitého stáří
STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Minimální stáří společnosti pro obchod s akciemi: {STRING}
@@ -1691,6 +1709,10 @@ STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Lineární
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Umístění stromů ve hře: {STRING}
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Náhodné umisťování stromů během hry. Může ovlivnit průmysl závisející na růstu stromů, například pily.
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD :Růst, ale nerozšiřovat{RED}(rozbije pilu)
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_RAINFOREST :Růst, ale rozšiřovat pouze v deštných pralesech
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_ALL :Růst a rozšiřovat všude
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_GROWTH_NO_SPREAD :Nerůst, nerozšiřovat {RED}(rozbije pilu)
STR_CONFIG_SETTING_TOOLBAR_POS :Umístění hlavní lišty: {STRING}
STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Horizontální pozice hlavního panelu v horní části obrazovky
@@ -1757,6 +1779,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Kdykoliv se ryc
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Imperiální (mph)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metrické (km/h)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS :Herní jednotky (políčko/den)
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Jednotky výkonu vozidla: {STRING}
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Kdykoliv se výkon vozidla zobrazí v uživatelském rozhraní, bude ve zvolených jednotkách
@@ -1889,6 +1912,7 @@ STR_INTRO_TRANSLATION :{BLACK}Tento p
# Quit window
STR_QUIT_CAPTION :{WHITE}Konec
STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD :{YELLOW}Opravdu chceš ukončit OpenTTD?
STR_QUIT_YES :{BLACK}Ano
STR_QUIT_NO :{BLACK}Ne
@@ -1900,6 +1924,7 @@ STR_ABANDON_SCENARIO_QUERY :{YELLOW}Určite
# Cheat window
STR_CHEATS :{WHITE}Cheaty
STR_CHEATS_TOOLTIP :{BLACK}Zaškrtávací políčka ukazují, jestli jsi tento cheat už použil
STR_CHEATS_NOTE :{BLACK}Poznámka: jakékoliv použití těchto nastavení bude zaznamenáno v uložené hře
STR_CHEAT_MONEY :{LTBLUE}Navýšit peníze o {CURRENCY_LONG}
STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Hrát jako společnost: {ORANGE}{COMMA}
STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Magický buldozer (odstraní průmysl a další objekty): {ORANGE}{STRING}
@@ -2051,6 +2076,10 @@ STR_NETWORK_SERVER_LIST_JOIN_GAME :{BLACK}Přidat
STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}Obnovit info
STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Znovu načte informace o serveru
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET :{BLACK}Prohledat internet
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}Hledat veřejné servery v internetu
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN :{BLACK}Prohledat místní siť
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP :{BLACK}Hledat servery v místní síti
STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Přidat server
STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Přidá server do seznamu, ve kterém se budou hledat běžící hry
STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Spustit server
@@ -2276,11 +2305,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_1 :Hra stále poza
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_2 :Hra stále pozastavena ({STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_3 :Hra stále pozastavena ({STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_4 :Hra je stále pozastavena ({STRING}, {STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_5 :Hra je stále pozastavena ({STRING}, {STRING}, {STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED :Hra obnovena ({STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :nedostatek hráčů
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :připojují se klienti
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :ručně
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :herní skript
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :čekám na aktualizaci grafu spojení
############ End of leave-in-this-order
STR_NETWORK_MESSAGE_CLIENT_LEAVING :odpojování
STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} se připojil do hry
@@ -2290,6 +2321,7 @@ STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} se
STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} zakládá novou společnost (č. {2:NUM})
STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} opouští hru ({2:STRING})
STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} si mění jméno na {STRING}
STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} poslal(a) {2:CURRENCY_LONG} společnosti {1:STRING}
STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Server ukončil relaci
STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Server se restartuje...{}Počkejte prosím...
STR_NETWORK_MESSAGE_KICKED :*** {STRING} byl vyhozen. Důvod: ({STRING})
@@ -2409,6 +2441,7 @@ STR_JOIN_WAYPOINT_CAPTION :{WHITE}Spojová
STR_JOIN_WAYPOINT_CREATE_SPLITTED_WAYPOINT :{YELLOW}Postavit samostatné směrování
# Generic toolbar
STR_TOOLBAR_DISABLED_NO_VEHICLE_AVAILABLE :{BLACK}Zakázáno, protože pro tento typ infrastruktury aktuálně nejsou dostupná žádná vozidla
# Rail construction toolbar
STR_RAIL_TOOLBAR_RAILROAD_CONSTRUCTION_CAPTION :Výstavba železnice
@@ -2604,6 +2637,12 @@ STR_TREES_RANDOM_TYPE :{BLACK}Různé
STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Umístit nahodné stromy. Stisknutý Shift pro zobrazení odhadu ceny
STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Náhodné stromy
STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Umístit stromy náhodně po krajině
STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Normální
STR_TREES_MODE_NORMAL_TOOLTIP :{BLACK}Vysadit jednotlivé stromy tažením přes krajinu.
STR_TREES_MODE_FOREST_SM_BUTTON :{BLACK}Háj
STR_TREES_MODE_FOREST_SM_TOOLTIP :{BLACK}Vysadit malé lesy tažením přes krajinu
STR_TREES_MODE_FOREST_LG_BUTTON :{BLACK}Les
STR_TREES_MODE_FOREST_LG_TOOLTIP :{BLACK}Vysadit velké lesy tažením přes krajinu
# Land generation window (SE)
STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Generovat zemi
@@ -2654,12 +2693,18 @@ STR_FOUND_TOWN_SELECT_LAYOUT_RANDOM :{BLACK}Náhodn
# Fund new industry window
STR_FUND_INDUSTRY_CAPTION :{WHITE}Investovat do průmyslu
STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}Vyber si vhodnou továrnu ze seznamu
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :Hodně náhodného průmyslu
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :{BLACK}Vytvořit náhodný průmysl
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}Pokryje krajinu náhodným průmyslem
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_CAPTION :{WHITE}Vytvořit náhodný průmysl
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_QUERY :{YELLOW}Opravdu chceš vytvořit tolik náhodného průmyslu?
STR_FUND_INDUSTRY_INDUSTRY_BUILD_COST :{BLACK}Cena: {YELLOW}{CURRENCY_LONG}
STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}Hledat
STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY :{BLACK}Postavit
STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}Financovat
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES :{BLACK}Odstranit veškerý průmysl
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_TOOLTIP :{BLACK}Odstranit veškerý aktuálně přítomný průmysl
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION :{WHITE}Odstranit veškerý průmysl
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Opravdu chceš odstranit veškerý průmysl?
# Industry cargoes window
STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Průmyslový řetěz pro průmysl {STRING}
@@ -2686,6 +2731,7 @@ STR_INDUSTRY_CARGOES_SELECT_INDUSTRY_TOOLTIP :{BLACK}Vyber pr
# Land area window
STR_LAND_AREA_INFORMATION_CAPTION :{WHITE}Informace o uzemí
STR_LAND_AREA_INFORMATION_LOCATION_TOOLTIP :{BLACK}Vystředit pohled na políčko. Ctrl+Klik otevře nové okno náhledu
STR_LAND_AREA_INFORMATION_COST_TO_CLEAR_N_A :{BLACK}Cena za vyčištění: {LTBLUE}N/A
STR_LAND_AREA_INFORMATION_COST_TO_CLEAR :{BLACK}Cena za vyčištění: {RED}{CURRENCY_LONG}
STR_LAND_AREA_INFORMATION_REVENUE_WHEN_CLEARED :{BLACK}Příjem za odklizení: {LTBLUE}{CURRENCY_LONG}
@@ -2895,6 +2941,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}Grafiky
STR_SAVELOAD_FILTER_TITLE :{BLACK}Filtr:
STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Přepsat soubor
STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Opravdu chcete přepsat existující soubor?
STR_SAVELOAD_DIRECTORY :{STRING} (Adresář)
STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (rodičovský adresář)
STR_SAVELOAD_OSKTITLE :{BLACK}Zadej jméno pro uloženou hru
@@ -2913,7 +2961,6 @@ STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Výška
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Zvýšit sněžnou čáru o jednu úroveň
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Snížit sněžnou čáru o jednu úroveň
STR_MAPGEN_LAND_GENERATOR :{BLACK}Generátor krajiny:
STR_MAPGEN_TREE_PLACER :{BLACK}Sázení stromů:
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Typ krajiny:
STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Četnost jezer:
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Řeky:
@@ -3154,6 +3201,7 @@ STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Přepne
# Sign window
STR_EDIT_SIGN_CAPTION :{WHITE}Upravit text popisku
STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Vystředit pohled na značku. Ctrl+Klik otevře nový pohled
STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Na další návěstidlo
STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Na předešlé návěstidlo
@@ -3237,10 +3285,10 @@ STR_GOALS_COMPANY_TITLE :{BLACK}Cíle sp
STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klikni na cíl pro zaměření pohledu na průmysl/město/pole. Ctrl+Klik otevře nové okno s pohledem na průmyslu/městu/poli.
# Goal question window
STR_GOAL_QUESTION_CAPTION_QUESTION :Dotaz
STR_GOAL_QUESTION_CAPTION_INFORMATION :Informace
STR_GOAL_QUESTION_CAPTION_WARNING :Varování
STR_GOAL_QUESTION_CAPTION_ERROR :Chyba
STR_GOAL_QUESTION_CAPTION_QUESTION :{BLACK}Dotaz
STR_GOAL_QUESTION_CAPTION_INFORMATION :{BLACK}Informace
STR_GOAL_QUESTION_CAPTION_WARNING :{BLACK}Varování
STR_GOAL_QUESTION_CAPTION_ERROR :{YELLOW}Chyba
############ Start of Goal Question button list
STR_GOAL_QUESTION_BUTTON_CANCEL :Zrušit
@@ -3365,7 +3413,7 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Zabráni
STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT}
STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Vystředit pohled na směrování. Ctrl+Klik otevře nový pohled
STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Přejmenovat směrování
STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Vystředit pohled na bójku. Ctrl+Klik otevře nový pohled
STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Vystředit pohled na bójku. Ctrl+Klik otevře nové okno náhledu
STR_BUOY_VIEW_CHANGE_BUOY_NAME :{BLACK}Přejmenovat bójku
STR_EDIT_WAYPOINT_NAME :{WHITE}Přejmenovat směrování
@@ -3430,6 +3478,8 @@ STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Přesíd
STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Sídlo společnosti můžeš vystavit jinde za 1{NBSP}% její hodnoty. Stisknutý Shift pro zobrazení odhadu ceny
STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}Detaily
STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Zobrazit detaily a souhrny o infrastruktuře
STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :{BLACK}Poslat peníze
STR_COMPANY_VIEW_GIVE_MONEY_TOOLTIP :{BLACK}Poslat peníze této společnosti
STR_COMPANY_VIEW_NEW_FACE_BUTTON :{BLACK}Nový obličej
STR_COMPANY_VIEW_NEW_FACE_TOOLTIP :{BLACK}Zvol nový obličej prezidenta
@@ -3447,6 +3497,7 @@ STR_COMPANY_VIEW_SELL_SHARE_TOOLTIP :{BLACK}Prodat 2
STR_COMPANY_VIEW_COMPANY_NAME_QUERY_CAPTION :Jméno společnosti
STR_COMPANY_VIEW_PRESIDENT_S_NAME_QUERY_CAPTION :Jméno prezidenta
STR_COMPANY_VIEW_GIVE_MONEY_QUERY_CAPTION :Zadej částku, kterou chceš poslat
STR_BUY_COMPANY_MESSAGE :{WHITE}Hledáme společnost, která převezme naši společnost.{}{}Chcete zakoupit {COMPANY} za {CURRENCY_LONG}?
@@ -3715,9 +3766,9 @@ STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Vytvoř
STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Vytvoří se kopie letadla. Klepni na toto tlačítko a pak na letadlo v nebo vně hangáru. Se stisknutým Ctrl se budou sdílet příkazy. Stisknutý Shift pro zobrazení odhadu ceny
STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Vystředit pohled na vlakové depo. Ctrl+Klik otevře nový pohled
STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Vystředit pohled na garáž. Ctrl+Klik otevře nový pohled
STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Vystředit pohled na lodní depo. Ctrl+Klik otevře nový pohled
STR_DEPOT_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Vystředit pohled na hangár. Ctrl+Klik otevře nový pohled
STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Vystředit pohled na garáž. Ctrl+Klik otevře nové okno náhledu
STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Vystředit pohled na lodní depo. Ctrl+Klik otevře nové okno náhledu
STR_DEPOT_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Vystředit pohled na hangár. Ctrl+Klik otevře nové okno náhledu
STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TOOLTIP :{BLACK}Ukázat seznam všech vlaků, které mají toto depo v jízdním řádu
STR_DEPOT_VEHICLE_ORDER_LIST_ROAD_VEHICLE_TOOLTIP :{BLACK}Ukázat seznam všech silničních vozidel, které mají toto depo v jízdním řádu
@@ -3810,6 +3861,10 @@ STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Funkce a
# Vehicle view
STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE}
STR_VEHICLE_VIEW_TRAIN_CENTER_TOOLTIP :{BLACK}Vystředit pohled na vlak. Dvojklikem budeš následovat vlak v hlavním okně. Ctrl+Klik otevře nové okno náhledu
STR_VEHICLE_VIEW_ROAD_VEHICLE_CENTER_TOOLTIP :{BLACK}Vystředit pohled na vozidlo. Dvojklikem budeš následovat vozidlo v hlavním okně. Ctrl+Klik otevře nové okno náhledu
STR_VEHICLE_VIEW_SHIP_CENTER_TOOLTIP :{BLACK}Vystředit pohled na loď. Dvojklikem budeš loď následovat v hlavním okně. Ctrl+Klik otevře nový pohled
STR_VEHICLE_VIEW_AIRCRAFT_CENTER_TOOLTIP :{BLACK}Vystředit pohled na letadlo. Dvojklikem budeš následovat letadlo v hlavním okně. Ctrl+Klik otevře nové okno náhledu
STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Poslat vlak do depa. Ctrl+Klik pouze pro provedení oprav
STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}Pošli vozidlo do garáže. Ctrl+Klik pouze provede opravy
@@ -3841,7 +3896,12 @@ STR_VEHICLE_VIEW_ROAD_VEHICLE_SHOW_DETAILS_TOOLTIP :{BLACK}Ukaž de
STR_VEHICLE_VIEW_SHIP_SHOW_DETAILS_TOOLTIP :{BLACK}Ukázat detaily lodi
STR_VEHICLE_VIEW_AIRCRAFT_SHOW_DETAILS_TOOLTIP :{BLACK}Ukázat detaily letadla
STR_VEHICLE_VIEW_TRAIN_STATUS_START_STOP_TOOLTIP :{BLACK}Stávající činnost - klikni pro zastavení/rozjez vlaku
STR_VEHICLE_VIEW_ROAD_VEHICLE_STATUS_START_STOP_TOOLTIP :{BLACK}Stávající činnost - klikni pro zastavení/rozjezd vozidla
STR_VEHICLE_VIEW_SHIP_STATE_STATUS_STOP_TOOLTIP :{BLACK}Stávající činnost - klikni pro zastavení/rozjezd lodě
STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Stávající činnost - klikni pro zastavení/odlet letadla
STR_VEHICLE_VIEW_ORDER_LOCATION_TOOLTIP :{BLACK}Vystředit pohled na cíl přikazu. Ctrl+Klik otevře nový pohled
# Messages in the start stop button in the vehicle view
STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Nakládá nebo vykládá
@@ -4069,6 +4129,7 @@ STR_ORDER_REFIT_STOP_ORDER :(Přestavět na
STR_ORDER_STOP_ORDER :(Zastavit)
STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING}
STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Nemůže použít stanici){POP_COLOUR} {STRING} {STATION} {STRING}
STR_ORDER_IMPLICIT :(Automaticky)
@@ -4313,6 +4374,7 @@ STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Uložená hra j
STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :Soubor je nečitelný
STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :Do souboru nelze zapisovat
STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED :Kontrola integrity dat selhala
STR_GAME_SAVELOAD_ERROR_PATCHPACK :Uložená hra byla pořízena v upravené verzi
STR_GAME_SAVELOAD_NOT_AVAILABLE :<nedostupné>
STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Hra byla uložena ve verzi bez podpory tramvají. Všechny tramvaje se odstraní
@@ -4393,6 +4455,7 @@ STR_ERROR_LOAN_ALREADY_REPAYED :{WHITE}... žá
STR_ERROR_CURRENCY_REQUIRED :{WHITE}... je potřeba {CURRENCY_LONG}
STR_ERROR_CAN_T_REPAY_LOAN :{WHITE}Nelze splatit dluh...
STR_ERROR_INSUFFICIENT_FUNDS :{WHITE}Nelze darovat peníze půjčené z banky...
STR_ERROR_CAN_T_GIVE_MONEY :{WHITE}Této společnosti nemůžeš poslat peníze...
STR_ERROR_CAN_T_BUY_COMPANY :{WHITE}Nelze koupit společnost...
STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS :{WHITE}Nelze postavit ředitelství společnosti...
STR_ERROR_CAN_T_BUY_25_SHARE_IN_THIS :{WHITE}Nelze koupit podíl v této společnosti...
@@ -4519,6 +4582,8 @@ STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Nevhodný druh
STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} je po výměně moc dlouhý
STR_ERROR_AUTOREPLACE_NOTHING_TO_DO :{WHITE}Žádné pravidlo pro výměnu vozidel se nepoužilo
STR_ERROR_AUTOREPLACE_MONEY_LIMIT :(finanční limit)
STR_ERROR_AUTOREPLACE_INCOMPATIBLE_CARGO :{WHITE}Nové vozidlo nemůže převážet {STRING}
STR_ERROR_AUTOREPLACE_INCOMPATIBLE_REFIT :{WHITE}Nové vozidlo nemůže být přestavěno (příkaz {NUM})
# Rail construction errors
STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION :{WHITE}Nemožná kombinace kolejí
@@ -4918,10 +4983,10 @@ STR_INDUSTRY_NAME_SUGAR_MINE.small :cukerný důl
##id 0x6000
STR_SV_EMPTY :
STR_SV_UNNAMED :Beze jména
STR_SV_TRAIN_NAME :{G=m}Vlak {COMMA}
STR_SV_ROAD_VEHICLE_NAME :{G=n}Silniční vozidlo {COMMA}
STR_SV_SHIP_NAME :{G=f}Loď {COMMA}
STR_SV_AIRCRAFT_NAME :{G=n}Letadlo {COMMA}
STR_SV_TRAIN_NAME :Vlak #{COMMA}
STR_SV_ROAD_VEHICLE_NAME :{G=n}Silniční vozidlo #{COMMA}
STR_SV_SHIP_NAME :Loď #{COMMA}
STR_SV_AIRCRAFT_NAME :Letadlo #{COMMA}
STR_SV_STNAME :{STRING}
STR_SV_STNAME_NORTH :{STRING} sever
@@ -5224,6 +5289,7 @@ STR_FORMAT_BUOY_NAME :Bójka {TOWN}
STR_FORMAT_BUOY_NAME_SERIAL :Bójka {TOWN} č. {COMMA}
STR_FORMAT_COMPANY_NUM :(společnost {COMMA})
STR_FORMAT_GROUP_NAME :Skupina {COMMA}
STR_FORMAT_GROUP_VEHICLE_NAME :{GROUP} #{COMMA}
STR_FORMAT_INDUSTRY_NAME :{1:STRING} {0:TOWN}
STR_FORMAT_INDUSTRY_NAME.gen :{1:STRING.gen} {0:TOWN}
STR_FORMAT_INDUSTRY_NAME.loc :{1:STRING.loc} {0:TOWN}

View File

@@ -568,8 +568,8 @@ STR_MONTH_DEC :december
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}Nøgle
STR_GRAPH_KEY_TOOLTIP :{BLACK}Vis nøglen til grafer
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{}{NUM}
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM}
STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING}
STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA}
@@ -938,8 +938,6 @@ STR_GAME_OPTIONS_CURRENCY_HKD :Hong Kong Dolla
STR_GAME_OPTIONS_CURRENCY_INR :Indisk rupi (INR)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Vejkøretøjer
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Vælg den side af vejen, køretøjer skal kører i
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Kør i venstre side
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Kør i højre side
@@ -2820,7 +2818,6 @@ STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Snegræn
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Flyt snegrænsen een op
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Flyt snegrænsen een ned
STR_MAPGEN_LAND_GENERATOR :{BLACK}Terrængenerator:
STR_MAPGEN_TREE_PLACER :{BLACK}Træalgoritme:
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terræntype:
STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Havniveau
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Floder:

View File

@@ -576,8 +576,8 @@ STR_MONTH_DEC :December
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}Legenda
STR_GRAPH_KEY_TOOLTIP :{BLACK}Legenda bij deze grafiek weergeven
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{}{NUM}
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM}
STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING}
STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA}
@@ -747,6 +747,7 @@ STR_SMALLMAP_LEGENDA_DOCK :{TINY_FONT}{BLA
STR_SMALLMAP_LEGENDA_ROUGH_LAND :{TINY_FONT}{BLACK}Ruw land
STR_SMALLMAP_LEGENDA_GRASS_LAND :{TINY_FONT}{BLACK}Grasland
STR_SMALLMAP_LEGENDA_BARE_LAND :{TINY_FONT}{BLACK}Braakliggend land
STR_SMALLMAP_LEGENDA_RAINFOREST :{TINY_FONT}{BLACK}Regenwoud
STR_SMALLMAP_LEGENDA_FIELDS :{TINY_FONT}{BLACK}Akkers
STR_SMALLMAP_LEGENDA_TREES :{TINY_FONT}{BLACK}Bomen
STR_SMALLMAP_LEGENDA_ROCKS :{TINY_FONT}{BLACK}Rotsen
@@ -945,10 +946,9 @@ STR_GAME_OPTIONS_CURRENCY_NTD :Nieuwe Taiwanse
STR_GAME_OPTIONS_CURRENCY_CNY :Chinese Renminbi (CNY)
STR_GAME_OPTIONS_CURRENCY_HKD :Hong Kong Dollar (HKD)
STR_GAME_OPTIONS_CURRENCY_INR :Indiase rupee (INR)
STR_GAME_OPTIONS_CURRENCY_IDR :Indonesische roepia (IDR)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Wegvoertuigen
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Kiest aan welke kant van de weg voertuigen moeten rijden
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Links rijden
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Rechts rijden
@@ -1003,6 +1003,7 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :Anders
STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Menupuntgrootte
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Kiest de grootte van bedieningselementen
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(automatische detectie)
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normaal
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dubbele grootte
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :4x Grootte
@@ -1010,6 +1011,7 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :4x Grootte
STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Lettergrootte
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Hiermee kies je hoe groot de letters op het scherm moeten zijn
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(auto-detect)Status: Vermist
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normaal
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Dubbele grootte
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Viervoudige grootte
@@ -1835,6 +1837,7 @@ STR_ABANDON_SCENARIO_QUERY :{YELLOW}Weet je
# Cheat window
STR_CHEATS :{WHITE}Valsspelen
STR_CHEATS_TOOLTIP :{BLACK}Keuzevakjes geven aan of je deze manier van valsspelen eerder hebt gebruikt
STR_CHEATS_NOTE :{BLACK}Opmerking: al deze instellingen worden opgeslagen in het opgeslagen spel
STR_CHEAT_MONEY :{LTBLUE}Kapitaal vergroten met {CURRENCY_LONG}
STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Spelen als bedrijf: {ORANGE}{COMMA}
STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Magische bulldozer (industrieën en andere onverplaatsbare objecten verwijderen): {ORANGE}{STRING}
@@ -2351,6 +2354,7 @@ STR_JOIN_WAYPOINT_CAPTION :{WHITE}Routepun
STR_JOIN_WAYPOINT_CREATE_SPLITTED_WAYPOINT :{YELLOW}Los routepunt bouwen
# Generic toolbar
STR_TOOLBAR_DISABLED_NO_VEHICLE_AVAILABLE :{BLACK}Momenteel uitgeschakeld omdat er geen voertuigen zijn voor deze infrastructuur
# Rail construction toolbar
STR_RAIL_TOOLBAR_RAILROAD_CONSTRUCTION_CAPTION :Spoorwegen bouwen
@@ -2602,12 +2606,18 @@ STR_FOUND_TOWN_SELECT_LAYOUT_RANDOM :{BLACK}Willekeu
# Fund new industry window
STR_FUND_INDUSTRY_CAPTION :{WHITE}Nieuwe industrie financieren
STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}Kiest de gewenste industrie in de lijst
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :Veel willekeurige industrieën
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :{BLACK}Willekeurige industrieën maken
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}Bedek de kaart met willekeurig geplaatste industrieën
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_CAPTION :{WHITE}Willekeurige industrieën maken
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_QUERY :{YELLOW}Weet je zeker dat je veel willekeurige industrieën wilt hebben?
STR_FUND_INDUSTRY_INDUSTRY_BUILD_COST :{BLACK}Kosten: {YELLOW}{CURRENCY_LONG}
STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}Onderzoeken
STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY :{BLACK}Bouw
STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}Betaal
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES :{BLACK}Alle industrieën verwijderen
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_TOOLTIP :{BLACK}Alle industrieën op de kaart verwijderen
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION :{WHITE}Alle industrieën verwijderen
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Weet je zeker dat je alle industrieën wilt verwijderen?
# Industry cargoes window
STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Industrieketen voor {STRING} industrie
@@ -2628,6 +2638,7 @@ STR_INDUSTRY_CARGOES_SELECT_INDUSTRY_TOOLTIP :{BLACK}Bedrijf
# Land area window
STR_LAND_AREA_INFORMATION_CAPTION :{WHITE}Landinformatie
STR_LAND_AREA_INFORMATION_LOCATION_TOOLTIP :{BLACK}Centreer het hoofdscherm op de locatie van de tegel. Ctrl+klik opent een nieuw venster op de locatie van de tegel.
STR_LAND_AREA_INFORMATION_COST_TO_CLEAR_N_A :{BLACK}Sloopkosten: {LTBLUE}niet mogelijk
STR_LAND_AREA_INFORMATION_COST_TO_CLEAR :{BLACK}Sloopkosten: {RED}{CURRENCY_LONG}
STR_LAND_AREA_INFORMATION_REVENUE_WHEN_CLEARED :{BLACK}Opbrengst bij verwijdering: {LTBLUE}{CURRENCY_LONG}
@@ -2837,6 +2848,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF:
STR_SAVELOAD_FILTER_TITLE :{BLACK}Filtertekenreeks:
STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Bestand overschrijven
STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Weet je zeker dat je het bestaande bestand wilt overschrijven?
STR_SAVELOAD_DIRECTORY :{STRING} (Map)
STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Bovenliggende map)
STR_SAVELOAD_OSKTITLE :{BLACK}Voer een naam in voor het spel dat moet worden opgeslagen
@@ -2855,7 +2868,6 @@ STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Hoogte v
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Verhoog de sneeuwgrens met één
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Verlaag de sneeuwgrens met één
STR_MAPGEN_LAND_GENERATOR :{BLACK}Landgenerator:
STR_MAPGEN_TREE_PLACER :{BLACK}Bosalgoritme:
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terreintype:
STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Zeeniveau:
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rivieren:
@@ -3098,6 +3110,7 @@ STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Schakel
# Sign window
STR_EDIT_SIGN_CAPTION :{WHITE}Wijzig tekst van bord
STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Centreer het hoofdscherm op de locatie van het sein. Ctrl+klik opent een nieuw venster op de locatie van het sein.
STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Ga naar volgende bord
STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Ga naar vorige bord
@@ -3126,7 +3139,7 @@ STR_TOWN_VIEW_TOWN_GROWS_EVERY :{BLACK}Stad gro
STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}Stad groeit iedere {ORANGE}{COMMA}{BLACK}{NBSP}dag{P "" en} (gefinancierd)
STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}Stad groeit {RED}niet{BLACK}
STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Geluidslimiet in stad: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA}
STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Centreer het scherm op de locatie van de stad. Ctrl+klik opent een nieuw kijkvenster op de locatie van de stad
STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Centreer het hoofdscherm op de locatie van de stad. Ctrl+klik opent een nieuw kijkvenster op de locatie van de stad
STR_TOWN_VIEW_LOCAL_AUTHORITY_BUTTON :{BLACK}Gemeente
STR_TOWN_VIEW_LOCAL_AUTHORITY_TOOLTIP :{BLACK}Geef informatie over de gemeente weer
STR_TOWN_VIEW_RENAME_TOOLTIP :{BLACK}Hiermee hernoem je deze plaats
@@ -3292,7 +3305,7 @@ STR_CARGO_RATING_EXCELLENT :Uitstekend
STR_CARGO_RATING_OUTSTANDING :Voortreffelijk
############ range for rating ends
STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centreer het scherm op de locatie van het station. Ctrl+klik opent een nieuw venster op de locatie van het station
STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centreer het hoofdscherm op de locatie van het station. Ctrl+klik opent een nieuw venster op de locatie van het station
STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Station hernoemen
STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Geef alle treinen weer die dit station in hun opdrachtenlijst hebben
@@ -3307,9 +3320,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Voorkom
# Waypoint/buoy view window
STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT}
STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Scherm centreren op routepunt. Ctrl+klik opent nieuw venster op locatie van routepunt.
STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centreer het hoofdscherm op het routepunt. Ctrl+klik opent nieuw venster op locatie van routepunt.
STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Naam routepunt aanpassen
STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Hoofdscherm centreren op locatie van boei. Ctrl+klik opent een nieuw venster op de locatie van de boei.
STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centreer het hoofdscherm op de locatie van de boei. Ctrl+klik opent een nieuw venster op de locatie van de boei.
STR_BUOY_VIEW_CHANGE_BUOY_NAME :{BLACK}Naam van boei aanpassen
STR_EDIT_WAYPOINT_NAME :{WHITE}Naam routepunt aanpassen
@@ -3429,7 +3442,7 @@ STR_INDUSTRY_DIRECTORY_FILTER_NONE :Geen
STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY}
STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Productie vorige maand:
STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} ({COMMA}% vervoerd)
STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Centreer het scherm op de locatie van de industrie. Ctrl+klik opent een nieuws venster op de locatie van de industrie
STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Centreer het hoofdscherm op de locatie van de industrie. Ctrl+klik opent een nieuws venster op de locatie van de industrie
STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Productieniveau: {YELLOW}{COMMA}%
STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}De industrie heeft een dreigende sluiting aangekondigd!
@@ -3661,10 +3674,10 @@ STR_DEPOT_CLONE_ROAD_VEHICLE_DEPOT_INFO :{BLACK}Hiermee
STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Hiermee koop je een kopie van een schip. Klik op deze knop en dan op een schip binnen of buiten het dok. Ctrl+klik deelt de orders. Shift+klik geeft de verwachte kosten zonder te kopen.
STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Hiermee koop je een kopie van een vliegtuig. Klik op deze knop en dan op een vliegtuig binnen of buiten de hangar. Ctrl+klik deelt de orders. Shift+klik geeft de verwachte kosten zonder te kopen.
STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Scherm centreren op remise. Ctrl+klik opent een nieuw scherm op locatie van remise.
STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Centreer het scherm op de locatie van de garage. Ctrl+klik opent een nieuw scherm op de locatie van de garage
STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Centreer het hoofdscherm op de remise. Ctrl+klik opent een nieuw scherm op locatie van remise.
STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Centreer het hoofdscherm op de locatie van de garage. Ctrl+klik opent een nieuw scherm op de locatie van de garage
STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Centreer hoofdscherm op de locatie van het dok. Ctrl+klik opent een nieuw scherm op de locatie van het dok
STR_DEPOT_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Scherm centreren op hangar. Ctrl+klik opent een nieuw venster op de hangarlocatie.
STR_DEPOT_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Centreer het hoofdscherm op de hangar. Ctrl+klik opent een nieuw venster op de hangarlocatie.
STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TOOLTIP :{BLACK}Geef een lijst van alle treinen met dit depot in hun orders
STR_DEPOT_VEHICLE_ORDER_LIST_ROAD_VEHICLE_TOOLTIP :{BLACK}Geef een lijst van alle wegvoertuigen met deze garage in hun orders
@@ -3754,6 +3767,10 @@ STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}De te ve
# Vehicle view
STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE}
STR_VEHICLE_VIEW_TRAIN_CENTER_TOOLTIP :{BLACK}Centreer het hoofdscherm op de locatie van de trein. Met dubbelklik volg je de trein op het hoofdscherm. Ctrl+klik opent een nieuw scherm op de locatie van de trein.
STR_VEHICLE_VIEW_ROAD_VEHICLE_CENTER_TOOLTIP :{BLACK}Centreer het hoofdscherm op de locatie van het voertuig. Met dubbelklik volg je het voertuig op het hoofdscherm. Ctrl+klik opent een nieuw venster op de locatie van het voertuig
STR_VEHICLE_VIEW_SHIP_CENTER_TOOLTIP :{BLACK}Centreer het hoofdscherm op de locatie van het schip. Met dubbelklik volg je het schip op het hoofdscherm. Ctrl+klik opent een nieuw venster op de locatie van het schip
STR_VEHICLE_VIEW_AIRCRAFT_CENTER_TOOLTIP :{BLACK}Centreer het hoofdscherm op de locatie van het vliegtuig. Met dubbelklik volg je het vliegtuig op het hoofdscherm. Ctrl+klik opent een nieuw scherm op de locatie van het vliegtuig.
STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Stuur trein naar depot. Ctrl+klik voor alleen onderhoud
STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}Stuur wegvoertuig naar garage. Ctrl+klik voor alleen onderhoud
@@ -3762,10 +3779,10 @@ STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}Stuur vl
STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}Hiermee koop je een kopie van deze trein, inclusief wagons. Ctrl+klik deelt de orders. Shift+klik geeft de verwachte kosten zonder te kopen.
STR_VEHICLE_VIEW_CLONE_ROAD_VEHICLE_INFO :{BLACK}Hiermee koop je een kopie van dit wegvoertuig. Ctrl+klik deelt de orders. Shift+klik geeft de verwachte kosten zonder te kopen.
STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}Hiermee koop je een kopie gekocht van dit schip. Ctrl+klik deelt de orders. Shift+klik geeft de verwachte kosten zonder te kopen.
STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}Hiermee koop je een kopie van dit schip. Ctrl+klik deelt de orders. Shift+klik geeft de verwachte kosten zonder te kopen.
STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Hiermee koop je een kopie van dit vliegtuig. Ctrl+klik deelt de orders. Shift+klik geeft de verwachte kosten zonder te kopen.
STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}Forceer trein verder te rijden zonder te wachten op een groen sein
STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}Forceer trein om verder te rijden zonder te wachten op een groen sein
STR_VEHICLE_VIEW_TRAIN_REFIT_TOOLTIP :{BLACK}Trein ombouwen voor een ander vrachttype
STR_VEHICLE_VIEW_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Wegvoertuig ombouwen voor een ander vrachttype
@@ -3785,7 +3802,12 @@ STR_VEHICLE_VIEW_ROAD_VEHICLE_SHOW_DETAILS_TOOLTIP :{BLACK}Details
STR_VEHICLE_VIEW_SHIP_SHOW_DETAILS_TOOLTIP :{BLACK}Details van schip weergeven
STR_VEHICLE_VIEW_AIRCRAFT_SHOW_DETAILS_TOOLTIP :{BLACK}Details van vliegtuig weergeven
STR_VEHICLE_VIEW_TRAIN_STATUS_START_STOP_TOOLTIP :{BLACK}Huidige treinactie - klik om de trein te starten of stoppen
STR_VEHICLE_VIEW_ROAD_VEHICLE_STATUS_START_STOP_TOOLTIP :{BLACK}Huidige voertuigactie - klik om het voertuig te starten of stoppen
STR_VEHICLE_VIEW_SHIP_STATE_STATUS_STOP_TOOLTIP :{BLACK}Huidige scheepsactie - klik om het schip te starten of stoppen
STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Huidige vliegtuigactie - klik om het vliegtuig te starten of stoppen
STR_VEHICLE_VIEW_ORDER_LOCATION_TOOLTIP :{BLACK}Centreer het hoofdscherm op het doel van de order. Ctrl+klik opent een nieuw venster op het doel van de order.
# Messages in the start stop button in the vehicle view
STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}In- en uitladen
@@ -4013,6 +4035,7 @@ STR_ORDER_REFIT_STOP_ORDER :(Ombouwen naar
STR_ORDER_STOP_ORDER :(Stop)
STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING}
STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Kan station niet gebruiken){POP_COLOUR} {STRING} {STATION} {STRING}
STR_ORDER_IMPLICIT :(Impliciet)
@@ -4465,6 +4488,8 @@ STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Verkeerd depot-
STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} is te lang na het vervangen
STR_ERROR_AUTOREPLACE_NOTHING_TO_DO :{WHITE}Geen automatische regels voor vervangen/vernieuwen toegepast
STR_ERROR_AUTOREPLACE_MONEY_LIMIT :(onvoldoende geld)
STR_ERROR_AUTOREPLACE_INCOMPATIBLE_CARGO :{WHITE}Nieuw voertuig is niet geschikt voor {STRING}
STR_ERROR_AUTOREPLACE_INCOMPATIBLE_REFIT :{WHITE}Nieuw voertuig kan niet ombouwen in order {NUM}
# Rail construction errors
STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION :{WHITE}Onmogelijke spoorcombinatie

View File

@@ -576,8 +576,8 @@ STR_MONTH_DEC :December
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}Key
STR_GRAPH_KEY_TOOLTIP :{BLACK}Show key to graphs
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{}{NUM}
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM}
STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING2}
STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA}
@@ -612,7 +612,7 @@ STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR :Transport Coord
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ROUTE_SUPERVISOR :Route Supervisor
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_DIRECTOR :Director
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHIEF_EXECUTIVE :Chief Executive
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHAIRMAN :Chairman
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHAIRMAN :Chairperson
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_PRESIDENT :President
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TYCOON :Tycoon
@@ -695,7 +695,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Click on
STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Top companies who reached {NUM}
STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Company League Table in {NUM}
STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}.
STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Businessman
STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Businessperson
STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Entrepreneur
STR_HIGHSCORE_PERFORMANCE_TITLE_INDUSTRIALIST :Industrialist
STR_HIGHSCORE_PERFORMANCE_TITLE_CAPITALIST :Capitalist
@@ -946,10 +946,9 @@ STR_GAME_OPTIONS_CURRENCY_NTD :New Taiwan Doll
STR_GAME_OPTIONS_CURRENCY_CNY :Chinese Renminbi (CNY)
STR_GAME_OPTIONS_CURRENCY_HKD :Hong Kong Dollar (HKD)
STR_GAME_OPTIONS_CURRENCY_INR :Indian Rupee (INR)
STR_GAME_OPTIONS_CURRENCY_IDR :Indonesian Rupiah (IDR)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Road vehicles
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Select side of road for vehicles to drive on
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Drive on left
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Drive on right
@@ -1004,6 +1003,7 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :other
STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Interface size
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Select the interface element size to use
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(auto-detect)
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Double size
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Quad size
@@ -1011,6 +1011,7 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Quad size
STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Font size
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Select the interface font size to use
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(auto-detect)
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Double size
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Quad size
@@ -1452,6 +1453,10 @@ STR_CONFIG_SETTING_EXPENSES_LAYOUT :Group expenses
STR_CONFIG_SETTING_EXPENSES_LAYOUT_HELPTEXT :Define the layout for the company expenses window
STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS :Automatically remove signals during rail construction: {STRING2}
STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS_HELPTEXT :Automatically remove signals during rail construction if the signals are in the way. Note that this can potentially lead to train crashes.
STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT :Fast forward speed limit: {STRING2}
STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_HELPTEXT :Limit on how fast the game goes when fast forward is enabled. 0 = no limit (as fast as your computer allows). Values below 100% slow the game down. The upper-limit depends on the specification of your computer and can vary depending on the game.
STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_VAL :{NUM}% normal game speed
STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_ZERO :No limit (as fast as your computer allows)
STR_CONFIG_SETTING_SOUND_TICKER :News ticker: {STRING2}
STR_CONFIG_SETTING_SOUND_TICKER_HELPTEXT :Play sound for summarised news messages
@@ -2605,12 +2610,18 @@ STR_FOUND_TOWN_SELECT_LAYOUT_RANDOM :{BLACK}Random
# Fund new industry window
STR_FUND_INDUSTRY_CAPTION :{WHITE}Fund new industry
STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}Choose the appropriate industry from this list
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :Many random industries
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :{BLACK}Create random industries
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}Cover the map with randomly placed industries
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_CAPTION :{WHITE}Create random industries
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_QUERY :{YELLOW}Are you sure you want to create many random industries?
STR_FUND_INDUSTRY_INDUSTRY_BUILD_COST :{BLACK}Cost: {YELLOW}{CURRENCY_LONG}
STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}Prospect
STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY :{BLACK}Build
STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}Fund
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES :{BLACK}Remove all industries
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_TOOLTIP :{BLACK}Remove all industries currently present on the map
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION :{WHITE}Remove all industries
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Are you sure you want to remove all industries?
# Industry cargoes window
STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Industry chain for {STRING} industry
@@ -2841,6 +2852,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF:
STR_SAVELOAD_FILTER_TITLE :{BLACK}Filter string:
STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Overwrite File
STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Are you sure you want to overwrite the existing file?
STR_SAVELOAD_DIRECTORY :{RAW_STRING} (Directory)
STR_SAVELOAD_PARENT_DIRECTORY :{RAW_STRING} (Parent directory)
STR_SAVELOAD_OSKTITLE :{BLACK}Enter a name for the savegame
@@ -2859,7 +2872,6 @@ STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Snow lin
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Move the snow line height one up
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Move the snow line height one down
STR_MAPGEN_LAND_GENERATOR :{BLACK}Land generator:
STR_MAPGEN_TREE_PLACER :{BLACK}Tree algorithm:
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terrain type:
STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Sea level:
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rivers:

View File

@@ -550,8 +550,8 @@ STR_MONTH_DEC :December
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}Key
STR_GRAPH_KEY_TOOLTIP :{BLACK}Show key to graphs
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{}{NUM}
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM}
STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING}
STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA}
@@ -908,8 +908,6 @@ STR_GAME_OPTIONS_CURRENCY_GEL :Georgian Lari (
STR_GAME_OPTIONS_CURRENCY_IRR :Iranian Rial (IRR)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Road vehicles
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Select side of road for vehicles to drive on
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Drive on left
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Drive on right
@@ -2669,7 +2667,6 @@ STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Snow lin
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Move the snow line height one up
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Move the snow line height one down
STR_MAPGEN_LAND_GENERATOR :{BLACK}Land generator:
STR_MAPGEN_TREE_PLACER :{BLACK}Tree algorithm:
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terrain type:
STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Sea level:
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rivers:

View File

@@ -194,6 +194,7 @@ STR_COLOUR_DEFAULT :Default
STR_UNITS_VELOCITY_IMPERIAL :{COMMA}{NBSP}mph
STR_UNITS_VELOCITY_METRIC :{COMMA}{NBSP}km/h
STR_UNITS_VELOCITY_SI :{COMMA}{NBSP}m/s
STR_UNITS_VELOCITY_GAMEUNITS :{DECIMAL}{NBSP}tiles/day
STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}hp
STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hp
@@ -312,8 +313,15 @@ STR_SORT_BY_CARGO_CAPACITY :Cargo capacity
STR_SORT_BY_RANGE :Range
STR_SORT_BY_POPULATION :Population
STR_SORT_BY_RATING :Rating
STR_SORT_BY_NUM_VEHICLES :Number of vehicles
STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Total profit last year
STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Total profit this year
STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Average profit last year
STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Average profit this year
# Group by options for vehicle list
STR_GROUP_BY_NONE :None
STR_GROUP_BY_SHARED_ORDERS :Shared orders
# Tooltips for the main toolbar
STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Pause game
@@ -568,8 +576,8 @@ STR_MONTH_DEC :December
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}Key
STR_GRAPH_KEY_TOOLTIP :{BLACK}Show key to graphs
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{}{NUM}
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM}
STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING}
STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA}
@@ -604,7 +612,7 @@ STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR :Transport Coord
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ROUTE_SUPERVISOR :Route Supervisor
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_DIRECTOR :Director
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHIEF_EXECUTIVE :Chief Executive
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHAIRMAN :Chairman
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHAIRMAN :Chairperson
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_PRESIDENT :President
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TYCOON :Tycoon
@@ -687,7 +695,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Click on
STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Top companies who reached {NUM}
STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Company League Table in {NUM}
STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}.
STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Businessman
STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Businessperson
STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Entrepreneur
STR_HIGHSCORE_PERFORMANCE_TITLE_INDUSTRIALIST :Industrialist
STR_HIGHSCORE_PERFORMANCE_TITLE_CAPITALIST :Capitalist
@@ -739,6 +747,7 @@ STR_SMALLMAP_LEGENDA_DOCK :{TINY_FONT}{BLA
STR_SMALLMAP_LEGENDA_ROUGH_LAND :{TINY_FONT}{BLACK}Rough Land
STR_SMALLMAP_LEGENDA_GRASS_LAND :{TINY_FONT}{BLACK}Grass Land
STR_SMALLMAP_LEGENDA_BARE_LAND :{TINY_FONT}{BLACK}Bare Land
STR_SMALLMAP_LEGENDA_RAINFOREST :{TINY_FONT}{BLACK}Rainforest
STR_SMALLMAP_LEGENDA_FIELDS :{TINY_FONT}{BLACK}Fields
STR_SMALLMAP_LEGENDA_TREES :{TINY_FONT}{BLACK}Trees
STR_SMALLMAP_LEGENDA_ROCKS :{TINY_FONT}{BLACK}Rocks
@@ -770,6 +779,7 @@ STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Display
STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Show last message or news report
STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - -
STR_STATUSBAR_PAUSED :{YELLOW}* * PAUSED * *
STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * PAUSED (waiting for link graph update) * *
STR_STATUSBAR_AUTOSAVE :{RED}AUTOSAVE
STR_STATUSBAR_SAVING_GAME :{RED}* * SAVING GAME * *
@@ -935,10 +945,10 @@ STR_GAME_OPTIONS_CURRENCY_MXN :Mexican Peso (M
STR_GAME_OPTIONS_CURRENCY_NTD :New Taiwan Dollar (NTD)
STR_GAME_OPTIONS_CURRENCY_CNY :Chinese Renminbi (CNY)
STR_GAME_OPTIONS_CURRENCY_HKD :Hong Kong Dollar (HKD)
STR_GAME_OPTIONS_CURRENCY_INR :Indian Rupee (INR)
STR_GAME_OPTIONS_CURRENCY_IDR :Indonesian Rupiah (IDR)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Road vehicles
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Select side of road for vehicles to drive on
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Drive on left
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Drive on right
@@ -993,6 +1003,7 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :other
STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Interface size
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Select the interface element size to use
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(auto-detect)
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Double size
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Quad size
@@ -1000,6 +1011,7 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Quad size
STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Font size
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Select the interface font size to use
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(auto-detect)
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Double size
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Quad size
@@ -1309,6 +1321,7 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL :Show town popul
STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Display the population of towns in their label on the map
STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Thickness of lines in graphs: {STRING}
STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Width of the line in the graphs. A thin line is more precisely readable, a thicker line is easier to see and colors are easier to distinguish
STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Show the NewGRF's name in the build vehicle window: {STRING}
STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Add a line to the build vehicle window, showing which NewGRF the selected vehicle comes from.
STR_CONFIG_SETTING_LANDSCAPE :Landscape: {STRING}
@@ -1438,6 +1451,8 @@ STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Keep building t
STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT :Keep the building tools for bridges, tunnels, etc. open after use
STR_CONFIG_SETTING_EXPENSES_LAYOUT :Group expenses in company finance window: {STRING}
STR_CONFIG_SETTING_EXPENSES_LAYOUT_HELPTEXT :Define the layout for the company expenses window
STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS :Automatically remove signals during track construction: {STRING}
STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS_HELPTEXT :Automatically remove signals during track construction if the signals are in the way. Note that this can potentially lead to train crashes.
STR_CONFIG_SETTING_SOUND_TICKER :News ticker: {STRING}
STR_CONFIG_SETTING_SOUND_TICKER_HELPTEXT :Play sound for summarized news messages
@@ -1551,6 +1566,11 @@ STR_CONFIG_SETTING_ENDING_YEAR :Scoring end yea
STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Year the game ends for scoring purposes. At the end of this year, the company's score is recorded and the high-score screen is displayed, but the players can continue playing after that.{}If this is before the starting year, the high-score screen is never displayed.
STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM}
STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Never
STR_CONFIG_SETTING_ECONOMY_TYPE :Economy type: {STRING}
STR_CONFIG_SETTING_ECONOMY_TYPE_HELPTEXT :Smooth economy makes production changes more often, and in smaller steps. Frozen economy stops production changes and industry closures. This setting may have no effect if industry types are provided by a NewGRF.
STR_CONFIG_SETTING_ECONOMY_TYPE_ORIGINAL :Original
STR_CONFIG_SETTING_ECONOMY_TYPE_SMOOTH :Smooth
STR_CONFIG_SETTING_ECONOMY_TYPE_FROZEN :Frozen
STR_CONFIG_SETTING_ALLOW_SHARES :Allow buying shares from other companies: {STRING}
STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :When enabled, allow buying and selling of company shares. Shares will only be available for companies reaching a certain age
STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Minimum company age to trade shares: {STRING}
@@ -1602,6 +1622,10 @@ STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Linear
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :In-game placement of trees: {STRING}
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Control random appearance of trees during the game. This might affect industries which rely on tree growth, for example lumber mills
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD :Grow but don't spread {RED}(breaks lumber mill)
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_RAINFOREST :Grow but only spread in rain forests
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_ALL :Grow and spread everywhere
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_GROWTH_NO_SPREAD :Don't grow, don't spread {RED}(breaks lumber mill)
STR_CONFIG_SETTING_TOOLBAR_POS :Position of main toolbar: {STRING}
STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Horizontal position of the main toolbar at the top of the screen
@@ -1668,6 +1692,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Whenever a spee
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Imperial (mph)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metric (km/h)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS :Game units (tiles/day)
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Vehicle power units: {STRING}
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Whenever a vehicle's power is shown in the user interface, show it in the selected units
@@ -1800,6 +1825,7 @@ STR_INTRO_TRANSLATION :{BLACK}This tra
# Quit window
STR_QUIT_CAPTION :{WHITE}Quit
STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD :{YELLOW}Are you sure you want to exit OpenTTD?
STR_QUIT_YES :{BLACK}Yes
STR_QUIT_NO :{BLACK}No
@@ -1811,6 +1837,7 @@ STR_ABANDON_SCENARIO_QUERY :{YELLOW}Are you
# Cheat window
STR_CHEATS :{WHITE}Cheats
STR_CHEATS_TOOLTIP :{BLACK}Checkboxes indicate if you have used this cheat before
STR_CHEATS_NOTE :{BLACK}Note: any usage of these settings will be recorded by the savegame
STR_CHEAT_MONEY :{LTBLUE}Increase money by {CURRENCY_LONG}
STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Playing as company: {ORANGE}{COMMA}
STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Magic bulldozer (remove industries, unmovable objects): {ORANGE}{STRING}
@@ -1962,6 +1989,10 @@ STR_NETWORK_SERVER_LIST_JOIN_GAME :{BLACK}Join gam
STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}Refresh server
STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Refresh the server info
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET :{BLACK}Search internet
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}Search internet for public servers
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN :{BLACK}Search LAN
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP :{BLACK}Search local area network for servers
STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Add server
STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Adds a server to the list which will always be checked for running games
STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Start server
@@ -2145,6 +2176,7 @@ STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Wrong pa
STR_NETWORK_ERROR_SERVER_FULL :{WHITE}The server is full
STR_NETWORK_ERROR_SERVER_BANNED :{WHITE}You are banned from this server
STR_NETWORK_ERROR_KICKED :{WHITE}You were kicked out of the game
STR_NETWORK_ERROR_KICK_MESSAGE :{WHITE}Reason: {STRING}
STR_NETWORK_ERROR_CHEATER :{WHITE}Cheating is not allowed on this server
STR_NETWORK_ERROR_TOO_MANY_COMMANDS :{WHITE}You were sending too many commands to the server
STR_NETWORK_ERROR_TIMEOUT_PASSWORD :{WHITE}You took too long to enter the password
@@ -2186,11 +2218,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_1 :Game still paus
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_2 :Game still paused ({STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_3 :Game still paused ({STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_4 :Game still paused ({STRING}, {STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_5 :Game still paused ({STRING}, {STRING}, {STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED :Game unpaused ({STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :number of players
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :connecting clients
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :manual
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :game script
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :waiting for link graph update
############ End of leave-in-this-order
STR_NETWORK_MESSAGE_CLIENT_LEAVING :leaving
STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} has joined the game
@@ -2200,8 +2234,10 @@ STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} ha
STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} has started a new company (#{2:NUM})
STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} has left the game ({2:STRING})
STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} has changed his/her name to {STRING}
STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} gave {2:CURRENCY_LONG} to {1:STRING}
STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}The server closed the session
STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}The server is restarting...{}Please wait...
STR_NETWORK_MESSAGE_KICKED :*** {STRING} was kicked. Reason: ({STRING})
# Content downloading window
STR_CONTENT_TITLE :{WHITE}Content downloading
@@ -2318,6 +2354,7 @@ STR_JOIN_WAYPOINT_CAPTION :{WHITE}Join way
STR_JOIN_WAYPOINT_CREATE_SPLITTED_WAYPOINT :{YELLOW}Build a separate waypoint
# Generic toolbar
STR_TOOLBAR_DISABLED_NO_VEHICLE_AVAILABLE :{BLACK}Disabled as currently no vehicles are available for this infrastructure
# Rail construction toolbar
STR_RAIL_TOOLBAR_RAILROAD_CONSTRUCTION_CAPTION :Railroad Construction
@@ -2513,6 +2550,12 @@ STR_TREES_RANDOM_TYPE :{BLACK}Trees of
STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Place trees of random type. Shift toggles building/showing cost estimate
STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Random Trees
STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Plant trees randomly throughout the landscape
STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Normal
STR_TREES_MODE_NORMAL_TOOLTIP :{BLACK}Plant single trees by dragging over the landscape.
STR_TREES_MODE_FOREST_SM_BUTTON :{BLACK}Grove
STR_TREES_MODE_FOREST_SM_TOOLTIP :{BLACK}Plant small forests by dragging over the landscape.
STR_TREES_MODE_FOREST_LG_BUTTON :{BLACK}Forest
STR_TREES_MODE_FOREST_LG_TOOLTIP :{BLACK}Plant large forests by dragging over the landscape.
# Land generation window (SE)
STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Land Generation
@@ -2563,12 +2606,18 @@ STR_FOUND_TOWN_SELECT_LAYOUT_RANDOM :{BLACK}Random
# Fund new industry window
STR_FUND_INDUSTRY_CAPTION :{WHITE}Fund new industry
STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}Choose the appropriate industry from this list
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :Many random industries
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :{BLACK}Create random industries
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}Cover the map with randomly placed industries
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_CAPTION :{WHITE}Create random industries
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_QUERY :{YELLOW}Are you sure you want to create many random industries?
STR_FUND_INDUSTRY_INDUSTRY_BUILD_COST :{BLACK}Cost: {YELLOW}{CURRENCY_LONG}
STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}Prospect
STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY :{BLACK}Build
STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}Fund
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES :{BLACK}Remove all industries
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_TOOLTIP :{BLACK}Remove all industries currently present on the map
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION :{WHITE}Remove all industries
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Are you sure you want to remove all industries?
# Industry cargoes window
STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Industry chain for {STRING} industry
@@ -2589,6 +2638,7 @@ STR_INDUSTRY_CARGOES_SELECT_INDUSTRY_TOOLTIP :{BLACK}Select t
# Land area window
STR_LAND_AREA_INFORMATION_CAPTION :{WHITE}Land Area Information
STR_LAND_AREA_INFORMATION_LOCATION_TOOLTIP :{BLACK}Center the main view on tile location. Ctrl+Click opens a new viewport on tile location
STR_LAND_AREA_INFORMATION_COST_TO_CLEAR_N_A :{BLACK}Cost to clear: {LTBLUE}N/A
STR_LAND_AREA_INFORMATION_COST_TO_CLEAR :{BLACK}Cost to clear: {RED}{CURRENCY_LONG}
STR_LAND_AREA_INFORMATION_REVENUE_WHEN_CLEARED :{BLACK}Revenue when cleared: {LTBLUE}{CURRENCY_LONG}
@@ -2798,6 +2848,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF:
STR_SAVELOAD_FILTER_TITLE :{BLACK}Filter string:
STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Overwrite File
STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Are you sure you want to overwrite the existing file?
STR_SAVELOAD_DIRECTORY :{STRING} (Directory)
STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Parent directory)
STR_SAVELOAD_OSKTITLE :{BLACK}Enter a name for the savegame
@@ -2816,7 +2868,6 @@ STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Snow lin
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Move the snow line height up one
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Move the snow line height down one
STR_MAPGEN_LAND_GENERATOR :{BLACK}Land generator:
STR_MAPGEN_TREE_PLACER :{BLACK}Tree algorithm:
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terrain type:
STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Sea level:
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rivers:
@@ -3059,6 +3110,7 @@ STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Toggle m
# Sign window
STR_EDIT_SIGN_CAPTION :{WHITE}Edit sign text
STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Center the main view on sign location. Ctrl+Click opens a new viewport on sign location
STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Go to next sign
STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Go to previous sign
@@ -3142,10 +3194,10 @@ STR_GOALS_COMPANY_TITLE :{BLACK}Company
STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Click on goal to center main view on industry/town/tile. Ctrl+Click opens a new viewport on industry/town/tile location
# Goal question window
STR_GOAL_QUESTION_CAPTION_QUESTION :Question
STR_GOAL_QUESTION_CAPTION_INFORMATION :Information
STR_GOAL_QUESTION_CAPTION_WARNING :Warning
STR_GOAL_QUESTION_CAPTION_ERROR :Error
STR_GOAL_QUESTION_CAPTION_QUESTION :{BLACK}Question
STR_GOAL_QUESTION_CAPTION_INFORMATION :{BLACK}Information
STR_GOAL_QUESTION_CAPTION_WARNING :{BLACK}Warning
STR_GOAL_QUESTION_CAPTION_ERROR :{YELLOW}Error
############ Start of Goal Question button list
STR_GOAL_QUESTION_BUTTON_CANCEL :Cancel
@@ -3335,6 +3387,8 @@ STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Relocate
STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Rebuild company headquarters elsewhere for 1% cost of company value. Shift+Click shows estimated cost without relocating HQ
STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}Details
STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}View detailed infrastructure counts
STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :{BLACK}Give money
STR_COMPANY_VIEW_GIVE_MONEY_TOOLTIP :{BLACK}Give money to this company
STR_COMPANY_VIEW_NEW_FACE_BUTTON :{BLACK}New Face
STR_COMPANY_VIEW_NEW_FACE_TOOLTIP :{BLACK}Select new face for president
@@ -3352,6 +3406,7 @@ STR_COMPANY_VIEW_SELL_SHARE_TOOLTIP :{BLACK}Sell 25%
STR_COMPANY_VIEW_COMPANY_NAME_QUERY_CAPTION :Company Name
STR_COMPANY_VIEW_PRESIDENT_S_NAME_QUERY_CAPTION :President's Name
STR_COMPANY_VIEW_GIVE_MONEY_QUERY_CAPTION :Enter the amount of money you want to give
STR_BUY_COMPANY_MESSAGE :{WHITE}We are looking for a transport company to take-over our company.{}{}Do you want to purchase {COMPANY} for {CURRENCY_LONG}?
@@ -3371,8 +3426,17 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL :{WHITE}{CURRENC
# Industry directory
STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Industries
STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- None -
STR_INDUSTRY_DIRECTORY_ITEM_INFO :{BLACK}{CARGO_LONG}{STRING}{YELLOW} ({COMMA}% transported){BLACK}
STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY}
STR_INDUSTRY_DIRECTORY_ITEM_PROD1 :{ORANGE}{INDUSTRY} {STRING}
STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUSTRY} {STRING}, {STRING}
STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING}
STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} and {NUM} more...
STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Industry names - click on name to center main view on industry. Ctrl+Click opens a new viewport on industry location
STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Accepted cargo: {SILVER}{STRING}
STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}Produced cargo: {SILVER}{STRING}
STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :All cargo types
STR_INDUSTRY_DIRECTORY_FILTER_NONE :None
# Industry view
STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY}
@@ -3703,6 +3767,10 @@ STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Make aut
# Vehicle view
STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE}
STR_VEHICLE_VIEW_TRAIN_CENTER_TOOLTIP :{BLACK}Center main view on train's location. Double click will follow train in main view. Ctrl+Click opens a new viewport on train's location
STR_VEHICLE_VIEW_ROAD_VEHICLE_CENTER_TOOLTIP :{BLACK}Center main view on vehicle's location. Double click will follow vehicle in main view. Ctrl+Click opens a new viewport on vehicle's location
STR_VEHICLE_VIEW_SHIP_CENTER_TOOLTIP :{BLACK}Center main view on ship's location. Double click will follow ship in main view. Ctrl+Click opens a new viewport on ship's location
STR_VEHICLE_VIEW_AIRCRAFT_CENTER_TOOLTIP :{BLACK}Center main view on aircraft's location. Double click will follow aircraft in main view. Ctrl+Click opens a new viewport on aircraft's location
STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Send train to depot. Ctrl+Click will only service
STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}Send vehicle to depot. Ctrl+Click will only service
@@ -3734,7 +3802,12 @@ STR_VEHICLE_VIEW_ROAD_VEHICLE_SHOW_DETAILS_TOOLTIP :{BLACK}Show roa
STR_VEHICLE_VIEW_SHIP_SHOW_DETAILS_TOOLTIP :{BLACK}Show ship details
STR_VEHICLE_VIEW_AIRCRAFT_SHOW_DETAILS_TOOLTIP :{BLACK}Show aircraft details
STR_VEHICLE_VIEW_TRAIN_STATUS_START_STOP_TOOLTIP :{BLACK}Current train action - click to stop/start train
STR_VEHICLE_VIEW_ROAD_VEHICLE_STATUS_START_STOP_TOOLTIP :{BLACK}Current vehicle action - click to stop/start vehicle
STR_VEHICLE_VIEW_SHIP_STATE_STATUS_STOP_TOOLTIP :{BLACK}Current ship action - click to stop/start ship
STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Current aircraft action - click to stop/start aircraft
STR_VEHICLE_VIEW_ORDER_LOCATION_TOOLTIP :{BLACK}Center main view on order destination. Ctrl+Click opens a new viewport on the order destination's location
# Messages in the start stop button in the vehicle view
STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Loading / Unloading
@@ -3962,6 +4035,7 @@ STR_ORDER_REFIT_STOP_ORDER :(Refit to {STRI
STR_ORDER_STOP_ORDER :(Stop)
STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING}
STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Can't use station){POP_COLOUR} {STRING} {STATION} {STRING}
STR_ORDER_IMPLICIT :(Implicit)
@@ -4206,6 +4280,7 @@ STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Savegame is mad
STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :File not readable
STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :File not writable
STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED :Data integrity check failed
STR_GAME_SAVELOAD_ERROR_PATCHPACK :Savegame is made with a modified version
STR_GAME_SAVELOAD_NOT_AVAILABLE :<not available>
STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Game was saved in version without streetcar support. All streetcars have been removed
@@ -4286,6 +4361,7 @@ STR_ERROR_LOAN_ALREADY_REPAYED :{WHITE}... no l
STR_ERROR_CURRENCY_REQUIRED :{WHITE}... {CURRENCY_LONG} required
STR_ERROR_CAN_T_REPAY_LOAN :{WHITE}Can't repay loan...
STR_ERROR_INSUFFICIENT_FUNDS :{WHITE}Can't give away money that is loaned from the bank...
STR_ERROR_CAN_T_GIVE_MONEY :{WHITE}Can't give away money to this company...
STR_ERROR_CAN_T_BUY_COMPANY :{WHITE}Can't buy company...
STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS :{WHITE}Can't build company headquarters...
STR_ERROR_CAN_T_BUY_25_SHARE_IN_THIS :{WHITE}Can't buy 25% share in this company...
@@ -4412,6 +4488,8 @@ STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Wrong depot typ
STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} is too long after replacement
STR_ERROR_AUTOREPLACE_NOTHING_TO_DO :{WHITE}No autoreplace/renew rules applied
STR_ERROR_AUTOREPLACE_MONEY_LIMIT :(money limit)
STR_ERROR_AUTOREPLACE_INCOMPATIBLE_CARGO :{WHITE}New vehicle can't carry {STRING}
STR_ERROR_AUTOREPLACE_INCOMPATIBLE_REFIT :{WHITE}New vehicle can't do refit in order {NUM}
# Rail construction errors
STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION :{WHITE}Impossible track combination
@@ -4693,10 +4771,10 @@ STR_INDUSTRY_NAME_SUGAR_MINE :Sugar Mine
##id 0x6000
STR_SV_EMPTY :
STR_SV_UNNAMED :Unnamed
STR_SV_TRAIN_NAME :Train {COMMA}
STR_SV_ROAD_VEHICLE_NAME :Road Vehicle {COMMA}
STR_SV_SHIP_NAME :Ship {COMMA}
STR_SV_AIRCRAFT_NAME :Aircraft {COMMA}
STR_SV_TRAIN_NAME :Train #{COMMA}
STR_SV_ROAD_VEHICLE_NAME :Road Vehicle #{COMMA}
STR_SV_SHIP_NAME :Ship #{COMMA}
STR_SV_AIRCRAFT_NAME :Aircraft #{COMMA}
STR_SV_STNAME :{STRING}
STR_SV_STNAME_NORTH :{STRING} North
@@ -4998,6 +5076,7 @@ STR_FORMAT_BUOY_NAME :{TOWN} Buoy
STR_FORMAT_BUOY_NAME_SERIAL :{TOWN} Buoy #{COMMA}
STR_FORMAT_COMPANY_NUM :(Company {COMMA})
STR_FORMAT_GROUP_NAME :Group {COMMA}
STR_FORMAT_GROUP_VEHICLE_NAME :{GROUP} #{COMMA}
STR_FORMAT_INDUSTRY_NAME :{TOWN} {STRING}
STR_FORMAT_WAYPOINT_NAME :{TOWN} Waypoint
STR_FORMAT_WAYPOINT_NAME_SERIAL :{TOWN} Waypoint #{COMMA}

View File

@@ -553,8 +553,8 @@ STR_MONTH_DEC :Decembro
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}Ŝlosilo
STR_GRAPH_KEY_TOOLTIP :{BLACK}Montru ŝlosilon al grafikoj
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{}{NUM}
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM}
STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING}
STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA}
@@ -901,8 +901,6 @@ STR_GAME_OPTIONS_CURRENCY_GEL :Kartvela Lario
STR_GAME_OPTIONS_CURRENCY_IRR :Irana Rialo (IRR)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Stratveturiloj
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Elektu stratflankon kie veturu veturiloj
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Veturu maldekstre
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Veturu dekstre
@@ -2277,7 +2275,6 @@ STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Neĝlini
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Altigu la neĝlinion per unu
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Malaltigu la neĝlinion per unu
STR_MAPGEN_LAND_GENERATOR :{BLACK}Landgenerilo:
STR_MAPGEN_TREE_PLACER :{BLACK}Arba algoritmo:
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terentipo:
STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Marnivelo:
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Riveroj:

File diff suppressed because it is too large Load Diff

View File

@@ -538,8 +538,8 @@ STR_MONTH_DEC :Desembur
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}Lykil
STR_GRAPH_KEY_TOOLTIP :{BLACK}Vís lykil til graf
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{}{NUM}
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM}
STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING}
STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA}
@@ -889,8 +889,6 @@ STR_GAME_OPTIONS_CURRENCY_GEL :Georgiskur Lari
STR_GAME_OPTIONS_CURRENCY_IRR :Iranskur Rial
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Akfør
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Áset hvørja síðu á vegnum akfør skulu koyra á
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Vinstrakoyring
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Høgrakoyring
@@ -2438,7 +2436,6 @@ STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Hædd á
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Flyt kava linjuna eitt upp
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Flyt kava linjuna eitt niður
STR_MAPGEN_LAND_GENERATOR :{BLACK}Lendis framleiðari:
STR_MAPGEN_TREE_PLACER :{BLACK}Træ algoritma:
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Slag av lendi:
STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Sjóvarmáli:
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Løkar:

View File

@@ -576,8 +576,8 @@ STR_MONTH_DEC :Joulukuu
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}Selite
STR_GRAPH_KEY_TOOLTIP :{BLACK}Näytä kuvaajan selite
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{}{NUM}
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM}
STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING}
STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA}
@@ -695,9 +695,9 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Poista m
STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Parhaat yhtiöt, jotka saavuttivat vuoden {NUM}
STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Yhtiökilpailutaulukko vuonna {NUM}
STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}.
STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Liikemies
STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Kaupantekijä
STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Yrittäjä
STR_HIGHSCORE_PERFORMANCE_TITLE_INDUSTRIALIST :Teollisuusmies
STR_HIGHSCORE_PERFORMANCE_TITLE_INDUSTRIALIST :Teollisuudenharjoittaja
STR_HIGHSCORE_PERFORMANCE_TITLE_CAPITALIST :Kapitalisti
STR_HIGHSCORE_PERFORMANCE_TITLE_MAGNATE :Magnaatti
STR_HIGHSCORE_PERFORMANCE_TITLE_MOGUL :Moguli
@@ -946,10 +946,9 @@ STR_GAME_OPTIONS_CURRENCY_NTD :Uusi Taiwanin d
STR_GAME_OPTIONS_CURRENCY_CNY :Kiinan renminbi (CNY)
STR_GAME_OPTIONS_CURRENCY_HKD :Hongkongin dollari (HKD)
STR_GAME_OPTIONS_CURRENCY_INR :Intian rupia (INR)
STR_GAME_OPTIONS_CURRENCY_IDR :Indonesian rupia (IDR)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Kulkuneuvot
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Valitse kummalla puolella tietä ajetaan
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Vasemmanpuolinen liikenne
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Oikeanpuolinen liikenne
@@ -1004,6 +1003,7 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :muu
STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Käyttöliittymän koko
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Valitse käyttöliittymäelementtien koko
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(tunnista automaattisesti)
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Tavallinen
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Kaksinkertainen
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Nelinkertainen
@@ -1011,6 +1011,7 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Nelinkertainen
STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Kirjasinkoko
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Valitse käyttöliittymän kirjasinkoko
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(tunnista automaattisesti)
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normaali
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Kaksinkertainen koko
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Nelinkertainen koko
@@ -1621,10 +1622,10 @@ STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Lineaarinen
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Puiden istutus pelissä: {STRING}
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Määrittää puiden sattumanvaraisen luomisen. Tämä voi vaikuttaa teollisuuslaitoksiin, jotka ovat riippuvaisia puiden kasvamisesta, esimerkiksi sahat.
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD :Puut kasvavat, mutta eivät leviä {RED}(rikkoo sahan)
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD :Puut kasvavat, mutta eivät leviä {RED}(rikkoo subtrooppisen sahan)
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_RAINFOREST :Puut kasvavat, mutta leviävät vain sademetsissä
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_ALL :Puut kasvavat ja leviävät kaikkialla
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_GROWTH_NO_SPREAD :Puut eivät kasva eivätkä leviä {RED}(rikkoo sahan)
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_GROWTH_NO_SPREAD :Puut eivät kasva eivätkä leviä {RED}(rikkoo subtrooppisen sahan)
STR_CONFIG_SETTING_TOOLBAR_POS :Päätyökalupalkin sijainti: {STRING}
STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Ruudun yläreunassa olevan työkalupalkin sijainti vaakasuunnassa
@@ -2605,12 +2606,18 @@ STR_FOUND_TOWN_SELECT_LAYOUT_RANDOM :{BLACK}Sattuman
# Fund new industry window
STR_FUND_INDUSTRY_CAPTION :{WHITE}Rakenna uutta teollisuutta
STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}Valitse tehdas listasta
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :Monta satunnaista teollisuusaluetta
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :{BLACK}Luo satunnaisia tuotantolaitoksia
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}Sijoita teollisuuslaitokset satunnaisesti
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_CAPTION :{WHITE}Luo satunnaista teollisuutta
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_QUERY :{YELLOW}Oletko varma, että haluat luoda monta satunnaista tuotantolaitosta?
STR_FUND_INDUSTRY_INDUSTRY_BUILD_COST :{BLACK}Kustannus: {YELLOW}{CURRENCY_LONG}
STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}Koekaivaus
STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY :{BLACK}Rakenna
STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}Perusta
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES :{BLACK}Poista kaikki tuotantolaitokset
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_TOOLTIP :{BLACK}Poista kaikki kartalla olevat tuotantolaitokset
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION :{WHITE}Poista kaikki tuotantolaitokset
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Oletko varma, että haluat poistaa kaikki tuotantolaitokset?
# Industry cargoes window
STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Teollisuusketju teollisuudelle {STRING}
@@ -2841,6 +2848,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF:
STR_SAVELOAD_FILTER_TITLE :{BLACK}Suodatinteksti:
STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Tiedosto on jo olemassa
STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Haluatko varmasti korvata olemassaolevan tiedoston?
STR_SAVELOAD_DIRECTORY :{STRING} (hakemisto)
STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (ylähakemisto)
STR_SAVELOAD_OSKTITLE :{BLACK}Syötä nimi tallennustiedostolle
@@ -2859,7 +2868,6 @@ STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Lumiraja
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Siirrä lumirajaa yksi taso ylöspäin
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Siirrä lumirajaa yksi taso alaspäin
STR_MAPGEN_LAND_GENERATOR :{BLACK}Maastogeneraattori:
STR_MAPGEN_TREE_PLACER :{BLACK}Puiden algoritmi:
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Maaston tyyppi:
STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Merenpinta:
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Joet:
@@ -3506,7 +3514,7 @@ STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Poista r
STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Poista ryhmä
STR_GROUP_DELETE_QUERY_TEXT :{WHITE}Haluatko varmasti poistaa tämän ryhmän ja sen alaryhmät?
STR_GROUP_ADD_SHARED_VEHICLE :Lisää jaettuja kulkuneuvoja
STR_GROUP_ADD_SHARED_VEHICLE :Lisää jaetut kulkuneuvot
STR_GROUP_REMOVE_ALL_VEHICLES :Poista kaikki kulkuneuvot
STR_GROUP_RENAME_CAPTION :{BLACK}Nimeä ryhmä

View File

@@ -577,8 +577,8 @@ STR_MONTH_DEC :Décembre
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}Légende
STR_GRAPH_KEY_TOOLTIP :{BLACK}Afficher la légende
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{}{NUM}
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM}
STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING}
STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA}
@@ -613,7 +613,7 @@ STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR :Coordinateur de
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ROUTE_SUPERVISOR :Superviseur de route
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_DIRECTOR :Directeur
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHIEF_EXECUTIVE :Directeur Général
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHAIRMAN :Vice-président
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHAIRMAN :Secrétaire général(e)
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_PRESIDENT :Président
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TYCOON :Tycoon
@@ -696,7 +696,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Cliquer
STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK}Meilleures compagnies qui ont atteint {NUM}
STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK}Tableau du Championnat des compagnies en {NUM}
STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}.
STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Homme d'affaires
STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Personne d'affaires
STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Entrepreneur
STR_HIGHSCORE_PERFORMANCE_TITLE_INDUSTRIALIST :Industriel
STR_HIGHSCORE_PERFORMANCE_TITLE_CAPITALIST :Capitaliste
@@ -947,10 +947,9 @@ STR_GAME_OPTIONS_CURRENCY_NTD :Nouveau Dollar
STR_GAME_OPTIONS_CURRENCY_CNY :Renminbi Chinois (CNY)
STR_GAME_OPTIONS_CURRENCY_HKD :Dollar de Hong Kong (HKD)
STR_GAME_OPTIONS_CURRENCY_INR :Roupie indienne (INR)
STR_GAME_OPTIONS_CURRENCY_IDR :Roupie indonésienne (IDR)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Véhicules routiers
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Choisir le côté de la route pour la conduite
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Conduite à gauche
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Conduite à droite
@@ -1005,6 +1004,7 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :autre
STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Taille d'interface
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Choisir la taille d'élément d'interface à utiliser
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(auto-détection)
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Taille double
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Taille quadruple
@@ -1012,6 +1012,7 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Taille quadrupl
STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Taille de police
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Choisir la taille de police d'interface à utiliser
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(auto-détection)
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Taille double
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Taille quadruple
@@ -2606,12 +2607,18 @@ STR_FOUND_TOWN_SELECT_LAYOUT_RANDOM :{BLACK}Aléatoi
# Fund new industry window
STR_FUND_INDUSTRY_CAPTION :{WHITE}Financer une nouvelle industrie
STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}Choisir l'industrie appropriée dans cette liste
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :Beaucoup d'industries au hasard
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :{BLACK}Créer des industries au hasard
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}Couvrir la carte d'industries placées au hasard
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_CAPTION :{WHITE}Créer des industries au hasard
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_QUERY :{YELLOW}Êtes-vous sûr de vouloir créer beaucoup d'industries au hasard{NBSP}?
STR_FUND_INDUSTRY_INDUSTRY_BUILD_COST :{BLACK}Prix{NBSP}: {YELLOW}{CURRENCY_LONG}
STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}Prospecter
STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY :{BLACK}Construire
STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}Fonder
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES :{BLACK}Enlever toutes les industries
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_TOOLTIP :{BLACK}Enlève toutes les industries présentes sur la carte
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION :{WHITE}Enlever toutes les industries
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Êtes-vous sûr de vouloir enlever toutes les industries{NBSP}?
# Industry cargoes window
STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Chaîne industrielle pour l'industrie «{NBSP}{STRING}{NBSP}»
@@ -2842,6 +2849,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF{
STR_SAVELOAD_FILTER_TITLE :{BLACK}Filtre{NBSP}:
STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Écraser le fichier
STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Êtes-vous sûr de vouloir écraser le fichier existant{NBSP}?
STR_SAVELOAD_DIRECTORY :{STRING} (Répertoire)
STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Répertoire parent)
STR_SAVELOAD_OSKTITLE :{BLACK}Entrer un nom pour la sauvegarde
@@ -2860,7 +2869,6 @@ STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Alt. d'e
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Augmenter l'altitude d'enneigement
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Baisser l'altitude d'enneigement
STR_MAPGEN_LAND_GENERATOR :{BLACK}Générateur{NBSP}:
STR_MAPGEN_TREE_PLACER :{BLACK}Ajout des arbres{NBSP}:
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Type de terrain{NBSP}:
STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Niveau de la mer{NBSP}:
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Nb. de rivières{NBSP}:
@@ -4690,7 +4698,7 @@ STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_1 :Immeuble de bur
STR_TOWN_BUILDING_NAME_SMALL_BLOCK_OF_FLATS_1 :Petit immeuble résidentiel
STR_TOWN_BUILDING_NAME_CHURCH_1 :Église
STR_TOWN_BUILDING_NAME_LARGE_OFFICE_BLOCK_1 :Gros immeuble de bureaux
STR_TOWN_BUILDING_NAME_TOWN_HOUSES_1 :Bâtiments municipaux
STR_TOWN_BUILDING_NAME_TOWN_HOUSES_1 :Maisons de ville
STR_TOWN_BUILDING_NAME_HOTEL_1 :Hôtel
STR_TOWN_BUILDING_NAME_STATUE_1 :Statue
STR_TOWN_BUILDING_NAME_FOUNTAIN_1 :Fontaine

View File

@@ -758,8 +758,8 @@ STR_MONTH_DEC.dat :Dùbhlachd
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}Iuchair
STR_GRAPH_KEY_TOOLTIP :{BLACK}Seall iuchair nan graf
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{}{NUM}
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM}
STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING}
STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA}
@@ -1122,8 +1122,6 @@ STR_GAME_OPTIONS_CURRENCY_GEL :Lari Cairtbheil
STR_GAME_OPTIONS_CURRENCY_IRR :Rial Iorànach (IRR)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Carbadan-rathaid
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Tagh taobh an rathaid air a dhràibheas na carbadan
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Draibheadh air an taobh chlì
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Draibheadh air an taobh deas
@@ -2970,7 +2968,6 @@ STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Àirde n
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Gluais an loidhne-shneachda suas aon cheum
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Gluais an loidhne-shneachda sìos aon cheum
STR_MAPGEN_LAND_GENERATOR :{BLACK}Gineadair crutha-thìre:
STR_MAPGEN_TREE_PLACER :{BLACK}Algairim chraobhan:
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Seòrsa a' chrutha-thìre:
STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Àirde na mara:
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Aibhnichean:

View File

@@ -569,8 +569,8 @@ STR_MONTH_DEC :Decembro
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}Lenda
STR_GRAPH_KEY_TOOLTIP :{BLACK}Amosa-la lenda das gráficas
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}{} {STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{} {STRING}{}{NUM}
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM}
STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING}
STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COMMA}
@@ -937,8 +937,6 @@ STR_GAME_OPTIONS_CURRENCY_CNY :Renminbi chiné
STR_GAME_OPTIONS_CURRENCY_HKD :Dólar de Hong Kong (HKD)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Vehículos de estrada
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_TOOLTIP :{BLACK}Selecciona o lado da estrada polo que circularán os vehículos
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Conducir pola esquerda
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Conducir pola dereita
@@ -2811,7 +2809,6 @@ STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Cota de
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Subir a cota de neve unha altura
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Baixar a cota de neve unha altura
STR_MAPGEN_LAND_GENERATOR :{BLACK}Xerador de terreo:
STR_MAPGEN_TREE_PLACER :{BLACK}Algoritmo para árbores:
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Tipo de terreo:
STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Nivel do mar:
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Ríos:

Some files were not shown because too many files have changed in this diff Show More